diff options
Diffstat (limited to 'llvm/lib/MC')
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); |
