1274955Ssvnmir//===- X86AsmInstrumentation.h - Instrument X86 inline assembly *- C++ -*-===//
2274955Ssvnmir//
3274955Ssvnmir//                     The LLVM Compiler Infrastructure
4274955Ssvnmir//
5274955Ssvnmir// This file is distributed under the University of Illinois Open Source
6274955Ssvnmir// License. See LICENSE.TXT for details.
7274955Ssvnmir//
8274955Ssvnmir//===----------------------------------------------------------------------===//
9274955Ssvnmir
10280031Sdim#ifndef LLVM_LIB_TARGET_X86_ASMPARSER_X86ASMINSTRUMENTATION_H
11280031Sdim#define LLVM_LIB_TARGET_X86_ASMPARSER_X86ASMINSTRUMENTATION_H
12274955Ssvnmir
13274955Ssvnmir#include "llvm/ADT/SmallVector.h"
14274955Ssvnmir
15274955Ssvnmir#include <memory>
16274955Ssvnmir
17274955Ssvnmirnamespace llvm {
18274955Ssvnmir
19274955Ssvnmirclass MCContext;
20274955Ssvnmirclass MCInst;
21274955Ssvnmirclass MCInstrInfo;
22274955Ssvnmirclass MCParsedAsmOperand;
23274955Ssvnmirclass MCStreamer;
24274955Ssvnmirclass MCSubtargetInfo;
25274955Ssvnmirclass MCTargetOptions;
26274955Ssvnmir
27274955Ssvnmirclass X86AsmInstrumentation;
28274955Ssvnmir
29274955SsvnmirX86AsmInstrumentation *
30274955SsvnmirCreateX86AsmInstrumentation(const MCTargetOptions &MCOptions,
31296417Sdim                            const MCContext &Ctx,
32296417Sdim                            const MCSubtargetInfo *&STI);
33274955Ssvnmir
34274955Ssvnmirclass X86AsmInstrumentation {
35274955Ssvnmirpublic:
36274955Ssvnmir  virtual ~X86AsmInstrumentation();
37274955Ssvnmir
38280031Sdim  // Sets frame register corresponding to a current frame.
39280031Sdim  void SetInitialFrameRegister(unsigned RegNo) {
40280031Sdim    InitialFrameReg = RegNo;
41280031Sdim  }
42280031Sdim
43280031Sdim  // Tries to instrument and emit instruction.
44280031Sdim  virtual void InstrumentAndEmitInstruction(
45274955Ssvnmir      const MCInst &Inst,
46280031Sdim      SmallVectorImpl<std::unique_ptr<MCParsedAsmOperand> > &Operands,
47274955Ssvnmir      MCContext &Ctx, const MCInstrInfo &MII, MCStreamer &Out);
48274955Ssvnmir
49274955Ssvnmirprotected:
50274955Ssvnmir  friend X86AsmInstrumentation *
51274955Ssvnmir  CreateX86AsmInstrumentation(const MCTargetOptions &MCOptions,
52296417Sdim                              const MCContext &Ctx,
53296417Sdim                              const MCSubtargetInfo *&STI);
54274955Ssvnmir
55296417Sdim  X86AsmInstrumentation(const MCSubtargetInfo *&STI);
56280031Sdim
57280031Sdim  unsigned GetFrameRegGeneric(const MCContext &Ctx, MCStreamer &Out);
58280031Sdim
59280031Sdim  void EmitInstruction(MCStreamer &Out, const MCInst &Inst);
60280031Sdim
61296417Sdim  const MCSubtargetInfo *&STI;
62280031Sdim
63280031Sdim  unsigned InitialFrameReg;
64274955Ssvnmir};
65274955Ssvnmir
66274955Ssvnmir} // End llvm namespace
67274955Ssvnmir
68280031Sdim#endif
69