llvm-project/lldb/test/Shell/Unwind/split-machine-functions.test
Sriraman Tallam 9aa7a721ce Test to check backtraces with machine function splitting.
clang supports option -fsplit-machine-functions and this test checks if the
backtraces are sane when functions are split.

With -fsplit-machine-functions, a function with profiles can get split into 2
parts, the original function containing hot code and a cold part as determined
by the profile info and the cold cutoff threshold.. The cold part gets the
".cold" suffix to disambiguate its symbol from the hot part and can be placed
arbitrarily in the address space.

This test checks if the back-trace looks correct when the cold part is executed.

Differential Revision: https://reviews.llvm.org/D90081
2020-10-26 14:08:42 -07:00

47 lines
1.7 KiB
Plaintext

# Test to check if machine function splitter still produces the right backtraces
# with lldb when a function is split into a hot and cold part and the cold part
# is executed. The cold part has the same function symbol name but with a
# ".cold" suffix and this test checks that the back trace is clear.
# UNSUPPORTED: system-darwin, system-windows
# REQUIRES: target-x86_64
# REQUIRES: lld
# RUN: split-file %s %t.split
#
# RUN: %clang_host %p/Inputs/split-machine-functions.ll -o %t
# RUN: %lldb %t -s %t.split/commands -o exit | FileCheck %s --check-prefix=DEFAULT
#
# RUN: %clang_host %p/Inputs/split-machine-functions.ll -fsplit-machine-functions -o %t
# RUN: %lldb %t -s %t.split/commands -o exit | FileCheck %s --check-prefix=SPLIT
#
# Test a permutation where foo.cold is very far from foo. The default ordering does not
# ensure that there will be a gap between foo and foo.cold. Using a symbol ordering
# file guarantees this
# RUN: %clang_host %p/Inputs/split-machine-functions.ll -fsplit-machine-functions -o %t -fuse-ld=lld -Wl,--symbol-ordering-file,%t.split/sym_order_1.txt -Wl,--warn-symbol-ordering -Wl,--fatal-warnings
# RUN: %lldb %t -s %t.split/commands -o exit | FileCheck %s --check-prefix=SPLIT
#--- commands
breakpoint set -n bar
# DEFAULT: Breakpoint 1: where = {{.*}}`bar
# SPLIT: Breakpoint 1: where = {{.*}}`bar
process launch
# DEFAULT: stop reason = breakpoint 1.1
# SPLIT: stop reason = breakpoint 1.1
thread backtrace
# DEFAULT: frame #0: {{.*}}`bar
# DEFAULT: frame #1: {{.*}}`foo() +
# DEFAULT: frame #2: {{.*}}`main +
# SPLIT: frame #0: {{.*}}`bar
# SPLIT: frame #1: {{.*}}`foo() (.cold) +
# SPLIT: frame #2: {{.*}}`main +
#--- sym_order_1.txt
_Z3foov
main
_Z3barv
_Z3bazv
_Z3foov.cold