在 llvmlite 中声明函数 which returns void 时出现 AssertionError
AssertionError while declaring function which returns void in llvmlite
我正在尝试创建一个在 llvm-ir 中 return 无效的函数,但是创建这样的函数会出现 AssertionError
import llvmlite.ir as ir
int32 = ir.IntType(32)
m = ir.Module('demo')
main_ty = ir.FunctionType(int32, [])
main_fn = ir.Function(m, main_ty, "main")
print(str(m))
上面的代码工作正常,因为 return 类型是 int32
,并给出以下输出,这是预期的。
; ModuleID = "demo"
target triple = "unknown-unknown-unknown"
target datalayout = ""
declare i32 @"main"()
但是当我将 return 类型从 int32
更改为 VoidType
时,它引发了 AssertionError。
m = ir.Module('demo')
main_ty = ir.FunctionType(ir.VoidType, [])
main_fn = ir.Function(m, main_ty, "main")
print(str(m))
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
<ipython-input-2-298d109233fd> in <module>
1 m = ir.Module('demo')
2 main_ty = ir.FunctionType(ir.VoidType, [])
----> 3 main_fn = ir.Function(m, main_ty, "main")
4 print(str(m))
~/.local/lib/python3.6/site-packages/llvmlite/ir/values.py in __init__(self, module, ftype, name)
593 self.args = tuple([Argument(self, t)
594 for t in ftype.args])
--> 595 self.return_value = ReturnValue(self, ftype.return_type)
596 self.parent.add_global(self)
597 self.calling_convention = ''
~/.local/lib/python3.6/site-packages/llvmlite/ir/values.py in __init__(self, parent, typ, name)
718 class _BaseArgument(NamedValue):
719 def __init__(self, parent, typ, name=''):
--> 720 assert isinstance(typ, types.Type)
721 super(_BaseArgument, self).__init__(parent, typ, name=name)
722 self.parent = parent
AssertionError:
任何人都可以帮我解决我在这里遗漏的问题吗?
VoidType
就像 IntType
一样是 class。您仍然需要应用它(零参数)来创建一个实例:
main_ty = ir.FunctionType(ir.VoidType(), [])
// ^^
我正在尝试创建一个在 llvm-ir 中 return 无效的函数,但是创建这样的函数会出现 AssertionError
import llvmlite.ir as ir
int32 = ir.IntType(32)
m = ir.Module('demo')
main_ty = ir.FunctionType(int32, [])
main_fn = ir.Function(m, main_ty, "main")
print(str(m))
上面的代码工作正常,因为 return 类型是 int32
,并给出以下输出,这是预期的。
; ModuleID = "demo"
target triple = "unknown-unknown-unknown"
target datalayout = ""
declare i32 @"main"()
但是当我将 return 类型从 int32
更改为 VoidType
时,它引发了 AssertionError。
m = ir.Module('demo')
main_ty = ir.FunctionType(ir.VoidType, [])
main_fn = ir.Function(m, main_ty, "main")
print(str(m))
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
<ipython-input-2-298d109233fd> in <module>
1 m = ir.Module('demo')
2 main_ty = ir.FunctionType(ir.VoidType, [])
----> 3 main_fn = ir.Function(m, main_ty, "main")
4 print(str(m))
~/.local/lib/python3.6/site-packages/llvmlite/ir/values.py in __init__(self, module, ftype, name)
593 self.args = tuple([Argument(self, t)
594 for t in ftype.args])
--> 595 self.return_value = ReturnValue(self, ftype.return_type)
596 self.parent.add_global(self)
597 self.calling_convention = ''
~/.local/lib/python3.6/site-packages/llvmlite/ir/values.py in __init__(self, parent, typ, name)
718 class _BaseArgument(NamedValue):
719 def __init__(self, parent, typ, name=''):
--> 720 assert isinstance(typ, types.Type)
721 super(_BaseArgument, self).__init__(parent, typ, name=name)
722 self.parent = parent
AssertionError:
任何人都可以帮我解决我在这里遗漏的问题吗?
VoidType
就像 IntType
一样是 class。您仍然需要应用它(零参数)来创建一个实例:
main_ty = ir.FunctionType(ir.VoidType(), [])
// ^^