#ifndef LLVM_LINKER_LINKER_H
#define LLVM_LINKER_LINKER_H
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/DenseMap.h"
-#include "llvm/ADT/DenseSet.h"
-#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/FunctionInfo.h"
+#include "llvm/Linker/IRMover.h"
namespace llvm {
class Module;
/// module since it is assumed that the user of this class will want to do
/// something with it after the linking.
class Linker {
-public:
- struct StructTypeKeyInfo {
- struct KeyTy {
- ArrayRef<Type *> ETypes;
- bool IsPacked;
- KeyTy(ArrayRef<Type *> E, bool P);
- KeyTy(const StructType *ST);
- bool operator==(const KeyTy &that) const;
- bool operator!=(const KeyTy &that) const;
- };
- static StructType *getEmptyKey();
- static StructType *getTombstoneKey();
- static unsigned getHashValue(const KeyTy &Key);
- static unsigned getHashValue(const StructType *ST);
- static bool isEqual(const KeyTy &LHS, const StructType *RHS);
- static bool isEqual(const StructType *LHS, const StructType *RHS);
- };
-
- typedef DenseSet<StructType *, StructTypeKeyInfo> NonOpaqueStructTypeSet;
- typedef DenseSet<StructType *> OpaqueStructTypeSet;
-
- struct IdentifiedStructTypeSet {
- // The set of opaque types is the composite module.
- OpaqueStructTypeSet OpaqueStructTypes;
-
- // The set of identified but non opaque structures in the composite module.
- NonOpaqueStructTypeSet NonOpaqueStructTypes;
-
- void addNonOpaque(StructType *Ty);
- void switchToNonOpaque(StructType *Ty);
- void addOpaque(StructType *Ty);
- StructType *findNonOpaque(ArrayRef<Type *> ETypes, bool IsPacked);
- bool hasType(StructType *Ty);
- };
+ IRMover Mover;
+public:
enum Flags {
None = 0,
OverrideFromSrc = (1 << 0),
InternalizeLinkedSymbols = (1 << 2)
};
- Linker(Module &M, DiagnosticHandlerFunction DiagnosticHandler);
+ Linker(Module &M);
- /// \brief Link \p Src into the composite. The source is destroyed.
+ /// \brief Link \p Src into the composite.
///
/// 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.
+ /// The \p ValIDToTempMDMap is populated by the linker when function
+ /// importing is performed.
///
/// Returns true on error.
- bool linkInModule(Module &Src, unsigned Flags = Flags::None,
+ bool linkInModule(std::unique_ptr<Module> Src, unsigned Flags = Flags::None,
const FunctionInfoIndex *Index = nullptr,
- DenseSet<const GlobalValue *> *FunctionsToImport = nullptr);
-
- static bool linkModules(Module &Dest, Module &Src,
- DiagnosticHandlerFunction DiagnosticHandler,
- unsigned Flags = Flags::None);
-
- DiagnosticHandlerFunction getDiagnosticHandler() const {
- return DiagnosticHandler;
- }
+ DenseSet<const GlobalValue *> *FunctionsToImport = nullptr,
+ DenseMap<unsigned, MDNode *> *ValIDToTempMDMap = nullptr);
-private:
- Module &Composite;
+ /// This exists to implement the deprecated LLVMLinkModules C api. Don't use
+ /// for anything else.
+ bool linkInModuleForCAPI(Module &Src);
- IdentifiedStructTypeSet IdentifiedStructTypes;
+ static bool linkModules(Module &Dest, std::unique_ptr<Module> Src,
+ unsigned Flags = Flags::None);
- DiagnosticHandlerFunction DiagnosticHandler;
+ /// \brief Link metadata from \p Src into the composite. The source is
+ /// destroyed.
+ ///
+ /// The \p ValIDToTempMDMap sound have been populated earlier during function
+ /// importing from \p Src.
+ bool linkInMetadata(Module &Src,
+ DenseMap<unsigned, MDNode *> *ValIDToTempMDMap);
};
+/// Perform in-place global value handling on the given Module for
+/// 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