diff options
Diffstat (limited to 'llvm/tools')
26 files changed, 339 insertions, 264 deletions
diff --git a/llvm/tools/bugpoint/bugpoint.cpp b/llvm/tools/bugpoint/bugpoint.cpp index 6e3f237d0a39..4dece12f75ef 100644 --- a/llvm/tools/bugpoint/bugpoint.cpp +++ b/llvm/tools/bugpoint/bugpoint.cpp @@ -24,7 +24,6 @@ #include "llvm/Passes/PassPlugin.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/InitLLVM.h" -#include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PluginLoader.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/Process.h" diff --git a/llvm/tools/llc/llc.cpp b/llvm/tools/llc/llc.cpp index 8d82d78b15b5..853a0bd8eb54 100644 --- a/llvm/tools/llc/llc.cpp +++ b/llvm/tools/llc/llc.cpp @@ -47,7 +47,6 @@ #include "llvm/Support/FormattedStream.h" #include "llvm/Support/Host.h" #include "llvm/Support/InitLLVM.h" -#include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PluginLoader.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/TargetSelect.h" @@ -192,7 +191,11 @@ static cl::opt<std::string> RemarksFormat( cl::value_desc("format"), cl::init("yaml")); namespace { -static ManagedStatic<std::vector<std::string>> RunPassNames; + +std::vector<std::string> &getRunPassNames() { + static std::vector<std::string> RunPassNames; + return RunPassNames; +} struct RunPassOption { void operator=(const std::string &Val) const { @@ -201,7 +204,7 @@ struct RunPassOption { SmallVector<StringRef, 8> PassNames; StringRef(Val).split(PassNames, ',', -1, false); for (auto PassName : PassNames) - RunPassNames->push_back(std::string(PassName)); + getRunPassNames().push_back(std::string(PassName)); } }; } @@ -576,7 +579,7 @@ static int compileModule(char **argv, LLVMContext &Context) { Optional<CodeModel::Model> CM_IR = M->getCodeModel(); if (!CM && CM_IR) - Target->setCodeModel(CM_IR.getValue()); + Target->setCodeModel(CM_IR.value()); } else { TheTriple = Triple(Triple::normalize(TargetTriple)); if (TheTriple.getTriple().empty()) @@ -676,7 +679,7 @@ static int compileModule(char **argv, LLVMContext &Context) { // Construct a custom pass pipeline that starts after instruction // selection. - if (!RunPassNames->empty()) { + if (!getRunPassNames().empty()) { if (!MIR) { WithColor::warning(errs(), argv[0]) << "run-pass is for .mir file only.\n"; @@ -694,7 +697,7 @@ static int compileModule(char **argv, LLVMContext &Context) { PM.add(&TPC); PM.add(MMIWP); TPC.printAndVerify(""); - for (const std::string &RunPassName : *RunPassNames) { + for (const std::string &RunPassName : getRunPassNames()) { if (addPass(PM, argv0, RunPassName, TPC)) return 1; } diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp index f2e3886bdf07..42bea1a6487f 100644 --- a/llvm/tools/lli/lli.cpp +++ b/llvm/tools/lli/lli.cpp @@ -57,7 +57,6 @@ #include "llvm/Support/DynamicLibrary.h" #include "llvm/Support/Format.h" #include "llvm/Support/InitLLVM.h" -#include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/Memory.h" #include "llvm/Support/MemoryBuffer.h" @@ -536,9 +535,9 @@ int main(int argc, char **argv, char * const *envp) { builder.setMCPU(codegen::getCPUStr()); builder.setMAttrs(codegen::getFeatureList()); if (auto RM = codegen::getExplicitRelocModel()) - builder.setRelocationModel(RM.getValue()); + builder.setRelocationModel(RM.value()); if (auto CM = codegen::getExplicitCodeModel()) - builder.setCodeModel(CM.getValue()); + builder.setCodeModel(CM.value()); builder.setErrorStr(&ErrorMsg); builder.setEngineKind(ForceInterpreter ? EngineKind::Interpreter diff --git a/llvm/tools/llvm-as/llvm-as.cpp b/llvm/tools/llvm-as/llvm-as.cpp index 11dad0d9c369..b777f7271dc6 100644 --- a/llvm/tools/llvm-as/llvm-as.cpp +++ b/llvm/tools/llvm-as/llvm-as.cpp @@ -23,7 +23,6 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/InitLLVM.h" -#include "llvm/Support/ManagedStatic.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/SystemUtils.h" #include "llvm/Support/ToolOutputFile.h" diff --git a/llvm/tools/llvm-cov/CoverageExporterJson.cpp b/llvm/tools/llvm-cov/CoverageExporterJson.cpp index d341abe8dfc8..2e161f53b10d 100644 --- a/llvm/tools/llvm-cov/CoverageExporterJson.cpp +++ b/llvm/tools/llvm-cov/CoverageExporterJson.cpp @@ -291,8 +291,8 @@ void CoverageExporterJson::renderRoot(ArrayRef<std::string> SourceFiles) { const json::Object *ObjB = B.getAsObject(); assert(ObjA != nullptr && "Value A was not an Object"); assert(ObjB != nullptr && "Value B was not an Object"); - const StringRef FilenameA = ObjA->getString("filename").getValue(); - const StringRef FilenameB = ObjB->getString("filename").getValue(); + const StringRef FilenameA = ObjA->getString("filename").value(); + const StringRef FilenameB = ObjB->getString("filename").value(); return FilenameA.compare(FilenameB) < 0; }); auto Export = json::Object( diff --git a/llvm/tools/llvm-cov/llvm-cov.cpp b/llvm/tools/llvm-cov/llvm-cov.cpp index 0e320c0965f9..45de2afb0855 100644 --- a/llvm/tools/llvm-cov/llvm-cov.cpp +++ b/llvm/tools/llvm-cov/llvm-cov.cpp @@ -14,7 +14,6 @@ #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/InitLLVM.h" -#include "llvm/Support/ManagedStatic.h" #include "llvm/Support/Path.h" #include "llvm/Support/Process.h" #include "llvm/Support/raw_ostream.h" diff --git a/llvm/tools/llvm-lto2/llvm-lto2.cpp b/llvm/tools/llvm-lto2/llvm-lto2.cpp index f79db36d2d2d..87fe90a5225f 100644 --- a/llvm/tools/llvm-lto2/llvm-lto2.cpp +++ b/llvm/tools/llvm-lto2/llvm-lto2.cpp @@ -67,6 +67,19 @@ static cl::opt<std::string> AAPipeline("aa-pipeline", static cl::opt<bool> SaveTemps("save-temps", cl::desc("Save temporary files")); +static cl::list<std::string> SelectSaveTemps( + "select-save-temps", + cl::value_desc("One, or multiple of: " + "resolution,preopt,promote,internalize,import,opt,precodegen" + ",combinedindex"), + cl::desc("Save selected temporary files. Cannot be specified together with " + "-save-temps"), + cl::CommaSeparated); + +constexpr const char *SaveTempsValues[] = { + "resolution", "preopt", "promote", "internalize", + "import", "opt", "precodegen", "combinedindex"}; + static cl::opt<bool> ThinLTODistributedIndexes("thinlto-distributed-indexes", cl::desc("Write out individual index and " @@ -258,9 +271,22 @@ static int run(int argc, char **argv) { Conf.DebugPassManager = DebugPassManager; - if (SaveTemps) - check(Conf.addSaveTemps(OutputFilename + "."), + if (SaveTemps && !SelectSaveTemps.empty()) { + llvm::errs() << "-save-temps cannot be specified with -select-save-temps\n"; + return 1; + } + if (SaveTemps || !SelectSaveTemps.empty()) { + DenseSet<StringRef> SaveTempsArgs; + for (auto &S : SelectSaveTemps) + if (is_contained(SaveTempsValues, S)) + SaveTempsArgs.insert(S); + else { + llvm::errs() << ("invalid -select-save-temps argument: " + S) << '\n'; + return 1; + } + check(Conf.addSaveTemps(OutputFilename + ".", false, SaveTempsArgs), "Config::addSaveTemps failed"); + } // Optimization remarks. Conf.RemarksFilename = RemarksFilename; diff --git a/llvm/tools/llvm-mc/llvm-mc.cpp b/llvm/tools/llvm-mc/llvm-mc.cpp index 2a525f53ec29..3e737b9fbaa0 100644 --- a/llvm/tools/llvm-mc/llvm-mc.cpp +++ b/llvm/tools/llvm-mc/llvm-mc.cpp @@ -403,7 +403,7 @@ int main(int argc, char **argv) { MAI->setRelaxELFRelocations(RelaxELFRel); if (CompressDebugSections != DebugCompressionType::None) { - if (!zlib::isAvailable()) { + if (!compression::zlib::isAvailable()) { WithColor::error(errs(), ProgName) << "build tools with zlib to enable -compress-debug-sections"; return 1; diff --git a/llvm/tools/llvm-mca/Views/InstructionInfoView.cpp b/llvm/tools/llvm-mca/Views/InstructionInfoView.cpp index 67b636737b97..d3f9738b6323 100644 --- a/llvm/tools/llvm-mca/Views/InstructionInfoView.cpp +++ b/llvm/tools/llvm-mca/Views/InstructionInfoView.cpp @@ -71,7 +71,7 @@ void InstructionInfoView::printView(raw_ostream &OS) const { TempStream << ' '; if (IIVDEntry.RThroughput) { - double RT = IIVDEntry.RThroughput.getValue(); + double RT = IIVDEntry.RThroughput.value(); TempStream << format("%.2f", RT) << ' '; if (RT < 10.0) TempStream << " "; diff --git a/llvm/tools/llvm-mca/llvm-mca.cpp b/llvm/tools/llvm-mca/llvm-mca.cpp index 409de283e5a1..6f7b74fd11ec 100644 --- a/llvm/tools/llvm-mca/llvm-mca.cpp +++ b/llvm/tools/llvm-mca/llvm-mca.cpp @@ -92,9 +92,10 @@ static cl::opt<std::string> cl::desc("Target a specific cpu type (-mcpu=help for details)"), cl::value_desc("cpu-name"), cl::cat(ToolOptions), cl::init("native")); -static cl::opt<std::string> MATTR("mattr", - cl::desc("Additional target features."), - cl::cat(ToolOptions)); +static cl::list<std::string> + MATTRS("mattr", cl::CommaSeparated, + cl::desc("Target specific attributes (-mattr=help for details)"), + cl::value_desc("a1,+a2,-a3,..."), cl::cat(ToolOptions)); static cl::opt<bool> PrintJson("json", cl::desc("Print the output in json format"), @@ -346,8 +347,17 @@ int main(int argc, char **argv) { if (MCPU == "native") MCPU = std::string(llvm::sys::getHostCPUName()); + // Package up features to be passed to target/subtarget + std::string FeaturesStr; + if (MATTRS.size()) { + SubtargetFeatures Features; + for (std::string &MAttr : MATTRS) + Features.AddFeature(MAttr); + FeaturesStr = Features.getString(); + } + std::unique_ptr<MCSubtargetInfo> STI( - TheTarget->createMCSubtargetInfo(TripleName, MCPU, MATTR)); + TheTarget->createMCSubtargetInfo(TripleName, MCPU, FeaturesStr)); assert(STI && "Unable to create subtarget info!"); if (!STI->isCPUStringValid(MCPU)) return 1; diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp index 5b2b4b5704d8..8a2b4855501b 100644 --- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp +++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp @@ -236,23 +236,21 @@ static Expected<SectionRename> parseRenameSectionValue(StringRef FlagValue) { } static Expected<std::pair<StringRef, uint64_t>> -parseSetSectionAlignment(StringRef FlagValue) { +parseSetSectionAttribute(StringRef Option, StringRef FlagValue) { if (!FlagValue.contains('=')) - return createStringError( - errc::invalid_argument, - "bad format for --set-section-alignment: missing '='"); + return make_error<StringError>("bad format for " + Option + ": missing '='", + errc::invalid_argument); auto Split = StringRef(FlagValue).split('='); if (Split.first.empty()) - return createStringError( - errc::invalid_argument, - "bad format for --set-section-alignment: missing section name"); - uint64_t NewAlign; - if (Split.second.getAsInteger(0, NewAlign)) - return createStringError( - errc::invalid_argument, - "invalid alignment for --set-section-alignment: '%s'", - Split.second.str().c_str()); - return std::make_pair(Split.first, NewAlign); + return make_error<StringError>("bad format for " + Option + + ": missing section name", + errc::invalid_argument); + uint64_t Value; + if (Split.second.getAsInteger(0, Value)) + return make_error<StringError>("invalid value for " + Option + ": '" + + Split.second + "'", + errc::invalid_argument); + return std::make_pair(Split.first, Value); } static Expected<SectionFlagsUpdate> @@ -739,7 +737,7 @@ objcopy::parseObjcopyOptions(ArrayRef<const char *> RawArgsArr, .str() .c_str()); } - if (!zlib::isAvailable()) + if (!compression::zlib::isAvailable()) return createStringError( errc::invalid_argument, "LLVM was not compiled with LLVM_ENABLE_ZLIB: can not compress"); @@ -793,7 +791,7 @@ objcopy::parseObjcopyOptions(ArrayRef<const char *> RawArgsArr, } for (auto Arg : InputArgs.filtered(OBJCOPY_set_section_alignment)) { Expected<std::pair<StringRef, uint64_t>> NameAndAlign = - parseSetSectionAlignment(Arg->getValue()); + parseSetSectionAttribute("--set-section-alignment", Arg->getValue()); if (!NameAndAlign) return NameAndAlign.takeError(); Config.SetSectionAlignment[NameAndAlign->first] = NameAndAlign->second; @@ -809,22 +807,28 @@ objcopy::parseObjcopyOptions(ArrayRef<const char *> RawArgsArr, "--set-section-flags set multiple times for section '%s'", SFU->Name.str().c_str()); } - // Prohibit combinations of --set-section-flags when the section name is used - // by --rename-section, either as a source or a destination. + for (auto Arg : InputArgs.filtered(OBJCOPY_set_section_type)) { + Expected<std::pair<StringRef, uint64_t>> NameAndType = + parseSetSectionAttribute("--set-section-type", Arg->getValue()); + if (!NameAndType) + return NameAndType.takeError(); + Config.SetSectionType[NameAndType->first] = NameAndType->second; + } + // Prohibit combinations of --set-section-{flags,type} when the section name + // is used as the destination of a --rename-section. for (const auto &E : Config.SectionsToRename) { const SectionRename &SR = E.second; - if (Config.SetSectionFlags.count(SR.OriginalName)) - return createStringError( - errc::invalid_argument, - "--set-section-flags=%s conflicts with --rename-section=%s=%s", - SR.OriginalName.str().c_str(), SR.OriginalName.str().c_str(), - SR.NewName.str().c_str()); - if (Config.SetSectionFlags.count(SR.NewName)) + auto Err = [&](const char *Option) { return createStringError( errc::invalid_argument, - "--set-section-flags=%s conflicts with --rename-section=%s=%s", + "--set-section-%s=%s conflicts with --rename-section=%s=%s", Option, SR.NewName.str().c_str(), SR.OriginalName.str().c_str(), SR.NewName.str().c_str()); + }; + if (Config.SetSectionFlags.count(SR.NewName)) + return Err("flags"); + if (Config.SetSectionType.count(SR.NewName)) + return Err("type"); } for (auto Arg : InputArgs.filtered(OBJCOPY_remove_section)) @@ -998,7 +1002,7 @@ objcopy::parseObjcopyOptions(ArrayRef<const char *> RawArgsArr, "--decompress-debug-sections"); } - if (Config.DecompressDebugSections && !zlib::isAvailable()) + if (Config.DecompressDebugSections && !compression::zlib::isAvailable()) return createStringError( errc::invalid_argument, "LLVM was not compiled with LLVM_ENABLE_ZLIB: cannot decompress"); diff --git a/llvm/tools/llvm-objcopy/ObjcopyOpts.td b/llvm/tools/llvm-objcopy/ObjcopyOpts.td index ff73265989f3..962028da47a0 100644 --- a/llvm/tools/llvm-objcopy/ObjcopyOpts.td +++ b/llvm/tools/llvm-objcopy/ObjcopyOpts.td @@ -87,6 +87,11 @@ defm set_section_flags "data, rom, share, contents, merge, strings.">, MetaVarName<"section=flag1[,flag2,...]">; +defm set_section_type + : Eq<"set-section-type", + "Set the type of section <section> to the integer <type>">, + MetaVarName<"section=type">; + def S : Flag<["-"], "S">, Alias<strip_all>, HelpText<"Alias for --strip-all">; diff --git a/llvm/tools/llvm-objdump/COFFDump.cpp b/llvm/tools/llvm-objdump/COFFDump.cpp index e085e26c3cd0..e65762e02022 100644 --- a/llvm/tools/llvm-objdump/COFFDump.cpp +++ b/llvm/tools/llvm-objdump/COFFDump.cpp @@ -800,11 +800,11 @@ void objdump::printCOFFFileHeader(const COFFObjectFile &Obj) { printExportTable(&Obj); } -void objdump::printCOFFSymbolTable(const object::COFFImportFile *i) { +void objdump::printCOFFSymbolTable(const object::COFFImportFile &i) { unsigned Index = 0; - bool IsCode = i->getCOFFImportHeader()->getType() == COFF::IMPORT_CODE; + bool IsCode = i.getCOFFImportHeader()->getType() == COFF::IMPORT_CODE; - for (const object::BasicSymbolRef &Sym : i->symbols()) { + for (const object::BasicSymbolRef &Sym : i.symbols()) { std::string Name; raw_string_ostream NS(Name); @@ -823,15 +823,15 @@ void objdump::printCOFFSymbolTable(const object::COFFImportFile *i) { } } -void objdump::printCOFFSymbolTable(const COFFObjectFile *coff) { - for (unsigned SI = 0, SE = coff->getNumberOfSymbols(); SI != SE; ++SI) { - Expected<COFFSymbolRef> Symbol = coff->getSymbol(SI); +void objdump::printCOFFSymbolTable(const COFFObjectFile &coff) { + for (unsigned SI = 0, SE = coff.getNumberOfSymbols(); SI != SE; ++SI) { + Expected<COFFSymbolRef> Symbol = coff.getSymbol(SI); if (!Symbol) - reportError(Symbol.takeError(), coff->getFileName()); + reportError(Symbol.takeError(), coff.getFileName()); - Expected<StringRef> NameOrErr = coff->getSymbolName(*Symbol); + Expected<StringRef> NameOrErr = coff.getSymbolName(*Symbol); if (!NameOrErr) - reportError(NameOrErr.takeError(), coff->getFileName()); + reportError(NameOrErr.takeError(), coff.getFileName()); StringRef Name = *NameOrErr; outs() << "[" << format("%2d", SI) << "]" @@ -861,8 +861,8 @@ void objdump::printCOFFSymbolTable(const COFFObjectFile *coff) { if (Symbol->isSectionDefinition()) { const coff_aux_section_definition *asd; if (Error E = - coff->getAuxSymbol<coff_aux_section_definition>(SI + 1, asd)) - reportError(std::move(E), coff->getFileName()); + coff.getAuxSymbol<coff_aux_section_definition>(SI + 1, asd)) + reportError(std::move(E), coff.getFileName()); int32_t AuxNumber = asd->getNumber(Symbol->isBigObj()); @@ -877,19 +877,19 @@ void objdump::printCOFFSymbolTable(const COFFObjectFile *coff) { , unsigned(asd->Selection)); } else if (Symbol->isFileRecord()) { const char *FileName; - if (Error E = coff->getAuxSymbol<char>(SI + 1, FileName)) - reportError(std::move(E), coff->getFileName()); + if (Error E = coff.getAuxSymbol<char>(SI + 1, FileName)) + reportError(std::move(E), coff.getFileName()); StringRef Name(FileName, Symbol->getNumberOfAuxSymbols() * - coff->getSymbolTableEntrySize()); + coff.getSymbolTableEntrySize()); outs() << "AUX " << Name.rtrim(StringRef("\0", 1)) << '\n'; SI = SI + Symbol->getNumberOfAuxSymbols(); break; } else if (Symbol->isWeakExternal()) { const coff_aux_weak_external *awe; - if (Error E = coff->getAuxSymbol<coff_aux_weak_external>(SI + 1, awe)) - reportError(std::move(E), coff->getFileName()); + if (Error E = coff.getAuxSymbol<coff_aux_weak_external>(SI + 1, awe)) + reportError(std::move(E), coff.getFileName()); outs() << "AUX " << format("indx %d srch %d\n", static_cast<uint32_t>(awe->TagIndex), diff --git a/llvm/tools/llvm-objdump/COFFDump.h b/llvm/tools/llvm-objdump/COFFDump.h index ffd39671debe..33a841df5874 100644 --- a/llvm/tools/llvm-objdump/COFFDump.h +++ b/llvm/tools/llvm-objdump/COFFDump.h @@ -28,8 +28,8 @@ Error getCOFFRelocationValueString(const object::COFFObjectFile *Obj, void printCOFFUnwindInfo(const object::COFFObjectFile *O); void printCOFFFileHeader(const object::COFFObjectFile &Obj); -void printCOFFSymbolTable(const object::COFFImportFile *I); -void printCOFFSymbolTable(const object::COFFObjectFile *O); +void printCOFFSymbolTable(const object::COFFImportFile &I); +void printCOFFSymbolTable(const object::COFFObjectFile &O); } // namespace objdump } // namespace llvm diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index 60c34158941b..cdbecd5ec243 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -1979,7 +1979,7 @@ static void ProcessMachO(StringRef Name, MachOObjectFile *MachOOF, if (Relocations) PrintRelocations(MachOOF, Verbose); if (SectionHeaders) - printSectionHeaders(MachOOF); + printSectionHeaders(*MachOOF); if (SectionContents) printSectionContents(MachOOF); if (!FilterSections.empty()) @@ -1993,7 +1993,7 @@ static void ProcessMachO(StringRef Name, MachOObjectFile *MachOOF, if (DylibId) PrintDylibs(MachOOF, true); if (SymbolTable) - printSymbolTable(MachOOF, ArchiveName, ArchitectureName); + printSymbolTable(*MachOOF, ArchiveName, ArchitectureName); if (UnwindInfo) printMachOUnwindInfo(MachOOF); if (PrivateHeaders) { diff --git a/llvm/tools/llvm-objdump/OffloadDump.cpp b/llvm/tools/llvm-objdump/OffloadDump.cpp index 7d4461f0a70e..46334c249070 100644 --- a/llvm/tools/llvm-objdump/OffloadDump.cpp +++ b/llvm/tools/llvm-objdump/OffloadDump.cpp @@ -12,13 +12,13 @@ //===----------------------------------------------------------------------===// #include "OffloadDump.h" #include "llvm-objdump.h" +#include "llvm/Object/ELFObjectFile.h" +#include "llvm/Support/Alignment.h" using namespace llvm; using namespace llvm::object; using namespace llvm::objdump; -constexpr const char OffloadSectionString[] = ".llvm.offloading"; - /// Get the printable name of the image kind. static StringRef getImageName(const OffloadBinary &OB) { switch (OB.getImageKind()) { @@ -66,17 +66,27 @@ static Error visitAllBinaries(const OffloadBinary &OB) { /// Print the embedded offloading contents of an ObjectFile \p O. void llvm::dumpOffloadBinary(const ObjectFile &O) { - for (SectionRef Sec : O.sections()) { - Expected<StringRef> Name = Sec.getName(); - if (!Name || !Name->startswith(OffloadSectionString)) + if (!O.isELF()) { + reportWarning("--offloading is currently only supported for ELF targets", + O.getFileName()); + return; + } + + for (ELFSectionRef Sec : O.sections()) { + if (Sec.getType() != ELF::SHT_LLVM_OFFLOADING) continue; Expected<StringRef> Contents = Sec.getContents(); if (!Contents) reportError(Contents.takeError(), O.getFileName()); - MemoryBufferRef Buffer = MemoryBufferRef(*Contents, O.getFileName()); - auto BinaryOrErr = OffloadBinary::create(Buffer); + std::unique_ptr<MemoryBuffer> Buffer = + MemoryBuffer::getMemBuffer(*Contents, O.getFileName(), false); + if (!isAddrAligned(Align(OffloadBinary::getAlignment()), + Buffer->getBufferStart())) + Buffer = MemoryBuffer::getMemBufferCopy(Buffer->getBuffer(), + Buffer->getBufferIdentifier()); + auto BinaryOrErr = OffloadBinary::create(*Buffer); if (!BinaryOrErr) reportError(O.getFileName(), "while extracting offloading files: " + toString(BinaryOrErr.takeError())); diff --git a/llvm/tools/llvm-objdump/XCOFFDump.cpp b/llvm/tools/llvm-objdump/XCOFFDump.cpp index 159741bebb67..dd1570e1736c 100644 --- a/llvm/tools/llvm-objdump/XCOFFDump.cpp +++ b/llvm/tools/llvm-objdump/XCOFFDump.cpp @@ -19,11 +19,11 @@ using namespace llvm; using namespace llvm::object; -Error objdump::getXCOFFRelocationValueString(const XCOFFObjectFile *Obj, +Error objdump::getXCOFFRelocationValueString(const XCOFFObjectFile &Obj, const RelocationRef &Rel, SmallVectorImpl<char> &Result) { symbol_iterator SymI = Rel.getSymbol(); - if (SymI == Obj->symbol_end()) + if (SymI == Obj.symbol_end()) return make_error<GenericBinaryError>( "invalid symbol reference in relocation entry", object_error::parse_failed); @@ -44,9 +44,9 @@ Error objdump::getXCOFFRelocationValueString(const XCOFFObjectFile *Obj, } Optional<XCOFF::StorageMappingClass> -objdump::getXCOFFSymbolCsectSMC(const XCOFFObjectFile *Obj, +objdump::getXCOFFSymbolCsectSMC(const XCOFFObjectFile &Obj, const SymbolRef &Sym) { - const XCOFFSymbolRef SymRef = Obj->toSymbolRef(Sym.getRawDataRefImpl()); + const XCOFFSymbolRef SymRef = Obj.toSymbolRef(Sym.getRawDataRefImpl()); if (!SymRef.isCsectSymbol()) return None; @@ -59,10 +59,9 @@ objdump::getXCOFFSymbolCsectSMC(const XCOFFObjectFile *Obj, } Optional<object::SymbolRef> -objdump::getXCOFFSymbolContainingSymbolRef(const XCOFFObjectFile *Obj, +objdump::getXCOFFSymbolContainingSymbolRef(const XCOFFObjectFile &Obj, const SymbolRef &Sym) { - - const XCOFFSymbolRef SymRef = Obj->toSymbolRef(Sym.getRawDataRefImpl()); + const XCOFFSymbolRef SymRef = Obj.toSymbolRef(Sym.getRawDataRefImpl()); if (!SymRef.isCsectSymbol()) return None; @@ -72,14 +71,12 @@ objdump::getXCOFFSymbolContainingSymbolRef(const XCOFFObjectFile *Obj, uint32_t Idx = static_cast<uint32_t>(CsectAuxEntOrErr.get().getSectionOrLength()); DataRefImpl DRI; - DRI.p = Obj->getSymbolByIndex(Idx); - return SymbolRef(DRI, Obj); + DRI.p = Obj.getSymbolByIndex(Idx); + return SymbolRef(DRI, &Obj); } -bool objdump::isLabel(const XCOFFObjectFile *Obj, const SymbolRef &Sym) { - - const XCOFFSymbolRef SymRef = Obj->toSymbolRef(Sym.getRawDataRefImpl()); - +bool objdump::isLabel(const XCOFFObjectFile &Obj, const SymbolRef &Sym) { + const XCOFFSymbolRef SymRef = Obj.toSymbolRef(Sym.getRawDataRefImpl()); if (!SymRef.isCsectSymbol()) return false; @@ -97,8 +94,8 @@ std::string objdump::getXCOFFSymbolDescription(const SymbolInfoTy &SymbolInfo, std::string Result; // Dummy symbols have no symbol index. if (SymbolInfo.XCOFFSymInfo.Index) - Result = ("(idx: " + Twine(SymbolInfo.XCOFFSymInfo.Index.getValue()) + - ") " + SymbolName) + Result = ("(idx: " + Twine(SymbolInfo.XCOFFSymInfo.Index.value()) + ") " + + SymbolName) .str(); else Result.append(SymbolName.begin(), SymbolName.end()); diff --git a/llvm/tools/llvm-objdump/XCOFFDump.h b/llvm/tools/llvm-objdump/XCOFFDump.h index 6796f00aef6f..461605940946 100644 --- a/llvm/tools/llvm-objdump/XCOFFDump.h +++ b/llvm/tools/llvm-objdump/XCOFFDump.h @@ -17,19 +17,19 @@ struct SymbolInfoTy; namespace objdump { Optional<XCOFF::StorageMappingClass> -getXCOFFSymbolCsectSMC(const object::XCOFFObjectFile *Obj, +getXCOFFSymbolCsectSMC(const object::XCOFFObjectFile &Obj, const object::SymbolRef &Sym); Optional<object::SymbolRef> -getXCOFFSymbolContainingSymbolRef(const object::XCOFFObjectFile *Obj, +getXCOFFSymbolContainingSymbolRef(const object::XCOFFObjectFile &Obj, const object::SymbolRef &Sym); -bool isLabel(const object::XCOFFObjectFile *Obj, const object::SymbolRef &Sym); +bool isLabel(const object::XCOFFObjectFile &Obj, const object::SymbolRef &Sym); std::string getXCOFFSymbolDescription(const SymbolInfoTy &SymbolInfo, StringRef SymbolName); -Error getXCOFFRelocationValueString(const object::XCOFFObjectFile *Obj, +Error getXCOFFRelocationValueString(const object::XCOFFObjectFile &Obj, const object::RelocationRef &RelRef, llvm::SmallVectorImpl<char> &Result); } // namespace objdump diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 7cd47da9efd9..1245f9e18206 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -391,7 +391,7 @@ static Error getRelocationValueString(const RelocationRef &Rel, if (auto *MachO = dyn_cast<MachOObjectFile>(Obj)) return getMachORelocationValueString(MachO, Rel, Result); if (auto *XCOFF = dyn_cast<XCOFFObjectFile>(Obj)) - return getXCOFFRelocationValueString(XCOFF, Rel, Result); + return getXCOFFRelocationValueString(*XCOFF, Rel, Result); llvm_unreachable("unknown object file format"); } @@ -435,22 +435,22 @@ unsigned getInstStartColumn(const MCSubtargetInfo &STI) { return !ShowRawInsn ? 16 : STI.getTargetTriple().isX86() ? 40 : 24; } -static bool isAArch64Elf(const ObjectFile *Obj) { - const auto *Elf = dyn_cast<ELFObjectFileBase>(Obj); +static bool isAArch64Elf(const ObjectFile &Obj) { + const auto *Elf = dyn_cast<ELFObjectFileBase>(&Obj); return Elf && Elf->getEMachine() == ELF::EM_AARCH64; } -static bool isArmElf(const ObjectFile *Obj) { - const auto *Elf = dyn_cast<ELFObjectFileBase>(Obj); +static bool isArmElf(const ObjectFile &Obj) { + const auto *Elf = dyn_cast<ELFObjectFileBase>(&Obj); return Elf && Elf->getEMachine() == ELF::EM_ARM; } -static bool isCSKYElf(const ObjectFile *Obj) { - const auto *Elf = dyn_cast<ELFObjectFileBase>(Obj); +static bool isCSKYElf(const ObjectFile &Obj) { + const auto *Elf = dyn_cast<ELFObjectFileBase>(&Obj); return Elf && Elf->getEMachine() == ELF::EM_CSKY; } -static bool hasMappingSymbols(const ObjectFile *Obj) { +static bool hasMappingSymbols(const ObjectFile &Obj) { return isArmElf(Obj) || isAArch64Elf(Obj) || isCSKYElf(Obj) ; } @@ -679,50 +679,51 @@ PrettyPrinter &selectPrettyPrinter(Triple const &Triple) { } } -static uint8_t getElfSymbolType(const ObjectFile *Obj, const SymbolRef &Sym) { - assert(Obj->isELF()); - if (auto *Elf32LEObj = dyn_cast<ELF32LEObjectFile>(Obj)) +static uint8_t getElfSymbolType(const ObjectFile &Obj, const SymbolRef &Sym) { + assert(Obj.isELF()); + if (auto *Elf32LEObj = dyn_cast<ELF32LEObjectFile>(&Obj)) return unwrapOrError(Elf32LEObj->getSymbol(Sym.getRawDataRefImpl()), - Obj->getFileName()) + Obj.getFileName()) ->getType(); - if (auto *Elf64LEObj = dyn_cast<ELF64LEObjectFile>(Obj)) + if (auto *Elf64LEObj = dyn_cast<ELF64LEObjectFile>(&Obj)) return unwrapOrError(Elf64LEObj->getSymbol(Sym.getRawDataRefImpl()), - Obj->getFileName()) + Obj.getFileName()) ->getType(); - if (auto *Elf32BEObj = dyn_cast<ELF32BEObjectFile>(Obj)) + if (auto *Elf32BEObj = dyn_cast<ELF32BEObjectFile>(&Obj)) return unwrapOrError(Elf32BEObj->getSymbol(Sym.getRawDataRefImpl()), - Obj->getFileName()) + Obj.getFileName()) ->getType(); - if (auto *Elf64BEObj = cast<ELF64BEObjectFile>(Obj)) + if (auto *Elf64BEObj = cast<ELF64BEObjectFile>(&Obj)) return unwrapOrError(Elf64BEObj->getSymbol(Sym.getRawDataRefImpl()), - Obj->getFileName()) + Obj.getFileName()) ->getType(); llvm_unreachable("Unsupported binary format"); } -template <class ELFT> static void -addDynamicElfSymbols(const ELFObjectFile<ELFT> *Obj, +template <class ELFT> +static void +addDynamicElfSymbols(const ELFObjectFile<ELFT> &Obj, std::map<SectionRef, SectionSymbolsTy> &AllSymbols) { - for (auto Symbol : Obj->getDynamicSymbolIterators()) { + for (auto Symbol : Obj.getDynamicSymbolIterators()) { uint8_t SymbolType = Symbol.getELFType(); if (SymbolType == ELF::STT_SECTION) continue; - uint64_t Address = unwrapOrError(Symbol.getAddress(), Obj->getFileName()); + uint64_t Address = unwrapOrError(Symbol.getAddress(), Obj.getFileName()); // ELFSymbolRef::getAddress() returns size instead of value for common // symbols which is not desirable for disassembly output. Overriding. if (SymbolType == ELF::STT_COMMON) - Address = unwrapOrError(Obj->getSymbol(Symbol.getRawDataRefImpl()), - Obj->getFileName()) + Address = unwrapOrError(Obj.getSymbol(Symbol.getRawDataRefImpl()), + Obj.getFileName()) ->st_value; - StringRef Name = unwrapOrError(Symbol.getName(), Obj->getFileName()); + StringRef Name = unwrapOrError(Symbol.getName(), Obj.getFileName()); if (Name.empty()) continue; section_iterator SecI = - unwrapOrError(Symbol.getSection(), Obj->getFileName()); - if (SecI == Obj->section_end()) + unwrapOrError(Symbol.getSection(), Obj.getFileName()); + if (SecI == Obj.section_end()) continue; AllSymbols[*SecI].emplace_back(Address, Name, SymbolType); @@ -730,24 +731,23 @@ addDynamicElfSymbols(const ELFObjectFile<ELFT> *Obj, } static void -addDynamicElfSymbols(const ObjectFile *Obj, +addDynamicElfSymbols(const ELFObjectFileBase &Obj, std::map<SectionRef, SectionSymbolsTy> &AllSymbols) { - assert(Obj->isELF()); - if (auto *Elf32LEObj = dyn_cast<ELF32LEObjectFile>(Obj)) - addDynamicElfSymbols(Elf32LEObj, AllSymbols); - else if (auto *Elf64LEObj = dyn_cast<ELF64LEObjectFile>(Obj)) - addDynamicElfSymbols(Elf64LEObj, AllSymbols); - else if (auto *Elf32BEObj = dyn_cast<ELF32BEObjectFile>(Obj)) - addDynamicElfSymbols(Elf32BEObj, AllSymbols); - else if (auto *Elf64BEObj = cast<ELF64BEObjectFile>(Obj)) - addDynamicElfSymbols(Elf64BEObj, AllSymbols); + if (auto *Elf32LEObj = dyn_cast<ELF32LEObjectFile>(&Obj)) + addDynamicElfSymbols(*Elf32LEObj, AllSymbols); + else if (auto *Elf64LEObj = dyn_cast<ELF64LEObjectFile>(&Obj)) + addDynamicElfSymbols(*Elf64LEObj, AllSymbols); + else if (auto *Elf32BEObj = dyn_cast<ELF32BEObjectFile>(&Obj)) + addDynamicElfSymbols(*Elf32BEObj, AllSymbols); + else if (auto *Elf64BEObj = cast<ELF64BEObjectFile>(&Obj)) + addDynamicElfSymbols(*Elf64BEObj, AllSymbols); else llvm_unreachable("Unsupported binary format"); } -static Optional<SectionRef> getWasmCodeSection(const WasmObjectFile *Obj) { - for (auto SecI : Obj->sections()) { - const WasmSection &Section = Obj->getWasmSection(SecI); +static Optional<SectionRef> getWasmCodeSection(const WasmObjectFile &Obj) { + for (auto SecI : Obj.sections()) { + const WasmSection &Section = Obj.getWasmSection(SecI); if (Section.Type == wasm::WASM_SEC_CODE) return SecI; } @@ -755,7 +755,7 @@ static Optional<SectionRef> getWasmCodeSection(const WasmObjectFile *Obj) { } static void -addMissingWasmCodeSymbols(const WasmObjectFile *Obj, +addMissingWasmCodeSymbols(const WasmObjectFile &Obj, std::map<SectionRef, SectionSymbolsTy> &AllSymbols) { Optional<SectionRef> Section = getWasmCodeSection(Obj); if (!Section) @@ -766,7 +766,7 @@ addMissingWasmCodeSymbols(const WasmObjectFile *Obj, for (const auto &Sym : Symbols) SymbolAddresses.insert(Sym.Addr); - for (const wasm::WasmFunction &Function : Obj->functions()) { + for (const wasm::WasmFunction &Function : Obj.functions()) { uint64_t Address = Function.CodeSectionOffset; // Only add fallback symbols for functions not already present in the symbol // table. @@ -782,11 +782,11 @@ addMissingWasmCodeSymbols(const WasmObjectFile *Obj, } } -static void addPltEntries(const ObjectFile *Obj, +static void addPltEntries(const ObjectFile &Obj, std::map<SectionRef, SectionSymbolsTy> &AllSymbols, StringSaver &Saver) { Optional<SectionRef> Plt = None; - for (const SectionRef &Section : Obj->sections()) { + for (const SectionRef &Section : Obj.sections()) { Expected<StringRef> SecNameOrErr = Section.getName(); if (!SecNameOrErr) { consumeError(SecNameOrErr.takeError()); @@ -797,7 +797,7 @@ static void addPltEntries(const ObjectFile *Obj, } if (!Plt) return; - if (auto *ElfObj = dyn_cast<ELFObjectFileBase>(Obj)) { + if (auto *ElfObj = dyn_cast<ELFObjectFileBase>(&Obj)) { for (auto PltEntry : ElfObj->getPltAddresses()) { if (PltEntry.first) { SymbolRef Symbol(*PltEntry.first, ElfObj); @@ -815,7 +815,7 @@ static void addPltEntries(const ObjectFile *Obj, } reportWarning("PLT entry at 0x" + Twine::utohexstr(PltEntry.second) + " references an invalid symbol", - Obj->getFileName()); + Obj.getFileName()); } } } @@ -892,12 +892,12 @@ static char getMappingSymbolKind(ArrayRef<MappingSymbolPair> MappingSymbols, } static uint64_t dumpARMELFData(uint64_t SectionAddr, uint64_t Index, - uint64_t End, const ObjectFile *Obj, + uint64_t End, const ObjectFile &Obj, ArrayRef<uint8_t> Bytes, ArrayRef<MappingSymbolPair> MappingSymbols, raw_ostream &OS) { support::endianness Endian = - Obj->isLittleEndian() ? support::little : support::big; + Obj.isLittleEndian() ? support::little : support::big; OS << format("%8" PRIx64 ":\t", SectionAddr + Index); if (Index + 4 <= End) { dumpBytes(Bytes.slice(Index, 4), OS); @@ -952,34 +952,34 @@ static void dumpELFData(uint64_t SectionAddr, uint64_t Index, uint64_t End, } } -SymbolInfoTy objdump::createSymbolInfo(const ObjectFile *Obj, +SymbolInfoTy objdump::createSymbolInfo(const ObjectFile &Obj, const SymbolRef &Symbol) { - const StringRef FileName = Obj->getFileName(); + const StringRef FileName = Obj.getFileName(); const uint64_t Addr = unwrapOrError(Symbol.getAddress(), FileName); const StringRef Name = unwrapOrError(Symbol.getName(), FileName); - if (Obj->isXCOFF() && SymbolDescription) { - const auto *XCOFFObj = cast<XCOFFObjectFile>(Obj); + if (Obj.isXCOFF() && SymbolDescription) { + const auto &XCOFFObj = cast<XCOFFObjectFile>(Obj); DataRefImpl SymbolDRI = Symbol.getRawDataRefImpl(); - const uint32_t SymbolIndex = XCOFFObj->getSymbolIndex(SymbolDRI.p); + const uint32_t SymbolIndex = XCOFFObj.getSymbolIndex(SymbolDRI.p); Optional<XCOFF::StorageMappingClass> Smc = getXCOFFSymbolCsectSMC(XCOFFObj, Symbol); return SymbolInfoTy(Addr, Name, Smc, SymbolIndex, isLabel(XCOFFObj, Symbol)); - } else if (Obj->isXCOFF()) { + } else if (Obj.isXCOFF()) { const SymbolRef::Type SymType = unwrapOrError(Symbol.getType(), FileName); return SymbolInfoTy(Addr, Name, SymType, true); } else return SymbolInfoTy(Addr, Name, - Obj->isELF() ? getElfSymbolType(Obj, Symbol) - : (uint8_t)ELF::STT_NOTYPE); + Obj.isELF() ? getElfSymbolType(Obj, Symbol) + : (uint8_t)ELF::STT_NOTYPE); } -static SymbolInfoTy createDummySymbolInfo(const ObjectFile *Obj, +static SymbolInfoTy createDummySymbolInfo(const ObjectFile &Obj, const uint64_t Addr, StringRef &Name, uint8_t Type) { - if (Obj->isXCOFF() && SymbolDescription) + if (Obj.isXCOFF() && SymbolDescription) return SymbolInfoTy(Addr, Name, None, None, false); else return SymbolInfoTy(Addr, Name, Type); @@ -1131,14 +1131,14 @@ static void emitPostInstructionInfo(formatted_raw_ostream &FOS, FOS.flush(); } -static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, +static void disassembleObject(const Target *TheTarget, const ObjectFile &Obj, MCContext &Ctx, MCDisassembler *PrimaryDisAsm, MCDisassembler *SecondaryDisAsm, const MCInstrAnalysis *MIA, MCInstPrinter *IP, const MCSubtargetInfo *PrimarySTI, const MCSubtargetInfo *SecondarySTI, - PrettyPrinter &PIP, - SourcePrinter &SP, bool InlineRelocs) { + PrettyPrinter &PIP, SourcePrinter &SP, + bool InlineRelocs) { const MCSubtargetInfo *STI = PrimarySTI; MCDisassembler *DisAsm = PrimaryDisAsm; bool PrimaryIsThumb = false; @@ -1147,25 +1147,25 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, std::map<SectionRef, std::vector<RelocationRef>> RelocMap; if (InlineRelocs) - RelocMap = getRelocsMap(*Obj); - bool Is64Bits = Obj->getBytesInAddress() > 4; + RelocMap = getRelocsMap(Obj); + bool Is64Bits = Obj.getBytesInAddress() > 4; // Create a mapping from virtual address to symbol name. This is used to // pretty print the symbols while disassembling. std::map<SectionRef, SectionSymbolsTy> AllSymbols; SectionSymbolsTy AbsoluteSymbols; - const StringRef FileName = Obj->getFileName(); - const MachOObjectFile *MachO = dyn_cast<const MachOObjectFile>(Obj); - for (const SymbolRef &Symbol : Obj->symbols()) { + const StringRef FileName = Obj.getFileName(); + const MachOObjectFile *MachO = dyn_cast<const MachOObjectFile>(&Obj); + for (const SymbolRef &Symbol : Obj.symbols()) { Expected<StringRef> NameOrErr = Symbol.getName(); if (!NameOrErr) { reportWarning(toString(NameOrErr.takeError()), FileName); continue; } - if (NameOrErr->empty() && !(Obj->isXCOFF() && SymbolDescription)) + if (NameOrErr->empty() && !(Obj.isXCOFF() && SymbolDescription)) continue; - if (Obj->isELF() && getElfSymbolType(Obj, Symbol) == ELF::STT_SECTION) + if (Obj.isELF() && getElfSymbolType(Obj, Symbol) == ELF::STT_SECTION) continue; if (MachO) { @@ -1186,16 +1186,16 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, } section_iterator SecI = unwrapOrError(Symbol.getSection(), FileName); - if (SecI != Obj->section_end()) + if (SecI != Obj.section_end()) AllSymbols[*SecI].push_back(createSymbolInfo(Obj, Symbol)); else AbsoluteSymbols.push_back(createSymbolInfo(Obj, Symbol)); } - if (AllSymbols.empty() && Obj->isELF()) - addDynamicElfSymbols(Obj, AllSymbols); + if (AllSymbols.empty() && Obj.isELF()) + addDynamicElfSymbols(cast<ELFObjectFileBase>(Obj), AllSymbols); - if (Obj->isWasm()) + if (Obj.isWasm()) addMissingWasmCodeSymbols(cast<WasmObjectFile>(Obj), AllSymbols); BumpPtrAllocator A; @@ -1207,7 +1207,7 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, // before same-addressed non-empty sections so that symbol lookups prefer the // non-empty section. std::vector<std::pair<uint64_t, SectionRef>> SectionAddresses; - for (SectionRef Sec : Obj->sections()) + for (SectionRef Sec : Obj.sections()) SectionAddresses.emplace_back(Sec.getAddress(), Sec); llvm::stable_sort(SectionAddresses, [](const auto &LHS, const auto &RHS) { if (LHS.first != RHS.first) @@ -1217,17 +1217,17 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, // Linked executables (.exe and .dll files) typically don't include a real // symbol table but they might contain an export table. - if (const auto *COFFObj = dyn_cast<COFFObjectFile>(Obj)) { + if (const auto *COFFObj = dyn_cast<COFFObjectFile>(&Obj)) { for (const auto &ExportEntry : COFFObj->export_directories()) { StringRef Name; if (Error E = ExportEntry.getSymbolName(Name)) - reportError(std::move(E), Obj->getFileName()); + reportError(std::move(E), Obj.getFileName()); if (Name.empty()) continue; uint32_t RVA; if (Error E = ExportEntry.getExportRVA(RVA)) - reportError(std::move(E), Obj->getFileName()); + reportError(std::move(E), Obj.getFileName()); uint64_t VA = COFFObj->getImageBase() + RVA; auto Sec = partition_point( @@ -1254,14 +1254,14 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, LiveVariablePrinter LVP(*Ctx.getRegisterInfo(), *STI); if (DbgVariables != DVDisabled) { - DICtx = DWARFContext::create(*Obj); + DICtx = DWARFContext::create(Obj); for (const std::unique_ptr<DWARFUnit> &CU : DICtx->compile_units()) LVP.addCompileUnit(CU->getUnitDIE(false)); } LLVM_DEBUG(LVP.dump()); - for (const SectionRef &Section : ToolSectionFilter(*Obj)) { + for (const SectionRef &Section : ToolSectionFilter(Obj)) { if (FilterSections.empty() && !DisassembleAll && (!Section.isText() || Section.isVirtual())) continue; @@ -1273,12 +1273,12 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, std::unordered_map<uint64_t, BBAddrMap> AddrToBBAddrMap; if (SymbolizeOperands) { - if (auto *Elf = dyn_cast<ELFObjectFileBase>(Obj)) { + if (auto *Elf = dyn_cast<ELFObjectFileBase>(&Obj)) { // Read the BB-address-map corresponding to this section, if present. auto SectionBBAddrMapsOrErr = Elf->readBBAddrMap(Section.getIndex()); if (!SectionBBAddrMapsOrErr) reportWarning(toString(SectionBBAddrMapsOrErr.takeError()), - Obj->getFileName()); + Obj.getFileName()); for (auto &FunctionBBAddrMap : *SectionBBAddrMapsOrErr) AddrToBBAddrMap.emplace(FunctionBBAddrMap.Addr, std::move(FunctionBBAddrMap)); @@ -1306,17 +1306,17 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, llvm::sort(MappingSymbols); ArrayRef<uint8_t> Bytes = arrayRefFromStringRef( - unwrapOrError(Section.getContents(), Obj->getFileName())); + unwrapOrError(Section.getContents(), Obj.getFileName())); std::vector<std::unique_ptr<std::string>> SynthesizedLabelNames; - if (Obj->isELF() && Obj->getArch() == Triple::amdgcn) { + if (Obj.isELF() && Obj.getArch() == Triple::amdgcn) { // AMDGPU disassembler uses symbolizer for printing labels addSymbolizer(Ctx, TheTarget, TripleName, DisAsm, SectionAddr, Bytes, Symbols, SynthesizedLabelNames); } StringRef SegmentName = getSegmentName(MachO, Section); - StringRef SectionName = unwrapOrError(Section.getName(), Obj->getFileName()); + StringRef SectionName = unwrapOrError(Section.getName(), Obj.getFileName()); // If the section has no symbol at the start, just insert a dummy one. if (Symbols.empty() || Symbols[0].Addr != 0) { Symbols.insert(Symbols.begin(), @@ -1335,7 +1335,7 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, // In executable and shared objects, r_offset holds a virtual address. // Subtract SectionAddr from the r_offset field of a relocation to get // the section offset. - uint64_t RelAdjustment = Obj->isRelocatableObject() ? 0 : SectionAddr; + uint64_t RelAdjustment = Obj.isRelocatableObject() ? 0 : SectionAddr; uint64_t Size; uint64_t Index; bool PrintedSection = false; @@ -1381,7 +1381,7 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, if (LeadingAddr) outs() << format(Is64Bits ? "%016" PRIx64 " " : "%08" PRIx64 " ", SectionAddr + Start + VMAAdjustment); - if (Obj->isXCOFF() && SymbolDescription) { + if (Obj.isXCOFF() && SymbolDescription) { outs() << getXCOFFSymbolDescription(Symbols[SI], SymbolName) << ":\n"; } else outs() << '<' << SymbolName << ">:\n"; @@ -1412,7 +1412,7 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, // separately. But WebAssembly decodes preludes for some symbols. // if (Status) { - if (Status.getValue() == MCDisassembler::Fail) { + if (Status.value() == MCDisassembler::Fail) { outs() << "// Error in decoding " << SymbolName << " : Decoding failed region as bytes.\n"; for (uint64_t I = 0; I < Size; ++I) { @@ -1433,7 +1433,7 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, // If there is a data/common symbol inside an ELF text section and we are // only disassembling text (applicable all architectures), we are in a // situation where we must print the data and not disassemble it. - if (Obj->isELF() && !DisassembleAll && Section.isText()) { + if (Obj.isELF() && !DisassembleAll && Section.isText()) { uint8_t SymTy = Symbols[SI].Type; if (SymTy == ELF::STT_OBJECT || SymTy == ELF::STT_COMMON) { dumpELFData(SectionAddr, Index, End, Bytes); @@ -1525,7 +1525,7 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, PIP.printInst( *IP, Disassembled ? &Inst : nullptr, Bytes.slice(Index, Size), {SectionAddr + Index + VMAAdjustment, Section.getIndex()}, FOS, - "", *STI, &SP, Obj->getFileName(), &Rels, LVP); + "", *STI, &SP, Obj.getFileName(), &Rels, LVP); IP->setCommentStream(llvm::nulls()); @@ -1563,7 +1563,7 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, // // N.B. We don't walk the relocations in the relocatable case yet. std::vector<const SectionSymbolsTy *> TargetSectionSymbols; - if (!Obj->isRelocatableObject()) { + if (!Obj.isRelocatableObject()) { auto It = llvm::partition_point( SectionAddresses, [=](const std::pair<uint64_t, SectionRef> &O) { @@ -1644,7 +1644,7 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, Comments.clear(); // Hexagon does this in pretty printer - if (Obj->getArch() != Triple::hexagon) { + if (Obj.getArch() != Triple::hexagon) { // Print relocation for instruction and data. while (RelCur != RelEnd) { uint64_t Offset = RelCur->getOffset() - RelAdjustment; @@ -1663,15 +1663,15 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj, break; // When --adjust-vma is used, update the address printed. - if (RelCur->getSymbol() != Obj->symbol_end()) { + if (RelCur->getSymbol() != Obj.symbol_end()) { Expected<section_iterator> SymSI = RelCur->getSymbol()->getSection(); - if (SymSI && *SymSI != Obj->section_end() && + if (SymSI && *SymSI != Obj.section_end() && shouldAdjustVA(**SymSI)) Offset += AdjustVMA; } - printRelocation(FOS, Obj->getFileName(), *RelCur, + printRelocation(FOS, Obj.getFileName(), *RelCur, SectionAddr + Offset, Is64Bits); LVP.printAfterOtherLine(FOS, true); ++RelCur; @@ -1743,7 +1743,7 @@ static void disassembleObject(const ObjectFile *Obj, bool InlineRelocs) { // appropriate. std::unique_ptr<MCDisassembler> SecondaryDisAsm; std::unique_ptr<const MCSubtargetInfo> SecondarySTI; - if (isArmElf(Obj) && !STI->checkFeatures("+mclass")) { + if (isArmElf(*Obj) && !STI->checkFeatures("+mclass")) { if (STI->checkFeatures("+thumb-mode")) Features.AddFeature("-thumb-mode"); else @@ -1775,9 +1775,9 @@ static void disassembleObject(const ObjectFile *Obj, bool InlineRelocs) { reportError(Obj->getFileName(), "Unrecognized disassembler option: " + Opt); - disassembleObject(TheTarget, Obj, Ctx, DisAsm.get(), SecondaryDisAsm.get(), - MIA.get(), IP.get(), STI.get(), SecondarySTI.get(), PIP, - SP, InlineRelocs); + disassembleObject(TheTarget, *Obj, Ctx, DisAsm.get(), SecondaryDisAsm.get(), + MIA.get(), IP.get(), STI.get(), SecondarySTI.get(), PIP, SP, + InlineRelocs); } void objdump::printRelocations(const ObjectFile *Obj) { @@ -1871,28 +1871,28 @@ void objdump::printDynamicRelocations(const ObjectFile *Obj) { // Returns true if we need to show LMA column when dumping section headers. We // show it only when the platform is ELF and either we have at least one section // whose VMA and LMA are different and/or when --show-lma flag is used. -static bool shouldDisplayLMA(const ObjectFile *Obj) { - if (!Obj->isELF()) +static bool shouldDisplayLMA(const ObjectFile &Obj) { + if (!Obj.isELF()) return false; - for (const SectionRef &S : ToolSectionFilter(*Obj)) + for (const SectionRef &S : ToolSectionFilter(Obj)) if (S.getAddress() != getELFSectionLMA(S)) return true; return ShowLMA; } -static size_t getMaxSectionNameWidth(const ObjectFile *Obj) { +static size_t getMaxSectionNameWidth(const ObjectFile &Obj) { // Default column width for names is 13 even if no names are that long. size_t MaxWidth = 13; - for (const SectionRef &Section : ToolSectionFilter(*Obj)) { - StringRef Name = unwrapOrError(Section.getName(), Obj->getFileName()); + for (const SectionRef &Section : ToolSectionFilter(Obj)) { + StringRef Name = unwrapOrError(Section.getName(), Obj.getFileName()); MaxWidth = std::max(MaxWidth, Name.size()); } return MaxWidth; } -void objdump::printSectionHeaders(const ObjectFile *Obj) { +void objdump::printSectionHeaders(const ObjectFile &Obj) { size_t NameWidth = getMaxSectionNameWidth(Obj); - size_t AddressWidth = 2 * Obj->getBytesInAddress(); + size_t AddressWidth = 2 * Obj.getBytesInAddress(); bool HasLMAColumn = shouldDisplayLMA(Obj); outs() << "\nSections:\n"; if (HasLMAColumn) @@ -1904,8 +1904,8 @@ void objdump::printSectionHeaders(const ObjectFile *Obj) { << left_justify("VMA", AddressWidth) << " Type\n"; uint64_t Idx; - for (const SectionRef &Section : ToolSectionFilter(*Obj, &Idx)) { - StringRef Name = unwrapOrError(Section.getName(), Obj->getFileName()); + for (const SectionRef &Section : ToolSectionFilter(Obj, &Idx)) { + StringRef Name = unwrapOrError(Section.getName(), Obj.getFileName()); uint64_t VMA = Section.getAddress(); if (shouldAdjustVA(Section)) VMA += AdjustVMA; @@ -1983,33 +1983,33 @@ void objdump::printSectionContents(const ObjectFile *Obj) { } } -void objdump::printSymbolTable(const ObjectFile *O, StringRef ArchiveName, +void objdump::printSymbolTable(const ObjectFile &O, StringRef ArchiveName, StringRef ArchitectureName, bool DumpDynamic) { - if (O->isCOFF() && !DumpDynamic) { + if (O.isCOFF() && !DumpDynamic) { outs() << "\nSYMBOL TABLE:\n"; printCOFFSymbolTable(cast<const COFFObjectFile>(O)); return; } - const StringRef FileName = O->getFileName(); + const StringRef FileName = O.getFileName(); if (!DumpDynamic) { outs() << "\nSYMBOL TABLE:\n"; - for (auto I = O->symbol_begin(); I != O->symbol_end(); ++I) + for (auto I = O.symbol_begin(); I != O.symbol_end(); ++I) printSymbol(O, *I, {}, FileName, ArchiveName, ArchitectureName, DumpDynamic); return; } outs() << "\nDYNAMIC SYMBOL TABLE:\n"; - if (!O->isELF()) { + if (!O.isELF()) { reportWarning( "this operation is not currently supported for this file format", FileName); return; } - const ELFObjectFileBase *ELF = cast<const ELFObjectFileBase>(O); + const ELFObjectFileBase *ELF = cast<const ELFObjectFileBase>(&O); auto Symbols = ELF->getDynamicSymbolIterators(); Expected<std::vector<VersionEntry>> SymbolVersionsOrErr = ELF->readDynsymVersions(); @@ -2023,11 +2023,11 @@ void objdump::printSymbolTable(const ObjectFile *O, StringRef ArchiveName, ArchitectureName, DumpDynamic); } -void objdump::printSymbol(const ObjectFile *O, const SymbolRef &Symbol, +void objdump::printSymbol(const ObjectFile &O, const SymbolRef &Symbol, ArrayRef<VersionEntry> SymbolVersions, StringRef FileName, StringRef ArchiveName, StringRef ArchitectureName, bool DumpDynamic) { - const MachOObjectFile *MachO = dyn_cast<const MachOObjectFile>(O); + const MachOObjectFile *MachO = dyn_cast<const MachOObjectFile>(&O); uint64_t Address = unwrapOrError(Symbol.getAddress(), FileName, ArchiveName, ArchitectureName); if ((Address < StartAddress) || (Address > StopAddress)) @@ -2050,12 +2050,12 @@ void objdump::printSymbol(const ObjectFile *O, const SymbolRef &Symbol, IsSTAB = true; } section_iterator Section = IsSTAB - ? O->section_end() + ? O.section_end() : unwrapOrError(Symbol.getSection(), FileName, ArchiveName, ArchitectureName); StringRef Name; - if (Type == SymbolRef::ST_Debug && Section != O->section_end()) { + if (Type == SymbolRef::ST_Debug && Section != O.section_end()) { if (Expected<StringRef> NameOrErr = Section->getName()) Name = *NameOrErr; else @@ -2073,10 +2073,10 @@ void objdump::printSymbol(const ObjectFile *O, const SymbolRef &Symbol, bool Hidden = Flags & SymbolRef::SF_Hidden; char GlobLoc = ' '; - if ((Section != O->section_end() || Absolute) && !Weak) + if ((Section != O.section_end() || Absolute) && !Weak) GlobLoc = Global ? 'g' : 'l'; char IFunc = ' '; - if (O->isELF()) { + if (O.isELF()) { if (ELFSymbolRef(Symbol).getELFType() == ELF::STT_GNU_IFUNC) IFunc = 'i'; if (ELFSymbolRef(Symbol).getBinding() == ELF::STB_GNU_UNIQUE) @@ -2097,7 +2097,7 @@ void objdump::printSymbol(const ObjectFile *O, const SymbolRef &Symbol, else if (Type == SymbolRef::ST_Data) FileFunc = 'O'; - const char *Fmt = O->getBytesInAddress() > 4 ? "%016" PRIx64 : "%08" PRIx64; + const char *Fmt = O.getBytesInAddress() > 4 ? "%016" PRIx64 : "%08" PRIx64; outs() << format(Fmt, Address) << " " << GlobLoc // Local -> 'l', Global -> 'g', Neither -> ' ' @@ -2112,9 +2112,9 @@ void objdump::printSymbol(const ObjectFile *O, const SymbolRef &Symbol, outs() << "*ABS*"; } else if (Common) { outs() << "*COM*"; - } else if (Section == O->section_end()) { - if (O->isXCOFF()) { - XCOFFSymbolRef XCOFFSym = dyn_cast<const XCOFFObjectFile>(O)->toSymbolRef( + } else if (Section == O.section_end()) { + if (O.isXCOFF()) { + XCOFFSymbolRef XCOFFSym = cast<const XCOFFObjectFile>(O).toSymbolRef( Symbol.getRawDataRefImpl()); if (XCOFF::N_DEBUG == XCOFFSym.getSectionNumber()) outs() << "*DEBUG*"; @@ -2128,9 +2128,9 @@ void objdump::printSymbol(const ObjectFile *O, const SymbolRef &Symbol, outs() << SegmentName << ","; StringRef SectionName = unwrapOrError(Section->getName(), FileName); outs() << SectionName; - if (O->isXCOFF()) { - Optional<SymbolRef> SymRef = getXCOFFSymbolContainingSymbolRef( - dyn_cast<const XCOFFObjectFile>(O), Symbol); + if (O.isXCOFF()) { + Optional<SymbolRef> SymRef = + getXCOFFSymbolContainingSymbolRef(cast<XCOFFObjectFile>(O), Symbol); if (SymRef) { Expected<StringRef> NameOrErr = SymRef->getName(); @@ -2144,7 +2144,7 @@ void objdump::printSymbol(const ObjectFile *O, const SymbolRef &Symbol, if (SymbolDescription) SymName = getXCOFFSymbolDescription( - createSymbolInfo(O, SymRef.getValue()), SymName); + createSymbolInfo(O, SymRef.value()), SymName); outs() << ' ' << SymName; outs() << ") "; @@ -2156,14 +2156,14 @@ void objdump::printSymbol(const ObjectFile *O, const SymbolRef &Symbol, if (Common) outs() << '\t' << format(Fmt, static_cast<uint64_t>(Symbol.getAlignment())); - else if (O->isXCOFF()) + else if (O.isXCOFF()) outs() << '\t' - << format(Fmt, dyn_cast<const XCOFFObjectFile>(O)->getSymbolSize( + << format(Fmt, cast<XCOFFObjectFile>(O).getSymbolSize( Symbol.getRawDataRefImpl())); - else if (O->isELF()) + else if (O.isELF()) outs() << '\t' << format(Fmt, ELFSymbolRef(Symbol).getSize()); - if (O->isELF()) { + if (O.isELF()) { if (!SymbolVersions.empty()) { const VersionEntry &Ver = SymbolVersions[Symbol.getRawDataRefImpl().d.b - 1]; @@ -2198,7 +2198,7 @@ void objdump::printSymbol(const ObjectFile *O, const SymbolRef &Symbol, if (Demangle) SymName = demangle(SymName); - if (O->isXCOFF() && SymbolDescription) + if (O.isXCOFF() && SymbolDescription) SymName = getXCOFFSymbolDescription(createSymbolInfo(O, Symbol), SymName); outs() << ' ' << SymName << '\n'; @@ -2251,8 +2251,8 @@ static void printRawClangAST(const ObjectFile *Obj) { if (!ClangASTSection) return; - StringRef ClangASTContents = unwrapOrError( - ClangASTSection.getValue().getContents(), Obj->getFileName()); + StringRef ClangASTContents = + unwrapOrError(ClangASTSection.value().getContents(), Obj->getFileName()); outs().write(ClangASTContents.data(), ClangASTContents.size()); } @@ -2442,11 +2442,11 @@ static void dumpObject(ObjectFile *O, const Archive *A = nullptr, if (PrivateHeaders || FirstPrivateHeader) printPrivateFileHeaders(O, FirstPrivateHeader); if (SectionHeaders) - printSectionHeaders(O); + printSectionHeaders(*O); if (SymbolTable) - printSymbolTable(O, ArchiveName); + printSymbolTable(*O, ArchiveName); if (DynamicSymbolTable) - printSymbolTable(O, ArchiveName, /*ArchitectureName=*/"", + printSymbolTable(*O, ArchiveName, /*ArchitectureName=*/"", /*DumpDynamic=*/true); if (DwarfDumpType != DIDT_Null) { std::unique_ptr<DIContext> DICtx = DWARFContext::create(*O); @@ -2501,7 +2501,7 @@ static void dumpObject(const COFFImportFile *I, const Archive *A, if (ArchiveHeaders && !MachOOpt && C) printArchiveChild(ArchiveName, *C); if (SymbolTable) - printCOFFSymbolTable(I); + printCOFFSymbolTable(*I); } /// Dump each object file in \a a; diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h index 61b6215aa5f5..dd9f58aa3308 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -124,12 +124,12 @@ SectionFilter ToolSectionFilter(llvm::object::ObjectFile const &O, bool isRelocAddressLess(object::RelocationRef A, object::RelocationRef B); void printRelocations(const object::ObjectFile *O); void printDynamicRelocations(const object::ObjectFile *O); -void printSectionHeaders(const object::ObjectFile *O); +void printSectionHeaders(const object::ObjectFile &O); void printSectionContents(const object::ObjectFile *O); -void printSymbolTable(const object::ObjectFile *O, StringRef ArchiveName, +void printSymbolTable(const object::ObjectFile &O, StringRef ArchiveName, StringRef ArchitectureName = StringRef(), bool DumpDynamic = false); -void printSymbol(const object::ObjectFile *O, const object::SymbolRef &Symbol, +void printSymbol(const object::ObjectFile &O, const object::SymbolRef &Symbol, ArrayRef<object::VersionEntry> SymbolVersions, StringRef FileName, StringRef ArchiveName, StringRef ArchitectureName, bool DumpDynamic); @@ -148,7 +148,7 @@ T unwrapOrError(Expected<T> EO, Ts &&... Args) { std::string getFileNameForError(const object::Archive::Child &C, unsigned Index); -SymbolInfoTy createSymbolInfo(const object::ObjectFile *Obj, +SymbolInfoTy createSymbolInfo(const object::ObjectFile &Obj, const object::SymbolRef &Symbol); } // namespace objdump diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp index 3b922a7bea21..3859558b32ff 100644 --- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp +++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp @@ -84,7 +84,6 @@ #include "llvm/Support/Format.h" #include "llvm/Support/InitLLVM.h" #include "llvm/Support/LineIterator.h" -#include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Path.h" #include "llvm/Support/PrettyStackTrace.h" diff --git a/llvm/tools/llvm-sim/llvm-sim.cpp b/llvm/tools/llvm-sim/llvm-sim.cpp index 6879d73c4434..2b717d72e48a 100644 --- a/llvm/tools/llvm-sim/llvm-sim.cpp +++ b/llvm/tools/llvm-sim/llvm-sim.cpp @@ -90,8 +90,8 @@ exportToFile(const StringRef FilePath, assert(End && "Could not find instruction number for last instruction"); J.object([&] { - J.attribute("start", Start.getValue()); - J.attribute("end", End.getValue()); + J.attribute("start", Start.value()); + J.attribute("end", End.value()); }); } J.arrayEnd(); diff --git a/llvm/tools/llvm-xray/xray-registry.cpp b/llvm/tools/llvm-xray/xray-registry.cpp index e5c253d2e8f1..34ac07ebe45c 100644 --- a/llvm/tools/llvm-xray/xray-registry.cpp +++ b/llvm/tools/llvm-xray/xray-registry.cpp @@ -11,7 +11,6 @@ //===----------------------------------------------------------------------===// #include "xray-registry.h" -#include "llvm/Support/ManagedStatic.h" #include <unordered_map> namespace llvm { @@ -19,19 +18,22 @@ namespace xray { using HandlerType = std::function<Error()>; -ManagedStatic<std::unordered_map<cl::SubCommand *, HandlerType>> Commands; +static std::unordered_map<cl::SubCommand *, HandlerType> &getCommands() { + static std::unordered_map<cl::SubCommand *, HandlerType> Commands; + return Commands; +} CommandRegistration::CommandRegistration(cl::SubCommand *SC, HandlerType Command) { - assert(Commands->count(SC) == 0 && + assert(getCommands().count(SC) == 0 && "Attempting to overwrite a command handler"); assert(Command && "Attempting to register an empty std::function<Error()>"); - (*Commands)[SC] = Command; + getCommands()[SC] = Command; } HandlerType dispatch(cl::SubCommand *SC) { - auto It = Commands->find(SC); - assert(It != Commands->end() && + auto It = getCommands().find(SC); + assert(It != getCommands().end() && "Attempting to dispatch on un-registered SubCommand."); return It->second; } diff --git a/llvm/tools/opt/NewPMDriver.cpp b/llvm/tools/opt/NewPMDriver.cpp index 17c5da408560..61d0e121fc5a 100644 --- a/llvm/tools/opt/NewPMDriver.cpp +++ b/llvm/tools/opt/NewPMDriver.cpp @@ -49,6 +49,19 @@ cl::opt<std::string> DebugifyExport("debugify-export", cl::desc("Export per-pass debugify statistics to this file"), cl::value_desc("filename")); + +cl::opt<bool> VerifyEachDebugInfoPreserve( + "verify-each-debuginfo-preserve", + cl::desc("Start each pass with collecting and end it with checking of " + "debug info preservation.")); + +cl::opt<std::string> + VerifyDIPreserveExport("verify-di-preserve-export", + cl::desc("Export debug info preservation failures into " + "specified (JSON) file (should be abs path as we use" + " append mode to insert new JSON objects)"), + cl::value_desc("filename"), cl::init("")); + } // namespace llvm enum class DebugLogging { None, Normal, Verbose, Quiet }; @@ -280,7 +293,7 @@ bool llvm::runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM, bool ShouldPreserveAssemblyUseListOrder, bool ShouldPreserveBitcodeUseListOrder, bool EmitSummaryIndex, bool EmitModuleHash, - bool EnableDebugify) { + bool EnableDebugify, bool VerifyDIPreserve) { bool VerifyEachPass = VK == VK_VerifyEachPass; Optional<PGOOptions> P; @@ -337,8 +350,19 @@ bool llvm::runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM, PrintPassOpts); SI.registerCallbacks(PIC, &FAM); DebugifyEachInstrumentation Debugify; - if (DebugifyEach) + DebugifyStatsMap DIStatsMap; + DebugInfoPerPass DebugInfoBeforePass; + if (DebugifyEach) { + Debugify.setDIStatsMap(DIStatsMap); + Debugify.setDebugifyMode(DebugifyMode::SyntheticDebugInfo); + Debugify.registerCallbacks(PIC); + } else if (VerifyEachDebugInfoPreserve) { + Debugify.setDebugInfoBeforePass(DebugInfoBeforePass); + Debugify.setDebugifyMode(DebugifyMode::OriginalDebugInfo); + Debugify.setOrigDIVerifyBugsReportFilePath( + VerifyDIPreserveExport); Debugify.registerCallbacks(PIC); + } PipelineTuningOptions PTO; // LoopUnrolling defaults on to true and DisableLoopUnrolling is initialized @@ -417,6 +441,9 @@ bool llvm::runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM, MPM.addPass(VerifierPass()); if (EnableDebugify) MPM.addPass(NewPMDebugifyPass()); + if (VerifyDIPreserve) + MPM.addPass(NewPMDebugifyPass(DebugifyMode::OriginalDebugInfo, "", + &DebugInfoBeforePass)); // Add passes according to the -passes options. if (!PassPipeline.empty()) { @@ -456,7 +483,11 @@ bool llvm::runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM, if (VK > VK_NoVerifier) MPM.addPass(VerifierPass()); if (EnableDebugify) - MPM.addPass(NewPMCheckDebugifyPass()); + MPM.addPass(NewPMCheckDebugifyPass(false, "", &DIStatsMap)); + if (VerifyDIPreserve) + MPM.addPass(NewPMCheckDebugifyPass( + false, "", nullptr, DebugifyMode::OriginalDebugInfo, &DebugInfoBeforePass, + VerifyDIPreserveExport)); // Add any relevant output pass at the end of the pipeline. switch (OK) { @@ -504,7 +535,7 @@ bool llvm::runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM, OptRemarkFile->keep(); if (DebugifyEach && !DebugifyExport.empty()) - exportDebugifyStats(DebugifyExport, Debugify.StatsMap); + exportDebugifyStats(DebugifyExport, Debugify.getDebugifyStatsMap()); return true; } diff --git a/llvm/tools/opt/NewPMDriver.h b/llvm/tools/opt/NewPMDriver.h index 16bb205afdca..543f91c383f2 100644 --- a/llvm/tools/opt/NewPMDriver.h +++ b/llvm/tools/opt/NewPMDriver.h @@ -33,6 +33,9 @@ class TargetLibraryInfoImpl; extern cl::opt<bool> DebugifyEach; extern cl::opt<std::string> DebugifyExport; +extern cl::opt<bool> VerifyEachDebugInfoPreserve; +extern cl::opt<std::string> VerifyDIPreserveExport; + namespace opt_tool { enum OutputKind { OK_NoOutput, @@ -74,7 +77,7 @@ bool runPassPipeline(StringRef Arg0, Module &M, TargetMachine *TM, bool ShouldPreserveAssemblyUseListOrder, bool ShouldPreserveBitcodeUseListOrder, bool EmitSummaryIndex, bool EmitModuleHash, - bool EnableDebugify); + bool EnableDebugify, bool VerifyDIPreserve); } // namespace llvm #endif diff --git a/llvm/tools/opt/opt.cpp b/llvm/tools/opt/opt.cpp index 0e013ef3b9fd..1160412e37af 100644 --- a/llvm/tools/opt/opt.cpp +++ b/llvm/tools/opt/opt.cpp @@ -206,18 +206,6 @@ static cl::opt<bool> VerifyDebugInfoPreserve( cl::desc("Start the pipeline with collecting and end it with checking of " "debug info preservation.")); -static cl::opt<bool> VerifyEachDebugInfoPreserve( - "verify-each-debuginfo-preserve", - cl::desc("Start each pass with collecting and end it with checking of " - "debug info preservation.")); - -static cl::opt<std::string> - VerifyDIPreserveExport("verify-di-preserve-export", - cl::desc("Export debug info preservation failures into " - "specified (JSON) file (should be abs path as we use" - " append mode to insert new JSON objects)"), - cl::value_desc("filename"), cl::init("")); - static cl::opt<bool> PrintBreakpoints("print-breakpoints-for-testing", cl::desc("Print select breakpoints location for testing")); @@ -823,7 +811,8 @@ int main(int argc, char **argv) { ThinLinkOut.get(), RemarksFile.get(), Pipeline, Passes, PluginList, OK, VK, PreserveAssemblyUseListOrder, PreserveBitcodeUseListOrder, EmitSummaryIndex, - EmitModuleHash, EnableDebugify) + EmitModuleHash, EnableDebugify, + VerifyDebugInfoPreserve) ? 0 : 1; } |
