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 @@ -204,12 +204,22 @@ } } +static const EnumEntry WasmSymbolFlags[] = { + { "BINDING_GLOBAL", wasm::WASM_SYMBOL_BINDING_GLOBAL }, + { "BINDING_WEAK", wasm::WASM_SYMBOL_BINDING_WEAK }, + { "BINDING_LOCAL", wasm::WASM_SYMBOL_BINDING_LOCAL }, + { "VISIBILITY_DEFAULT", wasm::WASM_SYMBOL_VISIBILITY_DEFAULT }, + { "VISIBILITY_HIDDEN", wasm::WASM_SYMBOL_VISIBILITY_HIDDEN }, + { "UNDEFINED", wasm::WASM_SYMBOL_UNDEFINED }, +}; + void WasmDumper::printSymbol(const SymbolRef &Sym) { DictScope D(W, "Symbol"); 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) {