//===- ELFAttributeData.h -------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_TARGET_ELFATTRIBUTEDATA_H_ #define MCLD_TARGET_ELFATTRIBUTEDATA_H_ #include #include #include namespace mcld { class ELFAttributeValue; class Input; class LinkerConfig; /** \class ELFAttributeData * \brief ELFAttributeData handles data in vendor attribute subsection. */ class ELFAttributeData { public: typedef uint32_t TagType; // Generic attribute tags shared between all vendors enum { Tag_NULL = 0, Tag_File = 1, Tag_Section = 2, Tag_Symbol = 3, }; public: explicit ELFAttributeData(const char* pVendor) : m_Vendor(pVendor) {} virtual ~ELFAttributeData() {} public: inline const std::string& getVendorName() const { return m_Vendor; } /// getAttributeValue - query the data store for the attribute value of the /// given tag. virtual const ELFAttributeValue* getAttributeValue(TagType pTag) const = 0; /// getOrCreateAttributeValue - obtain attribute value for the given tag and /// create if it does not exist. /// /// It returns a pair containing the attribute value instance (guaranteed to /// be non-NULL) and a boolean value indicating whether the instance is newly /// created (true) or not (false.) virtual std::pair getOrCreateAttributeValue( TagType pTag) = 0; /// preMerge - hooks to call before starting merge the attribute data in an /// input. virtual bool preMerge(const Input& pInput) { return true; } /// merge - implement logics to merge input attribute to the output. virtual bool merge(const LinkerConfig& pConfig, const Input& pInput, TagType pTag, const ELFAttributeValue& pInAttr) = 0; /// postMerge - hooks to call after finishing merge the attribute data from an /// input. virtual bool postMerge(const LinkerConfig& pConfig, const Input& pInput) { return true; } /// sizeOutput - obtain number of bytes required to encode the attribute data. virtual size_t sizeOutput() const = 0; /// emit - write out attribute data to the buffer and return the number of /// bytes written virtual size_t emit(char* pBuf) const = 0; public: /// ReadTag - read an attribute tag from input buffer. /// /// If the read succeeds, pBuf moves to the new position just pass the end of /// the tag in the buffer and pBufSize decreases the size of tag in the /// buffer. Otherwise, this function will return false and change nothing /// except leaving undefined value in pTag. static bool ReadTag(TagType& pTag, const char*& pBuf, size_t& pBufSize); /// ReadValue - read an attribute value from input buffer /// /// Similar with ReadTag() while this reads attribute value from the input /// buffer. Note that the value type of the attribute must be properly set in /// pValue prior the call. static bool ReadValue(ELFAttributeValue& pValue, const char*& pBuf, size_t& pBufSize); /// WriteAttribute - write an attribute tag plus value to buffer. /// /// On success, the pBuf moves to the new position just pass the end of the /// attribute data just written. Otherwise, it returns false and leaves pBuf /// in an undefined position. Note that buffer is guaranteed to be able to /// contain the attribute data. static bool WriteAttribute(TagType pTag, const ELFAttributeValue& pValue, char*& pBuf); private: const std::string m_Vendor; }; } // namespace mcld #endif // MCLD_TARGET_ELFATTRIBUTEDATA_H_