DIE &DwarfCompileUnit::constructSubprogramScopeDIE(const DISubprogram *Sub, LexicalScope *Scope) { DIE &ScopeDIE = updateSubprogramScopeDIE(Sub); if (Scope) { assert(!Scope->getInlinedAt()); assert(!Scope->isAbstractScope()); // Collect lexical scope children first. // ObjectPointer might be a local (non-argument) local variable if it's a // block's synthetic this pointer. if (DIE *ObjectPointer = createAndAddScopeChildren(Scope, ScopeDIE)) addDIEEntry(ScopeDIE, dwarf::DW_AT_object_pointer, *ObjectPointer); } // If this is a variadic function, add an unspecified parameter. DITypeRefArray FnArgs = Sub->getType()->getTypeArray(); // If we have a single element of null, it is a function that returns void. // If we have more than one elements and the last one is null, it is a // variadic function. if (FnArgs.size() > 1 && !FnArgs[FnArgs.size() - 1] && !includeMinimalInlineScopes()) ScopeDIE.addChild( DIE::get(DIEValueAllocator, dwarf::DW_TAG_unspecified_parameters)); return ScopeDIE; }
LLVMMetadataRef LLVMDIBuilderGetOrCreateTypeArray(LLVMDIBuilderRef Dref, LLVMMetadataRef *Data, size_t Length) { DIBuilder *D = unwrap(Dref); Metadata **DataValue = unwrap(Data); ArrayRef<Metadata *> Elements(DataValue, Length); DITypeRefArray A = D->getOrCreateTypeArray(Elements); return wrap(A.get()); }
void BTFTypeFuncProto::completeType(BTFDebug &BDebug) { DITypeRefArray Elements = STy->getTypeArray(); auto RetType = Elements[0].resolve(); BTFType.Type = RetType ? BDebug.getTypeId(RetType) : 0; BTFType.NameOff = 0; // For null parameter which is typically the last one // to represent the vararg, encode the NameOff/Type to be 0. for (unsigned I = 1, N = Elements.size(); I < N; ++I) { struct BTF::BTFParam Param; auto Element = Elements[I].resolve(); if (Element) { Param.NameOff = BDebug.addString(FuncArgNames[I]); Param.Type = BDebug.getTypeId(Element); } else { Param.NameOff = 0; Param.Type = 0; } Parameters.push_back(Param); } }
/// Handle subprogram or subroutine types. void BTFDebug::visitSubroutineType( const DISubroutineType *STy, bool ForSubprog, const std::unordered_map<uint32_t, StringRef> &FuncArgNames, uint32_t &TypeId) { DITypeRefArray Elements = STy->getTypeArray(); uint32_t VLen = Elements.size() - 1; if (VLen > BTF::MAX_VLEN) return; // Subprogram has a valid non-zero-length name, and the pointee of // a function pointer has an empty name. The subprogram type will // not be added to DIToIdMap as it should not be referenced by // any other types. auto TypeEntry = llvm::make_unique<BTFTypeFuncProto>(STy, VLen, FuncArgNames); if (ForSubprog) TypeId = addType(std::move(TypeEntry)); // For subprogram else addType(std::move(TypeEntry), STy); // For func ptr // Visit return type and func arg types. for (const auto Element : Elements) { visitTypeEntry(Element.resolve()); } }