Index: test/MC/WebAssembly/basic-assembly.s =================================================================== --- test/MC/WebAssembly/basic-assembly.s +++ 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: Index: test/MC/WebAssembly/debug-info.ll =================================================================== --- test/MC/WebAssembly/debug-info.ll +++ 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:] Index: test/MC/WebAssembly/function-alias.ll =================================================================== --- test/MC/WebAssembly/function-alias.ll +++ test/MC/WebAssembly/function-alias.ll @@ -14,19 +14,22 @@ ; 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: ] Index: tools/llvm-readobj/WasmDumper.cpp =================================================================== --- tools/llvm-readobj/WasmDumper.cpp +++ tools/llvm-readobj/WasmDumper.cpp @@ -40,6 +40,18 @@ #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 @@ 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) {