[WebAssembly] Demangle symbol names for use by the browser debugger
Differential Revision: https://reviews.llvm.org/D44316 llvm-svn: 327392
This commit is contained in:
parent
88d9ffc973
commit
531769b9f9
66
lld/test/wasm/cxx-mangling.ll
Normal file
66
lld/test/wasm/cxx-mangling.ll
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
; RUN: llc -filetype=obj %s -o %t.o
|
||||||
|
; RUN: wasm-ld --demangle --check-signatures -o %t_demangle.wasm %t.o
|
||||||
|
; RUN: obj2yaml %t_demangle.wasm | FileCheck %s
|
||||||
|
; RUN: wasm-ld --no-demangle --check-signatures -o %t_nodemangle.wasm %t.o
|
||||||
|
; RUN: obj2yaml %t_nodemangle.wasm | FileCheck %s
|
||||||
|
|
||||||
|
target triple = "wasm32-unknown-unknown-wasm"
|
||||||
|
|
||||||
|
; Check that the EXPORT name is still mangled, but that the "name" custom
|
||||||
|
; section contains the unmangled name.
|
||||||
|
|
||||||
|
define void @_Z3fooi(i32 %arg) {
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
declare extern_weak void @_Z3bari(i32 %arg)
|
||||||
|
|
||||||
|
define void @_start() {
|
||||||
|
call void @_Z3fooi(i32 1)
|
||||||
|
call void @_Z3bari(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: 3
|
||||||
|
; CHECK-NEXT: - Name: _Z3fooi
|
||||||
|
; CHECK-NEXT: Kind: FUNCTION
|
||||||
|
; CHECK-NEXT: Index: 2
|
||||||
|
; 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: 000B
|
||||||
|
; CHECK-NEXT: - Index: 2
|
||||||
|
; CHECK-NEXT: Locals:
|
||||||
|
; CHECK-NEXT: Body: 0B
|
||||||
|
; CHECK-NEXT: - Index: 3
|
||||||
|
; CHECK-NEXT: Locals:
|
||||||
|
; CHECK-NEXT: Body: 410110828080800041011081808080000B
|
||||||
|
; CHECK-NEXT: - Type: CUSTOM
|
||||||
|
; CHECK-NEXT: Name: name
|
||||||
|
; CHECK-NEXT: FunctionNames:
|
||||||
|
; CHECK-NEXT: - Index: 0
|
||||||
|
; CHECK-NEXT: Name: __wasm_call_ctors
|
||||||
|
; CHECK-NEXT: - Index: 1
|
||||||
|
; CHECK-NEXT: Name: 'undefined function bar(int)'
|
||||||
|
; CHECK-NEXT: - Index: 2
|
||||||
|
; CHECK-NEXT: Name: 'foo(int)'
|
||||||
|
; CHECK-NEXT: - Index: 3
|
||||||
|
; CHECK-NEXT: Name: _start
|
||||||
|
; CHECK-NEXT: ...
|
|
@ -17,6 +17,7 @@
|
||||||
#include "lld/Common/Args.h"
|
#include "lld/Common/Args.h"
|
||||||
#include "lld/Common/ErrorHandler.h"
|
#include "lld/Common/ErrorHandler.h"
|
||||||
#include "lld/Common/Memory.h"
|
#include "lld/Common/Memory.h"
|
||||||
|
#include "lld/Common/Strings.h"
|
||||||
#include "lld/Common/Threads.h"
|
#include "lld/Common/Threads.h"
|
||||||
#include "lld/Common/Version.h"
|
#include "lld/Common/Version.h"
|
||||||
#include "llvm/ADT/Twine.h"
|
#include "llvm/ADT/Twine.h"
|
||||||
|
@ -239,7 +240,10 @@ static void handleWeakUndefines() {
|
||||||
|
|
||||||
// Add a synthetic dummy for weak undefined functions. These dummies will
|
// Add a synthetic dummy for weak undefined functions. These dummies will
|
||||||
// be GC'd if not used as the target of any "call" instructions.
|
// be GC'd if not used as the target of any "call" instructions.
|
||||||
StringRef StubName = Saver.save("undefined function " + toString(*Sym));
|
Optional<std::string> SymName = demangleItanium(Sym->getName());
|
||||||
|
StringRef StubName =
|
||||||
|
Saver.save("undefined function " +
|
||||||
|
(SymName ? StringRef(*SymName) : Sym->getName()));
|
||||||
SyntheticFunction *Func = make<SyntheticFunction>(Sig, StubName);
|
SyntheticFunction *Func = make<SyntheticFunction>(Sig, StubName);
|
||||||
Func->setBody(UnreachableFn);
|
Func->setBody(UnreachableFn);
|
||||||
// Ensure it compares equal to the null pointer, and so that table relocs
|
// Ensure it compares equal to the null pointer, and so that table relocs
|
||||||
|
|
|
@ -534,13 +534,15 @@ void Writer::createNameSection() {
|
||||||
for (const Symbol *S : ImportedSymbols) {
|
for (const Symbol *S : ImportedSymbols) {
|
||||||
if (auto *F = dyn_cast<FunctionSymbol>(S)) {
|
if (auto *F = dyn_cast<FunctionSymbol>(S)) {
|
||||||
writeUleb128(Sub.OS, F->getFunctionIndex(), "func index");
|
writeUleb128(Sub.OS, F->getFunctionIndex(), "func index");
|
||||||
writeStr(Sub.OS, F->getName(), "symbol name");
|
Optional<std::string> Name = demangleItanium(F->getName());
|
||||||
|
writeStr(Sub.OS, Name ? StringRef(*Name) : F->getName(), "symbol name");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const InputFunction *F : InputFunctions) {
|
for (const InputFunction *F : InputFunctions) {
|
||||||
if (!F->getName().empty()) {
|
if (!F->getName().empty()) {
|
||||||
writeUleb128(Sub.OS, F->getFunctionIndex(), "func index");
|
writeUleb128(Sub.OS, F->getFunctionIndex(), "func index");
|
||||||
writeStr(Sub.OS, F->getName(), "symbol name");
|
Optional<std::string> Name = demangleItanium(F->getName());
|
||||||
|
writeStr(Sub.OS, Name ? StringRef(*Name) : F->getName(), "symbol name");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue