//===-- llvm/FunctionInfo.h - Function Info Index ---------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // /// @file /// FunctionInfo.h This file contains the declarations the classes that hold /// the function info index and summary. // //===----------------------------------------------------------------------===// #ifndef LLVM_IR_FUNCTIONINFO_H #define LLVM_IR_FUNCTIONINFO_H #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringMap.h" #include "llvm/IR/Module.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" namespace llvm { /// \brief Function summary information to aid decisions and implementation of /// importing. /// /// This is a separate class from FunctionInfo to enable lazy reading of this /// function summary information from the combined index file during imporing. class FunctionSummary { private: /// \brief Path of module containing function IR, used to locate module when /// importing this function. /// /// This is only used during parsing of the combined function index, or when /// parsing the per-module index for creation of the combined function index, /// not during writing of the per-module index which doesn't contain a /// module path string table. StringRef ModulePath; /// \brief Used to flag functions that have local linkage types and need to /// have module identifier appended before placing into the combined /// index, to disambiguate from other functions with the same name. /// /// This is only used in the per-module function index, as it is consumed /// while creating the combined index. bool IsLocalFunction; // The rest of the information is used to help decide whether importing // is likely to be profitable. // Other information will be added as the importing is tuned, such // as hotness (when profile available), and other function characteristics. /// Number of instructions (ignoring debug instructions, e.g.) computed /// during the initial compile step when the function index is first built. unsigned InstCount; public: /// Construct a summary object from summary data expected for all /// summary records. FunctionSummary(unsigned NumInsts) : InstCount(NumInsts) {} /// Set the path to the module containing this function, for use in /// the combined index. void setModulePath(StringRef ModPath) { ModulePath = ModPath; } /// Get the path to the module containing this function. StringRef modulePath() const { return ModulePath; } /// Record whether this is a local function in the per-module index. void setLocalFunction(bool IsLocal) { IsLocalFunction = IsLocal; } /// Check whether this was a local function, for use in creating /// the combined index. bool isLocalFunction() const { return IsLocalFunction; } /// Get the instruction count recorded for this function. unsigned instCount() const { return InstCount; } }; /// \brief Class to hold pointer to function summary and information required /// for parsing it. /// /// For the per-module index, this holds the bitcode offset /// of the corresponding function block. For the combined index, /// after parsing of the \a ValueSymbolTable, this initially /// holds the offset of the corresponding function summary bitcode /// record. After parsing the associated summary information from the summary /// block the \a FunctionSummary is populated and stored here. class FunctionInfo { private: /// Function summary information used to help make ThinLTO importing /// decisions. std::unique_ptr Summary; /// \brief The bitcode offset corresponding to either the associated /// function's function body record, or its function summary record, /// depending on whether this is a per-module or combined index. /// /// This bitcode offset is written to or read from the associated /// \a ValueSymbolTable entry for the function. /// For the per-module index this holds the bitcode offset of the /// function's body record within bitcode module block in its module, /// which is used during lazy function parsing or ThinLTO importing. /// For the combined index this holds the offset of the corresponding /// function summary record, to enable associating the combined index /// VST records with the summary records. uint64_t BitcodeIndex; public: /// Constructor used during parsing of VST entries. FunctionInfo(uint64_t FuncOffset) : Summary(nullptr), BitcodeIndex(FuncOffset) {} /// Constructor used for per-module index bitcode writing. FunctionInfo(uint64_t FuncOffset, std::unique_ptr FuncSummary) : Summary(std::move(FuncSummary)), BitcodeIndex(FuncOffset) {} /// Record the function summary information parsed out of the function /// summary block during parsing or combined index creation. void setFunctionSummary(std::unique_ptr FuncSummary) { Summary = std::move(FuncSummary); } /// Get the function summary recorded for this function. FunctionSummary *functionSummary() const { return Summary.get(); } /// Get the bitcode index recorded for this function, depending on /// the index type. uint64_t bitcodeIndex() const { return BitcodeIndex; } /// Record the bitcode index for this function, depending on /// the index type. void setBitcodeIndex(uint64_t FuncOffset) { BitcodeIndex = FuncOffset; } }; /// List of function info structures for a particular function name held /// in the FunctionMap. Requires a vector in the case of multiple /// COMDAT functions of the same name. typedef std::vector> FunctionInfoList; /// Map from function name to corresponding function info structures. typedef StringMap FunctionInfoMapTy; /// Type used for iterating through the function info map. typedef FunctionInfoMapTy::const_iterator const_funcinfo_iterator; typedef FunctionInfoMapTy::iterator funcinfo_iterator; /// String table to hold/own module path strings, which additionally holds the /// module ID assigned to each module during the plugin step. The StringMap /// makes a copy of and owns inserted strings. typedef StringMap ModulePathStringTableTy; /// Class to hold module path string table and function map, /// and encapsulate methods for operating on them. class FunctionInfoIndex { private: /// Map from function name to list of function information instances /// for functions of that name (may be duplicates in the COMDAT case, e.g.). FunctionInfoMapTy FunctionMap; /// Holds strings for combined index, mapping to the corresponding module ID. ModulePathStringTableTy ModulePathStringTable; public: FunctionInfoIndex() = default; // Disable the copy constructor and assignment operators, so // no unexpected copying/moving occurs. FunctionInfoIndex(const FunctionInfoIndex &) = delete; void operator=(const FunctionInfoIndex &) = delete; funcinfo_iterator begin() { return FunctionMap.begin(); } const_funcinfo_iterator begin() const { return FunctionMap.begin(); } funcinfo_iterator end() { return FunctionMap.end(); } const_funcinfo_iterator end() const { return FunctionMap.end(); } /// Get the list of function info objects for a given function. const FunctionInfoList &getFunctionInfoList(StringRef FuncName) { return FunctionMap[FuncName]; } /// Get the list of function info objects for a given function. const const_funcinfo_iterator findFunctionInfoList(StringRef FuncName) const { return FunctionMap.find(FuncName); } /// Add a function info for a function of the given name. void addFunctionInfo(StringRef FuncName, std::unique_ptr Info) { FunctionMap[FuncName].push_back(std::move(Info)); } /// Iterator to allow writer to walk through table during emission. iterator_range::const_iterator> modPathStringEntries() const { return llvm::make_range(ModulePathStringTable.begin(), ModulePathStringTable.end()); } /// Get the module ID recorded for the given module path. uint64_t getModuleId(const StringRef ModPath) const { return ModulePathStringTable.lookup(ModPath); } /// Add the given per-module index into this function index/summary, /// assigning it the given module ID. Each module merged in should have /// a unique ID, necessary for consistent renaming of promoted /// static (local) variables. void mergeFrom(std::unique_ptr Other, uint64_t NextModuleId); /// Convenience method for creating a promoted global name /// for the given value name of a local, and its original module's ID. static std::string getGlobalNameForLocal(StringRef Name, uint64_t ModId) { SmallString<256> NewName(Name); NewName += ".llvm."; raw_svector_ostream(NewName) << ModId; return NewName.str(); } /// Add a new module path, mapped to the given module Id, and return StringRef /// owned by string table map. StringRef addModulePath(StringRef ModPath, uint64_t ModId) { return ModulePathStringTable.insert(std::make_pair(ModPath, ModId)) .first->first(); } /// Check if the given Module has any functions available for exporting /// in the index. We consider any module present in the ModulePathStringTable /// to have exported functions. bool hasExportedFunctions(const Module &M) const { return ModulePathStringTable.count(M.getModuleIdentifier()); } }; } // End llvm namespace #endif