aboutsummaryrefslogtreecommitdiffstats
path: root/bindings
diff options
context:
space:
mode:
authorAnders Waldenborg <anders@0x63.nu>2013-11-17 15:17:08 +0000
committerAnders Waldenborg <anders@0x63.nu>2013-11-17 15:17:08 +0000
commit60e4d7f618ffc8b91c6fa2638e3c25a085c2fb1e (patch)
tree423808573938e9e19396fb2e369373c4d0aafecf /bindings
parentd192b52a612141b25a8ca749068b6424086aecff (diff)
downloadexternal_llvm-60e4d7f618ffc8b91c6fa2638e3c25a085c2fb1e.zip
external_llvm-60e4d7f618ffc8b91c6fa2638e3c25a085c2fb1e.tar.gz
external_llvm-60e4d7f618ffc8b91c6fa2638e3c25a085c2fb1e.tar.bz2
python: Properly initialize before trying to create disasm
As the "LLVMInitializeAll*" functions are not available as symbols in the shared library they can't be used, and as a workaround a list of the targets is kept and the individual symbols tried. As soon as the "All"-functions are changed to proper symbols (as opposed to static inlines in the headers) this hack will be replace with simple calls to the corresponding "LLVMInitializeAll*" functions. Reviewed By: indygreg CC: llvm-commits Differential Revision: http://llvm-reviews.chandlerc.com/D1879 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194964 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'bindings')
-rw-r--r--bindings/python/llvm/disassembler.py26
1 files changed, 26 insertions, 0 deletions
diff --git a/bindings/python/llvm/disassembler.py b/bindings/python/llvm/disassembler.py
index 2a1b701..9e781ae 100644
--- a/bindings/python/llvm/disassembler.py
+++ b/bindings/python/llvm/disassembler.py
@@ -33,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.
@@ -47,6 +70,9 @@ 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: