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