blob: 9056a3ffb9d4449bc4e254f60e23c32f794402c2 [file] [log] [blame]
Jason Molendaab4f1922010-10-25 11:12:07 +00001//===-- UnwindLLDB.cpp -------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Greg Claytondc5eb692011-04-25 18:36:36 +000010#include "lldb/Core/Module.h"
11#include "lldb/Core/Log.h"
12#include "lldb/Symbol/FuncUnwinders.h"
13#include "lldb/Symbol/Function.h"
14#include "lldb/Symbol/UnwindPlan.h"
Jason Molendaab4f1922010-10-25 11:12:07 +000015#include "lldb/Target/Thread.h"
16#include "lldb/Target/Target.h"
17#include "lldb/Target/Process.h"
18#include "lldb/Target/RegisterContext.h"
Jason Molendaab4f1922010-10-25 11:12:07 +000019
Greg Claytone576ab22011-02-15 00:19:15 +000020#include "UnwindLLDB.h"
21#include "RegisterContextLLDB.h"
22
Jason Molendaab4f1922010-10-25 11:12:07 +000023using namespace lldb;
24using namespace lldb_private;
25
26UnwindLLDB::UnwindLLDB (Thread &thread) :
27 Unwind (thread),
Jim Inghamb0c72a52012-02-29 03:40:22 +000028 m_frames(),
29 m_unwind_complete(false)
Jason Molendaab4f1922010-10-25 11:12:07 +000030{
31}
32
33uint32_t
Jim Ingham8f077162011-10-21 01:49:48 +000034UnwindLLDB::DoGetFrameCount()
Jason Molendaab4f1922010-10-25 11:12:07 +000035{
Jim Inghamb0c72a52012-02-29 03:40:22 +000036 if (!m_unwind_complete)
Jason Molendaab4f1922010-10-25 11:12:07 +000037 {
Greg Clayton58be07b2011-01-07 06:08:19 +000038//#define DEBUG_FRAME_SPEED 1
39#if DEBUG_FRAME_SPEED
Greg Clayton3e06bd92011-01-09 21:07:35 +000040#define FRAME_COUNT 10000
Greg Clayton58be07b2011-01-07 06:08:19 +000041 TimeValue time_value (TimeValue::Now());
42#endif
Jason Molenda8fed2952010-11-09 02:31:21 +000043 if (!AddFirstFrame ())
Jason Molendaab4f1922010-10-25 11:12:07 +000044 return 0;
Greg Clayton9b72eb72011-05-24 23:06:02 +000045
Greg Clayton1ac04c32012-02-21 00:09:25 +000046 ProcessSP process_sp (m_thread.GetProcess());
47 ABI *abi = process_sp ? process_sp->GetABI().get() : NULL;
Greg Clayton9b72eb72011-05-24 23:06:02 +000048
49 while (AddOneMoreFrame (abi))
Greg Clayton58be07b2011-01-07 06:08:19 +000050 {
51#if DEBUG_FRAME_SPEED
Greg Clayton3e06bd92011-01-09 21:07:35 +000052 if ((m_frames.size() % FRAME_COUNT) == 0)
Greg Clayton58be07b2011-01-07 06:08:19 +000053 {
54 TimeValue now(TimeValue::Now());
55 uint64_t delta_t = now - time_value;
Daniel Malead01b2952012-11-29 21:49:15 +000056 printf ("%u frames in %" PRIu64 ".%09llu ms (%g frames/sec)\n",
Greg Clayton3e06bd92011-01-09 21:07:35 +000057 FRAME_COUNT,
Peter Collingbourneba23ca02011-06-18 23:52:14 +000058 delta_t / TimeValue::NanoSecPerSec,
59 delta_t % TimeValue::NanoSecPerSec,
60 (float)FRAME_COUNT / ((float)delta_t / (float)TimeValue::NanoSecPerSec));
Greg Clayton58be07b2011-01-07 06:08:19 +000061 time_value = now;
62 }
63#endif
64 }
Jason Molendaab4f1922010-10-25 11:12:07 +000065 }
66 return m_frames.size ();
67}
68
69bool
Jason Molenda8fed2952010-11-09 02:31:21 +000070UnwindLLDB::AddFirstFrame ()
71{
Jim Inghamb0c72a52012-02-29 03:40:22 +000072 if (m_frames.size() > 0)
73 return true;
74
Jason Molenda8fed2952010-11-09 02:31:21 +000075 // First, set up the 0th (initial) frame
76 CursorSP first_cursor_sp(new Cursor ());
Greg Claytone1cd1be2012-01-29 20:56:30 +000077 RegisterContextLLDBSP reg_ctx_sp (new RegisterContextLLDB (m_thread,
78 RegisterContextLLDBSP(),
79 first_cursor_sp->sctx,
80 0, *this));
Greg Clayton9b72eb72011-05-24 23:06:02 +000081 if (reg_ctx_sp.get() == NULL)
Jim Inghamb0c72a52012-02-29 03:40:22 +000082 goto unwind_done;
Greg Clayton5ccbd292011-01-06 22:15:06 +000083
Greg Clayton9b72eb72011-05-24 23:06:02 +000084 if (!reg_ctx_sp->IsValid())
Jim Inghamb0c72a52012-02-29 03:40:22 +000085 goto unwind_done;
Greg Clayton5ccbd292011-01-06 22:15:06 +000086
Greg Clayton9b72eb72011-05-24 23:06:02 +000087 if (!reg_ctx_sp->GetCFA (first_cursor_sp->cfa))
Jim Inghamb0c72a52012-02-29 03:40:22 +000088 goto unwind_done;
Greg Clayton5ccbd292011-01-06 22:15:06 +000089
Greg Clayton9b72eb72011-05-24 23:06:02 +000090 if (!reg_ctx_sp->ReadPC (first_cursor_sp->start_pc))
Jim Inghamb0c72a52012-02-29 03:40:22 +000091 goto unwind_done;
Greg Clayton5ccbd292011-01-06 22:15:06 +000092
93 // Everything checks out, so release the auto pointer value and let the
94 // cursor own it in its shared pointer
Greg Claytone1cd1be2012-01-29 20:56:30 +000095 first_cursor_sp->reg_ctx_lldb_sp = reg_ctx_sp;
Jason Molenda8fed2952010-11-09 02:31:21 +000096 m_frames.push_back (first_cursor_sp);
97 return true;
Jim Inghamb0c72a52012-02-29 03:40:22 +000098unwind_done:
99 m_unwind_complete = true;
100 return false;
Jason Molenda8fed2952010-11-09 02:31:21 +0000101}
102
103// For adding a non-zero stack frame to m_frames.
104bool
Greg Clayton9b72eb72011-05-24 23:06:02 +0000105UnwindLLDB::AddOneMoreFrame (ABI *abi)
Jason Molenda8fed2952010-11-09 02:31:21 +0000106{
Jim Inghamb0c72a52012-02-29 03:40:22 +0000107 // If we've already gotten to the end of the stack, don't bother to try again...
108 if (m_unwind_complete)
109 return false;
110
Greg Clayton5160ce52013-03-27 23:08:40 +0000111 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND));
Jason Molenda8fed2952010-11-09 02:31:21 +0000112 CursorSP cursor_sp(new Cursor ());
Jason Molenda8fed2952010-11-09 02:31:21 +0000113
114 // Frame zero is a little different
115 if (m_frames.size() == 0)
116 return false;
117
118 uint32_t cur_idx = m_frames.size ();
Greg Claytone1cd1be2012-01-29 20:56:30 +0000119 RegisterContextLLDBSP reg_ctx_sp(new RegisterContextLLDB (m_thread,
120 m_frames[cur_idx - 1]->reg_ctx_lldb_sp,
121 cursor_sp->sctx,
122 cur_idx,
123 *this));
Jason Molenda9dbe9e62013-05-03 04:48:41 +0000124
125 // We want to detect an unwind that cycles erronously and stop backtracing.
126 // Don't want this maximum unwind limit to be too low -- if you have a backtrace
127 // with an "infinitely recursing" bug, it will crash when the stack blows out
128 // and the first 35,000 frames are uninteresting - it's the top most 5 frames that
129 // you actually care about. So you can't just cap the unwind at 10,000 or something.
130 // Realistically anything over around 200,000 is going to blow out the stack space.
131 // If we're still unwinding at that point, we're probably never going to finish.
132 if (cur_idx > 300000)
133 {
134 if (log)
135 log->Printf ("%*sFrame %d unwound too many frames, assuming unwind has gone astray, stopping.",
136 cur_idx < 100 ? cur_idx : 100, "", cur_idx);
137 goto unwind_done;
138 }
139
Greg Clayton9b72eb72011-05-24 23:06:02 +0000140 if (reg_ctx_sp.get() == NULL)
Jim Inghamb0c72a52012-02-29 03:40:22 +0000141 goto unwind_done;
Jason Molenda8fed2952010-11-09 02:31:21 +0000142
Greg Clayton9b72eb72011-05-24 23:06:02 +0000143 if (!reg_ctx_sp->IsValid())
Jason Molenda8fed2952010-11-09 02:31:21 +0000144 {
Jason Molenda8fed2952010-11-09 02:31:21 +0000145 if (log)
146 {
147 log->Printf("%*sFrame %d invalid RegisterContext for this frame, stopping stack walk",
148 cur_idx < 100 ? cur_idx : 100, "", cur_idx);
149 }
Jim Inghamb0c72a52012-02-29 03:40:22 +0000150 goto unwind_done;
Jason Molenda8fed2952010-11-09 02:31:21 +0000151 }
Greg Clayton9b72eb72011-05-24 23:06:02 +0000152 if (!reg_ctx_sp->GetCFA (cursor_sp->cfa))
Jason Molenda8fed2952010-11-09 02:31:21 +0000153 {
Jason Molenda8fed2952010-11-09 02:31:21 +0000154 if (log)
155 {
156 log->Printf("%*sFrame %d did not get CFA for this frame, stopping stack walk",
157 cur_idx < 100 ? cur_idx : 100, "", cur_idx);
158 }
Jim Inghamb0c72a52012-02-29 03:40:22 +0000159 goto unwind_done;
Jason Molenda8fed2952010-11-09 02:31:21 +0000160 }
Greg Clayton9b72eb72011-05-24 23:06:02 +0000161 if (abi && !abi->CallFrameAddressIsValid(cursor_sp->cfa))
Jason Molenda8fed2952010-11-09 02:31:21 +0000162 {
Jason Molenda8fed2952010-11-09 02:31:21 +0000163 if (log)
164 {
165 log->Printf("%*sFrame %d did not get a valid CFA for this frame, stopping stack walk",
166 cur_idx < 100 ? cur_idx : 100, "", cur_idx);
167 }
Jim Inghamb0c72a52012-02-29 03:40:22 +0000168 goto unwind_done;
Jason Molenda8fed2952010-11-09 02:31:21 +0000169 }
Greg Clayton9b72eb72011-05-24 23:06:02 +0000170 if (!reg_ctx_sp->ReadPC (cursor_sp->start_pc))
Jason Molenda8fed2952010-11-09 02:31:21 +0000171 {
Jason Molenda8fed2952010-11-09 02:31:21 +0000172 if (log)
173 {
174 log->Printf("%*sFrame %d did not get PC for this frame, stopping stack walk",
175 cur_idx < 100 ? cur_idx : 100, "", cur_idx);
176 }
Jim Inghamb0c72a52012-02-29 03:40:22 +0000177 goto unwind_done;
Jason Molenda8fed2952010-11-09 02:31:21 +0000178 }
Greg Clayton9b72eb72011-05-24 23:06:02 +0000179 if (abi && !abi->CodeAddressIsValid (cursor_sp->start_pc))
180 {
181 if (log)
182 {
183 log->Printf("%*sFrame %d did not get a valid PC, stopping stack walk",
184 cur_idx < 100 ? cur_idx : 100, "", cur_idx);
185 }
Jim Inghamb0c72a52012-02-29 03:40:22 +0000186 goto unwind_done;
Greg Clayton9b72eb72011-05-24 23:06:02 +0000187 }
Greg Claytonfc753032011-01-17 21:03:33 +0000188 if (!m_frames.empty())
189 {
Greg Clayton9b72eb72011-05-24 23:06:02 +0000190 if (m_frames.back()->start_pc == cursor_sp->start_pc)
Greg Claytonfc753032011-01-17 21:03:33 +0000191 {
Greg Clayton9b72eb72011-05-24 23:06:02 +0000192 if (m_frames.back()->cfa == cursor_sp->cfa)
Jim Inghamb0c72a52012-02-29 03:40:22 +0000193 goto unwind_done; // Infinite loop where the current cursor is the same as the previous one...
Jim Ingham28eb5712012-10-12 17:34:26 +0000194 else if (abi && abi->StackUsesFrames())
Greg Clayton9b72eb72011-05-24 23:06:02 +0000195 {
Greg Clayton1cbc52c2011-05-25 17:56:20 +0000196 // We might have a CFA that is not using the frame pointer and
197 // we want to validate that the frame pointer is valid.
Greg Clayton9b72eb72011-05-24 23:06:02 +0000198 if (reg_ctx_sp->GetFP() == 0)
Jim Inghamb0c72a52012-02-29 03:40:22 +0000199 goto unwind_done;
Greg Clayton9b72eb72011-05-24 23:06:02 +0000200 }
Greg Claytonfc753032011-01-17 21:03:33 +0000201 }
202 }
Greg Claytone1cd1be2012-01-29 20:56:30 +0000203 cursor_sp->reg_ctx_lldb_sp = reg_ctx_sp;
Jason Molenda8fed2952010-11-09 02:31:21 +0000204 m_frames.push_back (cursor_sp);
205 return true;
Jim Inghamb0c72a52012-02-29 03:40:22 +0000206
207unwind_done:
208 m_unwind_complete = true;
209 return false;
Jason Molenda8fed2952010-11-09 02:31:21 +0000210}
211
212bool
Jim Ingham8f077162011-10-21 01:49:48 +0000213UnwindLLDB::DoGetFrameInfoAtIndex (uint32_t idx, addr_t& cfa, addr_t& pc)
Jason Molendaab4f1922010-10-25 11:12:07 +0000214{
Jason Molendaab4f1922010-10-25 11:12:07 +0000215 if (m_frames.size() == 0)
Jason Molenda8fed2952010-11-09 02:31:21 +0000216 {
217 if (!AddFirstFrame())
218 return false;
219 }
220
Greg Clayton1ac04c32012-02-21 00:09:25 +0000221 ProcessSP process_sp (m_thread.GetProcess());
222 ABI *abi = process_sp ? process_sp->GetABI().get() : NULL;
Greg Clayton9b72eb72011-05-24 23:06:02 +0000223
224 while (idx >= m_frames.size() && AddOneMoreFrame (abi))
Jason Molenda8fed2952010-11-09 02:31:21 +0000225 ;
Jason Molendaab4f1922010-10-25 11:12:07 +0000226
227 if (idx < m_frames.size ())
228 {
Jason Molenda59762002010-11-04 00:53:20 +0000229 cfa = m_frames[idx]->cfa;
230 pc = m_frames[idx]->start_pc;
Jason Molendaab4f1922010-10-25 11:12:07 +0000231 return true;
232 }
233 return false;
234}
235
Greg Clayton5ccbd292011-01-06 22:15:06 +0000236lldb::RegisterContextSP
Jim Ingham8f077162011-10-21 01:49:48 +0000237UnwindLLDB::DoCreateRegisterContextForFrame (StackFrame *frame)
Jason Molendaab4f1922010-10-25 11:12:07 +0000238{
Greg Clayton5ccbd292011-01-06 22:15:06 +0000239 lldb::RegisterContextSP reg_ctx_sp;
Greg Clayton671cabe2011-01-08 01:53:06 +0000240 uint32_t idx = frame->GetConcreteFrameIndex ();
Jason Molenda8fed2952010-11-09 02:31:21 +0000241
Jason Molendaab4f1922010-10-25 11:12:07 +0000242 if (idx == 0)
243 {
244 return m_thread.GetRegisterContext();
245 }
Jason Molenda8fed2952010-11-09 02:31:21 +0000246
247 if (m_frames.size() == 0)
248 {
249 if (!AddFirstFrame())
Greg Clayton5ccbd292011-01-06 22:15:06 +0000250 return reg_ctx_sp;
Jason Molenda8fed2952010-11-09 02:31:21 +0000251 }
252
Greg Clayton1ac04c32012-02-21 00:09:25 +0000253 ProcessSP process_sp (m_thread.GetProcess());
254 ABI *abi = process_sp ? process_sp->GetABI().get() : NULL;
Greg Clayton9b72eb72011-05-24 23:06:02 +0000255
Greg Claytone1cd1be2012-01-29 20:56:30 +0000256 while (idx >= m_frames.size())
257 {
258 if (!AddOneMoreFrame (abi))
259 break;
260 }
Jason Molenda8fed2952010-11-09 02:31:21 +0000261
Greg Claytone1cd1be2012-01-29 20:56:30 +0000262 const uint32_t num_frames = m_frames.size();
263 if (idx < num_frames)
264 {
265 Cursor *frame_cursor = m_frames[idx].get();
Greg Claytone72dfb32012-02-24 01:59:29 +0000266 reg_ctx_sp = frame_cursor->reg_ctx_lldb_sp;
Greg Claytone1cd1be2012-01-29 20:56:30 +0000267 }
Greg Clayton5ccbd292011-01-06 22:15:06 +0000268 return reg_ctx_sp;
Jason Molendaab4f1922010-10-25 11:12:07 +0000269}
Jason Molenda707fec42011-11-01 03:21:25 +0000270
Greg Claytone1cd1be2012-01-29 20:56:30 +0000271UnwindLLDB::RegisterContextLLDBSP
Jason Molenda707fec42011-11-01 03:21:25 +0000272UnwindLLDB::GetRegisterContextForFrameNum (uint32_t frame_num)
273{
Greg Claytone1cd1be2012-01-29 20:56:30 +0000274 RegisterContextLLDBSP reg_ctx_sp;
275 if (frame_num < m_frames.size())
276 reg_ctx_sp = m_frames[frame_num]->reg_ctx_lldb_sp;
Jason Molenda707fec42011-11-01 03:21:25 +0000277 return reg_ctx_sp;
278}
279
280bool
Jason Molenda60f0bd42012-10-26 06:08:58 +0000281UnwindLLDB::SearchForSavedLocationForRegister (uint32_t lldb_regnum, lldb_private::UnwindLLDB::RegisterLocation &regloc, uint32_t starting_frame_num, bool pc_or_return_address_reg)
Jason Molenda707fec42011-11-01 03:21:25 +0000282{
283 int64_t frame_num = starting_frame_num;
284 if (frame_num >= m_frames.size())
285 return false;
Jason Molenda60f0bd42012-10-26 06:08:58 +0000286
287 // Never interrogate more than one level while looking for the saved pc value. If the value
288 // isn't saved by frame_num, none of the frames lower on the stack will have a useful value.
289 if (pc_or_return_address_reg)
290 {
Jason Molendaaff2a262012-11-16 01:03:31 +0000291 UnwindLLDB::RegisterSearchResult result;
292 result = m_frames[frame_num]->reg_ctx_lldb_sp->SavedLocationForRegister (lldb_regnum, regloc);
293 if (result == UnwindLLDB::RegisterSearchResult::eRegisterFound)
Jason Molenda60f0bd42012-10-26 06:08:58 +0000294 return true;
295 else
296 return false;
297 }
Jason Molenda707fec42011-11-01 03:21:25 +0000298 while (frame_num >= 0)
299 {
Jason Molendaaff2a262012-11-16 01:03:31 +0000300 UnwindLLDB::RegisterSearchResult result;
301 result = m_frames[frame_num]->reg_ctx_lldb_sp->SavedLocationForRegister (lldb_regnum, regloc);
Jason Molenda4c781fd72013-01-19 03:53:42 +0000302
303 // If we have unwind instructions saying that register N is saved in register M in the middle of
304 // the stack (and N can equal M here, meaning the register was not used in this function), then
305 // change the register number we're looking for to M and keep looking for a concrete location
306 // down the stack, or an actual value from a live RegisterContext at frame 0.
307 if (result == UnwindLLDB::RegisterSearchResult::eRegisterFound
308 && regloc.type == UnwindLLDB::RegisterLocation::eRegisterInRegister
309 && frame_num > 0)
310 {
311 result = UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
312 lldb_regnum = regloc.location.register_number;
313 }
314
Jason Molendaaff2a262012-11-16 01:03:31 +0000315 if (result == UnwindLLDB::RegisterSearchResult::eRegisterFound)
Jason Molenda707fec42011-11-01 03:21:25 +0000316 return true;
Jason Molendaaff2a262012-11-16 01:03:31 +0000317 if (result == UnwindLLDB::RegisterSearchResult::eRegisterIsVolatile)
318 return false;
Jason Molenda707fec42011-11-01 03:21:25 +0000319 frame_num--;
320 }
321 return false;
322}