Joseph Huber d2d8b0aa4f [llvm-objdump] Add support for dumping embedded offloading data
In Clang/LLVM we are moving towards a new binary format to store many
embedded object files to create a fatbinary. This patch adds support for
dumping these embedded images in the `llvm-objdump` tool. This will
allow users to query information about what is stored inside the binary.
This has very similar functionality to the `cuobjdump` tool for thoe familiar
with the Nvidia utilities. The proposed use is as follows:
```
$ clang input.c -fopenmp --offload-arch=sm_70 --offload-arch=sm_52 -c
$ llvm-objdump -O input.o

input.o:        file format elf64-x86-64

OFFLOADIND IMAGE [0]:
kind            cubin
arch            sm_52
triple          nvptx64-nvidia-cuda
producer        openmp

OFFLOADIND IMAGE [1]:
kind            cubin
arch            sm_70
triple          nvptx64-nvidia-cuda
producer        openmp
```

This will be expanded further once we start embedding more information
into these offloading images. Right now we are planning on adding
flags and entries for debug level, optimization, LTO usage, target
features, among others.

This patch only supports printing these sections, later we will want to
support dumping files the user may be interested in via another flag. I
am unsure if this should go here in `llvm-objdump` or `llvm-objcopy`.

Reviewed By: MaskRay, tra, jhenderson, JonChesterfield

Differential Revision: https://reviews.llvm.org/D126904
2022-07-01 21:13:28 -04:00

347 lines
13 KiB
TableGen

