У меня есть такой фрагмент кода (systemFun
определяется как i32 @system(i8*)
):
auto cmdPtr = GetElementPtrInst::CreateInBounds(
ArrayType::get(TYPE8, 1 + cmdCStr.size()),
cmdStr, ArrayRef<Value*>(indexList, 2), "", returnBB);
builder.CreateCall(systemFun, {cmdPtr});
, который генерирует следующий IR-сигнал LLVM:
%1 = getelementptr inbounds [10 x i8], [10 x i8]* @cmd, i32 0, i32 0
%2 = call i32 @system(i8* %1)
Однако,когда я компилирую этот код C, используя Clang:
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>)
Пожалуйста, скажите мне, как достичь моей цели.