LCOV - code coverage report
Current view: top level - include/llvm/Transforms/Utils - FunctionImportUtils.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 3 5 60.0 %
Date: 2018-10-20 13:21:21 Functions: 0 2 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- FunctionImportUtils.h - Importing support utilities -----*- C++ -*-===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : //
      10             : // This file defines the FunctionImportGlobalProcessing class which is used
      11             : // to perform the necessary global value handling for function importing.
      12             : //
      13             : //===----------------------------------------------------------------------===//
      14             : 
      15             : #ifndef LLVM_TRANSFORMS_UTILS_FUNCTIONIMPORTUTILS_H
      16             : #define LLVM_TRANSFORMS_UTILS_FUNCTIONIMPORTUTILS_H
      17             : 
      18             : #include "llvm/ADT/SetVector.h"
      19             : #include "llvm/IR/ModuleSummaryIndex.h"
      20             : 
      21             : namespace llvm {
      22             : class Module;
      23             : 
      24             : /// Class to handle necessary GlobalValue changes required by ThinLTO
      25             : /// function importing, including linkage changes and any necessary renaming.
      26             : class FunctionImportGlobalProcessing {
      27             :   /// The Module which we are exporting or importing functions from.
      28             :   Module &M;
      29             : 
      30             :   /// Module summary index passed in for function importing/exporting handling.
      31             :   const ModuleSummaryIndex &ImportIndex;
      32             : 
      33             :   /// Globals to import from this module, all other functions will be
      34             :   /// imported as declarations instead of definitions.
      35             :   SetVector<GlobalValue *> *GlobalsToImport;
      36             : 
      37             :   /// Set to true if the given ModuleSummaryIndex contains any functions
      38             :   /// from this source module, in which case we must conservatively assume
      39             :   /// that any of its functions may be imported into another module
      40             :   /// as part of a different backend compilation process.
      41             :   bool HasExportedFunctions = false;
      42             : 
      43             :   /// Set of llvm.*used values, in order to validate that we don't try
      44             :   /// to promote any non-renamable values.
      45             :   SmallPtrSet<GlobalValue *, 8> Used;
      46             : 
      47             :   /// Check if we should promote the given local value to global scope.
      48             :   bool shouldPromoteLocalToGlobal(const GlobalValue *SGV);
      49             : 
      50             : #ifndef NDEBUG
      51             :   /// Check if the given value is a local that can't be renamed (promoted).
      52             :   /// Only used in assertion checking, and disabled under NDEBUG since the Used
      53             :   /// set will not be populated.
      54             :   bool isNonRenamableLocal(const GlobalValue &GV) const;
      55             : #endif
      56             : 
      57             :   /// Helper methods to check if we are importing from or potentially
      58             :   /// exporting from the current source module.
      59           0 :   bool isPerformingImport() const { return GlobalsToImport != nullptr; }
      60           0 :   bool isModuleExporting() const { return HasExportedFunctions; }
      61             : 
      62             :   /// If we are importing from the source module, checks if we should
      63             :   /// import SGV as a definition, otherwise import as a declaration.
      64             :   bool doImportAsDefinition(const GlobalValue *SGV);
      65             : 
      66             :   /// Get the name for SGV that should be used in the linked destination
      67             :   /// module. Specifically, this handles the case where we need to rename
      68             :   /// a local that is being promoted to global scope, which it will always
      69             :   /// do when \p DoPromote is true (or when importing a local).
      70             :   std::string getName(const GlobalValue *SGV, bool DoPromote);
      71             : 
      72             :   /// Process globals so that they can be used in ThinLTO. This includes
      73             :   /// promoting local variables so that they can be reference externally by
      74             :   /// thin lto imported globals and converting strong external globals to
      75             :   /// available_externally.
      76             :   void processGlobalsForThinLTO();
      77             :   void processGlobalForThinLTO(GlobalValue &GV);
      78             : 
      79             :   /// Get the new linkage for SGV that should be used in the linked destination
      80             :   /// module. Specifically, for ThinLTO importing or exporting it may need
      81             :   /// to be adjusted. When \p DoPromote is true then we must adjust the
      82             :   /// linkage for a required promotion of a local to global scope.
      83             :   GlobalValue::LinkageTypes getLinkage(const GlobalValue *SGV, bool DoPromote);
      84             : 
      85             : public:
      86             :   FunctionImportGlobalProcessing(
      87             :       Module &M, const ModuleSummaryIndex &Index,
      88             :       SetVector<GlobalValue *> *GlobalsToImport = nullptr)
      89         495 :       : M(M), ImportIndex(Index), GlobalsToImport(GlobalsToImport) {
      90             :     // If we have a ModuleSummaryIndex but no function to import,
      91             :     // then this is the primary module being compiled in a ThinLTO
      92             :     // backend compilation, and we need to see if it has functions that
      93             :     // may be exported to another backend compilation.
      94         495 :     if (!GlobalsToImport)
      95         357 :       HasExportedFunctions = ImportIndex.hasExportedFunctions(M);
      96             : 
      97             : #ifndef NDEBUG
      98             :     // First collect those in the llvm.used set.
      99             :     collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ false);
     100             :     // Next collect those in the llvm.compiler.used set.
     101             :     collectUsedGlobalVariables(M, Used, /*CompilerUsed*/ true);
     102             : #endif
     103             :   }
     104             : 
     105             :   bool run();
     106             : 
     107             :   static bool doImportAsDefinition(const GlobalValue *SGV,
     108             :                                    SetVector<GlobalValue *> *GlobalsToImport);
     109             : };
     110             : 
     111             : /// Perform in-place global value handling on the given Module for
     112             : /// exported local functions renamed and promoted for ThinLTO.
     113             : bool renameModuleForThinLTO(
     114             :     Module &M, const ModuleSummaryIndex &Index,
     115             :     SetVector<GlobalValue *> *GlobalsToImport = nullptr);
     116             : 
     117             : } // End llvm namespace
     118             : 
     119             : #endif

Generated by: LCOV version 1.13