CommandObjectSource.cpp revision f15996eea072cdaa8a092f22d3a1212b3d95f0ec
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectSource.cpp ---------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CommandObjectSource.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1684cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h" 1763094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Core/Debugger.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h" 205f54ac373b119a4c6693e4875c48aa761fba0c86Greg Clayton#include "lldb/Host/FileSpec.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 22767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Core/SourceManager.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h" 24767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/CommandCompletions.h" 25767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/Options.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 31767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectSourceList 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectSourceInfo : public CommandObject 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37767af88aa617288e584afcfed055f7755e408542Jim Ingham class CommandOptions : public Options 38767af88aa617288e584afcfed055f7755e408542Jim Ingham { 39767af88aa617288e584afcfed055f7755e408542Jim Ingham public: 40f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 41f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton Options(interpreter) 42767af88aa617288e584afcfed055f7755e408542Jim Ingham { 43767af88aa617288e584afcfed055f7755e408542Jim Ingham } 44767af88aa617288e584afcfed055f7755e408542Jim Ingham 45767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandOptions () 46767af88aa617288e584afcfed055f7755e408542Jim Ingham { 47767af88aa617288e584afcfed055f7755e408542Jim Ingham } 48767af88aa617288e584afcfed055f7755e408542Jim Ingham 49767af88aa617288e584afcfed055f7755e408542Jim Ingham Error 50767af88aa617288e584afcfed055f7755e408542Jim Ingham SetOptionValue (int option_idx, const char *option_arg) 51767af88aa617288e584afcfed055f7755e408542Jim Ingham { 52767af88aa617288e584afcfed055f7755e408542Jim Ingham Error error; 53767af88aa617288e584afcfed055f7755e408542Jim Ingham const char short_option = g_option_table[option_idx].short_option; 54767af88aa617288e584afcfed055f7755e408542Jim Ingham switch (short_option) 55767af88aa617288e584afcfed055f7755e408542Jim Ingham { 56767af88aa617288e584afcfed055f7755e408542Jim Ingham case 'l': 57767af88aa617288e584afcfed055f7755e408542Jim Ingham start_line = Args::StringToUInt32 (option_arg, 0); 58767af88aa617288e584afcfed055f7755e408542Jim Ingham if (start_line == 0) 59767af88aa617288e584afcfed055f7755e408542Jim Ingham error.SetErrorStringWithFormat("Invalid line number: '%s'.\n", option_arg); 60767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 61767af88aa617288e584afcfed055f7755e408542Jim Ingham 62767af88aa617288e584afcfed055f7755e408542Jim Ingham case 'f': 63767af88aa617288e584afcfed055f7755e408542Jim Ingham file_name = option_arg; 64767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 65767af88aa617288e584afcfed055f7755e408542Jim Ingham 66767af88aa617288e584afcfed055f7755e408542Jim Ingham default: 67767af88aa617288e584afcfed055f7755e408542Jim Ingham error.SetErrorStringWithFormat("Unrecognized short option '%c'.\n", short_option); 68767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 69767af88aa617288e584afcfed055f7755e408542Jim Ingham } 70767af88aa617288e584afcfed055f7755e408542Jim Ingham 71767af88aa617288e584afcfed055f7755e408542Jim Ingham return error; 72767af88aa617288e584afcfed055f7755e408542Jim Ingham } 73767af88aa617288e584afcfed055f7755e408542Jim Ingham 74767af88aa617288e584afcfed055f7755e408542Jim Ingham void 75767af88aa617288e584afcfed055f7755e408542Jim Ingham ResetOptionValues () 76767af88aa617288e584afcfed055f7755e408542Jim Ingham { 77767af88aa617288e584afcfed055f7755e408542Jim Ingham file_spec.Clear(); 78767af88aa617288e584afcfed055f7755e408542Jim Ingham file_name.clear(); 79767af88aa617288e584afcfed055f7755e408542Jim Ingham start_line = 0; 80767af88aa617288e584afcfed055f7755e408542Jim Ingham } 81767af88aa617288e584afcfed055f7755e408542Jim Ingham 82b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 83767af88aa617288e584afcfed055f7755e408542Jim Ingham GetDefinitions () 84767af88aa617288e584afcfed055f7755e408542Jim Ingham { 85767af88aa617288e584afcfed055f7755e408542Jim Ingham return g_option_table; 86767af88aa617288e584afcfed055f7755e408542Jim Ingham } 87b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 88767af88aa617288e584afcfed055f7755e408542Jim Ingham 89767af88aa617288e584afcfed055f7755e408542Jim Ingham // Instance variables to hold the values for command options. 90767af88aa617288e584afcfed055f7755e408542Jim Ingham FileSpec file_spec; 91767af88aa617288e584afcfed055f7755e408542Jim Ingham std::string file_name; 92767af88aa617288e584afcfed055f7755e408542Jim Ingham uint32_t start_line; 93767af88aa617288e584afcfed055f7755e408542Jim Ingham 94767af88aa617288e584afcfed055f7755e408542Jim Ingham }; 95767af88aa617288e584afcfed055f7755e408542Jim Ingham 96767af88aa617288e584afcfed055f7755e408542Jim Inghampublic: 97238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectSourceInfo(CommandInterpreter &interpreter) : 98238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 99238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "source info", 100238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Display information about the source lines from the current executable's debug info.", 101f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton "source info [<cmd-options>]"), 102f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options (interpreter) 103767af88aa617288e584afcfed055f7755e408542Jim Ingham { 104767af88aa617288e584afcfed055f7755e408542Jim Ingham } 105767af88aa617288e584afcfed055f7755e408542Jim Ingham 106767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandObjectSourceInfo () 107767af88aa617288e584afcfed055f7755e408542Jim Ingham { 108767af88aa617288e584afcfed055f7755e408542Jim Ingham } 109767af88aa617288e584afcfed055f7755e408542Jim Ingham 110767af88aa617288e584afcfed055f7755e408542Jim Ingham 111767af88aa617288e584afcfed055f7755e408542Jim Ingham Options * 112767af88aa617288e584afcfed055f7755e408542Jim Ingham GetOptions () 113767af88aa617288e584afcfed055f7755e408542Jim Ingham { 114767af88aa617288e584afcfed055f7755e408542Jim Ingham return &m_options; 115767af88aa617288e584afcfed055f7755e408542Jim Ingham } 116767af88aa617288e584afcfed055f7755e408542Jim Ingham 117767af88aa617288e584afcfed055f7755e408542Jim Ingham 118767af88aa617288e584afcfed055f7755e408542Jim Ingham bool 119767af88aa617288e584afcfed055f7755e408542Jim Ingham Execute 120767af88aa617288e584afcfed055f7755e408542Jim Ingham ( 121767af88aa617288e584afcfed055f7755e408542Jim Ingham Args& args, 122767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandReturnObject &result 123767af88aa617288e584afcfed055f7755e408542Jim Ingham ) 124767af88aa617288e584afcfed055f7755e408542Jim Ingham { 125767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendError ("Not yet implemented"); 126767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 127767af88aa617288e584afcfed055f7755e408542Jim Ingham return false; 128767af88aa617288e584afcfed055f7755e408542Jim Ingham } 129767af88aa617288e584afcfed055f7755e408542Jim Inghamprotected: 130767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandOptions m_options; 131767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 132767af88aa617288e584afcfed055f7755e408542Jim Ingham 133b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 134767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceInfo::CommandOptions::g_option_table[] = 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1364d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "line", 'l', required_argument, NULL, 0, eArgTypeLineNum, "The line number at which to start the display source."}, 1374d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename, "The file from which to display source."}, 1384d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 139767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 140767af88aa617288e584afcfed055f7755e408542Jim Ingham 141767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectSourceList 142767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 143767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectSourceList 144767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 146767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectSourceList : public CommandObject 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 148767af88aa617288e584afcfed055f7755e408542Jim Ingham 149767af88aa617288e584afcfed055f7755e408542Jim Ingham class CommandOptions : public Options 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 151767af88aa617288e584afcfed055f7755e408542Jim Ingham public: 152f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 153f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton Options(interpreter) 154767af88aa617288e584afcfed055f7755e408542Jim Ingham { 155767af88aa617288e584afcfed055f7755e408542Jim Ingham } 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 157767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandOptions () 158767af88aa617288e584afcfed055f7755e408542Jim Ingham { 159767af88aa617288e584afcfed055f7755e408542Jim Ingham } 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 161767af88aa617288e584afcfed055f7755e408542Jim Ingham Error 162767af88aa617288e584afcfed055f7755e408542Jim Ingham SetOptionValue (int option_idx, const char *option_arg) 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 164767af88aa617288e584afcfed055f7755e408542Jim Ingham Error error; 165767af88aa617288e584afcfed055f7755e408542Jim Ingham const char short_option = g_option_table[option_idx].short_option; 166767af88aa617288e584afcfed055f7755e408542Jim Ingham switch (short_option) 167767af88aa617288e584afcfed055f7755e408542Jim Ingham { 168767af88aa617288e584afcfed055f7755e408542Jim Ingham case 'l': 169767af88aa617288e584afcfed055f7755e408542Jim Ingham start_line = Args::StringToUInt32 (option_arg, 0); 170767af88aa617288e584afcfed055f7755e408542Jim Ingham if (start_line == 0) 171767af88aa617288e584afcfed055f7755e408542Jim Ingham error.SetErrorStringWithFormat("Invalid line number: '%s'.\n", option_arg); 172767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 174338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham case 'c': 175767af88aa617288e584afcfed055f7755e408542Jim Ingham num_lines = Args::StringToUInt32 (option_arg, 0); 176767af88aa617288e584afcfed055f7755e408542Jim Ingham if (num_lines == 0) 177767af88aa617288e584afcfed055f7755e408542Jim Ingham error.SetErrorStringWithFormat("Invalid line count: '%s'.\n", option_arg); 178767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 180767af88aa617288e584afcfed055f7755e408542Jim Ingham case 'f': 181767af88aa617288e584afcfed055f7755e408542Jim Ingham file_name = option_arg; 182767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 183338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 184338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham case 'n': 185338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham symbol_name = option_arg; 186338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham break; 187767af88aa617288e584afcfed055f7755e408542Jim Ingham 188338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham case 's': 189338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_modules.push_back (std::string (option_arg)); 190338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham break; 191767af88aa617288e584afcfed055f7755e408542Jim Ingham default: 192767af88aa617288e584afcfed055f7755e408542Jim Ingham error.SetErrorStringWithFormat("Unrecognized short option '%c'.\n", short_option); 193767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 196767af88aa617288e584afcfed055f7755e408542Jim Ingham return error; 197767af88aa617288e584afcfed055f7755e408542Jim Ingham } 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 199767af88aa617288e584afcfed055f7755e408542Jim Ingham void 200767af88aa617288e584afcfed055f7755e408542Jim Ingham ResetOptionValues () 201767af88aa617288e584afcfed055f7755e408542Jim Ingham { 202767af88aa617288e584afcfed055f7755e408542Jim Ingham file_spec.Clear(); 203767af88aa617288e584afcfed055f7755e408542Jim Ingham file_name.clear(); 204338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham symbol_name.clear(); 205767af88aa617288e584afcfed055f7755e408542Jim Ingham start_line = 0; 206767af88aa617288e584afcfed055f7755e408542Jim Ingham num_lines = 10; 207338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_modules.clear(); 208767af88aa617288e584afcfed055f7755e408542Jim Ingham } 209767af88aa617288e584afcfed055f7755e408542Jim Ingham 210b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 211767af88aa617288e584afcfed055f7755e408542Jim Ingham GetDefinitions () 212767af88aa617288e584afcfed055f7755e408542Jim Ingham { 213767af88aa617288e584afcfed055f7755e408542Jim Ingham return g_option_table; 214767af88aa617288e584afcfed055f7755e408542Jim Ingham } 215b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 216767af88aa617288e584afcfed055f7755e408542Jim Ingham 217767af88aa617288e584afcfed055f7755e408542Jim Ingham // Instance variables to hold the values for command options. 218767af88aa617288e584afcfed055f7755e408542Jim Ingham FileSpec file_spec; 219767af88aa617288e584afcfed055f7755e408542Jim Ingham std::string file_name; 220338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham std::string symbol_name; 221767af88aa617288e584afcfed055f7755e408542Jim Ingham uint32_t start_line; 222767af88aa617288e584afcfed055f7755e408542Jim Ingham uint32_t num_lines; 223338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham STLStringArray m_modules; 224767af88aa617288e584afcfed055f7755e408542Jim Ingham }; 225767af88aa617288e584afcfed055f7755e408542Jim Ingham 226767af88aa617288e584afcfed055f7755e408542Jim Inghampublic: 227238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectSourceList(CommandInterpreter &interpreter) : 228238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 229238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "source list", 230238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Display source code (as specified) based on the current executable's debug info.", 231f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton NULL), 232f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options (interpreter) 233767af88aa617288e584afcfed055f7755e408542Jim Ingham { 23443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 23543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData file_arg; 23643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 23743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 23843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice file_arg.arg_type = eArgTypeFilename; 23943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice file_arg.arg_repetition = eArgRepeatOptional; 24043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 24143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 24243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (file_arg); 24343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 24443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 24543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 246767af88aa617288e584afcfed055f7755e408542Jim Ingham } 247767af88aa617288e584afcfed055f7755e408542Jim Ingham 248767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandObjectSourceList () 249767af88aa617288e584afcfed055f7755e408542Jim Ingham { 250767af88aa617288e584afcfed055f7755e408542Jim Ingham } 251767af88aa617288e584afcfed055f7755e408542Jim Ingham 252767af88aa617288e584afcfed055f7755e408542Jim Ingham 253767af88aa617288e584afcfed055f7755e408542Jim Ingham Options * 254767af88aa617288e584afcfed055f7755e408542Jim Ingham GetOptions () 255767af88aa617288e584afcfed055f7755e408542Jim Ingham { 256767af88aa617288e584afcfed055f7755e408542Jim Ingham return &m_options; 257767af88aa617288e584afcfed055f7755e408542Jim Ingham } 258767af88aa617288e584afcfed055f7755e408542Jim Ingham 259767af88aa617288e584afcfed055f7755e408542Jim Ingham 260767af88aa617288e584afcfed055f7755e408542Jim Ingham bool 261767af88aa617288e584afcfed055f7755e408542Jim Ingham Execute 262767af88aa617288e584afcfed055f7755e408542Jim Ingham ( 263767af88aa617288e584afcfed055f7755e408542Jim Ingham Args& args, 264767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandReturnObject &result 265767af88aa617288e584afcfed055f7755e408542Jim Ingham ) 266767af88aa617288e584afcfed055f7755e408542Jim Ingham { 267767af88aa617288e584afcfed055f7755e408542Jim Ingham const int argc = args.GetArgumentCount(); 268767af88aa617288e584afcfed055f7755e408542Jim Ingham 269767af88aa617288e584afcfed055f7755e408542Jim Ingham if (argc != 0) 270767af88aa617288e584afcfed055f7755e408542Jim Ingham { 271767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendErrorWithFormat("'%s' takes no arguments, only flags.\n", GetCommandName()); 272767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 273767af88aa617288e584afcfed055f7755e408542Jim Ingham } 274767af88aa617288e584afcfed055f7755e408542Jim Ingham 275238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton ExecutionContext exe_ctx(m_interpreter.GetDebugger().GetExecutionContext()); 276338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 277338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (!m_options.symbol_name.empty()) 278338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 279338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // Displaying the source for a symbol: 280238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 281338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (target == NULL) 282338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 283338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendError ("invalid target, set executable file using 'file' command"); 284338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 285338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 286338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 287338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 288338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContextList sc_list; 289338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham ConstString name(m_options.symbol_name.c_str()); 29028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool include_symbols = false; 291338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham bool append = true; 292338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham size_t num_matches = 0; 293338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 294338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (m_options.m_modules.size() > 0) 295338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 296338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham ModuleList matching_modules; 2970f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner for (unsigned i = 0, e = m_options.m_modules.size(); i != e; i++) 298338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 299537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec module_spec(m_options.m_modules[i].c_str(), false); 300338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (module_spec) 301338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 302338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham matching_modules.Clear(); 303338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham target->GetImages().FindModules (&module_spec, NULL, NULL, NULL, matching_modules); 30428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton num_matches += matching_modules.FindFunctions (name, eFunctionNameTypeBase, include_symbols, append, sc_list); 305338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 306338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 307338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 308338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 309338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 31028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton num_matches = target->GetImages().FindFunctions (name, eFunctionNameTypeBase, include_symbols, append, sc_list); 311338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 312338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 313338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContext sc; 314338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 315338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches == 0) 316338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 317338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Could not find function named: \"%s\".\n", m_options.symbol_name.c_str()); 318338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 319338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 320338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 321338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 322338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list.GetContextAtIndex (0, sc); 323338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham FileSpec start_file; 324338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham uint32_t start_line; 325338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham uint32_t end_line; 326338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham FileSpec end_file; 327338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (sc.function != NULL) 328338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 329338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc.function->GetStartLineSourceInfo (start_file, start_line); 330338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (start_line == 0) 331338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 332338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Could not find line information for start of function: \"%s\".\n", m_options.symbol_name.c_str()); 333338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 334338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 335338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 336338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc.function->GetEndLineSourceInfo (end_file, end_line); 337338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 338338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 339338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 340338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Could not find function info for: \"%s\".\n", m_options.symbol_name.c_str()); 341338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 342338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 343338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 344338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 345338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches > 1) 346338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 347338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // This could either be because there are multiple functions of this name, in which case 348338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // we'll have to specify this further... Or it could be because there are multiple inlined instances 349338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // of one function. So run through the matches and if they all have the same file & line then we can just 350338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // list one. 351338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 352338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham bool found_multiple = false; 353338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 354338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham for (size_t i = 1; i < num_matches; i++) 355338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 356338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContext scratch_sc; 357338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list.GetContextAtIndex (i, scratch_sc); 358338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (scratch_sc.function != NULL) 359338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 360338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham FileSpec scratch_file; 361338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham uint32_t scratch_line; 362338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham scratch_sc.function->GetStartLineSourceInfo (scratch_file, scratch_line); 363338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (scratch_file != start_file 364338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham || scratch_line != start_line) 365338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 366338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham found_multiple = true; 367338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham break; 368338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 369338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 370338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 371338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (found_multiple) 372338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 373338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham StreamString s; 374338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham for (size_t i = 0; i < num_matches; i++) 375338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 376338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContext scratch_sc; 377338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list.GetContextAtIndex (i, scratch_sc); 378338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (scratch_sc.function != NULL) 379338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 380338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham s.Printf("\n%d: ", i); 381338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham scratch_sc.function->Dump (&s, true); 382338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 383338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 384338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Multiple functions found matching: %s: \n%s\n", 385338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.symbol_name.c_str(), 386338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham s.GetData()); 387338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 388338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 389338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 390338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 391338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 392338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 393338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // This is a little hacky, but the first line table entry for a function points to the "{" that 394338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // starts the function block. It would be nice to actually get the function 395338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // declaration in there too. So back up a bit, but not further than what you're going to display. 396338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham size_t lines_to_back_up = m_options.num_lines >= 10 ? 5 : m_options.num_lines/2; 397338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham uint32_t line_no; 398338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (start_line <= lines_to_back_up) 399338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham line_no = 1; 400338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 401338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham line_no = start_line - lines_to_back_up; 402338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 403338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // For fun, if the function is shorter than the number of lines we're supposed to display, 404338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // only display the function... 405338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (end_line != 0) 406338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 407338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (m_options.num_lines > end_line - line_no) 408338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.num_lines = end_line - line_no; 409338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 410338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 411338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham char path_buf[PATH_MAX+1]; 412338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham start_file.GetPath(path_buf, PATH_MAX); 413338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendMessageWithFormat("File: %s.\n", path_buf); 414238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers (start_file, 415238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton line_no, 416238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton 0, 417238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_options.num_lines, 418238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "", 419238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton &result.GetOutputStream()); 420338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 421338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 422338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return true; 423338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 424338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 425338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else if (m_options.file_name.empty()) 426767af88aa617288e584afcfed055f7755e408542Jim Ingham { 427767af88aa617288e584afcfed055f7755e408542Jim Ingham // Last valid source manager context, or the current frame if no 428767af88aa617288e584afcfed055f7755e408542Jim Ingham // valid last context in source manager. 429767af88aa617288e584afcfed055f7755e408542Jim Ingham // One little trick here, if you type the exact same list command twice in a row, it is 430767af88aa617288e584afcfed055f7755e408542Jim Ingham // more likely because you typed it once, then typed it again 431767af88aa617288e584afcfed055f7755e408542Jim Ingham if (m_options.start_line == 0) 432767af88aa617288e584afcfed055f7755e408542Jim Ingham { 433238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton if (m_interpreter.GetDebugger().GetSourceManager().DisplayMoreWithLineNumbers (&result.GetOutputStream())) 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishResult); 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 437767af88aa617288e584afcfed055f7755e408542Jim Ingham } 438767af88aa617288e584afcfed055f7755e408542Jim Ingham else 439767af88aa617288e584afcfed055f7755e408542Jim Ingham { 440238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton if (m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbersUsingLastFile( 441767af88aa617288e584afcfed055f7755e408542Jim Ingham m_options.start_line, // Line to display 442767af88aa617288e584afcfed055f7755e408542Jim Ingham 0, // Lines before line to display 443767af88aa617288e584afcfed055f7755e408542Jim Ingham m_options.num_lines, // Lines after line to display 444767af88aa617288e584afcfed055f7755e408542Jim Ingham "", // Don't mark "line" 445767af88aa617288e584afcfed055f7755e408542Jim Ingham &result.GetOutputStream())) 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 447767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 449767af88aa617288e584afcfed055f7755e408542Jim Ingham 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 454767af88aa617288e584afcfed055f7755e408542Jim Ingham const char *filename = m_options.file_name.c_str(); 455238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 456767af88aa617288e584afcfed055f7755e408542Jim Ingham if (target == NULL) 457767af88aa617288e584afcfed055f7755e408542Jim Ingham { 458767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendError ("invalid target, set executable file using 'file' command"); 459767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 460767af88aa617288e584afcfed055f7755e408542Jim Ingham return false; 461767af88aa617288e584afcfed055f7755e408542Jim Ingham } 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 463767af88aa617288e584afcfed055f7755e408542Jim Ingham 464767af88aa617288e584afcfed055f7755e408542Jim Ingham bool check_inlines = false; 465767af88aa617288e584afcfed055f7755e408542Jim Ingham SymbolContextList sc_list; 466338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham size_t num_matches = 0; 467338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 468338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (m_options.m_modules.size() > 0) 469338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 470338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham ModuleList matching_modules; 4710f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner for (unsigned i = 0, e = m_options.m_modules.size(); i != e; i++) 472338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 473537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec module_spec(m_options.m_modules[i].c_str(), false); 474338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (module_spec) 475338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 476338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham matching_modules.Clear(); 477338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham target->GetImages().FindModules (&module_spec, NULL, NULL, NULL, matching_modules); 478338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham num_matches += matching_modules.ResolveSymbolContextForFilePath (filename, 479338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 0, 480338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham check_inlines, 481338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham eSymbolContextModule | eSymbolContextCompUnit, 482338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list); 483338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 484338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 485338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 486338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 487338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 488338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham num_matches = target->GetImages().ResolveSymbolContextForFilePath (filename, 489338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 0, 490338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham check_inlines, 491338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham eSymbolContextModule | eSymbolContextCompUnit, 492338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list); 493338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 494338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 495338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches == 0) 496338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 497338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Could not find source file \"%s\".\n", 498338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.file_name.c_str()); 499338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 500338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 501338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 502338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 503338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches > 1) 504767af88aa617288e584afcfed055f7755e408542Jim Ingham { 505767af88aa617288e584afcfed055f7755e408542Jim Ingham SymbolContext sc; 506338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham bool got_multiple = false; 507338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham FileSpec *test_cu_spec = NULL; 508338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 5090f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner for (unsigned i = 0; i < num_matches; i++) 510767af88aa617288e584afcfed055f7755e408542Jim Ingham { 511338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list.GetContextAtIndex(i, sc); 512767af88aa617288e584afcfed055f7755e408542Jim Ingham if (sc.comp_unit) 513767af88aa617288e584afcfed055f7755e408542Jim Ingham { 514338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (test_cu_spec) 515338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 516338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (test_cu_spec != static_cast<FileSpec *> (sc.comp_unit)) 517338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham got_multiple = true; 518338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham break; 519338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 520338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 521338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham test_cu_spec = sc.comp_unit; 522767af88aa617288e584afcfed055f7755e408542Jim Ingham } 523767af88aa617288e584afcfed055f7755e408542Jim Ingham } 524338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (got_multiple) 525338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 526338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Multiple source files found matching: \"%s.\"\n", 527338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.file_name.c_str()); 528338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 529338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 530338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 531338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 532338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 533338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContext sc; 534338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (sc_list.GetContextAtIndex(0, sc)) 535338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 536338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (sc.comp_unit) 537338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 538238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.comp_unit, 539238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_options.start_line, 540238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton 0, 541238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_options.num_lines, 542238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "", 543238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton &result.GetOutputStream()); 544338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 545338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 546338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 547338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 548338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 549338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("No comp unit found for: \"%s.\"\n", 550338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.file_name.c_str()); 551338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 552338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 553338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 554767af88aa617288e584afcfed055f7755e408542Jim Ingham } 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 556767af88aa617288e584afcfed055f7755e408542Jim Ingham return result.Succeeded(); 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 558767af88aa617288e584afcfed055f7755e408542Jim Ingham 559767af88aa617288e584afcfed055f7755e408542Jim Ingham virtual const char *GetRepeatCommand (Args ¤t_command_args, uint32_t index) 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 561767af88aa617288e584afcfed055f7755e408542Jim Ingham return m_cmd_name.c_str(); 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 564767af88aa617288e584afcfed055f7755e408542Jim Inghamprotected: 565767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandOptions m_options; 566767af88aa617288e584afcfed055f7755e408542Jim Ingham 567767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 568767af88aa617288e584afcfed055f7755e408542Jim Ingham 569b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 570767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceList::CommandOptions::g_option_table[] = 571767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 5724d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_ALL, false, "count", 'c', required_argument, NULL, 0, eArgTypeCount, "The number of source lines to display."}, 5734d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_ALL, false, "shlib", 's', required_argument, NULL, CommandCompletions::eModuleCompletion, eArgTypeShlibName, "Look up the source file in the given shared library."}, 5744d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename, "The file from which to display source."}, 5754d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "line", 'l', required_argument, NULL, 0, eArgTypeLineNum, "The line number at which to start the display source."}, 5764d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_2, false, "name", 'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, eArgTypeSymbol, "The name of a function whose source to display."}, 5774d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 578767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 579767af88aa617288e584afcfed055f7755e408542Jim Ingham 580767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectMultiwordSource 581767af88aa617288e584afcfed055f7755e408542Jim Ingham 582767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 583767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectMultiwordSource 584767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 585767af88aa617288e584afcfed055f7755e408542Jim Ingham 586767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::CommandObjectMultiwordSource (CommandInterpreter &interpreter) : 587238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMultiword (interpreter, 588238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "source", 589c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice "A set of commands for accessing source file information", 590767af88aa617288e584afcfed055f7755e408542Jim Ingham "source <subcommand> [<subcommand-options>]") 591767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 592238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("info", CommandObjectSP (new CommandObjectSourceInfo (interpreter))); 593238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("list", CommandObjectSP (new CommandObjectSourceList (interpreter))); 594767af88aa617288e584afcfed055f7755e408542Jim Ingham} 595767af88aa617288e584afcfed055f7755e408542Jim Ingham 596767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::~CommandObjectMultiwordSource () 597767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 599767af88aa617288e584afcfed055f7755e408542Jim Ingham 600