diff options
author | Keith Smiley <keithbsmiley@gmail.com> | 2022-02-04 18:07:12 -0800 |
---|---|---|
committer | Keith Smiley <keithbsmiley@gmail.com> | 2022-10-14 15:42:18 -0700 |
commit | bc99fd95e090a406a16fe431047d8b7d59af7dc0 (patch) | |
tree | e8e8d6f5c66f648c06101a7d52261fccae4bce72 /llvm/tools/llvm-objdump/MachODump.cpp | |
parent | c2d209476c494b3b3194e80bcd3062444eb41993 (diff) | |
download | llvm-bc99fd95e090a406a16fe431047d8b7d59af7dc0.zip llvm-bc99fd95e090a406a16fe431047d8b7d59af7dc0.tar.gz llvm-bc99fd95e090a406a16fe431047d8b7d59af7dc0.tar.bz2 |
[llvm-objdump/mac] Add new function starts print mode
This updates the `--function-starts` argument to now accept 3 different
modes, `addrs` for just printing the addresses of the function starts
(previous behavior), `names` for just printing the names of the function
starts, and `both` to print them both side by side.
In general if you're debugging function starts issues it's useful to see
the symbol name alongside the address. This also mirrors Apple's
`dyldinfo -function_starts` command which prints both.
Differential Revision: https://reviews.llvm.org/D119050
Diffstat (limited to 'llvm/tools/llvm-objdump/MachODump.cpp')
-rw-r--r-- | llvm/tools/llvm-objdump/MachODump.cpp | 56 |
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); |