diff options
author | Nico Weber <nicolasweber@gmx.de> | 2014-07-17 20:24:55 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2014-07-17 20:24:55 +0000 |
commit | 42f79dbf02545fb36c78b07ccb89e61ab2f50e03 (patch) | |
tree | b206f56b6e77dbc7553ac9ebea41fdc8aac28fbd | |
parent | 86aca19b1d00e5903e7690b479932607be5a30ec (diff) | |
download | llvm-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.h | 3 | ||||
-rw-r--r-- | llvm/lib/MC/MCParser/AsmParser.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp | 5 |
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(); |