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