Use diagnostic handler in the LLVMContext
[oota-llvm.git] / include / llvm / Linker / Linker.h
index 50922e3ebe225131900182083eba224e92ac4afc..26c27c3aae8f933105d9e7a1b3311c98a1f89046 100644 (file)
 #ifndef LLVM_LINKER_LINKER_H
 #define LLVM_LINKER_LINKER_H
 
-#include "llvm/ADT/SmallPtrSet.h"
-
-#include <functional>
+#include "llvm/IR/FunctionInfo.h"
+#include "llvm/Linker/IRMover.h"
 
 namespace llvm {
-class DiagnosticInfo;
 class Module;
 class StructType;
+class Type;
 
 /// This class provides the core functionality of linking in LLVM. It keeps a
 /// pointer to the merged module so far. It doesn't take ownership of the
 /// module since it is assumed that the user of this class will want to do
 /// something with it after the linking.
 class Linker {
-  public:
-    enum LinkerMode {
-      DestroySource = 0, // Allow source module to be destroyed.
-      PreserveSource = 1 // Preserve the source module.
-    };
-
-    typedef std::function<void(const DiagnosticInfo &)>
-        DiagnosticHandlerFunction;
-
-    Linker(Module *M, DiagnosticHandlerFunction DiagnosticHandler);
-    Linker(Module *M);
-    ~Linker();
-
-    Module *getModule() const { return Composite; }
-    void deleteModule();
-
-    /// \brief Link \p Src into the composite. The source is destroyed if
-    /// \p Mode is DestroySource and preserved if it is PreserveSource.
-    /// If \p ErrorMsg is not null, information about any error is written
-    /// to it.
-    /// Returns true on error.
-    bool linkInModule(Module *Src, unsigned Mode);
-    bool linkInModule(Module *Src) {
-      return linkInModule(Src, Linker::DestroySource);
-    }
+  IRMover Mover;
+
+public:
+  enum Flags {
+    None = 0,
+    OverrideFromSrc = (1 << 0),
+    LinkOnlyNeeded = (1 << 1),
+    InternalizeLinkedSymbols = (1 << 2)
+  };
+
+  Linker(Module &M);
+
+  /// \brief Link \p Src into the composite. The source is destroyed.
+  ///
+  /// Passing OverrideSymbols as true will have symbols from Src
+  /// shadow those in the Dest.
+  /// For ThinLTO function importing/exporting the \p FunctionInfoIndex
+  /// is passed. If \p FunctionsToImport is provided, only the functions that
+  /// are part of the set will be imported from the source module.
+  ///
+  /// Returns true on error.
+  bool linkInModule(Module &Src, unsigned Flags = Flags::None,
+                    const FunctionInfoIndex *Index = nullptr,
+                    DenseSet<const GlobalValue *> *FunctionsToImport = nullptr);
+
+  static bool linkModules(Module &Dest, Module &Src,
+                          unsigned Flags = Flags::None);
 
-    static bool
-    LinkModules(Module *Dest, Module *Src, unsigned Mode,
-                DiagnosticHandlerFunction DiagnosticHandler);
-
-    static bool
-    LinkModules(Module *Dest, Module *Src, unsigned Mode);
-
-
-  private:
-    Module *Composite;
-    SmallPtrSet<StructType*, 32> IdentifiedStructTypes;
-    DiagnosticHandlerFunction DiagnosticHandler;
 };
 
+/// Create a new module with exported local functions renamed and promoted
+/// for ThinLTO.
+std::unique_ptr<Module> renameModuleForThinLTO(std::unique_ptr<Module> &M,
+                                               const FunctionInfoIndex *Index);
+
 } // End llvm namespace
 
 #endif