Example #1
0
 def test_normalize_ir_text(self):
     # non-unicode input
     out = cgutils.normalize_ir_text('abc')
     # str returned
     self.assertIsInstance(out, str)
     # try encoding to latin
     out.encode('latin1')
Example #2
0
 def test_normalize_ir_text_py3(self):
     # unicode input
     out = cgutils.normalize_ir_text(unicode_name2)
     # str returned
     self.assertIsInstance(out, str)
     # try encoding to latin
     out.encode('latin1')
Example #3
0
 def test_normalize_ir_text(self):
     # non-unicode input
     out = cgutils.normalize_ir_text('abc')
     # str returned
     self.assertIsInstance(out, str)
     # try encoding to latin
     out.encode('latin1')
Example #4
0
 def test_normalize_ir_text_py3(self):
     # unicode input
     out = cgutils.normalize_ir_text(unicode_name2)
     # str returned
     self.assertIsInstance(out, str)
     # try encoding to latin
     out.encode('latin1')
Example #5
0
 def __init__(self, codegen, name):
     self._codegen = codegen
     self._name = name
     self._linking_libraries = set()
     self._final_module = ll.parse_assembly(
         str(self._codegen._create_empty_module(self._name)))
     self._final_module.name = cgutils.normalize_ir_text(self._name)
     self._shared_module = None
     # Track names of the dynamic globals
     self._dynamic_globals = []
Example #6
0
 def __init__(self, codegen, name):
     self._codegen = codegen
     self._name = name
     self._linking_libraries = set()
     self._final_module = ll.parse_assembly(
         str(self._codegen._create_empty_module(self._name)))
     self._final_module.name = cgutils.normalize_ir_text(self._name)
     # Remember this on the module, for the object cache hooks
     self._final_module.__library = weakref.proxy(self)
     self._shared_module = None
Example #7
0
 def __init__(self, codegen, name):
     self._codegen = codegen
     self._name = name
     self._linking_libraries = set()
     self._final_module = ll.parse_assembly(
         str(self._codegen._create_empty_module(self._name)))
     self._final_module.name = cgutils.normalize_ir_text(self._name)
     # Remember this on the module, for the object cache hooks
     self._final_module.__library = weakref.proxy(self)
     self._shared_module = None
Example #8
0
 def __init__(self, codegen, name):
     self._codegen = codegen
     self._name = name
     self._linking_libraries = set()
     self._final_module = ll.parse_assembly(
         str(self._codegen._create_empty_module(self._name)))
     self._final_module.name = cgutils.normalize_ir_text(self._name)
     self._shared_module = None
     # Track names of the dynamic globals
     self._dynamic_globals = []
Example #9
0
 def add_ir_module(self, ir_module):
     """
     Add a LLVM IR module's contents to this library.
     """
     self._raise_if_finalized()
     assert isinstance(ir_module, llvmir.Module)
     ir = cgutils.normalize_ir_text(str(ir_module))
     ll_module = ll.parse_assembly(ir)
     ll_module.name = ir_module.name
     ll_module.verify()
     self.add_llvm_module(ll_module)
Example #10
0
 def add_ir_module(self, ir_module):
     """
     Add a LLVM IR module's contents to this library.
     """
     self._raise_if_finalized()
     assert isinstance(ir_module, llvmir.Module)
     ir = cgutils.normalize_ir_text(str(ir_module))
     ll_module = ll.parse_assembly(ir)
     ll_module.name = ir_module.name
     ll_module.verify()
     self.add_llvm_module(ll_module)
Example #11
0
def remove_redundant_nrt_refct(ll_module):
    """
    Remove redundant reference count operations from the
    `llvmlite.binding.ModuleRef`. This parses the ll_module as a string and
    line by line to remove the unnecessary nrt refct pairs within each block.
    Decref calls are moved after the last incref call in the block to avoid
    temporarily decref'ing to zero (which can happen due to hidden decref from
    alias).

    Note: non-threadsafe due to usage of global LLVMcontext
    """
    # Early escape if NRT_incref is not used
    try:
        ll_module.get_function('NRT_incref')
    except NameError:
        return ll_module

    # the optimisation pass loses the name of module as it operates on
    # strings, so back it up and reset it on completion
    name = ll_module.name
    newll = _remove_redundant_nrt_refct(str(ll_module))
    new_mod = ll.parse_assembly(newll)
    new_mod.name = cgutils.normalize_ir_text(name)
    return new_mod
Example #12
0
def remove_redundant_nrt_refct(ll_module):
    """
    Remove redundant reference count operations from the
    `llvmlite.binding.ModuleRef`. This parses the ll_module as a string and
    line by line to remove the unnecessary nrt refct pairs within each block.
    Decref calls are moved after the last incref call in the block to avoid
    temporarily decref'ing to zero (which can happen due to hidden decref from
    alias).

    Note: non-threadsafe due to usage of global LLVMcontext
    """
    # Early escape if NRT_incref is not used
    try:
        ll_module.get_function('NRT_incref')
    except NameError:
        return ll_module

    # the optimisation pass loses the name of module as it operates on
    # strings, so back it up and reset it on completion
    name = ll_module.name
    newll = _remove_redundant_nrt_refct(str(ll_module))
    new_mod = ll.parse_assembly(newll)
    new_mod.name = cgutils.normalize_ir_text(name)
    return new_mod
Example #13
0
 def _create_empty_module(self, name):
     ir_module = lc.Module(cgutils.normalize_ir_text(name))
     ir_module.triple = ll.get_process_triple()
     if self._data_layout:
         ir_module.data_layout = self._data_layout
     return ir_module
Example #14
0
 def _create_empty_module(self, name):
     ir_module = lc.Module(cgutils.normalize_ir_text(name))
     ir_module.triple = ll.get_process_triple()
     if self._data_layout:
         ir_module.data_layout = self._data_layout
     return ir_module