1f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===- LinkerScript.h -----------------------------------------------------===//
222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//                     The MCLinker Project
422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// This file is distributed under the University of Illinois Open Source
622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao// License. See LICENSE.TXT for details.
722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//
822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LINKERSCRIPT_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LINKERSCRIPT_H_
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/HashTable.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/StringEntry.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/StringHash.h"
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/SearchDirs.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Object/SectionMap.h"
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/AssertCmd.h"
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Assignment.h"
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <llvm/ADT/StringRef.h>
212bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar#include <llvm/ADT/SmallVector.h>
2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines
2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <string>
2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <vector>
2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesclass LDSymbol;
2987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
30f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines/** \class LinkerScript
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao */
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass LinkerScript {
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef HashTable<StringEntry<llvm::StringRef>,
3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    hash::StringHash<hash::DJB>,
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                    StringEntryFactory<llvm::StringRef> > SymbolRenameMap;
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  typedef HashTable<StringEntry<uint64_t>,
4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    hash::StringHash<hash::DJB>,
4122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                    StringEntryFactory<uint64_t> > AddressMap;
4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef std::vector<std::pair<LDSymbol*, Assignment> > Assignments;
4487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
4587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  typedef std::vector<AssertCmd> Assertions;
46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
472bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar  typedef llvm::SmallVector<std::string, 8> DefSyms;
482bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  LinkerScript();
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  ~LinkerScript();
5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const SymbolRenameMap& renameMap() const { return m_SymbolRenames; }
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  SymbolRenameMap& renameMap() { return m_SymbolRenames; }
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const AddressMap& addressMap() const { return m_AddressMap; }
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  AddressMap& addressMap() { return m_AddressMap; }
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  const SectionMap& sectionMap() const { return m_SectionMap; }
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  SectionMap& sectionMap() { return m_SectionMap; }
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const Assignments& assignments() const { return m_Assignments; }
6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Assignments& assignments() { return m_Assignments; }
6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const Assertions& assertions() const { return m_Assertions; }
6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Assertions& assertions() { return m_Assertions; }
68f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
692bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar  const DefSyms& defsyms() const { return m_DefSyms; }
702bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar  DefSyms& defsyms() { return m_DefSyms; }
712bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar
72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// search directory
73f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const SearchDirs& directories() const { return m_SearchDirs; }
7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  SearchDirs& directories() { return m_SearchDirs; }
75f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
76f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  /// sysroot
77f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  const sys::fs::Path& sysroot() const;
78f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  void setSysroot(const sys::fs::Path& pPath);
80f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
81f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  bool hasSysroot() const;
82f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// entry point
8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const std::string& entry() const;
8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void setEntry(const std::string& pEntry);
8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool hasEntry() const;
8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /// output filename
9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const std::string& outputFile() const;
9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  void setOutputFile(const std::string& pOutputFile);
9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  bool hasOutputFile() const;
9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SymbolRenameMap m_SymbolRenames;
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  AddressMap m_AddressMap;
10022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  SectionMap m_SectionMap;
10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Assignments m_Assignments;
10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  Assertions m_Assertions;
1032bf3f881f79c4d883f379e63725e788c310739a3Pirama Arumuga Nainar  DefSyms m_DefSyms;
104f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  SearchDirs m_SearchDirs;
10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  std::string m_Entry;
10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  std::string m_OutputFile;
10722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao};
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
10937b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
11137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_LINKERSCRIPT_H_
112