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>