//===- X86AsmInstrumentation.h - Instrument X86 inline assembly -*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#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
