[llvm] 2980029 - [bindings] Remove LLVM python bindings

Anders Waldenborg via llvm-commits llvm-commits at lists.llvm.org
Thu May 18 12:41:19 PDT 2023


Author: Anders Waldenborg
Date: 2023-05-18T21:40:22+02:00
New Revision: 298002916c3e3d9982b808a38547d179c6c6360e

URL: https://github.com/llvm/llvm-project/commit/298002916c3e3d9982b808a38547d179c6c6360e
DIFF: https://github.com/llvm/llvm-project/commit/298002916c3e3d9982b808a38547d179c6c6360e.diff

LOG: [bindings] Remove LLVM python bindings

The LLVM python bindings are defunct.

They have not seen any substantial active development since 2014.

The version number, which is used to find the libLLVM-NN.so library, has
not been updated since LLVM 10.0 (2019) (and even then they were
probably mostly broken)

After fixing the version number to be able to run them at all, a large
number of tests in the test suite fails.

Already in 2017 the removal was discussed:
 https://discourse.llvm.org/t/is-anyone-using-still-using-the-python-bindings/46063
 https://lists.llvm.org/pipermail/llvm-dev/2017-August/116857.html

There exist external projects providing python bindings for LLVM, e.g:
 https://github.com/numba/llvmlite

Differential Revision: https://reviews.llvm.org/D150642

Added: 
    

Modified: 
    llvm/docs/ReleaseNotes.rst

Removed: 
    llvm/bindings/python/README.txt
    llvm/bindings/python/llvm/__init__.py
    llvm/bindings/python/llvm/bit_reader.py
    llvm/bindings/python/llvm/common.py
    llvm/bindings/python/llvm/core.py
    llvm/bindings/python/llvm/disassembler.py
    llvm/bindings/python/llvm/enumerations.py
    llvm/bindings/python/llvm/object.py
    llvm/bindings/python/llvm/tests/__init__.py
    llvm/bindings/python/llvm/tests/base.py
    llvm/bindings/python/llvm/tests/test.bc
    llvm/bindings/python/llvm/tests/test_bitreader.py
    llvm/bindings/python/llvm/tests/test_core.py
    llvm/bindings/python/llvm/tests/test_disassembler.py
    llvm/bindings/python/llvm/tests/test_file
    llvm/bindings/python/llvm/tests/test_object.py


################################################################################
diff  --git a/llvm/bindings/python/README.txt b/llvm/bindings/python/README.txt
deleted file mode 100644
index 96e334319bde3..0000000000000
--- a/llvm/bindings/python/README.txt
+++ /dev/null
@@ -1,67 +0,0 @@
-This directory contains Python bindings for LLVM's C library.
-
-The bindings are currently a work in progress and are far from complete.
-Use at your own risk.
-
-Developer Info
-==============
-
-The single Python package is "llvm." Modules inside this package roughly
-follow the names of the modules/headers defined by LLVM's C API.
-
-Testing
--------
-
-All test code is location in llvm/tests. Tests are written as classes
-which inherit from llvm.tests.base.TestBase, which is a convenience base
-class that provides common functionality.
-
-Tests can be executed by installing nose:
-
-    pip install nosetests
-
-Then by running nosetests:
-
-    nosetests
-
-To see more output:
-
-    nosetests -v
-
-To step into the Python debugger while running a test, add the following
-to your test at the point you wish to enter the debugger:
-
-    import pdb; pdb.set_trace()
-
-Then run nosetests:
-
-    nosetests -s -v
-
-You should strive for high code coverage. To see current coverage:
-
-    pip install coverage
-    nosetests --with-coverage --cover-html
-
-Then open cover/index.html in your browser of choice to see the code coverage.
-
-Style Convention
-----------------
-
-All code should pass PyFlakes. First, install PyFlakes:
-
-    pip install pyflakes
-
-Then at any time run it to see a report:
-
-    pyflakes .
-
-Eventually we'll provide a Pylint config file. In the meantime, install
-Pylint:
-
-    pip install pylint
-
-And run:
-
-    pylint llvm
-
-And try to keep the number of violations to a minimum.

diff  --git a/llvm/bindings/python/llvm/__init__.py b/llvm/bindings/python/llvm/__init__.py
deleted file mode 100644
index e69de29bb2d1d..0000000000000

diff  --git a/llvm/bindings/python/llvm/bit_reader.py b/llvm/bindings/python/llvm/bit_reader.py
deleted file mode 100644
index 8d1c6d5451932..0000000000000
--- a/llvm/bindings/python/llvm/bit_reader.py
+++ /dev/null
@@ -1,33 +0,0 @@
-from .common import LLVMObject
-from .common import c_object_p
-from .common import get_library
-from . import enumerations
-from .core import MemoryBuffer
-from .core import Module
-from .core import OpCode
-from ctypes import POINTER
-from ctypes import byref
-from ctypes import c_char_p
-from ctypes import cast
-
-__all__ = ["parse_bitcode"]
-lib = get_library()
-
-
-def parse_bitcode(mem_buffer):
-    """Input is .core.MemoryBuffer"""
-    module = c_object_p()
-    result = lib.LLVMParseBitcode2(mem_buffer, byref(module))
-    if result:
-        raise RuntimeError("LLVM Error")
-    m = Module(module)
-    m.take_ownership(mem_buffer)
-    return m
-
-
-def register_library(library):
-    library.LLVMParseBitcode2.argtypes = [MemoryBuffer, POINTER(c_object_p)]
-    library.LLVMParseBitcode2.restype = bool
-
-
-register_library(lib)

diff  --git a/llvm/bindings/python/llvm/common.py b/llvm/bindings/python/llvm/common.py
deleted file mode 100644
index 4f8912aec3fec..0000000000000
--- a/llvm/bindings/python/llvm/common.py
+++ /dev/null
@@ -1,130 +0,0 @@
-# ===- common.py - Python LLVM Bindings -----------------------*- python -*--===#
-#
-# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-# See https://llvm.org/LICENSE.txt for license information.
-# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-#
-# ===------------------------------------------------------------------------===#
-
-from ctypes import POINTER
-from ctypes import c_void_p
-from ctypes import cdll
-
-import ctypes.util
-import platform
-
-# LLVM_VERSION: sync with PACKAGE_VERSION in CMakeLists.txt
-#               but leave out the 'svn' suffix.
-LLVM_VERSION = "10.0.0"
-
-__all__ = [
-    "c_object_p",
-    "get_library",
-]
-
-c_object_p = POINTER(c_void_p)
-
-
-class LLVMObject(object):
-    """Base class for objects that are backed by an LLVM data structure.
-
-    This class should never be instantiated outside of this package.
-    """
-
-    def __init__(self, ptr, ownable=True, disposer=None):
-        assert isinstance(ptr, c_object_p)
-
-        self._ptr = self._as_parameter_ = ptr
-
-        self._self_owned = True
-        self._ownable = ownable
-        self._disposer = disposer
-
-        self._owned_objects = []
-
-    def take_ownership(self, obj):
-        """Take ownership of another object.
-
-        When you take ownership of another object, you are responsible for
-        destroying that object. In addition, a reference to that object is
-        placed inside this object so the Python garbage collector will not
-        collect the object while it is still alive in libLLVM.
-
-        This method should likely only be called from within modules inside
-        this package.
-        """
-        assert isinstance(obj, LLVMObject)
-
-        self._owned_objects.append(obj)
-        obj._self_owned = False
-
-    def from_param(self):
-        """ctypes function that converts this object to a function parameter."""
-        return self._as_parameter_
-
-    def __del__(self):
-        if not hasattr(self, "_self_owned") or not hasattr(self, "_disposer"):
-            return
-
-        if self._self_owned and self._disposer:
-            self._disposer(self)
-
-
-class CachedProperty(object):
-    """Decorator that caches the result of a property lookup.
-
-    This is a useful replacement for @property. It is recommended to use this
-    decorator on properties that invoke C API calls for which the result of the
-    call will be idempotent.
-    """
-
-    def __init__(self, wrapped):
-        self.wrapped = wrapped
-        try:
-            self.__doc__ = wrapped.__doc__
-        except:  # pragma: no cover
-            pass
-
-    def __get__(self, instance, instance_type=None):
-        if instance is None:
-            return self
-
-        value = self.wrapped(instance)
-        setattr(instance, self.wrapped.__name__, value)
-
-        return value
-
-
-def get_library():
-    """Obtain a reference to the llvm library."""
-
-    # On Linux, ctypes.cdll.LoadLibrary() respects LD_LIBRARY_PATH
-    # while ctypes.util.find_library() doesn't.
-    # See http://docs.python.org/2/library/ctypes.html#finding-shared-libraries
-    #
-    # To make it possible to run the unit tests without installing the LLVM shared
-    # library into a default linker search path.  Always Try ctypes.cdll.LoadLibrary()
-    # with all possible library names first, then try ctypes.util.find_library().
-
-    names = ["LLVM-" + LLVM_VERSION, "LLVM-" + LLVM_VERSION + "svn"]
-    t = platform.system()
-    if t == "Darwin":
-        pfx, ext = "lib", ".dylib"
-    elif t == "Windows":
-        pfx, ext = "", ".dll"
-    else:
-        pfx, ext = "lib", ".so"
-
-    for i in names:
-        try:
-            lib = cdll.LoadLibrary(pfx + i + ext)
-        except OSError:
-            pass
-        else:
-            return lib
-
-    for i in names:
-        t = ctypes.util.find_library(i)
-        if t:
-            return cdll.LoadLibrary(t)
-    raise Exception("LLVM shared library not found!")

