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/StringSet.h"
14#include "llvm/Linker/IRMover.h"
15
16namespace llvm {
17class Module;
18class StructType;
19class Type;
20
21/// This class provides the core functionality of linking in LLVM. It keeps a
22/// pointer to the merged module so far. It doesn't take ownership of the
23/// module since it is assumed that the user of this class will want to do
24/// something with it after the linking.
25class Linker {
26  IRMover Mover;
27
28public:
29  enum Flags {
30    None = 0,
31    OverrideFromSrc = (1 << 0),
32    LinkOnlyNeeded = (1 << 1),
33  };
34
35  Linker(Module &M);
36
37  /// \brief Link \p Src into the composite.
38  ///
39  /// Passing OverrideSymbols as true will have symbols from Src
40  /// shadow those in the Dest.
41  ///
42  /// Passing InternalizeCallback will have the linker call the function with
43  /// the new module and a list of global value names to be internalized by the
44  /// callback.
45  ///
46  /// Returns true on error.
47  bool linkInModule(std::unique_ptr<Module> Src, unsigned Flags = Flags::None,
48                    std::function<void(Module &, const StringSet<> &)>
49                        InternalizeCallback = {});
50
51  static bool linkModules(Module &Dest, std::unique_ptr<Module> Src,
52                          unsigned Flags = Flags::None,
53                          std::function<void(Module &, const StringSet<> &)>
54                              InternalizeCallback = {});
55};
56
57} // End llvm namespace
58
59#endif
60