aboutsummaryrefslogtreecommitdiff
path: root/lldb/bindings/interface/SBInstructionExtensions.i
blob: 8b4eda7ac5b99f0f2c53373c4d6b2ea565224bac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
STRING_EXTENSION_OUTSIDE(SBInstruction)

%extend lldb::SBInstruction {
#ifdef SWIGPYTHON
    %pythoncode %{
        def __hex__(self):
            """ Returns the address of the instruction. """
            return self.GetAddress()

        def __len__(self):
            """ Returns the size of the instruction. """
            return self.GetByteSize()

        def __mnemonic_property__ (self):
            return self.GetMnemonic (target)
        def __operands_property__ (self):
            return self.GetOperands (target)
        def __comment_property__ (self):
            return self.GetComment (target)
        def __file_addr_property__ (self):
            return self.GetAddress ().GetFileAddress()
        def __load_adrr_property__ (self):
            return self.GetComment (target)

        def variable_annotations(self):
            """Get variable annotations as a Python list of dictionaries.

            Returns:
                List of dictionaries, each containing variable annotation data
            """
            structured_data = self.GetVariableAnnotations()
            if not structured_data.IsValid():
                return []

            annotations = []
            for i in range(structured_data.GetSize()):
                item = structured_data.GetItemAtIndex(i)
                if item.GetType() != eStructuredDataTypeDictionary:
                    continue

                annotation = {}

                integer_fields = ['start_address', 'end_address', 'register_kind', 'decl_line']
                string_fields = ['variable_name', 'location_description', 'decl_file', 'type_name']

                for field in integer_fields:
                    value = item.GetValueForKey(field)
                    if value.IsValid():
                        annotation[field] = value.GetUnsignedIntegerValue()

                for field in string_fields:
                    value = item.GetValueForKey(field)
                    if value.IsValid():
                        annotation[field] = value.GetStringValue(1024)

                annotations.append(annotation)

            return annotations


        mnemonic = property(__mnemonic_property__, None, doc='''A read only property that returns the mnemonic for this instruction as a string.''')
        operands = property(__operands_property__, None, doc='''A read only property that returns the operands for this instruction as a string.''')
        comment = property(__comment_property__, None, doc='''A read only property that returns the comment for this instruction as a string.''')
        addr = property(GetAddress, None, doc='''A read only property that returns an lldb object that represents the address (lldb.SBAddress) for this instruction.''')
        size = property(GetByteSize, None, doc='''A read only property that returns the size in bytes for this instruction as an integer.''')
        is_branch = property(DoesBranch, None, doc='''A read only property that returns a boolean value that indicates if this instruction is a branch instruction.''')
    %}
#endif
}