llvmlite: update and patch
Still needs more difficult modifications elsewhere to support this majority of labs using windoze and/or conda garbage.
This commit is contained in:
parent
1bcfecb9d7
commit
3994e503bb
|
@ -0,0 +1,62 @@
|
||||||
|
diff --git a/ffi/targets.cpp b/ffi/targets.cpp
|
||||||
|
index 98de259fc..1ce472c20 100644
|
||||||
|
--- a/ffi/targets.cpp
|
||||||
|
+++ b/ffi/targets.cpp
|
||||||
|
@@ -182,7 +182,8 @@ LLVMPY_CreateTargetMachine(LLVMTargetRef T,
|
||||||
|
const char *RelocModel,
|
||||||
|
const char *CodeModel,
|
||||||
|
int PrintMC,
|
||||||
|
- int JIT)
|
||||||
|
+ int JIT,
|
||||||
|
+ const char *ABIName)
|
||||||
|
{
|
||||||
|
using namespace llvm;
|
||||||
|
CodeGenOpt::Level cgol;
|
||||||
|
@@ -233,6 +234,7 @@ LLVMPY_CreateTargetMachine(LLVMTargetRef T,
|
||||||
|
|
||||||
|
TargetOptions opt;
|
||||||
|
opt.PrintMachineCode = PrintMC;
|
||||||
|
+ opt.MCOptions.ABIName = ABIName;
|
||||||
|
|
||||||
|
bool jit = JIT;
|
||||||
|
|
||||||
|
diff --git a/llvmlite/binding/targets.py b/llvmlite/binding/targets.py
|
||||||
|
index eb53f09f2..a7e6ffdc3 100644
|
||||||
|
--- a/llvmlite/binding/targets.py
|
||||||
|
+++ b/llvmlite/binding/targets.py
|
||||||
|
@@ -218,7 +218,7 @@ def __str__(self):
|
||||||
|
|
||||||
|
def create_target_machine(self, cpu='', features='',
|
||||||
|
opt=2, reloc='default', codemodel='jitdefault',
|
||||||
|
- printmc=False, jit=False):
|
||||||
|
+ printmc=False, jit=False, abiname=''):
|
||||||
|
"""
|
||||||
|
Create a new TargetMachine for this target and the given options.
|
||||||
|
|
||||||
|
@@ -230,6 +230,9 @@ def create_target_machine(self, cpu='', features='',
|
||||||
|
|
||||||
|
The `jit` option should be set when the target-machine is to be used
|
||||||
|
in a JIT engine.
|
||||||
|
+
|
||||||
|
+ The `abiname` option specifies the ABI. RISC-V targets with hard-float
|
||||||
|
+ needs to pass the ABI name to LLVM.
|
||||||
|
"""
|
||||||
|
assert 0 <= opt <= 3
|
||||||
|
assert reloc in RELOC
|
||||||
|
@@ -249,6 +252,7 @@ def create_target_machine(self, cpu='', features='',
|
||||||
|
_encode_string(codemodel),
|
||||||
|
int(printmc),
|
||||||
|
int(jit),
|
||||||
|
+ _encode_string(abiname),
|
||||||
|
)
|
||||||
|
if tm:
|
||||||
|
return TargetMachine(tm)
|
||||||
|
@@ -403,6 +407,8 @@ def has_svml():
|
||||||
|
c_int,
|
||||||
|
# JIT
|
||||||
|
c_int,
|
||||||
|
+ # ABIName
|
||||||
|
+ c_char_p,
|
||||||
|
]
|
||||||
|
ffi.lib.LLVMPY_CreateTargetMachine.restype = ffi.LLVMTargetMachineRef
|
||||||
|
|
|
@ -0,0 +1,185 @@
|
||||||
|
diff --git a/llvmlite/ir/builder.py b/llvmlite/ir/builder.py
|
||||||
|
index f18a8d8bd..b4958770e 100644
|
||||||
|
--- a/llvmlite/ir/builder.py
|
||||||
|
+++ b/llvmlite/ir/builder.py
|
||||||
|
@@ -872,14 +872,14 @@ def resume(self, landingpad):
|
||||||
|
# Call APIs
|
||||||
|
|
||||||
|
def call(self, fn, args, name='', cconv=None, tail=False, fastmath=(),
|
||||||
|
- attrs=()):
|
||||||
|
+ attrs=(), arg_attrs=None):
|
||||||
|
"""
|
||||||
|
Call function *fn* with *args*:
|
||||||
|
name = fn(args...)
|
||||||
|
"""
|
||||||
|
inst = instructions.CallInstr(self.block, fn, args, name=name,
|
||||||
|
cconv=cconv, tail=tail, fastmath=fastmath,
|
||||||
|
- attrs=attrs)
|
||||||
|
+ attrs=attrs, arg_attrs=arg_attrs)
|
||||||
|
self._insert(inst)
|
||||||
|
return inst
|
||||||
|
|
||||||
|
@@ -908,9 +908,11 @@ def store_reg(self, value, reg_type, reg_name, name=''):
|
||||||
|
return self.asm(ftype, "", "{%s}" % reg_name, [value], True, name)
|
||||||
|
|
||||||
|
def invoke(self, fn, args, normal_to, unwind_to,
|
||||||
|
- name='', cconv=None, tail=False):
|
||||||
|
+ name='', cconv=None, fastmath=(), attrs=(), arg_attrs=None):
|
||||||
|
inst = instructions.InvokeInstr(self.block, fn, args, normal_to,
|
||||||
|
- unwind_to, name=name, cconv=cconv)
|
||||||
|
+ unwind_to, name=name, cconv=cconv,
|
||||||
|
+ fastmath=fastmath, attrs=attrs,
|
||||||
|
+ arg_attrs=arg_attrs)
|
||||||
|
self._set_terminator(inst)
|
||||||
|
return inst
|
||||||
|
|
||||||
|
diff --git a/llvmlite/ir/instructions.py b/llvmlite/ir/instructions.py
|
||||||
|
index 7e82ee032..f337c1586 100644
|
||||||
|
--- a/llvmlite/ir/instructions.py
|
||||||
|
+++ b/llvmlite/ir/instructions.py
|
||||||
|
@@ -5,7 +5,7 @@
|
||||||
|
from llvmlite.ir import types
|
||||||
|
from llvmlite.ir.values import (Block, Function, Value, NamedValue, Constant,
|
||||||
|
MetaDataArgument, MetaDataString, AttributeSet,
|
||||||
|
- Undefined)
|
||||||
|
+ Undefined, ArgumentAttributes)
|
||||||
|
from llvmlite.ir._utils import _HasMetadata
|
||||||
|
|
||||||
|
|
||||||
|
@@ -63,13 +63,20 @@ class FastMathFlags(AttributeSet):
|
||||||
|
|
||||||
|
class CallInstr(Instruction):
|
||||||
|
def __init__(self, parent, func, args, name='', cconv=None, tail=False,
|
||||||
|
- fastmath=(), attrs=()):
|
||||||
|
+ fastmath=(), attrs=(), arg_attrs=None):
|
||||||
|
self.cconv = (func.calling_convention
|
||||||
|
if cconv is None and isinstance(func, Function)
|
||||||
|
else cconv)
|
||||||
|
self.tail = tail
|
||||||
|
self.fastmath = FastMathFlags(fastmath)
|
||||||
|
self.attributes = CallInstrAttributes(attrs)
|
||||||
|
+ self.arg_attributes = {}
|
||||||
|
+ if arg_attrs:
|
||||||
|
+ for idx, attrs in arg_attrs.items():
|
||||||
|
+ if not (0 <= idx < len(args)):
|
||||||
|
+ raise ValueError("Invalid argument index {}"
|
||||||
|
+ .format(idx))
|
||||||
|
+ self.arg_attributes[idx] = ArgumentAttributes(attrs)
|
||||||
|
|
||||||
|
# Fix and validate arguments
|
||||||
|
args = list(args)
|
||||||
|
@@ -111,8 +118,13 @@ def called_function(self):
|
||||||
|
return self.callee
|
||||||
|
|
||||||
|
def _descr(self, buf, add_metadata):
|
||||||
|
- args = ', '.join(['{0} {1}'.format(a.type, a.get_reference())
|
||||||
|
- for a in self.args])
|
||||||
|
+ def descr_arg(i, a):
|
||||||
|
+ if i in self.arg_attributes:
|
||||||
|
+ attrs = ' '.join(self.arg_attributes[i]._to_list()) + ' '
|
||||||
|
+ else:
|
||||||
|
+ attrs = ''
|
||||||
|
+ return '{0} {1}{2}'.format(a.type, attrs, a.get_reference())
|
||||||
|
+ args = ', '.join([descr_arg(i, a) for i, a in enumerate(self.args)])
|
||||||
|
|
||||||
|
fnty = self.callee.function_type
|
||||||
|
# Only print function type if variable-argument
|
||||||
|
@@ -142,10 +154,12 @@ def descr(self, buf):
|
||||||
|
|
||||||
|
class InvokeInstr(CallInstr):
|
||||||
|
def __init__(self, parent, func, args, normal_to, unwind_to, name='',
|
||||||
|
- cconv=None):
|
||||||
|
+ cconv=None, fastmath=(), attrs=(), arg_attrs=None):
|
||||||
|
assert isinstance(normal_to, Block)
|
||||||
|
assert isinstance(unwind_to, Block)
|
||||||
|
- super(InvokeInstr, self).__init__(parent, func, args, name, cconv)
|
||||||
|
+ super(InvokeInstr, self).__init__(parent, func, args, name, cconv,
|
||||||
|
+ tail=False, fastmath=fastmath,
|
||||||
|
+ attrs=attrs, arg_attrs=arg_attrs)
|
||||||
|
self.opname = "invoke"
|
||||||
|
self.normal_to = normal_to
|
||||||
|
self.unwind_to = unwind_to
|
||||||
|
diff --git a/llvmlite/tests/test_ir.py b/llvmlite/tests/test_ir.py
|
||||||
|
index e97e528ac..ab5864719 100644
|
||||||
|
--- a/llvmlite/tests/test_ir.py
|
||||||
|
+++ b/llvmlite/tests/test_ir.py
|
||||||
|
@@ -1181,6 +1181,39 @@ def test_call_metadata(self):
|
||||||
|
call void @"llvm.dbg.declare"(metadata i32* %"a", metadata !0, metadata !0)
|
||||||
|
""") # noqa E501
|
||||||
|
|
||||||
|
+ def test_call_attributes(self):
|
||||||
|
+ block = self.block(name='my_block')
|
||||||
|
+ builder = ir.IRBuilder(block)
|
||||||
|
+ fun_ty = ir.FunctionType(
|
||||||
|
+ ir.VoidType(), (int32.as_pointer(), int32, int32.as_pointer()))
|
||||||
|
+ fun = ir.Function(builder.function.module, fun_ty, 'fun')
|
||||||
|
+ fun.args[0].add_attribute('sret')
|
||||||
|
+ retval = builder.alloca(int32, name='retval')
|
||||||
|
+ other = builder.alloca(int32, name='other')
|
||||||
|
+ builder.call(
|
||||||
|
+ fun,
|
||||||
|
+ (retval, ir.Constant(int32, 42), other),
|
||||||
|
+ arg_attrs={
|
||||||
|
+ 0: ('sret', 'noalias'),
|
||||||
|
+ 2: 'noalias'
|
||||||
|
+ }
|
||||||
|
+ )
|
||||||
|
+ self.check_block(block, """\
|
||||||
|
+ my_block:
|
||||||
|
+ %"retval" = alloca i32
|
||||||
|
+ %"other" = alloca i32
|
||||||
|
+ call void @"fun"(i32* noalias sret %"retval", i32 42, i32* noalias %"other")
|
||||||
|
+ """) # noqa E501
|
||||||
|
+
|
||||||
|
+ def test_invalid_call_attributes(self):
|
||||||
|
+ block = self.block()
|
||||||
|
+ builder = ir.IRBuilder(block)
|
||||||
|
+ fun_ty = ir.FunctionType(ir.VoidType(), ())
|
||||||
|
+ fun = ir.Function(builder.function.module, fun_ty, 'fun')
|
||||||
|
+ with self.assertRaises(ValueError):
|
||||||
|
+ # The function has no arguments, so this should fail.
|
||||||
|
+ builder.call(fun, (), arg_attrs={0: 'sret'})
|
||||||
|
+
|
||||||
|
def test_invoke(self):
|
||||||
|
block = self.block(name='my_block')
|
||||||
|
builder = ir.IRBuilder(block)
|
||||||
|
@@ -1196,6 +1229,39 @@ def test_invoke(self):
|
||||||
|
to label %"normal" unwind label %"unwind"
|
||||||
|
""")
|
||||||
|
|
||||||
|
+ def test_invoke_attributes(self):
|
||||||
|
+ block = self.block(name='my_block')
|
||||||
|
+ builder = ir.IRBuilder(block)
|
||||||
|
+ fun_ty = ir.FunctionType(
|
||||||
|
+ ir.VoidType(), (int32.as_pointer(), int32, int32.as_pointer()))
|
||||||
|
+ fun = ir.Function(builder.function.module, fun_ty, 'fun')
|
||||||
|
+ fun.calling_convention = "fastcc"
|
||||||
|
+ fun.args[0].add_attribute('sret')
|
||||||
|
+ retval = builder.alloca(int32, name='retval')
|
||||||
|
+ other = builder.alloca(int32, name='other')
|
||||||
|
+ bb_normal = builder.function.append_basic_block(name='normal')
|
||||||
|
+ bb_unwind = builder.function.append_basic_block(name='unwind')
|
||||||
|
+ builder.invoke(
|
||||||
|
+ fun,
|
||||||
|
+ (retval, ir.Constant(int32, 42), other),
|
||||||
|
+ bb_normal,
|
||||||
|
+ bb_unwind,
|
||||||
|
+ cconv='fastcc',
|
||||||
|
+ fastmath='fast',
|
||||||
|
+ attrs='noinline',
|
||||||
|
+ arg_attrs={
|
||||||
|
+ 0: ('sret', 'noalias'),
|
||||||
|
+ 2: 'noalias'
|
||||||
|
+ }
|
||||||
|
+ )
|
||||||
|
+ self.check_block(block, """\
|
||||||
|
+ my_block:
|
||||||
|
+ %"retval" = alloca i32
|
||||||
|
+ %"other" = alloca i32
|
||||||
|
+ invoke fast fastcc void @"fun"(i32* noalias sret %"retval", i32 42, i32* noalias %"other") noinline
|
||||||
|
+ to label %"normal" unwind label %"unwind"
|
||||||
|
+ """) # noqa E501
|
||||||
|
+
|
||||||
|
def test_landingpad(self):
|
||||||
|
block = self.block(name='my_block')
|
||||||
|
builder = ir.IRBuilder(block)
|
|
@ -2,11 +2,15 @@
|
||||||
|
|
||||||
python3Packages.buildPythonPackage rec {
|
python3Packages.buildPythonPackage rec {
|
||||||
pname = "llvmlite";
|
pname = "llvmlite";
|
||||||
version = "0.37.0rc2";
|
version = "0.37.0-artiq";
|
||||||
src = python3Packages.fetchPypi {
|
src = python3Packages.fetchPypi {
|
||||||
inherit pname version;
|
inherit pname;
|
||||||
sha256 = "sha256-F1quz+76JOt1jaQPVzdKe7RfN6gWG2lyE82qTvgyY/c=";
|
version = "0.37.0";
|
||||||
|
sha256 = "sha256-Y5K4cM0BjsDGRda7uRjWqg7sqMYmdLqu4whi1raGWxU=";
|
||||||
};
|
};
|
||||||
|
# https://github.com/numba/llvmlite/pull/702
|
||||||
|
# https://github.com/numba/llvmlite/pull/775
|
||||||
|
patches = [ ./llvmlite-callsite.diff ./llvmlite-abiname.diff ];
|
||||||
nativeBuildInputs = [ llvm_11 ];
|
nativeBuildInputs = [ llvm_11 ];
|
||||||
# Disable static linking
|
# Disable static linking
|
||||||
# https://github.com/numba/llvmlite/issues/93
|
# https://github.com/numba/llvmlite/issues/93
|
||||||
|
|
Loading…
Reference in New Issue