[llvm] r200481 - [Stackmaps] Record the stack size of each function that contains a stackmap/patchpoint intrinsic.

Kevin Modzelewski kmod at dropbox.com
Tue Feb 4 20:19:27 PST 2014


Hi, I'm having some trouble with this commit: I can't load the stackmap
section since these stack-size entries contain 32-bit relocations for
64-bit addresses:
RuntimeDyldELF.cpp:277: void
llvm::RuntimeDyldELF::resolveX86_64Relocation(const llvm::SectionEntry&,
uint64_t, uint64_t, uint32_t, int64_t, uint64_t): Assertion `(Type ==
ELF::R_X86_64_32 && (Value <= (4294967295U))) || (Type == ELF::R_X86_64_32S
&& ((int64_t)Value <= (2147483647) && (int64_t)Value >= (-2147483647-1)))'
failed.

I'm not sure how much of this is due to different object file formats; I'm
getting this error on top of my patch for enabling stackmaps on ELF, and
I'm not sure if the behavior is the same as MachO.  I'm also not sure how
to produce a test for this since the relevant crash happens during loading,
which isn't covered by running the bitcode through llc.

I was able to work around this by either changing the Function Offset field
to be 8-bytes, or by changing the stackmap section to not have the
ELF::SHF_ALLOC flag set (though I think this also disables allocating it
through the MemoryManager).  But again I'm not sure if it's maybe just a
bug in the ELF support since that hasn't been accepted yet; I'm curious why
I'm running into this but you guys aren't.

Kevin


On Thu, Jan 30, 2014 at 10:58 AM, Juergen Ributzka <juergen at apple.com>wrote:

> Author: ributzka
> Date: Thu Jan 30 12:58:27 2014
> New Revision: 200481
>
> URL: http://llvm.org/viewvc/llvm-project?rev=200481&view=rev
> Log:
> [Stackmaps] Record the stack size of each function that contains a
> stackmap/patchpoint intrinsic.
>
> Re-applying the patch, but this time without using AsmPrinter methods.
>
> Reviewed by Andy
>
> Modified:
>     llvm/trunk/docs/StackMaps.rst
>     llvm/trunk/include/llvm/CodeGen/StackMaps.h
>     llvm/trunk/lib/CodeGen/StackMaps.cpp
>     llvm/trunk/test/CodeGen/X86/anyregcc.ll
>     llvm/trunk/test/CodeGen/X86/stackmap-liveness.ll
>     llvm/trunk/test/CodeGen/X86/stackmap.ll
>
> Modified: llvm/trunk/docs/StackMaps.rst
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/StackMaps.rst?rev=200481&r1=200480&r2=200481&view=diff
>
> ==============================================================================
> --- llvm/trunk/docs/StackMaps.rst (original)
> +++ llvm/trunk/docs/StackMaps.rst Thu Jan 30 12:58:27 2014
> @@ -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
>
> Modified: llvm/trunk/include/llvm/CodeGen/StackMaps.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/StackMaps.h?rev=200481&r1=200480&r2=200481&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/StackMaps.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/StackMaps.h Thu Jan 30 12:58:27 2014
> @@ -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,
>
> Modified: llvm/trunk/lib/CodeGen/StackMaps.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/StackMaps.cpp?rev=200481&r1=200480&r2=200481&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/StackMaps.cpp (original)
> +++ llvm/trunk/lib/CodeGen/StackMaps.cpp Thu Jan 30 12:58:27 2014
> @@ -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(cons
>      }
>    }
>
> +  // 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 M
>  /// 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::serializeToStackMapSecti
>    // 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.OutStreamer.EmitSymbolValue(I->first, 4);
> +    AP.OutStreamer.EmitIntValue(I->second, 4);
> +  }
> +
>    // Num constants.
>    AP.OutStreamer.EmitIntValue(ConstPool.getNumConstants(), 4);
>
>
> Modified: llvm/trunk/test/CodeGen/X86/anyregcc.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/anyregcc.ll?rev=200481&r1=200480&r2=200481&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/anyregcc.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/anyregcc.ll Thu Jan 30 12:58:27 2014
> @@ -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
>  }
>
> Modified: llvm/trunk/test/CodeGen/X86/stackmap-liveness.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/stackmap-liveness.ll?rev=200481&r1=200480&r2=200481&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/stackmap-liveness.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/stackmap-liveness.ll Thu Jan 30 12:58:27
> 2014
> @@ -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
>
> Modified: llvm/trunk/test/CodeGen/X86/stackmap.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/stackmap.ll?rev=200481&r1=200480&r2=200481&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/stackmap.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/stackmap.ll Thu Jan 30 12:58:27 2014
> @@ -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
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140204/23a9ec4c/attachment.html>


More information about the llvm-commits mailing list