aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2014-07-17 20:24:55 +0000
committerNico Weber <nicolasweber@gmx.de>2014-07-17 20:24:55 +0000
commit42f79dbf02545fb36c78b07ccb89e61ab2f50e03 (patch)
treeb206f56b6e77dbc7553ac9ebea41fdc8aac28fbd
parent86aca19b1d00e5903e7690b479932607be5a30ec (diff)
downloadllvm-42f79dbf02545fb36c78b07ccb89e61ab2f50e03.zip
llvm-42f79dbf02545fb36c78b07ccb89e61ab2f50e03.tar.gz
llvm-42f79dbf02545fb36c78b07ccb89e61ab2f50e03.tar.bz2
ms inline asm: Don't add x86 segment registers to the clobber list.
Clang tries to check the clobber list but doesn't list segment registers in its x86 register list. This fixes PR20343. llvm-svn: 213303
-rw-r--r--llvm/include/llvm/MC/MCTargetAsmParser.h3
-rw-r--r--llvm/lib/MC/MCParser/AsmParser.cpp3
-rw-r--r--llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp5
3 files changed, 10 insertions, 1 deletions
diff --git a/llvm/include/llvm/MC/MCTargetAsmParser.h b/llvm/include/llvm/MC/MCTargetAsmParser.h
index 384cc1b..9a5881b 100644
--- a/llvm/include/llvm/MC/MCTargetAsmParser.h
+++ b/llvm/include/llvm/MC/MCTargetAsmParser.h
@@ -164,6 +164,9 @@ public:
unsigned &ErrorInfo,
bool MatchingInlineAsm) = 0;
+ /// Allows targets to let registers opt out of clobber lists.
+ virtual bool OmitRegisterFromClobberLists(unsigned RegNo) { return false; }
+
/// Allow a target to add special case operand matching for things that
/// tblgen doesn't/can't handle effectively. For example, literal
/// immediates on ARM. TableGen expects a token operand, but the parser
diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp
index 62ab4a5..ed1d704 100644
--- a/llvm/lib/MC/MCParser/AsmParser.cpp
+++ b/llvm/lib/MC/MCParser/AsmParser.cpp
@@ -4510,7 +4510,8 @@ bool AsmParser::parseMSInlineAsm(
continue;
// Register operand.
- if (Operand.isReg() && !Operand.needAddressOf()) {
+ if (Operand.isReg() && !Operand.needAddressOf() &&
+ !getTargetParser().OmitRegisterFromClobberLists(Operand.getReg())) {
unsigned NumDefs = Desc.getNumDefs();
// Clobber.
if (NumDefs && Operand.getMCOperandNum() < NumDefs)
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
index f0765ed..a259c96 100644
--- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
+++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
@@ -696,6 +696,8 @@ private:
unsigned &ErrorInfo,
bool MatchingInlineAsm) override;
+ virtual bool OmitRegisterFromClobberLists(unsigned RegNo) override;
+
/// doSrcDstMatch - Returns true if operands are matching in their
/// word size (%si and %di, %esi and %edi, etc.). Order depends on
/// the parsing mode (Intel vs. AT&T).
@@ -2520,6 +2522,9 @@ bool X86AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
return true;
}
+bool X86AsmParser::OmitRegisterFromClobberLists(unsigned RegNo) {
+ return X86MCRegisterClasses[X86::SEGMENT_REGRegClassID].contains(RegNo);
+}
bool X86AsmParser::ParseDirective(AsmToken DirectiveID) {
StringRef IDVal = DirectiveID.getIdentifier();