1 | // REQUIRES: x86-registered-target |
2 | // RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | FileCheck %s |
3 | |
4 | struct A { |
5 | int a1; |
6 | int a2; |
7 | struct B { |
8 | int b1; |
9 | int b2; |
10 | } a3; |
11 | }; |
12 | |
13 | namespace asdf { |
14 | A a_global; |
15 | } |
16 | |
17 | extern "C" int test_param_field(A p) { |
18 | // CHECK: define i32 @test_param_field(%struct.A* byval align 4 %p) |
19 | // CHECK: getelementptr inbounds %struct.A, %struct.A* %p, i32 0, i32 0 |
20 | // CHECK: call i32 asm sideeffect inteldialect "mov eax, $1" |
21 | // CHECK: ret i32 |
22 | __asm mov eax, p.a1 |
23 | } |
24 | |
25 | extern "C" int test_namespace_global() { |
26 | // CHECK: define i32 @test_namespace_global() |
27 | // CHECK: call i32 asm sideeffect inteldialect "mov eax, $1", "{{.*}}"(i32* getelementptr inbounds (%struct.A, %struct.A* @_ZN4asdf8a_globalE, i32 0, i32 2, i32 1)) |
28 | // CHECK: ret i32 |
29 | __asm mov eax, asdf::a_global.a3.b2 |
30 | } |
31 | |
32 | template <bool Signed> |
33 | struct make_storage_type { |
34 | struct type { |
35 | struct B { |
36 | int a; |
37 | int x; |
38 | } b; |
39 | }; |
40 | }; |
41 | |
42 | template <bool Signed> |
43 | struct msvc_dcas_x86 { |
44 | typedef typename make_storage_type<Signed>::type storage_type; |
45 | void store() __asm("PR26001") { |
46 | storage_type p; |
47 | __asm mov edx, p.b.x; |
48 | } |
49 | }; |
50 | |
51 | template void msvc_dcas_x86<false>::store(); |
52 | // CHECK: define weak_odr void @"\01PR26001"( |
53 | // CHECK: %[[P:.*]] = alloca %"struct.make_storage_type<false>::type", align 4 |
54 | // CHECK: %[[B:.*]] = getelementptr inbounds %"struct.make_storage_type<false>::type", %"struct.make_storage_type<false>::type"* %[[P]], i32 0, i32 0 |
55 | // CHECK: %[[X:.*]] = getelementptr inbounds %"struct.make_storage_type<false>::type::B", %"struct.make_storage_type<false>::type::B"* %[[B]], i32 0, i32 1 |
56 | // CHECK: call void asm sideeffect inteldialect "mov edx, dword ptr $0", "*m,~{edx},~{dirflag},~{fpsr},~{flags}"(i32* %[[X]]) |
57 | |