Ошибка несовпадающей подпрограммы после установки DebugLoc в LLVM - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь установить 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";
        }
    }
}

Я понятия не имею, почему это происходит.Также я делаю то же самое (вставляя метаданные и отладочную информацию) для еще одного набора инструкций.

Буду признателен, если вы подскажете, как решить эту проблему.

Спасибо

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