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
llvm-svn: 273593
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 }
|