[lld] r362881 - [COFF] Add an lld specific option /includeoptional
Martin Storsjo via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 8 11:26:18 PDT 2019
Author: mstorsjo
Date: Sat Jun 8 11:26:18 2019
New Revision: 362881
URL: http://llvm.org/viewvc/llvm-project?rev=362881&view=rev
Log:
[COFF] Add an lld specific option /includeoptional
This works like /include, but is not fatal if the requested symbol
wasn't found. This allows implementing the GNU ld option -u.
Differential Revision: https://reviews.llvm.org/D62976
Added:
lld/trunk/test/COFF/includeoptional.yaml
lld/trunk/test/COFF/includeoptional2.yaml
Modified:
lld/trunk/COFF/Driver.cpp
lld/trunk/COFF/Options.td
Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=362881&r1=362880&r2=362881&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Sat Jun 8 11:26:18 2019
@@ -1699,6 +1699,14 @@ void LinkerDriver::link(ArrayRef<const c
Symtab->addCombinedLTOObjects();
run();
+ if (Args.hasArg(OPT_include_optional)) {
+ // Handle /includeoptional
+ for (auto *Arg : Args.filtered(OPT_include_optional))
+ if (dyn_cast_or_null<Lazy>(Symtab->find(Arg->getValue())))
+ addUndefined(Arg->getValue());
+ while (run());
+ }
+
if (Config->MinGW) {
// Load any further object files that might be needed for doing automatic
// imports.
Modified: lld/trunk/COFF/Options.td
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Options.td?rev=362881&r1=362880&r2=362881&view=diff
==============================================================================
--- lld/trunk/COFF/Options.td (original)
+++ lld/trunk/COFF/Options.td Sat Jun 8 11:26:18 2019
@@ -167,6 +167,8 @@ def export_all_symbols : F<"export-all-s
defm demangle : B<"demangle",
"Demangle symbols in output (default)",
"Do not demangle symbols in output">;
+def include_optional : Joined<["/", "-", "/?", "-?"], "includeoptional:">,
+ HelpText<"Add symbol as undefined, but allow it to remain undefined">;
def kill_at : F<"kill-at">;
def lldmingw : F<"lldmingw">;
def output_def : Joined<["/", "-", "/?", "-?"], "output-def:">;
Added: lld/trunk/test/COFF/includeoptional.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/includeoptional.yaml?rev=362881&view=auto
==============================================================================
--- lld/trunk/test/COFF/includeoptional.yaml (added)
+++ lld/trunk/test/COFF/includeoptional.yaml Sat Jun 8 11:26:18 2019
@@ -0,0 +1,39 @@
+# RUN: yaml2obj < %s > %t.main.obj
+# RUN: yaml2obj < %p/Inputs/include1c.yaml > %t.lib.obj
+# RUN: rm -f %t.lib.lib
+# RUN: llvm-ar cru %t.lib.lib %t.lib.obj
+# RUN: lld-link /out:%t.exe /entry:main /includeoptional:bar /includeoptional:actuallymissing %t.main.obj %t.lib.lib /verbose >& %t.log
+# RUN: FileCheck %s < %t.log
+
+# CHECK: includeoptional.yaml.tmp.main.obj
+# CHECK: includeoptional.yaml.tmp.lib.lib
+# CHECK: includeoptional.yaml.tmp.lib.lib(includeoptional.yaml.tmp.lib.obj) for bar
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_AMD64
+ Characteristics: []
+sections:
+ - Name: .text
+ Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
+ Alignment: 4
+ SectionData: B800000000506800000000680000000050E80000000050E800000000
+symbols:
+ - Name: .text
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
+ SectionDefinition:
+ Length: 28
+ NumberOfRelocations: 4
+ NumberOfLinenumbers: 0
+ CheckSum: 0
+ Number: 0
+ - Name: main
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+...
Added: lld/trunk/test/COFF/includeoptional2.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/includeoptional2.yaml?rev=362881&view=auto
==============================================================================
--- lld/trunk/test/COFF/includeoptional2.yaml (added)
+++ lld/trunk/test/COFF/includeoptional2.yaml Sat Jun 8 11:26:18 2019
@@ -0,0 +1,44 @@
+# RUN: yaml2obj < %s > %t.obj
+# RUN: not lld-link /out:%t.exe /entry:main /includeoptional:undeffunc %t.obj /verbose 2>&1 | FileCheck %s
+
+# CHECK: error: undefined symbol: undeffunc
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_AMD64
+ Characteristics: []
+sections:
+ - Name: .text
+ Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
+ Alignment: 4
+ SectionData: B800000000506800000000680000000050E80000000050E800000000
+ Relocations:
+ - VirtualAddress: 17
+ SymbolName: undeffunc
+ Type: IMAGE_REL_AMD64_REL32
+symbols:
+ - Name: .text
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
+ SectionDefinition:
+ Length: 28
+ NumberOfRelocations: 1
+ NumberOfLinenumbers: 0
+ CheckSum: 0
+ Number: 0
+ - Name: main
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+ - Name: undeffunc
+ Value: 0
+ SectionNumber: 0
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+...
More information about the llvm-commits
mailing list