1 //===- Linker.h - Module Linker Interface -----------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_LINKER_LINKER_H
11 #define LLVM_LINKER_LINKER_H
13 #include "llvm/ADT/ArrayRef.h"
14 #include "llvm/ADT/DenseMap.h"
15 #include "llvm/ADT/DenseSet.h"
25 /// This class provides the core functionality of linking in LLVM. It keeps a
26 /// pointer to the merged module so far. It doesn't take ownership of the
27 /// module since it is assumed that the user of this class will want to do
28 /// something with it after the linking.
31 typedef std::function<void(const DiagnosticInfo &)> DiagnosticHandlerFunction;
33 struct StructTypeKeyInfo {
35 ArrayRef<Type *> ETypes;
37 KeyTy(ArrayRef<Type *> E, bool P);
38 KeyTy(const StructType *ST);
39 bool operator==(const KeyTy &that) const;
40 bool operator!=(const KeyTy &that) const;
42 static StructType *getEmptyKey();
43 static StructType *getTombstoneKey();
44 static unsigned getHashValue(const KeyTy &Key);
45 static unsigned getHashValue(const StructType *ST);
46 static bool isEqual(const KeyTy &LHS, const StructType *RHS);
47 static bool isEqual(const StructType *LHS, const StructType *RHS);
50 typedef DenseSet<StructType *, StructTypeKeyInfo> NonOpaqueStructTypeSet;
51 typedef DenseSet<StructType *> OpaqueStructTypeSet;
53 struct IdentifiedStructTypeSet {
54 // The set of opaque types is the composite module.
55 OpaqueStructTypeSet OpaqueStructTypes;
57 // The set of identified but non opaque structures in the composite module.
58 NonOpaqueStructTypeSet NonOpaqueStructTypes;
60 void addNonOpaque(StructType *Ty);
61 void addOpaque(StructType *Ty);
62 StructType *findNonOpaque(ArrayRef<Type *> ETypes, bool IsPacked);
63 bool hasType(StructType *Ty);
66 Linker(Module *M, DiagnosticHandlerFunction DiagnosticHandler);
70 Module *getModule() const { return Composite; }
73 /// \brief Link \p Src into the composite. The source is destroyed.
74 /// Returns true on error.
75 bool linkInModule(Module *Src);
77 static bool LinkModules(Module *Dest, Module *Src,
78 DiagnosticHandlerFunction DiagnosticHandler);
80 static bool LinkModules(Module *Dest, Module *Src);
83 void init(Module *M, DiagnosticHandlerFunction DiagnosticHandler);
86 IdentifiedStructTypeSet IdentifiedStructTypes;
88 DiagnosticHandlerFunction DiagnosticHandler;
91 } // End llvm namespace