#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/IR/DiagnosticInfo.h"
+#include "llvm/IR/FunctionInfo.h"
namespace llvm {
class Module;
NonOpaqueStructTypeSet NonOpaqueStructTypes;
void addNonOpaque(StructType *Ty);
+ void switchToNonOpaque(StructType *Ty);
void addOpaque(StructType *Ty);
StructType *findNonOpaque(ArrayRef<Type *> ETypes, bool IsPacked);
bool hasType(StructType *Ty);
};
- Linker(Module *M, DiagnosticHandlerFunction DiagnosticHandler);
- Linker(Module *M);
- ~Linker();
+ enum Flags {
+ None = 0,
+ OverrideFromSrc = (1 << 0),
+ LinkOnlyNeeded = (1 << 1),
+ InternalizeLinkedSymbols = (1 << 2)
+ };
+
+ Linker(Module &M, DiagnosticHandlerFunction DiagnosticHandler);
+ Linker(Module &M);
- Module *getModule() const { return Composite; }
- void deleteModule();
+ Module &getModule() const { return Composite; }
/// \brief Link \p Src into the composite. The source is destroyed.
+ /// Passing OverrideSymbols as true will have symbols from Src
+ /// shadow those in the Dest.
+ /// For ThinLTO function importing/exporting the \p FunctionInfoIndex
+ /// is passed. If a \p FuncToImport is provided, only that single
+ /// function is imported from the source module.
/// Returns true on error.
- bool linkInModule(Module *Src);
-
- /// \brief Set the composite to the passed-in module.
- void setModule(Module *Dst);
+ bool linkInModule(Module &Src, unsigned Flags = Flags::None,
+ const FunctionInfoIndex *Index = nullptr,
+ Function *FuncToImport = nullptr);
- static bool LinkModules(Module *Dest, Module *Src,
- DiagnosticHandlerFunction DiagnosticHandler);
+ static bool linkModules(Module &Dest, Module &Src,
+ DiagnosticHandlerFunction DiagnosticHandler,
+ unsigned Flags = Flags::None);
- static bool LinkModules(Module *Dest, Module *Src);
+ static bool linkModules(Module &Dest, Module &Src,
+ unsigned Flags = Flags::None);
private:
- void init(Module *M, DiagnosticHandlerFunction DiagnosticHandler);
- Module *Composite;
+ Module &Composite;
IdentifiedStructTypeSet IdentifiedStructTypes;