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