diff  --git a/llvm/bindings/python/llvm/core.py b/llvm/bindings/python/llvm/core.py
deleted file mode 100644
index a2de827ed3bf6..0000000000000
--- a/llvm/bindings/python/llvm/core.py
+++ /dev/null
@@ -1,593 +0,0 @@
-# ===- core.py - Python LLVM Bindings -------------------------*- python -*--===#
-#
-# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-# See https://llvm.org/LICENSE.txt for license information.
-# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-#
-# ===------------------------------------------------------------------------===#
-from __future__ import print_function
-
-from .common import LLVMObject
-from .common import c_object_p
-from .common import get_library
-
-from . import enumerations
-
-from ctypes import POINTER
-from ctypes import byref
-from ctypes import c_char_p
-from ctypes import c_uint
-
-import sys
-
-__all__ = [
-    "lib",
-    "Enums",
-    "OpCode",
-    "MemoryBuffer",
-    "Module",
-    "Value",
-    "Function",
-    "BasicBlock",
-    "Instruction",
-    "Context",
-]
-
-lib = get_library()
-Enums = []
-
-
-class LLVMEnumeration(object):
-    """Represents an individual LLVM enumeration."""
-
-    def __init__(self, name, value):
-        self.name = name
-        self.value = value
-
-    def __repr__(self):
-        return "%s.%s" % (self.__class__.__name__, self.name)
-
-    @classmethod
-    def from_value(cls, value):
-        """Obtain an enumeration instance from a numeric value."""
-        result = cls._value_map.get(value, None)
-
-        if result is None:
-            raise ValueError("Unknown %s: %d" % (cls.__name__, value))
-
-        return result
-
-    @classmethod
-    def register(cls, name, value):
-        """Registers a new enumeration.
-
-        This is called by this module for each enumeration defined in
-        enumerations. You should not need to call this outside this module.
-        """
-        if value in cls._value_map:
-            raise ValueError("%s value already registered: %d" % (cls.__name__, value))
-        enum = cls(name, value)
-        cls._value_map[value] = enum
-        setattr(cls, name, enum)
-
-
-class Attribute(LLVMEnumeration):
-    """Represents an individual Attribute enumeration."""
-
-    _value_map = {}
-
-    def __init__(self, name, value):
-        super(Attribute, self).__init__(name, value)
-
-
-class OpCode(LLVMEnumeration):
-    """Represents an individual OpCode enumeration."""
-
-    _value_map = {}
-
-    def __init__(self, name, value):
-        super(OpCode, self).__init__(name, value)
-
-
-class TypeKind(LLVMEnumeration):
-    """Represents an individual TypeKind enumeration."""
-
-    _value_map = {}
-
-    def __init__(self, name, value):
-        super(TypeKind, self).__init__(name, value)
-
-
-class Linkage(LLVMEnumeration):
-    """Represents an individual Linkage enumeration."""
-
-    _value_map = {}
-
-    def __init__(self, name, value):
-        super(Linkage, self).__init__(name, value)
-
-
-class Visibility(LLVMEnumeration):
-    """Represents an individual visibility enumeration."""
-
-    _value_map = {}
-
-    def __init__(self, name, value):
-        super(Visibility, self).__init__(name, value)
-
-
-class CallConv(LLVMEnumeration):
-    """Represents an individual calling convention enumeration."""
-
-    _value_map = {}
-
-    def __init__(self, name, value):
-        super(CallConv, self).__init__(name, value)
-
-
-class IntPredicate(LLVMEnumeration):
-    """Represents an individual IntPredicate enumeration."""
-
-    _value_map = {}
-
-    def __init__(self, name, value):
-        super(IntPredicate, self).__init__(name, value)
-
-
-class RealPredicate(LLVMEnumeration):
-    """Represents an individual RealPredicate enumeration."""
-
-    _value_map = {}
-
-    def __init__(self, name, value):
-        super(RealPredicate, self).__init__(name, value)
-
-
-class LandingPadClauseTy(LLVMEnumeration):
-    """Represents an individual LandingPadClauseTy enumeration."""
-
-    _value_map = {}
-
-    def __init__(self, name, value):
-        super(LandingPadClauseTy, self).__init__(name, value)
-
-
-class MemoryBuffer(LLVMObject):
-    """Represents an opaque memory buffer."""
-
-    def __init__(self, filename=None):
-        """Create a new memory buffer.
-
-        Currently, we support creating from the contents of a file at the
-        specified filename.
-        """
-        if filename is None:
-            raise Exception("filename argument must be defined")
-
-        memory = c_object_p()
-        out = c_char_p(None)
-
-        result = lib.LLVMCreateMemoryBufferWithContentsOfFile(
-            filename, byref(memory), byref(out)
-        )
-
-        if result:
-            raise Exception("Could not create memory buffer: %s" % out.value)
-
-        LLVMObject.__init__(self, memory, disposer=lib.LLVMDisposeMemoryBuffer)
-
-    def __len__(self):
-        return lib.LLVMGetBufferSize(self)
-
-
-class Value(LLVMObject):
-    def __init__(self, value):
-        LLVMObject.__init__(self, value)
-
-    @property
-    def name(self):
-        return lib.LLVMGetValueName(self)
-
-    def dump(self):
-        lib.LLVMDumpValue(self)
-
-    def get_operand(self, i):
-        return Value(lib.LLVMGetOperand(self, i))
-
-    def set_operand(self, i, v):
-        return lib.LLVMSetOperand(self, i, v)
-
-    def __len__(self):
-        return lib.LLVMGetNumOperands(self)
-
-
-class Module(LLVMObject):
-    """Represents the top-level structure of an llvm program in an opaque object."""
-
-    def __init__(self, module, name=None, context=None):
-        LLVMObject.__init__(self, module, disposer=lib.LLVMDisposeModule)
-
-    @classmethod
-    def CreateWithName(cls, module_id):
-        m = Module(lib.LLVMModuleCreateWithName(module_id))
-        Context.GetGlobalContext().take_ownership(m)
-        return m
-
-    @property
-    def datalayout(self):
-        return lib.LLVMGetDataLayout(self)
-
-    @datalayout.setter
-    def datalayout(self, new_data_layout):
-        """new_data_layout is a string."""
-        lib.LLVMSetDataLayout(self, new_data_layout)
-
-    @property
-    def target(self):
-        return lib.LLVMGetTarget(self)
-
-    @target.setter
-    def target(self, new_target):
-        """new_target is a string."""
-        lib.LLVMSetTarget(self, new_target)
-
-    def dump(self):
-        lib.LLVMDumpModule(self)
-
-    class __function_iterator(object):
-        def __init__(self, module, reverse=False):
-            self.module = module
-            self.reverse = reverse
-            if self.reverse:
-                self.function = self.module.last
-            else:
-                self.function = self.module.first
-
-        def __iter__(self):
-            return self
-
-        def __next__(self):
-            if not isinstance(self.function, Function):
-                raise StopIteration("")
-            result = self.function
-            if self.reverse:
-                self.function = self.function.prev
-            else:
-                self.function = self.function.next
-            return result
-
-        if sys.version_info.major == 2:
-            next = __next__
-
-    def __iter__(self):
-        return Module.__function_iterator(self)
-
-    def __reversed__(self):
-        return Module.__function_iterator(self, reverse=True)
-
-    @property
-    def first(self):
-        return Function(lib.LLVMGetFirstFunction(self))
-
-    @property
-    def last(self):
-        return Function(lib.LLVMGetLastFunction(self))
-
-    def print_module_to_file(self, filename):
-        out = c_char_p(None)
-        # Result is inverted so 0 means everything was ok.
-        result = lib.LLVMPrintModuleToFile(self, filename, byref(out))
-        if result:
-            raise RuntimeError("LLVM Error: %s" % out.value)
-
-
-class Function(Value):
-    def __init__(self, value):
-        Value.__init__(self, value)
-
-    @property
-    def next(self):
-        f = lib.LLVMGetNextFunction(self)
-        return f and Function(f)
-
-    @property
-    def prev(self):
-        f = lib.LLVMGetPreviousFunction(self)
-        return f and Function(f)
-
-    @property
-    def first(self):
-        b = lib.LLVMGetFirstBasicBlock(self)
-        return b and BasicBlock(b)
-
-    @property
-    def last(self):
-        b = lib.LLVMGetLastBasicBlock(self)
-        return b and BasicBlock(b)
-
-    class __bb_iterator(object):
-        def __init__(self, function, reverse=False):
-            self.function = function
-            self.reverse = reverse
-            if self.reverse:
-                self.bb = function.last
-            else:
-                self.bb = function.first
-
-        def __iter__(self):
-            return self
-
-        def __next__(self):
-            if not isinstance(self.bb, BasicBlock):
-                raise StopIteration("")
-            result = self.bb
-            if self.reverse:
-                self.bb = self.bb.prev
-            else:
-                self.bb = self.bb.next
-            return result
-
-        if sys.version_info.major == 2:
-            next = __next__
-
-    def __iter__(self):
-        return Function.__bb_iterator(self)
-
-    def __reversed__(self):
-        return Function.__bb_iterator(self, reverse=True)
-
-    def __len__(self):
-        return lib.LLVMCountBasicBlocks(self)
-
-
-class BasicBlock(LLVMObject):
-    def __init__(self, value):
-        LLVMObject.__init__(self, value)
-
-    @property
-    def next(self):
-        b = lib.LLVMGetNextBasicBlock(self)
-        return b and BasicBlock(b)
-
-    @property
-    def prev(self):
-        b = lib.LLVMGetPreviousBasicBlock(self)
-        return b and BasicBlock(b)
-
-    @property
-    def first(self):
-        i = lib.LLVMGetFirstInstruction(self)
-        return i and Instruction(i)
-
-    @property
-    def last(self):
-        i = lib.LLVMGetLastInstruction(self)
-        return i and Instruction(i)
-
-    def __as_value(self):
-        return Value(lib.LLVMBasicBlockAsValue(self))
-
-    @property
-    def name(self):
-        return lib.LLVMGetValueName(self.__as_value())
-
-    def dump(self):
-        lib.LLVMDumpValue(self.__as_value())
-
-    def get_operand(self, i):
-        return Value(lib.LLVMGetOperand(self.__as_value(), i))
-
-    def set_operand(self, i, v):
-        return lib.LLVMSetOperand(self.__as_value(), i, v)
-
-    def __len__(self):
-        return lib.LLVMGetNumOperands(self.__as_value())
-
-    class __inst_iterator(object):
-        def __init__(self, bb, reverse=False):
-            self.bb = bb
-            self.reverse = reverse
-            if self.reverse:
-                self.inst = self.bb.last
-            else:
-                self.inst = self.bb.first
-
-        def __iter__(self):
-            return self
-
-        def __next__(self):
-            if not isinstance(self.inst, Instruction):
-                raise StopIteration("")
-            result = self.inst
-            if self.reverse:
-                self.inst = self.inst.prev
-            else:
-                self.inst = self.inst.next
-            return result
-
-        if sys.version_info.major == 2:
-            next = __next__
-
-    def __iter__(self):
-        return BasicBlock.__inst_iterator(self)
-
-    def __reversed__(self):
-        return BasicBlock.__inst_iterator(self, reverse=True)
-
-
-class Instruction(Value):
-    def __init__(self, value):
-        Value.__init__(self, value)
-
-    @property
-    def next(self):
-        i = lib.LLVMGetNextInstruction(self)
-        return i and Instruction(i)
-
-    @property
-    def prev(self):
-        i = lib.LLVMGetPreviousInstruction(self)
-        return i and Instruction(i)
-
-    @property
-    def opcode(self):
-        return OpCode.from_value(lib.LLVMGetInstructionOpcode(self))
-
-
-class Context(LLVMObject):
-    def __init__(self, context=None):
-        if context is None:
-            context = lib.LLVMContextCreate()
-            LLVMObject.__init__(self, context, disposer=lib.LLVMContextDispose)
-        else:
-            LLVMObject.__init__(self, context)
-
-    @classmethod
-    def GetGlobalContext(cls):
-        return Context(lib.LLVMGetGlobalContext())
-
-
-def register_library(library):
-    # Initialization/Shutdown declarations.
-    library.LLVMShutdown.argtypes = []
-    library.LLVMShutdown.restype = None
-
-    # Context declarations.
-    library.LLVMContextCreate.argtypes = []
-    library.LLVMContextCreate.restype = c_object_p
-
-    library.LLVMContextDispose.argtypes = [Context]
-    library.LLVMContextDispose.restype = None
-
-    library.LLVMGetGlobalContext.argtypes = []
-    library.LLVMGetGlobalContext.restype = c_object_p
-
-    # Memory buffer declarations
-    library.LLVMCreateMemoryBufferWithContentsOfFile.argtypes = [
-        c_char_p,
-        POINTER(c_object_p),
-        POINTER(c_char_p),
-    ]
-    library.LLVMCreateMemoryBufferWithContentsOfFile.restype = bool
-
-    library.LLVMGetBufferSize.argtypes = [MemoryBuffer]
-
-    library.LLVMDisposeMemoryBuffer.argtypes = [MemoryBuffer]
-
-    # Module declarations
-    library.LLVMModuleCreateWithName.argtypes = [c_char_p]
-    library.LLVMModuleCreateWithName.restype = c_object_p
-
-    library.LLVMDisposeModule.argtypes = [Module]
-    library.LLVMDisposeModule.restype = None
-
-    library.LLVMGetDataLayout.argtypes = [Module]
-    library.LLVMGetDataLayout.restype = c_char_p
-
-    library.LLVMSetDataLayout.argtypes = [Module, c_char_p]
-    library.LLVMSetDataLayout.restype = None
-
-    library.LLVMGetTarget.argtypes = [Module]
-    library.LLVMGetTarget.restype = c_char_p
-
-    library.LLVMSetTarget.argtypes = [Module, c_char_p]
-    library.LLVMSetTarget.restype = None
-
-    library.LLVMDumpModule.argtypes = [Module]
-    library.LLVMDumpModule.restype = None
-
-    library.LLVMPrintModuleToFile.argtypes = [Module, c_char_p, POINTER(c_char_p)]
-    library.LLVMPrintModuleToFile.restype = bool
-
-    library.LLVMGetFirstFunction.argtypes = [Module]
-    library.LLVMGetFirstFunction.restype = c_object_p
-
-    library.LLVMGetLastFunction.argtypes = [Module]
-    library.LLVMGetLastFunction.restype = c_object_p
-
-    library.LLVMGetNextFunction.argtypes = [Function]
-    library.LLVMGetNextFunction.restype = c_object_p
-
-    library.LLVMGetPreviousFunction.argtypes = [Function]
-    library.LLVMGetPreviousFunction.restype = c_object_p
-
-    # Value declarations.
-    library.LLVMGetValueName.argtypes = [Value]
-    library.LLVMGetValueName.restype = c_char_p
-
-    library.LLVMDumpValue.argtypes = [Value]
-    library.LLVMDumpValue.restype = None
-
-    library.LLVMGetOperand.argtypes = [Value, c_uint]
-    library.LLVMGetOperand.restype = c_object_p
-
-    library.LLVMSetOperand.argtypes = [Value, Value, c_uint]
-    library.LLVMSetOperand.restype = None
-
-    library.LLVMGetNumOperands.argtypes = [Value]
-    library.LLVMGetNumOperands.restype = c_uint
-
-    # Basic Block Declarations.
-    library.LLVMGetFirstBasicBlock.argtypes = [Function]
-    library.LLVMGetFirstBasicBlock.restype = c_object_p
-
-    library.LLVMGetLastBasicBlock.argtypes = [Function]
-    library.LLVMGetLastBasicBlock.restype = c_object_p
-
-    library.LLVMGetNextBasicBlock.argtypes = [BasicBlock]
-    library.LLVMGetNextBasicBlock.restype = c_object_p
-
-    library.LLVMGetPreviousBasicBlock.argtypes = [BasicBlock]
-    library.LLVMGetPreviousBasicBlock.restype = c_object_p
-
-    library.LLVMGetFirstInstruction.argtypes = [BasicBlock]
-    library.LLVMGetFirstInstruction.restype = c_object_p
-
-    library.LLVMGetLastInstruction.argtypes = [BasicBlock]
-    library.LLVMGetLastInstruction.restype = c_object_p
-
-    library.LLVMBasicBlockAsValue.argtypes = [BasicBlock]
-    library.LLVMBasicBlockAsValue.restype = c_object_p
-
-    library.LLVMCountBasicBlocks.argtypes = [Function]
-    library.LLVMCountBasicBlocks.restype = c_uint
-
-    # Instruction Declarations.
-    library.LLVMGetNextInstruction.argtypes = [Instruction]
-    library.LLVMGetNextInstruction.restype = c_object_p
-
-    library.LLVMGetPreviousInstruction.argtypes = [Instruction]
-    library.LLVMGetPreviousInstruction.restype = c_object_p
-
-    library.LLVMGetInstructionOpcode.argtypes = [Instruction]
-    library.LLVMGetInstructionOpcode.restype = c_uint
-
-
-def register_enumerations():
-    if Enums:
-        return None
-    enums = [
-        (Attribute, enumerations.Attributes),
-        (OpCode, enumerations.OpCodes),
-        (TypeKind, enumerations.TypeKinds),
-        (Linkage, enumerations.Linkages),
-        (Visibility, enumerations.Visibility),
-        (CallConv, enumerations.CallConv),
-        (IntPredicate, enumerations.IntPredicate),
-        (RealPredicate, enumerations.RealPredicate),
-        (LandingPadClauseTy, enumerations.LandingPadClauseTy),
-    ]
-    for enum_class, enum_spec in enums:
-        for name, value in enum_spec:
-            print(name, value)
-            enum_class.register(name, value)
-    return enums
-
-
-def initialize_llvm():
-    Context.GetGlobalContext()
-
-
-register_library(lib)
-Enums = register_enumerations()
-initialize_llvm()

