diff options
| author | 2019-01-27 16:42:12 +0000 | |
|---|---|---|
| committer | 2019-01-27 16:42:12 +0000 | |
| commit | b773203fb58f3ef282fb69c832d8710cab5bc82d (patch) | |
| tree | e75913f147570fbd75169647b144df85b88a038c /gnu/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp | |
| parent | tweak errno in previous (diff) | |
| download | wireguard-openbsd-b773203fb58f3ef282fb69c832d8710cab5bc82d.tar.xz wireguard-openbsd-b773203fb58f3ef282fb69c832d8710cab5bc82d.zip | |
Import LLVM 7.0.1 release including clang, lld and lldb.
Diffstat (limited to 'gnu/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp')
| -rw-r--r-- | gnu/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp | 68 |
1 files changed, 23 insertions, 45 deletions
diff --git a/gnu/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp b/gnu/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp index 05f78a48bad..35f52f7d279 100644 --- a/gnu/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp +++ b/gnu/llvm/lib/Target/Sparc/AsmParser/SparcAsmParser.cpp @@ -95,7 +95,6 @@ class SparcAsmParser : public MCTargetAsmParser { unsigned &RegKind); bool matchSparcAsmModifiers(const MCExpr *&EVal, SMLoc &EndLoc); - bool parseDirectiveWord(unsigned Size, SMLoc L); bool is64Bit() const { return getSTI().getTargetTriple().getArch() == Triple::sparcv9; @@ -109,6 +108,14 @@ public: const MCInstrInfo &MII, const MCTargetOptions &Options) : MCTargetAsmParser(Options, sti, MII), Parser(parser) { + Parser.addAliasForDirective(".half", ".2byte"); + Parser.addAliasForDirective(".uahalf", ".2byte"); + Parser.addAliasForDirective(".word", ".4byte"); + Parser.addAliasForDirective(".uaword", ".4byte"); + Parser.addAliasForDirective(".nword", is64Bit() ? ".8byte" : ".4byte"); + if (is64Bit()) + Parser.addAliasForDirective(".xword", ".8byte"); + // Initialize the set of available features. setAvailableFeatures(ComputeAvailableFeatures(getSTI().getFeatureBits())); } @@ -183,7 +190,7 @@ public: Sparc::C8_C9, Sparc::C10_C11, Sparc::C12_C13, Sparc::C14_C15, Sparc::C16_C17, Sparc::C18_C19, Sparc::C20_C21, Sparc::C22_C23, Sparc::C24_C25, Sparc::C26_C27, Sparc::C28_C29, Sparc::C30_C31}; - + namespace { /// SparcOperand - Instances of this class represent a parsed Sparc machine @@ -452,7 +459,7 @@ public: Op.Reg.Kind = rk_CoprocPairReg; return true; } - + static std::unique_ptr<SparcOperand> MorphToMEMrr(unsigned Base, std::unique_ptr<SparcOperand> Op) { unsigned offsetReg = Op->getReg(); @@ -682,21 +689,6 @@ ParseDirective(AsmToken DirectiveID) { StringRef IDVal = DirectiveID.getString(); - if (IDVal == ".byte") - return parseDirectiveWord(1, DirectiveID.getLoc()); - - if (IDVal == ".half") - return parseDirectiveWord(2, DirectiveID.getLoc()); - - if (IDVal == ".word") - return parseDirectiveWord(4, DirectiveID.getLoc()); - - if (IDVal == ".nword") - return parseDirectiveWord(is64Bit() ? 8 : 4, DirectiveID.getLoc()); - - if (is64Bit() && IDVal == ".xword") - return parseDirectiveWord(8, DirectiveID.getLoc()); - if (IDVal == ".register") { // For now, ignore .register directive. Parser.eatToEndOfStatement(); @@ -713,28 +705,6 @@ ParseDirective(AsmToken DirectiveID) return true; } -bool SparcAsmParser:: parseDirectiveWord(unsigned Size, SMLoc L) { - if (getLexer().isNot(AsmToken::EndOfStatement)) { - while (true) { - const MCExpr *Value; - if (getParser().parseExpression(Value)) - return true; - - getParser().getStreamer().EmitValue(Value, Size); - - if (getLexer().is(AsmToken::EndOfStatement)) - break; - - // FIXME: Improve diagnostic. - if (getLexer().isNot(AsmToken::Comma)) - return Error(L, "unexpected token in directive"); - Parser.Lex(); - } - } - Parser.Lex(); - return false; -} - OperandMatchResultTy SparcAsmParser::parseMEMOperand(OperandVector &Operands) { SMLoc S, E; @@ -915,9 +885,17 @@ SparcAsmParser::parseSparcAsmOperand(std::unique_ptr<SparcOperand> &Op, const MCExpr *Res = MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); - if (isCall && getContext().getObjectFileInfo()->isPositionIndependent()) - Res = SparcMCExpr::create(SparcMCExpr::VK_Sparc_WPLT30, Res, - getContext()); + SparcMCExpr::VariantKind Kind = SparcMCExpr::VK_Sparc_13; + + if (getContext().getObjectFileInfo()->isPositionIndependent()) { + if (isCall) + Kind = SparcMCExpr::VK_Sparc_WPLT30; + else + Kind = SparcMCExpr::VK_Sparc_GOT13; + } + + Res = SparcMCExpr::create(Kind, Res, getContext()); + Op = SparcOperand::CreateImm(Res, S, E); } break; @@ -1022,7 +1000,7 @@ bool SparcAsmParser::matchRegisterName(const AsmToken &Tok, unsigned &RegNo, RegKind = SparcOperand::rk_Special; return true; } - + if (name.equals("wim")) { RegNo = Sparc::WIM; RegKind = SparcOperand::rk_Special; @@ -1115,7 +1093,7 @@ bool SparcAsmParser::matchRegisterName(const AsmToken &Tok, unsigned &RegNo, RegKind = SparcOperand::rk_CoprocReg; return true; } - + if (name.equals("tpc")) { RegNo = Sparc::TPC; RegKind = SparcOperand::rk_Special; |
