Home | History | Annotate | Download | only in Utils
      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   bool isPerformingImport() const { return GlobalsToImport != nullptr; }
     60   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       : 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     if (!GlobalsToImport)
     95       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
    120