diff options
| author | Sam Clegg <sbc@chromium.org> | 2018-07-17 19:15:02 +0000 | 
|---|---|---|
| committer | Sam Clegg <sbc@chromium.org> | 2018-07-17 19:15:02 +0000 | 
| commit | f989a92dea46f96548bdc83a394ff0a12c5ffa6b (patch) | |
| tree | 9a6760d23c8e95052c527fc937962df999f26d54 | |
| parent | 946a81f5b068a90c177c3f49da3a3761273894f1 (diff) | |
| download | bcm5719-llvm-f989a92dea46f96548bdc83a394ff0a12c5ffa6b.tar.gz bcm5719-llvm-f989a92dea46f96548bdc83a394ff0a12c5ffa6b.zip  | |
[WebAssemlby] Set IsUsedInRegularObj correctly for undefined data symbols
Differential Revision: https://reviews.llvm.org/D49113
llvm-svn: 337314
| -rw-r--r-- | lld/test/wasm/lto/Inputs/used.ll | 8 | ||||
| -rw-r--r-- | lld/test/wasm/lto/used.ll | 45 | ||||
| -rw-r--r-- | lld/wasm/SymbolTable.cpp | 3 | 
3 files changed, 56 insertions, 0 deletions
diff --git a/lld/test/wasm/lto/Inputs/used.ll b/lld/test/wasm/lto/Inputs/used.ll new file mode 100644 index 00000000000..d0250d518ab --- /dev/null +++ b/lld/test/wasm/lto/Inputs/used.ll @@ -0,0 +1,8 @@ +target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +@foo = hidden global i32 1 + +define hidden void @bar() { +  ret void +} diff --git a/lld/test/wasm/lto/used.ll b/lld/test/wasm/lto/used.ll new file mode 100644 index 00000000000..8bf840366cc --- /dev/null +++ b/lld/test/wasm/lto/used.ll @@ -0,0 +1,45 @@ +; RUN: llc %s -o %t.o -filetype=obj +; RUN: llvm-as %S/Inputs/used.ll -o %t1.o +; RUN: wasm-ld %t.o %t1.o -o %t.wasm +; RUN: obj2yaml %t.wasm | FileCheck %s + +; Verify that symbols references from regular objects are preserved by LTO + +target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +declare void @bar() + +@foo = external global i32 + +define void @_start() { +  %val = load i32, i32* @foo, align 4 +  %tobool = icmp ne i32 %val, 0 +  br i1 %tobool, label %callbar, label %return + +callbar: +  call void @bar() +  br label %return + +return: +  ret void +} + +; CHECK:        - Type:            DATA +; CHECK-NEXT:     Segments: +; CHECK-NEXT:       - SectionOffset:   7 +; CHECK-NEXT:         MemoryIndex:     0 +; CHECK-NEXT:         Offset: +; CHECK-NEXT:           Opcode:          I32_CONST +; CHECK-NEXT:           Value:           1024 +; CHECK-NEXT:         Content:         '01000000' + +; CHECK:       - 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:            _start +; CHECK-NEXT:      - Index:           2 +; CHECK-NEXT:        Name:            bar diff --git a/lld/wasm/SymbolTable.cpp b/lld/wasm/SymbolTable.cpp index 6541ddcdb87..e1ba2376973 100644 --- a/lld/wasm/SymbolTable.cpp +++ b/lld/wasm/SymbolTable.cpp @@ -307,6 +307,9 @@ Symbol *SymbolTable::addUndefinedData(StringRef Name, uint32_t Flags,    bool WasInserted;    std::tie(S, WasInserted) = insert(Name); +  if (!File || File->kind() == InputFile::ObjectKind) +    S->IsUsedInRegularObj = true; +    if (WasInserted)      replaceSymbol<UndefinedData>(S, Name, Flags, File);    else if (auto *Lazy = dyn_cast<LazySymbol>(S))  | 

