Я пытаюсь установить DebugLoc некоторых инструкций в LLVM, в которые я добавил некоторые метаданные на предыдущих этапах.Тем не менее, я получаю ошибку во время компиляции.Например, здесь вы можете увидеть часть вывода LLVM:
mismatched subprogram between llvm.dbg.value variable and !dbg attachment
call void @llvm.dbg.value(metadata i8 %361, metadata !42467, metadata !DIExpression()), !dbg !45649, !metadata_dependent !45650
label %for.body238.preheader.3
i32 (%struct.hmmfile_s*, %struct.plan7_s**)* @read_bin20hmm
!42467 = !DILocalVariable(name: "byte", scope: !42461, file: !179, line: 1316, type: !9)
!42461 = distinct !DISubprogram(name: "byteswap", scope: !179, file: !179, line: 1313, type: !42462, isLocal: true, isDefinition: true, scopeLine: 1314, flags: DIFlagPrototyped, isOptimized: true, unit: !178, retainedNodes: !42464)
!45649 = !DILocation(line: 201356, scope: !42421)
!42421 = distinct !DISubprogram(name: "read_bin20hmm", scope: !179, file: !179, line: 782, type: !42422, isLocal: true, isDefinition: true, scopeLine: 783, flags: DIFlagPrototyped, isOptimized: true, unit: !178, retainedNodes: !42424)
Здесь вы можете увидеть часть первого прохода, которая вставляет некоторые метаданные в инструкции:
int dependent_counter = 0;
for (auto it = total_dependent_insts.begin(), eit = total_dependent_insts.end(); it != eit; it++)
{
LLVMContext& CC = (*it)->getContext();
std::string MDS2 = "some_information#" + (*it)->getParent()->getParent()->getName().str() + "#" + std::to_string(dependent_counter);
MDNode* NN = MDNode::get(CC, MDString::get(CC, MDS2));
(*it)->setMetadata("metadata_information", NN);
dependent_counter++;
}
И вот выво втором проходе можно увидеть часть кода, который устанавливает DebugLoc этих инструкций, чтобы добавить некоторую отладочную информацию и затем собрать их после компиляции:
for (auto it = inst->dependent_insts.begin(), eit = inst->dependent_insts.end(); eit != it; it++)
{
if (MDNode* NN = (*it)->getMetadata("metadata_information"))
{
if ((*it)->getDebugLoc())
{
std::string MDStr = cast<MDString>(NN->getOperand(0))->getString();
DebugLoc L = DebugLoc::get((unsigned)line, (unsigned)0, (*it)->getParent()->getParent()->getSubprogram());
line++;
(*it)->setDebugLoc(L);
errs() << "Metadata String: " << MDStr << "\n";
}
}
}
Я понятия не имею, почему это происходит.Также я делаю то же самое (вставляя метаданные и отладочную информацию) для еще одного набора инструкций.
Буду признателен, если вы подскажете, как решить эту проблему.
Спасибо