如何生成内联 GetElementPtr 指令?
How to generate an inline GetElementPtr instruction?
我有一段这样的代码(systemFun
定义为 i32 @system(i8*)
):
auto cmdPtr = GetElementPtrInst::CreateInBounds(
ArrayType::get(TYPE8, 1 + cmdCStr.size()),
cmdStr, ArrayRef<Value*>(indexList, 2), "", returnBB);
builder.CreateCall(systemFun, {cmdPtr});
生成以下 LLVM IR:
%1 = getelementptr inbounds [10 x i8], [10 x i8]* @cmd, i32 0, i32 0
%2 = call i32 @system(i8* %1)
但是,当我使用 Clang 编译此 C 代码时:
system("echo haha");
生成以下 LLVM IR:
call i32 @system(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @cmd, i32 0, i32 0))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我想生成后面的代码,其中 getelementptr
的结果直接用于函数调用,而不是分配给临时变量 %1
.
我尝试省略 NameStr
和 InsertAtEnd
(returnBB
是 BasicBlock),但它生成的代码类似于
call i32 @system(i8* <badref>)
请告诉我如何实现我的目标。
"inline" 版本是一个 ConstantExpr,使用 ConstantExpr::getGetElementPtr(), the other one is an instruction 生成。
ConstantExpr
class 是用于全局变量的最佳格式,因为它在运行时不一定需要 CPU 时间,但该指令适用于所有类型的指针,甚至如果不是常数。 (指向全局变量的指针是常量。)
我有一段这样的代码(systemFun
定义为 i32 @system(i8*)
):
auto cmdPtr = GetElementPtrInst::CreateInBounds(
ArrayType::get(TYPE8, 1 + cmdCStr.size()),
cmdStr, ArrayRef<Value*>(indexList, 2), "", returnBB);
builder.CreateCall(systemFun, {cmdPtr});
生成以下 LLVM IR:
%1 = getelementptr inbounds [10 x i8], [10 x i8]* @cmd, i32 0, i32 0
%2 = call i32 @system(i8* %1)
但是,当我使用 Clang 编译此 C 代码时:
system("echo haha");
生成以下 LLVM IR:
call i32 @system(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @cmd, i32 0, i32 0))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
我想生成后面的代码,其中 getelementptr
的结果直接用于函数调用,而不是分配给临时变量 %1
.
我尝试省略 NameStr
和 InsertAtEnd
(returnBB
是 BasicBlock),但它生成的代码类似于
call i32 @system(i8* <badref>)
请告诉我如何实现我的目标。
"inline" 版本是一个 ConstantExpr,使用 ConstantExpr::getGetElementPtr(), the other one is an instruction 生成。
ConstantExpr
class 是用于全局变量的最佳格式,因为它在运行时不一定需要 CPU 时间,但该指令适用于所有类型的指针,甚至如果不是常数。 (指向全局变量的指针是常量。)