From a357987597832a9c24d195302404328fd1f8e436 Mon Sep 17 00:00:00 2001 From: Siu Kwan Lam Date: Fri, 3 May 2013 10:45:02 -0500 Subject: [PATCH] Allow initialization of other targets. - Remove PTX/NVPTX targets from default built and init --- llvm/core.py | 25 ------------------ llvm/ee.py | 18 +++++++++++++ llvm/test_llvmpy.py | 7 ++--- llvmpy/gen/binding.py | 3 ++- llvmpy/src/Support/TargetSelect.py | 20 +++++++------- setup.py | 42 +++++++++++------------------- 6 files changed, 48 insertions(+), 67 deletions(-) diff --git a/llvm/core.py b/llvm/core.py index 0d0d1ae..478728b 100644 --- a/llvm/core.py +++ b/llvm/core.py @@ -2305,28 +2305,3 @@ if api.llvm.InitializeNativeTargetAsmPrinter(): # should user trigger the initialization? raise llvm.LLVMException("No native asm printer!?") -#===----------------------------------------------------------------------=== -# Initialization -#===----------------------------------------------------------------------=== - -HAS_PTX = HAS_NVPTX = False - -if True: # use PTX? - try: - api.LLVMInitializePTXTarget() - api.LLVMInitializePTXTargetInfo() - api.LLVMInitializePTXTargetMC() - api.LLVMInitializePTXAsmPrinter() - HAS_PTX = True - except AttributeError: - try: - api.LLVMInitializeNVPTXTarget() - api.LLVMInitializeNVPTXTargetInfo() - api.LLVMInitializeNVPTXTargetMC() - api.LLVMInitializeNVPTXAsmPrinter() - HAS_NVPTX = True - except AttributeError: - pass - - - diff --git a/llvm/ee.py b/llvm/ee.py index 1ef16ae..017d0e0 100644 --- a/llvm/ee.py +++ b/llvm/ee.py @@ -222,6 +222,24 @@ class ExecutionEngine(llvm.Wrapper): # Target machine #===----------------------------------------------------------------------=== +def initialize_target(target, noraise=False): + """Initialize target by name. + It is safe to initialize the same target multiple times. + """ + prefix = 'LLVMInitialize' + postfixes = ['Target', 'TargetInfo', 'TargetMC', 'AsmPrinter'] + try: + for postfix in postfixes: + getattr(api, '%s%s%s' % (prefix, target, postfix))() + except AttributeError: + if noraise: + return False + else: + raise + else: + return True + + def print_registered_targets(): ''' Note: print directly to stdout diff --git a/llvm/test_llvmpy.py b/llvm/test_llvmpy.py index 945ac41..b228138 100644 --- a/llvm/test_llvmpy.py +++ b/llvm/test_llvmpy.py @@ -636,12 +636,13 @@ class TestTargetMachines(TestCase): self.assertTrue(le.get_host_cpu_name()) def test_ptx(self): - if lc.HAS_PTX: + if le.initialize_target('PTX', noraise=True): arch = 'ptx64' - elif lc.HAS_NVPTX: + elif le.initialize_target('NVPTX', noraise=True): arch = 'nvptx64' else: return # skip this test + print(arch) m, func = self._build_module() func.calling_convention = lc.CC_PTX_KERNEL # set calling conv @@ -650,7 +651,7 @@ class TestTargetMachines(TestCase): self.assertTrue(ptxtm.cpu) ptxasm = ptxtm.emit_assembly(m) self.assertIn('foo', ptxasm) - if lc.HAS_NVPTX: + if arch == 'nvptx64': self.assertIn('.address_size 64', ptxasm) self.assertIn('sm_20', ptxasm) diff --git a/llvmpy/gen/binding.py b/llvmpy/gen/binding.py index eeccab1..8006fd9 100644 --- a/llvmpy/gen/binding.py +++ b/llvmpy/gen/binding.py @@ -841,7 +841,8 @@ class Attr(object): # # Pick-up environ var # -PTX_SUPPORT = os.environ.get('LLVMPY_PTX_SUPPORT', '') + +TARGETS_BUILT = os.environ.get('LLVM_TARGETS_BUILT', '').split() def _parse_llvm_version(ver): import re diff --git a/llvmpy/src/Support/TargetSelect.py b/llvmpy/src/Support/TargetSelect.py index 85e1d74..3e638bc 100644 --- a/llvmpy/src/Support/TargetSelect.py +++ b/llvmpy/src/Support/TargetSelect.py @@ -1,8 +1,11 @@ +import os from binding import * from ..namespace import llvm, default llvm.includes.add('llvm/Support/TargetSelect.h') + + InitializeNativeTarget = llvm.Function('InitializeNativeTarget') InitializeNativeTargetAsmPrinter = llvm.Function( 'InitializeNativeTargetAsmPrinter', cast(Bool, bool)) @@ -11,20 +14,15 @@ InitializeNativeTargetAsmParser = llvm.Function( InitializeNativeTargetDisassembler = llvm.Function( 'InitializeNativeTargetDisassembler', cast(Bool, bool)) - #InitializeAllTargets = llvm.Function('InitializeAllTargets') #InitializeAllTargetInfos = llvm.Function('InitializeAllTargetInfos') #InitializeAllTargetMCs = llvm.Function('InitializeAllTargetMCs') #InitializeAllAsmPrinters = llvm.Function('InitializeAllAsmPrinters') -if PTX_SUPPORT == 'PTX': - LLVMInitializePTXTarget = default.Function('LLVMInitializePTXTarget') - LLVMInitializePTXTargetInfo = default.Function('LLVMInitializePTXTargetInfo') - LLVMInitializePTXTargetMC = default.Function('LLVMInitializePTXTargetMC') - LLVMInitializePTXAsmPrinter = default.Function('LLVMInitializePTXAsmPrinter') +for target in TARGETS_BUILT: + decls = 'Target', 'TargetInfo', 'TargetMC', 'AsmPrinter' + for k in map(lambda x: 'LLVMInitialize%s%s' % (target, x), decls): + if k == 'LLVMInitializeCppBackendAsmPrinter': + continue + globals()[k] = default.Function(k) -if PTX_SUPPORT == 'NVPTX': - LLVMInitializeNVPTXTarget = default.Function('LLVMInitializeNVPTXTarget') - LLVMInitializeNVPTXTargetInfo = default.Function('LLVMInitializeNVPTXTargetInfo') - LLVMInitializeNVPTXTargetMC = default.Function('LLVMInitializeNVPTXTargetMC') - LLVMInitializeNVPTXAsmPrinter = default.Function('LLVMInitializeNVPTXAsmPrinter') diff --git a/setup.py b/setup.py index 8202c5f..b74ec71 100644 --- a/setup.py +++ b/setup.py @@ -1,3 +1,4 @@ +from __future__ import print_function import os import sys from subprocess import Popen, PIPE, check_call @@ -37,6 +38,11 @@ def run_llvm_config(extra_args): llvm_version = run_llvm_config(['--version']) print('LLVM version = %r' % llvm_version) +targets_built = run_llvm_config(['--targets-built']) +include_targets = set(os.environ.get('LLVMPY_TARGETS', '').split()) +targets_built = ' '.join(set(targets_built.split()) & include_targets) +print('LLVM targets = %s' % targets_built) + def get_libs_and_objs(components): parts = run_llvm_config(['--libs'] + components).split() libs = [] @@ -97,36 +103,20 @@ def determine_to_use_dynlink(libdir, llvm_version): dynlink = determine_to_use_dynlink(libdir, llvm_version) -ptx_support = '' + if dynlink: print('Using dynamic linking') libs_core = ['LLVM-%s' % llvm_version] objs_core = [] else: + extra_components = set() + for tm in map(lambda s: s.lower(), targets_built.split()): + postfixes = ['', 'asmprinter', 'codegen', 'desc', 'info'] + for postfix in postfixes: + extra_components.add(tm + postfix) enabled_components = set(get_enabled_components()) - ptx_components = set(['ptx', - 'ptxasmprinter', - 'ptxcodegen', - 'ptxdesc', - 'ptxinfo']) - nvptx_components = set(['nvptx', - 'nvptxasmprinter', - 'nvptxcodegen', - 'nvptxdesc', - 'nvptxinfo']) - - extra_components = [] - if (nvptx_components & enabled_components) == nvptx_components: - print("Using NVPTX") - extra_components.extend(nvptx_components) - ptx_support = 'NVPTX' - elif (ptx_components & enabled_components) == ptx_components: - print("Using PTX") - extra_components.extend(ptx_components) - ptx_support = 'PTX' - else: - print("No CUDA support") + extra_components = list(extra_components & enabled_components) libs_core, objs_core = get_libs_and_objs( ['core', 'analysis', 'scalaropts', 'executionengine', @@ -136,15 +126,13 @@ else: + extra_components) if sys.platform == 'win32': - # If no PTX lib got added, disable PTX in the build - if 'LLVMPTXCodeGen' in libs_core: - ptx_support = 'ptx' + pass else: macros.append(('_GNU_SOURCE', None)) # auto generate bindings -os.environ['LLVMPY_PTX_SUPPORT'] = ptx_support os.environ['LLVMPY_LLVM_VERSION'] = llvm_version +os.environ['LLVM_TARGETS_BUILT'] = targets_built check_call([sys.executable, 'llvmpy/build.py']) # generate shared objects