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