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