[PATCH] D128111: [BOLT] Allow function entry to be a cold fragment

Huan Nguyen via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 17 17:49:58 PDT 2022


nhuhuan created this revision.
Herald added a reviewer: rafauler.
Herald added a subscriber: ayermolo.
Herald added a reviewer: Amir.
Herald added a reviewer: maksfb.
Herald added a project: All.
nhuhuan requested review of this revision.
Herald added subscribers: llvm-commits, yota9.
Herald added a project: LLVM.

Allow cold fragment to get new address.

Our previous assumption is that a fragment (.cold) is only reached
through the main fragment of same function. In addition, .cold fragment
must be reached through either (a) direct transfer, or (b) split jump
table. For (a), we do simple a fix-up. For (b), we currently mark
all relevant fragments as non-simple. Therefore, there is no need to
get new address for .cold fragment.

This is not always the case, as function entry can be rarely executed,
and is placed in .text.cold segment. Therfore, we remove the assertion.

Test Plan:

  ninja check-bolt


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D128111

Files:
  bolt/lib/Rewrite/RewriteInstance.cpp
  bolt/test/X86/shared_object_entry.s


Index: bolt/test/X86/shared_object_entry.s
===================================================================
--- /dev/null
+++ bolt/test/X86/shared_object_entry.s
@@ -0,0 +1,36 @@
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-unknown %s -o %t.o 
+# RUN: ld.lld %t.o -o %t.so --shared --entry=func1.cold.1 --emit-relocs 
+# RUN: llvm-bolt -relocs %t.so -o %t -reorder-functions=hfsort+ -split-functions=3 -reorder-blocks=ext-tsp -split-all-cold -dyno-stats -icf=1 -use-gnu-stack
+
+# Check that an entry point is a cold symbol
+# RUN: llvm-readelf -h %t.so > %t.log
+# RUN: llvm-nm %t.so >> %t.log
+# RUN: FileCheck %s --input-file %t.log
+# CHECK: Entry point address: 0x[[#%X,ENTRY:]]
+# CHECK: [[#%x,ENTRY]] T func1.cold.1
+
+.globl func1.cold.1
+.type func1.cold.1, at function
+func1.cold.1:
+  .cfi_startproc
+.L1:
+		movq %rbx, %rdx
+		jmp .L3
+.L2:
+		# exit(0)
+		movq $60, %rax
+		xorq %rdi, %rdi
+		syscall
+  .size func1.cold.1, .-func1.cold.1
+  .cfi_endproc
+
+.globl func1
+.type func1, at function
+func1:
+  .cfi_startproc
+.L3:
+		movq %rax, %rdi
+		jmp .L2
+  call exit
+  .size func1, .-func1
+  .cfi_endproc
Index: bolt/lib/Rewrite/RewriteInstance.cpp
===================================================================
--- bolt/lib/Rewrite/RewriteInstance.cpp
+++ bolt/lib/Rewrite/RewriteInstance.cpp
@@ -5207,8 +5207,6 @@
   if (!Function)
     return 0;
 
-  assert(!Function->isFragment() && "cannot get new address for a fragment");
-
   return Function->getOutputAddress();
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D128111.438078.patch
Type: text/x-patch
Size: 1508 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220618/0cbb8a2a/attachment.bin>


More information about the llvm-commits mailing list