diff options
Diffstat (limited to 'llvm/lib/MC/MCParser')
| -rw-r--r-- | llvm/lib/MC/MCParser/AsmLexer.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/MC/MCParser/AsmParser.cpp | 68 | ||||
| -rw-r--r-- | llvm/lib/MC/MCParser/COFFAsmParser.cpp | 9 | ||||
| -rw-r--r-- | llvm/lib/MC/MCParser/COFFMasmParser.cpp | 9 | ||||
| -rw-r--r-- | llvm/lib/MC/MCParser/DarwinAsmParser.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/MC/MCParser/ELFAsmParser.cpp | 27 | ||||
| -rw-r--r-- | llvm/lib/MC/MCParser/GOFFAsmParser.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/MC/MCParser/MasmParser.cpp | 18 | ||||
| -rw-r--r-- | llvm/lib/MC/MCParser/WasmAsmParser.cpp | 8 | ||||
| -rw-r--r-- | llvm/lib/MC/MCParser/XCOFFAsmParser.cpp | 10 |
10 files changed, 79 insertions, 88 deletions
diff --git a/llvm/lib/MC/MCParser/AsmLexer.cpp b/llvm/lib/MC/MCParser/AsmLexer.cpp index a6188f0..8e4b7be 100644 --- a/llvm/lib/MC/MCParser/AsmLexer.cpp +++ b/llvm/lib/MC/MCParser/AsmLexer.cpp @@ -16,7 +16,6 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/MC/MCAsmInfo.h" -#include "llvm/MC/MCParser/AsmLexer.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/SMLoc.h" #include "llvm/Support/SaveAndRestore.h" @@ -120,6 +119,11 @@ AsmLexer::AsmLexer(const MCAsmInfo &MAI) : MAI(MAI) { void AsmLexer::setBuffer(StringRef Buf, const char *ptr, bool EndStatementAtEOF) { + // Buffer must be NULL-terminated. NULL terminator must reside at `Buf.end()`. + // It must be safe to dereference `Buf.end()`. + assert(*Buf.end() == '\0' && + "Buffer provided to AsmLexer lacks null terminator."); + CurBuf = Buf; if (ptr) diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index dd1bc2b..429cdae 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -46,6 +46,7 @@ #include "llvm/MC/MCSymbolMachO.h" #include "llvm/MC/MCTargetOptions.h" #include "llvm/MC/MCValue.h" +#include "llvm/Support/Base64.h" #include "llvm/Support/Casting.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" @@ -228,11 +229,9 @@ public: AssemblerDialect = i; } - void Note(SMLoc L, const Twine &Msg, SMRange Range = std::nullopt) override; - bool Warning(SMLoc L, const Twine &Msg, - SMRange Range = std::nullopt) override; - bool printError(SMLoc L, const Twine &Msg, - SMRange Range = std::nullopt) override; + void Note(SMLoc L, const Twine &Msg, SMRange Range = {}) override; + bool Warning(SMLoc L, const Twine &Msg, SMRange Range = {}) override; + bool printError(SMLoc L, const Twine &Msg, SMRange Range = {}) override; const AsmToken &Lex() override; @@ -312,7 +311,7 @@ private: void printMacroInstantiations(); void printMessage(SMLoc Loc, SourceMgr::DiagKind Kind, const Twine &Msg, - SMRange Range = std::nullopt) const { + SMRange Range = {}) const { ArrayRef<SMRange> Ranges(Range); SrcMgr.PrintMessage(Loc, Kind, Msg, Ranges); } @@ -530,6 +529,7 @@ private: DK_LTO_SET_CONDITIONAL, DK_CFI_MTE_TAGGED_FRAME, DK_MEMTAG, + DK_BASE64, DK_END }; @@ -552,6 +552,7 @@ private: // ".ascii", ".asciz", ".string" bool parseDirectiveAscii(StringRef IDVal, bool ZeroTerminated); + bool parseDirectiveBase64(); // ".base64" bool parseDirectiveReloc(SMLoc DirectiveLoc); // ".reloc" bool parseDirectiveValue(StringRef IDVal, unsigned Size); // ".byte", ".long", ... @@ -738,13 +739,6 @@ namespace llvm { extern cl::opt<unsigned> AsmMacroMaxNestingDepth; -extern MCAsmParserExtension *createDarwinAsmParser(); -extern MCAsmParserExtension *createELFAsmParser(); -extern MCAsmParserExtension *createCOFFAsmParser(); -extern MCAsmParserExtension *createGOFFAsmParser(); -extern MCAsmParserExtension *createXCOFFAsmParser(); -extern MCAsmParserExtension *createWasmAsmParser(); - } // end namespace llvm AsmParser::AsmParser(SourceMgr &SM, MCContext &Ctx, MCStreamer &Out, @@ -1953,6 +1947,8 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info, case DK_ASCIZ: case DK_STRING: return parseDirectiveAscii(IDVal, true); + case DK_BASE64: + return parseDirectiveBase64(); case DK_BYTE: case DK_DC_B: return parseDirectiveValue(IDVal, 1); @@ -3076,6 +3072,37 @@ bool AsmParser::parseDirectiveAscii(StringRef IDVal, bool ZeroTerminated) { return parseMany(parseOp); } +/// parseDirectiveBase64: +// ::= .base64 "string" (, "string" )* +bool AsmParser::parseDirectiveBase64() { + auto parseOp = [&]() -> bool { + if (checkForValidSection()) + return true; + + if (getTok().isNot(AsmToken::String)) { + return true; + } + + std::vector<char> Decoded; + std::string const str = getTok().getStringContents().str(); + if (check(str.empty(), "expected nonempty string")) { + return true; + } + + llvm::Error e = decodeBase64(str, Decoded); + if (e) { + consumeError(std::move(e)); + return Error(Lexer.getLoc(), "failed to base64 decode string data"); + } + + getStreamer().emitBytes(std::string(Decoded.begin(), Decoded.end())); + Lex(); + return false; + }; + + return check(parseMany(parseOp), "expected string"); +} + /// parseDirectiveReloc /// ::= .reloc expression , identifier [ , expression ] bool AsmParser::parseDirectiveReloc(SMLoc DirectiveLoc) { @@ -5345,6 +5372,7 @@ void AsmParser::initializeDirectiveKindMap() { DirectiveKindMap[".asciz"] = DK_ASCIZ; DirectiveKindMap[".string"] = DK_STRING; DirectiveKindMap[".byte"] = DK_BYTE; + DirectiveKindMap[".base64"] = DK_BASE64; DirectiveKindMap[".short"] = DK_SHORT; DirectiveKindMap[".value"] = DK_VALUE; DirectiveKindMap[".2byte"] = DK_2BYTE; @@ -6235,12 +6263,11 @@ bool HLASMAsmParser::parseStatement(ParseStatementInfo &Info, return parseAsMachineInstruction(Info, SI); } -namespace llvm { -namespace MCParserUtils { - -bool parseAssignmentExpression(StringRef Name, bool allow_redef, - MCAsmParser &Parser, MCSymbol *&Sym, - const MCExpr *&Value) { +bool llvm::MCParserUtils::parseAssignmentExpression(StringRef Name, + bool allow_redef, + MCAsmParser &Parser, + MCSymbol *&Sym, + const MCExpr *&Value) { // FIXME: Use better location, we should use proper tokens. SMLoc EqualLoc = Parser.getTok().getLoc(); @@ -6277,9 +6304,6 @@ bool parseAssignmentExpression(StringRef Name, bool allow_redef, return false; } -} // end namespace MCParserUtils -} // end namespace llvm - /// Create an MCAsmParser instance. MCAsmParser *llvm::createMCAsmParser(SourceMgr &SM, MCContext &C, MCStreamer &Out, const MCAsmInfo &MAI, diff --git a/llvm/lib/MC/MCParser/COFFAsmParser.cpp b/llvm/lib/MC/MCParser/COFFAsmParser.cpp index 5dd7994..d9ec04c 100644 --- a/llvm/lib/MC/MCParser/COFFAsmParser.cpp +++ b/llvm/lib/MC/MCParser/COFFAsmParser.cpp @@ -21,7 +21,6 @@ #include <cassert> #include <cstdint> #include <limits> -#include <utility> using namespace llvm; @@ -797,10 +796,4 @@ bool COFFAsmParser::parseAtUnwindOrAtExcept(bool &unwind, bool &except) { return false; } -namespace llvm { - -MCAsmParserExtension *createCOFFAsmParser() { - return new COFFAsmParser; -} - -} // end namespace llvm +MCAsmParserExtension *llvm::createCOFFAsmParser() { return new COFFAsmParser; } diff --git a/llvm/lib/MC/MCParser/COFFMasmParser.cpp b/llvm/lib/MC/MCParser/COFFMasmParser.cpp index 04e12e5..db796a3 100644 --- a/llvm/lib/MC/MCParser/COFFMasmParser.cpp +++ b/llvm/lib/MC/MCParser/COFFMasmParser.cpp @@ -20,7 +20,6 @@ #include "llvm/MC/SectionKind.h" #include "llvm/Support/SMLoc.h" #include <cstdint> -#include <utility> using namespace llvm; @@ -536,8 +535,6 @@ bool COFFMasmParser::parseSEHDirectiveEndProlog(StringRef Directive, return false; } -namespace llvm { - -MCAsmParserExtension *createCOFFMasmParser() { return new COFFMasmParser; } - -} // end namespace llvm +MCAsmParserExtension *llvm::createCOFFMasmParser() { + return new COFFMasmParser; +} diff --git a/llvm/lib/MC/MCParser/DarwinAsmParser.cpp b/llvm/lib/MC/MCParser/DarwinAsmParser.cpp index fceb718..c4c4c5e 100644 --- a/llvm/lib/MC/MCParser/DarwinAsmParser.cpp +++ b/llvm/lib/MC/MCParser/DarwinAsmParser.cpp @@ -1192,10 +1192,6 @@ bool DarwinAsmParser::parseDirectiveCGProfile(StringRef S, SMLoc Loc) { return MCAsmParserExtension::parseDirectiveCGProfile(S, Loc); } -namespace llvm { - -MCAsmParserExtension *createDarwinAsmParser() { +MCAsmParserExtension *llvm::createDarwinAsmParser() { return new DarwinAsmParser; } - -} // end llvm namespace diff --git a/llvm/lib/MC/MCParser/ELFAsmParser.cpp b/llvm/lib/MC/MCParser/ELFAsmParser.cpp index 1a3752f..6c51d6b 100644 --- a/llvm/lib/MC/MCParser/ELFAsmParser.cpp +++ b/llvm/lib/MC/MCParser/ELFAsmParser.cpp @@ -25,7 +25,6 @@ #include "llvm/Support/SMLoc.h" #include <cassert> #include <cstdint> -#include <utility> using namespace llvm; @@ -695,15 +694,15 @@ bool ELFAsmParser::parseDirectivePrevious(StringRef DirName, SMLoc) { static MCSymbolAttr MCAttrForString(StringRef Type) { return StringSwitch<MCSymbolAttr>(Type) - .Cases("STT_FUNC", "function", MCSA_ELF_TypeFunction) - .Cases("STT_OBJECT", "object", MCSA_ELF_TypeObject) - .Cases("STT_TLS", "tls_object", MCSA_ELF_TypeTLS) - .Cases("STT_COMMON", "common", MCSA_ELF_TypeCommon) - .Cases("STT_NOTYPE", "notype", MCSA_ELF_TypeNoType) - .Cases("STT_GNU_IFUNC", "gnu_indirect_function", - MCSA_ELF_TypeIndFunction) - .Case("gnu_unique_object", MCSA_ELF_TypeGnuUniqueObject) - .Default(MCSA_Invalid); + .Cases({"STT_FUNC", "function"}, MCSA_ELF_TypeFunction) + .Cases({"STT_OBJECT", "object"}, MCSA_ELF_TypeObject) + .Cases({"STT_TLS", "tls_object"}, MCSA_ELF_TypeTLS) + .Cases({"STT_COMMON", "common"}, MCSA_ELF_TypeCommon) + .Cases({"STT_NOTYPE", "notype"}, MCSA_ELF_TypeNoType) + .Cases({"STT_GNU_IFUNC", "gnu_indirect_function"}, + MCSA_ELF_TypeIndFunction) + .Case("gnu_unique_object", MCSA_ELF_TypeGnuUniqueObject) + .Default(MCSA_Invalid); } /// parseDirectiveELFType @@ -888,10 +887,4 @@ bool ELFAsmParser::parseDirectiveCGProfile(StringRef S, SMLoc Loc) { return MCAsmParserExtension::parseDirectiveCGProfile(S, Loc); } -namespace llvm { - -MCAsmParserExtension *createELFAsmParser() { - return new ELFAsmParser; -} - -} // end namespace llvm +MCAsmParserExtension *llvm::createELFAsmParser() { return new ELFAsmParser; } diff --git a/llvm/lib/MC/MCParser/GOFFAsmParser.cpp b/llvm/lib/MC/MCParser/GOFFAsmParser.cpp index c3fc0460..1118d73 100644 --- a/llvm/lib/MC/MCParser/GOFFAsmParser.cpp +++ b/llvm/lib/MC/MCParser/GOFFAsmParser.cpp @@ -32,8 +32,4 @@ public: } // namespace -namespace llvm { - -MCAsmParserExtension *createGOFFAsmParser() { return new GOFFAsmParser; } - -} // namespace llvm +MCAsmParserExtension *llvm::createGOFFAsmParser() { return new GOFFAsmParser; } diff --git a/llvm/lib/MC/MCParser/MasmParser.cpp b/llvm/lib/MC/MCParser/MasmParser.cpp index 8a8f111..7b6ec4d 100644 --- a/llvm/lib/MC/MCParser/MasmParser.cpp +++ b/llvm/lib/MC/MCParser/MasmParser.cpp @@ -483,11 +483,9 @@ public: AssemblerDialect = i; } - void Note(SMLoc L, const Twine &Msg, SMRange Range = std::nullopt) override; - bool Warning(SMLoc L, const Twine &Msg, - SMRange Range = std::nullopt) override; - bool printError(SMLoc L, const Twine &Msg, - SMRange Range = std::nullopt) override; + void Note(SMLoc L, const Twine &Msg, SMRange Range = {}) override; + bool Warning(SMLoc L, const Twine &Msg, SMRange Range = {}) override; + bool printError(SMLoc L, const Twine &Msg, SMRange Range = {}) override; enum ExpandKind { ExpandMacros, DoNotExpandMacros }; const AsmToken &Lex(ExpandKind ExpandNextToken); @@ -592,7 +590,7 @@ private: bool expandStatement(SMLoc Loc); void printMessage(SMLoc Loc, SourceMgr::DiagKind Kind, const Twine &Msg, - SMRange Range = std::nullopt) const { + SMRange Range = {}) const { ArrayRef<SMRange> Ranges(Range); SrcMgr.PrintMessage(Loc, Kind, Msg, Ranges); } @@ -965,8 +963,6 @@ namespace llvm { extern cl::opt<unsigned> AsmMacroMaxNestingDepth; -extern MCAsmParserExtension *createCOFFMasmParser(); - } // end namespace llvm enum { DEFAULT_ADDRSPACE = 0 }; @@ -5325,10 +5321,10 @@ void MasmParser::initializeDirectiveKindMap() { bool MasmParser::isMacroLikeDirective() { if (getLexer().is(AsmToken::Identifier)) { bool IsMacroLike = StringSwitch<bool>(getTok().getIdentifier()) - .CasesLower("repeat", "rept", true) + .CasesLower({"repeat", "rept"}, true) .CaseLower("while", true) - .CasesLower("for", "irp", true) - .CasesLower("forc", "irpc", true) + .CasesLower({"for", "irp"}, true) + .CasesLower({"forc", "irpc"}, true) .Default(false); if (IsMacroLike) return true; diff --git a/llvm/lib/MC/MCParser/WasmAsmParser.cpp b/llvm/lib/MC/MCParser/WasmAsmParser.cpp index 75e8948..d210622 100644 --- a/llvm/lib/MC/MCParser/WasmAsmParser.cpp +++ b/llvm/lib/MC/MCParser/WasmAsmParser.cpp @@ -309,10 +309,4 @@ public: } // end anonymous namespace -namespace llvm { - -MCAsmParserExtension *createWasmAsmParser() { - return new WasmAsmParser; -} - -} // end namespace llvm +MCAsmParserExtension *llvm::createWasmAsmParser() { return new WasmAsmParser; } diff --git a/llvm/lib/MC/MCParser/XCOFFAsmParser.cpp b/llvm/lib/MC/MCParser/XCOFFAsmParser.cpp index 90d6a1d..9b933d7 100644 --- a/llvm/lib/MC/MCParser/XCOFFAsmParser.cpp +++ b/llvm/lib/MC/MCParser/XCOFFAsmParser.cpp @@ -43,14 +43,12 @@ public: } // end anonymous namespace -namespace llvm { - -MCAsmParserExtension *createXCOFFAsmParser() { return new XCOFFAsmParser; } - -} // end namespace llvm - // .csect QualName [, Number ] bool XCOFFAsmParser::ParseDirectiveCSect(StringRef, SMLoc) { report_fatal_error("XCOFFAsmParser directive not yet supported!"); return false; } + +MCAsmParserExtension *llvm::createXCOFFAsmParser() { + return new XCOFFAsmParser; +} |
