aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/MC
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r--llvm/lib/MC/GOFFObjectWriter.cpp2
-rw-r--r--llvm/lib/MC/MCAsmStreamer.cpp2
-rw-r--r--llvm/lib/MC/MCAssembler.cpp2
-rw-r--r--llvm/lib/MC/MCDXContainerWriter.cpp2
-rw-r--r--llvm/lib/MC/MCDisassembler/MCExternalSymbolizer.cpp11
-rw-r--r--llvm/lib/MC/MCELFStreamer.cpp5
-rw-r--r--llvm/lib/MC/MCGOFFStreamer.cpp2
-rw-r--r--llvm/lib/MC/MCInst.cpp2
-rw-r--r--llvm/lib/MC/MCMachOStreamer.cpp2
-rw-r--r--llvm/lib/MC/MCNullStreamer.cpp55
-rw-r--r--llvm/lib/MC/MCObjectFileInfo.cpp4
-rw-r--r--llvm/lib/MC/MCObjectStreamer.cpp3
-rw-r--r--llvm/lib/MC/MCParser/AsmLexer.cpp5
-rw-r--r--llvm/lib/MC/MCParser/AsmParser.cpp58
-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.cpp8
-rw-r--r--llvm/lib/MC/MCParser/WasmAsmParser.cpp8
-rw-r--r--llvm/lib/MC/MCParser/XCOFFAsmParser.cpp10
-rw-r--r--llvm/lib/MC/MCPseudoProbe.cpp1
-rw-r--r--llvm/lib/MC/MCRegisterInfo.cpp27
-rw-r--r--llvm/lib/MC/MCSymbol.cpp20
-rw-r--r--llvm/lib/MC/MCTargetOptionsCommandFlags.cpp11
-rw-r--r--llvm/lib/MC/MCWasmStreamer.cpp2
-rw-r--r--llvm/lib/MC/MCWin64EH.cpp85
-rw-r--r--llvm/lib/MC/MCWinEH.cpp8
-rw-r--r--llvm/lib/MC/MachObjectWriter.cpp18
-rw-r--r--llvm/lib/MC/SPIRVObjectWriter.cpp7
31 files changed, 234 insertions, 183 deletions
diff --git a/llvm/lib/MC/GOFFObjectWriter.cpp b/llvm/lib/MC/GOFFObjectWriter.cpp
index 71bd397..a3eaaa7 100644
--- a/llvm/lib/MC/GOFFObjectWriter.cpp
+++ b/llvm/lib/MC/GOFFObjectWriter.cpp
@@ -520,7 +520,7 @@ GOFFObjectWriter::GOFFObjectWriter(
std::unique_ptr<MCGOFFObjectTargetWriter> MOTW, raw_pwrite_stream &OS)
: TargetObjectWriter(std::move(MOTW)), OS(OS) {}
-GOFFObjectWriter::~GOFFObjectWriter() {}
+GOFFObjectWriter::~GOFFObjectWriter() = default;
uint64_t GOFFObjectWriter::writeObject() {
uint64_t Size = GOFFWriter(OS, *Asm).writeObject();
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp
index 885fa55..e254305 100644
--- a/llvm/lib/MC/MCAsmStreamer.cpp
+++ b/llvm/lib/MC/MCAsmStreamer.cpp
@@ -2452,7 +2452,7 @@ void MCAsmStreamer::emitInstruction(const MCInst &Inst,
// Show the MCInst if enabled.
if (ShowInst) {
- Inst.dump_pretty(getCommentOS(), InstPrinter.get(), "\n ");
+ Inst.dump_pretty(getCommentOS(), InstPrinter.get(), "\n ", &getContext());
getCommentOS() << "\n";
}
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp
index cee2815..7b55371 100644
--- a/llvm/lib/MC/MCAssembler.cpp
+++ b/llvm/lib/MC/MCAssembler.cpp
@@ -659,7 +659,7 @@ void MCAssembler::layout() {
// Some targets might want to adjust fragment offsets. If so, perform another
// layout iteration.
- if (getBackend().finishLayout(*this))
+ if (getBackend().finishLayout())
for (MCSection &Sec : *this)
layoutSection(Sec);
diff --git a/llvm/lib/MC/MCDXContainerWriter.cpp b/llvm/lib/MC/MCDXContainerWriter.cpp
index 5eda039..ebed411 100644
--- a/llvm/lib/MC/MCDXContainerWriter.cpp
+++ b/llvm/lib/MC/MCDXContainerWriter.cpp
@@ -16,7 +16,7 @@
using namespace llvm;
-MCDXContainerTargetWriter::~MCDXContainerTargetWriter() {}
+MCDXContainerTargetWriter::~MCDXContainerTargetWriter() = default;
uint64_t DXContainerObjectWriter::writeObject() {
auto &Asm = *this->Asm;
diff --git a/llvm/lib/MC/MCDisassembler/MCExternalSymbolizer.cpp b/llvm/lib/MC/MCDisassembler/MCExternalSymbolizer.cpp
index 52cf1ff..f0d6718 100644
--- a/llvm/lib/MC/MCDisassembler/MCExternalSymbolizer.cpp
+++ b/llvm/lib/MC/MCDisassembler/MCExternalSymbolizer.cpp
@@ -183,14 +183,13 @@ void MCExternalSymbolizer::tryAddingPcLoadReferenceComment(raw_ostream &cStream,
}
}
-namespace llvm {
-MCSymbolizer *createMCSymbolizer(const Triple &TT, LLVMOpInfoCallback GetOpInfo,
- LLVMSymbolLookupCallback SymbolLookUp,
- void *DisInfo, MCContext *Ctx,
- std::unique_ptr<MCRelocationInfo> &&RelInfo) {
+MCSymbolizer *
+llvm::createMCSymbolizer(const Triple &TT, LLVMOpInfoCallback GetOpInfo,
+ LLVMSymbolLookupCallback SymbolLookUp, void *DisInfo,
+ MCContext *Ctx,
+ std::unique_ptr<MCRelocationInfo> &&RelInfo) {
assert(Ctx && "No MCContext given for symbolic disassembly");
return new MCExternalSymbolizer(*Ctx, std::move(RelInfo), GetOpInfo,
SymbolLookUp, DisInfo);
}
-}
diff --git a/llvm/lib/MC/MCELFStreamer.cpp b/llvm/lib/MC/MCELFStreamer.cpp
index 1bc1b92..8d6f7bf 100644
--- a/llvm/lib/MC/MCELFStreamer.cpp
+++ b/llvm/lib/MC/MCELFStreamer.cpp
@@ -271,8 +271,7 @@ void MCELFStreamer::emitCommonSymbol(MCSymbol *S, uint64_t Size,
" redeclared as different type");
}
- static_cast<MCSymbolELF *>(Symbol)->setSize(
- MCConstantExpr::create(Size, getContext()));
+ Symbol->setSize(MCConstantExpr::create(Size, getContext()));
}
void MCELFStreamer::emitELFSize(MCSymbol *Symbol, const MCExpr *Value) {
@@ -365,7 +364,7 @@ void MCELFStreamer::finishImpl() {
}
finalizeCGProfile();
- emitFrames(nullptr);
+ emitFrames();
this->MCObjectStreamer::finishImpl();
}
diff --git a/llvm/lib/MC/MCGOFFStreamer.cpp b/llvm/lib/MC/MCGOFFStreamer.cpp
index 8b228db..ad6397b 100644
--- a/llvm/lib/MC/MCGOFFStreamer.cpp
+++ b/llvm/lib/MC/MCGOFFStreamer.cpp
@@ -20,7 +20,7 @@
using namespace llvm;
-MCGOFFStreamer::~MCGOFFStreamer() {}
+MCGOFFStreamer::~MCGOFFStreamer() = default;
GOFFObjectWriter &MCGOFFStreamer::getWriter() {
return static_cast<GOFFObjectWriter &>(getAssembler().getWriter());
diff --git a/llvm/lib/MC/MCInst.cpp b/llvm/lib/MC/MCInst.cpp
index 46a6a18..61eeb5e5 100644
--- a/llvm/lib/MC/MCInst.cpp
+++ b/llvm/lib/MC/MCInst.cpp
@@ -29,7 +29,7 @@ void MCOperand::print(raw_ostream &OS, const MCContext *Ctx) const {
if (Ctx && Ctx->getRegisterInfo())
OS << Ctx->getRegisterInfo()->getName(getReg());
else
- OS << getReg();
+ OS << getReg().id();
} else if (isImm())
OS << "Imm:" << getImm();
else if (isSFPImm())
diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp
index 2b7a248..cde1d66 100644
--- a/llvm/lib/MC/MCMachOStreamer.cpp
+++ b/llvm/lib/MC/MCMachOStreamer.cpp
@@ -422,7 +422,7 @@ void MCMachOStreamer::emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol,
}
void MCMachOStreamer::finishImpl() {
- emitFrames(&getAssembler().getBackend());
+ emitFrames();
// We have to set the fragment atom associations so we can relax properly for
// Mach-O.
diff --git a/llvm/lib/MC/MCNullStreamer.cpp b/llvm/lib/MC/MCNullStreamer.cpp
index e80cf37..651d4b8 100644
--- a/llvm/lib/MC/MCNullStreamer.cpp
+++ b/llvm/lib/MC/MCNullStreamer.cpp
@@ -20,34 +20,33 @@ using namespace llvm;
namespace {
- class MCNullStreamer : public MCStreamer {
- public:
- MCNullStreamer(MCContext &Context) : MCStreamer(Context) {}
-
- /// @name MCStreamer Interface
- /// @{
-
- bool hasRawTextSupport() const override { return true; }
- void emitRawTextImpl(StringRef String) override {}
-
- bool emitSymbolAttribute(MCSymbol *Symbol,
- MCSymbolAttr Attribute) override {
- return true;
- }
-
- void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
- Align ByteAlignment) override {}
- void emitSubsectionsViaSymbols() override {};
- void beginCOFFSymbolDef(const MCSymbol *Symbol) override {}
- void emitCOFFSymbolStorageClass(int StorageClass) override {}
- void emitCOFFSymbolType(int Type) override {}
- void endCOFFSymbolDef() override {}
- void
- emitXCOFFSymbolLinkageWithVisibility(MCSymbol *Symbol, MCSymbolAttr Linkage,
- MCSymbolAttr Visibility) override {}
- };
-
-}
+class MCNullStreamer : public MCStreamer {
+public:
+ MCNullStreamer(MCContext &Context) : MCStreamer(Context) {}
+
+ /// @name MCStreamer Interface
+ /// @{
+
+ bool hasRawTextSupport() const override { return true; }
+ void emitRawTextImpl(StringRef String) override {}
+
+ bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override {
+ return true;
+ }
+
+ void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
+ Align ByteAlignment) override {}
+ void emitSubsectionsViaSymbols() override {};
+ void beginCOFFSymbolDef(const MCSymbol *Symbol) override {}
+ void emitCOFFSymbolStorageClass(int StorageClass) override {}
+ void emitCOFFSymbolType(int Type) override {}
+ void endCOFFSymbolDef() override {}
+ void emitXCOFFSymbolLinkageWithVisibility(MCSymbol *Symbol,
+ MCSymbolAttr Linkage,
+ MCSymbolAttr Visibility) override {}
+};
+
+} // namespace
MCStreamer *llvm::createNullStreamer(MCContext &Context) {
return new MCNullStreamer(Context);
diff --git a/llvm/lib/MC/MCObjectFileInfo.cpp b/llvm/lib/MC/MCObjectFileInfo.cpp
index b2f5000..5afe00e 100644
--- a/llvm/lib/MC/MCObjectFileInfo.cpp
+++ b/llvm/lib/MC/MCObjectFileInfo.cpp
@@ -61,9 +61,6 @@ static bool useCompactUnwind(const Triple &T) {
}
void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {
- // MachO
- SupportsWeakOmittedEHFrame = false;
-
EHFrameSection = Ctx->getMachOSection(
"__TEXT", "__eh_frame",
MachO::S_COALESCED | MachO::S_ATTR_NO_TOC |
@@ -1090,7 +1087,6 @@ void MCObjectFileInfo::initMCObjectFileInfo(MCContext &MCCtx, bool PIC,
Ctx = &MCCtx;
// Common.
- SupportsWeakOmittedEHFrame = true;
SupportsCompactUnwindWithoutEHFrame = false;
OmitDwarfIfHaveCompactUnwind = false;
diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp
index 701a083..94468140 100644
--- a/llvm/lib/MC/MCObjectStreamer.cpp
+++ b/llvm/lib/MC/MCObjectStreamer.cpp
@@ -178,10 +178,11 @@ void MCObjectStreamer::reset() {
MCStreamer::reset();
}
-void MCObjectStreamer::emitFrames(MCAsmBackend *MAB) {
+void MCObjectStreamer::emitFrames() {
if (!getNumFrameInfos())
return;
+ auto *MAB = &getAssembler().getBackend();
if (EmitEHFrame)
MCDwarfFrameEmitter::Emit(*this, MAB, true);
diff --git a/llvm/lib/MC/MCParser/AsmLexer.cpp b/llvm/lib/MC/MCParser/AsmLexer.cpp
index 1af4a29..8e4b7be 100644
--- a/llvm/lib/MC/MCParser/AsmLexer.cpp
+++ b/llvm/lib/MC/MCParser/AsmLexer.cpp
@@ -119,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 3c9ab8e..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"
@@ -528,6 +529,7 @@ private:
DK_LTO_SET_CONDITIONAL,
DK_CFI_MTE_TAGGED_FRAME,
DK_MEMTAG,
+ DK_BASE64,
DK_END
};
@@ -550,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", ...
@@ -736,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,
@@ -1951,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);
@@ -3074,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) {
@@ -5343,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;
@@ -6233,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();
@@ -6275,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 3462954..7b6ec4d 100644
--- a/llvm/lib/MC/MCParser/MasmParser.cpp
+++ b/llvm/lib/MC/MCParser/MasmParser.cpp
@@ -963,8 +963,6 @@ namespace llvm {
extern cl::opt<unsigned> AsmMacroMaxNestingDepth;
-extern MCAsmParserExtension *createCOFFMasmParser();
-
} // end namespace llvm
enum { DEFAULT_ADDRSPACE = 0 };
@@ -5323,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;
+}
diff --git a/llvm/lib/MC/MCPseudoProbe.cpp b/llvm/lib/MC/MCPseudoProbe.cpp
index b493337..11e4211 100644
--- a/llvm/lib/MC/MCPseudoProbe.cpp
+++ b/llvm/lib/MC/MCPseudoProbe.cpp
@@ -24,7 +24,6 @@
#include <algorithm>
#include <cassert>
#include <limits>
-#include <memory>
#include <sstream>
#include <vector>
diff --git a/llvm/lib/MC/MCRegisterInfo.cpp b/llvm/lib/MC/MCRegisterInfo.cpp
index ba9ef00..77fb733 100644
--- a/llvm/lib/MC/MCRegisterInfo.cpp
+++ b/llvm/lib/MC/MCRegisterInfo.cpp
@@ -89,7 +89,7 @@ ArrayRef<MCPhysReg> MCRegisterInfo::getCachedAliasesOf(MCRegister R) const {
return Aliases;
for (MCRegAliasIteratorImpl It(R, this); It.isValid(); ++It)
- Aliases.push_back(*It);
+ Aliases.push_back((*It).id());
sort(Aliases);
Aliases.erase(unique(Aliases), Aliases.end());
@@ -141,15 +141,15 @@ unsigned MCRegisterInfo::getSubRegIndex(MCRegister Reg,
return 0;
}
-int64_t MCRegisterInfo::getDwarfRegNum(MCRegister RegNum, bool isEH) const {
+int64_t MCRegisterInfo::getDwarfRegNum(MCRegister Reg, bool isEH) const {
const DwarfLLVMRegPair *M = isEH ? EHL2DwarfRegs : L2DwarfRegs;
unsigned Size = isEH ? EHL2DwarfRegsSize : L2DwarfRegsSize;
if (!M)
return -1;
- DwarfLLVMRegPair Key = { RegNum, 0 };
+ DwarfLLVMRegPair Key = {Reg.id(), 0};
const DwarfLLVMRegPair *I = std::lower_bound(M, M+Size, Key);
- if (I == M+Size || I->FromReg != RegNum)
+ if (I == M + Size || I->FromReg != Reg)
return -1;
// Consumers need to be able to detect -1 and -2, but at various points
// the numbers move between unsigned and signed representations, as well as
@@ -191,20 +191,21 @@ int64_t MCRegisterInfo::getDwarfRegNumFromDwarfEHRegNum(uint64_t RegNum) const {
return RegNum;
}
-int MCRegisterInfo::getSEHRegNum(MCRegister RegNum) const {
- const DenseMap<MCRegister, int>::const_iterator I = L2SEHRegs.find(RegNum);
- if (I == L2SEHRegs.end()) return (int)RegNum;
+int MCRegisterInfo::getSEHRegNum(MCRegister Reg) const {
+ const DenseMap<MCRegister, int>::const_iterator I = L2SEHRegs.find(Reg);
+ if (I == L2SEHRegs.end())
+ return (int)Reg.id();
return I->second;
}
-int MCRegisterInfo::getCodeViewRegNum(MCRegister RegNum) const {
+int MCRegisterInfo::getCodeViewRegNum(MCRegister Reg) const {
if (L2CVRegs.empty())
report_fatal_error("target does not implement codeview register mapping");
- const DenseMap<MCRegister, int>::const_iterator I = L2CVRegs.find(RegNum);
+ const DenseMap<MCRegister, int>::const_iterator I = L2CVRegs.find(Reg);
if (I == L2CVRegs.end())
- report_fatal_error("unknown codeview register " + (RegNum < getNumRegs()
- ? getName(RegNum)
- : Twine(RegNum)));
+ report_fatal_error("unknown codeview register " + (Reg.id() < getNumRegs()
+ ? getName(Reg)
+ : Twine(Reg.id())));
return I->second;
}
@@ -221,7 +222,7 @@ bool MCRegisterInfo::regsOverlap(MCRegister RegA, MCRegister RegB) const {
return false;
}
-bool MCRegisterInfo::isArtificialRegUnit(unsigned Unit) const {
+bool MCRegisterInfo::isArtificialRegUnit(MCRegUnit Unit) const {
for (MCRegUnitRootIterator Root(Unit, this); Root.isValid(); ++Root)
if (isArtificial(*Root))
return true;
diff --git a/llvm/lib/MC/MCSymbol.cpp b/llvm/lib/MC/MCSymbol.cpp
index b868738..cf44005 100644
--- a/llvm/lib/MC/MCSymbol.cpp
+++ b/llvm/lib/MC/MCSymbol.cpp
@@ -84,7 +84,21 @@ void MCSymbol::print(raw_ostream &OS, const MCAsmInfo *MAI) const {
}
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
-LLVM_DUMP_METHOD void MCSymbol::dump() const {
- dbgs() << *this;
-}
+LLVM_DUMP_METHOD void MCSymbol::dump() const { dbgs() << *this; }
#endif
+
+// Determine whether the offset between two labels can change at link time.
+// Currently, this function is used only in DWARF info emission logic, where it
+// helps generate more optimal debug info when the offset between labels is
+// constant at link time.
+bool llvm::isRangeRelaxable(const MCSymbol *Begin, const MCSymbol *End) {
+ assert(Begin && "Range without a begin symbol?");
+ assert(End && "Range without an end symbol?");
+ for (const auto *Fragment = Begin->getFragment();
+ Fragment != End->getFragment(); Fragment = Fragment->getNext()) {
+ assert(Fragment);
+ if (Fragment->isLinkerRelaxable())
+ return true;
+ }
+ return false;
+}
diff --git a/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp b/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp
index ff95ff7..22494fa 100644
--- a/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp
+++ b/llvm/lib/MC/MCTargetOptionsCommandFlags.cpp
@@ -24,6 +24,13 @@ using namespace llvm;
return *NAME##View; \
}
+#define MCSTROPT(NAME) \
+ static cl::opt<std::string> *NAME##View; \
+ StringRef llvm::mc::get##NAME() { \
+ assert(NAME##View && "RegisterMCTargetOptionsFlags not created."); \
+ return *NAME##View; \
+ }
+
#define MCOPT_EXP(TY, NAME) \
MCOPT(TY, NAME) \
std::optional<TY> llvm::mc::getExplicit##NAME() { \
@@ -52,8 +59,8 @@ MCOPT(bool, Crel)
MCOPT(bool, ImplicitMapSyms)
MCOPT(bool, X86RelaxRelocations)
MCOPT(bool, X86Sse2Avx)
-MCOPT(std::string, ABIName)
-MCOPT(std::string, AsSecureLogFile)
+MCSTROPT(ABIName)
+MCSTROPT(AsSecureLogFile)
llvm::mc::RegisterMCTargetOptionsFlags::RegisterMCTargetOptionsFlags() {
#define MCBINDOPT(NAME) \
diff --git a/llvm/lib/MC/MCWasmStreamer.cpp b/llvm/lib/MC/MCWasmStreamer.cpp
index 070b3d9..1d3cf38 100644
--- a/llvm/lib/MC/MCWasmStreamer.cpp
+++ b/llvm/lib/MC/MCWasmStreamer.cpp
@@ -147,7 +147,7 @@ void MCWasmStreamer::emitIdent(StringRef IdentString) {
}
void MCWasmStreamer::finishImpl() {
- emitFrames(nullptr);
+ emitFrames();
this->MCObjectStreamer::finishImpl();
}
diff --git a/llvm/lib/MC/MCWin64EH.cpp b/llvm/lib/MC/MCWin64EH.cpp
index 8111ccb..7a4b079 100644
--- a/llvm/lib/MC/MCWin64EH.cpp
+++ b/llvm/lib/MC/MCWin64EH.cpp
@@ -19,7 +19,11 @@
namespace llvm {
class MCSection;
+}
+
+using namespace llvm;
+namespace {
/// MCExpr that represents the epilog unwind code in an unwind table.
class MCUnwindV2EpilogTargetExpr final : public MCTargetExpr {
const MCSymbol *Function;
@@ -60,9 +64,7 @@ public:
return UnwindV2Start->getFragment();
}
};
-}
-
-using namespace llvm;
+} // namespace
// NOTE: All relocations generated here are 4-byte image-relative.
@@ -671,7 +673,7 @@ static void ARM64EmitUnwindCode(MCStreamer &streamer,
break;
case Win64EH::UOP_SaveFPLRX:
b = 0x80;
- b |= ((inst.Offset - 1) >> 3) & 0x3F;
+ b |= ((inst.Offset >> 3) - 1) & 0x3F;
streamer.emitInt8(b);
break;
case Win64EH::UOP_SaveFPLR:
@@ -885,7 +887,11 @@ static void simplifyARM64Opcodes(std::vector<WinEH::Instruction> &Instructions,
unsigned PrevOffset = -1;
unsigned PrevRegister = -1;
- auto VisitInstruction = [&](WinEH::Instruction &Inst) {
+ // Iterate over instructions in a forward order (for prologues),
+ // backwards for epilogues (i.e. always reverse compared to how the
+ // opcodes are stored).
+ for (WinEH::Instruction &Inst :
+ llvm::reverse_conditionally(Instructions, Reverse)) {
// Convert 2-byte opcodes into equivalent 1-byte ones.
if (Inst.Operation == Win64EH::UOP_SaveRegP && Inst.Register == 29) {
Inst.Operation = Win64EH::UOP_SaveFPLR;
@@ -928,17 +934,6 @@ static void simplifyARM64Opcodes(std::vector<WinEH::Instruction> &Instructions,
PrevRegister = -1;
PrevOffset = -1;
}
- };
-
- // Iterate over instructions in a forward order (for prologues),
- // backwards for epilogues (i.e. always reverse compared to how the
- // opcodes are stored).
- if (Reverse) {
- for (auto It = Instructions.rbegin(); It != Instructions.rend(); It++)
- VisitInstruction(*It);
- } else {
- for (WinEH::Instruction &Inst : Instructions)
- VisitInstruction(Inst);
}
}
@@ -1049,7 +1044,9 @@ static bool tryARM64PackedUnwind(WinEH::FrameInfo *info, uint32_t FuncLength,
// the order - that would work fine when unwinding from within
// functions, but not be exactly right if unwinding happens within
// prologs/epilogs.
- for (const WinEH::Instruction &Inst : info->Instructions) {
+ for (auto It = info->Instructions.begin(), EndIt = info->Instructions.end();
+ It != EndIt; It++) {
+ const WinEH::Instruction &Inst = *It;
switch (Inst.Operation) {
case Win64EH::UOP_End:
if (Location != Start)
@@ -1167,6 +1164,28 @@ static bool tryARM64PackedUnwind(WinEH::FrameInfo *info, uint32_t FuncLength,
Location != FloatRegs && Location != InputArgs &&
Location != StackAdjust)
return false;
+ // Becuase there's no save_lrpair_x opcode, the case of CR=01,
+ // RegI=1 is handled as a special case with a pair of instructions; an
+ // alloc followed by a regular save_lrpair. So when encountering an
+ // alloc here, check if this is the start of such an instruction pair.
+ if (Location == Start2) { // Can't have this at Start3, after PACSignLR
+ auto NextIt = It + 1;
+ if (NextIt != EndIt) {
+ const WinEH::Instruction &NextInst = *NextIt;
+ if (NextInst.Operation == Win64EH::UOP_SaveLRPair &&
+ NextInst.Offset == 0 && NextInst.Register == 19) {
+ assert(Predecrement == 0);
+ assert(RegI == 0);
+ assert(!StandaloneLR);
+ Predecrement = Inst.Offset;
+ RegI = 1;
+ StandaloneLR = true;
+ Location = FloatRegs;
+ It++; // Consume both the Alloc and the SaveLRPair
+ continue;
+ }
+ }
+ }
// Can have either a single decrement, or a pair of decrements with
// 4080 and another decrement.
if (StackOffset == 0)
@@ -1250,16 +1269,32 @@ static bool tryARM64PackedUnwind(WinEH::FrameInfo *info, uint32_t FuncLength,
if (PAC && !FPLRPair)
return false;
int H = Nops == 4;
- // There's an inconsistency regarding packed unwind info with homed
- // parameters; according to the documentation, the epilog shouldn't have
- // the same corresponding nops (and thus, to set the H bit, we should
- // require an epilog which isn't exactly symmetrical - we shouldn't accept
- // an exact mirrored epilog for those cases), but in practice,
- // RtlVirtualUnwind behaves as if it does expect the epilogue to contain
- // the same nops. See https://github.com/llvm/llvm-project/issues/54879.
- // To play it safe, don't produce packed unwind info with homed parameters.
+ // For packed unwind info with the H bit set, the prolog and epilog
+ // actually shouldn't be symmetrical; the epilog shouldn't have any
+ // nop instructions/opcodes while the prolog has them. We currently
+ // require exactly symmetrical prologs/epilogs, which is wrong for this
+ // case - therefore, don't emit packed unwind info for this case.
+ // See https://github.com/llvm/llvm-project/issues/54879 for details.
+ //
+ // Additionally - older versions of Windows also deviated from the
+ // documentation here; older versions of Windows (at least up until
+ // 10.0.22000.2176) incorrectly did assume that the epilog has matching
+ // nop instructions. This is fixed at least in version 10.0.26100.6899.
+ // As long as we can't assume that the generated code always will run on
+ // a new enough version, don't emit the packed format here, even if the
+ // implementation would be fixed to match for the asymmetrical form
+ // according to the documentation.
if (H)
return false;
+ // Older versions of Windows (at least in 10.0.22000.2176) incorrectly
+ // unwind packed unwind info with CR=01, RegI=1, RegF>0, see
+ // https://github.com/llvm/llvm-project/issues/169588#issuecomment-3584907886.
+ // This issue only exists in older versions; current versions
+ // (10.0.26100.6899) do handle it correctly. As long as we can't be sure
+ // that we won't run on older versions, avoid producing the packed form
+ // here.
+ if (StandaloneLR && RegI == 1 && RegF > 0)
+ return false;
int IntSZ = 8 * RegI;
if (StandaloneLR)
IntSZ += 8;
diff --git a/llvm/lib/MC/MCWinEH.cpp b/llvm/lib/MC/MCWinEH.cpp
index 1a6d5a3..c5f0b95 100644
--- a/llvm/lib/MC/MCWinEH.cpp
+++ b/llvm/lib/MC/MCWinEH.cpp
@@ -8,11 +8,7 @@
#include "llvm/MC/MCWinEH.h"
-namespace llvm {
-namespace WinEH {
+using namespace llvm;
+using namespace WinEH;
UnwindEmitter::~UnwindEmitter() = default;
-
-}
-}
-
diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp
index 39542bf..b42155d 100644
--- a/llvm/lib/MC/MachObjectWriter.cpp
+++ b/llvm/lib/MC/MachObjectWriter.cpp
@@ -28,12 +28,12 @@
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
+#include "llvm/Support/SMLoc.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <string>
-#include <utility>
#include <vector>
using namespace llvm;
@@ -570,8 +570,7 @@ void MachObjectWriter::bindIndirectSymbols(MCAssembler &Asm) {
//
// FIXME: Do not hardcode.
if (Asm.registerSymbol(*ISD.Symbol))
- static_cast<MCSymbolMachO *>(ISD.Symbol)
- ->setReferenceTypeUndefinedLazy(true);
+ ISD.Symbol->setReferenceTypeUndefinedLazy(true);
}
}
@@ -585,7 +584,12 @@ void MachObjectWriter::computeSymbolTable(
unsigned Index = 1;
for (MCSection &Sec : Asm)
SectionIndexMap[&Sec] = Index++;
- assert(Index <= 256 && "Too many sections!");
+
+ // Section indices begin from 1 in MachO. Only sections 1-255 can be indexed
+ // into section symbols. Referencing a section with index larger than 255 will
+ // not set n_sect for these symbols.
+ if (Index > 255)
+ getContext().reportError(SMLoc(), "Too many sections!");
// Build the string table.
for (const MCSymbol &Symbol : Asm.symbols()) {
@@ -622,7 +626,8 @@ void MachObjectWriter::computeSymbolTable(
ExternalSymbolData.push_back(MSD);
} else {
MSD.SectionIndex = SectionIndexMap.lookup(&Symbol.getSection());
- assert(MSD.SectionIndex && "Invalid section index!");
+ if (!MSD.SectionIndex)
+ getContext().reportError(SMLoc(), "Invalid section index!");
ExternalSymbolData.push_back(MSD);
}
}
@@ -646,7 +651,8 @@ void MachObjectWriter::computeSymbolTable(
LocalSymbolData.push_back(MSD);
} else {
MSD.SectionIndex = SectionIndexMap.lookup(&Symbol.getSection());
- assert(MSD.SectionIndex && "Invalid section index!");
+ if (!MSD.SectionIndex)
+ getContext().reportError(SMLoc(), "Invalid section index!");
LocalSymbolData.push_back(MSD);
}
}
diff --git a/llvm/lib/MC/SPIRVObjectWriter.cpp b/llvm/lib/MC/SPIRVObjectWriter.cpp
index 5e37137..d693ea3 100644
--- a/llvm/lib/MC/SPIRVObjectWriter.cpp
+++ b/llvm/lib/MC/SPIRVObjectWriter.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/MC/MCAssembler.h"
+#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCSPIRVObjectWriter.h"
#include "llvm/MC/MCSection.h"
#include "llvm/MC/MCValue.h"
@@ -17,8 +18,10 @@ using namespace llvm;
void SPIRVObjectWriter::writeHeader(const MCAssembler &Asm) {
constexpr uint32_t MagicNumber = 0x07230203;
constexpr uint32_t GeneratorID = 43;
- constexpr uint32_t GeneratorMagicNumber =
- (GeneratorID << 16) | (LLVM_VERSION_MAJOR);
+ const uint32_t GeneratorMagicNumber =
+ Asm.getContext().getTargetTriple().getVendor() == Triple::AMD
+ ? UINT16_MAX
+ : ((GeneratorID << 16) | (LLVM_VERSION_MAJOR));
constexpr uint32_t Schema = 0;
W.write<uint32_t>(MagicNumber);