summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp117
-rw-r--r--lldb/source/Plugins/Process/Utility/UnwindAssemblyProfiler-x86.cpp24
-rw-r--r--lldb/source/Plugins/Process/Utility/UnwindLLDB.cpp22
3 files changed, 96 insertions, 67 deletions
diff --git a/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp b/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
index 7a657926475..b972ea3300e 100644
--- a/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
+++ b/lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
@@ -126,10 +126,23 @@ RegisterContextLLDB::InitializeZerothFrame()
m_cfa = cfa_regval + cfa_offset;
Log *log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND);
+
+ // A couple of sanity checks..
+ if (m_cfa == (addr_t) -1 || m_cfa == 0 || m_cfa == 1)
+ {
+ if (log)
+ {
+ log->Printf("%*sFrame %d could not find a valid cfa address",
+ m_frame_number, "", m_frame_number);
+ }
+ m_frame_type = eNotAValidFrame;
+ return;
+ }
+
if (log)
{
- log->Printf("%*sThread %u Frame %d initialized frame current pc is 0x%llx cfa is 0x%llx",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d initialized frame current pc is 0x%llx cfa is 0x%llx",
+ m_frame_number, "", m_frame_number,
(uint64_t) m_cfa, (uint64_t) current_pc.GetLoadAddress (&m_thread.GetProcess().GetTarget()));
}
}
@@ -164,8 +177,8 @@ RegisterContextLLDB::InitializeNonZerothFrame()
{
if (log)
{
- log->Printf("%*sThread %u Frame %d could not get pc value",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number);
+ log->Printf("%*sFrame %d could not get pc value",
+ m_frame_number, "", m_frame_number);
}
m_frame_type = eNotAValidFrame;
return;
@@ -179,8 +192,8 @@ RegisterContextLLDB::InitializeNonZerothFrame()
{
if (log)
{
- log->Printf("%*sThread %u Frame %d using architectural default unwind method",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number);
+ log->Printf("%*sFrame %d using architectural default unwind method",
+ m_frame_number, "", m_frame_number);
}
ArchSpec arch = m_thread.GetProcess().GetTarget().GetArchitecture ();
ArchDefaultUnwindPlan *arch_default = ArchDefaultUnwindPlan::FindPlugin (arch);
@@ -199,8 +212,8 @@ RegisterContextLLDB::InitializeNonZerothFrame()
{
if (log)
{
- log->Printf("%*sThread %u Frame %d failed to get cfa value",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number);
+ log->Printf("%*sFrame %d failed to get cfa value",
+ m_frame_number, "", m_frame_number);
}
m_frame_type = eNormalFrame;
return;
@@ -208,8 +221,8 @@ RegisterContextLLDB::InitializeNonZerothFrame()
m_cfa = cfa_regval + cfa_offset;
if (log)
{
- log->Printf("%*sThread %u Frame %d initialized frame current pc is 0x%llx cfa is 0x%llx",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d initialized frame current pc is 0x%llx cfa is 0x%llx",
+ m_frame_number, "", m_frame_number,
(uint64_t) m_cfa, (uint64_t) current_pc.GetLoadAddress (&m_thread.GetProcess().GetTarget()));
}
return;
@@ -281,8 +294,8 @@ RegisterContextLLDB::InitializeNonZerothFrame()
{
if (log)
{
- log->Printf("%*sThread %u Frame %d failed to get cfa reg %d/%d",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d failed to get cfa reg %d/%d",
+ m_frame_number, "", m_frame_number,
row_register_kind, active_row->GetCFARegister());
}
m_frame_type = eNotAValidFrame;
@@ -292,10 +305,22 @@ RegisterContextLLDB::InitializeNonZerothFrame()
m_cfa = cfa_regval + cfa_offset;
+ // A couple of sanity checks..
+ if (m_cfa == (addr_t) -1 || m_cfa == 0 || m_cfa == 1)
+ {
+ if (log)
+ {
+ log->Printf("%*sFrame %d could not find a valid cfa address",
+ m_frame_number, "", m_frame_number);
+ }
+ m_frame_type = eNotAValidFrame;
+ return;
+ }
+
if (log)
{
- log->Printf("%*sThread %u Frame %d initialized frame current pc is 0x%llx cfa is 0x%llx",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d initialized frame current pc is 0x%llx cfa is 0x%llx",
+ m_frame_number, "", m_frame_number,
(uint64_t) m_cfa, (uint64_t) current_pc.GetLoadAddress (&m_thread.GetProcess().GetTarget()));
}
}
@@ -448,13 +473,13 @@ RegisterContextLLDB::GetUnwindPlansForFrame (Address current_pc)
}
Log *log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND);
- if (log)
+ if (log && IsLogVerbose())
{
const char *has_fast = "";
if (m_fast_unwind_plan)
has_fast = ", and has a fast UnwindPlan";
- log->Printf("%*sThread %u Frame %d frame uses %s for full UnwindPlan%s",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d frame uses %s for full UnwindPlan%s",
+ m_frame_number, "", m_frame_number,
m_full_unwind_plan->GetSourceName().GetCString(), has_fast);
}
@@ -630,8 +655,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc
{
if (log)
{
- log->Printf("%*sThread %u Frame %d could not supply caller's reg %d location",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d could not supply caller's reg %d location",
+ m_frame_number, "", m_frame_number,
lldb_regnum);
}
return false;
@@ -640,8 +665,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc
{
if (log)
{
- log->Printf("%*sThread %u Frame %d supplying caller's saved reg %d's location using FastUnwindPlan",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d supplying caller's saved reg %d's location using FastUnwindPlan",
+ m_frame_number, "", m_frame_number,
lldb_regnum);
}
have_unwindplan_regloc = true;
@@ -655,8 +680,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc
{
if (log)
{
- log->Printf("%*sThread %u Frame %d could not supply caller's reg %d location",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d could not supply caller's reg %d location",
+ m_frame_number, "", m_frame_number,
lldb_regnum);
}
return false;
@@ -665,10 +690,10 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc
if (active_row->GetRegisterInfo (row_regnum, unwindplan_regloc))
{
have_unwindplan_regloc = true;
- if (log)
+ if (log && IsLogVerbose ())
{
- log->Printf("%*sThread %u Frame %d supplying caller's saved reg %d's location using %s UnwindPlan",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d supplying caller's saved reg %d's location using %s UnwindPlan",
+ m_frame_number, "", m_frame_number,
lldb_regnum, m_full_unwind_plan->GetSourceName().GetCString());
}
}
@@ -683,8 +708,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc
{
if (log)
{
- log->Printf("%*sThread %u Frame %d did not supply reg location for %d because it is volatile",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d did not supply reg location for %d because it is volatile",
+ m_frame_number, "", m_frame_number,
lldb_regnum);
}
return false;
@@ -702,18 +727,12 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc
new_regloc.location.register_number = lldb_regnum;
m_registers[lldb_regnum] = new_regloc;
regloc = new_regloc;
- if (log)
- {
- log->Printf("%*sThread %u Frame %d register %d is in the thread's live register context",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
- lldb_regnum);
- }
return true;
}
if (log)
{
- log->Printf("%*sThread %u Frame %d could not supply caller's reg %d location",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d could not supply caller's reg %d location",
+ m_frame_number, "", m_frame_number,
lldb_regnum);
}
return false;
@@ -727,8 +746,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc
m_registers[lldb_regnum] = new_regloc;
if (log)
{
- log->Printf("%*sThread %u Frame %d could not supply caller's reg %d location",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d could not supply caller's reg %d location",
+ m_frame_number, "", m_frame_number,
lldb_regnum);
}
return false;
@@ -744,8 +763,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc
{
if (log)
{
- log->Printf("%*sThread %u Frame %d could not supply caller's reg %d location",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d could not supply caller's reg %d location",
+ m_frame_number, "", m_frame_number,
lldb_regnum);
}
return false;
@@ -778,8 +797,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc
{
if (log)
{
- log->Printf("%*sThread %u Frame %d could not supply caller's reg %d location",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d could not supply caller's reg %d location",
+ m_frame_number, "", m_frame_number,
lldb_regnum);
}
return false;
@@ -792,8 +811,8 @@ RegisterContextLLDB::SavedLocationForRegister (uint32_t lldb_regnum, RegisterLoc
if (log)
{
- log->Printf("%*sThread %u Frame %d could not supply caller's reg %d location",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d could not supply caller's reg %d location",
+ m_frame_number, "", m_frame_number,
lldb_regnum);
}
@@ -875,10 +894,10 @@ RegisterContextLLDB::ReadRegisterBytes (uint32_t lldb_reg, DataExtractor& data)
if (!IsValid())
return false;
- if (log)
+ if (log && IsLogVerbose ())
{
- log->Printf("%*sThread %u Frame %d looking for register saved location for reg %d",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d looking for register saved location for reg %d",
+ m_frame_number, "", m_frame_number,
lldb_reg);
}
@@ -887,8 +906,8 @@ RegisterContextLLDB::ReadRegisterBytes (uint32_t lldb_reg, DataExtractor& data)
{
if (log)
{
- log->Printf("%*sThread %u Frame %d passing along to the live register context for reg %d",
- m_frame_number, "", m_thread.GetIndexID(), m_frame_number,
+ log->Printf("%*sFrame %d passing along to the live register context for reg %d",
+ m_frame_number, "", m_frame_number,
lldb_reg);
}
return m_base_reg_ctx->ReadRegisterBytes (lldb_reg, data);
diff --git a/lldb/source/Plugins/Process/Utility/UnwindAssemblyProfiler-x86.cpp b/lldb/source/Plugins/Process/Utility/UnwindAssemblyProfiler-x86.cpp
index 0e2a4a7f719..58b2ee0ac5c 100644
--- a/lldb/source/Plugins/Process/Utility/UnwindAssemblyProfiler-x86.cpp
+++ b/lldb/source/Plugins/Process/Utility/UnwindAssemblyProfiler-x86.cpp
@@ -480,14 +480,14 @@ AssemblyParse_x86::instruction_length (Address addr, int &length)
const char *triple;
// FIXME should probably pass down the ArchSpec and work from that to make a portable triple
if (m_cpu == k_i386)
- triple = "i386-apple-darwin";
+ triple = "i386-unknown-unknown";
else
- triple = "x86_64-apple-darwin";
+ triple = "x86_64-unknown-unknown";
EDDisassemblerRef disasm;
EDInstRef cur_insn;
- if (EDGetDisassembler (&disasm, "i386-apple-darwin", kEDAssemblySyntaxX86ATT) != 0)
+ if (EDGetDisassembler (&disasm, triple, kEDAssemblySyntaxX86ATT) != 0)
{
return false;
}
@@ -565,7 +565,15 @@ AssemblyParse_x86::get_non_call_site_unwind_plan (UnwindPlan &unwind_plan)
unwind_plan.AppendRow (row);
goto loopnext;
}
-
+
+ if (mov_rsp_rbp_pattern_p ())
+ {
+ row.SetOffset (current_func_text_offset + insn_len);
+ row.SetCFARegister (m_lldb_fp_regnum);
+ unwind_plan.AppendRow (row);
+ goto loopnext;
+ }
+
// This is the start() function (or a pthread equivalent), it starts with a pushl $0x0 which puts the
// saved pc value of 0 on the stack. In this case we want to pretend we didn't see a stack movement at all --
// normally the saved pc value is already on the stack by the time the function starts executing.
@@ -617,14 +625,6 @@ AssemblyParse_x86::get_non_call_site_unwind_plan (UnwindPlan &unwind_plan)
goto loopnext;
}
- if (mov_rsp_rbp_pattern_p ())
- {
- row.SetOffset (current_func_text_offset + insn_len);
- row.SetCFARegister (m_lldb_fp_regnum);
- unwind_plan.AppendRow (row);
- goto loopnext;
- }
-
if (ret_pattern_p ())
{
// we know where the end of the function is; set the limit on the PlanValidAddressRange
diff --git a/lldb/source/Plugins/Process/Utility/UnwindLLDB.cpp b/lldb/source/Plugins/Process/Utility/UnwindLLDB.cpp
index 6d4c345e28e..e2d2f9c8f67 100644
--- a/lldb/source/Plugins/Process/Utility/UnwindLLDB.cpp
+++ b/lldb/source/Plugins/Process/Utility/UnwindLLDB.cpp
@@ -71,8 +71,8 @@ UnwindLLDB::GetFrameCount()
delete register_ctx;
if (log)
{
- log->Printf("%*sThread %u Frame %d invalid RegisterContext for this frame, stopping stack walk",
- cur_idx, "", m_thread.GetIndexID(), cur_idx);
+ log->Printf("%*sFrame %d invalid RegisterContext for this frame, stopping stack walk",
+ cur_idx, "", cur_idx);
}
break;
}
@@ -81,8 +81,18 @@ UnwindLLDB::GetFrameCount()
delete register_ctx;
if (log)
{
- log->Printf("%*sThread %u Frame %d did not get CFA for this frame, stopping stack walk",
- cur_idx, "", m_thread.GetIndexID(), cur_idx);
+ log->Printf("%*sFrame %d did not get CFA for this frame, stopping stack walk",
+ cur_idx, "", cur_idx);
+ }
+ break;
+ }
+ if (cursor.cfa == (addr_t) -1 || cursor.cfa == 1 || cursor.cfa == 0)
+ {
+ delete register_ctx;
+ if (log)
+ {
+ log->Printf("%*sFrame %d did not get a valid CFA for this frame, stopping stack walk",
+ cur_idx, "", cur_idx);
}
break;
}
@@ -91,8 +101,8 @@ UnwindLLDB::GetFrameCount()
delete register_ctx;
if (log)
{
- log->Printf("%*sThread %u Frame %d did not get PC for this frame, stopping stack walk",
- cur_idx, "", m_thread.GetIndexID(), cur_idx);
+ log->Printf("%*sFrame %d did not get PC for this frame, stopping stack walk",
+ cur_idx, "", cur_idx);
}
break;
}
OpenPOWER on IntegriCloud