diff  --git a/llvm/bindings/python/llvm/disassembler.py b/llvm/bindings/python/llvm/disassembler.py
deleted file mode 100644
index a57b8b838832d..0000000000000
--- a/llvm/bindings/python/llvm/disassembler.py
+++ /dev/null
@@ -1,201 +0,0 @@
-# ===- disassembler.py - Python LLVM Bindings -----------------*- python -*--===#
-#
-# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-# See https://llvm.org/LICENSE.txt for license information.
-# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-#
-# ===------------------------------------------------------------------------===#
-
-from ctypes import CFUNCTYPE
-from ctypes import POINTER
-from ctypes import addressof
-from ctypes import c_byte
-from ctypes import c_char_p
-from ctypes import c_int
-from ctypes import c_size_t
-from ctypes import c_ubyte
-from ctypes import c_uint64
-from ctypes import c_void_p
-from ctypes import cast
-
-from .common import LLVMObject
-from .common import c_object_p
-from .common import get_library
-
-__all__ = [
-    "Disassembler",
-]
-
-lib = get_library()
-callbacks = {}
-
-# Constants for set_options
-Option_UseMarkup = 1
-
-
-_initialized = False
-_targets = [
-    "AArch64",
-    "ARM",
-    "Hexagon",
-    "MSP430",
-    "Mips",
-    "NVPTX",
-    "PowerPC",
-    "R600",
-    "Sparc",
-    "SystemZ",
-    "X86",
-    "XCore",
-]
-
-
-def _ensure_initialized():
-    global _initialized
-    if not _initialized:
-        # Here one would want to call the functions
-        # LLVMInitializeAll{TargetInfo,TargetMC,Disassembler}s, but
-        # unfortunately they are only defined as static inline
-        # functions in the header files of llvm-c, so they don't exist
-        # as symbols in the shared library.
-        # So until that is fixed use this hack to initialize them all
-        for tgt in _targets:
-            for initializer in ("TargetInfo", "TargetMC", "Disassembler"):
-                try:
-                    f = getattr(lib, "LLVMInitialize" + tgt + initializer)
-                except AttributeError:
-                    continue
-                f()
-        _initialized = True
-
-
-class Disassembler(LLVMObject):
-    """Represents a disassembler instance.
-
-    Disassembler instances are tied to specific "triple," which must be defined
-    at creation time.
-
-    Disassembler instances can disassemble instructions from multiple sources.
-    """
-
-    def __init__(self, triple):
-        """Create a new disassembler instance.
-
-        The triple argument is the triple to create the disassembler for. This
-        is something like 'i386-apple-darwin9'.
-        """
-
-        _ensure_initialized()
-
-        ptr = lib.LLVMCreateDisasm(
-            c_char_p(triple),
-            c_void_p(None),
-            c_int(0),
-            callbacks["op_info"](0),
-            callbacks["symbol_lookup"](0),
-        )
-        if not ptr:
-            raise Exception("Could not obtain disassembler for triple: %s" % triple)
-
-        LLVMObject.__init__(self, ptr, disposer=lib.LLVMDisasmDispose)
-
-    def get_instruction(self, source, pc=0):
-        """Obtain the next instruction from an input source.
-
-        The input source should be a str or bytearray or something that
-        represents a sequence of bytes.
-
-        This function will start reading bytes from the beginning of the
-        source.
-
-        The pc argument specifies the address that the first byte is at.
-
-        This returns a 2-tuple of:
-
-          long number of bytes read. 0 if no instruction was read.
-          str representation of instruction. This will be the assembly that
-            represents the instruction.
-        """
-        buf = cast(c_char_p(source), POINTER(c_ubyte))
-        out_str = cast((c_byte * 255)(), c_char_p)
-
-        result = lib.LLVMDisasmInstruction(
-            self, buf, c_uint64(len(source)), c_uint64(pc), out_str, 255
-        )
-
-        return (result, out_str.value)
-
-    def get_instructions(self, source, pc=0):
-        """Obtain multiple instructions from an input source.
-
-        This is like get_instruction() except it is a generator for all
-        instructions within the source. It starts at the beginning of the
-        source and reads instructions until no more can be read.
-
-        This generator returns 3-tuple of:
-
-          long address of instruction.
-          long size of instruction, in bytes.
-          str representation of instruction.
-        """
-        source_bytes = c_char_p(source)
-        out_str = cast((c_byte * 255)(), c_char_p)
-
-        # This could probably be written cleaner. But, it does work.
-        buf = cast(source_bytes, POINTER(c_ubyte * len(source))).contents
-        offset = 0
-        address = pc
-        end_address = pc + len(source)
-        while address < end_address:
-            b = cast(addressof(buf) + offset, POINTER(c_ubyte))
-            result = lib.LLVMDisasmInstruction(
-                self, b, c_uint64(len(source) - offset), c_uint64(address), out_str, 255
-            )
-
-            if result == 0:
-                break
-
-            yield (address, result, out_str.value)
-
-            address += result
-            offset += result
-
-    def set_options(self, options):
-        if not lib.LLVMSetDisasmOptions(self, options):
-            raise Exception("Unable to set all disassembler options in %i" % options)
-
-
-def register_library(library):
-    library.LLVMCreateDisasm.argtypes = [
-        c_char_p,
-        c_void_p,
-        c_int,
-        callbacks["op_info"],
-        callbacks["symbol_lookup"],
-    ]
-    library.LLVMCreateDisasm.restype = c_object_p
-
-    library.LLVMDisasmDispose.argtypes = [Disassembler]
-
-    library.LLVMDisasmInstruction.argtypes = [
-        Disassembler,
-        POINTER(c_ubyte),
-        c_uint64,
-        c_uint64,
-        c_char_p,
-        c_size_t,
-    ]
-    library.LLVMDisasmInstruction.restype = c_size_t
-
-    library.LLVMSetDisasmOptions.argtypes = [Disassembler, c_uint64]
-    library.LLVMSetDisasmOptions.restype = c_int
-
-
-callbacks["op_info"] = CFUNCTYPE(
-    c_int, c_void_p, c_uint64, c_uint64, c_uint64, c_int, c_void_p
-)
-callbacks["symbol_lookup"] = CFUNCTYPE(
-    c_char_p, c_void_p, c_uint64, POINTER(c_uint64), c_uint64, POINTER(c_char_p)
-)
-
-register_library(lib)

