CommandObjectSource.cpp revision fdf24efe672bf3fa041cdbebd2d7f406b11882bd
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" 1852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton#include "lldb/Core/FileLineResolver.h" 1952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton#include "lldb/Core/SourceManager.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h" 225f54ac373b119a4c6693e4875c48aa761fba0c86Greg Clayton#include "lldb/Host/FileSpec.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h" 25767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/CommandCompletions.h" 26767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/Options.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 3252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton// CommandObjectSourceInfo 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectSourceInfo : public CommandObject 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38767af88aa617288e584afcfed055f7755e408542Jim Ingham class CommandOptions : public Options 39767af88aa617288e584afcfed055f7755e408542Jim Ingham { 40767af88aa617288e584afcfed055f7755e408542Jim Ingham public: 41f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 42f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton Options(interpreter) 43767af88aa617288e584afcfed055f7755e408542Jim Ingham { 44767af88aa617288e584afcfed055f7755e408542Jim Ingham } 45767af88aa617288e584afcfed055f7755e408542Jim Ingham 46767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandOptions () 47767af88aa617288e584afcfed055f7755e408542Jim Ingham { 48767af88aa617288e584afcfed055f7755e408542Jim Ingham } 49767af88aa617288e584afcfed055f7755e408542Jim Ingham 50767af88aa617288e584afcfed055f7755e408542Jim Ingham Error 51143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 52767af88aa617288e584afcfed055f7755e408542Jim Ingham { 53767af88aa617288e584afcfed055f7755e408542Jim Ingham Error error; 54767af88aa617288e584afcfed055f7755e408542Jim Ingham const char short_option = g_option_table[option_idx].short_option; 55767af88aa617288e584afcfed055f7755e408542Jim Ingham switch (short_option) 56767af88aa617288e584afcfed055f7755e408542Jim Ingham { 57767af88aa617288e584afcfed055f7755e408542Jim Ingham case 'l': 58767af88aa617288e584afcfed055f7755e408542Jim Ingham start_line = Args::StringToUInt32 (option_arg, 0); 59767af88aa617288e584afcfed055f7755e408542Jim Ingham if (start_line == 0) 60767af88aa617288e584afcfed055f7755e408542Jim Ingham error.SetErrorStringWithFormat("Invalid line number: '%s'.\n", option_arg); 61767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 62767af88aa617288e584afcfed055f7755e408542Jim Ingham 63767af88aa617288e584afcfed055f7755e408542Jim Ingham case 'f': 64767af88aa617288e584afcfed055f7755e408542Jim Ingham file_name = option_arg; 65767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 66767af88aa617288e584afcfed055f7755e408542Jim Ingham 67767af88aa617288e584afcfed055f7755e408542Jim Ingham default: 68767af88aa617288e584afcfed055f7755e408542Jim Ingham error.SetErrorStringWithFormat("Unrecognized short option '%c'.\n", short_option); 69767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 70767af88aa617288e584afcfed055f7755e408542Jim Ingham } 71767af88aa617288e584afcfed055f7755e408542Jim Ingham 72767af88aa617288e584afcfed055f7755e408542Jim Ingham return error; 73767af88aa617288e584afcfed055f7755e408542Jim Ingham } 74767af88aa617288e584afcfed055f7755e408542Jim Ingham 75767af88aa617288e584afcfed055f7755e408542Jim Ingham void 76143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting () 77767af88aa617288e584afcfed055f7755e408542Jim Ingham { 78767af88aa617288e584afcfed055f7755e408542Jim Ingham file_spec.Clear(); 79767af88aa617288e584afcfed055f7755e408542Jim Ingham file_name.clear(); 80767af88aa617288e584afcfed055f7755e408542Jim Ingham start_line = 0; 81767af88aa617288e584afcfed055f7755e408542Jim Ingham } 82767af88aa617288e584afcfed055f7755e408542Jim Ingham 83b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 84767af88aa617288e584afcfed055f7755e408542Jim Ingham GetDefinitions () 85767af88aa617288e584afcfed055f7755e408542Jim Ingham { 86767af88aa617288e584afcfed055f7755e408542Jim Ingham return g_option_table; 87767af88aa617288e584afcfed055f7755e408542Jim Ingham } 88b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 89767af88aa617288e584afcfed055f7755e408542Jim Ingham 90767af88aa617288e584afcfed055f7755e408542Jim Ingham // Instance variables to hold the values for command options. 91767af88aa617288e584afcfed055f7755e408542Jim Ingham FileSpec file_spec; 92767af88aa617288e584afcfed055f7755e408542Jim Ingham std::string file_name; 93767af88aa617288e584afcfed055f7755e408542Jim Ingham uint32_t start_line; 94767af88aa617288e584afcfed055f7755e408542Jim Ingham 95767af88aa617288e584afcfed055f7755e408542Jim Ingham }; 96767af88aa617288e584afcfed055f7755e408542Jim Ingham 97767af88aa617288e584afcfed055f7755e408542Jim Inghampublic: 98238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectSourceInfo(CommandInterpreter &interpreter) : 99238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 100238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "source info", 101238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Display information about the source lines from the current executable's debug info.", 102f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton "source info [<cmd-options>]"), 103f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options (interpreter) 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 134b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 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: 153f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 154f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton Options(interpreter) 155767af88aa617288e584afcfed055f7755e408542Jim Ingham { 156767af88aa617288e584afcfed055f7755e408542Jim Ingham } 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 158767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandOptions () 159767af88aa617288e584afcfed055f7755e408542Jim Ingham { 160767af88aa617288e584afcfed055f7755e408542Jim Ingham } 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 162767af88aa617288e584afcfed055f7755e408542Jim Ingham Error 163143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton SetOptionValue (uint32_t 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 18152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 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': 19052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton modules.push_back (std::string (option_arg)); 19152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton break; 19252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 19352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton case 'b': 19452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton show_bp_locs = true; 195338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham break; 196767af88aa617288e584afcfed055f7755e408542Jim Ingham default: 197767af88aa617288e584afcfed055f7755e408542Jim Ingham error.SetErrorStringWithFormat("Unrecognized short option '%c'.\n", short_option); 198767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 201767af88aa617288e584afcfed055f7755e408542Jim Ingham return error; 202767af88aa617288e584afcfed055f7755e408542Jim Ingham } 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 204767af88aa617288e584afcfed055f7755e408542Jim Ingham void 205143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting () 206767af88aa617288e584afcfed055f7755e408542Jim Ingham { 207767af88aa617288e584afcfed055f7755e408542Jim Ingham file_spec.Clear(); 208767af88aa617288e584afcfed055f7755e408542Jim Ingham file_name.clear(); 209338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham symbol_name.clear(); 210767af88aa617288e584afcfed055f7755e408542Jim Ingham start_line = 0; 211767af88aa617288e584afcfed055f7755e408542Jim Ingham num_lines = 10; 21252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton show_bp_locs = false; 21352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton modules.clear(); 214767af88aa617288e584afcfed055f7755e408542Jim Ingham } 215767af88aa617288e584afcfed055f7755e408542Jim Ingham 216b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 217767af88aa617288e584afcfed055f7755e408542Jim Ingham GetDefinitions () 218767af88aa617288e584afcfed055f7755e408542Jim Ingham { 219767af88aa617288e584afcfed055f7755e408542Jim Ingham return g_option_table; 220767af88aa617288e584afcfed055f7755e408542Jim Ingham } 221b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 222767af88aa617288e584afcfed055f7755e408542Jim Ingham 223767af88aa617288e584afcfed055f7755e408542Jim Ingham // Instance variables to hold the values for command options. 224767af88aa617288e584afcfed055f7755e408542Jim Ingham FileSpec file_spec; 225767af88aa617288e584afcfed055f7755e408542Jim Ingham std::string file_name; 226338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham std::string symbol_name; 227767af88aa617288e584afcfed055f7755e408542Jim Ingham uint32_t start_line; 228767af88aa617288e584afcfed055f7755e408542Jim Ingham uint32_t num_lines; 22952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton STLStringArray modules; 23052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton bool show_bp_locs; 231767af88aa617288e584afcfed055f7755e408542Jim Ingham }; 232767af88aa617288e584afcfed055f7755e408542Jim Ingham 233767af88aa617288e584afcfed055f7755e408542Jim Inghampublic: 234238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectSourceList(CommandInterpreter &interpreter) : 235238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 236238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "source list", 237238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Display source code (as specified) based on the current executable's debug info.", 238f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton NULL), 239f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options (interpreter) 240767af88aa617288e584afcfed055f7755e408542Jim Ingham { 24143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 24243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData file_arg; 24343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 24443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 24543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice file_arg.arg_type = eArgTypeFilename; 24643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice file_arg.arg_repetition = eArgRepeatOptional; 24743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 24843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 24943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (file_arg); 25043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 25143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 25243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 253767af88aa617288e584afcfed055f7755e408542Jim Ingham } 254767af88aa617288e584afcfed055f7755e408542Jim Ingham 255767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandObjectSourceList () 256767af88aa617288e584afcfed055f7755e408542Jim Ingham { 257767af88aa617288e584afcfed055f7755e408542Jim Ingham } 258767af88aa617288e584afcfed055f7755e408542Jim Ingham 259767af88aa617288e584afcfed055f7755e408542Jim Ingham 260767af88aa617288e584afcfed055f7755e408542Jim Ingham Options * 261767af88aa617288e584afcfed055f7755e408542Jim Ingham GetOptions () 262767af88aa617288e584afcfed055f7755e408542Jim Ingham { 263767af88aa617288e584afcfed055f7755e408542Jim Ingham return &m_options; 264767af88aa617288e584afcfed055f7755e408542Jim Ingham } 265767af88aa617288e584afcfed055f7755e408542Jim Ingham 266767af88aa617288e584afcfed055f7755e408542Jim Ingham 267767af88aa617288e584afcfed055f7755e408542Jim Ingham bool 268767af88aa617288e584afcfed055f7755e408542Jim Ingham Execute 269767af88aa617288e584afcfed055f7755e408542Jim Ingham ( 270767af88aa617288e584afcfed055f7755e408542Jim Ingham Args& args, 271767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandReturnObject &result 272767af88aa617288e584afcfed055f7755e408542Jim Ingham ) 273767af88aa617288e584afcfed055f7755e408542Jim Ingham { 274767af88aa617288e584afcfed055f7755e408542Jim Ingham const int argc = args.GetArgumentCount(); 275767af88aa617288e584afcfed055f7755e408542Jim Ingham 276767af88aa617288e584afcfed055f7755e408542Jim Ingham if (argc != 0) 277767af88aa617288e584afcfed055f7755e408542Jim Ingham { 278767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendErrorWithFormat("'%s' takes no arguments, only flags.\n", GetCommandName()); 279767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 280767af88aa617288e584afcfed055f7755e408542Jim Ingham } 281767af88aa617288e584afcfed055f7755e408542Jim Ingham 282b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ExecutionContext exe_ctx(m_interpreter.GetExecutionContext()); 283fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham Target *target = NULL; 284fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham 285fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham if (exe_ctx.target) 286fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham target = exe_ctx.target; 287fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham else 288fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham target = m_interpreter.GetDebugger().GetSelectedTarget().get(); 289fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham 290fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham if (target == NULL) 291fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 292fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham result.AppendError ("invalid target, create a debug target using the 'target create' command"); 293fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham result.SetStatus (eReturnStatusFailed); 294fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham return false; 295fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 296fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham 297338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (!m_options.symbol_name.empty()) 298338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 299338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // Displaying the source for a symbol: 300338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContextList sc_list; 301338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham ConstString name(m_options.symbol_name.c_str()); 30228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton bool include_symbols = false; 303338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham bool append = true; 304338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham size_t num_matches = 0; 305338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 30652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton if (m_options.modules.size() > 0) 307338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 308338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham ModuleList matching_modules; 30952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton for (unsigned i = 0, e = m_options.modules.size(); i != e; i++) 310338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 31152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton FileSpec module_spec(m_options.modules[i].c_str(), false); 312338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (module_spec) 313338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 314338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham matching_modules.Clear(); 315338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham target->GetImages().FindModules (&module_spec, NULL, NULL, NULL, matching_modules); 31628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton num_matches += matching_modules.FindFunctions (name, eFunctionNameTypeBase, include_symbols, append, sc_list); 317338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 318338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 319338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 320338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 321338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 32228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton num_matches = target->GetImages().FindFunctions (name, eFunctionNameTypeBase, include_symbols, append, sc_list); 323338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 324338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 325338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContext sc; 326338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 327338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches == 0) 328338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 329338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Could not find function named: \"%s\".\n", m_options.symbol_name.c_str()); 330338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 331338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 332338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 333338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 334338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list.GetContextAtIndex (0, sc); 335338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham FileSpec start_file; 336338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham uint32_t start_line; 337338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham uint32_t end_line; 338338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham FileSpec end_file; 339338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (sc.function != NULL) 340338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 341338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc.function->GetStartLineSourceInfo (start_file, start_line); 342338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (start_line == 0) 343338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 344338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Could not find line information for start of function: \"%s\".\n", m_options.symbol_name.c_str()); 345338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 346338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 347338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 348338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc.function->GetEndLineSourceInfo (end_file, end_line); 349338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 350338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 351338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 352338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Could not find function info for: \"%s\".\n", m_options.symbol_name.c_str()); 353338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 354338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 355338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 356338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 357338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches > 1) 358338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 359338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // This could either be because there are multiple functions of this name, in which case 360338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // we'll have to specify this further... Or it could be because there are multiple inlined instances 361338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // of one function. So run through the matches and if they all have the same file & line then we can just 362338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // list one. 363338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 364338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham bool found_multiple = false; 365338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 366338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham for (size_t i = 1; i < num_matches; i++) 367338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 368338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContext scratch_sc; 369338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list.GetContextAtIndex (i, scratch_sc); 370338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (scratch_sc.function != NULL) 371338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 372338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham FileSpec scratch_file; 373338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham uint32_t scratch_line; 374338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham scratch_sc.function->GetStartLineSourceInfo (scratch_file, scratch_line); 375338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (scratch_file != start_file 376338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham || scratch_line != start_line) 377338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 378338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham found_multiple = true; 379338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham break; 380338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 381338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 382338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 383338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (found_multiple) 384338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 385338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham StreamString s; 386338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham for (size_t i = 0; i < num_matches; i++) 387338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 388338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContext scratch_sc; 389338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list.GetContextAtIndex (i, scratch_sc); 390338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (scratch_sc.function != NULL) 391338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 392338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham s.Printf("\n%d: ", i); 393338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham scratch_sc.function->Dump (&s, true); 394338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 395338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 396338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Multiple functions found matching: %s: \n%s\n", 397338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.symbol_name.c_str(), 398338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham s.GetData()); 399338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 400338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 401338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 402338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 403338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 404338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 405338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // This is a little hacky, but the first line table entry for a function points to the "{" that 406338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // starts the function block. It would be nice to actually get the function 407338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // declaration in there too. So back up a bit, but not further than what you're going to display. 408338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham size_t lines_to_back_up = m_options.num_lines >= 10 ? 5 : m_options.num_lines/2; 409338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham uint32_t line_no; 410338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (start_line <= lines_to_back_up) 411338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham line_no = 1; 412338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 413338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham line_no = start_line - lines_to_back_up; 414338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 415338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // For fun, if the function is shorter than the number of lines we're supposed to display, 416338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham // only display the function... 417338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (end_line != 0) 418338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 419338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (m_options.num_lines > end_line - line_no) 420338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.num_lines = end_line - line_no; 421338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 422338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 42352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton char path_buf[PATH_MAX]; 42452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton start_file.GetPath(path_buf, sizeof(path_buf)); 4251cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton 426fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham if (m_options.show_bp_locs) 4271cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton { 4281cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton const bool show_inlines = true; 4291cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton m_breakpoint_locations.Reset (start_file, 0, show_inlines); 4301cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton SearchFilter target_search_filter (exe_ctx.target->GetSP()); 4311cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton target_search_filter.Search (m_breakpoint_locations); 4321cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton } 4331cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton else 4341cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton m_breakpoint_locations.Clear(); 4351cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton 436338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendMessageWithFormat("File: %s.\n", path_buf); 437fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham target->GetSourceManager().DisplaySourceLinesWithLineNumbers (start_file, 438fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham line_no, 439fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham 0, 440fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham m_options.num_lines, 441fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham "", 442fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham &result.GetOutputStream(), 443fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham GetBreakpointLocations ()); 444338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 445338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 446338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return true; 447338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 448338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 449338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else if (m_options.file_name.empty()) 450767af88aa617288e584afcfed055f7755e408542Jim Ingham { 451767af88aa617288e584afcfed055f7755e408542Jim Ingham // Last valid source manager context, or the current frame if no 452767af88aa617288e584afcfed055f7755e408542Jim Ingham // valid last context in source manager. 453767af88aa617288e584afcfed055f7755e408542Jim Ingham // One little trick here, if you type the exact same list command twice in a row, it is 454767af88aa617288e584afcfed055f7755e408542Jim Ingham // more likely because you typed it once, then typed it again 455767af88aa617288e584afcfed055f7755e408542Jim Ingham if (m_options.start_line == 0) 456767af88aa617288e584afcfed055f7755e408542Jim Ingham { 45752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton if (m_interpreter.GetDebugger().GetSourceManager().DisplayMoreWithLineNumbers (&result.GetOutputStream(), 45852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton GetBreakpointLocations ())) 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishResult); 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 462767af88aa617288e584afcfed055f7755e408542Jim Ingham } 463767af88aa617288e584afcfed055f7755e408542Jim Ingham else 464767af88aa617288e584afcfed055f7755e408542Jim Ingham { 465fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham if (m_options.show_bp_locs) 4661cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton { 467fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham SourceManager::FileSP last_file_sp (target->GetSourceManager().GetLastFile ()); 4681cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton if (last_file_sp) 4691cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton { 4701cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton const bool show_inlines = true; 4711cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton m_breakpoint_locations.Reset (last_file_sp->GetFileSpec(), 0, show_inlines); 472fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham SearchFilter target_search_filter (target->GetSP()); 4731cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton target_search_filter.Search (m_breakpoint_locations); 4741cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton } 4751cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton } 4761cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton else 4771cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton m_breakpoint_locations.Clear(); 4781cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton 479fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham if (target->GetSourceManager().DisplaySourceLinesWithLineNumbersUsingLastFile( 480767af88aa617288e584afcfed055f7755e408542Jim Ingham m_options.start_line, // Line to display 481767af88aa617288e584afcfed055f7755e408542Jim Ingham 0, // Lines before line to display 482767af88aa617288e584afcfed055f7755e408542Jim Ingham m_options.num_lines, // Lines after line to display 483767af88aa617288e584afcfed055f7755e408542Jim Ingham "", // Don't mark "line" 48452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton &result.GetOutputStream(), 48552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton GetBreakpointLocations ())) 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 487767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 489767af88aa617288e584afcfed055f7755e408542Jim Ingham 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 494767af88aa617288e584afcfed055f7755e408542Jim Ingham const char *filename = m_options.file_name.c_str(); 495767af88aa617288e584afcfed055f7755e408542Jim Ingham 496767af88aa617288e584afcfed055f7755e408542Jim Ingham bool check_inlines = false; 497767af88aa617288e584afcfed055f7755e408542Jim Ingham SymbolContextList sc_list; 498338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham size_t num_matches = 0; 499338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 50052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton if (m_options.modules.size() > 0) 501338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 502338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham ModuleList matching_modules; 50352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton for (unsigned i = 0, e = m_options.modules.size(); i != e; i++) 504338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 50552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton FileSpec module_spec(m_options.modules[i].c_str(), false); 506338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (module_spec) 507338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 508338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham matching_modules.Clear(); 509338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham target->GetImages().FindModules (&module_spec, NULL, NULL, NULL, matching_modules); 510338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham num_matches += matching_modules.ResolveSymbolContextForFilePath (filename, 51152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 0, 51252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton check_inlines, 51352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton eSymbolContextModule | eSymbolContextCompUnit, 51452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton sc_list); 515338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 516338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 517338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 518338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 519338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 520338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham num_matches = target->GetImages().ResolveSymbolContextForFilePath (filename, 521338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 0, 522338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham check_inlines, 523338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham eSymbolContextModule | eSymbolContextCompUnit, 524338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list); 525338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 526338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 527338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches == 0) 528338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 529338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Could not find source file \"%s\".\n", 530338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.file_name.c_str()); 531338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 532338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 533338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 534338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 535338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches > 1) 536767af88aa617288e584afcfed055f7755e408542Jim Ingham { 537767af88aa617288e584afcfed055f7755e408542Jim Ingham SymbolContext sc; 538338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham bool got_multiple = false; 539338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham FileSpec *test_cu_spec = NULL; 540338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 5410f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner for (unsigned i = 0; i < num_matches; i++) 542767af88aa617288e584afcfed055f7755e408542Jim Ingham { 543338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list.GetContextAtIndex(i, sc); 544767af88aa617288e584afcfed055f7755e408542Jim Ingham if (sc.comp_unit) 545767af88aa617288e584afcfed055f7755e408542Jim Ingham { 546338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (test_cu_spec) 547338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 548338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (test_cu_spec != static_cast<FileSpec *> (sc.comp_unit)) 549338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham got_multiple = true; 550338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham break; 551338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 552338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 553338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham test_cu_spec = sc.comp_unit; 554767af88aa617288e584afcfed055f7755e408542Jim Ingham } 555767af88aa617288e584afcfed055f7755e408542Jim Ingham } 556338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (got_multiple) 557338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 558338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Multiple source files found matching: \"%s.\"\n", 559338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.file_name.c_str()); 560338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 561338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 562338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 563338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 564338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 565338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContext sc; 566338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (sc_list.GetContextAtIndex(0, sc)) 567338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 568338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (sc.comp_unit) 569338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 570fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham if (m_options.show_bp_locs) 57152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton { 57252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton const bool show_inlines = true; 57352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_breakpoint_locations.Reset (*sc.comp_unit, 0, show_inlines); 574fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham SearchFilter target_search_filter (target->GetSP()); 57552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton target_search_filter.Search (m_breakpoint_locations); 57652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton } 57752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton else 57852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_breakpoint_locations.Clear(); 57952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 580fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham target->GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.comp_unit, 581fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham m_options.start_line, 582fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham 0, 583fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham m_options.num_lines, 584fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham "", 585fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham &result.GetOutputStream(), 586fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham GetBreakpointLocations ()); 58752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 588338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 589338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 590338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 591338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 592338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("No comp unit found for: \"%s.\"\n", 593338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.file_name.c_str()); 594338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 595338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 596338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 597767af88aa617288e584afcfed055f7755e408542Jim Ingham } 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 599767af88aa617288e584afcfed055f7755e408542Jim Ingham return result.Succeeded(); 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 601767af88aa617288e584afcfed055f7755e408542Jim Ingham 602767af88aa617288e584afcfed055f7755e408542Jim Ingham virtual const char *GetRepeatCommand (Args ¤t_command_args, uint32_t index) 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 604767af88aa617288e584afcfed055f7755e408542Jim Ingham return m_cmd_name.c_str(); 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 607767af88aa617288e584afcfed055f7755e408542Jim Inghamprotected: 60852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton const SymbolContextList * 60952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton GetBreakpointLocations () 61052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton { 61152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton if (m_breakpoint_locations.GetFileLineMatches().GetSize() > 0) 61252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton return &m_breakpoint_locations.GetFileLineMatches(); 61352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton return NULL; 61452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton } 615767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandOptions m_options; 61652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton FileLineResolver m_breakpoint_locations; 617767af88aa617288e584afcfed055f7755e408542Jim Ingham 618767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 619767af88aa617288e584afcfed055f7755e408542Jim Ingham 620b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 621767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceList::CommandOptions::g_option_table[] = 622767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 6234d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_ALL, false, "count", 'c', required_argument, NULL, 0, eArgTypeCount, "The number of source lines to display."}, 6244d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_ALL, false, "shlib", 's', required_argument, NULL, CommandCompletions::eModuleCompletion, eArgTypeShlibName, "Look up the source file in the given shared library."}, 62552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton{ LLDB_OPT_SET_ALL, false, "show-breakpoints", 'b', no_argument, NULL, 0, eArgTypeNone, "Show the line table locations from the debug information that indicate valid places to set source level breakpoints."}, 6264d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename, "The file from which to display source."}, 6274d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "line", 'l', required_argument, NULL, 0, eArgTypeLineNum, "The line number at which to start the display source."}, 6284d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_2, false, "name", 'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, eArgTypeSymbol, "The name of a function whose source to display."}, 6294d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 630767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 631767af88aa617288e584afcfed055f7755e408542Jim Ingham 632767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectMultiwordSource 633767af88aa617288e584afcfed055f7755e408542Jim Ingham 634767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 635767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectMultiwordSource 636767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 637767af88aa617288e584afcfed055f7755e408542Jim Ingham 638767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::CommandObjectMultiwordSource (CommandInterpreter &interpreter) : 639238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMultiword (interpreter, 640238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "source", 641c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice "A set of commands for accessing source file information", 642767af88aa617288e584afcfed055f7755e408542Jim Ingham "source <subcommand> [<subcommand-options>]") 643767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 644238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("info", CommandObjectSP (new CommandObjectSourceInfo (interpreter))); 645238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("list", CommandObjectSP (new CommandObjectSourceList (interpreter))); 646767af88aa617288e584afcfed055f7755e408542Jim Ingham} 647767af88aa617288e584afcfed055f7755e408542Jim Ingham 648767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::~CommandObjectMultiwordSource () 649767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 651767af88aa617288e584afcfed055f7755e408542Jim Ingham 652