Что такое «retainedNodes» в метаданных отладки LLVM? - PullRequest
0 голосов
/ 25 марта 2020

Используя библиотеку LLVM 8.0.1, я пытаюсь создать отладочную информацию для функции со следующим кодом:

DIFile *Unit = DebugBuilder->createFile(CompileUnit->getFilename(), CompileUnit->getDirectory());
DIScope *FContext(Unit);

DISubprogram *SP = DebugBuilder->createFunction(
    FContext, def->Name, def->Name, Unit, LineNo,
    CreateFunctionType(ft, CompileUnit->getFile()), 0);

func->setSubprogram(SP);

Это, однако, приводит к IR, как показано ниже:

define i32 @main(i32 %y) !dbg !3 {
entry:
  ret i32 2
}
    ; ...
!3 = !DISubprogram(name: "main", linkageName: "main", scope: !2, file: !2, type: !4, spFlags: 0, retainedNodes: !7)
    ; ...
!7 = <temporary!> !{}

Который при вызове DebugBuilder->finalize() выдает Assertion failed: !N->isTemporary() && "Expected all forward declarations to be resolved"

Я не нашел описания поля retainedNodes ни в официальном справочнике, ни в других учебниках, а поиск в Интернете приводит только к комментариям без комментариев. разделы источника LLVM. В чем смысл или цель этого поля? Как там создается временный узел?

...