#include "lldb/Core/DumpRegisterInfo.h"
#include "lldb/Target/RegisterContext.h"
+#include "lldb/Target/RegisterFlags.h"
#include "lldb/Utility/Stream.h"
using namespace lldb;
using SetInfo = std::pair<const char *, uint32_t>;
void lldb_private::DumpRegisterInfo(Stream &strm, RegisterContext &ctx,
- const RegisterInfo &info) {
+ const RegisterInfo &info,
+ uint32_t terminal_width) {
std::vector<const char *> invalidates;
if (info.invalidate_regs) {
for (uint32_t *inv_regs = info.invalidate_regs;
}
DoDumpRegisterInfo(strm, info.name, info.alt_name, info.byte_size,
- invalidates, read_from, in_sets);
+ invalidates, read_from, in_sets, info.flags_type,
+ terminal_width);
}
template <typename ElementType>
Stream &strm, const char *name, const char *alt_name, uint32_t byte_size,
const std::vector<const char *> &invalidates,
const std::vector<const char *> &read_from,
- const std::vector<SetInfo> &in_sets) {
+ const std::vector<SetInfo> &in_sets, const RegisterFlags *flags_type,
+ uint32_t terminal_width) {
strm << " Name: " << name;
if (alt_name)
strm << " (" << alt_name << ")";
strm.Printf("%s (index %d)", info.first, info.second);
};
DumpList(strm, " In sets: ", in_sets, emit_set);
+
+ if (flags_type)
+ strm.Printf("\n\n%s", flags_type->AsTable(terminal_width).c_str());
}
//===----------------------------------------------------------------------===//
#include "lldb/Core/DumpRegisterInfo.h"
+#include "lldb/Target/RegisterFlags.h"
#include "lldb/Utility/StreamString.h"
#include "gtest/gtest.h"
TEST(DoDumpRegisterInfoTest, MinimumInfo) {
StreamString strm;
- DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {}, {});
+ DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {}, {}, nullptr, 0);
ASSERT_EQ(strm.GetString(), " Name: foo\n"
" Size: 4 bytes (32 bits)");
}
TEST(DoDumpRegisterInfoTest, AltName) {
StreamString strm;
- DoDumpRegisterInfo(strm, "foo", "bar", 4, {}, {}, {});
+ DoDumpRegisterInfo(strm, "foo", "bar", 4, {}, {}, {}, nullptr, 0);
ASSERT_EQ(strm.GetString(), " Name: foo (bar)\n"
" Size: 4 bytes (32 bits)");
}
TEST(DoDumpRegisterInfoTest, Invalidates) {
StreamString strm;
- DoDumpRegisterInfo(strm, "foo", nullptr, 4, {"foo2"}, {}, {});
+ DoDumpRegisterInfo(strm, "foo", nullptr, 4, {"foo2"}, {}, {}, nullptr, 0);
ASSERT_EQ(strm.GetString(), " Name: foo\n"
" Size: 4 bytes (32 bits)\n"
"Invalidates: foo2");
strm.Clear();
- DoDumpRegisterInfo(strm, "foo", nullptr, 4, {"foo2", "foo3", "foo4"}, {}, {});
+ DoDumpRegisterInfo(strm, "foo", nullptr, 4, {"foo2", "foo3", "foo4"}, {}, {},
+ nullptr, 0);
ASSERT_EQ(strm.GetString(), " Name: foo\n"
" Size: 4 bytes (32 bits)\n"
"Invalidates: foo2, foo3, foo4");
TEST(DoDumpRegisterInfoTest, ReadFrom) {
StreamString strm;
- DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {"foo1"}, {});
+ DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {"foo1"}, {}, nullptr, 0);
ASSERT_EQ(strm.GetString(), " Name: foo\n"
" Size: 4 bytes (32 bits)\n"
" Read from: foo1");
strm.Clear();
- DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {"foo1", "foo2", "foo3"}, {});
+ DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {"foo1", "foo2", "foo3"}, {},
+ nullptr, 0);
ASSERT_EQ(strm.GetString(), " Name: foo\n"
" Size: 4 bytes (32 bits)\n"
" Read from: foo1, foo2, foo3");
TEST(DoDumpRegisterInfoTest, InSets) {
StreamString strm;
- DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {}, {{"set1", 101}});
+ DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {}, {{"set1", 101}}, nullptr,
+ 0);
ASSERT_EQ(strm.GetString(), " Name: foo\n"
" Size: 4 bytes (32 bits)\n"
" In sets: set1 (index 101)");
strm.Clear();
DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {},
- {{"set1", 0}, {"set2", 1}, {"set3", 2}});
+ {{"set1", 0}, {"set2", 1}, {"set3", 2}}, nullptr, 0);
ASSERT_EQ(strm.GetString(),
" Name: foo\n"
" Size: 4 bytes (32 bits)\n"
TEST(DoDumpRegisterInfoTest, MaxInfo) {
StreamString strm;
DoDumpRegisterInfo(strm, "foo", nullptr, 4, {"foo2", "foo3"},
- {"foo3", "foo4"}, {{"set1", 1}, {"set2", 2}});
+ {"foo3", "foo4"}, {{"set1", 1}, {"set2", 2}}, nullptr, 0);
ASSERT_EQ(strm.GetString(), " Name: foo\n"
" Size: 4 bytes (32 bits)\n"
"Invalidates: foo2, foo3\n"
" Read from: foo3, foo4\n"
" In sets: set1 (index 1), set2 (index 2)");
}
+
+TEST(DoDumpRegisterInfoTest, FieldsTable) {
+ // This is thoroughly tested in RegisterFlags itself, only checking the
+ // integration here.
+ StreamString strm;
+ RegisterFlags flags(
+ "", 4,
+ {RegisterFlags::Field("A", 24, 31), RegisterFlags::Field("B", 16, 23),
+ RegisterFlags::Field("C", 8, 15), RegisterFlags::Field("D", 0, 7)});
+
+ DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {}, {}, &flags, 100);
+ ASSERT_EQ(strm.GetString(), " Name: foo\n"
+ " Size: 4 bytes (32 bits)\n"
+ "\n"
+ "| 31-24 | 23-16 | 15-8 | 7-0 |\n"
+ "|-------|-------|------|-----|\n"
+ "| A | B | C | D |");
+}