15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- MCInstFragment.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//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCINSTFRAGMENT_H
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCINSTFRAGMENT_H
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h>
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/MC/MCAssembler.h>
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/MC/MCInst.h>
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/SmallString.h>
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/ilist.h>
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "mcld/LD/Relocation.h"
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class MCInstFragment
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \brief MCInstFragment for mcld
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \see
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *  \author Diana Chen <diana.chen@mediatek.com>
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MCInstFragment : public  llvm::MCFragment
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef std::vector<Relocation*> RelocationsType;
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate:
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ///  m_pFragment - llvm MCInstFragment for this MCInstFragment
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  llvm::MCInstFragment* m_pFragment;
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  /// m_Relocation - The list of relocations in this fragment
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  RelocationsType m_Relocations;
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef RelocationsType::const_iterator const_relocation_iterator;
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  typedef RelocationsType::iterator relocation_iterator;
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic:
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  MCInstFragment( llvm::MCInstFragment& pFragment )
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao      : m_pFragment(&pFragment){
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    setParent( pFragment.getParent() );
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    setAtom( pFragment.getAtom() );
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    setLayoutOrder( pFragment.getLayoutOrder());
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ~MCInstFragment(){}
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // ------ observers ------//
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  llvm::SmallVectorImpl<char> &getCode() { return m_pFragment->getCode(); }
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const llvm::SmallVectorImpl<char> &getCode() const { return m_pFragment->getCode(); }
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  unsigned getInstSize() const { return m_pFragment->getCode().size(); }
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  llvm::MCInst &getInst() { return m_pFragment->getInst(); }
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const llvm::MCInst &getInst() const { return m_pFragment->getInst(); }
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // ----- modifiers ------//
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void setInst(llvm::MCInst pValue) { m_pFragment->setInst(pValue); }
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // relocation access
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  void addRelocation(Relocation &pReloc){  m_Relocations.push_back(&pReloc); }
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  RelocationsType &getRelocations() { return m_Relocations; }
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const RelocationsType &getRelcoations() const { return m_Relocations; }
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  relocation_iterator relocation_begin() { return m_Relocations.begin(); }
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const_relocation_iterator relocation_begin() const { return m_Relocations.begin(); }
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  relocation_iterator relocation_end() {return m_Relocations.end();}
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  const_relocation_iterator relocation_end() const {return m_Relocations.end();}
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  size_t relocations_size() const { return m_Relocations.size(); }
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // fragment identification
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static bool classof(const MCFragment *pF) {
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    return pF->getKind() == llvm::MCFragment::FT_Inst;
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  static bool classof(const MCInstFragment *) { return true; }
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  // overwrite parent method
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  FragmentType getKind() const { return m_pFragment->getKind(); }
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao};
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
96