diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2020-01-17 20:45:01 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2020-01-17 20:45:01 +0000 |
commit | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (patch) | |
tree | 4adf86a776049cbf7f69a1929c4babcbbef925eb /llvm/lib/MC/MCParser/AsmParser.cpp | |
parent | 7cc9cf2bf09f069cb2dd947ead05d0b54301fb71 (diff) |
Notes
Diffstat (limited to 'llvm/lib/MC/MCParser/AsmParser.cpp')
-rw-r--r-- | llvm/lib/MC/MCParser/AsmParser.cpp | 90 |
1 files changed, 60 insertions, 30 deletions
diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index b59ac08ad6cc..94a44c1f93b1 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -91,16 +91,13 @@ struct MacroInstantiation { SMLoc InstantiationLoc; /// The buffer where parsing should resume upon instantiation completion. - int ExitBuffer; + unsigned ExitBuffer; /// The location where parsing should resume upon instantiation completion. SMLoc ExitLoc; /// The depth of TheCondStack at the start of the instantiation. size_t CondStackDepth; - -public: - MacroInstantiation(SMLoc IL, int EB, SMLoc EL, size_t CondStackDepth); }; struct ParseStatementInfo { @@ -916,13 +913,12 @@ bool AsmParser::Run(bool NoInitialTextSection, bool NoFinalize) { // While we have input, parse each statement. while (Lexer.isNot(AsmToken::Eof)) { ParseStatementInfo Info(&AsmStrRewrites); - if (!parseStatement(Info, nullptr)) - continue; + bool Parsed = parseStatement(Info, nullptr); // If we have a Lexer Error we are on an Error Token. Load in Lexer Error // for printing ErrMsg via Lex() only if no (presumably better) parser error // exists. - if (!hasPendingError() && Lexer.getTok().is(AsmToken::Error)) { + if (Parsed && !hasPendingError() && Lexer.getTok().is(AsmToken::Error)) { Lex(); } @@ -930,7 +926,7 @@ bool AsmParser::Run(bool NoInitialTextSection, bool NoFinalize) { printPendingErrors(); // Skipping to the next line if needed. - if (!getLexer().isAtStartOfStatement()) + if (Parsed && !getLexer().isAtStartOfStatement()) eatToEndOfStatement(); } @@ -2521,11 +2517,6 @@ bool AsmParser::expandMacro(raw_svector_ostream &OS, StringRef Body, return false; } -MacroInstantiation::MacroInstantiation(SMLoc IL, int EB, SMLoc EL, - size_t CondStackDepth) - : InstantiationLoc(IL), ExitBuffer(EB), ExitLoc(EL), - CondStackDepth(CondStackDepth) {} - static bool isOperator(AsmToken::TokenKind kind) { switch (kind) { default: @@ -2800,8 +2791,8 @@ bool AsmParser::handleMacroEntry(const MCAsmMacro *M, SMLoc NameLoc) { // Create the macro instantiation object and add to the current macro // instantiation stack. - MacroInstantiation *MI = new MacroInstantiation( - NameLoc, CurBuffer, getTok().getLoc(), TheCondStack.size()); + MacroInstantiation *MI = new MacroInstantiation{ + NameLoc, CurBuffer, getTok().getLoc(), TheCondStack.size()}; ActiveMacros.push_back(MI); ++NumOfMacroInstantiations; @@ -3139,8 +3130,9 @@ bool AsmParser::parseRealValue(const fltSemantics &Semantics, APInt &Res) { Value = APFloat::getNaN(Semantics, false, ~0); else return TokError("invalid floating point literal"); - } else if (Value.convertFromString(IDVal, APFloat::rmNearestTiesToEven) == - APFloat::opInvalidOp) + } else if (errorToBool( + Value.convertFromString(IDVal, APFloat::rmNearestTiesToEven) + .takeError())) return TokError("invalid floating point literal"); if (IsNeg) Value.changeSign(); @@ -5545,8 +5537,8 @@ void AsmParser::instantiateMacroLikeBody(MCAsmMacro *M, SMLoc DirectiveLoc, // Create the macro instantiation object and add to the current macro // instantiation stack. - MacroInstantiation *MI = new MacroInstantiation( - DirectiveLoc, CurBuffer, getTok().getLoc(), TheCondStack.size()); + MacroInstantiation *MI = new MacroInstantiation{ + DirectiveLoc, CurBuffer, getTok().getLoc(), TheCondStack.size()}; ActiveMacros.push_back(MI); // Jump to the macro instantiation and prime the lexer. @@ -5813,10 +5805,6 @@ bool AsmParser::parseMSInlineAsm( for (unsigned i = 1, e = Info.ParsedOperands.size(); i != e; ++i) { MCParsedAsmOperand &Operand = *Info.ParsedOperands[i]; - // Immediate. - if (Operand.isImm()) - continue; - // Register operand. if (Operand.isReg() && !Operand.needAddressOf() && !getTargetParser().OmitRegisterFromClobberLists(Operand.getReg())) { @@ -5836,19 +5824,31 @@ bool AsmParser::parseMSInlineAsm( if (!OpDecl) continue; + StringRef Constraint = Operand.getConstraint(); + if (Operand.isImm()) { + // Offset as immediate + if (Operand.isOffsetOfLocal()) + Constraint = "r"; + else + Constraint = "i"; + } + bool isOutput = (i == 1) && Desc.mayStore(); SMLoc Start = SMLoc::getFromPointer(SymName.data()); if (isOutput) { ++InputIdx; OutputDecls.push_back(OpDecl); OutputDeclsAddressOf.push_back(Operand.needAddressOf()); - OutputConstraints.push_back(("=" + Operand.getConstraint()).str()); + OutputConstraints.push_back(("=" + Constraint).str()); AsmStrRewrites.emplace_back(AOK_Output, Start, SymName.size()); } else { InputDecls.push_back(OpDecl); InputDeclsAddressOf.push_back(Operand.needAddressOf()); - InputConstraints.push_back(Operand.getConstraint().str()); - AsmStrRewrites.emplace_back(AOK_Input, Start, SymName.size()); + InputConstraints.push_back(Constraint.str()); + if (Desc.OpInfo[i - 1].isBranchTarget()) + AsmStrRewrites.emplace_back(AOK_CallInput, Start, SymName.size()); + else + AsmStrRewrites.emplace_back(AOK_Input, Start, SymName.size()); } } @@ -5895,7 +5895,11 @@ bool AsmParser::parseMSInlineAsm( const char *AsmStart = ASMString.begin(); const char *AsmEnd = ASMString.end(); array_pod_sort(AsmStrRewrites.begin(), AsmStrRewrites.end(), rewritesSort); - for (const AsmRewrite &AR : AsmStrRewrites) { + for (auto it = AsmStrRewrites.begin(); it != AsmStrRewrites.end(); ++it) { + const AsmRewrite &AR = *it; + // Check if this has already been covered by another rewrite... + if (AR.Done) + continue; AsmRewriteKind Kind = AR.Kind; const char *Loc = AR.Loc.getPointer(); @@ -5926,9 +5930,32 @@ bool AsmParser::parseMSInlineAsm( OS << (AR.IntelExp.hasBaseReg() ? " + " : "") << AR.IntelExp.IndexReg; if (AR.IntelExp.Scale > 1) - OS << " * $$" << AR.IntelExp.Scale; - if (AR.IntelExp.Imm || !AR.IntelExp.hasRegs()) - OS << (AR.IntelExp.hasRegs() ? " + $$" : "$$") << AR.IntelExp.Imm; + OS << " * $$" << AR.IntelExp.Scale; + if (AR.IntelExp.hasOffset()) { + if (AR.IntelExp.hasRegs()) + OS << " + "; + // Fuse this rewrite with a rewrite of the offset name, if present. + StringRef OffsetName = AR.IntelExp.OffsetName; + SMLoc OffsetLoc = SMLoc::getFromPointer(AR.IntelExp.OffsetName.data()); + size_t OffsetLen = OffsetName.size(); + auto rewrite_it = std::find_if( + it, AsmStrRewrites.end(), [&](const AsmRewrite &FusingAR) { + return FusingAR.Loc == OffsetLoc && FusingAR.Len == OffsetLen && + (FusingAR.Kind == AOK_Input || + FusingAR.Kind == AOK_CallInput); + }); + if (rewrite_it == AsmStrRewrites.end()) { + OS << "offset " << OffsetName; + } else if (rewrite_it->Kind == AOK_CallInput) { + OS << "${" << InputIdx++ << ":P}"; + rewrite_it->Done = true; + } else { + OS << '$' << InputIdx++; + rewrite_it->Done = true; + } + } + if (AR.IntelExp.Imm || AR.IntelExp.emitImm()) + OS << (AR.IntelExp.emitImm() ? "$$" : " + $$") << AR.IntelExp.Imm; if (AR.IntelExp.NeedBracs) OS << "]"; break; @@ -5938,6 +5965,9 @@ bool AsmParser::parseMSInlineAsm( case AOK_Input: OS << '$' << InputIdx++; break; + case AOK_CallInput: + OS << "${" << InputIdx++ << ":P}"; + break; case AOK_Output: OS << '$' << OutputIdx++; break; |