136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===- X86AsmInstrumentation.h - Instrument X86 inline assembly *- C++ -*-===//
236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//                     The LLVM Compiler Infrastructure
436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source
636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details.
736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_X86_ASMPARSER_X86ASMINSTRUMENTATION_H
1137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_X86_ASMPARSER_X86ASMINSTRUMENTATION_H
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/ADT/SmallVector.h"
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
15c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include <memory>
16c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace llvm {
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MCContext;
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MCInst;
21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCInstrInfo;
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MCParsedAsmOperand;
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MCStreamer;
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MCSubtargetInfo;
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass MCTargetOptions;
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass X86AsmInstrumentation;
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesX86AsmInstrumentation *
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesCreateX86AsmInstrumentation(const MCTargetOptions &MCOptions,
31f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                            const MCContext &Ctx,
32f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                            const MCSubtargetInfo *&STI);
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass X86AsmInstrumentation {
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  virtual ~X86AsmInstrumentation();
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Sets frame register corresponding to a current frame.
3937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void SetInitialFrameRegister(unsigned RegNo) {
4037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    InitialFrameReg = RegNo;
4137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
4337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // Tries to instrument and emit instruction.
4437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual void InstrumentAndEmitInstruction(
45c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      const MCInst &Inst,
4637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      SmallVectorImpl<std::unique_ptr<MCParsedAsmOperand> > &Operands,
47c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines      MCContext &Ctx, const MCInstrInfo &MII, MCStreamer &Out);
4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprotected:
5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  friend X86AsmInstrumentation *
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  CreateX86AsmInstrumentation(const MCTargetOptions &MCOptions,
52f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                              const MCContext &Ctx,
53f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                              const MCSubtargetInfo *&STI);
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
55f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  X86AsmInstrumentation(const MCSubtargetInfo *&STI);
5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned GetFrameRegGeneric(const MCContext &Ctx, MCStreamer &Out);
5837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
5937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void EmitInstruction(MCStreamer &Out, const MCInst &Inst);
6037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
61f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const MCSubtargetInfo *&STI;
6237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
6337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned InitialFrameReg;
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} // End llvm namespace
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#endif
69