0

我正在查看由 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 文件中使用它们?

谢谢

4

1 回答 1

1

似乎这些函数正在使用一些外部定义?

确切地。declare关键字表示函数声明,与函数定义相反,函数声明只能外部链接

函数声明具有除 external 或 extern_weak 之外的任何链接类型是非法的。

Clang 生成声明而不是定义的原因是(很可能)这些函数没有在给它的翻译单元中定义。

声明在链接期间被解析。要将多个 LLVM 模块链接在一起,请使用llvm-link工具。

例如,假设lib.cpp定义了foo()main.cpp.

$ clang++ -c -emit-llvm main.cpp lib.cpp

此命令将这些文件编译为 LLVM IR 并创建两个模块main.bclib.bc. 因为这个函数是在一个单独的翻译单元中定义的,所以main.bc只包含一个声明。foo()的定义foo()lib.bc.

$ llvm-link main.bc lib.bc -o all.bc

此命令链接main.bclib.bc进入单个模块,该模块现在包含foo().

于 2016-07-28T11:30:28.460 回答