[lld] r322565 - Merging r321986:

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 16 07:46:25 PST 2018


Author: hans
Date: Tue Jan 16 07:46:25 2018
New Revision: 322565

URL: http://llvm.org/viewvc/llvm-project?rev=322565&view=rev
Log:
Merging r321986:
------------------------------------------------------------------------
r321986 | jhenderson | 2018-01-08 02:17:03 -0800 (Mon, 08 Jan 2018) | 25 lines

[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.

------------------------------------------------------------------------

Added:
    lld/branches/release_60/test/ELF/Inputs/compress-debug.s
      - copied unchanged from r321986, lld/trunk/test/ELF/Inputs/compress-debug.s
    lld/branches/release_60/test/ELF/compress-debug-sections-reloc.s
      - copied unchanged from r321986, lld/trunk/test/ELF/compress-debug-sections-reloc.s
    lld/branches/release_60/test/ELF/linkerscript/compress-debug-sections-custom.s
      - copied unchanged from r321986, lld/trunk/test/ELF/linkerscript/compress-debug-sections-custom.s
Modified:
    lld/branches/release_60/   (props changed)
    lld/branches/release_60/ELF/LinkerScript.cpp
    lld/branches/release_60/ELF/OutputSections.cpp
    lld/branches/release_60/ELF/Writer.cpp

Propchange: lld/branches/release_60/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jan 16 07:46:25 2018
@@ -1 +1 @@
-/lld/trunk:321983
+/lld/trunk:321983,321986

Modified: lld/branches/release_60/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/branches/release_60/ELF/LinkerScript.cpp?rev=322565&r1=322564&r2=322565&view=diff
==============================================================================
--- lld/branches/release_60/ELF/LinkerScript.cpp (original)
+++ lld/branches/release_60/ELF/LinkerScript.cpp Tue Jan 16 07:46:25 2018
@@ -669,11 +669,6 @@ void LinkerScript::assignOffsets(OutputS
 
   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: lld/branches/release_60/ELF/OutputSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/branches/release_60/ELF/OutputSections.cpp?rev=322565&r1=322564&r2=322565&view=diff
==============================================================================
--- lld/branches/release_60/ELF/OutputSections.cpp (original)
+++ lld/branches/release_60/ELF/OutputSections.cpp Tue Jan 16 07:46:25 2018
@@ -183,15 +183,6 @@ template <class ELFT> void OutputSection
       !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: lld/branches/release_60/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/branches/release_60/ELF/Writer.cpp?rev=322565&r1=322564&r2=322565&view=diff
==============================================================================
--- lld/branches/release_60/ELF/Writer.cpp (original)
+++ lld/branches/release_60/ELF/Writer.cpp Tue Jan 16 07:46:25 2018
@@ -427,13 +427,14 @@ template <class ELFT> void Writer<ELFT>:
   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




More information about the llvm-commits mailing list