summaryrefslogtreecommitdiff
path: root/src/binary-reader-objdump.cc
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2018-03-05 14:03:02 -0800
committerGitHub <noreply@github.com>2018-03-05 14:03:02 -0800
commite7934efa2eafb9138f0154565452b4f67e7b4f89 (patch)
tree8908517c240f41e47ab644236a065742ea16a01c /src/binary-reader-objdump.cc
parentc3ead8a2a892ca5a1cf7a9bb5781ae6dc1076aad (diff)
downloadwabt-e7934efa2eafb9138f0154565452b4f67e7b4f89.tar.gz
wabt-e7934efa2eafb9138f0154565452b4f67e7b4f89.tar.bz2
wabt-e7934efa2eafb9138f0154565452b4f67e7b4f89.zip
Add support for new symbol table format (#769)
Diffstat (limited to 'src/binary-reader-objdump.cc')
-rw-r--r--src/binary-reader-objdump.cc143
1 files changed, 124 insertions, 19 deletions
diff --git a/src/binary-reader-objdump.cc b/src/binary-reader-objdump.cc
index b84a4691..dd01b7af 100644
--- a/src/binary-reader-objdump.cc
+++ b/src/binary-reader-objdump.cc
@@ -49,6 +49,7 @@ class BinaryReaderObjdumpBase : public BinaryReaderNop {
protected:
const char* GetFunctionName(Index index) const;
+ const char* GetGlobalName(Index index) const;
void PrintRelocation(const Reloc& reloc, Offset offset) const;
Offset GetSectionStart(BinarySection section_code) const {
return section_starts_[static_cast<size_t>(section_code)];
@@ -124,6 +125,15 @@ const char* BinaryReaderObjdumpBase::GetFunctionName(Index index) const {
return objdump_state_->function_names[index].c_str();
}
+const char* BinaryReaderObjdumpBase::GetGlobalName(Index index) const {
+ if (index >= objdump_state_->global_names.size() ||
+ objdump_state_->global_names[index].empty()) {
+ return nullptr;
+ }
+
+ return objdump_state_->global_names[index].c_str();
+}
+
void BinaryReaderObjdumpBase::PrintRelocation(const Reloc& reloc,
Offset offset) const {
printf(" %06" PRIzx ": %-18s %" PRIindex "", offset,
@@ -157,19 +167,43 @@ class BinaryReaderObjdumpPrepass : public BinaryReaderObjdumpBase {
public:
using BinaryReaderObjdumpBase::BinaryReaderObjdumpBase;
- Result OnFunctionName(Index function_index,
- string_view function_name) override;
+ Result OnFunctionName(Index index, string_view name) override {
+ SetFunctionName(index, name);
+ return Result::Ok;
+ }
+
+ Result OnFunctionSymbol(Index index,
+ uint32_t flags,
+ string_view name,
+ Index func_index) override {
+ if (!name.empty()) {
+ SetFunctionName(func_index, name);
+ }
+ return Result::Ok;
+ }
+
+ Result OnImportFunc(Index import_index,
+ string_view module_name,
+ string_view field_name,
+ Index func_index,
+ Index sig_index) override {
+ SetFunctionName(func_index, field_name);
+ return Result::Ok;
+ }
+
Result OnReloc(RelocType type,
Offset offset,
Index index,
uint32_t addend) override;
+
+ protected:
+ void SetFunctionName(Index index, string_view name);
};
-Result BinaryReaderObjdumpPrepass::OnFunctionName(Index index,
- string_view name) {
+void BinaryReaderObjdumpPrepass::SetFunctionName(Index index,
+ string_view name) {
objdump_state_->function_names.resize(index + 1);
objdump_state_->function_names[index] = name.to_string();
- return Result::Ok;
}
Result BinaryReaderObjdumpPrepass::OnReloc(RelocType type,
@@ -550,8 +584,21 @@ class BinaryReaderObjdump : public BinaryReaderObjdumpBase {
uint32_t addend) override;
Result OnStackGlobal(Index stack_global) override;
- Result OnSymbolInfoCount(Index count) override;
- Result OnSymbolInfo(string_view name, uint32_t flags) override;
+ Result OnSymbolCount(Index count) override;
+ Result OnDataSymbol(Index index,
+ uint32_t flags,
+ string_view name,
+ Index segment,
+ uint32_t offset,
+ uint32_t size) override;
+ Result OnFunctionSymbol(Index index,
+ uint32_t flags,
+ string_view name,
+ Index func_index) override;
+ Result OnGlobalSymbol(Index index,
+ uint32_t flags,
+ string_view name,
+ Index global_index) override;
Result OnDataSize(uint32_t data_size) override;
Result OnSegmentInfoCount(Index count) override;
Result OnSegmentInfo(Index index,
@@ -567,6 +614,7 @@ class BinaryReaderObjdump : public BinaryReaderObjdumpBase {
private:
bool ShouldPrintDetails();
void PrintDetails(const char* fmt, ...);
+ void PrintSymbolFlags(uint32_t flags);
void PrintInitExpr(const InitExpr& expr);
Result OnCount(Index count);
@@ -1098,9 +1146,13 @@ Result BinaryReaderObjdump::OnReloc(RelocType type,
Index index,
uint32_t addend) {
Offset total_offset = GetSectionStart(reloc_section_) + offset;
- PrintDetails(" - %-18s offset=%#08" PRIoffset "(file=%#08" PRIoffset
- ") index=%" PRIindex,
- GetRelocTypeName(type), offset, total_offset, index);
+ PrintDetails(" - %-18s offset=%#08" PRIoffset "(file=%#08" PRIoffset ") ",
+ GetRelocTypeName(type), offset, total_offset);
+ if (type == RelocType::TypeIndexLEB)
+ PrintDetails("type=%" PRIindex, index);
+ else
+ PrintDetails("symbol=%" PRIindex, index);
+
if (addend) {
int32_t signed_addend = static_cast<int32_t>(addend);
if (signed_addend < 0) {
@@ -1120,28 +1172,81 @@ Result BinaryReaderObjdump::OnStackGlobal(Index stack_global) {
return Result::Ok;
}
-Result BinaryReaderObjdump::OnSymbolInfoCount(Index count) {
- PrintDetails(" - symbol info [count=%d]\n", count);
+Result BinaryReaderObjdump::OnSymbolCount(Index count) {
+ PrintDetails(" - symbol table [count=%d]\n", count);
return Result::Ok;
}
-Result BinaryReaderObjdump::OnSymbolInfo(string_view name, uint32_t flags) {
+void BinaryReaderObjdump::PrintSymbolFlags(uint32_t flags) {
const char* binding_name = nullptr;
- SymbolBinding binding = static_cast<SymbolBinding>(flags & 0x3);
+ SymbolBinding binding =
+ static_cast<SymbolBinding>(flags & WABT_SYMBOL_MASK_BINDING);
switch (binding) {
case SymbolBinding::Global:
- binding_name = "GLOBAL";
+ binding_name = "global";
break;
case SymbolBinding::Local:
- binding_name = "LOCAL ";
+ binding_name = "local";
break;
case SymbolBinding::Weak:
- binding_name = "WEAK ";
+ binding_name = "weak";
break;
}
- PrintDetails(" - %s <" PRIstringview ">\n", binding_name,
- WABT_PRINTF_STRING_VIEW_ARG(name));
+ const char* vis_name = nullptr;
+ SymbolVisibility vis =
+ static_cast<SymbolVisibility>(flags & WABT_SYMBOL_MASK_VISIBILITY);
+ switch (vis) {
+ case SymbolVisibility::Hidden:
+ vis_name = "hidden";
+ break;
+ case SymbolVisibility::Default:
+ vis_name = "default";
+ break;
+ }
+ PrintDetails(" binding=%s vis=%s\n", binding_name, vis_name);
+}
+
+Result BinaryReaderObjdump::OnDataSymbol(Index index,
+ uint32_t flags,
+ string_view name,
+ Index segment,
+ uint32_t offset,
+ uint32_t size) {
+ PrintDetails(" - sym[%d] <" PRIstringview "> segment=%" PRIindex
+ " offset=%d size=%d",
+ index, WABT_PRINTF_STRING_VIEW_ARG(name), segment, offset, size);
+ PrintSymbolFlags(flags);
+ return Result::Ok;
+}
+
+Result BinaryReaderObjdump::OnFunctionSymbol(Index index,
+ uint32_t flags,
+ string_view name,
+ Index func_index) {
+ std::string sym_name = name.to_string();
+ if (sym_name.empty()) {
+ sym_name = GetFunctionName(func_index);
+ }
+ assert(!sym_name.empty());
+ PrintDetails(" - sym[%d] <" PRIstringview "> func=%" PRIindex, index,
+ WABT_PRINTF_STRING_VIEW_ARG(sym_name), func_index);
+ PrintSymbolFlags(flags);
+ return Result::Ok;
+}
+
+Result BinaryReaderObjdump::OnGlobalSymbol(Index index,
+ uint32_t flags,
+ string_view name,
+ Index global_index) {
+ std::string sym_name = name.to_string();
+ if (sym_name.empty()) {
+ sym_name = GetGlobalName(global_index);
+ }
+ assert(!sym_name.empty());
+ PrintDetails(" - sym[%d] <" PRIstringview "> global=%" PRIindex, index,
+ WABT_PRINTF_STRING_VIEW_ARG(sym_name), global_index);
+ PrintSymbolFlags(flags);
return Result::Ok;
}