//===- ScriptFile.h -------------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_SCRIPT_SCRIPTFILE_H_ #define MCLD_SCRIPT_SCRIPTFILE_H_ #include "mcld/Script/Assignment.h" #include "mcld/Script/InputSectDesc.h" #include "mcld/Script/OutputSectDesc.h" #include #include namespace mcld { class ArchiveReader; class DynObjReader; class GroupReader; class Input; class InputBuilder; class InputTree; class LinkerConfig; class Module; class ObjectReader; class ScriptCommand; class StringList; class RpnExpr; /** \class ScriptFile * \brief This class defines the interfaces to a linker script file. */ class ScriptFile { public: enum Kind { LDScript, // -T Expression, // --defsym VersionScript, // --version-script DynamicList, // --dynamic-list Unknown }; typedef std::vector CommandQueue; typedef CommandQueue::const_iterator const_iterator; typedef CommandQueue::iterator iterator; typedef CommandQueue::const_reference const_reference; typedef CommandQueue::reference reference; public: ScriptFile(Kind pKind, Input& pInput, InputBuilder& pBuilder); ~ScriptFile(); const_iterator begin() const { return m_CommandQueue.begin(); } iterator begin() { return m_CommandQueue.begin(); } const_iterator end() const { return m_CommandQueue.end(); } iterator end() { return m_CommandQueue.end(); } const_reference front() const { return m_CommandQueue.front(); } reference front() { return m_CommandQueue.front(); } const_reference back() const { return m_CommandQueue.back(); } reference back() { return m_CommandQueue.back(); } const Input& input() const { return m_Input; } Input& input() { return m_Input; } size_t size() const { return m_CommandQueue.size(); } Kind getKind() const { return m_Kind; } const InputTree& inputs() const { return *m_pInputTree; } InputTree& inputs() { return *m_pInputTree; } const std::string& name() const { return m_Name; } std::string& name() { return m_Name; } void dump() const; void activate(Module& pModule); /// ENTRY(symbol) void addEntryPoint(const std::string& pSymbol); /// OUTPUT_FORMAT(bfdname) /// OUTPUT_FORMAT(default, big, little) void addOutputFormatCmd(const std::string& pFormat); void addOutputFormatCmd(const std::string& pDefault, const std::string& pBig, const std::string& pLittle); /// INPUT(file, file, ...) /// INPUT(file file ...) void addInputCmd(StringList& pStringList, ObjectReader& pObjectReader, ArchiveReader& pArchiveReader, DynObjReader& pDynObjReader, const LinkerConfig& pConfig); /// GROUP(file, file, ...) /// GROUP(file file ...) void addGroupCmd(StringList& pStringList, GroupReader& pGroupReader, const LinkerConfig& pConfig); /// OUTPUT(filename) void addOutputCmd(const std::string& pFileName); /// SEARCH_DIR(path) void addSearchDirCmd(const std::string& pPath); /// OUTPUT_ARCH(bfdarch) void addOutputArchCmd(const std::string& pArch); /// ASSERT(exp, message) void addAssertCmd(RpnExpr& pRpnExpr, const std::string& pMessage); /// assignment void addAssignment(const std::string& pSymbol, RpnExpr& pRpnExpr, Assignment::Type pType = Assignment::DEFAULT); bool hasSectionsCmd() const; void enterSectionsCmd(); void leaveSectionsCmd(); void enterOutputSectDesc(const std::string& pName, const OutputSectDesc::Prolog& pProlog); void leaveOutputSectDesc(const OutputSectDesc::Epilog& pEpilog); void addInputSectDesc(InputSectDesc::KeepPolicy pPolicy, const InputSectDesc::Spec& pSpec); RpnExpr* createRpnExpr(); const RpnExpr* getCurrentRpnExpr() const { return m_pRpnExpr; } RpnExpr* getCurrentRpnExpr() { return m_pRpnExpr; } StringList* createStringList(); const StringList* getCurrentStringList() const { return m_pStringList; } StringList* getCurrentStringList() { return m_pStringList; } void setAsNeeded(bool pEnable = true); bool asNeeded() const { return m_bAsNeeded; } static const std::string& createParserStr(const char* pText, size_t pLength); static void clearParserStrPool(); private: Kind m_Kind; Input& m_Input; std::string m_Name; InputTree* m_pInputTree; InputBuilder& m_Builder; CommandQueue m_CommandQueue; bool m_bHasSectionsCmd; bool m_bInSectionsCmd; bool m_bInOutputSectDesc; RpnExpr* m_pRpnExpr; StringList* m_pStringList; bool m_bAsNeeded; }; } // namespace mcld #endif // MCLD_SCRIPT_SCRIPTFILE_H_