- virtual void StoreFlags(MCStreamer &Out) override {
- EmitInstruction(Out, MCInstBuilder(X86::PUSHF64));
- }
-
- virtual void RestoreFlags(MCStreamer &Out) override {
- EmitInstruction(Out, MCInstBuilder(X86::POPF64));
- }
-
- virtual void InstrumentMemOperandPrologue(const RegisterContext &RegCtx,
- MCContext &Ctx,
- MCStreamer &Out) override {
- EmitAdjustRSP(Ctx, Out, -128);
- EmitInstruction(
- Out, MCInstBuilder(X86::PUSH64r).addReg(RegCtx.shadowReg(MVT::i64)));
- EmitInstruction(
- Out, MCInstBuilder(X86::PUSH64r).addReg(RegCtx.addressReg(MVT::i64)));
- if (RegCtx.ScratchReg != X86::NoRegister) {
- EmitInstruction(
- Out, MCInstBuilder(X86::PUSH64r).addReg(RegCtx.scratchReg(MVT::i64)));
- }
- StoreFlags(Out);
- }
-
- virtual void InstrumentMemOperandEpilogue(const RegisterContext &RegCtx,
- MCContext &Ctx,
- MCStreamer &Out) override {
- RestoreFlags(Out);
- if (RegCtx.ScratchReg != X86::NoRegister) {
- EmitInstruction(
- Out, MCInstBuilder(X86::POP64r).addReg(RegCtx.scratchReg(MVT::i64)));
- }
- EmitInstruction(
- Out, MCInstBuilder(X86::POP64r).addReg(RegCtx.addressReg(MVT::i64)));
- EmitInstruction(
- Out, MCInstBuilder(X86::POP64r).addReg(RegCtx.shadowReg(MVT::i64)));
- EmitAdjustRSP(Ctx, Out, 128);
- }
-
- virtual void InstrumentMemOperandSmall(X86Operand &Op, unsigned AccessSize,
- bool IsWrite,
- const RegisterContext &RegCtx,
- MCContext &Ctx,
- MCStreamer &Out) override;
- virtual void InstrumentMemOperandLarge(X86Operand &Op, unsigned AccessSize,
- bool IsWrite,
- const RegisterContext &RegCtx,
- MCContext &Ctx,
- MCStreamer &Out) override;
+ virtual void InstrumentMemOperandSmallImpl(X86Operand &Op,
+ unsigned AccessSize, bool IsWrite,
+ MCContext &Ctx,
+ MCStreamer &Out) override;
+ virtual void InstrumentMemOperandLargeImpl(X86Operand &Op,
+ unsigned AccessSize, bool IsWrite,
+ MCContext &Ctx,
+ MCStreamer &Out) override;