Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/llvm/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2022-08-22 11:48:08 +0300
committerTobias Hieta <tobias@hieta.se>2022-08-25 13:49:09 +0300
commit9c29291dfab4e4419b970de40afde4fae35eaf0b (patch)
tree2e8e306dff1e35d0e41b8fba51add6af18869cc4
parente6f03d147678cfed870a2b090a6b42c1c5a8bd4c (diff)
[LLD] [COFF] Fix export directives in object files from -includeoptional
When an object file contains an export directive, we normally do some amount of deferred processing of them at the end of the linking process. The -includeoptional option was handled after this, and any object files (defining new exports) weren't handled. Move the handling of the -includeoptional into the same late loop which does the fixups for e.g. export directives. Ideally, this would also be done for object files that are pulled in by the wrap options, and for mingw autoimports, but those changes require more modifications, to make them safe for potentially being executed multiple times. This fixes https://github.com/llvm/llvm-project/issues/57243. Differential Revision: https://reviews.llvm.org/D132361 (cherry picked from commit af39e6f6fc905f3c067f022fb44136779d2f9c84)
-rw-r--r--lld/COFF/Driver.cpp15
-rw-r--r--lld/test/COFF/includeoptional-export.s51
2 files changed, 58 insertions, 8 deletions
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index 680f89b79b95..5b21337bb45e 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -2228,15 +2228,14 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
// Windows specific -- if __load_config_used can be resolved, resolve it.
if (ctx.symtab.findUnderscore("_load_config_used"))
addUndefined(mangle("_load_config_used"));
- } while (run());
- if (args.hasArg(OPT_include_optional)) {
- // Handle /includeoptional
- for (auto *arg : args.filtered(OPT_include_optional))
- if (isa_and_nonnull<LazyArchive>(ctx.symtab.find(arg->getValue())))
- addUndefined(arg->getValue());
- while (run());
- }
+ if (args.hasArg(OPT_include_optional)) {
+ // Handle /includeoptional
+ for (auto *arg : args.filtered(OPT_include_optional))
+ if (isa_and_nonnull<LazyArchive>(ctx.symtab.find(arg->getValue())))
+ addUndefined(arg->getValue());
+ }
+ } while (run());
// Create wrapped symbols for -wrap option.
std::vector<WrappedSymbol> wrapped = addWrappedSymbols(ctx, args);
diff --git a/lld/test/COFF/includeoptional-export.s b/lld/test/COFF/includeoptional-export.s
new file mode 100644
index 000000000000..4a43109b33a4
--- /dev/null
+++ b/lld/test/COFF/includeoptional-export.s
@@ -0,0 +1,51 @@
+// REQUIRES: x86
+// RUN: split-file %s %t.dir
+
+// RUN: llvm-mc -filetype=obj -triple=x86_64-win32-gnu %t.dir/main.s -o %t.main.o
+// RUN: llvm-mc -filetype=obj -triple=x86_64-win32-gnu %t.dir/lib1.s -o %t.lib1.o
+// RUN: llvm-mc -filetype=obj -triple=x86_64-win32-gnu %t.dir/lib2.s -o %t.lib2.o
+
+// RUN: rm -f %t.lib.a
+// RUN: llvm-ar cru %t.lib.a %t.lib1.o %t.lib2.o
+// RUN: lld-link -dll -out:%t-1.dll -entry:entry %t.main.o %t.lib.a
+// RUN: lld-link -dll -out:%t-2.dll -entry:entry %t.main.o %t.lib.a -includeoptional:libfunc
+
+// RUN: llvm-readobj --coff-exports %t-1.dll | FileCheck --implicit-check-not=Name: %s --check-prefix=CHECK-DEFAULT
+// RUN: llvm-readobj --coff-exports %t-2.dll | FileCheck --implicit-check-not=Name: %s --check-prefix=CHECK-INCLUDEOPTIONAL
+
+// CHECK-DEFAULT: Name:
+// CHECK-DEFAULT: Name: myfunc
+
+// CHECK-INCLUDEOPTIONAL: Name:
+// CHECK-INCLUDEOPTIONAL: Name: libfunc
+// CHECK-INCLUDEOPTIONAL: Name: myfunc
+// CHECK-INCLUDEOPTIONAL: Name: otherlibfunc
+
+#--- main.s
+.global entry
+entry:
+ ret
+
+.global myfunc
+myfunc:
+ ret
+
+.section .drectve
+.ascii "-export:myfunc "
+
+#--- lib1.s
+.global libfunc
+libfunc:
+ call otherlibfunc
+ ret
+
+.section .drectve
+.ascii "-export:libfunc "
+
+#--- lib2.s
+.global otherlibfunc
+otherlibfunc:
+ ret
+
+.section .drectve
+.ascii "-export:otherlibfunc "