Index: test/wasm/cxx-symbols.ll =================================================================== --- /dev/null +++ test/wasm/cxx-symbols.ll @@ -0,0 +1,50 @@ +; RUN: llc -filetype=obj %s -o %t.o +; RUN: wasm-ld --check-signatures -o %t.wasm %t.o +; RUN: obj2yaml %t.wasm | FileCheck %s + +target triple = "wasm32-unknown-unknown-wasm" + +define hidden void @_Z3fooi(i32 %arg) { + ret void +} + +define hidden void @_start() { + call void @_Z3fooi(i32 1) + ret void +} + +; CHECK: - Type: EXPORT +; CHECK-NEXT: Exports: +; CHECK-NEXT: - Name: memory +; CHECK-NEXT: Kind: MEMORY +; CHECK-NEXT: Index: 0 +; CHECK-NEXT: - Name: __heap_base +; CHECK-NEXT: Kind: GLOBAL +; CHECK-NEXT: Index: 1 +; CHECK-NEXT: - Name: __data_end +; CHECK-NEXT: Kind: GLOBAL +; CHECK-NEXT: Index: 2 +; CHECK-NEXT: - Name: _start +; CHECK-NEXT: Kind: FUNCTION +; CHECK-NEXT: Index: 1 +; CHECK-NEXT: - Type: CODE +; CHECK-NEXT: Functions: +; CHECK-NEXT: - Index: 0 +; CHECK-NEXT: Locals: +; CHECK-NEXT: Body: 0B +; CHECK-NEXT: - Index: 1 +; CHECK-NEXT: Locals: +; CHECK-NEXT: Body: 41011080808080000B +; CHECK-NEXT: - Index: 2 +; CHECK-NEXT: Locals: +; CHECK-NEXT: Body: 0B +; CHECK-NEXT: - Type: CUSTOM +; CHECK-NEXT: Name: name +; CHECK-NEXT: FunctionNames: +; CHECK-NEXT: - Index: 0 +; CHECK-NEXT: Name: 'foo(int)' +; CHECK-NEXT: - Index: 1 +; CHECK-NEXT: Name: _start +; CHECK-NEXT: - Index: 2 +; CHECK-NEXT: Name: __wasm_call_ctors +; CHECK-NEXT: ... Index: wasm/Writer.cpp =================================================================== --- wasm/Writer.cpp +++ wasm/Writer.cpp @@ -527,6 +527,13 @@ SubSection Sub(WASM_NAMES_FUNCTION); writeUleb128(Sub.OS, NumNames, "name count"); + auto Demangle = [](StringRef Name) { + if (Config->Demangle) + if (Optional S = demangleItanium(Name)) + return *S; + return Name.str(); + }; + // Names must appear in function index order. As it happens ImportedSymbols // and InputFunctions are numbered in order with imported functions coming // first. @@ -534,12 +541,12 @@ if (!isa(S)) continue; writeUleb128(Sub.OS, S->getOutputIndex(), "import index"); - writeStr(Sub.OS, S->getName(), "symbol name"); + writeStr(Sub.OS, Demangle(S->getName()), "symbol name"); } for (const InputFunction *F : InputFunctions) { if (!F->getName().empty()) { writeUleb128(Sub.OS, F->getOutputIndex(), "func index"); - writeStr(Sub.OS, F->getName(), "symbol name"); + writeStr(Sub.OS, Demangle(F->getName()), "symbol name"); } }