aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-objdump/llvm-objdump.cpp
diff options
context:
space:
mode:
authorAndy Wingo <wingo@igalia.com>2021-07-07 11:13:13 +0200
committerAndy Wingo <wingo@igalia.com>2021-07-19 08:59:26 +0200
commitdb69ea40a91a683a4b1a2d581c5b5a2b46154677 (patch)
tree8c7766b79e417e63f1722a48e2b6079c84b686d7 /llvm/tools/llvm-objdump/llvm-objdump.cpp
parent4504e1134c9118f3c322685f8a90129e09bab92c (diff)
downloadllvm-db69ea40a91a683a4b1a2d581c5b5a2b46154677.zip
llvm-db69ea40a91a683a4b1a2d581c5b5a2b46154677.tar.gz
llvm-db69ea40a91a683a4b1a2d581c5b5a2b46154677.tar.bz2
[llvm-objdump][WebAssembly] Fix llvm-objdump on files without symbols
If a file has no symbols, perhaps because it is a linked executable, synthesize some symbols by walking the code section. Otherwise the disassembler will try to treat the whole code section as a function, which won't parse. Fixes https://bugs.llvm.org/show_bug.cgi?id=50957. Differential Revision: https://reviews.llvm.org/D105539
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r--llvm/tools/llvm-objdump/llvm-objdump.cpp40
1 files changed, 40 insertions, 0 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 39ce32d..48ae92f 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -736,6 +736,43 @@ addDynamicElfSymbols(const ObjectFile *Obj,
llvm_unreachable("Unsupported binary format");
}
+static Optional<SectionRef> getWasmCodeSection(const WasmObjectFile *Obj) {
+ for (auto SecI : Obj->sections()) {
+ const WasmSection &Section = Obj->getWasmSection(SecI);
+ if (Section.Type == wasm::WASM_SEC_CODE)
+ return SecI;
+ }
+ return None;
+}
+
+static void
+addMissingWasmCodeSymbols(const WasmObjectFile *Obj,
+ std::map<SectionRef, SectionSymbolsTy> &AllSymbols) {
+ Optional<SectionRef> Section = getWasmCodeSection(Obj);
+ if (!Section)
+ return;
+ SectionSymbolsTy &Symbols = AllSymbols[*Section];
+
+ std::set<uint64_t> SymbolAddresses;
+ for (const auto &Sym : Symbols)
+ SymbolAddresses.insert(Sym.Addr);
+
+ for (const wasm::WasmFunction &Function : Obj->functions()) {
+ uint64_t Address = Function.CodeSectionOffset;
+ // Only add fallback symbols for functions not already present in the symbol
+ // table.
+ if (SymbolAddresses.count(Address))
+ continue;
+ // This function has no symbol, so it should have no SymbolName.
+ assert(Function.SymbolName.empty());
+ // We use DebugName for the name, though it may be empty if there is no
+ // "name" custom section, or that section is missing a name for this
+ // function.
+ StringRef Name = Function.DebugName;
+ Symbols.emplace_back(Address, Name, ELF::STT_NOTYPE);
+ }
+}
+
static void addPltEntries(const ObjectFile *Obj,
std::map<SectionRef, SectionSymbolsTy> &AllSymbols,
StringSaver &Saver) {
@@ -1126,6 +1163,9 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj,
if (AllSymbols.empty() && Obj->isELF())
addDynamicElfSymbols(Obj, AllSymbols);
+ if (Obj->isWasm())
+ addMissingWasmCodeSymbols(cast<WasmObjectFile>(Obj), AllSymbols);
+
BumpPtrAllocator A;
StringSaver Saver(A);
addPltEntries(Obj, AllSymbols, Saver);