MCCodeEmitter.h revision 8d31de62680f28ac13594a14dde46216c82a3708
1//===-- llvm/MC/MCCodeEmitter.h - Instruction Encoding ----------*- 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#ifndef LLVM_MC_MCCODEEMITTER_H
11#define LLVM_MC_MCCODEEMITTER_H
12
13#include "llvm/MC/MCFixup.h"
14
15#include <cassert>
16
17namespace llvm {
18class MCExpr;
19class MCInst;
20class raw_ostream;
21template<typename T> class SmallVectorImpl;
22
23/// MCFixupKindInfo - Target independent information on a fixup kind.
24struct MCFixupKindInfo {
25  /// A target specific name for the fixup kind. The names will be unique for
26  /// distinct kinds on any given target.
27  const char *Name;
28
29  /// The bit offset to write the relocation into.
30  //
31  // FIXME: These two fields are under-specified and not general enough, but it
32  // is covers many things, and is enough to let the AsmStreamer pretty-print
33  // the encoding.
34  unsigned TargetOffset;
35
36  /// The number of bits written by this fixup. The bits are assumed to be
37  /// contiguous.
38  unsigned TargetSize;
39};
40
41/// MCCodeEmitter - Generic instruction encoding interface.
42class MCCodeEmitter {
43private:
44  MCCodeEmitter(const MCCodeEmitter &);   // DO NOT IMPLEMENT
45  void operator=(const MCCodeEmitter &);  // DO NOT IMPLEMENT
46protected: // Can only create subclasses.
47  MCCodeEmitter();
48
49public:
50  virtual ~MCCodeEmitter();
51
52  /// @name Target Independent Fixup Information
53  /// @{
54
55  /// getNumFixupKinds - Get the number of target specific fixup kinds.
56  virtual unsigned getNumFixupKinds() const = 0;
57
58  /// getFixupKindInfo - Get information on a fixup kind.
59  virtual const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const;
60
61  /// @}
62
63  /// EncodeInstruction - Encode the given \arg Inst to bytes on the output
64  /// stream \arg OS.
65  virtual void EncodeInstruction(const MCInst &Inst, raw_ostream &OS,
66                                 SmallVectorImpl<MCFixup> &Fixups) const = 0;
67};
68
69} // End llvm namespace
70
71#endif
72