java调用clang编译的so_如何使用clang -emit-llvm编译并保留“未使用的”C声明

上下文

我使用LLVM作为我的后端,因此codegen需要所有这些运行时类型(函数,结构等)的类型,而不是使用LLVM API手动定义所有这些类型或手写LLVM IR我想编写C中的头文件并编译为编译器可以使用 LLVMParseBitcodeInContext2 引入的bitcode .

问题

问题我似乎保留了任何任何函数定义都没有使用的类型声明 . Clang有 -femit-all-decls ,听起来像是's supposed to solve it, but it unfortunately isn' t和谷歌搜索表明它的名字错误,因为它只影响未使用的定义,而不是声明 .

然后我想也许如果我只将头文件编译成 .gch 文件,我可以用 LLVMParseBitcodeInContext2 以同样的方式将它们拉进去(因为文档说他们使用"the same" bitcode格式“,但是这样做错误 error: Invalid bitcode signature 因此必须有所不同 . 也许差别小到可以解决?

任何可以为复杂运行时自动化的建议或相对简单的解决方法?如果有人对接近这个一般用例有一个完全替代的建议,我也会感兴趣,记住我不想在运行时函数体中静态链接我生成的每个单个目标文件,只是类型 . 我想这也是其他编译器所需要的,所以如果我接近这个错误,我不会感到惊讶 .

例如鉴于此输入:

runtime.h

struct Foo {

int a;

int b;

};

struct Foo * something_with_foo(struct Foo *foo);

我需要一个具有此等效IR的bitcode文件

runtime.ll

; ...etc...

%struct.Foo = type { i32, i32 }

declare %struct.Foo* @something_with_foo(%struct.Foo*)

; ...etc...

我可以手动编写它,但这将是重复的,因为我还需要为其他互操作创建C头,并且理想的是不必手动保持它们同步 . 运行时相当大 . 我想我也可以做相反的事情:在LLVM IR中编写声明并生成C头 .

今年有人问过这个问题,但是对于这种大小和类型复杂的运行时来说,所提出的解决方案相当苛刻且相当不切实际:Clang - Compiling a C header to LLVM IR/bitcode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值