diff  --git a/llvm/bindings/python/llvm/enumerations.py b/llvm/bindings/python/llvm/enumerations.py
deleted file mode 100644
index 34e297603b3f2..0000000000000
--- a/llvm/bindings/python/llvm/enumerations.py
+++ /dev/null
@@ -1,210 +0,0 @@
-# ===- enumerations.py - Python LLVM Enumerations -------------*- python -*--===#
-#
-# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-# See https://llvm.org/LICENSE.txt for license information.
-# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-#
-# ===------------------------------------------------------------------------===#
-
-r"""
-LLVM Enumerations
-=================
-
-This file defines enumerations from LLVM.
-
-Each enumeration is exposed as a list of 2-tuples. These lists are consumed by
-dedicated types elsewhere in the package. The enumerations are centrally
-defined in this file so they are easier to locate and maintain.
-"""
-
-__all__ = [
-    "Attributes",
-    "OpCodes",
-    "TypeKinds",
-    "Linkages",
-    "Visibility",
-    "CallConv",
-    "IntPredicate",
-    "RealPredicate",
-    "LandingPadClauseTy",
-]
-
-Attributes = [
-    ("ZExt", 1 << 0),
-    ("MSExt", 1 << 1),
-    ("NoReturn", 1 << 2),
-    ("InReg", 1 << 3),
-    ("StructRet", 1 << 4),
-    ("NoUnwind", 1 << 5),
-    ("NoAlias", 1 << 6),
-    ("ByVal", 1 << 7),
-    ("Nest", 1 << 8),
-    ("ReadNone", 1 << 9),
-    ("ReadOnly", 1 << 10),
-    ("NoInline", 1 << 11),
-    ("AlwaysInline", 1 << 12),
-    ("OptimizeForSize", 1 << 13),
-    ("StackProtect", 1 << 14),
-    ("StackProtectReq", 1 << 15),
-    ("Alignment", 31 << 16),
-    ("NoCapture", 1 << 21),
-    ("NoRedZone", 1 << 22),
-    ("ImplicitFloat", 1 << 23),
-    ("Naked", 1 << 24),
-    ("InlineHint", 1 << 25),
-    ("StackAlignment", 7 << 26),
-    ("ReturnsTwice", 1 << 29),
-    ("UWTable", 1 << 30),
-    ("NonLazyBind", 1 << 31),
-]
-
-OpCodes = [
-    ("Ret", 1),
-    ("Br", 2),
-    ("Switch", 3),
-    ("IndirectBr", 4),
-    ("Invoke", 5),
-    ("Unreachable", 7),
-    ("Add", 8),
-    ("FAdd", 9),
-    ("Sub", 10),
-    ("FSub", 11),
-    ("Mul", 12),
-    ("FMul", 13),
-    ("UDiv", 14),
-    ("SDiv", 15),
-    ("FDiv", 16),
-    ("URem", 17),
-    ("SRem", 18),
-    ("FRem", 19),
-    ("Shl", 20),
-    ("LShr", 21),
-    ("AShr", 22),
-    ("And", 23),
-    ("Or", 24),
-    ("Xor", 25),
-    ("Alloca", 26),
-    ("Load", 27),
-    ("Store", 28),
-    ("GetElementPtr", 29),
-    ("Trunc", 30),
-    ("ZExt", 31),
-    ("SExt", 32),
-    ("FPToUI", 33),
-    ("FPToSI", 34),
-    ("UIToFP", 35),
-    ("SIToFP", 36),
-    ("FPTrunc", 37),
-    ("FPExt", 38),
-    ("PtrToInt", 39),
-    ("IntToPtr", 40),
-    ("BitCast", 41),
-    ("ICmp", 42),
-    ("FCmpl", 43),
-    ("PHI", 44),
-    ("Call", 45),
-    ("Select", 46),
-    ("UserOp1", 47),
-    ("UserOp2", 48),
-    ("AArg", 49),
-    ("ExtractElement", 50),
-    ("InsertElement", 51),
-    ("ShuffleVector", 52),
-    ("ExtractValue", 53),
-    ("InsertValue", 54),
-    ("Fence", 55),
-    ("AtomicCmpXchg", 56),
-    ("AtomicRMW", 57),
-    ("Resume", 58),
-    ("LandingPad", 59),
-]
-
-TypeKinds = [
-    ("Void", 0),
-    ("Half", 1),
-    ("Float", 2),
-    ("Double", 3),
-    ("X86_FP80", 4),
-    ("FP128", 5),
-    ("PPC_FP128", 6),
-    ("Label", 7),
-    ("Integer", 8),
-    ("Function", 9),
-    ("Struct", 10),
-    ("Array", 11),
-    ("Pointer", 12),
-    ("Vector", 13),
-    ("Metadata", 14),
-    ("X86_MMX", 15),
-]
-
-Linkages = [
-    ("External", 0),
-    ("AvailableExternally", 1),
-    ("LinkOnceAny", 2),
-    ("LinkOnceODR", 3),
-    ("WeakAny", 4),
-    ("WeakODR", 5),
-    ("Appending", 6),
-    ("Internal", 7),
-    ("Private", 8),
-    ("DLLImport", 9),
-    ("DLLExport", 10),
-    ("ExternalWeak", 11),
-    ("Ghost", 12),
-    ("Common", 13),
-    ("LinkerPrivate", 14),
-    ("LinkerPrivateWeak", 15),
-    ("LinkerPrivateWeakDefAuto", 16),
-]
-
-Visibility = [
-    ("Default", 0),
-    ("Hidden", 1),
-    ("Protected", 2),
-]
-
-CallConv = [
-    ("CCall", 0),
-    ("FastCall", 8),
-    ("ColdCall", 9),
-    ("X86StdcallCall", 64),
-    ("X86FastcallCall", 65),
-]
-
-IntPredicate = [
-    ("EQ", 32),
-    ("NE", 33),
-    ("UGT", 34),
-    ("UGE", 35),
-    ("ULT", 36),
-    ("ULE", 37),
-    ("SGT", 38),
-    ("SGE", 39),
-    ("SLT", 40),
-    ("SLE", 41),
-]
-
-RealPredicate = [
-    ("PredicateFalse", 0),
-    ("OEQ", 1),
-    ("OGT", 2),
-    ("OGE", 3),
-    ("OLT", 4),
-    ("OLE", 5),
-    ("ONE", 6),
-    ("ORD", 7),
-    ("UNO", 8),
-    ("UEQ", 9),
-    ("UGT", 10),
-    ("UGE", 11),
-    ("ULT", 12),
-    ("ULE", 13),
-    ("UNE", 14),
-    ("PredicateTrue", 15),
-]
-
-LandingPadClauseTy = [
-    ("Catch", 0),
-    ("Filter", 1),
-]

