From owner-svn-src-projects@freebsd.org Tue Jan 9 17:37:10 2018 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A86F3E65DE8 for ; Tue, 9 Jan 2018 17:37:10 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 8347763546; Tue, 9 Jan 2018 17:37:10 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id D59761A026; Tue, 9 Jan 2018 17:37:09 +0000 (UTC) (envelope-from dim@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w09Hb92b012562; Tue, 9 Jan 2018 17:37:09 GMT (envelope-from dim@FreeBSD.org) Received: (from dim@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w09Hb94l012559; Tue, 9 Jan 2018 17:37:09 GMT (envelope-from dim@FreeBSD.org) Message-Id: <201801091737.w09Hb94l012559@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: dim set sender to dim@FreeBSD.org using -f From: Dimitry Andric Date: Tue, 9 Jan 2018 17:37:09 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r327732 - projects/clang600-import/contrib/llvm/tools/lld/ELF X-SVN-Group: projects X-SVN-Commit-Author: dim X-SVN-Commit-Paths: projects/clang600-import/contrib/llvm/tools/lld/ELF X-SVN-Commit-Revision: 327732 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 09 Jan 2018 17:37:10 -0000 Author: dim Date: Tue Jan 9 17:37:09 2018 New Revision: 327732 URL: https://svnweb.freebsd.org/changeset/base/327732 Log: Pull in r321986 from upstream lld trunk (by James Henderson): [ELF] Compress debug sections after assignAddresses and support custom layout Previously, in r320472, I moved the calculation of section offsets and sizes for compressed debug sections into maybeCompress, which happens before assignAddresses, so that the compression had the required information. However, I failed to take account of relocations that patch such sections. This had two effects: 1. A race condition existed when a debug section referred to a different debug section (see PR35788). 2. References to symbols in non-debug sections would be patched incorrectly. This is because the addresses of such symbols are not calculated until after assignAddresses (this was a partial regression caused by r320472, but they could still have been broken before, in the event that a custom layout was used in a linker script). assignAddresses does not need to know about the output section size of non-allocatable sections, because they do not affect the value of Dot. This means that there is no longer a reason not to support custom layout of compressed debug sections, as far as I'm aware. These two points allow for delaying when maybeCompress can be called, removing the need for the loop I previously added to calculate the section size, and therefore the race condition. Furthermore, by delaying, we fix the issues of relocations getting incorrect symbol values, because they have now all been finalized. This should fix thread race conditions when linking parts of ruby24. Modified: projects/clang600-import/contrib/llvm/tools/lld/ELF/LinkerScript.cpp projects/clang600-import/contrib/llvm/tools/lld/ELF/OutputSections.cpp projects/clang600-import/contrib/llvm/tools/lld/ELF/Writer.cpp Modified: projects/clang600-import/contrib/llvm/tools/lld/ELF/LinkerScript.cpp ============================================================================== --- projects/clang600-import/contrib/llvm/tools/lld/ELF/LinkerScript.cpp Tue Jan 9 16:42:24 2018 (r327731) +++ projects/clang600-import/contrib/llvm/tools/lld/ELF/LinkerScript.cpp Tue Jan 9 17:37:09 2018 (r327732) @@ -669,11 +669,6 @@ void LinkerScript::assignOffsets(OutputSection *Sec) { switchTo(Sec); - // We do not support custom layout for compressed debug sectons. - // At this point we already know their size and have compressed content. - if (Ctx->OutSec->Flags & SHF_COMPRESSED) - return; - // The Size previously denoted how many InputSections had been added to this // section, and was used for sorting SHF_LINK_ORDER sections. Reset it to // compute the actual size value. Modified: projects/clang600-import/contrib/llvm/tools/lld/ELF/OutputSections.cpp ============================================================================== --- projects/clang600-import/contrib/llvm/tools/lld/ELF/OutputSections.cpp Tue Jan 9 16:42:24 2018 (r327731) +++ projects/clang600-import/contrib/llvm/tools/lld/ELF/OutputSections.cpp Tue Jan 9 17:37:09 2018 (r327732) @@ -183,15 +183,6 @@ template void OutputSection::maybeCompres !Name.startswith(".debug_")) return; - // Calculate the section offsets and size pre-compression. - Size = 0; - for (BaseCommand *Cmd : SectionCommands) - if (auto *ISD = dyn_cast(Cmd)) - for (InputSection *IS : ISD->Sections) { - IS->OutSecOff = alignTo(Size, IS->Alignment); - this->Size = IS->OutSecOff + IS->getSize(); - } - // Create a section header. ZDebugHeader.resize(sizeof(Elf_Chdr)); auto *Hdr = reinterpret_cast(ZDebugHeader.data()); Modified: projects/clang600-import/contrib/llvm/tools/lld/ELF/Writer.cpp ============================================================================== --- projects/clang600-import/contrib/llvm/tools/lld/ELF/Writer.cpp Tue Jan 9 16:42:24 2018 (r327731) +++ projects/clang600-import/contrib/llvm/tools/lld/ELF/Writer.cpp Tue Jan 9 17:37:09 2018 (r327732) @@ -427,13 +427,14 @@ template void Writer::run() { if (errorCount()) return; + Script->assignAddresses(); + // If -compressed-debug-sections is specified, we need to compress // .debug_* sections. Do it right now because it changes the size of // output sections. parallelForEach(OutputSections, [](OutputSection *Sec) { Sec->maybeCompress(); }); - Script->assignAddresses(); Script->allocateHeaders(Phdrs); // Remove empty PT_LOAD to avoid causing the dynamic linker to try to mmap a