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