Linker.h revision cfb320f5f97717c309832e0f92b97835526977a8
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