160ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad//===- ContextFactory.h ---------------------------------------------------===// 260ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad// 360ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad// The MCLinker Project 460ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad// 560ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad// This file is distributed under the University of Illinois Open Source 660ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad// License. See LICENSE.TXT for details. 760ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad// 860ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad//===----------------------------------------------------------------------===// 960ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad#ifndef MCLD_MC_CONTEXTFACTORY_H_ 1060ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad#define MCLD_MC_CONTEXTFACTORY_H_ 1160ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad 1260ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad#include "mcld/LD/LDContext.h" 1360ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad#include "mcld/Support/UniqueGCFactory.h" 1460ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad#include "mcld/Support/Path.h" 1560ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad 1660ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awadnamespace mcld { 17ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn/** \class ContextFactory 1860ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad * \brief ContextFactory avoids the duplicated LDContext of the same file. 193c20d633731a3a2f6ea03012cb4b1d4903a31520Santos Cordon * 20e362e501ee5d8f892d705c0762eff0a584cfb439Hall Liu * MCLinker is designed for efficient memory usage. Because user can give 213c20d633731a3a2f6ea03012cb4b1d4903a31520Santos Cordon * MCLinker the same input file many times on the command line, MCLinker must 223c20d633731a3a2f6ea03012cb4b1d4903a31520Santos Cordon * avoid opening identical file twice. 23e362e501ee5d8f892d705c0762eff0a584cfb439Hall Liu * 2460ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad * ContextFactory is the guard to prevent redundant opening. MCLinker does not 2560ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad * create LDContext directly. Instead, it creates LDContext by ContextFactory. 2660ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad * ContextFactory returns the identical reference of LDContext if it's openend. 2760ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad * 2860ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad * @see LDContext 2960ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad * @see UniqueGCFactoryBase 3060ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad */ 3160ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awadclass ContextFactory : public UniqueGCFactoryBase<sys::fs::Path, LDContext, 0> { 3260ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad public: 3360ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad explicit ContextFactory(size_t pNum); 3460ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad ~ContextFactory(); 3560ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad 36ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn LDContext* produce(); 37ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunn LDContext* produce(const sys::fs::Path& pPath); 3860ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad LDContext* produce(const char* pPath); 39f3dba2f77de0c7223839bf54e070a7d2d146085aYorke Lee}; 4060ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad 4160ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad} // namespace mcld 4260ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad 4360ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad#endif // MCLD_MC_CONTEXTFACTORY_H_ 4460ac30bb8a30fa7283d592c12ddf2da9447adf14Ihab Awad