include "llvm/Option/OptParser.td"
multiclass Eq<string name, string help> {
def NAME : Separate<["--"], name>;
def NAME #_eq : Joined<["--"], name #"=">,
Alias<!cast<Separate>(NAME)>,
HelpText<help>;
}
def help : Flag<["--"], "help">,
HelpText<"Display available options (--help-hidden for more)">;
def help_hidden : Flag<["--"], "help-hidden">,
Flags<[HelpHidden]>,
HelpText<"Display all available options">;
def version : Flag<["--"], "version">,
HelpText<"Display the version of this program">;
def : Flag<["-"], "v">, Alias<version>, HelpText<"Alias for --version">;
def adjust_vma_EQ : Joined<["--"], "adjust-vma=">,
MetaVarName<"offset">,
HelpText<"Increase the displayed address by the specified offset">;
def all_headers : Flag<["--"], "all-headers">,
HelpText<"Display all available header information, "
"relocation entries and the symbol table">;
def : Flag<["-"], "x">, Alias<all_headers>, HelpText<"Alias for --all-headers">;
def arch_name_EQ : Joined<["--"], "arch-name=">,
HelpText<"Target arch to disassemble for, "
"see --version for available targets">;
def archive_headers : Flag<["--"], "archive-headers">,
HelpText<"Display archive header information">;
def : Flag<["-"], "a">, Alias<archive_headers>,
HelpText<"Alias for --archive-headers">;
def demangle : Flag<["--"], "demangle">, HelpText<"Demangle symbol names">;
def : Flag<["-"], "C">, Alias<demangle>, HelpText<"Alias for --demangle">;
def disassemble : Flag<["--"], "disassemble">,
HelpText<"Disassemble all executable sections found in the input files">;
def : Flag<["-"], "d">, Alias<disassemble>, HelpText<"Alias for --disassemble">;
def disassemble_all : Flag<["--"], "disassemble-all">,
HelpText<"Disassemble all sections found in the input files">;
def : Flag<["-"], "D">, Alias<disassemble_all>,
HelpText<"Alias for --disassemble-all">;
def symbol_description : Flag<["--"], "symbol-description">,
HelpText<"Add symbol description for disassembly. This "
"option is for XCOFF files only.">;
def disassemble_symbols_EQ : Joined<["--"], "disassemble-symbols=">,
HelpText<"List of symbols to disassemble. "
"Accept demangled names when --demangle is "
"specified, otherwise accept mangled names">;
def disassemble_zeroes : Flag<["--"], "disassemble-zeroes">,
HelpText<"Do not skip blocks of zeroes when disassembling">;
def : Flag<["-"], "z">, Alias<disassemble_zeroes>,
HelpText<"Alias for --disassemble-zeroes">;
def disassembler_options_EQ : Joined<["--"], "disassembler-options=">,
MetaVarName<"options">,
HelpText<"Pass target specific disassembler options">;
def : JoinedOrSeparate<["-"], "M">, Alias<disassembler_options_EQ>,
HelpText<"Alias for --disassembler-options=">;
def dynamic_reloc : Flag<["--"], "dynamic-reloc">,
HelpText<"Display the dynamic relocation entries in the file">;
def : Flag<["-"], "R">, Alias<dynamic_reloc>,
HelpText<"Alias for --dynamic-reloc">;
def dwarf_EQ : Joined<["--"], "dwarf=">,
HelpText<"Dump the specified DWARF debug sections. The "
"only supported value is 'frames'">,
Values<"frames">;
def fault_map_section : Flag<["--"], "fault-map-section">,
HelpText<"Display the content of the fault map section">;
def offloading : Flag<["--"], "offloading">,
HelpText<"Display the content of the offloading section">;
def file_headers : Flag<["--"], "file-headers">,
HelpText<"Display the contents of the overall file header">;
def : Flag<["-"], "f">, Alias<file_headers>,
HelpText<"Alias for --file-headers">;
def full_contents : Flag<["--"], "full-contents">,
HelpText<"Display the content of each section">;
def : Flag<["-"], "s">, Alias<full_contents>,
HelpText<"Alias for --full-contents">;
def line_numbers : Flag<["--"], "line-numbers">,
HelpText<"When disassembling, display source line numbers. "
"Implies --disassemble">;
def : Flag<["-"], "l">,
Alias<line_numbers>,
HelpText<"Alias for --line-numbers">;
def macho : Flag<["--"], "macho">,
HelpText<"Use MachO specific object file parser">;
def : Flag<["-"], "m">, Alias<macho>, HelpText<"Alias for --macho">;
def mcpu_EQ : Joined<["--"], "mcpu=">,
MetaVarName<"cpu-name">,
HelpText<"Target a specific cpu type (--mcpu=help for details)">;
def mattr_EQ : Joined<["--"], "mattr=">,
MetaVarName<"a1,+a2,-a3,...">,
HelpText<"Target specific attributes (--mattr=help for details)">;
def no_show_raw_insn : Flag<["--"], "no-show-raw-insn">,
HelpText<"When disassembling instructions, "
"do not print the instruction bytes.">;
def no_leading_addr : Flag<["--"], "no-leading-addr">,
HelpText<"When disassembling, do not print leading addresses">;
def raw_clang_ast : Flag<["--"], "raw-clang-ast">,
HelpText<"Dump the raw binary contents of the clang AST section">;
def reloc : Flag<["--"], "reloc">,
HelpText<"Display the relocation entries in the file">;
def : Flag<["-"], "r">, Alias<reloc>, HelpText<"Alias for --reloc">;
def print_imm_hex : Flag<["--"], "print-imm-hex">,
HelpText<"Use hex format for immediate values">;
def no_print_imm_hex : Flag<["--"], "no-print-imm-hex">,
HelpText<"Do not use hex format for immediate values (default)">;
def : Flag<["--"], "print-imm-hex=false">, Alias<no_print_imm_hex>;
def private_headers : Flag<["--"], "private-headers">,
HelpText<"Display format specific file headers">;
def : Flag<["-"], "p">, Alias<private_headers>,
HelpText<"Alias for --private-headers">;
def section_EQ : Joined<["--"], "section=">,
HelpText<"Operate on the specified sections only. "
"With --macho dump segment,section">;
def : Separate<["--"], "section">, Alias<section_EQ>;
def : JoinedOrSeparate<["-"], "j">, Alias<section_EQ>,
HelpText<"Alias for --section">;
def section_headers : Flag<["--"], "section-headers">,
HelpText<"Display summaries of the headers for each section.">;
def : Flag<["--"], "headers">, Alias<section_headers>,
HelpText<"Alias for --section-headers">;
def : Flag<["-"], "h">, Alias<section_headers>,
HelpText<"Alias for --section-headers">;
def show_lma : Flag<["--"], "show-lma">,
HelpText<"Display LMA column when dumping ELF section headers">;
def source : Flag<["--"], "source">,
HelpText<"When disassembling, display source interleaved with the "
"disassembly. Implies --disassemble">;
def : Flag<["-"], "S">, Alias<source>, HelpText<"Alias for --source">;
def start_address_EQ : Joined<["--"], "start-address=">,
MetaVarName<"address">,
HelpText<"Set the start address for disassembling, "
"printing relocations and printing symbols">;
def stop_address_EQ : Joined<["--"], "stop-address=">,
MetaVarName<"address">,
HelpText<"Set the stop address for disassembling, "
"printing relocations and printing symbols">;
def syms : Flag<["--"], "syms">,
HelpText<"Display the symbol table">;
def : Flag<["-"], "t">, Alias<syms>, HelpText<"Alias for --syms">;
def symbolize_operands : Flag<["--"], "symbolize-operands">,
HelpText<"Symbolize instruction operands when disassembling">;
def dynamic_syms : Flag<["--"], "dynamic-syms">,
HelpText<"Display the contents of the dynamic symbol table">;
def : Flag<["-"], "T">, Alias<dynamic_syms>,
HelpText<"Alias for --dynamic-syms">;
def triple_EQ : Joined<["--"], "triple=">,
HelpText<"Target triple to disassemble for, "
"see --version for available targets">;
def : Separate<["--"], "triple">,
Alias<triple_EQ>;
def unwind_info : Flag<["--"], "unwind-info">,
HelpText<"Display unwind information">;
def : Flag<["-"], "u">, Alias<unwind_info>,
HelpText<"Alias for --unwind-info">;
def wide : Flag<["--"], "wide">,
HelpText<"Ignored for compatibility with GNU objdump">;
def : Flag<["-"], "w">, Alias<wide>;
defm prefix : Eq<"prefix", "Add prefix to absolute paths">,
MetaVarName<"prefix">;
defm prefix_strip
: Eq<"prefix-strip", "Strip out initial directories from absolute "
"paths. No effect without --prefix">,
MetaVarName<"prefix">;
def debug_vars_EQ : Joined<["--"], "debug-vars=">,
HelpText<"Print the locations (in registers or memory) of "
"source-level variables alongside disassembly. "
"Supported formats: ascii, unicode (default)">,
Values<"unicode,ascii">;
def : Flag<["--"], "debug-vars">, Alias<debug_vars_EQ>, AliasArgs<["unicode"]>;
def debug_vars_indent_EQ : Joined<["--"], "debug-vars-indent=">,
HelpText<"Distance to indent the source-level variable display, "
"relative to the start of the disassembly">;
def x86_asm_syntax_att : Flag<["--"], "x86-asm-syntax=att">,
HelpText<"Emit AT&T-style disassembly">;
def x86_asm_syntax_intel : Flag<["--"], "x86-asm-syntax=intel">,
HelpText<"Emit Intel-style disassembly">;
def grp_mach_o : OptionGroup<"kind">, HelpText<"llvm-objdump MachO Specific Options">;
def private_header : Flag<["--"], "private-header">,
HelpText<"Display only the first format specific file header">,
Group<grp_mach_o>;
def exports_trie : Flag<["--"], "exports-trie">,
HelpText<"Display mach-o exported symbols">,
Group<grp_mach_o>;
def rebase : Flag<["--"], "rebase">,
HelpText<"Display mach-o rebasing info">,
Group<grp_mach_o>;
def bind : Flag<["--"], "bind">,
HelpText<"Display mach-o binding info">,
Group<grp_mach_o>;
def lazy_bind : Flag<["--"], "lazy-bind">,
HelpText<"Display mach-o lazy binding info">,
Group<grp_mach_o>;
def weak_bind : Flag<["--"], "weak-bind">,
HelpText<"Display mach-o weak binding info">,
Group<grp_mach_o>;
def g : Flag<["-"], "g">,
HelpText<"Print line information from debug info if available">,
Group<grp_mach_o>;
def dsym_EQ : Joined<["--"], "dsym=">,
HelpText<"Use .dSYM file for debug info">,
Group<grp_mach_o>;
def : Separate<["--"], "dsym">,
Alias<dsym_EQ>,
Group<grp_mach_o>;
def full_leading_addr : Flag<["--"], "full-leading-addr">,
HelpText<"Print full leading address">,
Group<grp_mach_o>;
def no_leading_headers : Flag<["--"], "no-leading-headers">,
HelpText<"Print no leading headers">,
Group<grp_mach_o>;
def universal_headers : Flag<["--"], "universal-headers">,
HelpText<"Print Mach-O universal headers (requires --macho)">,
Group<grp_mach_o>;
def archive_member_offsets : Flag<["--"], "archive-member-offsets">,
HelpText<"Print the offset to each archive member for Mach-O archives "
"(requires --macho and --archive-headers)">,
Group<grp_mach_o>;
def indirect_symbols : Flag<["--"], "indirect-symbols">,
HelpText<"Print indirect symbol table for Mach-O objects (requires --macho)">,
Group<grp_mach_o>;
def data_in_code : Flag<["--"], "data-in-code">,
HelpText<"Print the data in code table for Mach-O objects (requires --macho)">,
Group<grp_mach_o>;
def function_starts : Flag<["--"], "function-starts">,
HelpText<"Print the function starts table for "
"Mach-O objects (requires --macho)">,
Group<grp_mach_o>;
def link_opt_hints : Flag<["--"], "link-opt-hints">,
HelpText<"Print the linker optimization hints for "
"Mach-O objects (requires --macho)">,
Group<grp_mach_o>;
def info_plist : Flag<["--"], "info-plist">,
HelpText<"Print the info plist section as strings for "
"Mach-O objects (requires --macho)">,
Group<grp_mach_o>;
def dyld_info : Flag<["--"], "dyld_info">,
HelpText<"Print bind and rebase information used by dyld to resolve "
"external references in a final linked binary "
"(requires --macho)">,
Group<grp_mach_o>;
def dylibs_used : Flag<["--"], "dylibs-used">,
HelpText<"Print the shared libraries used for linked "
"Mach-O files (requires --macho)">,
Group<grp_mach_o>;
def dylib_id : Flag<["--"], "dylib-id">,
HelpText<"Print the shared library's id for the "
"dylib Mach-O file (requires --macho)">,
Group<grp_mach_o>;
def rpaths : Flag<["--"], "rpaths">,
HelpText<"Print the runtime search paths for the "
"Mach-O file (requires --macho)">,
Group<grp_mach_o>;
def non_verbose : Flag<["--"], "non-verbose">,
HelpText<"Print the info for Mach-O objects in non-verbose or "
"numeric form (requires --macho)">,
Group<grp_mach_o>;
def objc_meta_data : Flag<["--"], "objc-meta-data">,
HelpText<"Print the Objective-C runtime meta data "
"for Mach-O files (requires --macho)">,
Group<grp_mach_o>;
def dis_symname : Separate<["--"], "dis-symname">,
HelpText<"disassemble just this symbol's instructions (requires --macho)">,
Group<grp_mach_o>;
def no_symbolic_operands : Flag<["--"], "no-symbolic-operands">,
HelpText<"do not symbolic operands when disassembling (requires --macho)">,
Group<grp_mach_o>;
def arch_EQ : Joined<["--"], "arch=">,
HelpText<"architecture(s) from a Mach-O file to dump">,
Group<grp_mach_o>;
def : Separate<["--"], "arch">,
Alias<arch_EQ>,
Group<grp_mach_o>;