blob: 6dbbc852c67be572e2cd3b67f36fc7a0d3ebd73e [file] [log] [blame]
//===- MCInstFragment.h ---------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCINSTFRAGMENT_H
#define MCINSTFRAGMENT_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif
#include <llvm/MC/MCAssembler.h>
#include <llvm/MC/MCInst.h>
#include <llvm/ADT/SmallString.h>
#include <llvm/ADT/ilist.h>
#include "mcld/LD/Relocation.h"
namespace mcld
{
/** \class MCInstFragment
* \brief MCInstFragment for mcld
*/
class MCInstFragment : public llvm::MCFragment
{
public:
typedef std::vector<Relocation*> RelocationsType;
private:
/// m_pFragment - llvm MCInstFragment for this MCInstFragment
llvm::MCInstFragment* m_pFragment;
/// m_Relocation - The list of relocations in this fragment
RelocationsType m_Relocations;
public:
typedef RelocationsType::const_iterator const_relocation_iterator;
typedef RelocationsType::iterator relocation_iterator;
public:
MCInstFragment( llvm::MCInstFragment& pFragment )
: m_pFragment(&pFragment){
setParent( pFragment.getParent() );
setAtom( pFragment.getAtom() );
setLayoutOrder( pFragment.getLayoutOrder());
}
~MCInstFragment(){}
// ------ observers ------//
llvm::SmallVectorImpl<char> &getCode() { return m_pFragment->getCode(); }
const llvm::SmallVectorImpl<char> &getCode() const { return m_pFragment->getCode(); }
unsigned getInstSize() const { return m_pFragment->getCode().size(); }
llvm::MCInst &getInst() { return m_pFragment->getInst(); }
const llvm::MCInst &getInst() const { return m_pFragment->getInst(); }
// ----- modifiers ------//
void setInst(llvm::MCInst pValue) { m_pFragment->setInst(pValue); }
// relocation access
void addRelocation(Relocation &pReloc){ m_Relocations.push_back(&pReloc); }
RelocationsType &getRelocations() { return m_Relocations; }
const RelocationsType &getRelcoations() const { return m_Relocations; }
relocation_iterator relocation_begin() { return m_Relocations.begin(); }
const_relocation_iterator relocation_begin() const { return m_Relocations.begin(); }
relocation_iterator relocation_end() {return m_Relocations.end();}
const_relocation_iterator relocation_end() const {return m_Relocations.end();}
size_t relocations_size() const { return m_Relocations.size(); }
// fragment identification
static bool classof(const MCFragment *pF) {
return pF->getKind() == llvm::MCFragment::FT_Inst;
}
static bool classof(const MCInstFragment *) { return true; }
// overwrite parent method
FragmentType getKind() const { return m_pFragment->getKind(); }
};
} // namespace of mcld
#endif