diff --git a/llvm/docs/StackMaps.rst b/llvm/docs/StackMaps.rst index 8f7f41a2fb47f7..783336e2d80658 100644 --- a/llvm/docs/StackMaps.rst +++ b/llvm/docs/StackMaps.rst @@ -328,7 +328,7 @@ format of this section follows: uint32 : NumRecords StkSizeRecord[NumFunctions] { uint64 : Function Address - uint64 : Stack Size + uint64 : Stack Size (or UINT64_MAX if not statically known) uint64 : Record Count } Constants[NumConstants] { diff --git a/llvm/test/CodeGen/AArch64/stackmap-dynamic-alloca.ll b/llvm/test/CodeGen/AArch64/stackmap-dynamic-alloca.ll new file mode 100644 index 00000000000000..46e3375405ab4e --- /dev/null +++ b/llvm/test/CodeGen/AArch64/stackmap-dynamic-alloca.ll @@ -0,0 +1,30 @@ +; RUN: llc < %s -mtriple=arm64-linux-gnu | FileCheck %s + +; When a function does a dynamic stack allocation, the function's stack size +; is reported as UINT64_MAX. + +; CHECK-LABEL: .section .llvm_stackmaps +; CHECK-NEXT: __LLVM_StackMaps: +; Header +; CHECK-NEXT: .byte 3 +; CHECK-NEXT: .byte 0 +; CHECK-NEXT: .hword 0 +; Num Functions +; CHECK-NEXT: .word 1 +; Num LargeConstants +; CHECK-NEXT: .word 0 +; Num Callsites +; CHECK-NEXT: .word 1 + +; Functions and stack size +; CHECK-NEXT: .xword f +; CHECK-NEXT: .xword -1 + +define void @f(i32 %nelems) { +entry: + %mem = alloca i32, i32 %nelems + call void (i64, i32, ...) @llvm.experimental.stackmap(i64 0, i32 0, i32* %mem) + ret void +} + +declare void @llvm.experimental.stackmap(i64, i32, ...) diff --git a/llvm/test/CodeGen/SystemZ/stackmap-dynamic-alloca.ll b/llvm/test/CodeGen/SystemZ/stackmap-dynamic-alloca.ll new file mode 100644 index 00000000000000..6223ccd7680737 --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/stackmap-dynamic-alloca.ll @@ -0,0 +1,30 @@ +; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s + +; When a function does a dynamic stack allocation, the function's stack size +; is reported as UINT64_MAX. + +; CHECK: .section .llvm_stackmaps +; CHECK-NEXT: __LLVM_StackMaps: +; Header +; CHECK-NEXT: .byte 3 +; CHECK-NEXT: .byte 0 +; CHECK-NEXT: .short 0 +; Num Functions +; CHECK-NEXT: .long 1 +; Num LargeConstants +; CHECK-NEXT: .long 0 +; Num Callsites +; CHECK-NEXT: .long 1 + +; Functions and stack size +; CHECK-NEXT: .quad f +; CHECK-NEXT: .quad -1 + +define void @f(i32 %nelems) { +entry: + %mem = alloca i32, i32 %nelems + call void (i64, i32, ...) @llvm.experimental.stackmap(i64 0, i32 0, i32* %mem) + ret void +} + +declare void @llvm.experimental.stackmap(i64, i32, ...) diff --git a/llvm/test/CodeGen/X86/stackmap-dynamic-alloca.ll b/llvm/test/CodeGen/X86/stackmap-dynamic-alloca.ll new file mode 100644 index 00000000000000..784116cda4a965 --- /dev/null +++ b/llvm/test/CodeGen/X86/stackmap-dynamic-alloca.ll @@ -0,0 +1,30 @@ +; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7 | FileCheck %s + +; When a function does a dynamic stack allocation, the function's stack size is +; reported as UINT64_MAX. + +; CHECK-LABEL: .section __LLVM_STACKMAPS,__llvm_stackmaps +; CHECK-NEXT: __LLVM_StackMaps: +; Header +; CHECK-NEXT: .byte 3 +; CHECK-NEXT: .byte 0 +; CHECK-NEXT: .short 0 +; Num Functions +; CHECK-NEXT: .long 1 +; Num LargeConstants +; CHECK-NEXT: .long 0 +; Num Callsites +; CHECK-NEXT: .long 1 + +; Functions and stack size +; CHECK-NEXT: .quad _f +; CHECK-NEXT: .quad -1 + +define void @f(i32 %nelems) { +entry: + %mem = alloca i32, i32 %nelems + call void (i64, i32, ...) @llvm.experimental.stackmap(i64 0, i32 0, i32* %mem) + ret void +} + +declare void @llvm.experimental.stackmap(i64, i32, ...)