[WebAssembly] Expand symbol flags shown by llvm-objdump --symbols
Differential Revision: https://reviews.llvm.org/D57861 llvm-svn: 353357
This commit is contained in:
parent
cfe8cd7e06
commit
e450bd7a9d
|
@ -1,6 +1,6 @@
|
||||||
# RUN: llvm-mc -triple=wasm32-unknown-unknown -mattr=+unimplemented-simd128,+nontrapping-fptoint,+exception-handling < %s | FileCheck %s
|
# 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:
|
# 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 < %s
|
# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj -mattr=+unimplemented-simd128,+nontrapping-fptoint,+exception-handling -o %t.o < %s
|
||||||
|
|
||||||
test0:
|
test0:
|
||||||
# Test all types:
|
# Test all types:
|
||||||
|
|
|
@ -165,13 +165,17 @@
|
||||||
; CHECK-NEXT: Symbol {
|
; CHECK-NEXT: Symbol {
|
||||||
; CHECK-NEXT: Name: f2
|
; CHECK-NEXT: Name: f2
|
||||||
; CHECK-NEXT: Type: FUNCTION (0x0)
|
; 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: ElementIndex: 0x0
|
||||||
; CHECK-NEXT: }
|
; CHECK-NEXT: }
|
||||||
; CHECK-NEXT: Symbol {
|
; CHECK-NEXT: Symbol {
|
||||||
; CHECK-NEXT: Name: foo
|
; CHECK-NEXT: Name: foo
|
||||||
; CHECK-NEXT: Type: DATA (0x1)
|
; 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: Offset: 0x0
|
||||||
; CHECK-NEXT: Segment: 0x0
|
; CHECK-NEXT: Segment: 0x0
|
||||||
; CHECK-NEXT: Size: 0x4
|
; CHECK-NEXT: Size: 0x4
|
||||||
|
@ -179,13 +183,17 @@
|
||||||
; CHECK-NEXT: Symbol {
|
; CHECK-NEXT: Symbol {
|
||||||
; CHECK-NEXT: Name: myextern
|
; CHECK-NEXT: Name: myextern
|
||||||
; CHECK-NEXT: Type: DATA (0x1)
|
; CHECK-NEXT: Type: DATA (0x1)
|
||||||
; CHECK-NEXT: Flags: 0x10
|
; CHECK-NEXT: Flags [ (0x10)
|
||||||
|
; CHECK-NEXT: UNDEFINED (0x10)
|
||||||
|
; CHECK-NEXT: ]
|
||||||
; CHECK-NEXT: Module:
|
; CHECK-NEXT: Module:
|
||||||
; CHECK-NEXT: }
|
; CHECK-NEXT: }
|
||||||
; CHECK-NEXT: Symbol {
|
; CHECK-NEXT: Symbol {
|
||||||
; CHECK-NEXT: Name: ptr2
|
; CHECK-NEXT: Name: ptr2
|
||||||
; CHECK-NEXT: Type: DATA (0x1)
|
; 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: Offset: 0x0
|
||||||
; CHECK-NEXT: Segment: 0x1
|
; CHECK-NEXT: Segment: 0x1
|
||||||
; CHECK-NEXT: Size: 0x4
|
; CHECK-NEXT: Size: 0x4
|
||||||
|
@ -193,25 +201,33 @@
|
||||||
; CHECK-NEXT: Symbol {
|
; CHECK-NEXT: Symbol {
|
||||||
; CHECK-NEXT: Name: .debug_str
|
; CHECK-NEXT: Name: .debug_str
|
||||||
; CHECK-NEXT: Type: SECTION (0x3)
|
; 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: ElementIndex: 0x6
|
||||||
; CHECK-NEXT: }
|
; CHECK-NEXT: }
|
||||||
; CHECK-NEXT: Symbol {
|
; CHECK-NEXT: Symbol {
|
||||||
; CHECK-NEXT: Name: .debug_abbrev
|
; CHECK-NEXT: Name: .debug_abbrev
|
||||||
; CHECK-NEXT: Type: SECTION (0x3)
|
; 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: ElementIndex: 0x7
|
||||||
; CHECK-NEXT: }
|
; CHECK-NEXT: }
|
||||||
; CHECK-NEXT: Symbol {
|
; CHECK-NEXT: Symbol {
|
||||||
; CHECK-NEXT: Name: .debug_info
|
; CHECK-NEXT: Name: .debug_info
|
||||||
; CHECK-NEXT: Type: SECTION (0x3)
|
; 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: ElementIndex: 0x8
|
||||||
; CHECK-NEXT: }
|
; CHECK-NEXT: }
|
||||||
; CHECK-NEXT: Symbol {
|
; CHECK-NEXT: Symbol {
|
||||||
; CHECK-NEXT: Name: .debug_line
|
; CHECK-NEXT: Name: .debug_line
|
||||||
; CHECK-NEXT: Type: SECTION (0x3)
|
; 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: ElementIndex: 0xC
|
||||||
; CHECK-NEXT: }
|
; CHECK-NEXT: }
|
||||||
; CHECK-NEXT:]
|
; CHECK-NEXT:]
|
||||||
|
|
|
@ -14,19 +14,22 @@ define i8* @func() {
|
||||||
; CHECK-NEXT: Symbol {
|
; CHECK-NEXT: Symbol {
|
||||||
; CHECK-NEXT: Name: func
|
; CHECK-NEXT: Name: func
|
||||||
; CHECK-NEXT: Type: FUNCTION (0x0)
|
; CHECK-NEXT: Type: FUNCTION (0x0)
|
||||||
; CHECK-NEXT: Flags: 0x0
|
; CHECK-NEXT: Flags [ (0x0)
|
||||||
|
; CHECK-NEXT: ]
|
||||||
; CHECK-NEXT: ElementIndex: 0x0
|
; CHECK-NEXT: ElementIndex: 0x0
|
||||||
; CHECK-NEXT: }
|
; CHECK-NEXT: }
|
||||||
; CHECK-NEXT: Symbol {
|
; CHECK-NEXT: Symbol {
|
||||||
; CHECK-NEXT: Name: foo
|
; CHECK-NEXT: Name: foo
|
||||||
; CHECK-NEXT: Type: FUNCTION (0x0)
|
; CHECK-NEXT: Type: FUNCTION (0x0)
|
||||||
; CHECK-NEXT: Flags: 0x0
|
; CHECK-NEXT: Flags [ (0x0)
|
||||||
|
; CHECK-NEXT: ]
|
||||||
; CHECK-NEXT: ElementIndex: 0x0
|
; CHECK-NEXT: ElementIndex: 0x0
|
||||||
; CHECK-NEXT: }
|
; CHECK-NEXT: }
|
||||||
; CHECK-NEXT: Symbol {
|
; CHECK-NEXT: Symbol {
|
||||||
; CHECK-NEXT: Name: bar
|
; CHECK-NEXT: Name: bar
|
||||||
; CHECK-NEXT: Type: FUNCTION (0x0)
|
; CHECK-NEXT: Type: FUNCTION (0x0)
|
||||||
; CHECK-NEXT: Flags: 0x0
|
; CHECK-NEXT: Flags [ (0x0)
|
||||||
|
; CHECK-NEXT: ]
|
||||||
; CHECK-NEXT: ElementIndex: 0x0
|
; CHECK-NEXT: ElementIndex: 0x0
|
||||||
; CHECK-NEXT: }
|
; CHECK-NEXT: }
|
||||||
; CHECK-NEXT: ]
|
; CHECK-NEXT: ]
|
||||||
|
|
|
@ -40,6 +40,18 @@ static const EnumEntry<uint32_t> WasmSectionTypes[] = {
|
||||||
#undef ENUM_ENTRY
|
#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 {
|
class WasmDumper : public ObjDumper {
|
||||||
public:
|
public:
|
||||||
WasmDumper(const WasmObjectFile *Obj, ScopedPrinter &Writer)
|
WasmDumper(const WasmObjectFile *Obj, ScopedPrinter &Writer)
|
||||||
|
@ -209,7 +221,8 @@ void WasmDumper::printSymbol(const SymbolRef &Sym) {
|
||||||
WasmSymbol Symbol = Obj->getWasmSymbol(Sym.getRawDataRefImpl());
|
WasmSymbol Symbol = Obj->getWasmSymbol(Sym.getRawDataRefImpl());
|
||||||
W.printString("Name", Symbol.Info.Name);
|
W.printString("Name", Symbol.Info.Name);
|
||||||
W.printEnum("Type", Symbol.Info.Kind, makeArrayRef(WasmSymbolTypes));
|
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)
|
if (Symbol.Info.Flags & wasm::WASM_SYMBOL_UNDEFINED)
|
||||||
W.printString("Module", Symbol.Info.Module);
|
W.printString("Module", Symbol.Info.Module);
|
||||||
if (Symbol.Info.Kind != wasm::WASM_SYMBOL_TYPE_DATA) {
|
if (Symbol.Info.Kind != wasm::WASM_SYMBOL_TYPE_DATA) {
|
||||||
|
|
Loading…
Reference in New Issue