From 5b04e0a3fd3bb5db126453eb61281afca00aeda9 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Tue, 29 Jan 2019 15:50:31 +0000 Subject: [PATCH] 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 --- lld/COFF/InputFiles.cpp | 12 ++++-------- lld/test/COFF/associative-comdat-order.test | 18 ++++++++++++------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp index 6d4cb4e1c49e..74d4a26cf1bc 100644 --- a/lld/COFF/InputFiles.cpp +++ b/lld/COFF/InputFiles.cpp @@ -250,16 +250,12 @@ void ObjFile::readAssociativeDefinition(COFFSymbolRef Sym, // Check whether the parent is prevailing. If it is, so are we, and we read // the section; otherwise mark it as discarded. if (Parent) { - if (Parent->Selection == IMAGE_COMDAT_SELECT_ASSOCIATIVE) { - Diag(); - return; - } - SectionChunk *C = readSection(SectionNumber, Def, ""); - C->Selection = IMAGE_COMDAT_SELECT_ASSOCIATIVE; SparseChunks[SectionNumber] = C; - if (SparseChunks[SectionNumber]) - Parent->addAssociative(SparseChunks[SectionNumber]); + if (C) { + C->Selection = IMAGE_COMDAT_SELECT_ASSOCIATIVE; + Parent->addAssociative(C); + } } else { SparseChunks[SectionNumber] = nullptr; } diff --git a/lld/test/COFF/associative-comdat-order.test b/lld/test/COFF/associative-comdat-order.test index dc58c2c1024d..c7756f348e0e 100644 --- a/lld/test/COFF/associative-comdat-order.test +++ b/lld/test/COFF/associative-comdat-order.test @@ -6,11 +6,17 @@ # FORWARD-NOT: lld-link: error: # 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: 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) -# BACKWARD-NOT: lld-link: error: + +# RUN: lld-link /include:symbol /dll /noentry /nodefaultlib %t.obj /out:%t.exe +# 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 header: @@ -24,11 +30,11 @@ sections: - Name: '.text$ac2' Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] Alignment: 1 - SectionData: '01000000' + SectionData: '02000000' - Name: '.text$nm' Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_LNK_COMDAT, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] Alignment: 1 - SectionData: '01000000' + SectionData: '03000000' symbols: - Name: '.text$ac1' Value: 0