[Microsoft][C++] Clang doesn't support a use of "this" pointer inside inline asm

Clang doesn’t support a use of “this” pointer inside inline asm.
When I tried to compile a class or a struct (see example) with an inline asm that contains "this" pointer.
Clang returns with an error.
This patch fixes that.

error: expected unqualified-id
For example:
'''
struct A {
    void f() {
          __asm mov eax, this
              // error: expected unqualified-id
                  }
};
'''
Differential Revision: http://reviews.llvm.org/D15115

llvm-svn: 255645
This commit is contained in:
Michael Zuckerman 2015-12-15 14:04:18 +00:00
parent 5acf66ff97
commit 229158c491
3 changed files with 67 additions and 12 deletions

View File

@ -1696,7 +1696,8 @@ llvm::Value* CodeGenFunction::EmitAsmInput(
if (Info.allowsRegister() || !Info.allowsMemory())
if (CodeGenFunction::hasScalarEvaluationKind(InputExpr->getType()))
return EmitScalarExpr(InputExpr);
if (InputExpr->getStmtClass() == Expr::CXXThisExprClass)
return EmitScalarExpr(InputExpr);
InputExpr = InputExpr->IgnoreParenNoopCasts(getContext());
LValue Dest = EmitLValue(InputExpr);
return EmitAsmInputLValue(Info, Dest, InputExpr->getType(), ConstraintStr,

View File

@ -215,17 +215,22 @@ ExprResult Parser::ParseMSAsmIdentifier(llvm::SmallVectorImpl<Token> &LineToks,
// Require an identifier here.
SourceLocation TemplateKWLoc;
UnqualifiedId Id;
bool Invalid =
ParseUnqualifiedId(SS,
/*EnteringContext=*/false,
/*AllowDestructorName=*/false,
/*AllowConstructorName=*/false,
/*ObjectType=*/ParsedType(), TemplateKWLoc, Id);
// Perform the lookup.
ExprResult Result = Actions.LookupInlineAsmIdentifier(
SS, TemplateKWLoc, Id, Info, IsUnevaluatedContext);
bool Invalid = true;
ExprResult Result;
if (Tok.is(tok::kw_this)) {
Result = ParseCXXThis();
Invalid = false;
} else {
Invalid =
ParseUnqualifiedId(SS,
/*EnteringContext=*/false,
/*AllowDestructorName=*/false,
/*AllowConstructorName=*/false,
/*ObjectType=*/ParsedType(), TemplateKWLoc, Id);
// Perform the lookup.
Result = Actions.LookupInlineAsmIdentifier(SS, TemplateKWLoc, Id, Info,
IsUnevaluatedContext);
}
// While the next two tokens are 'period' 'identifier', repeatedly parse it as
// a field access. We have to avoid consuming assembler directives that look
// like '.' 'else'.

View File

@ -0,0 +1,49 @@
// RUN: %clang_cc1 -fasm-blocks -emit-llvm %s -o - | FileCheck %s
class t1 {
public:
double a;
void runc();
};
class t2 {
public:
double a;
void runc();
};
void t2::runc() {
double num = 0;
__asm {
mov rax,[this]
//CHECK: %this.addr = alloca %class.t2*
//CHECK: call void asm sideeffect inteldialect "mov rax,qword ptr $1{{.*}}%class.t2* %this1
mov rbx,[rax]
mov num, rbx
};
}
void t1::runc() {
double num = 0;
__asm {
mov rax,[this]
//CHECK: %this.addr = alloca %class.t1*
//CHECK: call void asm sideeffect inteldialect "mov rax,qword ptr $1{{.*}}%class.t1* %this1
mov rbx,[rax]
mov num, rbx
};
}
struct s {
int a;
void func() {
__asm mov rax, [this]
//CHECK: %this.addr = alloca %struct.s*
//CHECK: call void asm sideeffect inteldialect "mov rax, qword ptr $0{{.*}}%struct.s* %this1
}
} f3;
int main() {
f3.func();
f3.a=1;
return 0;
}