mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-01 01:31:26 +00:00
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:
parent
b4267dfc10
commit
37ad8161e4
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user