diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp --- a/llvm/tools/llvm-objdump/ELFDump.cpp +++ b/llvm/tools/llvm-objdump/ELFDump.cpp @@ -19,6 +19,7 @@ #include "llvm/Support/raw_ostream.h" using namespace llvm::object; +using namespace llvm::objdump; namespace llvm { template diff --git a/llvm/tools/llvm-objdump/MachODump.h b/llvm/tools/llvm-objdump/MachODump.h new file mode 100644 --- /dev/null +++ b/llvm/tools/llvm-objdump/MachODump.h @@ -0,0 +1,37 @@ +//===-- MachODump.h ---------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TOOLS_LLVM_OBJDUMP_MACHODUMP_H +#define LLVM_TOOLS_LLVM_OBJDUMP_MACHODUMP_H + +#include "llvm/Support/CommandLine.h" + +namespace llvm { +namespace objdump { + +// MachO specific options +extern cl::OptionCategory MachOCat; +extern cl::opt Bind; +extern cl::opt DataInCode; +extern cl::opt DylibsUsed; +extern cl::opt DylibId; +extern cl::opt ExportsTrie; +extern cl::opt FirstPrivateHeader; +extern cl::opt IndirectSymbols; +extern cl::opt InfoPlist; +extern cl::opt LazyBind; +extern cl::opt LinkOptHints; +extern cl::opt ObjcMetaData; +extern cl::opt Rebase; +extern cl::opt UniversalHeaders; +extern cl::opt WeakBind; + +} // namespace objdump +} // namespace llvm + +#endif diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -10,6 +10,8 @@ // //===----------------------------------------------------------------------===// +#include "MachODump.h" + #include "llvm-objdump.h" #include "llvm-c/Disassembler.h" #include "llvm/ADT/STLExtras.h" @@ -57,53 +59,35 @@ } #endif +using namespace llvm; using namespace llvm::object; +using namespace llvm::objdump; -namespace llvm { - -cl::OptionCategory MachOCat("llvm-objdump MachO Specific Options"); - -extern cl::opt ArchiveHeaders; -extern cl::opt Disassemble; -extern cl::opt DisassembleAll; -extern cl::opt DwarfDumpType; -extern cl::list FilterSections; -extern cl::list MAttrs; -extern cl::opt MCPU; -extern cl::opt NoShowRawInsn; -extern cl::opt NoLeadingAddr; -extern cl::opt PrintImmHex; -extern cl::opt PrivateHeaders; -extern cl::opt Relocations; -extern cl::opt SectionHeaders; -extern cl::opt SectionContents; -extern cl::opt SymbolTable; -extern cl::opt TripleName; -extern cl::opt UnwindInfo; +cl::OptionCategory objdump::MachOCat("llvm-objdump MachO Specific Options"); -cl::opt - FirstPrivateHeader("private-header", - cl::desc("Display only the first format specific file " - "header"), - cl::cat(MachOCat)); +cl::opt objdump::FirstPrivateHeader( + "private-header", + cl::desc("Display only the first format specific file header"), + cl::cat(MachOCat)); -cl::opt ExportsTrie("exports-trie", - cl::desc("Display mach-o exported symbols"), - cl::cat(MachOCat)); +cl::opt objdump::ExportsTrie("exports-trie", + cl::desc("Display mach-o exported symbols"), + cl::cat(MachOCat)); -cl::opt Rebase("rebase", cl::desc("Display mach-o rebasing info"), - cl::cat(MachOCat)); +cl::opt objdump::Rebase("rebase", + cl::desc("Display mach-o rebasing info"), + cl::cat(MachOCat)); -cl::opt Bind("bind", cl::desc("Display mach-o binding info"), - cl::cat(MachOCat)); +cl::opt objdump::Bind("bind", cl::desc("Display mach-o binding info"), + cl::cat(MachOCat)); -cl::opt LazyBind("lazy-bind", - cl::desc("Display mach-o lazy binding info"), - cl::cat(MachOCat)); +cl::opt objdump::LazyBind("lazy-bind", + cl::desc("Display mach-o lazy binding info"), + cl::cat(MachOCat)); -cl::opt WeakBind("weak-bind", - cl::desc("Display mach-o weak binding info"), - cl::cat(MachOCat)); +cl::opt objdump::WeakBind("weak-bind", + cl::desc("Display mach-o weak binding info"), + cl::cat(MachOCat)); static cl::opt UseDbg("g", cl::Grouping, @@ -122,63 +106,65 @@ cl::desc("Print no leading headers"), cl::cat(MachOCat)); -cl::opt UniversalHeaders("universal-headers", - cl::desc("Print Mach-O universal headers " - "(requires -macho)"), - cl::cat(MachOCat)); - -cl::opt - ArchiveMemberOffsets("archive-member-offsets", - cl::desc("Print the offset to each archive member for " - "Mach-O archives (requires -macho and " - "-archive-headers)"), - cl::cat(MachOCat)); - -cl::opt IndirectSymbols("indirect-symbols", - cl::desc("Print indirect symbol table for Mach-O " - "objects (requires -macho)"), - cl::cat(MachOCat)); +cl::opt objdump::UniversalHeaders( + "universal-headers", + cl::desc("Print Mach-O universal headers (requires -macho)"), + cl::cat(MachOCat)); -cl::opt - DataInCode("data-in-code", - cl::desc("Print the data in code table for Mach-O objects " - "(requires -macho)"), - cl::cat(MachOCat)); +static cl::opt ArchiveMemberOffsets( + "archive-member-offsets", + cl::desc("Print the offset to each archive member for Mach-O archives " + "(requires -macho and -archive-headers)"), + cl::cat(MachOCat)); -cl::opt LinkOptHints("link-opt-hints", - cl::desc("Print the linker optimization hints for " - "Mach-O objects (requires -macho)"), - cl::cat(MachOCat)); +cl::opt objdump::IndirectSymbols( + "indirect-symbols", + cl::desc( + "Print indirect symbol table for Mach-O objects (requires -macho)"), + cl::cat(MachOCat)); -cl::opt InfoPlist("info-plist", - cl::desc("Print the info plist section as strings for " - "Mach-O objects (requires -macho)"), - cl::cat(MachOCat)); +cl::opt objdump::DataInCode( + "data-in-code", + cl::desc( + "Print the data in code table for Mach-O objects (requires -macho)"), + cl::cat(MachOCat)); -cl::opt DylibsUsed("dylibs-used", - cl::desc("Print the shared libraries used for linked " - "Mach-O files (requires -macho)"), - cl::cat(MachOCat)); +cl::opt + objdump::LinkOptHints("link-opt-hints", + cl::desc("Print the linker optimization hints for " + "Mach-O objects (requires -macho)"), + cl::cat(MachOCat)); cl::opt - DylibId("dylib-id", - cl::desc("Print the shared library's id for the dylib Mach-O " - "file (requires -macho)"), - cl::cat(MachOCat)); + objdump::InfoPlist("info-plist", + cl::desc("Print the info plist section as strings for " + "Mach-O objects (requires -macho)"), + cl::cat(MachOCat)); cl::opt + objdump::DylibsUsed("dylibs-used", + cl::desc("Print the shared libraries used for linked " + "Mach-O files (requires -macho)"), + cl::cat(MachOCat)); + +cl::opt objdump::DylibId("dylib-id", + cl::desc("Print the shared library's id for the " + "dylib Mach-O file (requires -macho)"), + cl::cat(MachOCat)); + +static cl::opt NonVerbose("non-verbose", - cl::desc("Print the info for Mach-O objects in " - "non-verbose or numeric form (requires -macho)"), + cl::desc("Print the info for Mach-O objects in non-verbose or " + "numeric form (requires -macho)"), cl::cat(MachOCat)); cl::opt - ObjcMetaData("objc-meta-data", - cl::desc("Print the Objective-C runtime meta data for " - "Mach-O files (requires -macho)"), - cl::cat(MachOCat)); + objdump::ObjcMetaData("objc-meta-data", + cl::desc("Print the Objective-C runtime meta data " + "for Mach-O files (requires -macho)"), + cl::cat(MachOCat)); -cl::opt DisSymName( +static cl::opt DisSymName( "dis-symname", cl::desc("disassemble just this symbol's instructions (requires -macho)"), cl::cat(MachOCat)); @@ -192,6 +178,8 @@ ArchFlags("arch", cl::desc("architecture(s) from a Mach-O file to dump"), cl::ZeroOrMore, cl::cat(MachOCat)); +namespace llvm { + extern StringSet<> FoundSectionSet; bool ArchAll = false; diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -23,9 +23,30 @@ class MachOObjectFile; class MachOUniversalBinary; class RelocationRef; -} +} // namespace object + +namespace objdump { +extern cl::opt ArchiveHeaders; extern cl::opt Demangle; +extern cl::opt Disassemble; +extern cl::opt DisassembleAll; +extern cl::opt DwarfDumpType; +extern cl::list FilterSections; +extern cl::list MAttrs; +extern cl::opt MCPU; +extern cl::opt NoShowRawInsn; +extern cl::opt NoLeadingAddr; +extern cl::opt PrintImmHex; +extern cl::opt PrivateHeaders; +extern cl::opt Relocations; +extern cl::opt SectionHeaders; +extern cl::opt SectionContents; +extern cl::opt SymbolTable; +extern cl::opt TripleName; +extern cl::opt UnwindInfo; + +} // namespace objdump typedef std::function FilterPredicate; diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -17,6 +17,7 @@ #include "llvm-objdump.h" #include "COFFDump.h" +#include "MachODump.h" #include "XCOFFDump.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/STLExtras.h" @@ -72,29 +73,11 @@ #include #include +using namespace llvm; using namespace llvm::object; using namespace llvm::objdump; -namespace llvm { - -cl::OptionCategory ObjdumpCat("llvm-objdump Options"); - -// MachO specific -extern cl::OptionCategory MachOCat; -extern cl::opt Bind; -extern cl::opt DataInCode; -extern cl::opt DylibsUsed; -extern cl::opt DylibId; -extern cl::opt ExportsTrie; -extern cl::opt FirstPrivateHeader; -extern cl::opt IndirectSymbols; -extern cl::opt InfoPlist; -extern cl::opt LazyBind; -extern cl::opt LinkOptHints; -extern cl::opt ObjcMetaData; -extern cl::opt Rebase; -extern cl::opt UniversalHeaders; -extern cl::opt WeakBind; +static cl::OptionCategory ObjdumpCat("llvm-objdump Options"); static cl::opt AdjustVMA( "adjust-vma", @@ -115,21 +98,22 @@ "see -version for available targets"), cl::cat(ObjdumpCat)); -cl::opt ArchiveHeaders("archive-headers", - cl::desc("Display archive header information"), - cl::cat(ObjdumpCat)); +cl::opt + objdump::ArchiveHeaders("archive-headers", + cl::desc("Display archive header information"), + cl::cat(ObjdumpCat)); static cl::alias ArchiveHeadersShort("a", cl::desc("Alias for --archive-headers"), cl::NotHidden, cl::Grouping, cl::aliasopt(ArchiveHeaders)); -cl::opt Demangle("demangle", cl::desc("Demangle symbols names"), - cl::init(false), cl::cat(ObjdumpCat)); +cl::opt objdump::Demangle("demangle", cl::desc("Demangle symbols names"), + cl::init(false), cl::cat(ObjdumpCat)); static cl::alias DemangleShort("C", cl::desc("Alias for --demangle"), cl::NotHidden, cl::Grouping, cl::aliasopt(Demangle)); -cl::opt Disassemble( +cl::opt objdump::Disassemble( "disassemble", cl::desc("Display assembler mnemonics for the machine instructions"), cl::cat(ObjdumpCat)); @@ -137,7 +121,7 @@ cl::NotHidden, cl::Grouping, cl::aliasopt(Disassemble)); -cl::opt DisassembleAll( +cl::opt objdump::DisassembleAll( "disassemble-all", cl::desc("Display assembler mnemonics for the machine instructions"), cl::cat(ObjdumpCat)); @@ -146,7 +130,7 @@ cl::NotHidden, cl::Grouping, cl::aliasopt(DisassembleAll)); -cl::opt +static cl::opt SymbolDescription("symbol-description", cl::desc("Add symbol description for disassembly. This " "option is for XCOFF files only"), @@ -179,7 +163,7 @@ cl::CommaSeparated, cl::aliasopt(DisassemblerOptions)); -cl::opt DwarfDumpType( +cl::opt objdump::DwarfDumpType( "dwarf", cl::init(DIDT_Null), cl::desc("Dump of dwarf debug sections:"), cl::values(clEnumValN(DIDT_DebugFrame, "frames", ".debug_frame")), cl::cat(ObjdumpCat)); @@ -206,9 +190,10 @@ cl::NotHidden, cl::Grouping, cl::aliasopt(FileHeaders)); -cl::opt SectionContents("full-contents", - cl::desc("Display the content of each section"), - cl::cat(ObjdumpCat)); +cl::opt + objdump::SectionContents("full-contents", + cl::desc("Display the content of each section"), + cl::cat(ObjdumpCat)); static cl::alias SectionContentsShort("s", cl::desc("Alias for --full-contents"), cl::NotHidden, cl::Grouping, @@ -234,24 +219,24 @@ static cl::alias MachOm("m", cl::desc("Alias for --macho"), cl::NotHidden, cl::Grouping, cl::aliasopt(MachOOpt)); -cl::opt - MCPU("mcpu", - cl::desc("Target a specific cpu type (-mcpu=help for details)"), - cl::value_desc("cpu-name"), cl::init(""), cl::cat(ObjdumpCat)); +cl::opt objdump::MCPU( + "mcpu", cl::desc("Target a specific cpu type (-mcpu=help for details)"), + cl::value_desc("cpu-name"), cl::init(""), cl::cat(ObjdumpCat)); -cl::list MAttrs("mattr", cl::CommaSeparated, - cl::desc("Target specific attributes"), - cl::value_desc("a1,+a2,-a3,..."), - cl::cat(ObjdumpCat)); +cl::list objdump::MAttrs("mattr", cl::CommaSeparated, + cl::desc("Target specific attributes"), + cl::value_desc("a1,+a2,-a3,..."), + cl::cat(ObjdumpCat)); -cl::opt NoShowRawInsn("no-show-raw-insn", - cl::desc("When disassembling " - "instructions, do not print " - "the instruction bytes."), - cl::cat(ObjdumpCat)); -cl::opt NoLeadingAddr("no-leading-addr", - cl::desc("Print no leading address"), - cl::cat(ObjdumpCat)); +cl::opt objdump::NoShowRawInsn( + "no-show-raw-insn", + cl::desc( + "When disassembling instructions, do not print the instruction bytes."), + cl::cat(ObjdumpCat)); + +cl::opt objdump::NoLeadingAddr("no-leading-addr", + cl::desc("Print no leading address"), + cl::cat(ObjdumpCat)); static cl::opt RawClangAST( "raw-clang-ast", @@ -259,37 +244,40 @@ cl::cat(ObjdumpCat)); cl::opt - Relocations("reloc", cl::desc("Display the relocation entries in the file"), - cl::cat(ObjdumpCat)); + objdump::Relocations("reloc", + cl::desc("Display the relocation entries in the file"), + cl::cat(ObjdumpCat)); static cl::alias RelocationsShort("r", cl::desc("Alias for --reloc"), cl::NotHidden, cl::Grouping, cl::aliasopt(Relocations)); -cl::opt PrintImmHex("print-imm-hex", - cl::desc("Use hex format for immediate values"), - cl::cat(ObjdumpCat)); +cl::opt + objdump::PrintImmHex("print-imm-hex", + cl::desc("Use hex format for immediate values"), + cl::cat(ObjdumpCat)); -cl::opt PrivateHeaders("private-headers", - cl::desc("Display format specific file headers"), - cl::cat(ObjdumpCat)); +cl::opt + objdump::PrivateHeaders("private-headers", + cl::desc("Display format specific file headers"), + cl::cat(ObjdumpCat)); static cl::alias PrivateHeadersShort("p", cl::desc("Alias for --private-headers"), cl::NotHidden, cl::Grouping, cl::aliasopt(PrivateHeaders)); cl::list - FilterSections("section", - cl::desc("Operate on the specified sections only. " - "With -macho dump segment,section"), - cl::cat(ObjdumpCat)); + objdump::FilterSections("section", + cl::desc("Operate on the specified sections only. " + "With -macho dump segment,section"), + cl::cat(ObjdumpCat)); static cl::alias FilterSectionsj("j", cl::desc("Alias for --section"), cl::NotHidden, cl::Grouping, cl::Prefix, cl::aliasopt(FilterSections)); -cl::opt SectionHeaders("section-headers", - cl::desc("Display summaries of the " - "headers for each section."), - cl::cat(ObjdumpCat)); +cl::opt objdump::SectionHeaders( + "section-headers", + cl::desc("Display summaries of the headers for each section."), + cl::cat(ObjdumpCat)); static cl::alias SectionHeadersShort("headers", cl::desc("Alias for --section-headers"), cl::NotHidden, @@ -321,13 +309,13 @@ cl::value_desc("address"), cl::init(UINT64_MAX), cl::cat(ObjdumpCat)); -cl::opt SymbolTable("syms", cl::desc("Display the symbol table"), - cl::cat(ObjdumpCat)); +cl::opt objdump::SymbolTable("syms", cl::desc("Display the symbol table"), + cl::cat(ObjdumpCat)); static cl::alias SymbolTableShort("t", cl::desc("Alias for --syms"), cl::NotHidden, cl::Grouping, cl::aliasopt(SymbolTable)); -cl::opt DynamicSymbolTable( +static cl::opt DynamicSymbolTable( "dynamic-syms", cl::desc("Display the contents of the dynamic symbol table"), cl::cat(ObjdumpCat)); @@ -336,13 +324,15 @@ cl::NotHidden, cl::Grouping, cl::aliasopt(DynamicSymbolTable)); -cl::opt TripleName("triple", - cl::desc("Target triple to disassemble for, " - "see -version for available targets"), - cl::cat(ObjdumpCat)); +cl::opt objdump::TripleName( + "triple", + cl::desc( + "Target triple to disassemble for, see -version for available targets"), + cl::cat(ObjdumpCat)); -cl::opt UnwindInfo("unwind-info", cl::desc("Display unwind information"), - cl::cat(ObjdumpCat)); +cl::opt objdump::UnwindInfo("unwind-info", + cl::desc("Display unwind information"), + cl::cat(ObjdumpCat)); static cl::alias UnwindInfoShort("u", cl::desc("Alias for --unwind-info"), cl::NotHidden, cl::Grouping, cl::aliasopt(UnwindInfo)); @@ -355,6 +345,8 @@ static cl::extrahelp HelpResponse("\nPass @FILE as argument to read options from FILE.\n"); +namespace llvm { + static StringSet<> DisasmSymbolSet; StringSet<> FoundSectionSet; static StringRef ToolName;