diff --git a/lldb/include/lldb/Target/MemoryRegionInfo.h b/lldb/include/lldb/Target/MemoryRegionInfo.h index c6c4e080f8df99..07e50188843e1e 100644 --- a/lldb/include/lldb/Target/MemoryRegionInfo.h +++ b/lldb/include/lldb/Target/MemoryRegionInfo.h @@ -133,21 +133,13 @@ class MemoryRegionInfos : public std::vector { 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 { 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 679a7b6a99839d..a20290f94bf521 100644 --- a/lldb/source/Commands/CommandObjectMemory.cpp +++ b/lldb/source/Commands/CommandObjectMemory.cpp @@ -1730,15 +1730,12 @@ class CommandObjectMemoryRegion : public CommandObjectParsed { 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 1feb84bffc585a..2c31563786aac6 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::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 0c405e8f6c26d5..fb6c4a40a69b57 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