forked from OSchip/llvm-project
lld-link: Allow backward references between associated comdats
References between associated comdats are invalid per COFF spec, but the newest Windows SDK contains obj files that have these references (https://bugs.chromium.org/p/chromium/issues/detail?id=925943#c13). So add back support for them and add tests for them. The old code handled them fine. This makes lld-link match the behavior of newer link.exe versions as far as I can tell. (The behavior before this change matched the behavior of older link.exe versions.) This mostly reverts r352254. Differential Revision: https://reviews.llvm.org/D57387 llvm-svn: 352508
This commit is contained in:
parent
b1f28579ac
commit
5b04e0a3fd
|
@ -250,16 +250,12 @@ void ObjFile::readAssociativeDefinition(COFFSymbolRef Sym,
|
||||||
// Check whether the parent is prevailing. If it is, so are we, and we read
|
// Check whether the parent is prevailing. If it is, so are we, and we read
|
||||||
// the section; otherwise mark it as discarded.
|
// the section; otherwise mark it as discarded.
|
||||||
if (Parent) {
|
if (Parent) {
|
||||||
if (Parent->Selection == IMAGE_COMDAT_SELECT_ASSOCIATIVE) {
|
|
||||||
Diag();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SectionChunk *C = readSection(SectionNumber, Def, "");
|
SectionChunk *C = readSection(SectionNumber, Def, "");
|
||||||
C->Selection = IMAGE_COMDAT_SELECT_ASSOCIATIVE;
|
|
||||||
SparseChunks[SectionNumber] = C;
|
SparseChunks[SectionNumber] = C;
|
||||||
if (SparseChunks[SectionNumber])
|
if (C) {
|
||||||
Parent->addAssociative(SparseChunks[SectionNumber]);
|
C->Selection = IMAGE_COMDAT_SELECT_ASSOCIATIVE;
|
||||||
|
Parent->addAssociative(C);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
SparseChunks[SectionNumber] = nullptr;
|
SparseChunks[SectionNumber] = nullptr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,11 +6,17 @@
|
||||||
# FORWARD-NOT: lld-link: error:
|
# FORWARD-NOT: lld-link: error:
|
||||||
|
|
||||||
# Tests that an associative comdat being associated with another
|
# Tests that an associative comdat being associated with another
|
||||||
# associated comdat earlier in the file produces an error.
|
# associated comdat earlier in the file works.
|
||||||
# RUN: sed -e s/ASSOC1/3/ -e s/ASSOC2/1/ %s | yaml2obj > %t.obj
|
# RUN: sed -e s/ASSOC1/3/ -e s/ASSOC2/1/ %s | yaml2obj > %t.obj
|
||||||
# RUN: not lld-link /include:symbol /dll /noentry /nodefaultlib %t.obj /out:%t.exe 2>&1 | FileCheck --check-prefix=BACKWARD %s
|
|
||||||
# BACKWARD: lld-link: error: {{.*}}: associative comdat .text$ac2 (sec 2) has invalid reference to section .text$ac1 (sec 1)
|
# RUN: lld-link /include:symbol /dll /noentry /nodefaultlib %t.obj /out:%t.exe
|
||||||
# BACKWARD-NOT: lld-link: error:
|
# RUN: llvm-objdump -s %t.exe | FileCheck --check-prefix=BACKWARD %s
|
||||||
|
# BACKWARD: Contents of section .text:
|
||||||
|
# BACKWARD: 180001000 01000000 02000000 03000000 ............
|
||||||
|
|
||||||
|
# RUN: lld-link /dll /noentry /nodefaultlib %t.obj /out:%t.exe
|
||||||
|
# RUN: llvm-objdump -s %t.exe | FileCheck --check-prefix=BACKWARDDROP %s
|
||||||
|
# BACKWARDDROP-NOT: Contents of section .text:
|
||||||
|
|
||||||
--- !COFF
|
--- !COFF
|
||||||
header:
|
header:
|
||||||
|
@ -24,11 +30,11 @@ sections:
|
||||||
- Name: '.text$ac2'
|
- Name: '.text$ac2'
|
||||||
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
|
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
|
||||||
Alignment: 1
|
Alignment: 1
|
||||||
SectionData: '01000000'
|
SectionData: '02000000'
|
||||||
- Name: '.text$nm'
|
- Name: '.text$nm'
|
||||||
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
|
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
|
||||||
Alignment: 1
|
Alignment: 1
|
||||||
SectionData: '01000000'
|
SectionData: '03000000'
|
||||||
symbols:
|
symbols:
|
||||||
- Name: '.text$ac1'
|
- Name: '.text$ac1'
|
||||||
Value: 0
|
Value: 0
|
||||||
|
|
Loading…
Reference in New Issue