1 //===- InputSectDesc.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_SCRIPT_INPUTSECTDESC_H
10 #define MCLD_SCRIPT_INPUTSECTDESC_H
11 
12 #include <mcld/Script/ScriptCommand.h>
13 #include <mcld/Script/StringList.h>
14 #include <cassert>
15 
16 namespace mcld
17 {
18 
19 class WildcardPattern;
20 class OutputSectDesc;
21 
22 /** \class InputSectDesc
23  *  \brief This class defines the interfaces to input section description.
24  */
25 
26 class InputSectDesc : public ScriptCommand
27 {
28 public:
29   enum KeepPolicy {
30     Keep,
31     NoKeep
32   };
33 
34   struct Spec {
hasFileSpec35     bool hasFile() const { return m_pWildcardFile != NULL; }
fileSpec36     const WildcardPattern& file() const {
37       assert(hasFile());
38       return *m_pWildcardFile;
39     }
40 
hasExcludeFilesSpec41     bool hasExcludeFiles() const {
42       return m_pExcludeFiles != NULL && !m_pExcludeFiles->empty();
43     }
excludeFilesSpec44     const StringList& excludeFiles() const {
45       assert(hasExcludeFiles());
46       return *m_pExcludeFiles;
47     }
48 
hasSectionsSpec49     bool hasSections() const {
50       return m_pWildcardSections != NULL && !m_pWildcardSections->empty();
51     }
sectionsSpec52     const StringList& sections() const {
53       assert(hasSections());
54       return *m_pWildcardSections;
55     }
56 
57     bool operator==(const Spec& pRHS) const {
58       /* FIXME: currently I don't check the real content */
59       if (this == &pRHS)
60         return true;
61       if (m_pWildcardFile != pRHS.m_pWildcardFile)
62         return false;
63       if (m_pExcludeFiles != pRHS.m_pExcludeFiles)
64         return false;
65       if (m_pWildcardSections != pRHS.m_pWildcardSections)
66         return false;
67       return true;
68     }
69 
70     WildcardPattern* m_pWildcardFile;
71     StringList* m_pExcludeFiles;
72     StringList* m_pWildcardSections;
73   };
74 
75 public:
76   InputSectDesc(KeepPolicy pPolicy,
77                 const Spec& pSpec,
78                 const OutputSectDesc& pOutputDesc);
79   ~InputSectDesc();
80 
policy()81   KeepPolicy policy() const { return m_KeepPolicy; }
82 
spec()83   const Spec& spec() const { return m_Spec; }
84 
85   void dump() const;
86 
classof(const ScriptCommand * pCmd)87   static bool classof(const ScriptCommand* pCmd)
88   {
89     return pCmd->getKind() == ScriptCommand::INPUT_SECT_DESC;
90   }
91 
92   void activate(Module& pModule);
93 
94 private:
95   KeepPolicy m_KeepPolicy;
96   Spec m_Spec;
97   const OutputSectDesc& m_OutputSectDesc;
98 };
99 
100 } // namespace of mcld
101 
102 #endif
103