Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[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 #57243. Differential Revision: https://reviews.llvm.org/D132361 (cherry picked from commit af39e6f)
- Loading branch information
Showing
2 changed files
with
58 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 " |