136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===- 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
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef LLVM_LINKER_LINKER_H
1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define LLVM_LINKER_LINKER_H
121166b00316761df873db882c7212133f9b074d41Chris Lattner
13cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola#include "llvm/ADT/SmallPtrSet.h"
14f1d0f7781e766df878bec4e7977fa3204374f394Craig Topper#include <string>
15d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
16d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
17d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
18cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass Comdat;
19cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass GlobalValue;
201166b00316761df873db882c7212133f9b074d41Chris Lattnerclass Module;
21f1d0f7781e766df878bec4e7977fa3204374f394Craig Topperclass StringRef;
22cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindolaclass StructType;
234321ded265a20cb62fa5a99918dfc7d227094b8eVikram S. Adve
24fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola/// This class provides the core functionality of linking in LLVM. It keeps a
25fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola/// pointer to the merged module so far. It doesn't take ownership of the
26fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola/// module since it is assumed that the user of this class will want to do
27fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola/// something with it after the linking.
28e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencerclass Linker {
29e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencer  public:
30f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner    enum LinkerMode {
31f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner      DestroySource = 0, // Allow source module to be destroyed.
32f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner      PreserveSource = 1 // Preserve the source module.
33f1f1a4f16128ffa2910f0b1d5c7052b3697f9fcdTanya Lattner    };
34d25c05efd55fe190a50965b31e04db69bd8e19deEli Bendersky
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Linker(Module *M, bool SuppressWarnings=false);
36e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencer    ~Linker();
37b4a0ba17183e1b4aa385e81e896c2a95671a40b2Bill Wendling
38fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    Module *getModule() const { return Composite; }
39b4a0ba17183e1b4aa385e81e896c2a95671a40b2Bill Wendling    void deleteModule();
40fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola
41fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    /// \brief Link \p Src into the composite. The source is destroyed if
42fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    /// \p Mode is DestroySource and preserved if it is PreserveSource.
43fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    /// If \p ErrorMsg is not null, information about any error is written
44fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    /// to it.
45fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    /// Returns true on error.
46fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    bool linkInModule(Module *Src, unsigned Mode, std::string *ErrorMsg);
47fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    bool linkInModule(Module *Src, std::string *ErrorMsg) {
48fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola      return linkInModule(Src, Linker::DestroySource, ErrorMsg);
492803b4cc581af06bf99af5ddc3353836c63d1562Reid Spencer    }
50e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencer
51fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    static bool LinkModules(Module *Dest, Module *Src, unsigned Mode,
52fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola                            std::string *ErrorMsg);
53e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencer
54e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencer  private:
55fca88631650af3e862f7df012f34d9c724a9ed7cRafael Espindola    Module *Composite;
56cfb320f5f97717c309832e0f92b97835526977a8Rafael Espindola    SmallPtrSet<StructType*, 32> IdentifiedStructTypes;
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    bool SuppressWarnings;
59e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencer};
60e5caf877e9355ba68cfb6d995e0b1a2b2a466288Reid Spencer
61d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
62d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
631166b00316761df873db882c7212133f9b074d41Chris Lattner#endif
64