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:
parent
36962cd925
commit
8e17451d54
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
...
|
Loading…
Reference in New Issue