17d0a022489b56220c365d00aed23bf8ad9983108Reid Spencer//===- llvm/Linker.h - Module Linker Interface ------------------*- C++ -*-===//
29769ab22265b313171d201b5928688524a01bd87Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
79769ab22265b313171d201b5928688524a01bd87Misha Brukman//
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
91166b00316761df873db882c7212133f9b074d41Chris Lattner
107d0a022489b56220c365d00aed23bf8ad9983108Reid Spencer#ifndef LLVM_LINKER_H
117d0a022489b56220c365d00aed23bf8ad9983108Reid Spencer#define LLVM_LINKER_H
121166b00316761df873db882c7212133f9b074d41Chris Lattner
13cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola#include "llvm/ADT/SmallPtrSet.h"
14f1d0f7781e766df878bec4e7977fa3204374f394Craig Topper#include <string>
15d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
16d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
17d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
181166b00316761df873db882c7212133f9b074d41Chris Lattnerclass Module;
19f1d0f7781e766df878bec4e7977fa3204374f394Craig Topperclass StringRef;
20cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindolaclass StructType;
214321ded265a20cb62fa5a99918dfc7d227094b8eVikram S. Adve
22fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola/// This class provides the core functionality of linking in LLVM. It keeps a
23fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola/// pointer to the merged module so far. It doesn't take ownership of the
24fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola/// module since it is assumed that the user of this class will want to do
25fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola/// something with it after the linking.
26e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencerclass Linker {
27e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencer  public:
28f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner    enum LinkerMode {
29f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner      DestroySource = 0, // Allow source module to be destroyed.
30f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner      PreserveSource = 1 // Preserve the source module.
31f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner    };
32d25c05efd55fe190a50965b31e04db69bd8e19deEli Bendersky
33fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    Linker(Module *M);
34e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencer    ~Linker();
35fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    Module *getModule() const { return Composite; }
36fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola
37fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    /// \brief Link \p Src into the composite. The source is destroyed if
38fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    /// \p Mode is DestroySource and preserved if it is PreserveSource.
39fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    /// If \p ErrorMsg is not null, information about any error is written
40fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    /// to it.
41fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    /// Returns true on error.
42fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    bool linkInModule(Module *Src, unsigned Mode, std::string *ErrorMsg);
43fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    bool linkInModule(Module *Src, std::string *ErrorMsg) {
44fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola      return linkInModule(Src, Linker::DestroySource, ErrorMsg);
452803b4cc581af06bf99af5ddc3353836c63d1562Reid Spencer    }
46e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencer
47fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    static bool LinkModules(Module *Dest, Module *Src, unsigned Mode,
48fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola                            std::string *ErrorMsg);
49e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencer
50e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencer  private:
51fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    Module *Composite;
52cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola    SmallPtrSet<StructType*, 32> IdentifiedStructTypes;
53e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencer};
54e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencer
55d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
56d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
571166b00316761df873db882c7212133f9b074d41Chris Lattner#endif
58