mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-11 11:34:02 +00:00
Previous code had a double free in MemoryBuffer. The tests now pass. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152422 91177308-0d34-0410-b5e6-96231b3b80d8
249 lines
6.6 KiB
Python
249 lines
6.6 KiB
Python
#===- object.py - Python Object Bindings --------------------*- python -*--===#
|
|
#
|
|
# The LLVM Compiler Infrastructure
|
|
#
|
|
# This file is distributed under the University of Illinois Open Source
|
|
# License. See LICENSE.TXT for details.
|
|
#
|
|
#===------------------------------------------------------------------------===#
|
|
|
|
from ctypes import c_char_p
|
|
from ctypes import c_uint64
|
|
from ctypes import c_void_p
|
|
|
|
from .common import LLVMObject
|
|
from .common import get_library
|
|
from .core import MemoryBuffer
|
|
|
|
__all__ = [
|
|
"lib",
|
|
"ObjectFile",
|
|
"Relocation",
|
|
"Section",
|
|
"Symbol",
|
|
]
|
|
|
|
class ObjectFile(object):
|
|
"""Represents an object/binary file."""
|
|
|
|
def __init__(self, filename=None, contents=None):
|
|
"""Construct an instance from a filename or binary data.
|
|
|
|
filename must be a path to a file that can be opened with open().
|
|
contents can be either a native Python buffer type (like str) or a
|
|
llvm.core.MemoryBuffer instance.
|
|
"""
|
|
if contents:
|
|
assert isinstance(contents, MemoryBuffer)
|
|
|
|
if filename is not None:
|
|
contents = MemoryBuffer(filename=filename)
|
|
|
|
self._memory = contents
|
|
self._obj = lib.LLVMCreateObjectFile(contents)
|
|
contents.release_ownership()
|
|
self._as_parameter_ = self._obj
|
|
|
|
def __del__(self):
|
|
lib.LLVMDisposeObjectFile(self)
|
|
|
|
def from_param(self):
|
|
return self._as_parameter_
|
|
|
|
def get_sections(self):
|
|
"""Obtain the sections in this object file.
|
|
|
|
This is an iterator for llvm.object.Section instances.
|
|
"""
|
|
pass
|
|
|
|
def get_symbols(self):
|
|
"""Obtain the symbols in this object file.
|
|
|
|
This is an iterator for llvm.object.Symbol instances.
|
|
"""
|
|
|
|
class Section(object):
|
|
"""Represents a section in an object file."""
|
|
|
|
def __init__(self, obj=None):
|
|
"""Construct a new section instance.
|
|
|
|
Section instances can currently only be created from an ObjectFile
|
|
instance. Therefore, this constructor should not be used outside of
|
|
this module.
|
|
"""
|
|
pass
|
|
|
|
def __del__(self):
|
|
pass
|
|
|
|
@property
|
|
def name(self):
|
|
pass
|
|
|
|
@property
|
|
def size(self):
|
|
pass
|
|
|
|
@property
|
|
def contents(self):
|
|
pass
|
|
|
|
@property
|
|
def address(self):
|
|
pass
|
|
|
|
# TODO consider exposing more Pythonic interface, like __contains__
|
|
def has_symbol(self, symbol):
|
|
pass
|
|
|
|
def get_relocations(self):
|
|
pass
|
|
|
|
class Symbol(object):
|
|
def __init__(self):
|
|
pass
|
|
|
|
@property
|
|
def name(self):
|
|
pass
|
|
|
|
@property
|
|
def address(self):
|
|
pass
|
|
|
|
@property
|
|
def file_offset(self):
|
|
pass
|
|
|
|
@property
|
|
def size(self):
|
|
pass
|
|
|
|
class Relocation(object):
|
|
def __init__(self):
|
|
pass
|
|
|
|
@property
|
|
def address(self):
|
|
pass
|
|
|
|
@property
|
|
def offset(self):
|
|
pass
|
|
|
|
@property
|
|
def symbol(self):
|
|
pass
|
|
|
|
@property
|
|
def type(self):
|
|
pass
|
|
|
|
@property
|
|
def type_name(self):
|
|
pass
|
|
|
|
@property
|
|
def value_string(self):
|
|
pass
|
|
|
|
SectionIteratorRef = c_void_p
|
|
SymbolIteratorRef = c_void_p
|
|
RelocationIteratorRef = c_void_p
|
|
|
|
def register_library(library):
|
|
"""Register function prototypes with LLVM library instance."""
|
|
|
|
# Object.h functions
|
|
library.LLVMCreateObjectFile.argtypes = [MemoryBuffer]
|
|
library.LLVMCreateObjectFile.restype = LLVMObject
|
|
|
|
library.LLVMDisposeObjectFile.argtypes = [ObjectFile]
|
|
|
|
library.LLVMGetSections.argtypes = [ObjectFile]
|
|
library.LLVMGetSections.restype = SectionIteratorRef
|
|
|
|
library.LLVMDisposeSectionIterator.argtypes = [SectionIteratorRef]
|
|
|
|
library.LLVMIsSectionIteratorAtEnd.argtypes = [ObjectFile,
|
|
SectionIteratorRef]
|
|
library.LLVMIsSectionIteratorAtEnd.restype = bool
|
|
|
|
library.LLVMMoveToNextSection.argtypes = [SectionIteratorRef]
|
|
|
|
library.LLVMMoveToContainingSection.argtypes = [SectionIteratorRef,
|
|
SymbolIteratorRef]
|
|
|
|
library.LLVMGetSymbols.argtypes = [ObjectFile]
|
|
library.LLVMGetSymbols.restype = SymbolIteratorRef
|
|
|
|
library.LLVMDisposeSymbolIterator.argtypes = [SymbolIteratorRef]
|
|
|
|
library.LLVMIsSymbolIteratorAtEnd.argtypes = [ObjectFile,
|
|
SymbolIteratorRef]
|
|
library.LLVMIsSymbolIteratorAtEnd.restype = bool
|
|
|
|
library.LLVMMoveToNextSymbol.argtypes = [SymbolIteratorRef]
|
|
|
|
library.LLVMGetSectionName.argtypes = [SectionIteratorRef]
|
|
library.LLVMGetSectionName.restype = c_char_p
|
|
|
|
library.LLVMGetSectionSize.argtypes = [SectionIteratorRef]
|
|
library.LLVMGetSectionSize.restype = c_uint64
|
|
|
|
library.LLVMGetSectionContents.argtypes = [SectionIteratorRef]
|
|
library.LLVMGetSectionContents.restype = c_char_p
|
|
|
|
library.LLVMGetSectionAddress.argtypes = [SectionIteratorRef]
|
|
library.LLVMGetSectionAddress.restype = c_uint64
|
|
|
|
library.LLVMGetSectionContainsSymbol.argtypes = [SectionIteratorRef,
|
|
SymbolIteratorRef]
|
|
library.LLVMGetSectionContainsSymbol.restype = bool
|
|
|
|
library.LLVMGetRelocations.argtypes = [SectionIteratorRef]
|
|
library.LLVMGetRelocations.restype = RelocationIteratorRef
|
|
|
|
library.LLVMDisposeRelocationIterator.argtypes = [RelocationIteratorRef]
|
|
|
|
library.LLVMIsRelocationIteratorAtEnd.argtypes = [SectionIteratorRef,
|
|
RelocationIteratorRef]
|
|
library.LLVMIsRelocationIteratorAtEnd.restype = bool
|
|
|
|
library.LLVMMoveToNextRelocation.argtypes = [RelocationIteratorRef]
|
|
|
|
library.LLVMGetSymbolName.argtypes = [SymbolIteratorRef]
|
|
library.LLVMGetSymbolName.restype = c_char_p
|
|
|
|
library.LLVMGetSymbolAddress.argtypes = [SymbolIteratorRef]
|
|
library.LLVMGetSymbolAddress.restype = c_uint64
|
|
|
|
library.LLVMGetSymbolFileOffset.argtypes = [SymbolIteratorRef]
|
|
library.LLVMGetSymbolFileOffset.restype = c_uint64
|
|
|
|
library.LLVMGetSymbolSize.argtypes = [SymbolIteratorRef]
|
|
library.LLVMGetSymbolSize.restype = c_uint64
|
|
|
|
library.LLVMGetRelocationAddress.argtypes = [SymbolIteratorRef]
|
|
library.LLVMGetRelocationAddress.restype = c_uint64
|
|
|
|
library.LLVMGetRelocationOffset.argtypes = [RelocationIteratorRef]
|
|
library.LLVMGetRelocationOffset.restype = c_uint64
|
|
|
|
library.LLVMGetRelocationSymbol.argtypes = [RelocationIteratorRef]
|
|
library.LLVMGetRelocationSymbol.restype = SymbolIteratorRef
|
|
|
|
library.LLVMGetRelocationType.argtypes = [RelocationIteratorRef]
|
|
library.LLVMGetRelocationType.restype = c_uint64
|
|
|
|
library.LLVMGetRelocationTypeName.argtypes = [RelocationIteratorRef]
|
|
library.LLVMGetRelocationTypeName.restype = c_char_p
|
|
|
|
library.LLVMGetRelocationValueString.argtypes = [RelocationIteratorRef]
|
|
library.LLVMGetRelocationValueString.restype = c_char_p
|
|
|
|
lib = get_library()
|
|
register_library(lib)
|