diff options
author | Cyril SIX <cyril.six@kalray.eu> | 2019-10-14 11:17:45 +0200 |
---|---|---|
committer | Cyril SIX <cyril.six@kalray.eu> | 2019-10-14 11:17:45 +0200 |
commit | 64a80f81297fb20c4f952d4b36cd0ae5d5da8f1e (patch) | |
tree | e41b0c4494181ee83e03d5909382cd29ade9516c /cparser | |
parent | c59a26be1b4ae5c0ecf963d0ff2436dc73e72123 (diff) | |
download | compcert-kvx-64a80f81297fb20c4f952d4b36cd0ae5d5da8f1e.tar.gz compcert-kvx-64a80f81297fb20c4f952d4b36cd0ae5d5da8f1e.zip |
Tackling struct passing by value for the future K1C ABI
Diffstat (limited to 'cparser')
-rw-r--r-- | cparser/Machine.ml | 5 | ||||
-rw-r--r-- | cparser/Machine.mli | 1 | ||||
-rw-r--r-- | cparser/StructPassing.ml | 8 |
3 files changed, 12 insertions, 2 deletions
diff --git a/cparser/Machine.ml b/cparser/Machine.ml index ac34fa5f..4999f0ac 100644 --- a/cparser/Machine.ml +++ b/cparser/Machine.ml @@ -18,6 +18,7 @@ type struct_passing_style = | SP_ref_callee (* by reference, callee takes copy *) | SP_ref_caller (* by reference, caller takes copy *) + | SP_value32_ref_callee (* by value if <= 32 bits, by ref_callee otherwise *) | SP_split_args (* by value, as a sequence of ints *) type struct_return_style = @@ -268,8 +269,8 @@ let mppa_k1c = bigendian = false; bitfields_msb_first = false; (* TO CHECK *) supports_unaligned_accesses = true; - struct_passing_style = SP_split_args; - struct_return_style = SR_int1248 } + struct_passing_style = SP_value32_ref_callee; + struct_return_style = SR_int1to4 } (* Add GCC extensions re: sizeof and alignof *) diff --git a/cparser/Machine.mli b/cparser/Machine.mli index 56d8d0b9..24d36e6c 100644 --- a/cparser/Machine.mli +++ b/cparser/Machine.mli @@ -17,6 +17,7 @@ type struct_passing_style = | SP_ref_callee (* by reference, callee takes copy *) | SP_ref_caller (* by reference, caller takes copy *) + | SP_value32_ref_callee (* by value if <= 32 bits, by ref_callee otherwise *) | SP_split_args (* by value, as a sequence of ints *) type struct_return_style = diff --git a/cparser/StructPassing.ml b/cparser/StructPassing.ml index 060a4848..7bd72808 100644 --- a/cparser/StructPassing.ml +++ b/cparser/StructPassing.ml @@ -68,6 +68,14 @@ let classify_param env ty = match !struct_passing_style with | SP_ref_callee -> Param_unchanged | SP_ref_caller -> Param_ref_caller + | SP_value32_ref_callee -> + (match sizeof env ty, alignof env ty with + | Some sz, Some al -> + if (sz <= 4) then + Param_flattened ((sz+3)/4, sz, al) (* FIXME - why (sz+3)/4 ? *) + else + Param_unchanged + | _, _ -> failwith "StructPassing.classify_param SP_split_args32_ref_callee") | SP_split_args -> match sizeof env ty, alignof env ty with | Some sz, Some al -> |