forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			138 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- Xcode.cpp -----------------------------------------------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "Xcode.h"
 | |
| #include <string>
 | |
| 
 | |
| using namespace std;
 | |
| using namespace lldb_perf;
 | |
| 
 | |
| void Xcode::FetchVariable(SBValue value, uint32_t expand, bool verbose) {
 | |
|   auto name = value.GetName();
 | |
|   auto num_value = value.GetValueAsUnsigned(0);
 | |
|   auto summary = value.GetSummary();
 | |
|   auto in_scope = value.IsInScope();
 | |
|   auto has_children = value.MightHaveChildren();
 | |
|   auto type_1 = value.GetType();
 | |
|   auto type_2 = value.GetType();
 | |
|   auto type_name_1 = value.GetTypeName();
 | |
|   auto type_3 = value.GetType();
 | |
|   auto type_name_2 = value.GetTypeName();
 | |
|   if (verbose)
 | |
|     printf("%s %s = 0x%llx (%llu) %s\n", value.GetTypeName(), value.GetName(),
 | |
|            num_value, num_value, summary);
 | |
|   if (expand > 0) {
 | |
|     auto count = value.GetNumChildren();
 | |
|     for (int i = 0; i < count; i++) {
 | |
|       SBValue child(value.GetChildAtIndex(i, lldb::eDynamicCanRunTarget, true));
 | |
|       FetchVariable(child, expand - 1, verbose);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| void Xcode::FetchModules(SBTarget target, bool verbose) {
 | |
|   auto count = target.GetNumModules();
 | |
|   for (int i = 0; i < count; i++) {
 | |
|     SBModule module(target.GetModuleAtIndex(i));
 | |
|     auto fspec = module.GetFileSpec();
 | |
|     std::string path(1024, 0);
 | |
|     fspec.GetPath(&path[0], 1024);
 | |
|     auto uuid = module.GetUUIDBytes();
 | |
|     if (verbose) {
 | |
|       printf("%s %s\n", path.c_str(), module.GetUUIDString());
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| void Xcode::FetchVariables(SBFrame frame, uint32_t expand, bool verbose) {
 | |
|   auto values =
 | |
|       frame.GetVariables(true, true, true, false, eDynamicCanRunTarget);
 | |
|   auto count = values.GetSize();
 | |
|   for (int i = 0; i < count; i++) {
 | |
|     SBValue value(values.GetValueAtIndex(i));
 | |
|     FetchVariable(value, expand, verbose);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void Xcode::FetchFrames(SBProcess process, bool variables, bool verbose) {
 | |
|   auto pCount = process.GetNumThreads();
 | |
|   for (int p = 0; p < pCount; p++) {
 | |
|     SBThread thread(process.GetThreadAtIndex(p));
 | |
|     auto tCount = thread.GetNumFrames();
 | |
|     if (verbose)
 | |
|       printf("%s %d %d {%d}\n", thread.GetQueueName(), tCount,
 | |
|              thread.GetStopReason(), eStopReasonBreakpoint);
 | |
|     for (int t = 0; t < tCount; t++) {
 | |
|       SBFrame frame(thread.GetFrameAtIndex(t));
 | |
|       auto fp = frame.GetFP();
 | |
|       SBThread thread_dup = frame.GetThread();
 | |
|       SBFileSpec filespec(process.GetTarget().GetExecutable());
 | |
|       std::string path(1024, 0);
 | |
|       filespec.GetPath(&path[0], 1024);
 | |
|       auto state = process.GetState();
 | |
|       auto pCount_dup = process.GetNumThreads();
 | |
|       auto byte_size = process.GetAddressByteSize();
 | |
|       auto pc = frame.GetPC();
 | |
|       SBSymbolContext context(frame.GetSymbolContext(0x0000006e));
 | |
|       SBModule module(context.GetModule());
 | |
|       SBLineEntry entry(context.GetLineEntry());
 | |
|       SBFileSpec entry_filespec(process.GetTarget().GetExecutable());
 | |
|       std::string entry_path(1024, 0);
 | |
|       entry_filespec.GetPath(&entry_path[0], 1024);
 | |
|       auto line_1 = entry.GetLine();
 | |
|       auto line_2 = entry.GetLine();
 | |
|       auto fname = frame.GetFunctionName();
 | |
|       if (verbose)
 | |
|         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);
 | |
|       if (variables)
 | |
|         FetchVariables(frame, 0, verbose);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| void Xcode::RunExpression(SBFrame frame, const char *expression, bool po,
 | |
|                           bool verbose) {
 | |
|   SBValue value(frame.EvaluateExpression(expression, eDynamicCanRunTarget));
 | |
|   FetchVariable(value, 0, verbose);
 | |
|   if (po) {
 | |
|     auto descr = value.GetObjectDescription();
 | |
|     if (descr)
 | |
|       printf("po = %s\n", descr);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void Xcode::Next(SBThread thread) { thread.StepOver(); }
 | |
| 
 | |
| void Xcode::Continue(SBProcess process) { process.Continue(); }
 | |
| 
 | |
| void Xcode::RunCommand(SBDebugger debugger, const char *cmd, bool verbose) {
 | |
|   SBCommandReturnObject sb_ret;
 | |
|   auto interpreter = debugger.GetCommandInterpreter();
 | |
|   interpreter.HandleCommand(cmd, sb_ret);
 | |
|   if (verbose)
 | |
|     printf("%s\n%s\n", sb_ret.GetOutput(false), sb_ret.GetError(false));
 | |
| }
 | |
| 
 | |
| SBThread Xcode::GetThreadWithStopReason(SBProcess process, StopReason reason) {
 | |
|   auto threads_count = process.GetNumThreads();
 | |
|   for (auto thread_num = 0; thread_num < threads_count; thread_num++) {
 | |
|     SBThread thread(process.GetThreadAtIndex(thread_num));
 | |
|     if (thread.GetStopReason() == reason) {
 | |
|       return thread;
 | |
|     }
 | |
|   }
 | |
|   return SBThread();
 | |
| }
 | |
| 
 | |
| SBBreakpoint Xcode::CreateFileLineBreakpoint(SBTarget target, const char *file,
 | |
|                                              uint32_t line) {
 | |
|   return target.BreakpointCreateByLocation(file, line);
 | |
| }
 |