1//===- Linker.h - Module Linker Interface -----------------------*- 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#ifndef LLVM_LINKER_LINKER_H
11#define LLVM_LINKER_LINKER_H
12
13#include "llvm/ADT/ArrayRef.h"
14#include "llvm/ADT/DenseMap.h"
15#include "llvm/ADT/DenseSet.h"
16#include "llvm/IR/DiagnosticInfo.h"
17
18namespace llvm {
19class Module;
20class StructType;
21class Type;
22
23/// This class provides the core functionality of linking in LLVM. It keeps a
24/// pointer to the merged module so far. It doesn't take ownership of the
25/// module since it is assumed that the user of this class will want to do
26/// something with it after the linking.
27class Linker {
28public:
29  struct StructTypeKeyInfo {
30    struct KeyTy {
31      ArrayRef<Type *> ETypes;
32      bool IsPacked;
33      KeyTy(ArrayRef<Type *> E, bool P);
34      KeyTy(const StructType *ST);
35      bool operator==(const KeyTy &that) const;
36      bool operator!=(const KeyTy &that) const;
37    };
38    static StructType *getEmptyKey();
39    static StructType *getTombstoneKey();
40    static unsigned getHashValue(const KeyTy &Key);
41    static unsigned getHashValue(const StructType *ST);
42    static bool isEqual(const KeyTy &LHS, const StructType *RHS);
43    static bool isEqual(const StructType *LHS, const StructType *RHS);
44  };
45
46  typedef DenseSet<StructType *, StructTypeKeyInfo> NonOpaqueStructTypeSet;
47  typedef DenseSet<StructType *> OpaqueStructTypeSet;
48
49  struct IdentifiedStructTypeSet {
50    // The set of opaque types is the composite module.
51    OpaqueStructTypeSet OpaqueStructTypes;
52
53    // The set of identified but non opaque structures in the composite module.
54    NonOpaqueStructTypeSet NonOpaqueStructTypes;
55
56    void addNonOpaque(StructType *Ty);
57    void switchToNonOpaque(StructType *Ty);
58    void addOpaque(StructType *Ty);
59    StructType *findNonOpaque(ArrayRef<Type *> ETypes, bool IsPacked);
60    bool hasType(StructType *Ty);
61  };
62
63  Linker(Module *M, DiagnosticHandlerFunction DiagnosticHandler);
64  Linker(Module *M);
65  ~Linker();
66
67  Module *getModule() const { return Composite; }
68  void deleteModule();
69
70  /// \brief Link \p Src into the composite. The source is destroyed.
71  /// Returns true on error.
72  bool linkInModule(Module *Src);
73
74  /// \brief Set the composite to the passed-in module.
75  void setModule(Module *Dst);
76
77  static bool LinkModules(Module *Dest, Module *Src,
78                          DiagnosticHandlerFunction DiagnosticHandler);
79
80  static bool LinkModules(Module *Dest, Module *Src);
81
82private:
83  void init(Module *M, DiagnosticHandlerFunction DiagnosticHandler);
84  Module *Composite;
85
86  IdentifiedStructTypeSet IdentifiedStructTypes;
87
88  DiagnosticHandlerFunction DiagnosticHandler;
89};
90
91} // End llvm namespace
92
93#endif
94