[Stackmaps] Record the stack size of each function that contains a stackmap/patchpoin...
authorJuergen Ributzka <juergen@apple.com>
Thu, 30 Jan 2014 03:06:14 +0000 (03:06 +0000)
committerJuergen Ributzka <juergen@apple.com>
Thu, 30 Jan 2014 03:06:14 +0000 (03:06 +0000)
Reviewed by Andy

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200444 91177308-0d34-0410-b5e6-96231b3b80d8

docs/StackMaps.rst
include/llvm/CodeGen/StackMaps.h
lib/CodeGen/StackMaps.cpp
test/CodeGen/X86/anyregcc.ll
test/CodeGen/X86/stackmap-liveness.ll
test/CodeGen/X86/stackmap.ll

index 0dac62b595d02c488d0f55baa5492dbf6e9eda23..57c37ea2f5ca2798dfb62fe70c8fd0549023cdfd 100644 (file)
@@ -314,6 +314,11 @@ format of this section follows:
 .. code-block:: none
 
   uint32 : Reserved (header)
+  uint32 : NumFunctions
+  StkSizeRecord[NumFunctions] {
+    uint32 : Function Offset
+    uint32 : Stack Size
+  }
   uint32 : NumConstants
   Constants[NumConstants] {
     uint64 : LargeConstant
index 508606ac9babece27b48a11647747960bbb9d029..bd4c3db3d3f15a88a4e88427688a36ee4d000227 100644 (file)
@@ -11,6 +11,7 @@
 #ifndef LLVM_STACKMAPS
 #define LLVM_STACKMAPS
 
+#include "llvm/ADT/MapVector.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/CodeGen/MachineInstr.h"
 #include <map>
@@ -132,6 +133,7 @@ public:
 private:
   typedef SmallVector<Location, 8> LocationVec;
   typedef SmallVector<LiveOutReg, 8> LiveOutVec;
+  typedef MapVector<const MCSymbol *, uint32_t> FnStackSizeMap;
 
   struct CallsiteInfo {
     const MCExpr *CSOffsetExpr;
@@ -170,6 +172,7 @@ private:
   AsmPrinter &AP;
   CallsiteInfoList CSInfos;
   ConstantPool ConstPool;
+  FnStackSizeMap FnStackSize;
 
   MachineInstr::const_mop_iterator
   parseOperand(MachineInstr::const_mop_iterator MOI,
index 79c1e7dce55080fa29417db5f599a4d8c375f81d..8adaf0bcc160035ec95636a30885458a273a4861 100644 (file)
@@ -11,6 +11,8 @@
 
 #include "llvm/CodeGen/StackMaps.h"
 #include "llvm/CodeGen/AsmPrinter.h"
+#include "llvm/CodeGen/MachineFunction.h"
+#include "llvm/CodeGen/MachineFrameInfo.h"
 #include "llvm/CodeGen/MachineInstr.h"
 #include "llvm/IR/DataLayout.h"
 #include "llvm/MC/MCContext.h"
@@ -216,12 +218,19 @@ void StackMaps::recordStackMapOpers(const MachineInstr &MI, uint64_t ID,
     }
   }
 
+  // Create an expression to calculate the offset of the callsite from function
+  // entry.
   const MCExpr *CSOffsetExpr = MCBinaryExpr::CreateSub(
     MCSymbolRefExpr::Create(MILabel, OutContext),
     MCSymbolRefExpr::Create(AP.CurrentFnSym, OutContext),
     OutContext);
 
   CSInfos.push_back(CallsiteInfo(CSOffsetExpr, ID, Locations, LiveOuts));
+
+  // Record the stack size of the current function.
+  const MachineFrameInfo *MFI = AP.MF->getFrameInfo();
+  FnStackSize[AP.CurrentFnSym] =
+    MFI->hasVarSizedObjects() ? ~0U : MFI->getStackSize();
 }
 
 void StackMaps::recordStackMap(const MachineInstr &MI) {
@@ -258,6 +267,11 @@ void StackMaps::recordPatchPoint(const MachineInstr &MI) {
 /// serializeToStackMapSection conceptually populates the following fields:
 ///
 /// uint32 : Reserved (header)
+/// uint32 : NumFunctions
+/// StkSizeRecord[NumFunctions] {
+///   uint32 : Function Offset
+///   uint32 : Stack Size
+/// }
 /// uint32 : NumConstants
 /// int64  : Constants[NumConstants]
 /// uint32 : NumRecords
@@ -313,6 +327,16 @@ void StackMaps::serializeToStackMapSection() {
   // Header.
   AP.OutStreamer.EmitIntValue(0, 4);
 
+  // Num functions.
+  AP.OutStreamer.EmitIntValue(FnStackSize.size(), 4);
+
+  // Stack size entries.
+  for (FnStackSizeMap::iterator I = FnStackSize.begin(), E = FnStackSize.end();
+       I != E; ++I) {
+    AP.EmitLabelReference(I->first, 4, true);
+    AP.OutStreamer.EmitIntValue(I->second, 4);
+  }
+
   // Num constants.
   AP.OutStreamer.EmitIntValue(ConstPool.getNumConstants(), 4);
 
index d0b6665b15629a3d169e9301988e5d9c76831ea5..23f5d4378e6356f363a24775ef1166b8a6162970 100644 (file)
@@ -1,13 +1,31 @@
-; RUN: llc < %s -mtriple=x86_64-apple-darwin -disable-fp-elim | FileCheck %s
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=corei7     | FileCheck --check-prefix=SSE %s
-; RUN: llc < %s -march=x86-64 -mcpu=corei7-avx | FileCheck --check-prefix=AVX %s
+; RUN: llc < %s -mtriple=x86_64-apple-darwin                  -disable-fp-elim | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7     -disable-fp-elim | FileCheck --check-prefix=SSE %s
+; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -disable-fp-elim | FileCheck --check-prefix=AVX %s
 
 
 ; Stackmap Header: no constants - 6 callsites
-; CHECK-LABEL: .section        __LLVM_STACKMAPS,__llvm_stackmaps
-; CHECK-NEXT:  __LLVM_StackMaps:
+; CHECK-LABEL:  .section __LLVM_STACKMAPS,__llvm_stackmaps
+; CHECK-NEXT:   __LLVM_StackMaps:
 ; Header
-; CHECK-NEXT:   .long   0
+; CHECK-NEXT:   .long 0
+; Num Functions
+; CHECK-NEXT:   .long 8
+; CHECK-NEXT:   .long _test
+; CHECK-NEXT:   .long 8
+; CHECK-NEXT:   .long _property_access1
+; CHECK-NEXT:   .long 8
+; CHECK-NEXT:   .long _property_access2
+; CHECK-NEXT:   .long 24
+; CHECK-NEXT:   .long _property_access3
+; CHECK-NEXT:   .long 24
+; CHECK-NEXT:   .long _anyreg_test1
+; CHECK-NEXT:   .long 56
+; CHECK-NEXT:   .long _anyreg_test2
+; CHECK-NEXT:   .long 56
+; CHECK-NEXT:   .long _patchpoint_spilldef
+; CHECK-NEXT:   .long 56
+; CHECK-NEXT:   .long _patchpoint_spillargs
+; CHECK-NEXT:   .long 88
 ; Num Constants
 ; CHECK-NEXT:   .long   0
 ; Num Callsites
@@ -343,8 +361,8 @@ entry:
 define anyregcc void @anyregcc1() {
 entry:
 ;SSE-LABEL: anyregcc1
-;SSE:      pushq %rax
 ;SSE:      pushq %rbp
+;SSE:      pushq %rax
 ;SSE:      pushq %r15
 ;SSE:      pushq %r14
 ;SSE:      pushq %r13
@@ -375,8 +393,8 @@ entry:
 ;SSE-NEXT: movaps %xmm1
 ;SSE-NEXT: movaps %xmm0
 ;AVX-LABEL:anyregcc1
-;AVX:      pushq %rax
 ;AVX:      pushq %rbp
+;AVX:      pushq %rax
 ;AVX:      pushq %r15
 ;AVX:      pushq %r14
 ;AVX:      pushq %r13
@@ -390,22 +408,22 @@ entry:
 ;AVX:      pushq %rdx
 ;AVX:      pushq %rcx
 ;AVX:      pushq %rbx
-;AVX:      vmovups %ymm15
-;AVX-NEXT: vmovups %ymm14
-;AVX-NEXT: vmovups %ymm13
-;AVX-NEXT: vmovups %ymm12
-;AVX-NEXT: vmovups %ymm11
-;AVX-NEXT: vmovups %ymm10
-;AVX-NEXT: vmovups %ymm9
-;AVX-NEXT: vmovups %ymm8
-;AVX-NEXT: vmovups %ymm7
-;AVX-NEXT: vmovups %ymm6
-;AVX-NEXT: vmovups %ymm5
-;AVX-NEXT: vmovups %ymm4
-;AVX-NEXT: vmovups %ymm3
-;AVX-NEXT: vmovups %ymm2
-;AVX-NEXT: vmovups %ymm1
-;AVX-NEXT: vmovups %ymm0
+;AVX:      vmovaps %ymm15
+;AVX-NEXT: vmovaps %ymm14
+;AVX-NEXT: vmovaps %ymm13
+;AVX-NEXT: vmovaps %ymm12
+;AVX-NEXT: vmovaps %ymm11
+;AVX-NEXT: vmovaps %ymm10
+;AVX-NEXT: vmovaps %ymm9
+;AVX-NEXT: vmovaps %ymm8
+;AVX-NEXT: vmovaps %ymm7
+;AVX-NEXT: vmovaps %ymm6
+;AVX-NEXT: vmovaps %ymm5
+;AVX-NEXT: vmovaps %ymm4
+;AVX-NEXT: vmovaps %ymm3
+;AVX-NEXT: vmovaps %ymm2
+;AVX-NEXT: vmovaps %ymm1
+;AVX-NEXT: vmovaps %ymm0
   call void asm sideeffect "", "~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15},~{rbp},~{xmm0},~{xmm1},~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15}"()
   ret void
 }
index b1a931dd7c43582f9db725d686f7d2a0407252cb..570e373229e358272e3a04df1d7d896c48fbd55f 100644 (file)
@@ -6,7 +6,13 @@
 
 ; CHECK-LABEL:  .section  __LLVM_STACKMAPS,__llvm_stackmaps
 ; CHECK-NEXT:   __LLVM_StackMaps:
-; CHECK-NEXT:   .long   0
+; CHECK-NEXT:   .long 0
+; Num Functions
+; CHECK-NEXT:   .long 2
+; CHECK-NEXT:   .long _stackmap_liveness
+; CHECK-NEXT:   .long 8
+; CHECK-NEXT:   .long _mixed_liveness
+; CHECK-NEXT:   .long 8
 ; Num LargeConstants
 ; CHECK-NEXT:   .long   0
 ; Num Callsites
index 02060eb11f555232551d4512c1de3d2ed53d7d84..2b7bb183007c92f8d6bd36c3671711545c5cee76 100644 (file)
@@ -4,7 +4,37 @@
 
 ; CHECK-LABEL:  .section  __LLVM_STACKMAPS,__llvm_stackmaps
 ; CHECK-NEXT:  __LLVM_StackMaps:
-; CHECK-NEXT:   .long   0
+; CHECK-NEXT:   .long 0
+; Num Functions
+; CHECK-NEXT:   .long 14
+; CHECK-NEXT:   .long _constantargs
+; CHECK-NEXT:   .long 8
+; CHECK-NEXT:   .long _osrinline
+; CHECK-NEXT:   .long 24
+; CHECK-NEXT:   .long _osrcold
+; CHECK-NEXT:   .long 8
+; CHECK-NEXT:   .long _propertyRead
+; CHECK-NEXT:   .long 8
+; CHECK-NEXT:   .long _propertyWrite
+; CHECK-NEXT:   .long 8
+; CHECK-NEXT:   .long _jsVoidCall
+; CHECK-NEXT:   .long 8
+; CHECK-NEXT:   .long _jsIntCall
+; CHECK-NEXT:   .long 8
+; CHECK-NEXT:   .long _spilledValue
+; CHECK-NEXT:   .long 56
+; CHECK-NEXT:   .long _spilledStackMapValue
+; CHECK-NEXT:   .long 56
+; CHECK-NEXT:   .long _spillSubReg
+; CHECK-NEXT:   .long 56
+; CHECK-NEXT:   .long _subRegOffset
+; CHECK-NEXT:   .long 56
+; CHECK-NEXT:   .long _liveConstant
+; CHECK-NEXT:   .long 8
+; CHECK-NEXT:   .long _directFrameIdx
+; CHECK-NEXT:   .long 56
+; CHECK-NEXT:   .long _longid
+; CHECK-NEXT:   .long 8
 ; Num LargeConstants
 ; CHECK-NEXT:   .long   3
 ; CHECK-NEXT:   .quad   2147483648