| //===-- 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<FunctionInfoIndex> 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<FunctionInfo> 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)); |
| } |
| } |