Как создать встроенную инструкцию GetElementPtr? - PullRequest
1 голос
/ 28 октября 2019

У меня есть такой фрагмент кода (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>)

Пожалуйста, скажите мне, как достичь моей цели.

1 Ответ

1 голос
/ 28 октября 2019

«Встроенная» версия представляет собой ConstantExpr, сгенерированный с использованием ConstantExpr :: getGetElementPtr () , другой является инструкцией .

ConstantExprКласс является лучшим форматом для глобальных переменных, потому что он не требует времени ЦП во время выполнения, но инструкция работает для всех типов указателей, даже если они не постоянны. (Указатель на глобальную переменную является константой.)

...