[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