forked from OSchip/llvm-project
New option -z keep-text-section-prefix to keep text sections with prefixes separate.
Separate output sections for selected text section prefixes to enable TLB optimizations and for readablilty. Differential Revision: https://reviews.llvm.org/D45841 llvm-svn: 331823
This commit is contained in:
parent
6e76a1b1ff
commit
be01d2e3de
|
@ -171,6 +171,7 @@ struct Configuration {
|
||||||
bool ZCopyreloc;
|
bool ZCopyreloc;
|
||||||
bool ZExecstack;
|
bool ZExecstack;
|
||||||
bool ZHazardplt;
|
bool ZHazardplt;
|
||||||
|
bool ZKeepTextSectionPrefix;
|
||||||
bool ZNodelete;
|
bool ZNodelete;
|
||||||
bool ZNodlopen;
|
bool ZNodlopen;
|
||||||
bool ZNow;
|
bool ZNow;
|
||||||
|
|
|
@ -764,6 +764,8 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) {
|
||||||
Config->ZCopyreloc = getZFlag(Args, "copyreloc", "nocopyreloc", true);
|
Config->ZCopyreloc = getZFlag(Args, "copyreloc", "nocopyreloc", true);
|
||||||
Config->ZExecstack = getZFlag(Args, "execstack", "noexecstack", false);
|
Config->ZExecstack = getZFlag(Args, "execstack", "noexecstack", false);
|
||||||
Config->ZHazardplt = hasZOption(Args, "hazardplt");
|
Config->ZHazardplt = hasZOption(Args, "hazardplt");
|
||||||
|
Config->ZKeepTextSectionPrefix = getZFlag(
|
||||||
|
Args, "keep-text-section-prefix", "nokeep-text-section-prefix", false);
|
||||||
Config->ZNodelete = hasZOption(Args, "nodelete");
|
Config->ZNodelete = hasZOption(Args, "nodelete");
|
||||||
Config->ZNodlopen = hasZOption(Args, "nodlopen");
|
Config->ZNodlopen = hasZOption(Args, "nodlopen");
|
||||||
Config->ZNow = getZFlag(Args, "now", "lazy", false);
|
Config->ZNow = getZFlag(Args, "now", "lazy", false);
|
||||||
|
|
|
@ -88,6 +88,10 @@ private:
|
||||||
};
|
};
|
||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
||||||
|
static bool isSectionPrefix(StringRef Prefix, StringRef Name) {
|
||||||
|
return Name.startswith(Prefix) || Name == Prefix.drop_back();
|
||||||
|
}
|
||||||
|
|
||||||
StringRef elf::getOutputSectionName(InputSectionBase *S) {
|
StringRef elf::getOutputSectionName(InputSectionBase *S) {
|
||||||
if (Config->Relocatable)
|
if (Config->Relocatable)
|
||||||
return S->Name;
|
return S->Name;
|
||||||
|
@ -104,13 +108,25 @@ StringRef elf::getOutputSectionName(InputSectionBase *S) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This check is for -z keep-text-section-prefix. This option separates text
|
||||||
|
// sections with prefix ".text.hot", ".text.unlikely", ".text.startup" or
|
||||||
|
// ".text.exit".
|
||||||
|
// When enabled, this allows identifying the hot code region (.text.hot) in
|
||||||
|
// the final binary which can be selectively mapped to huge pages or mlocked,
|
||||||
|
// for instance.
|
||||||
|
if (Config->ZKeepTextSectionPrefix)
|
||||||
|
for (StringRef V :
|
||||||
|
{".text.hot.", ".text.unlikely.", ".text.startup.", ".text.exit."}) {
|
||||||
|
if (isSectionPrefix(V, S->Name))
|
||||||
|
return V.drop_back();
|
||||||
|
}
|
||||||
|
|
||||||
for (StringRef V :
|
for (StringRef V :
|
||||||
{".text.", ".rodata.", ".data.rel.ro.", ".data.", ".bss.rel.ro.",
|
{".text.", ".rodata.", ".data.rel.ro.", ".data.", ".bss.rel.ro.",
|
||||||
".bss.", ".init_array.", ".fini_array.", ".ctors.", ".dtors.", ".tbss.",
|
".bss.", ".init_array.", ".fini_array.", ".ctors.", ".dtors.", ".tbss.",
|
||||||
".gcc_except_table.", ".tdata.", ".ARM.exidx.", ".ARM.extab."}) {
|
".gcc_except_table.", ".tdata.", ".ARM.exidx.", ".ARM.extab."}) {
|
||||||
StringRef Prefix = V.drop_back();
|
if (isSectionPrefix(V, S->Name))
|
||||||
if (S->Name.startswith(V) || S->Name == Prefix)
|
return V.drop_back();
|
||||||
return Prefix;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CommonSection is identified as "COMMON" in linker scripts.
|
// CommonSection is identified as "COMMON" in linker scripts.
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
# RUN: llvm-mc -filetype=obj %s -o %t
|
||||||
|
# RUN: ld.lld -z keep-text-section-prefix %t -o %t2
|
||||||
|
# RUN: llvm-readelf -l %t2 | FileCheck %s
|
||||||
|
# RUN: ld.lld %t -o %t3
|
||||||
|
# RUN: llvm-readelf -l %t3 | FileCheck --check-prefix=CHECKNO %s
|
||||||
|
# RUN: ld.lld -z nokeep-text-section-prefix %t -o %t4
|
||||||
|
# RUN: llvm-readelf -l %t4 | FileCheck --check-prefix=CHECKNO %s
|
||||||
|
|
||||||
|
# CHECK: .text
|
||||||
|
# CHECK: .text.hot
|
||||||
|
# CHECK: .text.startup
|
||||||
|
# CHECK: .text.exit
|
||||||
|
# CHECK: .text.unlikely
|
||||||
|
# CHECKNO: .text
|
||||||
|
# CHECKNO-NOT: .text.hot
|
||||||
|
|
||||||
|
_start:
|
||||||
|
ret
|
||||||
|
|
||||||
|
.section .text.f,"ax"
|
||||||
|
f:
|
||||||
|
nop
|
||||||
|
|
||||||
|
.section .text.hot.f_hot,"ax"
|
||||||
|
f_hot:
|
||||||
|
nop
|
||||||
|
|
||||||
|
.section .text.startup.f_startup,"ax"
|
||||||
|
f_startup:
|
||||||
|
nop
|
||||||
|
|
||||||
|
.section .text.exit.f_exit,"ax"
|
||||||
|
f_exit:
|
||||||
|
nop
|
||||||
|
|
||||||
|
.section .text.unlikely.f_unlikely,"ax"
|
||||||
|
f_unlikely:
|
||||||
|
nop
|
Loading…
Reference in New Issue