blob: 53c716c517449e01f0245cb7b65589961a27a504 [file] [log] [blame]
Sid Manningb0da0942020-03-03 08:19:59 -06001// REQUIRES: hexagon-registered-target
2// RUN: %clang_cc1 -emit-llvm -triple hexagon-unknown-linux-musl %s -o - | FileCheck %s
3#include <stdarg.h>
4
5struct AAA {
6 int x;
7 int y;
8 int z;
9 int d;
10};
11
12// CHECK: call void @llvm.va_start(i8* %arraydecay1)
13// CHECK: %arraydecay2 = getelementptr inbounds [1 x %struct.__va_list_tag],
14// [1 x %struct.__va_list_tag]* %ap, i32 0, i32 0
15// CHECK: br label %vaarg.maybe_reg
16
17// CHECK: vaarg.maybe_reg: ; preds = %entry
18// CHECK: %__current_saved_reg_area_pointer_p = getelementptr inbounds
19// %struct.__va_list_tag, %struct.__va_list_tag* %arraydecay2, i32 0, i32 0
20// CHECK: %__current_saved_reg_area_pointer = load i8*, i8**
21// %__current_saved_reg_area_pointer_p
22// CHECK: %__saved_reg_area_end_pointer_p = getelementptr inbounds
23// %struct.__va_list_tag, %struct.__va_list_tag* %arraydecay2, i32 0, i32 1
24// CHECK: %__saved_reg_area_end_pointer = load i8*, i8**
25// %__saved_reg_area_end_pointer_p
26// CHECK: %__new_saved_reg_area_pointer = getelementptr i8, i8*
27// %__current_saved_reg_area_pointer, i32 4
28// CHECK: %0 = icmp sgt i8* %__new_saved_reg_area_pointer,
29// %__saved_reg_area_end_pointer
30// CHECK: br i1 %0, label %vaarg.on_stack, label %vaarg.in_reg
31
32// CHECK: vaarg.in_reg: ; preds =
33// %vaarg.maybe_reg
34// CHECK: %1 = bitcast i8* %__current_saved_reg_area_pointer to i32*
35// CHECK: store i8* %__new_saved_reg_area_pointer, i8**
36// %__current_saved_reg_area_pointer_p
37// CHECK: br label %vaarg.end
38
39// CHECK: vaarg.on_stack: ; preds =
40// %vaarg.maybe_reg
41// CHECK: %__overflow_area_pointer_p = getelementptr inbounds
42// %struct.__va_list_tag, %struct.__va_list_tag* %arraydecay2, i32 0, i32 2
43// CHECK: %__overflow_area_pointer = load i8*, i8** %__overflow_area_pointer_p
44// CHECK: %__overflow_area_pointer.next = getelementptr i8, i8*
45// %__overflow_area_pointer, i32 4
46// CHECK: store i8* %__overflow_area_pointer.next, i8**
47// %__overflow_area_pointer_p
48// CHECK: store i8* %__overflow_area_pointer.next, i8**
49// %__current_saved_reg_area_pointer_p
50// CHECK: %2 = bitcast i8* %__overflow_area_pointer to i32*
51// CHECK: br label %vaarg.end
52
53// CHECK: vaarg.end: ; preds =
54// %vaarg.on_stack, %vaarg.in_reg
55// CHECK: %vaarg.addr = phi i32* [ %1, %vaarg.in_reg ], [ %2, %vaarg.on_stack
56// ]
57// CHECK: %3 = load i32, i32* %vaarg.addr
58
59struct AAA aaa = {100, 200, 300, 400};
60
61int foo(int xx, ...) {
62 va_list ap;
63 int d;
64 int ret = 0;
65 struct AAA bbb;
66 va_start(ap, xx);
67 d = va_arg(ap, int);
68 ret += d;
69 bbb = va_arg(ap, struct AAA);
70 ret += bbb.d;
71 d = va_arg(ap, int);
72 ret += d;
73 va_end(ap);
74 return ret;
75}
76
77int main(void) {
78 int x;
79 x = foo(1, 2, aaa, 4);
80 return x;
81}