[ms-inline asm] Output empty asm statements for the directives we don't

handle.  Otherwise, the AsmParser will explode if we try to generate an
object files.

llvm-svn: 163345
This commit is contained in:
Chad Rosier 2012-09-06 19:56:25 +00:00
parent c3366ccecb
commit 46b0a0adbe
2 changed files with 16 additions and 10 deletions

View File

@ -454,11 +454,11 @@ static std::string buildMSAsmString(Sema &SemaRef, ArrayRef<Token> AsmToks,
return Res.str(); return Res.str();
} }
#define DEF_SIMPLE_MSASM \ #define DEF_SIMPLE_MSASM(STR) \
MSAsmStmt *NS = \ MSAsmStmt *NS = \
new (Context) MSAsmStmt(Context, AsmLoc, LBraceLoc, /*IsSimple*/ true, \ new (Context) MSAsmStmt(Context, AsmLoc, LBraceLoc, /*IsSimple*/ true, \
/*IsVolatile*/ true, AsmToks, Inputs, Outputs, \ /*IsVolatile*/ true, AsmToks, Inputs, Outputs, \
InputExprs, OutputExprs, AsmString, Constraints, \ InputExprs, OutputExprs, STR, Constraints, \
Clobbers, EndLoc); Clobbers, EndLoc);
StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc, StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc,
@ -478,11 +478,8 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc,
SmallVector<std::string, 4> OutputExprNames; SmallVector<std::string, 4> OutputExprNames;
// Empty asm statements don't need to instantiate the AsmParser, etc. // Empty asm statements don't need to instantiate the AsmParser, etc.
if (AsmToks.empty()) { StringRef EmptyAsmStr;
StringRef AsmString; if (AsmToks.empty()) { DEF_SIMPLE_MSASM(EmptyAsmStr); return Owned(NS); }
DEF_SIMPLE_MSASM;
return Owned(NS);
}
std::vector<std::string> AsmStrings; std::vector<std::string> AsmStrings;
std::vector<std::pair<unsigned,unsigned> > AsmTokRanges; std::vector<std::pair<unsigned,unsigned> > AsmTokRanges;
@ -495,7 +492,7 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc,
bool IsSimple = isSimpleMSAsm(Pieces, Context.getTargetInfo()); bool IsSimple = isSimpleMSAsm(Pieces, Context.getTargetInfo());
// AsmParser doesn't fully support these asm statements. // AsmParser doesn't fully support these asm statements.
if (bailOnMSAsm(Pieces)) { DEF_SIMPLE_MSASM; return Owned(NS); } if (bailOnMSAsm(Pieces)) { DEF_SIMPLE_MSASM(EmptyAsmStr); return Owned(NS); }
// Initialize targets and assembly printers/parsers. // Initialize targets and assembly printers/parsers.
llvm::InitializeAllTargetInfos(); llvm::InitializeAllTargetInfos();
@ -549,7 +546,7 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc,
bool HadError = TargetParser->ParseInstruction(OpcodeStr.str(), IDLoc, bool HadError = TargetParser->ParseInstruction(OpcodeStr.str(), IDLoc,
Operands); Operands);
// If we had an error parsing the operands, fail gracefully. // If we had an error parsing the operands, fail gracefully.
if (HadError) { DEF_SIMPLE_MSASM; return Owned(NS); } if (HadError) { DEF_SIMPLE_MSASM(EmptyAsmStr); return Owned(NS); }
// Match the MCInstr. // Match the MCInstr.
unsigned Kind; unsigned Kind;
@ -559,7 +556,7 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLocation AsmLoc,
ErrorInfo, ErrorInfo,
/*matchingInlineAsm*/ true); /*matchingInlineAsm*/ true);
// If we had an error parsing the operands, fail gracefully. // If we had an error parsing the operands, fail gracefully.
if (HadError) { DEF_SIMPLE_MSASM; return Owned(NS); } if (HadError) { DEF_SIMPLE_MSASM(EmptyAsmStr); return Owned(NS); }
// Get the instruction descriptor. // Get the instruction descriptor.
llvm::MCInst Inst = Instrs[0]; llvm::MCInst Inst = Instrs[0];

View File

@ -96,6 +96,9 @@ unsigned t10(void) {
void t11(void) { void t11(void) {
__asm EVEN __asm EVEN
__asm ALIGN __asm ALIGN
// CHECK: t11
// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
} }
void t12(void) { void t12(void) {
@ -104,6 +107,8 @@ void t12(void) {
_emit 0x43 _emit 0x43
_emit 0x4B _emit 0x4B
} }
// CHECK: t12
// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
} }
void t13(void) { void t13(void) {
@ -111,4 +116,8 @@ void t13(void) {
__asm LENGTH arr ; sizeof(arr)/sizeof(arr[0]) __asm LENGTH arr ; sizeof(arr)/sizeof(arr[0])
__asm SIZE arr ; sizeof(arr) __asm SIZE arr ; sizeof(arr)
__asm TYPE arr ; sizeof(arr[0]) __asm TYPE arr ; sizeof(arr[0])
// CHECK: t13
// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"() nounwind
} }