197 lines · cpp
1// REQUIRES: x86-registered-target2// RUN: %clang_cc1 -x c++ %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - -std=c++11 | FileCheck %s3 4struct Foo {5 static int *ptr;6 static int a, b;7 int arr[4];8 struct Bar {9 static int *ptr;10 char arr[2];11 };12};13 14void t1() {15// CHECK-LABEL: define{{.*}} void @_Z2t1v()16 Foo::ptr = (int *)0xDEADBEEF;17 Foo::Bar::ptr = (int *)0xDEADBEEF;18// CHECK: call void asm sideeffect inteldialect19// CHECK-SAME: mov eax, $020// CHECK-SAME: mov eax, $121// CHECK-SAME: mov eax, $222// CHECK-SAME: mov eax, dword ptr $323// CHECK-SAME: mov eax, dword ptr $424// CHECK-SAME: "*m,*m,*m,*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(ptr) @_ZN3Foo3ptrE, ptr elementtype(ptr) @_ZN3Foo3Bar3ptrE, ptr elementtype(ptr) @_ZN3Foo3ptrE, ptr elementtype(ptr) @_ZN3Foo3ptrE, ptr elementtype(ptr) @_ZN3Foo3ptrE)25 __asm mov eax, Foo ::ptr26 __asm mov eax, Foo :: Bar :: ptr27 __asm mov eax, [Foo:: ptr]28 __asm mov eax, dword ptr [Foo :: ptr]29 __asm mov eax, dword ptr [Foo :: ptr]30}31 32int gvar = 10;33void t2() {34 int lvar = 10;35 __asm mov eax, offset Foo::ptr36 __asm mov eax, offset Foo::Bar::ptr37// CHECK-LABEL: define{{.*}} void @_Z2t2v()38// CHECK: call void asm sideeffect inteldialect39// CHECK-SAME: mov eax, $040// CHECK-SAME: mov eax, $141// CHECK-SAME: "i,i,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr @_ZN3Foo3ptrE, ptr @_ZN3Foo3Bar3ptrE)42}43 44// CHECK-LABEL: define{{.*}} void @_Z2t3v()45void t3() {46 __asm mov eax, LENGTH Foo::ptr47 __asm mov eax, LENGTH Foo::Bar::ptr48 __asm mov eax, LENGTH Foo::arr49 __asm mov eax, LENGTH Foo::Bar::arr50 51 __asm mov eax, TYPE Foo::ptr52 __asm mov eax, TYPE Foo::Bar::ptr53 __asm mov eax, TYPE Foo::arr54 __asm mov eax, TYPE Foo::Bar::arr55 56 __asm mov eax, SIZE Foo::ptr57 __asm mov eax, SIZE Foo::Bar::ptr58 __asm mov eax, SIZE Foo::arr59 __asm mov eax, SIZE Foo::Bar::arr60// CHECK: call void asm sideeffect inteldialect61// CHECK-SAME: mov eax, $$162// CHECK-SAME: mov eax, $$163// CHECK-SAME: mov eax, $$464// CHECK-SAME: mov eax, $$265// CHECK-SAME: mov eax, $$466// CHECK-SAME: mov eax, $$467// CHECK-SAME: mov eax, $$468// CHECK-SAME: mov eax, $$169// CHECK-SAME: mov eax, $$470// CHECK-SAME: mov eax, $$471// CHECK-SAME: mov eax, $$1672// CHECK-SAME: mov eax, $$273// CHECK-SAME: "~{eax},~{dirflag},~{fpsr},~{flags}"()74 75}76 77struct T4 {78 int x;79 static int y;80 void test();81};82 83// CHECK-LABEL: define{{.*}} void @_ZN2T44testEv(84void T4::test() {85// CHECK: [[T0:%.*]] = alloca ptr,86// CHECK: [[THIS:%.*]] = load ptr, ptr [[T0]]87// CHECK: [[X:%.*]] = getelementptr inbounds nuw [[T4:%.*]], ptr [[THIS]], i32 0, i32 088 __asm mov eax, x;89 __asm mov y, eax;90// CHECK: call void asm sideeffect inteldialect91// CHECK-SAME: mov eax, $192// CHECK-SAME: mov $0, eax93// CHECK-SAME: "=*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) @_ZN2T41yE, ptr elementtype(i32) {{.*}})94}95 96template <class T> struct T5 {97 template <class U> static T create(U);98 void run();99};100// CHECK-LABEL: define{{.*}} void @_Z5test5v()101void test5() {102 // CHECK: [[X:%.*]] = alloca i32103 // CHECK: [[Y:%.*]] = alloca i32104 int x, y;105 __asm push y106 __asm call T5<int>::create<float>107 __asm mov x, eax108 // CHECK: call void asm sideeffect inteldialect109 // CHECK-SAME: push $0110 // CHECK-SAME: call ${2:P}111 // CHECK-SAME: mov $1, eax112 // CHECK-SAME: "=*m,=*m,*m,~{esp},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %y, ptr elementtype(i32) %x, ptr elementtype(i32 (float)) @_ZN2T5IiE6createIfEEiT_)113}114 115// Just verify this doesn't emit an error.116void test6() {117 __asm {118 a:119 jmp a120 }121}122 123void t7_struct() {124 struct A {125 int a;126 int b;127 };128 __asm mov eax, [eax].A.b129 // CHECK-LABEL: define{{.*}} void @_Z9t7_structv130 // CHECK: call void asm sideeffect inteldialect131 // CHECK-SAME: mov eax, [eax + $$4]132 // CHECK-SAME: "~{eax},~{dirflag},~{fpsr},~{flags}"()133}134 135void t7_typedef() {136 typedef struct {137 int a;138 int b;139 } A;140 __asm mov eax, [eax].A.b141 // CHECK-LABEL: define{{.*}} void @_Z10t7_typedefv142 // CHECK: call void asm sideeffect inteldialect143 // CHECK-SAME: mov eax, [eax + $$4]144 // CHECK-SAME: "~{eax},~{dirflag},~{fpsr},~{flags}"()145}146 147void t7_using() {148 using A = struct {149 int a;150 int b;151 };152 __asm mov eax, [eax].A.b153 // CHECK-LABEL: define{{.*}} void @_Z8t7_usingv154 // CHECK: call void asm sideeffect inteldialect155 // CHECK-SAME: mov eax, [eax + $$4]156 // CHECK-SAME: "~{eax},~{dirflag},~{fpsr},~{flags}"()157}158 159void t8() {160 __asm some_label:161 // CHECK-LABEL: define{{.*}} void @_Z2t8v()162 // CHECK: call void asm sideeffect inteldialect163 // CHECK-SAME: L__MSASMLABEL_.${:uid}__some_label:164 // CHECK-SAME: "~{dirflag},~{fpsr},~{flags}"()165 struct A {166 static void g() {167 __asm jmp some_label ; This should jump forwards168 __asm some_label:169 __asm nop170 // CHECK-LABEL: define internal void @_ZZ2t8vEN1A1gEv()171 // CHECK: call void asm sideeffect inteldialect172 // CHECK-SAME: jmp L__MSASMLABEL_.${:uid}__some_label173 // CHECK-SAME: L__MSASMLABEL_.${:uid}__some_label:174 // CHECK-SAME: nop175 // CHECK-SAME: "~{dirflag},~{fpsr},~{flags}"()176 }177 };178 A::g();179}180 181void t9() {182 // CHECK-LABEL: define{{.*}} void @_Z2t9v()183 struct A {184 int a;185 int b;186 void g() {187 __asm mov eax, dword ptr [eax]this.b188 // CHECK: call void asm sideeffect inteldialect189 // CHECK-SAME: mov eax, dword ptr [eax + $$4]190 // CHECK-SAME: "~{eax},~{dirflag},~{fpsr},~{flags}"()191 }192 };193 A AA;194 AA.g();195}196 197