CommandObjectSource.cpp revision 537a7a86687683fd403ce652d178fbc89e06ef9f
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" 20767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Core/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: 40767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandOptions () : 41767af88aa617288e584afcfed055f7755e408542Jim Ingham Options() 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 Options::ResetOptionValues(); 78767af88aa617288e584afcfed055f7755e408542Jim Ingham 79767af88aa617288e584afcfed055f7755e408542Jim Ingham file_spec.Clear(); 80767af88aa617288e584afcfed055f7755e408542Jim Ingham file_name.clear(); 81767af88aa617288e584afcfed055f7755e408542Jim Ingham start_line = 0; 82767af88aa617288e584afcfed055f7755e408542Jim Ingham } 83767af88aa617288e584afcfed055f7755e408542Jim Ingham 84767af88aa617288e584afcfed055f7755e408542Jim Ingham const lldb::OptionDefinition* 85767af88aa617288e584afcfed055f7755e408542Jim Ingham GetDefinitions () 86767af88aa617288e584afcfed055f7755e408542Jim Ingham { 87767af88aa617288e584afcfed055f7755e408542Jim Ingham return g_option_table; 88767af88aa617288e584afcfed055f7755e408542Jim Ingham } 89767af88aa617288e584afcfed055f7755e408542Jim Ingham static lldb::OptionDefinition g_option_table[]; 90767af88aa617288e584afcfed055f7755e408542Jim Ingham 91767af88aa617288e584afcfed055f7755e408542Jim Ingham // Instance variables to hold the values for command options. 92767af88aa617288e584afcfed055f7755e408542Jim Ingham FileSpec file_spec; 93767af88aa617288e584afcfed055f7755e408542Jim Ingham std::string file_name; 94767af88aa617288e584afcfed055f7755e408542Jim Ingham uint32_t start_line; 95767af88aa617288e584afcfed055f7755e408542Jim Ingham 96767af88aa617288e584afcfed055f7755e408542Jim Ingham }; 97767af88aa617288e584afcfed055f7755e408542Jim Ingham 98767af88aa617288e584afcfed055f7755e408542Jim Inghampublic: 99238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectSourceInfo(CommandInterpreter &interpreter) : 100238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 101238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "source info", 102238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Display information about the source lines from the current executable's debug info.", 103238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "source info [<cmd-options>]") 104767af88aa617288e584afcfed055f7755e408542Jim Ingham { 105767af88aa617288e584afcfed055f7755e408542Jim Ingham } 106767af88aa617288e584afcfed055f7755e408542Jim Ingham 107767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandObjectSourceInfo () 108767af88aa617288e584afcfed055f7755e408542Jim Ingham { 109767af88aa617288e584afcfed055f7755e408542Jim Ingham } 110767af88aa617288e584afcfed055f7755e408542Jim Ingham 111767af88aa617288e584afcfed055f7755e408542Jim Ingham 112767af88aa617288e584afcfed055f7755e408542Jim Ingham Options * 113767af88aa617288e584afcfed055f7755e408542Jim Ingham GetOptions () 114767af88aa617288e584afcfed055f7755e408542Jim Ingham { 115767af88aa617288e584afcfed055f7755e408542Jim Ingham return &m_options; 116767af88aa617288e584afcfed055f7755e408542Jim Ingham } 117767af88aa617288e584afcfed055f7755e408542Jim Ingham 118767af88aa617288e584afcfed055f7755e408542Jim Ingham 119767af88aa617288e584afcfed055f7755e408542Jim Ingham bool 120767af88aa617288e584afcfed055f7755e408542Jim Ingham Execute 121767af88aa617288e584afcfed055f7755e408542Jim Ingham ( 122767af88aa617288e584afcfed055f7755e408542Jim Ingham Args& args, 123767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandReturnObject &result 124767af88aa617288e584afcfed055f7755e408542Jim Ingham ) 125767af88aa617288e584afcfed055f7755e408542Jim Ingham { 126767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendError ("Not yet implemented"); 127767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 128767af88aa617288e584afcfed055f7755e408542Jim Ingham return false; 129767af88aa617288e584afcfed055f7755e408542Jim Ingham } 130767af88aa617288e584afcfed055f7755e408542Jim Inghamprotected: 131767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandOptions m_options; 132767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 133767af88aa617288e584afcfed055f7755e408542Jim Ingham 134767af88aa617288e584afcfed055f7755e408542Jim Inghamlldb::OptionDefinition 135767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceInfo::CommandOptions::g_option_table[] = 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1374d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "line", 'l', required_argument, NULL, 0, eArgTypeLineNum, "The line number at which to start the display source."}, 1384d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename, "The file from which to display source."}, 1394d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 140767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 141767af88aa617288e584afcfed055f7755e408542Jim Ingham 142767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectSourceList 143767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 144767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectSourceList 145767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 147767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectSourceList : public CommandObject 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 149767af88aa617288e584afcfed055f7755e408542Jim Ingham 150767af88aa617288e584afcfed055f7755e408542Jim Ingham class CommandOptions : public Options 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 152767af88aa617288e584afcfed055f7755e408542Jim Ingham public: 153767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandOptions () : 154767af88aa617288e584afcfed055f7755e408542Jim Ingham Options() 155767af88aa617288e584afcfed055f7755e408542Jim Ingham { 156767af88aa617288e584afcfed055f7755e408542Jim Ingham } 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandOptions () 159767af88aa617288e584afcfed055f7755e408542Jim Ingham { 160767af88aa617288e584afcfed055f7755e408542Jim Ingham } 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 162767af88aa617288e584afcfed055f7755e408542Jim Ingham Error 163767af88aa617288e584afcfed055f7755e408542Jim Ingham SetOptionValue (int option_idx, const char *option_arg) 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 165767af88aa617288e584afcfed055f7755e408542Jim Ingham Error error; 166767af88aa617288e584afcfed055f7755e408542Jim Ingham const char short_option = g_option_table[option_idx].short_option; 167767af88aa617288e584afcfed055f7755e408542Jim Ingham switch (short_option) 168767af88aa617288e584afcfed055f7755e408542Jim Ingham { 169767af88aa617288e584afcfed055f7755e408542Jim Ingham case 'l': 170767af88aa617288e584afcfed055f7755e408542Jim Ingham start_line = Args::StringToUInt32 (option_arg, 0); 171767af88aa617288e584afcfed055f7755e408542Jim Ingham if (start_line == 0) 172767af88aa617288e584afcfed055f7755e408542Jim Ingham error.SetErrorStringWithFormat("Invalid line number: '%s'.\n", option_arg); 173767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 175338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham case 'c': 176767af88aa617288e584afcfed055f7755e408542Jim Ingham num_lines = Args::StringToUInt32 (option_arg, 0); 177767af88aa617288e584afcfed055f7755e408542Jim Ingham if (num_lines == 0) 178767af88aa617288e584afcfed055f7755e408542Jim Ingham error.SetErrorStringWithFormat("Invalid line count: '%s'.\n", option_arg); 179767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 181767af88aa617288e584afcfed055f7755e408542Jim Ingham case 'f': 182767af88aa617288e584afcfed055f7755e408542Jim Ingham file_name = option_arg; 183767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 184338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 185338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham case 'n': 186338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham symbol_name = option_arg; 187338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham break; 188767af88aa617288e584afcfed055f7755e408542Jim Ingham 189338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham case 's': 190338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_modules.push_back (std::string (option_arg)); 191338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham break; 192767af88aa617288e584afcfed055f7755e408542Jim Ingham default: 193767af88aa617288e584afcfed055f7755e408542Jim Ingham error.SetErrorStringWithFormat("Unrecognized short option '%c'.\n", short_option); 194767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 197767af88aa617288e584afcfed055f7755e408542Jim Ingham return error; 198767af88aa617288e584afcfed055f7755e408542Jim Ingham } 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 200767af88aa617288e584afcfed055f7755e408542Jim Ingham void 201767af88aa617288e584afcfed055f7755e408542Jim Ingham ResetOptionValues () 202767af88aa617288e584afcfed055f7755e408542Jim Ingham { 203767af88aa617288e584afcfed055f7755e408542Jim Ingham Options::ResetOptionValues(); 204767af88aa617288e584afcfed055f7755e408542Jim Ingham 205767af88aa617288e584afcfed055f7755e408542Jim Ingham file_spec.Clear(); 206767af88aa617288e584afcfed055f7755e408542Jim Ingham file_name.clear(); 207338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham symbol_name.clear(); 208767af88aa617288e584afcfed055f7755e408542Jim Ingham start_line = 0; 209767af88aa617288e584afcfed055f7755e408542Jim Ingham num_lines = 10; 210338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_modules.clear(); 211767af88aa617288e584afcfed055f7755e408542Jim Ingham } 212767af88aa617288e584afcfed055f7755e408542Jim Ingham 213767af88aa617288e584afcfed055f7755e408542Jim Ingham const lldb::OptionDefinition* 214767af88aa617288e584afcfed055f7755e408542Jim Ingham GetDefinitions () 215767af88aa617288e584afcfed055f7755e408542Jim Ingham { 216767af88aa617288e584afcfed055f7755e408542Jim Ingham return g_option_table; 217767af88aa617288e584afcfed055f7755e408542Jim Ingham } 218767af88aa617288e584afcfed055f7755e408542Jim Ingham static lldb::OptionDefinition g_option_table[]; 219767af88aa617288e584afcfed055f7755e408542Jim Ingham 220767af88aa617288e584afcfed055f7755e408542Jim Ingham // Instance variables to hold the values for command options. 221767af88aa617288e584afcfed055f7755e408542Jim Ingham FileSpec file_spec; 222767af88aa617288e584afcfed055f7755e408542Jim Ingham std::string file_name; 223338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham std::string symbol_name; 224767af88aa617288e584afcfed055f7755e408542Jim Ingham uint32_t start_line; 225767af88aa617288e584afcfed055f7755e408542Jim Ingham uint32_t num_lines; 226338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham STLStringArray m_modules; 227767af88aa617288e584afcfed055f7755e408542Jim Ingham }; 228767af88aa617288e584afcfed055f7755e408542Jim Ingham 229767af88aa617288e584afcfed055f7755e408542Jim Inghampublic: 230238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectSourceList(CommandInterpreter &interpreter) : 231238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 232238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "source list", 233238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Display source code (as specified) based on the current executable's debug info.", 23443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL) 235767af88aa617288e584afcfed055f7755e408542Jim Ingham { 23643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 23743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData file_arg; 23843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 23943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 24043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice file_arg.arg_type = eArgTypeFilename; 24143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice file_arg.arg_repetition = eArgRepeatOptional; 24243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 24343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 24443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (file_arg); 24543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 24643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 24743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 248767af88aa617288e584afcfed055f7755e408542Jim Ingham } 249767af88aa617288e584afcfed055f7755e408542Jim Ingham 250767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandObjectSourceList () 251767af88aa617288e584afcfed055f7755e408542Jim Ingham { 252767af88aa617288e584afcfed055f7755e408542Jim Ingham } 253767af88aa617288e584afcfed055f7755e408542Jim Ingham 254767af88aa617288e584afcfed055f7755e408542Jim Ingham 255767af88aa617288e584afcfed055f7755e408542Jim Ingham Options * 256767af88aa617288e584afcfed055f7755e408542Jim Ingham GetOptions () 257767af88aa617288e584afcfed055f7755e408542Jim Ingham { 258767af88aa617288e584afcfed055f7755e408542Jim Ingham return &m_options; 259767af88aa617288e584afcfed055f7755e408542Jim Ingham } 260767af88aa617288e584afcfed055f7755e408542Jim Ingham 261767af88aa617288e584afcfed055f7755e408542Jim Ingham 262767af88aa617288e584afcfed055f7755e408542Jim Ingham bool 263767af88aa617288e584afcfed055f7755e408542Jim Ingham Execute 264767af88aa617288e584afcfed055f7755e408542Jim Ingham ( 265767af88aa617288e584afcfed055f7755e408542Jim Ingham Args& args, 266767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandReturnObject &result 267767af88aa617288e584afcfed055f7755e408542Jim Ingham ) 268767af88aa617288e584afcfed055f7755e408542Jim Ingham { 269767af88aa617288e584afcfed055f7755e408542Jim Ingham const int argc = args.GetArgumentCount(); 270767af88aa617288e584afcfed055f7755e408542Jim Ingham 271767af88aa617288e584afcfed055f7755e408542Jim Ingham if (argc != 0) 272767af88aa617288e584afcfed055f7755e408542Jim Ingham { 273767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendErrorWithFormat("'%s' takes no arguments, only flags.\n", GetCommandName()); 274767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 275767af88aa617288e584afcfed055f7755e408542Jim Ingham } 276767af88aa617288e584afcfed055f7755e408542Jim Ingham 277238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton ExecutionContext exe_ctx(m_interpreter.GetDebugger().GetExecutionContext()); 278338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 279338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (!m_options.symbol_name.empty()) 280338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 281338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // Displaying the source for a symbol: 282238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 283338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (target == NULL) 284338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 285338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendError ("invalid target, set executable file using 'file' command"); 286338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 287338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 288338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 289338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 290338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContextList sc_list; 291338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham ConstString name(m_options.symbol_name.c_str()); 292338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham bool append = true; 293338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham size_t num_matches = 0; 294338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 295338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (m_options.m_modules.size() > 0) 296338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 297338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham ModuleList matching_modules; 2980f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner for (unsigned i = 0, e = m_options.m_modules.size(); i != e; i++) 299338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 300537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec module_spec(m_options.m_modules[i].c_str(), false); 301338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (module_spec) 302338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 303338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham matching_modules.Clear(); 304338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham target->GetImages().FindModules (&module_spec, NULL, NULL, NULL, matching_modules); 305338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham num_matches += matching_modules.FindFunctions (name, eFunctionNameTypeBase, append, sc_list); 306338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 307338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 308338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 309338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 310338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 311338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham num_matches = target->GetImages().FindFunctions (name, eFunctionNameTypeBase, append, sc_list); 312338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 313338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 314338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContext sc; 315338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 316338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches == 0) 317338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 318338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Could not find function named: \"%s\".\n", m_options.symbol_name.c_str()); 319338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 320338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 321338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 322338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 323338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list.GetContextAtIndex (0, sc); 324338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham FileSpec start_file; 325338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham uint32_t start_line; 326338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham uint32_t end_line; 327338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham FileSpec end_file; 328338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (sc.function != NULL) 329338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 330338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc.function->GetStartLineSourceInfo (start_file, start_line); 331338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (start_line == 0) 332338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 333338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Could not find line information for start of function: \"%s\".\n", m_options.symbol_name.c_str()); 334338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 335338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 336338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 337338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc.function->GetEndLineSourceInfo (end_file, end_line); 338338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 339338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 340338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 341338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Could not find function info for: \"%s\".\n", m_options.symbol_name.c_str()); 342338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 343338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 344338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 345338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 346338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches > 1) 347338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 348338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // This could either be because there are multiple functions of this name, in which case 349338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // we'll have to specify this further... Or it could be because there are multiple inlined instances 350338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // of one function. So run through the matches and if they all have the same file & line then we can just 351338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // list one. 352338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 353338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham bool found_multiple = false; 354338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 355338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham for (size_t i = 1; i < num_matches; i++) 356338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 357338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContext scratch_sc; 358338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list.GetContextAtIndex (i, scratch_sc); 359338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (scratch_sc.function != NULL) 360338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 361338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham FileSpec scratch_file; 362338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham uint32_t scratch_line; 363338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham scratch_sc.function->GetStartLineSourceInfo (scratch_file, scratch_line); 364338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (scratch_file != start_file 365338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham || scratch_line != start_line) 366338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 367338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham found_multiple = true; 368338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham break; 369338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 370338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 371338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 372338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (found_multiple) 373338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 374338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham StreamString s; 375338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham for (size_t i = 0; i < num_matches; i++) 376338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 377338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContext scratch_sc; 378338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list.GetContextAtIndex (i, scratch_sc); 379338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (scratch_sc.function != NULL) 380338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 381338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham s.Printf("\n%d: ", i); 382338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham scratch_sc.function->Dump (&s, true); 383338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 384338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 385338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Multiple functions found matching: %s: \n%s\n", 386338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.symbol_name.c_str(), 387338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham s.GetData()); 388338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 389338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 390338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 391338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 392338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 393338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 394338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // This is a little hacky, but the first line table entry for a function points to the "{" that 395338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // starts the function block. It would be nice to actually get the function 396338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // declaration in there too. So back up a bit, but not further than what you're going to display. 397338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham size_t lines_to_back_up = m_options.num_lines >= 10 ? 5 : m_options.num_lines/2; 398338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham uint32_t line_no; 399338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (start_line <= lines_to_back_up) 400338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham line_no = 1; 401338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 402338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham line_no = start_line - lines_to_back_up; 403338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 404338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // For fun, if the function is shorter than the number of lines we're supposed to display, 405338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // only display the function... 406338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (end_line != 0) 407338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 408338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (m_options.num_lines > end_line - line_no) 409338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.num_lines = end_line - line_no; 410338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 411338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 412338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham char path_buf[PATH_MAX+1]; 413338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham start_file.GetPath(path_buf, PATH_MAX); 414338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendMessageWithFormat("File: %s.\n", path_buf); 415238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers (start_file, 416238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton line_no, 417238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton 0, 418238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_options.num_lines, 419238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "", 420238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton &result.GetOutputStream()); 421338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 422338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 423338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return true; 424338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 425338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 426338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else if (m_options.file_name.empty()) 427767af88aa617288e584afcfed055f7755e408542Jim Ingham { 428767af88aa617288e584afcfed055f7755e408542Jim Ingham // Last valid source manager context, or the current frame if no 429767af88aa617288e584afcfed055f7755e408542Jim Ingham // valid last context in source manager. 430767af88aa617288e584afcfed055f7755e408542Jim Ingham // One little trick here, if you type the exact same list command twice in a row, it is 431767af88aa617288e584afcfed055f7755e408542Jim Ingham // more likely because you typed it once, then typed it again 432767af88aa617288e584afcfed055f7755e408542Jim Ingham if (m_options.start_line == 0) 433767af88aa617288e584afcfed055f7755e408542Jim Ingham { 434238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton if (m_interpreter.GetDebugger().GetSourceManager().DisplayMoreWithLineNumbers (&result.GetOutputStream())) 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishResult); 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 438767af88aa617288e584afcfed055f7755e408542Jim Ingham } 439767af88aa617288e584afcfed055f7755e408542Jim Ingham else 440767af88aa617288e584afcfed055f7755e408542Jim Ingham { 441238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton if (m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbersUsingLastFile( 442767af88aa617288e584afcfed055f7755e408542Jim Ingham m_options.start_line, // Line to display 443767af88aa617288e584afcfed055f7755e408542Jim Ingham 0, // Lines before line to display 444767af88aa617288e584afcfed055f7755e408542Jim Ingham m_options.num_lines, // Lines after line to display 445767af88aa617288e584afcfed055f7755e408542Jim Ingham "", // Don't mark "line" 446767af88aa617288e584afcfed055f7755e408542Jim Ingham &result.GetOutputStream())) 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 448767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 450767af88aa617288e584afcfed055f7755e408542Jim Ingham 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 455767af88aa617288e584afcfed055f7755e408542Jim Ingham const char *filename = m_options.file_name.c_str(); 456238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 457767af88aa617288e584afcfed055f7755e408542Jim Ingham if (target == NULL) 458767af88aa617288e584afcfed055f7755e408542Jim Ingham { 459767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendError ("invalid target, set executable file using 'file' command"); 460767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 461767af88aa617288e584afcfed055f7755e408542Jim Ingham return false; 462767af88aa617288e584afcfed055f7755e408542Jim Ingham } 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 464767af88aa617288e584afcfed055f7755e408542Jim Ingham 465767af88aa617288e584afcfed055f7755e408542Jim Ingham bool check_inlines = false; 466767af88aa617288e584afcfed055f7755e408542Jim Ingham SymbolContextList sc_list; 467338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham size_t num_matches = 0; 468338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 469338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (m_options.m_modules.size() > 0) 470338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 471338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham ModuleList matching_modules; 4720f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner for (unsigned i = 0, e = m_options.m_modules.size(); i != e; i++) 473338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 474537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec module_spec(m_options.m_modules[i].c_str(), false); 475338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (module_spec) 476338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 477338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham matching_modules.Clear(); 478338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham target->GetImages().FindModules (&module_spec, NULL, NULL, NULL, matching_modules); 479338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham num_matches += matching_modules.ResolveSymbolContextForFilePath (filename, 480338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 0, 481338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham check_inlines, 482338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham eSymbolContextModule | eSymbolContextCompUnit, 483338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list); 484338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 485338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 486338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 487338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 488338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 489338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham num_matches = target->GetImages().ResolveSymbolContextForFilePath (filename, 490338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 0, 491338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham check_inlines, 492338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham eSymbolContextModule | eSymbolContextCompUnit, 493338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list); 494338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 495338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 496338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches == 0) 497338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 498338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Could not find source file \"%s\".\n", 499338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.file_name.c_str()); 500338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 501338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 502338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 503338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 504338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches > 1) 505767af88aa617288e584afcfed055f7755e408542Jim Ingham { 506767af88aa617288e584afcfed055f7755e408542Jim Ingham SymbolContext sc; 507338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham bool got_multiple = false; 508338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham FileSpec *test_cu_spec = NULL; 509338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 5100f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner for (unsigned i = 0; i < num_matches; i++) 511767af88aa617288e584afcfed055f7755e408542Jim Ingham { 512338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list.GetContextAtIndex(i, sc); 513767af88aa617288e584afcfed055f7755e408542Jim Ingham if (sc.comp_unit) 514767af88aa617288e584afcfed055f7755e408542Jim Ingham { 515338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (test_cu_spec) 516338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 517338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (test_cu_spec != static_cast<FileSpec *> (sc.comp_unit)) 518338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham got_multiple = true; 519338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham break; 520338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 521338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 522338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham test_cu_spec = sc.comp_unit; 523767af88aa617288e584afcfed055f7755e408542Jim Ingham } 524767af88aa617288e584afcfed055f7755e408542Jim Ingham } 525338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (got_multiple) 526338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 527338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Multiple source files found matching: \"%s.\"\n", 528338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.file_name.c_str()); 529338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 530338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 531338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 532338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 533338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 534338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContext sc; 535338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (sc_list.GetContextAtIndex(0, sc)) 536338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 537338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (sc.comp_unit) 538338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 539238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_interpreter.GetDebugger().GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.comp_unit, 540238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_options.start_line, 541238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton 0, 542238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_options.num_lines, 543238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "", 544238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton &result.GetOutputStream()); 545338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 546338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 547338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 548338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 549338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 550338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("No comp unit found for: \"%s.\"\n", 551338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.file_name.c_str()); 552338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 553338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 554338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 555767af88aa617288e584afcfed055f7755e408542Jim Ingham } 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 557767af88aa617288e584afcfed055f7755e408542Jim Ingham return result.Succeeded(); 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 559767af88aa617288e584afcfed055f7755e408542Jim Ingham 560767af88aa617288e584afcfed055f7755e408542Jim Ingham virtual const char *GetRepeatCommand (Args ¤t_command_args, uint32_t index) 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 562767af88aa617288e584afcfed055f7755e408542Jim Ingham return m_cmd_name.c_str(); 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 565767af88aa617288e584afcfed055f7755e408542Jim Inghamprotected: 566767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandOptions m_options; 567767af88aa617288e584afcfed055f7755e408542Jim Ingham 568767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 569767af88aa617288e584afcfed055f7755e408542Jim Ingham 570767af88aa617288e584afcfed055f7755e408542Jim Inghamlldb::OptionDefinition 571767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceList::CommandOptions::g_option_table[] = 572767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 5734d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_ALL, false, "count", 'c', required_argument, NULL, 0, eArgTypeCount, "The number of source lines to display."}, 5744d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_ALL, false, "shlib", 's', required_argument, NULL, CommandCompletions::eModuleCompletion, eArgTypeShlibName, "Look up the source file in the given shared library."}, 5754d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename, "The file from which to display source."}, 5764d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "line", 'l', required_argument, NULL, 0, eArgTypeLineNum, "The line number at which to start the display source."}, 5774d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_2, false, "name", 'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, eArgTypeSymbol, "The name of a function whose source to display."}, 5784d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 579767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 580767af88aa617288e584afcfed055f7755e408542Jim Ingham 581767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectMultiwordSource 582767af88aa617288e584afcfed055f7755e408542Jim Ingham 583767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 584767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectMultiwordSource 585767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 586767af88aa617288e584afcfed055f7755e408542Jim Ingham 587767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::CommandObjectMultiwordSource (CommandInterpreter &interpreter) : 588238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMultiword (interpreter, 589238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "source", 590c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice "A set of commands for accessing source file information", 591767af88aa617288e584afcfed055f7755e408542Jim Ingham "source <subcommand> [<subcommand-options>]") 592767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 593238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("info", CommandObjectSP (new CommandObjectSourceInfo (interpreter))); 594238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("list", CommandObjectSP (new CommandObjectSourceList (interpreter))); 595767af88aa617288e584afcfed055f7755e408542Jim Ingham} 596767af88aa617288e584afcfed055f7755e408542Jim Ingham 597767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::~CommandObjectMultiwordSource () 598767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 600767af88aa617288e584afcfed055f7755e408542Jim Ingham 601