【发布时间】:2019-08-22 00:27:48
【问题描述】:
我正在尝试模拟一个项目,以便我可以测试一个遍历 CG 的 opt pass,但是我在 main 中被 clang 的一个奇怪的编译选择阻止了,而 llvm-link 进一步加剧了这种情况。我给你一些代码:
main.c:
#include "xos/xos.h"
int main() {
playXOs();
return 0;
}
xos.h:
#ifndef SLICEREXAMPLEPROJECT_XOS_H
#define SLICEREXAMPLEPROJECT_XOS_H
void playXOs();
#endif // SLICEREXAMPLEPROJECT_XOS_H
我单独编译:
; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
store i32 0, i32* %1, align 4
call void(...) @playXOs()
ret i32 0
}
declare dso_local void @playXOs(...) #1
然后与其他文件链接:
define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
store i32 0, i32* %1, align 4
call void (...) bitcast (void ()* @playXOs to void (...)*)()
ret i32 0
}
在最初的编译中,如果我理解正确,认为playXOs 是一个var arg 函数?如果我手动编辑 main.ll 以将调用站点和转发声明更改为不是 playXOs(...) 则链接文件中没有奇怪的位广播。有人有解决办法吗?
llvm 信息:
clang version 8.0.0 (git@github.com:llvm-mirror/clang.git 8ca7a0dcb7e9a0cd7bf71ff4b70e12462c16f205) (git@github.com:llvm-mirror/llvm.git e9eedd7fa6f4f861afbc7a2862f3f5504e6d340f)
Target: x86_64-unknown-linux-gnu
Thread model: posix
编辑:我忘了提,这对我来说是个问题,因为虽然我得到的 CG 包含playXOs 的调用站点,但 CallGraphNode 有一个空函数。
【问题讨论】:
-
@ChrisBeck clang 版本在那里。
-
@MarkBenningfield 请作为答案发布,将接受。
-
问题与现有问题重复的事实不是答案。
-
那么请标记为重复。
-
@ChrisBeck 不,这不是重复的。有问题的是
playXOs的签名。 @MarkBenningfield 的重复建议是正确的。
标签: c llvm llvm-clang llvm-ir