0

我将 llvmlite 与 Pyvex 结合用于我的项目。我在 llvmlite 中定义了一些函数,如下所示:

def int32(val): 
    return ir.Constant(ir.IntType(32), val)


def put64(putoffset, val):
    llvmtmp = builder.gep(regtag, (int32(0), int32(putoffset)), True)
    return builder.store(val, llvmtmp)

但是,当我想使用以下代码调用此函数时:

for stmt in irsb.statements:
   if isinstance(stmt, pyvex.IRStmt.Put):
      putoffset = stmt.offset
      put64("t3", putoffset)

我遇到错误: AttributeError: 'int' object has no attribute 'type'

有谁知道我该如何解决这个问题?

4

2 回答 2

1

我做了一点挖掘。问题发生在这条线上

return ir.Constant(ir.IntType(32), val)在你的int32()功能中。

常量在 llvmlite 中是这样定义的:

 Constant(typ, constant)

typ是表示值的类型(a :class: ~llvmlite.ir.Typeinstance)。 常量是要表示的 Python 值。常量允许 哪些 Python 类型 常量允许哪些 Python 类型取决于类型。

无需传入 Python 类型,您只需传入intstringas即可val。试着把type()它放在一边。

return ir.Constant(ir.IntType(32), type(val))

希望这可以帮助

于 2017-07-09T23:31:03.867 回答
0

我明白这个问题。实际上问题是我们将一个字符串传递给函数,但它需要是一个 llvmlite 对象。因此 python 抱怨字符串没有属性类型。传递 llvmlite 对象,问题就解决了。

于 2017-07-10T23:07:37.067 回答