[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:
Nicholas Wilson 2018-03-13 13:30:04 +00:00
parent 88d9ffc973
commit 531769b9f9
3 changed files with 75 additions and 3 deletions

View 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: ...

View file

@ -17,6 +17,7 @@
#include "lld/Common/Args.h"
#include "lld/Common/ErrorHandler.h"
#include "lld/Common/Memory.h"
#include "lld/Common/Strings.h"
#include "lld/Common/Threads.h"
#include "lld/Common/Version.h"
#include "llvm/ADT/Twine.h"
@ -239,7 +240,10 @@ static void handleWeakUndefines() {
// Add a synthetic dummy for weak undefined functions. These dummies will
// 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);
Func->setBody(UnreachableFn);
// Ensure it compares equal to the null pointer, and so that table relocs

View file

@ -534,13 +534,15 @@ void Writer::createNameSection() {
for (const Symbol *S : ImportedSymbols) {
if (auto *F = dyn_cast<FunctionSymbol>(S)) {
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) {
if (!F->getName().empty()) {
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");
}
}