//===- MemoryAreaFactory.h ------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_SUPPORT_MEMORYAREAFACTORY_H_ #define MCLD_SUPPORT_MEMORYAREAFACTORY_H_ #include "mcld/Support/FileHandle.h" #include "mcld/Support/GCFactory.h" #include "mcld/Support/MemoryArea.h" #include "mcld/Support/Path.h" #include namespace mcld { /** \class MemoryAreaFactory * \brief MemoryAreaFactory avoids creating duplicated MemoryAreas of the * same file. * * Users can give duplicated input files on the command line. In order to * prevent opening the same file twice, and create redundant MemoryRegions, * mcld::Input should not create MemoryArea directly. Instead, it should ask * MemoryAreaFactory and get the unique MemoryArea. * * The timing of opening and closing files is not strictly bound to the * constructor and destructor of MCLDFile. For mcld::Output, MCLinker * opens the file rather after assigning offset to sections. On the other * aside, mcld::Input opens the file at constructor. In order to hide the * file operations, MemoryAreaFactory actually open the file untill the first * MemoryRegion is requested. * * @see MemoryRegion */ class MemoryAreaFactory : public GCFactory { public: explicit MemoryAreaFactory(size_t pNum); virtual ~MemoryAreaFactory(); // produce - create a MemoryArea and open its file. MemoryArea* produce(const sys::fs::Path& pPath, FileHandle::OpenMode pMode); // produce - create a MemoryArea and open its file. MemoryArea* produce(const sys::fs::Path& pPath, FileHandle::OpenMode pMode, FileHandle::Permission pPerm); // Create a MemoryArea with an universal space. // The created MemoryArea is not moderated by m_HandleToArea. MemoryArea* produce(void* pMemBuffer, size_t pSize); // Create a MemoryArea by the given file handler // The created MemoryArea is not moderated by m_HandleToArea. MemoryArea* produce(int pFD, FileHandle::OpenMode pMode); void destruct(MemoryArea* pArea); private: llvm::StringMap m_AreaMap; }; } // namespace mcld #endif // MCLD_SUPPORT_MEMORYAREAFACTORY_H_