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 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "CommandObjectSource.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1884cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h" 1963094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Core/Debugger.h" 2052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton#include "lldb/Core/FileLineResolver.h" 21781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton#include "lldb/Core/Module.h" 2249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h" 2352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton#include "lldb/Core/SourceManager.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h" 265f54ac373b119a4c6693e4875c48aa761fba0c86Greg Clayton#include "lldb/Host/FileSpec.h" 2749ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h" 2849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Function.h" 290c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain#include "lldb/Symbol/Symbol.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h" 32767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/CommandCompletions.h" 33767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/Options.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 3952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton// CommandObjectSourceInfo 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectSourceInfo : public CommandObjectParsed 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45767af88aa617288e584afcfed055f7755e408542Jim Ingham class CommandOptions : public Options 46767af88aa617288e584afcfed055f7755e408542Jim Ingham { 47767af88aa617288e584afcfed055f7755e408542Jim Ingham public: 48f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 49f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton Options(interpreter) 50767af88aa617288e584afcfed055f7755e408542Jim Ingham { 51767af88aa617288e584afcfed055f7755e408542Jim Ingham } 52767af88aa617288e584afcfed055f7755e408542Jim Ingham 53767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandOptions () 54767af88aa617288e584afcfed055f7755e408542Jim Ingham { 55767af88aa617288e584afcfed055f7755e408542Jim Ingham } 56767af88aa617288e584afcfed055f7755e408542Jim Ingham 57767af88aa617288e584afcfed055f7755e408542Jim Ingham Error 58143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 59767af88aa617288e584afcfed055f7755e408542Jim Ingham { 60767af88aa617288e584afcfed055f7755e408542Jim Ingham Error error; 616475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = g_option_table[option_idx].short_option; 62767af88aa617288e584afcfed055f7755e408542Jim Ingham switch (short_option) 63767af88aa617288e584afcfed055f7755e408542Jim Ingham { 64767af88aa617288e584afcfed055f7755e408542Jim Ingham case 'l': 65767af88aa617288e584afcfed055f7755e408542Jim Ingham start_line = Args::StringToUInt32 (option_arg, 0); 66767af88aa617288e584afcfed055f7755e408542Jim Ingham if (start_line == 0) 679c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid line number: '%s'", option_arg); 68767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 69767af88aa617288e584afcfed055f7755e408542Jim Ingham 70767af88aa617288e584afcfed055f7755e408542Jim Ingham case 'f': 71767af88aa617288e584afcfed055f7755e408542Jim Ingham file_name = option_arg; 72767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 73767af88aa617288e584afcfed055f7755e408542Jim Ingham 74767af88aa617288e584afcfed055f7755e408542Jim Ingham default: 759c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("unrecognized short option '%c'", short_option); 76767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 77767af88aa617288e584afcfed055f7755e408542Jim Ingham } 78767af88aa617288e584afcfed055f7755e408542Jim Ingham 79767af88aa617288e584afcfed055f7755e408542Jim Ingham return error; 80767af88aa617288e584afcfed055f7755e408542Jim Ingham } 81767af88aa617288e584afcfed055f7755e408542Jim Ingham 82767af88aa617288e584afcfed055f7755e408542Jim Ingham void 83143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting () 84767af88aa617288e584afcfed055f7755e408542Jim Ingham { 85767af88aa617288e584afcfed055f7755e408542Jim Ingham file_spec.Clear(); 86767af88aa617288e584afcfed055f7755e408542Jim Ingham file_name.clear(); 87767af88aa617288e584afcfed055f7755e408542Jim Ingham start_line = 0; 88767af88aa617288e584afcfed055f7755e408542Jim Ingham } 89767af88aa617288e584afcfed055f7755e408542Jim Ingham 90b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 91767af88aa617288e584afcfed055f7755e408542Jim Ingham GetDefinitions () 92767af88aa617288e584afcfed055f7755e408542Jim Ingham { 93767af88aa617288e584afcfed055f7755e408542Jim Ingham return g_option_table; 94767af88aa617288e584afcfed055f7755e408542Jim Ingham } 95b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 96767af88aa617288e584afcfed055f7755e408542Jim Ingham 97767af88aa617288e584afcfed055f7755e408542Jim Ingham // Instance variables to hold the values for command options. 98767af88aa617288e584afcfed055f7755e408542Jim Ingham FileSpec file_spec; 99767af88aa617288e584afcfed055f7755e408542Jim Ingham std::string file_name; 100767af88aa617288e584afcfed055f7755e408542Jim Ingham uint32_t start_line; 101767af88aa617288e584afcfed055f7755e408542Jim Ingham 102767af88aa617288e584afcfed055f7755e408542Jim Ingham }; 103767af88aa617288e584afcfed055f7755e408542Jim Ingham 104767af88aa617288e584afcfed055f7755e408542Jim Inghampublic: 105238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectSourceInfo(CommandInterpreter &interpreter) : 106da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 107da26bd203cbb104291b39891febf7481794f205fJim Ingham "source info", 108da26bd203cbb104291b39891febf7481794f205fJim Ingham "Display information about the source lines from the current executable's debug info.", 109da26bd203cbb104291b39891febf7481794f205fJim Ingham "source info [<cmd-options>]"), 110f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options (interpreter) 111767af88aa617288e584afcfed055f7755e408542Jim Ingham { 112767af88aa617288e584afcfed055f7755e408542Jim Ingham } 113767af88aa617288e584afcfed055f7755e408542Jim Ingham 114767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandObjectSourceInfo () 115767af88aa617288e584afcfed055f7755e408542Jim Ingham { 116767af88aa617288e584afcfed055f7755e408542Jim Ingham } 117767af88aa617288e584afcfed055f7755e408542Jim Ingham 118767af88aa617288e584afcfed055f7755e408542Jim Ingham 119767af88aa617288e584afcfed055f7755e408542Jim Ingham Options * 120767af88aa617288e584afcfed055f7755e408542Jim Ingham GetOptions () 121767af88aa617288e584afcfed055f7755e408542Jim Ingham { 122767af88aa617288e584afcfed055f7755e408542Jim Ingham return &m_options; 123767af88aa617288e584afcfed055f7755e408542Jim Ingham } 124767af88aa617288e584afcfed055f7755e408542Jim Ingham 125da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 126767af88aa617288e584afcfed055f7755e408542Jim Ingham bool 127da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 128767af88aa617288e584afcfed055f7755e408542Jim Ingham { 129767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendError ("Not yet implemented"); 130767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 131767af88aa617288e584afcfed055f7755e408542Jim Ingham return false; 132767af88aa617288e584afcfed055f7755e408542Jim Ingham } 133da26bd203cbb104291b39891febf7481794f205fJim Ingham 134767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandOptions m_options; 135767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 136767af88aa617288e584afcfed055f7755e408542Jim Ingham 137b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 138767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceInfo::CommandOptions::g_option_table[] = 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1404d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "line", 'l', required_argument, NULL, 0, eArgTypeLineNum, "The line number at which to start the display source."}, 1414d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ LLDB_OPT_SET_1, false, "file", 'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename, "The file from which to display source."}, 1424d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 143767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 144767af88aa617288e584afcfed055f7755e408542Jim Ingham 145767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectSourceList 146767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 147767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectSourceList 148767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 150da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectSourceList : public CommandObjectParsed 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 152767af88aa617288e584afcfed055f7755e408542Jim Ingham 153767af88aa617288e584afcfed055f7755e408542Jim Ingham class CommandOptions : public Options 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 155767af88aa617288e584afcfed055f7755e408542Jim Ingham public: 156f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 157f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton Options(interpreter) 158767af88aa617288e584afcfed055f7755e408542Jim Ingham { 159767af88aa617288e584afcfed055f7755e408542Jim Ingham } 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 161767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandOptions () 162767af88aa617288e584afcfed055f7755e408542Jim Ingham { 163767af88aa617288e584afcfed055f7755e408542Jim Ingham } 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 165767af88aa617288e584afcfed055f7755e408542Jim Ingham Error 166143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 168767af88aa617288e584afcfed055f7755e408542Jim Ingham Error error; 1696475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = g_option_table[option_idx].short_option; 170767af88aa617288e584afcfed055f7755e408542Jim Ingham switch (short_option) 171767af88aa617288e584afcfed055f7755e408542Jim Ingham { 172767af88aa617288e584afcfed055f7755e408542Jim Ingham case 'l': 173767af88aa617288e584afcfed055f7755e408542Jim Ingham start_line = Args::StringToUInt32 (option_arg, 0); 174767af88aa617288e584afcfed055f7755e408542Jim Ingham if (start_line == 0) 1759c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid line number: '%s'", option_arg); 176767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 178338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham case 'c': 179767af88aa617288e584afcfed055f7755e408542Jim Ingham num_lines = Args::StringToUInt32 (option_arg, 0); 180767af88aa617288e584afcfed055f7755e408542Jim Ingham if (num_lines == 0) 1819c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid line count: '%s'", option_arg); 182767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton case 'f': 185767af88aa617288e584afcfed055f7755e408542Jim Ingham file_name = option_arg; 186767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 187338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 188338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham case 'n': 189338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham symbol_name = option_arg; 190338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham break; 191767af88aa617288e584afcfed055f7755e408542Jim Ingham 192781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton case 'a': 193781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 194781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton ExecutionContext exe_ctx (m_interpreter.GetExecutionContext()); 195781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton address = Args::StringToAddress(&exe_ctx, option_arg, LLDB_INVALID_ADDRESS, &error); 196781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 197781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton break; 198338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham case 's': 19952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton modules.push_back (std::string (option_arg)); 20052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton break; 20152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 20252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton case 'b': 20352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton show_bp_locs = true; 204338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham break; 20512b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham case 'r': 20612b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham reverse = true; 20712b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham break; 208767af88aa617288e584afcfed055f7755e408542Jim Ingham default: 2099c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("unrecognized short option '%c'", short_option); 210767af88aa617288e584afcfed055f7755e408542Jim Ingham break; 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 213767af88aa617288e584afcfed055f7755e408542Jim Ingham return error; 214767af88aa617288e584afcfed055f7755e408542Jim Ingham } 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 216767af88aa617288e584afcfed055f7755e408542Jim Ingham void 217143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting () 218767af88aa617288e584afcfed055f7755e408542Jim Ingham { 219767af88aa617288e584afcfed055f7755e408542Jim Ingham file_spec.Clear(); 220767af88aa617288e584afcfed055f7755e408542Jim Ingham file_name.clear(); 221338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham symbol_name.clear(); 222781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton address = LLDB_INVALID_ADDRESS; 223767af88aa617288e584afcfed055f7755e408542Jim Ingham start_line = 0; 224b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton num_lines = 0; 22552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton show_bp_locs = false; 22612b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham reverse = false; 22752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton modules.clear(); 228767af88aa617288e584afcfed055f7755e408542Jim Ingham } 229767af88aa617288e584afcfed055f7755e408542Jim Ingham 230b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 231767af88aa617288e584afcfed055f7755e408542Jim Ingham GetDefinitions () 232767af88aa617288e584afcfed055f7755e408542Jim Ingham { 233767af88aa617288e584afcfed055f7755e408542Jim Ingham return g_option_table; 234767af88aa617288e584afcfed055f7755e408542Jim Ingham } 235b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 236767af88aa617288e584afcfed055f7755e408542Jim Ingham 237767af88aa617288e584afcfed055f7755e408542Jim Ingham // Instance variables to hold the values for command options. 238767af88aa617288e584afcfed055f7755e408542Jim Ingham FileSpec file_spec; 239767af88aa617288e584afcfed055f7755e408542Jim Ingham std::string file_name; 240338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham std::string symbol_name; 241781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton lldb::addr_t address; 242767af88aa617288e584afcfed055f7755e408542Jim Ingham uint32_t start_line; 243767af88aa617288e584afcfed055f7755e408542Jim Ingham uint32_t num_lines; 24452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton STLStringArray modules; 24552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton bool show_bp_locs; 24612b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham bool reverse; 247767af88aa617288e584afcfed055f7755e408542Jim Ingham }; 248767af88aa617288e584afcfed055f7755e408542Jim Ingham 249767af88aa617288e584afcfed055f7755e408542Jim Inghampublic: 250238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectSourceList(CommandInterpreter &interpreter) : 251da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 252da26bd203cbb104291b39891febf7481794f205fJim Ingham "source list", 253da26bd203cbb104291b39891febf7481794f205fJim Ingham "Display source code (as specified) based on the current executable's debug info.", 254ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton NULL, 255ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresTarget), 256f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options (interpreter) 257767af88aa617288e584afcfed055f7755e408542Jim Ingham { 258767af88aa617288e584afcfed055f7755e408542Jim Ingham } 259767af88aa617288e584afcfed055f7755e408542Jim Ingham 260767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandObjectSourceList () 261767af88aa617288e584afcfed055f7755e408542Jim Ingham { 262767af88aa617288e584afcfed055f7755e408542Jim Ingham } 263767af88aa617288e584afcfed055f7755e408542Jim Ingham 264767af88aa617288e584afcfed055f7755e408542Jim Ingham 265767af88aa617288e584afcfed055f7755e408542Jim Ingham Options * 266767af88aa617288e584afcfed055f7755e408542Jim Ingham GetOptions () 267767af88aa617288e584afcfed055f7755e408542Jim Ingham { 268767af88aa617288e584afcfed055f7755e408542Jim Ingham return &m_options; 269767af88aa617288e584afcfed055f7755e408542Jim Ingham } 270767af88aa617288e584afcfed055f7755e408542Jim Ingham 271da26bd203cbb104291b39891febf7481794f205fJim Ingham virtual const char * 272da26bd203cbb104291b39891febf7481794f205fJim Ingham GetRepeatCommand (Args ¤t_command_args, uint32_t index) 273da26bd203cbb104291b39891febf7481794f205fJim Ingham { 27412b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham // This is kind of gross, but the command hasn't been parsed yet so we can't look at the option 27512b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham // values for this invocation... I have to scan the arguments directly. 27612b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham size_t num_args = current_command_args.GetArgumentCount(); 27712b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham bool is_reverse = false; 27812b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham for (size_t i = 0 ; i < num_args; i++) 27912b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham { 28012b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham const char *arg = current_command_args.GetArgumentAtIndex(i); 28112b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham if (arg && (strcmp(arg, "-r") == 0 || strcmp(arg, "--reverse") == 0)) 28212b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham { 28312b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham is_reverse = true; 28412b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham } 28512b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham } 28612b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham if (is_reverse) 28712b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham { 28812b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham if (m_reverse_name.empty()) 28912b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham { 29012b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham m_reverse_name = m_cmd_name; 29112b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham m_reverse_name.append (" -r"); 29212b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham } 29312b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham return m_reverse_name.c_str(); 29412b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham } 29512b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham else 29612b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham return m_cmd_name.c_str(); 297da26bd203cbb104291b39891febf7481794f205fJim Ingham } 298767af88aa617288e584afcfed055f7755e408542Jim Ingham 299da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 30023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 30123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton struct SourceInfo 30223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 30323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton ConstString function; 30423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton LineEntry line_entry; 30523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 30623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton SourceInfo (const ConstString &name, const LineEntry &line_entry) : 30723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton function(name), 30823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton line_entry(line_entry) 30923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 31023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 31123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 31223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton SourceInfo () : 31323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton function(), 31423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton line_entry() 31523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 31623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 31723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 31823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton bool 31923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton IsValid () const 32023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 32123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton return (bool)function && line_entry.IsValid(); 32223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 32323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 32423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton bool 32523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton operator == (const SourceInfo &rhs) const 32623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 32723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton return function == rhs.function && 32823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton line_entry.file == rhs.line_entry.file && 32923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton line_entry.line == rhs.line_entry.line; 33023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 33123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 33223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton bool 33323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton operator != (const SourceInfo &rhs) const 33423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 33523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton return function != rhs.function || 33623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton line_entry.file != rhs.line_entry.file || 33723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton line_entry.line != rhs.line_entry.line; 33823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 33923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 34023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton bool 34123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton operator < (const SourceInfo &rhs) const 34223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 34323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (function.GetCString() < rhs.function.GetCString()) 34423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton return true; 34523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (line_entry.file.GetDirectory().GetCString() < rhs.line_entry.file.GetDirectory().GetCString()) 34623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton return true; 34723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (line_entry.file.GetFilename().GetCString() < rhs.line_entry.file.GetFilename().GetCString()) 34823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton return true; 34923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (line_entry.line < rhs.line_entry.line) 35023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton return true; 35123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton return false; 35223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 35323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton }; 35423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 35523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton size_t 35623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton DisplayFunctionSource (const SymbolContext &sc, 35723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton SourceInfo &source_info, 35823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton CommandReturnObject &result) 35923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 36023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (!source_info.IsValid()) 36123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 36223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton source_info.function = sc.GetFunctionName(); 36323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton source_info.line_entry = sc.GetFunctionStartLineEntry(); 36423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 36523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 36623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (sc.function) 36723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 36823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton Target *target = m_exe_ctx.GetTargetPtr(); 36923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 37023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton FileSpec start_file; 37123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton uint32_t start_line; 37223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton uint32_t end_line; 37323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton FileSpec end_file; 37423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 37523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (sc.block == NULL) 37623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 37723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton // Not an inlined function 37823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton sc.function->GetStartLineSourceInfo (start_file, start_line); 37923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (start_line == 0) 38023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 38123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton result.AppendErrorWithFormat("Could not find line information for start of function: \"%s\".\n", source_info.function.GetCString()); 38223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton result.SetStatus (eReturnStatusFailed); 38323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton return 0; 38423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 38523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton sc.function->GetEndLineSourceInfo (end_file, end_line); 38623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 38723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton else 38823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 38923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton // We have an inlined function 39023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton start_file = source_info.line_entry.file; 39123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton start_line = source_info.line_entry.line; 39223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton end_line = start_line + m_options.num_lines; 39323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 39423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 39523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton // This is a little hacky, but the first line table entry for a function points to the "{" that 39623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton // starts the function block. It would be nice to actually get the function 39723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton // declaration in there too. So back up a bit, but not further than what you're going to display. 39823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton uint32_t extra_lines; 39923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (m_options.num_lines >= 10) 40023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton extra_lines = 5; 40123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton else 40223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton extra_lines = m_options.num_lines/2; 40323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton uint32_t line_no; 40423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (start_line <= extra_lines) 40523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton line_no = 1; 40623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton else 40723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton line_no = start_line - extra_lines; 40823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 40923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton // For fun, if the function is shorter than the number of lines we're supposed to display, 41023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton // only display the function... 41123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (end_line != 0) 41223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 41323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (m_options.num_lines > end_line - line_no) 41423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton m_options.num_lines = end_line - line_no + extra_lines; 41523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 41623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 41723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton m_breakpoint_locations.Clear(); 41823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 41923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (m_options.show_bp_locs) 42023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 42123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton const bool show_inlines = true; 42223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton m_breakpoint_locations.Reset (start_file, 0, show_inlines); 42323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton SearchFilter target_search_filter (m_exe_ctx.GetTargetSP()); 42423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton target_search_filter.Search (m_breakpoint_locations); 42523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 42623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 42723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton result.AppendMessageWithFormat("File: %s\n", start_file.GetPath().c_str()); 42823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton return target->GetSourceManager().DisplaySourceLinesWithLineNumbers (start_file, 42923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton line_no, 43023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 0, 43123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton m_options.num_lines, 43223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton "", 43323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton &result.GetOutputStream(), 43423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton GetBreakpointLocations ()); 43523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 43623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton else 43723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 43823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton result.AppendErrorWithFormat("Could not find function info for: \"%s\".\n", m_options.symbol_name.c_str()); 43923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 44023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton return 0; 44123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 44223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 4430c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain // From Jim: The FindMatchingFunctions / FindMatchingFunctionSymbols functions 4440c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain // "take a possibly empty vector of strings which are names of modules, and 4450c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain // run the two search functions on the subset of the full module list that 4460c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain // matches the strings in the input vector". If we wanted to put these somewhere, 4470c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain // there should probably be a module-filter-list that can be passed to the 4480c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain // various ModuleList::Find* calls, which would either be a vector of string 4490c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain // names or a ModuleSpecList. 4500c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain size_t FindMatchingFunctions (Target *target, const ConstString &name, SymbolContextList& sc_list) 4510c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain { 4520c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain // Displaying the source for a symbol: 4530c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain bool include_inlines = true; 4540c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain bool append = true; 4550c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain bool include_symbols = false; 4560c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain size_t num_matches = 0; 4570c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain 4580c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain if (m_options.num_lines == 0) 4590c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain m_options.num_lines = 10; 4600c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain 4610c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain const size_t num_modules = m_options.modules.size(); 4620c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain if (num_modules > 0) 4630c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain { 4640c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain ModuleList matching_modules; 4650c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain for (size_t i = 0; i < num_modules; ++i) 4660c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain { 4670c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain FileSpec module_file_spec(m_options.modules[i].c_str(), false); 4680c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain if (module_file_spec) 4690c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain { 4700c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain ModuleSpec module_spec (module_file_spec); 4710c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain matching_modules.Clear(); 4720c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain target->GetImages().FindModules (module_spec, matching_modules); 4730c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain num_matches += matching_modules.FindFunctions (name, eFunctionNameTypeAuto, include_symbols, include_inlines, append, sc_list); 4740c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain } 4750c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain } 4760c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain } 4770c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain else 4780c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain { 4790c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain num_matches = target->GetImages().FindFunctions (name, eFunctionNameTypeAuto, include_symbols, include_inlines, append, sc_list); 4800c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain } 4810c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain return num_matches; 4820c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain } 4830c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain 4840c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain size_t FindMatchingFunctionSymbols (Target *target, const ConstString &name, SymbolContextList& sc_list) 4850c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain { 4860c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain size_t num_matches = 0; 4870c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain const size_t num_modules = m_options.modules.size(); 4880c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain if (num_modules > 0) 4890c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain { 4900c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain ModuleList matching_modules; 4910c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain for (size_t i = 0; i < num_modules; ++i) 4920c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain { 4930c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain FileSpec module_file_spec(m_options.modules[i].c_str(), false); 4940c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain if (module_file_spec) 4950c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain { 4960c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain ModuleSpec module_spec (module_file_spec); 4970c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain matching_modules.Clear(); 4980c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain target->GetImages().FindModules (module_spec, matching_modules); 4990c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain num_matches += matching_modules.FindFunctionSymbols (name, eFunctionNameTypeAuto, sc_list); 5000c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain } 5010c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain } 5020c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain } 5030c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain else 5040c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain { 5050c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain num_matches = target->GetImages().FindFunctionSymbols (name, eFunctionNameTypeAuto, sc_list); 5060c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain } 5070c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain return num_matches; 5080c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain } 5090c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain 510767af88aa617288e584afcfed055f7755e408542Jim Ingham bool 511da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 512767af88aa617288e584afcfed055f7755e408542Jim Ingham { 51336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t argc = command.GetArgumentCount(); 514767af88aa617288e584afcfed055f7755e408542Jim Ingham 515767af88aa617288e584afcfed055f7755e408542Jim Ingham if (argc != 0) 516767af88aa617288e584afcfed055f7755e408542Jim Ingham { 517767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendErrorWithFormat("'%s' takes no arguments, only flags.\n", GetCommandName()); 518767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 51926e089bf5310f8378e7d86b9f38db32a38e76411Jim Ingham return false; 520767af88aa617288e584afcfed055f7755e408542Jim Ingham } 521767af88aa617288e584afcfed055f7755e408542Jim Ingham 522ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Target *target = m_exe_ctx.GetTargetPtr(); 523fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham 524338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (!m_options.symbol_name.empty()) 525338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 5260c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain SymbolContextList sc_list; 527338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham ConstString name(m_options.symbol_name.c_str()); 528b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton 5290c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain // Displaying the source for a symbol. Search for function named name. 5300c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain size_t num_matches = FindMatchingFunctions (target, name, sc_list); 5310c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain if (!num_matches) 532338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 5330c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain // If we didn't find any functions with that name, try searching for symbols 5340c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain // that line up exactly with function addresses. 5350c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain SymbolContextList sc_list_symbols; 5360c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain size_t num_symbol_matches = FindMatchingFunctionSymbols (target, name, sc_list_symbols); 5370c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain for (size_t i = 0; i < num_symbol_matches; i++) 538338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 5390c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain SymbolContext sc; 5400c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain sc_list_symbols.GetContextAtIndex (i, sc); 5410c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain if (sc.symbol) 542338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 5430c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain const Address &base_address = sc.symbol->GetAddress(); 5440c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain Function *function = base_address.CalculateSymbolContextFunction(); 5450c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain if (function) 5460c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain { 5470c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain sc_list.Append (SymbolContext(function)); 5480c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain num_matches++; 5490c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain break; 5500c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain } 551338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 552338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 553338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 554338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 555338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches == 0) 556338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 557338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Could not find function named: \"%s\".\n", m_options.symbol_name.c_str()); 558338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 559338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 560338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 5610c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain 562338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches > 1) 563338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 56423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton std::set<SourceInfo> source_match_set; 565338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 56623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton bool displayed_something = false; 56723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton for (size_t i = 0; i < num_matches; i++) 568338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 5690c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain SymbolContext sc; 57023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton sc_list.GetContextAtIndex (i, sc); 57123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton SourceInfo source_info (sc.GetFunctionName(), 57223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton sc.GetFunctionStartLineEntry()); 57323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 57423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (source_info.IsValid()) 575338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 57623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (source_match_set.find(source_info) == source_match_set.end()) 577338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 57823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton source_match_set.insert(source_info); 57923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (DisplayFunctionSource (sc, source_info, result)) 58023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton displayed_something = true; 581338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 582338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 583338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 58423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 58523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (displayed_something) 58623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 58723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton else 588338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 589338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 590338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 591338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 5920c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain SymbolContext sc; 59323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton sc_list.GetContextAtIndex (0, sc); 59423a51623e0e866225d959506796e3d75de3a08e3Greg Clayton SourceInfo source_info; 59523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton 59623a51623e0e866225d959506796e3d75de3a08e3Greg Clayton if (DisplayFunctionSource (sc, source_info, result)) 59723a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 59823a51623e0e866225d959506796e3d75de3a08e3Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 59923a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 60023a51623e0e866225d959506796e3d75de3a08e3Greg Clayton else 60123a51623e0e866225d959506796e3d75de3a08e3Greg Clayton { 60223a51623e0e866225d959506796e3d75de3a08e3Greg Clayton result.SetStatus (eReturnStatusFailed); 60323a51623e0e866225d959506796e3d75de3a08e3Greg Clayton } 6041cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton } 60523a51623e0e866225d959506796e3d75de3a08e3Greg Clayton return result.Succeeded(); 606338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 607781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton else if (m_options.address != LLDB_INVALID_ADDRESS) 608781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 609781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton Address so_addr; 610781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton StreamString error_strm; 6110c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain SymbolContextList sc_list; 612781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton 613781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton if (target->GetSectionLoadList().IsEmpty()) 614781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 615781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton // The target isn't loaded yet, we need to lookup the file address 616781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton // in all modules 617781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton const ModuleList &module_list = target->GetImages(); 61836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_modules = module_list.GetSize(); 61936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t i=0; i<num_modules; ++i) 620781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 621781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton ModuleSP module_sp (module_list.GetModuleAtIndex(i)); 622781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton if (module_sp && module_sp->ResolveFileAddress(m_options.address, so_addr)) 623781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 6240c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain SymbolContext sc; 625a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton sc.Clear(true); 626781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton if (module_sp->ResolveSymbolContextForAddress (so_addr, eSymbolContextEverything, sc) & eSymbolContextLineEntry) 627781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton sc_list.Append(sc); 628781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 629781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 630781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton 631781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton if (sc_list.GetSize() == 0) 632781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 633781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton result.AppendErrorWithFormat("no modules have source information for file address 0x%" PRIx64 ".\n", 634781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton m_options.address); 635781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton result.SetStatus (eReturnStatusFailed); 636781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton return false; 637781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 638781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 639781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton else 640781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 641781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton // The target has some things loaded, resolve this address to a 642781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton // compile unit + file + line and display 643781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton if (target->GetSectionLoadList().ResolveLoadAddress (m_options.address, so_addr)) 644781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 645781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton ModuleSP module_sp (so_addr.GetModule()); 646781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton if (module_sp) 647781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 6480c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain SymbolContext sc; 649a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton sc.Clear(true); 650781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton if (module_sp->ResolveSymbolContextForAddress (so_addr, eSymbolContextEverything, sc) & eSymbolContextLineEntry) 651781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 652781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton sc_list.Append(sc); 653781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 654781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton else 655781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 656781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton so_addr.Dump(&error_strm, NULL, Address::DumpStyleModuleWithFileAddress); 657781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton result.AppendErrorWithFormat("address resolves to %s, but there is no line table information available for this address.\n", 658781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton error_strm.GetData()); 659781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton result.SetStatus (eReturnStatusFailed); 660781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton return false; 661781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 662781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 663781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 664781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton 665781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton if (sc_list.GetSize() == 0) 666781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 667781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton result.AppendErrorWithFormat("no modules contain load address 0x%" PRIx64 ".\n", m_options.address); 668781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton result.SetStatus (eReturnStatusFailed); 669781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton return false; 670781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 671781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 672781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton uint32_t num_matches = sc_list.GetSize(); 673781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton for (uint32_t i=0; i<num_matches; ++i) 674781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 6750c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain SymbolContext sc; 676781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton sc_list.GetContextAtIndex(i, sc); 677781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton if (sc.comp_unit) 678781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 679781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton if (m_options.show_bp_locs) 680781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton { 681781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton m_breakpoint_locations.Clear(); 682781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton const bool show_inlines = true; 683781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton m_breakpoint_locations.Reset (*sc.comp_unit, 0, show_inlines); 684781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton SearchFilter target_search_filter (target->shared_from_this()); 685781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton target_search_filter.Search (m_breakpoint_locations); 686781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 687781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton 688781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton bool show_fullpaths = true; 689781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton bool show_module = true; 690781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton bool show_inlined_frames = true; 691781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton sc.DumpStopContext(&result.GetOutputStream(), 692ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton m_exe_ctx.GetBestExecutionContextScope(), 693781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton sc.line_entry.range.GetBaseAddress(), 694781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton show_fullpaths, 695781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton show_module, 696781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton show_inlined_frames); 697781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton result.GetOutputStream().EOL(); 698b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton 699b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton if (m_options.num_lines == 0) 700b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton m_options.num_lines = 10; 701781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton 702781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton size_t lines_to_back_up = m_options.num_lines >= 10 ? 5 : m_options.num_lines/2; 703781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton 704781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton target->GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.comp_unit, 705781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton sc.line_entry.line, 706781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton lines_to_back_up, 707781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton m_options.num_lines - lines_to_back_up, 708781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton "->", 709781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton &result.GetOutputStream(), 710781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton GetBreakpointLocations ()); 711781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton result.SetStatus (eReturnStatusSuccessFinishResult); 712781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 713781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 714781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton } 715338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else if (m_options.file_name.empty()) 716767af88aa617288e584afcfed055f7755e408542Jim Ingham { 717767af88aa617288e584afcfed055f7755e408542Jim Ingham // Last valid source manager context, or the current frame if no 718767af88aa617288e584afcfed055f7755e408542Jim Ingham // valid last context in source manager. 719767af88aa617288e584afcfed055f7755e408542Jim Ingham // One little trick here, if you type the exact same list command twice in a row, it is 720767af88aa617288e584afcfed055f7755e408542Jim Ingham // more likely because you typed it once, then typed it again 721767af88aa617288e584afcfed055f7755e408542Jim Ingham if (m_options.start_line == 0) 722767af88aa617288e584afcfed055f7755e408542Jim Ingham { 723c7f18c8fc956ce421bcb4913a0c99a61fdb40247Jim Ingham if (target->GetSourceManager().DisplayMoreWithLineNumbers (&result.GetOutputStream(), 724b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton m_options.num_lines, 725b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton m_options.reverse, 726b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton GetBreakpointLocations ())) 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishResult); 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 730767af88aa617288e584afcfed055f7755e408542Jim Ingham } 731767af88aa617288e584afcfed055f7755e408542Jim Ingham else 732767af88aa617288e584afcfed055f7755e408542Jim Ingham { 733b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton if (m_options.num_lines == 0) 734b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton m_options.num_lines = 10; 735b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton 736fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham if (m_options.show_bp_locs) 7371cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton { 738fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham SourceManager::FileSP last_file_sp (target->GetSourceManager().GetLastFile ()); 7391cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton if (last_file_sp) 7401cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton { 7411cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton const bool show_inlines = true; 7421cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton m_breakpoint_locations.Reset (last_file_sp->GetFileSpec(), 0, show_inlines); 74313d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton SearchFilter target_search_filter (target->shared_from_this()); 7441cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton target_search_filter.Search (m_breakpoint_locations); 7451cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton } 7461cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton } 7471cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton else 7481cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton m_breakpoint_locations.Clear(); 7491cee1e6478d77ef19e24086a54c88358c66a90cbGreg Clayton 750fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham if (target->GetSourceManager().DisplaySourceLinesWithLineNumbersUsingLastFile( 751767af88aa617288e584afcfed055f7755e408542Jim Ingham m_options.start_line, // Line to display 752b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton m_options.num_lines, // Lines after line to 753b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton UINT32_MAX, // Don't mark "line" 754767af88aa617288e584afcfed055f7755e408542Jim Ingham "", // Don't mark "line" 75552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton &result.GetOutputStream(), 75652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton GetBreakpointLocations ())) 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 758767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 760767af88aa617288e584afcfed055f7755e408542Jim Ingham 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 765767af88aa617288e584afcfed055f7755e408542Jim Ingham const char *filename = m_options.file_name.c_str(); 766767af88aa617288e584afcfed055f7755e408542Jim Ingham 767767af88aa617288e584afcfed055f7755e408542Jim Ingham bool check_inlines = false; 768767af88aa617288e584afcfed055f7755e408542Jim Ingham SymbolContextList sc_list; 769338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham size_t num_matches = 0; 770338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 77152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton if (m_options.modules.size() > 0) 772338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 773338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham ModuleList matching_modules; 77436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t i = 0, e = m_options.modules.size(); i < e; ++i) 775338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 776444fe998bf707bd076a70c3a779db8575533695eGreg Clayton FileSpec module_file_spec(m_options.modules[i].c_str(), false); 777444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (module_file_spec) 778338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 779444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (module_file_spec); 780338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham matching_modules.Clear(); 781444fe998bf707bd076a70c3a779db8575533695eGreg Clayton target->GetImages().FindModules (module_spec, matching_modules); 782338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham num_matches += matching_modules.ResolveSymbolContextForFilePath (filename, 78352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 0, 78452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton check_inlines, 78552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton eSymbolContextModule | eSymbolContextCompUnit, 78652c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton sc_list); 787338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 788338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 789338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 790338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 791338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 792338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham num_matches = target->GetImages().ResolveSymbolContextForFilePath (filename, 793338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 0, 794338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham check_inlines, 795338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham eSymbolContextModule | eSymbolContextCompUnit, 796338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list); 797338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 798338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 799338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches == 0) 800338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 801338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Could not find source file \"%s\".\n", 802338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.file_name.c_str()); 803338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 804338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 805338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 806338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 807338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (num_matches > 1) 808767af88aa617288e584afcfed055f7755e408542Jim Ingham { 809338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham bool got_multiple = false; 810338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham FileSpec *test_cu_spec = NULL; 811338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 8120f6fa731e05ce45a4c3f7c4590216ce2e30f25dbChris Lattner for (unsigned i = 0; i < num_matches; i++) 813767af88aa617288e584afcfed055f7755e408542Jim Ingham { 8140c4c43c8a598e9c37dcdd00bb77c6d59e083b904Michael Sartain SymbolContext sc; 815338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham sc_list.GetContextAtIndex(i, sc); 816767af88aa617288e584afcfed055f7755e408542Jim Ingham if (sc.comp_unit) 817767af88aa617288e584afcfed055f7755e408542Jim Ingham { 818338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (test_cu_spec) 819338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 820338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (test_cu_spec != static_cast<FileSpec *> (sc.comp_unit)) 821338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham got_multiple = true; 822338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham break; 823338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 824338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 825338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham test_cu_spec = sc.comp_unit; 826767af88aa617288e584afcfed055f7755e408542Jim Ingham } 827767af88aa617288e584afcfed055f7755e408542Jim Ingham } 828338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (got_multiple) 829338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 830338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("Multiple source files found matching: \"%s.\"\n", 831338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.file_name.c_str()); 832338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 833338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 834338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 835338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 836338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham 837338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham SymbolContext sc; 838338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (sc_list.GetContextAtIndex(0, sc)) 839338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 840338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham if (sc.comp_unit) 841338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 842fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham if (m_options.show_bp_locs) 84352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton { 84452c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton const bool show_inlines = true; 84552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_breakpoint_locations.Reset (*sc.comp_unit, 0, show_inlines); 84613d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton SearchFilter target_search_filter (target->shared_from_this()); 84752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton target_search_filter.Search (m_breakpoint_locations); 84852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton } 84952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton else 85052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton m_breakpoint_locations.Clear(); 85152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 852b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton if (m_options.num_lines == 0) 853b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton m_options.num_lines = 10; 854b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton 855fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham target->GetSourceManager().DisplaySourceLinesWithLineNumbers (sc.comp_unit, 856fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham m_options.start_line, 857fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham 0, 858fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham m_options.num_lines, 859fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham "", 860fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham &result.GetOutputStream(), 861fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham GetBreakpointLocations ()); 86252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton 863338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 864338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 865338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham else 866338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham { 867338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.AppendErrorWithFormat("No comp unit found for: \"%s.\"\n", 868338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham m_options.file_name.c_str()); 869338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham result.SetStatus (eReturnStatusFailed); 870338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham return false; 871338f75345e1f87cf4ac334a5c95161ed2c7bc2f3Jim Ingham } 872767af88aa617288e584afcfed055f7755e408542Jim Ingham } 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 874767af88aa617288e584afcfed055f7755e408542Jim Ingham return result.Succeeded(); 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 876767af88aa617288e584afcfed055f7755e408542Jim Ingham 87752c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton const SymbolContextList * 87852c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton GetBreakpointLocations () 87952c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton { 88052c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton if (m_breakpoint_locations.GetFileLineMatches().GetSize() > 0) 88152c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton return &m_breakpoint_locations.GetFileLineMatches(); 88252c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton return NULL; 88352c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton } 884767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandOptions m_options; 88552c8b6e3205e11e90adc83521c01915fc13626deGreg Clayton FileLineResolver m_breakpoint_locations; 88612b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham std::string m_reverse_name; 887767af88aa617288e584afcfed055f7755e408542Jim Ingham 888767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 889767af88aa617288e584afcfed055f7755e408542Jim Ingham 890b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 891767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectSourceList::CommandOptions::g_option_table[] = 892767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 893781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_ALL, false, "count", 'c', required_argument, NULL, 0, eArgTypeCount, "The number of source lines to display."}, 894781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_1 | 895781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton LLDB_OPT_SET_2 , false, "shlib", 's', required_argument, NULL, CommandCompletions::eModuleCompletion, eArgTypeShlibName, "Look up the source file in the given shared library."}, 89652c8b6e3205e11e90adc83521c01915fc13626deGreg 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."}, 897781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_1 , false, "file", 'f', required_argument, NULL, CommandCompletions::eSourceFileCompletion, eArgTypeFilename, "The file from which to display source."}, 898781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_1 , false, "line", 'l', required_argument, NULL, 0, eArgTypeLineNum, "The line number at which to start the display source."}, 899781241147dbdd18762ab676960ecbff18ab0a766Greg Clayton{ LLDB_OPT_SET_2 , false, "name", 'n', required_argument, NULL, CommandCompletions::eSymbolCompletion, eArgTypeSymbol, "The name of a function whose source to display."}, 9004968ad817597891cc02c195d4b3e7c3cde1fc391Enrico Granata{ LLDB_OPT_SET_3 , false, "address",'a', required_argument, NULL, 0, eArgTypeAddressOrExpression, "Lookup the address and display the source information for the corresponding file and line."}, 90112b5aa0a637c6070fa0290a90fdc9d5b0b9df950Jim Ingham{ LLDB_OPT_SET_4, false, "reverse", 'r', no_argument, NULL, 0, eArgTypeNone, "Reverse the listing to look backwards from the last displayed block of source."}, 9024d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 903767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 904767af88aa617288e584afcfed055f7755e408542Jim Ingham 905767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectMultiwordSource 906767af88aa617288e584afcfed055f7755e408542Jim Ingham 907767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 908767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectMultiwordSource 909767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 910767af88aa617288e584afcfed055f7755e408542Jim Ingham 911767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::CommandObjectMultiwordSource (CommandInterpreter &interpreter) : 912238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMultiword (interpreter, 913238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "source", 914c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice "A set of commands for accessing source file information", 915767af88aa617288e584afcfed055f7755e408542Jim Ingham "source <subcommand> [<subcommand-options>]") 916767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 917d8b8215848a4c3e91b36d40b99bcdf641f367385Greg Clayton // "source info" isn't implemented yet... 918d8b8215848a4c3e91b36d40b99bcdf641f367385Greg Clayton //LoadSubCommand ("info", CommandObjectSP (new CommandObjectSourceInfo (interpreter))); 919238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("list", CommandObjectSP (new CommandObjectSourceList (interpreter))); 920767af88aa617288e584afcfed055f7755e408542Jim Ingham} 921767af88aa617288e584afcfed055f7755e408542Jim Ingham 922767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordSource::~CommandObjectMultiwordSource () 923767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 925767af88aa617288e584afcfed055f7755e408542Jim Ingham 926