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