Skip to content

Commit b9bd8ca

Browse files
authored
[LLD][COFF] Adds /includeglob flag (#109721)
This implements parity with the `--undefined-glob` flag on [ELF](https://reviews.llvm.org/D63244), but for COFF.
1 parent 538dbb9 commit b9bd8ca

File tree

7 files changed

+120
-2
lines changed

7 files changed

+120
-2
lines changed

lld/COFF/Driver.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "llvm/Support/BinaryStreamReader.h"
3838
#include "llvm/Support/CommandLine.h"
3939
#include "llvm/Support/Debug.h"
40+
#include "llvm/Support/GlobPattern.h"
4041
#include "llvm/Support/LEB128.h"
4142
#include "llvm/Support/MathExtras.h"
4243
#include "llvm/Support/Parallel.h"
@@ -704,6 +705,24 @@ Symbol *LinkerDriver::addUndefined(StringRef name) {
704705
return b;
705706
}
706707

708+
void LinkerDriver::addUndefinedGlob(StringRef arg) {
709+
Expected<GlobPattern> pat = GlobPattern::create(arg);
710+
if (!pat) {
711+
error("/includeglob: " + toString(pat.takeError()));
712+
return;
713+
}
714+
715+
SmallVector<Symbol *, 0> syms;
716+
ctx.symtab.forEachSymbol([&syms, &pat](Symbol *sym) {
717+
if (pat->match(sym->getName())) {
718+
syms.push_back(sym);
719+
}
720+
});
721+
722+
for (Symbol *sym : syms)
723+
addUndefined(sym->getName());
724+
}
725+
707726
StringRef LinkerDriver::mangleMaybe(Symbol *s) {
708727
// If the plain symbol name has already been resolved, do nothing.
709728
Undefined *unmangled = dyn_cast<Undefined>(s);
@@ -2524,6 +2543,10 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
25242543
} while (run());
25252544
}
25262545

2546+
// Handle /includeglob
2547+
for (StringRef pat : args::getStrings(args, OPT_incl_glob))
2548+
addUndefinedGlob(pat);
2549+
25272550
// Create wrapped symbols for -wrap option.
25282551
std::vector<WrappedSymbol> wrapped = addWrappedSymbols(ctx, args);
25292552
// Load more object files that might be needed for wrapped symbols.

lld/COFF/Driver.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,8 @@ class LinkerDriver {
172172

173173
Symbol *addUndefined(StringRef sym);
174174

175+
void addUndefinedGlob(StringRef arg);
176+
175177
StringRef mangleMaybe(Symbol *s);
176178

177179
// Windows specific -- "main" is not the only main function in Windows.

lld/COFF/Options.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,9 @@ defm build_id: B<
310310
"Generate build ID (always on when generating PDB)",
311311
"Do not Generate build ID">;
312312

313+
def incl_glob : Joined<["/", "-", "/?", "-?"], "includeglob:">,
314+
HelpText<"Force symbol to be added to symbol table as undefined one using a glob pattern">;
315+
313316
// Flags for debugging
314317
def lldmap : F<"lldmap">;
315318
def lldmap_file : P_priv<"lldmap">;

lld/docs/ReleaseNotes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ Breaking changes
4141

4242
COFF Improvements
4343
-----------------
44+
* ``/includeglob`` has been implemented to match the behavior of ``--undefined-glob`` available for ELF.
4445

4546
MinGW Improvements
4647
------------------

lld/test/COFF/Inputs/include1d.yaml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
--- !COFF
2+
header:
3+
Machine: IMAGE_FILE_MACHINE_AMD64
4+
Characteristics: []
5+
sections:
6+
- Name: .text
7+
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
8+
Alignment: 4
9+
SectionData: B800000000506800000000680000000050E80000000050E800000000
10+
symbols:
11+
- Name: .text
12+
Value: 0
13+
SectionNumber: 1
14+
SimpleType: IMAGE_SYM_TYPE_NULL
15+
ComplexType: IMAGE_SYM_DTYPE_NULL
16+
StorageClass: IMAGE_SYM_CLASS_STATIC
17+
SectionDefinition:
18+
Length: 28
19+
NumberOfRelocations: 4
20+
NumberOfLinenumbers: 0
21+
CheckSum: 0
22+
Number: 0
23+
- Name: baz
24+
Value: 0
25+
SectionNumber: 1
26+
SimpleType: IMAGE_SYM_TYPE_NULL
27+
ComplexType: IMAGE_SYM_DTYPE_NULL
28+
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
29+
...

lld/test/COFF/include.test

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,18 @@
99
# RUN: echo dummy >> %t.log
1010
# RUN: FileCheck -check-prefix=CHECK2 %s < %t.log
1111

12+
# RUN: lld-link /out:%t.exe /entry:main %t.obj /verbose /includeglob:"glob_*" >& %t.log
13+
# RUN: echo dummy >> %t.log
14+
# RUN: FileCheck -check-prefix=CHECK3 %s < %t.log
15+
1216
# CHECK1: Discarded unused
17+
# CHECK1: Discarded glob_match1
18+
# CHECK1: Discarded glob_match2
1319
# CHECK1-NOT: Discarded used
1420
# CHECK2-NOT: Discarded unused
1521
# CHECK2-NOT: Discarded used
22+
# CHECK3-NOT: Discarded glob_match1
23+
# CHECK3-NOT: Discarded glob_match2
1624

1725
--- !COFF
1826
header:
@@ -31,6 +39,14 @@ sections:
3139
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
3240
Alignment: 4
3341
SectionData: B82A000000C3
42+
- Name: '.text$mn'
43+
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
44+
Alignment: 4
45+
SectionData: B82A000000C3
46+
- Name: '.text$mn'
47+
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
48+
Alignment: 4
49+
SectionData: B82A000000C3
3450
- Name: .drectve
3551
Characteristics: [ IMAGE_SCN_LNK_INFO, IMAGE_SCN_LNK_REMOVE ]
3652
Alignment: 1
@@ -75,6 +91,32 @@ symbols:
7591
CheckSum: 0
7692
Number: 0
7793
Selection: IMAGE_COMDAT_SELECT_ANY
94+
- Name: '.text$mn'
95+
Value: 0
96+
SectionNumber: 4
97+
SimpleType: IMAGE_SYM_TYPE_NULL
98+
ComplexType: IMAGE_SYM_DTYPE_NULL
99+
StorageClass: IMAGE_SYM_CLASS_STATIC
100+
SectionDefinition:
101+
Length: 6
102+
NumberOfRelocations: 0
103+
NumberOfLinenumbers: 0
104+
CheckSum: 0
105+
Number: 0
106+
Selection: IMAGE_COMDAT_SELECT_ANY
107+
- Name: '.text$mn'
108+
Value: 0
109+
SectionNumber: 5
110+
SimpleType: IMAGE_SYM_TYPE_NULL
111+
ComplexType: IMAGE_SYM_DTYPE_NULL
112+
StorageClass: IMAGE_SYM_CLASS_STATIC
113+
SectionDefinition:
114+
Length: 6
115+
NumberOfRelocations: 0
116+
NumberOfLinenumbers: 0
117+
CheckSum: 0
118+
Number: 0
119+
Selection: IMAGE_COMDAT_SELECT_ANY
78120
- Name: main
79121
Value: 0
80122
SectionNumber: 1
@@ -93,4 +135,16 @@ symbols:
93135
SimpleType: IMAGE_SYM_TYPE_NULL
94136
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
95137
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
138+
- Name: glob_match1
139+
Value: 0
140+
SectionNumber: 4
141+
SimpleType: IMAGE_SYM_TYPE_NULL
142+
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
143+
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
144+
- Name: glob_match2
145+
Value: 0
146+
SectionNumber: 5
147+
SimpleType: IMAGE_SYM_TYPE_NULL
148+
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
149+
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
96150
...

lld/test/COFF/include2.test

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
# RUN: yaml2obj %p/Inputs/include1a.yaml -o %t1.obj
22
# RUN: yaml2obj %p/Inputs/include1b.yaml -o %t2.obj
33
# RUN: yaml2obj %p/Inputs/include1c.yaml -o %t3.obj
4-
# RUN: rm -f %t2.lib %t3.lib
4+
# RUN: yaml2obj %p/Inputs/include1d.yaml -o %t4.obj
5+
# RUN: rm -f %t2.lib %t3.lib %t4.lib
56
# RUN: llvm-ar cru %t2.lib %t2.obj
67
# RUN: llvm-ar cru %t3.lib %t3.obj
7-
# RUN: lld-link /out:%t.exe /entry:main %t1.obj %t2.lib %t3.lib /verbose >& %t.log
8+
# RUN: llvm-ar cru %t4.lib %t4.obj
9+
# RUN: lld-link /out:%t.exe /entry:main %t1.obj %t2.lib %t3.lib %t4.lib /verbose >& %t.log
810
# RUN: FileCheck %s < %t.log
11+
# RUN: lld-link /out:%t.exe /entry:main %t1.obj %t2.lib %t3.lib %t4.lib /includeglob:baz /verbose >& %t.glob.log
12+
# RUN: FileCheck -check-prefix=GLOB %s < %t.glob.log
913

1014
CHECK: include2.test.tmp1.obj
1115
CHECK: include2.test.tmp2.lib
1216
CHECK: include2.test.tmp2.lib(include2.test.tmp2.obj) for foo
1317
CHECK: include2.test.tmp3.lib
1418
CHECK: include2.test.tmp3.lib(include2.test.tmp3.obj) for bar
19+
CHECK-NOT: include2.test.tmp4.lib(include2.test.tmp4.obj) for baz
20+
GLOB: include2.test.tmp4.lib(include2.test.tmp4.obj) for baz

0 commit comments

Comments
 (0)