Commit 6fc89e5c authored by Bernhard Schommer's avatar Bernhard Schommer Committed by Xavier Leroy
Browse files

Add sizeof_reg and new Machine configurations (#129)

Since the size of integer registers is not identical to the size of pointers
for the ppc64 and e5500 model the check for register pairs in
ExtendedAsm does not work correctly.

In order to avoid this a new field sizeof_intreg is introduced in the
Machine configuration which describes the size of integer registers.
New configurations for the ppc64 and e5500 model are added
and used.

Bug 24273
parent ec8d93af
......@@ -73,7 +73,7 @@ let set_label_const lbl pos n subst =
let is_reg_pair env ty =
match unroll env ty with
| TInt(ik, _) -> sizeof_ikind ik > !config.sizeof_ptr
| TInt(ik, _) -> sizeof_ikind ik > !config.sizeof_intreg
| _ -> false
(* Transform the input operands:
......
......@@ -44,6 +44,7 @@ type t = {
wchar_signed: bool;
sizeof_size_t: int;
sizeof_ptrdiff_t: int;
sizeof_intreg: int;
alignof_ptr: int;
alignof_short: int;
alignof_int: int;
......@@ -78,6 +79,7 @@ let ilp32ll64 = {
wchar_signed = true;
sizeof_size_t = 4;
sizeof_ptrdiff_t = 4;
sizeof_intreg = 4;
alignof_ptr = 4;
alignof_short = 2;
alignof_int = 4;
......@@ -112,6 +114,7 @@ let i32lpll64 = {
wchar_signed = true;
sizeof_size_t = 8;
sizeof_ptrdiff_t = 8;
sizeof_intreg = 8;
alignof_ptr = 8;
alignof_short = 2;
alignof_int = 4;
......@@ -146,6 +149,7 @@ let il32pll64 = {
wchar_signed = true;
sizeof_size_t = 8;
sizeof_ptrdiff_t = 8;
sizeof_intreg = 8;
alignof_ptr = 8;
alignof_short = 2;
alignof_int = 4;
......@@ -202,11 +206,20 @@ let ppc_32_bigendian =
struct_passing_style = SP_ref_caller;
struct_return_style = SR_int1to8; }
let ppc_32_r64_bigendian =
{ ppc_32_bigendian with sizeof_intreg = 8;}
let ppc_32_diab_bigendian =
{ ppc_32_bigendian with sizeof_wchar = 2; wchar_signed = false }
let ppc_32_r64_diab_bigendian =
{ ppc_32_diab_bigendian with sizeof_intreg = 8;}
let ppc_32_linux_bigendian = {ppc_32_bigendian with struct_return_style = SR_ref;}
let ppc_32_r64_linux_bigendian =
{ ppc_32_linux_bigendian with sizeof_intreg = 8;}
let arm_littleendian =
{ ilp32ll64 with name = "arm"; struct_passing_style = SP_split_args;
struct_return_style = SR_int1to4;}
......@@ -254,6 +267,7 @@ let undef = {
wchar_signed = true;
sizeof_size_t = 0;
sizeof_ptrdiff_t = 0;
sizeof_intreg = 0;
alignof_ptr = 0;
alignof_short = 0;
alignof_int = 0;
......
......@@ -43,6 +43,7 @@ type t = {
wchar_signed: bool;
sizeof_size_t: int;
sizeof_ptrdiff_t: int;
sizeof_intreg: int;
alignof_ptr: int;
alignof_short: int;
alignof_int: int;
......@@ -78,6 +79,9 @@ val win64 : t
val ppc_32_bigendian : t
val ppc_32_diab_bigendian : t
val ppc_32_linux_bigendian : t
val ppc_32_r64_bigendian : t
val ppc_32_r64_diab_bigendian : t
val ppc_32_r64_linux_bigendian : t
val arm_littleendian : t
val arm_bigendian : t
val rv32 : t
......
......@@ -73,10 +73,12 @@ let parse_c_file sourcename ifile =
let init () =
Machine.config:=
begin match Configuration.arch with
| "powerpc" -> if Configuration.gnu_toolchain
then if Configuration.abi = "linux"
then Machine.ppc_32_linux_bigendian
else Machine.ppc_32_bigendian
| "powerpc" -> if Configuration.model = "e5500" || Configuration.model = "ppc64"
then if Configuration.abi = "linux" then Machine.ppc_32_r64_linux_bigendian
else if Configuration.gnu_toolchain then Machine.ppc_32_r64_bigendian
else Machine.ppc_32_r64_diab_bigendian
else if Configuration.abi = "linux" then Machine.ppc_32_linux_bigendian
else if Configuration.gnu_toolchain then Machine.ppc_32_bigendian
else Machine.ppc_32_diab_bigendian
| "arm" -> if Configuration.is_big_endian
then Machine.arm_bigendian
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment