[lld][WebAssembly] Add support for LLD_REPRODUCE

This is feature of the ELF and COFF linker that we were missing until
now.

Differential Revision: https://reviews.llvm.org/D137377
This commit is contained in:
Sam Clegg
2022-11-03 16:13:54 -07:00
parent c0725865b1
commit 3c28a6d2cb
3 changed files with 39 additions and 29 deletions

View File

@@ -1,27 +0,0 @@
; REQUIRES: shell
; RUN: rm -rf %t.dir
; RUN: mkdir -p %t.dir
; RUN: llc -filetype=obj %s -o %t.dir/foo.o
; RUN: wasm-ld --reproduce=%t.dir/repro.tar -o %t.dir/out.wasm %t.dir/foo.o
; RUN: cd %t.dir
; RUN: tar tf repro.tar | FileCheck --check-prefix=TAR %s
; TAR: repro/response.txt
; TAR: repro/version.txt
; TAR: repro/{{.*}}/foo.o
; RUN: tar xf repro.tar
; RUN: FileCheck --check-prefix=RSP %s < repro/response.txt
; RSP: -o {{.*}}out.wasm
; RSP: {{.*}}/foo.o
; RUN: FileCheck %s --check-prefix=VERSION < repro/version.txt
; VERSION: LLD
target triple = "wasm32-unknown-unknown"
define void @_start() {
ret void
}

32
lld/test/wasm/reproduce.s Normal file
View File

@@ -0,0 +1,32 @@
# REQUIRES: shell
# RUN: rm -rf %t.dir
# RUN: mkdir -p %t.dir
# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.dir/foo.o %s
# RUN: wasm-ld --reproduce=%t.dir/repro.tar -o %t.dir/out.wasm %t.dir/foo.o
# RUN: env LLD_REPRODUCE=%t.dir/repro2.tar wasm-ld -o %t.dir/out.wasm %t.dir/foo.o
# RUN: cd %t.dir
# RUN: tar tf repro.tar | FileCheck --check-prefix=TAR %s
# RUN: tar tf repro2.tar | FileCheck --check-prefix=TAR2 %s
# TAR: repro/response.txt
# TAR: repro/version.txt
# TAR: repro/{{.*}}/foo.o
# TAR2: repro2/response.txt
# TAR2: repro2/version.txt
# TAR2: repro2/{{.*}}/foo.o
# RUN: tar xf repro.tar
# RUN: FileCheck --check-prefix=RSP %s < repro/response.txt
# RSP: -o {{.*}}out.wasm
# RSP: {{.*}}/foo.o
# RUN: FileCheck %s --check-prefix=VERSION < repro/version.txt
# VERSION: LLD
.globl _start
_start:
.functype _start () -> ()
end_function

View File

@@ -618,6 +618,12 @@ static void checkOptions(opt::InputArgList &args) {
}
}
static const char *getReproduceOption(opt::InputArgList &args) {
if (auto *arg = args.getLastArg(OPT_reproduce))
return arg->getValue();
return getenv("LLD_REPRODUCE");
}
// Force Sym to be entered in the output. Used for -u or equivalent.
static Symbol *handleUndefined(StringRef name) {
Symbol *sym = symtab->find(name);
@@ -955,8 +961,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
}
// Handle --reproduce
if (auto *arg = args.getLastArg(OPT_reproduce)) {
StringRef path = arg->getValue();
if (const char *path = getReproduceOption(args)) {
Expected<std::unique_ptr<TarWriter>> errOrWriter =
TarWriter::create(path, path::stem(path));
if (errOrWriter) {