//===- Linker.h - Module Linker Interface -----------------------*- C++ -*-===//
 
//
 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 
// See https://llvm.org/LICENSE.txt for license information.
 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
//
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_LINKER_LINKER_H
 
#define LLVM_LINKER_LINKER_H
 
 
 
#include "llvm/ADT/StringSet.h"
 
#include "llvm/Linker/IRMover.h"
 
 
 
namespace llvm {
 
class Module;
 
 
 
/// 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