Xcode.cpp revision 101a2d6d590b12f9647032d656a13d3d7c432038
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
13using namespace std;
14using namespace lldb_perf;
15
16void
17Xcode::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
42void
43Xcode::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
60void
61Xcode::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
72void
73Xcode::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
111void
112Xcode::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
124void
125Xcode::Next (SBThread thread)
126{
127	thread.StepOver();
128}
129
130void
131Xcode::Continue (SBProcess process)
132{
133	process.Continue();
134}
135
136void
137Xcode::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
146SBThread
147Xcode::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
161SBBreakpoint
162Xcode::CreateFileLineBreakpoint (SBTarget target, const char* file, uint32_t line)
163{
164    return target.BreakpointCreateByLocation(file, line);
165}
166