diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaStmtAsm.cpp | 7 | ||||
-rw-r--r-- | clang/test/CodeGen/ms-inline-asm-64.c | 4 | ||||
-rw-r--r-- | clang/test/CodeGen/ms-inline-asm.c | 12 | ||||
-rw-r--r-- | clang/test/CodeGen/ms-inline-asm.cpp | 2 | ||||
-rw-r--r-- | clang/test/Parser/ms-inline-asm.c | 5 |
5 files changed, 23 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaStmtAsm.cpp b/clang/lib/Sema/SemaStmtAsm.cpp index 5161b800191..93faf2d151f 100644 --- a/clang/lib/Sema/SemaStmtAsm.cpp +++ b/clang/lib/Sema/SemaStmtAsm.cpp @@ -707,8 +707,13 @@ void Sema::FillInlineAsmIdentifierInfo(Expr *Res, if (T->isFunctionType() || T->isDependentType()) return Info.setLabel(Res); if (Res->isRValue()) { - if (isa<clang::EnumType>(T) && Res->EvaluateAsRValue(Eval, Context)) + bool IsEnum = isa<clang::EnumType>(T); + if (DeclRefExpr *DRE = dyn_cast<clang::DeclRefExpr>(Res)) + if (DRE->getDecl()->getKind() == Decl::EnumConstant) + IsEnum = true; + if (IsEnum && Res->EvaluateAsRValue(Eval, Context)) return Info.setEnum(Eval.Val.getInt().getSExtValue()); + return Info.setLabel(Res); } unsigned Size = Context.getTypeSizeInChars(T).getQuantity(); diff --git a/clang/test/CodeGen/ms-inline-asm-64.c b/clang/test/CodeGen/ms-inline-asm-64.c index 5b144eb7bb6..ce46b8821de 100644 --- a/clang/test/CodeGen/ms-inline-asm-64.c +++ b/clang/test/CodeGen/ms-inline-asm-64.c @@ -12,10 +12,10 @@ void t1() { void t2() { int var = 10; - __asm mov [eax], offset var + __asm mov qword ptr [eax], offset var // CHECK: t2 // CHECK: call void asm sideeffect inteldialect -// CHECK-SAME: mov [eax], $0 +// CHECK-SAME: mov qword ptr [eax], $0 // CHECK-SAME: "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) } diff --git a/clang/test/CodeGen/ms-inline-asm.c b/clang/test/CodeGen/ms-inline-asm.c index 0c9b35a6452..17526f52231 100644 --- a/clang/test/CodeGen/ms-inline-asm.c +++ b/clang/test/CodeGen/ms-inline-asm.c @@ -190,14 +190,20 @@ void t15() { // CHECK: mov eax, $1 __asm mov eax, offset gvar ; eax = address of gvar // CHECK: mov eax, $2 -// CHECK: "*m,r,r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* @{{.*}}) + __asm mov eax, offset gvar+1 ; eax = 1 + address of gvar +// CHECK: mov eax, $3 + $$1 + __asm mov eax, 1+offset gvar ; eax = 1 + address of gvar +// CHECK: mov eax, $4 + $$1 + __asm mov eax, 1+offset gvar+1 ; eax = 2 + address of gvar +// CHECK: mov eax, $5 + $$2 +// CHECK: "*m,r,i,i,i,i,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* @{{.*}}, i32* @{{.*}}, i32* @{{.*}}, i32* @{{.*}}) } void t16() { int var = 10; - __asm mov [eax], offset var + __asm mov dword ptr [eax], offset var // CHECK: t16 -// CHECK: call void asm sideeffect inteldialect "mov [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov dword ptr [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) } void t17() { diff --git a/clang/test/CodeGen/ms-inline-asm.cpp b/clang/test/CodeGen/ms-inline-asm.cpp index 58796ed6378..463ff0f6e34 100644 --- a/clang/test/CodeGen/ms-inline-asm.cpp +++ b/clang/test/CodeGen/ms-inline-asm.cpp @@ -40,7 +40,7 @@ void t2() { // CHECK: call void asm sideeffect inteldialect // CHECK-SAME: mov eax, $0 // CHECK-SAME: mov eax, $1 -// CHECK-SAME: "r,r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3Bar3ptrE) +// CHECK-SAME: "i,i,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3Bar3ptrE) } // CHECK-LABEL: define void @_Z2t3v() diff --git a/clang/test/Parser/ms-inline-asm.c b/clang/test/Parser/ms-inline-asm.c index 0170b2b84fa..c6af1ea5126 100644 --- a/clang/test/Parser/ms-inline-asm.c +++ b/clang/test/Parser/ms-inline-asm.c @@ -57,6 +57,11 @@ void t13() { __asm m{o}v eax, ebx // expected-error {{unknown token in expression}} } +void t14() { + enum { A = 1, B }; + __asm mov eax, offset A // expected-error {{offset operator cannot yet handle constants}} +} + int t_fail() { // expected-note {{to match this}} __asm __asm { // expected-error 3 {{expected}} expected-note {{to match this}} |