object.py revision 07c32218f448b7637d4acad8e87ce7cfaef0277e
1#===- object.py - Python Object Bindings --------------------*- python -*--===#
2#
3#                     The LLVM Compiler Infrastructure
4#
5# This file is distributed under the University of Illinois Open Source
6# License. See LICENSE.TXT for details.
7#
8#===------------------------------------------------------------------------===#
9
10from ctypes import c_char_p
11from ctypes import c_uint64
12from ctypes import c_void_p
13
14from .common import LLVMObject
15from .common import get_library
16from .core import MemoryBuffer
17
18__all__ = [
19    "lib",
20    "ObjectFile",
21    "Relocation",
22    "Section",
23    "Symbol",
24]
25
26class ObjectFile(object):
27    """Represents an object/binary file."""
28
29    def __init__(self, filename=None, contents=None):
30        """Construct an instance from a filename or binary data.
31
32        filename must be a path to a file that can be opened with open().
33        contents can be either a native Python buffer type (like str) or a
34        llvm.core.MemoryBuffer instance.
35        """
36        if contents:
37            assert isinstance(contents, MemoryBuffer)
38
39        if filename is not None:
40            contents = MemoryBuffer(filename=filename)
41
42        self._memory = contents
43        self._obj = lib.LLVMCreateObjectFile(contents)
44        contents.release_ownership()
45        self._as_parameter_ = self._obj
46
47    def __del__(self):
48        lib.LLVMDisposeObjectFile(self)
49
50    def from_param(self):
51        return self._as_parameter_
52
53    def get_sections(self):
54        """Obtain the sections in this object file.
55
56        This is an iterator for llvm.object.Section instances.
57        """
58        pass
59
60    def get_symbols(self):
61        """Obtain the symbols in this object file.
62
63        This is an iterator for llvm.object.Symbol instances.
64        """
65
66class Section(object):
67    """Represents a section in an object file."""
68
69    def __init__(self, obj=None):
70        """Construct a new section instance.
71
72        Section instances can currently only be created from an ObjectFile
73        instance. Therefore, this constructor should not be used outside of
74        this module.
75        """
76        pass
77
78    def __del__(self):
79        pass
80
81    @property
82    def name(self):
83        pass
84
85    @property
86    def size(self):
87        pass
88
89    @property
90    def contents(self):
91        pass
92
93    @property
94    def address(self):
95        pass
96
97    # TODO consider exposing more Pythonic interface, like __contains__
98    def has_symbol(self, symbol):
99        pass
100
101    def get_relocations(self):
102        pass
103
104class Symbol(object):
105    def __init__(self):
106        pass
107
108    @property
109    def name(self):
110        pass
111
112    @property
113    def address(self):
114        pass
115
116    @property
117    def file_offset(self):
118        pass
119
120    @property
121    def size(self):
122        pass
123
124class Relocation(object):
125    def __init__(self):
126        pass
127
128    @property
129    def address(self):
130        pass
131
132    @property
133    def offset(self):
134        pass
135
136    @property
137    def symbol(self):
138        pass
139
140    @property
141    def type(self):
142        pass
143
144    @property
145    def type_name(self):
146        pass
147
148    @property
149    def value_string(self):
150        pass
151
152SectionIteratorRef = c_void_p
153SymbolIteratorRef = c_void_p
154RelocationIteratorRef = c_void_p
155
156def register_library(library):
157    """Register function prototypes with LLVM library instance."""
158
159    # Object.h functions
160    library.LLVMCreateObjectFile.argtypes = [MemoryBuffer]
161    library.LLVMCreateObjectFile.restype = LLVMObject
162
163    library.LLVMDisposeObjectFile.argtypes = [ObjectFile]
164
165    library.LLVMGetSections.argtypes = [ObjectFile]
166    library.LLVMGetSections.restype = SectionIteratorRef
167
168    library.LLVMDisposeSectionIterator.argtypes = [SectionIteratorRef]
169
170    library.LLVMIsSectionIteratorAtEnd.argtypes = [ObjectFile,
171            SectionIteratorRef]
172    library.LLVMIsSectionIteratorAtEnd.restype = bool
173
174    library.LLVMMoveToNextSection.argtypes = [SectionIteratorRef]
175
176    library.LLVMMoveToContainingSection.argtypes = [SectionIteratorRef,
177            SymbolIteratorRef]
178
179    library.LLVMGetSymbols.argtypes = [ObjectFile]
180    library.LLVMGetSymbols.restype = SymbolIteratorRef
181
182    library.LLVMDisposeSymbolIterator.argtypes = [SymbolIteratorRef]
183
184    library.LLVMIsSymbolIteratorAtEnd.argtypes = [ObjectFile,
185            SymbolIteratorRef]
186    library.LLVMIsSymbolIteratorAtEnd.restype = bool
187
188    library.LLVMMoveToNextSymbol.argtypes = [SymbolIteratorRef]
189
190    library.LLVMGetSectionName.argtypes = [SectionIteratorRef]
191    library.LLVMGetSectionName.restype = c_char_p
192
193    library.LLVMGetSectionSize.argtypes = [SectionIteratorRef]
194    library.LLVMGetSectionSize.restype = c_uint64
195
196    library.LLVMGetSectionContents.argtypes = [SectionIteratorRef]
197    library.LLVMGetSectionContents.restype = c_char_p
198
199    library.LLVMGetSectionAddress.argtypes = [SectionIteratorRef]
200    library.LLVMGetSectionAddress.restype = c_uint64
201
202    library.LLVMGetSectionContainsSymbol.argtypes = [SectionIteratorRef,
203            SymbolIteratorRef]
204    library.LLVMGetSectionContainsSymbol.restype = bool
205
206    library.LLVMGetRelocations.argtypes = [SectionIteratorRef]
207    library.LLVMGetRelocations.restype = RelocationIteratorRef
208
209    library.LLVMDisposeRelocationIterator.argtypes = [RelocationIteratorRef]
210
211    library.LLVMIsRelocationIteratorAtEnd.argtypes = [SectionIteratorRef,
212            RelocationIteratorRef]
213    library.LLVMIsRelocationIteratorAtEnd.restype = bool
214
215    library.LLVMMoveToNextRelocation.argtypes = [RelocationIteratorRef]
216
217    library.LLVMGetSymbolName.argtypes = [SymbolIteratorRef]
218    library.LLVMGetSymbolName.restype = c_char_p
219
220    library.LLVMGetSymbolAddress.argtypes = [SymbolIteratorRef]
221    library.LLVMGetSymbolAddress.restype = c_uint64
222
223    library.LLVMGetSymbolFileOffset.argtypes = [SymbolIteratorRef]
224    library.LLVMGetSymbolFileOffset.restype = c_uint64
225
226    library.LLVMGetSymbolSize.argtypes = [SymbolIteratorRef]
227    library.LLVMGetSymbolSize.restype = c_uint64
228
229    library.LLVMGetRelocationAddress.argtypes = [SymbolIteratorRef]
230    library.LLVMGetRelocationAddress.restype = c_uint64
231
232    library.LLVMGetRelocationOffset.argtypes = [RelocationIteratorRef]
233    library.LLVMGetRelocationOffset.restype = c_uint64
234
235    library.LLVMGetRelocationSymbol.argtypes = [RelocationIteratorRef]
236    library.LLVMGetRelocationSymbol.restype = SymbolIteratorRef
237
238    library.LLVMGetRelocationType.argtypes = [RelocationIteratorRef]
239    library.LLVMGetRelocationType.restype = c_uint64
240
241    library.LLVMGetRelocationTypeName.argtypes = [RelocationIteratorRef]
242    library.LLVMGetRelocationTypeName.restype = c_char_p
243
244    library.LLVMGetRelocationValueString.argtypes = [RelocationIteratorRef]
245    library.LLVMGetRelocationValueString.restype = c_char_p
246
247lib = get_library()
248register_library(lib)
249