Francois Pichet | 8e161ed | 2010-11-23 06:07:27 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -fms-extensions -emit-llvm -o - %s | FileCheck %s
|
| 2 |
|
| 3 | // CHECK: %struct.nested1 = type { i32, i32 }
|
| 4 | typedef struct nested1 {
|
Francois Pichet | 02a8078 | 2010-11-23 07:15:13 +0000 | [diff] [blame] | 5 | int a1;
|
| 6 | int b1;
|
Francois Pichet | 8e161ed | 2010-11-23 06:07:27 +0000 | [diff] [blame] | 7 | } NESTED1;
|
| 8 |
|
| 9 | // CHECK: %struct.nested2 = type { i32, %struct.nested1, i32 }
|
| 10 | struct nested2 {
|
Francois Pichet | 02a8078 | 2010-11-23 07:15:13 +0000 | [diff] [blame] | 11 | int a;
|
Francois Pichet | 8e161ed | 2010-11-23 06:07:27 +0000 | [diff] [blame] | 12 | NESTED1;
|
Francois Pichet | 02a8078 | 2010-11-23 07:15:13 +0000 | [diff] [blame] | 13 | int b;
|
Francois Pichet | 8e161ed | 2010-11-23 06:07:27 +0000 | [diff] [blame] | 14 | };
|
| 15 |
|
| 16 | // CHECK: %struct.test = type { i32, %struct.nested2, i32 }
|
| 17 | struct test {
|
| 18 | int x;
|
| 19 | struct nested2;
|
| 20 | int y;
|
| 21 | };
|
| 22 |
|
| 23 |
|
| 24 | void foo()
|
| 25 | {
|
| 26 | // CHECK: %var = alloca %struct.test, align 4
|
| 27 | struct test var;
|
| 28 |
|
| 29 | // CHECK: getelementptr inbounds %struct.test* %var, i32 0, i32 1
|
| 30 | // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 0
|
| 31 | // CHECK-NEXT: load i32* %{{.*}}, align 4
|
| 32 | var.a;
|
| 33 |
|
| 34 | // CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 1
|
| 35 | // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 2
|
| 36 | // CHECK-NEXT: load i32* %{{.*}}, align 4
|
| 37 | var.b;
|
| 38 |
|
| 39 | // CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 1
|
| 40 | // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1
|
| 41 | // CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 0
|
| 42 | // CHECK-NEXT: load i32* %{{.*}}, align 4
|
| 43 | var.a1;
|
| 44 |
|
| 45 | // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}var, i32 0, i32 1
|
| 46 | // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1
|
| 47 | // CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 1
|
| 48 | // CHECK-NEXT: load i32* %{{.*}}, align 4
|
| 49 | var.b1;
|
| 50 |
|
| 51 | // CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 0
|
| 52 | // CHECK-NEXT: load i32* %{{.*}}, align 4
|
| 53 | var.x;
|
| 54 |
|
| 55 | // CHECK-NEXT: getelementptr inbounds %struct.test* %var, i32 0, i32 2
|
| 56 | // CHECK-NEXT: load i32* %{{.*}}, align 4
|
| 57 | var.y;
|
| 58 | }
|
| 59 |
|
| 60 | void foo2(struct test* var)
|
| 61 | {
|
John McCall | 6c6feac | 2010-11-23 10:15:48 +0000 | [diff] [blame] | 62 | // CHECK: alloca %struct.test*, align
|
| 63 | // CHECK-NEXT: store %struct.test* %var, %struct.test** %{{.*}}, align
|
| 64 | // CHECK-NEXT: load %struct.test** %{{.*}}, align
|
Francois Pichet | 8e161ed | 2010-11-23 06:07:27 +0000 | [diff] [blame] | 65 | // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1
|
| 66 | // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 0
|
| 67 | // CHECK-NEXT: load i32* %{{.*}}, align 4
|
| 68 | var->a;
|
| 69 |
|
John McCall | 6c6feac | 2010-11-23 10:15:48 +0000 | [diff] [blame] | 70 | // CHECK-NEXT: load %struct.test** %{{.*}}, align
|
Francois Pichet | 8e161ed | 2010-11-23 06:07:27 +0000 | [diff] [blame] | 71 | // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1
|
| 72 | // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 2
|
| 73 | // CHECK-NEXT: load i32* %{{.*}}, align 4
|
| 74 | var->b;
|
| 75 |
|
John McCall | 6c6feac | 2010-11-23 10:15:48 +0000 | [diff] [blame] | 76 | // CHECK-NEXT: load %struct.test** %{{.*}}, align
|
Francois Pichet | 8e161ed | 2010-11-23 06:07:27 +0000 | [diff] [blame] | 77 | // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1
|
| 78 | // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1
|
| 79 | // CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 0
|
| 80 | // CHECK-NEXT: load i32* %{{.*}}, align 4
|
| 81 | var->a1;
|
| 82 |
|
John McCall | 6c6feac | 2010-11-23 10:15:48 +0000 | [diff] [blame] | 83 | // CHECK-NEXT: load %struct.test** %{{.*}}, align
|
Francois Pichet | 8e161ed | 2010-11-23 06:07:27 +0000 | [diff] [blame] | 84 | // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 1
|
| 85 | // CHECK-NEXT: getelementptr inbounds %struct.nested2* %{{.*}}, i32 0, i32 1
|
| 86 | // CHECK-NEXT: getelementptr inbounds %struct.nested1* %{{.*}}, i32 0, i32 1
|
| 87 | // CHECK-NEXT: load i32* %{{.*}}, align 4
|
| 88 | var->b1;
|
| 89 |
|
John McCall | 6c6feac | 2010-11-23 10:15:48 +0000 | [diff] [blame] | 90 | // CHECK-NEXT: load %struct.test** %{{.*}}, align
|
Francois Pichet | 8e161ed | 2010-11-23 06:07:27 +0000 | [diff] [blame] | 91 | // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 0
|
| 92 | // CHECK-NEXT: load i32* %{{.*}}, align 4
|
| 93 | var->x;
|
| 94 |
|
John McCall | 6c6feac | 2010-11-23 10:15:48 +0000 | [diff] [blame] | 95 | // CHECK-NEXT: load %struct.test** %{{.*}}, align
|
Francois Pichet | 8e161ed | 2010-11-23 06:07:27 +0000 | [diff] [blame] | 96 | // CHECK-NEXT: getelementptr inbounds %struct.test* %{{.*}}, i32 0, i32 2
|
| 97 | // CHECK-NEXT: load i32* %{{.*}}, align 4
|
| 98 | var->y;
|
| 99 | }
|