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.
|
// 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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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}}
|
||||||
|
|
Loading…
Reference in New Issue