aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools')
-rw-r--r--llvm/tools/bugpoint/bugpoint.cpp1
-rw-r--r--llvm/tools/llc/llc.cpp15
-rw-r--r--llvm/tools/lli/lli.cpp5
-rw-r--r--llvm/tools/llvm-as/llvm-as.cpp1
-rw-r--r--llvm/tools/llvm-cov/CoverageExporterJson.cpp4
-rw-r--r--llvm/tools/llvm-cov/llvm-cov.cpp1
-rw-r--r--llvm/tools/llvm-lto2/llvm-lto2.cpp30
-rw-r--r--llvm/tools/llvm-mc/llvm-mc.cpp2
-rw-r--r--llvm/tools/llvm-mca/Views/InstructionInfoView.cpp2
-rw-r--r--llvm/tools/llvm-mca/llvm-mca.cpp18
-rw-r--r--llvm/tools/llvm-objcopy/ObjcopyOptions.cpp58
-rw-r--r--llvm/tools/llvm-objcopy/ObjcopyOpts.td5
-rw-r--r--llvm/tools/llvm-objdump/COFFDump.cpp32
-rw-r--r--llvm/tools/llvm-objdump/COFFDump.h4
-rw-r--r--llvm/tools/llvm-objdump/MachODump.cpp4
-rw-r--r--llvm/tools/llvm-objdump/OffloadDump.cpp24
-rw-r--r--llvm/tools/llvm-objdump/XCOFFDump.cpp27
-rw-r--r--llvm/tools/llvm-objdump/XCOFFDump.h8
-rw-r--r--llvm/tools/llvm-objdump/llvm-objdump.cpp276
-rw-r--r--llvm/tools/llvm-objdump/llvm-objdump.h8
-rw-r--r--llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp1
-rw-r--r--llvm/tools/llvm-sim/llvm-sim.cpp4
-rw-r--r--llvm/tools/llvm-xray/xray-registry.cpp14
-rw-r--r--llvm/tools/opt/NewPMDriver.cpp39
-rw-r--r--llvm/tools/opt/NewPMDriver.h5
-rw-r--r--llvm/tools/opt/opt.cpp15
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;
}