You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
5.9 KiB
180 lines
5.9 KiB
//===- Module.h -----------------------------------------------------------===//
|
|
//
|
|
// The MCLinker Project
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Module contains the intermediate representation (LDIR) of MCLinker.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef MCLD_MODULE_H_
|
|
#define MCLD_MODULE_H_
|
|
|
|
#include "mcld/InputTree.h"
|
|
#include "mcld/LD/NamePool.h"
|
|
#include "mcld/LD/SectionSymbolSet.h"
|
|
#include "mcld/MC/SymbolCategory.h"
|
|
|
|
#include <vector>
|
|
#include <string>
|
|
|
|
namespace mcld {
|
|
|
|
class Input;
|
|
class LinkerScript;
|
|
class LDSection;
|
|
class LDSymbol;
|
|
|
|
/** \class Module
|
|
* \brief Module provides the intermediate representation for linking.
|
|
*/
|
|
class Module {
|
|
public:
|
|
typedef std::vector<Input*> ObjectList;
|
|
typedef ObjectList::iterator obj_iterator;
|
|
typedef ObjectList::const_iterator const_obj_iterator;
|
|
|
|
typedef std::vector<Input*> LibraryList;
|
|
typedef LibraryList::iterator lib_iterator;
|
|
typedef LibraryList::const_iterator const_lib_iterator;
|
|
|
|
typedef InputTree::iterator input_iterator;
|
|
typedef InputTree::const_iterator const_input_iterator;
|
|
|
|
typedef std::vector<LDSection*> SectionTable;
|
|
typedef SectionTable::iterator iterator;
|
|
typedef SectionTable::const_iterator const_iterator;
|
|
|
|
typedef SymbolCategory SymbolTable;
|
|
typedef SymbolTable::iterator sym_iterator;
|
|
typedef SymbolTable::const_iterator const_sym_iterator;
|
|
|
|
typedef std::vector<const ResolveInfo*> AliasList;
|
|
typedef AliasList::iterator alias_iterator;
|
|
typedef AliasList::const_iterator const_alias_iterator;
|
|
|
|
public:
|
|
explicit Module(LinkerScript& pScript);
|
|
|
|
Module(const std::string& pName, LinkerScript& pScript);
|
|
|
|
~Module();
|
|
|
|
const std::string& name() const { return m_Name; }
|
|
|
|
void setName(const std::string& pName) { m_Name = pName; }
|
|
|
|
const LinkerScript& getScript() const { return m_Script; }
|
|
|
|
LinkerScript& getScript() { return m_Script; }
|
|
|
|
// ----- link-in objects ----- //
|
|
const ObjectList& getObjectList() const { return m_ObjectList; }
|
|
ObjectList& getObjectList() { return m_ObjectList; }
|
|
|
|
const_obj_iterator obj_begin() const { return m_ObjectList.begin(); }
|
|
obj_iterator obj_begin() { return m_ObjectList.begin(); }
|
|
const_obj_iterator obj_end() const { return m_ObjectList.end(); }
|
|
obj_iterator obj_end() { return m_ObjectList.end(); }
|
|
|
|
// ----- link-in libraries ----- //
|
|
const LibraryList& getLibraryList() const { return m_LibraryList; }
|
|
LibraryList& getLibraryList() { return m_LibraryList; }
|
|
|
|
const_lib_iterator lib_begin() const { return m_LibraryList.begin(); }
|
|
lib_iterator lib_begin() { return m_LibraryList.begin(); }
|
|
const_lib_iterator lib_end() const { return m_LibraryList.end(); }
|
|
lib_iterator lib_end() { return m_LibraryList.end(); }
|
|
|
|
// ----- link-in inputs ----- //
|
|
const InputTree& getInputTree() const { return m_MainTree; }
|
|
InputTree& getInputTree() { return m_MainTree; }
|
|
|
|
const_input_iterator input_begin() const { return m_MainTree.begin(); }
|
|
input_iterator input_begin() { return m_MainTree.begin(); }
|
|
const_input_iterator input_end() const { return m_MainTree.end(); }
|
|
input_iterator input_end() { return m_MainTree.end(); }
|
|
|
|
/// @}
|
|
/// @name Section Accessors
|
|
/// @{
|
|
|
|
// ----- sections ----- //
|
|
const SectionTable& getSectionTable() const { return m_SectionTable; }
|
|
SectionTable& getSectionTable() { return m_SectionTable; }
|
|
|
|
iterator begin() { return m_SectionTable.begin(); }
|
|
const_iterator begin() const { return m_SectionTable.begin(); }
|
|
iterator end() { return m_SectionTable.end(); }
|
|
const_iterator end() const { return m_SectionTable.end(); }
|
|
LDSection* front() { return m_SectionTable.front(); }
|
|
const LDSection* front() const { return m_SectionTable.front(); }
|
|
LDSection* back() { return m_SectionTable.back(); }
|
|
const LDSection* back() const { return m_SectionTable.back(); }
|
|
size_t size() const { return m_SectionTable.size(); }
|
|
bool empty() const { return m_SectionTable.empty(); }
|
|
|
|
LDSection* getSection(const std::string& pName);
|
|
const LDSection* getSection(const std::string& pName) const;
|
|
|
|
/// @}
|
|
/// @name Symbol Accessors
|
|
/// @{
|
|
|
|
// ----- symbols ----- //
|
|
const SymbolTable& getSymbolTable() const { return m_SymbolTable; }
|
|
SymbolTable& getSymbolTable() { return m_SymbolTable; }
|
|
|
|
sym_iterator sym_begin() { return m_SymbolTable.begin(); }
|
|
const_sym_iterator sym_begin() const { return m_SymbolTable.begin(); }
|
|
sym_iterator sym_end() { return m_SymbolTable.end(); }
|
|
const_sym_iterator sym_end() const { return m_SymbolTable.end(); }
|
|
size_t sym_size() const { return m_SymbolTable.numOfSymbols(); }
|
|
|
|
// ----- section symbols ----- //
|
|
const LDSymbol* getSectionSymbol(const LDSection& pSection) const {
|
|
return m_SectSymbolSet.get(pSection);
|
|
}
|
|
|
|
LDSymbol* getSectionSymbol(const LDSection& pSection) {
|
|
return m_SectSymbolSet.get(pSection);
|
|
}
|
|
|
|
const SectionSymbolSet& getSectionSymbolSet() const {
|
|
return m_SectSymbolSet;
|
|
}
|
|
SectionSymbolSet& getSectionSymbolSet() { return m_SectSymbolSet; }
|
|
|
|
// ----- names ----- //
|
|
const NamePool& getNamePool() const { return m_NamePool; }
|
|
NamePool& getNamePool() { return m_NamePool; }
|
|
|
|
// ----- Aliases ----- //
|
|
// create an alias list for pSym, the aliases of pSym
|
|
// can be added into the list by calling addAlias
|
|
void CreateAliasList(const ResolveInfo& pSym);
|
|
|
|
// add pAlias into the newly created alias list
|
|
void addAlias(const ResolveInfo& pAlias);
|
|
AliasList* getAliasList(const ResolveInfo& pSym);
|
|
|
|
private:
|
|
std::string m_Name;
|
|
LinkerScript& m_Script;
|
|
ObjectList m_ObjectList;
|
|
LibraryList m_LibraryList;
|
|
InputTree m_MainTree;
|
|
SectionTable m_SectionTable;
|
|
SymbolTable m_SymbolTable;
|
|
NamePool m_NamePool;
|
|
SectionSymbolSet m_SectSymbolSet;
|
|
std::vector<AliasList*> m_AliasLists;
|
|
};
|
|
|
|
} // namespace mcld
|
|
|
|
#endif // MCLD_MODULE_H_
|