summaryrefslogtreecommitdiff
path: root/lldb/source/Commands/CommandObjectMemory.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2021-07-29 20:15:26 +0000
committerDimitry Andric <dim@FreeBSD.org>2021-07-29 20:15:26 +0000
commit344a3780b2e33f6ca763666c380202b18aab72a3 (patch)
treef0b203ee6eb71d7fdd792373e3c81eb18d6934dd /lldb/source/Commands/CommandObjectMemory.cpp
parentb60736ec1405bb0a8dd40989f67ef4c93da068ab (diff)
Diffstat (limited to 'lldb/source/Commands/CommandObjectMemory.cpp')
-rw-r--r--lldb/source/Commands/CommandObjectMemory.cpp95
1 files changed, 38 insertions, 57 deletions
diff --git a/lldb/source/Commands/CommandObjectMemory.cpp b/lldb/source/Commands/CommandObjectMemory.cpp
index 7d5c642d0131..5487d94c9019 100644
--- a/lldb/source/Commands/CommandObjectMemory.cpp
+++ b/lldb/source/Commands/CommandObjectMemory.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "CommandObjectMemory.h"
+#include "CommandObjectMemoryTag.h"
#include "lldb/Core/DumpDataExtractor.h"
#include "lldb/Core/Section.h"
#include "lldb/Core/ValueObjectMemory.h"
@@ -46,8 +47,8 @@ using namespace lldb_private;
class OptionGroupReadMemory : public OptionGroup {
public:
OptionGroupReadMemory()
- : m_num_per_line(1, 1), m_output_as_binary(false), m_view_as_type(),
- m_offset(0, 0), m_language_for_type(eLanguageTypeUnknown) {}
+ : m_num_per_line(1, 1), m_view_as_type(), m_offset(0, 0),
+ m_language_for_type(eLanguageTypeUnknown) {}
~OptionGroupReadMemory() override = default;
@@ -270,7 +271,7 @@ public:
}
OptionValueUInt64 m_num_per_line;
- bool m_output_as_binary;
+ bool m_output_as_binary = false;
OptionValueString m_view_as_type;
bool m_force;
OptionValueUInt64 m_offset;
@@ -356,9 +357,8 @@ protected:
result.AppendErrorWithFormat("%s takes a start address expression with "
"an optional end address expression.\n",
m_cmd_name.c_str());
- result.AppendRawWarning("Expressions should be quoted if they contain "
- "spaces or other special characters.\n");
- result.SetStatus(eReturnStatusFailed);
+ result.AppendWarning("Expressions should be quoted if they contain "
+ "spaces or other special characters.");
return false;
}
@@ -439,7 +439,6 @@ protected:
} else {
result.AppendErrorWithFormat("invalid type string: '%s'\n",
view_as_type_cstr);
- result.SetStatus(eReturnStatusFailed);
return false;
}
break;
@@ -489,7 +488,6 @@ protected:
"Mutiple types found matching raw type '%s', please disambiguate "
"by specifying the language with -x",
lookup_type_name.GetCString());
- result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -504,7 +502,6 @@ protected:
"the raw type '%s' for full type '%s'\n",
lookup_type_name.GetCString(),
view_as_type_cstr);
- result.SetStatus(eReturnStatusFailed);
return false;
} else {
TypeSP type_sp(type_list.GetTypeAtIndex(0));
@@ -518,7 +515,6 @@ protected:
compiler_type = pointer_type;
else {
result.AppendError("unable make a pointer type\n");
- result.SetStatus(eReturnStatusFailed);
return false;
}
--pointer_count;
@@ -529,7 +525,6 @@ protected:
result.AppendErrorWithFormat(
"unable to get the byte size of the type '%s'\n",
view_as_type_cstr);
- result.SetStatus(eReturnStatusFailed);
return false;
}
m_format_options.GetByteSizeValue() = *size;
@@ -543,7 +538,6 @@ protected:
// Look for invalid combinations of settings
if (error.Fail()) {
result.AppendError(error.AsCString());
- result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -593,7 +587,6 @@ protected:
if (addr == LLDB_INVALID_ADDRESS) {
result.AppendError("invalid start address expression.");
result.AppendError(error.AsCString());
- result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -603,21 +596,18 @@ protected:
if (end_addr == LLDB_INVALID_ADDRESS) {
result.AppendError("invalid end address expression.");
result.AppendError(error.AsCString());
- result.SetStatus(eReturnStatusFailed);
return false;
} else if (end_addr <= addr) {
result.AppendErrorWithFormat(
"end address (0x%" PRIx64
- ") must be greater that the start address (0x%" PRIx64 ").\n",
+ ") must be greater than the start address (0x%" PRIx64 ").\n",
end_addr, addr);
- result.SetStatus(eReturnStatusFailed);
return false;
} else if (m_format_options.GetCountValue().OptionWasSet()) {
result.AppendErrorWithFormat(
"specify either the end address (0x%" PRIx64
") or the count (--count %" PRIu64 "), not both.\n",
end_addr, (uint64_t)item_count);
- result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -664,13 +654,12 @@ protected:
"can't allocate 0x%" PRIx32
" bytes for the memory read buffer, specify a smaller size to read",
(uint32_t)total_byte_size);
- result.SetStatus(eReturnStatusFailed);
return false;
}
Address address(addr, nullptr);
- bytes_read = target->ReadMemory(address, false, data_sp->GetBytes(),
- data_sp->GetByteSize(), error);
+ bytes_read = target->ReadMemory(address, data_sp->GetBytes(),
+ data_sp->GetByteSize(), error, true);
if (bytes_read == 0) {
const char *error_cstr = error.AsCString();
if (error_cstr && error_cstr[0]) {
@@ -679,7 +668,6 @@ protected:
result.AppendErrorWithFormat(
"failed to read memory from 0x%" PRIx64 ".\n", addr);
}
- result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -706,7 +694,6 @@ protected:
"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));
- result.SetStatus(eReturnStatusFailed);
return false;
}
uint8_t *data_ptr = data_sp->GetBytes();
@@ -723,7 +710,6 @@ protected:
if (error.Fail()) {
result.AppendErrorWithFormat(
"failed to read memory from 0x%" PRIx64 ".\n", addr);
- result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -767,10 +753,11 @@ protected:
std::string path = outfile_spec.GetPath();
if (outfile_spec) {
- auto open_options = File::eOpenOptionWrite | File::eOpenOptionCanCreate;
+ File::OpenOptions open_options =
+ File::eOpenOptionWrite | File::eOpenOptionCanCreate;
const bool append = m_outfile_options.GetAppend().GetCurrentValue();
- if (append)
- open_options |= File::eOpenOptionAppend;
+ open_options |=
+ append ? File::eOpenOptionAppend : File::eOpenOptionTruncate;
auto outfile = FileSystem::Instance().Open(outfile_spec, open_options);
@@ -789,7 +776,6 @@ protected:
result.AppendErrorWithFormat("Failed to write %" PRIu64
" bytes to '%s'.\n",
(uint64_t)bytes_read, path.c_str());
- result.SetStatus(eReturnStatusFailed);
return false;
}
} else {
@@ -803,7 +789,6 @@ protected:
path.c_str(), append ? "append" : "write");
result.AppendError(llvm::toString(outfile.takeError()));
- result.SetStatus(eReturnStatusFailed);
return false;
}
} else {
@@ -832,7 +817,6 @@ protected:
result.AppendErrorWithFormat(
"failed to create a value object for: (%s) %s\n",
view_as_type_cstr, name_strm.GetData());
- result.SetStatus(eReturnStatusFailed);
return false;
}
}
@@ -862,7 +846,6 @@ protected:
result.AppendErrorWithFormat(
"reading memory as characters of size %" PRIu64 " is not supported",
(uint64_t)item_byte_size);
- result.SetStatus(eReturnStatusFailed);
return false;
}
}
@@ -1293,14 +1276,12 @@ protected:
result.AppendErrorWithFormat(
"%s takes a destination address when writing file contents.\n",
m_cmd_name.c_str());
- result.SetStatus(eReturnStatusFailed);
return false;
}
} else if (argc < 2) {
result.AppendErrorWithFormat(
"%s takes a destination address and at least one value.\n",
m_cmd_name.c_str());
- result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -1319,7 +1300,6 @@ protected:
if (addr == LLDB_INVALID_ADDRESS) {
result.AppendError("invalid address expression\n");
result.AppendError(error.AsCString());
- result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -1354,12 +1334,10 @@ protected:
result.AppendErrorWithFormat("Memory write to 0x%" PRIx64
" failed: %s.\n",
addr, error.AsCString());
- result.SetStatus(eReturnStatusFailed);
}
}
} else {
result.AppendErrorWithFormat("Unable to read contents of file.\n");
- result.SetStatus(eReturnStatusFailed);
}
return result.Succeeded();
} else if (item_byte_size == 0) {
@@ -1404,7 +1382,6 @@ protected:
case eFormatInstruction:
case eFormatVoid:
result.AppendError("unsupported format for writing memory");
- result.SetStatus(eReturnStatusFailed);
return false;
case eFormatDefault:
@@ -1423,14 +1400,12 @@ protected:
if (!success) {
result.AppendErrorWithFormat(
"'%s' is not a valid hex string value.\n", entry.c_str());
- result.SetStatus(eReturnStatusFailed);
return false;
} else if (!llvm::isUIntN(item_byte_size * 8, uval64)) {
result.AppendErrorWithFormat("Value 0x%" PRIx64
" is too large to fit in a %" PRIu64
" byte unsigned integer value.\n",
uval64, (uint64_t)item_byte_size);
- result.SetStatus(eReturnStatusFailed);
return false;
}
buffer.PutMaxHex64(uval64, item_byte_size);
@@ -1441,7 +1416,6 @@ protected:
if (!success) {
result.AppendErrorWithFormat(
"'%s' is not a valid boolean string value.\n", entry.c_str());
- result.SetStatus(eReturnStatusFailed);
return false;
}
buffer.PutMaxHex64(uval64, item_byte_size);
@@ -1451,14 +1425,12 @@ protected:
if (entry.ref().getAsInteger(2, uval64)) {
result.AppendErrorWithFormat(
"'%s' is not a valid binary string value.\n", entry.c_str());
- result.SetStatus(eReturnStatusFailed);
return false;
} else if (!llvm::isUIntN(item_byte_size * 8, uval64)) {
result.AppendErrorWithFormat("Value 0x%" PRIx64
" is too large to fit in a %" PRIu64
" byte unsigned integer value.\n",
uval64, (uint64_t)item_byte_size);
- result.SetStatus(eReturnStatusFailed);
return false;
}
buffer.PutMaxHex64(uval64, item_byte_size);
@@ -1481,7 +1453,6 @@ protected:
result.AppendErrorWithFormat("Memory write to 0x%" PRIx64
" failed: %s.\n",
addr, error.AsCString());
- result.SetStatus(eReturnStatusFailed);
return false;
}
break;
@@ -1490,14 +1461,12 @@ protected:
if (entry.ref().getAsInteger(0, sval64)) {
result.AppendErrorWithFormat(
"'%s' is not a valid signed decimal value.\n", entry.c_str());
- result.SetStatus(eReturnStatusFailed);
return false;
} else if (!llvm::isIntN(item_byte_size * 8, sval64)) {
result.AppendErrorWithFormat(
"Value %" PRIi64 " is too large or small to fit in a %" PRIu64
" byte signed integer value.\n",
sval64, (uint64_t)item_byte_size);
- result.SetStatus(eReturnStatusFailed);
return false;
}
buffer.PutMaxHex64(sval64, item_byte_size);
@@ -1505,18 +1474,16 @@ protected:
case eFormatUnsigned:
- if (!entry.ref().getAsInteger(0, uval64)) {
+ if (entry.ref().getAsInteger(0, uval64)) {
result.AppendErrorWithFormat(
"'%s' is not a valid unsigned decimal string value.\n",
entry.c_str());
- result.SetStatus(eReturnStatusFailed);
return false;
} else if (!llvm::isUIntN(item_byte_size * 8, uval64)) {
result.AppendErrorWithFormat("Value %" PRIu64
" is too large to fit in a %" PRIu64
" byte unsigned integer value.\n",
uval64, (uint64_t)item_byte_size);
- result.SetStatus(eReturnStatusFailed);
return false;
}
buffer.PutMaxHex64(uval64, item_byte_size);
@@ -1526,14 +1493,12 @@ protected:
if (entry.ref().getAsInteger(8, uval64)) {
result.AppendErrorWithFormat(
"'%s' is not a valid octal string value.\n", entry.c_str());
- result.SetStatus(eReturnStatusFailed);
return false;
} else if (!llvm::isUIntN(item_byte_size * 8, uval64)) {
result.AppendErrorWithFormat("Value %" PRIo64
" is too large to fit in a %" PRIu64
" byte unsigned integer value.\n",
uval64, (uint64_t)item_byte_size);
- result.SetStatus(eReturnStatusFailed);
return false;
}
buffer.PutMaxHex64(uval64, item_byte_size);
@@ -1551,7 +1516,6 @@ protected:
result.AppendErrorWithFormat("Memory write to 0x%" PRIx64
" failed: %s.\n",
addr, error.AsCString());
- result.SetStatus(eReturnStatusFailed);
return false;
}
}
@@ -1604,7 +1568,6 @@ protected:
if (argc == 0 || argc > 1) {
result.AppendErrorWithFormat("%s takes an address expression",
m_cmd_name.c_str());
- result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -1615,7 +1578,6 @@ protected:
if (addr == LLDB_INVALID_ADDRESS) {
result.AppendError("invalid address expression");
result.AppendError(error.AsCString());
- result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -1627,7 +1589,6 @@ protected:
if (!memory_history) {
result.AppendError("no available memory history provider");
- result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -1666,7 +1627,6 @@ protected:
if (!process_sp) {
m_prev_end_addr = LLDB_INVALID_ADDRESS;
result.AppendError("invalid process");
- result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -1678,7 +1638,6 @@ protected:
if (argc > 1 || (argc == 0 && load_addr == LLDB_INVALID_ADDRESS)) {
result.AppendErrorWithFormat("'%s' takes one argument:\nUsage: %s\n",
m_cmd_name.c_str(), m_cmd_syntax.c_str());
- result.SetStatus(eReturnStatusFailed);
return false;
}
@@ -1689,7 +1648,6 @@ protected:
if (error.Fail() || load_addr == LLDB_INVALID_ADDRESS) {
result.AppendErrorWithFormat("invalid address argument \"%s\": %s\n",
command[0].c_str(), error.AsCString());
- result.SetStatus(eReturnStatusFailed);
return false;
}
}
@@ -1721,12 +1679,33 @@ protected:
if (memory_tagged == MemoryRegionInfo::OptionalBool::eYes)
result.AppendMessage("memory tagging: enabled");
+ const llvm::Optional<std::vector<addr_t>> &dirty_page_list =
+ range_info.GetDirtyPageList();
+ if (dirty_page_list.hasValue()) {
+ const size_t page_count = dirty_page_list.getValue().size();
+ result.AppendMessageWithFormat(
+ "Modified memory (dirty) page list provided, %zu entries.\n",
+ page_count);
+ if (page_count > 0) {
+ bool print_comma = false;
+ result.AppendMessageWithFormat("Dirty pages: ");
+ for (size_t i = 0; i < page_count; i++) {
+ if (print_comma)
+ result.AppendMessageWithFormat(", ");
+ else
+ print_comma = true;
+ result.AppendMessageWithFormat("0x%" PRIx64,
+ dirty_page_list.getValue()[i]);
+ }
+ result.AppendMessageWithFormat(".\n");
+ }
+ }
+
m_prev_end_addr = range_info.GetRange().GetRangeEnd();
result.SetStatus(eReturnStatusSuccessFinishResult);
return true;
}
- result.SetStatus(eReturnStatusFailed);
result.AppendErrorWithFormat("%s\n", error.AsCString());
return false;
}
@@ -1758,6 +1737,8 @@ CommandObjectMemory::CommandObjectMemory(CommandInterpreter &interpreter)
CommandObjectSP(new CommandObjectMemoryHistory(interpreter)));
LoadSubCommand("region",
CommandObjectSP(new CommandObjectMemoryRegion(interpreter)));
+ LoadSubCommand("tag",
+ CommandObjectSP(new CommandObjectMemoryTag(interpreter)));
}
CommandObjectMemory::~CommandObjectMemory() = default;