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