blob: fc592e60d86d4ef25844bcdb8bdd7597c5202ebc [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(),
Jason Molendaa4bea722014-02-14 05:06:49 +000029 m_unwind_complete(false),
30 m_user_supplied_trap_handler_functions()
Jason Molendaab4f1922010-10-25 11:12:07 +000031{
Jason Molendaa4bea722014-02-14 05:06:49 +000032 ProcessSP process_sp(thread.GetProcess());
33 if (process_sp)
34 {
35 Args args;
36 process_sp->GetTarget().GetUserSpecifiedTrapHandlerNames (args);
37 size_t count = args.GetArgumentCount();
38 for (size_t i = 0; i < count; i++)
39 {
40 const char *func_name = args.GetArgumentAtIndex(i);
41 m_user_supplied_trap_handler_functions.push_back (ConstString (func_name));
42 }
43 }
Jason Molendaab4f1922010-10-25 11:12:07 +000044}
45
46uint32_t
Jim Ingham8f077162011-10-21 01:49:48 +000047UnwindLLDB::DoGetFrameCount()
Jason Molendaab4f1922010-10-25 11:12:07 +000048{
Jim Inghamb0c72a52012-02-29 03:40:22 +000049 if (!m_unwind_complete)
Jason Molendaab4f1922010-10-25 11:12:07 +000050 {
Greg Clayton58be07b2011-01-07 06:08:19 +000051//#define DEBUG_FRAME_SPEED 1
52#if DEBUG_FRAME_SPEED
Greg Clayton3e06bd92011-01-09 21:07:35 +000053#define FRAME_COUNT 10000
Greg Clayton58be07b2011-01-07 06:08:19 +000054 TimeValue time_value (TimeValue::Now());
55#endif
Jason Molenda8fed2952010-11-09 02:31:21 +000056 if (!AddFirstFrame ())
Jason Molendaab4f1922010-10-25 11:12:07 +000057 return 0;
Greg Clayton9b72eb72011-05-24 23:06:02 +000058
Greg Clayton1ac04c32012-02-21 00:09:25 +000059 ProcessSP process_sp (m_thread.GetProcess());
60 ABI *abi = process_sp ? process_sp->GetABI().get() : NULL;
Greg Clayton9b72eb72011-05-24 23:06:02 +000061
62 while (AddOneMoreFrame (abi))
Greg Clayton58be07b2011-01-07 06:08:19 +000063 {
64#if DEBUG_FRAME_SPEED
Greg Clayton3e06bd92011-01-09 21:07:35 +000065 if ((m_frames.size() % FRAME_COUNT) == 0)
Greg Clayton58be07b2011-01-07 06:08:19 +000066 {
67 TimeValue now(TimeValue::Now());
68 uint64_t delta_t = now - time_value;
Daniel Malead01b2952012-11-29 21:49:15 +000069 printf ("%u frames in %" PRIu64 ".%09llu ms (%g frames/sec)\n",
Greg Clayton3e06bd92011-01-09 21:07:35 +000070 FRAME_COUNT,
Peter Collingbourneba23ca02011-06-18 23:52:14 +000071 delta_t / TimeValue::NanoSecPerSec,
72 delta_t % TimeValue::NanoSecPerSec,
73 (float)FRAME_COUNT / ((float)delta_t / (float)TimeValue::NanoSecPerSec));
Greg Clayton58be07b2011-01-07 06:08:19 +000074 time_value = now;
75 }
76#endif
77 }
Jason Molendaab4f1922010-10-25 11:12:07 +000078 }
79 return m_frames.size ();
80}
81
82bool
Jason Molenda8fed2952010-11-09 02:31:21 +000083UnwindLLDB::AddFirstFrame ()
84{
Jim Inghamb0c72a52012-02-29 03:40:22 +000085 if (m_frames.size() > 0)
86 return true;
87
Jason Molenda8fed2952010-11-09 02:31:21 +000088 // First, set up the 0th (initial) frame
89 CursorSP first_cursor_sp(new Cursor ());
Greg Claytone1cd1be2012-01-29 20:56:30 +000090 RegisterContextLLDBSP reg_ctx_sp (new RegisterContextLLDB (m_thread,
91 RegisterContextLLDBSP(),
92 first_cursor_sp->sctx,
93 0, *this));
Greg Clayton9b72eb72011-05-24 23:06:02 +000094 if (reg_ctx_sp.get() == NULL)
Jim Inghamb0c72a52012-02-29 03:40:22 +000095 goto unwind_done;
Greg Clayton5ccbd292011-01-06 22:15:06 +000096
Greg Clayton9b72eb72011-05-24 23:06:02 +000097 if (!reg_ctx_sp->IsValid())
Jim Inghamb0c72a52012-02-29 03:40:22 +000098 goto unwind_done;
Greg Clayton5ccbd292011-01-06 22:15:06 +000099
Greg Clayton9b72eb72011-05-24 23:06:02 +0000100 if (!reg_ctx_sp->GetCFA (first_cursor_sp->cfa))
Jim Inghamb0c72a52012-02-29 03:40:22 +0000101 goto unwind_done;
Greg Clayton5ccbd292011-01-06 22:15:06 +0000102
Greg Clayton9b72eb72011-05-24 23:06:02 +0000103 if (!reg_ctx_sp->ReadPC (first_cursor_sp->start_pc))
Jim Inghamb0c72a52012-02-29 03:40:22 +0000104 goto unwind_done;
Greg Clayton5ccbd292011-01-06 22:15:06 +0000105
106 // Everything checks out, so release the auto pointer value and let the
107 // cursor own it in its shared pointer
Greg Claytone1cd1be2012-01-29 20:56:30 +0000108 first_cursor_sp->reg_ctx_lldb_sp = reg_ctx_sp;
Jason Molenda8fed2952010-11-09 02:31:21 +0000109 m_frames.push_back (first_cursor_sp);
110 return true;
Jason Molenda3d219752013-12-20 01:05:11 +0000111
Jim Inghamb0c72a52012-02-29 03:40:22 +0000112unwind_done:
Jason Molenda3d219752013-12-20 01:05:11 +0000113 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND));
114 if (log)
115 {
116 log->Printf ("th%d Unwind of this thread is complete.", m_thread.GetIndexID());
117 }
Jim Inghamb0c72a52012-02-29 03:40:22 +0000118 m_unwind_complete = true;
119 return false;
Jason Molenda8fed2952010-11-09 02:31:21 +0000120}
121
122// For adding a non-zero stack frame to m_frames.
123bool
Greg Clayton9b72eb72011-05-24 23:06:02 +0000124UnwindLLDB::AddOneMoreFrame (ABI *abi)
Jason Molenda8fed2952010-11-09 02:31:21 +0000125{
Jim Inghamb0c72a52012-02-29 03:40:22 +0000126 // If we've already gotten to the end of the stack, don't bother to try again...
127 if (m_unwind_complete)
128 return false;
129
Greg Clayton5160ce52013-03-27 23:08:40 +0000130 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND));
Jason Molenda8fed2952010-11-09 02:31:21 +0000131 CursorSP cursor_sp(new Cursor ());
Jason Molenda8fed2952010-11-09 02:31:21 +0000132
133 // Frame zero is a little different
134 if (m_frames.size() == 0)
135 return false;
136
137 uint32_t cur_idx = m_frames.size ();
Greg Claytone1cd1be2012-01-29 20:56:30 +0000138 RegisterContextLLDBSP reg_ctx_sp(new RegisterContextLLDB (m_thread,
139 m_frames[cur_idx - 1]->reg_ctx_lldb_sp,
140 cursor_sp->sctx,
141 cur_idx,
142 *this));
Jason Molenda9dbe9e62013-05-03 04:48:41 +0000143
144 // We want to detect an unwind that cycles erronously and stop backtracing.
145 // Don't want this maximum unwind limit to be too low -- if you have a backtrace
146 // with an "infinitely recursing" bug, it will crash when the stack blows out
147 // and the first 35,000 frames are uninteresting - it's the top most 5 frames that
148 // you actually care about. So you can't just cap the unwind at 10,000 or something.
149 // Realistically anything over around 200,000 is going to blow out the stack space.
150 // If we're still unwinding at that point, we're probably never going to finish.
151 if (cur_idx > 300000)
152 {
153 if (log)
154 log->Printf ("%*sFrame %d unwound too many frames, assuming unwind has gone astray, stopping.",
155 cur_idx < 100 ? cur_idx : 100, "", cur_idx);
156 goto unwind_done;
157 }
158
Greg Clayton9b72eb72011-05-24 23:06:02 +0000159 if (reg_ctx_sp.get() == NULL)
Jason Molenda3d219752013-12-20 01:05:11 +0000160 {
Jason Molenda31d7ad42014-02-21 05:20:25 +0000161 // If the RegisterContextLLDB has a fallback UnwindPlan, it will switch to that and return
162 // true. Subsequent calls to TryFallbackUnwindPlan() will return false.
163 if (m_frames[cur_idx - 1]->reg_ctx_lldb_sp->TryFallbackUnwindPlan())
164 {
165 return AddOneMoreFrame (abi);
166 }
Jason Molenda3d219752013-12-20 01:05:11 +0000167 if (log)
168 log->Printf ("%*sFrame %d did not get a RegisterContext, stopping.",
169 cur_idx < 100 ? cur_idx : 100, "", cur_idx);
Jim Inghamb0c72a52012-02-29 03:40:22 +0000170 goto unwind_done;
Jason Molenda3d219752013-12-20 01:05:11 +0000171 }
Jason Molenda8fed2952010-11-09 02:31:21 +0000172
Greg Clayton9b72eb72011-05-24 23:06:02 +0000173 if (!reg_ctx_sp->IsValid())
Jason Molenda8fed2952010-11-09 02:31:21 +0000174 {
Jason Molenda22975a22014-11-13 07:31:45 +0000175 // We failed to get a valid RegisterContext.
176 // See if the regctx below this on the stack has a fallback unwind plan it can use.
177 // Subsequent calls to TryFallbackUnwindPlan() will return false.
Jason Molenda4b008932014-11-04 05:28:40 +0000178 if (m_frames[cur_idx - 1]->reg_ctx_lldb_sp->TryFallbackUnwindPlan())
Jason Molenda31d7ad42014-02-21 05:20:25 +0000179 {
180 return AddOneMoreFrame (abi);
181 }
Jason Molenda8fed2952010-11-09 02:31:21 +0000182 if (log)
183 {
184 log->Printf("%*sFrame %d invalid RegisterContext for this frame, stopping stack walk",
185 cur_idx < 100 ? cur_idx : 100, "", cur_idx);
186 }
Jim Inghamb0c72a52012-02-29 03:40:22 +0000187 goto unwind_done;
Jason Molenda8fed2952010-11-09 02:31:21 +0000188 }
Greg Clayton9b72eb72011-05-24 23:06:02 +0000189 if (!reg_ctx_sp->GetCFA (cursor_sp->cfa))
Jason Molenda8fed2952010-11-09 02:31:21 +0000190 {
Jason Molenda31d7ad42014-02-21 05:20:25 +0000191 // If the RegisterContextLLDB has a fallback UnwindPlan, it will switch to that and return
192 // true. Subsequent calls to TryFallbackUnwindPlan() will return false.
193 if (m_frames[cur_idx - 1]->reg_ctx_lldb_sp->TryFallbackUnwindPlan())
194 {
195 return AddOneMoreFrame (abi);
196 }
Jason Molenda8fed2952010-11-09 02:31:21 +0000197 if (log)
198 {
199 log->Printf("%*sFrame %d did not get CFA for this frame, stopping stack walk",
200 cur_idx < 100 ? cur_idx : 100, "", cur_idx);
201 }
Jim Inghamb0c72a52012-02-29 03:40:22 +0000202 goto unwind_done;
Jason Molenda8fed2952010-11-09 02:31:21 +0000203 }
Greg Clayton9b72eb72011-05-24 23:06:02 +0000204 if (abi && !abi->CallFrameAddressIsValid(cursor_sp->cfa))
Jason Molenda8fed2952010-11-09 02:31:21 +0000205 {
Jason Molenda4b792472014-01-03 22:06:25 +0000206 // On Mac OS X, the _sigtramp asynchronous signal trampoline frame may not have
207 // its (constructed) CFA aligned correctly -- don't do the abi alignment check for
208 // these.
Jason Molenda6223db272014-02-13 07:11:08 +0000209 if (reg_ctx_sp->IsTrapHandlerFrame() == false)
Jason Molenda8fed2952010-11-09 02:31:21 +0000210 {
Jason Molendacea6d632014-11-22 01:52:03 +0000211 // See if we can find a fallback unwind plan for THIS frame. It may be
212 // that the UnwindPlan we're using for THIS frame was bad and gave us a
213 // bad CFA.
214 // If that's not it, then see if we can change the UnwindPlan for the frame
215 // below us ("NEXT") -- see if using that other UnwindPlan gets us a better
216 // unwind state.
217 if (reg_ctx_sp->TryFallbackUnwindPlan() == false
218 || reg_ctx_sp->GetCFA (cursor_sp->cfa) == false
219 || abi->CallFrameAddressIsValid(cursor_sp->cfa) == false)
Jason Molenda31d7ad42014-02-21 05:20:25 +0000220 {
Jason Molendacea6d632014-11-22 01:52:03 +0000221 if (m_frames[cur_idx - 1]->reg_ctx_lldb_sp->TryFallbackUnwindPlan())
222 {
223 return AddOneMoreFrame (abi);
224 }
225 if (log)
226 {
227 log->Printf("%*sFrame %d did not get a valid CFA for this frame, stopping stack walk",
228 cur_idx < 100 ? cur_idx : 100, "", cur_idx);
229 }
230 goto unwind_done;
Jason Molenda31d7ad42014-02-21 05:20:25 +0000231 }
Jason Molendacea6d632014-11-22 01:52:03 +0000232 else
Jason Molenda4b792472014-01-03 22:06:25 +0000233 {
Jason Molendacea6d632014-11-22 01:52:03 +0000234 if (log)
235 {
236 log->Printf("%*sFrame %d had a bad CFA value but we switched the UnwindPlan being used and got one that looks more realistic.",
237 cur_idx < 100 ? cur_idx : 100, "", cur_idx);
238 }
Jason Molenda4b792472014-01-03 22:06:25 +0000239 }
Jason Molenda8fed2952010-11-09 02:31:21 +0000240 }
Jason Molenda8fed2952010-11-09 02:31:21 +0000241 }
Greg Clayton9b72eb72011-05-24 23:06:02 +0000242 if (!reg_ctx_sp->ReadPC (cursor_sp->start_pc))
Jason Molenda8fed2952010-11-09 02:31:21 +0000243 {
Jason Molenda31d7ad42014-02-21 05:20:25 +0000244 // If the RegisterContextLLDB has a fallback UnwindPlan, it will switch to that and return
245 // true. Subsequent calls to TryFallbackUnwindPlan() will return false.
246 if (m_frames[cur_idx - 1]->reg_ctx_lldb_sp->TryFallbackUnwindPlan())
247 {
248 return AddOneMoreFrame (abi);
249 }
Jason Molenda8fed2952010-11-09 02:31:21 +0000250 if (log)
251 {
252 log->Printf("%*sFrame %d did not get PC for this frame, stopping stack walk",
253 cur_idx < 100 ? cur_idx : 100, "", cur_idx);
254 }
Jim Inghamb0c72a52012-02-29 03:40:22 +0000255 goto unwind_done;
Jason Molenda8fed2952010-11-09 02:31:21 +0000256 }
Greg Clayton9b72eb72011-05-24 23:06:02 +0000257 if (abi && !abi->CodeAddressIsValid (cursor_sp->start_pc))
258 {
Jason Molenda31d7ad42014-02-21 05:20:25 +0000259 // If the RegisterContextLLDB has a fallback UnwindPlan, it will switch to that and return
260 // true. Subsequent calls to TryFallbackUnwindPlan() will return false.
261 if (m_frames[cur_idx - 1]->reg_ctx_lldb_sp->TryFallbackUnwindPlan())
262 {
263 return AddOneMoreFrame (abi);
264 }
Greg Clayton9b72eb72011-05-24 23:06:02 +0000265 if (log)
266 {
267 log->Printf("%*sFrame %d did not get a valid PC, stopping stack walk",
268 cur_idx < 100 ? cur_idx : 100, "", cur_idx);
269 }
Jim Inghamb0c72a52012-02-29 03:40:22 +0000270 goto unwind_done;
Greg Clayton9b72eb72011-05-24 23:06:02 +0000271 }
Jason Molenda3d219752013-12-20 01:05:11 +0000272 if (!m_frames.empty())
273 {
274 // Infinite loop where the current cursor is the same as the previous one...
275 if (m_frames.back()->start_pc == cursor_sp->start_pc && m_frames.back()->cfa == cursor_sp->cfa)
276 {
277 if (log)
278 log->Printf ("th%d pc of this frame is the same as the previous frame and CFAs for both frames are identical -- stopping unwind", m_thread.GetIndexID());
279 goto unwind_done;
280 }
281 }
Ashok Thirumurthi8b577302013-09-26 14:35:59 +0000282
Greg Claytone1cd1be2012-01-29 20:56:30 +0000283 cursor_sp->reg_ctx_lldb_sp = reg_ctx_sp;
Jason Molenda8fed2952010-11-09 02:31:21 +0000284 m_frames.push_back (cursor_sp);
285 return true;
Jim Inghamb0c72a52012-02-29 03:40:22 +0000286
287unwind_done:
Jason Molenda3d219752013-12-20 01:05:11 +0000288 if (log)
289 {
290 log->Printf ("th%d Unwind of this thread is complete.", m_thread.GetIndexID());
291 }
Jim Inghamb0c72a52012-02-29 03:40:22 +0000292 m_unwind_complete = true;
293 return false;
Jason Molenda8fed2952010-11-09 02:31:21 +0000294}
295
296bool
Jim Ingham8f077162011-10-21 01:49:48 +0000297UnwindLLDB::DoGetFrameInfoAtIndex (uint32_t idx, addr_t& cfa, addr_t& pc)
Jason Molendaab4f1922010-10-25 11:12:07 +0000298{
Jason Molendaab4f1922010-10-25 11:12:07 +0000299 if (m_frames.size() == 0)
Jason Molenda8fed2952010-11-09 02:31:21 +0000300 {
301 if (!AddFirstFrame())
302 return false;
303 }
304
Greg Clayton1ac04c32012-02-21 00:09:25 +0000305 ProcessSP process_sp (m_thread.GetProcess());
306 ABI *abi = process_sp ? process_sp->GetABI().get() : NULL;
Greg Clayton9b72eb72011-05-24 23:06:02 +0000307
308 while (idx >= m_frames.size() && AddOneMoreFrame (abi))
Jason Molenda8fed2952010-11-09 02:31:21 +0000309 ;
Jason Molendaab4f1922010-10-25 11:12:07 +0000310
311 if (idx < m_frames.size ())
312 {
Jason Molenda59762002010-11-04 00:53:20 +0000313 cfa = m_frames[idx]->cfa;
314 pc = m_frames[idx]->start_pc;
Jason Molendaab4f1922010-10-25 11:12:07 +0000315 return true;
316 }
317 return false;
318}
319
Greg Clayton5ccbd292011-01-06 22:15:06 +0000320lldb::RegisterContextSP
Jason Molendab57e4a12013-11-04 09:33:30 +0000321UnwindLLDB::DoCreateRegisterContextForFrame (StackFrame *frame)
Jason Molendaab4f1922010-10-25 11:12:07 +0000322{
Greg Clayton5ccbd292011-01-06 22:15:06 +0000323 lldb::RegisterContextSP reg_ctx_sp;
Greg Clayton671cabe2011-01-08 01:53:06 +0000324 uint32_t idx = frame->GetConcreteFrameIndex ();
Jason Molenda8fed2952010-11-09 02:31:21 +0000325
Jason Molendaab4f1922010-10-25 11:12:07 +0000326 if (idx == 0)
327 {
328 return m_thread.GetRegisterContext();
329 }
Jason Molenda8fed2952010-11-09 02:31:21 +0000330
331 if (m_frames.size() == 0)
332 {
333 if (!AddFirstFrame())
Greg Clayton5ccbd292011-01-06 22:15:06 +0000334 return reg_ctx_sp;
Jason Molenda8fed2952010-11-09 02:31:21 +0000335 }
336
Greg Clayton1ac04c32012-02-21 00:09:25 +0000337 ProcessSP process_sp (m_thread.GetProcess());
338 ABI *abi = process_sp ? process_sp->GetABI().get() : NULL;
Greg Clayton9b72eb72011-05-24 23:06:02 +0000339
Greg Claytone1cd1be2012-01-29 20:56:30 +0000340 while (idx >= m_frames.size())
341 {
342 if (!AddOneMoreFrame (abi))
343 break;
344 }
Jason Molenda8fed2952010-11-09 02:31:21 +0000345
Greg Claytone1cd1be2012-01-29 20:56:30 +0000346 const uint32_t num_frames = m_frames.size();
347 if (idx < num_frames)
348 {
349 Cursor *frame_cursor = m_frames[idx].get();
Greg Claytone72dfb32012-02-24 01:59:29 +0000350 reg_ctx_sp = frame_cursor->reg_ctx_lldb_sp;
Greg Claytone1cd1be2012-01-29 20:56:30 +0000351 }
Greg Clayton5ccbd292011-01-06 22:15:06 +0000352 return reg_ctx_sp;
Jason Molendaab4f1922010-10-25 11:12:07 +0000353}
Jason Molenda707fec42011-11-01 03:21:25 +0000354
Greg Claytone1cd1be2012-01-29 20:56:30 +0000355UnwindLLDB::RegisterContextLLDBSP
Jason Molenda707fec42011-11-01 03:21:25 +0000356UnwindLLDB::GetRegisterContextForFrameNum (uint32_t frame_num)
357{
Greg Claytone1cd1be2012-01-29 20:56:30 +0000358 RegisterContextLLDBSP reg_ctx_sp;
359 if (frame_num < m_frames.size())
360 reg_ctx_sp = m_frames[frame_num]->reg_ctx_lldb_sp;
Jason Molenda707fec42011-11-01 03:21:25 +0000361 return reg_ctx_sp;
362}
363
364bool
Jason Molenda23399d72013-06-05 00:12:50 +0000365UnwindLLDB::SearchForSavedLocationForRegister (uint32_t lldb_regnum, lldb_private::UnwindLLDB::RegisterLocation &regloc, uint32_t starting_frame_num, bool pc_reg)
Jason Molenda707fec42011-11-01 03:21:25 +0000366{
367 int64_t frame_num = starting_frame_num;
Saleem Abdulrasool3985c8c2014-04-02 03:51:35 +0000368 if (static_cast<size_t>(frame_num) >= m_frames.size())
Jason Molenda707fec42011-11-01 03:21:25 +0000369 return false;
Jason Molenda60f0bd42012-10-26 06:08:58 +0000370
371 // Never interrogate more than one level while looking for the saved pc value. If the value
372 // isn't saved by frame_num, none of the frames lower on the stack will have a useful value.
Jason Molenda23399d72013-06-05 00:12:50 +0000373 if (pc_reg)
Jason Molenda60f0bd42012-10-26 06:08:58 +0000374 {
Jason Molendaaff2a262012-11-16 01:03:31 +0000375 UnwindLLDB::RegisterSearchResult result;
376 result = m_frames[frame_num]->reg_ctx_lldb_sp->SavedLocationForRegister (lldb_regnum, regloc);
377 if (result == UnwindLLDB::RegisterSearchResult::eRegisterFound)
Jason Molenda60f0bd42012-10-26 06:08:58 +0000378 return true;
379 else
380 return false;
381 }
Jason Molenda707fec42011-11-01 03:21:25 +0000382 while (frame_num >= 0)
383 {
Jason Molendaaff2a262012-11-16 01:03:31 +0000384 UnwindLLDB::RegisterSearchResult result;
385 result = m_frames[frame_num]->reg_ctx_lldb_sp->SavedLocationForRegister (lldb_regnum, regloc);
Jason Molenda4c781fd72013-01-19 03:53:42 +0000386
Jason Molendace19fe32014-12-09 22:28:10 +0000387 // We descended down to the live register context aka stack frame 0 and are reading the value
388 // out of a live register.
389 if (result == UnwindLLDB::RegisterSearchResult::eRegisterFound
390 && regloc.type == UnwindLLDB::RegisterLocation::eRegisterInLiveRegisterContext)
391 {
392 return true;
393 }
394
Jason Molenda4c781fd72013-01-19 03:53:42 +0000395 // If we have unwind instructions saying that register N is saved in register M in the middle of
396 // the stack (and N can equal M here, meaning the register was not used in this function), then
397 // change the register number we're looking for to M and keep looking for a concrete location
398 // down the stack, or an actual value from a live RegisterContext at frame 0.
399 if (result == UnwindLLDB::RegisterSearchResult::eRegisterFound
400 && regloc.type == UnwindLLDB::RegisterLocation::eRegisterInRegister
401 && frame_num > 0)
402 {
403 result = UnwindLLDB::RegisterSearchResult::eRegisterNotFound;
404 lldb_regnum = regloc.location.register_number;
405 }
406
Jason Molendaaff2a262012-11-16 01:03:31 +0000407 if (result == UnwindLLDB::RegisterSearchResult::eRegisterFound)
Jason Molenda707fec42011-11-01 03:21:25 +0000408 return true;
Jason Molendaaff2a262012-11-16 01:03:31 +0000409 if (result == UnwindLLDB::RegisterSearchResult::eRegisterIsVolatile)
410 return false;
Jason Molenda707fec42011-11-01 03:21:25 +0000411 frame_num--;
412 }
413 return false;
414}