diff options
Diffstat (limited to 'test/CodeGen/ms_this.cpp')
| -rw-r--r-- | test/CodeGen/ms_this.cpp | 57 | 
1 files changed, 57 insertions, 0 deletions
diff --git a/test/CodeGen/ms_this.cpp b/test/CodeGen/ms_this.cpp new file mode 100644 index 0000000000000..8647a5bc8b8b0 --- /dev/null +++ b/test/CodeGen/ms_this.cpp @@ -0,0 +1,57 @@ +// REQUIRES: x86-registered-target + +// RUN: %clang_cc1 -triple x86_64-pc-win32 -fasm-blocks -emit-llvm %s -o - | FileCheck %s +class t1 { +public: +  double a; +  void runc(); +}; + +class t2 { +public: +  double a; +  void runc(); +}; + +// CHECK: define void @"\01?runc@t2@@ +void t2::runc() { +  double num = 0; +  __asm { +      mov rax,[this] +      // CHECK: [[THIS_ADDR_T2:%.+]] = alloca %class.t2* +      // CHECK: [[THIS1_T2:%.+]] = load %class.t2*, %class.t2** [[THIS_ADDR_T2]], +      // CHECK: call void asm sideeffect inteldialect "mov rax,qword ptr $1{{.*}}%class.t2* [[THIS1_T2]] +      mov rbx,[rax] +      mov num, rbx +	   }; +} + +// CHECK: define void @"\01?runc@t1@@ +void t1::runc() { +  double num = 0; +  __asm { +       mov rax,[this] +       // CHECK: [[THIS_ADDR_T1:%.+]] = alloca %class.t1* +       // CHECK: [[THIS1_T1:%.+]] = load %class.t1*, %class.t1** [[THIS_ADDR_T1]], +       // CHECK: call void asm sideeffect inteldialect "mov rax,qword ptr $1{{.*}}%class.t1* [[THIS1_T1]] +        mov rbx,[rax] +        mov num, rbx +	   }; +} + +struct s { +  int a; +  // CHECK: define linkonce_odr void @"\01?func@s@@ +  void func() { +    __asm mov rax, [this] +    // CHECK: [[THIS_ADDR_S:%.+]] = alloca %struct.s* +    // CHECK: [[THIS1_S:%.+]] = load %struct.s*, %struct.s** [[THIS_ADDR_S]], +    // CHECK: call void asm sideeffect inteldialect "mov rax, qword ptr $0{{.*}}%struct.s* [[THIS1_S]] +  } +} f3; + +int main() { +  f3.func(); +  f3.a=1; +  return 0; +}  | 
