Skip to content

Commit aaa575d

Browse files
[SYCL] Move pretty-printers from the GDB repository (#2174)
Similar to xmethods, pretty-printing scripts should be distributed together with a matching runtmime library to ensure it stays in sync. Directory names have been adjusted to make them more generic.
1 parent 728429a commit aaa575d

File tree

5 files changed

+108
-1
lines changed

5 files changed

+108
-1
lines changed

sycl/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ add_subdirectory( source )
248248
# Auxilliary extras for SYCL headers/library
249249
if (NOT WIN32)
250250
install(FILES
251-
"${CMAKE_CURRENT_SOURCE_DIR}/xmethods/libsycl.so-gdb.py"
251+
"${CMAKE_CURRENT_SOURCE_DIR}/gdb/libsycl.so-gdb.py"
252252
RENAME "libsycl.so.${SYCL_VERSION_STRING}-gdb.py"
253253
DESTINATION "lib${LLVM_LIBDIR_SUFFIX}/"
254254
COMPONENT sycl-headers-extras)

sycl/xmethods/libsycl.so-gdb.py renamed to sycl/gdb/libsycl.so-gdb.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@
22
# See https://llvm.org/LICENSE.txt for license information.
33
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

5+
import gdb
56
import gdb.xmethod
7+
import gdb.printing
8+
import itertools
69
import re
710

11+
### XMethod implementations ###
12+
813
"""
914
Generalized base class for buffer index calculation
1015
"""
@@ -134,3 +139,86 @@ def match(self, class_type, method_name):
134139

135140

136141
gdb.xmethod.register_xmethod_matcher(None, AccessorOpIndexMatcher(), replace=True)
142+
143+
### Pretty-printer implementations ###
144+
145+
"""
146+
Print an object deriving from cl::sycl::detail::array
147+
"""
148+
class SyclArrayPrinter:
149+
class ElementIterator:
150+
def __init__(self, data, size):
151+
self.data = data
152+
self.size = size
153+
self.count = 0
154+
155+
def __iter__(self):
156+
return self
157+
158+
def __next__(self):
159+
if self.count == self.size:
160+
raise StopIteration
161+
count = self.count
162+
self.count = self.count + 1
163+
try:
164+
elt = self.data[count]
165+
except:
166+
elt = "<error reading variable>"
167+
return ('[%d]' % count, elt)
168+
169+
def __init__(self, value):
170+
if value.type.code == gdb.TYPE_CODE_REF:
171+
if hasattr(gdb.Value,"referenced_value"):
172+
value = value.referenced_value()
173+
174+
self.value = value
175+
self.type = value.type.unqualified().strip_typedefs()
176+
self.dimensions = self.type.template_argument(0)
177+
178+
def children(self):
179+
try:
180+
return self.ElementIterator(self.value['common_array'], self.dimensions)
181+
except:
182+
# There is no way to return an error from this method. Return an
183+
# empty iterable to make GDB happy and rely on to_string method
184+
# to take care of formatting.
185+
return [ ]
186+
187+
def to_string(self):
188+
try:
189+
# Check if accessing array value will succeed and resort to
190+
# error message otherwise. Individual array element access failures
191+
# will be caught by iterator itself.
192+
_ = self.value['common_array']
193+
return self.type.tag
194+
except:
195+
return "<error reading variable>"
196+
197+
def display_hint(self):
198+
return 'array'
199+
200+
"""
201+
Print a cl::sycl::buffer
202+
"""
203+
class SyclBufferPrinter:
204+
def __init__(self, value):
205+
self.value = value
206+
self.type = value.type.unqualified().strip_typedefs()
207+
self.elt_type = value.type.template_argument(0)
208+
self.dimensions = value.type.template_argument(1)
209+
self.typeregex = re.compile('^([a-zA-Z0-9_:]+)(<.*>)?$')
210+
211+
def to_string(self):
212+
match = self.typeregex.match(self.type.tag)
213+
if not match:
214+
return "<error parsing type>"
215+
return ('%s<%s, %s> = {impl=%s}'
216+
% (match.group(1), self.elt_type, self.dimensions,
217+
self.value['impl'].address))
218+
219+
sycl_printer = gdb.printing.RegexpCollectionPrettyPrinter("SYCL")
220+
sycl_printer.add_printer("cl::sycl::id", '^cl::sycl::id<.*$', SyclArrayPrinter)
221+
sycl_printer.add_printer("cl::sycl::range", '^cl::sycl::range<.*$', SyclArrayPrinter)
222+
sycl_printer.add_printer("cl::sycl::buffer", '^cl::sycl::buffer<.*$', SyclBufferPrinter)
223+
gdb.printing.register_pretty_printer(None, sycl_printer, True)
224+
File renamed without changes.

sycl/test/gdb/printers.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// RUN: %clangxx -c -fno-color-diagnostics -I %sycl_include -Xclang -ast-dump %s | FileCheck %s
2+
// UNSUPPORTED: windows
3+
#include <CL/sycl/buffer.hpp>
4+
#include <CL/sycl/detail/array.hpp>
5+
6+
typedef cl::sycl::id<1> dummy_id;
7+
typedef cl::sycl::buffer<int> dummy_buffer;
8+
9+
// array must have common_array field
10+
11+
// CHECK: CXXRecordDecl {{.*}} class array definition
12+
// CHECK-NOT: CXXRecordDecl {{.*}} definition
13+
// CHECK: FieldDecl {{.*}} referenced common_array
14+
15+
// buffer must have impl field
16+
17+
// CHECK: CXXRecordDecl {{.*}} class buffer definition
18+
// CHECK-NOT: CXXRecordDecl {{.*}} definition
19+
// CHECK: FieldDecl {{.*}} referenced impl

0 commit comments

Comments
 (0)