124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectMemory.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 "CommandObjectMemory.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBufferHeap.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataExtractor.h" 2063094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Core/Debugger.h" 2149ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamString.h" 2357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton#include "lldb/Core/ValueObjectMemory.h" 2463094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Interpreter/Args.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h" 2663094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Interpreter/CommandInterpreter.h" 2763094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Interpreter/Options.h" 2857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton#include "lldb/Interpreter/OptionGroupFormat.h" 2957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton#include "lldb/Interpreter/OptionGroupOutputFile.h" 3056bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton#include "lldb/Interpreter/OptionGroupValueObjectDisplay.h" 3173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueString.h" 3249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/TypeList.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 3457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton#include "lldb/Target/StackFrame.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3956bbdaf817cb19a2f133e8501473f499be447c2dGreg Claytonstatic OptionDefinition 4057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Claytong_option_table[] = 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { LLDB_OPT_SET_1, false, "num-per-line" ,'l', required_argument, NULL, 0, eArgTypeNumberPerLine ,"The number of items per line to display."}, 4357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { LLDB_OPT_SET_2, false, "binary" ,'b', no_argument , NULL, 0, eArgTypeNone ,"If true, memory will be saved as binary. If false, the memory is saved save as an ASCII dump that uses the format, size, count and number per line settings."}, 4406dc17f8eb821d7256fd42e56f85c2779a29f689Sean Callanan { LLDB_OPT_SET_3, true , "type" ,'t', required_argument, NULL, 0, eArgTypeNone ,"The name of a type to view memory as."}, 45827baf6b629b389f5fdca096f70a249f4143f13bGreg Clayton { LLDB_OPT_SET_1| 46827baf6b629b389f5fdca096f70a249f4143f13bGreg Clayton LLDB_OPT_SET_2| 4728ad12bffb738ef9243e399d04ffe190a127d21cEnrico Granata LLDB_OPT_SET_3, false, "force" ,'r', no_argument, NULL, 0, eArgTypeNone ,"Necessary if reading over target.max-memory-read-size bytes."}, 4857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton}; 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Claytonclass OptionGroupReadMemory : public OptionGroup 5357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton{ 5457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Claytonpublic: 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton OptionGroupReadMemory () : 5756bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton m_num_per_line (1,1), 5857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton m_output_as_binary (false), 5957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton m_view_as_type() 6057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 6157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton virtual 6457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton ~OptionGroupReadMemory () 6557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 6657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 6757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 6857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 6957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton virtual uint32_t 7057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton GetNumDefinitions () 7157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 7257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton return sizeof (g_option_table) / sizeof (OptionDefinition); 7357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 7457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 7557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton virtual const OptionDefinition* 7657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton GetDefinitions () 7757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 7857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton return g_option_table; 7957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 8057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 8157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton virtual Error 8257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton SetOptionValue (CommandInterpreter &interpreter, 8357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton uint32_t option_idx, 8457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton const char *option_arg) 8557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 8657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton Error error; 876475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = g_option_table[option_idx].short_option; 8857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 8957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton switch (short_option) 9057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 'l': 9257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton error = m_num_per_line.SetValueFromCString (option_arg); 9357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (m_num_per_line.GetCurrentValue() == 0) 949c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid value for --num-per-line option '%s'", option_arg); 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 96a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 97e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton case 'b': 98e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton m_output_as_binary = true; 99e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton break; 10057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 10157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case 't': 10257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton error = m_view_as_type.SetValueFromCString (option_arg); 103e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton break; 1048a6f3e9fd6d9a12b4f0153357a7e1f5c66455586Sean Callanan 1058a6f3e9fd6d9a12b4f0153357a7e1f5c66455586Sean Callanan case 'r': 1068a6f3e9fd6d9a12b4f0153357a7e1f5c66455586Sean Callanan m_force = true; 1078a6f3e9fd6d9a12b4f0153357a7e1f5c66455586Sean Callanan break; 10857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 1109c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("unrecognized short option '%c'", short_option); 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton return error; 11457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 11557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 11657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton virtual void 11757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton OptionParsingStarting (CommandInterpreter &interpreter) 11857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 11957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton m_num_per_line.Clear(); 12057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton m_output_as_binary = false; 12157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton m_view_as_type.Clear(); 12228ad12bffb738ef9243e399d04ffe190a127d21cEnrico Granata m_force = false; 12357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 12457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 12556bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton Error 126a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton FinalizeSettings (Target *target, OptionGroupFormat& format_options) 12757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 12856bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton Error error; 129a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionValueUInt64 &byte_size_value = format_options.GetByteSizeValue(); 130a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionValueUInt64 &count_value = format_options.GetCountValue(); 1319c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton const bool byte_size_option_set = byte_size_value.OptionWasSet(); 13256bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton const bool num_per_line_option_set = m_num_per_line.OptionWasSet(); 133a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton const bool count_option_set = format_options.GetCountValue().OptionWasSet(); 13456bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton 13556bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton switch (format_options.GetFormat()) 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton default: 13857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton break; 13957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 14057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatBoolean: 14156bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!byte_size_option_set) 142a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton byte_size_value = 1; 14356bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!num_per_line_option_set) 14456bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton m_num_per_line = 1; 14556bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!count_option_set) 146a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton format_options.GetCountValue() = 8; 14757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton break; 14857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 14957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatCString: 15057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton break; 15124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton 15224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eFormatInstruction: 15324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton if (count_option_set) 154ab885839103d4b9a72de165092d3bec35094683bJim Ingham byte_size_value = target->GetArchitecture().GetMaximumOpcodeByteSize(); 15524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton m_num_per_line = 1; 15624a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton break; 15724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton 15824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eFormatAddressInfo: 15924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton if (!byte_size_option_set) 16024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton byte_size_value = target->GetArchitecture().GetAddressByteSize(); 16124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton m_num_per_line = 1; 16224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton if (!count_option_set) 16324a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton format_options.GetCountValue() = 8; 16424a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton break; 16524a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton 16657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatPointer: 167a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton byte_size_value = target->GetArchitecture().GetAddressByteSize(); 16856bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!num_per_line_option_set) 16956bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton m_num_per_line = 4; 17056bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!count_option_set) 171a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton format_options.GetCountValue() = 8; 17257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton break; 17357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 17457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatBinary: 17557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatFloat: 17657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatOctal: 17757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatDecimal: 17857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatEnum: 17957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatUnicode16: 18057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatUnicode32: 18157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatUnsigned: 18224a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eFormatHexFloat: 18356bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!byte_size_option_set) 184a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton byte_size_value = 4; 18556bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!num_per_line_option_set) 18656bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton m_num_per_line = 1; 18756bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!count_option_set) 188a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton format_options.GetCountValue() = 8; 18957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton break; 19024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton 19157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatBytes: 19257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatBytesWithASCII: 1939c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton if (byte_size_option_set) 19456bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton { 195a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton if (byte_size_value > 1) 1965f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea error.SetErrorStringWithFormat ("display format (bytes/bytes with ascii) conflicts with the specified byte size %" PRIu64 "\n" 197bf9ba5979ccc1a0058ac76cd91dafa493c55854cJohnny Chen "\tconsider using a different display format or don't specify the byte size", 198bf9ba5979ccc1a0058ac76cd91dafa493c55854cJohnny Chen byte_size_value.GetCurrentValue()); 19956bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton } 20056bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton else 201a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton byte_size_value = 1; 20256bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!num_per_line_option_set) 20356bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton m_num_per_line = 16; 20456bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!count_option_set) 205a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton format_options.GetCountValue() = 32; 20657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton break; 207307fa07606d519d427c812802aff5f9727e7047cGreg Clayton case eFormatCharArray: 20857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatChar: 20957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatCharPrintable: 21056bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!byte_size_option_set) 211a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton byte_size_value = 1; 21256bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!num_per_line_option_set) 21356bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton m_num_per_line = 32; 21456bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!count_option_set) 215a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton format_options.GetCountValue() = 64; 21657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton break; 21757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatComplex: 21856bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!byte_size_option_set) 219a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton byte_size_value = 8; 22056bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!num_per_line_option_set) 22156bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton m_num_per_line = 1; 22256bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!count_option_set) 223a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton format_options.GetCountValue() = 8; 22442077d90baa272e1be560884a6b115d1264566beJason Molenda break; 22542077d90baa272e1be560884a6b115d1264566beJason Molenda case eFormatComplexInteger: 22642077d90baa272e1be560884a6b115d1264566beJason Molenda if (!byte_size_option_set) 22742077d90baa272e1be560884a6b115d1264566beJason Molenda byte_size_value = 8; 22842077d90baa272e1be560884a6b115d1264566beJason Molenda if (!num_per_line_option_set) 22942077d90baa272e1be560884a6b115d1264566beJason Molenda m_num_per_line = 1; 23042077d90baa272e1be560884a6b115d1264566beJason Molenda if (!count_option_set) 23142077d90baa272e1be560884a6b115d1264566beJason Molenda format_options.GetCountValue() = 8; 23257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton break; 23357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatHex: 23456bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!byte_size_option_set) 235a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton byte_size_value = 4; 23656bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!num_per_line_option_set) 23756bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton { 238a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton switch (byte_size_value) 23956bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton { 24056bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton case 1: 24156bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton case 2: 24256bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton m_num_per_line = 8; 24356bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton break; 24456bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton case 4: 24556bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton m_num_per_line = 4; 24656bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton break; 24756bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton case 8: 24856bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton m_num_per_line = 2; 24956bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton break; 25056bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton default: 25156bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton m_num_per_line = 1; 25256bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton break; 25356bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton } 25456bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton } 25556bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!count_option_set) 256a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton count_value = 8; 25757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton break; 25857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 25957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatVectorOfChar: 26057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatVectorOfSInt8: 26157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatVectorOfUInt8: 26257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatVectorOfSInt16: 26357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatVectorOfUInt16: 26457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatVectorOfSInt32: 26557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatVectorOfUInt32: 26657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatVectorOfSInt64: 26757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatVectorOfUInt64: 26857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatVectorOfFloat32: 26957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatVectorOfFloat64: 27057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case eFormatVectorOfUInt128: 27156bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!byte_size_option_set) 272a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton byte_size_value = 128; 27356bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!num_per_line_option_set) 27456bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton m_num_per_line = 1; 27556bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (!count_option_set) 276a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton count_value = 4; 27757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton break; 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27956bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton return error; 28057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 282902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton bool 283902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton AnyOptionWasSet () const 284902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton { 285902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton return m_num_per_line.OptionWasSet() || 286902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton m_output_as_binary || 287902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton m_view_as_type.OptionWasSet(); 288902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton } 289902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton 29057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton OptionValueUInt64 m_num_per_line; 29157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton bool m_output_as_binary; 29257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton OptionValueString m_view_as_type; 2938a6f3e9fd6d9a12b4f0153357a7e1f5c66455586Sean Callanan bool m_force; 29457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton}; 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton//---------------------------------------------------------------------- 29957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton// Read memory from the inferior process 30057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton//---------------------------------------------------------------------- 301da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectMemoryRead : public CommandObjectParsed 30257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton{ 30357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Claytonpublic: 30457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 305238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMemoryRead (CommandInterpreter &interpreter) : 306da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 307da26bd203cbb104291b39891febf7481794f205fJim Ingham "memory read", 308da26bd203cbb104291b39891febf7481794f205fJim Ingham "Read from the memory of the process being debugged.", 309da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 310ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresTarget | eFlagProcessMustBePaused), 31157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton m_option_group (interpreter), 312a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_format_options (eFormatBytesWithASCII, 1, 8), 31357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton m_memory_options (), 31456bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton m_outfile_options (), 315902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton m_varobj_options(), 316902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton m_next_addr(LLDB_INVALID_ADDRESS), 317902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton m_prev_byte_size(0), 318902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton m_prev_format_options (eFormatBytesWithASCII, 1, 8), 319902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton m_prev_memory_options (), 320902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton m_prev_outfile_options (), 321902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton m_prev_varobj_options() 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg1; 32443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg2; 32543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData start_addr_arg; 32643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData end_addr_arg; 32743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 32843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 3294968ad817597891cc02c195d4b3e7c3cde1fc391Enrico Granata start_addr_arg.arg_type = eArgTypeAddressOrExpression; 33043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice start_addr_arg.arg_repetition = eArgRepeatPlain; 33143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 33243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 33343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg1.push_back (start_addr_arg); 33443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 33543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 3364968ad817597891cc02c195d4b3e7c3cde1fc391Enrico Granata end_addr_arg.arg_type = eArgTypeAddressOrExpression; 33743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice end_addr_arg.arg_repetition = eArgRepeatOptional; 33843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 33943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 34043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg2.push_back (end_addr_arg); 34143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 34243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 34343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg1); 34443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg2); 34557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 346a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton // Add the "--format" and "--count" options to group 1 and 3 347a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_option_group.Append (&m_format_options, 348a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionGroupFormat::OPTION_GROUP_FORMAT | OptionGroupFormat::OPTION_GROUP_COUNT, 34931feaa8b346312b7935e9424e9ae22959bf46b02Greg Clayton LLDB_OPT_SET_1 | LLDB_OPT_SET_2 | LLDB_OPT_SET_3); 35024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton m_option_group.Append (&m_format_options, 35124a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton OptionGroupFormat::OPTION_GROUP_GDB_FMT, 35231feaa8b346312b7935e9424e9ae22959bf46b02Greg Clayton LLDB_OPT_SET_1 | LLDB_OPT_SET_3); 353a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton // Add the "--size" option to group 1 and 2 354a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_option_group.Append (&m_format_options, 355a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionGroupFormat::OPTION_GROUP_SIZE, 356a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton LLDB_OPT_SET_1 | LLDB_OPT_SET_2); 35757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton m_option_group.Append (&m_memory_options); 35857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton m_option_group.Append (&m_outfile_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_1 | LLDB_OPT_SET_2 | LLDB_OPT_SET_3); 35956bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton m_option_group.Append (&m_varobj_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_3); 36057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton m_option_group.Finalize(); 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectMemoryRead () 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options * 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetOptions () 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 37157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton return &m_option_group; 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 374902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton virtual const char *GetRepeatCommand (Args ¤t_command_args, uint32_t index) 375902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton { 376902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton return m_cmd_name.c_str(); 377902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton } 378902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton 379da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 38149d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton DoExecute (Args& command, CommandReturnObject &result) 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 383ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // No need to check "target" for validity as eFlagRequiresTarget ensures it is valid 384ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Target *target = m_exe_ctx.GetTargetPtr(); 385ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t argc = command.GetArgumentCount(); 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 388902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton if ((argc == 0 && m_next_addr == LLDB_INVALID_ADDRESS) || argc > 2) 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39049d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton result.AppendErrorWithFormat ("%s takes a start address expression with an optional end address expression.\n", m_cmd_name.c_str()); 391bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton result.AppendRawWarning("Expressions should be quoted if they contain spaces or other special characters.\n"); 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39656bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton ClangASTType clang_ast_type; 39756bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton Error error; 39856bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton 39957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton const char *view_as_type_cstr = m_memory_options.m_view_as_type.GetCurrentValue(); 40057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (view_as_type_cstr && view_as_type_cstr[0]) 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton // We are viewing memory as a type 403bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton 40457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton SymbolContext sc; 405dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const bool exact_match = false; 40657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton TypeList type_list; 40757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton uint32_t reference_count = 0; 40857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton uint32_t pointer_count = 0; 40957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton size_t idx; 410ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan 411ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan#define ALL_KEYWORDS \ 412ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan KEYWORD("const") \ 413ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan KEYWORD("volatile") \ 414ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan KEYWORD("restrict") \ 415ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan KEYWORD("struct") \ 416ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan KEYWORD("class") \ 417ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan KEYWORD("union") 418ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan 419ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan#define KEYWORD(s) s, 420ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan static const char *g_keywords[] = 421ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan { 422ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan ALL_KEYWORDS 423ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan }; 424ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan#undef KEYWORD 425ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan 426ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan#define KEYWORD(s) (sizeof(s) - 1), 427ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan static const int g_keyword_lengths[] = 428ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan { 429ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan ALL_KEYWORDS 430ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan }; 431ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan#undef KEYWORD 432ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan 433ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan#undef ALL_KEYWORDS 434ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan 435ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan static size_t g_num_keywords = sizeof(g_keywords) / sizeof(const char *); 43657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton std::string type_str(view_as_type_cstr); 43757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 43857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton // Remove all instances of g_keywords that are followed by spaces 43957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton for (size_t i = 0; i < g_num_keywords; ++i) 44057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 44157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton const char *keyword = g_keywords[i]; 442ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan int keyword_len = g_keyword_lengths[i]; 443ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan 444ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan idx = 0; 445ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan while ((idx = type_str.find (keyword, idx)) != std::string::npos) 44657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 44757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (type_str[idx + keyword_len] == ' ' || type_str[idx + keyword_len] == '\t') 448ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan { 44957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton type_str.erase(idx, keyword_len+1); 450ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan idx = 0; 451ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan } 452ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan else 453ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan { 454ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan idx += keyword_len; 455ddb2ece9027de20442c691ca678449cfadb0bc86Sean Callanan } 45657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 45757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 45857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton bool done = type_str.empty(); 45957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton // 46057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton idx = type_str.find_first_not_of (" \t"); 46157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (idx > 0 && idx != std::string::npos) 46257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton type_str.erase (0, idx); 46357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton while (!done) 46457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 46557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton // Strip trailing spaces 46657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (type_str.empty()) 46757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton done = true; 46857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton else 46957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 47057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton switch (type_str[type_str.size()-1]) 47157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 47257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case '*': 47357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton ++pointer_count; 47457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton // fall through... 47557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case ' ': 47657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case '\t': 47757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton type_str.erase(type_str.size()-1); 47857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton break; 47957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 48057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton case '&': 48157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (reference_count == 0) 48257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 48357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton reference_count = 1; 48457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton type_str.erase(type_str.size()-1); 48557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 48657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton else 48757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 48857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton result.AppendErrorWithFormat ("invalid type string: '%s'\n", view_as_type_cstr); 48957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton result.SetStatus(eReturnStatusFailed); 49057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton return false; 49157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 49257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton break; 49357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 49457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton default: 49557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton done = true; 49657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton break; 49757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 49857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 49957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 50057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 50157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton ConstString lookup_type_name(type_str.c_str()); 502ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton StackFrame *frame = m_exe_ctx.GetFramePtr(); 503567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame) 50457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 505567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton sc = frame->GetSymbolContext (eSymbolContextModule); 50657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (sc.module_sp) 50757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 5083e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan sc.module_sp->FindTypes (sc, 5093e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan lookup_type_name, 510dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton exact_match, 51157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 1, 51257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton type_list); 51357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 51457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 51557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (type_list.GetSize() == 0) 51657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 5179f95fb63a492b53206d578f46e73899d60d70321Greg Clayton target->GetImages().FindTypes (sc, 518567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lookup_type_name, 519dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton exact_match, 520567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1, 521567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton type_list); 52257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 52357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 5240f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata if (type_list.GetSize() == 0 && lookup_type_name.GetCString() && *lookup_type_name.GetCString() == '$') 52557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 5260f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata clang::TypeDecl *tdecl = target->GetPersistentVariables().GetPersistentType(ConstString(lookup_type_name)); 5270f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata if (tdecl) 5280f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata { 5290f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata clang_ast_type.SetClangType(&tdecl->getASTContext(),(lldb::clang_type_t)tdecl->getTypeForDecl()); 5300f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata } 53157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 53257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 5330f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata if (clang_ast_type.IsValid() == false) 5340f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata { 5350f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata if (type_list.GetSize() == 0) 5360f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata { 5370f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata result.AppendErrorWithFormat ("unable to find any types that match the raw type '%s' for full type '%s'\n", 5380f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata lookup_type_name.GetCString(), 5390f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata view_as_type_cstr); 5400f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata result.SetStatus(eReturnStatusFailed); 5410f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata return false; 5420f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata } 5430f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata else 5440f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata { 5450f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata TypeSP type_sp (type_list.GetTypeAtIndex(0)); 54652f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_ast_type = type_sp->GetClangFullType(); 5470f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata } 5480f2a853b3d5542ac2ef53e194e0dcf5dc8cbe26fEnrico Granata } 54957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 55057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton while (pointer_count > 0) 55157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 55252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointer_type = clang_ast_type.GetPointerType(); 55352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointer_type.IsValid()) 55452f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang_ast_type = pointer_type; 55557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton else 55657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 55757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton result.AppendError ("unable make a pointer type\n"); 55857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton result.SetStatus(eReturnStatusFailed); 55957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton return false; 56057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 56157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton --pointer_count; 56257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 56357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 56452f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_format_options.GetByteSizeValue() = clang_ast_type.GetByteSize(); 56557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 566a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton if (m_format_options.GetByteSizeValue() == 0) 56757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 56857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton result.AppendErrorWithFormat ("unable to get the byte size of the type '%s'\n", 56957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton view_as_type_cstr); 57057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton result.SetStatus(eReturnStatusFailed); 57157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton return false; 57257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 57356bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton 574a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton if (!m_format_options.GetCountValue().OptionWasSet()) 575a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_format_options.GetCountValue() = 1; 57657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 57757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton else 57857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 579567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton error = m_memory_options.FinalizeSettings (target, m_format_options); 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58256bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton // Look for invalid combinations of settings 58356bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (error.Fail()) 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 58549d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton result.AppendError(error.AsCString()); 58656bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton result.SetStatus(eReturnStatusFailed); 58756bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton return false; 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 590902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton lldb::addr_t addr; 591902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton size_t total_byte_size = 0; 592902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton if (argc == 0) 593902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton { 594902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton // Use the last address and byte size and all options as they were 595902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton // if no options have been set 596902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton addr = m_next_addr; 597902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton total_byte_size = m_prev_byte_size; 598bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton clang_ast_type = m_prev_clang_ast_type; 599bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton if (!m_format_options.AnyOptionWasSet() && 600902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton !m_memory_options.AnyOptionWasSet() && 601902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton !m_outfile_options.AnyOptionWasSet() && 602902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton !m_varobj_options.AnyOptionWasSet()) 603902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton { 604902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton m_format_options = m_prev_format_options; 605902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton m_memory_options = m_prev_memory_options; 606902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton m_outfile_options = m_prev_outfile_options; 607902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton m_varobj_options = m_prev_varobj_options; 608902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton } 609902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton } 610902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton 611a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton size_t item_count = m_format_options.GetCountValue().GetCurrentValue(); 6124535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata size_t item_byte_size = m_format_options.GetByteSizeValue().GetCurrentValue(); 61356bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton const size_t num_per_line = m_memory_options.m_num_per_line.GetCurrentValue(); 61456bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (total_byte_size == 0) 616902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton { 617902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton total_byte_size = item_count * item_byte_size; 618902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton if (total_byte_size == 0) 619902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton total_byte_size = 32; 620902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton } 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 622902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton if (argc > 0) 623ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton addr = Args::StringToAddress(&m_exe_ctx, command.GetArgumentAtIndex(0), LLDB_INVALID_ADDRESS, &error); 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (addr == LLDB_INVALID_ADDRESS) 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62749d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton result.AppendError("invalid start address expression."); 62849d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton result.AppendError(error.AsCString()); 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argc == 2) 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 635ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton lldb::addr_t end_addr = Args::StringToAddress(&m_exe_ctx, command.GetArgumentAtIndex(1), LLDB_INVALID_ADDRESS, 0); 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (end_addr == LLDB_INVALID_ADDRESS) 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63849d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton result.AppendError("invalid end address expression."); 63949d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton result.AppendError(error.AsCString()); 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (end_addr <= addr) 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6455f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendErrorWithFormat("end address (0x%" PRIx64 ") must be greater that the start address (0x%" PRIx64 ").\n", end_addr, addr); 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 649a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton else if (m_format_options.GetCountValue().OptionWasSet()) 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6515f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendErrorWithFormat("specify either the end address (0x%" PRIx64 ") or the count (--count %lu), not both.\n", end_addr, item_count); 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner total_byte_size = end_addr - addr; 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner item_count = total_byte_size / item_byte_size; 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 66028ad12bffb738ef9243e399d04ffe190a127d21cEnrico Granata uint32_t max_unforced_size = target->GetMaximumMemReadSize(); 66128ad12bffb738ef9243e399d04ffe190a127d21cEnrico Granata 66228ad12bffb738ef9243e399d04ffe190a127d21cEnrico Granata if (total_byte_size > max_unforced_size && !m_memory_options.m_force) 6638a6f3e9fd6d9a12b4f0153357a7e1f5c66455586Sean Callanan { 66428ad12bffb738ef9243e399d04ffe190a127d21cEnrico Granata result.AppendErrorWithFormat("Normally, \'memory read\' will not read over %" PRIu32 " bytes of data.\n",max_unforced_size); 66528ad12bffb738ef9243e399d04ffe190a127d21cEnrico Granata result.AppendErrorWithFormat("Please use --force to override this restriction just once.\n"); 66628ad12bffb738ef9243e399d04ffe190a127d21cEnrico Granata result.AppendErrorWithFormat("or set target.max-memory-read-size if you will often need a larger limit.\n"); 6678a6f3e9fd6d9a12b4f0153357a7e1f5c66455586Sean Callanan return false; 6688a6f3e9fd6d9a12b4f0153357a7e1f5c66455586Sean Callanan } 6698a6f3e9fd6d9a12b4f0153357a7e1f5c66455586Sean Callanan 67057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton DataBufferSP data_sp; 67157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton size_t bytes_read = 0; 672bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton if (clang_ast_type.GetOpaqueQualType()) 673bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton { 674bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton // Make sure we don't display our type as ASCII bytes like the default memory read 675bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton if (m_format_options.GetFormatValue().OptionWasSet() == false) 676bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton m_format_options.GetFormatValue().SetCurrentValue(eFormatDefault); 677bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton 67852f792329be5db8e38961350589e97e8f2823acdGreg Clayton bytes_read = clang_ast_type.GetByteSize() * m_format_options.GetCountValue().GetCurrentValue(); 679bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton } 6804535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata else if (m_format_options.GetFormatValue().GetCurrentValue() != eFormatCString) 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 68257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton data_sp.reset (new DataBufferHeap (total_byte_size, '\0')); 683772a66793b0eb14b1bc6c4255b9b33610df8a488Greg Clayton if (data_sp->GetBytes() == NULL) 684772a66793b0eb14b1bc6c4255b9b33610df8a488Greg Clayton { 685772a66793b0eb14b1bc6c4255b9b33610df8a488Greg Clayton result.AppendErrorWithFormat ("can't allocate 0x%zx bytes for the memory read buffer, specify a smaller size to read", total_byte_size); 686772a66793b0eb14b1bc6c4255b9b33610df8a488Greg Clayton result.SetStatus(eReturnStatusFailed); 687772a66793b0eb14b1bc6c4255b9b33610df8a488Greg Clayton return false; 688772a66793b0eb14b1bc6c4255b9b33610df8a488Greg Clayton } 689772a66793b0eb14b1bc6c4255b9b33610df8a488Greg Clayton 6903508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Address address(addr, NULL); 691567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton bytes_read = target->ReadMemory(address, false, data_sp->GetBytes (), data_sp->GetByteSize(), error); 69257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (bytes_read == 0) 69357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 69404e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton const char *error_cstr = error.AsCString(); 69504e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton if (error_cstr && error_cstr[0]) 69604e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton { 69704e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton result.AppendError(error_cstr); 69804e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton } 69904e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton else 70004e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton { 7015f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendErrorWithFormat("failed to read memory from 0x%" PRIx64 ".\n", addr); 70204e6ada409d714592c7ab18b5b5472a5229d63d2Greg Clayton } 70357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton result.SetStatus(eReturnStatusFailed); 70457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton return false; 70557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 70657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 70757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (bytes_read < total_byte_size) 70840aa90314d979a60122ba13589a793f231a95dddJim Ingham result.AppendWarningWithFormat("Not all bytes (%lu/%lu) were able to be read from 0x%" PRIx64 ".\n", bytes_read, total_byte_size, addr); 7094535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata } 7104535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata else 7114535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata { 7124535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata // we treat c-strings as a special case because they do not have a fixed size 7134535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata if (m_format_options.GetByteSizeValue().OptionWasSet() && !m_format_options.HasGDBFormat()) 7144535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata item_byte_size = m_format_options.GetByteSizeValue().GetCurrentValue(); 7154535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata else 7164535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata item_byte_size = target->GetMaximumSizeOfStringSummary(); 7174535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata if (!m_format_options.GetCountValue().OptionWasSet()) 7184535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata item_count = 1; 7194535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata data_sp.reset (new DataBufferHeap ((item_byte_size+1) * item_count, '\0')); // account for NULLs as necessary 720772a66793b0eb14b1bc6c4255b9b33610df8a488Greg Clayton if (data_sp->GetBytes() == NULL) 721772a66793b0eb14b1bc6c4255b9b33610df8a488Greg Clayton { 722772a66793b0eb14b1bc6c4255b9b33610df8a488Greg Clayton result.AppendErrorWithFormat ("can't allocate 0x%" PRIx64 " bytes for the memory read buffer, specify a smaller size to read", (uint64_t)((item_byte_size+1) * item_count)); 723772a66793b0eb14b1bc6c4255b9b33610df8a488Greg Clayton result.SetStatus(eReturnStatusFailed); 724772a66793b0eb14b1bc6c4255b9b33610df8a488Greg Clayton return false; 725772a66793b0eb14b1bc6c4255b9b33610df8a488Greg Clayton } 7264535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata uint8_t *data_ptr = data_sp->GetBytes(); 7274535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata auto data_addr = addr; 7284535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata auto count = item_count; 7294535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata item_count = 0; 7304535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata while (item_count < count) 7314535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata { 7324535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata std::string buffer; 7334535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata buffer.resize(item_byte_size+1,0); 7344535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata Error error; 7354535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata size_t read = target->ReadCStringFromMemory(data_addr, &buffer[0], item_byte_size+1, error); 7364535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata if (error.Fail()) 7374535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata { 7384535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata result.AppendErrorWithFormat("failed to read memory from 0x%" PRIx64 ".\n", addr); 7394535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata result.SetStatus(eReturnStatusFailed); 7404535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata return false; 7414535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata } 7424535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata if (item_byte_size == read) 7434535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata { 7444535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata result.AppendWarningWithFormat("unable to find a NULL terminated string at 0x%" PRIx64 ".Consider increasing the maximum read length.\n", data_addr); 7454535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata break; 7464535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata } 7474535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata read+=1; // account for final NULL byte 7484535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata memcpy(data_ptr, &buffer[0], read); 7494535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata data_ptr += read; 7504535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata data_addr += read; 7514535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata bytes_read += read; 7524535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata item_count++; // if we break early we know we only read item_count strings 7534535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata } 7544535891c699c40710e59d8ea966c4ad3ab19c077Enrico Granata data_sp.reset(new DataBufferHeap(data_sp->GetBytes(),bytes_read+1)); 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 757bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton m_next_addr = addr + bytes_read; 758bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton m_prev_byte_size = bytes_read; 759bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton m_prev_format_options = m_format_options; 760bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton m_prev_memory_options = m_memory_options; 761bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton m_prev_outfile_options = m_outfile_options; 762bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton m_prev_varobj_options = m_varobj_options; 763bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton m_prev_clang_ast_type = clang_ast_type; 764bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton 765e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton StreamFile outfile_stream; 766e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton Stream *output_stream = NULL; 76757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton const FileSpec &outfile_spec = m_outfile_options.GetFile().GetCurrentValue(); 76857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (outfile_spec) 769e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 770e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton char path[PATH_MAX]; 77157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton outfile_spec.GetPath (path, sizeof(path)); 77257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 77357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton uint32_t open_options = File::eOpenOptionWrite | File::eOpenOptionCanCreate; 77457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton const bool append = m_outfile_options.GetAppend().GetCurrentValue(); 77557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (append) 77657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton open_options |= File::eOpenOptionAppend; 77757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 77857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (outfile_stream.GetFile ().Open (path, open_options).Success()) 779e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 78057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (m_memory_options.m_output_as_binary) 781e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 78236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t bytes_written = outfile_stream.Write (data_sp->GetBytes(), bytes_read); 783e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton if (bytes_written > 0) 784e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 78536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton result.GetOutputStream().Printf ("%zi bytes %s to '%s'\n", 786e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton bytes_written, 78757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton append ? "appended" : "written", 788e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton path); 789e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton return true; 790e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 791e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton else 792e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 7935f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendErrorWithFormat("Failed to write %" PRIu64 " bytes to '%s'.\n", (uint64_t)bytes_read, path); 794e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton result.SetStatus(eReturnStatusFailed); 795e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton return false; 796e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 797e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 798e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton else 799e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 800e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton // We are going to write ASCII to the file just point the 801e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton // output_stream to our outfile_stream... 802e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton output_stream = &outfile_stream; 803e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 804e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 805e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton else 806e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 80757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton result.AppendErrorWithFormat("Failed to open file '%s' for %s.\n", path, append ? "append" : "write"); 808e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton result.SetStatus(eReturnStatusFailed); 809e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton return false; 810e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 811e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 812e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton else 813e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 814e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton output_stream = &result.GetOutputStream(); 815e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 816e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton 81757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 818ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton ExecutionContextScope *exe_scope = m_exe_ctx.GetBestExecutionContextScope(); 81957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (clang_ast_type.GetOpaqueQualType()) 82057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 82157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton for (uint32_t i = 0; i<item_count; ++i) 82257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 82357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton addr_t item_addr = addr + (i * item_byte_size); 8243508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Address address (item_addr); 82557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton StreamString name_strm; 8265f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea name_strm.Printf ("0x%" PRIx64, item_addr); 82724a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton ValueObjectSP valobj_sp (ValueObjectMemory::Create (exe_scope, 82857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton name_strm.GetString().c_str(), 82957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton address, 83057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton clang_ast_type)); 83157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton if (valobj_sp) 83257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 833bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton Format format = m_format_options.GetFormat(); 83456bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton if (format != eFormatDefault) 83556bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton valobj_sp->SetFormat (format); 83656bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton 837c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata ValueObject::DumpValueObjectOptions options(m_varobj_options.GetAsDumpOptions(false,format)); 838c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata 83957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton ValueObject::DumpValueObject (*output_stream, 84057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton valobj_sp.get(), 8413069c62fc7d3c0b857cd1e9269ff22011ed418fbEnrico Granata options); 84257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 84357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton else 84457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton { 84557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton result.AppendErrorWithFormat ("failed to create a value object for: (%s) %s\n", 84657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton view_as_type_cstr, 84757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton name_strm.GetString().c_str()); 84857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton result.SetStatus(eReturnStatusFailed); 84957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton return false; 85057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 85157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 85257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton return true; 85357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton } 85457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 85557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton result.SetStatus(eReturnStatusSuccessFinishResult); 85657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton DataExtractor data (data_sp, 857567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton target->GetArchitecture().GetByteOrder(), 858567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton target->GetArchitecture().GetAddressByteSize()); 859bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata 860bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata Format format = m_format_options.GetFormat(); 861bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata if ( ( (format == eFormatChar) || (format == eFormatCharPrintable) ) 862bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata && (item_byte_size != 1) 863bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata && (item_count == 1)) 864bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata { 865bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata // this turns requests such as 866bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata // memory read -fc -s10 -c1 *charPtrPtr 867bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata // which make no sense (what is a char of size 10?) 868bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata // into a request for fetching 10 chars of size 1 from the same memory location 869bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata format = eFormatCharArray; 870bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata item_count = item_byte_size; 871bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata item_byte_size = 1; 872bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata } 87357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton 874e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton assert (output_stream); 87536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t bytes_dumped = data.Dump (output_stream, 87636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton 0, 877bed7ab509caecc420a2a1b85f2518faf24ffdaceEnrico Granata format, 87836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton item_byte_size, 87936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton item_count, 88036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton num_per_line, 88136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton addr, 88236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton 0, 88336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton 0, 88436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton exe_scope); 885746979d1b0d500be02ad92550ab3e3c858ba517dGreg Clayton m_next_addr = addr + bytes_dumped; 886e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton output_stream->EOL(); 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton OptionGroupOptions m_option_group; 89157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton OptionGroupFormat m_format_options; 89257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton OptionGroupReadMemory m_memory_options; 89357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton OptionGroupOutputFile m_outfile_options; 89456bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton OptionGroupValueObjectDisplay m_varobj_options; 895902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton lldb::addr_t m_next_addr; 896902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton lldb::addr_t m_prev_byte_size; 897902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton OptionGroupFormat m_prev_format_options; 898902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton OptionGroupReadMemory m_prev_memory_options; 899902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton OptionGroupOutputFile m_prev_outfile_options; 900902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton OptionGroupValueObjectDisplay m_prev_varobj_options; 901bad1c9e139932d5afa197f8c03e1262f4145da9eGreg Clayton ClangASTType m_prev_clang_ast_type; 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 904a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 905a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg ClaytonOptionDefinition 906a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Claytong_memory_write_option_table[] = 907a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton{ 908a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton{ LLDB_OPT_SET_1, true, "infile", 'i', required_argument, NULL, 0, eArgTypeFilename, "Write memory using the contents of a file."}, 909a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton{ LLDB_OPT_SET_1, false, "offset", 'o', required_argument, NULL, 0, eArgTypeOffset, "Start writng bytes from an offset within the input file."}, 910a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton}; 911a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 912a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Write memory to the inferior process 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 916da26bd203cbb104291b39891febf7481794f205fJim Inghamclass CommandObjectMemoryWrite : public CommandObjectParsed 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 920a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton class OptionGroupWriteMemory : public OptionGroup 92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 923a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionGroupWriteMemory () : 924a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionGroup() 92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 929a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton ~OptionGroupWriteMemory () 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 933a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton virtual uint32_t 934a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton GetNumDefinitions () 935a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton { 936a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton return sizeof (g_memory_write_option_table) / sizeof (OptionDefinition); 937a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton } 938a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 939a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton virtual const OptionDefinition* 940a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton GetDefinitions () 941a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton { 942a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton return g_memory_write_option_table; 943a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton } 944a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Error 946a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton SetOptionValue (CommandInterpreter &interpreter, 947a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton uint32_t option_idx, 948a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton const char *option_arg) 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 9516475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton const int short_option = g_memory_write_option_table[option_idx].short_option; 952a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (short_option) 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 955a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton case 'i': 956a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_infile.SetFile (option_arg, true); 957a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton if (!m_infile.Exists()) 958e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 959a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_infile.Clear(); 9609c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("input file does not exist: '%s'", option_arg); 961e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 962a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton break; 963a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 964a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton case 'o': 965a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton { 966a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton bool success; 967a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_infile_offset = Args::StringToUInt64(option_arg, 0, 0, &success); 968a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton if (!success) 969a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton { 9709c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("invalid offset string '%s'", option_arg); 971a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton } 972a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton } 973a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton break; 974a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 975a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton default: 9769c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton error.SetErrorStringWithFormat("unrecognized short option '%c'", short_option); 977a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton break; 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 981a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 982a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton virtual void 983a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionParsingStarting (CommandInterpreter &interpreter) 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 985e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton m_infile.Clear(); 986e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton m_infile_offset = 0; 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 989e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton FileSpec m_infile; 990e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton off_t m_infile_offset; 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 993238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMemoryWrite (CommandInterpreter &interpreter) : 994da26bd203cbb104291b39891febf7481794f205fJim Ingham CommandObjectParsed (interpreter, 995da26bd203cbb104291b39891febf7481794f205fJim Ingham "memory write", 996da26bd203cbb104291b39891febf7481794f205fJim Ingham "Write to the memory of the process being debugged.", 997da26bd203cbb104291b39891febf7481794f205fJim Ingham NULL, 998ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton eFlagRequiresProcess | eFlagProcessMustBeLaunched), 999a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_option_group (interpreter), 1000a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_format_options (eFormatBytes, 1, UINT64_MAX), 1001a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_memory_options () 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 100343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg1; 100443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg2; 100543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData addr_arg; 100643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData value_arg; 100743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 100843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 100943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice addr_arg.arg_type = eArgTypeAddress; 101043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice addr_arg.arg_repetition = eArgRepeatPlain; 101143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 101243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 101343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg1.push_back (addr_arg); 101443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 101543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 101643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice value_arg.arg_type = eArgTypeValue; 101743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice value_arg.arg_repetition = eArgRepeatPlus; 101843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 101943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 102043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg2.push_back (value_arg); 102143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 102243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 102343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg1); 102443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg2); 1025a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 1026a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_option_group.Append (&m_format_options, OptionGroupFormat::OPTION_GROUP_FORMAT, LLDB_OPT_SET_1); 1027a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_option_group.Append (&m_format_options, OptionGroupFormat::OPTION_GROUP_SIZE , LLDB_OPT_SET_1|LLDB_OPT_SET_2); 1028a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_option_group.Append (&m_memory_options, LLDB_OPT_SET_ALL, LLDB_OPT_SET_2); 1029a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton m_option_group.Finalize(); 1030a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~CommandObjectMemoryWrite () 103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Options * 103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetOptions () 104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1041a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton return &m_option_group; 104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner UIntValueIsValidForSize (uint64_t uval64, size_t total_byte_size) 104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (total_byte_size > 8) 104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (total_byte_size == 8) 105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint64_t max = ((uint64_t)1 << (uint64_t)(total_byte_size * 8)) - 1; 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return uval64 <= max; 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SIntValueIsValidForSize (int64_t sval64, size_t total_byte_size) 105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (total_byte_size > 8) 106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (total_byte_size == 8) 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const int64_t max = ((int64_t)1 << (uint64_t)(total_byte_size * 8 - 1)) - 1; 106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const int64_t min = ~(max); 106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return min <= sval64 && sval64 <= max; 106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1071da26bd203cbb104291b39891febf7481794f205fJim Inghamprotected: 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 1073da26bd203cbb104291b39891febf7481794f205fJim Ingham DoExecute (Args& command, CommandReturnObject &result) 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1075ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton // No need to check "process" for validity as eFlagRequiresProcess ensures it is valid 1076ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton Process *process = m_exe_ctx.GetProcessPtr(); 107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t argc = command.GetArgumentCount(); 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1080a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton if (m_memory_options.m_infile) 108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1082e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton if (argc < 1) 1083e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 1084e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton result.AppendErrorWithFormat ("%s takes a destination address when writing file contents.\n", m_cmd_name.c_str()); 1085e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton result.SetStatus(eReturnStatusFailed); 1086e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton return false; 1087e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 1088e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 1089e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton else if (argc < 2) 1090e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 1091e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton result.AppendErrorWithFormat ("%s takes a destination address and at least one value.\n", m_cmd_name.c_str()); 109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString buffer (Stream::eBinary, 1097395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton process->GetTarget().GetArchitecture().GetAddressByteSize(), 1098395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton process->GetTarget().GetArchitecture().GetByteOrder()); 109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1100a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionValueUInt64 &byte_size_value = m_format_options.GetByteSizeValue(); 1101a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton size_t item_byte_size = byte_size_value.GetCurrentValue(); 110254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton 110349d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton Error error; 1104ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton lldb::addr_t addr = Args::StringToAddress (&m_exe_ctx, 110549d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton command.GetArgumentAtIndex(0), 110649d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton LLDB_INVALID_ADDRESS, 110749d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton &error); 110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (addr == LLDB_INVALID_ADDRESS) 111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 111149d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton result.AppendError("invalid address expression\n"); 111249d888d8c3e4de1d2f38d541559f533f1c0bcab3Greg Clayton result.AppendError(error.AsCString()); 111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1116e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton 1117a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton if (m_memory_options.m_infile) 1118e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 1119e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton size_t length = SIZE_MAX; 1120a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton if (item_byte_size > 0) 1121a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton length = item_byte_size; 1122a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton lldb::DataBufferSP data_sp (m_memory_options.m_infile.ReadFileContents (m_memory_options.m_infile_offset, length)); 1123e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton if (data_sp) 1124e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 1125e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton length = data_sp->GetByteSize(); 1126e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton if (length > 0) 1127e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 1128e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton Error error; 1129e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton size_t bytes_written = process->WriteMemory (addr, data_sp->GetBytes(), length, error); 1130e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton 1131e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton if (bytes_written == length) 1132e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 1133e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton // All bytes written 11345f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.GetOutputStream().Printf("%" PRIu64 " bytes were written to 0x%" PRIx64 "\n", (uint64_t)bytes_written, addr); 1135e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton result.SetStatus(eReturnStatusSuccessFinishResult); 1136e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 1137e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton else if (bytes_written > 0) 1138e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 1139e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton // Some byte written 11405f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.GetOutputStream().Printf("%" PRIu64 " bytes of %" PRIu64 " requested were written to 0x%" PRIx64 "\n", (uint64_t)bytes_written, (uint64_t)length, addr); 1141e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton result.SetStatus(eReturnStatusSuccessFinishResult); 1142e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 1143e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton else 1144e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 11455f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendErrorWithFormat ("Memory write to 0x%" PRIx64 " failed: %s.\n", addr, error.AsCString()); 1146e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton result.SetStatus(eReturnStatusFailed); 1147e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 1148e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 1149e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 1150e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton else 1151e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 1152e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton result.AppendErrorWithFormat ("Unable to read contents of file.\n"); 1153e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton result.SetStatus(eReturnStatusFailed); 1154e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 1155e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton return result.Succeeded(); 1156e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 1157a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton else if (item_byte_size == 0) 1158e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton { 1159a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton if (m_format_options.GetFormat() == eFormatPointer) 1160e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton item_byte_size = buffer.GetAddressByteSize(); 1161e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton else 1162e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton item_byte_size = 1; 1163e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton } 1164e9f5fbdeb698fcc97d6d59d616f731ca4d8d4dceGreg Clayton 116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner command.Shift(); // shift off the address argument 116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t uval64; 116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int64_t sval64; 116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool success = false; 116936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const size_t num_value_args = command.GetArgumentCount(); 117036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton for (size_t i=0; i<num_value_args; ++i) 117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *value_str = command.GetArgumentAtIndex(i); 117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1174a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton switch (m_format_options.GetFormat()) 117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11763182effd150f2e0381d7c6867236737ac69ad846Greg Clayton case kNumFormats: 117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatFloat: // TODO: add support for floats soon 117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatCharPrintable: 117924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatBytesWithASCII: 118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatComplex: 118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatEnum: 118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatUnicode16: 118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatUnicode32: 118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatVectorOfChar: 118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatVectorOfSInt8: 118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatVectorOfUInt8: 118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatVectorOfSInt16: 118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatVectorOfUInt16: 118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatVectorOfSInt32: 119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatVectorOfUInt32: 119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatVectorOfSInt64: 119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatVectorOfUInt64: 119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatVectorOfFloat32: 119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatVectorOfFloat64: 119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatVectorOfUInt128: 11964fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton case eFormatOSType: 11974fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton case eFormatComplexInteger: 119824a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eFormatAddressInfo: 119924a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eFormatHexFloat: 120024a6bd9835ed1655984397b0cdf35127e47681e9Greg Clayton case eFormatInstruction: 120196abc62dcb25159dbb532e477ba2cf6d85b81700Sean Callanan case eFormatVoid: 120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendError("unsupported format for writing memory"); 120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatDefault: 120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatBytes: 120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatHex: 1209535543d6104ee45b4503db6bb6c175e66d0e093bEnrico Granata case eFormatHexUppercase: 121054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton case eFormatPointer: 121154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton 121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Decode hex bytes 121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uval64 = Args::StringToUInt64(value_str, UINT64_MAX, 16, &success); 121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!success) 121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("'%s' is not a valid hex string value.\n", value_str); 121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (!UIntValueIsValidForSize (uval64, item_byte_size)) 122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12225f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendErrorWithFormat ("Value 0x%" PRIx64 " is too large to fit in a %lu byte unsigned integer value.\n", uval64, item_byte_size); 122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner buffer.PutMaxHex64 (uval64, item_byte_size); 122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatBoolean: 123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uval64 = Args::StringToBoolean(value_str, false, &success); 123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!success) 123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("'%s' is not a valid boolean string value.\n", value_str); 123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 123624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner buffer.PutMaxHex64 (uval64, item_byte_size); 123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatBinary: 124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uval64 = Args::StringToUInt64(value_str, UINT64_MAX, 2, &success); 124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!success) 124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("'%s' is not a valid binary string value.\n", value_str); 124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 124724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (!UIntValueIsValidForSize (uval64, item_byte_size)) 124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12505f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendErrorWithFormat ("Value 0x%" PRIx64 " is too large to fit in a %lu byte unsigned integer value.\n", uval64, item_byte_size); 125124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 125224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 125324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner buffer.PutMaxHex64 (uval64, item_byte_size); 125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1257307fa07606d519d427c812802aff5f9727e7047cGreg Clayton case eFormatCharArray: 125824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatChar: 125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatCString: 126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (value_str[0]) 126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t len = strlen (value_str); 126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Include the NULL for C strings... 1264a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton if (m_format_options.GetFormat() == eFormatCString) 126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++len; 126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (process->WriteMemory (addr, value_str, len, error) == len) 126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner addr += len; 127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12735f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendErrorWithFormat ("Memory write to 0x%" PRIx64 " failed: %s.\n", addr, error.AsCString()); 127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 127824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 127924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 128024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatDecimal: 128124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sval64 = Args::StringToSInt64(value_str, INT64_MAX, 0, &success); 128224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!success) 128324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 128424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("'%s' is not a valid signed decimal value.\n", value_str); 128524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 128624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 128724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 128824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (!SIntValueIsValidForSize (sval64, item_byte_size)) 128924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12905f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendErrorWithFormat ("Value %" PRIi64 " is too large or small to fit in a %lu byte signed integer value.\n", sval64, item_byte_size); 129124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 129224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 129324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 129424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner buffer.PutMaxHex64 (sval64, item_byte_size); 129524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 129624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 129724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatUnsigned: 129824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uval64 = Args::StringToUInt64(value_str, UINT64_MAX, 0, &success); 129924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!success) 130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("'%s' is not a valid unsigned decimal string value.\n", value_str); 130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (!UIntValueIsValidForSize (uval64, item_byte_size)) 130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13075f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendErrorWithFormat ("Value %" PRIu64 " is too large to fit in a %lu byte unsigned integer value.\n", uval64, item_byte_size); 130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner buffer.PutMaxHex64 (uval64, item_byte_size); 131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eFormatOctal: 131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uval64 = Args::StringToUInt64(value_str, UINT64_MAX, 8, &success); 131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!success) 131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("'%s' is not a valid octal string value.\n", value_str); 131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 132024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (!UIntValueIsValidForSize (uval64, item_byte_size)) 132324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13245f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendErrorWithFormat ("Value %" PRIo64 " is too large to fit in a %lu byte unsigned integer value.\n", uval64, item_byte_size); 132524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 132724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner buffer.PutMaxHex64 (uval64, item_byte_size); 132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 133124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 133224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 133324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!buffer.GetString().empty()) 133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 133524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 133653d68e749f0715691a95f23e9490d97e484b15daGreg Clayton if (process->WriteMemory (addr, buffer.GetString().c_str(), buffer.GetString().size(), error) == buffer.GetString().size()) 133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 133824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 133924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13405f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea result.AppendErrorWithFormat ("Memory write to 0x%" PRIx64 " failed: %s.\n", addr, error.AsCString()); 134124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus(eReturnStatusFailed); 134224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 134424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 134524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 134624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 134724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1348a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionGroupOptions m_option_group; 1349a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionGroupFormat m_format_options; 1350a42880a8e464a3e4f93951ae797313e5e38cdcd3Greg Clayton OptionGroupWriteMemory m_memory_options; 135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectMemory 135624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 135724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 135863094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectMemory::CommandObjectMemory (CommandInterpreter &interpreter) : 1359238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMultiword (interpreter, 1360238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "memory", 1361c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice "A set of commands for operating on memory.", 136224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "memory <subcommand> [<subcommand-options>]") 136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1364238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("read", CommandObjectSP (new CommandObjectMemoryRead (interpreter))); 1365238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("write", CommandObjectSP (new CommandObjectMemoryWrite (interpreter))); 136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 136724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 136824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMemory::~CommandObjectMemory () 136924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1371