forked from OSchip/llvm-project
[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:
parent
5acf66ff97
commit
229158c491
|
@ -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,
|
||||
|
|
|
@ -215,17 +215,22 @@ ExprResult Parser::ParseMSAsmIdentifier(llvm::SmallVectorImpl<Token> &LineToks,
|
|||
// Require an identifier here.
|
||||
SourceLocation TemplateKWLoc;
|
||||
UnqualifiedId Id;
|
||||
bool Invalid =
|
||||
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.
|
||||
ExprResult Result = Actions.LookupInlineAsmIdentifier(
|
||||
SS, TemplateKWLoc, Id, Info, IsUnevaluatedContext);
|
||||
|
||||
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'.
|
||||
|
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue