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

llvm-svn: 241538
This commit is contained in:
Peter Collingbourne 2015-07-07 02:15:25 +00:00
parent 36962cd925
commit 8e17451d54
2 changed files with 40 additions and 1 deletions

View File

@ -177,7 +177,8 @@ void SymbolTable::addLazy(Lazy *New, std::vector<Symbol *> *Accum) {
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;
}
}

View File

@ -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
...