LLVM сравнение между указателем и константой - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь создать ИК-код llvm вручную (ввод функции). У меня проблемы с созданием инструкции сравнения:

    auto *var0 = Builder->CreateLoad(StrPtr);
    var0->getType()->dump(); // i8 addrspace(8)*
    Builder->getInt8(0)->getType()->dump(); // i8
    auto *cmp5 = Builder->CreateICmpEQ(var0, Builder->getInt8(0));

Я не могу сравнить между var0 и Builder-> getInt8 (0), поскольку дамп указывает, что они имеют разные типы. В частности, я получаю эту ошибку во время выполнения:

opt: /llvm/include/llvm/IR/Instructions.h:1174: void
llvm::ICmpInst::AssertOK(): Assertion `getOperand(0)->getType() == 
getOperand(1)->getType() && "Both operands to ICmp instruction are not of 
the same type!"' failed.

Как мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

IR - это язык ассемблера - низкий уровень. Не существует автоматического приведения c на ассемблере (если я не хочу отступать и go в подробности), поэтому вы не можете сравнить 32- или 64-битный указатель с 8-битным целым числом. Если вы хотите выполнить приведение, вы должны реализовать его самостоятельно, в соответствии с правилами вашего исходного языка.

В этом случае, что вы, вероятно, указатель на int cast и либо расширение знака или расширение нуля , поэтому обе стороны сравнения являются целыми числами и имеют одинаковую битовую ширину. Скорее всего, нулевое расширение, но я упоминаю оба, чтобы подчеркнуть, что вы должны думать об этих вещах.

0 голосов
/ 14 апреля 2020

Наконец-то понял, как сделать то, что сказал arnt, вот код:

auto *var0 = Builder->CreateLoad(StrPtr);
auto *cmp5 = Builder->CreateICmpEQ(var0, Constant::getNullValue(Type::getInt8PtrTy(Ctx, 8)));

getNullValue заполняет мою новую константу 0, как раз то, что мне нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...