Home | History | Annotate | Download | only in Script
      1 //===- ScriptFile.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_SCRIPTFILE_H
     10 #define MCLD_SCRIPT_SCRIPTFILE_H
     11 
     12 #include <mcld/Script/Assignment.h>
     13 #include <mcld/Script/OutputSectDesc.h>
     14 #include <mcld/Script/InputSectDesc.h>
     15 #include <vector>
     16 #include <string>
     17 
     18 namespace mcld
     19 {
     20 
     21 class ScriptCommand;
     22 class Input;
     23 class InputTree;
     24 class InputBuilder;
     25 class GroupReader;
     26 class LinkerConfig;
     27 class RpnExpr;
     28 class StringList;
     29 class Module;
     30 
     31 /** \class ScriptFile
     32  *  \brief This class defines the interfaces to a linker script file.
     33  */
     34 
     35 class ScriptFile
     36 {
     37 public:
     38   enum Kind {
     39     LDScript,      // -T
     40     Expression,    // --defsym
     41     VersionScript, // --version-script
     42     DynamicList,   // --dynamic-list
     43     Unknown
     44   };
     45 
     46   typedef std::vector<ScriptCommand*> CommandQueue;
     47   typedef CommandQueue::const_iterator const_iterator;
     48   typedef CommandQueue::iterator iterator;
     49   typedef CommandQueue::const_reference const_reference;
     50   typedef CommandQueue::reference reference;
     51 
     52 public:
     53   ScriptFile(Kind pKind, Input& pInput, InputBuilder& pBuilder);
     54   ~ScriptFile();
     55 
     56   const_iterator  begin() const { return m_CommandQueue.begin(); }
     57   iterator        begin()       { return m_CommandQueue.begin(); }
     58   const_iterator  end()   const { return m_CommandQueue.end(); }
     59   iterator        end()         { return m_CommandQueue.end(); }
     60 
     61   const_reference front() const { return m_CommandQueue.front(); }
     62   reference       front()       { return m_CommandQueue.front(); }
     63   const_reference back()  const { return m_CommandQueue.back(); }
     64   reference       back()        { return m_CommandQueue.back(); }
     65 
     66   const Input& input() const { return m_Input; }
     67   Input&       input()       { return m_Input; }
     68 
     69   size_t size() const { return m_CommandQueue.size(); }
     70 
     71   Kind getKind() const { return m_Kind; }
     72 
     73   const InputTree& inputs() const { return *m_pInputTree; }
     74   InputTree&       inputs()       { return *m_pInputTree; }
     75 
     76   const std::string& name() const { return m_Name; }
     77   std::string&       name()       { return m_Name; }
     78 
     79   void dump() const;
     80   void activate(Module& pModule);
     81 
     82   /// ENTRY(symbol)
     83   void addEntryPoint(const std::string& pSymbol);
     84 
     85   /// OUTPUT_FORMAT(bfdname)
     86   /// OUTPUT_FORMAT(default, big, little)
     87   void addOutputFormatCmd(const std::string& pFormat);
     88   void addOutputFormatCmd(const std::string& pDefault,
     89                           const std::string& pBig,
     90                           const std::string& pLittle);
     91 
     92   /// GROUP(file, file, ...)
     93   /// GROUP(file file ...)
     94   void addGroupCmd(StringList& pStringList,
     95                    GroupReader& pGroupReader,
     96                    const LinkerConfig& pConfig);
     97 
     98   /// OUTPUT(filename)
     99   void addOutputCmd(const std::string& pFileName);
    100 
    101   /// SEARCH_DIR(path)
    102   void addSearchDirCmd(const std::string& pPath);
    103 
    104   /// OUTPUT_ARCH(bfdarch)
    105   void addOutputArchCmd(const std::string& pArch);
    106 
    107   /// ASSERT(exp, message)
    108   void addAssertCmd(RpnExpr& pRpnExpr, const std::string& pMessage);
    109 
    110   /// assignment
    111   void addAssignment(const std::string& pSymbol,
    112                      RpnExpr& pRpnExpr,
    113                      Assignment::Type pType = Assignment::DEFAULT);
    114 
    115   bool hasSectionsCmd() const;
    116 
    117   void enterSectionsCmd();
    118 
    119   void leaveSectionsCmd();
    120 
    121   void enterOutputSectDesc(const std::string& pName,
    122                            const OutputSectDesc::Prolog& pProlog);
    123 
    124   void leaveOutputSectDesc(const OutputSectDesc::Epilog& pEpilog);
    125 
    126   void addInputSectDesc(InputSectDesc::KeepPolicy pPolicy,
    127                         const InputSectDesc::Spec& pSpec);
    128 
    129   RpnExpr* createRpnExpr();
    130   const RpnExpr* getCurrentRpnExpr() const { return m_pRpnExpr; }
    131   RpnExpr*       getCurrentRpnExpr()       { return m_pRpnExpr; }
    132 
    133   StringList* createStringList();
    134   const StringList* getCurrentStringList() const { return m_pStringList; }
    135   StringList*       getCurrentStringList()       { return m_pStringList; }
    136 
    137   void setAsNeeded(bool pEnable = true);
    138   bool asNeeded() const { return m_bAsNeeded; }
    139 
    140   static const std::string& createParserStr(const char* pText, size_t pLength);
    141 
    142   static void clearParserStrPool();
    143 
    144 private:
    145   Kind m_Kind;
    146   Input& m_Input;
    147   std::string m_Name;
    148   InputTree* m_pInputTree;
    149   InputBuilder& m_Builder;
    150   CommandQueue m_CommandQueue;
    151   bool m_bHasSectionsCmd;
    152   bool m_bInSectionsCmd;
    153   bool m_bInOutputSectDesc;
    154   RpnExpr* m_pRpnExpr;
    155   StringList* m_pStringList;
    156   bool m_bAsNeeded;
    157 };
    158 
    159 } // namespace of mcld
    160 
    161 #endif
    162 
    163