[lld] r325331 - [ELF] - Support COPY, INFO, OVERLAY output sections attributes.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 16 02:42:58 PST 2018


Author: grimar
Date: Fri Feb 16 02:42:58 2018
New Revision: 325331

URL: http://llvm.org/viewvc/llvm-project?rev=325331&view=rev
Log:
[ELF] - Support COPY, INFO, OVERLAY output sections attributes.

This is PR36298.

(COPY), (INFO), (OVERLAY) all have the same effect:
section should be marked as non-allocatable.

(https://www.eecs.umich.edu/courses/eecs373/readings/Linker.pdf, 
3.6.8.1 Output Section Type)

Differential revision: https://reviews.llvm.org/D43071

Added:
    lld/trunk/test/ELF/linkerscript/info-section-type.s
Modified:
    lld/trunk/ELF/LinkerScript.cpp
    lld/trunk/ELF/OutputSections.h
    lld/trunk/ELF/ScriptParser.cpp

Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=325331&r1=325330&r2=325331&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Fri Feb 16 02:42:58 2018
@@ -436,6 +436,8 @@ void LinkerScript::processSectionCommand
       Sec->SectionIndex = I++;
       if (Sec->Noload)
         Sec->Type = SHT_NOBITS;
+      if (Sec->NonAlloc)
+        Sec->Flags &= ~(uint64_t)SHF_ALLOC;
     }
   }
   Ctx = nullptr;

Modified: lld/trunk/ELF/OutputSections.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.h?rev=325331&r1=325330&r2=325331&view=diff
==============================================================================
--- lld/trunk/ELF/OutputSections.h (original)
+++ lld/trunk/ELF/OutputSections.h Fri Feb 16 02:42:58 2018
@@ -100,6 +100,7 @@ public:
   std::string Location;
   std::string MemoryRegionName;
   std::string LMARegionName;
+  bool NonAlloc = false;
   bool Noload = false;
 
   template <class ELFT> void finalize();

Modified: lld/trunk/ELF/ScriptParser.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/ScriptParser.cpp?rev=325331&r1=325330&r2=325331&view=diff
==============================================================================
--- lld/trunk/ELF/ScriptParser.cpp (original)
+++ lld/trunk/ELF/ScriptParser.cpp Fri Feb 16 02:42:58 2018
@@ -617,12 +617,14 @@ uint32_t ScriptParser::readFill() {
   return V;
 }
 
-// Reads an expression and/or the special directive "(NOLOAD)" for an
-// output section definition.
+// Reads an expression and/or the special directive for an output
+// section definition. Directive is one of following: "(NOLOAD)",
+// "(COPY)", "(INFO)" or "(OVERLAY)".
 //
 // An output section name can be followed by an address expression
-// and/or by "(NOLOAD)". This grammar is not LL(1) because "(" can be
-// interpreted as either the beginning of some expression or "(NOLOAD)".
+// and/or directive. This grammar is not LL(1) because "(" can be
+// interpreted as either the beginning of some expression or begining
+// of directive.
 //
 // https://sourceware.org/binutils/docs/ld/Output-Section-Address.html
 // https://sourceware.org/binutils/docs/ld/Output-Section-Type.html
@@ -633,6 +635,11 @@ void ScriptParser::readSectionAddressTyp
       Cmd->Noload = true;
       return;
     }
+    if (consume("COPY") || consume("INFO") || consume("OVERLAY")) {
+      expect(")");
+      Cmd->NonAlloc = true;
+      return;
+    }
     Cmd->AddrExpr = readExpr();
     expect(")");
   } else {

Added: lld/trunk/test/ELF/linkerscript/info-section-type.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/linkerscript/info-section-type.s?rev=325331&view=auto
==============================================================================
--- lld/trunk/test/ELF/linkerscript/info-section-type.s (added)
+++ lld/trunk/test/ELF/linkerscript/info-section-type.s Fri Feb 16 02:42:58 2018
@@ -0,0 +1,33 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+
+## In this test we check that output section types such as
+## COPY, INFO and OVERLAY marks output section as non-allocatable.
+
+# RUN: echo "SECTIONS { .bar : { *(.foo) } };" > %t.script
+# RUN: ld.lld -o %t --script %t.script %t.o
+# RUN: llvm-readobj -sections %t | FileCheck %s --check-prefix=DEFAULT
+# DEFAULT:      Name: .bar
+# DEFAULT:      Type: SHT_PROGBITS
+# DEFAULT-NEXT: Flags [
+# DEFAULT-NEXT:   SHF_ALLOC
+# DEFAULT-NEXT: ]
+
+# RUN: echo "SECTIONS { .bar (COPY) : { *(.foo) } };" > %t.script
+# RUN: ld.lld -o %t --script %t.script %t.o
+# RUN: llvm-readobj -sections %t | FileCheck %s --check-prefix=NONALLOC
+# NONALLOC:      Name: .bar
+# NONALLOC:      Type: SHT_PROGBITS
+# NONALLOC-NEXT: Flags [
+# NONALLOC-NEXT: ]
+
+# RUN: echo "SECTIONS { .bar (INFO) : { *(.foo) } };" > %t.script
+# RUN: ld.lld -o %t --script %t.script %t.o
+# RUN: llvm-readobj -sections %t | FileCheck %s --check-prefix=NONALLOC
+
+# RUN: echo "SECTIONS { .bar (OVERLAY) : { *(.foo) } };" > %t.script
+# RUN: ld.lld -o %t --script %t.script %t.o
+# RUN: llvm-readobj -sections %t | FileCheck %s --check-prefix=NONALLOC
+
+.section .foo,"a", at progbits
+.zero 1




More information about the llvm-commits mailing list