mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-12 23:40:54 +00:00
f7e90f80e1
X86FrameLowering::adjustForHiPEPrologue() contains a hard-coded offset into an Erlang Runtime System-internal data structure (the PCB). As the layout of this data structure is prone to change, this poses problems for maintaining compatibility. To address this problem, the compiler can produce this information as module-level named metadata. For example (where P_NSP_LIMIT is the offending offset): !hipe.literals = !{ !2, !3, !4 } !2 = !{ !"P_NSP_LIMIT", i32 152 } !3 = !{ !"X86_LEAF_WORDS", i32 24 } !4 = !{ !"AMD64_LEAF_WORDS", i32 24 } Patch by Magnus Lang Differential Revision: http://reviews.llvm.org/D20363 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273593 91177308-0d34-0410-b5e6-96231b3b80d8
73 lines
2.2 KiB
LLVM
73 lines
2.2 KiB
LLVM
; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -verify-machineinstrs | FileCheck %s -check-prefix=X32-Linux
|
|
; RUN: llc < %s -mtriple=x86_64-linux-gnu -verify-machineinstrs | FileCheck %s -check-prefix=X64-Linux
|
|
|
|
; The HiPE compiler (i.e., the native code compiler of the Erlang/OTP system)
|
|
; adds a custom assembly prologue in order to efficiently manipulate the stack
|
|
; at runtime.
|
|
|
|
; Just to prevent the alloca from being optimized away.
|
|
declare void @dummy_use(i32*, i32)
|
|
|
|
define {i32, i32} @test_basic(i32 %hp, i32 %p) {
|
|
; X32-Linux-LABEL: test_basic:
|
|
; X32-Linux-NOT: calll inc_stack_0
|
|
|
|
; X64-Linux-LABEL: test_basic:
|
|
; X64-Linux-NOT: callq inc_stack_0
|
|
|
|
%mem = alloca i32, i32 10
|
|
call void @dummy_use (i32* %mem, i32 10)
|
|
%1 = insertvalue {i32, i32} undef, i32 %hp, 0
|
|
%2 = insertvalue {i32, i32} %1, i32 %p, 1
|
|
ret {i32, i32} %1
|
|
}
|
|
|
|
define cc 11 {i32, i32} @test_basic_hipecc(i32 %hp, i32 %p) {
|
|
; X32-Linux-LABEL: test_basic_hipecc:
|
|
; X32-Linux: leal -140(%esp), %ebx
|
|
; X32-Linux-NEXT: cmpl 120(%ebp), %ebx
|
|
; X32-Linux-NEXT: jb .LBB1_1
|
|
|
|
; X32-Linux: ret
|
|
|
|
; X32-Linux: .LBB1_1:
|
|
; X32-Linux-NEXT: calll inc_stack_0
|
|
|
|
; X64-Linux-LABEL: test_basic_hipecc:
|
|
; X64-Linux: leaq -184(%rsp), %r14
|
|
; X64-Linux-NEXT: cmpq 120(%rbp), %r14
|
|
; X64-Linux-NEXT: jb .LBB1_1
|
|
|
|
; X64-Linux: ret
|
|
|
|
; X64-Linux: .LBB1_1:
|
|
; X64-Linux-NEXT: callq inc_stack_0
|
|
|
|
%mem = alloca i32, i32 10
|
|
call void @dummy_use (i32* %mem, i32 10)
|
|
%1 = insertvalue {i32, i32} undef, i32 %hp, 0
|
|
%2 = insertvalue {i32, i32} %1, i32 %p, 1
|
|
ret {i32, i32} %2
|
|
}
|
|
|
|
define cc 11 {i32,i32,i32} @test_nocall_hipecc(i32 %hp,i32 %p,i32 %x,i32 %y) {
|
|
; X32-Linux-LABEL: test_nocall_hipecc:
|
|
; X32-Linux-NOT: calll inc_stack_0
|
|
|
|
; X64-Linux-LABEL: test_nocall_hipecc:
|
|
; X64-Linux-NOT: callq inc_stack_0
|
|
|
|
%1 = add i32 %x, %y
|
|
%2 = mul i32 42, %1
|
|
%3 = sub i32 24, %2
|
|
%4 = insertvalue {i32, i32, i32} undef, i32 %hp, 0
|
|
%5 = insertvalue {i32, i32, i32} %4, i32 %p, 1
|
|
%6 = insertvalue {i32, i32, i32} %5, i32 %p, 2
|
|
ret {i32, i32, i32} %6
|
|
}
|
|
|
|
!hipe.literals = !{ !0, !1, !2 }
|
|
!0 = !{ !"P_NSP_LIMIT", i32 120 }
|
|
!1 = !{ !"X86_LEAF_WORDS", i32 24 }
|
|
!2 = !{ !"AMD64_LEAF_WORDS", i32 18 }
|