Типы LLVM не равны - PullRequest
       5

Типы LLVM не равны

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

Я пытаюсь создать новый Constant* с ArrayType и ArrayRef с использованием Constant* ConstantArray::get(ArrayType *Ty, ArrayRef<Constant*> V);

В настоящее время я получаю ошибку подтверждения о несовместимых типах;в частности, ошибка:

.../llvm/lib/IR/Constants.cpp:973: static llvm::Constant* 
llvm::ConstantArray::getImpl(llvm::ArrayType*, 
llvm::ArrayRef<llvm::Constant*>): Assertion `V[i]->getType() == 
Ty->getElementType() && "Wrong type in array element initializer"' failed.

Проблема в том, что оба типа ArrayType и ArrayRef имеют тип float, но при попытке их сравнить не удастся.

Мой код:

//Type* newType is [3 x float]
Type* newElem = (cast<ArrayType>(newType))->getElementType();
ArrayType* newArrayType = ArrayType::get(newElem, numElements);

//arrayElements is a vector of ConstantFP       
ArrayRef<llvm::Constant*> *arrayRef = new ArrayRef<llvm::Constant*>(arrayElements);

Constant* newConstantArray = ConstantArray::get(newArrayType, *arrayRef);

Фактический вызов LLVM, который не подтверждает утверждение:

    Constant *ConstantArray::getImpl(ArrayType *Ty, ArrayRef<Constant*> V) {
      ...    
      for (unsigned i = 0, e = V.size(); i != e; ++i) {
        assert(V[i]->getType() == Ty->getElementType() &&
           "Wrong type in array element initializer"); //FAILS HERE
      }
    }

Я прошел через gdb и распечаталтипы всех arrayRef элементов, а также newArrayType->getElementType() и всех возвращаемых float. Перед подтверждением, если я попробую следующий код, он возвращает false:

bool eq = (arrayRef->data()[1]->getType() == newArrayType->getElementType());          
errs() << *arrayRef->data()[1]->getType() << " == " << *newArrayType->getElementType() <<": ";
if(eq){
    errs() <<"true\n";
} else {
    errs() <<"false\n";
}

печатает:

float == float: false

Я что-то упустил из-за того, как работает llvm::Type? Если оба типа float, почему они не равны?

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