//===--- PGOCtxProfReader.h - Contextual profile reader ---------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// \file /// /// Reader for contextual iFDO profile, which comes in bitstream format. /// //===----------------------------------------------------------------------===// #ifndef LLVM_PROFILEDATA_CTXINSTRPROFILEREADER_H #define LLVM_PROFILEDATA_CTXINSTRPROFILEREADER_H #include "llvm/Bitstream/BitstreamReader.h" #include "llvm/IR/GlobalValue.h" #include "llvm/ProfileData/PGOCtxProfWriter.h" #include "llvm/Support/Error.h" #include <map> namespace llvm { class PGOContextualProfile; class PGOCtxProfContext; namespace internal { // When we traverse the contextual profile, we typically want to visit contexts // pertaining to a specific function. To avoid traversing the whole tree, we // want to keep a per-function list - which will be in preorder - of that // function's contexts. This happens in PGOContextualProfile. For memory use // efficiency, we want to make PGOCtxProfContext an intrusive double-linked list // node. We need to handle the cases where PGOCtxProfContext nodes are moved and // deleted: in both cases, we need to update the index (==list). We can do that // directly from the node in the list, without knowing who the "parent" of the // list is. That makes the ADT ilist overkill here. Finally, IndexNode is meant // to be an implementation detail of PGOCtxProfContext, and the only reason it's // factored out is to avoid implementing move semantics for all its members. class IndexNode { … }; } // namespace internal /// A node (context) in the loaded contextual profile, suitable for mutation /// during IPO passes. We generally expect a fraction of counters and /// callsites to be populated. We continue to model counters as vectors, but /// callsites are modeled as a map of a map. The expectation is that, typically, /// there is a small number of indirect targets (usually, 1 for direct calls); /// but potentially a large number of callsites, and, as inlining progresses, /// the callsite count of a caller will grow. class PGOCtxProfContext final : public internal::IndexNode { … }; class PGOCtxProfileReader final { … }; } // namespace llvm #endif