[lld] r335878 - [WebAssembly] Add support for bitcode archive members

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 28 10:04:58 PDT 2018


Author: sbc
Date: Thu Jun 28 10:04:58 2018
New Revision: 335878

URL: http://llvm.org/viewvc/llvm-project?rev=335878&view=rev
Log:
[WebAssembly] Add support for bitcode archive members

This change effects the behavior of --export-all. Previously
--export-all would only effect symbols that survived GC. Now
--export-all will prevent any non-local symbols from being GCed.

Differential Revision: https://reviews.llvm.org/D48673

Added:
    lld/trunk/test/wasm/lto/Inputs/archive.ll
    lld/trunk/test/wasm/lto/archive.ll
Modified:
    lld/trunk/test/wasm/export-all.ll
    lld/trunk/wasm/InputFiles.cpp
    lld/trunk/wasm/LTO.cpp
    lld/trunk/wasm/MarkLive.cpp
    lld/trunk/wasm/Symbols.cpp
    lld/trunk/wasm/Symbols.h
    lld/trunk/wasm/Writer.cpp

Modified: lld/trunk/test/wasm/export-all.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/export-all.ll?rev=335878&r1=335877&r2=335878&view=diff
==============================================================================
--- lld/trunk/test/wasm/export-all.ll (original)
+++ lld/trunk/test/wasm/export-all.ll Thu Jun 28 10:04:58 2018
@@ -7,12 +7,17 @@
 ; RUN: obj2yaml %t.wasm | FileCheck %s -check-prefix=EXPORT
 
 ; RUN: wasm-ld --export-all --no-gc-sections -o %t.wasm %t.o
-; RUN: obj2yaml %t.wasm | FileCheck %s -check-prefix=NOGC
+; RUN: obj2yaml %t.wasm | FileCheck %s -check-prefix=EXPORT
 
 ; Verify the --export-all flag exports hidden symbols
 
 target triple = "wasm32-unknown-unknown"
 
