diff options
author | Fangrui Song <maskray@google.com> | 2020-05-07 14:00:24 -0700 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2020-05-12 14:14:17 -0700 |
commit | 66055230bf6673b76e7330fef76d752a1ea8638e (patch) | |
tree | 87540864beaf46ee8f5e6a4d66029f7b85a93e5d /llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp | |
parent | 363393c4b35997c67e6b282bd2be9022a7bfed25 (diff) | |
download | llvm-66055230bf6673b76e7330fef76d752a1ea8638e.zip llvm-66055230bf6673b76e7330fef76d752a1ea8638e.tar.gz llvm-66055230bf6673b76e7330fef76d752a1ea8638e.tar.bz2 |
[TargetLoweringObjectFileImpl] Produce .text.hot. instead of .text.hot for -fno-unique-section-names
GNU ld's internal linker script uses (https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=add44f8d5c5c05e08b11e033127a744d61c26aee)
.text :
{
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
*(.text.exit .text.exit.*)
*(.text.startup .text.startup.*)
*(.text.hot .text.hot.*)
*(SORT(.text.sorted.*))
*(.text .stub .text.* .gnu.linkonce.t.*)
/* .gnu.warning sections are handled specially by elf.em. */
*(.gnu.warning)
}
Because `*(.text.exit .text.exit.*)` is ordered before `*(.text .text.*)`, in a -ffunction-sections build, the C library function `exit` will be placed before other functions.
gold's `-z keep-text-section-prefix` has the same problem.
In lld, `-z keep-text-section-prefix` recognizes `.text.{exit,hot,startup,unlikely,unknown}.*`, but not `.text.{exit,hot,startup,unlikely,unknown}`, to avoid the strange placement problem.
In -fno-function-sections or -fno-unique-section-names mode, a function whose `function_section_prefix` is set to `.exit"`
will go to the output section `.text` instead of `.text.exit` when linked by lld.
To address the problem, append a dot to become `.text.exit.`
Reviewed By: grimar
Differential Revision: https://reviews.llvm.org/D79600
Diffstat (limited to 'llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp')
-rw-r--r-- | llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index a9b1455..a3bfd65 100644 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -611,15 +611,19 @@ getELFSectionNameForGlobal(const GlobalObject *GO, SectionKind Kind, Name = getSectionPrefixForGlobal(Kind); } + bool HasPrefix = false; if (const auto *F = dyn_cast<Function>(GO)) { - if (Optional<StringRef> Prefix = F->getSectionPrefix()) + if (Optional<StringRef> Prefix = F->getSectionPrefix()) { Name += *Prefix; + HasPrefix = true; + } } if (UniqueSectionName) { Name.push_back('.'); TM.getNameWithPrefix(Name, GO, Mang, /*MayAlwaysUsePrivate*/true); - } + } else if (HasPrefix) + Name.push_back('.'); return Name; } |