LLVM Не могу привести тип массива к ConstantArray - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь привести массив типа [3 x double] к ConstantArray, чтобы в конечном итоге изменить базовый тип с double на float. Но всякий раз, когда я пытаюсь разыграть, это терпит неудачу, и я не могу понять, почему

Фрагмент кода из прохода, который выполняется (отредактирован для добавления дополнительной информации):

CallInst& inst; //passed in by function arg
CallInst* oldCall = &inst;
Constant *constant = dyn_cast<Constant>(oldCall->getOperand(1)->stripPointerCasts());
errs() << "Operand is: " << *constant->getOperand(0) << "\n";
errs() << "Operand type: " << *constant->getOperand(0)->getType() << "\n";
ConstantArray *constantArray = cast<ConstantArray>(constant->getOperand(0));

Вывод:

Operand is: [3 x double] [double 2.100000e+00, double 2.200000e+00, double 2.300000e+00]
Operand type: [3 x double]
opt: /include/llvm/Support/Casting.h:255: typename llvm::cast_retty<X, Y*>::ret_type llvm::cast(Y*) 
[with X = llvm::ConstantArray; Y = llvm::Value; typename llvm::cast_retty<X, Y*>::ret_type = 
llvm::ConstantArray*]: Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!"' failed.

Как видно,операнд в нашей константе является типом массива. При попытке приведения он видит Value из-за основной природы приведения (я думаю?), Но все равно не может думать, что они совместимы. Кто-нибудь знает, почему это так?

Примечание. При этом используется ветвь LLVM release_70 фланга , представляющая собой слегка измененную библиотеку LLVM 7.1.0.

1 Ответ

0 голосов
/ 05 ноября 2019

Вы не можете привести массив к чему-либо еще, включая другой массив (AIUI, потому что правила приведения зависят от языка). Обычный подход состоит в том, чтобы вместо этого навести указатель, что-то вроде этого.

auto c = CastInst::Create(CastInst::BitCast,
                          sourcePointerToDoubleArray,
                          ArrayType::get(Type::getFloatTy(), 3)->getPointerto(),
                          "funny_little_ast",
                          targetBasicBlock);

Также есть ConstantExpr::getPointerCast(). Оба они просто переосмысливают биты, на которые вы указываете.

...