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