You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
3.8 KiB
116 lines
3.8 KiB
//===- 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 <stdint.h>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
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<ELFAttributeValue*, bool> 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_
|