«Тип параметра вызова не соответствует сигнатуре функции» при генерации вызова функции после GetElementPtrInst - PullRequest
0 голосов
/ 10 июля 2020

Я получаю сообщение об ошибке в заголовке вместе с этой информацией:

 i32Call parameter type does not match function signature!
  %8 = load i32, i32* %7
 i32  %9 = call i1 @ITable(i32 %8, i32 1)

Полный контекст вызова выглядит следующим образом:

  %c = load %C*, %C** %0
  %7 = getelementptr %C, %C* %c, i32 0, i32 1
  %8 = load i32, i32* %7
  %9 = call i1 @ITable(i32 %8, i32 1)

C объявлен как %C = type { %C*, i32, i1, i32 }, а функция ITable имеет подпись define i1 @ITable(i32 %0, i32 %1)

Это код C ++, который генерирует вызов ITable:

  std::vector<Value *> elementIndex = {
      ConstantInt::get(TheContext, APInt(32, 0)),
      ConstantInt::get(TheContext, APInt(32, 1))};
  auto I = GetElementPtrInst::Create(
      allocatedClasses[/*classID*/], testee, elementIndex);
  std::vector<Value *> ITableArgs = {
      Builder.CreateLoad(Builder.Insert(I)),
      ConstantInt::get(TheContext, APInt(32, classID))};
  Function *TheFunction = TheModule->getFunction("ITable");
  return Builder.CreateCall(TheFunction, ITableArgs);

Testee выше - это Value *, в результате из другого метода генерации кода. Похоже, моя проблема заключается в загрузке значения из структуры, но я не уверен, а) так ли это или б) как начать ее решать.

...