Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 Jan 2018 17:37:09 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r327732 - projects/clang600-import/contrib/llvm/tools/lld/ELF
Message-ID:  <201801091737.w09Hb94l012559@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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 <class ELFT> 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<InputSectionDescription>(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<Elf_Chdr *>(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 <class ELFT> void Writer<ELFT>::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<ELFT>(); });
 
-  Script->assignAddresses();
   Script->allocateHeaders(Phdrs);
 
   // Remove empty PT_LOAD to avoid causing the dynamic linker to try to mmap a



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201801091737.w09Hb94l012559>