X86AddressSanitizer32(const MCSubtargetInfo &STI)
: X86AddressSanitizer(STI) {}
+
virtual ~X86AddressSanitizer32() {}
virtual void StoreFlags(MCStreamer &Out) override {
virtual void InstrumentMemOperandPrologue(const RegisterContext &RegCtx,
MCContext &Ctx,
MCStreamer &Out) override {
+ const MCRegisterInfo* MRI = Ctx.getRegisterInfo();
+ if (MRI && FrameReg != X86::NoRegister) {
+ EmitInstruction(
+ Out, MCInstBuilder(X86::PUSH32r).addReg(X86::EBP));
+ if (FrameReg == X86::ESP) {
+ Out.EmitCFIAdjustCfaOffset(4 /* byte size of the FrameReg */);
+ Out.EmitCFIRelOffset(
+ MRI->getDwarfRegNum(X86::EBP, true /* IsEH */), 0);
+ }
+ EmitInstruction(
+ Out, MCInstBuilder(X86::MOV32rr).addReg(X86::EBP).addReg(FrameReg));
+ Out.EmitCFIRememberState();
+ Out.EmitCFIDefCfaRegister(
+ MRI->getDwarfRegNum(X86::EBP, true /* IsEH */));
+ }
+
EmitInstruction(
Out, MCInstBuilder(X86::PUSH32r).addReg(RegCtx.addressReg(MVT::i32)));
EmitInstruction(
Out, MCInstBuilder(X86::POP32r).addReg(RegCtx.shadowReg(MVT::i32)));
EmitInstruction(
Out, MCInstBuilder(X86::POP32r).addReg(RegCtx.addressReg(MVT::i32)));
+
+ if (Ctx.getRegisterInfo() && FrameReg != X86::NoRegister) {
+ EmitInstruction(
+ Out, MCInstBuilder(X86::POP32r).addReg(X86::EBP));
+ Out.EmitCFIRestoreState();
+ if (FrameReg == X86::ESP)
+ Out.EmitCFIAdjustCfaOffset(-4 /* byte size of the FrameReg */);
+ }
}
virtual void InstrumentMemOperandSmall(X86Operand &Op, unsigned AccessSize,
X86AddressSanitizer64(const MCSubtargetInfo &STI)
: X86AddressSanitizer(STI) {}
+
virtual ~X86AddressSanitizer64() {}
virtual void StoreFlags(MCStreamer &Out) override {
virtual void InstrumentMemOperandPrologue(const RegisterContext &RegCtx,
MCContext &Ctx,
MCStreamer &Out) override {
+ const MCRegisterInfo *RegisterInfo = Ctx.getRegisterInfo();
+ if (RegisterInfo && FrameReg != X86::NoRegister) {
+ EmitInstruction(Out, MCInstBuilder(X86::PUSH64r).addReg(X86::RBP));
+ if (FrameReg == X86::RSP) {
+ Out.EmitCFIAdjustCfaOffset(8 /* byte size of the FrameReg */);
+ Out.EmitCFIRelOffset(
+ RegisterInfo->getDwarfRegNum(X86::RBP, true /* IsEH */), 0);
+ }
+ EmitInstruction(
+ Out, MCInstBuilder(X86::MOV64rr).addReg(X86::RBP).addReg(FrameReg));
+ Out.EmitCFIRememberState();
+ Out.EmitCFIDefCfaRegister(
+ RegisterInfo->getDwarfRegNum(X86::RBP, true /* IsEH */));
+ }
+
EmitAdjustRSP(Ctx, Out, -128);
EmitInstruction(
Out, MCInstBuilder(X86::PUSH64r).addReg(RegCtx.shadowReg(MVT::i64)));
EmitInstruction(
Out, MCInstBuilder(X86::POP64r).addReg(RegCtx.shadowReg(MVT::i64)));
EmitAdjustRSP(Ctx, Out, 128);
+
+ if (Ctx.getRegisterInfo() && FrameReg != X86::NoRegister) {
+ EmitInstruction(
+ Out, MCInstBuilder(X86::POP64r).addReg(X86::RBP));
+ Out.EmitCFIRestoreState();
+ if (FrameReg == X86::RSP)
+ Out.EmitCFIAdjustCfaOffset(-8 /* byte size of the FrameReg */);
+ }
}
virtual void InstrumentMemOperandSmall(X86Operand &Op, unsigned AccessSize,
} // End anonymous namespace
X86AsmInstrumentation::X86AsmInstrumentation(const MCSubtargetInfo &STI)
- : STI(STI) {}
+ : STI(STI), FrameReg(X86::NoRegister) {}
X86AsmInstrumentation::~X86AsmInstrumentation() {}