From 5432649be73fba30d3014a158509c25b868d6452 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Fri, 25 Jul 2014 02:29:19 +0000 Subject: [PATCH] [X86] Clarify some stackmap shadow optimization code as based on review feedback from Eric Christopher. No functional change. llvm-svn: 213917 --- llvm/lib/Target/X86/X86AsmPrinter.h | 15 +++++++++++++-- llvm/lib/Target/X86/X86MCInstLower.cpp | 11 ++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Target/X86/X86AsmPrinter.h b/llvm/lib/Target/X86/X86AsmPrinter.h index 4b9913c..fdec333 100644 --- a/llvm/lib/Target/X86/X86AsmPrinter.h +++ b/llvm/lib/Target/X86/X86AsmPrinter.h @@ -44,16 +44,27 @@ class LLVM_LIBRARY_VISIBILITY X86AsmPrinter : public AsmPrinter { ~StackMapShadowTracker(); void startFunction(MachineFunction &MF); void count(MCInst &Inst, const MCSubtargetInfo &STI); + + // Called to signal the start of a shadow of RequiredSize bytes. void reset(unsigned RequiredSize) { RequiredShadowSize = RequiredSize; CurrentShadowSize = 0; - Count = true; + InShadow = true; } + + // Called before every stackmap/patchpoint, and at the end of basic blocks, + // to emit any necessary padding-NOPs. void emitShadowPadding(MCStreamer &OutStreamer, const MCSubtargetInfo &STI); private: TargetMachine &TM; std::unique_ptr CodeEmitter; - bool Count; + bool InShadow; + + // RequiredShadowSize holds the length of the shadow specified in the most + // recently encountered STACKMAP instruction. + // CurrentShadowSize counts the number of bytes encoded since the most + // recently encountered STACKMAP, stopping when that number is greater than + // or equal to RequiredShadowSize. unsigned RequiredShadowSize, CurrentShadowSize; }; diff --git a/llvm/lib/Target/X86/X86MCInstLower.cpp b/llvm/lib/Target/X86/X86MCInstLower.cpp index 4b55f00..96ab70a 100644 --- a/llvm/lib/Target/X86/X86MCInstLower.cpp +++ b/llvm/lib/Target/X86/X86MCInstLower.cpp @@ -66,7 +66,7 @@ static void EmitNops(MCStreamer &OS, unsigned NumBytes, bool Is64Bit, namespace llvm { X86AsmPrinter::StackMapShadowTracker::StackMapShadowTracker(TargetMachine &TM) - : TM(TM), Count(false), RequiredShadowSize(0), CurrentShadowSize(0) {} + : TM(TM), InShadow(false), RequiredShadowSize(0), CurrentShadowSize(0) {} X86AsmPrinter::StackMapShadowTracker::~StackMapShadowTracker() {} @@ -80,7 +80,7 @@ namespace llvm { void X86AsmPrinter::StackMapShadowTracker::count(MCInst &Inst, const MCSubtargetInfo &STI) { - if (Count) { + if (InShadow) { SmallString<256> Code; SmallVector Fixups; raw_svector_ostream VecOS(Code); @@ -88,16 +88,17 @@ namespace llvm { VecOS.flush(); CurrentShadowSize += Code.size(); if (CurrentShadowSize >= RequiredShadowSize) - Count = false; // The shadow is big enough. Stop counting. + InShadow = false; // The shadow is big enough. Stop counting. } } void X86AsmPrinter::StackMapShadowTracker::emitShadowPadding( MCStreamer &OutStreamer, const MCSubtargetInfo &STI) { - if (Count && CurrentShadowSize < RequiredShadowSize) + if (InShadow && CurrentShadowSize < RequiredShadowSize) { + InShadow = false; EmitNops(OutStreamer, RequiredShadowSize - CurrentShadowSize, TM.getSubtarget().is64Bit(), STI); - Count = false; + } } void X86AsmPrinter::EmitAndCountInstruction(MCInst &Inst) { -- 2.7.4