mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-24 09:29:42 +00:00
The old code used to lower FRAMEADDR tried to replicate the logic in the real frame-lowering code that determines whether or not the frame pointer (r31) will be used. When it seemed as through the frame pointer would not be used, the stack pointer (r1) was used instead. Unfortunately, because the stack size is not yet known, this does not work. Instead, this change introduces new always-reserved pseudo-registers (FP and FP8) that are replaced during prologue insertion with the real frame-pointer register (either r1 or r31). It is important that this intrinsic always return a valid frame address because it is used by Clang to store the frame address as part of code generation for __builtin_setjmp. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177653 91177308-0d34-0410-b5e6-96231b3b80d8
48 lines
1.5 KiB
LLVM
48 lines
1.5 KiB
LLVM
; RUN: llc < %s -mcpu=pwr7 | FileCheck %s
|
|
target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
|
|
target triple = "powerpc64-unknown-linux-gnu"
|
|
|
|
declare void @llvm.eh.sjlj.longjmp(i8*) #1
|
|
|
|
define i8* @main() #0 {
|
|
entry:
|
|
%0 = call i8* @llvm.frameaddress(i32 0)
|
|
ret i8* %0
|
|
|
|
; CHECK: @main
|
|
; CHECK: mr 3, 1
|
|
}
|
|
|
|
define i8* @foo() #3 { ; naked
|
|
entry:
|
|
%0 = call i8* @llvm.frameaddress(i32 0)
|
|
ret i8* %0
|
|
|
|
; CHECK: @foo
|
|
; CHECK: mr 3, 1
|
|
}
|
|
|
|
define i8* @bar() #0 {
|
|
entry:
|
|
%x = alloca [100000 x i8] ; <[100000 x i8]*> [#uses=1]
|
|
%x1 = bitcast [100000 x i8]* %x to i8* ; <i8*> [#uses=1]
|
|
call void @use(i8* %x1) nounwind
|
|
%0 = call i8* @llvm.frameaddress(i32 0)
|
|
ret i8* %0
|
|
|
|
; Note that if we start eliminating non-leaf frame pointers by default, this
|
|
; will need to be updated.
|
|
; CHECK: @bar
|
|
; CHECK: mr 3, 31
|
|
}
|
|
|
|
declare void @use(i8*)
|
|
|
|
declare i8* @llvm.frameaddress(i32) #2
|
|
|
|
attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
attributes #1 = { noreturn nounwind }
|
|
attributes #2 = { nounwind readnone }
|
|
attributes #3 = { nounwind naked "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
|