summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Labath <pavel@labath.sk>2019-10-16 15:29:20 +0200
committerPavel Labath <pavel@labath.sk>2019-11-05 11:17:27 +0100
commit28cf9698abd39221001ace885a7d1c1f488b967c (patch)
treec6172494612b5fea570b3f06ef72d1d6a511f30a
parent12c4a71ca9dc19dc364cd6ad4cfc2a3787141c24 (diff)
downloadbcm5719-llvm-28cf9698abd39221001ace885a7d1c1f488b967c.tar.gz
bcm5719-llvm-28cf9698abd39221001ace885a7d1c1f488b967c.zip
MemoryRegion: Print "don't know" permission values as such
Summary: The permissions in a memory region have ternary states (yes, no, don't know), but the memory region command only prints in binary, treating "don't know" as "yes", which is particularly confusing as for instance the unwinder will treat an unknown value as "no". This patch makes is so that we distinguish all three states when printing the values, using "?" to indicate the lack of information. It is implemented via a special argument to the format provider for the OptionalBool enumeration. Reviewers: clayborg, jingham Subscribers: lldb-commits Differential Revision: https://reviews.llvm.org/D69106
-rw-r--r--lldb/include/lldb/Target/MemoryRegionInfo.h18
-rw-r--r--lldb/source/Commands/CommandObjectMemory.cpp13
-rw-r--r--lldb/source/Target/MemoryRegionInfo.cpp24
-rw-r--r--lldb/test/Shell/Minidump/memory-region-from-module.yaml3
4 files changed, 33 insertions, 25 deletions
diff --git a/lldb/include/lldb/Target/MemoryRegionInfo.h b/lldb/include/lldb/Target/MemoryRegionInfo.h
index c6c4e080f8d..07e50188843 100644
--- a/lldb/include/lldb/Target/MemoryRegionInfo.h
+++ b/lldb/include/lldb/Target/MemoryRegionInfo.h
@@ -133,21 +133,13 @@ public:
namespace llvm {
template <>
+/// If Options is empty, prints a textual representation of the value. If
+/// Options is a single character, it uses that character for the "yes" value,
+/// while "no" is printed as "-", and "don't know" as "?". This can be used to
+/// print the permissions in the traditional "rwx" form.
struct format_provider<lldb_private::MemoryRegionInfo::OptionalBool> {
static void format(const lldb_private::MemoryRegionInfo::OptionalBool &B,
- raw_ostream &OS, StringRef Options) {
- switch(B) {
- case lldb_private::MemoryRegionInfo::eNo:
- OS << "no";
- return;
- case lldb_private::MemoryRegionInfo::eYes:
- OS << "yes";
- return;
- case lldb_private::MemoryRegionInfo::eDontKnow:
- OS << "don't know";
- return;
- }
- }
+ raw_ostream &OS, StringRef Options);
};
}
diff --git a/lldb/source/Commands/CommandObjectMemory.cpp b/lldb/source/Commands/CommandObjectMemory.cpp
index 679a7b6a998..a20290f94bf 100644
--- a/lldb/source/Commands/CommandObjectMemory.cpp
+++ b/lldb/source/Commands/CommandObjectMemory.cpp
@@ -1730,15 +1730,12 @@ protected:
section_name = section_sp->GetName();
}
}
- result.AppendMessageWithFormat(
- "[0x%16.16" PRIx64 "-0x%16.16" PRIx64 ") %c%c%c%s%s%s%s\n",
+ result.AppendMessageWithFormatv(
+ "[{0:x16}-{1:x16}) {2:r}{3:w}{4:x}{5}{6}{7}{8}\n",
range_info.GetRange().GetRangeBase(),
- range_info.GetRange().GetRangeEnd(),
- range_info.GetReadable() ? 'r' : '-',
- range_info.GetWritable() ? 'w' : '-',
- range_info.GetExecutable() ? 'x' : '-', name ? " " : "",
- name.AsCString(""), section_name ? " " : "",
- section_name.AsCString(""));
+ range_info.GetRange().GetRangeEnd(), range_info.GetReadable(),
+ range_info.GetWritable(), range_info.GetExecutable(),
+ name ? " " : "", name, section_name ? " " : "", section_name);
m_prev_end_addr = range_info.GetRange().GetRangeEnd();
result.SetStatus(eReturnStatusSuccessFinishResult);
} else {
diff --git a/lldb/source/Target/MemoryRegionInfo.cpp b/lldb/source/Target/MemoryRegionInfo.cpp
index 1feb84bffc5..2c31563786a 100644
--- a/lldb/source/Target/MemoryRegionInfo.cpp
+++ b/lldb/source/Target/MemoryRegionInfo.cpp
@@ -8,13 +8,33 @@
#include "lldb/Target/MemoryRegionInfo.h"
+using namespace lldb_private;
+
llvm::raw_ostream &lldb_private::operator<<(llvm::raw_ostream &OS,
const MemoryRegionInfo &Info) {
- return OS << llvm::formatv("MemoryRegionInfo([{0}, {1}), {2}, {3}, {4}, {5}, "
- "`{6}`, {7}, {8})",
+ return OS << llvm::formatv("MemoryRegionInfo([{0}, {1}), {2:r}{3:w}{4:x}, "
+ "{5}, `{6}`, {7}, {8})",
Info.GetRange().GetRangeBase(),
Info.GetRange().GetRangeEnd(), Info.GetReadable(),
Info.GetWritable(), Info.GetExecutable(),
Info.GetMapped(), Info.GetName(), Info.GetFlash(),
Info.GetBlocksize());
}
+
+void llvm::format_provider<MemoryRegionInfo::OptionalBool>::format(
+ const MemoryRegionInfo::OptionalBool &B, raw_ostream &OS,
+ StringRef Options) {
+ assert(Options.size() <= 1);
+ bool Empty = Options.empty();
+ switch (B) {
+ case lldb_private::MemoryRegionInfo::eNo:
+ OS << (Empty ? "no" : "-");
+ return;
+ case lldb_private::MemoryRegionInfo::eYes:
+ OS << (Empty ? "yes" : Options);
+ return;
+ case lldb_private::MemoryRegionInfo::eDontKnow:
+ OS << (Empty ? "don't know" : "?");
+ return;
+ }
+}
diff --git a/lldb/test/Shell/Minidump/memory-region-from-module.yaml b/lldb/test/Shell/Minidump/memory-region-from-module.yaml
index 0c405e8f6c2..fb6c4a40a69 100644
--- a/lldb/test/Shell/Minidump/memory-region-from-module.yaml
+++ b/lldb/test/Shell/Minidump/memory-region-from-module.yaml
@@ -19,8 +19,7 @@
# ALL: [0x0000000000000000-0x0000000000004000) ---
# ALL-LABEL: (lldb) memory region 0x4000
# CHECK1: [0x0000000000004000-0x00000000000040b0) r-x {{.*}}memory-region-from-module.exe PT_LOAD[0]
-# TODO: This output does not give any indication that the region is only "potentially" writable.
-# CHECK2: [0x0000000000004000-0x0000000000004010) rwx
+# CHECK2: [0x0000000000004000-0x0000000000004010) r??
# ALL-LABEL: (lldb) memory region 0x5000
# ALL: [0x0000000000005000-0x000000000000505c) rw- {{.*}}memory-region-from-module.exe PT_LOAD[1]
# ALL-LABEL: (lldb) memory region 0x6000
OpenPOWER on IntegriCloud