Hi folk, <br><br>I'm writing a set of small C code to verify whether my pass handle some instruction correctly. One of the instruction I want to test is "va_arg", but compiling my variadic function does not generate any va_arg instruction. Is va_arg deprecated? Will va_arg instruction ever be generated by any front-end? The source code and llvm instructions are appended as follows. <br>
<br>the c code<br>#include<stdarg.h><br>#include<stdio.h><br>#include<stdlib.h><br><br>void printValue(char * fmt, ...) {<br> va_list args;<br> va_start(args, fmt);<br> int i;<br> double d;<br> i = va_arg(args, int);<br>
d = va_arg(args, double);<br> va_end(args);<br>}<br><br>the generated llvm instructions: <br>; ModuleID = 'i.bc'<br>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-n8:16:32"<br>
target triple = "i386-pc-linux-gnu"<br><br>define void @printValue(i8* %fmt, ...) nounwind {<br>entry:<br> %fmt_addr = alloca i8* ; <i8**> [#uses=1]<br> %args.2 = alloca i8* ; <i8**> [#uses=3]<br>
%args.0 = alloca i8* ; <i8**> [#uses=3]<br> %args = alloca i8* ; <i8**> [#uses=6]<br> %i = alloca i32 ; <i32*> [#uses=1]<br>
%d = alloca double, align 8 ; <double*> [#uses=1]<br> %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]<br> store i8* %fmt, i8** %fmt_addr<br> %args1 = bitcast i8** %args to i8* ; <i8*> [#uses=1]<br>
call void @llvm.va_start(i8* %args1)<br> %0 = load i8** %args, align 4 ; <i8*> [#uses=1]<br> store i8* %0, i8** %args.0, align 4<br> %1 = load i8** %args.0, align 4 ; <i8*> [#uses=1]<br>
%2 = getelementptr inbounds i8* %1, i64 4 ; <i8*> [#uses=1]<br> store i8* %2, i8** %args, align 4<br> %3 = load i8** %args.0, align 4 ; <i8*> [#uses=1]<br> %4 = bitcast i8* %3 to i32* ; <i32*> [#uses=1]<br>
%5 = load i32* %4, align 4 ; <i32> [#uses=1]<br> store i32 %5, i32* %i, align 4<br> %6 = load i8** %args, align 4 ; <i8*> [#uses=1]<br> store i8* %6, i8** %args.2, align 4<br>
%7 = load i8** %args.2, align 4 ; <i8*> [#uses=1]<br> %8 = getelementptr inbounds i8* %7, i64 8 ; <i8*> [#uses=1]<br> store i8* %8, i8** %args, align 4<br> %9 = load i8** %args.2, align 4 ; <i8*> [#uses=1]<br>
%10 = bitcast i8* %9 to double* ; <double*> [#uses=1]<br> %11 = load double* %10, align 4 ; <double> [#uses=1]<br> store double %11, double* %d, align 8<br> %args2 = bitcast i8** %args to i8* ; <i8*> [#uses=1]<br>
call void @llvm.va_end(i8* %args2)<br> br label %return<br><br>return: ; preds = %entry<br> ret void<br>}<br><br>declare void @llvm.va_start(i8*) nounwind<br><br>declare void @llvm.va_end(i8*) nounwind<br>
<br><br>