• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- Xcode.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 
10 #include "Xcode.h"
11 #include <string>
12 
13 using namespace std;
14 using namespace lldb_perf;
15 
16 void
FetchVariable(SBValue value,uint32_t expand,bool verbose)17 Xcode::FetchVariable (SBValue value, uint32_t expand, bool verbose)
18 {
19 	auto name = value.GetName();
20 	auto num_value = value.GetValueAsUnsigned(0);
21 	auto summary = value.GetSummary();
22 	auto in_scope = value.IsInScope();
23 	auto has_children = value.MightHaveChildren();
24 	auto type_1 = value.GetType();
25 	auto type_2 = value.GetType();
26 	auto type_name_1 = value.GetTypeName();
27 	auto type_3 = value.GetType();
28 	auto type_name_2 = value.GetTypeName();
29 	if (verbose)
30 		printf("%s %s = 0x%llx (%llu) %s\n",value.GetTypeName(),value.GetName(),num_value, num_value,summary);
31 	if (expand > 0)
32 	{
33 		auto count = value.GetNumChildren();
34 		for (int i = 0; i < count; i++)
35 		{
36 			SBValue child(value.GetChildAtIndex(i, lldb::eDynamicCanRunTarget, true));
37 			FetchVariable (child,expand-1,verbose);
38 		}
39 	}
40 }
41 
42 void
FetchModules(SBTarget target,bool verbose)43 Xcode::FetchModules (SBTarget target, bool verbose)
44 {
45 	auto count = target.GetNumModules();
46 	for (int i = 0; i < count; i++)
47 	{
48 		SBModule module(target.GetModuleAtIndex(i));
49 		auto fspec = module.GetFileSpec();
50 		std::string path(1024,0);
51 		fspec.GetPath(&path[0],1024);
52 		auto uuid = module.GetUUIDBytes();
53 		if (verbose)
54 		{
55 			printf("%s %s\n",path.c_str(),module.GetUUIDString());
56 		}
57 	}
58 }
59 
60 void
FetchVariables(SBFrame frame,uint32_t expand,bool verbose)61 Xcode::FetchVariables (SBFrame frame, uint32_t expand, bool verbose)
62 {
63 	auto values = frame.GetVariables (true,true,true,false, eDynamicCanRunTarget);
64 	auto count = values.GetSize();
65 	for (int i = 0; i < count; i++)
66 	{
67 		SBValue value(values.GetValueAtIndex(i));
68 		FetchVariable (value,expand,verbose);
69 	}
70 }
71 
72 void
FetchFrames(SBProcess process,bool variables,bool verbose)73 Xcode::FetchFrames(SBProcess process, bool variables, bool verbose)
74 {
75 	auto pCount = process.GetNumThreads();
76 	for (int p = 0; p < pCount; p++)
77 	{
78 		SBThread thread(process.GetThreadAtIndex(p));
79 		auto tCount = thread.GetNumFrames ();
80 		if (verbose)
81 			printf("%s %d %d {%d}\n",thread.GetQueueName(),tCount,thread.GetStopReason(),eStopReasonBreakpoint);
82 		for (int t = 0; t < tCount; t++)
83 		{
84 			SBFrame frame(thread.GetFrameAtIndex(t));
85 			auto fp = frame.GetFP();
86 			SBThread thread_dup = frame.GetThread();
87 			SBFileSpec filespec(process.GetTarget().GetExecutable());
88 			std::string path(1024,0);
89 			filespec.GetPath(&path[0],1024);
90 			auto state = process.GetState();
91 			auto pCount_dup = process.GetNumThreads();
92 			auto byte_size = process.GetAddressByteSize();
93 			auto pc = frame.GetPC();
94 			SBSymbolContext context(frame.GetSymbolContext(0x0000006e));
95 			SBModule module(context.GetModule());
96 			SBLineEntry entry(context.GetLineEntry());
97 			SBFileSpec entry_filespec(process.GetTarget().GetExecutable());
98 			std::string entry_path(1024,0);
99 			entry_filespec.GetPath(&entry_path[0],1024);
100 			auto line_1 = entry.GetLine();
101 			auto line_2 = entry.GetLine();
102 			auto fname = frame.GetFunctionName();
103 			if (verbose)
104 				printf("%llu %s %d %d %llu %s %d %s\n",fp,path.c_str(),state,byte_size,pc,entry_path.c_str(),line_1,fname);
105 			if (variables)
106 				FetchVariables (frame, 0, verbose);
107 		}
108 	}
109 }
110 
111 void
RunExpression(SBFrame frame,const char * expression,bool po,bool verbose)112 Xcode::RunExpression (SBFrame frame, const char* expression, bool po, bool verbose)
113 {
114 	SBValue value (frame.EvaluateExpression (expression, eDynamicCanRunTarget));
115 	FetchVariable (value,0,verbose);
116 	if (po)
117 	{
118 		auto descr = value.GetObjectDescription();
119 		if (descr)
120 			printf("po = %s\n",descr);
121 	}
122 }
123 
124 void
Next(SBThread thread)125 Xcode::Next (SBThread thread)
126 {
127 	thread.StepOver();
128 }
129 
130 void
Continue(SBProcess process)131 Xcode::Continue (SBProcess process)
132 {
133 	process.Continue();
134 }
135 
136 void
RunCommand(SBDebugger debugger,const char * cmd,bool verbose)137 Xcode::RunCommand (SBDebugger debugger, const char* cmd, bool verbose)
138 {
139 	SBCommandReturnObject sb_ret;
140 	auto interpreter = debugger.GetCommandInterpreter();
141 	interpreter.HandleCommand(cmd,sb_ret);
142 	if (verbose)
143 		printf("%s\n%s\n",sb_ret.GetOutput(false),sb_ret.GetError(false));
144 }
145 
146 SBThread
GetThreadWithStopReason(SBProcess process,StopReason reason)147 Xcode::GetThreadWithStopReason (SBProcess process, StopReason reason)
148 {
149 	auto threads_count = process.GetNumThreads();
150 	for (auto thread_num = 0; thread_num < threads_count; thread_num++)
151 	{
152 		SBThread thread(process.GetThreadAtIndex(thread_num));
153 		if (thread.GetStopReason() == reason)
154 		{
155 			return thread;
156 		}
157 	}
158 	return SBThread();
159 }
160 
161 SBBreakpoint
CreateFileLineBreakpoint(SBTarget target,const char * file,uint32_t line)162 Xcode::CreateFileLineBreakpoint (SBTarget target, const char* file, uint32_t line)
163 {
164     return target.BreakpointCreateByLocation(file, line);
165 }
166