[PATCH] D41922: [WebAssembly] When loading libraries look for companion `.imports` file
Sam Clegg via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 11 13:57:42 PST 2018
sbc100 updated this revision to Diff 129515.
sbc100 marked 3 inline comments as done.
sbc100 added a comment.
- feedback
Repository:
rLLD LLVM Linker
https://reviews.llvm.org/D41922
Files:
test/wasm/archive.ll
wasm/Driver.cpp
Index: wasm/Driver.cpp
===================================================================
--- wasm/Driver.cpp
+++ wasm/Driver.cpp
@@ -161,16 +161,28 @@
return Args;
}
+static void readImportFile(StringRef Filename) {
+ if (Optional<MemoryBufferRef> Buf = readFile(Filename))
+ for (StringRef Sym : args::getLines(*Buf))
+ Config->AllowUndefinedSymbols.insert(Sym);
+}
+
void LinkerDriver::addFile(StringRef Path) {
Optional<MemoryBufferRef> Buffer = readFile(Path);
if (!Buffer.hasValue())
return;
MemoryBufferRef MBRef = *Buffer;
- if (identify_magic(MBRef.getBuffer()) == file_magic::archive)
+ if (identify_magic(MBRef.getBuffer()) == file_magic::archive) {
Files.push_back(make<ArchiveFile>(MBRef));
- else
- Files.push_back(make<ObjFile>(MBRef));
+ SmallString<128> ImportFile = Path;
+ path::replace_extension(ImportFile, ".imports");
+ if (fs::exists(ImportFile))
+ readImportFile(ImportFile.str());
+ return;
+ }
+
+ Files.push_back(make<ObjFile>(MBRef));
}
// Add a given library by searching it from input search paths.
@@ -257,9 +269,7 @@
args::getZOptionValue(Args, OPT_z, "stack-size", WasmPageSize);
if (auto *Arg = Args.getLastArg(OPT_allow_undefined_file))
- if (Optional<MemoryBufferRef> Buf = readFile(Arg->getValue()))
- for (StringRef Sym : args::getLines(*Buf))
- Config->AllowUndefinedSymbols.insert(Sym);
+ readImportFile(Arg->getValue());
if (Config->OutputFile.empty())
error("no output file specified");
Index: test/wasm/archive.ll
===================================================================
--- test/wasm/archive.ll
+++ test/wasm/archive.ll
@@ -3,26 +3,35 @@
; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %S/Inputs/archive2.ll -o %t.a2.o
; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %S/Inputs/hello.ll -o %t.a3.o
; RUN: llvm-ar rcs %t.a %t.a1.o %t.a2.o %t.a3.o
+; RUN: rm -f %t.imports
+; RUN: not lld -flavor wasm %t.a %t.o -o %t.wasm 2>&1 | FileCheck -check-prefix=CHECK-UNDEFINED %s
+
+; CHECK-UNDEFINED: undefined symbol: missing_func
+
+; RUN: echo 'missing_func' > %t.imports
; RUN: lld -flavor wasm %t.a %t.o -o %t.wasm
+
; RUN: llvm-nm -a %t.wasm | FileCheck %s
declare i32 @foo() local_unnamed_addr #1
+declare i32 @missing_func() local_unnamed_addr #1
define i32 @_start() local_unnamed_addr #0 {
entry:
- %call = tail call i32 @foo() #2
- ret i32 %call
+ %call1 = call i32 @foo() #2
+ %call2 = call i32 @missing_func() #2
+ ret i32 %call2
}
; Verify that multually dependant object files in an archive is handled
; correctly.
-; CHECK: 00000002 T _start
-; CHECK-NEXT: 00000002 T _start
-; CHECK-NEXT: 00000000 T bar
-; CHECK-NEXT: 00000000 T bar
-; CHECK-NEXT: 00000001 T foo
-; CHECK-NEXT: 00000001 T foo
+; CHECK: 00000003 T _start
+; CHECK-NEXT: 00000003 T _start
+; CHECK-NEXT: 00000001 T bar
+; CHECK-NEXT: 00000001 T bar
+; CHECK-NEXT: 00000002 T foo
+; CHECK-NEXT: 00000002 T foo
; Verify that symbols from unused objects don't appear in the symbol table
; CHECK-NOT: hello
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D41922.129515.patch
Type: text/x-patch
Size: 3106 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180111/7eda24a1/attachment.bin>
More information about the llvm-commits
mailing list