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 &current_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