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//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_LDSYMBOL_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_LDSYMBOL_H_ 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Config/Config.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ResolveInfo.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Allocators.h" 15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <cassert> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesnamespace llvm { 1987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// forware declaration 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hinestemplate <class T> 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid* object_creator(); 2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace 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 */ 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass LDSymbol { 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // FIXME: use SizeTrait<32> or SizeTrait<64> instead of big type 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef ResolveInfo::SizeType SizeType; 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef uint64_t ValueType; 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~LDSymbol(); 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 4322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // ----- factory method ----- // 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static LDSymbol* Create(ResolveInfo& pResolveInfo); 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static void Destroy(LDSymbol*& pSymbol); 4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 4822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// Clear - This function tells MCLinker to clear all created LDSymbols. 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static void Clear(); 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// NullSymbol() - This returns a reference to a LDSymbol that represents Null 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// symbol. 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static LDSymbol* Null(); 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- observers ----- // 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool isNull() const; 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const char* name() const { 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pResolveInfo != NULL); 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->name(); 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int nameSize() const { 6437b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pResolveInfo != NULL); 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->nameSize(); 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::StringRef str() const { 6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pResolveInfo != NULL); 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return llvm::StringRef(m_pResolveInfo->name(), m_pResolveInfo->nameSize()); 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool isDyn() const { 7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pResolveInfo != NULL); 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->isDyn(); 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int type() const { 7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pResolveInfo != NULL); 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->type(); 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines unsigned int desc() const { 8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pResolveInfo != NULL); 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->desc(); 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao unsigned int binding() const { 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pResolveInfo != NULL); 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->binding(); 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint8_t other() const { 9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pResolveInfo != NULL); 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->other(); 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao uint8_t visibility() const { 9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pResolveInfo != NULL); 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return m_pResolveInfo->other(); 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 10137b74a387bb3993387029859c2d9d051c41c724eStephen Hines ValueType value() const { return m_Value; } 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 10337b74a387bb3993387029859c2d9d051c41c724eStephen Hines const FragmentRef* fragRef() const { return m_pFragRef; } 10437b74a387bb3993387029859c2d9d051c41c724eStephen Hines FragmentRef* fragRef() { return m_pFragRef; } 1050dea6bc96bb52346737966839ac68644f7939f58Stephen Hines 10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines SizeType size() const { return m_pResolveInfo->size(); } 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 10837b74a387bb3993387029859c2d9d051c41c724eStephen Hines const ResolveInfo* resolveInfo() const { return m_pResolveInfo; } 10937b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo* resolveInfo() { return m_pResolveInfo; } 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao bool hasFragRef() const; 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- modifiers ----- // 1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setSize(SizeType pSize) { 11537b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(m_pResolveInfo != NULL); 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_pResolveInfo->setSize(pSize); 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 11937b74a387bb3993387029859c2d9d051c41c724eStephen Hines void setValue(ValueType pValue) { m_Value = pValue; } 120551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines 121cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao void setFragmentRef(FragmentRef* pFragmentRef); 1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void setResolveInfo(const ResolveInfo& pInfo); 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12537b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao friend class Chunk<LDSymbol, MCLD_SYMBOLS_PER_INPUT>; 12737b74a387bb3993387029859c2d9d051c41c724eStephen Hines template <class T> 12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines friend void* llvm::object_creator(); 12922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSymbol(); 13122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSymbol(const LDSymbol& pCopy); 13222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSymbol& operator=(const LDSymbol& pCopy); 13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- Symbol's fields ----- // 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* m_pResolveInfo; 137cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao FragmentRef* m_pFragRef; 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ValueType m_Value; 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14137b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 142affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 14337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_LD_LDSYMBOL_H_ 144