187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===- ScriptFile.h -------------------------------------------------------===// 287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// 387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// The MCLinker Project 487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// 587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// This file is distributed under the University of Illinois Open Source 687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// License. See LICENSE.TXT for details. 787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// 887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_SCRIPT_SCRIPTFILE_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_SCRIPT_SCRIPTFILE_H_ 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Assignment.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/InputSectDesc.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/OutputSectDesc.h" 1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <string> 1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <vector> 1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ArchiveReader; 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass DynObjReader; 2337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass GroupReader; 2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Input; 2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass InputBuilder; 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass InputTree; 2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LinkerConfig; 2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module; 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ObjectReader; 3037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ScriptCommand; 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass StringList; 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass RpnExpr; 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class ScriptFile 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * \brief This class defines the interfaces to a linker script file. 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */ 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass ScriptFile { 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines enum Kind { 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDScript, // -T 4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines Expression, // --defsym 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines VersionScript, // --version-script 4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines DynamicList, // --dynamic-list 4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Unknown 4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines }; 4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef std::vector<ScriptCommand*> CommandQueue; 4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef CommandQueue::const_iterator const_iterator; 5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef CommandQueue::iterator iterator; 5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef CommandQueue::const_reference const_reference; 5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef CommandQueue::reference reference; 5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ScriptFile(Kind pKind, Input& pInput, InputBuilder& pBuilder); 5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ~ScriptFile(); 5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_iterator begin() const { return m_CommandQueue.begin(); } 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines iterator begin() { return m_CommandQueue.begin(); } 6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_iterator end() const { return m_CommandQueue.end(); } 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines iterator end() { return m_CommandQueue.end(); } 6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const_reference front() const { return m_CommandQueue.front(); } 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines reference front() { return m_CommandQueue.front(); } 6537b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_reference back() const { return m_CommandQueue.back(); } 6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines reference back() { return m_CommandQueue.back(); } 6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const Input& input() const { return m_Input; } 6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines Input& input() { return m_Input; } 7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines size_t size() const { return m_CommandQueue.size(); } 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Kind getKind() const { return m_Kind; } 7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const InputTree& inputs() const { return *m_pInputTree; } 7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines InputTree& inputs() { return *m_pInputTree; } 7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& name() const { return m_Name; } 7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines std::string& name() { return m_Name; } 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void dump() const; 8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void activate(Module& pModule); 8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// ENTRY(symbol) 8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addEntryPoint(const std::string& pSymbol); 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// OUTPUT_FORMAT(bfdname) 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// OUTPUT_FORMAT(default, big, little) 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addOutputFormatCmd(const std::string& pFormat); 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addOutputFormatCmd(const std::string& pDefault, 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& pBig, 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const std::string& pLittle); 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines /// INPUT(file, file, ...) 9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines /// INPUT(file file ...) 9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines void addInputCmd(StringList& pStringList, 9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines ObjectReader& pObjectReader, 9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines ArchiveReader& pArchiveReader, 9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines DynObjReader& pDynObjReader, 10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines const LinkerConfig& pConfig); 10137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// GROUP(file, file, ...) 10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// GROUP(file file ...) 10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addGroupCmd(StringList& pStringList, 10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines GroupReader& pGroupReader, 10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const LinkerConfig& pConfig); 10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// OUTPUT(filename) 10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addOutputCmd(const std::string& pFileName); 11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// SEARCH_DIR(path) 11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addSearchDirCmd(const std::string& pPath); 11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// OUTPUT_ARCH(bfdarch) 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addOutputArchCmd(const std::string& pArch); 11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// ASSERT(exp, message) 11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addAssertCmd(RpnExpr& pRpnExpr, const std::string& pMessage); 11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /// assignment 12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addAssignment(const std::string& pSymbol, 12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RpnExpr& pRpnExpr, 12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Assignment::Type pType = Assignment::DEFAULT); 12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool hasSectionsCmd() const; 12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void enterSectionsCmd(); 12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void leaveSectionsCmd(); 13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void enterOutputSectDesc(const std::string& pName, 13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const OutputSectDesc::Prolog& pProlog); 13387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 13487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void leaveOutputSectDesc(const OutputSectDesc::Epilog& pEpilog); 13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 13687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void addInputSectDesc(InputSectDesc::KeepPolicy pPolicy, 13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const InputSectDesc::Spec& pSpec); 13887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RpnExpr* createRpnExpr(); 14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const RpnExpr* getCurrentRpnExpr() const { return m_pRpnExpr; } 14137b74a387bb3993387029859c2d9d051c41c724eStephen Hines RpnExpr* getCurrentRpnExpr() { return m_pRpnExpr; } 14287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines StringList* createStringList(); 14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines const StringList* getCurrentStringList() const { return m_pStringList; } 14537b74a387bb3993387029859c2d9d051c41c724eStephen Hines StringList* getCurrentStringList() { return m_pStringList; } 14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines void setAsNeeded(bool pEnable = true); 14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool asNeeded() const { return m_bAsNeeded; } 14987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static const std::string& createParserStr(const char* pText, size_t pLength); 15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines static void clearParserStrPool(); 15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 15437b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Kind m_Kind; 15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input& m_Input; 15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::string m_Name; 15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines InputTree* m_pInputTree; 15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines InputBuilder& m_Builder; 16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines CommandQueue m_CommandQueue; 16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool m_bHasSectionsCmd; 16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool m_bInSectionsCmd; 16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool m_bInOutputSectDesc; 16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines RpnExpr* m_pRpnExpr; 16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines StringList* m_pStringList; 16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines bool m_bAsNeeded; 16787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}; 16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 16937b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 17087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 17137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_SCRIPT_SCRIPTFILE_H_ 172