mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 19:26:45 +00:00
[lldb] fix step in AArch64 trampoline (#90783)
Detects AArch64 trampolines in order to be able to step in a function through a trampoline on AArch64. --------- Co-authored-by: Vincent Belliard <v-bulle@github.com>
This commit is contained in:
parent
6f2997cefc
commit
b22a6f1eba
@ -506,6 +506,19 @@ DynamicLoaderPOSIXDYLD::GetStepThroughTrampolinePlan(Thread &thread,
|
||||
Target &target = thread.GetProcess()->GetTarget();
|
||||
const ModuleList &images = target.GetImages();
|
||||
|
||||
llvm::StringRef target_name = sym_name.GetStringRef();
|
||||
// On AArch64, the trampoline name has a prefix (__AArch64ADRPThunk_ or
|
||||
// __AArch64AbsLongThunk_) added to the function name. If we detect a
|
||||
// trampoline with the prefix, we need to remove the prefix to find the
|
||||
// function symbol.
|
||||
if (target_name.consume_front("__AArch64ADRPThunk_") ||
|
||||
target_name.consume_front("__AArch64AbsLongThunk_")) {
|
||||
// An empty target name can happen for trampolines generated for
|
||||
// section-referencing relocations.
|
||||
if (!target_name.empty()) {
|
||||
sym_name = ConstString(target_name);
|
||||
}
|
||||
}
|
||||
images.FindSymbolsWithNameAndType(sym_name, eSymbolTypeCode, target_symbols);
|
||||
if (!target_symbols.GetSize())
|
||||
return thread_plan_sp;
|
||||
|
@ -2356,13 +2356,30 @@ unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
|
||||
bool symbol_size_valid =
|
||||
symbol.st_size != 0 || symbol.getType() != STT_FUNC;
|
||||
|
||||
bool is_trampoline = false;
|
||||
if (arch.IsValid() && (arch.GetMachine() == llvm::Triple::aarch64)) {
|
||||
// On AArch64, trampolines are registered as code.
|
||||
// If we detect a trampoline (which starts with __AArch64ADRPThunk_ or
|
||||
// __AArch64AbsLongThunk_) we register the symbol as a trampoline. This
|
||||
// way we will be able to detect the trampoline when we step in a function
|
||||
// and step through the trampoline.
|
||||
if (symbol_type == eSymbolTypeCode) {
|
||||
llvm::StringRef trampoline_name = mangled.GetName().GetStringRef();
|
||||
if (trampoline_name.starts_with("__AArch64ADRPThunk_") ||
|
||||
trampoline_name.starts_with("__AArch64AbsLongThunk_")) {
|
||||
symbol_type = eSymbolTypeTrampoline;
|
||||
is_trampoline = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Symbol dc_symbol(
|
||||
i + start_id, // ID is the original symbol table index.
|
||||
mangled,
|
||||
symbol_type, // Type of this symbol
|
||||
is_global, // Is this globally visible?
|
||||
false, // Is this symbol debug info?
|
||||
false, // Is this symbol a trampoline?
|
||||
is_trampoline, // Is this symbol a trampoline?
|
||||
false, // Is this symbol artificial?
|
||||
AddressRange(symbol_section_sp, // Section in which this symbol is
|
||||
// defined or null.
|
||||
|
15
lldb/test/Shell/ExecControl/StepIn/Inputs/aarch64_thunk.cc
Normal file
15
lldb/test/Shell/ExecControl/StepIn/Inputs/aarch64_thunk.cc
Normal file
@ -0,0 +1,15 @@
|
||||
extern "C" int __attribute__((naked)) __AArch64ADRPThunk_step_here() {
|
||||
asm (
|
||||
"adrp x16, step_here\n"
|
||||
"add x16, x16, :lo12:step_here\n"
|
||||
"br x16"
|
||||
);
|
||||
}
|
||||
|
||||
extern "C" __attribute__((used)) int step_here() {
|
||||
return 47;
|
||||
}
|
||||
|
||||
int main() {
|
||||
return __AArch64ADRPThunk_step_here();
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
# REQUIRES: native && target-aarch64
|
||||
|
||||
# This test is specific to elf platforms.
|
||||
# UNSUPPORTED: system-windows, system-darwin
|
||||
|
||||
# RUN: %clangxx_host %p/Inputs/aarch64_thunk.cc -g -o %t.out
|
||||
# RUN: %lldb %t.out -s %s | FileCheck %s
|
||||
|
||||
b main
|
||||
# CHECK: Breakpoint 1: where = step_through-aarch64-thunk.test.tmp.out`main
|
||||
|
||||
r
|
||||
# CHECK: stop reason = breakpoint 1.1
|
||||
|
||||
s
|
||||
# CHECK: stop reason = step in
|
||||
# CHECK: frame #0: {{.*}} step_through-aarch64-thunk.test.tmp.out`::step_here()
|
Loading…
x
Reference in New Issue
Block a user