Skip to content

Commit

Permalink
[BOLT] Allow function entry to be a cold fragment
Browse files Browse the repository at this point in the history
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 perform a simple 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. Essentially we cannot tell which
the source-level function entry is based on hot and cold segments,
so we must treat each fragment a function on its own. Therfore, we
remove the assertion that a function entry cannot be cold fragment.

Test Plan:
```
ninja check-bolt
```

Reviewed By: Amir

Differential Revision: https://reviews.llvm.org/D128111
  • Loading branch information
nhuhuan authored and aaupov committed Jun 18, 2022
1 parent 545a71c commit 543f13c
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 2 deletions.
2 changes: 0 additions & 2 deletions bolt/lib/Rewrite/RewriteInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5207,8 +5207,6 @@ uint64_t RewriteInstance::getNewFunctionAddress(uint64_t OldAddress) {
if (!Function)
return 0;

assert(!Function->isFragment() && "cannot get new address for a fragment");

return Function->getOutputAddress();
}

Expand Down
38 changes: 38 additions & 0 deletions bolt/test/X86/shared_object_entry.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# 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+ \
# RUN: -split-functions=3 -reorder-blocks=ext-tsp -split-all-cold \
# RUN: -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]] {{.*}} func1.cold.1

.globl func1.cold.1
.type func1.cold.1,@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,@function
func1:
.cfi_startproc
.L3:
movq %rax, %rdi
jmp .L2
call exit
.size func1, .-func1
.cfi_endproc

0 comments on commit 543f13c

Please sign in to comment.