Error InstrProfWriter::writeText(raw_fd_ostream &OS) { if (ProfileKind == PF_IRLevel) OS << "# IR level Instrumentation Flag\n:ir\n"; else if (ProfileKind == PF_IRLevelWithCS) OS << "# CSIR level Instrumentation Flag\n:csir\n"; InstrProfSymtab Symtab; using FuncPair = detail::DenseMapPair<uint64_t, InstrProfRecord>; using RecordType = std::pair<StringRef, FuncPair>; SmallVector<RecordType, 4> OrderedFuncData; for (const auto &I : FunctionData) { if (shouldEncodeData(I.getValue())) { if (Error E = Symtab.addFuncName(I.getKey())) return E; for (const auto &Func : I.getValue()) OrderedFuncData.push_back(std::make_pair(I.getKey(), Func)); } } llvm::sort(OrderedFuncData, [](const RecordType &A, const RecordType &B) { return std::tie(A.first, A.second.first) < std::tie(B.first, B.second.first); }); for (const auto &record : OrderedFuncData) { const StringRef &Name = record.first; const FuncPair &Func = record.second; writeRecordInText(Name, Func.first, Func.second, Symtab, OS); } return Error::success(); }
void InstrProfWriter::writeText(raw_fd_ostream &OS) { InstrProfSymtab Symtab; for (const auto &I : FunctionData) Symtab.addFuncName(I.getKey()); Symtab.finalizeSymtab(); for (const auto &I : FunctionData) for (const auto &Func : I.getValue()) writeRecordInText(Func.second, Symtab, OS); }
void RawInstrProfReader<IntPtrT>::createSymtab(InstrProfSymtab &Symtab) { Symtab.create(StringRef(NamesStart, NamesSize)); for (const RawInstrProf::ProfileData<IntPtrT> *I = Data; I != DataEnd; ++I) { const IntPtrT FPtr = swap(I->FunctionPointer); if (!FPtr) continue; Symtab.mapAddress(FPtr, I->NameRef); } Symtab.finalizeSymtab(); }
void RawInstrProfReader<IntPtrT>::createSymtab(InstrProfSymtab &Symtab) { for (const RawInstrProf::ProfileData<IntPtrT> *I = Data; I != DataEnd; ++I) { StringRef FunctionName(getName(I->NamePtr), swap(I->NameSize)); Symtab.addFuncName(FunctionName); const IntPtrT FPtr = swap(I->FunctionPointer); if (!FPtr) continue; Symtab.mapAddress(FPtr, IndexedInstrProf::ComputeHash(FunctionName)); } Symtab.finalizeSymtab(); }
void InstrProfWriter::writeText(raw_fd_ostream &OS) { if (ProfileKind == PF_IRLevel) OS << "# IR level Instrumentation Flag\n:ir\n"; InstrProfSymtab Symtab; for (const auto &I : FunctionData) if (shouldEncodeData(I.getValue())) Symtab.addFuncName(I.getKey()); Symtab.finalizeSymtab(); for (const auto &I : FunctionData) if (shouldEncodeData(I.getValue())) for (const auto &Func : I.getValue()) writeRecordInText(Func.second, Symtab, OS); }
Error InstrProfWriter::writeText(raw_fd_ostream &OS) { if (ProfileKind == PF_IRLevel) OS << "# IR level Instrumentation Flag\n:ir\n"; InstrProfSymtab Symtab; for (const auto &I : FunctionData) if (shouldEncodeData(I.getValue())) if (Error E = Symtab.addFuncName(I.getKey())) return E; for (const auto &I : FunctionData) if (shouldEncodeData(I.getValue())) for (const auto &Func : I.getValue()) writeRecordInText(I.getKey(), Func.first, Func.second, Symtab, OS); return Error::success(); }
void InstrProfWriter::writeRecordInText(StringRef Name, uint64_t Hash, const InstrProfRecord &Func, InstrProfSymtab &Symtab, raw_fd_ostream &OS) { OS << Name << "\n"; OS << "# Func Hash:\n" << Hash << "\n"; OS << "# Num Counters:\n" << Func.Counts.size() << "\n"; OS << "# Counter Values:\n"; for (uint64_t Count : Func.Counts) OS << Count << "\n"; uint32_t NumValueKinds = Func.getNumValueKinds(); if (!NumValueKinds) { OS << "\n"; return; } OS << "# Num Value Kinds:\n" << Func.getNumValueKinds() << "\n"; for (uint32_t VK = 0; VK < IPVK_Last + 1; VK++) { uint32_t NS = Func.getNumValueSites(VK); if (!NS) continue; OS << "# ValueKind = " << ValueProfKindStr[VK] << ":\n" << VK << "\n"; OS << "# NumValueSites:\n" << NS << "\n"; for (uint32_t S = 0; S < NS; S++) { uint32_t ND = Func.getNumValueDataForSite(VK, S); OS << ND << "\n"; std::unique_ptr<InstrProfValueData[]> VD = Func.getValueForSite(VK, S); for (uint32_t I = 0; I < ND; I++) { if (VK == IPVK_IndirectCallTarget) OS << Symtab.getFuncNameOrExternalSymbol(VD[I].Value) << ":" << VD[I].Count << "\n"; else OS << VD[I].Value << ":" << VD[I].Count << "\n"; } } } OS << "\n"; }