forked from OSchip/llvm-project
[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:
parent
7862c173c3
commit
146d2ec06d
|
@ -423,6 +423,10 @@ StmtResult Parser::ParseMicrosoftAsmStatement(SourceLocation AsmLoc) {
|
|||
// We're no longer in a comment.
|
||||
InAsmComment = false;
|
||||
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);
|
||||
SkippedStartOfLine = Tok.isAtStartOfLine();
|
||||
}
|
||||
|
|
|
@ -63,10 +63,19 @@ void t7() {
|
|||
int t8() {
|
||||
__asm int 4 ; } comments for single-line asm
|
||||
__asm {}
|
||||
__asm int 4
|
||||
__asm { int 5}
|
||||
__asm int 6
|
||||
__asm int 7
|
||||
__asm {
|
||||
int 8
|
||||
}
|
||||
return 10;
|
||||
// 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
|
||||
}
|
||||
|
||||
|
|
|
@ -55,4 +55,4 @@ void t12() {
|
|||
}
|
||||
int t_fail() { // expected-note {{to match this}}
|
||||
__asm
|
||||
__asm { // expected-error 2 {{expected}} expected-note {{to match this}}
|
||||
__asm { // expected-error 3 {{expected}} expected-note {{to match this}}
|
||||
|
|
Loading…
Reference in New Issue