Я получаю сообщение об ошибке в заголовке вместе с этой информацией:
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 *
, в результате из другого метода генерации кода. Похоже, моя проблема заключается в загрузке значения из структуры, но я не уверен, а) так ли это или б) как начать ее решать.