[PATCH] D79600: [TargetLoweringObjectFileImpl] Produce .text.hot. instead of .text.hot for -fno-unique-section-names

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu May 7 14:41:35 PDT 2020


MaskRay created this revision.
MaskRay added reviewers: tmsriram, wmi.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.
MaskRay edited the summary of this revision.

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)
  }

This has a slightly annoying issue that the C library function `exit` will be placed in a different place.
gold uses -z keep-text-section-prefix to control grouping but has the same problem.

In lld, we only recognize `.text.{exit,hot,startup,unlikely,unknown}.*` to avoid the problem.

Currently, -fno-unique-section-names can produce .text.hot, which can't be recognized by lld -z keep-text-section-prefix. Append a dot to avoid the issue.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D79600

Files:
  llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
  llvm/test/Transforms/CodeGenPrepare/X86/section.ll


Index: llvm/test/Transforms/CodeGenPrepare/X86/section.ll
===================================================================
--- llvm/test/Transforms/CodeGenPrepare/X86/section.ll
+++ llvm/test/Transforms/CodeGenPrepare/X86/section.ll
@@ -1,10 +1,14 @@
 ; RUN: opt < %s -codegenprepare -S | FileCheck %s
+; RUN: llc < %s | FileCheck --check-prefix=ASM1 %s
+; RUN: llc < %s -function-sections | FileCheck --check-prefix=ASM2 %s
 
 target triple = "x86_64-pc-linux-gnu"
 
 ; This tests that hot/cold functions get correct section prefix assigned
 
 ; CHECK: hot_func1{{.*}}!section_prefix ![[HOT_ID:[0-9]+]]
+; ASM1: .section .text.hot.,"ax", at progbits
+; ASM2: .section .text.hot.hot_func1,"ax", at progbits
 ; The entry is hot
 define void @hot_func1() !prof !15 {
   ret void
@@ -40,6 +44,8 @@
 ; not call site VP metadata (which can exist on value profiled memcpy,
 ; or possibly left behind after static analysis based devirtualization).
 ; CHECK: cold_func1{{.*}}!section_prefix ![[COLD_ID:[0-9]+]]
+; ASM1: .section .text.unlikely.,"ax", at progbits
+; ASM2: .section .text.unlikely.cold_func1,"ax", at progbits
 define void @cold_func1() !prof !16 {
   call void @hot_func1(), !prof !17
   call void @hot_func1(), !prof !17
Index: llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
===================================================================
--- llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -611,15 +611,19 @@
     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;
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D79600.262763.patch
Type: text/x-patch
Size: 1994 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200507/b39d5862/attachment-0001.bin>


More information about the llvm-commits mailing list