diff options
Diffstat (limited to 'llvm/lib/MC/MCParser/AsmParser.cpp')
-rw-r--r-- | llvm/lib/MC/MCParser/AsmParser.cpp | 253 |
1 files changed, 138 insertions, 115 deletions
diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index 94a44c1f93b18..c05f26cbdda5c 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// // -// This class implements the parser for assembly files. +// This class implements a parser for assembly files similar to gas syntax. // //===----------------------------------------------------------------------===// @@ -74,9 +74,7 @@ using namespace llvm; MCAsmParserSemaCallback::~MCAsmParserSemaCallback() = default; -static cl::opt<unsigned> AsmMacroMaxNestingDepth( - "asm-macro-max-nesting-depth", cl::init(20), cl::Hidden, - cl::desc("The maximum nesting depth allowed for assembly macros.")); +extern cl::opt<unsigned> AsmMacroMaxNestingDepth; namespace { @@ -176,7 +174,7 @@ private: bool IsDarwin = false; /// Are we parsing ms-style inline assembly? - bool ParsingInlineAsm = false; + bool ParsingMSInlineAsm = false; /// Did we already inform the user about inconsistent MD5 usage? bool ReportedInconsistentMD5 = false; @@ -199,7 +197,7 @@ public: } void addAliasForDirective(StringRef Directive, StringRef Alias) override { - DirectiveKindMap[Directive] = DirectiveKindMap[Alias]; + DirectiveKindMap[Directive.lower()] = DirectiveKindMap[Alias.lower()]; } /// @name MCAsmParser Interface @@ -228,13 +226,13 @@ public: const AsmToken &Lex() override; - void setParsingInlineAsm(bool V) override { - ParsingInlineAsm = V; + void setParsingMSInlineAsm(bool V) override { + ParsingMSInlineAsm = V; // When parsing MS inline asm, we must lex 0b1101 and 0ABCH as binary and // hex integer literals. Lexer.setLexMasmIntegers(V); } - bool isParsingInlineAsm() override { return ParsingInlineAsm; } + bool isParsingMSInlineAsm() override { return ParsingMSInlineAsm; } bool parseMSInlineAsm(void *AsmLoc, std::string &AsmString, unsigned &NumOutputs, unsigned &NumInputs, @@ -269,7 +267,7 @@ private: bool parseStatement(ParseStatementInfo &Info, MCAsmParserSemaCallback *SI); bool parseCurlyBlockScope(SmallVectorImpl<AsmRewrite>& AsmStrRewrites); - bool parseCppHashLineFilenameComment(SMLoc L); + bool parseCppHashLineFilenameComment(SMLoc L, bool SaveLocInfo = true); void checkForBadMacro(SMLoc DirectiveLoc, StringRef Name, StringRef Body, ArrayRef<MCAsmMacroParameter> Parameters); @@ -645,6 +643,7 @@ private: bool parseDirectiveElse(SMLoc DirectiveLoc); // ".else" bool parseDirectiveEndIf(SMLoc DirectiveLoc); // .endif bool parseEscapedString(std::string &Data) override; + bool parseAngleBracketString(std::string &Data) override; const MCExpr *applyModifierToExpr(const MCExpr *E, MCSymbolRefExpr::VariantKind Variant); @@ -814,7 +813,7 @@ bool AsmParser::processIncbinFile(const std::string &Filename, int64_t Skip, return Warning(Loc, "negative count has no effect"); Bytes = Bytes.take_front(Res); } - getStreamer().EmitBytes(Bytes); + getStreamer().emitBytes(Bytes); return false; } @@ -875,7 +874,7 @@ bool AsmParser::enabledGenDwarfForAssembly() { /*Cksum=*/None, /*Source=*/None); const MCDwarfFile &RootFile = getContext().getMCDwarfLineTable(/*CUID=*/0).getRootFile(); - getContext().setGenDwarfFileNumber(getStreamer().EmitDwarfFileDirective( + getContext().setGenDwarfFileNumber(getStreamer().emitDwarfFileDirective( /*CUID=*/0, getContext().getCompilationDir(), RootFile.Name, RootFile.Checksum, RootFile.Source)); } @@ -902,7 +901,7 @@ bool AsmParser::Run(bool NoInitialTextSection, bool NoFinalize) { MCSection *Sec = getStreamer().getCurrentSectionOnly(); if (!Sec->getBeginSymbol()) { MCSymbol *SectionStartSym = getContext().createTempSymbol(); - getStreamer().EmitLabel(SectionStartSym); + getStreamer().emitLabel(SectionStartSym); Sec->setBeginSymbol(SectionStartSym); } bool InsertResult = getContext().addGenDwarfSection(Sec); @@ -995,7 +994,7 @@ bool AsmParser::Run(bool NoInitialTextSection, bool NoFinalize) { } bool AsmParser::checkForValidSection() { - if (!ParsingInlineAsm && !getStreamer().getCurrentSectionOnly()) { + if (!ParsingMSInlineAsm && !getStreamer().getCurrentSectionOnly()) { Out.InitSections(false); return Error(getTok().getLoc(), "expected section directive before assembly directive"); @@ -1097,7 +1096,7 @@ bool AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) { // This is a '$' reference, which references the current PC. Emit a // temporary label to the streamer and refer to it. MCSymbol *Sym = Ctx.createTempSymbol(); - Out.EmitLabel(Sym); + Out.emitLabel(Sym); Res = MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); EndLoc = FirstTokenLoc; @@ -1223,7 +1222,7 @@ bool AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) { // This is a '.' reference, which references the current PC. Emit a // temporary label to the streamer and refer to it. MCSymbol *Sym = Ctx.createTempSymbol(); - Out.EmitLabel(Sym); + Out.emitLabel(Sym); Res = MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); EndLoc = Lexer.getTok().getEndLoc(); Lex(); // Eat identifier. @@ -1365,7 +1364,7 @@ AsmParser::applyModifierToExpr(const MCExpr *E, /// implementation. GCC does not fully support this feature and so we will not /// support it. /// TODO: Adding single quote as a string. -static bool isAltmacroString(SMLoc &StrLoc, SMLoc &EndLoc) { +static bool isAngleBracketString(SMLoc &StrLoc, SMLoc &EndLoc) { assert((StrLoc.getPointer() != nullptr) && "Argument to the function cannot be a NULL value"); const char *CharPtr = StrLoc.getPointer(); @@ -1383,7 +1382,7 @@ static bool isAltmacroString(SMLoc &StrLoc, SMLoc &EndLoc) { } /// creating a string without the escape characters '!'. -static std::string altMacroString(StringRef AltMacroStr) { +static std::string angleBracketString(StringRef AltMacroStr) { std::string Res; for (size_t Pos = 0; Pos < AltMacroStr.size(); Pos++) { if (AltMacroStr[Pos] == '!') @@ -1700,7 +1699,9 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, StringRef IDVal; int64_t LocalLabelVal = -1; if (Lexer.is(AsmToken::HashDirective)) - return parseCppHashLineFilenameComment(IDLoc); + return parseCppHashLineFilenameComment(IDLoc, + !isInsideMacroInstantiation()); + // Allow an integer followed by a ':' as a directional local label. if (Lexer.is(AsmToken::Integer)) { LocalLabelVal = getTok().getIntVal(); @@ -1750,7 +1751,7 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, // have to do this so that .endif isn't skipped in a ".if 0" block for // example. StringMap<DirectiveKind>::const_iterator DirKindIt = - DirectiveKindMap.find(IDVal); + DirectiveKindMap.find(IDVal.lower()); DirectiveKind DirKind = (DirKindIt == DirectiveKindMap.end()) ? DK_NO_DIRECTIVE @@ -1822,7 +1823,7 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, // implicitly marked as external. MCSymbol *Sym; if (LocalLabelVal == -1) { - if (ParsingInlineAsm && SI) { + if (ParsingMSInlineAsm && SI) { StringRef RewrittenLabel = SI->LookupInlineAsmLabel(IDVal, getSourceManager(), IDLoc, true); assert(!RewrittenLabel.empty() && @@ -1853,8 +1854,8 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, getTargetParser().doBeforeLabelEmit(Sym); // Emit the label. - if (!getTargetParser().isParsingInlineAsm()) - Out.EmitLabel(Sym, IDLoc); + if (!getTargetParser().isParsingMSInlineAsm()) + Out.emitLabel(Sym, IDLoc); // If we are generating dwarf for assembly source files then gather the // info to make a dwarf label entry for this label if needed. @@ -2194,15 +2195,15 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, } // __asm _emit or __asm __emit - if (ParsingInlineAsm && (IDVal == "_emit" || IDVal == "__emit" || - IDVal == "_EMIT" || IDVal == "__EMIT")) + if (ParsingMSInlineAsm && (IDVal == "_emit" || IDVal == "__emit" || + IDVal == "_EMIT" || IDVal == "__EMIT")) return parseDirectiveMSEmit(IDLoc, Info, IDVal.size()); // __asm align - if (ParsingInlineAsm && (IDVal == "align" || IDVal == "ALIGN")) + if (ParsingMSInlineAsm && (IDVal == "align" || IDVal == "ALIGN")) return parseDirectiveMSAlign(IDLoc, Info); - if (ParsingInlineAsm && (IDVal == "even" || IDVal == "EVEN")) + if (ParsingMSInlineAsm && (IDVal == "even" || IDVal == "EVEN")) Info.AsmRewrites->emplace_back(AOK_EVEN, IDLoc, 4); if (checkForValidSection()) return true; @@ -2249,7 +2250,7 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, // current Dwarf File is for the CppHashFilename if not then emit the // Dwarf File table for it and adjust the line number for the .loc. if (!CppHashInfo.Filename.empty()) { - unsigned FileNumber = getStreamer().EmitDwarfFileDirective( + unsigned FileNumber = getStreamer().emitDwarfFileDirective( 0, StringRef(), CppHashInfo.Filename); getContext().setGenDwarfFileNumber(FileNumber); @@ -2258,7 +2259,7 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, Line = CppHashInfo.LineNumber - 1 + (Line - CppHashLocLineNo); } - getStreamer().EmitDwarfLocDirective( + getStreamer().emitDwarfLocDirective( getContext().getGenDwarfFileNumber(), Line, 0, DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0, 0, 0, StringRef()); @@ -2269,7 +2270,7 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, uint64_t ErrorInfo; if (getTargetParser().MatchAndEmitInstruction( IDLoc, Info.Opcode, Info.ParsedOperands, Out, ErrorInfo, - getTargetParser().isParsingInlineAsm())) + getTargetParser().isParsingMSInlineAsm())) return true; } return false; @@ -2295,7 +2296,7 @@ AsmParser::parseCurlyBlockScope(SmallVectorImpl<AsmRewrite> &AsmStrRewrites) { /// parseCppHashLineFilenameComment as this: /// ::= # number "filename" -bool AsmParser::parseCppHashLineFilenameComment(SMLoc L) { +bool AsmParser::parseCppHashLineFilenameComment(SMLoc L, bool SaveLocInfo) { Lex(); // Eat the hash token. // Lexer only ever emits HashDirective if it fully formed if it's // done the checking already so this is an internal error. @@ -2308,6 +2309,9 @@ bool AsmParser::parseCppHashLineFilenameComment(SMLoc L) { StringRef Filename = getTok().getString(); Lex(); + if (!SaveLocInfo) + return false; + // Get rid of the enclosing quotes. Filename = Filename.substr(1, Filename.size() - 2); @@ -2358,7 +2362,7 @@ void AsmParser::DiagHandler(const SMDiagnostic &Diag, void *Context) { // Use the CppHashFilename and calculate a line number based on the // CppHashInfo.Loc and CppHashInfo.LineNumber relative to this Diag's SMLoc // for the diagnostic. - const std::string &Filename = Parser->CppHashInfo.Filename; + const std::string &Filename = std::string(Parser->CppHashInfo.Filename); int DiagLocLineNo = DiagSrcMgr.FindLineNumber(DiagLoc, DiagBuf); int CppHashLocLineNo = @@ -2497,7 +2501,7 @@ bool AsmParser::expandMacro(raw_svector_ostream &OS, StringRef Body, // is considered altMacroString!!! else if (AltMacroMode && Token.getString().front() == '<' && Token.is(AsmToken::String)) { - OS << altMacroString(Token.getStringContents()); + OS << angleBracketString(Token.getStringContents()); } // We expect no quotes around the string's contents when // parsing for varargs. @@ -2690,7 +2694,7 @@ bool AsmParser::parseMacroArguments(const MCAsmMacro *M, StringRef(StrChar, EndChar - StrChar), Value); FA.Value.push_back(newToken); } else if (AltMacroMode && Lexer.is(AsmToken::Less) && - isAltmacroString(StrLoc, EndLoc)) { + isAngleBracketString(StrLoc, EndLoc)) { const char *StrChar = StrLoc.getPointer(); const char *EndChar = EndLoc.getPointer(); jumpToLoc(EndLoc, CurBuffer); @@ -2831,9 +2835,9 @@ bool AsmParser::parseAssignment(StringRef Name, bool allow_redef, } // Do the assignment. - Out.EmitAssignment(Sym, Value); + Out.emitAssignment(Sym, Value); if (NoDeadStrip) - Out.EmitSymbolAttribute(Sym, MCSA_NoDeadStrip); + Out.emitSymbolAttribute(Sym, MCSA_NoDeadStrip); return false; } @@ -2855,18 +2859,18 @@ bool AsmParser::parseIdentifier(StringRef &Res) { AsmToken Buf[1]; Lexer.peekTokens(Buf, false); - if (Buf[0].isNot(AsmToken::Identifier)) + if (Buf[0].isNot(AsmToken::Identifier) && Buf[0].isNot(AsmToken::Integer)) return true; - // We have a '$' or '@' followed by an identifier, make sure they are adjacent. + // We have a '$' or '@' followed by an identifier or integer token, make + // sure they are adjacent. if (PrefixLoc.getPointer() + 1 != Buf[0].getLoc().getPointer()) return true; // eat $ or @ Lexer.Lex(); // Lexer's Lex guarantees consecutive token. // Construct the joined identifier and consume the token. - Res = - StringRef(PrefixLoc.getPointer(), getTok().getIdentifier().size() + 1); + Res = StringRef(PrefixLoc.getPointer(), getTok().getString().size() + 1); Lex(); // Parser Lex to maintain invariants. return false; } @@ -2969,6 +2973,21 @@ bool AsmParser::parseEscapedString(std::string &Data) { return false; } +bool AsmParser::parseAngleBracketString(std::string &Data) { + SMLoc EndLoc, StartLoc = getTok().getLoc(); + if (isAngleBracketString(StartLoc, EndLoc)) { + const char *StartChar = StartLoc.getPointer() + 1; + const char *EndChar = EndLoc.getPointer() - 1; + jumpToLoc(EndLoc, CurBuffer); + /// Eat from '<' to '>' + Lex(); + + Data = angleBracketString(StringRef(StartChar, EndChar - StartChar)); + return false; + } + return true; +} + /// parseDirectiveAscii: /// ::= ( .ascii | .asciz | .string ) [ "string" ( , "string" )* ] bool AsmParser::parseDirectiveAscii(StringRef IDVal, bool ZeroTerminated) { @@ -2976,9 +2995,9 @@ bool AsmParser::parseDirectiveAscii(StringRef IDVal, bool ZeroTerminated) { std::string Data; if (checkForValidSection() || parseEscapedString(Data)) return true; - getStreamer().EmitBytes(Data); + getStreamer().emitBytes(Data); if (ZeroTerminated) - getStreamer().EmitBytes(StringRef("\0", 1)); + getStreamer().emitBytes(StringRef("\0", 1)); return false; }; @@ -2992,20 +3011,12 @@ bool AsmParser::parseDirectiveAscii(StringRef IDVal, bool ZeroTerminated) { bool AsmParser::parseDirectiveReloc(SMLoc DirectiveLoc) { const MCExpr *Offset; const MCExpr *Expr = nullptr; - int64_t OffsetValue; SMLoc OffsetLoc = Lexer.getTok().getLoc(); if (parseExpression(Offset)) return true; - - if ((Offset->evaluateAsAbsolute(OffsetValue, - getStreamer().getAssemblerPtr()) && - check(OffsetValue < 0, OffsetLoc, "expression is negative")) || - (check(Offset->getKind() != llvm::MCExpr::Constant && - Offset->getKind() != llvm::MCExpr::SymbolRef, - OffsetLoc, "expected non-negative number or a label")) || - (parseToken(AsmToken::Comma, "expected comma") || - check(getTok().isNot(AsmToken::Identifier), "expected relocation name"))) + if (parseToken(AsmToken::Comma, "expected comma") || + check(getTok().isNot(AsmToken::Identifier), "expected relocation name")) return true; SMLoc NameLoc = Lexer.getTok().getLoc(); @@ -3029,8 +3040,10 @@ bool AsmParser::parseDirectiveReloc(SMLoc DirectiveLoc) { const MCTargetAsmParser &MCT = getTargetParser(); const MCSubtargetInfo &STI = MCT.getSTI(); - if (getStreamer().EmitRelocDirective(*Offset, Name, Expr, DirectiveLoc, STI)) - return Error(NameLoc, "unknown relocation name"); + if (Optional<std::pair<bool, std::string>> Err = + getStreamer().emitRelocDirective(*Offset, Name, Expr, DirectiveLoc, + STI)) + return Error(Err->first ? NameLoc : OffsetLoc, Err->second); return false; } @@ -3049,9 +3062,9 @@ bool AsmParser::parseDirectiveValue(StringRef IDVal, unsigned Size) { uint64_t IntValue = MCE->getValue(); if (!isUIntN(8 * Size, IntValue) && !isIntN(8 * Size, IntValue)) return Error(ExprLoc, "out of range literal value"); - getStreamer().EmitIntValue(IntValue, Size); + getStreamer().emitIntValue(IntValue, Size); } else - getStreamer().EmitValue(Value, Size, ExprLoc); + getStreamer().emitValue(Value, Size, ExprLoc); return false; }; @@ -3090,11 +3103,11 @@ bool AsmParser::parseDirectiveOctaValue(StringRef IDVal) { if (parseHexOcta(*this, hi, lo)) return true; if (MAI.isLittleEndian()) { - getStreamer().EmitIntValue(lo, 8); - getStreamer().EmitIntValue(hi, 8); + getStreamer().emitInt64(lo); + getStreamer().emitInt64(hi); } else { - getStreamer().EmitIntValue(hi, 8); - getStreamer().EmitIntValue(lo, 8); + getStreamer().emitInt64(hi); + getStreamer().emitInt64(lo); } return false; }; @@ -3153,7 +3166,7 @@ bool AsmParser::parseDirectiveRealValue(StringRef IDVal, APInt AsInt; if (checkForValidSection() || parseRealValue(Semantics, AsInt)) return true; - getStreamer().EmitIntValue(AsInt.getLimitedValue(), + getStreamer().emitIntValue(AsInt.getLimitedValue(), AsInt.getBitWidth() / 8); return false; }; @@ -3335,10 +3348,10 @@ bool AsmParser::parseDirectiveAlign(bool IsPow2, unsigned ValueSize) { bool UseCodeAlign = Section->UseCodeAlign(); if ((!HasFillExpr || Lexer.getMAI().getTextAlignFillValue() == FillExpr) && ValueSize == 1 && UseCodeAlign) { - getStreamer().EmitCodeAlignment(Alignment, MaxBytesToFill); + getStreamer().emitCodeAlignment(Alignment, MaxBytesToFill); } else { // FIXME: Target specific behavior about how the "extra" bytes are filled. - getStreamer().EmitValueToAlignment(Alignment, FillExpr, ValueSize, + getStreamer().emitValueToAlignment(Alignment, FillExpr, ValueSize, MaxBytesToFill); } @@ -3419,7 +3432,7 @@ bool AsmParser::parseDirectiveFile(SMLoc DirectiveLoc) { // numberless .file directives. This allows some portability of assembler // between different object file formats. if (getContext().getAsmInfo()->hasSingleParameterDotFile()) - getStreamer().EmitFileDirective(Filename); + getStreamer().emitFileDirective(Filename); } else { // In case there is a -g option as well as debug info from directive .file, // we turn off the -g option, directly use the existing debug info instead. @@ -3514,7 +3527,8 @@ bool AsmParser::parseDirectiveLoc() { Lex(); } - unsigned Flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0; + auto PrevFlags = getContext().getCurrentDwarfLoc().getFlags(); + unsigned Flags = PrevFlags & DWARF2_FLAG_IS_STMT; unsigned Isa = 0; int64_t Discriminator = 0; @@ -3573,7 +3587,7 @@ bool AsmParser::parseDirectiveLoc() { if (parseMany(parseLocOp, false /*hasComma*/)) return true; - getStreamer().EmitDwarfLocDirective(FileNumber, LineNumber, ColumnPos, Flags, + getStreamer().emitDwarfLocDirective(FileNumber, LineNumber, ColumnPos, Flags, Isa, Discriminator, StringRef()); return false; @@ -3787,7 +3801,7 @@ bool AsmParser::parseDirectiveCVLoc() { if (parseMany(parseOp, false /*hasComma*/)) return true; - getStreamer().EmitCVLocDirective(FunctionId, FileNumber, LineNumber, + getStreamer().emitCVLocDirective(FunctionId, FileNumber, LineNumber, ColumnPos, PrologueEnd, IsStmt, StringRef(), DirectiveLoc); return false; @@ -3813,7 +3827,7 @@ bool AsmParser::parseDirectiveCVLinetable() { MCSymbol *FnStartSym = getContext().getOrCreateSymbol(FnStartName); MCSymbol *FnEndSym = getContext().getOrCreateSymbol(FnEndName); - getStreamer().EmitCVLinetableDirective(FunctionId, FnStartSym, FnEndSym); + getStreamer().emitCVLinetableDirective(FunctionId, FnStartSym, FnEndSym); return false; } @@ -3847,7 +3861,7 @@ bool AsmParser::parseDirectiveCVInlineLinetable() { MCSymbol *FnStartSym = getContext().getOrCreateSymbol(FnStartName); MCSymbol *FnEndSym = getContext().getOrCreateSymbol(FnEndName); - getStreamer().EmitCVInlineLinetableDirective(PrimaryFunctionId, SourceFileId, + getStreamer().emitCVInlineLinetableDirective(PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym); return false; @@ -3904,7 +3918,7 @@ bool AsmParser::parseDirectiveCVDefRange() { codeview::DefRangeRegisterHeader DRHdr; DRHdr.Register = DRRegister; DRHdr.MayHaveNoName = 0; - getStreamer().EmitCVDefRangeDirective(Ranges, DRHdr); + getStreamer().emitCVDefRangeDirective(Ranges, DRHdr); break; } case CVDR_DEFRANGE_FRAMEPOINTER_REL: { @@ -3916,7 +3930,7 @@ bool AsmParser::parseDirectiveCVDefRange() { codeview::DefRangeFramePointerRelHeader DRHdr; DRHdr.Offset = DROffset; - getStreamer().EmitCVDefRangeDirective(Ranges, DRHdr); + getStreamer().emitCVDefRangeDirective(Ranges, DRHdr); break; } case CVDR_DEFRANGE_SUBFIELD_REGISTER: { @@ -3935,7 +3949,7 @@ bool AsmParser::parseDirectiveCVDefRange() { DRHdr.Register = DRRegister; DRHdr.MayHaveNoName = 0; DRHdr.OffsetInParent = DROffsetInParent; - getStreamer().EmitCVDefRangeDirective(Ranges, DRHdr); + getStreamer().emitCVDefRangeDirective(Ranges, DRHdr); break; } case CVDR_DEFRANGE_REGISTER_REL: { @@ -3960,7 +3974,7 @@ bool AsmParser::parseDirectiveCVDefRange() { DRHdr.Register = DRRegister; DRHdr.Flags = DRFlags; DRHdr.BasePointerOffset = DRBasePointerOffset; - getStreamer().EmitCVDefRangeDirective(Ranges, DRHdr); + getStreamer().emitCVDefRangeDirective(Ranges, DRHdr); break; } default: @@ -3979,21 +3993,21 @@ bool AsmParser::parseDirectiveCVString() { // Put the string in the table and emit the offset. std::pair<StringRef, unsigned> Insertion = getCVContext().addToStringTable(Data); - getStreamer().EmitIntValue(Insertion.second, 4); + getStreamer().emitInt32(Insertion.second); return false; } /// parseDirectiveCVStringTable /// ::= .cv_stringtable bool AsmParser::parseDirectiveCVStringTable() { - getStreamer().EmitCVStringTableDirective(); + getStreamer().emitCVStringTableDirective(); return false; } /// parseDirectiveCVFileChecksums /// ::= .cv_filechecksums bool AsmParser::parseDirectiveCVFileChecksums() { - getStreamer().EmitCVFileChecksumsDirective(); + getStreamer().emitCVFileChecksumsDirective(); return false; } @@ -4005,7 +4019,7 @@ bool AsmParser::parseDirectiveCVFileChecksumOffset() { return true; if (parseToken(AsmToken::EndOfStatement, "Expected End of Statement")) return true; - getStreamer().EmitCVFileChecksumOffsetDirective(FileNo); + getStreamer().emitCVFileChecksumOffsetDirective(FileNo); return false; } @@ -4050,7 +4064,7 @@ bool AsmParser::parseDirectiveCFISections() { Debug = true; } - getStreamer().EmitCFISections(EH, Debug); + getStreamer().emitCFISections(EH, Debug); return false; } @@ -4070,14 +4084,14 @@ bool AsmParser::parseDirectiveCFIStartProc() { // expansion which can *ONLY* happen if Clang's cc1as is the API consumer. // Tools like llvm-mc on the other hand are not affected by it, and report // correct context information. - getStreamer().EmitCFIStartProc(!Simple.empty(), Lexer.getLoc()); + getStreamer().emitCFIStartProc(!Simple.empty(), Lexer.getLoc()); return false; } /// parseDirectiveCFIEndProc /// ::= .cfi_endproc bool AsmParser::parseDirectiveCFIEndProc() { - getStreamer().EmitCFIEndProc(); + getStreamer().emitCFIEndProc(); return false; } @@ -4105,7 +4119,7 @@ bool AsmParser::parseDirectiveCFIDefCfa(SMLoc DirectiveLoc) { parseAbsoluteExpression(Offset)) return true; - getStreamer().EmitCFIDefCfa(Register, Offset); + getStreamer().emitCFIDefCfa(Register, Offset); return false; } @@ -4116,7 +4130,7 @@ bool AsmParser::parseDirectiveCFIDefCfaOffset() { if (parseAbsoluteExpression(Offset)) return true; - getStreamer().EmitCFIDefCfaOffset(Offset); + getStreamer().emitCFIDefCfaOffset(Offset); return false; } @@ -4129,14 +4143,14 @@ bool AsmParser::parseDirectiveCFIRegister(SMLoc DirectiveLoc) { parseRegisterOrRegisterNumber(Register2, DirectiveLoc)) return true; - getStreamer().EmitCFIRegister(Register1, Register2); + getStreamer().emitCFIRegister(Register1, Register2); return false; } /// parseDirectiveCFIWindowSave /// ::= .cfi_window_save bool AsmParser::parseDirectiveCFIWindowSave() { - getStreamer().EmitCFIWindowSave(); + getStreamer().emitCFIWindowSave(); return false; } @@ -4147,7 +4161,7 @@ bool AsmParser::parseDirectiveCFIAdjustCfaOffset() { if (parseAbsoluteExpression(Adjustment)) return true; - getStreamer().EmitCFIAdjustCfaOffset(Adjustment); + getStreamer().emitCFIAdjustCfaOffset(Adjustment); return false; } @@ -4158,7 +4172,7 @@ bool AsmParser::parseDirectiveCFIDefCfaRegister(SMLoc DirectiveLoc) { if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().EmitCFIDefCfaRegister(Register); + getStreamer().emitCFIDefCfaRegister(Register); return false; } @@ -4173,7 +4187,7 @@ bool AsmParser::parseDirectiveCFIOffset(SMLoc DirectiveLoc) { parseAbsoluteExpression(Offset)) return true; - getStreamer().EmitCFIOffset(Register, Offset); + getStreamer().emitCFIOffset(Register, Offset); return false; } @@ -4187,7 +4201,7 @@ bool AsmParser::parseDirectiveCFIRelOffset(SMLoc DirectiveLoc) { parseAbsoluteExpression(Offset)) return true; - getStreamer().EmitCFIRelOffset(Register, Offset); + getStreamer().emitCFIRelOffset(Register, Offset); return false; } @@ -4233,23 +4247,23 @@ bool AsmParser::parseDirectiveCFIPersonalityOrLsda(bool IsPersonality) { MCSymbol *Sym = getContext().getOrCreateSymbol(Name); if (IsPersonality) - getStreamer().EmitCFIPersonality(Sym, Encoding); + getStreamer().emitCFIPersonality(Sym, Encoding); else - getStreamer().EmitCFILsda(Sym, Encoding); + getStreamer().emitCFILsda(Sym, Encoding); return false; } /// parseDirectiveCFIRememberState /// ::= .cfi_remember_state bool AsmParser::parseDirectiveCFIRememberState() { - getStreamer().EmitCFIRememberState(); + getStreamer().emitCFIRememberState(); return false; } /// parseDirectiveCFIRestoreState /// ::= .cfi_remember_state bool AsmParser::parseDirectiveCFIRestoreState() { - getStreamer().EmitCFIRestoreState(); + getStreamer().emitCFIRestoreState(); return false; } @@ -4261,7 +4275,7 @@ bool AsmParser::parseDirectiveCFISameValue(SMLoc DirectiveLoc) { if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().EmitCFISameValue(Register); + getStreamer().emitCFISameValue(Register); return false; } @@ -4272,7 +4286,7 @@ bool AsmParser::parseDirectiveCFIRestore(SMLoc DirectiveLoc) { if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().EmitCFIRestore(Register); + getStreamer().emitCFIRestore(Register); return false; } @@ -4295,7 +4309,7 @@ bool AsmParser::parseDirectiveCFIEscape() { Values.push_back((uint8_t)CurrValue); } - getStreamer().EmitCFIEscape(Values); + getStreamer().emitCFIEscape(Values); return false; } @@ -4305,7 +4319,7 @@ bool AsmParser::parseDirectiveCFIReturnColumn(SMLoc DirectiveLoc) { int64_t Register = 0; if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().EmitCFIReturnColumn(Register); + getStreamer().emitCFIReturnColumn(Register); return false; } @@ -4316,7 +4330,7 @@ bool AsmParser::parseDirectiveCFISignalFrame() { "unexpected token in '.cfi_signal_frame'")) return true; - getStreamer().EmitCFISignalFrame(); + getStreamer().emitCFISignalFrame(); return false; } @@ -4328,7 +4342,7 @@ bool AsmParser::parseDirectiveCFIUndefined(SMLoc DirectiveLoc) { if (parseRegisterOrRegisterNumber(Register, DirectiveLoc)) return true; - getStreamer().EmitCFIUndefined(Register); + getStreamer().emitCFIUndefined(Register); return false; } @@ -4368,9 +4382,9 @@ bool AsmParser::parseDirectiveMacro(SMLoc DirectiveLoc) { while (getLexer().isNot(AsmToken::EndOfStatement)) { if (!Parameters.empty() && Parameters.back().Vararg) - return Error(Lexer.getLoc(), - "Vararg parameter '" + Parameters.back().Name + - "' should be last one in the list of parameters."); + return Error(Lexer.getLoc(), "vararg parameter '" + + Parameters.back().Name + + "' should be the last parameter"); MCAsmMacroParameter Parameter; if (parseIdentifier(Parameter.Name)) @@ -4439,7 +4453,8 @@ bool AsmParser::parseDirectiveMacro(SMLoc DirectiveLoc) { if (getLexer().is(AsmToken::Eof)) return Error(DirectiveLoc, "no matching '.endmacro' in definition"); - // Otherwise, check whether we have reach the .endmacro. + // Otherwise, check whether we have reach the .endmacro or the start of a + // preprocessor line marker. if (getLexer().is(AsmToken::Identifier)) { if (getTok().getIdentifier() == ".endm" || getTok().getIdentifier() == ".endmacro") { @@ -4459,6 +4474,8 @@ bool AsmParser::parseDirectiveMacro(SMLoc DirectiveLoc) { // macro is expanded so just ignore them for now. ++MacroDepth; } + } else if (Lexer.is(AsmToken::HashDirective)) { + (void)parseCppHashLineFilenameComment(getLexer().getLoc()); } // Otherwise, scan til the end of the statement. @@ -4661,7 +4678,7 @@ bool AsmParser::parseDirectiveBundleAlignMode() { // Because of AlignSizePow2's verified range we can safely truncate it to // unsigned. - getStreamer().EmitBundleAlignMode(static_cast<unsigned>(AlignSizePow2)); + getStreamer().emitBundleAlignMode(static_cast<unsigned>(AlignSizePow2)); return false; } @@ -4686,7 +4703,7 @@ bool AsmParser::parseDirectiveBundleLock() { AlignToEnd = true; } - getStreamer().EmitBundleLock(AlignToEnd); + getStreamer().emitBundleLock(AlignToEnd); return false; } @@ -4698,7 +4715,7 @@ bool AsmParser::parseDirectiveBundleUnlock() { "unexpected token in '.bundle_unlock' directive")) return true; - getStreamer().EmitBundleUnlock(); + getStreamer().emitBundleUnlock(); return false; } @@ -4752,10 +4769,10 @@ bool AsmParser::parseDirectiveDCB(StringRef IDVal, unsigned Size) { if (!isUIntN(8 * Size, IntValue) && !isIntN(8 * Size, IntValue)) return Error(ExprLoc, "literal value out of range for directive"); for (uint64_t i = 0, e = NumValues; i != e; ++i) - getStreamer().EmitIntValue(IntValue, Size); + getStreamer().emitIntValue(IntValue, Size); } else { for (uint64_t i = 0, e = NumValues; i != e; ++i) - getStreamer().EmitValue(Value, Size, ExprLoc); + getStreamer().emitValue(Value, Size, ExprLoc); } if (parseToken(AsmToken::EndOfStatement, @@ -4791,7 +4808,7 @@ bool AsmParser::parseDirectiveRealDCB(StringRef IDVal, const fltSemantics &Seman return true; for (uint64_t i = 0, e = NumValues; i != e; ++i) - getStreamer().EmitIntValue(AsInt.getLimitedValue(), + getStreamer().emitIntValue(AsInt.getLimitedValue(), AsInt.getBitWidth() / 8); return false; @@ -4831,9 +4848,9 @@ bool AsmParser::parseDirectiveLEB128(bool Signed) { if (parseExpression(Value)) return true; if (Signed) - getStreamer().EmitSLEB128Value(Value); + getStreamer().emitSLEB128Value(Value); else - getStreamer().EmitULEB128Value(Value); + getStreamer().emitULEB128Value(Value); return false; }; @@ -4857,7 +4874,7 @@ bool AsmParser::parseDirectiveSymbolAttribute(MCSymbolAttr Attr) { if (Sym->isTemporary()) return Error(Loc, "non-local symbol required"); - if (!getStreamer().EmitSymbolAttribute(Sym, Attr)) + if (!getStreamer().emitSymbolAttribute(Sym, Attr)) return Error(Loc, "unable to emit symbol attribute"); return false; }; @@ -4934,11 +4951,11 @@ bool AsmParser::parseDirectiveComm(bool IsLocal) { // Create the Symbol as a common or local common with Size and Pow2Alignment if (IsLocal) { - getStreamer().EmitLocalCommonSymbol(Sym, Size, 1 << Pow2Alignment); + getStreamer().emitLocalCommonSymbol(Sym, Size, 1 << Pow2Alignment); return false; } - getStreamer().EmitCommonSymbol(Sym, Size, 1 << Pow2Alignment); + getStreamer().emitCommonSymbol(Sym, Size, 1 << Pow2Alignment); return false; } @@ -5320,6 +5337,12 @@ bool AsmParser::parseDirectiveEndIf(SMLoc DirectiveLoc) { } void AsmParser::initializeDirectiveKindMap() { + /* Lookup will be done with the directive + * converted to lower case, so all these + * keys should be lower case. + * (target specific directives are handled + * elsewhere) + */ DirectiveKindMap[".set"] = DK_SET; DirectiveKindMap[".equ"] = DK_EQU; DirectiveKindMap[".equiv"] = DK_EQUIV; @@ -5720,7 +5743,7 @@ bool AsmParser::parseDirectivePrint(SMLoc DirectiveLoc) { } bool AsmParser::parseDirectiveAddrsig() { - getStreamer().EmitAddrsig(); + getStreamer().emitAddrsig(); return false; } @@ -5730,7 +5753,7 @@ bool AsmParser::parseDirectiveAddrsigSym() { "expected identifier in '.addrsig_sym' directive")) return true; MCSymbol *Sym = getContext().getOrCreateSymbol(Name); - getStreamer().EmitAddrsigSym(Sym); + getStreamer().emitAddrsigSym(Sym); return false; } |