//===- LDSymbol.h ---------------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_LD_LDSYMBOL_H_ #define MCLD_LD_LDSYMBOL_H_ #include "mcld/Config/Config.h" #include "mcld/LD/ResolveInfo.h" #include "mcld/Support/Allocators.h" #include namespace llvm { // forware declaration template void* object_creator(); } // namespace llvm namespace mcld { class FragmentRef; /** \class LDSymbol * \brief LDSymbol provides a consistent abstraction for different formats * in different targets. */ class LDSymbol { public: // FIXME: use SizeTrait<32> or SizeTrait<64> instead of big type typedef ResolveInfo::SizeType SizeType; typedef uint64_t ValueType; public: ~LDSymbol(); // ----- factory method ----- // static LDSymbol* Create(ResolveInfo& pResolveInfo); static void Destroy(LDSymbol*& pSymbol); /// Clear - This function tells MCLinker to clear all created LDSymbols. static void Clear(); /// NullSymbol() - This returns a reference to a LDSymbol that represents Null /// symbol. static LDSymbol* Null(); // ----- observers ----- // bool isNull() const; const char* name() const { assert(m_pResolveInfo != NULL); return m_pResolveInfo->name(); } unsigned int nameSize() const { assert(m_pResolveInfo != NULL); return m_pResolveInfo->nameSize(); } llvm::StringRef str() const { assert(m_pResolveInfo != NULL); return llvm::StringRef(m_pResolveInfo->name(), m_pResolveInfo->nameSize()); } bool isDyn() const { assert(m_pResolveInfo != NULL); return m_pResolveInfo->isDyn(); } unsigned int type() const { assert(m_pResolveInfo != NULL); return m_pResolveInfo->type(); } unsigned int desc() const { assert(m_pResolveInfo != NULL); return m_pResolveInfo->desc(); } unsigned int binding() const { assert(m_pResolveInfo != NULL); return m_pResolveInfo->binding(); } uint8_t other() const { assert(m_pResolveInfo != NULL); return m_pResolveInfo->other(); } uint8_t visibility() const { assert(m_pResolveInfo != NULL); return m_pResolveInfo->other(); } ValueType value() const { return m_Value; } const FragmentRef* fragRef() const { return m_pFragRef; } FragmentRef* fragRef() { return m_pFragRef; } SizeType size() const { return m_pResolveInfo->size(); } const ResolveInfo* resolveInfo() const { return m_pResolveInfo; } ResolveInfo* resolveInfo() { return m_pResolveInfo; } bool hasFragRef() const; // ----- modifiers ----- // void setSize(SizeType pSize) { assert(m_pResolveInfo != NULL); m_pResolveInfo->setSize(pSize); } void setValue(ValueType pValue) { m_Value = pValue; } void setFragmentRef(FragmentRef* pFragmentRef); void setResolveInfo(const ResolveInfo& pInfo); private: friend class Chunk; template friend void* llvm::object_creator(); LDSymbol(); LDSymbol(const LDSymbol& pCopy); LDSymbol& operator=(const LDSymbol& pCopy); private: // ----- Symbol's fields ----- // ResolveInfo* m_pResolveInfo; FragmentRef* m_pFragRef; ValueType m_Value; }; } // namespace mcld #endif // MCLD_LD_LDSYMBOL_H_