[WebAssembly] Expand symbol flags shown by llvm-objdump --symbols

Differential Revision: https://reviews.llvm.org/D57861

llvm-svn: 353357
diff --git a/llvm/test/MC/WebAssembly/basic-assembly.s b/llvm/test/MC/WebAssembly/basic-assembly.s
index 85da781..ab29258 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 55b9eac..a0f93fe 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 d4ed06f..0a3c539 100644
--- a/llvm/test/MC/WebAssembly/function-alias.ll
+++ b/llvm/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: ]
diff --git a/llvm/tools/llvm-readobj/WasmDumper.cpp b/llvm/tools/llvm-readobj/WasmDumper.cpp
index e8440f6..42851ab 100644
--- a/llvm/tools/llvm-readobj/WasmDumper.cpp
+++ b/llvm/tools/llvm-readobj/WasmDumper.cpp
@@ -40,6 +40,18 @@
 #undef ENUM_ENTRY
 };
 
+static const EnumEntry<unsigned> 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) {