void BTFDebug::visitEnumType(const DICompositeType *CTy) { DINodeArray Elements = CTy->getElements(); uint32_t VLen = Elements.size(); if (VLen > BTF::MAX_VLEN) return; auto TypeEntry = llvm::make_unique<BTFTypeEnum>(CTy, VLen); addType(std::move(TypeEntry), CTy); // No need to visit base type as BTF does not encode it. }
DITypeIdentifierMap llvm::generateDITypeIdentifierMap(const Module &M) { DITypeIdentifierMap Map; for (DICompileUnit *CU : M.debug_compile_units()) { DINodeArray Retain = CU->getRetainedTypes(); for (unsigned Ti = 0, Te = Retain.size(); Ti != Te; ++Ti) { if (!isa<DICompositeType>(Retain[Ti])) continue; auto *Ty = cast<DICompositeType>(Retain[Ti]); if (MDString *TypeId = Ty->getRawIdentifier()) { // Definition has priority over declaration. // Try to insert (TypeId, Ty) to Map. std::pair<DITypeIdentifierMap::iterator, bool> P = Map.insert(std::make_pair(TypeId, Ty)); // If TypeId already exists in Map and this is a definition, replace // whatever we had (declaration or definition) with the definition. if (!P.second && !Ty->isForwardDecl()) P.first->second = Ty; } } } return Map; }
/// Handle structure/union types. void BTFDebug::visitStructType(const DICompositeType *CTy, bool IsStruct) { const DINodeArray Elements = CTy->getElements(); uint32_t VLen = Elements.size(); if (VLen > BTF::MAX_VLEN) return; // Check whether we have any bitfield members or not bool HasBitField = false; for (const auto *Element : Elements) { auto E = cast<DIDerivedType>(Element); if (E->isBitField()) { HasBitField = true; break; } } auto TypeEntry = llvm::make_unique<BTFTypeStruct>(CTy, IsStruct, HasBitField, VLen); addType(std::move(TypeEntry), CTy); // Visit all struct members. for (const auto *Element : Elements) visitTypeEntry(cast<DIDerivedType>(Element)); }