diff options
-rw-r--r-- | lld/test/wasm/Inputs/call-indirect.ll | 4 | ||||
-rw-r--r-- | lld/test/wasm/Inputs/hidden.ll | 14 | ||||
-rw-r--r-- | lld/test/wasm/Inputs/ret32.ll | 2 | ||||
-rw-r--r-- | lld/test/wasm/Inputs/ret64.ll | 2 | ||||
-rw-r--r-- | lld/test/wasm/Inputs/weak-alias.ll | 2 | ||||
-rw-r--r-- | lld/test/wasm/call-indirect.ll | 12 | ||||
-rw-r--r-- | lld/test/wasm/entry.ll | 2 | ||||
-rw-r--r-- | lld/test/wasm/visibility-hidden.ll | 46 | ||||
-rw-r--r-- | lld/test/wasm/weak-alias-overide.ll | 6 | ||||
-rw-r--r-- | lld/test/wasm/weak-alias.ll | 6 | ||||
-rw-r--r-- | lld/test/wasm/weak-external.ll | 12 | ||||
-rw-r--r-- | lld/wasm/Symbols.cpp | 2 | ||||
-rw-r--r-- | lld/wasm/Symbols.h | 1 | ||||
-rw-r--r-- | lld/wasm/Writer.cpp | 41 |
14 files changed, 47 insertions, 105 deletions
diff --git a/lld/test/wasm/Inputs/call-indirect.ll b/lld/test/wasm/Inputs/call-indirect.ll index 13e5987116a..1ffd2427ce6 100644 --- a/lld/test/wasm/Inputs/call-indirect.ll +++ b/lld/test/wasm/Inputs/call-indirect.ll @@ -4,13 +4,13 @@ target triple = "wasm32-unknown-unknown-wasm" @indirect_bar = hidden local_unnamed_addr global i32 ()* @bar, align 4 ; Function Attrs: norecurse nounwind readnone -define i32 @bar() #0 { +define hidden i32 @bar() #0 { entry: ret i32 1 } ; Function Attrs: nounwind -define void @call_bar_indirect() local_unnamed_addr #1 { +define hidden void @call_bar_indirect() local_unnamed_addr #1 { entry: %0 = load i32 ()*, i32 ()** @indirect_bar, align 4 %call = tail call i32 %0() #2 diff --git a/lld/test/wasm/Inputs/hidden.ll b/lld/test/wasm/Inputs/hidden.ll deleted file mode 100644 index a2dd10fff98..00000000000 --- a/lld/test/wasm/Inputs/hidden.ll +++ /dev/null @@ -1,14 +0,0 @@ -target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" -target triple = "wasm32-unknown-unknown-wasm" - -; Function Attrs: norecurse nounwind readnone -define hidden i32 @archiveHidden() #0 { -entry: - ret i32 0 -} - -; Function Attrs: norecurse nounwind readnone -define i32 @archiveDefault() #1 { -entry: - ret i32 0 -} diff --git a/lld/test/wasm/Inputs/ret32.ll b/lld/test/wasm/Inputs/ret32.ll index dd891d7d0f5..fd840de97c0 100644 --- a/lld/test/wasm/Inputs/ret32.ll +++ b/lld/test/wasm/Inputs/ret32.ll @@ -2,7 +2,7 @@ target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown-wasm" ; Function Attrs: norecurse nounwind readnone -define i32 @ret32(float %arg) #0 { +define hidden i32 @ret32(float %arg) #0 { entry: ret i32 0 ; ptrtoint (i32 (float)* @ret32 to i32) diff --git a/lld/test/wasm/Inputs/ret64.ll b/lld/test/wasm/Inputs/ret64.ll index 7cf1a9526dc..8ece8d7cf9c 100644 --- a/lld/test/wasm/Inputs/ret64.ll +++ b/lld/test/wasm/Inputs/ret64.ll @@ -1,7 +1,7 @@ target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown-wasm" -define i64 @ret64(double %arg) local_unnamed_addr #0 { +define hidden i64 @ret64(double %arg) local_unnamed_addr #0 { entry: ret i64 1 } diff --git a/lld/test/wasm/Inputs/weak-alias.ll b/lld/test/wasm/Inputs/weak-alias.ll index c2c45403714..86664b489d0 100644 --- a/lld/test/wasm/Inputs/weak-alias.ll +++ b/lld/test/wasm/Inputs/weak-alias.ll @@ -5,7 +5,7 @@ entry: @bar = weak alias i32 (), i32 ()* @foo -define i32 @call_bar() #0 { +define hidden i32 @call_bar() #0 { entry: %call = call i32 @bar() ret i32 %call diff --git a/lld/test/wasm/call-indirect.ll b/lld/test/wasm/call-indirect.ll index 38b432b80dc..ecc91dc6933 100644 --- a/lld/test/wasm/call-indirect.ll +++ b/lld/test/wasm/call-indirect.ll @@ -11,16 +11,16 @@ target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown-wasm" -@indirect_func = local_unnamed_addr global i32 ()* @foo, align 4 +@indirect_func = hidden local_unnamed_addr global i32 ()* @foo, align 4 ; Function Attrs: norecurse nounwind readnone -define i32 @foo() #0 { +define hidden i32 @foo() #0 { entry: ret i32 1 } ; Function Attrs: nounwind -define void @_start() local_unnamed_addr #1 { +define hidden void @_start() local_unnamed_addr #1 { entry: %0 = load i32 ()*, i32 ()** @indirect_func, align 4 %call = tail call i32 %0() #2 @@ -63,9 +63,6 @@ entry: ; CHECK-NEXT: - Name: memory ; CHECK-NEXT: Kind: MEMORY ; CHECK-NEXT: Index: 0 -; CHECK-NEXT: - Name: _start -; CHECK-NEXT: Kind: FUNCTION -; CHECK-NEXT: Index: 3 ; CHECK-NEXT: - Name: bar ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 0 @@ -75,6 +72,9 @@ entry: ; CHECK-NEXT: - Name: foo ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 2 +; CHECK-NEXT: - Name: _start +; CHECK-NEXT: Kind: FUNCTION +; CHECK-NEXT: Index: 3 ; CHECK: - Type: ELEM ; CHECK-NEXT: Segments: ; CHECK-NEXT: - Offset: diff --git a/lld/test/wasm/entry.ll b/lld/test/wasm/entry.ll index 8b3d39e4f85..65a1e39f533 100644 --- a/lld/test/wasm/entry.ll +++ b/lld/test/wasm/entry.ll @@ -7,7 +7,7 @@ target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown-wasm" -define void @entry() local_unnamed_addr #0 { +define hidden void @entry() local_unnamed_addr #0 { entry: ret void } diff --git a/lld/test/wasm/visibility-hidden.ll b/lld/test/wasm/visibility-hidden.ll deleted file mode 100644 index ac83d122f97..00000000000 --- a/lld/test/wasm/visibility-hidden.ll +++ /dev/null @@ -1,46 +0,0 @@ -; RUN: llc -mtriple wasm32-unknown-unknown-wasm -filetype=obj -o %t.o %s -; RUN: llc -mtriple=wasm32-unknown-unknown-wasm -filetype=obj %S/Inputs/hidden.ll -o %t2.o -; RUN: llvm-ar rcs %t2.a %t2.o -; RUN: lld -flavor wasm %t.o %t2.a -o %t.wasm -; RUN: obj2yaml %t.wasm | FileCheck %s - -; Test that hidden symbols are not exported, whether pulled in from an archive -; or directly. - -define hidden i32 @objectHidden() { -entry: - ret i32 0 -} - -define i32 @objectDefault() { -entry: - ret i32 0 -} - -declare i32 @archiveHidden() -declare i32 @archiveDefault() - -define i32 @_start() { -entry: - %call1 = call i32 @objectHidden() - %call2 = call i32 @objectDefault() - %call3 = call i32 @archiveHidden() - %call4 = call i32 @archiveDefault() - ret i32 0 -} - -; CHECK: - Type: EXPORT -; CHECK-NEXT: Exports: -; CHECK-NEXT: - Name: memory -; CHECK-NEXT: Kind: MEMORY -; CHECK-NEXT: Index: 0 -; CHECK-NEXT: - Name: _start -; CHECK-NEXT: Kind: FUNCTION -; CHECK-NEXT: Index: 2 -; CHECK-NEXT: - Name: archiveDefault -; CHECK-NEXT: Kind: FUNCTION -; CHECK-NEXT: Index: 4 -; CHECK-NEXT: - Name: objectDefault -; CHECK-NEXT: Kind: FUNCTION -; CHECK-NEXT: Index: 1 -; CHECK-NEXT: - Type: diff --git a/lld/test/wasm/weak-alias-overide.ll b/lld/test/wasm/weak-alias-overide.ll index 7ed3ff1f380..d929d918181 100644 --- a/lld/test/wasm/weak-alias-overide.ll +++ b/lld/test/wasm/weak-alias-overide.ll @@ -53,12 +53,12 @@ entry: ; CHECK-NEXT: - Name: memory ; CHECK-NEXT: Kind: MEMORY ; CHECK-NEXT: Index: 0 -; CHECK-NEXT: - Name: _start -; CHECK-NEXT: Kind: FUNCTION -; CHECK-NEXT: Index: 1 ; CHECK-NEXT: - Name: bar ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 0 +; CHECK-NEXT: - Name: _start +; CHECK-NEXT: Kind: FUNCTION +; CHECK-NEXT: Index: 1 ; CHECK-NEXT: - Name: foo ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 2 diff --git a/lld/test/wasm/weak-alias.ll b/lld/test/wasm/weak-alias.ll index 736159d24dd..94907b5ac42 100644 --- a/lld/test/wasm/weak-alias.ll +++ b/lld/test/wasm/weak-alias.ll @@ -47,12 +47,12 @@ entry: ; CHECK-NEXT: - Name: memory ; CHECK-NEXT: Kind: MEMORY ; CHECK-NEXT: Index: 0 -; CHECK-NEXT: - Name: _start -; CHECK-NEXT: Kind: FUNCTION -; CHECK-NEXT: Index: 0 ; CHECK-NEXT: - Name: bar ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 1 +; CHECK-NEXT: - Name: _start +; CHECK-NEXT: Kind: FUNCTION +; CHECK-NEXT: Index: 0 ; CHECK-NEXT: - Name: foo ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 1 diff --git a/lld/test/wasm/weak-external.ll b/lld/test/wasm/weak-external.ll index b109a50037d..a600eaee1a8 100644 --- a/lld/test/wasm/weak-external.ll +++ b/lld/test/wasm/weak-external.ll @@ -9,16 +9,16 @@ declare extern_weak i32 @foo() -define i8* @get_address_of_foo() #0 { +define hidden i8* @get_address_of_foo() #0 { entry: ret i8* bitcast (i32 ()* @foo to i8*) } -define i32* @get_address_of_global_var() #0 { +define hidden i32* @get_address_of_global_var() #0 { ret i32* @global_var } -define i32 @_start() #0 { +define hidden i32 @_start() #0 { entry: %0 = load i32, i32* @global_var, align 4 ret i32 %0 @@ -57,15 +57,15 @@ entry: ; CHECK-NEXT: - Name: memory ; CHECK-NEXT: Kind: MEMORY ; CHECK-NEXT: Index: 0 -; CHECK-NEXT: - Name: _start -; CHECK-NEXT: Kind: FUNCTION -; CHECK-NEXT: Index: 2 ; CHECK-NEXT: - Name: get_address_of_foo ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 0 ; CHECK-NEXT: - Name: get_address_of_global_var ; CHECK-NEXT: Kind: FUNCTION ; CHECK-NEXT: Index: 1 +; CHECK-NEXT: - Name: _start +; CHECK-NEXT: Kind: FUNCTION +; CHECK-NEXT: Index: 2 ; CHECK-NEXT: - Type: ELEM ; CHECK-NEXT: Segments: ; CHECK-NEXT: - Offset: diff --git a/lld/wasm/Symbols.cpp b/lld/wasm/Symbols.cpp index ba23e395dd1..78b0de77cf0 100644 --- a/lld/wasm/Symbols.cpp +++ b/lld/wasm/Symbols.cpp @@ -74,8 +74,6 @@ void Symbol::update(Kind K, InputFile *F, const WasmSymbol *WasmSym, bool Symbol::isWeak() const { return Sym && Sym->isWeak(); } -bool Symbol::isHidden() const { return Sym && Sym->isHidden(); } - std::string lld::toString(wasm::Symbol &Sym) { return wasm::displayName(Sym.getName()); } diff --git a/lld/wasm/Symbols.h b/lld/wasm/Symbols.h index 8e0e6d503b0..29fbdf4b34c 100644 --- a/lld/wasm/Symbols.h +++ b/lld/wasm/Symbols.h @@ -58,7 +58,6 @@ public: bool isGlobal() const { return !isFunction(); } bool isLocal() const { return IsLocal; } bool isWeak() const; - bool isHidden() const; // Returns the symbol name. StringRef getName() const { return Name; } diff --git a/lld/wasm/Writer.cpp b/lld/wasm/Writer.cpp index 309b10cabc4..8edcb6ebe3c 100644 --- a/lld/wasm/Writer.cpp +++ b/lld/wasm/Writer.cpp @@ -259,26 +259,22 @@ void Writer::createTableSection() { void Writer::createExportSection() { // Memory is and main function are exported for executables. bool ExportMemory = !Config->Relocatable && !Config->ImportMemory; - bool ExportOther = true; // ??? TODO Config->Relocatable; - bool ExportHidden = Config->Relocatable; - Symbol *EntrySym = Symtab->find(Config->Entry); - bool ExportEntry = !Config->Relocatable && EntrySym && EntrySym->isDefined(); + bool ExportMain = !Config->Relocatable; + bool ExportOther = true; // Config->Relocatable; uint32_t NumExports = 0; if (ExportMemory) ++NumExports; - if (ExportEntry) + if (ExportMain && !ExportOther) ++NumExports; if (ExportOther) { for (ObjFile *File : Symtab->ObjectFiles) { for (Symbol *Sym : File->getSymbols()) { if (!Sym->isFunction() || Sym->isLocal() || Sym->isUndefined() || - (Sym->isHidden() && !ExportHidden) || Sym->WrittenToSymtab) - continue; - if (Sym == EntrySym) + Sym->WrittenToSymtab) continue; Sym->WrittenToSymtab = true; ++NumExports; @@ -302,21 +298,27 @@ void Writer::createExportSection() { writeExport(OS, MemoryExport); } - if (ExportEntry) { - WasmExport EntryExport; - EntryExport.Name = Config->Entry; - EntryExport.Kind = WASM_EXTERNAL_FUNCTION; - EntryExport.Index = EntrySym->getOutputIndex(); - writeExport(OS, EntryExport); + if (ExportMain) { + Symbol *Sym = Symtab->find(Config->Entry); + if (Sym->isDefined()) { + if (!Sym->isFunction()) + fatal("entry point is not a function: " + Sym->getName()); + + if (!ExportOther) { + WasmExport MainExport; + MainExport.Name = Config->Entry; + MainExport.Kind = WASM_EXTERNAL_FUNCTION; + MainExport.Index = Sym->getOutputIndex(); + writeExport(OS, MainExport); + } + } } if (ExportOther) { for (ObjFile *File : Symtab->ObjectFiles) { for (Symbol *Sym : File->getSymbols()) { - if (!Sym->isFunction() || Sym->isLocal() || Sym->isUndefined() || - (Sym->isHidden() && !ExportHidden) || !Sym->WrittenToSymtab) - continue; - if (Sym == EntrySym) + if (!Sym->isFunction() || Sym->isLocal() | Sym->isUndefined() || + !Sym->WrittenToSymtab) continue; Sym->WrittenToSymtab = false; log("Export: " + Sym->getName()); @@ -330,6 +332,9 @@ void Writer::createExportSection() { writeExport(OS, Export); } } + + // TODO(sbc): Export local symbols too, Even though they are not part + // of the symbol table? } } |