Skip to content

Commit f3cd529

Browse files
authored
Add LLDB pretty printers for more types (#28344)
Adds new pretty printers for chapel types Notably, adds pretty printers for some chpl__hashtable based data structures like Set and Map and for distributed arrays like blockDist and cyclicDist. In this PR * Pretty printer for chpl__hashtable and chpl_TableEntry * Pretty printer for Set, based on chpl__hashtable pretty printer * Pretty printer for Map, based on chpl__hashtable pretty printer * Add a general pretty printer for arrays based on dsiAccess * Add a command to emulate gdb's `ptype` - [x] paratest [Reviewed by @dlongnecke-cray]
2 parents 1ef06e5 + 61ac5cc commit f3cd529

25 files changed

+1290
-65
lines changed

runtime/etc/debug/chpl_lldb_pretty_print.py

Lines changed: 508 additions & 49 deletions
Large diffs are not rendered by default.

test/llvm/debugInfo/lldb/EXECENV

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,9 @@
22

33
exec_name=$1
44

5-
echo "CHPL_RT_DEBUGGER_CMD_FILE=${exec_name}Commands.txt"
5+
cmd_file="${exec_name}Commands.txt"
6+
if [[ ("$CHPL_COMM" != 'none' || "$COMPOPTS" == *'--no-local'*) && -f "${exec_name}NoLocalCommands.txt" ]]; then
7+
cmd_file="${exec_name}NoLocalCommands.txt"
8+
fi
9+
echo "CHPL_RT_DEBUGGER_CMD_FILE=${cmd_file}"
10+

test/llvm/debugInfo/lldb/basicTypes.chpl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ proc main() {
8787
// CHECK-NOLOCAL-NEXT: }
8888

8989
// CHECK: p myRec2.myFieldF
90-
// CHECK-NEXT: (ChapelArray::[domain(1,int(64),one)] int(64)) [1..10] int(64)
90+
// CHECK-NEXT: ([domain(1,int(64),one)] int(64)) [1..10] int(64)
9191
// CHECK-NEXT: [1] = 0
9292
// CHECK-NEXT: [2] = 0
9393
// CHECK-NEXT: [3] = 0
@@ -119,7 +119,7 @@ proc main() {
119119
const myStr = "Hello, world!";
120120

121121
// CHECK: p myDom
122-
// CHECK-NEXT: (ChapelDomain::domain(2,int(64),positive)) {1..10 by 1, 1..10 by 2} {
122+
// CHECK-NEXT: (domain(2,int(64),positive)) {1..10 by 1, 1..10 by 2} {
123123
// CHECK-NEXT: dim = {
124124
// CHECK-NEXT: [0] = 1..10 by 1 {
125125
// CHECK-NEXT: low = 1
@@ -136,7 +136,7 @@ proc main() {
136136
const myDom = {1..10, 1..10 by 2};
137137

138138
// CHECK: p myArr2d
139-
// CHECK-NEXT: (ChapelArray::[domain(2,int(64),positive)] int(64)) [1..10 by 1, 1..10 by 2] int(64) {
139+
// CHECK-NEXT: ([domain(2,int(64),positive)] int(64)) [1..10 by 1, 1..10 by 2] int(64) {
140140
// CHECK-NEXT: [1,1] = 1
141141
// CHECK-NEXT: [2,1] = 6
142142
// CHECK-NEXT: [3,1] = 11
@@ -191,7 +191,7 @@ proc main() {
191191
const myArr2d: [myDom] int = reshape([i in 1..#myDom.size] i, myDom);
192192

193193
// CHECK: p myArr
194-
// CHECK-NEXT: (ChapelArray::[domain(1,int(64),one)] int(64)) [1..10] int(64) {
194+
// CHECK-NEXT: ([domain(1,int(64),one)] int(64)) [1..10] int(64) {
195195
// CHECK-NEXT: [1] = 1
196196
// CHECK-NEXT: [2] = 2
197197
// CHECK-NEXT: [3] = 3
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
use List, Set, Map;
2+
use BlockDist, CyclicDist;
3+
4+
5+
record myRecord {
6+
var x;
7+
var y: x.type;
8+
}
9+
proc myRecord.compute(s: x.type) {
10+
return x * s + y;
11+
}
12+
class MyClass {
13+
var a: int;
14+
var b: real;
15+
}
16+
17+
proc main() {
18+
19+
var myIntList = new list([1, 2, 3]);
20+
var myRecList = new list([new myRecord(1.1, 2.2), new myRecord(3.3, 4.4)]);
21+
var myStringSet = new set(string, ["a", "b", "c"]);
22+
var myMap = new map(int, real);
23+
myMap.add(1, 1.1);
24+
myMap.replace(1, 2.2);
25+
26+
var myArr = [i in 1..10] new shared MyClass(i, i*1.0);
27+
var myBlockDist = blockDist.createArray({1..#10}, owned MyClass?);
28+
myBlockDist =
29+
[i in myBlockDist.domain] if i & 1 then new MyClass?(i, i*1.0) else nil;
30+
var myCycDist = cyclicDist.createArray({1..#10, 1..#10}, int);
31+
myCycDist = [(i,j) in myCycDist.domain] i*20 + j;
32+
33+
writeln(myRecList.first.compute(2.0));
34+
writeln(myRecList);
35+
writeln(myBlockDist[1], myCycDist[1,1]);
36+
37+
use Debugger;
38+
breakpoint;
39+
}
40+
41+
42+
// CHECK: p myIntList
43+
// CHECK-NEXT: (List::list(int(64)
44+
// CHECK-SAME: size = 3
45+
// CHECK-NEXT: [0] = 1
46+
// CHECK-NEXT: [1] = 2
47+
// CHECK-NEXT: [2] = 3
48+
49+
// CHECK: p myRecList
50+
// CHECK-NEXT: (List::list(myRecord(real(64))
51+
// CHECK-SAME: size = 2
52+
// CHECK-NEXT: [0] = (x = 1.{{.*}}, y = 2.{{.*}})
53+
// CHECK-NEXT: [1] = (x = 3.{{.*}}, y = 4.{{.*}})
54+
55+
// CHECK: v myRecList[0]
56+
// CHECK: [0] = (x = 1.{{.*}}, y = 2.{{.*}})
57+
58+
// CHECK: p myRecList._getRef(1)
59+
// CHECK: (x = 3.{{.*}}, y = 4.{{.*}})
60+
61+
// CHECK: p myRecList._getRef(1).x
62+
// CHECK-NEXT: (real(64)) 3.
63+
64+
// CHECK: p myRecList._getRef(1).compute(4.0)
65+
// CHECK-NEXT: (real(64)) 17.6
66+
67+
// CHECK: p myRecList.first()
68+
// CHECK: (x = 1.{{.*}}, y = 2.{{.*}})
69+
70+
// CHECK: p myRecList.first().y
71+
// CHECK-NEXT: (real(64)) 2.
72+
73+
// CHECK: p myRecList.first().compute(3.0)
74+
// CHECK-NEXT: (real(64)) 5.5
75+
76+
// CHECK: p myStringSet
77+
// CHECK-NEXT: (Set::set(string
78+
// CHECK-SAME: size = 3
79+
// CHECK: [0] = "a"
80+
// CHECK: [1] = "c"
81+
// CHECK: [2] = "b"
82+
83+
// CHECK: p myMap
84+
// CHECK-NEXT: (Map::map(int(64),real(64)
85+
// CHECK-SAME: size = 1
86+
// CHECK-NEXT: [0] = (key = 1, val = 2.
87+
88+
// CHECK: e -- myMap.add(2, 17.8)
89+
// CHECK: p myMap
90+
// CHECK-NEXT: (Map::map(int(64),real(64)
91+
// CHECK-SAME: size = 2
92+
// CHECK-NEXT: [0] = (key = 1, val = 2.
93+
// CHECK: [1] = (key = 2, val = 17.
94+
95+
// CHECK: p myArr
96+
// CHECK: [1..10] shared MyClass
97+
// CHECK: [1] = 0x{{[0-9a-f]+}}
98+
// CHECK: a = 1
99+
// CHECK: [2] = 0x{{[0-9a-f]+}}
100+
// CHECK: a = 2
101+
// CHECK: [3] = 0x{{[0-9a-f]+}}
102+
// CHECK: a = 3
103+
// CHECK: [10] = 0x{{[0-9a-f]+}}
104+
// CHECK: a = 10
105+
106+
// CHECK: p myBlockDist
107+
// CHECK: owned MyClass?
108+
// CHECK: [1] = 0x{{[0-9a-f]+}}
109+
// CHECK: a = 1
110+
// CHECK: [2] = nil
111+
// CHECK: [3] = 0x{{[0-9a-f]+}}
112+
// CHECK: a = 3
113+
// CHECK: [4] = nil
114+
// CHECK: [5] = 0x{{[0-9a-f]+}}
115+
// CHECK: a = 5
116+
// CHECK: [6] = nil
117+
// CHECK: [7] = 0x{{[0-9a-f]+}}
118+
// CHECK: a = 7
119+
// CHECK: [8] = nil
120+
// CHECK: [9] = 0x{{[0-9a-f]+}}
121+
// CHECK: a = 9
122+
// CHECK: [10] = nil
123+
124+
// CHECK: p myCycDist
125+
// CHECK: int(64)
126+
// CHECK: [1,1] = 21
127+
// CHECK: [2,1] = 41
128+
// CHECK: [10,1] = 201
129+
// CHECK: [1,10] = 30
130+
// CHECK: [10,10] = 210
131+

test/llvm/debugInfo/lldb/inspectAggregates.good

Whitespace-only changes.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/usr/bin/env bash
2+
3+
TESTNAME=$1
4+
OUTFILE=$2
5+
6+
$CHPL_HOME/test/llvm/RunFileCheck "$TESTNAME" "$OUTFILE"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
COMPOPTS <= --no-local
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
r
2+
3+
p myIntList
4+
5+
p myRecList
6+
v myRecList[0]
7+
p myRecList._getRef(1)
8+
p myRecList._getRef(1).x
9+
p myRecList._getRef(1).compute(4.0)
10+
p myRecList.first()
11+
p myRecList.first().y
12+
p myRecList.first().compute(3.0)
13+
14+
p myStringSet
15+
16+
p myMap
17+
e -- myMap.add(2, 17.8)
18+
p myMap
19+
20+
p myArr
21+
p myBlockDist
22+
p myCycDist
23+
24+
q
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
use List;
2+
use Debugger;
3+
4+
record myRec {
5+
var x: int;
6+
var y: real;
7+
}
8+
class MyClass {
9+
var a: int;
10+
var b: real;
11+
}
12+
13+
proc createList(type listTy, in v1, in v2, in v3) {
14+
var myList = new listTy();
15+
myList.pushBack(v1);
16+
myList.pushBack(v2);
17+
myList.pushBack(v3);
18+
return myList;
19+
}
20+
21+
proc main() {
22+
var myIntList = createList(list(int), 1, 2, 3);
23+
writeln("Integer List: ", myIntList);
24+
breakpoint;
25+
writeln("Integer List Again: ", myIntList);
26+
27+
var myRealList = createList(list(real, false), 1.1, 2.2, 3.3);
28+
writeln("Real List: ", myRealList);
29+
breakpoint;
30+
writeln("Real List Again: ", myRealList);
31+
32+
var myRecList = createList(list(myRec, true),
33+
new myRec(10, 20.5),
34+
new myRec(30, 40.5),
35+
new myRec(50, 60.5));
36+
writeln("Record List: ", myRecList);
37+
breakpoint;
38+
writeln("Record List Again: ", myRecList);
39+
40+
var myStrList = createList(list(string), "one", "two", "three");
41+
writeln("String List: ", myStrList);
42+
breakpoint;
43+
writeln("String List Again: ", myStrList);
44+
45+
46+
var myOwnedClassList = createList(list(owned MyClass?, true),
47+
new MyClass(1, 1.1),
48+
nil,
49+
new MyClass(3, 3.3));
50+
writeln("Class List: ", myOwnedClassList);
51+
breakpoint;
52+
writeln("Class List Again: ", myOwnedClassList);
53+
54+
55+
var myClassList = createList(list(unmanaged MyClass?),
56+
new unmanaged MyClass(1, 1.1),
57+
nil,
58+
new unmanaged MyClass(3, 3.3));
59+
writeln("Class List: ", myClassList);
60+
breakpoint;
61+
writeln("Class List Again: ", myClassList);
62+
}
63+
64+
65+
// CHECK: p myIntList
66+
// CHECK-NEXT: (List::list(int(64)
67+
// CHECK-SAME: size = 3
68+
// CHECK-NEXT: [0] = 1
69+
// CHECK-NEXT: [1] = 2
70+
// CHECK-NEXT: [2] = 3
71+
72+
// CHECK: v myIntList[1]
73+
// CHECK-NEXT: (int(64)) [1] = 2
74+
75+
// CHECK: e -- myIntList.pushBack(8)
76+
// CHECK: p myIntList
77+
// CHECK-NEXT: (List::list(int(64)
78+
// CHECK-SAME: size = 4
79+
// CHECK-NEXT: [0] = 1
80+
// CHECK-NEXT: [1] = 2
81+
// CHECK-NEXT: [2] = 3
82+
// CHECK-NEXT: [3] = 8
83+
// CHECK: Integer List Again: [1, 2, 3, 8]
84+
85+
// CHECK: p myRealList
86+
// CHECK-NEXT: (List::list(real(64)
87+
// CHECK-SAME: size = 3
88+
// CHECK-NEXT: [0] = 1.
89+
// CHECK-NEXT: [1] = 2.
90+
// CHECK-NEXT: [2] = 3.
91+
92+
// CHECK: v myRealList[1]
93+
// CHECK-NEXT: (real(64)) [1] = 2.
94+
95+
// CHECK: e -- myRealList.pushBack(8.8)
96+
// CHECK: p myRealList
97+
// CHECK-NEXT: (List::list(real(64)
98+
// CHECK-SAME: size = 4
99+
// CHECK-NEXT: [0] = 1.
100+
// CHECK-NEXT: [1] = 2.
101+
// CHECK-NEXT: [2] = 3.
102+
// CHECK-NEXT: [3] = 8.
103+
// CHECK: Real List Again: [1.1, 2.2, 3.3, 8.8]
104+
105+
// CHECK: p myRecList
106+
// CHECK-NEXT: (List::list(myRec
107+
// CHECK-SAME: size = 3
108+
// CHECK-NEXT: [0] = (x = 10, y = 20.5)
109+
// CHECK-NEXT: [1] = (x = 30, y = 40.5)
110+
// CHECK-NEXT: [2] = (x = 50, y = 60.5)
111+
112+
// CHECK: v myRecList[2]
113+
// CHECK-NEXT: [2] = (x = 50, y = 60.5)
114+
115+
// CHECK: v myRecList[2].y
116+
// CHECK-NEXT: 60.5
117+
118+
// CHECK: p myStrList
119+
// CHECK-NEXT: (List::list(string
120+
// CHECK-SAME: size = 3
121+
// CHECK: [0] = "one"
122+
// CHECK: [1] = "two"
123+
// CHECK: [2] = "three"
124+
125+
// CHECK: v myStrList[0]
126+
// CHECK-NEXT: (string) [0] = "one"
127+
128+
129+
// CHECK: p myOwnedClassList
130+
// CHECK-NEXT: (List::list(owned MyClass?
131+
// CHECK-SAME: size = 3
132+
// CHECK: [0] = 0x{{[0-9a-f]+}}
133+
// CHECK: [1] = nil
134+
// CHECK: [2] = 0x[[OWNED_CLASS_2_ADDR:[0-9a-f]+]]
135+
136+
// CHECK: v myOwnedClassList[2]
137+
// CHECK-NEXT: (owned MyClass?) [2] = 0x[[OWNED_CLASS_2_ADDR]]
138+
139+
// CHECK: v myOwnedClassList[2].b
140+
// CHECK-NEXT: b = 3.
141+
142+
// CHECK: p myClassList
143+
// CHECK-NEXT: (List::list(unmanaged MyClass?
144+
// CHECK-SAME: size = 3
145+
// CHECK: [0] = 0x{{[0-9a-f]+}}
146+
// CHECK: [1] = n
147+
// CHECK: [2] = 0x{{[0-9a-f]+}}
148+
149+
// CHECK: v myClassList[2]
150+
// CHECK-NEXT: [2] = 0x{{[0-9a-f]+}}
151+
// CHECK: v myClassList[2]->b
152+
// CHECK-NEXT: b = 3.
153+

test/llvm/debugInfo/lldb/lists.good

Whitespace-only changes.

0 commit comments

Comments
 (0)