[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