15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- ResolveInfo.h ------------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCLD_RESOLVE_INFO_H 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_RESOLVE_INFO_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/DataTypes.h> 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/StringRef.h> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass LDSymbol; 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class ResolveInfo 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief ResolveInfo records the information about how to resolve a symbol. 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * A symbol must have some `attributes': 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * - Desc - Defined, Reference, Common or Indirect 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * - Binding - Global, Local, Weak 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * - IsDyn - appear in dynamic objects or regular objects 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * - Type - what the symbol points to 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * - Size - the size of the symbol point to 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * - Value - the pointer to another LDSymbol 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * In order to save the memory and speed up the performance, MCLinker uses 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * a bit field to store all attributes. 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * The maximum string length is (2^16 - 1) 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ResolveInfo 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaofriend class ResolveInfoFactory; 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaofriend class MCLinker; 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint64_t SizeType; 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /** \enum Type 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief What the symbol stand for 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * It is like ELF32_ST_TYPE 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * MachO does not need this, and can not jump between Thumb and ARM code. 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao enum Type { 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao NoType = 0, 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Object = 1, 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Function = 2, 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Section = 3, 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao File = 4, 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao CommonBlock = 5, 58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ThreadLocal = 6, 59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang IndirectFunc = 10, 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LoProc = 13, 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao HiProc = 15 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /** \enum Desc 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief Description of the symbols. 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Follow the naming in MachO. Like MachO nlist::n_desc 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * In ELF, is a part of st_shndx 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao enum Desc { 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Undefined = 0, 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Define = 1, 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Common = 2, 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Indirect = 3, 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao NoneDesc 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao enum Binding { 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Global = 0, 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Weak = 1, 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Local = 2, 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Absolute = 3, 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao NoneBinding 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao enum Visibility { 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Default = 0, 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Internal = 1, 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Hidden = 2, 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Protected = 3 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- For HashTable ----- // 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef llvm::StringRef key_type; 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- modifiers ----- // 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// setRegular - set the source of the file is a regular object 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setRegular(); 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// setDynamic - set the source of the file is a dynamic object 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setDynamic(); 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// setSource - set the source of the file 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pIsDyn is the source from a dynamic object? 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setSource(bool pIsDyn); 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setType(uint32_t pType); 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setDesc(uint32_t pDesc); 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setBinding(uint32_t pBinding); 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setOther(uint32_t pOther); 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setVisibility(Visibility pVisibility); 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setIsSymbol(bool pIsSymbol); 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setReserved(uint32_t pReserved); 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setSize(SizeType pSize) 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Size = pSize; } 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void override(const ResolveInfo& pForm); 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void overrideAttributes(const ResolveInfo& pFrom); 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void overrideVisibility(const ResolveInfo& pFrom); 1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setSymPtr(const LDSymbol* pSymPtr) 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Ptr.sym_ptr = const_cast<LDSymbol*>(pSymPtr); } 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setLink(const ResolveInfo* pTarget) { 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_Ptr.info_ptr = const_cast<ResolveInfo*>(pTarget); 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_BitField |= indirect_flag; 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- observers ----- // 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isSymbol() const; 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isString() const; 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isGlobal() const; 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isWeak() const; 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isLocal() const; 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isAbsolute() const; 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isDefine() const; 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isUndef() const; 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isDyn() const; 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isCommon() const; 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isIndirect() const; 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t type() const; 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t desc() const; 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t binding() const; 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t reserved() const; 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint8_t other() const 1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return (uint8_t)visibility(); } 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Visibility visibility() const; 1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSymbol* outSymbol() 1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Ptr.sym_ptr; } 1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const LDSymbol* outSymbol() const 1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Ptr.sym_ptr; } 1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* link() 1835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Ptr.info_ptr; } 1845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const ResolveInfo* link() const 1865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Ptr.info_ptr; } 1875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SizeType size() const 1895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Size; } 1905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const char* name() const 1925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Name; } 1935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int nameSize() const 1955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return (m_BitField >> NAME_LENGTH_OFFSET); } 1965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t info() const 1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return (m_BitField & INFO_MASK); } 1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t bitfield() const 2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_BitField; } 2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- For HashTable ----- // 2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool compare(const key_type& pKey); 2055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t GLOBAL_OFFSET = 0; 2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t GLOBAL_MASK = 1; 2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t DYN_OFFSET = 1; 2115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t DYN_MASK = 1 << DYN_OFFSET; 2125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t DESC_OFFSET = 2; 2145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t DESC_MASK = 0x3 << DESC_OFFSET; 2155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t LOCAL_OFFSET = 4; 2175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t LOCAL_MASK = 1 << LOCAL_OFFSET; 2185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t BINDING_MASK = GLOBAL_MASK | LOCAL_MASK; 2205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t VISIBILITY_OFFSET = 5; 2225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t VISIBILITY_MASK = 0x3 << VISIBILITY_OFFSET; 2235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t TYPE_OFFSET = 7; 2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t TYPE_MASK = 0xF << TYPE_OFFSET; 2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t SYMBOL_OFFSET = 11; 2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t SYMBOL_MASK = 1 << SYMBOL_OFFSET; 2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t RESERVED_OFFSET = 12; 2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t RESERVED_MASK = 0xF << RESERVED_OFFSET; 2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t NAME_LENGTH_OFFSET = 16; 2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t INFO_MASK = 0xF; 2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t RESOLVE_MASK = 0xFFFF; 2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao union SymOrInfo { 2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSymbol* sym_ptr; 2385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* info_ptr; 2395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao }; 2405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 2425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t global_flag = 0 << GLOBAL_OFFSET; 2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t weak_flag = 1 << GLOBAL_OFFSET; 2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t regular_flag = 0 << DYN_OFFSET; 2455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t dynamic_flag = 1 << DYN_OFFSET; 2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t undefine_flag = 0 << DESC_OFFSET; 2475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t define_flag = 1 << DESC_OFFSET; 2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t common_flag = 2 << DESC_OFFSET; 2495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t indirect_flag = 3 << DESC_OFFSET; 2505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t local_flag = 1 << LOCAL_OFFSET; 2515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t absolute_flag = BINDING_MASK; 2525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t object_flag = Object << TYPE_OFFSET; 2535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t function_flag = Function << TYPE_OFFSET; 2545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t section_flag = Section << TYPE_OFFSET; 2555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t file_flag = File << TYPE_OFFSET; 2565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t string_flag = 0 << SYMBOL_OFFSET; 2575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const uint32_t symbol_flag = 1 << SYMBOL_OFFSET; 2585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 2605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo(); 2615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo(const ResolveInfo& pCopy); 2625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo& operator=(const ResolveInfo& pCopy); 2635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~ResolveInfo(); 2645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 2665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SizeType m_Size; 2675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SymOrInfo m_Ptr; 2685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /** m_BitField 2705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 31 ... 16 15 12 11 10..7 6 .. 5 4 3 2 1 0 2715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * |length of m_Name|reserved|Symbol|Type |ELF visibility|Local|Com|Def|Dyn|Weak| 2725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 2735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint32_t m_BitField; 2745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao char m_Name[0]; 2755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 2765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 2785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 280affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 281