From 6c7fe30a1c9012d9881d0fe2faaf6fdfbf956359 Mon Sep 17 00:00:00 2001 From: Nicholas Wilson Date: Fri, 20 Apr 2018 17:09:18 +0000 Subject: [PATCH] [WebAssembly] Implement --print-gc-sections for synthetic functions Enables cleaning up confusion between which name variables are mangled and which are unmangled, and --print-gc-sections then excersises and tests that. Differential Revision: https://reviews.llvm.org/D44440 llvm-svn: 330449 --- lld/test/wasm/undefined-weak-call.ll | 5 ++++- lld/wasm/Driver.cpp | 5 +++-- lld/wasm/InputChunks.h | 13 ++++++++++--- lld/wasm/MarkLive.cpp | 3 +++ lld/wasm/Writer.cpp | 10 +++++++--- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/lld/test/wasm/undefined-weak-call.ll b/lld/test/wasm/undefined-weak-call.ll index cd26e05..fed3ecc 100644 --- a/lld/test/wasm/undefined-weak-call.ll +++ b/lld/test/wasm/undefined-weak-call.ll @@ -1,5 +1,6 @@ ; RUN: llc -filetype=obj %s -o %t.o -; RUN: wasm-ld --check-signatures --no-entry %t.o -o %t.wasm +; RUN: wasm-ld --check-signatures --no-entry --print-gc-sections %t.o \ +; RUN: -o %t.wasm 2>&1 | FileCheck -check-prefix=CHECK-GC %s ; RUN: obj2yaml %t.wasm | FileCheck %s ; Check that calling an undefined weak function generates an appropriate stub @@ -12,6 +13,8 @@ declare extern_weak void @weakFunc2() ; same signature declare extern_weak void @weakFunc3(i32 %arg) ; different declare extern_weak void @weakFunc4() ; should be GC'd as not called +; CHECK-GC: removing unused section {{.*}}:(weakFunc4) + define i32 @callWeakFuncs() { call void @weakFunc1() call void @weakFunc2() diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp index 21d4b37..65c5ab2 100644 --- a/lld/wasm/Driver.cpp +++ b/lld/wasm/Driver.cpp @@ -240,10 +240,11 @@ 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. Optional SymName = demangleItanium(Sym->getName()); - StringRef StubName = + StringRef DebugName = Saver.save("undefined function " + (SymName ? StringRef(*SymName) : Sym->getName())); - SyntheticFunction *Func = make(Sig, StubName); + SyntheticFunction *Func = + make(Sig, Sym->getName(), DebugName); Func->setBody(UnreachableFn); // Ensure it compares equal to the null pointer, and so that table relocs // don't pull in the stub body (only call-operand relocs should do that). diff --git a/lld/wasm/InputChunks.h b/lld/wasm/InputChunks.h index baff5e7..9ec7c0f 100644 --- a/lld/wasm/InputChunks.h +++ b/lld/wasm/InputChunks.h @@ -57,6 +57,7 @@ public: ArrayRef getRelocations() const { return Relocations; } virtual StringRef getName() const = 0; + virtual StringRef getDebugName() const = 0; virtual uint32_t getComdat() const = 0; StringRef getComdatName() const; @@ -99,6 +100,7 @@ public: uint32_t getAlignment() const { return Segment.Data.Alignment; } StringRef getName() const override { return Segment.Data.Name; } + StringRef getDebugName() const override { return StringRef(); } uint32_t getComdat() const override { return Segment.Data.Comdat; } const OutputSegment *OutputSeg = nullptr; @@ -125,7 +127,8 @@ public: C->kind() == InputChunk::SyntheticFunction; } - StringRef getName() const override { return Function->Name; } + StringRef getName() const override { return Function->SymbolName; } + StringRef getDebugName() const override { return Function->DebugName; } uint32_t getComdat() const override { return Function->Comdat; } uint32_t getFunctionIndex() const { return FunctionIndex.getValue(); } bool hasFunctionIndex() const { return FunctionIndex.hasValue(); } @@ -152,8 +155,9 @@ protected: class SyntheticFunction : public InputFunction { public: - SyntheticFunction(const WasmSignature &S, StringRef Name) - : InputFunction(S, nullptr, nullptr), Name(Name) { + SyntheticFunction(const WasmSignature &S, StringRef Name, + StringRef DebugName = {}) + : InputFunction(S, nullptr, nullptr), Name(Name), DebugName(DebugName) { SectionKind = InputChunk::SyntheticFunction; } @@ -162,6 +166,7 @@ public: } StringRef getName() const override { return Name; } + StringRef getDebugName() const override { return DebugName; } uint32_t getComdat() const override { return UINT32_MAX; } void setBody(ArrayRef Body_) { Body = Body_; } @@ -170,6 +175,7 @@ protected: ArrayRef data() const override { return Body; } StringRef Name; + StringRef DebugName; ArrayRef Body; }; @@ -182,6 +188,7 @@ public: } StringRef getName() const override { return Section.Name; } + StringRef getDebugName() const override { return StringRef(); } uint32_t getComdat() const override { return UINT32_MAX; } protected: diff --git a/lld/wasm/MarkLive.cpp b/lld/wasm/MarkLive.cpp index 9b72697..38ffbcb 100644 --- a/lld/wasm/MarkLive.cpp +++ b/lld/wasm/MarkLive.cpp @@ -105,5 +105,8 @@ void lld::wasm::markLive() { if (!C->Live) message("removing unused section " + toString(C)); } + for (InputChunk *C : Symtab->SyntheticFunctions) + if (!C->Live) + message("removing unused section " + toString(C)); } } diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp index 18d5d4a..4a52b52 100644 --- a/lld/wasm/Writer.cpp +++ b/lld/wasm/Writer.cpp @@ -534,7 +534,7 @@ void Writer::createLinkingSection() { void Writer::createNameSection() { unsigned NumNames = NumImportedFunctions; for (const InputFunction *F : InputFunctions) - if (!F->getName().empty()) + if (!F->getName().empty() || !F->getDebugName().empty()) ++NumNames; if (NumNames == 0) @@ -558,8 +558,12 @@ void Writer::createNameSection() { for (const InputFunction *F : InputFunctions) { if (!F->getName().empty()) { writeUleb128(Sub.OS, F->getFunctionIndex(), "func index"); - Optional Name = demangleItanium(F->getName()); - writeStr(Sub.OS, Name ? StringRef(*Name) : F->getName(), "symbol name"); + if (!F->getDebugName().empty()) { + writeStr(Sub.OS, F->getDebugName(), "symbol name"); + } else { + Optional Name = demangleItanium(F->getName()); + writeStr(Sub.OS, Name ? StringRef(*Name) : F->getName(), "symbol name"); + } } } -- 2.7.4