aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-objdump
AgeCommit message (Collapse)AuthorFilesLines
2024-06-14[llvm] Use llvm::unique (NFC) (#95628)Kazu Hirata1-2/+1
2024-05-08[llvm] Use StringRef::operator== instead of StringRef::equals (NFC) (#91441)Kazu Hirata1-1/+1
I'm planning to remove StringRef::equals in favor of StringRef::operator==. - StringRef::operator==/!= outnumber StringRef::equals by a factor of 70 under llvm/ in terms of their usage. - The elimination of StringRef::equals brings StringRef closer to std::string_view, which has operator== but not equals. - S == "foo" is more readable than S.equals("foo"), especially for !Long.Expression.equals("str") vs Long.Expression != "str".
2024-04-26[RISCV] Add an instruction PrettyPrinter to llvm-objdump (#90093)Craig Topper1-0/+52
This prints the opcode bytes in the same order as GNU objdump without a space between them.
2024-04-18 [AMDGPU] Add disassembler diagnostics for invalid kernel descriptors (#87400)Emma Pilkington1-30/+35
These mostly are checking for various reserved bits being set. The diagnostics for gpu-dependent reserved bits have a bit more context since they seem like the most likely ones to be observed in practice. This commit also improves the error handling mechanism for MCDisassembler::onSymbolStart(). Previously it had a comment stream parameter that was just being ignored by llvm-objdump, now it returns errors using Expected<T>.
2024-04-06llvm-objdump/ELF: fix crash when reading dyn str table (#87519)Ramkumar Ramachandra1-5/+6
When reading the dynamic string table, llvm-objdump used to crash if the ELF was malformed, due to an erroneous consumption of error status. Instead, propogate the error status to the caller, fixing the crash, and printing a warning.
2024-03-28[Support] Fix color handling in formatted_raw_ostream (#86700)Andrew Ng1-7/+0
The color methods in formatted_raw_ostream were forwarding directly to the underlying stream without considering existing buffered output. This would cause incorrect colored output for buffered uses of formatted_raw_ostream. Fix this issue by applying the color to the formatted_raw_ostream itself and temporarily disabling scanning of any color related output so as not to affect the position tracking. This fix means that workarounds that forced formatted_raw_ostream buffering to be disabled can be removed. In the case of llvm-objdump, this can improve disassembly performance when redirecting to a file by more than an order of magnitude on both Windows and Linux. This improvement restores the disassembly performance when redirecting to a file to a level similar to before color support was added.
2024-03-19[llvm-objdump][macho] Fix relative method list dumping for little endian ↵alx321-4/+8
hosts (#85778) `macho-relative-method-lists.test` is failing on little endian platforms, when matching 'name'. ``` CHK32-NEXT: name 0x144 (0x{{[0-9a-f]*}}) instance_method_00 next:10'0 X error: no match found 18: name 0x144 (0x7ac) ``` This seems like the obvious fix. Co-authored-by: Alex B <alexborcan@meta.com>
2024-03-16[llvm-objdump][macho] Add support for ObjC relative method lists (#85477)alx321-2/+110
For Mach-O, ld64 supports the -fobjc-relative-method-lists flag which changes the format in which method lists are generated. The format uses delta encoding vs the original direct-pointer encoding. This change adds support to llvm-objdump and llvm-otool for decoding/dumping of method lists in the delta format. Previously, if a binary with this information format was passed to the tooling, it would output invalid information, trying to parse the delta lists as pointer lists. After this change, the tooling will output correct information if a binary in this format is encountered. The output format is closest feasible match to XCode 15.1's otool output. Tests are included for both 32bit and 64bit binaries. The code style was matched as close as possible to existing implementation of parsing non-delta method lists. Diff between llvm-objdump and XCode 15.1 otool: ![image](https://github.com/llvm/llvm-project/assets/103613512/2277e3ff-d59c-4fff-b93a-e0587ee740a6) Note: This is a retry of this PR: https://github.com/llvm/llvm-project/pull/84250 On the original PR, the armv7+armv8 builds were failing due to absolute offsets being different. Co-authored-by: Alex B <alexborcan@meta.com>
2024-03-15Revert "[llvm-objdump][macho] Add support for ObjC relative method lists ↵Kyungwoo Lee1-110/+2
(#84250)" This reverts llvm/llvm-project#84250, commit aa6100643c2c8f9a1b06ba557b68b0fba477e3c7. See build failures: https://lab.llvm.org/buildbot/#/builders/178/builds/7028 https://lab.llvm.org/buildbot/#/builders/182/builds/9282 https://lab.llvm.org/buildbot/#/builders/186/builds/15299 https://lab.llvm.org/buildbot/#/builders/187/builds/14564
2024-03-14[llvm-objdump][macho] Add support for ObjC relative method lists (#84250)alx321-2/+110
For Mach-O, ld64 supports the `-fobjc-relative-method-lists` flag which changes the format in which method lists are generated. The format uses delta encoding vs the original direct-pointer encoding. This change adds support to `llvm-objdump` and `llvm-otool` for decoding/dumping of method lists in the delta format. Previously, if a binary with this information format was passed to the tooling, it would output invalid information, trying to parse the delta lists as pointer lists. After this change, the tooling will output correct information if a binary in this format is encountered. The output format is closest feasible match to XCode 15.1's otool output. Tests are included for both 32bit and 64bit binaries. The code style was matched as close as possible to existing implementation of parsing non-delta method lists. Diff between llvm-objdump and XCode 15.1 otool: ![objdump_vs_otool](https://github.com/llvm/llvm-project/assets/103613512/4fc04228-ed35-473d-b633-364402411b91) --------- Co-authored-by: Alex B <alexborcan@meta.com>
2024-02-27[SHT_LLVM_BB_ADDR_MAP] Adds pretty printing of BFI and BPI for PGO Analysis ↵Micah Weston2-7/+26
Map in tools. (#82292) Primary change is to add a flag `--pretty-pgo-analysis-map` to llvm-readobj and llvm-objdump that prints block frequencies and branch probabilities in the same manner as BFI and BPI respectively. This can be helpful if you are manually inspecting the outputs from the tools. In order to print, I moved the `printBlockFreqImpl` function from Analysis to Support and renamed it to `printRelativeBlockFreq`.
2024-02-20[llvm-objdump] Add support for the PT_OPENBSD_SYSCALLS segment type. (#82121)Frederic Cambus1-0/+3
Reference: https://github.com/openbsd/src/blob/master/sys/sys/exec_elf.h
2024-02-09Fix 01706e7 on 32-bit platformsDerek Schuff1-1/+2
Make the type match the printf format.
2024-02-09[llvm-nm][WebAssembly] Print function symbol sizes (#81315)Derek Schuff1-0/+3
nm already prints sizes for data symbols. Do that for function symbols too, and update objdump to also print size information. Implements item 3 from https://github.com/llvm/llvm-project/issues/76107
2024-02-07[Object][Wasm] Use file offset for section addresses in linked wasm files ↵Derek Schuff1-3/+13
(#80529) Wasm has no unified virtual memory space as other object formats and architectures do, so previously WasmObjectFile reported 0 for all section addresses, and until 428cf71ff used section offsets for function symbols. Now we use file offsets for function symbols, and this change switches section addresses to do the same (in linked files). The main result of this is that objdump now reports VMAs in section listings, and also uses file offets rather than section offsets when disassembling linked binaries (matching the behavior of other disassemblers and stack traces produced by browwsers). To make this work, this PR also updates objdump's generation of synthetics fallback symbols to match lib/Object and also correctly plumbs symbol types for regular and dummy symbols through to the backend to avoid needing special knowledge of address 0. This also paves the way for generating symbols from name sections rather than symbol tables or imports (see #76107) by allowing the disassembler's synthetic fallback symbols match the name-section generated symbols (in a followup PR).
2024-02-01[SHT_LLVM_BB_ADDR_MAP] Allow basic-block-sections and labels be used ↵Rahman Lavaee1-74/+132
together by decoupling the handling of the two features. (#74128) Today `-split-machine-functions` and `-fbasic-block-sections={all,list}` cannot be combined with `-basic-block-sections=labels` (the labels option will be ignored). The inconsistency comes from the way basic block address map -- the underlying mechanism for basic block labels -- encodes basic block addresses (https://lists.llvm.org/pipermail/llvm-dev/2020-July/143512.html). Specifically, basic block offsets are computed relative to the function begin symbol. This relies on functions being contiguous which is not the case for MFS and basic block section binaries. This means Propeller cannot use binary profiles collected from these binaries, which limits the applicability of Propeller for iterative optimization. To make the `SHT_LLVM_BB_ADDR_MAP` feature work with basic block section binaries, we propose modifying the encoding of this section as follows. First let us review the current encoding which emits the address of each function and its number of basic blocks, followed by basic block entries for each basic block. | | | |--|--| | Address of the function | Function Address | | Number of basic blocks in this function | NumBlocks | | BB entry 1 | BB entry 2 | ... | BB entry #NumBlocks To make this work for basic block sections, we treat each basic block section similar to a function, except that basic block sections of the same function must be encapsulated in the same structure so we can map all of them to their single function. We modify the encoding to first emit the number of basic block sections (BB ranges) in the function. Then we emit the address map of each basic block section section as before: the base address of the section, its number of blocks, and BB entries for its basic block. The first section in the BB address map is always the function entry section. | | | |--|--| | Number of sections for this function | NumBBRanges | | Section 1 begin address | BaseAddress[1] | | Number of basic blocks in section 1 | NumBlocks[1] | | BB entries for Section 1 |..................| | Section #NumBBRanges begin address | BaseAddress[NumBBRanges] | | Number of basic blocks in section #NumBBRanges | NumBlocks[NumBBRanges] | | BB entries for Section #NumBBRanges The encoding of basic block entries remains as before with the minor change that each basic block offset is now computed relative to the begin symbol of its containing BB section. This patch adds a new boolean codegen option `-basic-block-address-map`. Correspondingly, the front-end flag `-fbasic-block-address-map` and LLD flag `--lto-basic-block-address-map` are introduced. Analogously, we add a new TargetOption field `BBAddrMap`. This means BB address maps are either generated for all functions in the compiling unit, or for none (depending on `TargetOptions::BBAddrMap`). This patch keeps the functionality of the old `-fbasic-block-sections=labels` option but does not remove it. A subsequent patch will remove the obsolete option. We refactor the `BasicBlockSections` pass by separating the BB address map and BB sections handing to their own functions (named `handleBBAddrMap` and `handleBBSections`). `handleBBSections` renumbers basic blocks and places them in their assigned sections. `handleBBAddrMap` is invoked after `handleBBSections` (if requested) and only renumbers the blocks. - New tests added: - Two tests basic-block-address-map-with-basic-block-sections.ll and basic-block-address-map-with-mfs.ll to exercise the combination of `-basic-block-address-map` with `-basic-block-sections=list` and '-split-machine-functions`. - A driver sanity test for the `-fbasic-block-address-map` option (basic-block-address-map.c). - An LLD test for testing the `--lto-basic-block-address-map` option. This reuses the LLVM IR from `lld/test/ELF/lto/basic-block-sections.ll`. - Renamed and modified the two existing codegen tests for basic block address map (`basic-block-sections-labels-functions-sections.ll` and `basic-block-sections-labels.ll`) - Removed `SHT_LLVM_BB_ADDR_MAP_V0` tests. Full deprecation of `SHT_LLVM_BB_ADDR_MAP_V0` and `SHT_LLVM_BB_ADDR_MAP` version less than 2 will happen in a separate PR in a few months.
2024-02-01[llvm-objdump][AMDGPU] Pass ELF ABIVersion through disassembler (#78907)Emma Pilkington1-0/+3
Admittedly, its a bit ugly to pass the ABIVersion through onSymbolStart but I'm not sure what a better place for it would be.
2024-01-25[llvm-objdump,SHT_LLVM_BB_ADDR_MAP,NFC] Use auto && instead of const auto & ↵Rahman Lavaee1-1/+1
to allow moving from BBAddrMap objects. (#79456) std::move on `const auto &` references is essentially a noop. Changing to `auto &&` to actually allow moving.
2024-01-19[llvm-objdump] Add support for symbolizing PGOBBAddrMap Info (#76386)Aiden Grossman1-17/+83
This patch adds in support for symbolizing PGO information contained within the SHT_LLVM_BB_ADDR_MAP section in llvm-objdump. The outputs are simply the raw values contained within the section.
2024-01-11[llvm-driver] Fix usage of `InitLLVM` on Windows (#76306)Alexandre Ganea1-2/+0
Previously, some tools such as `clang` or `lld` which require strict order for certain command-line options, such as `clang -cc1` or `lld -flavor`, would not longer work on Windows, when these tools were linked as part of `llvm-driver`. This was caused by `InitLLVM` which was part of the `*_main()` function of these tools, which in turn calls `windows::GetCommandLineArguments`. That function completly replaces argc/argv by new UTF-8 contents, so any ajustements to argc/argv made by `llvm-driver` prior to calling these tools was reset. `InitLLVM` is now called by the `llvm-driver`. Any tool that participates in (or is part of) the `llvm-driver` doesn't call `InitLLVM` anymore.
2023-12-21[XCOFF] Use RLDs to print branches even without -r (#74342)stephenpeckham3-50/+123
This presents misleading and confusing output. If you have a function defined at the beginning of an XCOFF object file, and you have a function call to an external function, the function call disassembles as a branch to the local function. That is, `void f() { f(); g();}` disassembles as >00000000 <.f>: 0: 7c 08 02 a6 mflr 0 4: 94 21 ff c0 stwu 1, -64(1) 8: 90 01 00 48 stw 0, 72(1) c: 4b ff ff f5 bl 0x0 <.f> 10: 4b ff ff f1 bl 0x0 <.f> With this PR, the second call will display: `10: 4b ff ff f1 bl 0x0 <.g> ` Using -r can help, but you still get the confusing output: >10: 4b ff ff f1 bl 0x0 <.f> 00000010: R_RBR .g
2023-12-19[llvm-objdump] Add -mllvm (#75892)Fangrui Song2-4/+10
When llvm-objdump switched from cl:: to OptTable (https://reviews.llvm.org/D100433), we dropped support for LLVM cl:: options. Some LLVM_DEBUG in `llvm/lib/Target/$target/MCDisassembler/` files might be useful. Add -mllvm to allow dumping the information. ``` # -debug is available in an LLVM_ENABLE_ASSERTIONS=on build llvm-objdump -d -mllvm -debug a.o > /dev/null ``` Link: https://discourse.llvm.org/t/how-to-enable-debug-logs-in-llvm-objdump/75758
2023-12-18[llvm-objdump] --disassemble-symbols: skip inline relocs from symbols that ↵Fangrui Song1-1/+8
are not dumped (#75724) When a section contains two functions x1 and x2, we incorrectly display x1's relocations when dumping x2 for `--disassemble-symbols=x2 -r`. Fix #75539 by ignoring these relocations.
2023-12-11[llvm] Use StringRef::{starts,ends}_with (NFC) (#74956)Kazu Hirata4-5/+5
This patch replaces uses of StringRef::{starts,ends}with with StringRef::{starts,ends}_with for consistency with std::{string,string_view}::{starts,ends}_with in C++20. I'm planning to deprecate and eventually remove StringRef::{starts,ends}with.
2023-12-02[llvm-objdump] Stop including llvm/ADT/IndexedMap.h (NFC)Kazu Hirata1-1/+0
Identified with clangd.
2023-11-27[llvm-objdump] Fix lma display issue for non-bss sections (#72141)Jason Liu1-2/+4
llvm-readobj and llvm-objdump have inconsistent handling of display lma for sections. This patch tries to common code up and adapt the same approach for both tools.
2023-11-17[NFC][SHT_LLVM_BB_ADDR_MAP] Define and use constructor and accessors for ↵Rahman Lavaee1-2/+2
BBAddrMap fields. (#72689) The fields are still kept as public for now since our tooling accesses them. Will change them to private visibility in a later patch.
2023-11-15[NFC] Rename variable to better document usage. (#71973)stephenpeckham1-5/+5
Change variable DisassembleAsData to DisassembleAsELFData so that its name better matches its usage.
2023-11-14[llvm] Add missing include for std::set after 01702c3f7f1a (#72161)Mike Hommey1-0/+1
Cc: @kazutakahirata
2023-11-11[llvm] Stop including llvm/ADT/SmallSet.h (NFC)Kazu Hirata1-1/+0
Identified with clangd.
2023-10-20[RISCV][MC] Implement evaluateBranch for auipc+jalr pairs (#65480)Job Noorman1-0/+4
This patch implements `MCInstrAnalysis` state in order to be able analyze auipc+jalr pairs inside `evaluateBranch`. This is implemented as follows: - State: array of currently known GPR values; - Whenever an auipc is detected in `updateState`, update the state value of RD with the immediate; - Whenever a jalr is detected in `evaluateBranch`, check if the state holds a value for RS1 and use that to compute its target. Note that this is similar to how binutils implements it and the output of llvm-objdump should now mostly match the one of GNU objdump. This patch also updates the relevant llvm-objdump patches and adds a new one testing the output for interleaved auipc+jalr pairs.
2023-10-20[MC][NFC] Allow MCInstrAnalysis to store state (#65479)Job Noorman1-5/+16
Currently, all the analysis functions provided by `MCInstrAnalysis` work on a single instruction. On some targets, this limits the kind of instructions that can be successfully analyzed as common constructs may need multiple instructions. For example, a typical call sequence on RISC-V uses a auipc+jalr pair. In order to analyse the jalr inside `evaluateBranch`, information about the corresponding auipc is needed. Similarly, AArch64 uses adrp+ldr pairs to access globals. This patch proposes to add state to `MCInstrAnalysis` to support these use cases. Two new virtual methods are added: - `updateState`: takes an instruction and its address. This methods should be called by clients on every instruction and allows targets to store whatever information they need to analyse future instructions. - `resetState`: clears the state whenever it becomes irrelevant. Clients could call this, for example, when starting to disassemble a new function. Note that the default implementations do nothing so this patch is NFC. No actual state is stored inside `MCInstrAnalysis`; deciding the structure of the state is left to the targets. This patch also modifies llvm-objdump to use the new interface. This patch is an alternative to [D116677](https://reviews.llvm.org/D116677) and the idea of storing state in `MCInstrAnalysis` was first discussed there.
2023-10-12Use llvm::endianness::{big,little,native} (NFC)Kazu Hirata1-3/+4
Note that llvm::support::endianness has been renamed to llvm::endianness while becoming an enum class as opposed to an enum. This patch replaces support::{big,little,native} with llvm::endianness::{big,little,native}.
2023-10-10Use llvm::endianness::{big,little,native} (NFC)Kazu Hirata2-8/+7
Note that llvm::support::endianness has been renamed to llvm::endianness while becoming an enum class as opposed to an enum. This patch replaces llvm::support::{big,little,native} with llvm::endianness::{big,little,native}.
2023-10-10Use llvm::endianness (NFC)Kazu Hirata1-1/+1
Now that llvm::support::endianness has been renamed to llvm::endianness, we can use the shorter form. This patch replaces support::endianness with llvm::endianness.
2023-10-10[llvm] Drop unaligned from calls to llvm::support::endian::{read,write} (NFC)Kazu Hirata1-3/+1
The last template parameter of llvm::support::endian::{read,write} defaults to unaligned, so we can drop that at call sites.
2023-10-09[llvm][objdump] Remove support for printing the embedded Bitcode section in ↵Juergen Ributzka2-422/+0
MachO files. (#68457) It's no longer possible to submit bitcode apps to the Apple App Store. The tools used to create xar archived bitcode sections inside MachO files have been discontinued. Additionally, the xar APIs have been deprecated since macOS 12, so this change removes unnecessary code from objdump and all dependencies on libxar. This fixes rdar://116600767
2023-10-09Use llvm::endianness{,::little,::native} (NFC)Kazu Hirata1-2/+2
Now that llvm::support::endianness has been renamed to llvm::endianness, we can use the shorter form. This patch replaces llvm::support::endianness with llvm::endianness.
2023-09-22[llvm-objdump] Add support for the PT_OPENBSD_NOBTCFI segment type. (#67127)Frederic Cambus1-0/+3
Reference: https://github.com/openbsd/src/blob/master/sys/sys/exec_elf.h
2023-09-21[BPF][DebugInfo] Show CO-RE relocations in llvm-objdumpEduard Zingerman2-0/+31
Extend llvm-objdump to show CO-RE relocations when `-r` option is passed and object file has .BTF and .BTF.ext sections. For example, the following C program: #define __pai __attribute__((preserve_access_index)) struct foo { int i; int j;} __pai; struct bar { struct foo f[7]; } __pai; extern void sink(void *); void root(struct bar *bar) { sink(&bar[2].f[3].j); } Should lead to the following objdump output: $ clang --target=bpf -O2 -g t.c -c -o - | \ llvm-objdump --no-addresses --no-show-raw-insn -dr - ... r2 = 0x94 CO-RE <byte_off> [2] struct bar::[2].f[3].j (2:0:3:1) r1 += r2 call -0x1 R_BPF_64_32 sink exit ... More examples could be found in unit tests, see BTFParserTest.cpp. To achieve this: - Move CO-RE relocation kinds definitions from BPFCORE.h to BTF.h. - Extend BTF.h with types derived from BTF::CommonType, e.g. BTF::IntType and BTF::StrutType, to allow dyn_cast() and access to type additional data. - Extend BTFParser to load BTF type and relocation data. - Modify llvm-objdump.cpp to create instance of BTFParser when disassembly of object file with BTF sections is processed and `-r` flag is supplied. Additional information about CO-RE is available at [1]. [1] https://docs.kernel.org/bpf/llvm_reloc.html Depends on D149058 Differential Revision: https://reviews.llvm.org/D150079
2023-09-11[llvm-objdump] --adjust-vma adjust symbol tableShivam Gupta1-0/+3
Add a shouldAdjustVA(Section) guard on top of address update. Update llvm-objdump file to update symbol table when --adjust-vma used. Fixes #63203 Patch by HamidrezaSK (Hamidreza Sanaee)
2023-09-01[llvm-objdump] Enable disassembly color highlightingJonas Devlieghere2-0/+43
Enable color highlighting of disassembly in llvm-objdump. This patch introduces a new flag --disassembler-color=<mode> that enables or disables highlighting disassembly with ANSI escape codes. The default mode is to enable color highlighting if outputting to a color-enabled terminal. Differential revision: https://reviews.llvm.org/D159224
2023-08-17[llvm-{debuginfod,ml,objdump,symbolizer}, dsymutil] Enable multicall driverAndrés Villegas2-3/+7
Differential Revision: https://reviews.llvm.org/D157670
2023-08-17Revert "[llvm-{debuginfod,ml,objdump,symbolizer}, dsymutil] Enable multicall ↵Petr Hosek2-7/+3
driver" This reverts commit 2628fa3351b021d2ab82dcd833a14d7b52840a01 since it broke the multicall driver build.
2023-08-17[llvm-{debuginfod,ml,objdump,symbolizer}, dsymutil] Enable multicall driverAndrés Villegas2-3/+7
Differential Revision: https://reviews.llvm.org/D157670
2023-08-15[llvm-objdump] Support CHPE code ranges in disassembler.Jacek Caban1-2/+61
Reviewed By: jhenderson, MaskRay Differential Revision: https://reviews.llvm.org/D149095
2023-08-14[llvm-objdump] Add WarningHandler as a member variable. NFCFangrui Song3-14/+20
This can be used to avoid `auto WarningHandler = ...`. Similar to llvm-readobj.
2023-08-13[llvm-objdump,llvm-symbolizer] Remove unused ExitOnErr after D136702. NFCFangrui Song1-1/+0
2023-08-04[llvm] Extract common `OptTable` bits into macrosJan Svoboda2-18/+7
All command-line tools using `llvm::opt` create an enum of option IDs and a table of `OptTable::Info` object. Most of the tools use the same ID (`OPT_##ID`), kind (`Option::KIND##Class`), group ID (`OPT_##GROUP`) and alias ID (`OPT_##ALIAS`). This patch extracts that common code into canonical macros. This results in fewer changes when tweaking the `OPTION` macros emitted by the TableGen backend. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D157028
2023-08-02Revert "[llvm-objdump] [NFC] Use a single vector to store all symbol mappings."Jacek Caban1-13/+17
Breaks CSKY tests. This reverts commit 948f205ae1a0135eda3eeff0e123d70732d271d5.