[PATCH] D10980: [lld] COFF: Fix bug involving archives defining a symbol multiple times.

Peter Collingbourne peter at pcc.me.uk
Mon Jul 6 18:36:47 PDT 2015


pcc added a reviewer: ruiu.
pcc added a subscriber: llvm-commits.

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.

http://reviews.llvm.org/D10980

Files:
  COFF/SymbolTable.cpp
  test/COFF/ar-comdat.test

Index: test/COFF/ar-comdat.test
===================================================================
--- /dev/null
+++ test/COFF/ar-comdat.test
@@ -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
+...
Index: COFF/SymbolTable.cpp
===================================================================
--- COFF/SymbolTable.cpp
+++ COFF/SymbolTable.cpp
@@ -177,7 +177,8 @@
     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;
   }
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D10980.29141.patch
Type: text/x-patch
Size: 1768 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150707/f1d20036/attachment.bin>


More information about the llvm-commits mailing list