15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- LDSymbol.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_LDSYMBOL_H 1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define MCLD_LD_LDSYMBOL_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <cassert> 13cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Config/Config.h> 15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/ADT/Uncopyable.h> 16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/LD/ResolveInfo.h> 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/Allocators.h> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesnamespace llvm { 2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// forware declaration 2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestemplate<class T> void* object_creator(); 2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines} // namespace of llvm 256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass FragmentRef; 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class LDSymbol 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief LDSymbol provides a consistent abstraction for different formats 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * in different targets. 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass LDSymbol 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // FIXME: use SizeTrait<32> or SizeTrait<64> instead of big type 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef ResolveInfo::SizeType SizeType; 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint64_t ValueType; 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~LDSymbol(); 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- factory method ----- // 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static LDSymbol* Create(ResolveInfo& pResolveInfo); 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static void Destroy(LDSymbol*& pSymbol); 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// Clear - This function tells MCLinker to clear all created LDSymbols. 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static void Clear(); 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// NullSymbol() - This returns a reference to a LDSymbol that represents Null 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// symbol. 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static LDSymbol* Null(); 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- observers ----- // 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool isNull() const; 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const char* name() const { 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != m_pResolveInfo); 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->name(); 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int nameSize() const { 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != m_pResolveInfo); 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->nameSize(); 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::StringRef str() const { 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != m_pResolveInfo); 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return llvm::StringRef(m_pResolveInfo->name(), m_pResolveInfo->nameSize()); 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isDyn() const { 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != m_pResolveInfo); 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->isDyn(); 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int type() const { 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != m_pResolveInfo); 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->type(); 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int desc() const { 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != m_pResolveInfo); 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->desc(); 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int binding() const { 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != m_pResolveInfo); 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->binding(); 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint8_t other() const { 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != m_pResolveInfo); 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->other(); 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint8_t visibility() const { 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != m_pResolveInfo); 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->other(); 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ValueType value() const 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Value; } 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 105cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao const FragmentRef* fragRef() const 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_pFragRef; } 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 108a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines FragmentRef* fragRef() 109a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines { return m_pFragRef; } 110a790f0a8f3175183bea088389b3e4ae41813e192Stephen Hines 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao SizeType size() const 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_pResolveInfo->size(); } 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* resolveInfo() 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_pResolveInfo; } 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 117551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines const ResolveInfo* resolveInfo() const 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_pResolveInfo; } 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool hasFragRef() const; 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- modifiers ----- // 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setSize(SizeType pSize) { 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao assert(NULL != m_pResolveInfo); 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pResolveInfo->setSize(pSize); 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setValue(ValueType pValue) 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { m_Value = pValue; } 130551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 131cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao void setFragmentRef(FragmentRef* pFragmentRef); 1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setResolveInfo(const ResolveInfo& pInfo); 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 13622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao friend class Chunk<LDSymbol, MCLD_SYMBOLS_PER_INPUT>; 1376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines template<class T> friend void* llvm::object_creator(); 13822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSymbol(); 14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSymbol(const LDSymbol& pCopy); 14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSymbol& operator=(const LDSymbol& pCopy); 14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoprivate: 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- Symbol's fields ----- // 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* m_pResolveInfo; 146cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao FragmentRef* m_pFragRef; 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ValueType m_Value; 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace mcld 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 154affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 155