From: Evgeniy Stepanov Date: Thu, 24 Apr 2014 13:29:34 +0000 (+0000) Subject: [asan] Use MCInstrInfo in inline asm instrumentation. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=23a4885f59511eb4781e534a3b2a5910733cb357;p=oota-llvm.git [asan] Use MCInstrInfo in inline asm instrumentation. Patch by Yuri Gorshenin. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207115 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/AsmParser/X86AsmInstrumentation.cpp b/lib/Target/X86/AsmParser/X86AsmInstrumentation.cpp index 4829165892e..030778af7e1 100644 --- a/lib/Target/X86/AsmParser/X86AsmInstrumentation.cpp +++ b/lib/Target/X86/AsmParser/X86AsmInstrumentation.cpp @@ -15,6 +15,7 @@ #include "llvm/MC/MCContext.h" #include "llvm/MC/MCInst.h" #include "llvm/MC/MCInstBuilder.h" +#include "llvm/MC/MCInstrInfo.h" #include "llvm/MC/MCParser/MCParsedAsmOperand.h" #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSubtargetInfo.h" @@ -40,8 +41,8 @@ public: // X86AsmInstrumentation implementation: virtual void InstrumentInstruction( const MCInst &Inst, SmallVectorImpl &Operands, - MCContext &Ctx, MCStreamer &Out) override { - InstrumentMOV(Inst, Operands, Ctx, Out); + MCContext &Ctx, const MCInstrInfo &MII, MCStreamer &Out) override { + InstrumentMOV(Inst, Operands, Ctx, MII, Out); } // Should be implemented differently in x86_32 and x86_64 subclasses. @@ -53,7 +54,7 @@ public: bool IsWrite, MCContext &Ctx, MCStreamer &Out); void InstrumentMOV(const MCInst &Inst, SmallVectorImpl &Operands, - MCContext &Ctx, MCStreamer &Out); + MCContext &Ctx, const MCInstrInfo &MII, MCStreamer &Out); void EmitInstruction(MCStreamer &Out, const MCInst &Inst) { Out.EmitInstruction(Inst, STI); } @@ -79,50 +80,33 @@ void X86AddressSanitizer::InstrumentMemOperand( void X86AddressSanitizer::InstrumentMOV( const MCInst &Inst, SmallVectorImpl &Operands, - MCContext &Ctx, MCStreamer &Out) { + MCContext &Ctx, const MCInstrInfo &MII, MCStreamer &Out) { // Access size in bytes. unsigned AccessSize = 0; - // FIXME: use MCInstrDesc to get proper value of IsWrite. - bool IsWrite = false; switch (Inst.getOpcode()) { case X86::MOV8mi: case X86::MOV8mr: - AccessSize = 1; - IsWrite = true; - break; case X86::MOV8rm: AccessSize = 1; break; case X86::MOV16mi: case X86::MOV16mr: - AccessSize = 2; - IsWrite = true; - break; case X86::MOV16rm: AccessSize = 2; break; case X86::MOV32mi: case X86::MOV32mr: - AccessSize = 4; - IsWrite = true; - break; case X86::MOV32rm: AccessSize = 4; break; case X86::MOV64mi32: case X86::MOV64mr: - AccessSize = 8; - IsWrite = true; - break; case X86::MOV64rm: AccessSize = 8; break; case X86::MOVAPDmr: case X86::MOVAPSmr: - AccessSize = 16; - IsWrite = true; - break; case X86::MOVAPDrm: case X86::MOVAPSrm: AccessSize = 16; @@ -131,6 +115,7 @@ void X86AddressSanitizer::InstrumentMOV( return; } + const bool IsWrite = MII.get(Inst.getOpcode()).mayStore(); for (unsigned Ix = 0; Ix < Operands.size(); ++Ix) { MCParsedAsmOperand *Op = Operands[Ix]; if (Op && Op->isMem()) @@ -219,7 +204,7 @@ X86AsmInstrumentation::~X86AsmInstrumentation() {} void X86AsmInstrumentation::InstrumentInstruction( const MCInst &Inst, SmallVectorImpl &Operands, - MCContext &Ctx, MCStreamer &Out) {} + MCContext &Ctx, const MCInstrInfo &MII, MCStreamer &Out) {} X86AsmInstrumentation * CreateX86AsmInstrumentation(const MCTargetOptions &MCOptions, const MCContext &Ctx, diff --git a/lib/Target/X86/AsmParser/X86AsmInstrumentation.h b/lib/Target/X86/AsmParser/X86AsmInstrumentation.h index 3ff2d39bc23..0369b14d98d 100644 --- a/lib/Target/X86/AsmParser/X86AsmInstrumentation.h +++ b/lib/Target/X86/AsmParser/X86AsmInstrumentation.h @@ -16,6 +16,7 @@ namespace llvm { class MCContext; class MCInst; +class MCInstrInfo; class MCParsedAsmOperand; class MCStreamer; class MCSubtargetInfo; @@ -35,7 +36,9 @@ public: // instruction is sent to Out. virtual void InstrumentInstruction( const MCInst &Inst, SmallVectorImpl &Operands, - MCContext &Ctx, MCStreamer &Out); + MCContext &Ctx, + const MCInstrInfo &MII, + MCStreamer &Out); protected: friend X86AsmInstrumentation * diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index c5fdc2a2b41..b84bcf9dd7e 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -20,6 +20,7 @@ #include "llvm/MC/MCContext.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCInst.h" +#include "llvm/MC/MCInstrInfo.h" #include "llvm/MC/MCParser/MCAsmLexer.h" #include "llvm/MC/MCParser/MCAsmParser.h" #include "llvm/MC/MCParser/MCParsedAsmOperand.h" @@ -55,6 +56,7 @@ static const char OpPrecedence[] = { class X86AsmParser : public MCTargetAsmParser { MCSubtargetInfo &STI; MCAsmParser &Parser; + const MCInstrInfo &MII; ParseInstructionInfo *InstInfo; std::unique_ptr Instrumentation; private: @@ -710,9 +712,9 @@ private: public: X86AsmParser(MCSubtargetInfo &sti, MCAsmParser &parser, - const MCInstrInfo &MII, + const MCInstrInfo &mii, const MCTargetOptions &Options) - : MCTargetAsmParser(), STI(sti), Parser(parser), InstInfo(0) { + : MCTargetAsmParser(), STI(sti), Parser(parser), MII(mii), InstInfo(0) { // Initialize the set of available features. setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits())); @@ -2258,7 +2260,8 @@ static const char *getSubtargetFeatureName(unsigned Val); void X86AsmParser::EmitInstruction( MCInst &Inst, SmallVectorImpl &Operands, MCStreamer &Out) { - Instrumentation->InstrumentInstruction(Inst, Operands, getContext(), Out); + Instrumentation->InstrumentInstruction(Inst, Operands, getContext(), MII, + Out); Out.EmitInstruction(Inst, STI); }