+define internal void @internal_func() local_unnamed_addr {
+entry:
+  ret void
+}
+
 define hidden void @bar() local_unnamed_addr {
 entry:
   ret void
@@ -26,6 +31,7 @@ entry:
 define hidden void @_start() local_unnamed_addr {
 entry:
   call void @foo()
+  call void @internal_func()
   ret void
 }
 
@@ -33,13 +39,10 @@ entry:
 ; CHECK:         - Name:            _start
 ; CHECK-NOT:     - Name:            bar
 ; CHECK-NOT:     - Name:            foo
+; CHECK-NOT:     - Name:            internal_func
 
 ; EXPORT:     - Type:            EXPORT
 ; EXPORT:        - Name:            _start
-; EXPORT-NOT:    - Name:            bar
+; EXPORT:        - Name:            bar
 ; EXPORT:        - Name:            foo
-
-; NOGC:       - Type:            EXPORT
-; NOGC:        - Name:            _start
-; NOGC:        - Name:            bar
-; NOGC:        - Name:            foo
+; EXPORT-NOT:    - Name:            internal_func

Added: lld/trunk/test/wasm/lto/Inputs/archive.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/lto/Inputs/archive.ll?rev=335878&view=auto
==============================================================================
--- lld/trunk/test/wasm/lto/Inputs/archive.ll (added)
+++ lld/trunk/test/wasm/lto/Inputs/archive.ll Thu Jun 28 10:04:58 2018
@@ -0,0 +1,6 @@
+target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
+target triple = "wasm32-unknown-unknown"
+
+define void @f() {
+  ret void
+}

Added: lld/trunk/test/wasm/lto/archive.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/lto/archive.ll?rev=335878&view=auto
==============================================================================
--- lld/trunk/test/wasm/lto/archive.ll (added)
+++ lld/trunk/test/wasm/lto/archive.ll Thu Jun 28 10:04:58 2018
@@ -0,0 +1,25 @@
+; RUN: llvm-as %S/Inputs/archive.ll -o %t1.o
+; RUN: rm -f %t.a
+; RUN: llvm-ar rcs %t.a %t1.o
+; RUN: llvm-as %s -o %t2.o
+; RUN: wasm-ld %t2.o %t.a -o %t3
+; RUN: obj2yaml %t3 | FileCheck %s
+
+target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
+target triple = "wasm32-unknown-unknown"
+
+define void @_start() {
+  call void @f()
+  ret void
+}
+
+declare void @f()
+
+; CHECK:         Name:            name
+; CHECK-NEXT:    FunctionNames:
+; CHECK-NEXT:      - Index:           0
+; CHECK-NEXT:        Name:            __wasm_call_ctors
+; CHECK-NEXT:      - Index:           1
+; CHECK-NEXT:        Name:            _start
+; CHECK-NEXT:      - Index:           2
+; CHECK-NEXT:        Name:            f

Modified: lld/trunk/wasm/InputFiles.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/InputFiles.cpp?rev=335878&r1=335877&r2=335878&view=diff
==============================================================================
--- lld/trunk/wasm/InputFiles.cpp (original)
+++ lld/trunk/wasm/InputFiles.cpp Thu Jun 28 10:04:58 2018
@@ -360,12 +360,18 @@ void ArchiveFile::addMember(const Archiv
             "could not get the buffer for the member defining symbol " +
                 Sym->getName());
 
-  if (identify_magic(MB.getBuffer()) != file_magic::wasm_object) {
+  InputFile *Obj;
+
+  file_magic Magic = identify_magic(MB.getBuffer());
+  if (Magic == file_magic::wasm_object) {
+    Obj = make<ObjFile>(MB);
+  } else if (Magic == file_magic::bitcode) {
+    Obj = make<BitcodeFile>(MB);
+  } else {
     error("unknown file type: " + MB.getBufferIdentifier());
     return;
   }
 
-  InputFile *Obj = make<ObjFile>(MB);
   Obj->ParentName = ParentName;
   Symtab->addFile(Obj);
 }

Modified: lld/trunk/wasm/LTO.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/LTO.cpp?rev=335878&r1=335877&r2=335878&view=diff
==============================================================================
--- lld/trunk/wasm/LTO.cpp (original)
+++ lld/trunk/wasm/LTO.cpp Thu Jun 28 10:04:58 2018
@@ -95,7 +95,8 @@ void BitcodeCompiler::add(BitcodeFile &F
     // Once IRObjectFile is fixed to report only one symbol this hack can
     // be removed.
     R.Prevailing = !ObjSym.isUndefined() && Sym->getFile() == &F;
-    R.VisibleToRegularObj = Config->Relocatable || Sym->IsUsedInRegularObj;
+    R.VisibleToRegularObj = Config->Relocatable || Sym->IsUsedInRegularObj ||
+                            (R.Prevailing && Sym->isExported());
     if (R.Prevailing)
       undefine(Sym);
   }

Modified: lld/trunk/wasm/MarkLive.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/MarkLive.cpp?rev=335878&r1=335877&r2=335878&view=diff
==============================================================================
--- lld/trunk/wasm/MarkLive.cpp (original)
+++ lld/trunk/wasm/MarkLive.cpp Thu Jun 28 10:04:58 2018
@@ -54,9 +54,9 @@ void lld::wasm::markLive() {
     Enqueue(Symtab->find(Config->Entry));
   Enqueue(WasmSym::CallCtors);
 
-  // We export all defined, non-hidden symbols so they are all gc roots too
+  // We need to preserve any exported symbol
   for (Symbol *Sym : Symtab->getSymbols())
-    if (Sym->isDefined() && !Sym->isHidden())
+    if (Sym->isExported())
       Enqueue(Sym);
 
   // The ctor functions are all used in the synthetic __wasm_call_ctors

Modified: lld/trunk/wasm/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Symbols.cpp?rev=335878&r1=335877&r2=335878&view=diff
==============================================================================
--- lld/trunk/wasm/Symbols.cpp (original)
+++ lld/trunk/wasm/Symbols.cpp Thu Jun 28 10:04:58 2018
@@ -98,6 +98,16 @@ void Symbol::setHidden(bool IsHidden) {
     Flags |= WASM_SYMBOL_VISIBILITY_DEFAULT;
 }
 
+bool Symbol::isExported() const {
+  if (!isDefined() || isLocal())
+    return false;
+
+  if (Config->ExportAll)
+    return true;
+
+  return !isHidden();
+}
+
 uint32_t FunctionSymbol::getFunctionIndex() const {
   if (auto *F = dyn_cast<DefinedFunction>(this))
     return F->Function->getFunctionIndex();

Modified: lld/trunk/wasm/Symbols.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Symbols.h?rev=335878&r1=335877&r2=335878&view=diff
==============================================================================
--- lld/trunk/wasm/Symbols.h (original)
+++ lld/trunk/wasm/Symbols.h Thu Jun 28 10:04:58 2018
@@ -90,6 +90,7 @@ public:
   void setOutputSymbolIndex(uint32_t Index);
 
   WasmSymbolType getWasmType() const;
+  bool isExported() const;
 
   // True if this symbol was referenced by a regular (non-bitcode) object.
   unsigned IsUsedInRegularObj : 1;

Modified: lld/trunk/wasm/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Writer.cpp?rev=335878&r1=335877&r2=335878&view=diff
==============================================================================
--- lld/trunk/wasm/Writer.cpp (original)
+++ lld/trunk/wasm/Writer.cpp Thu Jun 28 10:04:58 2018
@@ -740,11 +740,7 @@ void Writer::calculateExports() {
   unsigned FakeGlobalIndex = NumImportedGlobals + InputGlobals.size();
 
   for (Symbol *Sym : Symtab->getSymbols()) {
-    if (!Sym->isDefined())
-      continue;
-    if (Sym->isHidden() && !Config->ExportAll)
-      continue;
-    if (Sym->isLocal())
+    if (!Sym->isExported())
       continue;
     if (!Sym->isLive())
       continue;




More information about the llvm-commits mailing list