|
from llvmlite.binding import ffi |
|
from ctypes import (c_bool, c_char_p, c_char, c_size_t, string_at, c_uint64, |
|
POINTER) |
|
|
|
|
|
class SectionIteratorRef(ffi.ObjectRef): |
|
def name(self): |
|
return ffi.lib.LLVMPY_GetSectionName(self) |
|
|
|
def is_text(self): |
|
return ffi.lib.LLVMPY_IsSectionText(self) |
|
|
|
def size(self): |
|
return ffi.lib.LLVMPY_GetSectionSize(self) |
|
|
|
def address(self): |
|
return ffi.lib.LLVMPY_GetSectionAddress(self) |
|
|
|
def data(self): |
|
return string_at(ffi.lib.LLVMPY_GetSectionContents(self), self.size()) |
|
|
|
def is_end(self, object_file): |
|
return ffi.lib.LLVMPY_IsSectionIteratorAtEnd(object_file, self) |
|
|
|
def next(self): |
|
ffi.lib.LLVMPY_MoveToNextSection(self) |
|
|
|
def _dispose(self): |
|
ffi.lib.LLVMPY_DisposeSectionIterator(self) |
|
|
|
|
|
class ObjectFileRef(ffi.ObjectRef): |
|
@classmethod |
|
def from_data(cls, data): |
|
return cls(ffi.lib.LLVMPY_CreateObjectFile(data, len(data))) |
|
|
|
@classmethod |
|
def from_path(cls, path): |
|
with open(path, 'rb') as f: |
|
data = f.read() |
|
return cls(ffi.lib.LLVMPY_CreateObjectFile(data, len(data))) |
|
|
|
def sections(self): |
|
it = SectionIteratorRef(ffi.lib.LLVMPY_GetSections(self)) |
|
while not it.is_end(self): |
|
yield it |
|
it.next() |
|
|
|
def _dispose(self): |
|
ffi.lib.LLVMPY_DisposeObjectFile(self) |
|
|
|
|
|
ffi.lib.LLVMPY_CreateObjectFile.argtypes = [c_char_p, c_size_t] |
|
ffi.lib.LLVMPY_CreateObjectFile.restype = ffi.LLVMObjectFileRef |
|
|
|
ffi.lib.LLVMPY_DisposeObjectFile.argtypes = [ffi.LLVMObjectFileRef] |
|
|
|
ffi.lib.LLVMPY_GetSections.argtypes = [ffi.LLVMObjectFileRef] |
|
ffi.lib.LLVMPY_GetSections.restype = ffi.LLVMSectionIteratorRef |
|
|
|
ffi.lib.LLVMPY_DisposeSectionIterator.argtypes = [ffi.LLVMSectionIteratorRef] |
|
|
|
ffi.lib.LLVMPY_MoveToNextSection.argtypes = [ffi.LLVMSectionIteratorRef] |
|
|
|
ffi.lib.LLVMPY_IsSectionIteratorAtEnd.argtypes = [ |
|
ffi.LLVMObjectFileRef, ffi.LLVMSectionIteratorRef] |
|
ffi.lib.LLVMPY_IsSectionIteratorAtEnd.restype = c_bool |
|
|
|
ffi.lib.LLVMPY_GetSectionName.argtypes = [ffi.LLVMSectionIteratorRef] |
|
ffi.lib.LLVMPY_GetSectionName.restype = c_char_p |
|
|
|
ffi.lib.LLVMPY_GetSectionSize.argtypes = [ffi.LLVMSectionIteratorRef] |
|
ffi.lib.LLVMPY_GetSectionSize.restype = c_uint64 |
|
|
|
ffi.lib.LLVMPY_GetSectionAddress.argtypes = [ffi.LLVMSectionIteratorRef] |
|
ffi.lib.LLVMPY_GetSectionAddress.restype = c_uint64 |
|
|
|
ffi.lib.LLVMPY_GetSectionContents.argtypes = [ffi.LLVMSectionIteratorRef] |
|
ffi.lib.LLVMPY_GetSectionContents.restype = POINTER(c_char) |
|
|
|
ffi.lib.LLVMPY_IsSectionText.argtypes = [ffi.LLVMSectionIteratorRef] |
|
ffi.lib.LLVMPY_IsSectionText.restype = c_bool |
|
|