Emit each function in a separate section (amd64,i386,arm,arm64)
Add --enable-function-sections option to configure. With this option, the compiler will emit each function in a separate named text section, on supported targets. This enables function reordering using a linker script. With this option, the compiler also emits caml_hot__code_begin and caml_hot__code_end sections. This allows a linker script to move function sections outside of the segments they belong to, without breaking caml_code_segments.master
parent
6582335689
commit
27a92a9445
|
@ -231,6 +231,7 @@ WINDOWS_UNICODE=@windows_unicode@
|
||||||
AFL_INSTRUMENT=@afl@
|
AFL_INSTRUMENT=@afl@
|
||||||
MAX_TESTSUITE_DIR_RETRIES=@max_testsuite_dir_retries@
|
MAX_TESTSUITE_DIR_RETRIES=@max_testsuite_dir_retries@
|
||||||
FLAT_FLOAT_ARRAY=@flat_float_array@
|
FLAT_FLOAT_ARRAY=@flat_float_array@
|
||||||
|
FUNCTION_SECTIONS=@function_sections@
|
||||||
AWK=@AWK@
|
AWK=@AWK@
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -478,6 +478,26 @@ let emit_global_label s =
|
||||||
D.global lbl;
|
D.global lbl;
|
||||||
_label lbl
|
_label lbl
|
||||||
|
|
||||||
|
(* Output .text section directive, or named .text.<name> if enabled and
|
||||||
|
supported on the target system. *)
|
||||||
|
|
||||||
|
let emit_named_text_section func_name =
|
||||||
|
if Config.function_sections then
|
||||||
|
begin match system with
|
||||||
|
| S_macosx
|
||||||
|
(* Names of section segments in macosx are restricted to 16 characters,
|
||||||
|
but function names are often longer, especially anonymous functions. *)
|
||||||
|
| S_win64 | S_mingw64 | S_cygwin
|
||||||
|
(* Win systems provide named text sections, but configure on these
|
||||||
|
systems does not support function sections. *)
|
||||||
|
-> assert false
|
||||||
|
| _ -> D.section
|
||||||
|
[ ".text."^(emit_symbol func_name) ]
|
||||||
|
(Some "ax")
|
||||||
|
["@progbits"]
|
||||||
|
end
|
||||||
|
else D.text ()
|
||||||
|
|
||||||
(* Output the assembly code for an instruction *)
|
(* Output the assembly code for an instruction *)
|
||||||
|
|
||||||
(* Name of current function *)
|
(* Name of current function *)
|
||||||
|
@ -852,7 +872,7 @@ let emit_instr fallthrough i =
|
||||||
D.long (ConstSub (ConstLabel(emit_label jumptbl.(i)),
|
D.long (ConstSub (ConstLabel(emit_label jumptbl.(i)),
|
||||||
ConstLabel lbl))
|
ConstLabel lbl))
|
||||||
done;
|
done;
|
||||||
D.text ()
|
emit_named_text_section !function_name
|
||||||
| Lentertrap ->
|
| Lentertrap ->
|
||||||
()
|
()
|
||||||
| Ladjust_trap_depth { delta_traps; } ->
|
| Ladjust_trap_depth { delta_traps; } ->
|
||||||
|
@ -915,7 +935,7 @@ let fundecl fundecl =
|
||||||
bound_error_sites := [];
|
bound_error_sites := [];
|
||||||
bound_error_call := 0;
|
bound_error_call := 0;
|
||||||
all_functions := fundecl :: !all_functions;
|
all_functions := fundecl :: !all_functions;
|
||||||
D.text ();
|
emit_named_text_section !function_name;
|
||||||
D.align 16;
|
D.align 16;
|
||||||
add_def_symbol fundecl.fun_name;
|
add_def_symbol fundecl.fun_name;
|
||||||
if system = S_macosx
|
if system = S_macosx
|
||||||
|
@ -1017,7 +1037,7 @@ let begin_assembly() =
|
||||||
D.data ();
|
D.data ();
|
||||||
emit_global_label "data_begin";
|
emit_global_label "data_begin";
|
||||||
|
|
||||||
D.text ();
|
emit_named_text_section (Compilenv.make_symbol (Some "code_begin"));
|
||||||
emit_global_label "code_begin";
|
emit_global_label "code_begin";
|
||||||
if system = S_macosx then I.nop (); (* PR#4690 *)
|
if system = S_macosx then I.nop (); (* PR#4690 *)
|
||||||
()
|
()
|
||||||
|
@ -1067,7 +1087,7 @@ let end_assembly() =
|
||||||
List.iter (fun (cst,lbl) -> emit_float_constant cst lbl) !float_constants
|
List.iter (fun (cst,lbl) -> emit_float_constant cst lbl) !float_constants
|
||||||
end;
|
end;
|
||||||
|
|
||||||
D.text ();
|
emit_named_text_section (Compilenv.make_symbol (Some "code_end"));
|
||||||
if system = S_macosx then I.nop ();
|
if system = S_macosx then I.nop ();
|
||||||
(* suppress "ld warning: atom sorting error" *)
|
(* suppress "ld warning: atom sorting error" *)
|
||||||
|
|
||||||
|
|
|
@ -435,6 +435,16 @@ let emit_load_handler_address handler =
|
||||||
` add lr, pc, lr\n`;
|
` add lr, pc, lr\n`;
|
||||||
2
|
2
|
||||||
|
|
||||||
|
|
||||||
|
(* Output .text section directive, or named .text.<name> if enabled. *)
|
||||||
|
|
||||||
|
let emit_named_text_section func_name =
|
||||||
|
if Config.function_sections then begin
|
||||||
|
` .text.{emit_symbol func_name},{emit_string_literal "ax"},{emit_string_literal "%progbits"}\n`
|
||||||
|
end
|
||||||
|
else
|
||||||
|
` .text\n`
|
||||||
|
|
||||||
(* Output the assembly code for an instruction *)
|
(* Output the assembly code for an instruction *)
|
||||||
|
|
||||||
let emit_instr i =
|
let emit_instr i =
|
||||||
|
@ -947,7 +957,7 @@ let fundecl fundecl =
|
||||||
stack_offset := 0;
|
stack_offset := 0;
|
||||||
call_gc_sites := [];
|
call_gc_sites := [];
|
||||||
bound_error_sites := [];
|
bound_error_sites := [];
|
||||||
` .text\n`;
|
emit_named_text_section !function_name;
|
||||||
` .align 2\n`;
|
` .align 2\n`;
|
||||||
` .globl {emit_symbol fundecl.fun_name}\n`;
|
` .globl {emit_symbol fundecl.fun_name}\n`;
|
||||||
if !arch > ARMv6 && !thumb then
|
if !arch > ARMv6 && !thumb then
|
||||||
|
@ -1015,13 +1025,13 @@ let begin_assembly() =
|
||||||
` .globl {emit_symbol lbl_begin}\n`;
|
` .globl {emit_symbol lbl_begin}\n`;
|
||||||
`{emit_symbol lbl_begin}:\n`;
|
`{emit_symbol lbl_begin}:\n`;
|
||||||
let lbl_begin = Compilenv.make_symbol (Some "code_begin") in
|
let lbl_begin = Compilenv.make_symbol (Some "code_begin") in
|
||||||
` .text\n`;
|
emit_named_text_section lbl_begin;
|
||||||
` .globl {emit_symbol lbl_begin}\n`;
|
` .globl {emit_symbol lbl_begin}\n`;
|
||||||
`{emit_symbol lbl_begin}:\n`
|
`{emit_symbol lbl_begin}:\n`
|
||||||
|
|
||||||
let end_assembly () =
|
let end_assembly () =
|
||||||
let lbl_end = Compilenv.make_symbol (Some "code_end") in
|
let lbl_end = Compilenv.make_symbol (Some "code_end") in
|
||||||
` .text\n`;
|
emit_named_text_section lbl_end;
|
||||||
` .globl {emit_symbol lbl_end}\n`;
|
` .globl {emit_symbol lbl_end}\n`;
|
||||||
`{emit_symbol lbl_end}:\n`;
|
`{emit_symbol lbl_end}:\n`;
|
||||||
let lbl_end = Compilenv.make_symbol (Some "data_end") in
|
let lbl_end = Compilenv.make_symbol (Some "data_end") in
|
||||||
|
|
|
@ -563,6 +563,15 @@ let assembly_code_for_allocation ?label_after_call_gc i ~n ~far =
|
||||||
`{emit_label lbl_frame}: add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n`
|
`{emit_label lbl_frame}: add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n`
|
||||||
end
|
end
|
||||||
|
|
||||||
|
(* Output .text section directive, or named .text.<name> if enabled. *)
|
||||||
|
|
||||||
|
let emit_named_text_section func_name =
|
||||||
|
if Config.function_sections then begin
|
||||||
|
` .text.{emit_symbol func_name},{emit_string_literal "ax"},{emit_string_literal "%progbits"}\n`
|
||||||
|
end
|
||||||
|
else
|
||||||
|
` .text\n`
|
||||||
|
|
||||||
(* Output the assembly code for an instruction *)
|
(* Output the assembly code for an instruction *)
|
||||||
|
|
||||||
let emit_instr i =
|
let emit_instr i =
|
||||||
|
@ -910,7 +919,7 @@ let fundecl fundecl =
|
||||||
stack_offset := 0;
|
stack_offset := 0;
|
||||||
call_gc_sites := [];
|
call_gc_sites := [];
|
||||||
bound_error_sites := [];
|
bound_error_sites := [];
|
||||||
` .text\n`;
|
emit_named_text_section !function_name;
|
||||||
` .align 3\n`;
|
` .align 3\n`;
|
||||||
` .globl {emit_symbol fundecl.fun_name}\n`;
|
` .globl {emit_symbol fundecl.fun_name}\n`;
|
||||||
` .type {emit_symbol fundecl.fun_name}, %function\n`;
|
` .type {emit_symbol fundecl.fun_name}, %function\n`;
|
||||||
|
@ -974,13 +983,13 @@ let begin_assembly() =
|
||||||
` .globl {emit_symbol lbl_begin}\n`;
|
` .globl {emit_symbol lbl_begin}\n`;
|
||||||
`{emit_symbol lbl_begin}:\n`;
|
`{emit_symbol lbl_begin}:\n`;
|
||||||
let lbl_begin = Compilenv.make_symbol (Some "code_begin") in
|
let lbl_begin = Compilenv.make_symbol (Some "code_begin") in
|
||||||
` .text\n`;
|
emit_named_text_section lbl_begin;
|
||||||
` .globl {emit_symbol lbl_begin}\n`;
|
` .globl {emit_symbol lbl_begin}\n`;
|
||||||
`{emit_symbol lbl_begin}:\n`
|
`{emit_symbol lbl_begin}:\n`
|
||||||
|
|
||||||
let end_assembly () =
|
let end_assembly () =
|
||||||
let lbl_end = Compilenv.make_symbol (Some "code_end") in
|
let lbl_end = Compilenv.make_symbol (Some "code_end") in
|
||||||
` .text\n`;
|
emit_named_text_section lbl_end;
|
||||||
` .globl {emit_symbol lbl_end}\n`;
|
` .globl {emit_symbol lbl_end}\n`;
|
||||||
`{emit_symbol lbl_end}:\n`;
|
`{emit_symbol lbl_end}:\n`;
|
||||||
let lbl_end = Compilenv.make_symbol (Some "data_end") in
|
let lbl_end = Compilenv.make_symbol (Some "data_end") in
|
||||||
|
|
|
@ -240,7 +240,10 @@ let make_startup_file ~ppf_dump units_list ~crc_interfaces =
|
||||||
let globals_map = make_globals_map units_list ~crc_interfaces in
|
let globals_map = make_globals_map units_list ~crc_interfaces in
|
||||||
compile_phrase (Cmmgen.globals_map globals_map);
|
compile_phrase (Cmmgen.globals_map globals_map);
|
||||||
compile_phrase(Cmmgen.data_segment_table ("_startup" :: name_list));
|
compile_phrase(Cmmgen.data_segment_table ("_startup" :: name_list));
|
||||||
compile_phrase(Cmmgen.code_segment_table ("_startup" :: name_list));
|
if (Config.function_sections) then
|
||||||
|
compile_phrase(Cmmgen.code_segment_table ("_hot" :: "_startup" :: name_list))
|
||||||
|
else
|
||||||
|
compile_phrase(Cmmgen.code_segment_table ("_startup" :: name_list));
|
||||||
let all_names = "_startup" :: "_system" :: name_list in
|
let all_names = "_startup" :: "_system" :: name_list in
|
||||||
compile_phrase (Cmmgen.frame_table all_names);
|
compile_phrase (Cmmgen.frame_table all_names);
|
||||||
if Config.spacetime then begin
|
if Config.spacetime then begin
|
||||||
|
|
|
@ -461,6 +461,16 @@ let emit_global_label s =
|
||||||
D.global lbl;
|
D.global lbl;
|
||||||
_label lbl
|
_label lbl
|
||||||
|
|
||||||
|
(* Output .text section directive, or named .text.<name> if enabled. *)
|
||||||
|
|
||||||
|
let emit_named_text_section func_name =
|
||||||
|
if Config.function_sections then
|
||||||
|
begin match system with
|
||||||
|
| S_macosx | S_mingw | S_cygwin | S_win32 -> D.text ()
|
||||||
|
| _ -> D.section [ ".text."^(emit_symbol func_name) ] (Some "ax") ["@progbits"]
|
||||||
|
end
|
||||||
|
else D.text ()
|
||||||
|
|
||||||
(* Output the assembly code for an instruction *)
|
(* Output the assembly code for an instruction *)
|
||||||
|
|
||||||
(* Name of current function *)
|
(* Name of current function *)
|
||||||
|
@ -843,7 +853,7 @@ let emit_instr fallthrough i =
|
||||||
for i = 0 to Array.length jumptbl - 1 do
|
for i = 0 to Array.length jumptbl - 1 do
|
||||||
D.long (ConstLabel (emit_label jumptbl.(i)))
|
D.long (ConstLabel (emit_label jumptbl.(i)))
|
||||||
done;
|
done;
|
||||||
D.text ()
|
emit_named_text_section !function_name
|
||||||
| Lentertrap ->
|
| Lentertrap ->
|
||||||
()
|
()
|
||||||
| Ladjust_trap_depth { delta_traps } ->
|
| Ladjust_trap_depth { delta_traps } ->
|
||||||
|
@ -896,7 +906,7 @@ let fundecl fundecl =
|
||||||
call_gc_sites := [];
|
call_gc_sites := [];
|
||||||
bound_error_sites := [];
|
bound_error_sites := [];
|
||||||
bound_error_call := 0;
|
bound_error_call := 0;
|
||||||
D.text ();
|
emit_named_text_section !function_name;
|
||||||
add_def_symbol fundecl.fun_name;
|
add_def_symbol fundecl.fun_name;
|
||||||
D.align (if system = S_win32 then 4 else 16);
|
D.align (if system = S_win32 then 4 else 16);
|
||||||
D.global (emit_symbol fundecl.fun_name);
|
D.global (emit_symbol fundecl.fun_name);
|
||||||
|
@ -963,8 +973,7 @@ let begin_assembly() =
|
||||||
|
|
||||||
D.data ();
|
D.data ();
|
||||||
emit_global_label "data_begin";
|
emit_global_label "data_begin";
|
||||||
|
emit_named_text_section (Compilenv.make_symbol (Some "code_begin"));
|
||||||
D.text ();
|
|
||||||
emit_global_label "code_begin"
|
emit_global_label "code_begin"
|
||||||
|
|
||||||
let end_assembly() =
|
let end_assembly() =
|
||||||
|
@ -973,8 +982,7 @@ let end_assembly() =
|
||||||
List.iter (fun (cst,lbl) -> emit_float_constant cst lbl) !float_constants
|
List.iter (fun (cst,lbl) -> emit_float_constant cst lbl) !float_constants
|
||||||
end;
|
end;
|
||||||
|
|
||||||
D.text ();
|
emit_named_text_section (Compilenv.make_symbol (Some "code_end"));
|
||||||
|
|
||||||
emit_global_label "code_end";
|
emit_global_label "code_end";
|
||||||
|
|
||||||
D.data ();
|
D.data ();
|
||||||
|
|
|
@ -695,6 +695,7 @@ flexdll_chain
|
||||||
default_safe_string
|
default_safe_string
|
||||||
force_safe_string
|
force_safe_string
|
||||||
afl
|
afl
|
||||||
|
function_sections
|
||||||
flat_float_array
|
flat_float_array
|
||||||
windows_unicode
|
windows_unicode
|
||||||
max_testsuite_dir_retries
|
max_testsuite_dir_retries
|
||||||
|
@ -845,6 +846,7 @@ with_target_bindir
|
||||||
enable_reserved_header_bits
|
enable_reserved_header_bits
|
||||||
enable_force_safe_string
|
enable_force_safe_string
|
||||||
enable_flat_float_array
|
enable_flat_float_array
|
||||||
|
enable_function_sections
|
||||||
with_afl
|
with_afl
|
||||||
enable_shared
|
enable_shared
|
||||||
enable_static
|
enable_static
|
||||||
|
@ -1519,6 +1521,9 @@ Optional Features:
|
||||||
force strings to be safe
|
force strings to be safe
|
||||||
--disable-flat-float-array
|
--disable-flat-float-array
|
||||||
do not use flat float arrays
|
do not use flat float arrays
|
||||||
|
--enable-function-sections
|
||||||
|
generate each function in a separate section if
|
||||||
|
target supports it
|
||||||
--enable-shared[=PKGS] build shared libraries [default=yes]
|
--enable-shared[=PKGS] build shared libraries [default=yes]
|
||||||
--enable-static[=PKGS] build static libraries [default=yes]
|
--enable-static[=PKGS] build static libraries [default=yes]
|
||||||
--enable-fast-install[=PKGS]
|
--enable-fast-install[=PKGS]
|
||||||
|
@ -2812,6 +2817,7 @@ VERSION=4.10.0+dev0-2019-04-23
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Generated files
|
## Generated files
|
||||||
|
@ -3164,6 +3170,12 @@ if test "${enable_flat_float_array+set}" = set; then :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Check whether --enable-function-sections was given.
|
||||||
|
if test "${enable_function_sections+set}" = set; then :
|
||||||
|
enableval=$enable_function_sections;
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Check whether --with-afl was given.
|
# Check whether --with-afl was given.
|
||||||
if test "${with_afl+set}" = set; then :
|
if test "${with_afl+set}" = set; then :
|
||||||
|
@ -16517,6 +16529,54 @@ else
|
||||||
flat_float_array=true
|
flat_float_array=true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test x"$enable_function_sections" = "xyes"; then :
|
||||||
|
case $arch in #(
|
||||||
|
amd64|i386|arm|arm64) :
|
||||||
|
case $target in #(
|
||||||
|
*-*-cygwin*|*-*-mingw*|*-pc-windows) :
|
||||||
|
function_sections=false;
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling function sections. No target support." >&5
|
||||||
|
$as_echo "$as_me: WARNING: Disabling function sections. No target support." >&2;} ;; #(
|
||||||
|
*) :
|
||||||
|
case $ocaml_cv_cc_vendor in #(
|
||||||
|
gcc-0123-*|gcc-4-01234567) :
|
||||||
|
function_sections=false;
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling function sections.
|
||||||
|
Not supported in GCC prior to version 4.8." >&5
|
||||||
|
$as_echo "$as_me: WARNING: Disabling function sections.
|
||||||
|
Not supported in GCC prior to version 4.8." >&2;} ;; #(
|
||||||
|
clang-012-*|clang-3-01234) :
|
||||||
|
function_sections=false;
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling function sections.
|
||||||
|
Not supported in Clang prior to version 3.5." >&5
|
||||||
|
$as_echo "$as_me: WARNING: Disabling function sections.
|
||||||
|
Not supported in Clang prior to version 3.5." >&2;} ;; #(
|
||||||
|
gcc-*|clang-*) :
|
||||||
|
function_sections=true;
|
||||||
|
common_cflags="$common_cflags -ffunction-sections";
|
||||||
|
$as_echo "#define FUNCTION_SECTIONS 1" >>confdefs.h
|
||||||
|
;; #(
|
||||||
|
*) :
|
||||||
|
function_sections=false;
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling function sections.
|
||||||
|
Compiler not supported." >&5
|
||||||
|
$as_echo "$as_me: WARNING: Disabling function sections.
|
||||||
|
Compiler not supported." >&2;} ;; #(
|
||||||
|
*) :
|
||||||
|
;;
|
||||||
|
esac ;; #(
|
||||||
|
*) :
|
||||||
|
;;
|
||||||
|
esac ;; #(
|
||||||
|
*) :
|
||||||
|
function_sections=false
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling function sections on this target." >&5
|
||||||
|
$as_echo "$as_me: WARNING: Disabling function sections on this target." >&2;} ;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
function_sections=false
|
||||||
|
fi
|
||||||
|
|
||||||
if test x"$with_afl" = "xyes"; then :
|
if test x"$with_afl" = "xyes"; then :
|
||||||
afl=true
|
afl=true
|
||||||
else
|
else
|
||||||
|
|
34
configure.ac
34
configure.ac
|
@ -156,6 +156,7 @@ AC_SUBST([flambda_invariants])
|
||||||
AC_SUBST([max_testsuite_dir_retries])
|
AC_SUBST([max_testsuite_dir_retries])
|
||||||
AC_SUBST([windows_unicode])
|
AC_SUBST([windows_unicode])
|
||||||
AC_SUBST([flat_float_array])
|
AC_SUBST([flat_float_array])
|
||||||
|
AC_SUBST([function_sections])
|
||||||
AC_SUBST([afl])
|
AC_SUBST([afl])
|
||||||
AC_SUBST([force_safe_string])
|
AC_SUBST([force_safe_string])
|
||||||
AC_SUBST([default_safe_string])
|
AC_SUBST([default_safe_string])
|
||||||
|
@ -352,6 +353,10 @@ AC_ARG_ENABLE([flat-float-array],
|
||||||
[AS_HELP_STRING([--disable-flat-float-array],
|
[AS_HELP_STRING([--disable-flat-float-array],
|
||||||
[do not use flat float arrays])])
|
[do not use flat float arrays])])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([function-sections],
|
||||||
|
[AS_HELP_STRING([--enable-function-sections],
|
||||||
|
[generate each function in a separate section if target supports it])])
|
||||||
|
|
||||||
AC_ARG_WITH([afl],
|
AC_ARG_WITH([afl],
|
||||||
[AS_HELP_STRING([--with-afl],
|
[AS_HELP_STRING([--with-afl],
|
||||||
[use the AFL fuzzer])])
|
[use the AFL fuzzer])])
|
||||||
|
@ -1613,6 +1618,35 @@ AS_IF([test x"$enable_flat_float_array" = "xno"],
|
||||||
[AC_DEFINE([FLAT_FLOAT_ARRAY])
|
[AC_DEFINE([FLAT_FLOAT_ARRAY])
|
||||||
flat_float_array=true])
|
flat_float_array=true])
|
||||||
|
|
||||||
|
AS_IF([test x"$enable_function_sections" = "xyes"],
|
||||||
|
[AS_CASE([$arch],
|
||||||
|
[amd64|i386|arm|arm64],
|
||||||
|
[AS_CASE([$target],
|
||||||
|
[*-*-cygwin*|*-*-mingw*|*-pc-windows],
|
||||||
|
[function_sections=false;
|
||||||
|
AC_MSG_WARN([Disabling function sections. No target support.])],
|
||||||
|
[*],
|
||||||
|
[AS_CASE([$ocaml_cv_cc_vendor],
|
||||||
|
[gcc-[0123]-*|gcc-4-[01234567]],
|
||||||
|
[function_sections=false;
|
||||||
|
AC_MSG_WARN([Disabling function sections.
|
||||||
|
Not supported in GCC prior to version 4.8.])],
|
||||||
|
[clang-[012]-*|clang-3-[01234]],
|
||||||
|
[function_sections=false;
|
||||||
|
AC_MSG_WARN([Disabling function sections.
|
||||||
|
Not supported in Clang prior to version 3.5.])],
|
||||||
|
[gcc-*|clang-*],
|
||||||
|
[function_sections=true;
|
||||||
|
common_cflags="$common_cflags -ffunction-sections";
|
||||||
|
AC_DEFINE([FUNCTION_SECTIONS])],
|
||||||
|
[*],
|
||||||
|
[function_sections=false;
|
||||||
|
AC_MSG_WARN([Disabling function sections.
|
||||||
|
Compiler not supported.])])])],
|
||||||
|
[function_sections=false
|
||||||
|
AC_MSG_WARN([Disabling function sections on this target.])])],
|
||||||
|
[function_sections=false])
|
||||||
|
|
||||||
AS_IF([test x"$with_afl" = "xyes"],
|
AS_IF([test x"$with_afl" = "xyes"],
|
||||||
[afl=true],
|
[afl=true],
|
||||||
[afl=false])
|
[afl=false])
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#define G(r) _##r
|
#define G(r) _##r
|
||||||
#define GREL(r) _##r@GOTPCREL
|
#define GREL(r) _##r@GOTPCREL
|
||||||
#define GCALL(r) _##r
|
#define GCALL(r) _##r
|
||||||
|
#define TEXT_SECTION(name) .text
|
||||||
#define FUNCTION_ALIGN 2
|
#define FUNCTION_ALIGN 2
|
||||||
#define EIGHT_ALIGN 3
|
#define EIGHT_ALIGN 3
|
||||||
#define SIXTEEN_ALIGN 4
|
#define SIXTEEN_ALIGN 4
|
||||||
|
@ -40,10 +41,16 @@
|
||||||
#define G(r) r
|
#define G(r) r
|
||||||
#undef GREL
|
#undef GREL
|
||||||
#define GCALL(r) r
|
#define GCALL(r) r
|
||||||
|
#if defined(FUNCTION_SECTIONS)
|
||||||
|
#define TEXT_SECTION(name) .section .text.##name
|
||||||
|
#else
|
||||||
|
#define TEXT_SECTION(name)
|
||||||
|
#endif
|
||||||
#define FUNCTION_ALIGN 4
|
#define FUNCTION_ALIGN 4
|
||||||
#define EIGHT_ALIGN 8
|
#define EIGHT_ALIGN 8
|
||||||
#define SIXTEEN_ALIGN 16
|
#define SIXTEEN_ALIGN 16
|
||||||
#define FUNCTION(name) \
|
#define FUNCTION(name) \
|
||||||
|
TEXT_SECTION(name); \
|
||||||
.globl name; \
|
.globl name; \
|
||||||
.align FUNCTION_ALIGN; \
|
.align FUNCTION_ALIGN; \
|
||||||
name:
|
name:
|
||||||
|
@ -54,10 +61,16 @@
|
||||||
#define G(r) r
|
#define G(r) r
|
||||||
#define GREL(r) r@GOTPCREL
|
#define GREL(r) r@GOTPCREL
|
||||||
#define GCALL(r) r@PLT
|
#define GCALL(r) r@PLT
|
||||||
|
#if defined(FUNCTION_SECTIONS)
|
||||||
|
#define TEXT_SECTION(name) .section .text.##name,"ax",%progbits
|
||||||
|
#else
|
||||||
|
#define TEXT_SECTION(name)
|
||||||
|
#endif
|
||||||
#define FUNCTION_ALIGN 4
|
#define FUNCTION_ALIGN 4
|
||||||
#define EIGHT_ALIGN 8
|
#define EIGHT_ALIGN 8
|
||||||
#define SIXTEEN_ALIGN 16
|
#define SIXTEEN_ALIGN 16
|
||||||
#define FUNCTION(name) \
|
#define FUNCTION(name) \
|
||||||
|
TEXT_SECTION(name); \
|
||||||
.globl name; \
|
.globl name; \
|
||||||
.type name,@function; \
|
.type name,@function; \
|
||||||
.align FUNCTION_ALIGN; \
|
.align FUNCTION_ALIGN; \
|
||||||
|
@ -287,6 +300,16 @@
|
||||||
#define C_ARG_2 %rsi
|
#define C_ARG_2 %rsi
|
||||||
#define C_ARG_3 %rdx
|
#define C_ARG_3 %rdx
|
||||||
#define C_ARG_4 %rcx
|
#define C_ARG_4 %rcx
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FUNCTION_SECTIONS)
|
||||||
|
TEXT_SECTION(caml_hot__code_begin)
|
||||||
|
.globl G(caml_hot__code_begin)
|
||||||
|
G(caml_hot__code_begin):
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_hot__code_end)
|
||||||
|
.globl G(caml_hot__code_end)
|
||||||
|
G(caml_hot__code_end):
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
|
@ -99,11 +99,27 @@ alloc_limit .req r11
|
||||||
#define CFI_OFFSET(r,n)
|
#define CFI_OFFSET(r,n)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Allocation functions and GC interface */
|
#if defined(FUNCTION_SECTIONS)
|
||||||
|
#define TEXT_SECTION(name) .section .text.##name,"ax",%progbits
|
||||||
|
#else
|
||||||
|
#define TEXT_SECTION(name)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FUNCTION_SECTIONS)
|
||||||
|
TEXT_SECTION(caml_hot__code_begin)
|
||||||
|
.globl caml_hot__code_begin
|
||||||
|
caml_hot__code_begin:
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_hot__code_end)
|
||||||
|
.globl caml_hot__code_end
|
||||||
|
caml_hot__code_end:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Allocation functions and GC interface */
|
||||||
.globl caml_system__code_begin
|
.globl caml_system__code_begin
|
||||||
caml_system__code_begin:
|
caml_system__code_begin:
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_call_gc)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_call_gc
|
.globl caml_call_gc
|
||||||
caml_call_gc:
|
caml_call_gc:
|
||||||
|
@ -154,6 +170,7 @@ caml_call_gc:
|
||||||
.type caml_call_gc, %function
|
.type caml_call_gc, %function
|
||||||
.size caml_call_gc, .-caml_call_gc
|
.size caml_call_gc, .-caml_call_gc
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_alloc1)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_alloc1
|
.globl caml_alloc1
|
||||||
caml_alloc1:
|
caml_alloc1:
|
||||||
|
@ -177,6 +194,7 @@ caml_alloc1:
|
||||||
.type caml_alloc1, %function
|
.type caml_alloc1, %function
|
||||||
.size caml_alloc1, .-caml_alloc1
|
.size caml_alloc1, .-caml_alloc1
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_alloc2)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_alloc2
|
.globl caml_alloc2
|
||||||
caml_alloc2:
|
caml_alloc2:
|
||||||
|
@ -200,6 +218,7 @@ caml_alloc2:
|
||||||
.type caml_alloc2, %function
|
.type caml_alloc2, %function
|
||||||
.size caml_alloc2, .-caml_alloc2
|
.size caml_alloc2, .-caml_alloc2
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_alloc3)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_alloc3
|
.globl caml_alloc3
|
||||||
.type caml_alloc3, %function
|
.type caml_alloc3, %function
|
||||||
|
@ -224,6 +243,7 @@ caml_alloc3:
|
||||||
.type caml_alloc3, %function
|
.type caml_alloc3, %function
|
||||||
.size caml_alloc3, .-caml_alloc3
|
.size caml_alloc3, .-caml_alloc3
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_allocN)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_allocN
|
.globl caml_allocN
|
||||||
caml_allocN:
|
caml_allocN:
|
||||||
|
@ -251,6 +271,7 @@ caml_allocN:
|
||||||
/* Call a C function from OCaml */
|
/* Call a C function from OCaml */
|
||||||
/* Function to call is in r7 */
|
/* Function to call is in r7 */
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_c_call)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_c_call
|
.globl caml_c_call
|
||||||
caml_c_call:
|
caml_c_call:
|
||||||
|
@ -282,6 +303,7 @@ caml_c_call:
|
||||||
|
|
||||||
/* Start the OCaml program */
|
/* Start the OCaml program */
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_start_program)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_start_program
|
.globl caml_start_program
|
||||||
caml_start_program:
|
caml_start_program:
|
||||||
|
@ -382,6 +404,7 @@ caml_start_program:
|
||||||
|
|
||||||
/* Raise an exception from OCaml */
|
/* Raise an exception from OCaml */
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_raise_exn)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_raise_exn
|
.globl caml_raise_exn
|
||||||
caml_raise_exn:
|
caml_raise_exn:
|
||||||
|
@ -409,6 +432,7 @@ caml_raise_exn:
|
||||||
|
|
||||||
/* Raise an exception from C */
|
/* Raise an exception from C */
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_raise_exception)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_raise_exception
|
.globl caml_raise_exception
|
||||||
caml_raise_exception:
|
caml_raise_exception:
|
||||||
|
@ -444,6 +468,7 @@ caml_raise_exception:
|
||||||
|
|
||||||
/* Callback from C to OCaml */
|
/* Callback from C to OCaml */
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_callback_exn)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_callback_exn
|
.globl caml_callback_exn
|
||||||
caml_callback_exn:
|
caml_callback_exn:
|
||||||
|
@ -458,6 +483,7 @@ caml_callback_exn:
|
||||||
.type caml_callback_exn, %function
|
.type caml_callback_exn, %function
|
||||||
.size caml_callback_exn, .-caml_callback_exn
|
.size caml_callback_exn, .-caml_callback_exn
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_callback2_exn)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_callback2_exn
|
.globl caml_callback2_exn
|
||||||
caml_callback2_exn:
|
caml_callback2_exn:
|
||||||
|
@ -473,6 +499,7 @@ caml_callback2_exn:
|
||||||
.type caml_callback2_exn, %function
|
.type caml_callback2_exn, %function
|
||||||
.size caml_callback2_exn, .-caml_callback2_exn
|
.size caml_callback2_exn, .-caml_callback2_exn
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_callback3_exn)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_callback3_exn
|
.globl caml_callback3_exn
|
||||||
caml_callback3_exn:
|
caml_callback3_exn:
|
||||||
|
@ -490,6 +517,7 @@ caml_callback3_exn:
|
||||||
.type caml_callback3_exn, %function
|
.type caml_callback3_exn, %function
|
||||||
.size caml_callback3_exn, .-caml_callback3_exn
|
.size caml_callback3_exn, .-caml_callback3_exn
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_ml_array_bound_error)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_ml_array_bound_error
|
.globl caml_ml_array_bound_error
|
||||||
caml_ml_array_bound_error:
|
caml_ml_array_bound_error:
|
||||||
|
|
|
@ -83,11 +83,27 @@
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Allocation functions and GC interface */
|
#if defined(FUNCTION_SECTIONS)
|
||||||
|
#define TEXT_SECTION(name) .section .text.##name,"ax",%progbits
|
||||||
|
#else
|
||||||
|
#define TEXT_SECTION(name)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(FUNCTION_SECTIONS)
|
||||||
|
TEXT_SECTION(caml_hot__code_begin)
|
||||||
|
.globl caml_hot__code_begin
|
||||||
|
caml_hot__code_begin:
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_hot__code_end)
|
||||||
|
.globl caml_hot__code_end
|
||||||
|
caml_hot__code_end:
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Allocation functions and GC interface */
|
||||||
.globl caml_system__code_begin
|
.globl caml_system__code_begin
|
||||||
caml_system__code_begin:
|
caml_system__code_begin:
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_call_gc)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_call_gc
|
.globl caml_call_gc
|
||||||
caml_call_gc:
|
caml_call_gc:
|
||||||
|
@ -177,6 +193,7 @@ caml_call_gc:
|
||||||
.type caml_call_gc, %function
|
.type caml_call_gc, %function
|
||||||
.size caml_call_gc, .-caml_call_gc
|
.size caml_call_gc, .-caml_call_gc
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_alloc1)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_alloc1
|
.globl caml_alloc1
|
||||||
caml_alloc1:
|
caml_alloc1:
|
||||||
|
@ -239,6 +256,7 @@ caml_alloc2:
|
||||||
.type caml_alloc2, %function
|
.type caml_alloc2, %function
|
||||||
.size caml_alloc2, .-caml_alloc2
|
.size caml_alloc2, .-caml_alloc2
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_alloc3)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_alloc3
|
.globl caml_alloc3
|
||||||
caml_alloc3:
|
caml_alloc3:
|
||||||
|
@ -268,6 +286,7 @@ caml_alloc3:
|
||||||
.type caml_alloc3, %function
|
.type caml_alloc3, %function
|
||||||
.size caml_alloc3, .-caml_alloc3
|
.size caml_alloc3, .-caml_alloc3
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_allocN)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_allocN
|
.globl caml_allocN
|
||||||
caml_allocN:
|
caml_allocN:
|
||||||
|
@ -300,6 +319,7 @@ caml_allocN:
|
||||||
/* Call a C function from OCaml */
|
/* Call a C function from OCaml */
|
||||||
/* Function to call is in ARG */
|
/* Function to call is in ARG */
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_c_call)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_c_call
|
.globl caml_c_call
|
||||||
caml_c_call:
|
caml_c_call:
|
||||||
|
@ -327,6 +347,7 @@ caml_c_call:
|
||||||
|
|
||||||
/* Start the OCaml program */
|
/* Start the OCaml program */
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_start_program)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_start_program
|
.globl caml_start_program
|
||||||
caml_start_program:
|
caml_start_program:
|
||||||
|
@ -423,6 +444,7 @@ caml_start_program:
|
||||||
|
|
||||||
/* Raise an exception from OCaml */
|
/* Raise an exception from OCaml */
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_raise_exn)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_raise_exn
|
.globl caml_raise_exn
|
||||||
caml_raise_exn:
|
caml_raise_exn:
|
||||||
|
@ -453,6 +475,7 @@ caml_raise_exn:
|
||||||
|
|
||||||
/* Raise an exception from C */
|
/* Raise an exception from C */
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_raise_exception)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_raise_exception
|
.globl caml_raise_exception
|
||||||
caml_raise_exception:
|
caml_raise_exception:
|
||||||
|
@ -487,6 +510,7 @@ caml_raise_exception:
|
||||||
|
|
||||||
/* Callback from C to OCaml */
|
/* Callback from C to OCaml */
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_callback_exn)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_callback_exn
|
.globl caml_callback_exn
|
||||||
caml_callback_exn:
|
caml_callback_exn:
|
||||||
|
@ -501,6 +525,7 @@ caml_callback_exn:
|
||||||
.type caml_callback_exn, %function
|
.type caml_callback_exn, %function
|
||||||
.size caml_callback_exn, .-caml_callback_exn
|
.size caml_callback_exn, .-caml_callback_exn
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_callback2_exn)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_callback2_exn
|
.globl caml_callback2_exn
|
||||||
caml_callback2_exn:
|
caml_callback2_exn:
|
||||||
|
@ -516,6 +541,7 @@ caml_callback2_exn:
|
||||||
.type caml_callback2_exn, %function
|
.type caml_callback2_exn, %function
|
||||||
.size caml_callback2_exn, .-caml_callback2_exn
|
.size caml_callback2_exn, .-caml_callback2_exn
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_callback3_exn)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_callback3_exn
|
.globl caml_callback3_exn
|
||||||
caml_callback3_exn:
|
caml_callback3_exn:
|
||||||
|
@ -533,6 +559,7 @@ caml_callback3_exn:
|
||||||
.type caml_callback3_exn, %function
|
.type caml_callback3_exn, %function
|
||||||
.size caml_callback3_exn, .-caml_callback3_exn
|
.size caml_callback3_exn, .-caml_callback3_exn
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_ml_array_bound_error)
|
||||||
.align 2
|
.align 2
|
||||||
.globl caml_ml_array_bound_error
|
.globl caml_ml_array_bound_error
|
||||||
caml_ml_array_bound_error:
|
caml_ml_array_bound_error:
|
||||||
|
|
|
@ -102,3 +102,5 @@
|
||||||
#undef CAML_SAFE_STRING
|
#undef CAML_SAFE_STRING
|
||||||
|
|
||||||
#undef FLAT_FLOAT_ARRAY
|
#undef FLAT_FLOAT_ARRAY
|
||||||
|
|
||||||
|
#undef FUNCTION_SECTIONS
|
||||||
|
|
|
@ -44,7 +44,20 @@
|
||||||
#define FUNCTION_ALIGN 2
|
#define FUNCTION_ALIGN 2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(FUNCTION_SECTIONS)
|
||||||
|
#if defined(SYS_macosx)
|
||||||
|
#define TEXT_SECTION(name) .text
|
||||||
|
#elif defined(SYS_mingw) || defined(SYS_cygwin)
|
||||||
|
#define TEXT_SECTION(name) .section .text.##name
|
||||||
|
#else
|
||||||
|
#define TEXT_SECTION(name) .section .text.##name,"ax",%progbits
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define TEXT_SECTION(name)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define FUNCTION(name) \
|
#define FUNCTION(name) \
|
||||||
|
TEXT_SECTION(name); \
|
||||||
.globl G(name); \
|
.globl G(name); \
|
||||||
.align FUNCTION_ALIGN; \
|
.align FUNCTION_ALIGN; \
|
||||||
G(name):
|
G(name):
|
||||||
|
@ -72,8 +85,17 @@
|
||||||
#define ALIGN_STACK(amount) subl $ amount, %esp ; CFI_ADJUST(amount)
|
#define ALIGN_STACK(amount) subl $ amount, %esp ; CFI_ADJUST(amount)
|
||||||
#define UNDO_ALIGN_STACK(amount) addl $ amount, %esp ; CFI_ADJUST(-amount)
|
#define UNDO_ALIGN_STACK(amount) addl $ amount, %esp ; CFI_ADJUST(-amount)
|
||||||
|
|
||||||
/* Allocation */
|
#if defined(FUNCTION_SECTIONS)
|
||||||
|
TEXT_SECTION(caml_hot__code_begin)
|
||||||
|
.globl G(caml_hot__code_begin)
|
||||||
|
G(caml_hot__code_begin):
|
||||||
|
|
||||||
|
TEXT_SECTION(caml_hot__code_end)
|
||||||
|
.globl G(caml_hot__code_end)
|
||||||
|
G(caml_hot__code_end):
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Allocation */
|
||||||
.text
|
.text
|
||||||
.globl G(caml_system__code_begin)
|
.globl G(caml_system__code_begin)
|
||||||
G(caml_system__code_begin):
|
G(caml_system__code_begin):
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
(* TEST
|
||||||
|
* native
|
||||||
|
*)
|
||||||
|
|
||||||
|
(* Test for anonymous functions which result in a mangled symbol *)
|
||||||
|
let f4 list =
|
||||||
|
List.map (fun s -> String.length s) list
|
||||||
|
|
||||||
|
let test1 () =
|
||||||
|
f4 ["a";"asfda";"afda"]
|
||||||
|
|
||||||
|
(* Test for jump tables*)
|
||||||
|
|
||||||
|
let g1 s = s^"*"
|
||||||
|
let g2 s = "*"^s
|
||||||
|
let g3 s = "*"^s^"*"
|
||||||
|
|
||||||
|
let f5 = function
|
||||||
|
| 1 -> g1 "a"
|
||||||
|
| 2 -> g2 "b"
|
||||||
|
| 3 -> g3 "c"
|
||||||
|
| 4 -> g1 "d"
|
||||||
|
| 5 -> g2 "e"
|
||||||
|
| 6 -> g3 "f"
|
||||||
|
| _ -> "x"
|
||||||
|
|
||||||
|
let test2 () =
|
||||||
|
let list = [f5 5;
|
||||||
|
f5 7;
|
||||||
|
f5 15;
|
||||||
|
f5 26]
|
||||||
|
in
|
||||||
|
ignore list
|
||||||
|
|
||||||
|
let iter = 1_000
|
||||||
|
|
||||||
|
let f0 x = x - 7;
|
||||||
|
[@@inline never]
|
||||||
|
|
||||||
|
let f1 x = x + iter
|
||||||
|
[@@inline never]
|
||||||
|
|
||||||
|
let f2 x = f1(x)
|
||||||
|
[@@inline never]
|
||||||
|
|
||||||
|
let f3 x = f2(x)*f0(x)
|
||||||
|
[@@inline never]
|
||||||
|
|
||||||
|
let test3 () =
|
||||||
|
f3 iter
|
||||||
|
|
||||||
|
|
||||||
|
let () =
|
||||||
|
ignore (test1 ());
|
||||||
|
ignore (test2 ());
|
||||||
|
ignore (test3 ());
|
||||||
|
()
|
|
@ -9,3 +9,4 @@ static_float_array_flambda.ml
|
||||||
static_float_array_flambda_opaque.ml
|
static_float_array_flambda_opaque.ml
|
||||||
unrolling_flambda2.ml
|
unrolling_flambda2.ml
|
||||||
unrolling_flambda.ml
|
unrolling_flambda.ml
|
||||||
|
func_sections.ml
|
||||||
|
|
|
@ -110,6 +110,7 @@ config.ml: config.mlp $(ROOTDIR)/Makefile.config Makefile
|
||||||
$(call SUBST,WITH_SPACETIME) \
|
$(call SUBST,WITH_SPACETIME) \
|
||||||
$(call SUBST,ENABLE_CALL_COUNTS) \
|
$(call SUBST,ENABLE_CALL_COUNTS) \
|
||||||
$(call SUBST,FLAT_FLOAT_ARRAY) \
|
$(call SUBST,FLAT_FLOAT_ARRAY) \
|
||||||
|
$(call SUBST,FUNCTION_SECTIONS) \
|
||||||
$(call SUBST,CC_HAS_DEBUG_PREFIX_MAP) \
|
$(call SUBST,CC_HAS_DEBUG_PREFIX_MAP) \
|
||||||
$(call SUBST,AS_HAS_DEBUG_PREFIX_MAP) \
|
$(call SUBST,AS_HAS_DEBUG_PREFIX_MAP) \
|
||||||
$< > $@
|
$< > $@
|
||||||
|
|
|
@ -223,6 +223,10 @@ val flat_float_array : bool
|
||||||
(** Whether the compiler and runtime automagically flatten float
|
(** Whether the compiler and runtime automagically flatten float
|
||||||
arrays *)
|
arrays *)
|
||||||
|
|
||||||
|
val function_sections : bool
|
||||||
|
(** Whether the compiler was configured to generate
|
||||||
|
functions in separate section *)
|
||||||
|
|
||||||
val windows_unicode: bool
|
val windows_unicode: bool
|
||||||
(** Whether Windows Unicode runtime is enabled *)
|
(** Whether Windows Unicode runtime is enabled *)
|
||||||
|
|
||||||
|
|
|
@ -80,6 +80,7 @@ let supports_shared_libraries = %%SUPPORTS_SHARED_LIBRARIES%%
|
||||||
|
|
||||||
let flat_float_array = %%FLAT_FLOAT_ARRAY%%
|
let flat_float_array = %%FLAT_FLOAT_ARRAY%%
|
||||||
|
|
||||||
|
let function_sections = %%FUNCTION_SECTIONS%%
|
||||||
let afl_instrument = %%AFL_INSTRUMENT%%
|
let afl_instrument = %%AFL_INSTRUMENT%%
|
||||||
|
|
||||||
let exec_magic_number = "Caml1999X025"
|
let exec_magic_number = "Caml1999X025"
|
||||||
|
@ -195,6 +196,7 @@ let configuration_variables =
|
||||||
p_bool "safe_string" safe_string;
|
p_bool "safe_string" safe_string;
|
||||||
p_bool "default_safe_string" default_safe_string;
|
p_bool "default_safe_string" default_safe_string;
|
||||||
p_bool "flat_float_array" flat_float_array;
|
p_bool "flat_float_array" flat_float_array;
|
||||||
|
p_bool "function_sections" function_sections;
|
||||||
p_bool "afl_instrument" afl_instrument;
|
p_bool "afl_instrument" afl_instrument;
|
||||||
p_bool "windows_unicode" windows_unicode;
|
p_bool "windows_unicode" windows_unicode;
|
||||||
p_bool "supports_shared_libraries" supports_shared_libraries;
|
p_bool "supports_shared_libraries" supports_shared_libraries;
|
||||||
|
|
Loading…
Reference in New Issue