Home | History | Annotate | Download | only in CodeGen
      1 // RUN: %clang_cc1 -triple le32-unknown-nacl -emit-llvm -o - %s | FileCheck %s
      2 #include <stdarg.h>
      3 
      4 int get_int(va_list *args) {
      5   return va_arg(*args, int);
      6 }
      7 // CHECK: define i32 @get_int
      8 // CHECK: [[RESULT:%[a-z_0-9]+]] = va_arg {{.*}}, i32{{$}}
      9 // CHECK: store i32 [[RESULT]], i32* [[LOC:%[a-z_0-9]+]]
     10 // CHECK: [[RESULT2:%[a-z_0-9]+]] = load i32, i32* [[LOC]]
     11 // CHECK: ret i32 [[RESULT2]]
     12 
     13 struct Foo {
     14   int x;
     15 };
     16 
     17 struct Foo dest;
     18 
     19 void get_struct(va_list *args) {
     20   dest = va_arg(*args, struct Foo);
     21 }
     22 // CHECK: define void @get_struct
     23 // CHECK: [[RESULT:%[a-z_0-9]+]] = va_arg {{.*}}, %struct.Foo{{$}}
     24 // CHECK: store %struct.Foo [[RESULT]], %struct.Foo* [[LOC:%[a-z_0-9]+]]
     25 // CHECK: [[LOC2:%[a-z_0-9]+]] = bitcast {{.*}} [[LOC]] to i8*
     26 // CHECK: call void @llvm.memcpy{{.*}}@dest{{.*}}, i8* [[LOC2]]
     27 
     28 void skip_struct(va_list *args) {
     29   va_arg(*args, struct Foo);
     30 }
     31 // CHECK: define void @skip_struct
     32 // CHECK: va_arg {{.*}}, %struct.Foo{{$}}
     33