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
|