Index: source/Plugins/ABI/SysV-ppc64/ABISysV_ppc64.cpp =================================================================== --- source/Plugins/ABI/SysV-ppc64/ABISysV_ppc64.cpp +++ source/Plugins/ABI/SysV-ppc64/ABISysV_ppc64.cpp @@ -70,13 +70,11 @@ //------------------------------------------------------------------ ABISP -ABISysV_ppc64::CreateInstance(lldb::ProcessSP process_sp, const ArchSpec &arch) { - static ABISP g_abi_sp; +ABISysV_ppc64::CreateInstance(lldb::ProcessSP process_sp, + const ArchSpec &arch) { if (arch.GetTriple().getArch() == llvm::Triple::ppc64 || arch.GetTriple().getArch() == llvm::Triple::ppc64le) { - if (!g_abi_sp) - g_abi_sp.reset(new ABISysV_ppc64(process_sp)); - return g_abi_sp; + return ABISP(new ABISysV_ppc64(process_sp)); } return ABISP(); } Index: source/Target/ThreadPlanStepInRange.cpp =================================================================== --- source/Target/ThreadPlanStepInRange.cpp +++ source/Target/ThreadPlanStepInRange.cpp @@ -25,6 +25,8 @@ #include "lldb/Utility/RegularExpression.h" #include "lldb/Utility/Stream.h" +#include "llvm/BinaryFormat/ELF.h" + using namespace lldb; using namespace lldb_private; @@ -264,11 +266,27 @@ eSymbolContextSymbol); if (sc.function) { + // get absolute function start address func_start_address = sc.function->GetAddressRange().GetBaseAddress(); - if (curr_addr == - func_start_address.GetLoadAddress( - m_thread.CalculateTarget().get())) + TargetSP target = m_thread.CalculateTarget(); + lldb::addr_t func_abs_start_addr = + func_start_address.GetLoadAddress(target.get()); + + // compare to current address + if (curr_addr == func_abs_start_addr) { bytes_to_skip = sc.function->GetPrologueByteSize(); + // ppc64le functions may have 2 entry points: global and local + } else if (target->GetArchitecture().GetTriple().getArch() == + llvm::Triple::ppc64le && + target->GetArchitecture().GetTriple().getObjectFormat() == + llvm::Triple::ObjectFormatType::ELF && + sc.symbol) { + uint32_t flags = sc.symbol->GetFlags(); + unsigned char other = flags >> 8 & 0xFF; + int64_t offs = llvm::ELF::decodePPC64LocalEntryOffset(other); + if (curr_addr == func_abs_start_addr + offs) + bytes_to_skip = sc.function->GetPrologueByteSize(); + } } else if (sc.symbol) { func_start_address = sc.symbol->GetAddress(); if (curr_addr ==