[llvm] r233891 - Teach gcroot how to handle dynamically realigned frames

Philip Reames listmail at philipreames.com
Wed Apr 1 22:00:40 PDT 2015


Author: reames
Date: Thu Apr  2 00:00:40 2015
New Revision: 233891

URL: http://llvm.org/viewvc/llvm-project?rev=233891&view=rev
Log:
Teach gcroot how to handle dynamically realigned frames

I'm playing with supporting custom stack map formats with statepoints.  While 
doing so, I noticed that the existing implementation didn't indicate inherently 
unsized frames.  This change essentially just ports the functionality that already 
exists for the default StackMaps section to custom stackmaps.


Added:
    llvm/trunk/test/CodeGen/X86/GC/dynamic-frame-size.ll
Modified:
    llvm/trunk/lib/CodeGen/GCRootLowering.cpp

Modified: llvm/trunk/lib/CodeGen/GCRootLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GCRootLowering.cpp?rev=233891&r1=233890&r2=233891&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/GCRootLowering.cpp (original)
+++ llvm/trunk/lib/CodeGen/GCRootLowering.cpp Thu Apr  2 00:00:40 2015
@@ -332,19 +332,22 @@ bool GCMachineCodeAnalysis::runOnMachine
     return false;
 
   FI = &getAnalysis<GCModuleInfo>().getFunctionInfo(*MF.getFunction());
-  if (!FI->getStrategy().needsSafePoints())
-    return false;
-
   MMI = &getAnalysis<MachineModuleInfo>();
   TII = MF.getSubtarget().getInstrInfo();
 
-  // Find the size of the stack frame.
-  FI->setFrameSize(MF.getFrameInfo()->getStackSize());
+  // Find the size of the stack frame.  There may be no correct static frame
+  // size, we use UINT64_MAX to represent this.
+  const MachineFrameInfo *MFI = MF.getFrameInfo();
+  const TargetRegisterInfo *RegInfo = MF.getSubtarget().getRegisterInfo();
+  const bool DynamicFrameSize = MFI->hasVarSizedObjects() ||
+    RegInfo->needsStackRealignment(MF);
+  FI->setFrameSize(DynamicFrameSize ? UINT64_MAX : MFI->getStackSize());
 
   // Find all safe points.
-  FindSafePoints(MF);
+  if (FI->getStrategy().needsSafePoints())
+    FindSafePoints(MF);
 
-  // Find the stack offsets for all roots.
+  // Find the concrete stack offsets for all roots (stack slots)
   FindStackOffsets(MF);
 
   return false;

Added: llvm/trunk/test/CodeGen/X86/GC/dynamic-frame-size.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GC/dynamic-frame-size.ll?rev=233891&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/GC/dynamic-frame-size.ll (added)
+++ llvm/trunk/test/CodeGen/X86/GC/dynamic-frame-size.ll Thu Apr  2 00:00:40 2015
@@ -0,0 +1,28 @@
+; RUN: llc < %s | FileCheck %s
+target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-linux-gnu"
+
+declare void @use(<4 x i8*>*)
+
+; Test that a frame which requires dynamic relocation produces a stack map
+; with a size of UINT64_MAX.
+define void @test(i8* %ptr) gc "erlang" {
+   ; 32 byte alignment (for the alloca) is larger than the default
+   ; 16 byte alignment
+   %slot = alloca <4 x i8*>
+   call void @use(<4 x i8*>* %slot);
+   ret void
+}
+
+; CHECK: .note.gc
+; CHECK-NEXT: .align 8
+; safe point count
+; CHECK .short	1
+; CHECK .long	.Ltmp0
+; stack frame size (in words)
+; CHECK .short	-1
+; stack arity (arguments on the stack)
+; CHECK .short	0
+; live root count
+; CHECK .short	0
+





More information about the llvm-commits mailing list