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