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