[lld] r241538 - COFF: Fix bug involving archives defining a symbol multiple times.

Peter Collingbourne peter at pcc.me.uk
Mon Jul 6 19:15:25 PDT 2015


Author: pcc
Date: Mon Jul  6 21:15:25 2015
New Revision: 241538

URL: http://llvm.org/viewvc/llvm-project?rev=241538&view=rev
Log:
COFF: Fix bug involving archives defining a symbol multiple times.

Previously we were unnecessarily loading lazy symbols if they appeared in an
archive multiple times, as can happen with comdat symbols. This change fixes
the bug by only loading symbols from archives at load time if the original
symbol was undefined.

Differential Revision: http://reviews.llvm.org/D10980

Added:
    lld/trunk/test/COFF/ar-comdat.test
Modified:
    lld/trunk/COFF/SymbolTable.cpp

Modified: lld/trunk/COFF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/SymbolTable.cpp?rev=241538&r1=241537&r2=241538&view=diff
==============================================================================
--- lld/trunk/COFF/SymbolTable.cpp (original)
+++ lld/trunk/COFF/SymbolTable.cpp Mon Jul  6 21:15:25 2015
@@ -177,7 +177,8 @@ void SymbolTable::addLazy(Lazy *New, std
     if (!Sym->Body.compare_exchange_strong(Existing, New))
       continue;
     New->setBackref(Sym);
-    Accum->push_back(Sym);
+    if (isa<Undefined>(Existing))
+      Accum->push_back(Sym);
     return;
   }
 }

Added: lld/trunk/test/COFF/ar-comdat.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/COFF/ar-comdat.test?rev=241538&view=auto
==============================================================================
--- lld/trunk/test/COFF/ar-comdat.test (added)
+++ lld/trunk/test/COFF/ar-comdat.test Mon Jul  6 21:15:25 2015
@@ -0,0 +1,38 @@
+# RUN: yaml2obj %s > %t1.obj
+# RUN: yaml2obj %s > %t2.obj
+# RUN: llvm-lib /out:%t.lib %t1.obj %t2.obj
+# RUN: lld -flavor link2 /out:%t.exe /lldmap:%t.map /entry:main /subsystem:console %p/Inputs/ret42.obj %t.lib
+# RUN: FileCheck %s < %t.map
+
+# CHECK-NOT: .lib
+
+---
+header:          
+  Machine:         IMAGE_FILE_MACHINE_AMD64
+  Characteristics: [  ]
+sections:        
+  - Name:            .bss
+    Characteristics: [ IMAGE_SCN_CNT_UNINITIALIZED_DATA, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
+    Alignment:       4
+    SectionData:     ''
+symbols:         
+  - Name:            .bss
+    Value:           0
+    SectionNumber:   1
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_NULL
+    StorageClass:    IMAGE_SYM_CLASS_STATIC
+    SectionDefinition: 
+      Length:          4
+      NumberOfRelocations: 0
+      NumberOfLinenumbers: 0
+      CheckSum:        0
+      Number:          1
+      Selection:       IMAGE_COMDAT_SELECT_ANY
+  - Name:            x
+    Value:           0
+    SectionNumber:   1
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_NULL
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL
+...





More information about the llvm-commits mailing list