blob: 7776c720ec5379a6d56f36f2ba74ef97512586b0 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- 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
Andrew Scullcdfcccc2018-10-05 20:58:37 +010037 /// Link \p Src into the composite.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010038 ///
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