diff  --git a/llvm/bindings/python/llvm/object.py b/llvm/bindings/python/llvm/object.py
deleted file mode 100644
index b63b9ce46c41d..0000000000000
--- a/llvm/bindings/python/llvm/object.py
+++ /dev/null
@@ -1,516 +0,0 @@
-# ===- object.py - Python Object Bindings --------------------*- python -*--===#
-#
-# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-# See https://llvm.org/LICENSE.txt for license information.
-# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-#
-# ===------------------------------------------------------------------------===#
-
-r"""
-Object File Interface
-=====================
-
-This module provides an interface for reading information from object files
-(e.g. binary executables and libraries).
-
-Using this module, you can obtain information about an object file's sections,
-symbols, and relocations. These are represented by the classes ObjectFile,
-Section, Symbol, and Relocation, respectively.
-
-Usage
------
-
-The only way to use this module is to start by creating an ObjectFile. You can
-create an ObjectFile by loading a file (specified by its path) or by creating a
-llvm.core.MemoryBuffer and loading that.
-
-Once you have an object file, you can inspect its sections and symbols directly
-by calling get_sections() and get_symbols() respectively. To inspect
-relocations, call get_relocations() on a Section instance.
-
-Iterator Interface
-------------------
-
-The LLVM bindings expose iteration over sections, symbols, and relocations in a
-way that only allows one instance to be operated on at a single time. This is
-slightly annoying from a Python perspective, as it isn't very Pythonic to have
-objects that "expire" but are still active from a dynamic language.
-
-To aid working around this limitation, each Section, Symbol, and Relocation
-instance caches its properties after first access. So, if the underlying
-iterator is advanced, the properties can still be obtained provided they have
-already been retrieved.
-
-In addition, we also provide a "cache" method on each class to cache all
-available data. You can call this on each obtained instance. Or, you can pass
-cache=True to the appropriate get_XXX() method to have this done for you.
-
-Here are some examples on how to perform iteration:
-
-    obj = ObjectFile(filename='/bin/ls')
-
-    # This is OK. Each Section is only accessed inside its own iteration slot.
-    section_names = []
-    for section in obj.get_sections():
-        section_names.append(section.name)
-
-    # This is NOT OK. You perform a lookup after the object has expired.
-    symbols = list(obj.get_symbols())
-    for symbol in symbols:
-        print symbol.name # This raises because the object has expired.
-
-    # In this example, we mix a working and failing scenario.
-    symbols = []
-    for symbol in obj.get_symbols():
-        symbols.append(symbol)
-        print symbol.name
-
-    for symbol in symbols:
-        print symbol.name # OK
-        print symbol.address # NOT OK. We didn't look up this property before.
-
-    # Cache everything up front.
-    symbols = list(obj.get_symbols(cache=True))
-    for symbol in symbols:
-        print symbol.name # OK
-
-"""
-
-from ctypes import c_char_p
-from ctypes import c_char
-from ctypes import POINTER
-from ctypes import c_uint64
-from ctypes import string_at
-
-from .common import CachedProperty
-from .common import LLVMObject
-from .common import c_object_p
-from .common import get_library
-from .core import MemoryBuffer
-
-__all__ = [
-    "lib",
-    "ObjectFile",
-    "Relocation",
-    "Section",
-    "Symbol",
-]
-
-
-class ObjectFile(LLVMObject):
-    """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)
-
-        if contents is None:
-            raise Exception("No input found.")
-
-        ptr = lib.LLVMCreateObjectFile(contents)
-        LLVMObject.__init__(self, ptr, disposer=lib.LLVMDisposeObjectFile)
-        self.take_ownership(contents)
-
-    def get_sections(self, cache=False):
-        """Obtain the sections in this object file.
-
-        This is a generator for llvm.object.Section instances.
-
-        Sections are exposed as limited-use objects. See the module's
-        documentation on iterators for more.
-        """
-        sections = lib.LLVMGetSections(self)
-        last = None
-        while True:
-            if lib.LLVMIsSectionIteratorAtEnd(self, sections):
-                break
-
-            last = Section(sections)
-            if cache:
-                last.cache()
-
-            yield last
-
-            lib.LLVMMoveToNextSection(sections)
-            last.expire()
-
-        if last is not None:
-            last.expire()
-
-        lib.LLVMDisposeSectionIterator(sections)
-
-    def get_symbols(self, cache=False):
-        """Obtain the symbols in this object file.
-
-        This is a generator for llvm.object.Symbol instances.
-
-        Each Symbol instance is a limited-use object. See this module's
-        documentation on iterators for more.
-        """
-        symbols = lib.LLVMGetSymbols(self)
-        last = None
-        while True:
-            if lib.LLVMIsSymbolIteratorAtEnd(self, symbols):
-                break
-
-            last = Symbol(symbols, self)
-            if cache:
-                last.cache()
-
-            yield last
-
-            lib.LLVMMoveToNextSymbol(symbols)
-            last.expire()
-
-        if last is not None:
-            last.expire()
-
-        lib.LLVMDisposeSymbolIterator(symbols)
-
-
-class Section(LLVMObject):
-    """Represents a section in an object file."""
-
-    def __init__(self, ptr):
-        """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.
-        """
-        LLVMObject.__init__(self, ptr)
-
-        self.expired = False
-
-    @CachedProperty
-    def name(self):
-        """Obtain the string name of the section.
-
-        This is typically something like '.dynsym' or '.rodata'.
-        """
-        if self.expired:
-            raise Exception("Section instance has expired.")
-
-        return lib.LLVMGetSectionName(self)
-
-    @CachedProperty
-    def size(self):
-        """The size of the section, in long bytes."""
-        if self.expired:
-            raise Exception("Section instance has expired.")
-
-        return lib.LLVMGetSectionSize(self)
-
-    @CachedProperty
-    def contents(self):
-        if self.expired:
-            raise Exception("Section instance has expired.")
-
-        siz = self.size
-
-        r = lib.LLVMGetSectionContents(self)
-        if r:
-            return string_at(r, siz)
-        return None
-
-    @CachedProperty
-    def address(self):
-        """The address of this section, in long bytes."""
-        if self.expired:
-            raise Exception("Section instance has expired.")
-
-        return lib.LLVMGetSectionAddress(self)
-
-    def has_symbol(self, symbol):
-        """Returns whether a Symbol instance is present in this Section."""
-        if self.expired:
-            raise Exception("Section instance has expired.")
-
-        assert isinstance(symbol, Symbol)
-        return lib.LLVMGetSectionContainsSymbol(self, symbol)
-
-    def get_relocations(self, cache=False):
-        """Obtain the relocations in this Section.
-
-        This is a generator for llvm.object.Relocation instances.
-
-        Each instance is a limited used object. See this module's documentation
-        on iterators for more.
-        """
-        if self.expired:
-            raise Exception("Section instance has expired.")
-
-        relocations = lib.LLVMGetRelocations(self)
-        last = None
-        while True:
-            if lib.LLVMIsRelocationIteratorAtEnd(self, relocations):
-                break
-
-            last = Relocation(relocations)
-            if cache:
-                last.cache()
-
-            yield last
-
-            lib.LLVMMoveToNextRelocation(relocations)
-            last.expire()
-
-        if last is not None:
-            last.expire()
-
-        lib.LLVMDisposeRelocationIterator(relocations)
-
-    def cache(self):
-        """Cache properties of this Section.
-
-        This can be called as a workaround to the single active Section
-        limitation. When called, the properties of the Section are fetched so
-        they are still available after the Section has been marked inactive.
-        """
-        getattr(self, "name")
-        getattr(self, "size")
-        getattr(self, "contents")
-        getattr(self, "address")
-
-    def expire(self):
-        """Expire the section.
-
-        This is called internally by the section iterator.
-        """
-        self.expired = True
-
-
-class Symbol(LLVMObject):
-    """Represents a symbol in an object file."""
-
-    def __init__(self, ptr, object_file):
-        assert isinstance(ptr, c_object_p)
-        assert isinstance(object_file, ObjectFile)
-
-        LLVMObject.__init__(self, ptr)
-
-        self.expired = False
-        self._object_file = object_file
-
-    @CachedProperty
-    def name(self):
-        """The str name of the symbol.
-
-        This is often a function or variable name. Keep in mind that name
-        mangling could be in effect.
-        """
-        if self.expired:
-            raise Exception("Symbol instance has expired.")
-
-        return lib.LLVMGetSymbolName(self)
-
-    @CachedProperty
-    def address(self):
-        """The address of this symbol, in long bytes."""
-        if self.expired:
-            raise Exception("Symbol instance has expired.")
-
-        return lib.LLVMGetSymbolAddress(self)
-
-    @CachedProperty
-    def size(self):
-        """The size of the symbol, in long bytes."""
-        if self.expired:
-            raise Exception("Symbol instance has expired.")
-
-        return lib.LLVMGetSymbolSize(self)
-
-    @CachedProperty
-    def section(self):
-        """The Section to which this Symbol belongs.
-
-        The returned Section instance does not expire, unlike Sections that are
-        commonly obtained through iteration.
-
-        Because this obtains a new section iterator each time it is accessed,
-        calling this on a number of Symbol instances could be expensive.
-        """
-        sections = lib.LLVMGetSections(self._object_file)
-        lib.LLVMMoveToContainingSection(sections, self)
-
-        return Section(sections)
-
-    def cache(self):
-        """Cache all cacheable properties."""
-        getattr(self, "name")
-        getattr(self, "address")
-        getattr(self, "size")
-
-    def expire(self):
-        """Mark the object as expired to prevent future API accesses.
-
-        This is called internally by this module and it is unlikely that
-        external callers have a legitimate reason for using it.
-        """
-        self.expired = True
-
-
-class Relocation(LLVMObject):
-    """Represents a relocation definition."""
-
-    def __init__(self, ptr):
-        """Create a new relocation instance.
-
-        Relocations are created from objects derived from Section instances.
-        Therefore, this constructor should not be called outside of this
-        module. See Section.get_relocations() for the proper method to obtain
-        a Relocation instance.
-        """
-        assert isinstance(ptr, c_object_p)
-
-        LLVMObject.__init__(self, ptr)
-
-        self.expired = False
-
-    @CachedProperty
-    def offset(self):
-        """The offset of this relocation, in long bytes."""
-        if self.expired:
-            raise Exception("Relocation instance has expired.")
-
-        return lib.LLVMGetRelocationOffset(self)
-
-    @CachedProperty
-    def symbol(self):
-        """The Symbol corresponding to this Relocation."""
-        if self.expired:
-            raise Exception("Relocation instance has expired.")
-
-        ptr = lib.LLVMGetRelocationSymbol(self)
-        return Symbol(ptr)
-
-    @CachedProperty
-    def type_number(self):
-        """The relocation type, as a long."""
-        if self.expired:
-            raise Exception("Relocation instance has expired.")
-
-        return lib.LLVMGetRelocationType(self)
-
-    @CachedProperty
-    def type_name(self):
-        """The relocation type's name, as a str."""
-        if self.expired:
-            raise Exception("Relocation instance has expired.")
-
-        return lib.LLVMGetRelocationTypeName(self)
-
-    @CachedProperty
-    def value_string(self):
-        if self.expired:
-            raise Exception("Relocation instance has expired.")
-
-        return lib.LLVMGetRelocationValueString(self)
-
-    def expire(self):
-        """Expire this instance, making future API accesses fail."""
-        self.expired = True
-
-    def cache(self):
-        """Cache all cacheable properties on this instance."""
-        getattr(self, "address")
-        getattr(self, "offset")
-        getattr(self, "symbol")
-        getattr(self, "type")
-        getattr(self, "type_name")
-        getattr(self, "value_string")
-
-
-def register_library(library):
-    """Register function prototypes with LLVM library instance."""
-
-    # Object.h functions
-    library.LLVMCreateObjectFile.argtypes = [MemoryBuffer]
-    library.LLVMCreateObjectFile.restype = c_object_p
-
-    library.LLVMDisposeObjectFile.argtypes = [ObjectFile]
-
-    library.LLVMGetSections.argtypes = [ObjectFile]
-    library.LLVMGetSections.restype = c_object_p
-
-    library.LLVMDisposeSectionIterator.argtypes = [c_object_p]
-
-    library.LLVMIsSectionIteratorAtEnd.argtypes = [ObjectFile, c_object_p]
-    library.LLVMIsSectionIteratorAtEnd.restype = bool
-
-    library.LLVMMoveToNextSection.argtypes = [c_object_p]
-
-    library.LLVMMoveToContainingSection.argtypes = [c_object_p, c_object_p]
-
-    library.LLVMGetSymbols.argtypes = [ObjectFile]
-    library.LLVMGetSymbols.restype = c_object_p
-
-    library.LLVMDisposeSymbolIterator.argtypes = [c_object_p]
-
-    library.LLVMIsSymbolIteratorAtEnd.argtypes = [ObjectFile, c_object_p]
-    library.LLVMIsSymbolIteratorAtEnd.restype = bool
-
-    library.LLVMMoveToNextSymbol.argtypes = [c_object_p]
-
-    library.LLVMGetSectionName.argtypes = [c_object_p]
-    library.LLVMGetSectionName.restype = c_char_p
-
-    library.LLVMGetSectionSize.argtypes = [c_object_p]
-    library.LLVMGetSectionSize.restype = c_uint64
-
-    library.LLVMGetSectionContents.argtypes = [c_object_p]
-    # Can't use c_char_p here as it isn't a NUL-terminated string.
-    library.LLVMGetSectionContents.restype = POINTER(c_char)
-
-    library.LLVMGetSectionAddress.argtypes = [c_object_p]
-    library.LLVMGetSectionAddress.restype = c_uint64
-
-    library.LLVMGetSectionContainsSymbol.argtypes = [c_object_p, c_object_p]
-    library.LLVMGetSectionContainsSymbol.restype = bool
-
-    library.LLVMGetRelocations.argtypes = [c_object_p]
-    library.LLVMGetRelocations.restype = c_object_p
-
-    library.LLVMDisposeRelocationIterator.argtypes = [c_object_p]
-
-    library.LLVMIsRelocationIteratorAtEnd.argtypes = [c_object_p, c_object_p]
-    library.LLVMIsRelocationIteratorAtEnd.restype = bool
-
-    library.LLVMMoveToNextRelocation.argtypes = [c_object_p]
-
-    library.LLVMGetSymbolName.argtypes = [Symbol]
-    library.LLVMGetSymbolName.restype = c_char_p
-
-    library.LLVMGetSymbolAddress.argtypes = [Symbol]
-    library.LLVMGetSymbolAddress.restype = c_uint64
-
-    library.LLVMGetSymbolSize.argtypes = [Symbol]
-    library.LLVMGetSymbolSize.restype = c_uint64
-
-    library.LLVMGetRelocationOffset.argtypes = [c_object_p]
-    library.LLVMGetRelocationOffset.restype = c_uint64
-
-    library.LLVMGetRelocationSymbol.argtypes = [c_object_p]
-    library.LLVMGetRelocationSymbol.restype = c_object_p
-
-    library.LLVMGetRelocationType.argtypes = [c_object_p]
-    library.LLVMGetRelocationType.restype = c_uint64
-
-    library.LLVMGetRelocationTypeName.argtypes = [c_object_p]
-    library.LLVMGetRelocationTypeName.restype = c_char_p
-
-    library.LLVMGetRelocationValueString.argtypes = [c_object_p]
-    library.LLVMGetRelocationValueString.restype = c_char_p
-
-
-lib = get_library()
-register_library(lib)

