1 //===- InputFactory.h -----------------------------------------------------===//
2 //
3 //                     The MCLinker Project
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 #ifndef MCLD_MC_INPUTFACTORY_H_
10 #define MCLD_MC_INPUTFACTORY_H_
11 #include "mcld/MC/Input.h"
12 #include "mcld/Support/GCFactory.h"
13 
14 namespace mcld {
15 
16 class AttributeProxy;
17 class AttributeSet;
18 class LinkerConfig;
19 
20 /** \class InputFactory
21  *  \brief InputFactory controls the production and destruction of
22  *  MCLDInput.
23  *
24  *  All MCLDFiles created by MCLDFileFactory are guaranteed to be destructed
25  *  while MCLDFileFactory is destructed.
26  *
27  *  \see llvm::sys::Path
28  */
29 class InputFactory : public GCFactory<Input, 0> {
30  public:
31   typedef GCFactory<Input, 0> Alloc;
32 
33  public:
34   InputFactory(size_t pNum, const LinkerConfig& pConfig);
35 
36   ~InputFactory();
37 
38   // -----  input  ----- //
39   Input* produce(llvm::StringRef pName,
40                  const sys::fs::Path& pPath,
41                  unsigned int pType = Input::Unknown,
42                  off_t pFileOffset = 0);
43 
44   Input* produce(llvm::StringRef pName,
45                  const char* pPath,
46                  unsigned int pType = Input::Unknown,
47                  off_t pFileOffset = 0);
48 
49   // -----  attributes  ----- //
50   /// attr - the last touched attribute.
attr()51   const AttributeProxy& attr() const { return *m_pLast; }
attr()52   AttributeProxy& attr() { return *m_pLast; }
53 
54  private:
55   AttributeProxy* m_pLast;
56   AttributeSet* m_pAttrSet;
57 };
58 
59 }  // namespace mcld
60 
61 #endif  // MCLD_MC_INPUTFACTORY_H_
62