[PATCH] D67032: [ELF] Align SHT_LLVM_PART_EHDR to a maximum page size boundary

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 2 01:48:30 PDT 2019


This revision was automatically updated to reflect the committed changes.
Closed by commit rL370629: [ELF] Align SHT_LLVM_PART_EHDR to a maximum page size boundary (authored by MaskRay, committed by ).

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D67032/new/

https://reviews.llvm.org/D67032

Files:
  lld/trunk/ELF/Writer.cpp
  lld/trunk/test/ELF/partitions.s


Index: lld/trunk/test/ELF/partitions.s
===================================================================
--- lld/trunk/test/ELF/partitions.s
+++ lld/trunk/test/ELF/partitions.s
@@ -1,13 +1,20 @@
-// REQUIRES: x86
+// REQUIRES: aarch64, x86
 // RUN: llvm-mc %s -o %t.o -filetype=obj --triple=x86_64-unknown-linux
+// RUN: ld.lld %t.o -o %t --export-dynamic --gc-sections -z max-page-size=65536
+// RUN: llvm-readelf -S -s %t | FileCheck %s
+
+// RUN: llvm-mc %s -o %t.o -filetype=obj --triple=aarch64
 // RUN: ld.lld %t.o -o %t --export-dynamic --gc-sections
 // RUN: llvm-readelf -S -s %t | FileCheck %s
 
 // This is basically lld/docs/partitions.dot in object file form.
 // Test that the sections are correctly allocated to partitions.
+// part1 and part2 should be aligned to a maximum page size boundary.
 
 // CHECK: [[MAIN:[0-9]+]]] .text
+// CHECK: part1 LOOS+0xFFF4C06 {{[0-9a-f]+}}0000 {{[0-9a-f]+}}0000
 // CHECK: [[P1:[0-9]+]]] .text
+// CHECK: part2 LOOS+0xFFF4C06 {{[0-9a-f]+}}0000 {{[0-9a-f]+}}0000
 // CHECK: [[P2:[0-9]+]]] .text
 
 // CHECK: Symbol table '.symtab'
@@ -30,21 +37,21 @@
 .section .text._start,"ax", at progbits
 .globl _start
 _start:
-call f3
+.quad f3
 
 .section .text.f1,"ax", at progbits
 .globl f1
 f1:
-call f3
-call f4
-call f5
+.quad f3
+.quad f4
+.quad f5
 
 .section .text.f2,"ax", at progbits
 .globl f2
 f2:
-call f3
-call f5
-call f6
+.quad f3
+.quad f5
+.quad f6
 
 .section .text.f3,"ax", at progbits
 f3:
Index: lld/trunk/ELF/Writer.cpp
===================================================================
--- lld/trunk/ELF/Writer.cpp
+++ lld/trunk/ELF/Writer.cpp
@@ -2223,13 +2223,21 @@
       // the next maximum page size boundary on transitions between executable
       // and non-executable segments.
       //
+      // SHT_LLVM_PART_EHDR marks the start of a partition. The partition
+      // sections will be extracted to a separate file. Align to the next
+      // maximum page size boundary so that we can find the ELF header at the
+      // start. We cannot benefit from overlapping p_offset ranges with the
+      // previous segment anyway.
+      //
       // TODO Enable this technique on all targets.
       bool enable = config->emachine != EM_HEXAGON &&
                     config->emachine != EM_MIPS &&
                     config->emachine != EM_X86_64;
 
-      if (!enable || (config->zSeparateCode && prev &&
-                      (prev->p_flags & PF_X) != (p->p_flags & PF_X)))
+      if (!enable ||
+          (config->zSeparateCode && prev &&
+           (prev->p_flags & PF_X) != (p->p_flags & PF_X)) ||
+          cmd->type == SHT_LLVM_PART_EHDR)
         cmd->addrExpr = [] {
           return alignTo(script->getDot(), config->maxPageSize);
         };


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D67032.218309.patch
Type: text/x-patch
Size: 2728 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190902/4bbaa889/attachment.bin>


More information about the llvm-commits mailing list