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