diff  --git a/llvm/bindings/python/llvm/tests/__init__.py b/llvm/bindings/python/llvm/tests/__init__.py
deleted file mode 100644
index e69de29bb2d1d..0000000000000

diff  --git a/llvm/bindings/python/llvm/tests/base.py b/llvm/bindings/python/llvm/tests/base.py
deleted file mode 100644
index 7350cb419c1eb..0000000000000
--- a/llvm/bindings/python/llvm/tests/base.py
+++ /dev/null
@@ -1,45 +0,0 @@
-import os.path
-import sys
-import unittest
-
-
-POSSIBLE_TEST_BINARIES = [
-    "libreadline.so.5",
-    "libreadline.so.6",
-]
-
-POSSIBLE_TEST_BINARY_PATHS = [
-    "/usr/lib/debug",
-    "/lib",
-    "/usr/lib",
-    "/usr/local/lib",
-    "/lib/i386-linux-gnu",
-]
-
-
-class TestBase(unittest.TestCase):
-    if sys.version_info.major == 2:
-        assertRaisesRegex = unittest.TestCase.assertRaisesRegexp
-
-    def get_test_binary(self):
-        """Helper to obtain a test binary for object file testing.
-
-        FIXME Support additional, highly-likely targets or create one
-        ourselves.
-        """
-        for d in POSSIBLE_TEST_BINARY_PATHS:
-            for lib in POSSIBLE_TEST_BINARIES:
-                path = os.path.join(d, lib)
-
-                if os.path.exists(path):
-                    return path
-
-        raise Exception("No suitable test binaries available!")
-
-    get_test_binary.__test__ = False
-
-    def get_test_file(self):
-        return os.path.join(os.path.dirname(os.path.abspath(__file__)), "test_file")
-
-    def get_test_bc(self):
-        return os.path.join(os.path.dirname(os.path.abspath(__file__)), "test.bc")

