使用CreateAdd/CreateSub生成LLVM IR报错:ptr类型操作数非法
解决LLVM CreateAdd/CreateSub生成ptr类型加减法的错误
你当前的代码直接对CreateAlloca返回的指针类型值调用CreateAdd/CreateSub,导致生成的IR中出现了add ptr %a1, %b2这类非法指令——LLVM不允许直接对两个指针执行加法操作,这就是lli报错的核心原因。
原问题代码
你的C++代码:
left = this->builder->CreateAlloca(llvm::Type::getInt32Ty(*this->llvm_context), nullptr, std::string("a1")); right = this->builder->CreateAlloca(llvm::Type::getInt32Ty(*this->llvm_context), nullptr, std::string("b2")); builder->CreateSub(left, right, "sub"); builder->CreateAdd(left, right, "add");
生成的错误LLVM IR:
%a1 = alloca i32, align 4 store i32 100, ptr %a1, align 4 %b2 = alloca i32, align 4 store i32 10, ptr %b2, align 4 %add = add ptr %a1, %b2 %sub = sub ptr %c3, i32 2 %sub1 = sub ptr %add, %sub
报错信息:
lli: lli: test.ll:14:14: error: invalid operand type for instruction
%add = add ptr %a1, %b2
解决方案
要修复这个问题,你需要先通过CreateLoad指令加载指针指向的i32类型数值,再对这些数值执行加减操作,而不是直接操作指针本身。
修改后的C++代码示例:
// 保留原内存分配逻辑 left = this->builder->CreateAlloca(llvm::Type::getInt32Ty(*this->llvm_context), nullptr, std::string("a1")); right = this->builder->CreateAlloca(llvm::Type::getInt32Ty(*this->llvm_context), nullptr, std::string("b2")); // 加载指针指向的i32数值 auto left_val = builder->CreateLoad(llvm::Type::getInt32Ty(*this->llvm_context), left, "left_load"); auto right_val = builder->CreateLoad(llvm::Type::getInt32Ty(*this->llvm_context), right, "right_load"); // 对加载后的数值执行加减运算 builder->CreateSub(left_val, right_val, "sub"); builder->CreateAdd(left_val, right_val, "add");
修改后生成的合法LLVM IR示例:
%a1 = alloca i32, align 4 store i32 100, ptr %a1, align 4 %b2 = alloca i32, align 4 store i32 10, ptr %b2, align 4 %left_load = load i32, ptr %a1, align 4 %right_load = load i32, ptr %b2, align 4 %add = add i32 %left_load, %right_load %sub = sub i32 %left_load, %right_load
此时生成的IR完全符合LLVM的类型规则,能够被lli正常编译和解释。
内容的提问来源于stack exchange,提问作者Roy
相关产品推荐
相关产品推荐

