1ba85f206SDavid Spickett //===-- DumpRegisterInfoTest.cpp ------------------------------------------===//
2ba85f206SDavid Spickett //
3ba85f206SDavid Spickett // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ba85f206SDavid Spickett // See https://llvm.org/LICENSE.txt for license information.
5ba85f206SDavid Spickett // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ba85f206SDavid Spickett //
7ba85f206SDavid Spickett //===----------------------------------------------------------------------===//
8ba85f206SDavid Spickett
9ba85f206SDavid Spickett #include "lldb/Core/DumpRegisterInfo.h"
10bcfe5a52SDavid Spickett #include "lldb/Target/RegisterFlags.h"
11ba85f206SDavid Spickett #include "lldb/Utility/StreamString.h"
12ba85f206SDavid Spickett #include "gtest/gtest.h"
13ba85f206SDavid Spickett
14ba85f206SDavid Spickett using namespace lldb_private;
15ba85f206SDavid Spickett
TEST(DoDumpRegisterInfoTest,MinimumInfo)16ba85f206SDavid Spickett TEST(DoDumpRegisterInfoTest, MinimumInfo) {
17ba85f206SDavid Spickett StreamString strm;
18bcfe5a52SDavid Spickett DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {}, {}, nullptr, 0);
19ba85f206SDavid Spickett ASSERT_EQ(strm.GetString(), " Name: foo\n"
20ba85f206SDavid Spickett " Size: 4 bytes (32 bits)");
21ba85f206SDavid Spickett }
22ba85f206SDavid Spickett
TEST(DoDumpRegisterInfoTest,AltName)23ba85f206SDavid Spickett TEST(DoDumpRegisterInfoTest, AltName) {
24ba85f206SDavid Spickett StreamString strm;
25bcfe5a52SDavid Spickett DoDumpRegisterInfo(strm, "foo", "bar", 4, {}, {}, {}, nullptr, 0);
26ba85f206SDavid Spickett ASSERT_EQ(strm.GetString(), " Name: foo (bar)\n"
27ba85f206SDavid Spickett " Size: 4 bytes (32 bits)");
28ba85f206SDavid Spickett }
29ba85f206SDavid Spickett
TEST(DoDumpRegisterInfoTest,Invalidates)30ba85f206SDavid Spickett TEST(DoDumpRegisterInfoTest, Invalidates) {
31ba85f206SDavid Spickett StreamString strm;
32bcfe5a52SDavid Spickett DoDumpRegisterInfo(strm, "foo", nullptr, 4, {"foo2"}, {}, {}, nullptr, 0);
33ba85f206SDavid Spickett ASSERT_EQ(strm.GetString(), " Name: foo\n"
34ba85f206SDavid Spickett " Size: 4 bytes (32 bits)\n"
35ba85f206SDavid Spickett "Invalidates: foo2");
36ba85f206SDavid Spickett
37ba85f206SDavid Spickett strm.Clear();
38bcfe5a52SDavid Spickett DoDumpRegisterInfo(strm, "foo", nullptr, 4, {"foo2", "foo3", "foo4"}, {}, {},
39bcfe5a52SDavid Spickett nullptr, 0);
40ba85f206SDavid Spickett ASSERT_EQ(strm.GetString(), " Name: foo\n"
41ba85f206SDavid Spickett " Size: 4 bytes (32 bits)\n"
42ba85f206SDavid Spickett "Invalidates: foo2, foo3, foo4");
43ba85f206SDavid Spickett }
44ba85f206SDavid Spickett
TEST(DoDumpRegisterInfoTest,ReadFrom)45ba85f206SDavid Spickett TEST(DoDumpRegisterInfoTest, ReadFrom) {
46ba85f206SDavid Spickett StreamString strm;
47bcfe5a52SDavid Spickett DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {"foo1"}, {}, nullptr, 0);
48ba85f206SDavid Spickett ASSERT_EQ(strm.GetString(), " Name: foo\n"
49ba85f206SDavid Spickett " Size: 4 bytes (32 bits)\n"
50ba85f206SDavid Spickett " Read from: foo1");
51ba85f206SDavid Spickett
52ba85f206SDavid Spickett strm.Clear();
53bcfe5a52SDavid Spickett DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {"foo1", "foo2", "foo3"}, {},
54bcfe5a52SDavid Spickett nullptr, 0);
55ba85f206SDavid Spickett ASSERT_EQ(strm.GetString(), " Name: foo\n"
56ba85f206SDavid Spickett " Size: 4 bytes (32 bits)\n"
57ba85f206SDavid Spickett " Read from: foo1, foo2, foo3");
58ba85f206SDavid Spickett }
59ba85f206SDavid Spickett
TEST(DoDumpRegisterInfoTest,InSets)60ba85f206SDavid Spickett TEST(DoDumpRegisterInfoTest, InSets) {
61ba85f206SDavid Spickett StreamString strm;
62bcfe5a52SDavid Spickett DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {}, {{"set1", 101}}, nullptr,
63bcfe5a52SDavid Spickett 0);
64ba85f206SDavid Spickett ASSERT_EQ(strm.GetString(), " Name: foo\n"
65ba85f206SDavid Spickett " Size: 4 bytes (32 bits)\n"
66ba85f206SDavid Spickett " In sets: set1 (index 101)");
67ba85f206SDavid Spickett
68ba85f206SDavid Spickett strm.Clear();
69ba85f206SDavid Spickett DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {},
70bcfe5a52SDavid Spickett {{"set1", 0}, {"set2", 1}, {"set3", 2}}, nullptr, 0);
71ba85f206SDavid Spickett ASSERT_EQ(strm.GetString(),
72ba85f206SDavid Spickett " Name: foo\n"
73ba85f206SDavid Spickett " Size: 4 bytes (32 bits)\n"
74ba85f206SDavid Spickett " In sets: set1 (index 0), set2 (index 1), set3 (index 2)");
75ba85f206SDavid Spickett }
76ba85f206SDavid Spickett
TEST(DoDumpRegisterInfoTest,MaxInfo)77ba85f206SDavid Spickett TEST(DoDumpRegisterInfoTest, MaxInfo) {
78ba85f206SDavid Spickett StreamString strm;
79ba85f206SDavid Spickett DoDumpRegisterInfo(strm, "foo", nullptr, 4, {"foo2", "foo3"},
80bcfe5a52SDavid Spickett {"foo3", "foo4"}, {{"set1", 1}, {"set2", 2}}, nullptr, 0);
81ba85f206SDavid Spickett ASSERT_EQ(strm.GetString(), " Name: foo\n"
82ba85f206SDavid Spickett " Size: 4 bytes (32 bits)\n"
83ba85f206SDavid Spickett "Invalidates: foo2, foo3\n"
84ba85f206SDavid Spickett " Read from: foo3, foo4\n"
85ba85f206SDavid Spickett " In sets: set1 (index 1), set2 (index 2)");
86ba85f206SDavid Spickett }
87bcfe5a52SDavid Spickett
TEST(DoDumpRegisterInfoTest,FieldsTable)88bcfe5a52SDavid Spickett TEST(DoDumpRegisterInfoTest, FieldsTable) {
89bcfe5a52SDavid Spickett // This is thoroughly tested in RegisterFlags itself, only checking the
90bcfe5a52SDavid Spickett // integration here.
91bcfe5a52SDavid Spickett StreamString strm;
92bcfe5a52SDavid Spickett RegisterFlags flags(
93bcfe5a52SDavid Spickett "", 4,
94bcfe5a52SDavid Spickett {RegisterFlags::Field("A", 24, 31), RegisterFlags::Field("B", 16, 23),
95bcfe5a52SDavid Spickett RegisterFlags::Field("C", 8, 15), RegisterFlags::Field("D", 0, 7)});
96bcfe5a52SDavid Spickett
97bcfe5a52SDavid Spickett DoDumpRegisterInfo(strm, "foo", nullptr, 4, {}, {}, {}, &flags, 100);
98bcfe5a52SDavid Spickett ASSERT_EQ(strm.GetString(), " Name: foo\n"
99bcfe5a52SDavid Spickett " Size: 4 bytes (32 bits)\n"
100bcfe5a52SDavid Spickett "\n"
101bcfe5a52SDavid Spickett "| 31-24 | 23-16 | 15-8 | 7-0 |\n"
102bcfe5a52SDavid Spickett "|-------|-------|------|-----|\n"
103bcfe5a52SDavid Spickett "| A | B | C | D |");
104bcfe5a52SDavid Spickett }
105*208a08c3SDavid Spickett
TEST(DoDumpRegisterInfoTest,Enumerators)106*208a08c3SDavid Spickett TEST(DoDumpRegisterInfoTest, Enumerators) {
107*208a08c3SDavid Spickett StreamString strm;
108*208a08c3SDavid Spickett
109*208a08c3SDavid Spickett FieldEnum enum_one("enum_one", {{0, "an_enumerator"}});
110*208a08c3SDavid Spickett FieldEnum enum_two("enum_two",
111*208a08c3SDavid Spickett {{1, "another_enumerator"}, {2, "another_enumerator_2"}});
112*208a08c3SDavid Spickett
113*208a08c3SDavid Spickett RegisterFlags flags("", 4,
114*208a08c3SDavid Spickett {RegisterFlags::Field("A", 24, 31, &enum_one),
115*208a08c3SDavid Spickett RegisterFlags::Field("B", 16, 23),
116*208a08c3SDavid Spickett RegisterFlags::Field("C", 8, 15, &enum_two)});
117*208a08c3SDavid Spickett
118*208a08c3SDavid Spickett DoDumpRegisterInfo(strm, "abc", nullptr, 4, {}, {}, {}, &flags, 100);
119*208a08c3SDavid Spickett ASSERT_EQ(strm.GetString(),
120*208a08c3SDavid Spickett " Name: abc\n"
121*208a08c3SDavid Spickett " Size: 4 bytes (32 bits)\n"
122*208a08c3SDavid Spickett "\n"
123*208a08c3SDavid Spickett "| 31-24 | 23-16 | 15-8 | 7-0 |\n"
124*208a08c3SDavid Spickett "|-------|-------|------|-----|\n"
125*208a08c3SDavid Spickett "| A | B | C | |\n"
126*208a08c3SDavid Spickett "\n"
127*208a08c3SDavid Spickett "A: 0 = an_enumerator\n"
128*208a08c3SDavid Spickett "\n"
129*208a08c3SDavid Spickett "C: 1 = another_enumerator, 2 = another_enumerator_2");
130*208a08c3SDavid Spickett }
131