2727#include " lldb/Target/Thread.h"
2828#include " lldb/Target/ThreadPlanCallFunction.h"
2929#include " lldb/Target/ThreadPlanRunToAddress.h"
30+ #include " lldb/Target/ThreadPlanStepInstruction.h"
3031#include " lldb/Utility/DataBuffer.h"
3132#include " lldb/Utility/DataBufferHeap.h"
3233#include " lldb/Utility/LLDBLog.h"
@@ -930,15 +931,15 @@ DynamicLoaderDarwin::GetStepThroughTrampolinePlan(Thread &thread,
930931 if (current_symbol != nullptr ) {
931932 std::vector<Address> addresses;
932933
934+ ConstString current_name =
935+ current_symbol->GetMangled ().GetName (Mangled::ePreferMangled);
933936 if (current_symbol->IsTrampoline ()) {
934- ConstString trampoline_name =
935- current_symbol->GetMangled ().GetName (Mangled::ePreferMangled);
936937
937- if (trampoline_name ) {
938+ if (current_name ) {
938939 const ModuleList &images = target_sp->GetImages ();
939940
940941 SymbolContextList code_symbols;
941- images.FindSymbolsWithNameAndType (trampoline_name , eSymbolTypeCode,
942+ images.FindSymbolsWithNameAndType (current_name , eSymbolTypeCode,
942943 code_symbols);
943944 for (const SymbolContext &context : code_symbols) {
944945 AddressRange addr_range;
@@ -955,8 +956,8 @@ DynamicLoaderDarwin::GetStepThroughTrampolinePlan(Thread &thread,
955956 }
956957
957958 SymbolContextList reexported_symbols;
958- images.FindSymbolsWithNameAndType (
959- trampoline_name, eSymbolTypeReExported, reexported_symbols);
959+ images.FindSymbolsWithNameAndType (current_name, eSymbolTypeReExported,
960+ reexported_symbols);
960961 for (const SymbolContext &context : reexported_symbols) {
961962 if (context.symbol ) {
962963 Symbol *actual_symbol =
@@ -978,7 +979,7 @@ DynamicLoaderDarwin::GetStepThroughTrampolinePlan(Thread &thread,
978979 }
979980
980981 SymbolContextList indirect_symbols;
981- images.FindSymbolsWithNameAndType (trampoline_name , eSymbolTypeResolver,
982+ images.FindSymbolsWithNameAndType (current_name , eSymbolTypeResolver,
982983 indirect_symbols);
983984
984985 for (const SymbolContext &context : indirect_symbols) {
@@ -1041,6 +1042,23 @@ DynamicLoaderDarwin::GetStepThroughTrampolinePlan(Thread &thread,
10411042 thread_plan_sp = std::make_shared<ThreadPlanRunToAddress>(
10421043 thread, load_addrs, stop_others);
10431044 }
1045+ // One more case we have to consider is "branch islands". These are regular
1046+ // TEXT symbols but their names end in .island plus maybe a .digit suffix.
1047+ // They are to allow arm64 code to branch further than the size of the
1048+ // address slot allows. We just need to single-instruction step in that
1049+ // case.
1050+ static const char *g_branch_island_pattern = " \\ .island\\ .?[0-9]*$" ;
1051+ static RegularExpression g_branch_island_regex (g_branch_island_pattern);
1052+
1053+ bool is_branch_island = g_branch_island_regex.Execute (current_name);
1054+ if (!thread_plan_sp && is_branch_island) {
1055+ thread_plan_sp = std::make_shared<ThreadPlanStepInstruction>(
1056+ thread,
1057+ /* step_over= */ false , /* stop_others */ false , eVoteNoOpinion,
1058+ eVoteNoOpinion);
1059+ LLDB_LOG (log, " Stepping one instruction over branch island: '{0}'." ,
1060+ current_name);
1061+ }
10441062 } else {
10451063 LLDB_LOGF (log, " Could not find symbol for step through." );
10461064 }
0 commit comments