diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2013-12-22 00:04:03 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2013-12-22 00:04:03 +0000 | 
| commit | f8af5cf600354830d4ccf59732403f0f073eccb9 (patch) | |
| tree | 2ba0398b4c42ad4f55561327538044fd2c925a8b /bindings/python/llvm/disassembler.py | |
| parent | 59d6cff90eecf31cb3dd860c4e786674cfdd42eb (diff) | |
Notes
Diffstat (limited to 'bindings/python/llvm/disassembler.py')
| -rw-r--r-- | bindings/python/llvm/disassembler.py | 29 | 
1 files changed, 27 insertions, 2 deletions
diff --git a/bindings/python/llvm/disassembler.py b/bindings/python/llvm/disassembler.py index dcef9ac26905..f2df275bf4a0 100644 --- a/bindings/python/llvm/disassembler.py +++ b/bindings/python/llvm/disassembler.py @@ -10,7 +10,6 @@  from ctypes import CFUNCTYPE  from ctypes import POINTER  from ctypes import addressof -from ctypes import byref  from ctypes import c_byte  from ctypes import c_char_p  from ctypes import c_int @@ -34,6 +33,29 @@ 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. @@ -48,9 +70,12 @@ class Disassembler(LLVMObject):          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.contents: +        if not ptr:              raise Exception('Could not obtain disassembler for triple: %s' %                              triple)  | 
