Ho to generate VAARG?

Hello, LLVMers!

How can I force a front end to generate VAARG for accessing varargs parameters?

I compile a simple C-code:

#include <stdarg.h>

int FnVarArgs(int a, …)

{

int i,tmp=0;

va_list ptArgument;

va_start(ptArgument,a);

for(i=0;i<9;i++)

tmp+= va_arg(ptArgument,int);

return tmp;

}

And then have this bytecode:

; ModuleID = ‘main.bc’

target datalayout = “e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32”

target triple = “i386-pc-linux-gnu”

define i32 @FnVarArgs(i32 %a, …) nounwind {

bb2.thread:

%ptArgument = alloca i8*, align 4 ; <i8**> [#uses=3]

%ptArgument1 = bitcast i8** %ptArgument to i8* ; <i8*> [#uses=1]

call void @llvm.va_start(i8* %ptArgument1)

br label %bb2

bb2: ; preds = %bb2, %bb2.thread

%i.0.reg2mem.0 = phi i32 [ 0, %bb2.thread ], [ %indvar.next, %bb2 ] ; [#uses=1]

%tmp.0.reg2mem.0 = phi i32 [ 0, %bb2.thread ], [ %4, %bb2 ] ; [#uses=1]

%0 = load i8** %ptArgument, align 4 ; <i8*> [#uses=2]

%1 = getelementptr i8* %0, i32 4 ; <i8*> [#uses=1]

store i8* %1, i8** %ptArgument, align 4

%2 = bitcast i8* %0 to i32* ; <i32*> [#uses=1]

%3 = load i32* %2, align 4 ; [#uses=1]

%4 = add i32 %3, %tmp.0.reg2mem.0 ; [#uses=2]

%indvar.next = add i32 %i.0.reg2mem.0, 1 ; [#uses=2]

%exitcond = icmp eq i32 %indvar.next, 9 ; [#uses=1]

br i1 %exitcond, label %bb3, label %bb2

bb3: ; preds = %bb2

ret i32 %4

}

declare void @llvm.va_start(i8*) nounwind

There is a call of “va_start” and there isn’t any “va_arg“! But I need it for specifical lower in back end for my target!

Thanks,

–Artem

Compiling to IR for one target, then using that IR for a different
target is generally a bad idea. You should write your own target; that
way, you can handle target-specific requirements. I suggest using
clang for this.

-Eli