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//===----------------------------------------------------------------------===//
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#ifndef MCLD_SCRIPT_SCRIPTFILE_H
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_SCRIPT_SCRIPTFILE_H
1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/Assignment.h>
1387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/OutputSectDesc.h>
1487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <mcld/Script/InputSectDesc.h>
1587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <vector>
1687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <string>
1787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesnamespace mcld
1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{
2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ScriptCommand;
2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Input;
2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass InputTree;
2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass InputBuilder;
2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass GroupReader;
2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LinkerConfig;
2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass RpnExpr;
2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass StringList;
2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass Module;
3087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
3187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/** \class ScriptFile
3287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines *  \brief This class defines the interfaces to a linker script file.
3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines */
3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass ScriptFile
3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{
3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic:
3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  enum Kind {
3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    LDScript,      // -T
4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Expression,    // --defsym
4187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    VersionScript, // --version-script
4287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    DynamicList,   // --dynamic-list
4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    Unknown
4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  };
4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef std::vector<ScriptCommand*> CommandQueue;
4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef CommandQueue::const_iterator const_iterator;
4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef CommandQueue::iterator iterator;
4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef CommandQueue::const_reference const_reference;
5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef CommandQueue::reference reference;
5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinespublic:
5387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  ScriptFile(Kind pKind, Input& pInput, InputBuilder& pBuilder);
5487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  ~ScriptFile();
5587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const_iterator  begin() const { return m_CommandQueue.begin(); }
5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  iterator        begin()       { return m_CommandQueue.begin(); }
5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const_iterator  end()   const { return m_CommandQueue.end(); }
5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  iterator        end()         { return m_CommandQueue.end(); }
6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const_reference front() const { return m_CommandQueue.front(); }
6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  reference       front()       { return m_CommandQueue.front(); }
6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const_reference back()  const { return m_CommandQueue.back(); }
6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  reference       back()        { return m_CommandQueue.back(); }
6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const Input& input() const { return m_Input; }
6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Input&       input()       { return m_Input; }
6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  size_t size() const { return m_CommandQueue.size(); }
7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Kind getKind() const { return m_Kind; }
7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const InputTree& inputs() const { return *m_pInputTree; }
7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  InputTree&       inputs()       { return *m_pInputTree; }
7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const std::string& name() const { return m_Name; }
7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  std::string&       name()       { return m_Name; }
7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void dump() const;
8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void activate(Module& pModule);
8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// ENTRY(symbol)
8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addEntryPoint(const std::string& pSymbol);
8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// OUTPUT_FORMAT(bfdname)
8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// OUTPUT_FORMAT(default, big, little)
8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addOutputFormatCmd(const std::string& pFormat);
8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addOutputFormatCmd(const std::string& pDefault,
8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                          const std::string& pBig,
9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                          const std::string& pLittle);
9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// GROUP(file, file, ...)
9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// GROUP(file file ...)
9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addGroupCmd(StringList& pStringList,
9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   GroupReader& pGroupReader,
9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   const LinkerConfig& pConfig);
9787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// OUTPUT(filename)
9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addOutputCmd(const std::string& pFileName);
10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// SEARCH_DIR(path)
10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addSearchDirCmd(const std::string& pPath);
10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// OUTPUT_ARCH(bfdarch)
10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addOutputArchCmd(const std::string& pArch);
10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// ASSERT(exp, message)
10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addAssertCmd(RpnExpr& pRpnExpr, const std::string& pMessage);
10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// assignment
11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addAssignment(const std::string& pSymbol,
11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     RpnExpr& pRpnExpr,
11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     Assignment::Type pType = Assignment::DEFAULT);
11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool hasSectionsCmd() const;
11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void enterSectionsCmd();
11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void leaveSectionsCmd();
12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void enterOutputSectDesc(const std::string& pName,
12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                           const OutputSectDesc::Prolog& pProlog);
12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void leaveOutputSectDesc(const OutputSectDesc::Epilog& pEpilog);
12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void addInputSectDesc(InputSectDesc::KeepPolicy pPolicy,
12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                        const InputSectDesc::Spec& pSpec);
12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  RpnExpr* createRpnExpr();
13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const RpnExpr* getCurrentRpnExpr() const { return m_pRpnExpr; }
13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  RpnExpr*       getCurrentRpnExpr()       { return m_pRpnExpr; }
13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
13387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  StringList* createStringList();
13487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const StringList* getCurrentStringList() const { return m_pStringList; }
13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  StringList*       getCurrentStringList()       { return m_pStringList; }
13687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void setAsNeeded(bool pEnable = true);
13887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool asNeeded() const { return m_bAsNeeded; }
13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  static const std::string& createParserStr(const char* pText, size_t pLength);
14187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
14287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  static void clearParserStrPool();
14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesprivate:
14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Kind m_Kind;
14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Input& m_Input;
14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  std::string m_Name;
14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  InputTree* m_pInputTree;
14987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  InputBuilder& m_Builder;
15087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  CommandQueue m_CommandQueue;
15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool m_bHasSectionsCmd;
15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool m_bInSectionsCmd;
15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool m_bInOutputSectDesc;
15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  RpnExpr* m_pRpnExpr;
15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  StringList* m_pStringList;
15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool m_bAsNeeded;
15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines};
15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} // namespace of mcld
16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#endif
16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
163