100 lines · c
1// RUN: %clang_cc1 -fms-extensions -emit-llvm -o - %s | FileCheck %s2 3// CHECK: %struct.test = type { i32, %struct.nested2, i32 }4// CHECK: %struct.nested2 = type { i32, %struct.nested1, i32 }5// CHECK: %struct.nested1 = type { i32, i32 }6typedef struct nested1 {7 int a1;8 int b1;9} NESTED1;10 11struct nested2 {12 int a;13 NESTED1; 14 int b;15};16 17struct test {18 int x;19 struct nested2; 20 int y;21};22 23 24void foo(void)25{26 // CHECK: %var = alloca %struct.test, align 427 struct test var;28 29 // CHECK: getelementptr inbounds nuw %struct.test, ptr %var, i32 0, i32 130 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 031 // CHECK-NEXT: load i32, ptr %{{.*}}, align 432 var.a;33 34 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %var, i32 0, i32 135 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 236 // CHECK-NEXT: load i32, ptr %{{.*}}, align 437 var.b;38 39 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %var, i32 0, i32 140 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 141 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested1, ptr %{{.*}}, i32 0, i32 042 // CHECK-NEXT: load i32, ptr %{{.*}}, align 443 var.a1;44 45 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %{{.*}}var, i32 0, i32 146 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 147 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested1, ptr %{{.*}}, i32 0, i32 148 // CHECK-NEXT: load i32, ptr %{{.*}}, align 449 var.b1;50 51 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %var, i32 0, i32 052 // CHECK-NEXT: load i32, ptr %{{.*}}, align 453 var.x;54 55 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %var, i32 0, i32 256 // CHECK-NEXT: load i32, ptr %{{.*}}, align 457 var.y;58}59 60void foo2(struct test* var)61{62 // CHECK: alloca ptr, align63 // CHECK-NEXT: store ptr %var, ptr %{{.*}}, align64 // CHECK-NEXT: load ptr, ptr %{{.*}}, align65 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %{{.*}}, i32 0, i32 166 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 067 // CHECK-NEXT: load i32, ptr %{{.*}}, align 468 var->a;69 70 // CHECK-NEXT: load ptr, ptr %{{.*}}, align71 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %{{.*}}, i32 0, i32 172 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 273 // CHECK-NEXT: load i32, ptr %{{.*}}, align 474 var->b;75 76 // CHECK-NEXT: load ptr, ptr %{{.*}}, align77 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %{{.*}}, i32 0, i32 178 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 179 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested1, ptr %{{.*}}, i32 0, i32 080 // CHECK-NEXT: load i32, ptr %{{.*}}, align 481 var->a1;82 83 // CHECK-NEXT: load ptr, ptr %{{.*}}, align84 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %{{.*}}, i32 0, i32 185 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested2, ptr %{{.*}}, i32 0, i32 186 // CHECK-NEXT: getelementptr inbounds nuw %struct.nested1, ptr %{{.*}}, i32 0, i32 187 // CHECK-NEXT: load i32, ptr %{{.*}}, align 488 var->b1;89 90 // CHECK-NEXT: load ptr, ptr %{{.*}}, align91 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %{{.*}}, i32 0, i32 092 // CHECK-NEXT: load i32, ptr %{{.*}}, align 493 var->x;94 95 // CHECK-NEXT: load ptr, ptr %{{.*}}, align96 // CHECK-NEXT: getelementptr inbounds nuw %struct.test, ptr %{{.*}}, i32 0, i32 297 // CHECK-NEXT: load i32, ptr %{{.*}}, align 498 var->y;99}100