From e450bd7a9df10e1bea28df47c7871e712d070e1d Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Thu, 7 Feb 2019 01:17:34 +0000 Subject: [PATCH] [WebAssembly] Expand symbol flags shown by llvm-objdump --symbols Differential Revision: https://reviews.llvm.org/D57861 llvm-svn: 353357 --- llvm/test/MC/WebAssembly/basic-assembly.s | 4 +-- llvm/test/MC/WebAssembly/debug-info.ll | 32 ++++++++++++++++------ llvm/test/MC/WebAssembly/function-alias.ll | 9 ++++-- llvm/tools/llvm-readobj/WasmDumper.cpp | 15 +++++++++- 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/llvm/test/MC/WebAssembly/basic-assembly.s b/llvm/test/MC/WebAssembly/basic-assembly.s index 85da7819f9b9..ab2925891520 100644 --- a/llvm/test/MC/WebAssembly/basic-assembly.s +++ b/llvm/test/MC/WebAssembly/basic-assembly.s @@ -1,6 +1,6 @@ # RUN: llvm-mc -triple=wasm32-unknown-unknown -mattr=+unimplemented-simd128,+nontrapping-fptoint,+exception-handling < %s | FileCheck %s -# this one is just here to see if it converts to .o without errors, but doesn't check any output: -# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj -mattr=+unimplemented-simd128,+nontrapping-fptoint,+exception-handling < %s +# Check that it converts to .o without errors, but don't check any output: +# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj -mattr=+unimplemented-simd128,+nontrapping-fptoint,+exception-handling -o %t.o < %s test0: # Test all types: diff --git a/llvm/test/MC/WebAssembly/debug-info.ll b/llvm/test/MC/WebAssembly/debug-info.ll index 55b9eac93824..a0f93fe18d4d 100644 --- a/llvm/test/MC/WebAssembly/debug-info.ll +++ b/llvm/test/MC/WebAssembly/debug-info.ll @@ -165,13 +165,17 @@ ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: f2 ; CHECK-NEXT: Type: FUNCTION (0x0) -; CHECK-NEXT: Flags: 0x4 +; CHECK-NEXT: Flags [ (0x4) +; CHECK-NEXT: VISIBILITY_HIDDEN (0x4) +; CHECK-NEXT: ] ; CHECK-NEXT: ElementIndex: 0x0 ; CHECK-NEXT: } ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: foo ; CHECK-NEXT: Type: DATA (0x1) -; CHECK-NEXT: Flags: 0x4 +; CHECK-NEXT: Flags [ (0x4) +; CHECK-NEXT: VISIBILITY_HIDDEN (0x4) +; CHECK-NEXT: ] ; CHECK-NEXT: Offset: 0x0 ; CHECK-NEXT: Segment: 0x0 ; CHECK-NEXT: Size: 0x4 @@ -179,13 +183,17 @@ ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: myextern ; CHECK-NEXT: Type: DATA (0x1) -; CHECK-NEXT: Flags: 0x10 +; CHECK-NEXT: Flags [ (0x10) +; CHECK-NEXT: UNDEFINED (0x10) +; CHECK-NEXT: ] ; CHECK-NEXT: Module: ; CHECK-NEXT: } ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: ptr2 ; CHECK-NEXT: Type: DATA (0x1) -; CHECK-NEXT: Flags: 0x4 +; CHECK-NEXT: Flags [ (0x4) +; CHECK-NEXT: VISIBILITY_HIDDEN (0x4) +; CHECK-NEXT: ] ; CHECK-NEXT: Offset: 0x0 ; CHECK-NEXT: Segment: 0x1 ; CHECK-NEXT: Size: 0x4 @@ -193,25 +201,33 @@ ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: .debug_str ; CHECK-NEXT: Type: SECTION (0x3) -; CHECK-NEXT: Flags: 0x2 +; CHECK-NEXT: Flags [ (0x2) +; CHECK-NEXT: BINDING_LOCAL (0x2) +; CHECK-NEXT: ] ; CHECK-NEXT: ElementIndex: 0x6 ; CHECK-NEXT: } ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: .debug_abbrev ; CHECK-NEXT: Type: SECTION (0x3) -; CHECK-NEXT: Flags: 0x2 +; CHECK-NEXT: Flags [ (0x2) +; CHECK-NEXT: BINDING_LOCAL (0x2) +; CHECK-NEXT: ] ; CHECK-NEXT: ElementIndex: 0x7 ; CHECK-NEXT: } ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: .debug_info ; CHECK-NEXT: Type: SECTION (0x3) -; CHECK-NEXT: Flags: 0x2 +; CHECK-NEXT: Flags [ (0x2) +; CHECK-NEXT: BINDING_LOCAL (0x2) +; CHECK-NEXT: ] ; CHECK-NEXT: ElementIndex: 0x8 ; CHECK-NEXT: } ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: .debug_line ; CHECK-NEXT: Type: SECTION (0x3) -; CHECK-NEXT: Flags: 0x2 +; CHECK-NEXT: Flags [ (0x2) +; CHECK-NEXT: BINDING_LOCAL (0x2) +; CHECK-NEXT: ] ; CHECK-NEXT: ElementIndex: 0xC ; CHECK-NEXT: } ; CHECK-NEXT:] diff --git a/llvm/test/MC/WebAssembly/function-alias.ll b/llvm/test/MC/WebAssembly/function-alias.ll index d4ed06f2e4b8..0a3c53989bc5 100644 --- a/llvm/test/MC/WebAssembly/function-alias.ll +++ b/llvm/test/MC/WebAssembly/function-alias.ll @@ -14,19 +14,22 @@ define i8* @func() { ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: func ; CHECK-NEXT: Type: FUNCTION (0x0) -; CHECK-NEXT: Flags: 0x0 +; CHECK-NEXT: Flags [ (0x0) +; CHECK-NEXT: ] ; CHECK-NEXT: ElementIndex: 0x0 ; CHECK-NEXT: } ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: foo ; CHECK-NEXT: Type: FUNCTION (0x0) -; CHECK-NEXT: Flags: 0x0 +; CHECK-NEXT: Flags [ (0x0) +; CHECK-NEXT: ] ; CHECK-NEXT: ElementIndex: 0x0 ; CHECK-NEXT: } ; CHECK-NEXT: Symbol { ; CHECK-NEXT: Name: bar ; CHECK-NEXT: Type: FUNCTION (0x0) -; CHECK-NEXT: Flags: 0x0 +; CHECK-NEXT: Flags [ (0x0) +; CHECK-NEXT: ] ; CHECK-NEXT: ElementIndex: 0x0 ; CHECK-NEXT: } ; CHECK-NEXT: ] diff --git a/llvm/tools/llvm-readobj/WasmDumper.cpp b/llvm/tools/llvm-readobj/WasmDumper.cpp index e8440f6f8deb..42851ab68320 100644 --- a/llvm/tools/llvm-readobj/WasmDumper.cpp +++ b/llvm/tools/llvm-readobj/WasmDumper.cpp @@ -40,6 +40,18 @@ static const EnumEntry WasmSectionTypes[] = { #undef ENUM_ENTRY }; +static const EnumEntry WasmSymbolFlags[] = { +#define ENUM_ENTRY(X) \ + { #X, wasm::WASM_SYMBOL_##X } + ENUM_ENTRY(BINDING_GLOBAL), + ENUM_ENTRY(BINDING_WEAK), + ENUM_ENTRY(BINDING_LOCAL), + ENUM_ENTRY(VISIBILITY_DEFAULT), + ENUM_ENTRY(VISIBILITY_HIDDEN), + ENUM_ENTRY(UNDEFINED), +#undef ENUM_ENTRY +}; + class WasmDumper : public ObjDumper { public: WasmDumper(const WasmObjectFile *Obj, ScopedPrinter &Writer) @@ -209,7 +221,8 @@ void WasmDumper::printSymbol(const SymbolRef &Sym) { WasmSymbol Symbol = Obj->getWasmSymbol(Sym.getRawDataRefImpl()); W.printString("Name", Symbol.Info.Name); W.printEnum("Type", Symbol.Info.Kind, makeArrayRef(WasmSymbolTypes)); - W.printHex("Flags", Symbol.Info.Flags); + W.printFlags("Flags", Symbol.Info.Flags, makeArrayRef(WasmSymbolFlags)); + if (Symbol.Info.Flags & wasm::WASM_SYMBOL_UNDEFINED) W.printString("Module", Symbol.Info.Module); if (Symbol.Info.Kind != wasm::WASM_SYMBOL_TYPE_DATA) {