]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/include/llvm/MC/MCAtom.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / include / llvm / MC / MCAtom.h
1 //===-- llvm/MC/MCAtom.h - MCAtom class ---------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains the declaration of the MCAtom class, which is used to
11 // represent a contiguous region in a decoded object that is uniformly data or
12 // instructions;
13 //
14 //===----------------------------------------------------------------------===//
15
16 #ifndef LLVM_MC_MCATOM_H
17 #define LLVM_MC_MCATOM_H
18
19 #include "llvm/MC/MCInst.h"
20 #include "llvm/Support/DataTypes.h"
21 #include <vector>
22
23 namespace llvm {
24
25 class MCModule;
26
27 /// MCData - An entry in a data MCAtom.
28 // NOTE: This may change to a more complex type in the future.
29 typedef uint8_t MCData;
30
31 /// MCAtom - Represents a contiguous range of either instructions (a TextAtom)
32 /// or data (a DataAtom).  Address ranges are expressed as _closed_ intervals.
33 class MCAtom {
34   friend class MCModule;
35   typedef enum { TextAtom, DataAtom } AtomType;
36
37   AtomType Type;
38   MCModule *Parent;
39   uint64_t Begin, End;
40
41   std::vector<std::pair<uint64_t, MCInst> > Text;
42   std::vector<MCData> Data;
43
44   // Private constructor - only callable by MCModule
45   MCAtom(AtomType T, MCModule *P, uint64_t B, uint64_t E)
46     : Type(T), Parent(P), Begin(B), End(E) { }
47
48 public:
49   bool isTextAtom() const { return Type == TextAtom; }
50   bool isDataAtom() const { return Type == DataAtom; }
51
52   void addInst(const MCInst &I, uint64_t Address, unsigned Size);
53   void addData(const MCData &D);
54
55   /// split - Splits the atom in two at a given address, which must align with
56   /// and instruction boundary if this is a TextAtom.  Returns the newly created
57   /// atom representing the high part of the split.
58   MCAtom *split(uint64_t SplitPt);
59
60   /// truncate - Truncates an atom so that TruncPt is the last byte address
61   /// contained in the atom.
62   void truncate(uint64_t TruncPt);
63 };
64
65 }
66
67 #endif
68