//===- InputSectDesc.h ----------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_SCRIPT_INPUTSECTDESC_H #define MCLD_SCRIPT_INPUTSECTDESC_H #include <mcld/Script/ScriptCommand.h> #include <mcld/Script/StringList.h> #include <cassert> namespace mcld { class WildcardPattern; class OutputSectDesc; /** \class InputSectDesc * \brief This class defines the interfaces to input section description. */ class InputSectDesc : public ScriptCommand { public: enum KeepPolicy { Keep, NoKeep }; struct Spec { bool hasFile() const { return m_pWildcardFile != NULL; } const WildcardPattern& file() const { assert(hasFile()); return *m_pWildcardFile; } bool hasExcludeFiles() const { return m_pExcludeFiles != NULL && !m_pExcludeFiles->empty(); } const StringList& excludeFiles() const { assert(hasExcludeFiles()); return *m_pExcludeFiles; } bool hasSections() const { return m_pWildcardSections != NULL && !m_pWildcardSections->empty(); } const StringList& sections() const { assert(hasSections()); return *m_pWildcardSections; } bool operator==(const Spec& pRHS) const { /* FIXME: currently I don't check the real content */ if (this == &pRHS) return true; if (m_pWildcardFile != pRHS.m_pWildcardFile) return false; if (m_pExcludeFiles != pRHS.m_pExcludeFiles) return false; if (m_pWildcardSections != pRHS.m_pWildcardSections) return false; return true; } WildcardPattern* m_pWildcardFile; StringList* m_pExcludeFiles; StringList* m_pWildcardSections; }; public: InputSectDesc(KeepPolicy pPolicy, const Spec& pSpec, const OutputSectDesc& pOutputDesc); ~InputSectDesc(); KeepPolicy policy() const { return m_KeepPolicy; } const Spec& spec() const { return m_Spec; } void dump() const; static bool classof(const ScriptCommand* pCmd) { return pCmd->getKind() == ScriptCommand::INPUT_SECT_DESC; } void activate(Module& pModule); private: KeepPolicy m_KeepPolicy; Spec m_Spec; const OutputSectDesc& m_OutputSectDesc; }; } // namespace of mcld #endif