//===- X86AsmInstrumentation.h - Instrument X86 inline assembly -*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TARGET_X86_ASMPARSER_X86ASMINSTRUMENTATION_H
#define LLVM_LIB_TARGET_X86_ASMPARSER_X86ASMINSTRUMENTATION_H

#include "llvm/ADT/SmallVector.h"
#include <memory>

namespace llvm {

class MCContext;
class MCInst;
class MCInstrInfo;
class MCParsedAsmOperand;
class MCStreamer;
class MCSubtargetInfo;
class MCTargetOptions;
class X86AsmInstrumentation;

X86AsmInstrumentation *
CreateX86AsmInstrumentation(const MCTargetOptions &MCOptions,
                            const MCContext &Ctx,
                            const MCSubtargetInfo *&STI);

class X86AsmInstrumentation {
public:
  virtual ~X86AsmInstrumentation();

  // Sets frame register corresponding to a current frame.
  void SetInitialFrameRegister(unsigned RegNo) {
    InitialFrameReg = RegNo;
  }

  // Tries to instrument and emit instruction.
  virtual void InstrumentAndEmitInstruction(
      const MCInst &Inst,
      SmallVectorImpl<std::unique_ptr<MCParsedAsmOperand>> &Operands,
      MCContext &Ctx, const MCInstrInfo &MII, MCStreamer &Out);

protected:
  friend X86AsmInstrumentation *
  CreateX86AsmInstrumentation(const MCTargetOptions &MCOptions,
                              const MCContext &Ctx,
                              const MCSubtargetInfo *&STI);

  X86AsmInstrumentation(const MCSubtargetInfo *&STI);

  unsigned GetFrameRegGeneric(const MCContext &Ctx, MCStreamer &Out);

  void EmitInstruction(MCStreamer &Out, const MCInst &Inst);

  const MCSubtargetInfo *&STI;

  unsigned InitialFrameReg = 0;
};

} // end namespace llvm

#endif // LLVM_LIB_TARGET_X86_ASMPARSER_X86ASMINSTRUMENTATION_H
