如何生成内联 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.

我尝试省略 NameStrInsertAtEndreturnBB 是 BasicBlock),但它生成的代码类似于

call i32 @system(i8* <badref>)

请告诉我如何实现我的目标。

"inline" 版本是一个 ConstantExpr,使用 ConstantExpr::getGetElementPtr(), the other one is an instruction 生成。

ConstantExpr class 是用于全局变量的最佳格式,因为它在运行时不一定需要 CPU 时间,但该指令适用于所有类型的指针,甚至如果不是常数。 (指向全局变量的指针是常量。)