OrcJIT: Try to appease msc18 to add move constructor in FullyPartitionedModule .
[oota-llvm.git] / utils / lldbDataFormatters.py
1 """
2 LLDB Formatters for LLVM data types.
3
4 Load into LLDB with 'command script import /path/to/lldbDataFormatters.py'
5 """
6
7 def __lldb_init_module(debugger, internal_dict):
8     debugger.HandleCommand('type category define -e llvm -l c++')
9     debugger.HandleCommand('type synthetic add -w llvm '
10                            '-l lldbDataFormatters.SmallVectorSynthProvider '
11                            '-x "^llvm::SmallVectorImpl<.+>$"')
12     debugger.HandleCommand('type synthetic add -w llvm '
13                            '-l lldbDataFormatters.SmallVectorSynthProvider '
14                            '-x "^llvm::SmallVector<.+,.+>$"')
15     debugger.HandleCommand('type synthetic add -w llvm '
16                            '-l lldbDataFormatters.ArrayRefSynthProvider '
17                            '-x "^llvm::ArrayRef<.+>$"')
18
19 # Pretty printer for llvm::SmallVector/llvm::SmallVectorImpl
20 class SmallVectorSynthProvider:
21     def __init__(self, valobj, dict):
22         self.valobj = valobj;
23         self.update() # initialize this provider
24
25     def num_children(self):
26         begin = self.begin.GetValueAsUnsigned(0)
27         end = self.end.GetValueAsUnsigned(0)
28         return (end - begin)/self.type_size
29
30     def get_child_index(self, name):
31         try:
32             return int(name.lstrip('[').rstrip(']'))
33         except:
34             return -1;
35
36     def get_child_at_index(self, index):
37         # Do bounds checking.
38         if index < 0:
39             return None
40         if index >= self.num_children():
41             return None;
42
43         offset = index * self.type_size
44         return self.begin.CreateChildAtOffset('['+str(index)+']',
45                                               offset, self.data_type)
46
47     def update(self):
48         self.begin = self.valobj.GetChildMemberWithName('BeginX')
49         self.end = self.valobj.GetChildMemberWithName('EndX')
50         the_type = self.valobj.GetType()
51         # If this is a reference type we have to dereference it to get to the
52         # template parameter.
53         if the_type.IsReferenceType():
54             the_type = the_type.GetDereferencedType()
55
56         self.data_type = the_type.GetTemplateArgumentType(0)
57         self.type_size = self.data_type.GetByteSize()
58         assert self.type_size != 0
59
60 class ArrayRefSynthProvider:
61     """ Provider for llvm::ArrayRef """
62     def __init__(self, valobj, dict):
63         self.valobj = valobj;
64         self.update() # initialize this provider
65
66     def num_children(self):
67         return self.length
68
69     def get_child_index(self, name):
70         try:
71             return int(name.lstrip('[').rstrip(']'))
72         except:
73             return -1;
74
75     def get_child_at_index(self, index):
76         if index < 0 or index >= self.num_children():
77             return None;
78         offset = index * self.type_size
79         return self.data.CreateChildAtOffset('[' + str(index) + ']',
80                                              offset, self.data_type)
81
82     def update(self):
83         self.data = self.valobj.GetChildMemberWithName('Data')
84         length_obj = self.valobj.GetChildMemberWithName('Length')
85         self.length = length_obj.GetValueAsUnsigned(0)
86         self.data_type = self.data.GetType().GetPointeeType()
87         self.type_size = self.data_type.GetByteSize()
88         assert self.type_size != 0