68 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
//===-- 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));
 | 
						|
  }
 | 
						|
}
 |