//===-- FunctionInfo.cpp - Function Info Index ----------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file implements the function info index and summary classes for the // IR library. // //===----------------------------------------------------------------------===// #include "llvm/IR/FunctionInfo.h" #include "llvm/ADT/StringMap.h" using namespace llvm; // Create the combined function index/summary from multiple // per-module instances. void FunctionInfoIndex::mergeFrom(std::unique_ptr Other, uint64_t NextModuleId) { StringRef ModPath; for (auto &OtherFuncInfoLists : *Other) { std::string FuncName = OtherFuncInfoLists.getKey(); FunctionInfoList &List = OtherFuncInfoLists.second; // Assert that the func info list only has one entry, since we shouldn't // have duplicate names within a single per-module index. assert(List.size() == 1); std::unique_ptr Info = std::move(List.front()); // Skip if there was no function summary section. if (!Info->functionSummary()) continue; // Add the module path string ref for this module if we haven't already // saved a reference to it. if (ModPath.empty()) ModPath = addModulePath(Info->functionSummary()->modulePath(), NextModuleId); else assert(ModPath == Info->functionSummary()->modulePath() && "Each module in the combined map should have a unique ID"); // Note the module path string ref was copied above and is still owned by // the original per-module index. Reset it to the new module path // string reference owned by the combined index. Info->functionSummary()->setModulePath(ModPath); // If it is a local function, rename it. if (Info->functionSummary()->isLocalFunction()) { // Any local functions are virtually renamed when being added to the // combined index map, to disambiguate from other functions with // the same name. The symbol table created for the combined index // file should contain the renamed symbols. FuncName = FunctionInfoIndex::getGlobalNameForLocal(FuncName, NextModuleId); } // Add new function info to existing list. There may be duplicates when // combining FunctionMap entries, due to COMDAT functions. Any local // functions were virtually renamed above. addFunctionInfo(FuncName, std::move(Info)); } }