| //===- Linker.h - Module Linker Interface -----------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_LINKER_LINKER_H |
| #define LLVM_LINKER_LINKER_H |
| |
| #include "llvm/ADT/StringSet.h" |
| #include "llvm/Linker/IRMover.h" |
| |
| namespace llvm { |
| class Module; |
| class StructType; |
| class Type; |
| |
| /// This class provides the core functionality of linking in LLVM. It keeps a |
| /// pointer to the merged module so far. It doesn't take ownership of the |
| /// module since it is assumed that the user of this class will want to do |
| /// something with it after the linking. |
| class Linker { |
| IRMover Mover; |
| |
| public: |
| enum Flags { |
| None = 0, |
| OverrideFromSrc = (1 << 0), |
| LinkOnlyNeeded = (1 << 1), |
| }; |
| |
| Linker(Module &M); |
| |
| /// Link \p Src into the composite. |
| /// |
| /// Passing OverrideSymbols as true will have symbols from Src |
| /// shadow those in the Dest. |
| /// |
| /// Passing InternalizeCallback will have the linker call the function with |
| /// the new module and a list of global value names to be internalized by the |
| /// callback. |
| /// |
| /// Returns true on error. |
| bool linkInModule(std::unique_ptr<Module> Src, unsigned Flags = Flags::None, |
| std::function<void(Module &, const StringSet<> &)> |
| InternalizeCallback = {}); |
| |
| static bool linkModules(Module &Dest, std::unique_ptr<Module> Src, |
| unsigned Flags = Flags::None, |
| std::function<void(Module &, const StringSet<> &)> |
| InternalizeCallback = {}); |
| }; |
| |
| } // End llvm namespace |
| |
| #endif |