[ms-inline-asm] Fixing bug in single asm statement support

Fixing a crash caused by trying to merge a single-line asm statement with an asm block that follows it, e.g:
asm int 4
asm {
  int 5
}

Now, only adjacent single-line asm statements that are not surrounded by braces will be merged into one asm call.

Differential Revision: http://reviews.llvm.org/D17496

llvm-svn: 261618
This commit is contained in:
Marina Yatsina 2016-02-23 08:53:45 +00:00
parent 7862c173c3
commit 146d2ec06d
3 changed files with 16 additions and 3 deletions

View File

@ -423,6 +423,10 @@ StmtResult Parser::ParseMicrosoftAsmStatement(SourceLocation AsmLoc) {
// We're no longer in a comment. // We're no longer in a comment.
InAsmComment = false; InAsmComment = false;
if (isAsm) { if (isAsm) {
// If this is a new __asm {} block we want to process it seperately
// from the single-line __asm statements
if (PP.LookAhead(0).is(tok::l_brace))
break;
LineNo = SrcMgr.getLineNumber(ExpLoc.first, ExpLoc.second); LineNo = SrcMgr.getLineNumber(ExpLoc.first, ExpLoc.second);
SkippedStartOfLine = Tok.isAtStartOfLine(); SkippedStartOfLine = Tok.isAtStartOfLine();
} }

View File

@ -63,10 +63,19 @@ void t7() {
int t8() { int t8() {
__asm int 4 ; } comments for single-line asm __asm int 4 ; } comments for single-line asm
__asm {} __asm {}
__asm int 4 __asm { int 5}
__asm int 6
__asm int 7
__asm {
int 8
}
return 10; return 10;
// CHECK: t8 // CHECK: t8
// CHECK: call i32 asm sideeffect inteldialect "int $$4\0A\09int $$4", "={eax},~{dirflag},~{fpsr},~{flags}"() // CHECK: call i32 asm sideeffect inteldialect "int $$4", "={eax},~{dirflag},~{fpsr},~{flags}"()
// CHECK: call i32 asm sideeffect inteldialect "", "={eax},~{dirflag},~{fpsr},~{flags}"()
// CHECK: call i32 asm sideeffect inteldialect "int $$5", "={eax},~{dirflag},~{fpsr},~{flags}"()
// CHECK: call i32 asm sideeffect inteldialect "int $$6\0A\09int $$7", "={eax},~{dirflag},~{fpsr},~{flags}"()
// CHECK: call i32 asm sideeffect inteldialect "int $$8", "={eax},~{dirflag},~{fpsr},~{flags}"()
// CHECK: ret i32 10 // CHECK: ret i32 10
} }

View File

@ -55,4 +55,4 @@ void t12() {
} }
int t_fail() { // expected-note {{to match this}} int t_fail() { // expected-note {{to match this}}
__asm __asm
__asm { // expected-error 2 {{expected}} expected-note {{to match this}} __asm { // expected-error 3 {{expected}} expected-note {{to match this}}