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 16 namespace llvm { 17 class Module; 18 class StructType; 19 class 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. 25 class Linker { 26 IRMover Mover; 27 28 public: 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