Do not create multiple NOTE segments.

Previously, we didn't try to make effort to put .note sections next
to each other in the output file, so two .note sections were likely
to be stored to two separate NOTE segments. That's undesirable because
we should create as few segments as possible in general.

Differential Revision: https://reviews.llvm.org/D43858

llvm-svn: 326410
This commit is contained in:
Rui Ueyama 2018-03-01 02:31:29 +00:00
parent b4267dfc10
commit 37ad8161e4
2 changed files with 22 additions and 12 deletions

View File

@ -668,16 +668,17 @@ static bool isRelroSection(const OutputSection *Sec) {
// * It is easy to check if a give branch was taken.
// * It is easy two see how similar two ranks are (see getRankProximity).
enum RankFlags {
RF_NOT_ADDR_SET = 1 << 16,
RF_NOT_INTERP = 1 << 15,
RF_NOT_ALLOC = 1 << 14,
RF_WRITE = 1 << 13,
RF_EXEC_WRITE = 1 << 12,
RF_EXEC = 1 << 11,
RF_NON_TLS_BSS = 1 << 10,
RF_NON_TLS_BSS_RO = 1 << 9,
RF_NOT_TLS = 1 << 8,
RF_BSS = 1 << 7,
RF_NOT_ADDR_SET = 1 << 18,
RF_NOT_INTERP = 1 << 17,
RF_NOT_ALLOC = 1 << 16,
RF_WRITE = 1 << 15,
RF_EXEC_WRITE = 1 << 13,
RF_EXEC = 1 << 12,
RF_NON_TLS_BSS = 1 << 11,
RF_NON_TLS_BSS_RO = 1 << 10,
RF_NOT_TLS = 1 << 9,
RF_BSS = 1 << 8,
RF_NOTE = 1 << 7,
RF_PPC_NOT_TOCBSS = 1 << 6,
RF_PPC_OPD = 1 << 5,
RF_PPC_TOCL = 1 << 4,
@ -765,6 +766,12 @@ static unsigned getSectionRank(const OutputSection *Sec) {
if (IsNoBits)
Rank |= RF_BSS;
// We create a NOTE segment for contiguous .note sections, so make
// them contigous if there are more than one .note section with the
// same attributes.
if (Sec->Type == SHT_NOTE)
Rank |= RF_NOTE;
// Some architectures have additional ordering restrictions for sections
// within the same PT_LOAD.
if (Config->EMachine == EM_PPC64) {
@ -790,6 +797,7 @@ static unsigned getSectionRank(const OutputSection *Sec) {
if (Name == ".branch_lt")
Rank |= RF_PPC_BRANCH_LT;
}
if (Config->EMachine == EM_MIPS) {
// All sections with SHF_MIPS_GPREL flag should be grouped together
// because data in these sections is addressable with a gp relative address.

View File

@ -8,12 +8,13 @@
// CHECK-NEXT: Offset:
// CHECK-NEXT: VirtualAddress:
// CHECK-NEXT: PhysicalAddress:
// CHECK-NEXT: FileSize: 8
// CHECK-NEXT: MemSize: 8
// CHECK-NEXT: FileSize: 16
// CHECK-NEXT: MemSize: 16
// CHECK-NEXT: Flags [
// CHECK-NEXT: PF_R
// CHECK-NEXT: ]
// CHECK-NEXT: Alignment: 1
// CHECK-NOT: Type: PT_NOTE
// RUN: echo "SECTIONS { .note : { *(.note.a) *(.note.b) } }" > %t.script
// RUN: ld.lld %t.o --script %t.script -o %t2
@ -29,6 +30,7 @@
// SCRIPT-NEXT: PF_R
// SCRIPT-NEXT: ]
// SCRIPT-NEXT: Alignment: 1
// SCRIPT-NOT: Type: PT_NOTE
.section .note.a, "a", @note
.quad 0