【发布时间】:2016-07-26 21:54:01
【问题描述】:
我正在查看由 clang 转换为 cpp 文件的 llvm ir 文件。但是我发现 llvm ir 文件中有几个函数只有声明而没有定义。而且所有这些功能都不是“内置”功能,例如:
declare i32 @puts(i8* nocapture)
就像:
declare void @_ZNK5Arrow7BaseRow9getColumnINS_11IpGenPrefixEEEvtRT_(%"class.Arrow::BaseRow"*, i16 zeroext, %"class.Arrow::IpGenPrefix"* dereferenceable(24)) #0
这些函数似乎使用了一些外部定义?我是 LLVM IR 的新手。我想知道 LLVM IR 有没有办法像 cpp 库那样做,我可以存储我将在一些 LLVM IR 库中使用的函数,并通过像 include 这样的操作在 .ll 文件中使用它们?
谢谢
【问题讨论】:
-
您确定包含定义
Arrow::BaseRow::getColumn<Arrow::IpGenPrefix>的文件吗? -
不,没有包含声明类型。显然,它可以通过一些插入声明的实用程序来实现。
-
@eush77 正如我所提到的,这个 llvm ir 是用 clang 从一个 cpp 文件转换而来的。 cpp 文件包括定义 getColumn 的文件。但是我想知道当我使用 MCJIT 执行 llvm ir 中的函数时,我将如何执行仅在 llvm ir 中声明而没有定义的函数。 llvm ir 中的函数是否仅在(cpp 文件)等其他文件中声明和定义?以及如何生成这种函数?
标签: llvm llvm-clang llvm-ir llvm-c++-api llvm-3.0