aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-objdump/MachODump.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-objdump/MachODump.cpp')
-rw-r--r--llvm/tools/llvm-objdump/MachODump.cpp56
1 files changed, 46 insertions, 10 deletions
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp
index 4637b09..3164159 100644
--- a/llvm/tools/llvm-objdump/MachODump.cpp
+++ b/llvm/tools/llvm-objdump/MachODump.cpp
@@ -78,7 +78,8 @@ bool objdump::UniversalHeaders;
static bool ArchiveMemberOffsets;
bool objdump::IndirectSymbols;
bool objdump::DataInCode;
-bool objdump::FunctionStarts;
+FunctionStartsMode objdump::FunctionStartsType =
+ objdump::FunctionStartsMode::None;
bool objdump::LinkOptHints;
bool objdump::InfoPlist;
bool objdump::ChainedFixups;
@@ -112,7 +113,15 @@ void objdump::parseMachOOptions(const llvm::opt::InputArgList &InputArgs) {
ArchiveMemberOffsets = InputArgs.hasArg(OBJDUMP_archive_member_offsets);
IndirectSymbols = InputArgs.hasArg(OBJDUMP_indirect_symbols);
DataInCode = InputArgs.hasArg(OBJDUMP_data_in_code);
- FunctionStarts = InputArgs.hasArg(OBJDUMP_function_starts);
+ if (const opt::Arg *A = InputArgs.getLastArg(OBJDUMP_function_starts_EQ)) {
+ FunctionStartsType = StringSwitch<FunctionStartsMode>(A->getValue())
+ .Case("addrs", FunctionStartsMode::Addrs)
+ .Case("names", FunctionStartsMode::Names)
+ .Case("both", FunctionStartsMode::Both)
+ .Default(FunctionStartsMode::None);
+ if (FunctionStartsType == FunctionStartsMode::None)
+ invalidArgValue(A);
+ }
LinkOptHints = InputArgs.hasArg(OBJDUMP_link_opt_hints);
InfoPlist = InputArgs.hasArg(OBJDUMP_info_plist);
ChainedFixups = InputArgs.hasArg(OBJDUMP_chained_fixups);
@@ -1080,12 +1089,39 @@ static void PrintFunctionStarts(MachOObjectFile *O) {
}
}
+ DenseMap<uint64_t, StringRef> SymbolNames;
+ if (FunctionStartsType == FunctionStartsMode::Names ||
+ FunctionStartsType == FunctionStartsMode::Both) {
+ for (SymbolRef Sym : O->symbols()) {
+ if (Expected<uint64_t> Addr = Sym.getAddress()) {
+ if (Expected<StringRef> Name = Sym.getName()) {
+ SymbolNames[*Addr] = *Name;
+ }
+ }
+ }
+ }
+
for (uint64_t S : FunctionStarts) {
uint64_t Addr = BaseSegmentAddress + S;
- if (O->is64Bit())
- outs() << format("%016" PRIx64, Addr) << "\n";
- else
- outs() << format("%08" PRIx32, static_cast<uint32_t>(Addr)) << "\n";
+ if (FunctionStartsType == FunctionStartsMode::Names) {
+ auto It = SymbolNames.find(Addr);
+ if (It != SymbolNames.end())
+ outs() << It->second << "\n";
+ } else {
+ if (O->is64Bit())
+ outs() << format("%016" PRIx64, Addr);
+ else
+ outs() << format("%08" PRIx32, static_cast<uint32_t>(Addr));
+
+ if (FunctionStartsType == FunctionStartsMode::Both) {
+ auto It = SymbolNames.find(Addr);
+ if (It != SymbolNames.end())
+ outs() << " " << It->second;
+ else
+ outs() << " ?";
+ }
+ outs() << "\n";
+ }
}
}
@@ -2111,9 +2147,9 @@ static void ProcessMachO(StringRef Name, MachOObjectFile *MachOOF,
// UniversalHeaders or ArchiveHeaders.
if (Disassemble || Relocations || PrivateHeaders || ExportsTrie || Rebase ||
Bind || SymbolTable || LazyBind || WeakBind || IndirectSymbols ||
- DataInCode || FunctionStarts || LinkOptHints || ChainedFixups ||
- DyldInfo || DylibsUsed || DylibId || Rpaths || ObjcMetaData ||
- (!FilterSections.empty())) {
+ DataInCode || FunctionStartsType != FunctionStartsMode::None ||
+ LinkOptHints || ChainedFixups || DyldInfo || DylibsUsed || DylibId ||
+ Rpaths || ObjcMetaData || (!FilterSections.empty())) {
if (LeadingHeaders) {
outs() << Name;
if (!ArchiveMemberName.empty())
@@ -2168,7 +2204,7 @@ static void ProcessMachO(StringRef Name, MachOObjectFile *MachOOF,
PrintIndirectSymbols(MachOOF, Verbose);
if (DataInCode)
PrintDataInCodeTable(MachOOF, Verbose);
- if (FunctionStarts)
+ if (FunctionStartsType != FunctionStartsMode::None)
PrintFunctionStarts(MachOOF);
if (LinkOptHints)
PrintLinkOptHints(MachOOF);