Home | History | Annotate | Download | only in Target
      1 //===- ELFAttributeData.h -------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #ifndef MCLD_TARGET_ELFATTRIBUTEDATA_H
     10 #define MCLD_TARGET_ELFATTRIBUTEDATA_H
     11 
     12 #include <stdint.h>
     13 #include <string>
     14 #include <utility>
     15 
     16 namespace mcld {
     17 
     18 class ELFAttributeValue;
     19 class Input;
     20 class LinkerConfig;
     21 
     22 /** \class ELFAttributeData
     23  *  \brief ELFAttributeData handles data in vendor attribute subsection.
     24  */
     25 class ELFAttributeData
     26 {
     27 public:
     28   typedef uint32_t TagType;
     29 
     30   // Generic attribute tags shared between all vendors
     31   enum {
     32     Tag_NULL          = 0,
     33     Tag_File          = 1,
     34     Tag_Section       = 2,
     35     Tag_Symbol        = 3,
     36   };
     37 
     38 public:
     39   ELFAttributeData(const char* pVendor) : m_Vendor(pVendor) { }
     40 
     41   virtual ~ELFAttributeData() { }
     42 
     43 public:
     44   inline const std::string &getVendorName() const { return m_Vendor; }
     45 
     46   /// getAttributeValue - query the data store for the attribute value of the
     47   /// given tag.
     48   virtual const ELFAttributeValue *getAttributeValue(TagType pTag) const = 0;
     49 
     50   /// getOrCreateAttributeValue - obtain attribute value for the given tag and
     51   /// create if it does not exist.
     52   ///
     53   /// It returns a pair containing the attribute value instance (guaranteed to
     54   /// be non-NULL) and a boolean value indicating whether the instance is newly
     55   /// created (true) or not (false.)
     56   virtual std::pair<ELFAttributeValue*, bool>
     57       getOrCreateAttributeValue(TagType pTag) = 0;
     58 
     59   /// preMerge - hooks to call before starting merge the attribute data in an
     60   /// input.
     61   virtual bool preMerge(const Input &pInput) { return true; }
     62 
     63   /// merge - implement logics to merge input attribute to the output.
     64   virtual bool merge(const LinkerConfig& pConfig, const Input &pInput,
     65                      TagType pTag, const ELFAttributeValue& pInAttr) = 0;
     66 
     67   /// postMerge - hooks to call after finishing merge the attribute data from an
     68   /// input.
     69   virtual bool postMerge(const LinkerConfig& pConfig, const Input &pInput)
     70   { return true; }
     71 
     72   /// sizeOutput - obtain number of bytes required to encode the attribute data.
     73   virtual size_t sizeOutput() const = 0;
     74 
     75   /// emit - write out attribute data to the buffer and return the number of
     76   /// bytes written
     77   virtual size_t emit(char *pBuf) const = 0;
     78 
     79 public:
     80   /// ReadTag - read an attribute tag from input buffer.
     81   ///
     82   /// If the read succeeds, pBuf moves to the new position just pass the end of
     83   /// the tag in the buffer and pBufSize decreases the size of tag in the
     84   /// buffer. Otherwise, this function will return false and change nothing
     85   /// except leaving undefined value in pTag.
     86   static bool ReadTag(TagType& pTag, const char* &pBuf, size_t &pBufSize);
     87 
     88   /// ReadValue - read an attribute value from input buffer
     89   ///
     90   /// Similar with ReadTag() while this reads attribute value from the input
     91   /// buffer. Note that the value type of the attribute must be properly set in
     92   /// pValue prior the call.
     93   static bool ReadValue(ELFAttributeValue& pValue, const char* &pBuf,
     94                         size_t &pBufSize);
     95 
     96   /// WriteAttribute - write an attribute tag plus value to buffer.
     97   ///
     98   /// On success, the pBuf moves to the new position just pass the end of the
     99   /// attribute data just written. Otherwise, it returns false and leaves pBuf
    100   /// in an undefined position. Note that buffer is guaranteed to be able to
    101   /// contain the attribute data.
    102   static bool WriteAttribute(TagType pTag, const ELFAttributeValue& pValue,
    103                              char* &pBuf);
    104 
    105 private:
    106   const std::string m_Vendor;
    107 };
    108 
    109 } // namespace of mcld
    110 
    111 #endif
    112