• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- InputBuilder.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_INPUTBUILDER_H
10 #define MCLD_MC_INPUTBUILDER_H
11 
12 #include <string>
13 #include <stack>
14 
15 #include <mcld/InputTree.h>
16 #include <mcld/MC/Input.h>
17 #include <mcld/Support/FileHandle.h>
18 
19 namespace mcld {
20 
21 class LinkerConfig;
22 class InputFactory;
23 class ContextFactory;
24 class MemoryAreaFactory;
25 class AttrConstraint;
26 
27 /** \class InputBuilder
28  *  \brief InputBuilder recieves InputActions and build the InputTree.
29  *
30  *  InputBuilder build input tree and inputs.
31  */
32 class InputBuilder
33 {
34 public:
35   explicit InputBuilder(const LinkerConfig& pConfig);
36 
37   InputBuilder(const LinkerConfig& pConfig,
38                InputFactory& pInputFactory,
39                ContextFactory& pContextFactory,
40                MemoryAreaFactory& pMemoryFactory,
41                bool pDelegate = true);
42 
43   virtual ~InputBuilder();
44 
45   // -----  input tree operations  ----- //
46   const InputTree& getCurrentTree() const;
47   InputTree&       getCurrentTree();
48 
49   void setCurrentTree(InputTree& pInputTree);
50 
51   // -----  root of input tree  ----- //
getCurrentNode()52   const InputTree::iterator& getCurrentNode() const { return m_Root; }
getCurrentNode()53   InputTree::iterator&       getCurrentNode()       { return m_Root; }
54 
55   template<InputTree::Direction DIRECTION>
56   InputTree& createNode(const std::string& pName,
57                         const sys::fs::Path& pPath,
58                         unsigned int pType = Input::Unknown);
59 
60   // -----  input operations  ----- //
61   Input* createInput(const std::string& pName,
62                      const sys::fs::Path& pPath,
63                      unsigned int pType = Input::Unknown,
64                      off_t pFileOffset = 0);
65 
66   bool setContext(Input& pInput, bool pCheck = true);
67 
68   bool setMemory(Input& pInput,
69                  FileHandle::OpenMode pMode,
70 		 FileHandle::Permission pPerm = FileHandle::System);
71 
72   bool setMemory(Input& pInput, void* pMemBuffer, size_t pSize);
73 
74   InputTree& enterGroup();
75 
76   InputTree& exitGroup();
77 
78   bool isInGroup() const;
79 
80   const AttrConstraint& getConstraint() const;
81 
82   const AttributeProxy& getAttributes() const;
83   AttributeProxy&       getAttributes();
84 
85 private:
86   const LinkerConfig& m_Config;
87 
88   InputFactory* m_pInputFactory;
89   MemoryAreaFactory* m_pMemFactory;
90   ContextFactory* m_pContextFactory;
91 
92   InputTree* m_pCurrentTree;
93   InputTree::Mover* m_pMove;
94   InputTree::iterator m_Root;
95   std::stack<InputTree::iterator> m_ReturnStack;
96 
97   bool m_bOwnFactory;
98 
99 };
100 
101 //===----------------------------------------------------------------------===//
102 // Template implement
103 //===----------------------------------------------------------------------===//
104 template<> inline InputTree&
105 InputBuilder::createNode<InputTree::Inclusive>(const std::string& pName,
106                                                const sys::fs::Path& pPath,
107                                                unsigned int pType)
108 {
109   assert(NULL != m_pCurrentTree && NULL != m_pMove);
110 
111   Input* input = createInput(pName, pPath, pType);
112   m_pCurrentTree->insert(m_Root, *m_pMove, *input);
113   m_pMove->move(m_Root);
114   m_pMove = &InputTree::Downward;
115 
116   return *m_pCurrentTree;
117 }
118 
119 template<> inline InputTree&
120 InputBuilder::createNode<InputTree::Positional>(const std::string& pName,
121                                                const sys::fs::Path& pPath,
122                                                unsigned int pType)
123 {
124   assert(NULL != m_pCurrentTree && NULL != m_pMove);
125 
126   Input* input = createInput(pName, pPath, pType);
127   m_pCurrentTree->insert(m_Root, *m_pMove, *input);
128   m_pMove->move(m_Root);
129   m_pMove = &InputTree::Afterward;
130 
131   return *m_pCurrentTree;
132 }
133 
134 } // end of namespace mcld
135 
136 #endif
137 
138