diff  --git a/llvm/bindings/python/llvm/tests/test.bc b/llvm/bindings/python/llvm/tests/test.bc
deleted file mode 100644
index 8d3d28fbc0db7..0000000000000
Binary files a/llvm/bindings/python/llvm/tests/test.bc and /dev/null 
diff er

diff  --git a/llvm/bindings/python/llvm/tests/test_bitreader.py b/llvm/bindings/python/llvm/tests/test_bitreader.py
deleted file mode 100644
index 08e55e1297714..0000000000000
--- a/llvm/bindings/python/llvm/tests/test_bitreader.py
+++ /dev/null
@@ -1,17 +0,0 @@
-from __future__ import print_function
-
-from .base import TestBase
-from ..core import OpCode
-from ..core import MemoryBuffer
-from ..core import PassRegistry
-from ..core import Context
-from ..core import Module
-from ..bit_reader import parse_bitcode
-
-
-class TestBitReader(TestBase):
-    def test_parse_bitcode(self):
-        source = self.get_test_bc()
-        m = parse_bitcode(MemoryBuffer(filename=source))
-        print(m.target)
-        print(m.datalayout)

diff  --git a/llvm/bindings/python/llvm/tests/test_core.py b/llvm/bindings/python/llvm/tests/test_core.py
deleted file mode 100644
index 76a2eaf9db900..0000000000000
--- a/llvm/bindings/python/llvm/tests/test_core.py
+++ /dev/null
@@ -1,144 +0,0 @@
-from __future__ import print_function
-
-from .base import TestBase
-from ..core import MemoryBuffer
-from ..core import PassRegistry
-from ..core import Context
-from ..core import Module
-from ..core import Enums
-from ..core import OpCode
-from ..bit_reader import parse_bitcode
-
-
-class TestCore(TestBase):
-    def test_enumerations(self):
-        for enum_cls, enum_spec in Enums:
-            for enum_name, enum_value in enum_spec:
-                # First make sure that enum_cls has the name of the enum as an
-                # attribute. People will access these values as
-                # EnumCls.EnumName.
-                self.assertTrue(hasattr(enum_cls, enum_name))
-                v_attr = getattr(enum_cls, enum_name)
-                self.assertTrue(isinstance(v_attr, enum_cls))
-
-                # Then make sure that the value returned for this attribute is
-                # correct in both ways.
-                self.assertEqual(v_attr.value, enum_value)
-
-                e = enum_cls.from_value(enum_value)
-                self.assertTrue(isinstance(e, enum_cls))
-                self.assertEqual(e, v_attr)
-
-    def test_memory_buffer_create_from_file(self):
-        source = self.get_test_file()
-
-        MemoryBuffer(filename=source)
-
-    def test_memory_buffer_failing(self):
-        with self.assertRaises(Exception):
-            MemoryBuffer(filename="/hopefully/this/path/doesnt/exist")
-
-    def test_memory_buffer_len(self):
-        source = self.get_test_file()
-        m = MemoryBuffer(filename=source)
-        self.assertEqual(len(m), 50)
-
-    def test_create_passregistry(self):
-        PassRegistry()
-
-    def test_create_context(self):
-        Context.GetGlobalContext()
-
-    def test_create_module_with_name(self):
-        # Make sure we can not create a module without a LLVMModuleRef.
-        with self.assertRaises(TypeError):
-            m = Module()
-        m = Module.CreateWithName("test-module")
-
-    def test_module_getset_datalayout(self):
-        m = Module.CreateWithName("test-module")
-        dl = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32"
-        m.datalayout = dl
-        self.assertEqual(m.datalayout, dl)
-
-    def test_module_getset_target(self):
-        m = Module.CreateWithName("test-module")
-        target = "thumbv7-apple-ios5.0.0"
-        m.target = target
-        self.assertEqual(m.target, target)
-
-    def test_module_print_module_to_file(self):
-        m = Module.CreateWithName("test")
-        dl = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32"
-        m.datalayout = dl
-        target = "thumbv7-apple-ios5.0.0"
-        m.target = target
-        m.print_module_to_file("test2.ll")
-
-    def test_module_function_iteration(self):
-        m = parse_bitcode(MemoryBuffer(filename=self.get_test_bc()))
-        i = 0
-        functions = ["f", "f2", "f3", "f4", "f5", "f6", "g1", "g2", "h1", "h2", "h3"]
-        # Forward
-        for f in m:
-            self.assertEqual(f.name, functions[i])
-            f.dump()
-            i += 1
-        # Backwards
-        for f in reversed(m):
-            i -= 1
-            self.assertEqual(f.name, functions[i])
-            f.dump()
-
-    def test_function_basicblock_iteration(self):
-        m = parse_bitcode(MemoryBuffer(filename=self.get_test_bc()))
-        i = 0
-
-        bb_list = ["b1", "b2", "end"]
-
-        f = m.first
-        while f.name != "f6":
-            f = f.next
-
-        # Forward
-        for bb in f:
-            self.assertEqual(bb.name, bb_list[i])
-            bb.dump()
-            i += 1
-
-        # Backwards
-        for bb in reversed(f):
-            i -= 1
-            self.assertEqual(bb.name, bb_list[i])
-            bb.dump()
-
-    def test_basicblock_instruction_iteration(self):
-        m = parse_bitcode(MemoryBuffer(filename=self.get_test_bc()))
-        i = 0
-
-        inst_list = [
-            ("arg1", OpCode.ExtractValue),
-            ("arg2", OpCode.ExtractValue),
-            ("", OpCode.Call),
-            ("", OpCode.Ret),
-        ]
-
-        bb = m.first.first
-
-        # Forward
-        for inst in bb:
-            self.assertEqual(inst.name, inst_list[i][0])
-            self.assertEqual(inst.opcode, inst_list[i][1])
-            for op in range(len(inst)):
-                o = inst.get_operand(op)
-                print(o.name)
-                o.dump()
-            inst.dump()
-            i += 1
-
-        # Backwards
-        for inst in reversed(bb):
-            i -= 1
-            self.assertEqual(inst.name, inst_list[i][0])
-            self.assertEqual(inst.opcode, inst_list[i][1])
-            inst.dump()

