forked from OSchip/llvm-project
[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:
parent
c3366ccecb
commit
46b0a0adbe
|
@ -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];
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue