diff --git a/llvm/test/Support/check-default-options.txt b/llvm/test/Support/check-default-options.txt
--- a/llvm/test/Support/check-default-options.txt
+++ b/llvm/test/Support/check-default-options.txt
@@ -1,9 +1,7 @@
-# RUN: llvm-objdump --help-hidden %t | FileCheck --check-prefix=CHECK-OBJDUMP %s
# RUN: llvm-readobj --help-hidden %t | FileCheck --check-prefix=CHECK-READOBJ %s
# RUN: llvm-tblgen --help-hidden %t | FileCheck --check-prefix=CHECK-TBLGEN %s
# RUN: llvm-opt-report --help-hidden %t | FileCheck --check-prefix=CHECK-OPT-RPT %s
-# CHECK-OBJDUMP: -h - Alias for --section-headers
# CHECK-READOBJ: -h - Alias for --file-headers
# CHECK-TBLGEN: -h - Alias for --help
# CHECK-OPT-RPT: -h - Alias for --help
diff --git a/llvm/test/tools/llvm-objdump/X86/source-interleave-prefix.test b/llvm/test/tools/llvm-objdump/X86/source-interleave-prefix.test
--- a/llvm/test/tools/llvm-objdump/X86/source-interleave-prefix.test
+++ b/llvm/test/tools/llvm-objdump/X86/source-interleave-prefix.test
@@ -83,7 +83,7 @@
; RUN: not llvm-objdump --prefix %p --prefix-strip '-1' --source %t-missing-prefix.o 2>&1 | \
; RUN: FileCheck %s --check-prefix=CHECK-INVALID-PREFIX-STRIP -DOPTION='-1'
-; CHECK-INVALID-PREFIX-STRIP: llvm-objdump{{.*}}: for the --prefix-strip option: '[[OPTION]]' value invalid for uint argument!
+; CHECK-INVALID-PREFIX-STRIP: {{.*}}llvm-objdump{{.*}}: error: --prefix-strip: expected a non-negative integer, but got '[[OPTION]]'
;; Test text value --prefix-strip. Reports an error.
diff --git a/llvm/test/tools/llvm-objdump/help.test b/llvm/test/tools/llvm-objdump/help.test
--- a/llvm/test/tools/llvm-objdump/help.test
+++ b/llvm/test/tools/llvm-objdump/help.test
@@ -1,6 +1,14 @@
RUN: llvm-objdump --help | FileCheck %s
+RUN: llvm-objdump --help-hidden | FileCheck --check-prefix=HIDDEN %s
CHECK: OVERVIEW: llvm object file dumper
CHECK: USAGE: llvm-objdump{{(.exe)?}} [options] {{$}}
-CHECK: OPTIONS:
+CHECK: Generic Options:
+CHECK-NOT: {{ -w }}
CHECK: @FILE
+
+HIDDEN: OVERVIEW: llvm object file dumper
+HIDDEN: USAGE: llvm-objdump{{(.exe)?}} [options] {{$}}
+HIDDEN: Generic Options:
+HIDDEN: {{ -w }}
+HIDDEN: @FILE
diff --git a/llvm/test/tools/llvm-objdump/section-filter.test b/llvm/test/tools/llvm-objdump/section-filter.test
--- a/llvm/test/tools/llvm-objdump/section-filter.test
+++ b/llvm/test/tools/llvm-objdump/section-filter.test
@@ -2,7 +2,7 @@
## We test the LMA here too, because the code at the time of writing uses the
## value of --section when looking up section LMAs.
# RUN: yaml2obj %s --docnum=1 -o %t.h.elf
-# RUN: llvm-objdump -h %t.h.elf -j=.text --section=.bss \
+# RUN: llvm-objdump -h %t.h.elf -j.text --section=.bss \
# RUN: | FileCheck %s --check-prefix=SHDRS --implicit-check-not=.data --implicit-check-not=.text2
# SHDRS: Name Size VMA LMA
@@ -92,10 +92,9 @@
Content: '666f6f626172' # "foobar"
## Test that the -j alias can be used flexibly. Create a baseline and ensure
-## all other combinations are identical.
+## all other combinations compatible with POSIX are identical.
# RUN: llvm-objdump %t.h.elf -h -s --section .symtab > %t.full
# RUN: llvm-objdump %t.h.elf -h -s -j .symtab > %t.1
-# RUN: llvm-objdump %t.h.elf -h -s -j=.symtab > %t.2
# RUN: llvm-objdump %t.h.elf -h -s -j.symtab > %t.3
# RUN: llvm-objdump %t.h.elf -hsj .symtab > %t.4
# RUN: llvm-objdump %t.h.elf -hsj=.symtab > %t.5
diff --git a/llvm/tools/llvm-objdump/CMakeLists.txt b/llvm/tools/llvm-objdump/CMakeLists.txt
--- a/llvm/tools/llvm-objdump/CMakeLists.txt
+++ b/llvm/tools/llvm-objdump/CMakeLists.txt
@@ -9,10 +9,15 @@
MC
MCDisassembler
Object
+ Option
Support
Symbolize
)
+set(LLVM_TARGET_DEFINITIONS ObjdumpOpts.td)
+tablegen(LLVM ObjdumpOpts.inc -gen-opt-parser-defs)
+add_public_tablegen_target(ObjdumpOptsTableGen)
+
add_llvm_tool(llvm-objdump
llvm-objdump.cpp
COFFDump.cpp
@@ -20,6 +25,8 @@
MachODump.cpp
WasmDump.cpp
XCOFFDump.cpp
+ DEPENDS
+ ObjdumpOptsTableGen
)
if(HAVE_LIBXAR)
diff --git a/llvm/tools/llvm-objdump/MachODump.h b/llvm/tools/llvm-objdump/MachODump.h
--- a/llvm/tools/llvm-objdump/MachODump.h
+++ b/llvm/tools/llvm-objdump/MachODump.h
@@ -24,25 +24,31 @@
class RelocationRef;
} // namespace object
+namespace opt {
+class InputArgList;
+} // namespace opt
+
namespace objdump {
+void parseMachOOptions(const llvm::opt::InputArgList &InputArgs);
+
// 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 FunctionStarts;
-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;
+extern bool Bind;
+extern bool DataInCode;
+extern bool DylibsUsed;
+extern bool DylibId;
+extern bool ExportsTrie;
+extern bool FirstPrivateHeader;
+extern bool FunctionStarts;
+extern bool IndirectSymbols;
+extern bool InfoPlist;
+extern bool LazyBind;
+extern bool LinkOptHints;
+extern bool ObjcMetaData;
+extern bool Rebase;
+extern bool UniversalHeaders;
+extern bool WeakBind;
Error getMachORelocationValueString(const object::MachOObjectFile *Obj,
const object::RelocationRef &RelRef,
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
@@ -12,6 +12,7 @@
#include "MachODump.h"
+#include "ObjdumpOptID.h"
#include "llvm-objdump.h"
#include "llvm-c/Disassembler.h"
#include "llvm/ADT/STLExtras.h"
@@ -34,8 +35,8 @@
#include "llvm/MC/MCTargetOptions.h"
#include "llvm/Object/MachO.h"
#include "llvm/Object/MachOUniversal.h"
+#include "llvm/Option/ArgList.h"
#include "llvm/Support/Casting.h"
-#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/Format.h"
@@ -62,131 +63,61 @@
using namespace llvm::object;
using namespace llvm::objdump;
-cl::OptionCategory objdump::MachOCat("llvm-objdump MachO Specific Options");
-
-cl::opt objdump::FirstPrivateHeader(
- "private-header",
- cl::desc("Display only the first format specific file header"),
- cl::cat(MachOCat));
-
-cl::opt objdump::ExportsTrie("exports-trie",
- cl::desc("Display mach-o exported symbols"),
- cl::cat(MachOCat));
-
-cl::opt objdump::Rebase("rebase",
- cl::desc("Display mach-o rebasing info"),
- cl::cat(MachOCat));
-
-cl::opt objdump::Bind("bind", cl::desc("Display mach-o binding info"),
- cl::cat(MachOCat));
-
-cl::opt objdump::LazyBind("lazy-bind",
- cl::desc("Display mach-o lazy 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,
- cl::desc("Print line information from debug info if available"),
- cl::cat(MachOCat));
-
-static cl::opt DSYMFile("dsym",
- cl::desc("Use .dSYM file for debug info"),
- cl::cat(MachOCat));
-
-static cl::opt FullLeadingAddr("full-leading-addr",
- cl::desc("Print full leading address"),
- cl::cat(MachOCat));
-
-static cl::opt NoLeadingHeaders("no-leading-headers",
- cl::desc("Print no leading headers"),
- cl::cat(MachOCat));
-
-cl::opt objdump::UniversalHeaders(
- "universal-headers",
- cl::desc("Print Mach-O universal headers (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 objdump::IndirectSymbols(
- "indirect-symbols",
- cl::desc(
- "Print indirect symbol table 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
- objdump::FunctionStarts("function-starts",
- cl::desc("Print the function starts table for "
- "Mach-O objects (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
- 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::cat(MachOCat));
-
-cl::opt
- objdump::ObjcMetaData("objc-meta-data",
- cl::desc("Print the Objective-C runtime meta data "
- "for Mach-O files (requires --macho)"),
- cl::cat(MachOCat));
-
-static cl::opt DisSymName(
- "dis-symname",
- cl::desc("disassemble just this symbol's instructions (requires --macho)"),
- cl::cat(MachOCat));
-
-static cl::opt NoSymbolicOperands(
- "no-symbolic-operands",
- cl::desc("do not symbolic operands when disassembling (requires --macho)"),
- cl::cat(MachOCat));
-
-static cl::list
- ArchFlags("arch", cl::desc("architecture(s) from a Mach-O file to dump"),
- cl::ZeroOrMore, cl::cat(MachOCat));
+bool objdump::FirstPrivateHeader;
+bool objdump::ExportsTrie;
+bool objdump::Rebase;
+bool objdump::Bind;
+bool objdump::LazyBind;
+bool objdump::WeakBind;
+static bool UseDbg;
+static std::string DSYMFile;
+static bool FullLeadingAddr;
+static bool NoLeadingHeaders;
+bool objdump::UniversalHeaders;
+static bool ArchiveMemberOffsets;
+bool objdump::IndirectSymbols;
+bool objdump::DataInCode;
+bool objdump::FunctionStarts;
+bool objdump::LinkOptHints;
+bool objdump::InfoPlist;
+bool objdump::DylibsUsed;
+bool objdump::DylibId;
+static bool NonVerbose;
+bool objdump::ObjcMetaData;
+static std::string DisSymName;
+static bool NoSymbolicOperands;
+static std::vector ArchFlags;
static bool ArchAll = false;
-
static std::string ThumbTripleName;
+void objdump::parseMachOOptions(const llvm::opt::InputArgList &InputArgs) {
+ FirstPrivateHeader = InputArgs.hasArg(OBJDUMP_private_header);
+ ExportsTrie = InputArgs.hasArg(OBJDUMP_exports_trie);
+ Rebase = InputArgs.hasArg(OBJDUMP_rebase);
+ Bind = InputArgs.hasArg(OBJDUMP_bind);
+ LazyBind = InputArgs.hasArg(OBJDUMP_lazy_bind);
+ WeakBind = InputArgs.hasArg(OBJDUMP_weak_bind);
+ UseDbg = InputArgs.hasArg(OBJDUMP_g);
+ DSYMFile = InputArgs.getLastArgValue(OBJDUMP_dsym_EQ).str();
+ FullLeadingAddr = InputArgs.hasArg(OBJDUMP_full_leading_addr);
+ NoLeadingHeaders = InputArgs.hasArg(OBJDUMP_no_leading_headers);
+ UniversalHeaders = InputArgs.hasArg(OBJDUMP_universal_headers);
+ 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);
+ LinkOptHints = InputArgs.hasArg(OBJDUMP_link_opt_hints);
+ InfoPlist = InputArgs.hasArg(OBJDUMP_info_plist);
+ DylibsUsed = InputArgs.hasArg(OBJDUMP_dylibs_used);
+ DylibId = InputArgs.hasArg(OBJDUMP_dylib_id);
+ NonVerbose = InputArgs.hasArg(OBJDUMP_non_verbose);
+ ObjcMetaData = InputArgs.hasArg(OBJDUMP_objc_meta_data);
+ DisSymName = InputArgs.getLastArgValue(OBJDUMP_dis_symname).str();
+ NoSymbolicOperands = InputArgs.hasArg(OBJDUMP_no_symbolic_operands);
+ ArchFlags = InputArgs.getAllArgValues(OBJDUMP_arch_EQ);
+}
+
static const Target *GetTarget(const MachOObjectFile *MachOObj,
const char **McpuDefault,
const Target **ThumbTarget) {
diff --git a/llvm/tools/llvm-objdump/ObjdumpOptID.h b/llvm/tools/llvm-objdump/ObjdumpOptID.h
new file mode 100644
--- /dev/null
+++ b/llvm/tools/llvm-objdump/ObjdumpOptID.h
@@ -0,0 +1,13 @@
+#ifndef LLVM_TOOLS_LLVM_OBJDUMP_OBJDUMP_OPT_ID_H
+#define LLVM_TOOLS_LLVM_OBJDUMP_OBJDUMP_OPT_ID_H
+
+enum ID {
+ OBJDUMP_INVALID = 0, // This is not an option ID.
+#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
+ HELPTEXT, METAVAR, VALUES) \
+ OBJDUMP_##ID,
+#include "ObjdumpOpts.inc"
+#undef OPTION
+};
+
+#endif // LLVM_TOOLS_LLVM_OBJDUMP_OBJDUMP_OPT_ID_H
diff --git a/llvm/tools/llvm-objdump/ObjdumpOpts.td b/llvm/tools/llvm-objdump/ObjdumpOpts.td
new file mode 100644
--- /dev/null
+++ b/llvm/tools/llvm-objdump/ObjdumpOpts.td
@@ -0,0 +1,398 @@
+include "llvm/Option/OptParser.td"
+
+def grp_generic : OptionGroup<"kind">, HelpText<"Generic Options">;
+
+def help : Flag<["--"], "help">,
+ HelpText<"Display available options (--help-hidden for more)">,
+ Group;
+
+def help_hidden : Flag<["--"], "help-hidden">,
+ Flags<[HelpHidden]>,
+ HelpText<"Display all available options">,
+ Group;
+
+def version : Flag<["--"], "version">,
+ HelpText<"Display the version of this program">,
+ Group;
+
+
+
+def grp_objdump : OptionGroup<"objdump">, HelpText<"llvm-objdump Options">;
+
+def adjust_vma_EQ : Joined<["--"], "adjust-vma=">,
+ MetaVarName<"offset">,
+ HelpText<"Increase the displayed address by the specified offset">,
+ Group;
+
+def all_headers : Flag<["--"], "all-headers">,
+ HelpText<"Display all available header information">,
+ Group;
+def : Flag<["-"], "x">, Alias, HelpText<"Alias for --all-headers">,
+ Group;
+
+def arch_name_EQ : Joined<["--"], "arch-name=">,
+ HelpText<"Target arch to disassemble for, "
+ "see --version for available targets">,
+ Group;
+
+def archive_headers : Flag<["--"], "archive-headers">,
+ HelpText<"Display archive header information">,
+ Group;
+def : Flag<["-"], "a">, Alias,
+ HelpText<"Alias for --archive-headers">,
+ Group;
+
+def demangle : Flag<["--"], "demangle">, HelpText<"Demangle symbol names">,
+ Group;
+def : Flag<["-"], "C">, Alias, HelpText<"Alias for --demangle">,
+ Group;
+
+def disassemble : Flag<["--"], "disassemble">,
+ HelpText<"Display assembler mnemonics for the machine instructions">,
+ Group;
+def : Flag<["-"], "d">, Alias, HelpText<"Alias for --disassemble">,
+ Group;
+
+def disassemble_all : Flag<["--"], "disassemble-all">,
+ HelpText<"Display assembler mnemonics for the machine instructions">,
+ Group;
+def : Flag<["-"], "D">, Alias,
+ HelpText<"Alias for --disassemble-all">,
+ Group;
+
+def symbol_description : Flag<["--"], "symbol-description">,
+ HelpText<"Add symbol description for disassembly. This "
+ "option is for XCOFF files only.">,
+ Group;
+
+def disassemble_symbols_EQ : Joined<["--"], "disassemble-symbols=">,
+ HelpText<"List of symbols to disassemble. "
+ "Accept demangled names when --demangle is "
+ "specified, otherwise accept mangled names">,
+ Group;
+
+def disassemble_zeroes : Flag<["--"], "disassemble-zeroes">,
+ HelpText<"Do not skip blocks of zeroes when disassembling">,
+ Group;
+def : Flag<["-"], "z">, Alias,
+ HelpText<"Alias for --disassemble-zeroes">,
+ Group;
+
+def disassembler_options_EQ : Joined<["--"], "disassembler-options=">,
+ MetaVarName<"options">,
+ HelpText<"Pass target specific disassembler options">,
+ Group;
+def : JoinedOrSeparate<["-"], "M">, Alias,
+ HelpText<"Alias for --disassembler-options=">,
+ Group;
+
+def dynamic_reloc : Flag<["--"], "dynamic-reloc">,
+ HelpText<"Display the dynamic relocation entries in the file">,
+ Group;
+def : Flag<["-"], "R">, Alias,
+ HelpText<"Alias for --dynamic-reloc">,
+ Group;
+
+def dwarf_EQ : Joined<["--"], "dwarf=">,
+ HelpText<"Dump of dwarf debug sections">, Values<"frames">,
+ Group;
+
+def fault_map_section : Flag<["--"], "fault-map-section">,
+ HelpText<"Display contents of faultmap section">,
+ Group;
+
+def file_headers : Flag<["--"], "file-headers">,
+ HelpText<"Display the contents of the overall file header">,
+ Group;
+def : Flag<["-"], "f">, Alias,
+ HelpText<"Alias for --file-headers">,
+ Group;
+
+def full_contents : Flag<["--"], "full-contents">,
+ HelpText<"Display the content of each section">,
+ Group;
+def : Flag<["-"], "s">, Alias,
+ HelpText<"Alias for --full-contents">,
+ Group;
+
+def line_numbers : Flag<["--"], "line-numbers">,
+ HelpText<"Display source line numbers with "
+ "disassembly. Implies disassemble object">,
+ Group;
+def : Flag<["-"], "l">, Alias,
+ HelpText<"Alias for --line-numbers">,
+ Group;
+
+def macho : Flag<["--"], "macho">,
+ HelpText<"Use MachO specific object file parser">,
+ Group;
+def : Flag<["-"], "m">, Alias, HelpText<"Alias for --macho">,
+ Group;
+
+def mcpu_EQ : Joined<["--"], "mcpu=">,
+ MetaVarName<"cpu-name">,
+ HelpText<"Target a specific cpu type (--mcpu=help for details)">,
+ Group;
+
+def mattr_EQ : Joined<["--"], "mattr=">,
+ MetaVarName<"a1,+a2,-a3,...">,
+ HelpText<"Target specific attributes (--mattr=help for details)">,
+ Group;
+
+def no_show_raw_insn : Flag<["--"], "no-show-raw-insn">,
+ HelpText<"When disassembling instructions, "
+ "do not print the instruction bytes.">,
+ Group;
+
+def no_leading_addr : Flag<["--"], "no-leading-addr">,
+ HelpText<"Print no leading address">,
+ Group;
+
+def raw_clang_ast : Flag<["--"], "raw-clang-ast">,
+ HelpText<"Dump the raw binary contents of the clang AST section">,
+ Group;
+
+def reloc : Flag<["--"], "reloc">,
+ HelpText<"Display the relocation entries in the file">,
+ Group;
+def : Flag<["-"], "r">, Alias, HelpText<"Alias for --reloc">,
+ Group;
+
+def print_imm_hex : Flag<["--"], "print-imm-hex">,
+ HelpText<"Use hex format for immediate values">,
+ Group;
+
+def no_print_imm_hex : Flag<["--"], "no-print-imm-hex">,
+ HelpText<"Do not use hex format for immediate values (default)">,
+ Group;
+def : Flag<["--"], "print-imm-hex=false">, Alias,
+ Group;
+
+def private_headers : Flag<["--"], "private-headers">,
+ HelpText<"Display format specific file headers">,
+ Group;
+def : Flag<["-"], "p">, Alias,
+ HelpText<"Alias for --private-headers">,
+ Group;
+
+def section_EQ : Joined<["--"], "section=">,
+ HelpText<"Operate on the specified sections only. "
+ "With --macho dump segment,section">,
+ Group;
+def : Separate<["--"], "section">, Alias,
+ Group;
+def : JoinedOrSeparate<["-"], "j">, Alias,
+ HelpText<"Alias for --section">,
+ Group;
+
+def section_headers : Flag<["--"], "section-headers">,
+ HelpText<"Display summaries of the headers for each section.">,
+ Group;
+def : Flag<["--"], "headers">, Alias,
+ HelpText<"Alias for --section-headers">,
+ Group;
+def : Flag<["-"], "h">, Alias,
+ HelpText<"Alias for --section-headers">,
+ Group;
+
+def show_lma : Flag<["--"], "show-lma">,
+ HelpText<"Display LMA column when dumping ELF section headers">,
+ Group;
+
+def source : Flag<["--"], "source">,
+ HelpText<"Display source inlined with disassembly. Implies disassemble object">,
+ Group;
+def : Flag<["-"], "S">, Alias