diff  --git a/llvm/bindings/python/llvm/tests/test_disassembler.py b/llvm/bindings/python/llvm/tests/test_disassembler.py
deleted file mode 100644
index d4620f69da733..0000000000000
--- a/llvm/bindings/python/llvm/tests/test_disassembler.py
+++ /dev/null
@@ -1,48 +0,0 @@
-from __future__ import print_function
-
-from .base import TestBase
-
-from ..disassembler import Disassembler, Option_UseMarkup
-
-
-class TestDisassembler(TestBase):
-    def test_instantiate(self):
-        Disassembler("i686-apple-darwin9")
-
-    def test_basic(self):
-        sequence = "\x67\xe3\x81"  # jcxz -127
-        triple = "i686-apple-darwin9"
-
-        disassembler = Disassembler(triple)
-
-        count, s = disassembler.get_instruction(sequence)
-        self.assertEqual(count, 3)
-        self.assertEqual(s, "\tjcxz\t-127")
-
-    def test_nonexistent_triple(self):
-        with self.assertRaisesRegex(
-            Exception, "Could not obtain disassembler for triple"
-        ):
-            Disassembler("nonexistent-triple-raises")
-
-    def test_get_instructions(self):
-        sequence = "\x67\xe3\x81\x01\xc7"  # jcxz -127; addl %eax, %edi
-
-        disassembler = Disassembler("i686-apple-darwin9")
-
-        instructions = list(disassembler.get_instructions(sequence))
-        self.assertEqual(len(instructions), 2)
-
-        self.assertEqual(instructions[0], (0, 3, "\tjcxz\t-127"))
-        self.assertEqual(instructions[1], (3, 2, "\taddl\t%eax, %edi"))
-
-    def test_set_options(self):
-        sequence = "\x10\x40\x2d\xe9"
-        triple = "arm-linux-android"
-
-        disassembler = Disassembler(triple)
-        disassembler.set_options(Option_UseMarkup)
-        count, s = disassembler.get_instruction(sequence)
-        print(s)
-        self.assertEqual(count, 4)
-        self.assertEqual(s, "\tpush\t{<reg:r4>, <reg:lr>}")

diff  --git a/llvm/bindings/python/llvm/tests/test_file b/llvm/bindings/python/llvm/tests/test_file
deleted file mode 100644
index 6c9b0385bd976..0000000000000
--- a/llvm/bindings/python/llvm/tests/test_file
+++ /dev/null
@@ -1 +0,0 @@
-I,"ìcAGðxq‘ÑԐ¹d«±ùà§vl¥À\»L>šg>`ö©ÿ©`‡wÉ©
\ No newline at end of file

diff  --git a/llvm/bindings/python/llvm/tests/test_object.py b/llvm/bindings/python/llvm/tests/test_object.py
deleted file mode 100644
index b9d5868dbfadc..0000000000000
--- a/llvm/bindings/python/llvm/tests/test_object.py
+++ /dev/null
@@ -1,70 +0,0 @@
-from numbers import Integral
-
-from .base import TestBase
-from ..object import ObjectFile
-from ..object import Relocation
-from ..object import Section
-from ..object import Symbol
-
-
-class TestObjectFile(TestBase):
-    def get_object_file(self):
-        source = self.get_test_binary()
-        return ObjectFile(filename=source)
-
-    def test_create_from_file(self):
-        self.get_object_file()
-
-    def test_get_sections(self):
-        o = self.get_object_file()
-
-        count = 0
-        for section in o.get_sections():
-            count += 1
-            assert isinstance(section, Section)
-            assert isinstance(section.name, str)
-            assert isinstance(section.size, Integral)
-            assert isinstance(section.contents, str)
-            assert isinstance(section.address, Integral)
-            assert len(section.contents) == section.size
-
-        self.assertGreater(count, 0)
-
-        for section in o.get_sections():
-            section.cache()
-
-    def test_get_symbols(self):
-        o = self.get_object_file()
-
-        count = 0
-        for symbol in o.get_symbols():
-            count += 1
-            assert isinstance(symbol, Symbol)
-            assert isinstance(symbol.name, str)
-            assert isinstance(symbol.address, Integral)
-            assert isinstance(symbol.size, Integral)
-
-        self.assertGreater(count, 0)
-
-        for symbol in o.get_symbols():
-            symbol.cache()
-
-    def test_symbol_section_accessor(self):
-        o = self.get_object_file()
-
-        for symbol in o.get_symbols():
-            section = symbol.section
-            assert isinstance(section, Section)
-
-            break
-
-    def test_get_relocations(self):
-        o = self.get_object_file()
-        for section in o.get_sections():
-            for relocation in section.get_relocations():
-                assert isinstance(relocation, Relocation)
-                assert isinstance(relocation.address, Integral)
-                assert isinstance(relocation.offset, Integral)
-                assert isinstance(relocation.type_number, Integral)
-                assert isinstance(relocation.type_name, str)
-                assert isinstance(relocation.value_string, str)

diff  --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst
index ecec6eb77a9ef..6e5579876c2e7 100644
--- a/llvm/docs/ReleaseNotes.rst
+++ b/llvm/docs/ReleaseNotes.rst
@@ -195,6 +195,11 @@ Changes to the X86 Backend
 Changes to the OCaml bindings
 -----------------------------
 
+Changes to the Python bindings
+-----------------------------
+
+* The python bindings have been removed.
+
 
 Changes to the C API
 --------------------


        


More information about the llvm-commits mailing list