aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/MC/MCParser
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/MC/MCParser')
-rw-r--r--llvm/lib/MC/MCParser/AsmLexer.cpp6
-rw-r--r--llvm/lib/MC/MCParser/AsmParser.cpp68
-rw-r--r--llvm/lib/MC/MCParser/COFFAsmParser.cpp9
-rw-r--r--llvm/lib/MC/MCParser/COFFMasmParser.cpp9
-rw-r--r--llvm/lib/MC/MCParser/DarwinAsmParser.cpp6
-rw-r--r--llvm/lib/MC/MCParser/ELFAsmParser.cpp27
-rw-r--r--llvm/lib/MC/MCParser/GOFFAsmParser.cpp6
-rw-r--r--llvm/lib/MC/MCParser/MasmParser.cpp18
-rw-r--r--llvm/lib/MC/MCParser/WasmAsmParser.cpp8
-rw-r--r--llvm/lib/MC/MCParser/XCOFFAsmParser.cpp10
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;
+}