blob: 3d984c35ca3ff424176265ca5f0350c746565add [file] [log] [blame]
Stephen Hinesf7ac0f12013-05-03 19:09:24 -07001//===- LinkerScript.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//===----------------------------------------------------------------------===//
Stephen Hines37b74a32014-11-26 18:48:20 -08009#ifndef MCLD_LINKERSCRIPT_H_
10#define MCLD_LINKERSCRIPT_H_
11
12#include "mcld/ADT/HashTable.h"
13#include "mcld/ADT/StringEntry.h"
14#include "mcld/ADT/StringHash.h"
15#include "mcld/MC/SearchDirs.h"
16#include "mcld/Object/SectionMap.h"
17#include "mcld/Script/AssertCmd.h"
18#include "mcld/Script/Assignment.h"
19
20#include <llvm/ADT/StringRef.h>
Pirama Arumuga Nainar2bf3f882015-04-21 10:33:13 -070021#include <llvm/ADT/SmallVector.h>
Stephen Hines37b74a32014-11-26 18:48:20 -080022
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070023#include <string>
Stephen Hines87f34652014-02-14 18:00:16 -080024#include <vector>
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070025
26namespace mcld {
27
Stephen Hines87f34652014-02-14 18:00:16 -080028class LDSymbol;
29
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070030/** \class LinkerScript
31 *
32 */
Stephen Hines37b74a32014-11-26 18:48:20 -080033class LinkerScript {
34 public:
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070035 typedef HashTable<StringEntry<llvm::StringRef>,
Stephen Hines87f34652014-02-14 18:00:16 -080036 hash::StringHash<hash::DJB>,
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070037 StringEntryFactory<llvm::StringRef> > SymbolRenameMap;
38
39 typedef HashTable<StringEntry<uint64_t>,
Stephen Hines87f34652014-02-14 18:00:16 -080040 hash::StringHash<hash::DJB>,
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070041 StringEntryFactory<uint64_t> > AddressMap;
42
Stephen Hines87f34652014-02-14 18:00:16 -080043 typedef std::vector<std::pair<LDSymbol*, Assignment> > Assignments;
44
45 typedef std::vector<AssertCmd> Assertions;
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070046
Pirama Arumuga Nainar2bf3f882015-04-21 10:33:13 -070047 typedef llvm::SmallVector<std::string, 8> DefSyms;
48
Stephen Hines37b74a32014-11-26 18:48:20 -080049 public:
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070050 LinkerScript();
51
52 ~LinkerScript();
53
54 const SymbolRenameMap& renameMap() const { return m_SymbolRenames; }
Stephen Hines37b74a32014-11-26 18:48:20 -080055 SymbolRenameMap& renameMap() { return m_SymbolRenames; }
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070056
57 const AddressMap& addressMap() const { return m_AddressMap; }
Stephen Hines37b74a32014-11-26 18:48:20 -080058 AddressMap& addressMap() { return m_AddressMap; }
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070059
60 const SectionMap& sectionMap() const { return m_SectionMap; }
Stephen Hines37b74a32014-11-26 18:48:20 -080061 SectionMap& sectionMap() { return m_SectionMap; }
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070062
Stephen Hines87f34652014-02-14 18:00:16 -080063 const Assignments& assignments() const { return m_Assignments; }
Stephen Hines37b74a32014-11-26 18:48:20 -080064 Assignments& assignments() { return m_Assignments; }
Stephen Hines87f34652014-02-14 18:00:16 -080065
66 const Assertions& assertions() const { return m_Assertions; }
Stephen Hines37b74a32014-11-26 18:48:20 -080067 Assertions& assertions() { return m_Assertions; }
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070068
Pirama Arumuga Nainar2bf3f882015-04-21 10:33:13 -070069 const DefSyms& defsyms() const { return m_DefSyms; }
70 DefSyms& defsyms() { return m_DefSyms; }
71
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070072 /// search directory
73 const SearchDirs& directories() const { return m_SearchDirs; }
Stephen Hines37b74a32014-11-26 18:48:20 -080074 SearchDirs& directories() { return m_SearchDirs; }
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070075
76 /// sysroot
77 const sys::fs::Path& sysroot() const;
78
Stephen Hines37b74a32014-11-26 18:48:20 -080079 void setSysroot(const sys::fs::Path& pPath);
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070080
81 bool hasSysroot() const;
82
Stephen Hines87f34652014-02-14 18:00:16 -080083 /// entry point
84 const std::string& entry() const;
85
86 void setEntry(const std::string& pEntry);
87
88 bool hasEntry() const;
89
90 /// output filename
91 const std::string& outputFile() const;
92
93 void setOutputFile(const std::string& pOutputFile);
94
95 bool hasOutputFile() const;
96
Stephen Hines37b74a32014-11-26 18:48:20 -080097 private:
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070098 SymbolRenameMap m_SymbolRenames;
99 AddressMap m_AddressMap;
100 SectionMap m_SectionMap;
Stephen Hines87f34652014-02-14 18:00:16 -0800101 Assignments m_Assignments;
102 Assertions m_Assertions;
Pirama Arumuga Nainar2bf3f882015-04-21 10:33:13 -0700103 DefSyms m_DefSyms;
Stephen Hinesf7ac0f12013-05-03 19:09:24 -0700104 SearchDirs m_SearchDirs;
Stephen Hines87f34652014-02-14 18:00:16 -0800105 std::string m_Entry;
106 std::string m_OutputFile;
Stephen Hinesf7ac0f12013-05-03 19:09:24 -0700107};
108
Stephen Hines37b74a32014-11-26 18:48:20 -0800109} // namespace mcld
Stephen Hinesf7ac0f12013-05-03 19:09:24 -0700110
Stephen Hines37b74a32014-11-26 18:48:20 -0800111#endif // MCLD_LINKERSCRIPT_H_