Skip to content

Commit

Permalink
python: Properly initialize before trying to create disasm
Browse files Browse the repository at this point in the history
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
  • Loading branch information
wanders committed Nov 17, 2013
1 parent d192b52 commit 60e4d7f
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions bindings/python/llvm/disassembler.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,29 @@
# 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.
Expand All @@ -47,6 +70,9 @@ def __init__(self, triple):
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:
Expand Down

0 comments on commit 60e4d7f

Please sign in to comment.