//===-- llvm/MC/MCAtom.h - MCAtom class ---------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file contains the declaration of the MCAtom class, which is used to // represent a contiguous region in a decoded object that is uniformly data or // instructions; // //===----------------------------------------------------------------------===// #ifndef LLVM_MC_MCATOM_H #define LLVM_MC_MCATOM_H #include "llvm/MC/MCInst.h" #include "llvm/Support/DataTypes.h" #include namespace llvm { class MCModule; /// MCData - An entry in a data MCAtom. // NOTE: This may change to a more complex type in the future. typedef uint8_t MCData; /// MCAtom - Represents a contiguous range of either instructions (a TextAtom) /// or data (a DataAtom). Address ranges are expressed as _closed_ intervals. class MCAtom { friend class MCModule; typedef enum { TextAtom, DataAtom } AtomType; AtomType Type; MCModule *Parent; uint64_t Begin, End; std::vector > Text; std::vector Data; // Private constructor - only callable by MCModule MCAtom(AtomType T, MCModule *P, uint64_t B, uint64_t E) : Type(T), Parent(P), Begin(B), End(E) { } public: bool isTextAtom() { return Type == TextAtom; } bool isDataAtom() { return Type == DataAtom; } void addInst(const MCInst &I, uint64_t Address) { assert(Type == TextAtom && "Trying to add MCInst to a non-text atom!"); Text.push_back(std::make_pair(Address, I)); } void addData(const MCData &D) { assert(Type == DataAtom && "Trying to add MCData to a non-data atom!"); Data.push_back(D); } /// split - Splits the atom in two at a given address, which must align with /// and instruction boundary if this is a TextAtom. Returns the newly created /// atom representing the high part of the split. MCAtom *split(uint64_t SplitPt); /// truncate - Truncates an atom so that TruncPt is the last byte address /// contained in the atom. void truncate(uint64_t TruncPt); }; } #endif