Skip to content

Commit

Permalink
[lld][WebAssembly] Add support for LLD_REPRODUCE
Browse files Browse the repository at this point in the history
This is feature of the ELF and COFF linker that we were missing until
now.

Differential Revision: https://reviews.llvm.org/D137377
  • Loading branch information
sbc100 committed Nov 3, 2022
1 parent c072586 commit 3c28a6d
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 29 deletions.
27 changes: 0 additions & 27 deletions lld/test/wasm/reproduce.ll

This file was deleted.

32 changes: 32 additions & 0 deletions lld/test/wasm/reproduce.s
@@ -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
9 changes: 7 additions & 2 deletions lld/wasm/Driver.cpp
Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 3c28a6d

Please sign in to comment.