[lld] r240913 - COFF: Support /force flag.
Rui Ueyama
ruiu at google.com
Sun Jun 28 12:35:16 PDT 2015
Author: ruiu
Date: Sun Jun 28 14:35:15 2015
New Revision: 240913
URL: http://llvm.org/viewvc/llvm-project?rev=240913&view=rev
Log:
COFF: Support /force flag.
This option is to ignore remaining undefined symbols and force
the linker to create an output file anyways.
The existing code assumes that there's no undefined symbol after
reportRemainingUndefines(). That assumption is legitimate.
I also don't want to mess up the existing code for this minor feature.
In order to keep it as is, remaining undefined symbols are replaced
with dummy defined symbols.
Added:
lld/trunk/test/COFF/force.test
Modified:
lld/trunk/COFF/Config.h
lld/trunk/COFF/Driver.cpp
lld/trunk/COFF/SymbolTable.cpp
Modified: lld/trunk/COFF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Config.h?rev=240913&r1=240912&r2=240913&view=diff
==============================================================================
--- lld/trunk/COFF/Config.h (original)
+++ lld/trunk/COFF/Config.h Sun Jun 28 14:35:15 2015
@@ -46,6 +46,7 @@ struct Configuration {
std::string OutputFile;
bool DoGC = true;
bool Relocatable = true;
+ bool Force = false;
// Symbols in this set are considered as live by the garbage collector.
std::set<StringRef> GCRoots;
Modified: lld/trunk/COFF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=240913&r1=240912&r2=240913&view=diff
==============================================================================
--- lld/trunk/COFF/Driver.cpp (original)
+++ lld/trunk/COFF/Driver.cpp Sun Jun 28 14:35:15 2015
@@ -265,6 +265,10 @@ bool LinkerDriver::link(llvm::ArrayRef<c
if (Args.hasArg(OPT_verbose))
Config->Verbose = true;
+ // Handle /force or /force:unresolved
+ if (Args.hasArg(OPT_force) || Args.hasArg(OPT_force_unresolved))
+ Config->Force = true;
+
// Handle /entry
if (auto *Arg = Args.getLastArg(OPT_entry)) {
Config->EntryName = Arg->getValue();
Modified: lld/trunk/COFF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/SymbolTable.cpp?rev=240913&r1=240912&r2=240913&view=diff
==============================================================================
--- lld/trunk/COFF/SymbolTable.cpp (original)
+++ lld/trunk/COFF/SymbolTable.cpp Sun Jun 28 14:35:15 2015
@@ -92,6 +92,12 @@ bool SymbolTable::reportRemainingUndefin
}
}
llvm::errs() << "undefined symbol: " << Name << "\n";
+ // Remaining undefined symbols are not fatal if /force is specified.
+ // They are replaced with dummy defined symbols.
+ if (Config->Force) {
+ Sym->Body = new (Alloc) DefinedAbsolute(Name, 0);
+ continue;
+ }
Ret = true;
}
return Ret;
Added: lld/trunk/test/COFF/force.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/force.test?rev=240913&view=auto
==============================================================================
--- lld/trunk/test/COFF/force.test (added)
+++ lld/trunk/test/COFF/force.test Sun Jun 28 14:35:15 2015
@@ -0,0 +1,43 @@
+# RUN: yaml2obj < %s > %t.obj
+# RUN: not lld -flavor link2 /out:%t.exe %t.obj
+# RUN: FileCheck %s < %t.log
+# RUN: lld -flavor link2 /out:%t.exe %t.obj /force >& %t.log
+# RUN: FileCheck %s < %t.log
+
+# CHECK: undefined symbol: foo
+
+---
+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: 000000000000
+symbols:
+ - Name: .text
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
+ SectionDefinition:
+ Length: 6
+ NumberOfRelocations: 0
+ NumberOfLinenumbers: 0
+ CheckSum: 0
+ Number: 0
+ - Name: mainCRTStartup
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+ - Name: foo
+ 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