使用llvm-as处理LLVM示例代码时遇@llvm.atomic.load.add.i64.p0i64未定义错误
解决LLVM中
@llvm.atomic.load.add.i64.p0i64未定义的错误 错误源于你使用的原子操作函数属于LLVM内置intrinsic,但代码中未声明;且这类原子加载-修改操作更推荐直接用LLVM指令实现,而非调用intrinsic。以下是两种可行解决方案:
方案1:使用atomicrmw指令(推荐)
LLVM中原子加载-修改-存储操作的标准实现是atomicrmw指令,它会返回操作前的原值,完全匹配你代码的需求。修改后的代码如下:
define void @sub1(i32* %p, i32 %v) { entry: ; CHECK: sub1: ; CHECK: subl %0 = atomicrmw sub i32* %p, i32 %v seq_cst ret void } define void @inc4(i64* %p) { entry: ; CHECK: inc4: ; CHECK: incq %0 = atomicrmw add i64* %p, i64 1 seq_cst ret void }
其中seq_cst是内存顺序,可根据实际需求替换为acquire、release等其他合法内存顺序。
方案2:声明所需的intrinsic函数
若坚持使用原有的intrinsic调用方式,需在代码开头添加对应的函数声明:
declare i32 @llvm.atomic.load.sub.i32.p0i32(i32*, i32) declare i64 @llvm.atomic.load.add.i64.p0i64(i64*, i64) define void @sub1(i32* %p, i32 %v) { entry: ; CHECK: sub1: ; CHECK: subl %0 = tail call i32 @llvm.atomic.load.sub.i32.p0i32(i32* %p, i32 %v) ret void } define void @inc4(i64* %p) { entry: ; CHECK: inc4: ; CHECK: incq %0 = tail call i64 @llvm.atomic.load.add.i64.p0i64(i64* %p, i64 1) ret void }
修改完成后,重新执行命令./build/bin/llvm-as < test.ll即可成功完成编译。若需要生成字节码文件,可添加输出参数:./build/bin/llvm-as < test.ll -o test.bc。
内容的提问来源于stack exchange,提问作者ramgorur
相关产品推荐
相关产品推荐

