C++程序  |  112行  |  2.87 KB

//===- LinkerScript.h -----------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_LINKERSCRIPT_H_
#define MCLD_LINKERSCRIPT_H_

#include "mcld/ADT/HashTable.h"
#include "mcld/ADT/StringEntry.h"
#include "mcld/ADT/StringHash.h"
#include "mcld/MC/SearchDirs.h"
#include "mcld/Object/SectionMap.h"
#include "mcld/Script/AssertCmd.h"
#include "mcld/Script/Assignment.h"

#include <llvm/ADT/StringRef.h>
#include <llvm/ADT/SmallVector.h>

#include <string>
#include <vector>

namespace mcld {

class LDSymbol;

/** \class LinkerScript
 *
 */
class LinkerScript {
 public:
  typedef HashTable<StringEntry<llvm::StringRef>,
                    hash::StringHash<hash::DJB>,
                    StringEntryFactory<llvm::StringRef> > SymbolRenameMap;

  typedef HashTable<StringEntry<uint64_t>,
                    hash::StringHash<hash::DJB>,
                    StringEntryFactory<uint64_t> > AddressMap;

  typedef std::vector<std::pair<LDSymbol*, Assignment> > Assignments;

  typedef std::vector<AssertCmd> Assertions;

  typedef llvm::SmallVector<std::string, 8> DefSyms;

 public:
  LinkerScript();

  ~LinkerScript();

  const SymbolRenameMap& renameMap() const { return m_SymbolRenames; }
  SymbolRenameMap& renameMap() { return m_SymbolRenames; }

  const AddressMap& addressMap() const { return m_AddressMap; }
  AddressMap& addressMap() { return m_AddressMap; }

  const SectionMap& sectionMap() const { return m_SectionMap; }
  SectionMap& sectionMap() { return m_SectionMap; }

  const Assignments& assignments() const { return m_Assignments; }
  Assignments& assignments() { return m_Assignments; }

  const Assertions& assertions() const { return m_Assertions; }
  Assertions& assertions() { return m_Assertions; }

  const DefSyms& defsyms() const { return m_DefSyms; }
  DefSyms& defsyms() { return m_DefSyms; }

  /// search directory
  const SearchDirs& directories() const { return m_SearchDirs; }
  SearchDirs& directories() { return m_SearchDirs; }

  /// sysroot
  const sys::fs::Path& sysroot() const;

  void setSysroot(const sys::fs::Path& pPath);

  bool hasSysroot() const;

  /// entry point
  const std::string& entry() const;

  void setEntry(const std::string& pEntry);

  bool hasEntry() const;

  /// output filename
  const std::string& outputFile() const;

  void setOutputFile(const std::string& pOutputFile);

  bool hasOutputFile() const;

 private:
  SymbolRenameMap m_SymbolRenames;
  AddressMap m_AddressMap;
  SectionMap m_SectionMap;
  Assignments m_Assignments;
  Assertions m_Assertions;
  DefSyms m_DefSyms;
  SearchDirs m_SearchDirs;
  std::string m_Entry;
  std::string m_OutputFile;
};

}  // namespace mcld

#endif  // MCLD_LINKERSCRIPT_H_