From 1ed1787a12494845c1519e5f33bb4f0c0c439f5d Mon Sep 17 00:00:00 2001 From: Max Slater Date: Fri, 9 Jun 2023 17:32:41 -0400 Subject: [PATCH 01/81] basic backend support for 128bit mach type --- backend/amd64/emit.mlp | 25 ++++++--- backend/amd64/proc.ml | 16 +++--- backend/cmm.ml | 81 +++++++++++++++++++--------- backend/cmm.mli | 5 ++ backend/cmm_helpers.ml | 40 +++++++++----- backend/cmm_helpers.mli | 1 + backend/debug/reg_with_debug_info.ml | 2 +- backend/printcmm.ml | 3 ++ backend/printmach.ml | 7 ++- backend/reg.ml | 2 + backend/selectgen.ml | 1 + backend/x86_ast.mli | 5 +- backend/x86_binary_emitter.ml | 11 ++++ backend/x86_dsl.ml | 1 + backend/x86_dsl.mli | 1 + backend/x86_gas.ml | 3 +- backend/x86_masm.ml | 5 +- file_formats/cmx_format.mli | 2 +- ocaml/typing/predef.ml | 4 ++ ocaml/typing/predef.mli | 2 + 20 files changed, 157 insertions(+), 60 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 7458994e402..48d57455119 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -673,10 +673,17 @@ let emit_global_label s = let move (src : Reg.t) (dst : Reg.t) = if src.loc <> dst.loc then begin match src.typ, src.loc, dst.typ, dst.loc with - | Float, Reg.Reg _, Float, Reg.Reg _ -> I.movapd (reg src) (reg dst) + | Float, Reg.Reg _, Float, Reg.Reg _ + | Vec128, Reg.Reg _, Vec128, Reg.Reg _ -> I.movapd (reg src) (reg dst) + (* CR mslater: alignment *) + | Vec128, _, Vec128, _ -> I.movupd (reg src) (reg dst) | Float, _, Float, _ -> I.movsd (reg src) (reg dst) | Float, _, Int, _ | Int, _, Float, _ -> I.movq (reg src) (reg dst) + | Vec128, _, _, _ | _, _, Vec128, _ -> + Misc.fatal_errorf + "Illegal move between a vector and non-vector register (%s to %s)\n" + (Reg.name src) (Reg.name dst) | _ -> I.mov (reg src) (reg dst) end @@ -688,7 +695,7 @@ let stack_to_stack_move (src : Reg.t) (dst : Reg.t) = (* Not calling move because r15 is not in int_reg_name. *) I.mov (reg src) r15; I.mov r15 (reg dst) - | Float | Addr -> + | Float | Addr | Vec128 -> Misc.fatal_errorf "Unexpected register type for stack to stack move: from %s to %s\n" (Reg.name src) (Reg.name dst) @@ -956,11 +963,14 @@ let emit_instr fallthrough i = | Sixteen_unsigned -> I.movzx (addressing addr WORD i 0) dest | Sixteen_signed -> - I.movsx (addressing addr WORD i 0) dest; + I.movsx (addressing addr WORD i 0) dest | Thirtytwo_unsigned -> I.mov (addressing addr DWORD i 0) (res32 i 0) | Thirtytwo_signed -> I.movsxd (addressing addr DWORD i 0) dest + | Onetwentyeight -> + (* CR mslater: alignment *) + I.movupd (addressing addr VEC128 i 0) dest | Single -> I.cvtss2sd (addressing addr REAL4 i 0) dest | Double -> @@ -976,6 +986,9 @@ let emit_instr fallthrough i = I.mov (arg16 i 0) (addressing addr WORD i 1) | Thirtytwo_signed | Thirtytwo_unsigned -> I.mov (arg32 i 0) (addressing addr DWORD i 1) + | Onetwentyeight -> + (* CR mslater: alignment *) + I.movupd (arg i 0) (addressing addr VEC128 i 1) | Single -> I.cvtsd2ss (arg i 0) xmm15; I.movss xmm15 (addressing addr REAL4 i 1) @@ -1099,9 +1112,9 @@ let emit_instr fallthrough i = I.movq a0 (res i 0); I.neg (res i 0) | Lop(Inegf) -> - I.xorpd (mem64_rip OWORD (emit_symbol "caml_negf_mask")) (res i 0) + I.xorpd (mem64_rip VEC128 (emit_symbol "caml_negf_mask")) (res i 0) | Lop(Iabsf) -> - I.andpd (mem64_rip OWORD (emit_symbol "caml_absf_mask")) (res i 0) + I.andpd (mem64_rip VEC128 (emit_symbol "caml_absf_mask")) (res i 0) | Lop(Iaddf | Isubf | Imulf | Idivf as floatop) -> instr_for_floatop floatop (arg i 1) (res i 0) | Lop(Ifloatofint) -> @@ -1683,7 +1696,7 @@ let emit_probe_handler_wrapper p = | Stack (Outgoing k) -> (match r.typ with | Val -> k::acc - | Int | Float -> acc + | Int | Float | Vec128 -> acc | Addr -> Misc.fatal_error ("bad GC root " ^ Reg.name r)) | _ -> assert false) saved_live diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 2bb29f951cb..0461681eb5c 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -102,7 +102,7 @@ let num_register_classes = 2 let register_class r = match r.typ with | Val | Int | Addr -> 0 - | Float -> 1 + | Float | Vec128 -> 1 let register_class_tag c = match c with @@ -182,12 +182,12 @@ let calling_conventions first_int last_int first_float last_float ofs := !ofs + size_int end; assert (not (Reg.Set.mem loc.(i) destroyed_by_plt_stub_set)) - | Float -> + | (Float | Vec128 as ty) -> if !float <= last_float then begin loc.(i) <- phys_reg !float; incr float end else begin - loc.(i) <- stack_slot (make_stack !ofs) Float; + loc.(i) <- stack_slot (make_stack !ofs) ty; ofs := !ofs + size_float end done; @@ -258,12 +258,12 @@ let win64_loc_external_arguments arg = loc.(i) <- stack_slot (Outgoing !ofs) ty; ofs := !ofs + size_int end - | Float -> + | (Float | Vec128) as ty -> if !reg < 4 then begin loc.(i) <- phys_reg win64_float_external_arguments.(!reg); incr reg end else begin - loc.(i) <- stack_slot (Outgoing !ofs) Float; + loc.(i) <- stack_slot (Outgoing !ofs) ty; ofs := !ofs + size_float end done; @@ -359,7 +359,7 @@ let destroyed_at_oper = function | Iop(Iintop_atomic _) | Iop(Istore((Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Word_val - | Double ), _, _)) + | Double | Onetwentyeight ), _, _)) | Iop(Imove | Ispill | Ireload | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf | Icompf _ | Icsel _ @@ -406,7 +406,7 @@ let destroyed_at_basic (basic : Cfg_intf.S.basic) = | Load _ | Store ((Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Word_val - | Double ), _, _) + | Double | Onetwentyeight ), _, _) | Intop (Iadd | Isub | Imul | Iand | Ior | Ixor | Ilsl | Ilsr | Iasr | Ipopcnt | Iclz _ | Ictz _) | Intop_imm ((Iadd | Isub | Imul | Imulh _ | Iand | Ior | Ixor @@ -536,7 +536,7 @@ let max_register_pressure = | Iintop_atomic _ | Istore((Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Word_val - | Double ), + | Double | Onetwentyeight ), _, _) | Imove | Ispill | Ireload | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf | Icsel _ diff --git a/backend/cmm.ml b/backend/cmm.ml index 87034fab329..5810b16da65 100644 --- a/backend/cmm.ml +++ b/backend/cmm.ml @@ -18,6 +18,7 @@ type machtype_component = Cmx_format.machtype_component = | Addr | Int | Float + | Vec128 type machtype = machtype_component array @@ -26,13 +27,14 @@ let typ_val = [|Val|] let typ_addr = [|Addr|] let typ_int = [|Int|] let typ_float = [|Float|] +let typ_vec128 = [|Vec128|] (** [machtype_component]s are partially ordered as follows: - Addr Float - ^ - | - Val + Addr Vec128 + ^ ^ + | | + Val Float ^ | Int @@ -56,8 +58,11 @@ let lub_component comp1 comp2 = | Addr, Addr -> Addr | Addr, Val -> Addr | Float, Float -> Float - | (Int | Addr | Val), Float - | Float, (Int | Addr | Val) -> + | Float, Vec128 -> Vec128 + | Vec128, Float -> Vec128 + | Vec128, Vec128 -> Vec128 + | (Int | Addr | Val), (Float | Vec128) + | (Float | Vec128), (Int | Addr | Val) -> (* Float unboxing code must be sure to avoid this case. *) assert false @@ -73,8 +78,11 @@ let ge_component comp1 comp2 = | Addr, Addr -> true | Addr, Val -> true | Float, Float -> true - | (Int | Addr | Val), Float - | Float, (Int | Addr | Val) -> + | Float, Vec128 -> false + | Vec128, Float -> true + | Vec128, Vec128 -> true + | (Int | Addr | Val), (Float | Vec128) + | (Float | Vec128), (Int | Addr | Val) -> assert false type exttype = @@ -82,12 +90,14 @@ type exttype = | XInt32 | XInt64 | XFloat + | XVec128 let machtype_of_exttype = function | XInt -> typ_int | XInt32 -> typ_int | XInt64 -> if Arch.size_int = 4 then [|Int;Int|] else typ_int | XFloat -> typ_float + | XVec128 -> typ_vec128 let machtype_of_exttype_list xtl = Array.concat (List.map machtype_of_exttype xtl) @@ -182,6 +192,7 @@ type memory_chunk = | Word_val | Single | Double + | Onetwentyeight and operation = Capply of machtype * Lambda.region_close @@ -488,10 +499,12 @@ let equal_machtype_component left right = | Addr, Addr -> true | Int, Int -> true | Float, Float -> true - | Val, (Addr | Int | Float) - | Addr, (Val | Int | Float) - | Int, (Val | Addr | Float) - | Float, (Val | Addr | Int) -> + | Vec128, Vec128 -> true + | Val, (Addr | Int | Float | Vec128) + | Addr, (Val | Int | Float | Vec128) + | Int, (Val | Addr | Float | Vec128) + | Float, (Val | Addr | Int | Vec128) + | Vec128, (Val | Addr | Int | Float) -> false let equal_exttype left right = @@ -500,10 +513,12 @@ let equal_exttype left right = | XInt32, XInt32 -> true | XInt64, XInt64 -> true | XFloat, XFloat -> true - | XInt, (XInt32 | XInt64 | XFloat) - | XInt32, (XInt | XInt64 | XFloat) - | XInt64, (XInt | XInt32 | XFloat) - | XFloat, (XInt | XInt32 | XInt64) -> + | XVec128, XVec128 -> true + | XInt, (XInt32 | XInt64 | XFloat | XVec128) + | XInt32, (XInt | XInt64 | XFloat | XVec128) + | XInt64, (XInt | XInt32 | XFloat | XVec128) + | XFloat, (XInt | XInt32 | XInt64 | XVec128) + | XVec128, (XInt | XInt32 | XInt64 | XFloat) -> false let equal_float_comparison left right = @@ -542,26 +557,40 @@ let equal_memory_chunk left right = | Word_val, Word_val -> true | Single, Single -> true | Double, Double -> true + | Onetwentyeight, Onetwentyeight -> true | Byte_unsigned, (Byte_signed | Sixteen_unsigned | Sixteen_signed | Thirtytwo_unsigned - | Thirtytwo_signed | Word_int | Word_val | Single | Double) + | Thirtytwo_signed | Word_int | Word_val | Single | Double + | Onetwentyeight) | Byte_signed, (Byte_unsigned | Sixteen_unsigned | Sixteen_signed | Thirtytwo_unsigned - | Thirtytwo_signed | Word_int | Word_val | Single | Double) + | Thirtytwo_signed | Word_int | Word_val | Single | Double + | Onetwentyeight) | Sixteen_unsigned, (Byte_unsigned | Byte_signed | Sixteen_signed | Thirtytwo_unsigned - | Thirtytwo_signed | Word_int | Word_val | Single | Double) + | Thirtytwo_signed | Word_int | Word_val | Single | Double + | Onetwentyeight) | Sixteen_signed, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Thirtytwo_unsigned - | Thirtytwo_signed | Word_int | Word_val | Single | Double) + | Thirtytwo_signed | Word_int | Word_val | Single | Double + | Onetwentyeight) | Thirtytwo_unsigned, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed - | Thirtytwo_signed | Word_int | Word_val | Single | Double) + | Thirtytwo_signed | Word_int | Word_val | Single | Double + | Onetwentyeight) | Thirtytwo_signed, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed - | Thirtytwo_unsigned | Word_int | Word_val | Single | Double) + | Thirtytwo_unsigned | Word_int | Word_val | Single | Double + | Onetwentyeight) | Word_int, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed - | Thirtytwo_unsigned | Thirtytwo_signed | Word_val | Single | Double) + | Thirtytwo_unsigned | Thirtytwo_signed | Word_val | Single | Double + | Onetwentyeight) | Word_val, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed - | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Single | Double) + | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Single | Double + | Onetwentyeight) | Single, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed - | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Word_val | Double) + | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Word_val | Double + | Onetwentyeight) | Double, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed - | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Word_val | Single) -> + | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Word_val | Single + | Onetwentyeight) + | Onetwentyeight, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed + | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Word_val | Single + | Double) -> false let equal_integer_comparison left right = diff --git a/backend/cmm.mli b/backend/cmm.mli index 4afc8c87c1f..d9ba36c9f41 100644 --- a/backend/cmm.mli +++ b/backend/cmm.mli @@ -20,6 +20,7 @@ type machtype_component = Cmx_format.machtype_component = | Addr | Int | Float + | Vec128 (* - [Val] denotes a valid OCaml value: either a pointer to the beginning of a heap block, an infix pointer if it is preceded by the correct @@ -73,6 +74,7 @@ type exttype = | XInt32 (**r 32-bit integer *) | XInt64 (**r 64-bit integer *) | XFloat (**r double-precision FP number *) + | XVec128 (**r 128-bit vector *) (** A variant of [machtype] used to describe arguments to external C functions *) @@ -178,6 +180,9 @@ type memory_chunk = | Single | Double (* word-aligned 64-bit float see PR#10433 *) + | Onetwentyeight (* word-aligned 128-bit vector + CR mslater: alignment *) + and operation = Capply of machtype * Lambda.region_close | Cextcall of diff --git a/backend/cmm_helpers.ml b/backend/cmm_helpers.ml index 2a9fbcf7535..0e9da686791 100644 --- a/backend/cmm_helpers.ml +++ b/backend/cmm_helpers.ml @@ -1019,6 +1019,7 @@ module Extended_machtype_component = struct | Tagged_int | Any_int | Float + | Vec128 let of_machtype_component (component : machtype_component) = match component with @@ -1026,6 +1027,7 @@ module Extended_machtype_component = struct | Addr -> Addr | Int -> Any_int | Float -> Float + | Vec128 -> Vec128 let to_machtype_component t : machtype_component = match t with @@ -1033,6 +1035,7 @@ module Extended_machtype_component = struct | Addr -> Addr | Tagged_int | Any_int -> Int | Float -> Float + | Vec128 -> Vec128 let change_tagged_int_to_val t : machtype_component = match t with @@ -1041,6 +1044,7 @@ module Extended_machtype_component = struct | Tagged_int -> Val | Any_int -> Int | Float -> Float + | Vec128 -> Vec128 end module Extended_machtype = struct @@ -1056,6 +1060,8 @@ module Extended_machtype = struct let typ_float = [| Extended_machtype_component.Float |] + let typ_vec128 = [| Extended_machtype_component.Vec128 |] + let typ_void = [||] let of_machtype machtype = @@ -1093,6 +1099,7 @@ let machtype_identifier t = | Val -> 'V' | Int -> 'I' | Float -> 'F' + | Vec128 -> 'X' | Addr -> Misc.fatal_error "[Addr] is forbidden inside arity for generic functions" in @@ -2738,17 +2745,17 @@ let tuplify_function arity return = let max_arity_optimized = 15 +let ints_per_8b = if Arch.size_int = 4 then 2 else 1 + let machtype_stored_size t = - if Arch.size_int = 4 - then - Array.fold_left - (fun cur c -> - match c with - | Addr -> Misc.fatal_error "[Addr] cannot be stored" - | Val | Int -> cur + 1 - | Float -> cur + 2) - 0 t - else Array.length t + Array.fold_left + (fun cur c -> + match c with + | Addr -> Misc.fatal_error "[Addr] cannot be stored" + | Val | Int -> cur + 1 + | Float -> cur + ints_per_8b + | Vec128 -> cur + (2 * ints_per_8b)) + 0 t let machtype_non_scanned_size t = Array.fold_left @@ -2757,7 +2764,8 @@ let machtype_non_scanned_size t = | Addr -> Misc.fatal_error "[Addr] cannot be stored" | Val -> cur | Int -> cur + 1 - | Float -> cur + if Arch.size_int = 4 then 2 else 1) + | Float -> cur + ints_per_8b + | Vec128 -> cur + (2 * ints_per_8b)) 0 t let make_tuple l = match l with [e] -> e | _ -> Ctuple l @@ -2766,7 +2774,10 @@ let value_slot_given_machtype vs = let non_scanned, scanned = List.partition (fun (_, c) -> - match c with Int | Float -> true | Val -> false | Addr -> assert false) + match c with + | Int | Float | Vec128 -> true + | Val -> false + | Addr -> assert false) vs in List.map (fun (v, _) -> Cvar v) (non_scanned @ scanned) @@ -2782,8 +2793,11 @@ let read_from_closure_given_machtype t clos base_offset dbg = | Int -> (non_scanned_pos + 1, scanned_pos), load Word_int non_scanned_pos | Float -> - ( ((non_scanned_pos + if Arch.size_int = 4 then 2 else 1), scanned_pos), + ( (non_scanned_pos + ints_per_8b, scanned_pos), load Double non_scanned_pos ) + | Vec128 -> + ( (non_scanned_pos + (2 * ints_per_8b), scanned_pos), + load Onetwentyeight non_scanned_pos ) | Val -> (non_scanned_pos, scanned_pos + 1), load Word_val scanned_pos | Addr -> Misc.fatal_error "[Addr] cannot be read") (base_offset, base_offset + machtype_non_scanned_size t) diff --git a/backend/cmm_helpers.mli b/backend/cmm_helpers.mli index 0f7be44240d..33627e7d6de 100644 --- a/backend/cmm_helpers.mli +++ b/backend/cmm_helpers.mli @@ -372,6 +372,7 @@ module Extended_machtype_component : sig | Tagged_int | Any_int | Float + | Vec128 end module Extended_machtype : sig diff --git a/backend/debug/reg_with_debug_info.ml b/backend/debug/reg_with_debug_info.ml index 9d36d9be824..0cfd23a1f17 100644 --- a/backend/debug/reg_with_debug_info.ml +++ b/backend/debug/reg_with_debug_info.ml @@ -99,7 +99,7 @@ let reg t = t.reg let location t = t.reg.loc let holds_pointer t = - match t.reg.typ with Addr | Val -> true | Int | Float -> false + match t.reg.typ with Addr | Val -> true | Int | Float | Vec128 -> false let holds_non_pointer t = not (holds_pointer t) diff --git a/backend/printcmm.ml b/backend/printcmm.ml index 8b4eae9bdc8..360326ed3b4 100644 --- a/backend/printcmm.ml +++ b/backend/printcmm.ml @@ -34,6 +34,7 @@ let machtype_component ppf = function | Addr -> fprintf ppf "addr" | Int -> fprintf ppf "int" | Float -> fprintf ppf "float" + | Vec128 -> fprintf ppf "vec128" let machtype ppf mty = match Array.length mty with @@ -48,6 +49,7 @@ let exttype ppf = function | XInt32 -> fprintf ppf "int32" | XInt64 -> fprintf ppf "int64" | XFloat -> fprintf ppf "float" + | XVec128 -> fprintf ppf "vec128" let extcall_signature ppf (ty_res, ty_args) = begin match ty_args with @@ -97,6 +99,7 @@ let chunk = function | Sixteen_signed -> "signed int16" | Thirtytwo_unsigned -> "unsigned int32" | Thirtytwo_signed -> "signed int32" + | Onetwentyeight -> "vec128" | Word_int -> "int" | Word_val -> "val" | Single -> "float32" diff --git a/backend/printmach.ml b/backend/printmach.ml index 7ffc5457a16..26917f80e91 100644 --- a/backend/printmach.ml +++ b/backend/printmach.ml @@ -43,7 +43,12 @@ let reg ppf r = fprintf ppf "%s" (Reg.name r) else fprintf ppf "%s" - (match r.typ with Val -> "V" | Addr -> "A" | Int -> "I" | Float -> "F"); + (match r.typ with + | Val -> "V" + | Addr -> "A" + | Int -> "I" + | Float -> "F" + | Vec128 -> "X"); fprintf ppf "/%i" r.stamp; loc ~wrap_out:(fun ppf f -> fprintf ppf "[%t]" f) diff --git a/backend/reg.ml b/backend/reg.ml index 1b302a9e765..f2a345bd1b1 100644 --- a/backend/reg.ml +++ b/backend/reg.ml @@ -114,6 +114,7 @@ let clear_visited_marks () = let create ty = + (* CR mslater: should we start vector registers with a higher spill cost? *) let r = { raw_name = Raw_name.Anon; stamp = !currstamp; typ = ty; loc = Unknown; irc_work_list = Unknown_list; irc_color = None; irc_alias = None; @@ -195,6 +196,7 @@ let is_reg t = let size_of_contents_in_bytes t = match t.typ with + | Vec128 -> 16 | Float -> Arch.size_float | Addr -> assert (Arch.size_addr = Arch.size_int); diff --git a/backend/selectgen.ml b/backend/selectgen.ml index cc33b0ed374..bce37532fc4 100644 --- a/backend/selectgen.ml +++ b/backend/selectgen.ml @@ -236,6 +236,7 @@ let size_component = function | Val | Addr -> Arch.size_addr | Int -> Arch.size_int | Float -> Arch.size_float + | Vec128 -> 16 let size_machtype mty = let size = ref 0 in diff --git a/backend/x86_ast.mli b/backend/x86_ast.mli index 25c054f2f12..40d69174624 100644 --- a/backend/x86_ast.mli +++ b/backend/x86_ast.mli @@ -57,7 +57,8 @@ type constant = type data_type = | NONE | REAL4 | REAL8 (* floating point values *) - | BYTE | WORD | DWORD | QWORD | OWORD (* integer values *) + | BYTE | WORD | DWORD | QWORD (* integer values *) + | VEC128 (* vector values (float & integer) *) | NEAR | PROC type reg64 = @@ -179,6 +180,7 @@ type instruction = | MINSD of arg * arg | MOV of arg * arg | MOVAPD of arg * arg + | MOVUPD of arg * arg | MOVD of arg * arg | MOVQ of arg * arg | MOVLPD of arg * arg @@ -268,3 +270,4 @@ type asm_line = | Direct_assignment of string * constant type asm_program = asm_line list + diff --git a/backend/x86_binary_emitter.ml b/backend/x86_binary_emitter.ml index 425c78acd96..e4d0db305a1 100644 --- a/backend/x86_binary_emitter.ml +++ b/backend/x86_binary_emitter.ml @@ -573,6 +573,16 @@ let emit_movapd b dst src = emit_mod_rm_reg b 0 [ 0x0f; 0x29 ] rm (rd_of_regf reg) | _ -> assert false +let emit_movupd b dst src = + match (dst, src) with + | Regf reg, ((Regf _ | Mem _ | Mem64_RIP _) as rm) -> + buf_int8 b 0x66; + emit_mod_rm_reg b 0 [ 0x0f; 0x10 ] rm (rd_of_regf reg) + | ((Mem _ | Mem64_RIP _) as rm), Regf reg -> + buf_int8 b 0x66; + emit_mod_rm_reg b 0 [ 0x0f; 0x11 ] rm (rd_of_regf reg) + | _ -> assert false + let emit_movd b ~dst ~src = match (dst, src) with | Regf reg, ((Reg32 _ | Mem _ | Mem64_RIP _) as rm) -> @@ -1567,6 +1577,7 @@ let assemble_instr b loc = function | MINSD (src, dst) -> emit_minsd b ~dst ~src | MOV (src, dst) -> emit_MOV b dst src | MOVAPD (src, dst) -> emit_movapd b dst src + | MOVUPD (src, dst) -> emit_movupd b dst src | MOVD (src, dst) -> emit_movd b ~dst ~src | MOVQ (src, dst) -> emit_movq b ~dst ~src | MOVLPD (src, dst) -> emit_movlpd b dst src diff --git a/backend/x86_dsl.ml b/backend/x86_dsl.ml index e99711898e8..875538061d2 100644 --- a/backend/x86_dsl.ml +++ b/backend/x86_dsl.ml @@ -192,6 +192,7 @@ module I = struct let minsd x y = emit (MINSD (x,y)) let mov x y = emit (MOV (x, y)) let movapd x y = emit (MOVAPD (x, y)) + let movupd x y = emit (MOVUPD (x, y)) let movd x y = emit (MOVD (x, y)) let movq x y = emit (MOVQ (x, y)) let movsd x y = emit (MOVSD (x, y)) diff --git a/backend/x86_dsl.mli b/backend/x86_dsl.mli index f00f56f285c..f6dc911040d 100644 --- a/backend/x86_dsl.mli +++ b/backend/x86_dsl.mli @@ -187,6 +187,7 @@ module I : sig val minsd: arg -> arg -> unit val mov: arg -> arg -> unit val movapd: arg -> arg -> unit + val movupd: arg -> arg -> unit val movd: arg -> arg -> unit val movq: arg -> arg -> unit val movsd: arg -> arg -> unit diff --git a/backend/x86_gas.ml b/backend/x86_gas.ml index 76fdff5229b..dec63f54682 100644 --- a/backend/x86_gas.ml +++ b/backend/x86_gas.ml @@ -99,7 +99,7 @@ let suf arg = | QWORD -> "q" | REAL4 -> "s" | NONE -> "" - | OWORD | NEAR | PROC -> assert false + | VEC128 | NEAR | PROC -> assert false let i0 b s = bprintf b "\t%s" s let i1 b s x = bprintf b "\t%s\t%a" s arg x @@ -204,6 +204,7 @@ let print_instr b = function i2 b "movabsq" arg1 arg2 | MOV (arg1, arg2) -> i2_s b "mov" arg1 arg2 | MOVAPD (arg1, arg2) -> i2 b "movapd" arg1 arg2 + | MOVUPD (arg1, arg2) -> i2 b "movupd" arg1 arg2 | MOVD (arg1, arg2) -> i2 b "movd" arg1 arg2 | MOVQ (arg1, arg2) -> i2 b "movq" arg1 arg2 | MOVLPD (arg1, arg2) -> i2 b "movlpd" arg1 arg2 diff --git a/backend/x86_masm.ml b/backend/x86_masm.ml index 0c691eb56fb..31c93c0ce6b 100644 --- a/backend/x86_masm.ml +++ b/backend/x86_masm.ml @@ -19,8 +19,8 @@ open X86_proc let bprintf = Printf.bprintf let string_of_datatype = function + | VEC128 -> "VEC128" | QWORD -> "QWORD" - | OWORD -> "OWORD" | NONE -> assert false | REAL4 -> "REAL4" | REAL8 -> "REAL8" @@ -32,8 +32,8 @@ let string_of_datatype = function let string_of_datatype_ptr = function + | VEC128 -> "VEC128 PTR " | QWORD -> "QWORD PTR " - | OWORD -> "OWORD PTR " | NONE -> "" | REAL4 -> "REAL4 PTR " | REAL8 -> "REAL8 PTR " @@ -195,6 +195,7 @@ let print_instr b = function i2 b "mov" arg1 (Reg32 r) | MOV (arg1, arg2) -> i2 b "mov" arg1 arg2 | MOVAPD (arg1, arg2) -> i2 b "movapd" arg1 arg2 + | MOVUPD (arg1, arg2) -> i2 b "movupd" arg1 arg2 | MOVD (arg1, arg2) -> i2 b "movd" arg1 arg2 | MOVQ (arg1, arg2) -> i2 b "movq" arg1 arg2 | MOVLPD (arg1, arg2) -> i2 b "movlpd" arg1 arg2 diff --git a/file_formats/cmx_format.mli b/file_formats/cmx_format.mli index 5d7fabc45fd..ef686fab74c 100644 --- a/file_formats/cmx_format.mli +++ b/file_formats/cmx_format.mli @@ -42,7 +42,7 @@ type export_info_raw = | Flambda2_raw of Flambda2_cmx.Flambda_cmx_format.raw option (* Declare machtype here to avoid depending on [Cmm]. *) -type machtype_component = Val | Addr | Int | Float +type machtype_component = Val | Addr | Int | Float | Vec128 type machtype = machtype_component array type apply_fn := machtype list * machtype * Lambda.alloc_mode diff --git a/ocaml/typing/predef.ml b/ocaml/typing/predef.ml index 192ae714a2e..50d1da7a73d 100644 --- a/ocaml/typing/predef.ml +++ b/ocaml/typing/predef.ml @@ -44,6 +44,7 @@ and ident_option = ident_create "option" and ident_nativeint = ident_create "nativeint" and ident_int32 = ident_create "int32" and ident_int64 = ident_create "int64" +and ident_vec128 = ident_create "vec128" and ident_lazy_t = ident_create "lazy_t" and ident_string = ident_create "string" and ident_extension_constructor = ident_create "extension_constructor" @@ -66,6 +67,7 @@ and path_option = Pident ident_option and path_nativeint = Pident ident_nativeint and path_int32 = Pident ident_int32 and path_int64 = Pident ident_int64 +and path_vec128 = Pident ident_vec128 and path_lazy_t = Pident ident_lazy_t and path_string = Pident ident_string and path_extension_constructor = Pident ident_extension_constructor @@ -86,6 +88,7 @@ and type_option t = newgenty (Tconstr(path_option, [t], ref Mnil)) and type_nativeint = newgenty (Tconstr(path_nativeint, [], ref Mnil)) and type_int32 = newgenty (Tconstr(path_int32, [], ref Mnil)) and type_int64 = newgenty (Tconstr(path_int64, [], ref Mnil)) +and type_vec128 = newgenty (Tconstr(path_vec128, [], ref Mnil)) and type_lazy_t t = newgenty (Tconstr(path_lazy_t, [t], ref Mnil)) and type_string = newgenty (Tconstr(path_string, [], ref Mnil)) and type_extension_constructor = @@ -236,6 +239,7 @@ let common_initial_env add_type add_extension empty_env = |> add_type ident_int ~layout:(Layout.immediate ~why:(Primitive ident_int)) |> add_type ident_int32 |> add_type ident_int64 + |> add_type ident_vec128 |> add_type1 ident_lazy_t ~variance:Variance.covariant ~separability:Separability.Ind diff --git a/ocaml/typing/predef.mli b/ocaml/typing/predef.mli index 77656a3227c..ec53f19b386 100644 --- a/ocaml/typing/predef.mli +++ b/ocaml/typing/predef.mli @@ -33,6 +33,7 @@ val type_option: type_expr -> type_expr val type_nativeint: type_expr val type_int32: type_expr val type_int64: type_expr +val type_vec128: type_expr val type_lazy_t: type_expr -> type_expr val type_extension_constructor:type_expr val type_floatarray:type_expr @@ -52,6 +53,7 @@ val path_option: Path.t val path_nativeint: Path.t val path_int32: Path.t val path_int64: Path.t +val path_vec128: Path.t val path_lazy_t: Path.t val path_extension_constructor: Path.t val path_floatarray: Path.t From 61ddd09dc2b2f3fc1f10bb35920006dd83833cc6 Mon Sep 17 00:00:00 2001 From: Max Slater Date: Fri, 9 Jun 2023 18:03:03 -0400 Subject: [PATCH 02/81] errors in arm64 --- backend/arm64/emit.mlp | 4 ++++ backend/arm64/proc.ml | 6 ++++++ backend/arm64/selection.ml | 4 +++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/backend/arm64/emit.mlp b/backend/arm64/emit.mlp index 0a5a259109a..bbcceda9fc4 100644 --- a/backend/arm64/emit.mlp +++ b/backend/arm64/emit.mlp @@ -818,6 +818,8 @@ let emit_instr i = ` fcvt {emit_reg dst}, s7\n` | Word_int | Word_val | Double -> ` ldr {emit_reg dst}, {emit_addressing addr base}\n` + (* CR mslater: arm64 *) + | Onetwentyeight -> fatal_error "arm64: got 128 bit memory chunk" end | Lop(Istore(size, addr, _)) -> let src = i.arg.(0) in @@ -840,6 +842,8 @@ let emit_instr i = ` str s7, {emit_addressing addr base}\n`; | Word_int | Word_val | Double -> ` str {emit_reg src}, {emit_addressing addr base}\n` + (* CR mslater: arm64 *) + | Onetwentyeight -> fatal_error "arm64: got 128 bit memory chunk" end | Lop(Ialloc { bytes = n; dbginfo; mode = Alloc_heap }) -> assembly_code_for_allocation i ~n ~far:false ~dbginfo diff --git a/backend/arm64/proc.ml b/backend/arm64/proc.ml index 9deabe5e7ac..0d7e92bcf20 100644 --- a/backend/arm64/proc.ml +++ b/backend/arm64/proc.ml @@ -66,6 +66,8 @@ let register_class r = match r.typ with | Val | Int | Addr -> 0 | Float -> 1 + (* CR mslater: arm64 *) + | Vec128 -> fatal_error "arm64: got vec128 register" let register_class_tag c = match c with @@ -158,6 +160,8 @@ let calling_conventions loc.(i) <- loc_int last_int make_stack int ofs | Float -> loc.(i) <- loc_float last_float make_stack float ofs + (* CR mslater: arm64 *) + | Vec128 -> fatal_error "arm64: got vec128 register" done; (loc, Misc.align (max 0 !ofs) 16) (* keep stack 16-aligned *) @@ -220,6 +224,8 @@ let external_calling_conventions loc.(i) <- [| loc_int32 last_int make_stack int ofs |] | XFloat -> loc.(i) <- [| loc_float last_float make_stack float ofs |] + (* CR mslater: arm64 *) + | XVec128 -> fatal_error "arm64: got vec128 register" end) ty_args; (loc, Misc.align !ofs 16) (* keep stack 16-aligned *) diff --git a/backend/arm64/selection.ml b/backend/arm64/selection.ml index fefbcf75236..588abf1eee5 100644 --- a/backend/arm64/selection.ml +++ b/backend/arm64/selection.ml @@ -33,7 +33,9 @@ let is_offset chunk n = | Thirtytwo_unsigned | Thirtytwo_signed | Single -> n land 3 = 0 && n lsr 2 < 0x1000 | Word_int | Word_val | Double -> - n land 7 = 0 && n lsr 3 < 0x1000) + n land 7 = 0 && n lsr 3 < 0x1000 + (* CR mslater: arm64 *) + | Onetwentyeight -> Misc.fatal_error "arm64: got 128 bit memory chunk") let is_logical_immediate n = Arch.is_logical_immediate (Nativeint.of_int n) From 03a30bfbe2ff38170c63beb3e9b4ded68bff1ceb Mon Sep 17 00:00:00 2001 From: Max Slater Date: Mon, 12 Jun 2023 16:49:35 -0400 Subject: [PATCH 03/81] rebase --- backend/amd64/emit.mlp | 8 +- backend/arm64/emit.mlp | 4 +- backend/arm64/proc.ml | 6 +- backend/arm64/selection.ml | 2 +- backend/cmm.ml | 1 + backend/cmm.mli | 5 +- backend/cmm_helpers.ml | 10 +- backend/cmm_helpers.mli | 15 ++ backend/cmmgen.ml | 11 ++ backend/printcmm.ml | 1 + backend/reg.ml | 2 +- middle_end/clambda_primitives.ml | 4 + middle_end/clambda_primitives.mli | 5 + middle_end/closure/closure.ml | 1 + middle_end/flambda/closure_offsets.ml | 1 + middle_end/flambda/flambda_to_clambda.ml | 1 + .../from_lambda/closure_conversion.ml | 3 + middle_end/flambda2/identifiers/int_ids.ml | 18 +- middle_end/flambda2/identifiers/int_ids.mli | 3 + .../flambda2/identifiers/reg_width_const.ml | 1 + middle_end/flambda2/kinds/flambda_kind.ml | 42 ++++- middle_end/flambda2/kinds/flambda_kind.mli | 9 + middle_end/flambda2/numbers/numeric_types.ml | 45 +++++ middle_end/flambda2/numbers/numeric_types.mli | 9 + middle_end/flambda2/parser/fexpr.ml | 1 + .../simplify/simplify_binary_primitive.ml | 2 +- .../simplify/simplify_static_const.ml | 2 +- .../simplify/simplify_unary_primitive.ml | 1 + middle_end/flambda2/to_cmm/to_cmm_shared.ml | 19 +- middle_end/flambda2/types/flambda2_types.mli | 2 + .../types/grammar/more_type_creators.ml | 8 + .../flambda2/types/grammar/type_grammar.ml | 162 ++++++++++++++++-- .../flambda2/types/grammar/type_grammar.mli | 18 ++ middle_end/printclambda.ml | 1 + ocaml/lambda/lambda.ml | 9 +- ocaml/lambda/lambda.mli | 6 + ocaml/lambda/printlambda.ml | 5 + ocaml/typing/primitive.ml | 11 ++ ocaml/typing/primitive.mli | 4 + ocaml/typing/typeopt.ml | 4 +- 40 files changed, 414 insertions(+), 48 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 48d57455119..8aa4520482c 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -675,7 +675,7 @@ let move (src : Reg.t) (dst : Reg.t) = begin match src.typ, src.loc, dst.typ, dst.loc with | Float, Reg.Reg _, Float, Reg.Reg _ | Vec128, Reg.Reg _, Vec128, Reg.Reg _ -> I.movapd (reg src) (reg dst) - (* CR mslater: alignment *) + (* CR mslater: (SIMD) alignment *) | Vec128, _, Vec128, _ -> I.movupd (reg src) (reg dst) | Float, _, Float, _ -> I.movsd (reg src) (reg dst) | Float, _, Int, _ @@ -969,7 +969,7 @@ let emit_instr fallthrough i = | Thirtytwo_signed -> I.movsxd (addressing addr DWORD i 0) dest | Onetwentyeight -> - (* CR mslater: alignment *) + (* CR mslater: (SIMD) alignment *) I.movupd (addressing addr VEC128 i 0) dest | Single -> I.cvtss2sd (addressing addr REAL4 i 0) dest @@ -987,7 +987,7 @@ let emit_instr fallthrough i = | Thirtytwo_signed | Thirtytwo_unsigned -> I.mov (arg32 i 0) (addressing addr DWORD i 1) | Onetwentyeight -> - (* CR mslater: alignment *) + (* CR mslater: (SIMD) alignment *) I.movupd (arg i 0) (addressing addr VEC128 i 1) | Single -> I.cvtsd2ss (arg i 0) xmm15; @@ -1474,6 +1474,8 @@ let emit_item = function | Cint n -> D.qword (const_nat n) | Csingle f -> D.long (Const (Int64.of_int32 (Int32.bits_of_float f))) | Cdouble f -> D.qword (Const (Int64.bits_of_float f)) + (* SIMD vectors respect little-endian byte order *) + | Cvec128 (v0, v1) -> D.qword (Const v1); D.qword (Const v0) | Csymbol_address s -> add_used_symbol s.sym_name; D.qword (ConstLabel (emit_cmm_symbol s)) diff --git a/backend/arm64/emit.mlp b/backend/arm64/emit.mlp index bbcceda9fc4..ce3a09ef683 100644 --- a/backend/arm64/emit.mlp +++ b/backend/arm64/emit.mlp @@ -818,7 +818,7 @@ let emit_instr i = ` fcvt {emit_reg dst}, s7\n` | Word_int | Word_val | Double -> ` ldr {emit_reg dst}, {emit_addressing addr base}\n` - (* CR mslater: arm64 *) + (* CR mslater: (SIMD) arm64 *) | Onetwentyeight -> fatal_error "arm64: got 128 bit memory chunk" end | Lop(Istore(size, addr, _)) -> @@ -842,7 +842,7 @@ let emit_instr i = ` str s7, {emit_addressing addr base}\n`; | Word_int | Word_val | Double -> ` str {emit_reg src}, {emit_addressing addr base}\n` - (* CR mslater: arm64 *) + (* CR mslater: (SIMD) arm64 *) | Onetwentyeight -> fatal_error "arm64: got 128 bit memory chunk" end | Lop(Ialloc { bytes = n; dbginfo; mode = Alloc_heap }) -> diff --git a/backend/arm64/proc.ml b/backend/arm64/proc.ml index 0d7e92bcf20..06b353b559e 100644 --- a/backend/arm64/proc.ml +++ b/backend/arm64/proc.ml @@ -66,7 +66,7 @@ let register_class r = match r.typ with | Val | Int | Addr -> 0 | Float -> 1 - (* CR mslater: arm64 *) + (* CR mslater: (SIMD) arm64 *) | Vec128 -> fatal_error "arm64: got vec128 register" let register_class_tag c = @@ -160,7 +160,7 @@ let calling_conventions loc.(i) <- loc_int last_int make_stack int ofs | Float -> loc.(i) <- loc_float last_float make_stack float ofs - (* CR mslater: arm64 *) + (* CR mslater: (SIMD) arm64 *) | Vec128 -> fatal_error "arm64: got vec128 register" done; (loc, Misc.align (max 0 !ofs) 16) (* keep stack 16-aligned *) @@ -224,7 +224,7 @@ let external_calling_conventions loc.(i) <- [| loc_int32 last_int make_stack int ofs |] | XFloat -> loc.(i) <- [| loc_float last_float make_stack float ofs |] - (* CR mslater: arm64 *) + (* CR mslater: (SIMD) arm64 *) | XVec128 -> fatal_error "arm64: got vec128 register" end) ty_args; diff --git a/backend/arm64/selection.ml b/backend/arm64/selection.ml index 588abf1eee5..2406572cb31 100644 --- a/backend/arm64/selection.ml +++ b/backend/arm64/selection.ml @@ -34,7 +34,7 @@ let is_offset chunk n = n land 3 = 0 && n lsr 2 < 0x1000 | Word_int | Word_val | Double -> n land 7 = 0 && n lsr 3 < 0x1000 - (* CR mslater: arm64 *) + (* CR mslater: (SIMD) arm64 *) | Onetwentyeight -> Misc.fatal_error "arm64: got 128 bit memory chunk") let is_logical_immediate n = diff --git a/backend/cmm.ml b/backend/cmm.ml index 5810b16da65..28d39d35999 100644 --- a/backend/cmm.ml +++ b/backend/cmm.ml @@ -309,6 +309,7 @@ type data_item = | Cint of nativeint | Csingle of float | Cdouble of float + | Cvec128 of int64 * int64 | Csymbol_address of symbol | Cstring of string | Cskip of int diff --git a/backend/cmm.mli b/backend/cmm.mli index d9ba36c9f41..be3d24e7157 100644 --- a/backend/cmm.mli +++ b/backend/cmm.mli @@ -55,6 +55,7 @@ val typ_val: machtype val typ_addr: machtype val typ_int: machtype val typ_float: machtype +val typ_vec128: machtype (** Least upper bound of two [machtype_component]s. *) val lub_component @@ -181,7 +182,7 @@ type memory_chunk = | Double (* word-aligned 64-bit float see PR#10433 *) | Onetwentyeight (* word-aligned 128-bit vector - CR mslater: alignment *) + CR mslater: (SIMD) alignment *) and operation = Capply of machtype * Lambda.region_close @@ -320,6 +321,8 @@ type data_item = | Cint of nativeint | Csingle of float | Cdouble of float + (* CR mslater: (SIMD) switch to nativeint? *) + | Cvec128 of int64 * int64 | Csymbol_address of symbol | Cstring of string | Cskip of int diff --git a/backend/cmm_helpers.ml b/backend/cmm_helpers.ml index 0e9da686791..a3758ec39be 100644 --- a/backend/cmm_helpers.ml +++ b/backend/cmm_helpers.ml @@ -699,6 +699,11 @@ let rec unbox_float dbg = | Ctail e -> Ctail (unbox_float dbg e) | cmm -> Cop (Cload (Double, Immutable), [cmm], dbg)) +(* Vectors *) + +let box_vector dbg vi m c = + Cop (Calloc m, [alloc_vector_header vi m dbg; c], dbg) + (* Complex *) let box_complex dbg c_re c_im = @@ -1079,6 +1084,7 @@ module Extended_machtype = struct | Pbottom -> Misc.fatal_error "No unique Extended_machtype for layout [Pbottom]" | Punboxed_float -> typ_float + | Punboxed_vector Pvec128 -> typ_vec128 | Punboxed_int _ -> (* Only 64-bit architectures, so this is always [typ_int] *) typ_any_int @@ -4210,6 +4216,8 @@ let cint i = Cmm.Cint i let cfloat f = Cmm.Cdouble f +let cvec128 (a, b) = Cmm.Cvec128 (a, b) + let symbol_address s = Cmm.Csymbol_address s let define_symbol symbol = [Cdefine_symbol symbol] @@ -4267,5 +4275,5 @@ let kind_of_layout (layout : Lambda.layout) = | Pvalue Pfloatval -> Boxed_float | Pvalue (Pboxedintval bi) -> Boxed_integer bi | Pvalue (Pgenval | Pintval | Pvariant _ | Parrayval _) - | Ptop | Pbottom | Punboxed_float | Punboxed_int _ -> + | Ptop | Pbottom | Punboxed_float | Punboxed_int _ | Punboxed_vector _ -> Any diff --git a/backend/cmm_helpers.mli b/backend/cmm_helpers.mli index 33627e7d6de..991261abb60 100644 --- a/backend/cmm_helpers.mli +++ b/backend/cmm_helpers.mli @@ -210,6 +210,16 @@ val box_float : Debuginfo.t -> Lambda.alloc_mode -> expression -> expression val unbox_float : Debuginfo.t -> expression -> expression +(** Vector boxing and unboxing *) +val box_vector : + Debuginfo.t -> + Primitive.boxed_vector -> + Lambda.alloc_mode -> + expression -> + expression + +(* CR mslater: (SIMD) unbox vector *) + (** Complex number creation and access *) val box_complex : Debuginfo.t -> expression -> expression -> expression @@ -390,6 +400,8 @@ module Extended_machtype : sig val typ_void : t + val typ_vec128 : t + (** Conversion from a normal Cmm machtype. *) val of_machtype : machtype -> t @@ -1230,6 +1242,9 @@ val cint : nativeint -> data_item (** Static float. *) val cfloat : float -> data_item +(** Static 128-bit vector. *) +val cvec128 : int64 * int64 -> data_item + (** Static symbol. *) val symbol_address : symbol -> data_item diff --git a/backend/cmmgen.ml b/backend/cmmgen.ml index b7851224d48..a2de38f513c 100644 --- a/backend/cmmgen.ml +++ b/backend/cmmgen.ml @@ -162,6 +162,7 @@ let get_field env layout ptr n dbg = | Pvalue Pintval | Punboxed_int _ -> Word_int | Pvalue _ -> Word_val | Punboxed_float -> Double + | Punboxed_vector Pvec128 -> Onetwentyeight | Ptop -> Misc.fatal_errorf "get_field with Ptop: %a" Debuginfo.print_compact dbg | Pbottom -> @@ -911,6 +912,12 @@ and transl_ccall env prim args dbg = | Pint32 -> XInt32 | Pint64 -> XInt64 in (xty, transl_unbox_int dbg env bi arg) + | Unboxed_vector bi -> + let xty = + match bi with + | Pvec128 -> XVec128 + in + (xty, transl_unbox_vector dbg env bi arg) | Untagged_int -> (XInt, untag_int (transl env arg) dbg) in @@ -939,6 +946,7 @@ and transl_ccall env prim args dbg = | _, Unboxed_integer Pint64 when size_int = 4 -> ([|Int; Int|], box_int dbg Pint64 alloc_heap) | _, Unboxed_integer bi -> (typ_int, box_int dbg bi alloc_heap) + | _, Unboxed_vector vi -> (typ_int, box_vector dbg vi alloc_heap) | _, Untagged_int -> (typ_int, (fun i -> tag_int i dbg)) in let typ_args, args = transl_args prim.prim_native_repr_args args in @@ -1283,6 +1291,9 @@ and transl_unbox_float dbg env exp = and transl_unbox_int dbg env bi exp = unbox_int dbg bi (transl env exp) + and transl_unbox_vector dbg env bi exp = + unbox_vector dbg bi (transl env exp) + (* transl_unbox_int, but may return garbage in upper bits *) and transl_unbox_int_low dbg env bi e = let e = transl_unbox_int dbg env bi e in diff --git a/backend/printcmm.ml b/backend/printcmm.ml index 360326ed3b4..a302778cf8c 100644 --- a/backend/printcmm.ml +++ b/backend/printcmm.ml @@ -414,6 +414,7 @@ let data_item ppf = function | Cint n -> fprintf ppf "int %s" (Nativeint.to_string n) | Csingle f -> fprintf ppf "single %F" f | Cdouble f -> fprintf ppf "double %F" f + | Cvec128 (v0, v1) -> fprintf ppf "vec128 %s:%s" (Int64.to_string v0) (Int64.to_string v1) | Csymbol_address s -> fprintf ppf "addr %a:\"%s\"" is_global s.sym_global s.sym_name | Cstring s -> fprintf ppf "string \"%s\"" s | Cskip n -> fprintf ppf "skip %i" n diff --git a/backend/reg.ml b/backend/reg.ml index f2a345bd1b1..0f1bcd0a404 100644 --- a/backend/reg.ml +++ b/backend/reg.ml @@ -114,7 +114,7 @@ let clear_visited_marks () = let create ty = - (* CR mslater: should we start vector registers with a higher spill cost? *) + (* CR mslater: (SIMD) should we start vector registers with a higher spill cost? *) let r = { raw_name = Raw_name.Anon; stamp = !currstamp; typ = ty; loc = Unknown; irc_work_list = Unknown_list; irc_color = None; irc_alias = None; diff --git a/middle_end/clambda_primitives.ml b/middle_end/clambda_primitives.ml index 92725a7a771..770523ec282 100644 --- a/middle_end/clambda_primitives.ml +++ b/middle_end/clambda_primitives.ml @@ -164,12 +164,16 @@ and layout = Lambda.layout = | Pvalue of value_kind | Punboxed_float | Punboxed_int of boxed_integer + | Punboxed_vector of boxed_vector | Pbottom and block_shape = Lambda.block_shape and boxed_integer = Primitive.boxed_integer = Pnativeint | Pint32 | Pint64 +and boxed_vector = Primitive.boxed_vector = + | Pvec128 + and bigarray_kind = Lambda.bigarray_kind = Pbigarray_unknown | Pbigarray_float32 | Pbigarray_float64 diff --git a/middle_end/clambda_primitives.mli b/middle_end/clambda_primitives.mli index b65e674ee76..48f46f7d15f 100644 --- a/middle_end/clambda_primitives.mli +++ b/middle_end/clambda_primitives.mli @@ -167,12 +167,17 @@ and layout = Lambda.layout = | Pvalue of value_kind | Punboxed_float | Punboxed_int of boxed_integer + | Punboxed_vector of boxed_vector | Pbottom and block_shape = Lambda.block_shape + and boxed_integer = Primitive.boxed_integer = Pnativeint | Pint32 | Pint64 +and boxed_vector = Primitive.boxed_vector = + | Pvec128 + and bigarray_kind = Lambda.bigarray_kind = Pbigarray_unknown | Pbigarray_float32 | Pbigarray_float64 diff --git a/middle_end/closure/closure.ml b/middle_end/closure/closure.ml index 95f7588333d..f44ba1b30b7 100644 --- a/middle_end/closure/closure.ml +++ b/middle_end/closure/closure.ml @@ -64,6 +64,7 @@ let is_gc_ignorable kind = | Punboxed_float -> true | Punboxed_int _ -> true | Pvalue Pintval -> true + | Punboxed_vector _ -> true | Pvalue (Pgenval | Pfloatval | Pboxedintval _ | Pvariant _ | Parrayval _) -> false let split_closure_fv kinds fv = diff --git a/middle_end/flambda/closure_offsets.ml b/middle_end/flambda/closure_offsets.ml index cfb1791786d..d771cdd3e54 100644 --- a/middle_end/flambda/closure_offsets.ml +++ b/middle_end/flambda/closure_offsets.ml @@ -79,6 +79,7 @@ let add_closure_offsets and not stored in a closure." | Punboxed_float -> true | Punboxed_int _ -> true + | Punboxed_vector _ -> true | Pvalue Pintval -> true | Pvalue _ -> false) free_vars diff --git a/middle_end/flambda/flambda_to_clambda.ml b/middle_end/flambda/flambda_to_clambda.ml index a2d6c2a23f2..c4d4eab629f 100644 --- a/middle_end/flambda/flambda_to_clambda.ml +++ b/middle_end/flambda/flambda_to_clambda.ml @@ -712,6 +712,7 @@ and to_clambda_set_of_closures t env and not stored in a closure." | Punboxed_float -> true | Punboxed_int _ -> true + | Punboxed_vector _ -> true | Pvalue Pintval -> true | Pvalue _ -> false) free_vars diff --git a/middle_end/flambda2/from_lambda/closure_conversion.ml b/middle_end/flambda2/from_lambda/closure_conversion.ml index ebdb4e93b00..46b8185d31e 100644 --- a/middle_end/flambda2/from_lambda/closure_conversion.ml +++ b/middle_end/flambda2/from_lambda/closure_conversion.ml @@ -448,6 +448,8 @@ let close_c_call acc env ~loc ~let_bound_ids_with_kinds Some (P.Box_number (Naked_int32, Alloc_mode.For_allocations.heap)) | _, Unboxed_integer Pint64 -> Some (P.Box_number (Naked_int64, Alloc_mode.For_allocations.heap)) + | _, Unboxed_vector Pvec128 -> + Some (P.Box_number (Naked_vec128, Alloc_mode.For_allocations.heap)) | _, Untagged_int -> Some P.Tag_immediate in let return_continuation, needs_wrapper = @@ -473,6 +475,7 @@ let close_c_call acc env ~loc ~let_bound_ids_with_kinds | Unboxed_integer Pint32 -> K.naked_int32 | Unboxed_integer Pint64 -> K.naked_int64 | Untagged_int -> K.naked_immediate + | Unboxed_vector Pvec128 -> K.naked_vec128 in let param_arity = List.map kind_of_primitive_native_repr prim_native_repr_args diff --git a/middle_end/flambda2/identifiers/int_ids.ml b/middle_end/flambda2/identifiers/int_ids.ml index 7b708fa4684..f1c6d4f6fe3 100644 --- a/middle_end/flambda2/identifiers/int_ids.ml +++ b/middle_end/flambda2/identifiers/int_ids.ml @@ -48,6 +48,7 @@ module Const_data = struct | Naked_int32 of Int32.t | Naked_int64 of Int64.t | Naked_nativeint of Targetint_32_64.t + | Naked_vec128 of Numeric_types.Vec128_by_bit_pattern.t let flags = const_flags @@ -86,6 +87,11 @@ module Const_data = struct Flambda_colours.naked_number Targetint_32_64.print n Flambda_colours.pop + | Naked_vec128 v -> + Format.fprintf ppf "%t#%a%t" + Flambda_colours.naked_number + Numeric_types.Vec128_by_bit_pattern.print v + Flambda_colours.pop let compare t1 t2 = match t1, t2 with @@ -97,6 +103,8 @@ module Const_data = struct | Naked_int32 n1, Naked_int32 n2 -> Int32.compare n1 n2 | Naked_int64 n1, Naked_int64 n2 -> Int64.compare n1 n2 | Naked_nativeint n1, Naked_nativeint n2 -> Targetint_32_64.compare n1 n2 + | Naked_vec128 v1, Naked_vec128 v2 -> + Numeric_types.Vec128_by_bit_pattern.compare v1 v2 | Naked_immediate _, _ -> -1 | _, Naked_immediate _ -> 1 | Tagged_immediate _, _ -> -1 @@ -107,6 +115,8 @@ module Const_data = struct | _, Naked_int32 _ -> 1 | Naked_int64 _, _ -> -1 | _, Naked_int64 _ -> 1 + | Naked_vec128 _, _ -> -1 + | _, Naked_vec128 _ -> 1 let equal t1 t2 = if t1 == t2 @@ -121,8 +131,11 @@ module Const_data = struct | Naked_int32 n1, Naked_int32 n2 -> Int32.equal n1 n2 | Naked_int64 n1, Naked_int64 n2 -> Int64.equal n1 n2 | Naked_nativeint n1, Naked_nativeint n2 -> Targetint_32_64.equal n1 n2 + | Naked_vec128 v1, Naked_vec128 v2 -> + Numeric_types.Vec128_by_bit_pattern.equal v1 v2 | ( ( Naked_immediate _ | Tagged_immediate _ | Naked_float _ - | Naked_int32 _ | Naked_int64 _ | Naked_nativeint _ ), + | Naked_vec128 _ | Naked_int32 _ | Naked_int64 _ | Naked_nativeint _ + ), _ ) -> false @@ -134,6 +147,7 @@ module Const_data = struct | Naked_int32 n -> Hashtbl.hash n | Naked_int64 n -> Hashtbl.hash n | Naked_nativeint n -> Targetint_32_64.hash n + | Naked_vec128 v -> Numeric_types.Vec128_by_bit_pattern.hash v end) end @@ -264,6 +278,8 @@ module Const = struct let naked_nativeint i = create (Naked_nativeint i) + let naked_vec128 i = create (Naked_vec128 i) + let const_true = tagged_immediate Targetint_31_63.bool_true let const_false = tagged_immediate Targetint_31_63.bool_false diff --git a/middle_end/flambda2/identifiers/int_ids.mli b/middle_end/flambda2/identifiers/int_ids.mli index 5d8b3b374d2..b33d3123adc 100644 --- a/middle_end/flambda2/identifiers/int_ids.mli +++ b/middle_end/flambda2/identifiers/int_ids.mli @@ -60,6 +60,8 @@ module Const : sig val naked_nativeint : Targetint_32_64.t -> t + val naked_vec128 : Numeric_types.Vec128_by_bit_pattern.t -> t + module Descr : sig type t = private | Naked_immediate of Targetint_31_63.t @@ -68,6 +70,7 @@ module Const : sig | Naked_int32 of Int32.t | Naked_int64 of Int64.t | Naked_nativeint of Targetint_32_64.t + | Naked_vec128 of Numeric_types.Vec128_by_bit_pattern.t include Container_types.S with type t := t end diff --git a/middle_end/flambda2/identifiers/reg_width_const.ml b/middle_end/flambda2/identifiers/reg_width_const.ml index e61472864f9..5f4311314f1 100644 --- a/middle_end/flambda2/identifiers/reg_width_const.ml +++ b/middle_end/flambda2/identifiers/reg_width_const.ml @@ -24,3 +24,4 @@ let of_descr (descr : Descr.t) = | Naked_int32 i -> naked_int32 i | Naked_int64 i -> naked_int64 i | Naked_nativeint i -> naked_nativeint i + | Naked_vec128 v -> naked_vec128 v diff --git a/middle_end/flambda2/kinds/flambda_kind.ml b/middle_end/flambda2/kinds/flambda_kind.ml index a014ec6e7f8..cfe3bb20df5 100644 --- a/middle_end/flambda2/kinds/flambda_kind.ml +++ b/middle_end/flambda2/kinds/flambda_kind.ml @@ -21,6 +21,7 @@ module Naked_number_kind = struct | Naked_int32 | Naked_int64 | Naked_nativeint + | Naked_vec128 let print ppf t = match t with @@ -29,6 +30,7 @@ module Naked_number_kind = struct | Naked_int32 -> Format.pp_print_string ppf "Naked_int32" | Naked_int64 -> Format.pp_print_string ppf "Naked_int64" | Naked_nativeint -> Format.pp_print_string ppf "Naked_nativeint" + | Naked_vec128 -> Format.pp_print_string ppf "Naked_vec128" end type t = @@ -53,6 +55,8 @@ let naked_int64 = Naked_number Naked_int64 let naked_nativeint = Naked_number Naked_nativeint +let naked_vec128 = Naked_number Naked_vec128 + let region = Region let rec_info = Rec_info @@ -66,6 +70,7 @@ let to_lambda (t : t) : Lambda.layout = | Naked_number Naked_int32 -> Punboxed_int Pint32 | Naked_number Naked_int64 -> Punboxed_int Pint64 | Naked_number Naked_nativeint -> Punboxed_int Pnativeint + | Naked_number Naked_vec128 -> Punboxed_vector Pvec128 | Region -> Misc.fatal_error "Can't convert kind [Region] to lambda layout" | Rec_info -> Misc.fatal_error "Can't convert kind [Rec_info] to lambda layout" @@ -105,6 +110,9 @@ include Container_types.Make (struct | Naked_nativeint -> Format.fprintf ppf "%t@<1>\u{2115}@<1>\u{2115}%t" colour Flambda_colours.pop + | Naked_vec128 -> + Format.fprintf ppf "%t@<1>\u{2115}@<1>\u{1d54d}128%t" colour + Flambda_colours.pop else Format.fprintf ppf "(Naked_number %a)" Naked_number_kind.print naked_number_kind @@ -127,7 +135,9 @@ let is_naked_float t = match t with | Naked_number Naked_float -> true | Value - | Naked_number (Naked_immediate | Naked_int32 | Naked_int64 | Naked_nativeint) + | Naked_number + ( Naked_immediate | Naked_int32 | Naked_int64 | Naked_nativeint + | Naked_vec128 ) | Region | Rec_info -> false @@ -227,6 +237,7 @@ module Boxable_number = struct | Naked_int32 | Naked_int64 | Naked_nativeint + | Naked_vec128 let unboxed_kind t : kind = match t with @@ -234,10 +245,11 @@ module Boxable_number = struct | Naked_int32 -> Naked_number Naked_int32 | Naked_int64 -> Naked_number Naked_int64 | Naked_nativeint -> Naked_number Naked_nativeint + | Naked_vec128 -> Naked_number Naked_vec128 let primitive_kind t : Primitive.boxed_integer = match t with - | Naked_float -> assert false + | Naked_vec128 | Naked_float -> assert false | Naked_int32 -> Pint32 | Naked_int64 -> Pint64 | Naked_nativeint -> Pnativeint @@ -251,6 +263,7 @@ module Boxable_number = struct | Naked_int32 -> Format.pp_print_string ppf "Naked_int32" | Naked_int64 -> Format.pp_print_string ppf "Naked_int64" | Naked_nativeint -> Format.pp_print_string ppf "Naked_nativeint" + | Naked_vec128 -> Format.pp_print_string ppf "Naked_vec128" let compare = Stdlib.compare @@ -265,6 +278,7 @@ module Boxable_number = struct | Naked_int32 -> Format.pp_print_string ppf "naked_int32" | Naked_int64 -> Format.pp_print_string ppf "naked_int64" | Naked_nativeint -> Format.pp_print_string ppf "naked_nativeint" + | Naked_vec128 -> Format.pp_print_string ppf "naked_vec128" let print_lowercase_short ppf t = match t with @@ -272,6 +286,7 @@ module Boxable_number = struct | Naked_int32 -> Format.pp_print_string ppf "int32" | Naked_int64 -> Format.pp_print_string ppf "int64" | Naked_nativeint -> Format.pp_print_string ppf "nativeint" + | Naked_vec128 -> Format.pp_print_string ppf "vec128" end module With_subkind = struct @@ -282,6 +297,7 @@ module With_subkind = struct | Boxed_int32 | Boxed_int64 | Boxed_nativeint + | Boxed_vec128 | Tagged_immediate | Variant of { consts : Targetint_31_63.Set.t; @@ -306,6 +322,7 @@ module With_subkind = struct | Boxed_int32, Boxed_int32 | Boxed_int64, Boxed_int64 | Boxed_nativeint, Boxed_nativeint + | Boxed_vec128, Boxed_vec128 | Tagged_immediate, Tagged_immediate | Float_array, Float_array | Immediate_array, Immediate_array @@ -353,8 +370,8 @@ module With_subkind = struct true (* All other combinations are incompatible: *) | ( ( Anything | Boxed_float | Boxed_int32 | Boxed_int64 | Boxed_nativeint - | Tagged_immediate | Variant _ | Float_block _ | Float_array - | Immediate_array | Value_array | Generic_array ), + | Boxed_vec128 | Tagged_immediate | Variant _ | Float_block _ + | Float_array | Immediate_array | Value_array | Generic_array ), _ ) -> false @@ -380,6 +397,9 @@ module With_subkind = struct | Boxed_nativeint -> Format.fprintf ppf "%t=boxed_@<1>\u{2115}@<1>\u{2115}%t" colour Flambda_colours.pop + | Boxed_vec128 -> + Format.fprintf ppf "%t=boxed_@<1>\u{2115}@<1>\u{1d54d}128%t" colour + Flambda_colours.pop | Variant { consts; non_consts } -> let print_field ppf { kind = _; subkind } = print ppf subkind in Format.fprintf ppf "%t=Variant((consts (%a))@ (non_consts (%a)))%t" @@ -420,7 +440,7 @@ module With_subkind = struct | Naked_number _ | Region | Rec_info -> ( match subkind with | Anything -> () - | Boxed_float | Boxed_int32 | Boxed_int64 | Boxed_nativeint + | Boxed_float | Boxed_int32 | Boxed_int64 | Boxed_nativeint | Boxed_vec128 | Tagged_immediate | Variant _ | Float_block _ | Float_array | Immediate_array | Value_array | Generic_array -> Misc.fatal_errorf "Subkind %a is not valid for kind %a" Subkind.print @@ -449,6 +469,8 @@ module With_subkind = struct let naked_nativeint = create naked_nativeint Anything + let naked_vec128 = create naked_vec128 Anything + let region = create region Anything let boxed_float = create value Boxed_float @@ -459,6 +481,8 @@ module With_subkind = struct let boxed_nativeint = create value Boxed_nativeint + let boxed_vec128 = create value Boxed_vec128 + let tagged_immediate = create value Tagged_immediate let rec_info = create rec_info Anything @@ -495,6 +519,7 @@ module With_subkind = struct | Naked_int32 -> naked_int32 | Naked_int64 -> naked_int64 | Naked_nativeint -> naked_nativeint + | Naked_vec128 -> naked_vec128 let rec from_lambda_value_kind (vk : Lambda.value_kind) = match vk with @@ -544,6 +569,7 @@ module With_subkind = struct | Punboxed_int Pint32 -> naked_int32 | Punboxed_int Pint64 -> naked_int64 | Punboxed_int Pnativeint -> naked_nativeint + | Punboxed_vector Pvec128 -> naked_vec128 include Container_types.Make (struct type nonrec t = t @@ -555,8 +581,8 @@ module With_subkind = struct Format.fprintf ppf "@[%a%a@]" print kind Subkind.print subkind | ( (Naked_number _ | Region | Rec_info), ( Boxed_float | Boxed_int32 | Boxed_int64 | Boxed_nativeint - | Tagged_immediate | Variant _ | Float_block _ | Float_array - | Immediate_array | Value_array | Generic_array ) ) -> + | Boxed_vec128 | Tagged_immediate | Variant _ | Float_block _ + | Float_array | Immediate_array | Value_array | Generic_array ) ) -> assert false (* see [create] *) @@ -574,7 +600,7 @@ module With_subkind = struct let has_useful_subkind_info (t : t) = match t.subkind with | Anything -> false - | Boxed_float | Boxed_int32 | Boxed_int64 | Boxed_nativeint + | Boxed_float | Boxed_int32 | Boxed_int64 | Boxed_nativeint | Boxed_vec128 | Tagged_immediate | Variant _ | Float_block _ | Float_array | Immediate_array | Value_array | Generic_array -> true diff --git a/middle_end/flambda2/kinds/flambda_kind.mli b/middle_end/flambda2/kinds/flambda_kind.mli index 78658a4de9c..8b0451160ff 100644 --- a/middle_end/flambda2/kinds/flambda_kind.mli +++ b/middle_end/flambda2/kinds/flambda_kind.mli @@ -23,6 +23,7 @@ module Naked_number_kind : sig | Naked_int32 | Naked_int64 | Naked_nativeint + | Naked_vec128 val print : Format.formatter -> t -> unit end @@ -56,6 +57,8 @@ val naked_int64 : t val naked_nativeint : t +val naked_vec128 : t + val region : t val rec_info : t @@ -112,6 +115,7 @@ module Boxable_number : sig | Naked_int32 | Naked_int64 | Naked_nativeint + | Naked_vec128 val unboxed_kind : t -> kind @@ -134,6 +138,7 @@ module With_subkind : sig | Boxed_int32 | Boxed_int64 | Boxed_nativeint + | Boxed_vec128 | Tagged_immediate | Variant of { consts : Targetint_31_63.Set.t; @@ -172,6 +177,8 @@ module With_subkind : sig val naked_nativeint : t + val naked_vec128 : t + val region : t val boxed_float : t @@ -182,6 +189,8 @@ module With_subkind : sig val boxed_nativeint : t + val boxed_vec128 : t + val tagged_immediate : t val rec_info : t diff --git a/middle_end/flambda2/numbers/numeric_types.ml b/middle_end/flambda2/numbers/numeric_types.ml index 4894ebadf43..522b75e23af 100644 --- a/middle_end/flambda2/numbers/numeric_types.ml +++ b/middle_end/flambda2/numbers/numeric_types.ml @@ -250,3 +250,48 @@ module Int64 = struct let cross_product = Pair.create_from_cross_product end + +module type Vector_width = sig + val size_in_int64s : int +end + +module Vector_by_bit_pattern (Width : Vector_width) = struct + module T0 = struct + type t = Int64.t Array.t + + let rec compare l r i = + if i = Width.size_in_int64s + then 0 + else + let cmp = Int64.compare l.(i) r.(i) in + if cmp = 0 then compare l r (i + 1) else cmp + + let compare l r = compare l r 0 + + let equal = Array.for_all2 Int64.equal + + let hash v = Hashtbl.hash v + + let print ppf t = + Format.pp_print_list + ~pp_sep:(fun ppf () -> Format.pp_print_char ppf ':') + Int64.print ppf (Array.to_list t) + end + + include T0 + module Self = Container_types.Make (T0) + include Self + + let to_int64_array t = t +end + +module Vec128_by_bit_pattern = struct + include Vector_by_bit_pattern (struct + let size_in_int64s = 2 + end) + + let to_int64s t = + match to_int64_array t with + | [| a; b |] -> a, b + | _ -> Misc.fatal_error "Vec128.to_int64s: wrong size vector" +end diff --git a/middle_end/flambda2/numbers/numeric_types.mli b/middle_end/flambda2/numbers/numeric_types.mli index 7db0b4e9558..fbb9291fb3c 100644 --- a/middle_end/flambda2/numbers/numeric_types.mli +++ b/middle_end/flambda2/numbers/numeric_types.mli @@ -134,3 +134,12 @@ module Int64 : sig val cross_product : Set.t -> Set.t -> Pair.Set.t end + +module Vec128_by_bit_pattern : sig + (** 128-bit value whose comparison and equality relations are lexicographically + ordered by bit pattern. *) + + include Container_types.S + + val to_int64s : t -> int64 * int64 +end diff --git a/middle_end/flambda2/parser/fexpr.ml b/middle_end/flambda2/parser/fexpr.ml index 03395f4e2ef..2ae0c8a1e42 100644 --- a/middle_end/flambda2/parser/fexpr.ml +++ b/middle_end/flambda2/parser/fexpr.ml @@ -178,6 +178,7 @@ type box_kind = Flambda_kind.Boxable_number.t = | Naked_int32 | Naked_int64 | Naked_nativeint + | Naked_vec128 type generic_array_specialisation = | No_specialisation diff --git a/middle_end/flambda2/simplify/simplify_binary_primitive.ml b/middle_end/flambda2/simplify/simplify_binary_primitive.ml index 10a95033e41..627fafea315 100644 --- a/middle_end/flambda2/simplify/simplify_binary_primitive.ml +++ b/middle_end/flambda2/simplify/simplify_binary_primitive.ml @@ -923,7 +923,7 @@ let simplify_immutable_block_load access_kind ~min_name_mode dacc ~original_term ~projection_bound_to:result_var ~kind:Flambda_kind.With_subkind.tagged_immediate | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ -> + | Naked_nativeint _ | Naked_vec128 _ -> Misc.fatal_errorf "Kind error for [Block_load] of %a at index %a" Simple.print arg1 Simple.print arg2) ~name:(fun _ ~coercion:_ -> dacc) diff --git a/middle_end/flambda2/simplify/simplify_static_const.ml b/middle_end/flambda2/simplify/simplify_static_const.ml index 99afdb19e80..5729b8de7a0 100644 --- a/middle_end/flambda2/simplify/simplify_static_const.ml +++ b/middle_end/flambda2/simplify/simplify_static_const.ml @@ -37,7 +37,7 @@ let simplify_field_of_block dacc (field : Field_of_static_block.t) = match Reg_width_const.descr const with | Tagged_immediate imm -> Field_of_static_block.Tagged_immediate imm, ty | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ -> + | Naked_nativeint _ | Naked_vec128 _ -> (* CR mshinwell: This should be "invalid" and propagate up *) field, ty) diff --git a/middle_end/flambda2/simplify/simplify_unary_primitive.ml b/middle_end/flambda2/simplify/simplify_unary_primitive.ml index 765d0694079..1e36f298eae 100644 --- a/middle_end/flambda2/simplify/simplify_unary_primitive.ml +++ b/middle_end/flambda2/simplify/simplify_unary_primitive.ml @@ -569,6 +569,7 @@ let simplify_obj_dup dbg dacc ~original_term ~arg ~arg_ty ~result_var = | Naked_int32 -> T.box_int32 | Naked_int64 -> T.box_int64 | Naked_nativeint -> T.box_nativeint + | Naked_vec128 -> T.box_vec128 in let ty = boxer contents_ty Alloc_mode.For_types.heap in let dacc = DA.add_variable dacc result_var ty in diff --git a/middle_end/flambda2/to_cmm/to_cmm_shared.ml b/middle_end/flambda2/to_cmm/to_cmm_shared.ml index 9b6a239d885..ec181dc4370 100644 --- a/middle_end/flambda2/to_cmm/to_cmm_shared.ml +++ b/middle_end/flambda2/to_cmm/to_cmm_shared.ml @@ -36,6 +36,7 @@ let exttype_of_kind (k : Flambda_kind.t) : Cmm.exttype = match Targetint_32_64.num_bits with | Thirty_two -> XInt32 | Sixty_four -> XInt64) + | Naked_number Naked_vec128 -> XVec128 | Region -> Misc.fatal_error "[Region] kind not expected here" | Rec_info -> Misc.fatal_error "[Rec_info] kind not expected here" @@ -45,11 +46,12 @@ let machtype_of_kind (kind : Flambda_kind.With_subkind.t) = match Flambda_kind.With_subkind.subkind kind with | Tagged_immediate -> Cmm.typ_int | Anything | Boxed_float | Boxed_int32 | Boxed_int64 | Boxed_nativeint - | Variant _ | Float_block _ | Float_array | Immediate_array | Value_array - | Generic_array -> + | Boxed_vec128 | Variant _ | Float_block _ | Float_array | Immediate_array + | Value_array | Generic_array -> Cmm.typ_val) | Naked_number Naked_float -> Cmm.typ_float | Naked_number Naked_int64 -> typ_int64 + | Naked_number Naked_vec128 -> Cmm.typ_vec128 | Naked_number (Naked_immediate | Naked_int32 | Naked_nativeint) -> Cmm.typ_int | Region | Rec_info -> assert false @@ -60,11 +62,12 @@ let extended_machtype_of_kind (kind : Flambda_kind.With_subkind.t) = match Flambda_kind.With_subkind.subkind kind with | Tagged_immediate -> Extended_machtype.typ_tagged_int | Anything | Boxed_float | Boxed_int32 | Boxed_int64 | Boxed_nativeint - | Variant _ | Float_block _ | Float_array | Immediate_array | Value_array - | Generic_array -> + | Boxed_vec128 | Variant _ | Float_block _ | Float_array | Immediate_array + | Value_array | Generic_array -> Extended_machtype.typ_val) | Naked_number Naked_float -> Extended_machtype.typ_float | Naked_number Naked_int64 -> Extended_machtype.typ_int64 + | Naked_number Naked_vec128 -> Extended_machtype.typ_vec128 | Naked_number (Naked_immediate | Naked_int32 | Naked_nativeint) -> Extended_machtype.typ_any_int | Region | Rec_info -> assert false @@ -76,13 +79,14 @@ let memory_chunk_of_kind (kind : Flambda_kind.With_subkind.t) : Cmm.memory_chunk match Flambda_kind.With_subkind.subkind kind with | Tagged_immediate -> Word_int | Anything | Boxed_float | Boxed_int32 | Boxed_int64 | Boxed_nativeint - | Variant _ | Float_block _ | Float_array | Immediate_array | Value_array - | Generic_array -> + | Boxed_vec128 | Variant _ | Float_block _ | Float_array | Immediate_array + | Value_array | Generic_array -> Word_val) | Naked_number (Naked_int32 | Naked_int64 | Naked_nativeint | Naked_immediate) -> Word_int | Naked_number Naked_float -> Double + | Naked_number Naked_vec128 -> Onetwentyeight | Region | Rec_info -> Misc.fatal_errorf "Bad kind %a for [memory_chunk_of_kind]" Flambda_kind.With_subkind.print kind @@ -131,6 +135,7 @@ let const ~dbg cst = | Naked_float f -> float ~dbg (Numeric_types.Float_by_bit_pattern.to_float f) | Naked_int32 i -> int32 ~dbg i | Naked_int64 i -> int64 ~dbg i + | Naked_vec128 i -> vec128 ~dbg i | Naked_nativeint t -> targetint ~dbg t let simple ?consider_inlining_effectful_expressions ~dbg env res s = @@ -163,7 +168,9 @@ let const_static cst = (tag_targetint (Targetint_31_63.to_targetint i))) ] | Naked_float f -> [cfloat (Numeric_types.Float_by_bit_pattern.to_float f)] | Naked_int32 i -> [cint (Nativeint.of_int32 i)] + (* CR mslater: (slack question) *) | Naked_int64 i -> [cint (Int64.to_nativeint i)] + | Naked_vec128 v -> [cvec128 (Numeric_types.Vec128_by_bit_pattern.to_int64s v)] | Naked_nativeint t -> [cint (nativeint_of_targetint t)] let simple_static res s = diff --git a/middle_end/flambda2/types/flambda2_types.mli b/middle_end/flambda2/types/flambda2_types.mli index 5301e1c546a..9e0e417d062 100644 --- a/middle_end/flambda2/types/flambda2_types.mli +++ b/middle_end/flambda2/types/flambda2_types.mli @@ -420,6 +420,8 @@ val box_int64 : t -> Alloc_mode.For_types.t -> t val box_nativeint : t -> Alloc_mode.For_types.t -> t +val box_vec128 : t -> Alloc_mode.For_types.t -> t + val tagged_immediate_alias_to : naked_immediate:Variable.t -> t val tag_immediate : t -> t diff --git a/middle_end/flambda2/types/grammar/more_type_creators.ml b/middle_end/flambda2/types/grammar/more_type_creators.ml index 298f030fa7b..833565b4aa0 100644 --- a/middle_end/flambda2/types/grammar/more_type_creators.ml +++ b/middle_end/flambda2/types/grammar/more_type_creators.ml @@ -26,6 +26,7 @@ let unknown (kind : K.t) = | Naked_number Naked_int32 -> TG.any_naked_int32 | Naked_number Naked_int64 -> TG.any_naked_int64 | Naked_number Naked_nativeint -> TG.any_naked_nativeint + | Naked_number Naked_vec128 -> TG.any_naked_vec128 | Rec_info -> TG.any_rec_info | Region -> TG.any_region @@ -39,6 +40,7 @@ let bottom (kind : K.t) = | Naked_number Naked_int32 -> TG.bottom_naked_int32 | Naked_number Naked_int64 -> TG.bottom_naked_int64 | Naked_number Naked_nativeint -> TG.bottom_naked_nativeint + | Naked_number Naked_vec128 -> TG.bottom_naked_vec128 | Rec_info -> TG.bottom_rec_info | Region -> TG.bottom_region @@ -111,6 +113,9 @@ let any_boxed_int64 = let any_boxed_nativeint = TG.box_nativeint TG.any_naked_nativeint (Alloc_mode.For_types.unknown ()) +let any_boxed_vec128 = + TG.box_vec128 TG.any_naked_vec128 (Alloc_mode.For_types.unknown ()) + let any_block = TG.create_variant ~is_unique:false ~immediates:(Known TG.bottom_naked_immediate) ~blocks:Unknown @@ -255,6 +260,7 @@ let type_for_const const = | Naked_int32 n -> TG.this_naked_int32 n | Naked_int64 n -> TG.this_naked_int64 n | Naked_nativeint n -> TG.this_naked_nativeint n + | Naked_vec128 n -> TG.this_naked_vec128 n let kind_for_const const = TG.kind (type_for_const const) @@ -290,12 +296,14 @@ let rec unknown_with_subkind ?(alloc_mode = Alloc_mode.For_types.unknown ()) | Naked_number Naked_int32 -> TG.any_naked_int32 | Naked_number Naked_int64 -> TG.any_naked_int64 | Naked_number Naked_nativeint -> TG.any_naked_nativeint + | Naked_number Naked_vec128 -> TG.any_naked_vec128 | Rec_info -> TG.any_rec_info | Region -> TG.any_region) | Boxed_float -> any_boxed_float | Boxed_int32 -> any_boxed_int32 | Boxed_int64 -> any_boxed_int64 | Boxed_nativeint -> any_boxed_nativeint + | Boxed_vec128 -> any_boxed_vec128 | Tagged_immediate -> any_tagged_immediate | Variant { consts; non_consts } -> let const_ctors = these_naked_immediates consts in diff --git a/middle_end/flambda2/types/grammar/type_grammar.ml b/middle_end/flambda2/types/grammar/type_grammar.ml index 99f80cf67be..7aa186b8e62 100644 --- a/middle_end/flambda2/types/grammar/type_grammar.ml +++ b/middle_end/flambda2/types/grammar/type_grammar.ml @@ -16,6 +16,7 @@ module K = Flambda_kind module Float = Numeric_types.Float_by_bit_pattern +module Vec128 = Numeric_types.Vec128_by_bit_pattern module Int32 = Numeric_types.Int32 module Int64 = Numeric_types.Int64 module RWC = Reg_width_const @@ -44,6 +45,7 @@ type t = | Naked_int32 of head_of_kind_naked_int32 TD.t | Naked_int64 of head_of_kind_naked_int64 TD.t | Naked_nativeint of head_of_kind_naked_nativeint TD.t + | Naked_vec128 of head_of_kind_naked_vec128 TD.t | Rec_info of head_of_kind_rec_info TD.t | Region of head_of_kind_region TD.t @@ -58,6 +60,7 @@ and head_of_kind_value = | Boxed_int32 of t * Alloc_mode.For_types.t | Boxed_int64 of t * Alloc_mode.For_types.t | Boxed_nativeint of t * Alloc_mode.For_types.t + | Boxed_vec128 of t * Alloc_mode.For_types.t | Closures of { by_function_slot : row_like_for_closures; alloc_mode : Alloc_mode.For_types.t @@ -110,6 +113,8 @@ and head_of_kind_naked_int64 = Int64.Set.t and head_of_kind_naked_nativeint = Targetint_32_64.Set.t +and head_of_kind_naked_vec128 = Vec128.Set.t + and head_of_kind_rec_info = Rec_info_expr.t and head_of_kind_region = unit @@ -219,6 +224,9 @@ let rec free_names0 ~follow_value_slots t = | Naked_nativeint ty -> type_descr_free_names ~free_names_head:free_names_head_of_kind_naked_nativeint ty + | Naked_vec128 ty -> + type_descr_free_names ~free_names_head:free_names_head_of_kind_naked_vec128 + ty | Rec_info ty -> type_descr_free_names ~free_names_head:free_names_head_of_kind_rec_info ty | Region ty -> @@ -237,6 +245,7 @@ and free_names_head_of_kind_value0 ~follow_value_slots head = | Boxed_int32 (ty, _alloc_mode) -> free_names0 ~follow_value_slots ty | Boxed_int64 (ty, _alloc_mode) -> free_names0 ~follow_value_slots ty | Boxed_nativeint (ty, _alloc_mode) -> free_names0 ~follow_value_slots ty + | Boxed_vec128 (ty, _alloc_mode) -> free_names0 ~follow_value_slots ty | Closures { by_function_slot; alloc_mode = _ } -> free_names_row_like_for_closures ~follow_value_slots by_function_slot | String _ -> Name_occurrences.empty @@ -271,6 +280,8 @@ and free_names_head_of_kind_naked_int64 _ = Name_occurrences.empty and free_names_head_of_kind_naked_nativeint _ = Name_occurrences.empty +and free_names_head_of_kind_naked_vec128 _ = Name_occurrences.empty + and free_names_head_of_kind_rec_info head = Rec_info_expr.free_names_in_types head @@ -451,6 +462,13 @@ let rec apply_renaming t renaming = ~free_names_head:free_names_head_of_kind_naked_nativeint ty renaming in if ty == ty' then t else Naked_nativeint ty' + | Naked_vec128 ty -> + let ty' = + TD.apply_renaming + ~apply_renaming_head:apply_renaming_head_of_kind_naked_vec128 + ~free_names_head:free_names_head_of_kind_naked_vec128 ty renaming + in + if ty == ty' then t else Naked_vec128 ty' | Rec_info ty -> let ty' = TD.apply_renaming @@ -493,6 +511,9 @@ and apply_renaming_head_of_kind_value head renaming = | Boxed_nativeint (ty, alloc_mode) -> let ty' = apply_renaming ty renaming in if ty == ty' then head else Boxed_nativeint (ty', alloc_mode) + | Boxed_vec128 (ty, alloc_mode) -> + let ty' = apply_renaming ty renaming in + if ty == ty' then head else Boxed_vec128 (ty', alloc_mode) | Closures { by_function_slot; alloc_mode } -> let by_function_slot' = apply_renaming_row_like_for_closures by_function_slot renaming @@ -554,6 +575,8 @@ and apply_renaming_head_of_kind_naked_int64 head _ = head and apply_renaming_head_of_kind_naked_nativeint head _ = head +and apply_renaming_head_of_kind_naked_vec128 head _ = head + and apply_renaming_head_of_kind_rec_info head renaming = Rec_info_expr.apply_renaming head renaming @@ -712,6 +735,10 @@ let rec print ppf t = Format.fprintf ppf "@[(Naked_nativeint@ %a)@]" (TD.print ~print_head:print_head_of_kind_naked_nativeint) ty + | Naked_vec128 ty -> + Format.fprintf ppf "@[(Naked_vec128@ %a)@]" + (TD.print ~print_head:print_head_of_kind_naked_vec128) + ty | Rec_info ty -> Format.fprintf ppf "@[(Rec_info@ %a)@]" (TD.print ~print_head:print_head_of_kind_rec_info) @@ -747,6 +774,9 @@ and print_head_of_kind_value ppf head = | Boxed_nativeint (ty, alloc_mode) -> Format.fprintf ppf "@[(Boxed_nativeint@ %a@ %a)@]" Alloc_mode.For_types.print alloc_mode print ty + | Boxed_vec128 (ty, alloc_mode) -> + Format.fprintf ppf "@[(Boxed_vec128@ %a@ %a)@]" + Alloc_mode.For_types.print alloc_mode print ty | Closures { by_function_slot; alloc_mode } -> print_row_like_for_closures alloc_mode ppf by_function_slot | String str_infos -> @@ -797,6 +827,9 @@ and print_head_of_kind_naked_nativeint ppf head = Format.fprintf ppf "@[(Naked_nativeint@ (%a))@]" Targetint_32_64.Set.print head +and print_head_of_kind_naked_vec128 ppf head = + Format.fprintf ppf "@[(Naked_vec128@ (%a))@]" Vec128.Set.print head + and print_head_of_kind_rec_info ppf head = Rec_info_expr.print ppf head and print_head_of_kind_region ppf () = Format.pp_print_string ppf "Region" @@ -925,6 +958,9 @@ let rec ids_for_export t = | Naked_nativeint ty -> TD.ids_for_export ~ids_for_export_head:ids_for_export_head_of_kind_naked_nativeint ty + | Naked_vec128 ty -> + TD.ids_for_export + ~ids_for_export_head:ids_for_export_head_of_kind_naked_vec128 ty | Rec_info ty -> TD.ids_for_export ~ids_for_export_head:ids_for_export_head_of_kind_rec_info ty @@ -942,6 +978,7 @@ and ids_for_export_head_of_kind_value head = | Boxed_int32 (t, _alloc_mode) -> ids_for_export t | Boxed_int64 (t, _alloc_mode) -> ids_for_export t | Boxed_nativeint (t, _alloc_mode) -> ids_for_export t + | Boxed_vec128 (t, _alloc_mode) -> ids_for_export t | Closures { by_function_slot; alloc_mode = _ } -> ids_for_export_row_like_for_closures by_function_slot | String _ -> Ids_for_export.empty @@ -972,6 +1009,8 @@ and ids_for_export_head_of_kind_naked_int32 _ = Ids_for_export.empty and ids_for_export_head_of_kind_naked_int64 _ = Ids_for_export.empty +and ids_for_export_head_of_kind_naked_vec128 _ = Ids_for_export.empty + and ids_for_export_head_of_kind_naked_nativeint _ = Ids_for_export.empty and ids_for_export_head_of_kind_rec_info head = @@ -1124,6 +1163,13 @@ let rec apply_coercion t coercion : t Or_bottom.t = coercion ty in if ty == ty' then t else Naked_nativeint ty' + | Naked_vec128 ty -> + let<+ ty' = + TD.apply_coercion + ~apply_coercion_head:apply_coercion_head_of_kind_naked_vec128 coercion + ty + in + if ty == ty' then t else Naked_vec128 ty' | Rec_info ty -> let<+ ty' = TD.apply_coercion @@ -1157,7 +1203,8 @@ and apply_coercion_head_of_kind_value head coercion : _ Or_bottom.t = to have a [Boxed_float] wrapper that would lift a float coercion to a value coercion. *) if Coercion.is_id coercion then Ok head else Bottom - | Boxed_int32 _ | Boxed_int64 _ | Boxed_nativeint _ | String _ -> + | Boxed_int32 _ | Boxed_int64 _ | Boxed_nativeint _ | Boxed_vec128 _ + | String _ -> (* Similarly, we don't have lifted coercions for these. *) if Coercion.is_id coercion then Ok head else Bottom | Array @@ -1193,6 +1240,9 @@ and apply_coercion_head_of_kind_naked_int64 head coercion : _ Or_bottom.t = and apply_coercion_head_of_kind_naked_nativeint head coercion : _ Or_bottom.t = if Coercion.is_id coercion then Ok head else Bottom +and apply_coercion_head_of_kind_naked_vec128 head coercion : _ Or_bottom.t = + if Coercion.is_id coercion then Ok head else Bottom + and apply_coercion_head_of_kind_rec_info head coercion : _ Or_bottom.t = (* Currently no coercion has an effect on a depth variable and [Rec_info_expr.t] does not contain any other variety of name. *) @@ -1440,6 +1490,14 @@ let rec remove_unused_value_slots_and_shortcut_aliases t ~used_value_slots remove_unused_value_slots_and_shortcut_aliases_head_of_kind_naked_nativeint in if ty == ty' then t else Naked_nativeint ty' + | Naked_vec128 ty -> + let ty' = + TD.remove_unused_value_slots_and_shortcut_aliases ty ~used_value_slots + ~canonicalise + ~remove_unused_value_slots_and_shortcut_aliases_head: + remove_unused_value_slots_and_shortcut_aliases_head_of_kind_naked_vec128 + in + if ty == ty' then t else Naked_vec128 ty' | Rec_info ty -> let ty' = TD.remove_unused_value_slots_and_shortcut_aliases ty ~used_value_slots @@ -1499,6 +1557,12 @@ and remove_unused_value_slots_and_shortcut_aliases_head_of_kind_value head ~canonicalise in if ty == ty' then head else Boxed_nativeint (ty', alloc_mode) + | Boxed_vec128 (ty, alloc_mode) -> + let ty' = + remove_unused_value_slots_and_shortcut_aliases ty ~used_value_slots + ~canonicalise + in + if ty == ty' then head else Boxed_vec128 (ty', alloc_mode) | Closures { by_function_slot; alloc_mode } -> let by_function_slot' = remove_unused_value_slots_and_shortcut_aliases_row_like_for_closures @@ -1586,6 +1650,10 @@ and remove_unused_value_slots_and_shortcut_aliases_head_of_kind_naked_nativeint head ~used_value_slots:_ ~canonicalise:_ = head +and remove_unused_value_slots_and_shortcut_aliases_head_of_kind_naked_vec128 + head ~used_value_slots:_ ~canonicalise:_ = + head + and remove_unused_value_slots_and_shortcut_aliases_head_of_kind_rec_info head ~used_value_slots:_ ~canonicalise:_ = head @@ -1778,7 +1846,7 @@ let rec project_variables_out ~to_project ~expand t = match apply_coercion (expand var) coercion with | Value ty -> ty | ( Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ ) as ty -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ ) as ty -> Misc.fatal_errorf "Wrong kind while expanding %a: expecting [Value], got type %a" Variable.print var print ty @@ -1795,7 +1863,7 @@ let rec project_variables_out ~to_project ~expand t = match apply_coercion (expand var) coercion with | Naked_immediate ty -> ty | ( Value _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ ) as ty -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ ) as ty -> Misc.fatal_errorf "Wrong kind while expanding %a: expecting [Naked_immediate], got \ type %a" @@ -1814,7 +1882,7 @@ let rec project_variables_out ~to_project ~expand t = match apply_coercion (expand var) coercion with | Naked_float ty -> ty | ( Value _ | Naked_immediate _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ ) as ty -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ ) as ty -> Misc.fatal_errorf "Wrong kind while expanding %a: expecting [Naked_float], got type %a" Variable.print var print ty @@ -1832,7 +1900,7 @@ let rec project_variables_out ~to_project ~expand t = match apply_coercion (expand var) coercion with | Naked_int32 ty -> ty | ( Value _ | Naked_immediate _ | Naked_float _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ ) as ty -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ ) as ty -> Misc.fatal_errorf "Wrong kind while expanding %a: expecting [Naked_int32], got type %a" Variable.print var print ty @@ -1850,7 +1918,7 @@ let rec project_variables_out ~to_project ~expand t = match apply_coercion (expand var) coercion with | Naked_int64 ty -> ty | ( Value _ | Naked_immediate _ | Naked_float _ | Naked_int32 _ - | Naked_nativeint _ | Rec_info _ | Region _ ) as ty -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ ) as ty -> Misc.fatal_errorf "Wrong kind while expanding %a: expecting [Naked_int64], got type %a" Variable.print var print ty @@ -1868,7 +1936,7 @@ let rec project_variables_out ~to_project ~expand t = match apply_coercion (expand var) coercion with | Naked_nativeint ty -> ty | ( Value _ | Naked_immediate _ | Naked_float _ | Naked_int32 _ - | Naked_int64 _ | Rec_info _ | Region _ ) as ty -> + | Naked_vec128 _ | Naked_int64 _ | Rec_info _ | Region _ ) as ty -> Misc.fatal_errorf "Wrong kind while expanding %a: expecting [Naked_nativeint], got \ type %a" @@ -1882,12 +1950,31 @@ let rec project_variables_out ~to_project ~expand t = ty in if ty == ty' then t else Naked_nativeint ty' + | Naked_vec128 ty -> + let expand_with_coercion var ~coercion = + match apply_coercion (expand var) coercion with + | Naked_vec128 ty -> ty + | ( Value _ | Naked_immediate _ | Naked_float _ | Naked_int32 _ + | Naked_nativeint _ | Naked_int64 _ | Rec_info _ | Region _ ) as ty -> + Misc.fatal_errorf + "Wrong kind while expanding %a: expecting [Naked_vec128], got type %a" + Variable.print var print ty + in + let ty' = + TD.project_variables_out + ~free_names_head:free_names_head_of_kind_naked_vec128 ~to_project + ~expand:expand_with_coercion + ~project_head:(project_head_of_kind_naked_vec128 ~to_project ~expand) + ty + in + if ty == ty' then t else Naked_vec128 ty' | Rec_info ty -> let expand_with_coercion var ~coercion = match apply_coercion (expand var) coercion with | Rec_info ty -> ty | ( Value _ | Naked_immediate _ | Naked_float _ | Naked_int32 _ - | Naked_int64 _ | Naked_nativeint _ | Region _ ) as ty -> + | Naked_vec128 _ | Naked_int64 _ | Naked_nativeint _ | Region _ ) as ty + -> Misc.fatal_errorf "Wrong kind while expanding %a: expecting [Rec_info], got type %a" Variable.print var print ty @@ -1904,7 +1991,8 @@ let rec project_variables_out ~to_project ~expand t = match apply_coercion (expand var) coercion with | Region ty -> ty | ( Value _ | Naked_immediate _ | Naked_float _ | Naked_int32 _ - | Naked_int64 _ | Naked_nativeint _ | Rec_info _ ) as ty -> + | Naked_vec128 _ | Naked_int64 _ | Naked_nativeint _ | Rec_info _ ) as + ty -> Misc.fatal_errorf "Wrong kind while expanding %a: expecting [Region], got type %a" Variable.print var print ty @@ -1944,6 +2032,9 @@ and project_head_of_kind_value ~to_project ~expand head = | Boxed_nativeint (ty, alloc_mode) -> let ty' = project_variables_out ~to_project ~expand ty in if ty == ty' then head else Boxed_nativeint (ty', alloc_mode) + | Boxed_vec128 (ty, alloc_mode) -> + let ty' = project_variables_out ~to_project ~expand ty in + if ty == ty' then head else Boxed_vec128 (ty', alloc_mode) | Closures { by_function_slot; alloc_mode } -> let by_function_slot' = project_row_like_for_closures ~to_project ~expand by_function_slot @@ -2005,6 +2096,8 @@ and project_head_of_kind_naked_int64 ~to_project:_ ~expand:_ head = head and project_head_of_kind_naked_nativeint ~to_project:_ ~expand:_ head = head +and project_head_of_kind_naked_vec128 ~to_project:_ ~expand:_ head = head + and project_head_of_kind_rec_info ~to_project ~expand:_ head = match (head : head_of_kind_rec_info) with | Const _ | Succ _ | Unroll_to _ -> head @@ -2176,6 +2269,7 @@ let kind t = | Naked_int32 _ -> K.naked_int32 | Naked_int64 _ -> K.naked_int64 | Naked_nativeint _ -> K.naked_nativeint + | Naked_vec128 _ -> K.naked_vec128 | Rec_info _ -> K.rec_info | Region _ -> K.region @@ -2383,6 +2477,7 @@ module Row_like_for_blocks = struct | Naked_number Naked_int32 | Naked_number Naked_int64 | Naked_number Naked_nativeint + | Naked_number Naked_vec128 | Region | Rec_info -> Misc.fatal_errorf "Bad kind %a for fields" Flambda_kind.print field_kind) @@ -2404,6 +2499,7 @@ module Row_like_for_blocks = struct | Naked_number Naked_int32 | Naked_number Naked_int64 | Naked_number Naked_nativeint + | Naked_number Naked_vec128 | Region | Rec_info -> Misc.fatal_errorf "Bad kind %a for fields" Flambda_kind.print field_kind) @@ -2628,6 +2724,7 @@ let get_alias_exn t = | Naked_int32 ty -> TD.get_alias_exn ty | Naked_int64 ty -> TD.get_alias_exn ty | Naked_nativeint ty -> TD.get_alias_exn ty + | Naked_vec128 ty -> TD.get_alias_exn ty | Rec_info ty -> TD.get_alias_exn ty | Region ty -> TD.get_alias_exn ty @@ -2642,6 +2739,7 @@ let is_obviously_bottom t = | Naked_int32 ty -> TD.is_obviously_bottom ty | Naked_int64 ty -> TD.is_obviously_bottom ty | Naked_nativeint ty -> TD.is_obviously_bottom ty + | Naked_vec128 ty -> TD.is_obviously_bottom ty | Rec_info ty -> TD.is_obviously_bottom ty | Region ty -> TD.is_obviously_bottom ty @@ -2653,6 +2751,7 @@ let is_obviously_unknown t = | Naked_int32 ty -> TD.is_obviously_unknown ty | Naked_int64 ty -> TD.is_obviously_unknown ty | Naked_nativeint ty -> TD.is_obviously_unknown ty + | Naked_vec128 ty -> TD.is_obviously_unknown ty | Rec_info ty -> TD.is_obviously_unknown ty | Region ty -> TD.is_obviously_unknown ty @@ -2664,6 +2763,7 @@ let alias_type_of (kind : K.t) name : t = | Naked_number Naked_int32 -> Naked_int32 (TD.create_equals name) | Naked_number Naked_int64 -> Naked_int64 (TD.create_equals name) | Naked_number Naked_nativeint -> Naked_nativeint (TD.create_equals name) + | Naked_number Naked_vec128 -> Naked_vec128 (TD.create_equals name) | Rec_info -> Rec_info (TD.create_equals name) | Region -> Region (TD.create_equals name) @@ -2679,6 +2779,8 @@ let bottom_naked_int64 = Naked_int64 TD.bottom let bottom_naked_nativeint = Naked_nativeint TD.bottom +let bottom_naked_vec128 = Naked_vec128 TD.bottom + let bottom_rec_info = Rec_info TD.bottom let bottom_region = Region TD.bottom @@ -2695,6 +2797,8 @@ let any_naked_int64 = Naked_int64 TD.unknown let any_naked_nativeint = Naked_nativeint TD.unknown +let any_naked_vec128 = Naked_vec128 TD.unknown + let any_region = Region TD.unknown let any_rec_info = Rec_info TD.unknown @@ -2714,6 +2818,9 @@ let this_naked_int64 i : t = let this_naked_nativeint i : t = Naked_nativeint (TD.create_equals (Simple.const (RWC.naked_nativeint i))) +let this_naked_vec128 i : t = + Naked_vec128 (TD.create_equals (Simple.const (RWC.naked_vec128 i))) + let these_naked_immediates is = match Targetint_31_63.Set.get_singleton is with | Some i -> this_naked_immediate i @@ -2757,21 +2864,21 @@ let these_naked_nativeints is = let box_float (t : t) alloc_mode : t = match t with | Naked_float _ -> Value (TD.create (Boxed_float (t, alloc_mode))) - | Value _ | Naked_immediate _ | Naked_int32 _ | Naked_int64 _ + | Value _ | Naked_immediate _ | Naked_int32 _ | Naked_int64 _ | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> Misc.fatal_errorf "Type of wrong kind for [box_float]: %a" print t let box_int32 (t : t) alloc_mode : t = match t with | Naked_int32 _ -> Value (TD.create (Boxed_int32 (t, alloc_mode))) - | Value _ | Naked_immediate _ | Naked_float _ | Naked_int64 _ + | Value _ | Naked_immediate _ | Naked_float _ | Naked_int64 _ | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> Misc.fatal_errorf "Type of wrong kind for [box_int32]: %a" print t let box_int64 (t : t) alloc_mode : t = match t with | Naked_int64 _ -> Value (TD.create (Boxed_int64 (t, alloc_mode))) - | Value _ | Naked_immediate _ | Naked_float _ | Naked_int32 _ + | Value _ | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> Misc.fatal_errorf "Type of wrong kind for [box_int64]: %a" print t @@ -2779,9 +2886,16 @@ let box_nativeint (t : t) alloc_mode : t = match t with | Naked_nativeint _ -> Value (TD.create (Boxed_nativeint (t, alloc_mode))) | Value _ | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Rec_info _ | Region _ -> + | Naked_vec128 _ | Rec_info _ | Region _ -> Misc.fatal_errorf "Type of wrong kind for [box_nativeint]: %a" print t +let box_vec128 (t : t) alloc_mode : t = + match t with + | Naked_vec128 _ -> Value (TD.create (Boxed_vec128 (t, alloc_mode))) + | Value _ | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ + | Naked_nativeint _ | Rec_info _ | Region _ -> + Misc.fatal_errorf "Type of wrong kind for [box_vec128]: %a" print t + let this_tagged_immediate imm : t = Value (TD.create_equals (Simple.const (RWC.tagged_immediate imm))) @@ -2796,7 +2910,7 @@ let tag_immediate t : t = blocks = Known Row_like_for_blocks.bottom })) | Value _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ | Naked_nativeint _ - | Rec_info _ | Region _ -> + | Naked_vec128 _ | Rec_info _ | Region _ -> Misc.fatal_errorf "Type of wrong kind for [tag_immediate]: %a" print t let tagged_immediate_alias_to ~naked_immediate : t = @@ -2822,6 +2936,9 @@ let boxed_nativeint_alias_to ~naked_nativeint = box_nativeint (Naked_nativeint (TD.create_equals (Simple.var naked_nativeint))) +let boxed_vec128_alias_to ~naked_vec128 = + box_vec128 (Naked_vec128 (TD.create_equals (Simple.var naked_vec128))) + let this_immutable_string str = let size = Targetint_31_63.of_int (String.length str) in let string_info = @@ -2874,6 +2991,8 @@ module Descr = struct | Naked_int64 of head_of_kind_naked_int64 TD.Descr.t Or_unknown_or_bottom.t | Naked_nativeint of head_of_kind_naked_nativeint TD.Descr.t Or_unknown_or_bottom.t + | Naked_vec128 of + head_of_kind_naked_vec128 TD.Descr.t Or_unknown_or_bottom.t | Rec_info of head_of_kind_rec_info TD.Descr.t Or_unknown_or_bottom.t | Region of head_of_kind_region TD.Descr.t Or_unknown_or_bottom.t end @@ -2886,6 +3005,7 @@ let descr t : Descr.t = | Naked_int32 ty -> Naked_int32 (TD.descr ty) | Naked_int64 ty -> Naked_int64 (TD.descr ty) | Naked_nativeint ty -> Naked_nativeint (TD.descr ty) + | Naked_vec128 ty -> Naked_vec128 (TD.descr ty) | Rec_info ty -> Rec_info (TD.descr ty) | Region ty -> Region (TD.descr ty) @@ -3003,7 +3123,8 @@ let rec recover_some_aliases t = | Ok (No_alias ( Mutable_block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ - | Boxed_nativeint _ | String _ | Closures _ | Array _ )) -> + | Boxed_vec128 _ | Boxed_nativeint _ | String _ | Closures _ | Array _ + )) -> t | Ok (No_alias (Variant { immediates; blocks; is_unique = _ })) -> ( match blocks with @@ -3027,13 +3148,13 @@ let rec recover_some_aliases t = match Reg_width_const.descr const with | Naked_immediate i -> this_tagged_immediate i | Tagged_immediate _ | Naked_float _ | Naked_int32 _ - | Naked_int64 _ | Naked_nativeint _ -> + | Naked_int64 _ | Naked_nativeint _ | Naked_vec128 _ -> Misc.fatal_errorf "Immediates case returned wrong kind of constant:@ %a" Reg_width_const.print const) | Unknown | Bottom | Ok (No_alias _) -> t) | Value _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> Misc.fatal_errorf "Immediates case returned wrong kind:@ %a" print t' ())))) | Naked_immediate ty -> ( @@ -3072,4 +3193,11 @@ let rec recover_some_aliases t = match Targetint_32_64.Set.get_singleton is with | Some f -> this_naked_nativeint f | None -> t)) + | Naked_vec128 ty -> ( + match TD.descr ty with + | Unknown | Bottom | Ok (Equals _) -> t + | Ok (No_alias is) -> ( + match Vec128.Set.get_singleton is with + | Some f -> this_naked_vec128 f + | None -> t)) | Rec_info _ | Region _ -> t diff --git a/middle_end/flambda2/types/grammar/type_grammar.mli b/middle_end/flambda2/types/grammar/type_grammar.mli index 42c4a01da1e..be0c2363118 100644 --- a/middle_end/flambda2/types/grammar/type_grammar.mli +++ b/middle_end/flambda2/types/grammar/type_grammar.mli @@ -36,6 +36,7 @@ type t = private | Naked_int32 of head_of_kind_naked_int32 Type_descr.t | Naked_int64 of head_of_kind_naked_int64 Type_descr.t | Naked_nativeint of head_of_kind_naked_nativeint Type_descr.t + | Naked_vec128 of head_of_kind_naked_vec128 Type_descr.t | Rec_info of head_of_kind_rec_info Type_descr.t | Region of head_of_kind_region Type_descr.t @@ -51,6 +52,7 @@ and head_of_kind_value = private | Boxed_int32 of t * Alloc_mode.For_types.t | Boxed_int64 of t * Alloc_mode.For_types.t | Boxed_nativeint of t * Alloc_mode.For_types.t + | Boxed_vec128 of t * Alloc_mode.For_types.t | Closures of { by_function_slot : row_like_for_closures; alloc_mode : Alloc_mode.For_types.t @@ -80,6 +82,9 @@ and head_of_kind_naked_int64 = private Numeric_types.Int64.Set.t and head_of_kind_naked_nativeint = private Targetint_32_64.Set.t +and head_of_kind_naked_vec128 = private + Numeric_types.Vec128_by_bit_pattern.Set.t + and head_of_kind_rec_info = Rec_info_expr.t and head_of_kind_region = unit @@ -183,6 +188,8 @@ val bottom_naked_int64 : t val bottom_naked_nativeint : t +val bottom_naked_vec128 : t + val bottom_rec_info : t val bottom_region : t @@ -199,6 +206,8 @@ val any_naked_int64 : t val any_naked_nativeint : t +val any_naked_vec128 : t + val any_region : t val any_rec_info : t @@ -217,6 +226,8 @@ val this_naked_int64 : Numeric_types.Int64.t -> t val this_naked_nativeint : Targetint_32_64.t -> t +val this_naked_vec128 : Numeric_types.Vec128_by_bit_pattern.t -> t + val these_naked_immediates : Targetint_31_63.Set.t -> t val these_naked_floats : Numeric_types.Float_by_bit_pattern.Set.t -> t @@ -236,6 +247,9 @@ val boxed_int64_alias_to : naked_int64:Variable.t -> Alloc_mode.For_types.t -> t val boxed_nativeint_alias_to : naked_nativeint:Variable.t -> Alloc_mode.For_types.t -> t +val boxed_vec128_alias_to : + naked_vec128:Variable.t -> Alloc_mode.For_types.t -> t + val box_float : t -> Alloc_mode.For_types.t -> t val box_int32 : t -> Alloc_mode.For_types.t -> t @@ -244,6 +258,8 @@ val box_int64 : t -> Alloc_mode.For_types.t -> t val box_nativeint : t -> Alloc_mode.For_types.t -> t +val box_vec128 : t -> Alloc_mode.For_types.t -> t + val tagged_immediate_alias_to : naked_immediate:Variable.t -> t val tag_immediate : t -> t @@ -498,6 +514,8 @@ module Descr : sig head_of_kind_naked_int64 Type_descr.Descr.t Or_unknown_or_bottom.t | Naked_nativeint of head_of_kind_naked_nativeint Type_descr.Descr.t Or_unknown_or_bottom.t + | Naked_vec128 of + head_of_kind_naked_vec128 Type_descr.Descr.t Or_unknown_or_bottom.t | Rec_info of head_of_kind_rec_info Type_descr.Descr.t Or_unknown_or_bottom.t | Region of head_of_kind_region Type_descr.Descr.t Or_unknown_or_bottom.t diff --git a/middle_end/printclambda.ml b/middle_end/printclambda.ml index 984c31715c9..af351ac9d8b 100644 --- a/middle_end/printclambda.ml +++ b/middle_end/printclambda.ml @@ -60,6 +60,7 @@ let layout (layout : Lambda.layout) = | Punboxed_int Pint32 -> ":unboxed_int32" | Punboxed_int Pint64 -> ":unboxed_int64" | Punboxed_int Pnativeint -> ":unboxed_nativeint" + | Punboxed_vector Pvec128 -> ":unboxed_vec128" let rec structured_constant ppf = function | Uconst_float x -> fprintf ppf "%F" x diff --git a/ocaml/lambda/lambda.ml b/ocaml/lambda/lambda.ml index 48f210df8a7..939f4c393d1 100644 --- a/ocaml/lambda/lambda.ml +++ b/ocaml/lambda/lambda.ml @@ -266,6 +266,7 @@ and layout = | Pvalue of value_kind | Punboxed_float | Punboxed_int of boxed_integer + | Punboxed_vector of boxed_vector | Pbottom and block_shape = @@ -289,6 +290,9 @@ and array_set_kind = and boxed_integer = Primitive.boxed_integer = Pnativeint | Pint32 | Pint64 +and boxed_vector = Primitive.boxed_vector = + | Pvec128 + and bigarray_kind = Pbigarray_unknown | Pbigarray_float32 | Pbigarray_float64 @@ -310,6 +314,8 @@ and raise_kind = let equal_boxed_integer = Primitive.equal_boxed_integer +let equal_boxed_vector = Primitive.equal_boxed_vector + let equal_primitive = (* Should be implemented like [equal_value_kind] of [equal_boxed_integer], i.e. by matching over the various constructors but the type has more @@ -354,9 +360,10 @@ let compatible_layout x y = | Punboxed_float, Punboxed_float -> true | Punboxed_int bi1, Punboxed_int bi2 -> equal_boxed_integer bi1 bi2 + | Punboxed_vector bi1, Punboxed_vector bi2 -> equal_boxed_vector bi1 bi2 | Ptop, Ptop -> true | Ptop, _ | _, Ptop -> false - | (Pvalue _ | Punboxed_float | Punboxed_int _), _ -> false + | (Pvalue _ | Punboxed_float | Punboxed_int _ | Punboxed_vector _), _ -> false let must_be_value layout = match layout with diff --git a/ocaml/lambda/lambda.mli b/ocaml/lambda/lambda.mli index 09ea1eb336d..3564a6107c8 100644 --- a/ocaml/lambda/lambda.mli +++ b/ocaml/lambda/lambda.mli @@ -243,6 +243,7 @@ and layout = | Pvalue of value_kind | Punboxed_float | Punboxed_int of boxed_integer + | Punboxed_vector of boxed_vector | Pbottom and block_shape = @@ -251,6 +252,9 @@ and block_shape = and boxed_integer = Primitive.boxed_integer = Pnativeint | Pint32 | Pint64 +and boxed_vector = Primitive.boxed_vector = + | Pvec128 + and bigarray_kind = Pbigarray_unknown | Pbigarray_float32 | Pbigarray_float64 @@ -280,6 +284,8 @@ val compatible_layout : layout -> layout -> bool val equal_boxed_integer : boxed_integer -> boxed_integer -> bool +val equal_boxed_vector : boxed_vector -> boxed_vector -> bool + val must_be_value : layout -> value_kind type structured_constant = diff --git a/ocaml/lambda/printlambda.ml b/ocaml/lambda/printlambda.ml index 9f6b1aaac15..5baeada60c7 100644 --- a/ocaml/lambda/printlambda.ml +++ b/ocaml/lambda/printlambda.ml @@ -85,6 +85,9 @@ let boxed_integer_name = function | Pint32 -> "int32" | Pint64 -> "int64" +let boxed_vector_name = function + | Pvec128 -> "vec128" + let variant_kind print_contents ppf ~consts ~non_consts = fprintf ppf "@[[(consts (%a))@ (non_consts (%a))]@]" (Format.pp_print_list ~pp_sep:Format.pp_print_space Format.pp_print_int) @@ -124,6 +127,7 @@ let layout ppf layout = | Pbottom -> fprintf ppf "[bottom]" | Punboxed_float -> fprintf ppf "[unboxed_float]" | Punboxed_int bi -> fprintf ppf "[unboxed_%s]" (boxed_integer_name bi) + | Punboxed_vector bi -> fprintf ppf "[unboxed_%s]" (boxed_vector_name bi) let return_kind ppf (mode, kind) = let smode = alloc_mode mode in @@ -139,6 +143,7 @@ let return_kind ppf (mode, kind) = variant_kind value_kind' ppf ~consts ~non_consts | Punboxed_float -> fprintf ppf ": unboxed_float@ " | Punboxed_int bi -> fprintf ppf ": unboxed_%s@ " (boxed_integer_name bi) + | Punboxed_vector bi -> fprintf ppf ": unboxed_%s@ " (boxed_vector_name bi) | Ptop -> fprintf ppf ": top@ " | Pbottom -> fprintf ppf ": bottom@ " diff --git a/ocaml/typing/primitive.ml b/ocaml/typing/primitive.ml index 34804aaee3b..21249d00a4d 100644 --- a/ocaml/typing/primitive.ml +++ b/ocaml/typing/primitive.ml @@ -21,9 +21,12 @@ open Layouts type boxed_integer = Pnativeint | Pint32 | Pint64 +type boxed_vector = Pvec128 + type native_repr = | Same_as_ocaml_repr of Layouts.Sort.const | Unboxed_float + | Unboxed_vector of boxed_vector | Unboxed_integer of boxed_integer | Untagged_int @@ -58,6 +61,7 @@ exception Error of Location.t * error let is_ocaml_repr = function | _, Same_as_ocaml_repr _ -> true | _, Unboxed_float + | _, Unboxed_vector _ | _, Unboxed_integer _ | _, Untagged_int -> false @@ -65,12 +69,14 @@ let is_unboxed = function | _, Same_as_ocaml_repr _ | _, Untagged_int -> false | _, Unboxed_float + | _, Unboxed_vector _ | _, Unboxed_integer _ -> true let is_untagged = function | _, Untagged_int -> true | _, Same_as_ocaml_repr _ | _, Unboxed_float + | _, Unboxed_vector _ | _, Unboxed_integer _ -> false let rec make_native_repr_args arity x = @@ -257,6 +263,7 @@ let print p osig_val_decl = (match repr with | Same_as_ocaml_repr _ -> [] | Unboxed_float + | Unboxed_vector _ | Unboxed_integer _ -> if all_unboxed then [] else [oattr_unboxed] | Untagged_int -> if all_untagged then [] else [oattr_untagged]) in @@ -286,6 +293,10 @@ let equal_boxed_integer bi1 bi2 = | (Pnativeint | Pint32 | Pint64), _ -> false +let equal_boxed_vector bi1 bi2 = + match bi1, bi2 with + | Pvec128, Pvec128 -> true + let equal_native_repr nr1 nr2 = match nr1, nr2 with | Same_as_ocaml_repr s1, Same_as_ocaml_repr s2 -> Sort.equal_const s1 s2 diff --git a/ocaml/typing/primitive.mli b/ocaml/typing/primitive.mli index a52e550c5fe..98c15b2158d 100644 --- a/ocaml/typing/primitive.mli +++ b/ocaml/typing/primitive.mli @@ -17,11 +17,14 @@ type boxed_integer = Pnativeint | Pint32 | Pint64 +type boxed_vector = Pvec128 + (* Representation of arguments/result for the native code version of a primitive *) type native_repr = | Same_as_ocaml_repr of Layouts.Sort.const | Unboxed_float + | Unboxed_vector of boxed_vector | Unboxed_integer of boxed_integer | Untagged_int @@ -88,6 +91,7 @@ val native_name: description -> string val byte_name: description -> string val equal_boxed_integer : boxed_integer -> boxed_integer -> bool +val equal_boxed_vector : boxed_vector -> boxed_vector -> bool val equal_native_repr : native_repr -> native_repr -> bool val equal_effects : effects -> effects -> bool val equal_coeffects : coeffects -> coeffects -> bool diff --git a/ocaml/typing/typeopt.ml b/ocaml/typing/typeopt.ml index 48eb70aebee..fae58689863 100644 --- a/ocaml/typing/typeopt.ml +++ b/ocaml/typing/typeopt.ml @@ -569,7 +569,9 @@ let layout_union l1 l2 = | Punboxed_float, Punboxed_float -> Punboxed_float | Punboxed_int bi1, Punboxed_int bi2 -> if equal_boxed_integer bi1 bi2 then l1 else Ptop - | (Ptop | Pvalue _ | Punboxed_float | Punboxed_int _), _ -> + | Punboxed_vector bi1, Punboxed_vector bi2 -> + if equal_boxed_vector bi1 bi2 then l1 else Ptop + | (Ptop | Pvalue _ | Punboxed_float | Punboxed_int _ | Punboxed_vector _), _ -> Ptop (* Error report *) From 060b3c3ab666fc1c666c35ad26aedac9a1d05a41 Mon Sep 17 00:00:00 2001 From: Max Slater Date: Tue, 13 Jun 2023 17:56:51 -0400 Subject: [PATCH 04/81] rebase --- backend/CSEgen.ml | 2 +- backend/afl_instrument.ml | 2 +- backend/amd64/CSE.ml | 2 +- backend/amd64/emit.mlp | 29 +++- backend/amd64/proc.ml | 8 +- backend/amd64/regalloc_stack_operands.ml | 4 +- backend/amd64/reload.ml | 2 +- backend/amd64/selection.ml | 4 +- backend/cfg/cfg.ml | 13 +- backend/cfg/cfg_intf.ml | 1 + backend/cfg/cfg_to_linear_desc.ml | 1 + backend/cfg/cfgize.ml | 10 +- backend/cfg/linear_to_cfg.ml | 1 + backend/checkmach.ml | 4 +- backend/cmm.ml | 5 + backend/cmm.mli | 2 +- backend/cmm_helpers.ml | 58 ++++++- backend/cmm_helpers.mli | 9 + backend/cmm_invariants.ml | 2 +- backend/cmmgen.ml | 14 +- backend/comballoc.ml | 5 +- backend/mach.ml | 9 +- backend/mach.mli | 1 + backend/polling.ml | 2 +- backend/printcmm.ml | 1 + backend/printmach.ml | 1 + backend/regalloc/regalloc_irc_utils.ml | 1 + backend/selectgen.ml | 8 +- middle_end/clambda.ml | 5 + middle_end/clambda.mli | 1 + middle_end/closure/closure.ml | 2 +- .../from_lambda/closure_conversion.ml | 3 +- .../from_lambda/closure_conversion_aux.ml | 6 +- .../lambda_to_flambda_primitives.ml | 4 + middle_end/flambda2/numbers/numeric_types.ml | 6 + middle_end/flambda2/numbers/numeric_types.mli | 4 + middle_end/flambda2/parser/fexpr.ml | 3 + .../flambda2/parser/fexpr_to_flambda.ml | 7 + .../flambda2/parser/flambda_to_fexpr.ml | 7 + middle_end/flambda2/parser/print_fexpr.ml | 6 + middle_end/flambda2/simplify/expr_builder.ml | 2 +- .../flambda2/simplify/lifting/reification.ml | 3 +- .../flambda2/simplify/rebuilt_static_const.ml | 7 +- .../simplify/rebuilt_static_const.mli | 5 + .../flambda2/simplify/simplify_extcall.ml | 5 +- .../simplify/simplify_static_const.ml | 11 ++ .../flambda2/simplify/simplify_switch_expr.ml | 2 +- .../simplify/simplify_unary_primitive.ml | 5 + .../simplify/unboxing/build_unboxing_denv.ml | 8 +- .../unboxing/is_unboxing_beneficial.ml | 5 +- .../flambda2/simplify/unboxing/unboxers.ml | 18 ++ .../flambda2/simplify/unboxing/unboxers.mli | 2 + .../simplify/unboxing/unboxing_epa.ml | 10 +- middle_end/flambda2/terms/code_size.ml | 4 +- middle_end/flambda2/terms/flambda.ml | 5 +- middle_end/flambda2/terms/static_const.ml | 45 +++-- middle_end/flambda2/terms/static_const.mli | 3 + middle_end/flambda2/to_cmm/to_cmm_env.ml | 4 +- middle_end/flambda2/to_cmm/to_cmm_expr.ml | 4 +- .../flambda2/to_cmm/to_cmm_primitive.ml | 2 + middle_end/flambda2/to_cmm/to_cmm_result.ml | 2 +- middle_end/flambda2/to_cmm/to_cmm_shared.ml | 6 +- middle_end/flambda2/to_cmm/to_cmm_static.ml | 11 +- middle_end/flambda2/types/env/typing_env.ml | 6 +- middle_end/flambda2/types/expand_head.ml | 29 +++- middle_end/flambda2/types/expand_head.mli | 5 + middle_end/flambda2/types/flambda2_types.mli | 12 ++ .../types/grammar/more_type_creators.ml | 3 + .../types/grammar/more_type_creators.mli | 5 + .../flambda2/types/grammar/type_grammar.ml | 6 + .../flambda2/types/grammar/type_grammar.mli | 15 ++ middle_end/flambda2/types/meet_and_join.ml | 35 +++- middle_end/flambda2/types/provers.ml | 156 ++++++++++++------ middle_end/flambda2/types/provers.mli | 14 ++ middle_end/flambda2/types/reify.ml | 23 ++- middle_end/flambda2/types/reify.mli | 1 + middle_end/printclambda.ml | 1 + 77 files changed, 593 insertions(+), 142 deletions(-) diff --git a/backend/CSEgen.ml b/backend/CSEgen.ml index 1b0f9fc06cf..be95670c65e 100644 --- a/backend/CSEgen.ml +++ b/backend/CSEgen.ml @@ -233,7 +233,7 @@ class cse_generic = object (self) method class_of_operation op = match op with | Imove | Ispill | Ireload -> assert false (* treated specially *) - | Iconst_int _ | Iconst_float _ | Iconst_symbol _ -> Op_pure + | Iconst_int _ | Iconst_float _ | Iconst_symbol _ | Iconst_vec128 _ -> Op_pure | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ | Iextcall _ | Iprobe _ | Iopaque -> assert false (* treated specially *) | Istackoffset _ -> Op_other diff --git a/backend/afl_instrument.ml b/backend/afl_instrument.ml index e4bd0eea054..93711ba9f46 100644 --- a/backend/afl_instrument.ml +++ b/backend/afl_instrument.ml @@ -93,7 +93,7 @@ and instrument = function | Ctail e -> Ctail (instrument e) (* these are base cases and have no logging *) - | Cconst_int _ | Cconst_natint _ | Cconst_float _ + | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_vec128 _ | Cconst_symbol _ | Cvar _ as c -> c diff --git a/backend/amd64/CSE.ml b/backend/amd64/CSE.ml index 9d5587a19d2..78eb0d38e28 100644 --- a/backend/amd64/CSE.ml +++ b/backend/amd64/CSE.ml @@ -45,7 +45,7 @@ method! class_of_operation op = | Icompf _ | Icsel _ | Ifloatofint | Iintoffloat | Ivalueofint | Iintofvalue - | Iconst_int _ | Iconst_float _ | Iconst_symbol _ + | Iconst_int _ | Iconst_float _ | Iconst_symbol _ | Iconst_vec128 _ | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ | Iextcall _ | Istackoffset _ | Iload _ | Istore _ | Ialloc _ | Iintop _ | Iintop_imm _ | Iintop_atomic _ diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 8aa4520482c..68df2cfa3d1 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -660,6 +660,24 @@ let emit_float_constant f lbl = _label (emit_label lbl); D.qword (Const f) +(* Vector constants *) + +let vec128_constants = ref ([] : ((int64 * int64) * int) list) + +let add_vec128_constant (v0, v1) = + try + List.assoc (v0, v1) !vec128_constants + with Not_found -> + let lbl = new_label() in + vec128_constants := ((v0, v1), lbl) :: !vec128_constants; + lbl + +let emit_vec128_constant (v0, v1) lbl = + _label (emit_label lbl); + (* SIMD vectors respect little-endian byte order *) + D.qword (Const v1); + D.qword (Const v0) + let emit_global_label_for_symbol lbl = add_def_symbol lbl; let lbl = emit_symbol lbl in @@ -905,6 +923,14 @@ let emit_instr fallthrough i = let lbl = add_float_constant f in I.movsd (mem64_rip NONE (emit_label lbl)) (res i 0) end + | Lop(Iconst_vec128 (v0, v1)) -> + begin match (v0, v1) with + | 0x0000_0000_0000_0000L, 0x0000_0000_0000_0000L -> (* +0.0 *) + I.xorpd (res i 0) (res i 0) + | _ -> + let lbl = add_vec128_constant (v0, v1) in + I.movupd (mem64_rip NONE (emit_label lbl)) (res i 0) + end | Lop(Iconst_symbol s) -> add_used_symbol s.sym_name; load_symbol_addr s (res i 0) @@ -1867,7 +1893,8 @@ let end_assembly () = | _ -> D.section [".rodata.cst8"] (Some "aM") ["@progbits";"8"] end; D.align ~data:true 8; - List.iter (fun (cst,lbl) -> emit_float_constant cst lbl) !float_constants + List.iter (fun (cst,lbl) -> emit_float_constant cst lbl) !float_constants; + List.iter (fun ((v0,v1),lbl) -> emit_vec128_constant (v0, v1) lbl) !vec128_constants; end; (* Emit probe handler wrappers *) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 0461681eb5c..4e289e529cf 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -365,7 +365,7 @@ let destroyed_at_oper = function | Icsel _ | Ifloatofint | Iintoffloat | Ivalueofint | Iintofvalue - | Iconst_int _ | Iconst_float _ | Iconst_symbol _ + | Iconst_int _ | Iconst_float _ | Iconst_symbol _ | Iconst_vec128 _ | Itailcall_ind | Itailcall_imm _ | Istackoffset _ | Iload (_, _, _) | Iname_for_debugger _ | Iprobe _| Iprobe_is_enabled _ | Iopaque) | Iend | Ireturn _ | Iifthenelse (_, _, _) | Icatch (_, _, _, _) @@ -401,7 +401,7 @@ let destroyed_at_basic (basic : Cfg_intf.S.basic) = | Op (Intop Icheckbound | Intop_imm (Icheckbound, _)) -> assert false | Op (Move | Spill | Reload - | Const_int _ | Const_float _ | Const_symbol _ + | Const_int _ | Const_float _ | Const_symbol _ | Const_vec128 _ | Stackoffset _ | Load _ | Store ((Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed | Thirtytwo_unsigned @@ -502,7 +502,7 @@ let safe_register_pressure = function | Ifloatofint | Iintoffloat | Ivalueofint | Iintofvalue | Icompf _ | Icsel _ - | Iconst_int _ | Iconst_float _ | Iconst_symbol _ + | Iconst_int _ | Iconst_float _ | Iconst_symbol _ | Iconst_vec128 _ | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ | Istackoffset _ | Iload (_, _, _) | Istore (_, _, _) | Iintop _ | Iintop_imm (_, _) | Iintop_atomic _ @@ -541,7 +541,7 @@ let max_register_pressure = | Imove | Ispill | Ireload | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf | Icsel _ | Ifloatofint | Iintoffloat | Ivalueofint | Iintofvalue - | Iconst_int _ | Iconst_float _ | Iconst_symbol _ + | Iconst_int _ | Iconst_float _ | Iconst_symbol _ | Iconst_vec128 _ | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ | Istackoffset _ | Iload (_, _, _) | Ispecific(Ilea _ | Isextend32 | Izextend32 | Iprefetch _ | Ipause diff --git a/backend/amd64/regalloc_stack_operands.ml b/backend/amd64/regalloc_stack_operands.ml index c3e4b8251a8..863f5617dc6 100644 --- a/backend/amd64/regalloc_stack_operands.ml +++ b/backend/amd64/regalloc_stack_operands.ml @@ -192,8 +192,8 @@ let basic (map : spilled_map) (instr : Cfg.basic Cfg.instruction) = | Op (Specific (Irdtsc | Irdpmc)) | Op (Intop (Ipopcnt | Iclz _| Ictz _)) | Op (Intop_atomic _) - | Op (Move | Spill | Reload | Negf | Absf | Const_float _ | Compf _ | Stackoffset _ - | Load _ | Store _ | Name_for_debugger _ | Probe_is_enabled _ + | Op (Move | Spill | Reload | Negf | Absf | Const_float _ | Const_vec128 _ | Compf _ + | Stackoffset _ | Load _ | Store _ | Name_for_debugger _ | Probe_is_enabled _ | Valueofint | Intofvalue | Opaque | Begin_region | End_region ) | Op (Specific (Isqrtf | Isextend32 | Izextend32 | Ilea _ | Istore_int (_, _, _) diff --git a/backend/amd64/reload.ml b/backend/amd64/reload.ml index 37115a3b1c5..35fda48a6f7 100644 --- a/backend/amd64/reload.ml +++ b/backend/amd64/reload.ml @@ -178,7 +178,7 @@ method! reload_operation op arg res = | Ilfence | Isfence | Imfence | Iprefetch _ | Ibswap _| Ifloatsqrtf _) - | Imove|Ispill|Ireload|Inegf|Iabsf|Iconst_float _|Icall_ind|Icall_imm _ + | Imove|Ispill|Ireload|Inegf|Iabsf|Iconst_float _|Iconst_vec128 _|Icall_ind|Icall_imm _ | Icompf _ | Itailcall_ind|Itailcall_imm _|Iextcall _|Istackoffset _|Iload (_, _, _) | Istore (_, _, _)|Ialloc _|Iname_for_debugger _|Iprobe _|Iprobe_is_enabled _ diff --git a/backend/amd64/selection.ml b/backend/amd64/selection.ml index 1cbe721b140..5cf0c4877ee 100644 --- a/backend/amd64/selection.ml +++ b/backend/amd64/selection.ml @@ -170,7 +170,7 @@ let pseudoregs_for_operation op arg res = |Ipause|Ilfence|Isfence|Imfence |Ioffset_loc (_, _)|Ifloatsqrtf _|Irdtsc|Iprefetch _) | Imove|Ispill|Ireload|Ifloatofint|Iintoffloat|Ivalueofint|Iintofvalue - | Iconst_int _|Iconst_float _ + | Iconst_int _|Iconst_float _|Iconst_vec128 _ | Iconst_symbol _|Icall_ind|Icall_imm _|Itailcall_ind|Itailcall_imm _ | Iextcall _|Istackoffset _|Iload (_, _, _) | Istore (_, _, _)|Ialloc _ | Iname_for_debugger _|Iprobe _|Iprobe_is_enabled _ | Iopaque @@ -263,7 +263,7 @@ method! select_store is_assign addr exp = (Ispecific(Istore_int(Nativeint.of_int n, addr, is_assign)), Ctuple []) | (Cconst_natint (n, _dbg)) when is_immediate_natint n -> (Ispecific(Istore_int(n, addr, is_assign)), Ctuple []) - | Cconst_int _ + | Cconst_int _ | Cconst_vec128 _ | Cconst_natint (_, _) | Cconst_float (_, _) | Cconst_symbol (_, _) | Cvar _ | Clet (_, _, _) | Clet_mut (_, _, _, _) | Cphantom_let (_, _, _) | Cassign (_, _) | Ctuple _ | Cop (_, _, _) | Csequence (_, _) diff --git a/backend/cfg/cfg.ml b/backend/cfg/cfg.ml index 000b4b11b49..c30171cb5e9 100644 --- a/backend/cfg/cfg.ml +++ b/backend/cfg/cfg.ml @@ -247,6 +247,7 @@ let dump_op ppf = function | Const_int n -> Format.fprintf ppf "const_int %nd" n | Const_float f -> Format.fprintf ppf "const_float %F" (Int64.float_of_bits f) | Const_symbol s -> Format.fprintf ppf "const_symbol %s" s.sym_name + | Const_vec128 (v0, v1) -> Format.fprintf ppf "const vec128 %Ld:%Ld" v0 v1 | Stackoffset n -> Format.fprintf ppf "stackoffset %d" n | Load _ -> Format.fprintf ppf "load" | Store _ -> Format.fprintf ppf "store" @@ -449,6 +450,7 @@ let is_pure_operation : operation -> bool = function | Const_int _ -> true | Const_float _ -> true | Const_symbol _ -> true + | Const_vec128 _ -> true | Stackoffset _ -> false | Load _ -> true | Store _ -> false @@ -512,11 +514,12 @@ let is_noop_move instr = let ifnot = instr.arg.(len - 1) in Reg.same_loc instr.res.(0) ifso && Reg.same_loc instr.res.(0) ifnot) | Op - ( Const_int _ | Const_float _ | Const_symbol _ | Stackoffset _ | Load _ - | Store _ | Intop _ | Intop_imm _ | Intop_atomic _ | Negf | Absf | Addf - | Subf | Mulf | Divf | Compf _ | Floatofint | Intoffloat | Opaque - | Valueofint | Intofvalue | Probe_is_enabled _ | Specific _ - | Name_for_debugger _ | Begin_region | End_region ) + ( Const_int _ | Const_float _ | Const_symbol _ | Const_vec128 _ + | Stackoffset _ | Load _ | Store _ | Intop _ | Intop_imm _ + | Intop_atomic _ | Negf | Absf | Addf | Subf | Mulf | Divf | Compf _ + | Floatofint | Intoffloat | Opaque | Valueofint | Intofvalue + | Probe_is_enabled _ | Specific _ | Name_for_debugger _ | Begin_region + | End_region ) | Reloadretaddr | Pushtrap _ | Poptrap | Prologue -> false diff --git a/backend/cfg/cfg_intf.ml b/backend/cfg/cfg_intf.ml index 1e1be5e6aac..6587d8950c6 100644 --- a/backend/cfg/cfg_intf.ml +++ b/backend/cfg/cfg_intf.ml @@ -62,6 +62,7 @@ module S = struct | Const_int of nativeint (* CR-someday xclerc: change to `Targetint.t` *) | Const_float of int64 | Const_symbol of Cmm.symbol + | Const_vec128 of int64 * int64 | Stackoffset of int | Load of Cmm.memory_chunk * Arch.addressing_mode * Mach.mutable_flag | Store of Cmm.memory_chunk * Arch.addressing_mode * bool diff --git a/backend/cfg/cfg_to_linear_desc.ml b/backend/cfg/cfg_to_linear_desc.ml index d034ccf4578..9e28121d746 100644 --- a/backend/cfg/cfg_to_linear_desc.ml +++ b/backend/cfg/cfg_to_linear_desc.ml @@ -15,6 +15,7 @@ let from_basic (basic : basic) : Linear.instruction_desc = | Const_int n -> Iconst_int n | Const_float n -> Iconst_float n | Const_symbol n -> Iconst_symbol n + | Const_vec128 (v0, v1) -> Iconst_vec128 (v0, v1) | Stackoffset n -> Istackoffset n | Load (c, m, i) -> Iload (c, m, i) | Store (c, m, b) -> Istore (c, m, b) diff --git a/backend/cfg/cfgize.ml b/backend/cfg/cfgize.ml index 5bd294c1232..c2ea69c1320 100644 --- a/backend/cfg/cfgize.ml +++ b/backend/cfg/cfgize.ml @@ -144,6 +144,7 @@ let basic_or_terminator_of_operation : | Iconst_int i -> Basic (Op (Const_int i)) | Iconst_float f -> Basic (Op (Const_float f)) | Iconst_symbol s -> Basic (Op (Const_symbol s)) + | Iconst_vec128 (v0, v1) -> Basic (Op (Const_vec128 (v0, v1))) | Icall_ind -> With_next_label (fun label_after -> Call { op = Indirect; label_after }) | Icall_imm { func } -> @@ -670,10 +671,11 @@ module Stack_offset_and_exn = struct | Op (Stackoffset n) -> stack_offset + n, traps | Op ( Move | Spill | Reload | Const_int _ | Const_float _ | Const_symbol _ - | Load _ | Store _ | Intop _ | Intop_imm _ | Intop_atomic _ | Negf - | Absf | Addf | Subf | Mulf | Divf | Compf _ | Floatofint | Intoffloat - | Valueofint | Csel _ | Intofvalue | Probe_is_enabled _ | Opaque - | Begin_region | End_region | Specific _ | Name_for_debugger _ ) + | Const_vec128 _ | Load _ | Store _ | Intop _ | Intop_imm _ + | Intop_atomic _ | Negf | Absf | Addf | Subf | Mulf | Divf | Compf _ + | Floatofint | Intoffloat | Valueofint | Csel _ | Intofvalue + | Probe_is_enabled _ | Opaque | Begin_region | End_region | Specific _ + | Name_for_debugger _ ) | Reloadretaddr | Prologue -> stack_offset, traps diff --git a/backend/cfg/linear_to_cfg.ml b/backend/cfg/linear_to_cfg.ml index bb6298a109c..5c9e0f78e13 100644 --- a/backend/cfg/linear_to_cfg.ml +++ b/backend/cfg/linear_to_cfg.ml @@ -616,6 +616,7 @@ let rec create_blocks (t : t) (i : L.instruction) (block : C.basic_block) | Iconst_int n -> basic (Const_int n) | Iconst_float n -> basic (Const_float n) | Iconst_symbol n -> basic (Const_symbol n) + | Iconst_vec128 (v0, v1) -> basic (Const_vec128 (v0, v1)) | Inegf -> basic Negf | Iabsf -> basic Absf | Iaddf -> basic Addf diff --git a/backend/checkmach.ml b/backend/checkmach.ml index e38e750481d..716134baf0e 100644 --- a/backend/checkmach.ml +++ b/backend/checkmach.ml @@ -927,8 +927,8 @@ end = struct let transform_operation t (op : Mach.operation) ~next ~exn dbg = match op with | Imove | Ispill | Ireload | Iconst_int _ | Iconst_float _ | Iconst_symbol _ - | Iload _ | Icompf _ | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf - | Ifloatofint | Iintoffloat + | Iconst_vec128 _ | Iload _ | Icompf _ | Inegf | Iabsf | Iaddf | Isubf + | Imulf | Idivf | Ifloatofint | Iintoffloat | Iintop_imm ( ( Iadd | Isub | Imul | Imulh _ | Idiv | Imod | Iand | Ior | Ixor | Ilsl | Ilsr | Iasr | Ipopcnt | Iclz _ | Ictz _ | Icomp _ ), diff --git a/backend/cmm.ml b/backend/cmm.ml index 28d39d35999..30da688d930 100644 --- a/backend/cmm.ml +++ b/backend/cmm.ml @@ -255,6 +255,7 @@ type expression = Cconst_int of int * Debuginfo.t | Cconst_natint of nativeint * Debuginfo.t | Cconst_float of float * Debuginfo.t + | Cconst_vec128 of int64 * int64 * Debuginfo.t | Cconst_symbol of symbol * Debuginfo.t | Cvar of Backend_var.t | Clet of Backend_var.With_provenance.t * expression * expression @@ -354,6 +355,7 @@ let iter_shallow_tail f = function | Cconst_int _ | Cconst_natint _ | Cconst_float _ + | Cconst_vec128 _ | Cconst_symbol _ | Cvar _ | Cassign _ @@ -396,6 +398,7 @@ let map_shallow_tail ?kind f = function | Cconst_int _ | Cconst_natint _ | Cconst_float _ + | Cconst_vec128 _ | Cconst_symbol _ | Cvar _ | Cassign _ @@ -452,6 +455,7 @@ let iter_shallow f = function | Cconst_int _ | Cconst_natint _ | Cconst_float _ + | Cconst_vec128 _ | Cconst_symbol _ | Cvar _ -> () @@ -489,6 +493,7 @@ let map_shallow f = function | Cconst_int _ | Cconst_natint _ | Cconst_float _ + | Cconst_vec128 _ | Cconst_symbol _ | Cvar _ as c -> diff --git a/backend/cmm.mli b/backend/cmm.mli index be3d24e7157..3875547837c 100644 --- a/backend/cmm.mli +++ b/backend/cmm.mli @@ -264,6 +264,7 @@ type expression = Cconst_int of int * Debuginfo.t | Cconst_natint of nativeint * Debuginfo.t | Cconst_float of float * Debuginfo.t + | Cconst_vec128 of int64 * int64 * Debuginfo.t | Cconst_symbol of symbol * Debuginfo.t | Cvar of Backend_var.t | Clet of Backend_var.With_provenance.t * expression * expression @@ -321,7 +322,6 @@ type data_item = | Cint of nativeint | Csingle of float | Cdouble of float - (* CR mslater: (SIMD) switch to nativeint? *) | Cvec128 of int64 * int64 | Csymbol_address of symbol | Cstring of string diff --git a/backend/cmm_helpers.ml b/backend/cmm_helpers.ml index a3758ec39be..a5512c270f0 100644 --- a/backend/cmm_helpers.ml +++ b/backend/cmm_helpers.ml @@ -81,6 +81,11 @@ let float_header = block_header Obj.double_tag (size_float / size_addr) let float_local_header = local_block_header Obj.double_tag (size_float / size_addr) +let boxedvec128_header = block_header Obj.custom_tag (1 + (16 / size_addr)) + +let boxedvec128_local_header = + local_block_header Obj.custom_tag (1 + (16 / size_addr)) + let floatarray_header len = (* Zero-sized float arrays have tag zero for consistency with [caml_alloc_float_array]. *) @@ -144,6 +149,15 @@ let alloc_float_header mode dbg = | Lambda.Alloc_heap -> Cconst_natint (float_header, dbg) | Lambda.Alloc_local -> Cconst_natint (float_local_header, dbg) +let alloc_boxedvector_header vi mode dbg = + let header, local_header = + match vi with + | Primitive.Pvec128 -> boxedvec128_header, boxedvec128_local_header + in + match mode with + | Lambda.Alloc_heap -> Cconst_natint (header, dbg) + | Lambda.Alloc_local -> Cconst_natint (local_header, dbg) + let alloc_floatarray_header len dbg = Cconst_natint (floatarray_header len, dbg) let alloc_closure_header ~mode sz dbg = @@ -702,7 +716,36 @@ let rec unbox_float dbg = (* Vectors *) let box_vector dbg vi m c = - Cop (Calloc m, [alloc_vector_header vi m dbg; c], dbg) + Cop (Calloc m, [alloc_boxedvector_header vi m dbg; c], dbg) + +let rec unbox_vector dbg vi = + let load = match vi with Primitive.Pvec128 -> Onetwentyeight in + map_tail ~kind:Any (function + | Cop (Calloc _, [Cconst_natint (hdr, _); c], _) + when Nativeint.equal hdr float_header + || Nativeint.equal hdr float_local_header -> + c + | Cconst_symbol (s, _dbg) as cmm -> ( + match Cmmgen_state.structured_constant_of_sym s.sym_name with + | Some (Uconst_vec128 (v0, v1)) -> + assert (vi = Primitive.Pvec128); + Cconst_vec128 (v0, v1, dbg) (* or keep _dbg? *) + | _ -> Cop (Cload (load, Immutable), [cmm], dbg)) + | Cregion e as cmm -> ( + (* It is valid to push unboxing inside a Cregion except when the extra + unboxing logic pushes a tail call out of tail position *) + match + map_tail ~kind:Any + (function + | Cop (Capply (_, Rc_close_at_apply), _, _) -> raise Exit + | Ctail e -> Ctail (unbox_vector dbg vi e) + | e -> unbox_vector dbg vi e) + e + with + | e -> Cregion e + | exception Exit -> Cop (Cload (load, Immutable), [cmm], dbg)) + | Ctail e -> Ctail (unbox_vector dbg vi e) + | cmm -> Cop (Cload (load, Immutable), [cmm], dbg)) (* Complex *) @@ -3595,6 +3638,9 @@ let emit_nativeint_constant symb n cont = emit_block symb boxedintnat_header (emit_boxed_nativeint_constant_fields n cont) +let emit_vec128_constant symb (v0, v1) cont = + emit_block symb boxedvec128_header (Cvec128 (v0, v1) :: cont) + let emit_float_array_constant symb fields cont = emit_block symb (floatarray_header (List.length fields)) @@ -3953,6 +3999,8 @@ let int32 ~dbg i = natint_const_untagged dbg (Nativeint.of_int32 i) cross-compiling for 64-bit on a 32-bit host *) let int64 ~dbg i = natint_const_untagged dbg (Int64.to_nativeint i) +let vec128 ~dbg (v0, v1) = Cconst_vec128 (v0, v1, dbg) + let nativeint ~dbg i = natint_const_untagged dbg i let letin v ~defining_expr ~body = @@ -3960,9 +4008,9 @@ let letin v ~defining_expr ~body = | Cvar v' when Backend_var.same (Backend_var.With_provenance.var v) v' -> defining_expr | Cvar _ | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ - | Clet _ | Clet_mut _ | Cphantom_let _ | Cassign _ | Ctuple _ | Cop _ - | Csequence _ | Cifthenelse _ | Cswitch _ | Ccatch _ | Cexit _ | Ctrywith _ - | Cregion _ | Ctail _ -> + | Cconst_vec128 _ | Clet _ | Clet_mut _ | Cphantom_let _ | Cassign _ + | Ctuple _ | Cop _ | Csequence _ | Cifthenelse _ | Cswitch _ | Ccatch _ + | Cexit _ | Ctrywith _ | Cregion _ | Ctail _ -> Clet (v, defining_expr, body) let letin_mut v ty e body = Clet_mut (v, ty, e, body) @@ -4253,7 +4301,7 @@ let cmm_arith_size (e : Cmm.expression) = in match e with | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ | Cvar _ - -> + | Cconst_vec128 _ -> Some 0 | Cop _ -> Some (cmm_arith_size0 e) | Clet _ | Clet_mut _ | Cphantom_let _ | Cassign _ | Ctuple _ | Csequence _ diff --git a/backend/cmm_helpers.mli b/backend/cmm_helpers.mli index 991261abb60..fbf9f85d2a6 100644 --- a/backend/cmm_helpers.mli +++ b/backend/cmm_helpers.mli @@ -218,6 +218,9 @@ val box_vector : expression -> expression +val unbox_vector : + Debuginfo.t -> Primitive.boxed_vector -> expression -> expression + (* CR mslater: (SIMD) unbox vector *) (** Complex number creation and access *) @@ -951,6 +954,9 @@ val emit_int64_constant : symbol -> int64 -> data_item list -> data_item list val emit_nativeint_constant : symbol -> nativeint -> data_item list -> data_item list +val emit_vec128_constant : + symbol -> int64 * int64 -> data_item list -> data_item list + val emit_float_array_constant : symbol -> float list -> data_item list -> data_item list @@ -997,6 +1003,9 @@ val int32 : dbg:Debuginfo.t -> int32 -> expression (** Create a constant int expression from an int64. *) val int64 : dbg:Debuginfo.t -> int64 -> expression +(** Create a constant vec128 expression from two int64s. *) +val vec128 : dbg:Debuginfo.t -> int64 * int64 -> expression + (** Create a constant int expression from a nativeint. *) val nativeint : dbg:Debuginfo.t -> Nativeint.t -> expression diff --git a/backend/cmm_invariants.ml b/backend/cmm_invariants.ml index 527ca24eb79..4eed664912e 100644 --- a/backend/cmm_invariants.ml +++ b/backend/cmm_invariants.ml @@ -127,7 +127,7 @@ end let rec check env (expr : Cmm.expression) = match expr with - | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ + | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ | Cconst_vec128 _ | Cvar _ -> () | Clet (_, expr, body) diff --git a/backend/cmmgen.ml b/backend/cmmgen.ml index a2de38f513c..a4d58f84007 100644 --- a/backend/cmmgen.ml +++ b/backend/cmmgen.ml @@ -39,6 +39,7 @@ open Cmm_builtins type boxed_number = | Boxed_float of alloc_mode * Debuginfo.t | Boxed_integer of boxed_integer * alloc_mode * Debuginfo.t + | Boxed_vector of boxed_vector * alloc_mode * Debuginfo.t type env = { unboxed_ids : (V.t * boxed_number) V.tbl; @@ -275,6 +276,8 @@ let emit_structured_constant symb cst cont = emit_int64_constant symb n cont | Uconst_nativeint n -> emit_nativeint_constant symb n cont + | Uconst_vec128 (v0, v1) -> + emit_vec128_constant symb (v0, v1) cont | Uconst_block (tag, csts) -> let cont = List.fold_right emit_constant csts cont in emit_block symb (block_header tag (List.length csts)) cont @@ -320,6 +323,7 @@ let typ_of_boxed_number = function | Boxed_float _ -> Cmm.typ_float | Boxed_integer (Pint64, _,_) when size_int = 4 -> [|Int;Int|] | Boxed_integer _ -> Cmm.typ_int + | Boxed_vector (Pvec128, _, _) -> Cmm.typ_vec128 let equal_unboxed_integer ui1 ui2 = match ui1, ui2 with @@ -339,6 +343,7 @@ let box_number bn arg = match bn with | Boxed_float (m, dbg) -> box_float dbg m arg | Boxed_integer (bi, m, dbg) -> box_int dbg bi m arg + | Boxed_vector (vi, m, dbg) -> box_vector dbg vi m arg (* Returns the unboxed representation of a boxed float or integer. For Pint32 on 64-bit archs, the high 32 bits of the result are undefined. *) @@ -350,6 +355,8 @@ let unbox_number dbg bn arg = low_32 dbg (unbox_int dbg Pint32 arg) | Boxed_integer (bi, _, _) -> unbox_int dbg bi arg + | Boxed_vector (vi, _, _) -> + unbox_vector dbg vi arg (* Auxiliary functions for optimizing "let" of boxed numbers (floats and boxed integers *) @@ -415,6 +422,8 @@ let rec is_unboxed_number_cmm = function Boxed (Boxed_integer (Pint32, alloc_heap, Debuginfo.none), true) | Some (Uconst_int64 _) -> Boxed (Boxed_integer (Pint64, alloc_heap, Debuginfo.none), true) + | Some (Uconst_vec128 _) -> + Boxed (Boxed_vector (Pvec128, alloc_heap, Debuginfo.none), true) | _ -> No_unboxing end @@ -425,6 +434,7 @@ let rec is_unboxed_number_cmm = function | Cconst_int _ | Cconst_natint _ | Cconst_float _ + | Cconst_vec128 _ | Cvar _ | Cassign _ | Ctuple _ @@ -1291,7 +1301,7 @@ and transl_unbox_float dbg env exp = and transl_unbox_int dbg env bi exp = unbox_int dbg bi (transl env exp) - and transl_unbox_vector dbg env bi exp = +and transl_unbox_vector dbg env bi exp = unbox_vector dbg bi (transl env exp) (* transl_unbox_int, but may return garbage in upper bits *) @@ -1357,7 +1367,7 @@ and transl_let env str (layout : Lambda.layout) id exp transl_body = there may be constant closures inside that need lifting out. *) let _cbody : expression = transl_body env in cexp - | Punboxed_float | Punboxed_int _ -> begin + | Punboxed_float | Punboxed_int _ | Punboxed_vector _ -> begin let cexp = transl env exp in let cbody = transl_body env in match str with diff --git a/backend/comballoc.ml b/backend/comballoc.ml index 5275f0a9490..d67b8652879 100644 --- a/backend/comballoc.ml +++ b/backend/comballoc.ml @@ -87,9 +87,8 @@ let rec combine i allocstate = end | Iop((Imove|Ispill|Ireload|Inegf|Iabsf|Iaddf|Isubf|Imulf|Idivf|Ifloatofint| Iintoffloat|Ivalueofint|Iintofvalue|Iopaque|Iconst_int _|Iconst_float _| - Iconst_symbol _|Istackoffset _|Iload (_, _, _)|Istore (_, _, _)|Icompf _| - Icsel _ | - Ispecific _|Iname_for_debugger _|Iprobe_is_enabled _)) + Iconst_vec128 _|Iconst_symbol _|Istackoffset _|Iload (_, _, _)|Istore (_, _, _)| + Icompf _|Icsel _ |Ispecific _|Iname_for_debugger _|Iprobe_is_enabled _)) | Iop(Iintop(Iadd | Isub | Imul | Idiv | Imod | Iand | Ior | Ixor | Ilsl | Ilsr | Iasr | Ipopcnt | Imulh _ | Iclz _ | Ictz _ | Icomp _)) diff --git a/backend/mach.ml b/backend/mach.ml index 9b62441e9aa..aa4ad3a5169 100644 --- a/backend/mach.ml +++ b/backend/mach.ml @@ -52,6 +52,7 @@ type operation = | Ireload | Iconst_int of nativeint | Iconst_float of int64 + | Iconst_vec128 of int64 * int64 | Iconst_symbol of Cmm.symbol | Icall_ind | Icall_imm of { func : Cmm.symbol; } @@ -175,7 +176,7 @@ let rec instr_iter f i = instr_iter f body; instr_iter f handler; instr_iter f i.next | Iraise _ -> () | Iop (Imove | Ispill | Ireload - | Iconst_int _ | Iconst_float _ | Iconst_symbol _ + | Iconst_int _ | Iconst_float _ | Iconst_symbol _ | Iconst_vec128 _ | Icall_ind | Icall_imm _ | Iextcall _ | Istackoffset _ | Iload _ | Istore _ | Ialloc _ | Iintop _ | Iintop_imm _ | Iintop_atomic _ @@ -205,8 +206,8 @@ let operation_is_pure = function | Imove | Ispill | Ireload | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf | Icompf _ | Icsel _ - | Ifloatofint | Iintoffloat - | Iconst_int _ | Iconst_float _ | Iconst_symbol _ + | Ifloatofint | Iintoffloat + | Iconst_int _ | Iconst_float _ | Iconst_symbol _ | Iconst_vec128 _ | Iload (_, _, _) | Iname_for_debugger _ -> true @@ -226,7 +227,7 @@ let operation_can_raise op = | Icompf _ | Icsel _ | Ifloatofint | Iintoffloat | Ivalueofint | Iintofvalue - | Iconst_int _ | Iconst_float _ | Iconst_symbol _ + | Iconst_int _ | Iconst_float _ | Iconst_symbol _ | Iconst_vec128 _ | Istackoffset _ | Istore _ | Iload (_, _, _) | Iname_for_debugger _ | Itailcall_imm _ | Itailcall_ind | Iopaque | Ibeginregion | Iendregion diff --git a/backend/mach.mli b/backend/mach.mli index ba68d8c0373..5790e16523a 100644 --- a/backend/mach.mli +++ b/backend/mach.mli @@ -55,6 +55,7 @@ type operation = | Ireload | Iconst_int of nativeint | Iconst_float of int64 + | Iconst_vec128 of int64 * int64 | Iconst_symbol of Cmm.symbol | Icall_ind | Icall_imm of { func : Cmm.symbol; } diff --git a/backend/polling.ml b/backend/polling.ml index c496d4bef5a..59983584e1e 100644 --- a/backend/polling.ml +++ b/backend/polling.ml @@ -241,7 +241,7 @@ let find_poll_alloc_or_calls instr = | Iop(Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ ) -> Some (Function_call, i.dbg) | Iop(Iextcall { alloc = true }) -> Some (External_call, i.dbg) - | Iop(Imove | Ispill | Ireload | Iconst_int _ | Iconst_float _ | + | Iop(Imove | Ispill | Ireload | Iconst_int _ | Iconst_float _ | Iconst_vec128 _ | Iconst_symbol _ | Iextcall { alloc = false } | Istackoffset _ | Iload _ | Istore _ | Iintop _ | Iintop_imm _ | Iintop_atomic _ | Ifloatofint | Iintoffloat | Inegf | Iabsf | Iaddf | Isubf | diff --git a/backend/printcmm.ml b/backend/printcmm.ml index a302778cf8c..95f7e1370a0 100644 --- a/backend/printcmm.ml +++ b/backend/printcmm.ml @@ -247,6 +247,7 @@ let rec expr ppf = function | Cconst_int (n, _dbg) -> fprintf ppf "%i" n | Cconst_natint (n, _dbg) -> fprintf ppf "%s" (Nativeint.to_string n) + | Cconst_vec128 (v0, v1, _dbg) -> fprintf ppf "%Ld:%Ld" v0 v1 | Cconst_float (n, _dbg) -> fprintf ppf "%F" n | Cconst_symbol (s, _dbg) -> fprintf ppf "%a:\"%s\"" is_global s.sym_global s.sym_name | Cvar id -> V.print ppf id diff --git a/backend/printmach.ml b/backend/printmach.ml index 26917f80e91..5bef68ef63c 100644 --- a/backend/printmach.ml +++ b/backend/printmach.ml @@ -164,6 +164,7 @@ let operation' ?(print_reg = reg) op arg ppf res = | Iconst_int n -> fprintf ppf "%s" (Nativeint.to_string n) | Iconst_float f -> fprintf ppf "%F" (Int64.float_of_bits f) | Iconst_symbol s -> fprintf ppf "\"%s\"" s.sym_name + | Iconst_vec128 (v0, v1) -> fprintf ppf "%Ld:%Ld" v0 v1 | Icall_ind -> fprintf ppf "call %a" regs arg | Icall_imm { func; } -> fprintf ppf "call \"%s\" %a" func.sym_name regs arg | Itailcall_ind -> fprintf ppf "tailcall %a" regs arg diff --git a/backend/regalloc/regalloc_irc_utils.ml b/backend/regalloc/regalloc_irc_utils.ml index 186b0d9dca2..5d84c3910ec 100644 --- a/backend/regalloc/regalloc_irc_utils.ml +++ b/backend/regalloc/regalloc_irc_utils.ml @@ -111,6 +111,7 @@ let is_move_basic : Cfg.basic -> bool = | Const_int _ -> false | Const_float _ -> false | Const_symbol _ -> false + | Const_vec128 _ -> false | Stackoffset _ -> false | Load _ -> false | Store _ -> false diff --git a/backend/selectgen.ml b/backend/selectgen.ml index bce37532fc4..3cc87b70b2a 100644 --- a/backend/selectgen.ml +++ b/backend/selectgen.ml @@ -475,6 +475,7 @@ method is_simple_expr = function | Cconst_natint _ -> true | Cconst_float _ -> true | Cconst_symbol _ -> true + | Cconst_vec128 _ -> true | Cvar _ -> true | Ctuple el -> List.for_all self#is_simple_expr el | Clet(_id, arg, body) | Clet_mut(_id, _, arg, body) -> @@ -520,7 +521,7 @@ method is_simple_expr = function method effects_of exp = let module EC = Effect_and_coeffect in match exp with - | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ + | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ | Cconst_vec128 _ | Cvar _ -> EC.none | Ctuple el -> EC.join_list_map el self#effects_of | Clet (_id, arg, body) | Clet_mut (_id, _, arg, body) -> @@ -854,6 +855,9 @@ method emit_expr_aux (env:environment) exp : | Cconst_float (n, _dbg) -> let r = self#regs_for typ_float in ret (self#insert_op env (Iconst_float (Int64.bits_of_float n)) [||] r) + | Cconst_vec128 (v0, v1, _dbg) -> + let r = self#regs_for typ_vec128 in + ret (self#insert_op env (Iconst_vec128 (v0, v1)) [||] r) | Cconst_symbol (n, _dbg) -> (* Cconst_symbol _ evaluates to a statically-allocated address, so its value fits in a typ_int register and is never changed by the GC. @@ -1614,7 +1618,7 @@ method emit_tail (env:environment) exp = self#emit_tail { env with regions } e end | Cop _ - | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ + | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ | Cconst_vec128 _ | Cvar _ | Cassign _ | Ctuple _ diff --git a/middle_end/clambda.ml b/middle_end/clambda.ml index c0c09a5c410..74ccc443ce6 100644 --- a/middle_end/clambda.ml +++ b/middle_end/clambda.ml @@ -32,6 +32,7 @@ type ustructured_constant = | Uconst_int32 of int32 | Uconst_int64 of int64 | Uconst_nativeint of nativeint + | Uconst_vec128 of int64 * int64 | Uconst_block of int * uconstant list | Uconst_float_array of float list | Uconst_string of string @@ -212,6 +213,7 @@ let rank_structured_constant = function | Uconst_float_array _ -> 5 | Uconst_string _ -> 6 | Uconst_closure _ -> 7 + | Uconst_vec128 _ -> 8 let compare_structured_constants c1 c2 = match c1, c2 with @@ -227,6 +229,9 @@ let compare_structured_constants c1 c2 = | Uconst_string s1, Uconst_string s2 -> String.compare s1 s2 | Uconst_closure (_,lbl1,_), Uconst_closure (_,lbl2,_) -> String.compare lbl1 lbl2 + | Uconst_vec128 (l0, l1), Uconst_vec128 (r0, r1) -> + let cmp = Int64.compare l0 r0 in + if cmp = 0 then Int64.compare l1 r1 else cmp | _, _ -> (* no overflow possible here *) rank_structured_constant c1 - rank_structured_constant c2 diff --git a/middle_end/clambda.mli b/middle_end/clambda.mli index 9e1409e5721..4c25b90f2bd 100644 --- a/middle_end/clambda.mli +++ b/middle_end/clambda.mli @@ -32,6 +32,7 @@ type ustructured_constant = | Uconst_int32 of int32 | Uconst_int64 of int64 | Uconst_nativeint of nativeint + | Uconst_vec128 of int64 * int64 | Uconst_block of int * uconstant list | Uconst_float_array of float list | Uconst_string of string diff --git a/middle_end/closure/closure.ml b/middle_end/closure/closure.ml index f44ba1b30b7..be8864b5293 100644 --- a/middle_end/closure/closure.ml +++ b/middle_end/closure/closure.ml @@ -1758,7 +1758,7 @@ let collect_exported_structured_constants a = and structured_constant = function | Uconst_block (_, ul) -> List.iter const ul | Uconst_float _ | Uconst_int32 _ - | Uconst_int64 _ | Uconst_nativeint _ + | Uconst_int64 _ | Uconst_nativeint _ | Uconst_vec128 _ | Uconst_float_array _ | Uconst_string _ -> () | Uconst_closure _ -> assert false (* Cannot be generated *) and ulam = function diff --git a/middle_end/flambda2/from_lambda/closure_conversion.ml b/middle_end/flambda2/from_lambda/closure_conversion.ml index 46b8185d31e..1fdc6e79cb3 100644 --- a/middle_end/flambda2/from_lambda/closure_conversion.ml +++ b/middle_end/flambda2/from_lambda/closure_conversion.ml @@ -206,7 +206,7 @@ let find_value_approximation env simple = match Reg_width_const.descr const with | Tagged_immediate i -> Value_approximation.Value_int i | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ -> + | Naked_vec128 _ | Naked_nativeint _ -> Value_approximation.Value_unknown) let find_value_approximation_through_symbol acc env simple = @@ -562,6 +562,7 @@ let close_c_call acc env ~loc ~let_bound_ids_with_kinds | _, Unboxed_integer Pint32 -> Some (P.Unbox_number Naked_int32) | _, Unboxed_integer Pint64 -> Some (P.Unbox_number Naked_int64) | _, Untagged_int -> Some P.Untag_immediate + | _, Unboxed_vector Pvec128 -> Some (P.Unbox_number Naked_vec128) in match unbox_arg with | None -> fun args acc -> call (arg :: args) acc diff --git a/middle_end/flambda2/from_lambda/closure_conversion_aux.ml b/middle_end/flambda2/from_lambda/closure_conversion_aux.ml index 78431d8bbb9..6f26fa2b494 100644 --- a/middle_end/flambda2/from_lambda/closure_conversion_aux.ml +++ b/middle_end/flambda2/from_lambda/closure_conversion_aux.ml @@ -468,9 +468,9 @@ module Acc = struct Block_approximation (fields, Alloc_mode.For_types.unknown ()) else Value_unknown | Set_of_closures _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ - | Boxed_nativeint _ | Immutable_float_block _ | Immutable_float_array _ - | Immutable_value_array _ | Empty_array | Mutable_string _ - | Immutable_string _ -> + | Boxed_vec128 _ | Boxed_nativeint _ | Immutable_float_block _ + | Immutable_float_array _ | Immutable_value_array _ | Empty_array + | Mutable_string _ | Immutable_string _ -> Value_unknown in let symbol_approximations = diff --git a/middle_end/flambda2/from_lambda/lambda_to_flambda_primitives.ml b/middle_end/flambda2/from_lambda/lambda_to_flambda_primitives.ml index 00fc7108122..cd2c1c99c4a 100644 --- a/middle_end/flambda2/from_lambda/lambda_to_flambda_primitives.ml +++ b/middle_end/flambda2/from_lambda/lambda_to_flambda_primitives.ml @@ -429,6 +429,8 @@ let bigarray_box_or_tag_raw_value_to_read kind alloc_mode = fun arg -> H.Unary (Box_number (Naked_int64, alloc_mode), Prim arg) | Naked_number Naked_nativeint -> fun arg -> H.Unary (Box_number (Naked_nativeint, alloc_mode), Prim arg) + | Naked_number Naked_vec128 -> + fun arg -> H.Unary (Box_number (Naked_vec128, alloc_mode), Prim arg) | Region -> error "a region expression" | Rec_info -> error "recursion info" @@ -449,6 +451,8 @@ let bigarray_unbox_or_untag_value_to_store kind = fun arg -> H.Prim (Unary (Unbox_number Naked_int64, arg)) | Naked_number Naked_nativeint -> fun arg -> H.Prim (Unary (Unbox_number Naked_nativeint, arg)) + | Naked_number Naked_vec128 -> + fun arg -> H.Prim (Unary (Unbox_number Naked_vec128, arg)) | Region -> error "a region expression" | Rec_info -> error "recursion info" diff --git a/middle_end/flambda2/numbers/numeric_types.ml b/middle_end/flambda2/numbers/numeric_types.ml index 522b75e23af..0ef2c9ac472 100644 --- a/middle_end/flambda2/numbers/numeric_types.ml +++ b/middle_end/flambda2/numbers/numeric_types.ml @@ -282,7 +282,11 @@ module Vector_by_bit_pattern (Width : Vector_width) = struct module Self = Container_types.Make (T0) include Self + let zero = Array.init Width.size_in_int64s (fun _ -> 0L) + let to_int64_array t = t + + let of_int64_array t = t end module Vec128_by_bit_pattern = struct @@ -294,4 +298,6 @@ module Vec128_by_bit_pattern = struct match to_int64_array t with | [| a; b |] -> a, b | _ -> Misc.fatal_error "Vec128.to_int64s: wrong size vector" + + let of_int64s (v0, v1) = of_int64_array [| v0; v1 |] end diff --git a/middle_end/flambda2/numbers/numeric_types.mli b/middle_end/flambda2/numbers/numeric_types.mli index fbb9291fb3c..6fd80ecf7de 100644 --- a/middle_end/flambda2/numbers/numeric_types.mli +++ b/middle_end/flambda2/numbers/numeric_types.mli @@ -141,5 +141,9 @@ module Vec128_by_bit_pattern : sig include Container_types.S + val zero : t + val to_int64s : t -> int64 * int64 + + val of_int64s : int64 * int64 -> t end diff --git a/middle_end/flambda2/parser/fexpr.ml b/middle_end/flambda2/parser/fexpr.ml index 2ae0c8a1e42..07da8bd9979 100644 --- a/middle_end/flambda2/parser/fexpr.ml +++ b/middle_end/flambda2/parser/fexpr.ml @@ -57,6 +57,7 @@ type const = | Naked_float of float | Naked_int32 of int32 | Naked_int64 of int64 + | Naked_vec128 of int64 * int64 | Naked_nativeint of targetint type field_of_block = @@ -89,6 +90,7 @@ type static_data = | Boxed_int32 of int32 or_variable | Boxed_int64 of int64 or_variable | Boxed_nativeint of targetint or_variable + | Boxed_vec128 of (int64 * int64) or_variable | Immutable_float_block of float or_variable list | Immutable_float_array of float or_variable list | Immutable_value_array of field_of_block list @@ -104,6 +106,7 @@ type subkind = | Boxed_int32 | Boxed_int64 | Boxed_nativeint + | Boxed_vec128 | Tagged_immediate | Variant of { consts : targetint list; diff --git a/middle_end/flambda2/parser/fexpr_to_flambda.ml b/middle_end/flambda2/parser/fexpr_to_flambda.ml index fcdabe32758..5cf930539f4 100644 --- a/middle_end/flambda2/parser/fexpr_to_flambda.ml +++ b/middle_end/flambda2/parser/fexpr_to_flambda.ml @@ -238,6 +238,9 @@ let targetint (i : Fexpr.targetint) : Targetint_32_64.t = let targetint_31_63 (i : Fexpr.targetint) : Targetint_31_63.t = Targetint_31_63.of_int64 i +let vec128 (v0, v1) : Numeric_types.Vec128_by_bit_pattern.t = + Numeric_types.Vec128_by_bit_pattern.of_int64s (v0, v1) + let tag_scannable (tag : Fexpr.tag_scannable) : Tag.Scannable.t = Tag.Scannable.create_exn tag @@ -252,6 +255,7 @@ let rec subkind : Fexpr.subkind -> Flambda_kind.With_subkind.Subkind.t = | Boxed_int32 -> Boxed_int32 | Boxed_int64 -> Boxed_int64 | Boxed_nativeint -> Boxed_nativeint + | Boxed_vec128 -> Boxed_vec128 | Tagged_immediate -> Tagged_immediate | Variant { consts; non_consts } -> let consts = @@ -293,6 +297,7 @@ let const (c : Fexpr.const) : Reg_width_const.t = | Naked_int32 i -> Reg_width_const.naked_int32 i | Naked_int64 i -> Reg_width_const.naked_int64 i | Naked_nativeint i -> Reg_width_const.naked_nativeint (i |> targetint) + | Naked_vec128 (v0, v1) -> Reg_width_const.naked_vec128 ((v0, v1) |> vec128) let rec rec_info env (ri : Fexpr.rec_info) : Rec_info_expr.t = let module US = Rec_info_expr.Unrolling_state in @@ -758,6 +763,8 @@ let rec expr env (e : Fexpr.expr) : Flambda.Expr.t = static_const (SC.boxed_int64 (or_variable Fun.id env i)) | Boxed_nativeint i -> static_const (SC.boxed_nativeint (or_variable targetint env i)) + | Boxed_vec128 i -> + static_const (SC.boxed_vec128 (or_variable vec128 env i)) | Immutable_float_block elements -> static_const (SC.immutable_float_block diff --git a/middle_end/flambda2/parser/flambda_to_fexpr.ml b/middle_end/flambda2/parser/flambda_to_fexpr.ml index 844ae908008..010bfff8c72 100644 --- a/middle_end/flambda2/parser/flambda_to_fexpr.ml +++ b/middle_end/flambda2/parser/flambda_to_fexpr.ml @@ -354,6 +354,8 @@ let name env n = let float f = f |> Numeric_types.Float_by_bit_pattern.to_float +let vec128 v = v |> Numeric_types.Vec128_by_bit_pattern.to_int64s + let targetint i = i |> Targetint_32_64.to_int64 let const c : Fexpr.const = @@ -367,6 +369,9 @@ let const c : Fexpr.const = | Naked_float f -> Naked_float (f |> float) | Naked_int32 i -> Naked_int32 i | Naked_int64 i -> Naked_int64 i + | Naked_vec128 i -> + let v0, v1 = Numeric_types.Vec128_by_bit_pattern.to_int64s i in + Naked_vec128 (v0, v1) | Naked_nativeint i -> Naked_nativeint (i |> targetint) let depth_or_infinity (d : int Or_infinity.t) : Fexpr.rec_info = @@ -421,6 +426,7 @@ let rec subkind (k : Flambda_kind.With_subkind.Subkind.t) : Fexpr.subkind = | Boxed_int32 -> Boxed_int32 | Boxed_int64 -> Boxed_int64 | Boxed_nativeint -> Boxed_nativeint + | Boxed_vec128 -> Boxed_vec128 | Tagged_immediate -> Tagged_immediate | Variant { consts; non_consts } -> variant_subkind consts non_consts | Float_array -> Float_array @@ -689,6 +695,7 @@ let static_const env (sc : Static_const.t) : Fexpr.static_data = | Boxed_int32 i -> Boxed_int32 (or_variable Fun.id env i) | Boxed_int64 i -> Boxed_int64 (or_variable Fun.id env i) | Boxed_nativeint i -> Boxed_nativeint (or_variable targetint env i) + | Boxed_vec128 i -> Boxed_vec128 (or_variable vec128 env i) | Immutable_float_block elements -> Immutable_float_block (List.map (or_variable float env) elements) | Immutable_float_array elements -> diff --git a/middle_end/flambda2/parser/print_fexpr.ml b/middle_end/flambda2/parser/print_fexpr.ml index 316cbb68cdc..dd14227a5a9 100644 --- a/middle_end/flambda2/parser/print_fexpr.ml +++ b/middle_end/flambda2/parser/print_fexpr.ml @@ -132,6 +132,7 @@ let naked_number_kind ppf (nnk : Flambda_kind.Naked_number_kind.t) = | Naked_int32 -> "int32" | Naked_int64 -> "int64" | Naked_nativeint -> "nativeint" + | Naked_vec128 -> "vec128" let rec subkind ppf (k : subkind) = let str s = Format.pp_print_string ppf s in @@ -142,6 +143,7 @@ let rec subkind ppf (k : subkind) = | Boxed_int32 -> str "int32 boxed" | Boxed_int64 -> str "int64 boxed" | Boxed_nativeint -> str "nativeint boxed" + | Boxed_vec128 -> str "vec128 boxed" | Variant { consts; non_consts } -> variant_subkind ppf consts non_consts | Tagged_immediate -> str "imm tagged" | Float_array -> str "float array" @@ -255,6 +257,7 @@ let const ppf (c : Fexpr.const) = | Naked_int32 i -> Format.fprintf ppf "%lil" i | Naked_int64 i -> Format.fprintf ppf "%LiL" i | Naked_nativeint i -> Format.fprintf ppf "%Lin" i + | Naked_vec128 (v0, v1) -> Format.fprintf ppf "%Ld:%Ld" v0 v1 let rec simple ppf : simple -> unit = function | Symbol s -> symbol ppf s @@ -319,10 +322,12 @@ let static_data ppf : static_data -> unit = function | Boxed_int32 (Const i) -> Format.fprintf ppf "%lil" i | Boxed_int64 (Const i) -> Format.fprintf ppf "%LiL" i | Boxed_nativeint (Const i) -> Format.fprintf ppf "%Lin" i + | Boxed_vec128 (Const (v0, v1)) -> Format.fprintf ppf "%Ld:%Ld" v0 v1 | Boxed_float (Var v) -> boxed_variable ppf v ~kind:"float" | Boxed_int32 (Var v) -> boxed_variable ppf v ~kind:"int32" | Boxed_int64 (Var v) -> boxed_variable ppf v ~kind:"int64" | Boxed_nativeint (Var v) -> boxed_variable ppf v ~kind:"nativeint" + | Boxed_vec128 (Var v) -> boxed_variable ppf v ~kind:"vec128" | Immutable_float_block elements -> Format.fprintf ppf "Float_block (%a)" (pp_comma_list float_or_variable) @@ -495,6 +500,7 @@ let unop ppf u = | Naked_int32 -> print verb_not_imm "int32" | Naked_int64 -> print verb_not_imm "int64" | Naked_nativeint -> print verb_not_imm "nativeint" + | Naked_vec128 -> print verb_not_imm "vec128" in match (u : unop) with | Array_length -> str "%array_length" diff --git a/middle_end/flambda2/simplify/expr_builder.ml b/middle_end/flambda2/simplify/expr_builder.ml index bd9e39ce827..354ea9cc71b 100644 --- a/middle_end/flambda2/simplify/expr_builder.ml +++ b/middle_end/flambda2/simplify/expr_builder.ml @@ -537,7 +537,7 @@ let create_let_symbols uacc lifted_constant ~body = | Naked_number Naked_float -> Naked_floats { size = Unknown } | Naked_number ( Naked_immediate | Naked_nativeint | Naked_int32 - | Naked_int64 ) + | Naked_vec128 | Naked_int64 ) | Region | Rec_info -> Misc.fatal_errorf "Unexpected kind %a for symbol projection: %a" diff --git a/middle_end/flambda2/simplify/lifting/reification.ml b/middle_end/flambda2/simplify/lifting/reification.ml index 5cc00438b79..59b4ebb3a38 100644 --- a/middle_end/flambda2/simplify/lifting/reification.ml +++ b/middle_end/flambda2/simplify/lifting/reification.ml @@ -37,7 +37,7 @@ let create_static_const dacc dbg (to_lift : T.to_lift) : RSC.t = match Reg_width_const.descr const with | Tagged_immediate imm -> F.Tagged_immediate imm | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ -> + | Naked_vec128 _ | Naked_nativeint _ -> Misc.fatal_errorf "Expected a constant of kind [Value] but got %a (dbg %a)" Reg_width_const.print const Debuginfo.print_compact dbg)) @@ -54,6 +54,7 @@ let create_static_const dacc dbg (to_lift : T.to_lift) : RSC.t = | Boxed_int32 i -> RSC.create_boxed_int32 art (Const i) | Boxed_int64 i -> RSC.create_boxed_int64 art (Const i) | Boxed_nativeint i -> RSC.create_boxed_nativeint art (Const i) + | Boxed_vec128 v -> RSC.create_boxed_vec128 art (Const v) | Immutable_float_array { fields } -> let fields = List.map (fun f -> Or_variable.Const f) fields in RSC.create_immutable_float_array art fields diff --git a/middle_end/flambda2/simplify/rebuilt_static_const.ml b/middle_end/flambda2/simplify/rebuilt_static_const.ml index 3925d8bf9b0..9c7f7dc948b 100644 --- a/middle_end/flambda2/simplify/rebuilt_static_const.ml +++ b/middle_end/flambda2/simplify/rebuilt_static_const.ml @@ -126,6 +126,11 @@ let create_boxed_nativeint are_rebuilding or_var = then Block_not_rebuilt { free_names = Or_variable.free_names or_var } else create_normal_non_code (SC.boxed_nativeint or_var) +let create_boxed_vec128 are_rebuilding or_var = + if ART.do_not_rebuild_terms are_rebuilding + then Block_not_rebuilt { free_names = Or_variable.free_names or_var } + else create_normal_non_code (SC.boxed_vec128 or_var) + let create_immutable_float_block are_rebuilding fields = if ART.do_not_rebuild_terms are_rebuilding then @@ -190,7 +195,7 @@ let map_set_of_closures t ~f = (SC.set_of_closures set_of_closures); free_names = Set_of_closures.free_names set_of_closures } - | Block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ + | Block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ | Boxed_vec128 _ | Boxed_nativeint _ | Immutable_float_block _ | Immutable_float_array _ | Immutable_value_array _ | Empty_array | Mutable_string _ | Immutable_string _ -> diff --git a/middle_end/flambda2/simplify/rebuilt_static_const.mli b/middle_end/flambda2/simplify/rebuilt_static_const.mli index 03f487f5ebe..790f4796d87 100644 --- a/middle_end/flambda2/simplify/rebuilt_static_const.mli +++ b/middle_end/flambda2/simplify/rebuilt_static_const.mli @@ -59,6 +59,11 @@ val create_boxed_int64 : Are_rebuilding_terms.t -> Int64.t Or_variable.t -> t val create_boxed_nativeint : Are_rebuilding_terms.t -> Targetint_32_64.t Or_variable.t -> t +val create_boxed_vec128 : + Are_rebuilding_terms.t -> + Numeric_types.Vec128_by_bit_pattern.t Or_variable.t -> + t + val create_immutable_float_block : Are_rebuilding_terms.t -> Numeric_types.Float_by_bit_pattern.t Or_variable.t list -> diff --git a/middle_end/flambda2/simplify/simplify_extcall.ml b/middle_end/flambda2/simplify/simplify_extcall.ml index e8560098315..ba9f27d189f 100644 --- a/middle_end/flambda2/simplify/simplify_extcall.ml +++ b/middle_end/flambda2/simplify/simplify_extcall.ml @@ -111,7 +111,10 @@ let simplify_comparison ~dbg ~dacc ~cont ~tagged_prim ~float_prim | Proved (Boxed _), Proved Tagged_immediate | ( Proved (Boxed - (_, (Naked_float | Naked_int32 | Naked_int64 | Naked_nativeint), _)), + ( _, + ( Naked_float | Naked_int32 | Naked_int64 | Naked_nativeint + | Naked_vec128 ), + _ )), Proved (Boxed _) ) (* One or two of the arguments is not known *) | Unknown, Unknown diff --git a/middle_end/flambda2/simplify/simplify_static_const.ml b/middle_end/flambda2/simplify/simplify_static_const.ml index 5729b8de7a0..d84d4ff423c 100644 --- a/middle_end/flambda2/simplify/simplify_static_const.ml +++ b/middle_end/flambda2/simplify/simplify_static_const.ml @@ -125,6 +125,17 @@ let simplify_static_const_of_kind_value dacc (static_const : Static_const.t) (DA.are_rebuilding_terms dacc) or_var, dacc ) + | Boxed_vec128 or_var -> + let or_var, ty = + simplify_or_variable dacc + (fun f -> T.this_boxed_vec128 f Alloc_mode.For_types.heap) + or_var K.value + in + let dacc = bind_result_sym ty in + ( Rebuilt_static_const.create_boxed_vec128 + (DA.are_rebuilding_terms dacc) + or_var, + dacc ) | Immutable_float_block fields -> let fields_with_tys = List.map diff --git a/middle_end/flambda2/simplify/simplify_switch_expr.ml b/middle_end/flambda2/simplify/simplify_switch_expr.ml index 0ef1827bd8d..4e9e7a16716 100644 --- a/middle_end/flambda2/simplify/simplify_switch_expr.ml +++ b/middle_end/flambda2/simplify/simplify_switch_expr.ml @@ -180,7 +180,7 @@ let rebuild_arm uacc arm (action, use_id, arity, env_at_use) maybe_mergeable ~mergeable_arms ~identity_arms ~not_arms else maybe_mergeable ~mergeable_arms ~identity_arms ~not_arms | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ -> + | Naked_vec128 _ | Naked_nativeint _ -> maybe_mergeable ~mergeable_arms ~identity_arms ~not_arms in Simple.pattern_match arg ~const ~name:(fun _ ~coercion:_ -> diff --git a/middle_end/flambda2/simplify/simplify_unary_primitive.ml b/middle_end/flambda2/simplify/simplify_unary_primitive.ml index 1e36f298eae..3c07c9019b3 100644 --- a/middle_end/flambda2/simplify/simplify_unary_primitive.ml +++ b/middle_end/flambda2/simplify/simplify_unary_primitive.ml @@ -110,6 +110,10 @@ let simplify_unbox_number (boxable_number_kind : K.Boxable_number.t) dacc ( T.boxed_nativeint_alias_to ~naked_nativeint:result_var' (Alloc_mode.For_types.unknown ()), K.naked_nativeint ) + | Naked_vec128 -> + ( T.boxed_vec128_alias_to ~naked_vec128:result_var' + (Alloc_mode.For_types.unknown ()), + K.naked_vec128 ) in let alloc_mode = T.prove_alloc_mode_of_boxed_number (DA.typing_env dacc) boxed_number_ty @@ -165,6 +169,7 @@ let simplify_box_number (boxable_number_kind : K.Boxable_number.t) alloc_mode | Naked_int32 -> T.box_int32 naked_number_ty alloc_mode | Naked_int64 -> T.box_int64 naked_number_ty alloc_mode | Naked_nativeint -> T.box_nativeint naked_number_ty alloc_mode + | Naked_vec128 -> T.box_vec128 naked_number_ty alloc_mode in let dacc = DA.add_variable dacc result_var ty in SPR.create original_term ~try_reify:true dacc diff --git a/middle_end/flambda2/simplify/unboxing/build_unboxing_denv.ml b/middle_end/flambda2/simplify/unboxing/build_unboxing_denv.ml index 343c2bed584..8ab1b7511fd 100644 --- a/middle_end/flambda2/simplify/unboxing/build_unboxing_denv.ml +++ b/middle_end/flambda2/simplify/unboxing/build_unboxing_denv.ml @@ -130,7 +130,8 @@ let rec denv_of_decision denv ~param_var (decision : U.decision) : DE.t = Unbox ( Unique_tag_and_size _ | Variant _ | Closure_single_entry _ | Number - ( (Naked_float | Naked_int32 | Naked_int64 | Naked_nativeint), + ( ( Naked_float | Naked_int32 | Naked_int64 + | Naked_nativeint | Naked_vec128 ), _ ) ); is_int = _ } -> @@ -195,3 +196,8 @@ let rec denv_of_decision denv ~param_var (decision : U.decision) : DE.t = in denv_of_number_decision K.naked_nativeint shape param_var naked_nativeint denv + | Unbox (Number (Naked_vec128, { param = naked_vec128; args = _ })) -> + let shape = + T.boxed_vec128_alias_to ~naked_vec128 (Alloc_mode.For_types.unknown ()) + in + denv_of_number_decision K.naked_vec128 shape param_var naked_vec128 denv diff --git a/middle_end/flambda2/simplify/unboxing/is_unboxing_beneficial.ml b/middle_end/flambda2/simplify/unboxing/is_unboxing_beneficial.ml index c30062be732..0f1827e02c4 100644 --- a/middle_end/flambda2/simplify/unboxing/is_unboxing_beneficial.ml +++ b/middle_end/flambda2/simplify/unboxing/is_unboxing_beneficial.ml @@ -79,8 +79,9 @@ let rec filter_non_beneficial_decisions decision : U.decision = decision | Unbox (Number - ((Naked_float | Naked_int32 | Naked_int64 | Naked_nativeint), epa)) as - decision -> + ( ( Naked_float | Naked_int32 | Naked_int64 | Naked_nativeint + | Naked_vec128 ), + epa )) as decision -> if is_unboxing_beneficial_for_epa epa then decision else Do_not_unbox Not_beneficial diff --git a/middle_end/flambda2/simplify/unboxing/unboxers.ml b/middle_end/flambda2/simplify/unboxing/unboxers.ml index de4b628eec5..fddb5846084 100644 --- a/middle_end/flambda2/simplify/unboxing/unboxers.ml +++ b/middle_end/flambda2/simplify/unboxing/unboxers.ml @@ -123,6 +123,24 @@ module Nativeint = struct } end +module Vec128 = struct + let decider = + { param_name = "unboxed_vec128"; + kind = K.Naked_number_kind.Naked_vec128; + prove_is_a_boxed_number = T.prove_is_a_boxed_vec128 + } + + let unboxing_prim simple = P.(Unary (Unbox_number Naked_vec128, simple)) + + let unboxer = + { var_name = "unboxed_vec128"; + invalid_const = + Const.naked_vec128 Numeric_types.Vec128_by_bit_pattern.zero; + unboxing_prim; + prove_simple = T.meet_boxed_vec128_containing_simple + } +end + module Field = struct let unboxing_prim bak ~block ~index = let field_const = Simple.const (Const.tagged_immediate index) in diff --git a/middle_end/flambda2/simplify/unboxing/unboxers.mli b/middle_end/flambda2/simplify/unboxing/unboxers.mli index bfa61f223c4..096a5530c0c 100644 --- a/middle_end/flambda2/simplify/unboxing/unboxers.mli +++ b/middle_end/flambda2/simplify/unboxing/unboxers.mli @@ -48,6 +48,8 @@ module Int64 : Number_S module Nativeint : Number_S +module Vec128 : Number_S + module Field : sig val unboxing_prim : P.Block_access_kind.t -> block:Simple.t -> index:Targetint_31_63.t -> P.t diff --git a/middle_end/flambda2/simplify/unboxing/unboxing_epa.ml b/middle_end/flambda2/simplify/unboxing/unboxing_epa.ml index ad9dbc3052f..cccf90e9ae9 100644 --- a/middle_end/flambda2/simplify/unboxing/unboxing_epa.ml +++ b/middle_end/flambda2/simplify/unboxing/unboxing_epa.ml @@ -159,8 +159,9 @@ let extra_args_for_const_ctor_of_variant Unbox ( Unique_tag_and_size _ | Variant _ | Closure_single_entry _ | Number - ((Naked_float | Naked_int32 | Naked_int64 | Naked_nativeint), _) - ); + ( ( Naked_float | Naked_int32 | Naked_int64 | Naked_nativeint + | Naked_vec128 ), + _ ) ); is_int = _ } -> Misc.fatal_errorf @@ -241,6 +242,9 @@ and compute_extra_args_for_one_decision_and_use_aux ~(pass : U.pass) rewrite_id | Unbox (Number (Naked_immediate, epa)) -> compute_extra_arg_for_number Naked_immediate Unboxers.Immediate.unboxer epa rewrite_id ~typing_env_at_use arg_being_unboxed + | Unbox (Number (Naked_vec128, epa)) -> + compute_extra_arg_for_number Naked_vec128 Unboxers.Vec128.unboxer epa + rewrite_id ~typing_env_at_use arg_being_unboxed and compute_extra_args_for_block ~pass rewrite_id ~typing_env_at_use arg_being_unboxed tag fields : U.decision = @@ -460,7 +464,7 @@ let add_extra_params_and_args extra_params_and_args decision = Unbox ( Unique_tag_and_size _ | Variant _ | Closure_single_entry _ | Number - ( ( Naked_float | Naked_int32 | Naked_int64 + ( ( Naked_float | Naked_int32 | Naked_int64 | Naked_vec128 | Naked_nativeint ), _ ) ); is_int = _ diff --git a/middle_end/flambda2/terms/code_size.ml b/middle_end/flambda2/terms/code_size.ml index 4c3e8eb612a..4abf165f9d5 100644 --- a/middle_end/flambda2/terms/code_size.ml +++ b/middle_end/flambda2/terms/code_size.ml @@ -120,14 +120,14 @@ let arith_conversion_size src dst = let unbox_number kind = match (kind : Flambda_kind.Boxable_number.t) with - | Naked_float -> 1 (* 1 load *) + | Naked_float | Naked_vec128 -> 1 (* 1 load *) | Naked_int64 when arch32 -> 4 (* 2 Cadda + 2 loads *) | Naked_int32 | Naked_int64 | Naked_nativeint -> 2 (* Cadda + load *) let box_number kind = match (kind : Flambda_kind.Boxable_number.t) with - | Naked_float -> alloc_size (* 1 alloc *) + | Naked_float | Naked_vec128 -> alloc_size (* 1 alloc *) | Naked_int32 when not arch32 -> 1 + alloc_size (* shift/sextend + alloc *) | Naked_int32 | Naked_int64 | Naked_nativeint -> alloc_size (* alloc *) diff --git a/middle_end/flambda2/terms/flambda.ml b/middle_end/flambda2/terms/flambda.ml index b64f66d73e2..f0920c58a0f 100644 --- a/middle_end/flambda2/terms/flambda.ml +++ b/middle_end/flambda2/terms/flambda.ml @@ -1379,6 +1379,9 @@ module Named = struct Simple.const (Reg_width_const.naked_int64 Int64.zero) | Naked_number Naked_nativeint -> Simple.const (Reg_width_const.naked_nativeint Targetint_32_64.zero) + | Naked_number Naked_vec128 -> + Simple.const + (Reg_width_const.naked_vec128 Numeric_types.Vec128_by_bit_pattern.zero) | Region -> Misc.fatal_error "[Region] kind not expected here" | Rec_info -> Misc.fatal_error "[Rec_info] kind not expected here" in @@ -1410,7 +1413,7 @@ module Named = struct | Deleted_code | Static_const ( Block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ - | Boxed_nativeint _ | Immutable_float_block _ + | Boxed_vec128 _ | Boxed_nativeint _ | Immutable_float_block _ | Immutable_float_array _ | Mutable_string _ | Immutable_string _ | Empty_array | Immutable_value_array _ ) -> diff --git a/middle_end/flambda2/terms/static_const.ml b/middle_end/flambda2/terms/static_const.ml index 2a02b89f1b8..21be9fc8236 100644 --- a/middle_end/flambda2/terms/static_const.ml +++ b/middle_end/flambda2/terms/static_const.ml @@ -23,6 +23,7 @@ type t = | Boxed_int32 of Int32.t Or_variable.t | Boxed_int64 of Int64.t Or_variable.t | Boxed_nativeint of Targetint_32_64.t Or_variable.t + | Boxed_vec128 of Numeric_types.Vec128_by_bit_pattern.t Or_variable.t | Immutable_float_block of Numeric_types.Float_by_bit_pattern.t Or_variable.t list | Immutable_float_array of @@ -44,6 +45,8 @@ let boxed_int64 or_var = Boxed_int64 or_var let boxed_nativeint or_var = Boxed_nativeint or_var +let boxed_vec128 or_var = Boxed_vec128 or_var + let immutable_float_block fields = Immutable_float_block fields let immutable_float_array fields = @@ -96,6 +99,11 @@ let [@ocamlformat "disable"] print ppf t = Flambda_colours.static_part Flambda_colours.pop (Or_variable.print Targetint_32_64.print) or_var + | Boxed_vec128 or_var -> + fprintf ppf "@[(%tBoxed_vec128%t@ %a)@]" + Flambda_colours.static_part + Flambda_colours.pop + (Or_variable.print Numeric_types.Vec128_by_bit_pattern.print) or_var | Immutable_float_block fields -> fprintf ppf "@[(%tImmutable_float_block%t@ @[[| %a |]@])@]" Flambda_colours.static_part @@ -161,6 +169,9 @@ include Container_types.Make (struct Or_variable.compare Numeric_types.Int64.compare or_var1 or_var2 | Boxed_nativeint or_var1, Boxed_nativeint or_var2 -> Or_variable.compare Targetint_32_64.compare or_var1 or_var2 + | Boxed_vec128 or_var1, Boxed_vec128 or_var2 -> + Or_variable.compare Numeric_types.Vec128_by_bit_pattern.compare or_var1 + or_var2 | Immutable_float_block fields1, Immutable_float_array fields2 -> Misc.Stdlib.List.compare (Or_variable.compare Numeric_types.Float_by_bit_pattern.compare) @@ -188,6 +199,8 @@ include Container_types.Make (struct | _, Boxed_int64 _ -> 1 | Boxed_nativeint _, _ -> -1 | _, Boxed_nativeint _ -> 1 + | Boxed_vec128 _, _ -> -1 + | _, Boxed_vec128 _ -> 1 | Immutable_float_block _, _ -> -1 | _, Immutable_float_block _ -> 1 | Immutable_float_array _, _ -> -1 @@ -218,6 +231,7 @@ let free_names t = | Boxed_int32 or_var -> Or_variable.free_names or_var | Boxed_int64 or_var -> Or_variable.free_names or_var | Boxed_nativeint or_var -> Or_variable.free_names or_var + | Boxed_vec128 or_var -> Or_variable.free_names or_var | Mutable_string { initial_value = _ } | Immutable_string _ | Empty_array -> Name_occurrences.empty | Immutable_float_block fields | Immutable_float_array fields -> @@ -256,6 +270,9 @@ let apply_renaming t renaming = | Boxed_nativeint or_var -> let or_var' = Or_variable.apply_renaming or_var renaming in if or_var == or_var' then t else Boxed_nativeint or_var' + | Boxed_vec128 or_var -> + let or_var' = Or_variable.apply_renaming or_var renaming in + if or_var == or_var' then t else Boxed_vec128 or_var' | Mutable_string { initial_value = _ } | Immutable_string _ -> t | Immutable_float_block fields -> let fields' = @@ -303,12 +320,14 @@ let ids_for_export t = | Boxed_float (Var (var, _dbg)) | Boxed_int32 (Var (var, _dbg)) | Boxed_int64 (Var (var, _dbg)) - | Boxed_nativeint (Var (var, _dbg)) -> + | Boxed_nativeint (Var (var, _dbg)) + | Boxed_vec128 (Var (var, _dbg)) -> Ids_for_export.add_variable Ids_for_export.empty var | Boxed_float (Const _) | Boxed_int32 (Const _) | Boxed_int64 (Const _) | Boxed_nativeint (Const _) + | Boxed_vec128 (Const _) | Mutable_string { initial_value = _ } | Immutable_string _ -> Ids_for_export.empty @@ -332,8 +351,9 @@ let ids_for_export t = let is_block t = match t with | Block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ | Boxed_nativeint _ - | Immutable_float_block _ | Immutable_float_array _ | Immutable_string _ - | Mutable_string _ | Empty_array | Immutable_value_array _ -> + | Boxed_vec128 _ | Immutable_float_block _ | Immutable_float_array _ + | Immutable_string _ | Mutable_string _ | Empty_array + | Immutable_value_array _ -> true | Set_of_closures _ -> false @@ -341,8 +361,9 @@ let is_set_of_closures t = match t with | Set_of_closures _ -> true | Block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ | Boxed_nativeint _ - | Immutable_float_block _ | Immutable_float_array _ | Immutable_string _ - | Mutable_string _ | Empty_array | Immutable_value_array _ -> + | Boxed_vec128 _ | Immutable_float_block _ | Immutable_float_array _ + | Immutable_string _ | Mutable_string _ | Empty_array + | Immutable_value_array _ -> false let is_fully_static t = free_names t |> Name_occurrences.no_variables @@ -351,8 +372,9 @@ let can_share0 t = match t with | Block (_, Immutable, _) | Set_of_closures _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ - | Boxed_nativeint _ | Immutable_float_block _ | Immutable_float_array _ - | Immutable_string _ | Empty_array | Immutable_value_array _ -> + | Boxed_vec128 _ | Boxed_nativeint _ | Immutable_float_block _ + | Immutable_float_array _ | Immutable_string _ | Empty_array + | Immutable_value_array _ -> true | Block (_, (Mutable | Immutable_unique), _) | Mutable_string _ -> false @@ -362,8 +384,9 @@ let must_be_set_of_closures t = match t with | Set_of_closures set -> set | Block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ | Boxed_nativeint _ - | Immutable_float_block _ | Immutable_float_array _ | Empty_array - | Immutable_value_array _ | Immutable_string _ | Mutable_string _ -> + | Boxed_vec128 _ | Immutable_float_block _ | Immutable_float_array _ + | Empty_array | Immutable_value_array _ | Immutable_string _ + | Mutable_string _ -> Misc.fatal_errorf "Not a set of closures:@ %a" print t let match_against_bound_static_pattern t (pat : Bound_static.Pattern.t) @@ -386,14 +409,14 @@ let match_against_bound_static_pattern t (pat : Bound_static.Pattern.t) Misc.fatal_errorf "Mismatch on declared function slots:@ %a@ =@ %a" Bound_static.Pattern.print pat print t; set_of_closures_callback ~closure_symbols set_of_closures - | ( ( Block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ + | ( ( Block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ | Boxed_vec128 _ | Boxed_nativeint _ | Immutable_float_block _ | Immutable_float_array _ | Immutable_value_array _ | Empty_array | Immutable_string _ | Mutable_string _ ), Block_like symbol ) -> block_like_callback symbol t | Set_of_closures _, (Block_like _ | Code _) - | ( ( Block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ + | ( ( Block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ | Boxed_vec128 _ | Boxed_nativeint _ | Immutable_float_block _ | Immutable_float_array _ | Immutable_value_array _ | Empty_array | Immutable_string _ | Mutable_string _ ), diff --git a/middle_end/flambda2/terms/static_const.mli b/middle_end/flambda2/terms/static_const.mli index 17950a648b3..89cf4bd78c1 100644 --- a/middle_end/flambda2/terms/static_const.mli +++ b/middle_end/flambda2/terms/static_const.mli @@ -29,6 +29,7 @@ type t = private | Boxed_int32 of Int32.t Or_variable.t | Boxed_int64 of Int64.t Or_variable.t | Boxed_nativeint of Targetint_32_64.t Or_variable.t + | Boxed_vec128 of Numeric_types.Vec128_by_bit_pattern.t Or_variable.t | Immutable_float_block of Numeric_types.Float_by_bit_pattern.t Or_variable.t list | Immutable_float_array of @@ -62,6 +63,8 @@ val boxed_int64 : Int64.t Or_variable.t -> t val boxed_nativeint : Targetint_32_64.t Or_variable.t -> t +val boxed_vec128 : Numeric_types.Vec128_by_bit_pattern.t Or_variable.t -> t + val immutable_float_block : Numeric_types.Float_by_bit_pattern.t Or_variable.t list -> t diff --git a/middle_end/flambda2/to_cmm/to_cmm_env.ml b/middle_end/flambda2/to_cmm/to_cmm_env.ml index 36b67dbd886..4f774228e71 100644 --- a/middle_end/flambda2/to_cmm/to_cmm_env.ml +++ b/middle_end/flambda2/to_cmm/to_cmm_env.ml @@ -394,8 +394,8 @@ let splittable_primitive dbg prim args = Splittable_prim { dbg; prim; args } let is_cmm_simple cmm = match (cmm : Cmm.expression) with - | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ | Cvar _ - -> + | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_vec128 _ + | Cconst_symbol _ | Cvar _ -> true | Clet _ | Clet_mut _ | Cphantom_let _ | Cassign _ | Ctuple _ | Cop _ | Csequence _ | Cifthenelse _ | Cswitch _ | Ccatch _ | Cexit _ | Ctrywith _ diff --git a/middle_end/flambda2/to_cmm/to_cmm_expr.ml b/middle_end/flambda2/to_cmm/to_cmm_expr.ml index fa5c7051fc0..236eee5d426 100644 --- a/middle_end/flambda2/to_cmm/to_cmm_expr.ml +++ b/middle_end/flambda2/to_cmm/to_cmm_expr.ml @@ -186,7 +186,8 @@ let translate_apply0 ~dbg_with_inlined:dbg env res apply = match Flambda_kind.With_subkind.kind kind with | Naked_number Naked_int32 -> C.sign_extend_32 | Naked_number - (Naked_float | Naked_immediate | Naked_int64 | Naked_nativeint) + ( Naked_float | Naked_immediate | Naked_int64 | Naked_nativeint + | Naked_vec128 ) | Value | Rec_info | Region -> fun _dbg cmm -> cmm) | _ -> @@ -629,6 +630,7 @@ and let_cont_exn_handler env res k body vars handler free_vars_of_handler | Naked_number (Naked_immediate | Naked_int32 | Naked_int64 | Naked_nativeint) -> C.int ~dbg 0 + | Naked_number Naked_vec128 -> C.vec128 ~dbg (0L, 0L) | Region | Rec_info -> Misc.fatal_errorf "No dummy value available for kind %a" K.With_subkind.print kind diff --git a/middle_end/flambda2/to_cmm/to_cmm_primitive.ml b/middle_end/flambda2/to_cmm/to_cmm_primitive.ml index 705e1f45616..165d166309a 100644 --- a/middle_end/flambda2/to_cmm/to_cmm_primitive.ml +++ b/middle_end/flambda2/to_cmm/to_cmm_primitive.ml @@ -50,6 +50,7 @@ let value_slot_offset env value_slot = let unbox_number ~dbg kind arg = match (kind : K.Boxable_number.t) with | Naked_float -> C.unbox_float dbg arg + | Naked_vec128 -> C.unbox_vector dbg Pvec128 arg | Naked_int32 | Naked_int64 | Naked_nativeint -> let primitive_kind = K.Boxable_number.primitive_kind kind in C.unbox_int dbg primitive_kind arg @@ -58,6 +59,7 @@ let box_number ~dbg kind alloc_mode arg = let alloc_mode = Alloc_mode.For_allocations.to_lambda alloc_mode in match (kind : K.Boxable_number.t) with | Naked_float -> C.box_float dbg alloc_mode arg + | Naked_vec128 -> C.box_vector dbg Pvec128 alloc_mode arg | Naked_int32 | Naked_int64 | Naked_nativeint -> let primitive_kind = K.Boxable_number.primitive_kind kind in C.box_int_gen dbg primitive_kind alloc_mode arg diff --git a/middle_end/flambda2/to_cmm/to_cmm_result.ml b/middle_end/flambda2/to_cmm/to_cmm_result.ml index eac1d30a973..2347830a71e 100644 --- a/middle_end/flambda2/to_cmm/to_cmm_result.ml +++ b/middle_end/flambda2/to_cmm/to_cmm_result.ml @@ -95,7 +95,7 @@ let check_for_module_symbol t symbol = let defines_a_symbol data = match (data : Cmm.data_item) with | Cdefine_symbol _ -> true - | Cint8 _ | Cint16 _ | Cint32 _ | Cint _ | Csingle _ | Cdouble _ + | Cint8 _ | Cint16 _ | Cint32 _ | Cint _ | Csingle _ | Cdouble _ | Cvec128 _ | Csymbol_address _ | Cstring _ | Cskip _ | Calign _ -> false diff --git a/middle_end/flambda2/to_cmm/to_cmm_shared.ml b/middle_end/flambda2/to_cmm/to_cmm_shared.ml index ec181dc4370..0d02646c65c 100644 --- a/middle_end/flambda2/to_cmm/to_cmm_shared.ml +++ b/middle_end/flambda2/to_cmm/to_cmm_shared.ml @@ -135,7 +135,8 @@ let const ~dbg cst = | Naked_float f -> float ~dbg (Numeric_types.Float_by_bit_pattern.to_float f) | Naked_int32 i -> int32 ~dbg i | Naked_int64 i -> int64 ~dbg i - | Naked_vec128 i -> vec128 ~dbg i + | Naked_vec128 i -> + vec128 ~dbg (Numeric_types.Vec128_by_bit_pattern.to_int64s i) | Naked_nativeint t -> targetint ~dbg t let simple ?consider_inlining_effectful_expressions ~dbg env res s = @@ -168,7 +169,8 @@ let const_static cst = (tag_targetint (Targetint_31_63.to_targetint i))) ] | Naked_float f -> [cfloat (Numeric_types.Float_by_bit_pattern.to_float f)] | Naked_int32 i -> [cint (Nativeint.of_int32 i)] - (* CR mslater: (slack question) *) + (* We don't compile flambda-backend in 32-bit mode, so nativeint is 64 + bits. *) | Naked_int64 i -> [cint (Int64.to_nativeint i)] | Naked_vec128 v -> [cvec128 (Numeric_types.Vec128_by_bit_pattern.to_int64s v)] | Naked_nativeint t -> [cint (nativeint_of_targetint t)] diff --git a/middle_end/flambda2/to_cmm/to_cmm_static.ml b/middle_end/flambda2/to_cmm/to_cmm_static.ml index 468e87adf22..403a8deedd6 100644 --- a/middle_end/flambda2/to_cmm/to_cmm_static.ml +++ b/middle_end/flambda2/to_cmm/to_cmm_static.ml @@ -158,6 +158,15 @@ let static_const0 env res ~updates (bound_static : Bound_static.Pattern.t) ~emit:C.emit_nativeint_constant ~transl ~structured v res updates in env, res, updates + | Block_like symbol, Boxed_vec128 v -> + let default = Numeric_types.Vec128_by_bit_pattern.zero in + let transl = Numeric_types.Vec128_by_bit_pattern.to_int64s in + let structured (v0, v1) = Clambda.Uconst_vec128 (v0, v1) in + let res, env, updates = + static_boxed_number ~kind:Word_int ~env ~symbol ~default + ~emit:C.emit_vec128_constant ~transl ~structured v res updates + in + env, res, updates | Block_like s, (Immutable_float_block fields | Immutable_float_array fields) -> let aux = @@ -197,7 +206,7 @@ let static_const0 env res ~updates (bound_static : Bound_static.Pattern.t) "[Set_of_closures] values cannot be bound by [Block_like] bindings:@ %a" SC.print static_const | ( (Code _ | Set_of_closures _), - ( Block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ + ( Block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ | Boxed_vec128 _ | Boxed_nativeint _ | Immutable_float_block _ | Immutable_float_array _ | Immutable_value_array _ | Empty_array | Mutable_string _ | Immutable_string _ ) ) -> diff --git a/middle_end/flambda2/types/env/typing_env.ml b/middle_end/flambda2/types/env/typing_env.ml index 5c7f86841d1..94c691d3032 100644 --- a/middle_end/flambda2/types/env/typing_env.ml +++ b/middle_end/flambda2/types/env/typing_env.ml @@ -1308,14 +1308,14 @@ end = struct match Reg_width_const.descr const with | Tagged_immediate i -> VA.Value_int i | Naked_immediate _ | Naked_float _ | Naked_int32 _ - | Naked_int64 _ | Naked_nativeint _ -> + | Naked_vec128 _ | Naked_int64 _ | Naked_nativeint _ -> VA.Value_unknown) ~var:(fun _ ~coercion:_ -> VA.Value_unknown) ~symbol:(fun symbol ~coercion:_ -> VA.Value_symbol symbol) | Ok (No_alias head) -> ( match head with | Mutable_block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ - | Boxed_nativeint _ | String _ | Array _ -> + | Boxed_vec128 _ | Boxed_nativeint _ | String _ | Array _ -> Value_unknown | Closures { by_function_slot; alloc_mode = _ } -> ( match TG.Row_like_for_closures.get_singleton by_function_slot with @@ -1357,7 +1357,7 @@ end = struct Block_approximation (Array.of_list fields, alloc_mode) else Value_unknown)) | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> assert false in let symbol_ty, _binding_time_and_mode = diff --git a/middle_end/flambda2/types/expand_head.ml b/middle_end/flambda2/types/expand_head.ml index a7c8091f312..17ff71a9bfd 100644 --- a/middle_end/flambda2/types/expand_head.ml +++ b/middle_end/flambda2/types/expand_head.ml @@ -37,6 +37,8 @@ module Expanded_type : sig val create_naked_nativeint : Type_grammar.head_of_kind_naked_nativeint -> t + val create_naked_vec128 : Type_grammar.head_of_kind_naked_vec128 -> t + val create_rec_info : Type_grammar.head_of_kind_rec_info -> t val create_region : Type_grammar.head_of_kind_region -> t @@ -62,6 +64,7 @@ module Expanded_type : sig | Naked_int32 of Type_grammar.head_of_kind_naked_int32 | Naked_int64 of Type_grammar.head_of_kind_naked_int64 | Naked_nativeint of Type_grammar.head_of_kind_naked_nativeint + | Naked_vec128 of Type_grammar.head_of_kind_naked_vec128 | Rec_info of Type_grammar.head_of_kind_rec_info | Region of Type_grammar.head_of_kind_region @@ -79,6 +82,8 @@ module Expanded_type : sig Type_grammar.head_of_kind_naked_int64 Or_unknown_or_bottom.t | Naked_nativeint of Type_grammar.head_of_kind_naked_nativeint Or_unknown_or_bottom.t + | Naked_vec128 of + Type_grammar.head_of_kind_naked_vec128 Or_unknown_or_bottom.t | Rec_info of Type_grammar.head_of_kind_rec_info Or_unknown_or_bottom.t | Region of Type_grammar.head_of_kind_region Or_unknown_or_bottom.t @@ -91,6 +96,7 @@ end = struct | Naked_int32 of TG.head_of_kind_naked_int32 | Naked_int64 of TG.head_of_kind_naked_int64 | Naked_nativeint of TG.head_of_kind_naked_nativeint + | Naked_vec128 of TG.head_of_kind_naked_vec128 | Rec_info of TG.head_of_kind_rec_info | Region of TG.head_of_kind_region @@ -118,6 +124,9 @@ end = struct let create_naked_nativeint head = { kind = K.naked_nativeint; descr = Ok (Naked_nativeint head) } + let create_naked_vec128 head = + { kind = K.naked_vec128; descr = Ok (Naked_vec128 head) } + let create_rec_info head = { kind = K.rec_info; descr = Ok (Rec_info head) } let create_region head = { kind = K.region; descr = Ok (Region head) } @@ -165,6 +174,15 @@ end = struct match TG.apply_coercion_head_of_kind_naked_float head coercion with | Bottom -> create_bottom K.naked_float | Ok head -> create_naked_float head)) + | Naked_vec128 Unknown -> create_unknown K.naked_vec128 + | Naked_vec128 Bottom -> create_bottom K.naked_vec128 + | Naked_vec128 (Ok (No_alias head)) -> ( + match coercion with + | None -> create_naked_vec128 head + | Some coercion -> ( + match TG.apply_coercion_head_of_kind_naked_vec128 head coercion with + | Bottom -> create_bottom K.naked_vec128 + | Ok head -> create_naked_vec128 head)) | Naked_int32 Unknown -> create_unknown K.naked_int32 | Naked_int32 Bottom -> create_bottom K.naked_int32 | Naked_int32 (Ok (No_alias head)) -> ( @@ -213,6 +231,7 @@ end = struct | Value (Ok (Equals _)) | Naked_immediate (Ok (Equals _)) | Naked_float (Ok (Equals _)) + | Naked_vec128 (Ok (Equals _)) | Naked_int32 (Ok (Equals _)) | Naked_int64 (Ok (Equals _)) | Naked_nativeint (Ok (Equals _)) @@ -232,6 +251,7 @@ end = struct | Naked_int32 head -> TG.create_from_head_naked_int32 head | Naked_int64 head -> TG.create_from_head_naked_int64 head | Naked_nativeint head -> TG.create_from_head_naked_nativeint head + | Naked_vec128 head -> TG.create_from_head_naked_vec128 head | Rec_info head -> TG.create_from_head_rec_info head | Region head -> TG.create_from_head_region head) @@ -247,6 +267,8 @@ end = struct Type_grammar.head_of_kind_naked_int64 Or_unknown_or_bottom.t | Naked_nativeint of Type_grammar.head_of_kind_naked_nativeint Or_unknown_or_bottom.t + | Naked_vec128 of + Type_grammar.head_of_kind_naked_vec128 Or_unknown_or_bottom.t | Rec_info of Type_grammar.head_of_kind_rec_info Or_unknown_or_bottom.t | Region of Type_grammar.head_of_kind_region Or_unknown_or_bottom.t @@ -260,6 +282,7 @@ end = struct | Naked_number Naked_int32 -> Naked_int32 Unknown | Naked_number Naked_int64 -> Naked_int64 Unknown | Naked_number Naked_nativeint -> Naked_nativeint Unknown + | Naked_number Naked_vec128 -> Naked_vec128 Unknown | Rec_info -> Rec_info Unknown | Region -> Region Unknown) | Bottom -> ( @@ -270,6 +293,7 @@ end = struct | Naked_number Naked_int32 -> Naked_int32 Bottom | Naked_number Naked_int64 -> Naked_int64 Bottom | Naked_number Naked_nativeint -> Naked_nativeint Bottom + | Naked_number Naked_vec128 -> Naked_vec128 Bottom | Rec_info -> Rec_info Bottom | Region -> Region Bottom) | Ok (Value head) -> Value (Ok head) @@ -278,6 +302,7 @@ end = struct | Ok (Naked_int32 head) -> Naked_int32 (Ok head) | Ok (Naked_int64 head) -> Naked_int64 (Ok head) | Ok (Naked_nativeint head) -> Naked_nativeint (Ok head) + | Ok (Naked_vec128 head) -> Naked_vec128 (Ok head) | Ok (Rec_info head) -> Rec_info (Ok head) | Ok (Region head) -> Region (Ok head) end @@ -312,7 +337,9 @@ let expand_head_of_alias_type env kind | Naked_int64 i -> ET.create_naked_int64 (TG.Head_of_kind_naked_int64.create i) | Naked_nativeint i -> - ET.create_naked_nativeint (TG.Head_of_kind_naked_nativeint.create i)) + ET.create_naked_nativeint (TG.Head_of_kind_naked_nativeint.create i) + | Naked_vec128 i -> + ET.create_naked_vec128 (TG.Head_of_kind_naked_vec128.create i)) ~name let expand_head0 env ty ~known_canonical_simple_at_in_types_mode = diff --git a/middle_end/flambda2/types/expand_head.mli b/middle_end/flambda2/types/expand_head.mli index 7e88deb019e..ccc1714fe7b 100644 --- a/middle_end/flambda2/types/expand_head.mli +++ b/middle_end/flambda2/types/expand_head.mli @@ -32,6 +32,8 @@ module Expanded_type : sig val create_naked_nativeint : Type_grammar.head_of_kind_naked_nativeint -> t + val create_naked_vec128 : Type_grammar.head_of_kind_naked_vec128 -> t + val create_rec_info : Type_grammar.head_of_kind_rec_info -> t val create_region : Type_grammar.head_of_kind_region -> t @@ -57,6 +59,7 @@ module Expanded_type : sig | Naked_int32 of Type_grammar.head_of_kind_naked_int32 | Naked_int64 of Type_grammar.head_of_kind_naked_int64 | Naked_nativeint of Type_grammar.head_of_kind_naked_nativeint + | Naked_vec128 of Type_grammar.head_of_kind_naked_vec128 | Rec_info of Type_grammar.head_of_kind_rec_info | Region of Type_grammar.head_of_kind_region @@ -74,6 +77,8 @@ module Expanded_type : sig Type_grammar.head_of_kind_naked_int64 Or_unknown_or_bottom.t | Naked_nativeint of Type_grammar.head_of_kind_naked_nativeint Or_unknown_or_bottom.t + | Naked_vec128 of + Type_grammar.head_of_kind_naked_vec128 Or_unknown_or_bottom.t | Rec_info of Type_grammar.head_of_kind_rec_info Or_unknown_or_bottom.t | Region of Type_grammar.head_of_kind_region Or_unknown_or_bottom.t diff --git a/middle_end/flambda2/types/flambda2_types.mli b/middle_end/flambda2/types/flambda2_types.mli index 9e0e417d062..8406b81f3f9 100644 --- a/middle_end/flambda2/types/flambda2_types.mli +++ b/middle_end/flambda2/types/flambda2_types.mli @@ -365,6 +365,9 @@ val this_boxed_int64 : Numeric_types.Int64.t -> Alloc_mode.For_types.t -> t val this_boxed_nativeint : Targetint_32_64.t -> Alloc_mode.For_types.t -> t +val this_boxed_vec128 : + Numeric_types.Vec128_by_bit_pattern.t -> Alloc_mode.For_types.t -> t + val these_tagged_immediates : Targetint_31_63.Set.t -> t val these_boxed_floats : @@ -412,6 +415,9 @@ val boxed_int64_alias_to : naked_int64:Variable.t -> Alloc_mode.For_types.t -> t val boxed_nativeint_alias_to : naked_nativeint:Variable.t -> Alloc_mode.For_types.t -> t +val boxed_vec128_alias_to : + naked_vec128:Variable.t -> Alloc_mode.For_types.t -> t + val box_float : t -> Alloc_mode.For_types.t -> t val box_int32 : t -> Alloc_mode.For_types.t -> t @@ -601,6 +607,8 @@ val prove_is_a_boxed_int64 : Typing_env.t -> t -> unit proof_of_property val prove_is_a_boxed_nativeint : Typing_env.t -> t -> unit proof_of_property +val prove_is_a_boxed_vec128 : Typing_env.t -> t -> unit proof_of_property + val prove_is_or_is_not_a_boxed_float : Typing_env.t -> t -> bool proof_of_property @@ -677,6 +685,9 @@ val meet_boxed_int64_containing_simple : val meet_boxed_nativeint_containing_simple : Typing_env.t -> min_name_mode:Name_mode.t -> t -> Simple.t meet_shortcut +val meet_boxed_vec128_containing_simple : + Typing_env.t -> min_name_mode:Name_mode.t -> t -> Simple.t meet_shortcut + val meet_block_field_simple : Typing_env.t -> min_name_mode:Name_mode.t -> @@ -716,6 +727,7 @@ type to_lift = private | Boxed_int32 of Numeric_types.Int32.t | Boxed_int64 of Numeric_types.Int64.t | Boxed_nativeint of Targetint_32_64.t + | Boxed_vec128 of Numeric_types.Vec128_by_bit_pattern.t | Immutable_float_array of { fields : Numeric_types.Float_by_bit_pattern.t list } | Immutable_value_array of { fields : Simple.t list } diff --git a/middle_end/flambda2/types/grammar/more_type_creators.ml b/middle_end/flambda2/types/grammar/more_type_creators.ml index 833565b4aa0..f2f1ef746db 100644 --- a/middle_end/flambda2/types/grammar/more_type_creators.ml +++ b/middle_end/flambda2/types/grammar/more_type_creators.ml @@ -89,6 +89,9 @@ let this_boxed_int64 i alloc_mode = let this_boxed_nativeint i alloc_mode = TG.box_nativeint (TG.this_naked_nativeint i) alloc_mode +let this_boxed_vec128 i alloc_mode = + TG.box_vec128 (TG.this_naked_vec128 i) alloc_mode + let these_boxed_floats fs alloc_mode = TG.box_float (these_naked_floats fs) alloc_mode diff --git a/middle_end/flambda2/types/grammar/more_type_creators.mli b/middle_end/flambda2/types/grammar/more_type_creators.mli index 46e6df57046..988630953fc 100644 --- a/middle_end/flambda2/types/grammar/more_type_creators.mli +++ b/middle_end/flambda2/types/grammar/more_type_creators.mli @@ -58,6 +58,11 @@ val this_boxed_int64 : int64 -> Alloc_mode.For_types.t -> Type_grammar.t val this_boxed_nativeint : Targetint_32_64.t -> Alloc_mode.For_types.t -> Type_grammar.t +val this_boxed_vec128 : + Numeric_types.Vec128_by_bit_pattern.t -> + Alloc_mode.For_types.t -> + Type_grammar.t + val these_boxed_floats : Numeric_types.Float_by_bit_pattern.Set.t -> Alloc_mode.For_types.t -> diff --git a/middle_end/flambda2/types/grammar/type_grammar.ml b/middle_end/flambda2/types/grammar/type_grammar.ml index 7aa186b8e62..2f88f31cf42 100644 --- a/middle_end/flambda2/types/grammar/type_grammar.ml +++ b/middle_end/flambda2/types/grammar/type_grammar.ml @@ -3021,6 +3021,8 @@ let create_from_head_naked_int64 head = Naked_int64 (TD.create head) let create_from_head_naked_nativeint head = Naked_nativeint (TD.create head) +let create_from_head_naked_vec128 head = Naked_vec128 (TD.create head) + let create_from_head_rec_info head = Rec_info (TD.create head) let create_from_head_region head = Region (TD.create head) @@ -3041,6 +3043,8 @@ module Head_of_kind_value = struct let create_boxed_nativeint ty alloc_mode = Boxed_nativeint (ty, alloc_mode) + let create_boxed_vec128 ty alloc_mode = Boxed_vec128 (ty, alloc_mode) + let create_tagged_immediate imm : t = Variant { is_unique = false; @@ -3113,6 +3117,8 @@ module Head_of_kind_naked_int32 = Make_head_of_kind_naked_number (Int32) module Head_of_kind_naked_int64 = Make_head_of_kind_naked_number (Int64) module Head_of_kind_naked_nativeint = Make_head_of_kind_naked_number (Targetint_32_64) +module Head_of_kind_naked_vec128 = + Make_head_of_kind_naked_number (Numeric_types.Vec128_by_bit_pattern) let rec recover_some_aliases t = match t with diff --git a/middle_end/flambda2/types/grammar/type_grammar.mli b/middle_end/flambda2/types/grammar/type_grammar.mli index be0c2363118..7ee96a5bbe3 100644 --- a/middle_end/flambda2/types/grammar/type_grammar.mli +++ b/middle_end/flambda2/types/grammar/type_grammar.mli @@ -535,6 +535,8 @@ val create_from_head_naked_int64 : head_of_kind_naked_int64 -> t val create_from_head_naked_nativeint : head_of_kind_naked_nativeint -> t +val create_from_head_naked_vec128 : head_of_kind_naked_vec128 -> t + val create_from_head_rec_info : head_of_kind_rec_info -> t val create_from_head_region : head_of_kind_region -> t @@ -561,6 +563,11 @@ val apply_coercion_head_of_kind_naked_nativeint : Coercion.t -> head_of_kind_naked_nativeint Or_bottom.t +val apply_coercion_head_of_kind_naked_vec128 : + head_of_kind_naked_vec128 -> + Coercion.t -> + head_of_kind_naked_vec128 Or_bottom.t + val apply_coercion_head_of_kind_rec_info : head_of_kind_rec_info -> Coercion.t -> head_of_kind_rec_info Or_bottom.t @@ -588,6 +595,8 @@ module Head_of_kind_value : sig val create_boxed_nativeint : flambda_type -> Alloc_mode.For_types.t -> t + val create_boxed_vec128 : flambda_type -> Alloc_mode.For_types.t -> t + val create_tagged_immediate : Targetint_31_63.t -> t val create_closures : Row_like_for_closures.t -> Alloc_mode.For_types.t -> t @@ -654,4 +663,10 @@ module Head_of_kind_naked_nativeint : with type n = Targetint_32_64.t with type n_set = Targetint_32_64.Set.t +module Head_of_kind_naked_vec128 : + Head_of_kind_naked_number_intf + with type t = head_of_kind_naked_vec128 + with type n = Numeric_types.Vec128_by_bit_pattern.t + with type n_set = Numeric_types.Vec128_by_bit_pattern.Set.t + val recover_some_aliases : t -> t diff --git a/middle_end/flambda2/types/meet_and_join.ml b/middle_end/flambda2/types/meet_and_join.ml index cdb3aa1c099..bbcaf44bc3b 100644 --- a/middle_end/flambda2/types/meet_and_join.ml +++ b/middle_end/flambda2/types/meet_and_join.ml @@ -309,6 +309,11 @@ and meet_expanded_head0 env (descr1 : ET.descr) (descr2 : ET.descr) : meet_head_of_kind_naked_nativeint env head1 head2 in ET.create_naked_nativeint head, env_extension + | Naked_vec128 head1, Naked_vec128 head2 -> + let<+ head, env_extension = + meet_head_of_kind_naked_vec128 env head1 head2 + in + ET.create_naked_vec128 head, env_extension | Rec_info head1, Rec_info head2 -> let<+ head, env_extension = meet_head_of_kind_rec_info env head1 head2 in ET.create_rec_info head, env_extension @@ -316,7 +321,8 @@ and meet_expanded_head0 env (descr1 : ET.descr) (descr2 : ET.descr) : let<+ head, env_extension = meet_head_of_kind_region env head1 head2 in ET.create_region head, env_extension | ( ( Value _ | Naked_immediate _ | Naked_float _ | Naked_int32 _ - | Naked_int64 _ | Naked_nativeint _ | Rec_info _ | Region _ ), + | Naked_vec128 _ | Naked_int64 _ | Naked_nativeint _ | Rec_info _ + | Region _ ), _ ) -> assert false @@ -363,6 +369,10 @@ and meet_head_of_kind_value env (head1 : TG.head_of_kind_value) let<* n, env_extension = meet env n1 n2 in let<+ alloc_mode = meet_alloc_mode alloc_mode1 alloc_mode2 in TG.Head_of_kind_value.create_boxed_nativeint n alloc_mode, env_extension + | Boxed_vec128 (n1, alloc_mode1), Boxed_vec128 (n2, alloc_mode2) -> + let<* n, env_extension = meet env n1 n2 in + let<+ alloc_mode = meet_alloc_mode alloc_mode1 alloc_mode2 in + TG.Head_of_kind_value.create_boxed_vec128 n alloc_mode, env_extension | ( Closures { by_function_slot = by_function_slot1; alloc_mode = alloc_mode1 }, Closures { by_function_slot = by_function_slot2; alloc_mode = alloc_mode2 } ) -> @@ -404,7 +414,8 @@ and meet_head_of_kind_value env (head1 : TG.head_of_kind_value) contents alloc_mode, env_extension ) | ( ( Variant _ | Mutable_block _ | Boxed_float _ | Boxed_int32 _ - | Boxed_int64 _ | Boxed_nativeint _ | Closures _ | String _ | Array _ ), + | Boxed_vec128 _ | Boxed_int64 _ | Boxed_nativeint _ | Closures _ + | String _ | Array _ ), _ ) -> (* This assumes that all the different constructors are incompatible. This could break very hard for dubious uses of Obj. *) @@ -580,6 +591,10 @@ and meet_head_of_kind_naked_nativeint _env t1 t2 : _ Or_bottom.t = let<+ head = TG.Head_of_kind_naked_nativeint.inter t1 t2 in head, TEE.empty +and meet_head_of_kind_naked_vec128 _env t1 t2 : _ Or_bottom.t = + let<+ head = TG.Head_of_kind_naked_vec128.inter t1 t2 in + head, TEE.empty + and meet_head_of_kind_rec_info _env t1 _t2 : _ Or_bottom.t = (* CR-someday lmaurer: This could be doing things like discovering two depth variables are equal *) @@ -1128,6 +1143,9 @@ and join_expanded_head env kind (expanded1 : ET.t) (expanded2 : ET.t) : ET.t = | Naked_nativeint head1, Naked_nativeint head2 -> let>+ head = join_head_of_kind_naked_nativeint env head1 head2 in ET.create_naked_nativeint head + | Naked_vec128 head1, Naked_vec128 head2 -> + let>+ head = join_head_of_kind_naked_vec128 env head1 head2 in + ET.create_naked_vec128 head | Rec_info head1, Rec_info head2 -> let>+ head = join_head_of_kind_rec_info env head1 head2 in ET.create_rec_info head @@ -1135,7 +1153,8 @@ and join_expanded_head env kind (expanded1 : ET.t) (expanded2 : ET.t) : ET.t = let>+ head = join_head_of_kind_region env head1 head2 in ET.create_region head | ( ( Value _ | Naked_immediate _ | Naked_float _ | Naked_int32 _ - | Naked_int64 _ | Naked_nativeint _ | Rec_info _ | Region _ ), + | Naked_vec128 _ | Naked_int64 _ | Naked_nativeint _ | Rec_info _ + | Region _ ), _ ) -> assert false in @@ -1176,6 +1195,10 @@ and join_head_of_kind_value env (head1 : TG.head_of_kind_value) let>+ n = join env n1 n2 in let alloc_mode = join_alloc_mode alloc_mode1 alloc_mode2 in TG.Head_of_kind_value.create_boxed_nativeint n alloc_mode + | Boxed_vec128 (n1, alloc_mode1), Boxed_vec128 (n2, alloc_mode2) -> + let>+ n = join env n1 n2 in + let alloc_mode = join_alloc_mode alloc_mode1 alloc_mode2 in + TG.Head_of_kind_value.create_boxed_vec128 n alloc_mode | ( Closures { by_function_slot = by_function_slot1; alloc_mode = alloc_mode1 }, Closures { by_function_slot = by_function_slot2; alloc_mode = alloc_mode2 } ) -> @@ -1209,7 +1232,8 @@ and join_head_of_kind_value env (head1 : TG.head_of_kind_value) TG.Head_of_kind_value.create_array_with_contents ~element_kind ~length contents alloc_mode | ( ( Variant _ | Mutable_block _ | Boxed_float _ | Boxed_int32 _ - | Boxed_int64 _ | Boxed_nativeint _ | Closures _ | String _ | Array _ ), + | Boxed_vec128 _ | Boxed_int64 _ | Boxed_nativeint _ | Closures _ + | String _ | Array _ ), _ ) -> Unknown @@ -1315,6 +1339,9 @@ and join_head_of_kind_naked_int64 _env t1 t2 : _ Or_unknown.t = and join_head_of_kind_naked_nativeint _env t1 t2 : _ Or_unknown.t = Known (TG.Head_of_kind_naked_nativeint.union t1 t2) +and join_head_of_kind_naked_vec128 _env t1 t2 : _ Or_unknown.t = + Known (TG.Head_of_kind_naked_vec128.union t1 t2) + and join_head_of_kind_rec_info _env t1 t2 : _ Or_unknown.t = if Rec_info_expr.equal t1 t2 then Known t1 else Unknown diff --git a/middle_end/flambda2/types/provers.ml b/middle_end/flambda2/types/provers.ml index 570f142dc01..089649a75d1 100644 --- a/middle_end/flambda2/types/provers.ml +++ b/middle_end/flambda2/types/provers.ml @@ -96,12 +96,13 @@ let prove_is_int_generic env t : bool generic_proof = | Value (Ok ( Mutable_block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ - | Boxed_nativeint _ | Closures _ | String _ | Array _ )) -> + | Boxed_vec128 _ | Boxed_nativeint _ | Closures _ | String _ | Array _ + )) -> Proved false | Value Unknown -> Unknown | Value Bottom -> Invalid | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_nativeint _ | Naked_vec128 _ | Rec_info _ | Region _ -> wrong_kind "Value" t let prove_is_int env t = as_property (prove_is_int_generic env t) @@ -130,8 +131,9 @@ let prove_get_tag_generic env t : Tag.Set.t generic_proof = | Known tags -> if Tag.Set.is_empty tags then Invalid else Proved tags ))) | Value - (Ok (Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ | Boxed_nativeint _)) - -> + (Ok + ( Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ | Boxed_nativeint _ + | Boxed_vec128 _ )) -> Unknown | Value (Ok (Mutable_block _)) -> Unknown | Value (Ok (Closures _)) -> Unknown @@ -140,7 +142,7 @@ let prove_get_tag_generic env t : Tag.Set.t generic_proof = | Value Unknown -> Unknown | Value Bottom -> Invalid | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let prove_get_tag env t = as_property (prove_get_tag_generic env t) @@ -172,7 +174,7 @@ let prove_naked_immediates_generic env t : Targetint_31_63.Set.t generic_proof = | Naked_immediate Unknown -> Unknown | Naked_immediate Bottom -> Invalid | Value _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ | Naked_nativeint _ - | Rec_info _ | Region _ -> + | Naked_vec128 _ | Rec_info _ | Region _ -> wrong_kind "Naked_immediate" t let meet_naked_immediates env t = @@ -196,7 +198,7 @@ let prove_equals_tagged_immediates env t : _ proof_of_property = else Unknown) | Value (Ok _ | Unknown | Bottom) -> Unknown | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let meet_equals_tagged_immediates env t : _ meet_shortcut = @@ -208,12 +210,13 @@ let meet_equals_tagged_immediates env t : _ meet_shortcut = | Value (Ok ( Mutable_block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ - | Boxed_nativeint _ | Closures _ | String _ | Array _ )) -> + | Boxed_vec128 _ | Boxed_nativeint _ | Closures _ | String _ | Array _ + )) -> Invalid | Value Unknown -> Need_meet | Value Bottom | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> Invalid let meet_equals_single_tagged_immediate env t : _ meet_shortcut = @@ -230,6 +233,7 @@ type _ meet_naked_number_kind = | Int32 : Int32.Set.t meet_naked_number_kind | Int64 : Int64.Set.t meet_naked_number_kind | Nativeint : Targetint_32_64.Set.t meet_naked_number_kind + | Vec128 : Numeric_types.Vec128_by_bit_pattern.Set.t meet_naked_number_kind let[@inline] meet_naked_number (type a) (kind : a meet_naked_number_kind) env t : a meet_shortcut = @@ -249,6 +253,7 @@ let[@inline] meet_naked_number (type a) (kind : a meet_naked_number_kind) env t | Int32 -> "Naked_int32" | Int64 -> "Naked_int64" | Nativeint -> "Naked_nativeint" + | Vec128 -> "Naked_vec128" in wrong_kind kind_string t in @@ -286,6 +291,14 @@ let[@inline] meet_naked_number (type a) (kind : a meet_naked_number_kind) env t (is :> Targetint_32_64.Set.t)) ~is_empty:Targetint_32_64.Set.is_empty | _ -> wrong_kind ()) + | Naked_vec128 vs -> ( + match kind with + | Vec128 -> + head_to_proof vs + (fun (fs : TG.head_of_kind_naked_vec128) -> + (fs :> Numeric_types.Vec128_by_bit_pattern.Set.t)) + ~is_empty:Numeric_types.Vec128_by_bit_pattern.Set.is_empty + | _ -> wrong_kind ()) let meet_naked_floats = meet_naked_number Float @@ -295,6 +308,8 @@ let meet_naked_int64s = meet_naked_number Int64 let meet_naked_nativeints = meet_naked_number Nativeint +let meet_naked_vec128s = meet_naked_number Vec128 + type variant_like_proof = { const_ctors : Targetint_31_63.Set.t Or_unknown.t; non_const_ctors_with_sizes : Targetint_31_63.t Tag.Scannable.Map.t @@ -342,12 +357,12 @@ let prove_variant_like_generic env t : variant_like_proof generic_proof = | Value (Ok ( Closures _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ - | Boxed_nativeint _ | String _ )) -> + | Boxed_vec128 _ | Boxed_nativeint _ | String _ )) -> Invalid | Value Unknown -> Unknown | Value Bottom -> Invalid | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let meet_variant_like env t = @@ -380,10 +395,12 @@ let prove_is_a_boxed_or_tagged_number env t : Proved (Boxed (alloc_mode, Naked_int64, contents_ty)) | Value (Ok (Boxed_nativeint (contents_ty, alloc_mode))) -> Proved (Boxed (alloc_mode, Naked_nativeint, contents_ty)) + | Value (Ok (Boxed_vec128 (contents_ty, alloc_mode))) -> + Proved (Boxed (alloc_mode, Naked_vec128, contents_ty)) | Value (Bottom | Ok (Mutable_block _ | Closures _ | String _ | Array _)) -> Unknown | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let prove_is_a_tagged_immediate env t : _ proof_of_property = @@ -398,7 +415,7 @@ let prove_is_a_boxed_float env t : _ proof_of_property = | Value (Ok (Boxed_float _)) -> Proved () | Value _ -> Unknown | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let prove_is_or_is_not_a_boxed_float env t : _ proof_of_property = @@ -408,7 +425,7 @@ let prove_is_or_is_not_a_boxed_float env t : _ proof_of_property = | Value (Ok (Boxed_float _)) -> Proved true | Value (Ok _) -> Proved false | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let prove_is_a_boxed_int32 env t : _ proof_of_property = @@ -417,7 +434,7 @@ let prove_is_a_boxed_int32 env t : _ proof_of_property = | Value (Ok (Boxed_int32 _)) -> Proved () | Value _ -> Unknown | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let prove_is_a_boxed_int64 env t : _ proof_of_property = @@ -426,7 +443,7 @@ let prove_is_a_boxed_int64 env t : _ proof_of_property = | Value (Ok (Boxed_int64 _)) -> Proved () | Value _ -> Unknown | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let prove_is_a_boxed_nativeint env t : _ proof_of_property = @@ -435,7 +452,16 @@ let prove_is_a_boxed_nativeint env t : _ proof_of_property = | Value (Ok (Boxed_nativeint _)) -> Proved () | Value _ -> Unknown | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> + wrong_kind "Value" t + +let prove_is_a_boxed_vec128 env t : _ proof_of_property = + match expand_head env t with + | Value Unknown -> Unknown + | Value (Ok (Boxed_vec128 _)) -> Proved () + | Value _ -> Unknown + | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let prove_unique_tag_and_size0 env t : @@ -460,7 +486,7 @@ let prove_unique_tag_and_size0 env t : -> Unknown | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let prove_unique_tag_and_size env t : @@ -505,20 +531,21 @@ let meet_is_flat_float_array env t : bool meet_shortcut = | Value -> Known_result false | Naked_number Naked_float -> Known_result true | Naked_number - (Naked_immediate | Naked_int32 | Naked_int64 | Naked_nativeint) + ( Naked_immediate | Naked_int32 | Naked_int64 | Naked_nativeint + | Naked_vec128 ) | Region | Rec_info -> Misc.fatal_errorf "Wrong element kind for array: %a" K.With_subkind.print element_kind) | Value (Ok ( Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ | Boxed_nativeint _ - | Closures _ | String _ )) -> + | Boxed_vec128 _ | Closures _ | String _ )) -> Invalid | Value (Ok (Variant _ | Mutable_block _)) -> (* In case of untyped code using array primitives on regular blocks *) Need_meet | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> Misc.fatal_errorf "Kind error: expected [Value]:@ %a" TG.print t let prove_is_immediates_array env t : unit proof_of_property = @@ -533,16 +560,17 @@ let prove_is_immediates_array env t : unit proof_of_property = match K.With_subkind.subkind element_kind with | Tagged_immediate -> Proved () | Anything | Boxed_float | Boxed_int32 | Boxed_int64 | Boxed_nativeint - | Variant _ | Float_block _ | Float_array | Immediate_array | Value_array - | Generic_array -> + | Boxed_vec128 | Variant _ | Float_block _ | Float_array | Immediate_array + | Value_array | Generic_array -> Unknown) | Value (Ok ( Variant _ | Mutable_block _ | Boxed_float _ | Boxed_int32 _ - | Boxed_int64 _ | Boxed_nativeint _ | Closures _ | String _ )) -> + | Boxed_vec128 _ | Boxed_int64 _ | Boxed_nativeint _ | Closures _ + | String _ )) -> Unknown | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let prove_single_closures_entry_generic env t : _ generic_proof = @@ -566,12 +594,13 @@ let prove_single_closures_entry_generic env t : _ generic_proof = | Value (Ok ( Variant _ | Mutable_block _ | Boxed_float _ | Boxed_int32 _ - | Boxed_int64 _ | Boxed_nativeint _ | String _ | Array _ )) -> + | Boxed_vec128 _ | Boxed_int64 _ | Boxed_nativeint _ | String _ + | Array _ )) -> Invalid | Value Unknown -> Unknown | Value Bottom -> Invalid | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let meet_single_closures_entry env t = @@ -588,7 +617,7 @@ let meet_is_immutable_array env t : _ meet_shortcut = | Unknown -> Need_meet) | Value (Ok _) | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> Invalid let prove_single_closures_entry env t = @@ -601,7 +630,7 @@ let meet_strings env t : String_info.Set.t meet_shortcut = | Value Unknown -> Need_meet | Value Bottom -> Invalid | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> Misc.fatal_errorf "Kind error: expected [Value]:@ %a" TG.print t let prove_strings env t : _ proof_of_property = @@ -612,7 +641,7 @@ let prove_strings env t : _ proof_of_property = Proved (Alloc_mode.For_types.heap, strs) | Value (Ok _ | Unknown | Bottom) -> Unknown | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> Misc.fatal_errorf "Kind error: expected [Value]:@ %a" TG.print t type tagging_proof_kind = @@ -655,7 +684,7 @@ let[@inline always] inspect_tagging_of_simple proof_kind env ~min_name_mode t : | Meet, _ -> inspect_immediates ()) | Value _ -> Unknown | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let prove_tagging_of_simple env ~min_name_mode t = @@ -679,7 +708,7 @@ let[@inline always] meet_boxed_number_containing_simple | Value Unknown -> Need_meet | Value Bottom -> Invalid | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> Misc.fatal_errorf "Kind error: expected [Value]:@ %a" TG.print t let meet_boxed_float_containing_simple = @@ -688,7 +717,7 @@ let meet_boxed_float_containing_simple = match ty_value with | Boxed_float (ty, _) -> Some ty | Variant _ | Mutable_block _ | Boxed_int32 _ | Boxed_int64 _ - | Boxed_nativeint _ | Closures _ | String _ | Array _ -> + | Boxed_vec128 _ | Boxed_nativeint _ | Closures _ | String _ | Array _ -> None) let meet_boxed_int32_containing_simple = @@ -697,7 +726,7 @@ let meet_boxed_int32_containing_simple = match ty_value with | Boxed_int32 (ty, _) -> Some ty | Variant _ | Mutable_block _ | Boxed_float _ | Boxed_int64 _ - | Boxed_nativeint _ | Closures _ | String _ | Array _ -> + | Boxed_vec128 _ | Boxed_nativeint _ | Closures _ | String _ | Array _ -> None) let meet_boxed_int64_containing_simple = @@ -706,7 +735,7 @@ let meet_boxed_int64_containing_simple = match ty_value with | Boxed_int64 (ty, _) -> Some ty | Variant _ | Mutable_block _ | Boxed_float _ | Boxed_int32 _ - | Boxed_nativeint _ | Closures _ | String _ | Array _ -> + | Boxed_vec128 _ | Boxed_nativeint _ | Closures _ | String _ | Array _ -> None) let meet_boxed_nativeint_containing_simple = @@ -715,7 +744,16 @@ let meet_boxed_nativeint_containing_simple = match ty_value with | Boxed_nativeint (ty, _) -> Some ty | Variant _ | Mutable_block _ | Boxed_float _ | Boxed_int32 _ - | Boxed_int64 _ | Closures _ | String _ | Array _ -> + | Boxed_vec128 _ | Boxed_int64 _ | Closures _ | String _ | Array _ -> + None) + +let meet_boxed_vec128_containing_simple = + meet_boxed_number_containing_simple + ~contents_of_boxed_number:(fun (ty_value : TG.head_of_kind_value) -> + match ty_value with + | Boxed_vec128 (ty, _) -> Some ty + | Variant _ | Mutable_block _ | Boxed_float _ | Boxed_int32 _ + | Boxed_nativeint _ | Boxed_int64 _ | Closures _ | String _ | Array _ -> None) let meet_block_field_simple env ~min_name_mode ~field_kind t field_index : @@ -751,7 +789,7 @@ let meet_block_field_simple env ~min_name_mode ~field_kind t field_index : | Value Unknown -> Need_meet | Value Bottom -> Invalid | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let meet_project_function_slot_simple env ~min_name_mode t function_slot : @@ -773,7 +811,7 @@ let meet_project_function_slot_simple env ~min_name_mode t function_slot : | Value Unknown -> Need_meet | Value Bottom -> Invalid | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let meet_project_value_slot_simple env ~min_name_mode t value_slot : @@ -800,7 +838,7 @@ let meet_project_value_slot_simple env ~min_name_mode t value_slot : | Value Unknown -> Need_meet | Value Bottom -> Invalid | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let meet_rec_info env t : Rec_info_expr.t meet_shortcut = @@ -809,7 +847,7 @@ let meet_rec_info env t : Rec_info_expr.t meet_shortcut = | Rec_info Unknown -> Need_meet | Rec_info Bottom -> Invalid | Value _ | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Region _ -> wrong_kind "Rec_info" t let prove_alloc_mode_of_boxed_number env t : @@ -818,13 +856,14 @@ let prove_alloc_mode_of_boxed_number env t : | Value (Ok (Boxed_float (_, alloc_mode))) | Value (Ok (Boxed_int32 (_, alloc_mode))) | Value (Ok (Boxed_int64 (_, alloc_mode))) - | Value (Ok (Boxed_nativeint (_, alloc_mode))) -> + | Value (Ok (Boxed_nativeint (_, alloc_mode))) + | Value (Ok (Boxed_vec128 (_, alloc_mode))) -> Proved alloc_mode | Value (Ok (Variant _ | Mutable_block _ | String _ | Array _ | Closures _)) | Value (Unknown | Bottom) -> Unknown | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> wrong_kind "Value" t let never_holds_locally_allocated_values env var : _ proof_of_property = @@ -846,6 +885,7 @@ let never_holds_locally_allocated_values env var : _ proof_of_property = | Value (Ok (Boxed_int32 (_, alloc_mode))) | Value (Ok (Boxed_int64 (_, alloc_mode))) | Value (Ok (Boxed_nativeint (_, alloc_mode))) + | Value (Ok (Boxed_vec128 (_, alloc_mode))) | Value (Ok (Mutable_block { alloc_mode })) | Value (Ok (Closures { alloc_mode; _ })) | Value (Ok (Array { alloc_mode; _ })) -> ( @@ -856,7 +896,7 @@ let never_holds_locally_allocated_values env var : _ proof_of_property = | Value Unknown -> Unknown | Value Bottom -> Unknown | Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ -> Proved ()) let prove_physical_equality env t1 t2 = @@ -879,12 +919,12 @@ let prove_physical_equality env t1 t2 = let check_heads () : _ proof_of_property = match expand_head env t1, expand_head env t2 with | ( ( Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ ), + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ ), _ ) -> wrong_kind "Value" t1 | ( _, ( Naked_immediate _ | Naked_float _ | Naked_int32 _ | Naked_int64 _ - | Naked_nativeint _ | Rec_info _ | Region _ ) ) -> + | Naked_vec128 _ | Naked_nativeint _ | Rec_info _ | Region _ ) ) -> wrong_kind "Value" t2 | Value (Unknown | Bottom), _ | _, Value (Unknown | Bottom) -> Unknown | Value (Ok head1), Value (Ok head2) -> ( @@ -901,6 +941,8 @@ let prove_physical_equality env t1 t2 = if incompatible_naked_numbers t1 t2 then Proved false else Unknown | Boxed_nativeint (t1, _), Boxed_nativeint (t2, _) -> if incompatible_naked_numbers t1 t2 then Proved false else Unknown + | Boxed_vec128 (t1, _), Boxed_vec128 (t2, _) -> + if incompatible_naked_numbers t1 t2 then Proved false else Unknown | Closures _, Closures _ -> Unknown | String s1, String s2 -> let module SS = String_info.Set in @@ -908,9 +950,11 @@ let prove_physical_equality env t1 t2 = (* Immediates and allocated values -> Proved false *) | ( Variant { immediates = _; blocks = Known blocks; is_unique = _ }, ( Mutable_block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ - | Boxed_nativeint _ | Closures _ | String _ | Array _ ) ) + | Boxed_vec128 _ | Boxed_nativeint _ | Closures _ | String _ | Array _ + ) ) | ( ( Mutable_block _ | Boxed_float _ | Boxed_int32 _ | Boxed_int64 _ - | Boxed_nativeint _ | Closures _ | String _ | Array _ ), + | Boxed_vec128 _ | Boxed_nativeint _ | Closures _ | String _ | Array _ + ), Variant { immediates = _; blocks = Known blocks; is_unique = _ } ) when TG.Row_like_for_blocks.is_bottom blocks -> Proved false @@ -997,22 +1041,30 @@ let prove_physical_equality env t1 t2 = (* Boxed numbers with non-numbers or different kinds -> Proved *) | ( Boxed_float _, ( Variant _ | Mutable_block _ | Boxed_int32 _ | Boxed_int64 _ - | Boxed_nativeint _ | Closures _ | String _ | Array _ ) ) + | Boxed_vec128 _ | Boxed_nativeint _ | Closures _ | String _ | Array _ + ) ) | ( ( Variant _ | Mutable_block _ | Boxed_int32 _ | Boxed_int64 _ - | Boxed_nativeint _ | Closures _ | String _ | Array _ ), + | Boxed_vec128 _ | Boxed_nativeint _ | Closures _ | String _ | Array _ + ), Boxed_float _ ) | ( Boxed_int32 _, ( Variant _ | Mutable_block _ | Boxed_int64 _ | Boxed_nativeint _ - | Closures _ | String _ | Array _ ) ) + | Boxed_vec128 _ | Closures _ | String _ | Array _ ) ) | ( ( Variant _ | Mutable_block _ | Boxed_int64 _ | Boxed_nativeint _ - | Closures _ | String _ | Array _ ), + | Boxed_vec128 _ | Closures _ | String _ | Array _ ), Boxed_int32 _ ) | ( Boxed_int64 _, + ( Variant _ | Mutable_block _ | Boxed_nativeint _ | Closures _ + | Boxed_vec128 _ | String _ | Array _ ) ) + | ( ( Variant _ | Mutable_block _ | Boxed_nativeint _ | Closures _ + | Boxed_vec128 _ | String _ | Array _ ), + Boxed_int64 _ ) + | ( Boxed_vec128 _, ( Variant _ | Mutable_block _ | Boxed_nativeint _ | Closures _ | String _ | Array _ ) ) | ( ( Variant _ | Mutable_block _ | Boxed_nativeint _ | Closures _ | String _ | Array _ ), - Boxed_int64 _ ) + Boxed_vec128 _ ) | ( Boxed_nativeint _, (Variant _ | Mutable_block _ | Closures _ | String _ | Array _) ) | ( (Variant _ | Mutable_block _ | Closures _ | String _ | Array _), diff --git a/middle_end/flambda2/types/provers.mli b/middle_end/flambda2/types/provers.mli index 1525fdc0302..66e843fbe14 100644 --- a/middle_end/flambda2/types/provers.mli +++ b/middle_end/flambda2/types/provers.mli @@ -62,6 +62,11 @@ val meet_naked_int64s : val meet_naked_nativeints : Typing_env.t -> Type_grammar.t -> Targetint_32_64.Set.t meet_shortcut +val meet_naked_vec128s : + Typing_env.t -> + Type_grammar.t -> + Numeric_types.Vec128_by_bit_pattern.Set.t meet_shortcut + type variant_like_proof = private { const_ctors : Targetint_31_63.Set.t Or_unknown.t; non_const_ctors_with_sizes : Targetint_31_63.t Tag.Scannable.Map.t @@ -96,6 +101,9 @@ val prove_is_a_boxed_int64 : val prove_is_a_boxed_nativeint : Typing_env.t -> Type_grammar.t -> unit proof_of_property +val prove_is_a_boxed_vec128 : + Typing_env.t -> Type_grammar.t -> unit proof_of_property + val prove_is_or_is_not_a_boxed_float : Typing_env.t -> Type_grammar.t -> bool proof_of_property @@ -190,6 +198,12 @@ val meet_boxed_nativeint_containing_simple : Type_grammar.t -> Simple.t meet_shortcut +val meet_boxed_vec128_containing_simple : + Typing_env.t -> + min_name_mode:Name_mode.t -> + Type_grammar.t -> + Simple.t meet_shortcut + val meet_block_field_simple : Typing_env.t -> min_name_mode:Name_mode.t -> diff --git a/middle_end/flambda2/types/reify.ml b/middle_end/flambda2/types/reify.ml index 40f14314581..f9ca741ffbc 100644 --- a/middle_end/flambda2/types/reify.ml +++ b/middle_end/flambda2/types/reify.ml @@ -30,6 +30,7 @@ type to_lift = | Boxed_int32 of Int32.t | Boxed_int64 of Int64.t | Boxed_nativeint of Targetint_32_64.t + | Boxed_vec128 of Numeric_types.Vec128_by_bit_pattern.t | Immutable_float_array of { fields : Float.t list } | Immutable_value_array of { fields : Simple.t list } | Empty_array @@ -58,7 +59,7 @@ let try_to_reify_fields env ~var_allowed alloc_mode ~field_types = match Reg_width_const.descr const with | Tagged_immediate _imm -> Some simple | Naked_immediate _ | Naked_float _ | Naked_int32 _ - | Naked_int64 _ | Naked_nativeint _ -> + | Naked_vec128 _ | Naked_int64 _ | Naked_nativeint _ -> (* This should never happen, as we should have got a kind error instead *) None) @@ -315,6 +316,13 @@ let reify ~allowed_if_free_vars_defined_in ~var_is_defined_at_toplevel match Targetint_32_64.Set.get_singleton (ns :> Targetint_32_64.Set.t) with | None -> try_canonical_simple () | Some n -> Simple (Simple.const (Reg_width_const.naked_nativeint n))) + | Naked_vec128 (Ok ns) -> ( + match + Numeric_types.Vec128_by_bit_pattern.Set.get_singleton + (ns :> Numeric_types.Vec128_by_bit_pattern.Set.t) + with + | None -> try_canonical_simple () + | Some n -> Simple (Simple.const (Reg_width_const.naked_vec128 n))) (* CR-someday mshinwell: These could lift at toplevel when [ty_naked_float] is an alias type. That would require checking the alloc mode. *) | Value (Ok (Boxed_float (ty_naked_float, _alloc_mode))) -> ( @@ -353,6 +361,14 @@ let reify ~allowed_if_free_vars_defined_in ~var_is_defined_at_toplevel match Targetint_32_64.Set.get_singleton ns with | None -> try_canonical_simple () | Some n -> Lift (Boxed_nativeint n))) + | Value (Ok (Boxed_vec128 (ty_naked_vec128, _alloc_mode))) -> ( + match Provers.meet_naked_vec128s env ty_naked_vec128 with + | Need_meet -> try_canonical_simple () + | Invalid -> Invalid + | Known_result ns -> ( + match Numeric_types.Vec128_by_bit_pattern.Set.get_singleton ns with + | None -> try_canonical_simple () + | Some n -> Lift (Boxed_vec128 n))) | Value (Ok (Array @@ -417,7 +433,8 @@ let reify ~allowed_if_free_vars_defined_in ~var_is_defined_at_toplevel | Ok fields_rev -> Lift (Immutable_float_array { fields = List.rev fields_rev })) | Naked_number - (Naked_immediate | Naked_int32 | Naked_int64 | Naked_nativeint) + ( Naked_immediate | Naked_int32 | Naked_int64 | Naked_nativeint + | Naked_vec128 ) | Region | Rec_info -> Misc.fatal_errorf "Unexpected kind %a in immutable array case when reifying type:@ \ @@ -429,6 +446,7 @@ let reify ~allowed_if_free_vars_defined_in ~var_is_defined_at_toplevel | Naked_int32 Bottom | Naked_int64 Bottom | Naked_nativeint Bottom + | Naked_vec128 Bottom | Rec_info Bottom | Region Bottom -> Invalid @@ -438,6 +456,7 @@ let reify ~allowed_if_free_vars_defined_in ~var_is_defined_at_toplevel | Naked_float Unknown | Naked_int32 Unknown | Naked_int64 Unknown + | Naked_vec128 Unknown | Naked_nativeint Unknown | Rec_info Unknown | Region (Unknown | Ok _) diff --git a/middle_end/flambda2/types/reify.mli b/middle_end/flambda2/types/reify.mli index 98281f3c23a..708285d0a45 100644 --- a/middle_end/flambda2/types/reify.mli +++ b/middle_end/flambda2/types/reify.mli @@ -27,6 +27,7 @@ type to_lift = private | Boxed_int32 of Numeric_types.Int32.t | Boxed_int64 of Numeric_types.Int64.t | Boxed_nativeint of Targetint_32_64.t + | Boxed_vec128 of Numeric_types.Vec128_by_bit_pattern.t | Immutable_float_array of { fields : Numeric_types.Float_by_bit_pattern.t list } | Immutable_value_array of { fields : Simple.t list } diff --git a/middle_end/printclambda.ml b/middle_end/printclambda.ml index af351ac9d8b..8232fddf399 100644 --- a/middle_end/printclambda.ml +++ b/middle_end/printclambda.ml @@ -67,6 +67,7 @@ let rec structured_constant ppf = function | Uconst_int32 x -> fprintf ppf "%ldl" x | Uconst_int64 x -> fprintf ppf "%LdL" x | Uconst_nativeint x -> fprintf ppf "%ndn" x + | Uconst_vec128 (v0, v1) -> fprintf ppf "%Ld:%Ld" v0 v1 | Uconst_block (tag, l) -> fprintf ppf "block(%i" tag; List.iter (fun u -> fprintf ppf ",%a" uconstant u) l; From 7ea2fee416baed15ca2c46f7bd78a4c02b589ca0 Mon Sep 17 00:00:00 2001 From: Max Slater Date: Tue, 13 Jun 2023 18:00:10 -0400 Subject: [PATCH 05/81] more errors on arm --- backend/arm64/emit.mlp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/backend/arm64/emit.mlp b/backend/arm64/emit.mlp index ce3a09ef683..097cfc850de 100644 --- a/backend/arm64/emit.mlp +++ b/backend/arm64/emit.mlp @@ -495,6 +495,9 @@ module BR = Branch_relaxation.Make (struct num_instructions_for_intconst n | Lop (Iconst_float _) -> 2 | Lop (Iconst_symbol _) -> 2 + | Lop (Iconst_vec128 _) -> + (* CR mslater: (SIMD) arm64 *) + Misc.fatal_error "128-bit vectors are not supported on this architecture" | Lop (Iintop_atomic _) -> (* Never generated; builtins are not yet translated to atomics *) assert false @@ -764,6 +767,9 @@ let emit_instr i = let lbl = float_literal f in emit_load_literal i.res.(0) lbl end + | Lop(Iconst_vec128 _) -> + (* CR mslater: (SIMD) arm64 *) + Misc.fatal_error "128-bit vectors are not supported on this architecture" | Lop(Iconst_symbol s) -> emit_load_symbol_addr i.res.(0) s.sym_name | Lop(Icall_ind) -> @@ -1184,6 +1190,9 @@ let emit_item = function | Cint n -> ` .quad {emit_nativeint n}\n` | Csingle f -> emit_float32_directive ".long" (Int32.bits_of_float f) | Cdouble f -> emit_float64_directive ".quad" (Int64.bits_of_float f) + | Cvec128 _ -> + (* CR mslater: (SIMD) arm64 *) + Misc.fatal_error "128-bit vectors not supported on this architecture" | Csymbol_address s -> ` .quad {emit_symbol s.sym_name}\n` | Cstring s -> emit_string_directive " .ascii " s | Cskip n -> if n > 0 then ` .space {emit_int n}\n` From 1ac5460493d228af8b58af88c4114a4cf347b59c Mon Sep 17 00:00:00 2001 From: Max Slater Date: Wed, 14 Jun 2023 14:50:20 -0400 Subject: [PATCH 06/81] rebase --- backend/amd64/arch.ml | 2 ++ backend/amd64/emit.mlp | 9 ++++++--- backend/arm64/arch.ml | 2 ++ backend/asm_targets/asm_directives_intf.ml | 1 + backend/cmm_helpers.ml | 4 ++-- backend/cmm_helpers.mli | 2 -- backend/cmmgen.ml | 2 +- backend/reg.ml | 2 +- backend/selectgen.ml | 10 ++++++++-- ocaml/testsuite/tests/typing-unboxed/test.ml | 4 ++-- ocaml/typing/predef.ml | 2 +- ocaml/typing/typedecl.ml | 4 +++- 12 files changed, 29 insertions(+), 15 deletions(-) diff --git a/backend/amd64/arch.ml b/backend/amd64/arch.ml index 3dcecff2b11..171e76652d3 100644 --- a/backend/amd64/arch.ml +++ b/backend/amd64/arch.ml @@ -130,6 +130,8 @@ let size_addr = 8 let size_int = 8 let size_float = 8 +let size_vec128 = 16 + let allow_unaligned_access = true (* Behavior of division *) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 68df2cfa3d1..a37db7f61d3 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -274,6 +274,7 @@ let emit_Llabel fallthrough lbl section_name = let x86_data_type_for_stack_slot = function | Float -> REAL8 + | Vec128 -> VEC128 | _ -> QWORD let reg = function @@ -473,7 +474,7 @@ let build_asm_directives () : (module Asm_targets.Asm_directives_intf.S) = ( include X86_dsl.D type data_type = - | NONE | DWORD | QWORD + | NONE | DWORD | QWORD | VEC128 type nonrec constant = constant let const_int64 num = Const num @@ -487,7 +488,8 @@ let build_asm_directives () : (module Asm_targets.Asm_directives_intf.S) = ( (function | NONE -> X86_ast.NONE | DWORD -> X86_ast.DWORD - | QWORD -> X86_ast.QWORD) + | QWORD -> X86_ast.QWORD + | VEC128 -> X86_ast.VEC128) data_type in label ?typ str @@ -694,7 +696,8 @@ let move (src : Reg.t) (dst : Reg.t) = | Float, Reg.Reg _, Float, Reg.Reg _ | Vec128, Reg.Reg _, Vec128, Reg.Reg _ -> I.movapd (reg src) (reg dst) (* CR mslater: (SIMD) alignment *) - | Vec128, _, Vec128, _ -> I.movupd (reg src) (reg dst) + | Vec128, _, Vec128, _ -> + I.movupd (reg src) (reg dst) | Float, _, Float, _ -> I.movsd (reg src) (reg dst) | Float, _, Int, _ | Int, _, Float, _ -> I.movq (reg src) (reg dst) diff --git a/backend/arm64/arch.ml b/backend/arm64/arch.ml index f61ed7fa36f..a01706c51dd 100644 --- a/backend/arm64/arch.ml +++ b/backend/arm64/arch.ml @@ -75,6 +75,8 @@ let size_addr = 8 let size_int = 8 let size_float = 8 +let size_vec128 = 16 + let allow_unaligned_access = false (* Behavior of division *) diff --git a/backend/asm_targets/asm_directives_intf.ml b/backend/asm_targets/asm_directives_intf.ml index 8a5ec8345c1..46be8c4cb73 100644 --- a/backend/asm_targets/asm_directives_intf.ml +++ b/backend/asm_targets/asm_directives_intf.ml @@ -46,6 +46,7 @@ module type Arg = sig | NONE | DWORD | QWORD + | VEC128 val file : file_num:int -> file_name:string -> unit diff --git a/backend/cmm_helpers.ml b/backend/cmm_helpers.ml index a5512c270f0..31ae012445b 100644 --- a/backend/cmm_helpers.ml +++ b/backend/cmm_helpers.ml @@ -81,10 +81,10 @@ let float_header = block_header Obj.double_tag (size_float / size_addr) let float_local_header = local_block_header Obj.double_tag (size_float / size_addr) -let boxedvec128_header = block_header Obj.custom_tag (1 + (16 / size_addr)) +let boxedvec128_header = block_header Obj.abstract_tag (16 / size_addr) let boxedvec128_local_header = - local_block_header Obj.custom_tag (1 + (16 / size_addr)) + local_block_header Obj.abstract_tag (16 / size_addr) let floatarray_header len = (* Zero-sized float arrays have tag zero for consistency with diff --git a/backend/cmm_helpers.mli b/backend/cmm_helpers.mli index fbf9f85d2a6..74eb750f195 100644 --- a/backend/cmm_helpers.mli +++ b/backend/cmm_helpers.mli @@ -221,8 +221,6 @@ val box_vector : val unbox_vector : Debuginfo.t -> Primitive.boxed_vector -> expression -> expression -(* CR mslater: (SIMD) unbox vector *) - (** Complex number creation and access *) val box_complex : Debuginfo.t -> expression -> expression -> expression diff --git a/backend/cmmgen.ml b/backend/cmmgen.ml index a4d58f84007..709238a8cae 100644 --- a/backend/cmmgen.ml +++ b/backend/cmmgen.ml @@ -956,7 +956,7 @@ and transl_ccall env prim args dbg = | _, Unboxed_integer Pint64 when size_int = 4 -> ([|Int; Int|], box_int dbg Pint64 alloc_heap) | _, Unboxed_integer bi -> (typ_int, box_int dbg bi alloc_heap) - | _, Unboxed_vector vi -> (typ_int, box_vector dbg vi alloc_heap) + | _, Unboxed_vector Pvec128 -> (typ_vec128, box_vector dbg Pvec128 alloc_heap) | _, Untagged_int -> (typ_int, (fun i -> tag_int i dbg)) in let typ_args, args = transl_args prim.prim_native_repr_args args in diff --git a/backend/reg.ml b/backend/reg.ml index 0f1bcd0a404..4f030da9b78 100644 --- a/backend/reg.ml +++ b/backend/reg.ml @@ -196,7 +196,7 @@ let is_reg t = let size_of_contents_in_bytes t = match t.typ with - | Vec128 -> 16 + | Vec128 -> Arch.size_vec128 | Float -> Arch.size_float | Addr -> assert (Arch.size_addr = Arch.size_int); diff --git a/backend/selectgen.ml b/backend/selectgen.ml index 3cc87b70b2a..96356ff9c84 100644 --- a/backend/selectgen.ml +++ b/backend/selectgen.ml @@ -199,6 +199,7 @@ let oper_result_type = function begin match c with | Word_val -> typ_val | Single | Double -> typ_float + | Onetwentyeight -> typ_vec128 | _ -> typ_int end | Calloc _ -> typ_val @@ -236,7 +237,7 @@ let size_component = function | Val | Addr -> Arch.size_addr | Int -> Arch.size_int | Float -> Arch.size_float - | Vec128 -> 16 + | Vec128 -> Arch.size_vec128 let size_machtype mty = let size = ref 0 in @@ -251,6 +252,7 @@ let size_expr (env:environment) exp = | Cconst_symbol _ -> Arch.size_addr | Cconst_float _ -> Arch.size_float + | Cconst_vec128 _ -> Arch.size_vec128 | Cvar id -> begin try V.Map.find id localenv @@ -1377,7 +1379,11 @@ method emit_stores env data regs_addr = Istore(_, _, _) -> for i = 0 to Array.length regs - 1 do let r = regs.(i) in - let kind = if r.typ = Float then Double else Word_val in + let kind = match r.typ with + | Float -> Double + | Vec128 -> Onetwentyeight + | _ -> Word_val + in self#insert env (Iop(Istore(kind, !a, false))) (Array.append [|r|] regs_addr) [||]; diff --git a/ocaml/testsuite/tests/typing-unboxed/test.ml b/ocaml/testsuite/tests/typing-unboxed/test.ml index 6841b4957d5..7f8ad66716c 100644 --- a/ocaml/testsuite/tests/typing-unboxed/test.ml +++ b/ocaml/testsuite/tests/typing-unboxed/test.ml @@ -635,7 +635,7 @@ Line 1, characters 14-17: 1 | external h : (int [@unboxed]) -> float = "h" "h_nat";; ^^^ Error: Don't know how to unbox this type. - Only float, int32, int64 and nativeint can be unboxed. + Only float, int32, int64, nativeint, and vec128 can be unboxed. |}] (* Bad: unboxing the function type *) @@ -645,7 +645,7 @@ Line 1, characters 13-25: 1 | external i : int -> float [@unboxed] = "i" "i_nat";; ^^^^^^^^^^^^ Error: Don't know how to unbox this type. - Only float, int32, int64 and nativeint can be unboxed. + Only float, int32, int64, nativeint, and vec128 can be unboxed. |}] (* Bad: unboxing a "deep" sub-type. *) diff --git a/ocaml/typing/predef.ml b/ocaml/typing/predef.ml index 50d1da7a73d..a578cb921cd 100644 --- a/ocaml/typing/predef.ml +++ b/ocaml/typing/predef.ml @@ -239,7 +239,6 @@ let common_initial_env add_type add_extension empty_env = |> add_type ident_int ~layout:(Layout.immediate ~why:(Primitive ident_int)) |> add_type ident_int32 |> add_type ident_int64 - |> add_type ident_vec128 |> add_type1 ident_lazy_t ~variance:Variance.covariant ~separability:Separability.Ind @@ -265,6 +264,7 @@ let common_initial_env add_type add_extension empty_env = |> add_type ident_unit ~kind:(variant [cstr ident_void []] [| [| |] |]) ~layout:(Layout.immediate ~why:Enumeration) + |> add_type ident_vec128 (* Predefined exceptions - alphabetical order *) |> add_extension ident_assert_failure [newgenty (Ttuple[type_string; type_int; type_int])] diff --git a/ocaml/typing/typedecl.ml b/ocaml/typing/typedecl.ml index 48a5ad061c2..acf2f7ca6bc 100644 --- a/ocaml/typing/typedecl.ml +++ b/ocaml/typing/typedecl.ml @@ -1862,6 +1862,8 @@ let native_repr_of_type env kind ty = Some (Unboxed_integer Pint64) | Unboxed, Tconstr (path, _, _) when Path.same path Predef.path_nativeint -> Some (Unboxed_integer Pnativeint) + | Unboxed, Tconstr (path, _, _) when Path.same path Predef.path_vec128 -> + Some (Unboxed_vector Pvec128) | _ -> None @@ -2502,7 +2504,7 @@ let report_error ppf = function fprintf ppf "Too many [@@unboxed]/[@@untagged] attributes" | Cannot_unbox_or_untag_type Unboxed -> fprintf ppf "@[Don't know how to unbox this type.@ \ - Only float, int32, int64 and nativeint can be unboxed.@]" + Only float, int32, int64, nativeint, and vec128 can be unboxed.@]" | Cannot_unbox_or_untag_type Untagged -> fprintf ppf "@[Don't know how to untag this type.@ \ Only int can be untagged.@]" From ba828685c95ed57333dfc6e5b0e4c9caad4c2178 Mon Sep 17 00:00:00 2001 From: Max Slater Date: Wed, 14 Jun 2023 16:39:59 -0400 Subject: [PATCH 07/81] copy middle end changes to ocaml/ --- ocaml/middle_end/clambda.ml | 5 +++++ ocaml/middle_end/clambda.mli | 1 + ocaml/middle_end/clambda_primitives.ml | 4 ++++ ocaml/middle_end/clambda_primitives.mli | 4 ++++ ocaml/middle_end/closure/closure.ml | 3 ++- ocaml/middle_end/flambda/closure_offsets.ml | 1 + ocaml/middle_end/flambda/flambda_to_clambda.ml | 1 + ocaml/middle_end/printclambda.ml | 2 ++ 8 files changed, 20 insertions(+), 1 deletion(-) diff --git a/ocaml/middle_end/clambda.ml b/ocaml/middle_end/clambda.ml index 39ddb424930..e5c9b7091b0 100644 --- a/ocaml/middle_end/clambda.ml +++ b/ocaml/middle_end/clambda.ml @@ -32,6 +32,7 @@ type ustructured_constant = | Uconst_int32 of int32 | Uconst_int64 of int64 | Uconst_nativeint of nativeint + | Uconst_vec128 of int64 * int64 | Uconst_block of int * uconstant list | Uconst_float_array of float list | Uconst_string of string @@ -211,6 +212,7 @@ let rank_structured_constant = function | Uconst_float_array _ -> 5 | Uconst_string _ -> 6 | Uconst_closure _ -> 7 + | Uconst_vec128 _ -> 8 let compare_structured_constants c1 c2 = match c1, c2 with @@ -226,6 +228,9 @@ let compare_structured_constants c1 c2 = | Uconst_string s1, Uconst_string s2 -> String.compare s1 s2 | Uconst_closure (_,lbl1,_), Uconst_closure (_,lbl2,_) -> String.compare lbl1 lbl2 + | Uconst_vec128 (l0, l1), Uconst_vec128 (r0, r1) -> + let cmp = Int64.compare l0 r0 in + if cmp = 0 then Int64.compare l1 r1 else cmp | _, _ -> (* no overflow possible here *) rank_structured_constant c1 - rank_structured_constant c2 diff --git a/ocaml/middle_end/clambda.mli b/ocaml/middle_end/clambda.mli index ed7254d40da..84f50236b9e 100644 --- a/ocaml/middle_end/clambda.mli +++ b/ocaml/middle_end/clambda.mli @@ -32,6 +32,7 @@ type ustructured_constant = | Uconst_int32 of int32 | Uconst_int64 of int64 | Uconst_nativeint of nativeint + | Uconst_vec128 of int64 * int64 | Uconst_block of int * uconstant list | Uconst_float_array of float list | Uconst_string of string diff --git a/ocaml/middle_end/clambda_primitives.ml b/ocaml/middle_end/clambda_primitives.ml index 92725a7a771..6dd081c973e 100644 --- a/ocaml/middle_end/clambda_primitives.ml +++ b/ocaml/middle_end/clambda_primitives.ml @@ -164,12 +164,16 @@ and layout = Lambda.layout = | Pvalue of value_kind | Punboxed_float | Punboxed_int of boxed_integer + | Punboxed_vector of boxed_vector | Pbottom and block_shape = Lambda.block_shape and boxed_integer = Primitive.boxed_integer = Pnativeint | Pint32 | Pint64 +and boxed_vector = Primitive.boxed_vector = + | Pvec128 + and bigarray_kind = Lambda.bigarray_kind = Pbigarray_unknown | Pbigarray_float32 | Pbigarray_float64 diff --git a/ocaml/middle_end/clambda_primitives.mli b/ocaml/middle_end/clambda_primitives.mli index b65e674ee76..0f2fe8f7535 100644 --- a/ocaml/middle_end/clambda_primitives.mli +++ b/ocaml/middle_end/clambda_primitives.mli @@ -167,12 +167,16 @@ and layout = Lambda.layout = | Pvalue of value_kind | Punboxed_float | Punboxed_int of boxed_integer + | Punboxed_vector of boxed_vector | Pbottom and block_shape = Lambda.block_shape and boxed_integer = Primitive.boxed_integer = Pnativeint | Pint32 | Pint64 +and boxed_vector = Primitive.boxed_vector = + | Pvec128 + and bigarray_kind = Lambda.bigarray_kind = Pbigarray_unknown | Pbigarray_float32 | Pbigarray_float64 diff --git a/ocaml/middle_end/closure/closure.ml b/ocaml/middle_end/closure/closure.ml index fd9b3615375..c3f3e413a4d 100644 --- a/ocaml/middle_end/closure/closure.ml +++ b/ocaml/middle_end/closure/closure.ml @@ -63,6 +63,7 @@ let is_gc_ignorable kind = | Pbottom -> Misc.fatal_error "[Pbottom] should not be stored in a closure." | Punboxed_float -> true | Punboxed_int _ -> true + | Punboxed_vector _ -> true | Pvalue Pintval -> true | Pvalue (Pgenval | Pfloatval | Pboxedintval _ | Pvariant _ | Parrayval _) -> false @@ -1747,7 +1748,7 @@ let collect_exported_structured_constants a = and structured_constant = function | Uconst_block (_, ul) -> List.iter const ul | Uconst_float _ | Uconst_int32 _ - | Uconst_int64 _ | Uconst_nativeint _ + | Uconst_int64 _ | Uconst_nativeint _ | Uconst_vec128 _ | Uconst_float_array _ | Uconst_string _ -> () | Uconst_closure _ -> assert false (* Cannot be generated *) and ulam = function diff --git a/ocaml/middle_end/flambda/closure_offsets.ml b/ocaml/middle_end/flambda/closure_offsets.ml index cfb1791786d..d771cdd3e54 100644 --- a/ocaml/middle_end/flambda/closure_offsets.ml +++ b/ocaml/middle_end/flambda/closure_offsets.ml @@ -79,6 +79,7 @@ let add_closure_offsets and not stored in a closure." | Punboxed_float -> true | Punboxed_int _ -> true + | Punboxed_vector _ -> true | Pvalue Pintval -> true | Pvalue _ -> false) free_vars diff --git a/ocaml/middle_end/flambda/flambda_to_clambda.ml b/ocaml/middle_end/flambda/flambda_to_clambda.ml index 7a337694c12..10abe813aba 100644 --- a/ocaml/middle_end/flambda/flambda_to_clambda.ml +++ b/ocaml/middle_end/flambda/flambda_to_clambda.ml @@ -710,6 +710,7 @@ and to_clambda_set_of_closures t env and not stored in a closure." | Punboxed_float -> true | Punboxed_int _ -> true + | Punboxed_vector _ -> true | Pvalue Pintval -> true | Pvalue _ -> false) free_vars diff --git a/ocaml/middle_end/printclambda.ml b/ocaml/middle_end/printclambda.ml index 46056115b85..8be9fe7f56e 100644 --- a/ocaml/middle_end/printclambda.ml +++ b/ocaml/middle_end/printclambda.ml @@ -60,12 +60,14 @@ let layout (layout : Lambda.layout) = | Punboxed_int Pint32 -> ":unboxed_int32" | Punboxed_int Pint64 -> ":unboxed_int64" | Punboxed_int Pnativeint -> ":unboxed_nativeint" + | Punboxed_vector Pvec128 -> ":unboxed_vec128" let rec structured_constant ppf = function | Uconst_float x -> fprintf ppf "%F" x | Uconst_int32 x -> fprintf ppf "%ldl" x | Uconst_int64 x -> fprintf ppf "%LdL" x | Uconst_nativeint x -> fprintf ppf "%ndn" x + | Uconst_vec128 (v0, v1) -> fprintf ppf "%Ld:%Ld" v0 v1 | Uconst_block (tag, l) -> fprintf ppf "block(%i" tag; List.iter (fun u -> fprintf ppf ",%a" uconstant u) l; From a550abcbeb301c51b2fbd5b966ec50777c7cb617 Mon Sep 17 00:00:00 2001 From: Mark Shinwell Date: Thu, 15 Jun 2023 18:29:15 +0100 Subject: [PATCH 08/81] Miscellaneous SIMD fixes and one terrible hack --- backend/amd64/emit.mlp | 12 ++++++++---- middle_end/clambda_primitives.ml | 7 ++++--- middle_end/clambda_primitives.mli | 5 +++-- middle_end/closure/closure.ml | 5 +++-- middle_end/flambda2/kinds/flambda_kind.ml | 1 + .../unboxing/optimistic_unboxing_decision.ml | 3 ++- middle_end/printclambda.ml | 1 + ocaml/lambda/lambda.ml | 11 +++++++---- ocaml/lambda/lambda.mli | 5 +++-- ocaml/lambda/printlambda.ml | 5 +++++ ocaml/typing/typeopt.ml | 2 ++ 11 files changed, 39 insertions(+), 18 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index a37db7f61d3..7ae20359946 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -696,12 +696,16 @@ let move (src : Reg.t) (dst : Reg.t) = | Float, Reg.Reg _, Float, Reg.Reg _ | Vec128, Reg.Reg _, Vec128, Reg.Reg _ -> I.movapd (reg src) (reg dst) (* CR mslater: (SIMD) alignment *) - | Vec128, _, Vec128, _ -> + | Vec128, _, Vec128, _ -> + I.movupd (reg src) (reg dst) + (* mshinwell: XXX *) + | Vec128, _, Float, _ + | Float, _, Vec128, _ -> I.movupd (reg src) (reg dst) | Float, _, Float, _ -> I.movsd (reg src) (reg dst) | Float, _, Int, _ | Int, _, Float, _ -> I.movq (reg src) (reg dst) - | Vec128, _, _, _ | _, _, Vec128, _ -> + | Vec128, _, _, _ | _, _, Vec128, _ -> Misc.fatal_errorf "Illegal move between a vector and non-vector register (%s to %s)\n" (Reg.name src) (Reg.name dst) @@ -997,7 +1001,7 @@ let emit_instr fallthrough i = I.mov (addressing addr DWORD i 0) (res32 i 0) | Thirtytwo_signed -> I.movsxd (addressing addr DWORD i 0) dest - | Onetwentyeight -> + | Onetwentyeight -> (* CR mslater: (SIMD) alignment *) I.movupd (addressing addr VEC128 i 0) dest | Single -> @@ -1015,7 +1019,7 @@ let emit_instr fallthrough i = I.mov (arg16 i 0) (addressing addr WORD i 1) | Thirtytwo_signed | Thirtytwo_unsigned -> I.mov (arg32 i 0) (addressing addr DWORD i 1) - | Onetwentyeight -> + | Onetwentyeight -> (* CR mslater: (SIMD) alignment *) I.movupd (arg i 0) (addressing addr VEC128 i 1) | Single -> diff --git a/middle_end/clambda_primitives.ml b/middle_end/clambda_primitives.ml index 770523ec282..a550d96726e 100644 --- a/middle_end/clambda_primitives.ml +++ b/middle_end/clambda_primitives.ml @@ -158,21 +158,22 @@ and value_kind = Lambda.value_kind = non_consts : (int * value_kind list) list; } | Parrayval of array_kind + | Pboxedvectorval of boxed_vector and layout = Lambda.layout = | Ptop | Pvalue of value_kind | Punboxed_float | Punboxed_int of boxed_integer - | Punboxed_vector of boxed_vector + | Punboxed_vector of boxed_vector | Pbottom and block_shape = Lambda.block_shape and boxed_integer = Primitive.boxed_integer = Pnativeint | Pint32 | Pint64 -and boxed_vector = Primitive.boxed_vector = - | Pvec128 +and boxed_vector = Primitive.boxed_vector = + | Pvec128 and bigarray_kind = Lambda.bigarray_kind = Pbigarray_unknown diff --git a/middle_end/clambda_primitives.mli b/middle_end/clambda_primitives.mli index 48f46f7d15f..11ecd5bd378 100644 --- a/middle_end/clambda_primitives.mli +++ b/middle_end/clambda_primitives.mli @@ -161,13 +161,14 @@ and value_kind = Lambda.value_kind = non_consts : (int * value_kind list) list; } | Parrayval of array_kind + | Pboxedvectorval of boxed_vector and layout = Lambda.layout = | Ptop | Pvalue of value_kind | Punboxed_float | Punboxed_int of boxed_integer - | Punboxed_vector of boxed_vector + | Punboxed_vector of boxed_vector | Pbottom and block_shape = Lambda.block_shape @@ -175,7 +176,7 @@ and block_shape = Lambda.block_shape and boxed_integer = Primitive.boxed_integer = Pnativeint | Pint32 | Pint64 -and boxed_vector = Primitive.boxed_vector = +and boxed_vector = Primitive.boxed_vector = | Pvec128 and bigarray_kind = Lambda.bigarray_kind = diff --git a/middle_end/closure/closure.ml b/middle_end/closure/closure.ml index be8864b5293..df139603f61 100644 --- a/middle_end/closure/closure.ml +++ b/middle_end/closure/closure.ml @@ -64,8 +64,9 @@ let is_gc_ignorable kind = | Punboxed_float -> true | Punboxed_int _ -> true | Pvalue Pintval -> true - | Punboxed_vector _ -> true - | Pvalue (Pgenval | Pfloatval | Pboxedintval _ | Pvariant _ | Parrayval _) -> false + | Punboxed_vector _ -> true + | Pvalue (Pgenval | Pfloatval | Pboxedintval _ | Pboxedvectorval _ + | Pvariant _ | Parrayval _) -> false let split_closure_fv kinds fv = List.fold_right (fun id (not_scanned, scanned) -> diff --git a/middle_end/flambda2/kinds/flambda_kind.ml b/middle_end/flambda2/kinds/flambda_kind.ml index cfe3bb20df5..0669bd8cb47 100644 --- a/middle_end/flambda2/kinds/flambda_kind.ml +++ b/middle_end/flambda2/kinds/flambda_kind.ml @@ -528,6 +528,7 @@ module With_subkind = struct | Pboxedintval Pint32 -> boxed_int32 | Pboxedintval Pint64 -> boxed_int64 | Pboxedintval Pnativeint -> boxed_nativeint + | Pboxedvectorval Pvec128 -> boxed_vec128 | Pintval -> tagged_immediate | Pvariant { consts; non_consts } -> ( match consts, non_consts with diff --git a/middle_end/flambda2/simplify/unboxing/optimistic_unboxing_decision.ml b/middle_end/flambda2/simplify/unboxing/optimistic_unboxing_decision.ml index 11ecfe8e663..70f0e8a2a08 100644 --- a/middle_end/flambda2/simplify/unboxing/optimistic_unboxing_decision.ml +++ b/middle_end/flambda2/simplify/unboxing/optimistic_unboxing_decision.ml @@ -54,7 +54,8 @@ let deciders = Unboxers.Float.decider; Unboxers.Int32.decider; Unboxers.Int64.decider; - Unboxers.Nativeint.decider ] + Unboxers.Nativeint.decider; + Unboxers.Vec128.decider ] let rec make_optimistic_decision ~depth ~recursive tenv ~param_type : U.decision = diff --git a/middle_end/printclambda.ml b/middle_end/printclambda.ml index 8232fddf399..ff35b38f319 100644 --- a/middle_end/printclambda.ml +++ b/middle_end/printclambda.ml @@ -37,6 +37,7 @@ let rec value_kind0 ppf kind = | Pboxedintval Pnativeint -> Format.pp_print_string ppf ":nativeint" | Pboxedintval Pint32 -> Format.pp_print_string ppf ":int32" | Pboxedintval Pint64 -> Format.pp_print_string ppf ":int64" + | Pboxedvectorval Pvec128 -> Format.pp_print_string ppf ":vec128" | Pvariant { consts; non_consts } -> Format.fprintf ppf "@[[(consts (%a))@ (non_consts (%a))]@]" (Format.pp_print_list ~pp_sep:Format.pp_print_space Format.pp_print_int) diff --git a/ocaml/lambda/lambda.ml b/ocaml/lambda/lambda.ml index 939f4c393d1..82bbd019675 100644 --- a/ocaml/lambda/lambda.ml +++ b/ocaml/lambda/lambda.ml @@ -260,13 +260,14 @@ and value_kind = non_consts : (int * value_kind list) list; } | Parrayval of array_kind + | Pboxedvectorval of boxed_vector and layout = | Ptop | Pvalue of value_kind | Punboxed_float | Punboxed_int of boxed_integer - | Punboxed_vector of boxed_vector + | Punboxed_vector of boxed_vector | Pbottom and block_shape = @@ -290,7 +291,7 @@ and array_set_kind = and boxed_integer = Primitive.boxed_integer = Pnativeint | Pint32 | Pint64 -and boxed_vector = Primitive.boxed_vector = +and boxed_vector = Primitive.boxed_vector = | Pvec128 and bigarray_kind = @@ -327,6 +328,8 @@ let rec equal_value_kind x y = | Pgenval, Pgenval -> true | Pfloatval, Pfloatval -> true | Pboxedintval bi1, Pboxedintval bi2 -> equal_boxed_integer bi1 bi2 + | Pboxedvectorval bi1, Pboxedvectorval bi2 -> + equal_boxed_vector bi1 bi2 | Pintval, Pintval -> true | Parrayval elt_kind1, Parrayval elt_kind2 -> elt_kind1 = elt_kind2 | Pvariant { consts = consts1; non_consts = non_consts1; }, @@ -343,7 +346,7 @@ let rec equal_value_kind x y = && List.for_all2 equal_value_kind fields1 fields2) non_consts1 non_consts2 | (Pgenval | Pfloatval | Pboxedintval _ | Pintval | Pvariant _ - | Parrayval _), _ -> false + | Parrayval _ | Pboxedvectorval _), _ -> false let equal_layout x y = match x, y with @@ -360,7 +363,7 @@ let compatible_layout x y = | Punboxed_float, Punboxed_float -> true | Punboxed_int bi1, Punboxed_int bi2 -> equal_boxed_integer bi1 bi2 - | Punboxed_vector bi1, Punboxed_vector bi2 -> equal_boxed_vector bi1 bi2 + | Punboxed_vector bi1, Punboxed_vector bi2 -> equal_boxed_vector bi1 bi2 | Ptop, Ptop -> true | Ptop, _ | _, Ptop -> false | (Pvalue _ | Punboxed_float | Punboxed_int _ | Punboxed_vector _), _ -> false diff --git a/ocaml/lambda/lambda.mli b/ocaml/lambda/lambda.mli index 3564a6107c8..b6236bfb775 100644 --- a/ocaml/lambda/lambda.mli +++ b/ocaml/lambda/lambda.mli @@ -235,6 +235,7 @@ and value_kind = expected to be significant. *) } | Parrayval of array_kind + | Pboxedvectorval of boxed_vector (* Because we check for and error on void in the translation to lambda, we don't need a constructor for it here. *) @@ -252,8 +253,8 @@ and block_shape = and boxed_integer = Primitive.boxed_integer = Pnativeint | Pint32 | Pint64 -and boxed_vector = Primitive.boxed_vector = - | Pvec128 +and boxed_vector = Primitive.boxed_vector = + | Pvec128 and bigarray_kind = Pbigarray_unknown diff --git a/ocaml/lambda/printlambda.ml b/ocaml/lambda/printlambda.ml index 5baeada60c7..427120e9415 100644 --- a/ocaml/lambda/printlambda.ml +++ b/ocaml/lambda/printlambda.ml @@ -108,6 +108,7 @@ let rec value_kind ppf = function | Pfloatval -> fprintf ppf "[float]" | Parrayval elt_kind -> fprintf ppf "[%sarray]" (array_kind elt_kind) | Pboxedintval bi -> fprintf ppf "[%s]" (boxed_integer_name bi) + | Pboxedvectorval bv -> fprintf ppf "[%s]" (boxed_vector_name bv) | Pvariant { consts; non_consts; } -> variant_kind value_kind' ppf ~consts ~non_consts @@ -117,6 +118,7 @@ and value_kind' ppf = function | Pfloatval -> fprintf ppf "[float]" | Parrayval elt_kind -> fprintf ppf "[%sarray]" (array_kind elt_kind) | Pboxedintval bi -> fprintf ppf "[%s]" (boxed_integer_name bi) + | Pboxedvectorval bv -> fprintf ppf "[%s]" (boxed_vector_name bv) | Pvariant { consts; non_consts; } -> variant_kind value_kind' ppf ~consts ~non_consts @@ -139,6 +141,8 @@ let return_kind ppf (mode, kind) = | Pvalue (Parrayval elt_kind) -> fprintf ppf ": %s%sarray@ " smode (array_kind elt_kind) | Pvalue (Pboxedintval bi) -> fprintf ppf ": %s%s@ " smode (boxed_integer_name bi) + | Pvalue (Pboxedvectorval bv) -> + fprintf ppf ": %s%s@ " smode (boxed_vector_name bv) | Pvalue (Pvariant { consts; non_consts; }) -> variant_kind value_kind' ppf ~consts ~non_consts | Punboxed_float -> fprintf ppf ": unboxed_float@ " @@ -153,6 +157,7 @@ let field_kind ppf = function | Pfloatval -> pp_print_string ppf "float" | Parrayval elt_kind -> fprintf ppf "%s-array" (array_kind elt_kind) | Pboxedintval bi -> pp_print_string ppf (boxed_integer_name bi) + | Pboxedvectorval bv -> pp_print_string ppf (boxed_vector_name bv) | Pvariant { consts; non_consts; } -> fprintf ppf "@[[(consts (%a))@ (non_consts (%a))]@]" (Format.pp_print_list ~pp_sep:Format.pp_print_space Format.pp_print_int) diff --git a/ocaml/typing/typeopt.ml b/ocaml/typing/typeopt.ml index fae58689863..eacf781818d 100644 --- a/ocaml/typing/typeopt.ml +++ b/ocaml/typing/typeopt.ml @@ -284,6 +284,8 @@ let rec value_kind env ~loc ~visited ~depth ~num_nodes_visited ty num_nodes_visited, (Pboxedintval Pint64) | Tconstr(p, _, _) when Path.same p Predef.path_nativeint -> num_nodes_visited, (Pboxedintval Pnativeint) + | Tconstr(p, _, _) when Path.same p Predef.path_vec128 -> + num_nodes_visited, (Pboxedvectorval Pvec128) | Tconstr(p, _, _) when (Path.same p Predef.path_array || Path.same p Predef.path_floatarray) -> From 3e831749c4f080504e6210d6e1a0249ab526a0ff Mon Sep 17 00:00:00 2001 From: Max Slater Date: Thu, 15 Jun 2023 14:17:25 -0400 Subject: [PATCH 09/81] integrate tests --- backend/amd64/emit.mlp | 6 +----- backend/cmm.ml | 1 + backend/cmm.mli | 1 + backend/cmm_helpers.ml | 1 + backend/cmmgen.ml | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 7ae20359946..100886e56a5 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -695,12 +695,8 @@ let move (src : Reg.t) (dst : Reg.t) = begin match src.typ, src.loc, dst.typ, dst.loc with | Float, Reg.Reg _, Float, Reg.Reg _ | Vec128, Reg.Reg _, Vec128, Reg.Reg _ -> I.movapd (reg src) (reg dst) - (* CR mslater: (SIMD) alignment *) | Vec128, _, Vec128, _ -> - I.movupd (reg src) (reg dst) - (* mshinwell: XXX *) - | Vec128, _, Float, _ - | Float, _, Vec128, _ -> + (* CR mslater: (SIMD) alignment *) I.movupd (reg src) (reg dst) | Float, _, Float, _ -> I.movsd (reg src) (reg dst) | Float, _, Int, _ diff --git a/backend/cmm.ml b/backend/cmm.ml index 30da688d930..a95a418d71c 100644 --- a/backend/cmm.ml +++ b/backend/cmm.ml @@ -236,6 +236,7 @@ and operation = type kind_for_unboxing = | Any | Boxed_integer of Lambda.boxed_integer + | Boxed_vector of Lambda.boxed_vector | Boxed_float type is_global = Global | Local diff --git a/backend/cmm.mli b/backend/cmm.mli index 3875547837c..091daa90b6f 100644 --- a/backend/cmm.mli +++ b/backend/cmm.mli @@ -235,6 +235,7 @@ and operation = type kind_for_unboxing = | Any (* This may contain anything, including non-scannable things *) | Boxed_integer of Lambda.boxed_integer + | Boxed_vector of Lambda.boxed_vector | Boxed_float type is_global = Global | Local diff --git a/backend/cmm_helpers.ml b/backend/cmm_helpers.ml index 31ae012445b..6dbe0e31b4d 100644 --- a/backend/cmm_helpers.ml +++ b/backend/cmm_helpers.ml @@ -4322,6 +4322,7 @@ let kind_of_layout (layout : Lambda.layout) = match layout with | Pvalue Pfloatval -> Boxed_float | Pvalue (Pboxedintval bi) -> Boxed_integer bi + | Pvalue (Pboxedvectorval vi) -> Boxed_vector vi | Pvalue (Pgenval | Pintval | Pvariant _ | Parrayval _) | Ptop | Pbottom | Punboxed_float | Punboxed_int _ | Punboxed_vector _ -> Any diff --git a/backend/cmmgen.ml b/backend/cmmgen.ml index 709238a8cae..a61e7be1f5b 100644 --- a/backend/cmmgen.ml +++ b/backend/cmmgen.ml @@ -388,7 +388,7 @@ let join_unboxed_number_kind ~strict k1 k2 = | _, _ -> No_unboxing let is_strict : kind_for_unboxing -> bool = function - | Boxed_integer _ | Boxed_float -> false + | Boxed_integer _ | Boxed_float | Boxed_vector _ -> false | Any -> true let rec is_unboxed_number_cmm = function From 1d4b4b3cb8d9f4e553564940149342b6500b312f Mon Sep 17 00:00:00 2001 From: Max Slater Date: Thu, 15 Jun 2023 14:46:22 -0400 Subject: [PATCH 10/81] fixes after rebase --- backend/regalloc/regalloc_invariants.ml | 1 + .../flambda2/from_lambda/lambda_to_flambda.ml | 2 +- ocaml/lambda/lambda.ml | 3 +++ ocaml/typing/primitive.ml | 13 ++++++++----- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/backend/regalloc/regalloc_invariants.ml b/backend/regalloc/regalloc_invariants.ml index 12713b02e13..862f9dfce45 100644 --- a/backend/regalloc/regalloc_invariants.ml +++ b/backend/regalloc/regalloc_invariants.ml @@ -17,6 +17,7 @@ let precondition : Cfg_with_layout.t -> unit = | Const_int _ -> () | Const_float _ -> () | Const_symbol _ -> () + | Const_vec128 _ -> () | Stackoffset _ -> () | Load _ -> () | Store _ -> () diff --git a/middle_end/flambda2/from_lambda/lambda_to_flambda.ml b/middle_end/flambda2/from_lambda/lambda_to_flambda.ml index 6eb84c464ab..9eabe935325 100644 --- a/middle_end/flambda2/from_lambda/lambda_to_flambda.ml +++ b/middle_end/flambda2/from_lambda/lambda_to_flambda.ml @@ -1197,7 +1197,7 @@ let rec cps acc env ccenv (lam : L.lambda) (k : cps_continuation) let id = Ident.create_local name in let result_layout = L.primitive_result_layout prim in (match result_layout with - | Pvalue _ | Punboxed_float | Punboxed_int _ -> () + | Pvalue _ | Punboxed_float | Punboxed_int _ | Punboxed_vector _ -> () | Ptop | Pbottom -> Misc.fatal_errorf "Invalid result layout %a for primitive %a" Printlambda.layout result_layout Printlambda.primitive prim); diff --git a/ocaml/lambda/lambda.ml b/ocaml/lambda/lambda.ml index 82bbd019675..0fcbc143ff3 100644 --- a/ocaml/lambda/lambda.ml +++ b/ocaml/lambda/lambda.ml @@ -650,6 +650,8 @@ let layout_functor = Pvalue Pgenval let layout_boxed_float = Pvalue Pfloatval let layout_string = Pvalue Pgenval let layout_boxedint bi = Pvalue (Pboxedintval bi) + +let layout_boxed_vector vi = Pvalue (Pboxedvectorval vi) let layout_lazy = Pvalue Pgenval let layout_lazy_contents = Pvalue Pgenval let layout_any_value = Pvalue Pgenval @@ -1453,6 +1455,7 @@ let primitive_result_layout (p : primitive) = | Punbox_float -> Punboxed_float | Pccall { prim_native_repr_res = _, Untagged_int; _} -> layout_int | Pccall { prim_native_repr_res = _, Unboxed_float; _} -> layout_boxed_float + | Pccall { prim_native_repr_res = _, Unboxed_vector v; _} -> layout_boxed_vector v | Pccall { prim_native_repr_res = _, Same_as_ocaml_repr s; _} -> begin match s with | Value -> layout_any_value diff --git a/ocaml/typing/primitive.ml b/ocaml/typing/primitive.ml index 21249d00a4d..38d07eb6409 100644 --- a/ocaml/typing/primitive.ml +++ b/ocaml/typing/primitive.ml @@ -301,16 +301,19 @@ let equal_native_repr nr1 nr2 = match nr1, nr2 with | Same_as_ocaml_repr s1, Same_as_ocaml_repr s2 -> Sort.equal_const s1 s2 | Same_as_ocaml_repr _, - (Unboxed_float | Unboxed_integer _ | Untagged_int) -> false + (Unboxed_float | Unboxed_integer _ | Untagged_int | Unboxed_vector _) -> false | Unboxed_float, Unboxed_float -> true | Unboxed_float, - (Same_as_ocaml_repr _ | Unboxed_integer _ | Untagged_int) -> false + (Same_as_ocaml_repr _ | Unboxed_integer _ | Untagged_int | Unboxed_vector _) -> false | Unboxed_integer bi1, Unboxed_integer bi2 -> equal_boxed_integer bi1 bi2 | Unboxed_integer _, - (Same_as_ocaml_repr _ | Unboxed_float | Untagged_int) -> false + (Same_as_ocaml_repr _ | Unboxed_float | Untagged_int | Unboxed_vector _) -> false | Untagged_int, Untagged_int -> true | Untagged_int, - (Same_as_ocaml_repr _ | Unboxed_float | Unboxed_integer _) -> false + (Same_as_ocaml_repr _ | Unboxed_float | Unboxed_integer _ | Unboxed_vector _) -> false + | Unboxed_vector v1, Unboxed_vector v2 -> equal_boxed_vector v1 v2 + | Unboxed_vector _, + (Same_as_ocaml_repr _ | Unboxed_float | Unboxed_integer _ | Untagged_int ) -> false let equal_effects ef1 ef2 = match ef1, ef2 with @@ -334,7 +337,7 @@ let native_name_is_external p = let sort_of_native_repr = function | Same_as_ocaml_repr s -> s - | (Unboxed_float | Unboxed_integer _ | Untagged_int) -> Sort.Value + | (Unboxed_float | Unboxed_integer _ | Untagged_int | Unboxed_vector _) -> Sort.Value let report_error ppf err = match err with From 22430d9eee21f41d50f54545cda8c0ce85a24bbe Mon Sep 17 00:00:00 2001 From: Max Slater Date: Thu, 15 Jun 2023 17:58:17 -0400 Subject: [PATCH 11/81] different register classes; linscan works --- backend/amd64/emit.mlp | 24 +++++-- backend/amd64/proc.ml | 106 +++++++++++++++++++++++-------- backend/proc.mli | 2 + backend/regalloc/regalloc_irc.ml | 1 + backend/regalloc/regalloc_ls.ml | 18 +++--- backend/x86_ast.mli | 4 +- backend/x86_binary_emitter.ml | 12 +++- backend/x86_dsl.ml | 2 +- backend/x86_gas.ml | 6 +- backend/x86_masm.ml | 1 + backend/x86_proc.ml | 7 +- backend/x86_proc.mli | 1 + 12 files changed, 137 insertions(+), 47 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 100886e56a5..c5d16274fcb 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -45,11 +45,14 @@ let int_reg_name = [| RAX; RBX; RDI; RSI; RDX; RCX; R8; R9; R12; R13; R10; R11; RBP; |] -let float_reg_name = Array.init 16 (fun i -> XMM i) +let float_reg_name = Array.init 16 (fun i -> XMMf i) + +let vec128_reg_name = Array.init 16 (fun i -> XMM i) let register_name r = if r < 100 then Reg64 (int_reg_name.(r)) - else Regf (float_reg_name.(r - 100)) + else if r < 200 then Regf (float_reg_name.(r - 100)) + else Reg128 (vec128_reg_name.(r - 200)) (* CFI directives *) @@ -86,10 +89,16 @@ let prologue_required = ref false let frame_required = ref false +(* CR mslater: (SIMD) alignment *) + let frame_size () = (* includes return address *) if !frame_required then begin let sz = - (!stack_offset + 8 * (num_stack_slots.(0) + num_stack_slots.(1)) + 8 + (!stack_offset + + 8 + + 8 * num_stack_slots.(0) + + 8 * num_stack_slots.(1) + + 16 * num_stack_slots.(2) + (if fp then 8 else 0)) in Misc.align sz 16 end else @@ -99,9 +108,12 @@ let slot_offset loc cl = match loc with | Incoming n -> frame_size() + n | Local n -> - if cl = 0 - then !stack_offset + n * 8 - else !stack_offset + (num_stack_slots.(0) + n) * 8 + (!stack_offset + + match cl with + | 0 -> n * 8 + | 1 -> n * 8 + num_stack_slots.(0) * 8 + | 2 -> n * 16 + num_stack_slots.(1) * 8 + num_stack_slots.(0) * 8 + | _ -> Misc.fatal_error "Unknown register class") | Outgoing n -> n | Domainstate _ -> assert false (* not a stack slot *) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 4e289e529cf..b8a46ff9425 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -48,7 +48,8 @@ let win64 = Arch.win64 r14 domain state pointer r15 allocation pointer - xmm0 - xmm15 100 - 115 *) + xmm0 - xmm15 100 - 115 (for floats) + xmm0 - xmm15 200 - 215 (for 128-bit SIMD vectors) *) (* Conventions: rax - r13: OCaml function arguments @@ -97,25 +98,39 @@ let float_reg_name = "%xmm8"; "%xmm9"; "%xmm10"; "%xmm11"; "%xmm12"; "%xmm13"; "%xmm14"; "%xmm15" |] -let num_register_classes = 2 +let vec128_reg_name = float_reg_name + +let num_register_classes = 3 let register_class r = match r.typ with | Val | Int | Addr -> 0 - | Float | Vec128 -> 1 + | Float -> 1 + | Vec128 -> 2 let register_class_tag c = match c with | 0 -> "i" | 1 -> "f" + | 2 -> "v128" | c -> Misc.fatal_errorf "Unspecified register class %d" c -let num_available_registers = [| 13; 16 |] +let num_available_registers = [| 13; 16; 16 |] -let first_available_register = [| 0; 100 |] +let first_available_register = [| 0; 100; 200 |] let register_name r = - if r < 100 then int_reg_name.(r) else float_reg_name.(r - 100) + if r < 100 then int_reg_name.(r) + else if r < 200 then float_reg_name.(r - 100) + else vec128_reg_name.(r - 200) + +let maps_to_in_class r to_class = + let from_class = if r < 100 then 0 else if r < 200 then 1 else 2 in + match from_class, to_class with + | 1, 2 -> Some (r + 100) + | 2, 1 -> Some (r - 100) + | x, y when x = y -> Some (r) + | _ -> None (* Pack registers starting at %rax so as to reduce the number of REX prefixes and thus improve code density *) @@ -133,18 +148,29 @@ let hard_float_reg = for i = 0 to 15 do v.(i) <- Reg.at_location Float (Reg (100 + i)) done; v +let hard_vec128_reg = + let v = Array.make 16 Reg.dummy in + for i = 0 to 15 do v.(i) <- Reg.at_location Vec128 (Reg (200 + i)) done; + v + let all_phys_regs = - Array.append hard_int_reg hard_float_reg + hard_int_reg + |> Array.append hard_float_reg + |> Array.append hard_vec128_reg let phys_reg n = - if n < 100 then hard_int_reg.(n) else hard_float_reg.(n - 100) + if n < 100 then hard_int_reg.(n) else + if n < 200 then hard_float_reg.(n - 100) + else hard_vec128_reg.(n - 200) let rax = phys_reg 0 let rdx = phys_reg 4 let r10 = phys_reg 10 let r11 = phys_reg 11 let rbp = phys_reg 12 -let rxmm15 = phys_reg 115 +let rxmm15f = phys_reg 115 + +let rxmm15v = phys_reg 215 let destroyed_by_plt_stub = if not X86_proc.use_plt then [| |] else [| r10; r11 |] @@ -164,12 +190,13 @@ let word_addressed = false let size_domainstate_args = 64 * size_int -let calling_conventions first_int last_int first_float last_float +let calling_conventions first_int last_int first_float last_float first_vec128 last_vec128 make_stack first_stack arg = let loc = Array.make (Array.length arg) Reg.dummy in let int = ref first_int in let float = ref first_float in + let vec128 = ref first_vec128 in let ofs = ref first_stack in for i = 0 to Array.length arg - 1 do match arg.(i) with @@ -182,14 +209,23 @@ let calling_conventions first_int last_int first_float last_float ofs := !ofs + size_int end; assert (not (Reg.Set.mem loc.(i) destroyed_by_plt_stub_set)) - | (Float | Vec128 as ty) -> + | Float -> if !float <= last_float then begin loc.(i) <- phys_reg !float; incr float end else begin - loc.(i) <- stack_slot (make_stack !ofs) ty; + loc.(i) <- stack_slot (make_stack !ofs) Float; ofs := !ofs + size_float end + | Vec128 -> + if !vec128 <= last_vec128 then begin + loc.(i) <- phys_reg !vec128; + incr vec128 + end else begin + (* CR mslater: (SIMD) fix extcall stack alignment *) + loc.(i) <- stack_slot (make_stack !ofs) Vec128; + ofs := !ofs + size_vec128 + end done; (loc, Misc.align (max 0 !ofs) 16) (* keep stack 16-aligned *) @@ -204,18 +240,18 @@ let outgoing ofs = let not_supported _ofs = fatal_error "Proc.loc_results: cannot call" let loc_arguments arg = - calling_conventions 0 9 100 109 outgoing (- size_domainstate_args) arg + calling_conventions 0 9 100 109 200 209 outgoing (- size_domainstate_args) arg let loc_parameters arg = let (loc, _ofs) = - calling_conventions 0 9 100 109 incoming (- size_domainstate_args) arg + calling_conventions 0 9 100 109 200 209 incoming (- size_domainstate_args) arg in loc let loc_results_call res = - calling_conventions 0 9 100 109 outgoing (- size_domainstate_args) res + calling_conventions 0 9 100 109 200 209 outgoing (- size_domainstate_args) res let loc_results_return res = let (loc, _ofs) = - calling_conventions 0 9 100 109 incoming (- size_domainstate_args) res + calling_conventions 0 9 100 109 200 209 incoming (- size_domainstate_args) res in loc let max_arguments_for_tailcalls = 10 (* in regs *) + 64 (* in domain state *) @@ -234,16 +270,19 @@ let max_arguments_for_tailcalls = 10 (* in regs *) + 64 (* in domain state *) Return value in rax or xmm0. *) let loc_external_results res = - let (loc, _ofs) = calling_conventions 0 0 100 100 not_supported 0 res in loc + let (loc, _ofs) = calling_conventions 0 0 100 100 200 200 not_supported 0 res in loc let unix_loc_external_arguments arg = - calling_conventions 2 7 100 107 outgoing 0 arg + calling_conventions 2 7 100 107 200 207 outgoing 0 arg let win64_int_external_arguments = [| 5 (*rcx*); 4 (*rdx*); 6 (*r8*); 7 (*r9*) |] let win64_float_external_arguments = [| 100 (*xmm0*); 101 (*xmm1*); 102 (*xmm2*); 103 (*xmm3*) |] +let win64_vec128_external_arguments = + [| 200 (*xmm0*); 201 (*xmm1*); 202 (*xmm2*); 203 (*xmm3*) |] + let win64_loc_external_arguments arg = let loc = Array.make (Array.length arg) Reg.dummy in let reg = ref 0 @@ -258,14 +297,23 @@ let win64_loc_external_arguments arg = loc.(i) <- stack_slot (Outgoing !ofs) ty; ofs := !ofs + size_int end - | (Float | Vec128) as ty -> + | Float -> if !reg < 4 then begin loc.(i) <- phys_reg win64_float_external_arguments.(!reg); incr reg end else begin - loc.(i) <- stack_slot (Outgoing !ofs) ty; + loc.(i) <- stack_slot (Outgoing !ofs) Float; ofs := !ofs + size_float end + | Vec128 -> + if !reg < 4 then begin + loc.(i) <- phys_reg win64_vec128_external_arguments.(!reg); + incr reg + end else begin + (* CR mslater: (SIMD) fix extcall stack alignment *) + loc.(i) <- stack_slot (Outgoing !ofs) Vec128; + ofs := !ofs + size_vec128 + end done; (loc, Misc.align !ofs 16) (* keep stack 16-aligned *) @@ -288,10 +336,13 @@ let int_dwarf_reg_numbers = let float_dwarf_reg_numbers = [| 17; 18; 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32 |] +let vec128_dwarf_reg_numbers = float_dwarf_reg_numbers + let dwarf_register_numbers ~reg_class = match reg_class with | 0 -> int_dwarf_reg_numbers | 1 -> float_dwarf_reg_numbers + | 2 -> vec128_dwarf_reg_numbers | _ -> Misc.fatal_errorf "Bad register class %d" reg_class let stack_ptr_dwarf_register_number = 7 @@ -307,13 +358,16 @@ let destroyed_at_c_call = (* Win64: rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15 preserved *) Array.of_list(List.map phys_reg [0;4;5;6;7;10;11; - 100;101;102;103;104;105]) + 100;101;102;103;104;105; + 200;201;202;203;204;205]) else (* Unix: rbp, rbx, r12-r15 preserved *) Array.of_list(List.map phys_reg [0;2;3;4;5;6;7;10;11; 100;101;102;103;104;105;106;107; - 108;109;110;111;112;113;114;115]) + 108;109;110;111;112;113;114;115; + 200;201;202;203;204;205;206;207; + 208;209;210;211;212;213;214;215]) let destroyed_at_alloc_or_poll = if X86_proc.use_plt then @@ -334,7 +388,7 @@ let destroyed_at_oper = function | Iop(Iextcall { alloc = false; }) -> destroyed_at_c_call | Iop(Iintop(Idiv | Imod)) | Iop(Iintop_imm((Idiv | Imod), _)) -> [| rax; rdx |] - | Iop(Istore(Single, _, _)) -> [| rxmm15 |] + | Iop(Istore(Single, _, _)) -> [| rxmm15f; rxmm15v |] | Iop(Ialloc _ | Ipoll _) -> destroyed_at_alloc_or_poll | Iop(Iintop(Imulh _ | Icomp _) | Iintop_imm((Icomp _), _)) -> [| rax |] @@ -393,7 +447,7 @@ let destroyed_at_basic (basic : Cfg_intf.S.basic) = | Op (Intop (Idiv | Imod)) | Op (Intop_imm ((Idiv | Imod), _)) -> [| rax; rdx |] | Op(Store(Single, _, _)) -> - [| rxmm15 |] + [| rxmm15f; rxmm15v |] | Op(Intop(Imulh _ | Icomp _) | Intop_imm((Icomp _), _)) -> [| rax |] | Op (Specific (Irdtsc | Irdpmc)) -> @@ -514,8 +568,8 @@ let safe_register_pressure = function let max_register_pressure = let consumes ~int ~float = if fp - then [| 12 - int; 16 - float |] - else [| 13 - int; 16 - float |] + then [| 12 - int; 16 - float; 16 - float |] + else [| 13 - int; 16 - float; 16 - float |] in function Iextcall _ -> if win64 diff --git a/backend/proc.mli b/backend/proc.mli index ba6edc08d1a..994d581a11a 100644 --- a/backend/proc.mli +++ b/backend/proc.mli @@ -62,6 +62,8 @@ val destroyed_at_basic : Cfg_intf.S.basic -> Reg.t array val destroyed_at_terminator : Cfg_intf.S.terminator -> Reg.t array val is_destruction_point : Cfg_intf.S.terminator -> bool +val maps_to_in_class : int -> int -> int option + (* Volatile registers: those that change value when read *) val regs_are_volatile: Reg.t array -> bool diff --git a/backend/regalloc/regalloc_irc.ml b/backend/regalloc/regalloc_irc.ml index 3082bf3b5cc..f04869a1958 100644 --- a/backend/regalloc/regalloc_irc.ml +++ b/backend/regalloc/regalloc_irc.ml @@ -313,6 +313,7 @@ let assign_colors : State.t -> Cfg_with_layout.t -> unit = in let ok_colors = Array.make reg_num_avail true in let counter = ref reg_num_avail in + (* CR mslater: (SIMD) allocate float+simd together *) let rec mark_adjacent_colors_and_get_first_available (adj : Reg.t list) : int = match adj with diff --git a/backend/regalloc/regalloc_ls.ml b/backend/regalloc/regalloc_ls.ml index 0dfdcf8c72f..9653aac9253 100644 --- a/backend/regalloc/regalloc_ls.ml +++ b/backend/regalloc/regalloc_ls.ml @@ -134,17 +134,19 @@ let allocate_free_register : State.t -> Interval.t -> spilling_reg = let available = Array.make num_available_registers true in List.iter intervals.active ~f:(fun (interval : Interval.t) -> match interval.reg.loc with - | Reg r -> - if r - first_available < num_available_registers - then available.(r - first_available) <- false + | Reg r -> ( + match Proc.maps_to_in_class r reg_class with + | None -> () + | Some r -> available.(r - first_available) <- false) | Stack _ | Unknown -> ()); let remove_bound_overlapping (itv : Interval.t) : unit = match itv.reg.loc with - | Reg r -> - if r - first_available < num_available_registers - && available.(r - first_available) - && Interval.overlap itv interval - then available.(r - first_available) <- false + | Reg r -> ( + match Proc.maps_to_in_class r reg_class with + | None -> () + | Some r -> + if available.(r - first_available) && Interval.overlap itv interval + then available.(r - first_available) <- false) | Stack _ | Unknown -> () in List.iter intervals.inactive ~f:remove_bound_overlapping; diff --git a/backend/x86_ast.mli b/backend/x86_ast.mli index 40d69174624..feb0c70797a 100644 --- a/backend/x86_ast.mli +++ b/backend/x86_ast.mli @@ -68,8 +68,9 @@ type reg64 = type reg8h = | AH | BH | CH | DH +type registerf = XMMf of int | TOS | ST of int -type registerf = XMM of int | TOS | ST of int +type regSIMD = XMM of int type arch = X64 | X86 @@ -103,6 +104,7 @@ type arg = | Reg16 of reg64 | Reg32 of reg64 | Reg64 of reg64 + | Reg128 of regSIMD | Regf of registerf | Mem of addr diff --git a/backend/x86_binary_emitter.ml b/backend/x86_binary_emitter.ml index e4d0db305a1..53f755859f0 100644 --- a/backend/x86_binary_emitter.ml +++ b/backend/x86_binary_emitter.ml @@ -36,6 +36,7 @@ let print_old_arg ppf = function | Reg16 _ -> Format.fprintf ppf "Reg16" | Reg32 _ -> Format.fprintf ppf "Reg32" | Reg64 _ -> Format.fprintf ppf "Reg64" + | Reg128 _ -> Format.fprintf ppf "Reg128" | Regf _ -> Format.fprintf ppf "Regf" | Mem _ -> Format.fprintf ppf "Mem" | Mem64_RIP _ -> Format.fprintf ppf "Mem64_RIP" @@ -276,10 +277,14 @@ let is_imm8L x = x < 128L && x >= -128L let rd_of_regf regf = match regf with - | XMM n -> n + | XMMf n -> n | TOS -> assert false (* TODO *) | ST _st -> assert false +let rd_of_regSIMD (regSIMD : regSIMD) = + match regSIMD with + | XMM n -> n + (* TODO *) let rd_of_reg64 = function @@ -443,6 +448,11 @@ let emit_mod_rm_reg b rex opcodes rm reg = emit_rex b (rex lor rexr_reg reg lor rexb_rm rm); buf_opcodes b opcodes; buf_int8 b (mod_rm_reg 0b11 rm reg) + | Reg128 rm -> + let rm = rd_of_regSIMD rm in + emit_rex b (rex lor rexr_reg reg lor rexb_rm rm); + buf_opcodes b opcodes; + buf_int8 b (mod_rm_reg 0b11 rm reg) (* 64 bits memory access *) | Mem64_RIP (_, symbol, offset) -> emit_rex b (rex lor rexr_reg reg); diff --git a/backend/x86_dsl.ml b/backend/x86_dsl.ml index 875538061d2..02092b3c4f8 100644 --- a/backend/x86_dsl.ml +++ b/backend/x86_dsl.ml @@ -55,7 +55,7 @@ let r14 = Reg64 R14 let r15 = Reg64 R15 let rsp = Reg64 RSP let rbp = Reg64 RBP -let xmm15 = Regf (XMM 15) +let xmm15 = Regf (XMMf 15) let eax = Reg32 RAX let ebx = Reg32 RBX let ecx = Reg32 RCX diff --git a/backend/x86_gas.ml b/backend/x86_gas.ml index dec63f54682..23f2f64bf5c 100644 --- a/backend/x86_gas.ml +++ b/backend/x86_gas.ml @@ -64,6 +64,7 @@ let arg b = function | Reg16 x -> print_reg b string_of_reg16 x | Reg32 x -> print_reg b string_of_reg32 x | Reg64 x -> print_reg b string_of_reg64 x + | Reg128 x -> print_reg b string_of_regSIMD x | Regf x -> print_reg b string_of_registerf x | Mem addr -> arg_mem b addr | Mem64_RIP (_, s, displ) -> bprintf b "%s%a(%%rip)" s opt_displ displ @@ -88,6 +89,7 @@ let typeof = function | Reg16 _ -> WORD | Reg32 _ -> DWORD | Reg64 _ -> QWORD + | Reg128 _ -> VEC128 | Imm _ | Sym _ -> NONE | Regf _ -> assert false @@ -98,8 +100,8 @@ let suf arg = | DWORD | REAL8 -> "l" | QWORD -> "q" | REAL4 -> "s" - | NONE -> "" - | VEC128 | NEAR | PROC -> assert false + | VEC128 | NONE -> "" + | NEAR | PROC -> assert false let i0 b s = bprintf b "\t%s" s let i1 b s x = bprintf b "\t%s\t%a" s arg x diff --git a/backend/x86_masm.ml b/backend/x86_masm.ml index 31c93c0ce6b..e0261e6db7c 100644 --- a/backend/x86_masm.ml +++ b/backend/x86_masm.ml @@ -82,6 +82,7 @@ let arg b = function | Reg32 x -> Buffer.add_string b (string_of_reg32 x) | Reg64 x -> Buffer.add_string b (string_of_reg64 x) | Regf x -> Buffer.add_string b (string_of_registerf x) + | Reg128 x -> Buffer.add_string b (string_of_regSIMD x) (* We don't need to specify RIP on Win64, since EXTERN will provide the list of external symbols that need this addressing mode, and diff --git a/backend/x86_proc.ml b/backend/x86_proc.ml index 68bf41e5bf8..b56adc148f4 100644 --- a/backend/x86_proc.ml +++ b/backend/x86_proc.ml @@ -238,11 +238,14 @@ let string_of_reg32 = function | R14 -> "r14d" | R15 -> "r15d" -let string_of_registerf = function - | XMM n -> Printf.sprintf "xmm%d" n +let string_of_registerf : registerf -> string = function + | XMMf n -> Printf.sprintf "xmm%d" n | TOS -> Printf.sprintf "tos" | ST n -> Printf.sprintf "st(%d)" n +let string_of_regSIMD = function + | XMM n -> Printf.sprintf "xmm%d" n + let string_of_condition = function | E -> "e" | AE -> "ae" diff --git a/backend/x86_proc.mli b/backend/x86_proc.mli index aa18668d844..358cae97a00 100644 --- a/backend/x86_proc.mli +++ b/backend/x86_proc.mli @@ -25,6 +25,7 @@ val string_of_reg8h: reg8h -> string val string_of_reg16: reg64 -> string val string_of_reg32: reg64 -> string val string_of_reg64: reg64 -> string +val string_of_regSIMD: regSIMD -> string val string_of_registerf: registerf -> string val string_of_substring_literal: int -> int -> string -> string val string_of_string_literal: string -> string From 68b02cd7ab7fcef41162a97c2253067fe445e68c Mon Sep 17 00:00:00 2001 From: Max Slater Date: Thu, 15 Jun 2023 18:51:03 -0400 Subject: [PATCH 12/81] linscan didn't actually work --- backend/amd64/proc.ml | 8 -------- backend/proc.mli | 2 -- backend/regalloc/regalloc_ls.ml | 18 ++++++++---------- 3 files changed, 8 insertions(+), 20 deletions(-) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index b8a46ff9425..dc6e93bd252 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -124,14 +124,6 @@ let register_name r = else if r < 200 then float_reg_name.(r - 100) else vec128_reg_name.(r - 200) -let maps_to_in_class r to_class = - let from_class = if r < 100 then 0 else if r < 200 then 1 else 2 in - match from_class, to_class with - | 1, 2 -> Some (r + 100) - | 2, 1 -> Some (r - 100) - | x, y when x = y -> Some (r) - | _ -> None - (* Pack registers starting at %rax so as to reduce the number of REX prefixes and thus improve code density *) let rotate_registers = false diff --git a/backend/proc.mli b/backend/proc.mli index 994d581a11a..ba6edc08d1a 100644 --- a/backend/proc.mli +++ b/backend/proc.mli @@ -62,8 +62,6 @@ val destroyed_at_basic : Cfg_intf.S.basic -> Reg.t array val destroyed_at_terminator : Cfg_intf.S.terminator -> Reg.t array val is_destruction_point : Cfg_intf.S.terminator -> bool -val maps_to_in_class : int -> int -> int option - (* Volatile registers: those that change value when read *) val regs_are_volatile: Reg.t array -> bool diff --git a/backend/regalloc/regalloc_ls.ml b/backend/regalloc/regalloc_ls.ml index 9653aac9253..0dfdcf8c72f 100644 --- a/backend/regalloc/regalloc_ls.ml +++ b/backend/regalloc/regalloc_ls.ml @@ -134,19 +134,17 @@ let allocate_free_register : State.t -> Interval.t -> spilling_reg = let available = Array.make num_available_registers true in List.iter intervals.active ~f:(fun (interval : Interval.t) -> match interval.reg.loc with - | Reg r -> ( - match Proc.maps_to_in_class r reg_class with - | None -> () - | Some r -> available.(r - first_available) <- false) + | Reg r -> + if r - first_available < num_available_registers + then available.(r - first_available) <- false | Stack _ | Unknown -> ()); let remove_bound_overlapping (itv : Interval.t) : unit = match itv.reg.loc with - | Reg r -> ( - match Proc.maps_to_in_class r reg_class with - | None -> () - | Some r -> - if available.(r - first_available) && Interval.overlap itv interval - then available.(r - first_available) <- false) + | Reg r -> + if r - first_available < num_available_registers + && available.(r - first_available) + && Interval.overlap itv interval + then available.(r - first_available) <- false | Stack _ | Unknown -> () in List.iter intervals.inactive ~f:remove_bound_overlapping; From 14e22470050c539b311c81f97e206fffdaf64ed2 Mon Sep 17 00:00:00 2001 From: Max Slater Date: Thu, 15 Jun 2023 19:06:01 -0400 Subject: [PATCH 13/81] fix mixed float/vec extcall --- backend/amd64/proc.ml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index dc6e93bd252..89564900853 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -204,7 +204,8 @@ let calling_conventions first_int last_int first_float last_float first_vec128 l | Float -> if !float <= last_float then begin loc.(i) <- phys_reg !float; - incr float + incr float; + incr vec128 end else begin loc.(i) <- stack_slot (make_stack !ofs) Float; ofs := !ofs + size_float @@ -212,7 +213,8 @@ let calling_conventions first_int last_int first_float last_float first_vec128 l | Vec128 -> if !vec128 <= last_vec128 then begin loc.(i) <- phys_reg !vec128; - incr vec128 + incr vec128; + incr float end else begin (* CR mslater: (SIMD) fix extcall stack alignment *) loc.(i) <- stack_slot (make_stack !ofs) Vec128; From c311cf8ad6ccc2309c81dc41c7287baba4493db7 Mon Sep 17 00:00:00 2001 From: Max Slater Date: Fri, 16 Jun 2023 15:32:49 -0400 Subject: [PATCH 14/81] interference in linscan/irc allocators --- backend/amd64/proc.ml | 20 ++++++++++++ backend/proc.mli | 2 ++ backend/regalloc/regalloc_irc.ml | 24 +++++++------- backend/regalloc/regalloc_irc_state.ml | 3 +- backend/regalloc/regalloc_ls.ml | 43 ++++++++++++++++---------- backend/regalloc/regalloc_ls_state.ml | 2 ++ backend/regalloc/regalloc_ls_state.mli | 2 ++ backend/regalloc/regalloc_utils.ml | 5 +++ backend/regalloc/regalloc_utils.mli | 2 ++ 9 files changed, 75 insertions(+), 28 deletions(-) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 89564900853..b5752967f8b 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -124,6 +124,26 @@ let register_name r = else if r < 200 then float_reg_name.(r - 100) else vec128_reg_name.(r - 200) +let class_of reg = + if reg < 100 then 0 + else if reg < 200 then 1 + else if reg < 300 then 2 + else Misc.fatal_errorf "Register of unknown class (%d)" reg + +let sibling_classes reg_class = + match reg_class with + | 0 -> [| 0 |] + | 1 | 2 -> [| 1; 2 |] + | c -> Misc.fatal_errorf "Unspecified register class %d" reg_class + +let reg_id_in_class ~reg ~in_class = + let reg_class = class_of reg in + match reg_class, in_class with + | 1, 2 -> Some (reg + 100) + | 2, 1 -> Some (reg - 100) + | x, y when x = y -> Some reg + | _ -> None + (* Pack registers starting at %rax so as to reduce the number of REX prefixes and thus improve code density *) let rotate_registers = false diff --git a/backend/proc.mli b/backend/proc.mli index ba6edc08d1a..25a629a0277 100644 --- a/backend/proc.mli +++ b/backend/proc.mli @@ -28,6 +28,8 @@ val register_name: int -> string val phys_reg: int -> Reg.t val rotate_registers: bool val all_phys_regs : Reg.t array +val sibling_classes: int -> int array +val reg_id_in_class: reg:int -> in_class:int -> int option (* Calling conventions *) val loc_arguments: Cmm.machtype -> Reg.t array * int diff --git a/backend/regalloc/regalloc_irc.ml b/backend/regalloc/regalloc_irc.ml index f04869a1958..d6a6a19d48c 100644 --- a/backend/regalloc/regalloc_irc.ml +++ b/backend/regalloc/regalloc_irc.ml @@ -313,7 +313,6 @@ let assign_colors : State.t -> Cfg_with_layout.t -> unit = in let ok_colors = Array.make reg_num_avail true in let counter = ref reg_num_avail in - (* CR mslater: (SIMD) allocate float+simd together *) let rec mark_adjacent_colors_and_get_first_available (adj : Reg.t list) : int = match adj with @@ -329,19 +328,22 @@ let assign_colors : State.t -> Cfg_with_layout.t -> unit = | hd :: tl -> let alias = State.find_alias state hd in if State.is_precolored_or_colored state alias - then ( + then match alias.Reg.irc_color with | None -> assert false - | Some color -> + | Some color -> ( if irc_debug then log ~indent:3 "color %d is not available" color; - if Array.unsafe_get ok_colors (color - reg_first_avail) - then ( - Array.unsafe_set ok_colors (color - reg_first_avail) false; - decr counter; - if !counter > 0 - then mark_adjacent_colors_and_get_first_available tl - else reg_num_avail) - else mark_adjacent_colors_and_get_first_available tl) + match Proc.reg_id_in_class ~reg:color ~in_class:reg_class with + | None -> mark_adjacent_colors_and_get_first_available tl + | Some color -> + if Array.unsafe_get ok_colors (color - reg_first_avail) + then ( + Array.unsafe_set ok_colors (color - reg_first_avail) false; + decr counter; + if !counter > 0 + then mark_adjacent_colors_and_get_first_available tl + else reg_num_avail) + else mark_adjacent_colors_and_get_first_available tl) else mark_adjacent_colors_and_get_first_available tl in let first_avail = diff --git a/backend/regalloc/regalloc_irc_state.ml b/backend/regalloc/regalloc_irc_state.ml index aedd78ff409..4be88d9f63d 100644 --- a/backend/regalloc/regalloc_irc_state.ml +++ b/backend/regalloc/regalloc_irc_state.ml @@ -341,7 +341,8 @@ let[@inline] add_edge state u v = in let pair = RegisterStamp.pair u.Reg.stamp v.Reg.stamp in if (not (Reg.same u v)) - && is_interesting_reg u && is_interesting_reg v && same_reg_class u v + && is_interesting_reg u && is_interesting_reg v + && interfering_reg_class u v && not (RegisterStamp.PairSet.mem state.adj_set pair) then ( RegisterStamp.PairSet.add state.adj_set pair; diff --git a/backend/regalloc/regalloc_ls.ml b/backend/regalloc/regalloc_ls.ml index 0dfdcf8c72f..4acd6b58af1 100644 --- a/backend/regalloc/regalloc_ls.ml +++ b/backend/regalloc/regalloc_ls.ml @@ -126,29 +126,38 @@ let allocate_free_register : State.t -> Interval.t -> spilling_reg = | Unknown, true -> allocate_stack_slot reg | Unknown, _ -> ( let reg_class = Proc.register_class reg in - let intervals = State.active state ~reg_class in + let intervals_per_class = State.active_classes state in + let sibling_classes = Proc.sibling_classes reg_class in let first_available = Proc.first_available_register.(reg_class) in match Proc.num_available_registers.(reg_class) with | 0 -> fatal "register class %d has no available registers" reg_class | num_available_registers -> let available = Array.make num_available_registers true in - List.iter intervals.active ~f:(fun (interval : Interval.t) -> - match interval.reg.loc with - | Reg r -> - if r - first_available < num_available_registers - then available.(r - first_available) <- false - | Stack _ | Unknown -> ()); + Array.iter sibling_classes ~f:(fun sibling_class -> + let intervals = intervals_per_class.(sibling_class) in + List.iter intervals.active ~f:(fun (interval : Interval.t) -> + match interval.reg.loc with + | Reg r -> ( + match Proc.reg_id_in_class ~reg:r ~in_class:reg_class with + | None -> () + | Some id -> available.(id - first_available) <- false) + | Stack _ | Unknown -> ())); let remove_bound_overlapping (itv : Interval.t) : unit = match itv.reg.loc with - | Reg r -> - if r - first_available < num_available_registers - && available.(r - first_available) - && Interval.overlap itv interval - then available.(r - first_available) <- false + | Reg r -> ( + match Proc.reg_id_in_class ~reg:r ~in_class:reg_class with + | None -> () + | Some id -> + if available.(id - first_available) && Interval.overlap itv interval + then available.(id - first_available) <- false) | Stack _ | Unknown -> () in - List.iter intervals.inactive ~f:remove_bound_overlapping; - List.iter intervals.fixed ~f:remove_bound_overlapping; + Array.iter sibling_classes ~f:(fun sibling_class -> + List.iter intervals_per_class.(sibling_class).inactive + ~f:remove_bound_overlapping); + Array.iter sibling_classes ~f:(fun sibling_class -> + List.iter intervals_per_class.(sibling_class).fixed + ~f:remove_bound_overlapping); let rec assign idx = if idx >= num_available_registers then raise No_free_register @@ -156,8 +165,10 @@ let allocate_free_register : State.t -> Interval.t -> spilling_reg = then ( reg.loc <- Reg (first_available + idx); reg.spill <- false; - intervals.active - <- Interval.List.insert_sorted intervals.active interval; + Array.iter sibling_classes ~f:(fun sibling_class -> + intervals_per_class.(sibling_class).active + <- Interval.List.insert_sorted + intervals_per_class.(sibling_class).active interval); if ls_debug then log ~indent:3 "assigning %d to register %a" idx Printmach.reg reg; Not_spilling) diff --git a/backend/regalloc/regalloc_ls_state.ml b/backend/regalloc/regalloc_ls_state.ml index c4abf05823d..426f5f46530 100644 --- a/backend/regalloc/regalloc_ls_state.ml +++ b/backend/regalloc/regalloc_ls_state.ml @@ -56,6 +56,8 @@ let[@inline] release_expired_intervals state ~pos = let[@inline] active state ~reg_class = state.active.(reg_class) +let[@inline] active_classes state = state.active + let[@inline] stack_slots state = state.stack_slots let[@inline] get_and_incr_instruction_id state = diff --git a/backend/regalloc/regalloc_ls_state.mli b/backend/regalloc/regalloc_ls_state.mli index a548825ae8e..3fb81355a16 100644 --- a/backend/regalloc/regalloc_ls_state.mli +++ b/backend/regalloc/regalloc_ls_state.mli @@ -19,6 +19,8 @@ val release_expired_intervals : t -> pos:int -> unit val active : t -> reg_class:int -> ClassIntervals.t +val active_classes : t -> ClassIntervals.t array + val stack_slots : t -> StackSlots.t val get_and_incr_instruction_id : t -> Instruction.id diff --git a/backend/regalloc/regalloc_utils.ml b/backend/regalloc/regalloc_utils.ml index 72fcb7bba57..66cef3eeac8 100644 --- a/backend/regalloc/regalloc_utils.ml +++ b/backend/regalloc/regalloc_utils.ml @@ -250,6 +250,11 @@ let same_reg_class : Reg.t -> Reg.t -> bool = fun reg1 reg2 -> Int.equal (Proc.register_class reg1) (Proc.register_class reg2) +let interfering_reg_class : Reg.t -> Reg.t -> bool = + fun reg1 reg2 -> + let c1, c2 = Proc.register_class reg1, Proc.register_class reg2 in + Array.mem c1 ~set:(Proc.sibling_classes c2) + let make_temporary : same_class_and_base_name_as:Reg.t -> name_prefix:string -> Reg.t = fun ~same_class_and_base_name_as:reg ~name_prefix -> diff --git a/backend/regalloc/regalloc_utils.mli b/backend/regalloc/regalloc_utils.mli index d3b257b9dfb..95ab9e04624 100644 --- a/backend/regalloc/regalloc_utils.mli +++ b/backend/regalloc/regalloc_utils.mli @@ -92,6 +92,8 @@ end val same_reg_class : Reg.t -> Reg.t -> bool +val interfering_reg_class : Reg.t -> Reg.t -> bool + val make_temporary : same_class_and_base_name_as:Reg.t -> name_prefix:string -> Reg.t From aa0df1eb2ebe9820ef5158d7808158d6969c837d Mon Sep 17 00:00:00 2001 From: Max Slater Date: Fri, 16 Jun 2023 16:21:26 -0400 Subject: [PATCH 15/81] upstream allocator interference --- backend/coloring.ml | 36 ++++++++++++++++++++----------- backend/interf.ml | 6 +++++- backend/linscan.ml | 38 ++++++++++++++++++++++----------- backend/regalloc/regalloc_ls.ml | 1 + 4 files changed, 55 insertions(+), 26 deletions(-) diff --git a/backend/coloring.ml b/backend/coloring.ml index 9325289d443..c33794b4d14 100644 --- a/backend/coloring.ml +++ b/backend/coloring.ml @@ -102,16 +102,22 @@ let allocate_registers() = iter_preferred (fun r w -> match r.loc with - Reg n -> let n = n - first_reg in - if n < num_regs then - score.(n) <- score.(n) + w + Reg n -> (match Proc.reg_id_in_class ~reg:n ~in_class:cl with + | None -> () + | Some n -> + let n = n - first_reg in + if n < num_regs then + score.(n) <- score.(n) + w) | Unknown -> List.iter (fun neighbour -> match neighbour.loc with - Reg n -> let n = n - first_reg in - if n < num_regs then - score.(n) <- score.(n) - w + Reg n -> (match Proc.reg_id_in_class ~reg:n ~in_class:cl with + | None -> () + | Some n -> + let n = n - first_reg in + if n < num_regs then + score.(n) <- score.(n) - w) | _ -> ()) r.interf | _ -> ()) @@ -121,9 +127,12 @@ let allocate_registers() = (* Prohibit the registers that have been assigned to our neighbours *) begin match neighbour.loc with - Reg n -> let n = n - first_reg in - if n < num_regs then - score.(n) <- (-1000000) + Reg n -> (match Proc.reg_id_in_class ~reg:n ~in_class:cl with + | None -> () + | Some n -> + let n = n - first_reg in + if n < num_regs then + score.(n) <- (-1000000)) | _ -> () end; (* Avoid the registers that have been assigned to pseudoregs @@ -131,9 +140,12 @@ let allocate_registers() = iter_preferred (fun r w -> match r.loc with - Reg n -> let n = n - first_reg in - if n < num_regs then - score.(n) <- score.(n) - (w-1) + Reg n -> (match Proc.reg_id_in_class ~reg:n ~in_class:cl with + | None -> () + | Some n -> + let n = n - first_reg in + if n < num_regs then + score.(n) <- score.(n) - (w-1)) (* w-1 to break the symmetry when two conflicting regs have the same preference for a third reg. *) | _ -> ()) diff --git a/backend/interf.ml b/backend/interf.ml index c34eaa0a867..8781564804a 100644 --- a/backend/interf.ml +++ b/backend/interf.ml @@ -38,9 +38,13 @@ let build_graph fundecl = IntPairSet.clear mat; + let classes_intefere ri rj = + let ci, cj = Proc.register_class ri, Proc.register_class rj in + Array.mem ci (Proc.sibling_classes cj) in + (* Record an interference between two registers *) let add_interf ri rj = - if Proc.register_class ri = Proc.register_class rj then begin + if classes_intefere ri rj then begin let i = ri.stamp and j = rj.stamp in if i <> j then begin let p = if i < j then (i, j) else (j, i) in diff --git a/backend/linscan.ml b/backend/linscan.ml index 21416be23d7..33c86724c3a 100644 --- a/backend/linscan.ml +++ b/backend/linscan.ml @@ -90,12 +90,12 @@ let allocate_free_register num_stack_slots i = | Unknown, _ -> (* We need to allocate a register to this interval somehow *) let cl = Proc.register_class i.reg in + let sibling_classes = Proc.sibling_classes cl in begin match Proc.num_available_registers.(cl) with 0 -> (* There are no registers available for this class *) raise Not_found | rn -> - let ci = active.(cl) in let r0 = Proc.first_available_register.(cl) in (* Create register mask for this class note: if frame pointers are enabled then some registers may have @@ -104,21 +104,29 @@ let allocate_free_register num_stack_slots i = registers) *) let regmask = Array.make rn true in (* Remove all assigned registers from the register mask *) - List.iter - (function - {reg = {loc = Reg r}} -> - if r - r0 < rn then regmask.(r - r0) <- false - | _ -> ()) - ci.ci_active; + Array.iter (fun sibling_class -> + List.iter + (function + {reg = {loc = Reg r}} -> + (match Proc.reg_id_in_class ~reg:r ~in_class:cl with + | None -> () + | Some r -> regmask.(r - r0) <- false) + | _ -> ()) + active.(sibling_class).ci_active) sibling_classes; (* Remove all overlapping registers from the register mask *) let remove_bound_overlapping = function {reg = {loc = Reg r}} as j -> - if (r - r0 < rn) && regmask.(r - r0) - && Interval.overlap j i then - regmask.(r - r0) <- false + (match Proc.reg_id_in_class ~reg:r ~in_class:cl with + | None -> () + | Some r -> if regmask.(r - r0) && Interval.overlap j i then + regmask.(r - r0) <- false) | _ -> () in - List.iter remove_bound_overlapping ci.ci_inactive; - List.iter remove_bound_overlapping ci.ci_fixed; + Array.iter (fun sibling_class -> + List.iter remove_bound_overlapping active.(sibling_class).ci_inactive) + sibling_classes; + Array.iter (fun sibling_class -> + List.iter remove_bound_overlapping active.(sibling_class).ci_fixed) + sibling_classes; (* Assign the first free register (if any) *) let rec assign r = if r = rn then @@ -128,7 +136,10 @@ let allocate_free_register num_stack_slots i = current interval into the active list *) i.reg.loc <- Reg (r0 + r); i.reg.spill <- false; - ci.ci_active <- insert_interval_sorted i ci.ci_active + Array.iter (fun sibling_class -> + active.(sibling_class).ci_active <- + insert_interval_sorted i active.(sibling_class).ci_active) + sibling_classes end else assign (succ r) in assign 0 @@ -136,6 +147,7 @@ let allocate_free_register num_stack_slots i = | _ -> () end +(* CR mslater: (SIMD): update this? *) let allocate_blocked_register num_stack_slots i = let cl = Proc.register_class i.reg in let ci = active.(cl) in diff --git a/backend/regalloc/regalloc_ls.ml b/backend/regalloc/regalloc_ls.ml index 4acd6b58af1..d04e80b9280 100644 --- a/backend/regalloc/regalloc_ls.ml +++ b/backend/regalloc/regalloc_ls.ml @@ -177,6 +177,7 @@ let allocate_free_register : State.t -> Interval.t -> spilling_reg = assign 0) | (Reg _ | Stack _), _ -> Not_spilling +(* CR mslater: (SIMD): update this? *) let allocate_blocked_register : State.t -> Interval.t -> spilling_reg = fun state interval -> let reg = interval.reg in From 642a2d207277ab6c816033b8d1813cee23a0b325 Mon Sep 17 00:00:00 2001 From: Max Slater Date: Fri, 16 Jun 2023 16:22:26 -0400 Subject: [PATCH 16/81] arm build --- backend/arm64/proc.ml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/backend/arm64/proc.ml b/backend/arm64/proc.ml index 06b353b559e..dc5e6626600 100644 --- a/backend/arm64/proc.ml +++ b/backend/arm64/proc.ml @@ -86,6 +86,23 @@ let register_name r = let rotate_registers = true +let class_of reg = + if reg < 100 then 0 + else if reg < 200 then 1 + else Misc.fatal_errorf "Register of unknown class (%d)" reg + +let sibling_classes reg_class = + match reg_class with + | 0 -> [| 0 |] + | 1 -> [| 1 |] + | c -> Misc.fatal_errorf "Unspecified register class %d" reg_class + +let reg_id_in_class ~reg ~in_class = + let reg_class = class_of reg in + match reg_class, in_class with + | x, y when x = y -> Some reg + | _ -> None + (* Representation of hard registers by pseudo-registers *) let hard_int_reg = From 5d15a9c4a4d6939a72799aed580d279f5d048aec Mon Sep 17 00:00:00 2001 From: Max Slater Date: Tue, 20 Jun 2023 14:10:32 -0400 Subject: [PATCH 17/81] fix regalloc failures --- backend/linscan.ml | 6 ++++-- backend/regalloc/regalloc_ls.ml | 8 ++++++-- .../regalloc_validator/check_regalloc_validation.ml | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/backend/linscan.ml b/backend/linscan.ml index 33c86724c3a..b3aef70e32e 100644 --- a/backend/linscan.ml +++ b/backend/linscan.ml @@ -110,7 +110,8 @@ let allocate_free_register num_stack_slots i = {reg = {loc = Reg r}} -> (match Proc.reg_id_in_class ~reg:r ~in_class:cl with | None -> () - | Some r -> regmask.(r - r0) <- false) + | Some r -> + if r - r0 < rn then regmask.(r - r0) <- false) | _ -> ()) active.(sibling_class).ci_active) sibling_classes; (* Remove all overlapping registers from the register mask *) @@ -118,7 +119,8 @@ let allocate_free_register num_stack_slots i = {reg = {loc = Reg r}} as j -> (match Proc.reg_id_in_class ~reg:r ~in_class:cl with | None -> () - | Some r -> if regmask.(r - r0) && Interval.overlap j i then + | Some r -> + if r - r0 < rn && regmask.(r - r0) && Interval.overlap j i then regmask.(r - r0) <- false) | _ -> () in Array.iter (fun sibling_class -> diff --git a/backend/regalloc/regalloc_ls.ml b/backend/regalloc/regalloc_ls.ml index d04e80b9280..aa02a00161f 100644 --- a/backend/regalloc/regalloc_ls.ml +++ b/backend/regalloc/regalloc_ls.ml @@ -140,7 +140,9 @@ let allocate_free_register : State.t -> Interval.t -> spilling_reg = | Reg r -> ( match Proc.reg_id_in_class ~reg:r ~in_class:reg_class with | None -> () - | Some id -> available.(id - first_available) <- false) + | Some id -> + if id - first_available < num_available_registers then + available.(id - first_available) <- false) | Stack _ | Unknown -> ())); let remove_bound_overlapping (itv : Interval.t) : unit = match itv.reg.loc with @@ -148,7 +150,9 @@ let allocate_free_register : State.t -> Interval.t -> spilling_reg = match Proc.reg_id_in_class ~reg:r ~in_class:reg_class with | None -> () | Some id -> - if available.(id - first_available) && Interval.overlap itv interval + if id - first_available < num_available_registers && + available.(id - first_available) && + Interval.overlap itv interval then available.(id - first_available) <- false) | Stack _ | Unknown -> () in diff --git a/tests/backend/regalloc_validator/check_regalloc_validation.ml b/tests/backend/regalloc_validator/check_regalloc_validation.ml index 5764c1d2a63..c5f3728bdde 100644 --- a/tests/backend/regalloc_validator/check_regalloc_validation.ml +++ b/tests/backend/regalloc_validator/check_regalloc_validation.ml @@ -559,7 +559,7 @@ let () = cfg, cfg) ~exp_std:"fatal exception raised when validating description" ~exp_err: - ">> Fatal error: instruction 20 has a register (V/37) with an unknown \ + ">> Fatal error: instruction 20 has a register (V/53) with an unknown \ location" let () = From 6597a8bc110f68a4cce0a8b06a9eedb69f9b38bc Mon Sep 17 00:00:00 2001 From: Max Slater Date: Tue, 20 Jun 2023 14:44:26 -0400 Subject: [PATCH 18/81] format --- backend/regalloc/regalloc_ls.ml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/regalloc/regalloc_ls.ml b/backend/regalloc/regalloc_ls.ml index aa02a00161f..1e1ce3583ce 100644 --- a/backend/regalloc/regalloc_ls.ml +++ b/backend/regalloc/regalloc_ls.ml @@ -140,9 +140,9 @@ let allocate_free_register : State.t -> Interval.t -> spilling_reg = | Reg r -> ( match Proc.reg_id_in_class ~reg:r ~in_class:reg_class with | None -> () - | Some id -> - if id - first_available < num_available_registers then - available.(id - first_available) <- false) + | Some id -> + if id - first_available < num_available_registers + then available.(id - first_available) <- false) | Stack _ | Unknown -> ())); let remove_bound_overlapping (itv : Interval.t) : unit = match itv.reg.loc with @@ -150,9 +150,9 @@ let allocate_free_register : State.t -> Interval.t -> spilling_reg = match Proc.reg_id_in_class ~reg:r ~in_class:reg_class with | None -> () | Some id -> - if id - first_available < num_available_registers && - available.(id - first_available) && - Interval.overlap itv interval + if id - first_available < num_available_registers + && available.(id - first_available) + && Interval.overlap itv interval then available.(id - first_available) <- false) | Stack _ | Unknown -> () in From de369407f16b1379fae5d18c7aefe513a4a9ab17 Mon Sep 17 00:00:00 2001 From: Max Slater Date: Tue, 20 Jun 2023 17:59:20 -0400 Subject: [PATCH 19/81] add extcall test --- backend/amd64/emit.mlp | 11 +++----- backend/amd64/proc.ml | 10 +++++--- backend/linscan.ml | 1 - backend/reg.ml | 1 - backend/regalloc/regalloc_ls.ml | 1 - .../tests/unboxed-primitive-args/common.ml | 20 ++++++++++++++- .../tests/unboxed-primitive-args/common.mli | 1 + .../tests/unboxed-primitive-args/gen_test.ml | 25 +++++++++++++++++-- .../tests/unboxed-primitive-args/test.ml | 12 ++++++--- .../unboxed-primitive-args/test_common.c | 17 +++++++++++++ .../unboxed-primitive-args/test_common.h | 22 ++++++++++------ 11 files changed, 92 insertions(+), 29 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 3a6ac1af717..a31af57198e 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -89,8 +89,6 @@ let prologue_required = ref false let frame_required = ref false -(* CR mslater: (SIMD) alignment *) - let frame_size () = (* includes return address *) if !frame_required then begin let sz = @@ -110,9 +108,9 @@ let slot_offset loc cl = | Local n -> (!stack_offset + match cl with - | 0 -> n * 8 - | 1 -> n * 8 + num_stack_slots.(0) * 8 - | 2 -> n * 16 + num_stack_slots.(1) * 8 + num_stack_slots.(0) * 8 + | 2 -> n * 16 + | 1 -> n * 8 + num_stack_slots.(2) * 16 + | 0 -> n * 8 + num_stack_slots.(2) * 16 + num_stack_slots.(1) * 8 | _ -> Misc.fatal_error "Unknown register class") | Outgoing n -> n | Domainstate _ -> assert false (* not a stack slot *) @@ -718,7 +716,6 @@ let move (src : Reg.t) (dst : Reg.t) = | Float, Reg.Reg _, Float, Reg.Reg _ | Vec128, Reg.Reg _, Vec128, Reg.Reg _ -> I.movapd (reg src) (reg dst) | Vec128, _, Vec128, _ -> - (* CR mslater: (SIMD) alignment *) I.movupd (reg src) (reg dst) | Float, _, Float, _ -> I.movsd (reg src) (reg dst) | Float, _, Int, _ @@ -1020,7 +1017,6 @@ let emit_instr fallthrough i = | Thirtytwo_signed -> I.movsxd (addressing addr DWORD i 0) dest | Onetwentyeight -> - (* CR mslater: (SIMD) alignment *) I.movupd (addressing addr VEC128 i 0) dest | Single -> I.cvtss2sd (addressing addr REAL4 i 0) dest @@ -1038,7 +1034,6 @@ let emit_instr fallthrough i = | Thirtytwo_signed | Thirtytwo_unsigned -> I.mov (arg32 i 0) (addressing addr DWORD i 1) | Onetwentyeight -> - (* CR mslater: (SIMD) alignment *) I.movupd (arg i 0) (addressing addr VEC128 i 1) | Single -> I.cvtsd2ss (arg i 0) xmm15; diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index b5752967f8b..23e46d5f7f9 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -236,11 +236,12 @@ let calling_conventions first_int last_int first_float last_float first_vec128 l incr vec128; incr float end else begin - (* CR mslater: (SIMD) fix extcall stack alignment *) + ofs := Misc.align !ofs 16; loc.(i) <- stack_slot (make_stack !ofs) Vec128; ofs := !ofs + size_vec128 end done; + (* CR mslater: (SIMD) will need to be 32/64 if vec256/512 are used. *) (loc, Misc.align (max 0 !ofs) 16) (* keep stack 16-aligned *) let incoming ofs = @@ -324,11 +325,12 @@ let win64_loc_external_arguments arg = loc.(i) <- phys_reg win64_vec128_external_arguments.(!reg); incr reg end else begin - (* CR mslater: (SIMD) fix extcall stack alignment *) + ofs := Misc.align !ofs 16; loc.(i) <- stack_slot (Outgoing !ofs) Vec128; ofs := !ofs + size_vec128 end done; + (* CR mslater: (SIMD) will need to be 32/64 if vec256/512 are used. *) (loc, Misc.align !ofs 16) (* keep stack 16-aligned *) let loc_external_arguments ty_args = @@ -627,7 +629,9 @@ let max_register_pressure = let frame_required ~fun_contains_calls ~fun_num_stack_slots = fp || fun_contains_calls || - fun_num_stack_slots.(0) > 0 || fun_num_stack_slots.(1) > 0 + fun_num_stack_slots.(0) > 0 || + fun_num_stack_slots.(1) > 0 || + fun_num_stack_slots.(2) > 0 let prologue_required ~fun_contains_calls ~fun_num_stack_slots = frame_required ~fun_contains_calls ~fun_num_stack_slots diff --git a/backend/linscan.ml b/backend/linscan.ml index b3aef70e32e..4a765a2ae2f 100644 --- a/backend/linscan.ml +++ b/backend/linscan.ml @@ -149,7 +149,6 @@ let allocate_free_register num_stack_slots i = | _ -> () end -(* CR mslater: (SIMD): update this? *) let allocate_blocked_register num_stack_slots i = let cl = Proc.register_class i.reg in let ci = active.(cl) in diff --git a/backend/reg.ml b/backend/reg.ml index 4f030da9b78..6058f3e9a36 100644 --- a/backend/reg.ml +++ b/backend/reg.ml @@ -114,7 +114,6 @@ let clear_visited_marks () = let create ty = - (* CR mslater: (SIMD) should we start vector registers with a higher spill cost? *) let r = { raw_name = Raw_name.Anon; stamp = !currstamp; typ = ty; loc = Unknown; irc_work_list = Unknown_list; irc_color = None; irc_alias = None; diff --git a/backend/regalloc/regalloc_ls.ml b/backend/regalloc/regalloc_ls.ml index 1e1ce3583ce..d969aec2b87 100644 --- a/backend/regalloc/regalloc_ls.ml +++ b/backend/regalloc/regalloc_ls.ml @@ -181,7 +181,6 @@ let allocate_free_register : State.t -> Interval.t -> spilling_reg = assign 0) | (Reg _ | Stack _), _ -> Not_spilling -(* CR mslater: (SIMD): update this? *) let allocate_blocked_register : State.t -> Interval.t -> spilling_reg = fun state interval -> let reg = interval.reg in diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/common.ml b/ocaml/testsuite/tests/unboxed-primitive-args/common.ml index 19c0451e05c..98f19b5b373 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/common.ml +++ b/ocaml/testsuite/tests/unboxed-primitive-args/common.ml @@ -8,6 +8,7 @@ type 'a typ = | Int64 : int64 typ | Nativeint : nativeint typ | Float : float typ + | Vec128 : vec128 typ type 'a proto = | Ret : 'a typ -> 'a proto @@ -44,6 +45,10 @@ let expand_test = function Test (s, fn, a ** b ** c ** d ** e ** f ** Ret g) | T (s, fn, p) -> Test (s, fn, p) +external vec128_of_int64s : int64 -> int64 -> vec128 = "" "vec128_of_int64s" [@@noalloc] [@@unboxed] +external vec128_low_int64 : vec128 -> int64 = "" "vec128_low_int64" [@@noalloc] [@@unboxed] +external vec128_high_int64 : vec128 -> int64 = "" "vec128_high_int64" [@@noalloc] [@@unboxed] + let string_of : type a. a typ -> a -> string = function | Int -> Int.to_string | Int32 -> Printf.sprintf "%ldl" @@ -51,6 +56,8 @@ let string_of : type a. a typ -> a -> string = function | Nativeint -> Printf.sprintf "%ndn" | Float -> fun f -> Printf.sprintf "float_of_bits 0x%LxL" (Int64.bits_of_float f) + | Vec128 -> + fun v -> Printf.sprintf "vec128 %Ld:%Ld" (vec128_high_int64 v) (vec128_low_int64 v) let rec arity : type a. a proto -> int = function | Ret _ -> 0 @@ -59,7 +66,7 @@ let rec arity : type a. a proto -> int = function module Buffer = struct type t = (char, int8_unsigned_elt, c_layout) Array1.t - let arg_size = 8 + let arg_size = 16 let create ~arity : t = Array1.create char c_layout ((arity + 1) * arg_size) @@ -76,6 +83,14 @@ module Buffer = struct external set_int32 : t -> int -> int32 -> unit = "%caml_bigstring_set32" external set_int64 : t -> int -> int64 -> unit = "%caml_bigstring_set64" + let get_vec128 buf ~arg = + let low, high = get_int64 buf (arg * arg_size), get_int64 buf (arg * arg_size + 8) in + vec128_of_int64s low high + + let set_vec128 buf ~arg x = + set_int64 buf (arg * arg_size) (vec128_low_int64 x); + set_int64 buf ((arg * arg_size) + 8) (vec128_high_int64 x) + let get_int32 t ~arg = get_int32 t (arg * arg_size) let get_int64 t ~arg = get_int64 t (arg * arg_size) let set_int32 t ~arg x = set_int32 t (arg * arg_size) x @@ -110,6 +125,7 @@ module Buffer = struct | Int64 -> get_int64 | Nativeint -> get_nativeint | Float -> get_float + | Vec128 -> get_vec128 let set : type a. a typ -> t -> arg:int -> a -> unit = function | Int -> set_int @@ -117,6 +133,7 @@ module Buffer = struct | Int64 -> set_int64 | Nativeint -> set_nativeint | Float -> set_float + | Vec128 -> set_vec128 (* This is almost a memcpy except that we use get/set which should ensure that the values in [dst] don't overflow. *) @@ -161,6 +178,7 @@ let typ_size : type a. a typ -> int = function | Int64 -> 8 | Nativeint -> Sys.word_size / 8 | Float -> 8 + | Vec128 -> 16 let rec sizes : type a. a proto -> int list = function | Ret typ -> [typ_size typ] diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/common.mli b/ocaml/testsuite/tests/unboxed-primitive-args/common.mli index b7459bb1027..362ef4f916b 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/common.mli +++ b/ocaml/testsuite/tests/unboxed-primitive-args/common.mli @@ -5,6 +5,7 @@ type 'a typ = | Int64 : int64 typ | Nativeint : nativeint typ | Float : float typ + | Vec128 : vec128 typ type 'a proto = | Ret : 'a typ -> 'a proto diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/gen_test.ml b/ocaml/testsuite/tests/unboxed-primitive-args/gen_test.ml index 8f4b2dfe59d..80e11178296 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/gen_test.ml +++ b/ocaml/testsuite/tests/unboxed-primitive-args/gen_test.ml @@ -4,11 +4,14 @@ open StdLabels type boxed_integer = Pnativeint | Pint32 | Pint64 +type boxed_vector = Pvec128 + type native_repr = | Same_as_ocaml_repr | Unboxed_float | Unboxed_integer of boxed_integer | Untagged_int + | Unboxed_vector of boxed_vector (* Generate primitives with up to this number of arguments *) let test_all_combination_up_to_n_args = 6 @@ -27,6 +30,7 @@ let test_all_args_combination_of = [ Unboxed_float ; Unboxed_integer Pint32 ; Unboxed_integer Pint64 + ; Unboxed_vector Pvec128 ] let code_of_repr = function @@ -36,6 +40,7 @@ let code_of_repr = function | Unboxed_integer Pint64 -> "L" | Unboxed_integer Pnativeint -> "n" | Untagged_int -> "i" + | Unboxed_vector Pvec128 -> "x" (* for "xmm" *) let repr_of_code = function | 'v' -> Same_as_ocaml_repr @@ -44,6 +49,7 @@ let repr_of_code = function | 'L' -> Unboxed_integer Pint64 | 'n' -> Unboxed_integer Pnativeint | 'i' -> Untagged_int + | 'x' -> Unboxed_vector Pvec128 | _ -> assert false let manual_tests = @@ -53,10 +59,15 @@ let manual_tests = ; "L_L" ; "n_n" ; "i_i" + ; "x_x" ; "f_fffff" ; "f_ffffff" ; "f_fffffff" ; "f_fffffffffffffffff" + ; "x_xxxxx" + ; "x_xxxxxx" + ; "x_xxxxxxx" + ; "x_xxxxxxxxxxxxxxxxx" ; "v_iiiiiiiiiiiiiiiii" ; "v_lllllllllllllllll" ; "v_LLLLLLLLLLLLLLLLL" @@ -64,6 +75,11 @@ let manual_tests = ; "v_LiLiLiLiLiLiLiLiL" ; "v_flflflflflflflflflflflflflflflflflfl" ; "v_fLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfL" + ; "v_xfxfxfxfxfxfxfxfx" + ; "v_fxfxfxfxfxfxfxfxf" + ; "v_lfxlfxlfxlfxlfxlfx" + ; "v_lflxlxlflflxlxlflx" + ; "v_llllllfffffflxxllxx" ] let ocaml_type_of_repr = function @@ -74,6 +90,7 @@ let ocaml_type_of_repr = function | Unboxed_integer Pint64 -> "(int64 [@unboxed])" | Unboxed_integer Pnativeint -> "(nativeint [@unboxed])" | Untagged_int -> "(int [@untagged])" + | Unboxed_vector Pvec128 -> "(vec128 [@unboxed])" let ocaml_type_gadt_of_repr = function (* Doesn't really matters what we choose for this case *) @@ -83,6 +100,7 @@ let ocaml_type_gadt_of_repr = function | Unboxed_integer Pint64 -> "Int64" | Unboxed_integer Pnativeint -> "Nativeint" | Untagged_int -> "Int" + | Unboxed_vector Pvec128 -> "Vec128" let c_type_of_repr = function | Same_as_ocaml_repr -> "value" @@ -91,6 +109,7 @@ let c_type_of_repr = function | Unboxed_integer Pint64 -> "int64_t" | Unboxed_integer Pnativeint -> "intnat" | Untagged_int -> "intnat" + | Unboxed_vector Pvec128 -> "__m128i" type proto = { params : native_repr list @@ -205,7 +224,8 @@ let generate_stubs () = | Unboxed_integer Pint32 -> "set_int32(%d, x%d)" | Unboxed_integer Pint64 -> "set_int64(%d, x%d)" | Unboxed_integer Pnativeint -> "set_intnat(%d, x%d)" - | Untagged_int -> "set_intnat(%d, x%d)") + | Untagged_int -> "set_intnat(%d, x%d)" + | Unboxed_vector Pvec128 -> "set_vec128(%d, x%d)") i i); pr " return %(%d%);" (match proto.return with @@ -214,7 +234,8 @@ let generate_stubs () = | Unboxed_integer Pint32 -> "get_int32(%d)" | Unboxed_integer Pint64 -> "get_int64(%d)" | Unboxed_integer Pnativeint -> "get_intnat(%d)" - | Untagged_int -> "get_intnat(%d)") + | Untagged_int -> "get_intnat(%d)" + | Unboxed_vector Pvec128 -> "get_vec128(%d)") (List.length proto.params); pr "}" ) diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/test.ml b/ocaml/testsuite/tests/unboxed-primitive-args/test.ml index 49819fac412..d14ddc5f38e 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/test.ml +++ b/ocaml/testsuite/tests/unboxed-primitive-args/test.ml @@ -11,9 +11,13 @@ compiler_output = "stubs.c" *** ocaml arguments = "ml" compiler_output = "main.ml" -**** ocamlopt.opt -all_modules = "test_common.c stubs.c common.mli common.ml main.ml" -***** run -****** check-program-output +**** script +script = "${cc} -msse4.2 -c test_common.c -I ../../../../../../../../runtime" +***** script +script = "${cc} -msse4.2 -c stubs.c -I ../../../../../../../../runtime" +****** ocamlopt.opt +all_modules = "test_common.o stubs.o common.mli common.ml main.ml" +******* run +******** check-program-output *) diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c b/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c index c6b873c5147..687695dbfbd 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c +++ b/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c @@ -15,6 +15,8 @@ #include #include +#include +#include char *ocaml_buffer; char *c_buffer; @@ -35,3 +37,18 @@ double test_cleanup_float(void) { return 0.; } + +int64_t vec128_low_int64(__m128i v) +{ + return _mm_extract_epi64(v, 0); +} + +int64_t vec128_high_int64(__m128i v) +{ + return _mm_extract_epi64(v, 1); +} + +__m128i vec128_of_int64s(int64_t low, int64_t high) +{ + return _mm_set_epi64x(high, low); +} diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/test_common.h b/ocaml/testsuite/tests/unboxed-primitive-args/test_common.h index 2a1019ca398..fb3c08c86be 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/test_common.h +++ b/ocaml/testsuite/tests/unboxed-primitive-args/test_common.h @@ -16,6 +16,8 @@ #ifndef __TEST_COMMON_H #define __TEST_COMMON_H +#include + /* Where the OCaml side stores the arguments and result for a test case. The C function will read the result it is supposed to return from this buffer. @@ -31,14 +33,18 @@ extern char *ocaml_buffer; equal. */ extern char *c_buffer; -#define get_intnat(n) *(intnat*)(ocaml_buffer+((n)*8)) -#define get_int32(n) *(int32_t*)(ocaml_buffer+((n)*8)) -#define get_int64(n) *(int64_t*)(ocaml_buffer+((n)*8)) -#define get_double(n) *(double*)(ocaml_buffer+((n)*8)) +#define STRIDE 16 + +#define get_intnat(n) *(intnat*)(ocaml_buffer+((n)*STRIDE)) +#define get_int32(n) *(int32_t*)(ocaml_buffer+((n)*STRIDE)) +#define get_int64(n) *(int64_t*)(ocaml_buffer+((n)*STRIDE)) +#define get_double(n) *(double*)(ocaml_buffer+((n)*STRIDE)) +#define get_vec128(n) _mm_loadu_si128((__m128i*)(ocaml_buffer+((n)*STRIDE))) -#define set_intnat(n, x) *(intnat*)(c_buffer+((n)*8)) = (x) -#define set_int32(n, x) *(int32_t*)(c_buffer+((n)*8)) = (x) -#define set_int64(n, x) *(int64_t*)(c_buffer+((n)*8)) = (x) -#define set_double(n, x) *(double*)(c_buffer+((n)*8)) = (x) +#define set_intnat(n, x) *(intnat*)(c_buffer+((n)*STRIDE)) = (x) +#define set_int32(n, x) *(int32_t*)(c_buffer+((n)*STRIDE)) = (x) +#define set_int64(n, x) *(int64_t*)(c_buffer+((n)*STRIDE)) = (x) +#define set_double(n, x) *(double*)(c_buffer+((n)*STRIDE)) = (x) +#define set_vec128(n, x) _mm_storeu_si128((__m128i*)(c_buffer+((n)*STRIDE)), (x)) #endif /* __TEST_COMMON_H */ From 1cd32cbcd826d3aa0e027406ac7ba1e240c4973e Mon Sep 17 00:00:00 2001 From: Max Slater Date: Wed, 21 Jun 2023 16:17:55 -0400 Subject: [PATCH 20/81] fix unboxed primitive args test --- .../testsuite/tests/unboxed-primitive-args/common.ml | 12 ++++++++++-- .../tests/unboxed-primitive-args/test_common.c | 8 ++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/common.ml b/ocaml/testsuite/tests/unboxed-primitive-args/common.ml index 98f19b5b373..c69a020583a 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/common.ml +++ b/ocaml/testsuite/tests/unboxed-primitive-args/common.ml @@ -76,7 +76,15 @@ module Buffer = struct let length : t -> int = Array1.dim external init_c_side : ocaml_buffer:t -> c_buffer:t -> unit - = "test_set_buffers" + = "test_set_buffers" + + external compare_buffers : ocaml_buffer:t -> c_buffer:t -> bytes:int -> bool + = "test_compare_buffers" + + let byte_equal ~ocaml_buffer ~c_buffer = + let bytes = Array1.size_in_bytes ocaml_buffer in + assert (bytes = Array1.size_in_bytes c_buffer); + compare_buffers ~ocaml_buffer ~c_buffer ~bytes external get_int32 : t -> int -> int32 = "%caml_bigstring_get32" external get_int64 : t -> int -> int64 = "%caml_bigstring_get64" @@ -272,7 +280,7 @@ let run_test ~random_data ~ocaml_buffer ~c_buffer (Test (name, f, proto)) = Buffer.copy_args ~src:random_data ~dst:ocaml_buffer proto; cleanup_args_and_stack (); exec proto f ~ocaml_buffer ~c_buffer; - let success = ocaml_buffer = c_buffer in + let success = Buffer.byte_equal ~ocaml_buffer ~c_buffer in if not success then print_mismatch name proto ~ocaml_buffer ~c_buffer; success diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c b/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c index 687695dbfbd..7ece19092e9 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c +++ b/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c @@ -28,6 +28,14 @@ value test_set_buffers(value v_ocaml_buffer, value v_c_buffer) return Val_unit; } +value test_compare_buffers(value v_ocaml_buffer, value v_c_buffer, value bytes) +{ + intnat sz = Int_val(bytes); + char* ocaml_buffer = Caml_ba_data_val(v_ocaml_buffer); + char* c_buffer = Caml_ba_data_val(v_c_buffer); + return Val_bool(memcmp(ocaml_buffer, c_buffer, bytes)); +} + value test_cleanup_normal(void) { return Val_int(0); From aec9acb59bcf51609babc626f6539955bcd7e7ad Mon Sep 17 00:00:00 2001 From: Max Slater Date: Wed, 21 Jun 2023 16:46:46 -0400 Subject: [PATCH 21/81] edits --- backend/amd64/emit.mlp | 6 +++--- backend/amd64/proc.ml | 13 +++++++++++++ backend/cmm.ml | 20 ++++++++++---------- backend/x86_binary_emitter.ml | 14 ++++++++++---- 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index a31af57198e..90eaeb18bab 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -943,15 +943,15 @@ let emit_instr fallthrough i = I.xorpd (res i 0) (res i 0) | _ -> let lbl = add_float_constant f in - I.movsd (mem64_rip NONE (emit_label lbl)) (res i 0) + I.movsd (mem64_rip REAL8 (emit_label lbl)) (res i 0) end | Lop(Iconst_vec128 (v0, v1)) -> begin match (v0, v1) with - | 0x0000_0000_0000_0000L, 0x0000_0000_0000_0000L -> (* +0.0 *) + | 0x0000_0000_0000_0000L, 0x0000_0000_0000_0000L -> I.xorpd (res i 0) (res i 0) | _ -> let lbl = add_vec128_constant (v0, v1) in - I.movupd (mem64_rip NONE (emit_label lbl)) (res i 0) + I.movupd (mem64_rip VEC128 (emit_label lbl)) (res i 0) end | Lop(Iconst_symbol s) -> add_used_symbol s.sym_name; diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 23e46d5f7f9..c3ca3b4d807 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -130,6 +130,19 @@ let class_of reg = else if reg < 300 then 2 else Misc.fatal_errorf "Register of unknown class (%d)" reg +(* + Sibling classes refer to the same set of physical registers. + The number of available registers must be the same in all sibling classes, + and their ID ranges must not overlap. + + Here, both class 1 and class 2 refer to the set of `xmm` registers, + but are represented by different ID ranges. Class 1 is reserved for + floating point values and class 2 is reserved for 128-bit SIMD vectors. + This allows us to preserve sizing information based on the register IDs. + + The register allocators use the following two functions to check whether + allocating a register in one range must also consume an ID in another class. +*) let sibling_classes reg_class = match reg_class with | 0 -> [| 0 |] diff --git a/backend/cmm.ml b/backend/cmm.ml index a95a418d71c..045071d7551 100644 --- a/backend/cmm.ml +++ b/backend/cmm.ml @@ -31,10 +31,10 @@ let typ_vec128 = [|Vec128|] (** [machtype_component]s are partially ordered as follows: - Addr Vec128 - ^ ^ - | | - Val Float + Addr Float Vec128 + ^ + | + Val ^ | Int @@ -58,11 +58,11 @@ let lub_component comp1 comp2 = | Addr, Addr -> Addr | Addr, Val -> Addr | Float, Float -> Float - | Float, Vec128 -> Vec128 - | Vec128, Float -> Vec128 | Vec128, Vec128 -> Vec128 | (Int | Addr | Val), (Float | Vec128) - | (Float | Vec128), (Int | Addr | Val) -> + | (Float | Vec128), (Int | Addr | Val) + | Float, Vec128 + | Vec128, Float -> (* Float unboxing code must be sure to avoid this case. *) assert false @@ -78,11 +78,11 @@ let ge_component comp1 comp2 = | Addr, Addr -> true | Addr, Val -> true | Float, Float -> true - | Float, Vec128 -> false - | Vec128, Float -> true | Vec128, Vec128 -> true | (Int | Addr | Val), (Float | Vec128) - | (Float | Vec128), (Int | Addr | Val) -> + | (Float | Vec128), (Int | Addr | Val) + | Float, Vec128 + | Vec128, Float -> assert false type exttype = diff --git a/backend/x86_binary_emitter.ml b/backend/x86_binary_emitter.ml index 53f755859f0..30512c1e468 100644 --- a/backend/x86_binary_emitter.ml +++ b/backend/x86_binary_emitter.ml @@ -581,16 +581,22 @@ let emit_movapd b dst src = | ((Mem _ | Mem64_RIP _) as rm), Regf reg -> buf_int8 b 0x66; emit_mod_rm_reg b 0 [ 0x0f; 0x29 ] rm (rd_of_regf reg) + | Reg128 reg, ((Reg128 _ | Mem _ | Mem64_RIP _) as rm) -> + buf_int8 b 0x66; + emit_mod_rm_reg b 0 [ 0x0f; 0x28 ] rm (rd_of_regSIMD reg) + | ((Mem _ | Mem64_RIP _) as rm), Reg128 reg -> + buf_int8 b 0x66; + emit_mod_rm_reg b 0 [ 0x0f; 0x29 ] rm (rd_of_regSIMD reg) | _ -> assert false let emit_movupd b dst src = match (dst, src) with - | Regf reg, ((Regf _ | Mem _ | Mem64_RIP _) as rm) -> + | Reg128 reg, ((Reg128 _ | Mem _ | Mem64_RIP _) as rm) -> buf_int8 b 0x66; - emit_mod_rm_reg b 0 [ 0x0f; 0x10 ] rm (rd_of_regf reg) - | ((Mem _ | Mem64_RIP _) as rm), Regf reg -> + emit_mod_rm_reg b 0 [ 0x0f; 0x10 ] rm (rd_of_regSIMD reg) + | ((Mem _ | Mem64_RIP _) as rm), Reg128 reg -> buf_int8 b 0x66; - emit_mod_rm_reg b 0 [ 0x0f; 0x11 ] rm (rd_of_regf reg) + emit_mod_rm_reg b 0 [ 0x0f; 0x11 ] rm (rd_of_regSIMD reg) | _ -> assert false let emit_movd b ~dst ~src = From 87c007f184f9e5e113e03c4691e66681d45ef10f Mon Sep 17 00:00:00 2001 From: Max Slater Date: Wed, 21 Jun 2023 16:48:05 -0400 Subject: [PATCH 22/81] whitespace --- backend/cmm.ml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/cmm.ml b/backend/cmm.ml index 045071d7551..28b08ee64a6 100644 --- a/backend/cmm.ml +++ b/backend/cmm.ml @@ -31,10 +31,10 @@ let typ_vec128 = [|Vec128|] (** [machtype_component]s are partially ordered as follows: - Addr Float Vec128 - ^ - | - Val + Addr Float Vec128 + ^ + | + Val ^ | Int From e7226700e6d1a9b1ffd45f6ef17bf35ca3232e52 Mon Sep 17 00:00:00 2001 From: Max Slater Date: Thu, 22 Jun 2023 16:02:49 -0400 Subject: [PATCH 23/81] actual fix --- ocaml/runtime/amd64.S | 136 +++++++++--------- ocaml/runtime/amd64nt.asm | 68 ++++----- .../tests/unboxed-primitive-args/common.ml | 12 +- .../unboxed-primitive-args/test_common.c | 8 -- 4 files changed, 104 insertions(+), 120 deletions(-) diff --git a/ocaml/runtime/amd64.S b/ocaml/runtime/amd64.S index 15b8e8734dd..aeac005207c 100644 --- a/ocaml/runtime/amd64.S +++ b/ocaml/runtime/amd64.S @@ -347,23 +347,23 @@ LBL(caml_call_gc): /* Save young_ptr */ movq %r15, Caml_state(young_ptr) /* Save floating-point registers */ - subq $(16*8), %rsp; CFI_ADJUST (16*8); - movsd %xmm0, 0*8(%rsp) - movsd %xmm1, 1*8(%rsp) - movsd %xmm2, 2*8(%rsp) - movsd %xmm3, 3*8(%rsp) - movsd %xmm4, 4*8(%rsp) - movsd %xmm5, 5*8(%rsp) - movsd %xmm6, 6*8(%rsp) - movsd %xmm7, 7*8(%rsp) - movsd %xmm8, 8*8(%rsp) - movsd %xmm9, 9*8(%rsp) - movsd %xmm10, 10*8(%rsp) - movsd %xmm11, 11*8(%rsp) - movsd %xmm12, 12*8(%rsp) - movsd %xmm13, 13*8(%rsp) - movsd %xmm14, 14*8(%rsp) - movsd %xmm15, 15*8(%rsp) + subq $(16*16), %rsp; CFI_ADJUST (16*16); + movupd %xmm0, 0*16(%rsp) + movupd %xmm1, 1*16(%rsp) + movupd %xmm2, 2*16(%rsp) + movupd %xmm3, 3*16(%rsp) + movupd %xmm4, 4*16(%rsp) + movupd %xmm5, 5*16(%rsp) + movupd %xmm6, 6*16(%rsp) + movupd %xmm7, 7*16(%rsp) + movupd %xmm8, 8*16(%rsp) + movupd %xmm9, 9*16(%rsp) + movupd %xmm10, 10*16(%rsp) + movupd %xmm11, 11*16(%rsp) + movupd %xmm12, 12*16(%rsp) + movupd %xmm13, 13*16(%rsp) + movupd %xmm14, 14*16(%rsp) + movupd %xmm15, 15*16(%rsp) /* Call the garbage collector */ PREPARE_FOR_C_CALL call GCALL(caml_garbage_collection) @@ -371,23 +371,23 @@ LBL(caml_call_gc): /* Restore young_ptr */ movq Caml_state(young_ptr), %r15 /* Restore all regs used by the code generator */ - movsd 0*8(%rsp), %xmm0 - movsd 1*8(%rsp), %xmm1 - movsd 2*8(%rsp), %xmm2 - movsd 3*8(%rsp), %xmm3 - movsd 4*8(%rsp), %xmm4 - movsd 5*8(%rsp), %xmm5 - movsd 6*8(%rsp), %xmm6 - movsd 7*8(%rsp), %xmm7 - movsd 8*8(%rsp), %xmm8 - movsd 9*8(%rsp), %xmm9 - movsd 10*8(%rsp), %xmm10 - movsd 11*8(%rsp), %xmm11 - movsd 12*8(%rsp), %xmm12 - movsd 13*8(%rsp), %xmm13 - movsd 14*8(%rsp), %xmm14 - movsd 15*8(%rsp), %xmm15 - addq $(16*8), %rsp; CFI_ADJUST(-16*8) + movupd 0*16(%rsp), %xmm0 + movupd 1*16(%rsp), %xmm1 + movupd 2*16(%rsp), %xmm2 + movupd 3*16(%rsp), %xmm3 + movupd 4*16(%rsp), %xmm4 + movupd 5*16(%rsp), %xmm5 + movupd 6*16(%rsp), %xmm6 + movupd 7*16(%rsp), %xmm7 + movupd 8*16(%rsp), %xmm8 + movupd 9*16(%rsp), %xmm9 + movupd 10*16(%rsp), %xmm10 + movupd 11*16(%rsp), %xmm11 + movupd 12*16(%rsp), %xmm12 + movupd 13*16(%rsp), %xmm13 + movupd 14*16(%rsp), %xmm14 + movupd 15*16(%rsp), %xmm15 + addq $(16*16), %rsp; CFI_ADJUST(-16*16) popq %rax; CFI_ADJUST(-8) popq %rbx; CFI_ADJUST(-8) popq %rdi; CFI_ADJUST(-8) @@ -476,23 +476,23 @@ FUNCTION(G(caml_call_local_realloc)) /* Save young_ptr */ movq %r15, Caml_state(young_ptr) /* Save floating-point registers */ - subq $(16*8), %rsp; CFI_ADJUST (16*8); - movsd %xmm0, 0*8(%rsp) - movsd %xmm1, 1*8(%rsp) - movsd %xmm2, 2*8(%rsp) - movsd %xmm3, 3*8(%rsp) - movsd %xmm4, 4*8(%rsp) - movsd %xmm5, 5*8(%rsp) - movsd %xmm6, 6*8(%rsp) - movsd %xmm7, 7*8(%rsp) - movsd %xmm8, 8*8(%rsp) - movsd %xmm9, 9*8(%rsp) - movsd %xmm10, 10*8(%rsp) - movsd %xmm11, 11*8(%rsp) - movsd %xmm12, 12*8(%rsp) - movsd %xmm13, 13*8(%rsp) - movsd %xmm14, 14*8(%rsp) - movsd %xmm15, 15*8(%rsp) + subq $(16*16), %rsp; CFI_ADJUST (16*16); + movupd %xmm0, 0*16(%rsp) + movupd %xmm1, 1*16(%rsp) + movupd %xmm2, 2*16(%rsp) + movupd %xmm3, 3*16(%rsp) + movupd %xmm4, 4*16(%rsp) + movupd %xmm5, 5*16(%rsp) + movupd %xmm6, 6*16(%rsp) + movupd %xmm7, 7*16(%rsp) + movupd %xmm8, 8*16(%rsp) + movupd %xmm9, 9*16(%rsp) + movupd %xmm10, 10*16(%rsp) + movupd %xmm11, 11*16(%rsp) + movupd %xmm12, 12*16(%rsp) + movupd %xmm13, 13*16(%rsp) + movupd %xmm14, 14*16(%rsp) + movupd %xmm15, 15*16(%rsp) /* Call the garbage collector */ PREPARE_FOR_C_CALL call GCALL(caml_local_realloc) @@ -500,23 +500,23 @@ FUNCTION(G(caml_call_local_realloc)) /* Restore young_ptr */ movq Caml_state(young_ptr), %r15 /* Restore all regs used by the code generator */ - movsd 0*8(%rsp), %xmm0 - movsd 1*8(%rsp), %xmm1 - movsd 2*8(%rsp), %xmm2 - movsd 3*8(%rsp), %xmm3 - movsd 4*8(%rsp), %xmm4 - movsd 5*8(%rsp), %xmm5 - movsd 6*8(%rsp), %xmm6 - movsd 7*8(%rsp), %xmm7 - movsd 8*8(%rsp), %xmm8 - movsd 9*8(%rsp), %xmm9 - movsd 10*8(%rsp), %xmm10 - movsd 11*8(%rsp), %xmm11 - movsd 12*8(%rsp), %xmm12 - movsd 13*8(%rsp), %xmm13 - movsd 14*8(%rsp), %xmm14 - movsd 15*8(%rsp), %xmm15 - addq $(16*8), %rsp; CFI_ADJUST(-16*8) + movupd 0*16(%rsp), %xmm0 + movupd 1*16(%rsp), %xmm1 + movupd 2*16(%rsp), %xmm2 + movupd 3*16(%rsp), %xmm3 + movupd 4*16(%rsp), %xmm4 + movupd 5*16(%rsp), %xmm5 + movupd 6*16(%rsp), %xmm6 + movupd 7*16(%rsp), %xmm7 + movupd 8*16(%rsp), %xmm8 + movupd 9*16(%rsp), %xmm9 + movupd 10*16(%rsp), %xmm10 + movupd 11*16(%rsp), %xmm11 + movupd 12*16(%rsp), %xmm12 + movupd 13*16(%rsp), %xmm13 + movupd 14*16(%rsp), %xmm14 + movupd 15*16(%rsp), %xmm15 + addq $(16*16), %rsp; CFI_ADJUST(-16*16) popq %rax; CFI_ADJUST(-8) popq %rbx; CFI_ADJUST(-8) popq %rdi; CFI_ADJUST(-8) diff --git a/ocaml/runtime/amd64nt.asm b/ocaml/runtime/amd64nt.asm index 9185d06787d..3a90239cb47 100644 --- a/ocaml/runtime/amd64nt.asm +++ b/ocaml/runtime/amd64nt.asm @@ -69,45 +69,45 @@ caml_call_gc: push rax Store_gc_regs rsp ; Save floating-point registers - sub rsp, 16*8 - movsd QWORD PTR [rsp + 0*8], xmm0 - movsd QWORD PTR [rsp + 1*8], xmm1 - movsd QWORD PTR [rsp + 2*8], xmm2 - movsd QWORD PTR [rsp + 3*8], xmm3 - movsd QWORD PTR [rsp + 4*8], xmm4 - movsd QWORD PTR [rsp + 5*8], xmm5 - movsd QWORD PTR [rsp + 6*8], xmm6 - movsd QWORD PTR [rsp + 7*8], xmm7 - movsd QWORD PTR [rsp + 8*8], xmm8 - movsd QWORD PTR [rsp + 9*8], xmm9 - movsd QWORD PTR [rsp + 10*8], xmm10 - movsd QWORD PTR [rsp + 11*8], xmm11 - movsd QWORD PTR [rsp + 12*8], xmm12 - movsd QWORD PTR [rsp + 13*8], xmm13 - movsd QWORD PTR [rsp + 14*8], xmm14 - movsd QWORD PTR [rsp + 15*8], xmm15 + sub rsp, 16*16 + movupd QWORD PTR [rsp + 0*16], xmm0 + movupd QWORD PTR [rsp + 1*16], xmm1 + movupd QWORD PTR [rsp + 2*16], xmm2 + movupd QWORD PTR [rsp + 3*16], xmm3 + movupd QWORD PTR [rsp + 4*16], xmm4 + movupd QWORD PTR [rsp + 5*16], xmm5 + movupd QWORD PTR [rsp + 6*16], xmm6 + movupd QWORD PTR [rsp + 7*16], xmm7 + movupd QWORD PTR [rsp + 8*16], xmm8 + movupd QWORD PTR [rsp + 9*16], xmm9 + movupd QWORD PTR [rsp + 10*16], xmm10 + movupd QWORD PTR [rsp + 11*16], xmm11 + movupd QWORD PTR [rsp + 12*16], xmm12 + movupd QWORD PTR [rsp + 13*16], xmm13 + movupd QWORD PTR [rsp + 14*16], xmm14 + movupd QWORD PTR [rsp + 15*16], xmm15 ; Call the garbage collector sub rsp, 32 ; PR#5008: bottom 32 bytes are reserved for callee call caml_garbage_collection add rsp, 32 ; PR#5008 ; Restore all regs used by the code generator - movsd xmm0, QWORD PTR [rsp + 0*8] - movsd xmm1, QWORD PTR [rsp + 1*8] - movsd xmm2, QWORD PTR [rsp + 2*8] - movsd xmm3, QWORD PTR [rsp + 3*8] - movsd xmm4, QWORD PTR [rsp + 4*8] - movsd xmm5, QWORD PTR [rsp + 5*8] - movsd xmm6, QWORD PTR [rsp + 6*8] - movsd xmm7, QWORD PTR [rsp + 7*8] - movsd xmm8, QWORD PTR [rsp + 8*8] - movsd xmm9, QWORD PTR [rsp + 9*8] - movsd xmm10, QWORD PTR [rsp + 10*8] - movsd xmm11, QWORD PTR [rsp + 11*8] - movsd xmm12, QWORD PTR [rsp + 12*8] - movsd xmm13, QWORD PTR [rsp + 13*8] - movsd xmm14, QWORD PTR [rsp + 14*8] - movsd xmm15, QWORD PTR [rsp + 15*8] - add rsp, 16*8 + movupd xmm0, QWORD PTR [rsp + 0*16] + movupd xmm1, QWORD PTR [rsp + 1*16] + movupd xmm2, QWORD PTR [rsp + 2*16] + movupd xmm3, QWORD PTR [rsp + 3*16] + movupd xmm4, QWORD PTR [rsp + 4*16] + movupd xmm5, QWORD PTR [rsp + 5*16] + movupd xmm6, QWORD PTR [rsp + 6*16] + movupd xmm7, QWORD PTR [rsp + 7*16] + movupd xmm8, QWORD PTR [rsp + 8*16] + movupd xmm9, QWORD PTR [rsp + 9*16] + movupd xmm10, QWORD PTR [rsp + 10*16] + movupd xmm11, QWORD PTR [rsp + 11*16] + movupd xmm12, QWORD PTR [rsp + 12*16] + movupd xmm13, QWORD PTR [rsp + 13*16] + movupd xmm14, QWORD PTR [rsp + 14*16] + movupd xmm15, QWORD PTR [rsp + 15*16] + add rsp, 16*16 pop rax pop rbx pop rdi diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/common.ml b/ocaml/testsuite/tests/unboxed-primitive-args/common.ml index c69a020583a..98f19b5b373 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/common.ml +++ b/ocaml/testsuite/tests/unboxed-primitive-args/common.ml @@ -76,15 +76,7 @@ module Buffer = struct let length : t -> int = Array1.dim external init_c_side : ocaml_buffer:t -> c_buffer:t -> unit - = "test_set_buffers" - - external compare_buffers : ocaml_buffer:t -> c_buffer:t -> bytes:int -> bool - = "test_compare_buffers" - - let byte_equal ~ocaml_buffer ~c_buffer = - let bytes = Array1.size_in_bytes ocaml_buffer in - assert (bytes = Array1.size_in_bytes c_buffer); - compare_buffers ~ocaml_buffer ~c_buffer ~bytes + = "test_set_buffers" external get_int32 : t -> int -> int32 = "%caml_bigstring_get32" external get_int64 : t -> int -> int64 = "%caml_bigstring_get64" @@ -280,7 +272,7 @@ let run_test ~random_data ~ocaml_buffer ~c_buffer (Test (name, f, proto)) = Buffer.copy_args ~src:random_data ~dst:ocaml_buffer proto; cleanup_args_and_stack (); exec proto f ~ocaml_buffer ~c_buffer; - let success = Buffer.byte_equal ~ocaml_buffer ~c_buffer in + let success = ocaml_buffer = c_buffer in if not success then print_mismatch name proto ~ocaml_buffer ~c_buffer; success diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c b/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c index 7ece19092e9..687695dbfbd 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c +++ b/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c @@ -28,14 +28,6 @@ value test_set_buffers(value v_ocaml_buffer, value v_c_buffer) return Val_unit; } -value test_compare_buffers(value v_ocaml_buffer, value v_c_buffer, value bytes) -{ - intnat sz = Int_val(bytes); - char* ocaml_buffer = Caml_ba_data_val(v_ocaml_buffer); - char* c_buffer = Caml_ba_data_val(v_c_buffer); - return Val_bool(memcmp(ocaml_buffer, c_buffer, bytes)); -} - value test_cleanup_normal(void) { return Val_int(0); From 1a237936df060482dde79b3379790a58fdf1140b Mon Sep 17 00:00:00 2001 From: Max Slater Date: Fri, 23 Jun 2023 14:00:08 -0400 Subject: [PATCH 24/81] add fail cases in ocaml/ --- ocaml/asmcomp/cmm_helpers.ml | 6 +++++- ocaml/asmcomp/cmmgen.ml | 14 ++++++++++++-- ocaml/middle_end/clambda_primitives.ml | 1 + ocaml/middle_end/clambda_primitives.mli | 1 + ocaml/middle_end/closure/closure.ml | 3 ++- ocaml/middle_end/printclambda.ml | 1 + 6 files changed, 22 insertions(+), 4 deletions(-) diff --git a/ocaml/asmcomp/cmm_helpers.ml b/ocaml/asmcomp/cmm_helpers.ml index 87398c9785b..52259433e25 100644 --- a/ocaml/asmcomp/cmm_helpers.ml +++ b/ocaml/asmcomp/cmm_helpers.ml @@ -919,6 +919,8 @@ module Extended_machtype = struct (* Only 64-bit architectures, so this is always [typ_int] *) typ_any_int | Pvalue Pintval -> typ_tagged_int + | Punboxed_vector _ -> + Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." | Pvalue _ -> typ_val end @@ -3281,7 +3283,9 @@ let kind_of_layout (layout : Lambda.layout) = match layout with | Pvalue Pfloatval -> Boxed_float | Pvalue (Pboxedintval bi) -> Boxed_integer bi + | Pvalue (Pboxedvectorval _) -> + Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." | Pvalue (Pgenval | Pintval | Pvariant _ | Parrayval _) - | Ptop | Pbottom | Punboxed_float | Punboxed_int _ -> Any + | Ptop | Pbottom | Punboxed_float | Punboxed_int _ | Punboxed_vector _ -> Any let make_tuple l = match l with [e] -> e | _ -> Ctuple l diff --git a/ocaml/asmcomp/cmmgen.ml b/ocaml/asmcomp/cmmgen.ml index 616d86a5152..7c46367962a 100644 --- a/ocaml/asmcomp/cmmgen.ml +++ b/ocaml/asmcomp/cmmgen.ml @@ -124,6 +124,8 @@ let get_field env layout ptr n dbg = | Pvalue Pintval | Punboxed_int _ -> Word_int | Pvalue _ -> Word_val | Punboxed_float -> Double + | Punboxed_vector _ -> + Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." | Ptop -> Misc.fatal_errorf "get_field with Ptop: %a" Debuginfo.print_compact dbg | Pbottom -> @@ -228,6 +230,8 @@ let emit_structured_constant ((_sym, is_global) as symb) cst cont = emit_int64_constant symb n cont | Uconst_nativeint n -> emit_nativeint_constant symb n cont + | Uconst_vec128 _ -> + Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." | Uconst_block (tag, csts) -> let cont = List.fold_right emit_constant csts cont in emit_block symb (block_header tag (List.length csts)) cont @@ -838,6 +842,8 @@ and transl_ccall env prim args dbg = | Pint32 -> XInt32 | Pint64 -> XInt64 in (xty, transl_unbox_int dbg env bi arg) + | Unboxed_vector _ -> + Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." | Untagged_int -> (XInt, untag_int (transl env arg) dbg) in @@ -863,6 +869,8 @@ and transl_ccall env prim args dbg = ([|Int; Int|], box_int dbg Pint64 alloc_heap) | _, Unboxed_integer bi -> (typ_int, box_int dbg bi alloc_heap) | _, Untagged_int -> (typ_int, (fun i -> tag_int i dbg)) + | _, Unboxed_vector _ -> + Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." in let typ_args, args = transl_args prim.prim_native_repr_args args in wrap_result @@ -1236,7 +1244,9 @@ and transl_let_value env str (kind : Lambda.value_kind) id exp transl_body = Boxed (Boxed_float (alloc_heap, dbg), false) | Mutable, Pboxedintval bi -> Boxed (Boxed_integer (bi, alloc_heap, dbg), false) - | _, (Pfloatval | Pboxedintval _) -> + | Mutable, Pboxedvectorval _ -> + Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." + | _, (Pfloatval | Pboxedintval _ | Pboxedvectorval _) -> (* It would be safe to always unbox in this case, but we do it only if this indeed allows us to get rid of some allocations in the bound expression. *) @@ -1282,7 +1292,7 @@ and transl_let env str (layout : Lambda.layout) id exp transl_body = there may be constant closures inside that need lifting out. *) let _cbody : expression = transl_body env in cexp - | Punboxed_float | Punboxed_int _ -> begin + | Punboxed_float | Punboxed_int _ | Punboxed_vector _ -> begin let cexp = transl env exp in let cbody = transl_body env in match str with diff --git a/ocaml/middle_end/clambda_primitives.ml b/ocaml/middle_end/clambda_primitives.ml index 6dd081c973e..b2f2b908ead 100644 --- a/ocaml/middle_end/clambda_primitives.ml +++ b/ocaml/middle_end/clambda_primitives.ml @@ -158,6 +158,7 @@ and value_kind = Lambda.value_kind = non_consts : (int * value_kind list) list; } | Parrayval of array_kind + | Pboxedvectorval of boxed_vector and layout = Lambda.layout = | Ptop diff --git a/ocaml/middle_end/clambda_primitives.mli b/ocaml/middle_end/clambda_primitives.mli index 0f2fe8f7535..06bd54fd94c 100644 --- a/ocaml/middle_end/clambda_primitives.mli +++ b/ocaml/middle_end/clambda_primitives.mli @@ -161,6 +161,7 @@ and value_kind = Lambda.value_kind = non_consts : (int * value_kind list) list; } | Parrayval of array_kind + | Pboxedvectorval of boxed_vector and layout = Lambda.layout = | Ptop diff --git a/ocaml/middle_end/closure/closure.ml b/ocaml/middle_end/closure/closure.ml index c3f3e413a4d..93e8b142d0e 100644 --- a/ocaml/middle_end/closure/closure.ml +++ b/ocaml/middle_end/closure/closure.ml @@ -65,7 +65,8 @@ let is_gc_ignorable kind = | Punboxed_int _ -> true | Punboxed_vector _ -> true | Pvalue Pintval -> true - | Pvalue (Pgenval | Pfloatval | Pboxedintval _ | Pvariant _ | Parrayval _) -> false + | Pvalue (Pgenval | Pfloatval | Pboxedintval _ | Pvariant _ | Parrayval _ | + Pboxedvectorval _) -> false let split_closure_fv kinds fv = List.fold_right (fun id (not_scanned, scanned) -> diff --git a/ocaml/middle_end/printclambda.ml b/ocaml/middle_end/printclambda.ml index 8be9fe7f56e..efe81994d85 100644 --- a/ocaml/middle_end/printclambda.ml +++ b/ocaml/middle_end/printclambda.ml @@ -37,6 +37,7 @@ let rec value_kind0 ppf kind = | Pboxedintval Pnativeint -> Format.pp_print_string ppf ":nativeint" | Pboxedintval Pint32 -> Format.pp_print_string ppf ":int32" | Pboxedintval Pint64 -> Format.pp_print_string ppf ":int64" + | Pboxedvectorval Pvec128 -> Format.pp_print_string ppf ":vec128" | Pvariant { consts; non_consts } -> Format.fprintf ppf "@[[(consts (%a))@ (non_consts (%a))]@]" (Format.pp_print_list ~pp_sep:Format.pp_print_space Format.pp_print_int) From e0f152e7804b17a38155996f2bf7ad1ffc428775 Mon Sep 17 00:00:00 2001 From: Max Slater Date: Fri, 23 Jun 2023 14:48:51 -0400 Subject: [PATCH 25/81] bootstrap --- ocaml/boot/ocamlc | Bin 3483361 -> 3493007 bytes ocaml/boot/ocamllex | Bin 372351 -> 372351 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ocaml/boot/ocamlc b/ocaml/boot/ocamlc index 658409231c056a4477eb76ea577eebf1ba9dc562..986ca1dc099c9a497881731a9c194fb2f6bd34b8 100755 GIT binary patch delta 257240 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 delta 253928 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%0DwH^g6 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

#6Q4KsZDTN>^zERk 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 diff --git a/ocaml/boot/ocamllex b/ocaml/boot/ocamllex index 615aff5832ebf28121e6f6dca1b62ac7b315503d..1468e16014cee0a78d7de92f324c85bc5735dfa0 100755 GIT binary patch delta 1040 zcmex=N9_L{v4$4L7N!>F7M3lnc8lsm-5nek>-v|L#OJ5Q=ceZ77gdHiTyR)y;F(vJ zn3I_jpIDS$nwy$e67KBa=(JefEip5vv?w*g=>kxZreA(Zd|G~KUP`1J&=}3&%HsIc zqN4nwC`X{IwrgGr$kepVoYZI+pl;{I1}>RpnZ=p;dGSe=@l~ls`Svlc7eFTI1(zfy zXUFH4r52^-^ zx_EW_cJUgWOHL0}6Jza{Q~!R|mA$;GsL_K`~M+Wxk9V=MX1yX;BuC+AQ5f8ZF zM6P@4^`-ypnlDcEkNYxo7Ec#k$tohy|GHE7_f;Ry&6<3tEfyJEo^HC5wM*dV`ajAB zo#vm(RB>+}ZJSr@w4( zQp?}zpI5QE3H%F}>v$S@Mf1qoP#)>%X36QEt63EV3iQ}}KUCLyJ}$Q`WtfoCJH2W( zt7SmR`RFA}9j9n^yg2|~gEiJXkpoS&+xn8of`Loj#Tvknws9c}} zSCF5dV;~rNX4_egcMtWJPn)`U8Y|y)<~6KQ?q{~XUwFt;^V46K2j02vQ-ctGaV$zV zPzx))K2!Vj#SPL`K}TkP+_*puVx+<8{@o8vr~37~O`Nw&ICz@;^d)OpRqEAyk3}-c zB=T|S&oB?W7N5hn-2r(iLH`b6HPqUZCcaT9KZbXCUx0qR;<(>W;{o zEBo#pWjnP%6(|Ape)b{06+4}OTIh%A@U%(4Tx2pmbSlTDmgm8VE52@RF7M3lnc8lsm+#MVj>-v|L#OJ5Q=ceZ77gdHjTyR)y;F(vJ zn3I_jpIDS$nwy$e66WmS=(JefEip5vv?w*)=>kxZreA(Zd|G~KUP^=;&=}3&%HsIc zqN4nwNJpTowrgGr$kepVoYW{6pl;{I1}>RpnZ=p;dGSe=@l~ls`S#JS7eFTI1(zfy zXUFH4r52^-j_flSX`W11hf?5jJWB47O^TY#&4Hh z%({VDAiDjZ?*!{qA%(Ql4ciif?5E#d#_A&waBhiI0BeA;os#?CxQEN5rduv&)etCl zE3w+~V0F~qJx*SkC-{C%FI>+0#8}q*O0~!zvqhhM&L2-*w{rOcgW!^soXn*7_<*9! zypq(4WP_PT7Y%1^);Of3>RH)SroC}`#|l<;0l#LsK!Ggbr(wn)!WT$4IZxleg4Ic& zXf1c6&q>iqEL%TMvDa9mFkNsZtB8Ow^FqD~2d>ksVls6*vz6~nH(klvCBX11{YUeW zgF9FGl?40GQg)esekH5EpQ`azc4ecBjc-=8uVq!4GIxP4%t4-cCB{Yued!-=_mwhr zdR$!|S#9O;c!4&Oya7w(I|=q5$9woc%~2eGh$X?&;NI`S-*A zp491|SFySYELg;UE$YrqbBR~?+&Gu_vQPJ1&8jG1UM#^Jv*WYH4CcZfWwt#U)2mjq zS_Z5sTD()V^~jSrV<}}4|%8ZNd9ohb&c7YCD zL4JOYf%zY%llvIB6Y_;_2tO*GoIjm;4QrIUWpCh)?RIBf9{;-3{cYl_uL!?57Nr|_ zy*trj%<%X<$H9{IskW`E3)CP+8q8R>YxR4*sp}=4URw9#_GOV+Te)bBKyGPm=R z*DllPA0`Cwh|E}^2~6Y#r6oz3#ReaGdUi8gW*Q1#T6bSME4zGw8br>3cZ& z>X{!tGW=Pf3X}kP|C}`6q!^jq0%d9PHW!KwvDm`V-mDl}pu+`~)N++s{v|K7X!VZn68#jL{9)z+~_ F0szDpy&C`k From 76713371ebc01b613617ae29dff7b5222b0f2e16 Mon Sep 17 00:00:00 2001 From: Max Slater Date: Fri, 23 Jun 2023 15:57:05 -0400 Subject: [PATCH 26/81] move simd tests out of ocaml --- ocaml/Makefile.common-jst | 3 + .../tests/unboxed-primitive-args/common.ml | 20 +- .../tests/unboxed-primitive-args/common.mli | 1 - .../tests/unboxed-primitive-args/gen_test.ml | 25 +- .../tests/unboxed-primitive-args/test.ml | 12 +- .../unboxed-primitive-args/test_common.c | 17 - .../unboxed-primitive-args/test_common.h | 22 +- .../poll_attr_both.compilers.reference | 1 - testsuite/tests/unboxed-primitive-args/README | 26 ++ .../tests/unboxed-primitive-args/common.ml | 304 ++++++++++++++++++ .../tests/unboxed-primitive-args/common.mli | 30 ++ .../tests/unboxed-primitive-args/gen_test.ml | 249 ++++++++++++++ .../tests/unboxed-primitive-args/test.ml | 23 ++ .../unboxed-primitive-args/test.reference | 0 .../unboxed-primitive-args/test_common.c | 54 ++++ .../unboxed-primitive-args/test_common.h | 50 +++ 16 files changed, 754 insertions(+), 83 deletions(-) create mode 100644 testsuite/tests/unboxed-primitive-args/README create mode 100644 testsuite/tests/unboxed-primitive-args/common.ml create mode 100644 testsuite/tests/unboxed-primitive-args/common.mli create mode 100644 testsuite/tests/unboxed-primitive-args/gen_test.ml create mode 100644 testsuite/tests/unboxed-primitive-args/test.ml create mode 100644 testsuite/tests/unboxed-primitive-args/test.reference create mode 100644 testsuite/tests/unboxed-primitive-args/test_common.c create mode 100644 testsuite/tests/unboxed-primitive-args/test_common.h diff --git a/ocaml/Makefile.common-jst b/ocaml/Makefile.common-jst index a9f46fe2315..acd7a7689db 100644 --- a/ocaml/Makefile.common-jst +++ b/ocaml/Makefile.common-jst @@ -198,6 +198,9 @@ install_for_test: _install # replace backend-specific testsuite/tests/asmgen with their new versions rm _runtest/testsuite/tests/asmgen/* cp -a testsuite/tests/asmgen/* _runtest/testsuite/tests/asmgen/ + # replace backend-specific testsuite/tests/unboxed-primitive-args with their new versions + rm _runtest/testsuite/tests/unboxed-primitive-args/* + cp -a testsuite/tests/unboxed-primitive-args/* _runtest/testsuite/tests/unboxed-primitive-args/ cp $(ocamldir)/Makefile.* _runtest/ diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/common.ml b/ocaml/testsuite/tests/unboxed-primitive-args/common.ml index 98f19b5b373..19c0451e05c 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/common.ml +++ b/ocaml/testsuite/tests/unboxed-primitive-args/common.ml @@ -8,7 +8,6 @@ type 'a typ = | Int64 : int64 typ | Nativeint : nativeint typ | Float : float typ - | Vec128 : vec128 typ type 'a proto = | Ret : 'a typ -> 'a proto @@ -45,10 +44,6 @@ let expand_test = function Test (s, fn, a ** b ** c ** d ** e ** f ** Ret g) | T (s, fn, p) -> Test (s, fn, p) -external vec128_of_int64s : int64 -> int64 -> vec128 = "" "vec128_of_int64s" [@@noalloc] [@@unboxed] -external vec128_low_int64 : vec128 -> int64 = "" "vec128_low_int64" [@@noalloc] [@@unboxed] -external vec128_high_int64 : vec128 -> int64 = "" "vec128_high_int64" [@@noalloc] [@@unboxed] - let string_of : type a. a typ -> a -> string = function | Int -> Int.to_string | Int32 -> Printf.sprintf "%ldl" @@ -56,8 +51,6 @@ let string_of : type a. a typ -> a -> string = function | Nativeint -> Printf.sprintf "%ndn" | Float -> fun f -> Printf.sprintf "float_of_bits 0x%LxL" (Int64.bits_of_float f) - | Vec128 -> - fun v -> Printf.sprintf "vec128 %Ld:%Ld" (vec128_high_int64 v) (vec128_low_int64 v) let rec arity : type a. a proto -> int = function | Ret _ -> 0 @@ -66,7 +59,7 @@ let rec arity : type a. a proto -> int = function module Buffer = struct type t = (char, int8_unsigned_elt, c_layout) Array1.t - let arg_size = 16 + let arg_size = 8 let create ~arity : t = Array1.create char c_layout ((arity + 1) * arg_size) @@ -83,14 +76,6 @@ module Buffer = struct external set_int32 : t -> int -> int32 -> unit = "%caml_bigstring_set32" external set_int64 : t -> int -> int64 -> unit = "%caml_bigstring_set64" - let get_vec128 buf ~arg = - let low, high = get_int64 buf (arg * arg_size), get_int64 buf (arg * arg_size + 8) in - vec128_of_int64s low high - - let set_vec128 buf ~arg x = - set_int64 buf (arg * arg_size) (vec128_low_int64 x); - set_int64 buf ((arg * arg_size) + 8) (vec128_high_int64 x) - let get_int32 t ~arg = get_int32 t (arg * arg_size) let get_int64 t ~arg = get_int64 t (arg * arg_size) let set_int32 t ~arg x = set_int32 t (arg * arg_size) x @@ -125,7 +110,6 @@ module Buffer = struct | Int64 -> get_int64 | Nativeint -> get_nativeint | Float -> get_float - | Vec128 -> get_vec128 let set : type a. a typ -> t -> arg:int -> a -> unit = function | Int -> set_int @@ -133,7 +117,6 @@ module Buffer = struct | Int64 -> set_int64 | Nativeint -> set_nativeint | Float -> set_float - | Vec128 -> set_vec128 (* This is almost a memcpy except that we use get/set which should ensure that the values in [dst] don't overflow. *) @@ -178,7 +161,6 @@ let typ_size : type a. a typ -> int = function | Int64 -> 8 | Nativeint -> Sys.word_size / 8 | Float -> 8 - | Vec128 -> 16 let rec sizes : type a. a proto -> int list = function | Ret typ -> [typ_size typ] diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/common.mli b/ocaml/testsuite/tests/unboxed-primitive-args/common.mli index 362ef4f916b..b7459bb1027 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/common.mli +++ b/ocaml/testsuite/tests/unboxed-primitive-args/common.mli @@ -5,7 +5,6 @@ type 'a typ = | Int64 : int64 typ | Nativeint : nativeint typ | Float : float typ - | Vec128 : vec128 typ type 'a proto = | Ret : 'a typ -> 'a proto diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/gen_test.ml b/ocaml/testsuite/tests/unboxed-primitive-args/gen_test.ml index 80e11178296..8f4b2dfe59d 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/gen_test.ml +++ b/ocaml/testsuite/tests/unboxed-primitive-args/gen_test.ml @@ -4,14 +4,11 @@ open StdLabels type boxed_integer = Pnativeint | Pint32 | Pint64 -type boxed_vector = Pvec128 - type native_repr = | Same_as_ocaml_repr | Unboxed_float | Unboxed_integer of boxed_integer | Untagged_int - | Unboxed_vector of boxed_vector (* Generate primitives with up to this number of arguments *) let test_all_combination_up_to_n_args = 6 @@ -30,7 +27,6 @@ let test_all_args_combination_of = [ Unboxed_float ; Unboxed_integer Pint32 ; Unboxed_integer Pint64 - ; Unboxed_vector Pvec128 ] let code_of_repr = function @@ -40,7 +36,6 @@ let code_of_repr = function | Unboxed_integer Pint64 -> "L" | Unboxed_integer Pnativeint -> "n" | Untagged_int -> "i" - | Unboxed_vector Pvec128 -> "x" (* for "xmm" *) let repr_of_code = function | 'v' -> Same_as_ocaml_repr @@ -49,7 +44,6 @@ let repr_of_code = function | 'L' -> Unboxed_integer Pint64 | 'n' -> Unboxed_integer Pnativeint | 'i' -> Untagged_int - | 'x' -> Unboxed_vector Pvec128 | _ -> assert false let manual_tests = @@ -59,15 +53,10 @@ let manual_tests = ; "L_L" ; "n_n" ; "i_i" - ; "x_x" ; "f_fffff" ; "f_ffffff" ; "f_fffffff" ; "f_fffffffffffffffff" - ; "x_xxxxx" - ; "x_xxxxxx" - ; "x_xxxxxxx" - ; "x_xxxxxxxxxxxxxxxxx" ; "v_iiiiiiiiiiiiiiiii" ; "v_lllllllllllllllll" ; "v_LLLLLLLLLLLLLLLLL" @@ -75,11 +64,6 @@ let manual_tests = ; "v_LiLiLiLiLiLiLiLiL" ; "v_flflflflflflflflflflflflflflflflflfl" ; "v_fLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfL" - ; "v_xfxfxfxfxfxfxfxfx" - ; "v_fxfxfxfxfxfxfxfxf" - ; "v_lfxlfxlfxlfxlfxlfx" - ; "v_lflxlxlflflxlxlflx" - ; "v_llllllfffffflxxllxx" ] let ocaml_type_of_repr = function @@ -90,7 +74,6 @@ let ocaml_type_of_repr = function | Unboxed_integer Pint64 -> "(int64 [@unboxed])" | Unboxed_integer Pnativeint -> "(nativeint [@unboxed])" | Untagged_int -> "(int [@untagged])" - | Unboxed_vector Pvec128 -> "(vec128 [@unboxed])" let ocaml_type_gadt_of_repr = function (* Doesn't really matters what we choose for this case *) @@ -100,7 +83,6 @@ let ocaml_type_gadt_of_repr = function | Unboxed_integer Pint64 -> "Int64" | Unboxed_integer Pnativeint -> "Nativeint" | Untagged_int -> "Int" - | Unboxed_vector Pvec128 -> "Vec128" let c_type_of_repr = function | Same_as_ocaml_repr -> "value" @@ -109,7 +91,6 @@ let c_type_of_repr = function | Unboxed_integer Pint64 -> "int64_t" | Unboxed_integer Pnativeint -> "intnat" | Untagged_int -> "intnat" - | Unboxed_vector Pvec128 -> "__m128i" type proto = { params : native_repr list @@ -224,8 +205,7 @@ let generate_stubs () = | Unboxed_integer Pint32 -> "set_int32(%d, x%d)" | Unboxed_integer Pint64 -> "set_int64(%d, x%d)" | Unboxed_integer Pnativeint -> "set_intnat(%d, x%d)" - | Untagged_int -> "set_intnat(%d, x%d)" - | Unboxed_vector Pvec128 -> "set_vec128(%d, x%d)") + | Untagged_int -> "set_intnat(%d, x%d)") i i); pr " return %(%d%);" (match proto.return with @@ -234,8 +214,7 @@ let generate_stubs () = | Unboxed_integer Pint32 -> "get_int32(%d)" | Unboxed_integer Pint64 -> "get_int64(%d)" | Unboxed_integer Pnativeint -> "get_intnat(%d)" - | Untagged_int -> "get_intnat(%d)" - | Unboxed_vector Pvec128 -> "get_vec128(%d)") + | Untagged_int -> "get_intnat(%d)") (List.length proto.params); pr "}" ) diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/test.ml b/ocaml/testsuite/tests/unboxed-primitive-args/test.ml index d14ddc5f38e..49819fac412 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/test.ml +++ b/ocaml/testsuite/tests/unboxed-primitive-args/test.ml @@ -11,13 +11,9 @@ compiler_output = "stubs.c" *** ocaml arguments = "ml" compiler_output = "main.ml" -**** script -script = "${cc} -msse4.2 -c test_common.c -I ../../../../../../../../runtime" -***** script -script = "${cc} -msse4.2 -c stubs.c -I ../../../../../../../../runtime" -****** ocamlopt.opt -all_modules = "test_common.o stubs.o common.mli common.ml main.ml" -******* run -******** check-program-output +**** ocamlopt.opt +all_modules = "test_common.c stubs.c common.mli common.ml main.ml" +***** run +****** check-program-output *) diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c b/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c index 687695dbfbd..c6b873c5147 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c +++ b/ocaml/testsuite/tests/unboxed-primitive-args/test_common.c @@ -15,8 +15,6 @@ #include #include -#include -#include char *ocaml_buffer; char *c_buffer; @@ -37,18 +35,3 @@ double test_cleanup_float(void) { return 0.; } - -int64_t vec128_low_int64(__m128i v) -{ - return _mm_extract_epi64(v, 0); -} - -int64_t vec128_high_int64(__m128i v) -{ - return _mm_extract_epi64(v, 1); -} - -__m128i vec128_of_int64s(int64_t low, int64_t high) -{ - return _mm_set_epi64x(high, low); -} diff --git a/ocaml/testsuite/tests/unboxed-primitive-args/test_common.h b/ocaml/testsuite/tests/unboxed-primitive-args/test_common.h index fb3c08c86be..2a1019ca398 100644 --- a/ocaml/testsuite/tests/unboxed-primitive-args/test_common.h +++ b/ocaml/testsuite/tests/unboxed-primitive-args/test_common.h @@ -16,8 +16,6 @@ #ifndef __TEST_COMMON_H #define __TEST_COMMON_H -#include - /* Where the OCaml side stores the arguments and result for a test case. The C function will read the result it is supposed to return from this buffer. @@ -33,18 +31,14 @@ extern char *ocaml_buffer; equal. */ extern char *c_buffer; -#define STRIDE 16 - -#define get_intnat(n) *(intnat*)(ocaml_buffer+((n)*STRIDE)) -#define get_int32(n) *(int32_t*)(ocaml_buffer+((n)*STRIDE)) -#define get_int64(n) *(int64_t*)(ocaml_buffer+((n)*STRIDE)) -#define get_double(n) *(double*)(ocaml_buffer+((n)*STRIDE)) -#define get_vec128(n) _mm_loadu_si128((__m128i*)(ocaml_buffer+((n)*STRIDE))) +#define get_intnat(n) *(intnat*)(ocaml_buffer+((n)*8)) +#define get_int32(n) *(int32_t*)(ocaml_buffer+((n)*8)) +#define get_int64(n) *(int64_t*)(ocaml_buffer+((n)*8)) +#define get_double(n) *(double*)(ocaml_buffer+((n)*8)) -#define set_intnat(n, x) *(intnat*)(c_buffer+((n)*STRIDE)) = (x) -#define set_int32(n, x) *(int32_t*)(c_buffer+((n)*STRIDE)) = (x) -#define set_int64(n, x) *(int64_t*)(c_buffer+((n)*STRIDE)) = (x) -#define set_double(n, x) *(double*)(c_buffer+((n)*STRIDE)) = (x) -#define set_vec128(n, x) _mm_storeu_si128((__m128i*)(c_buffer+((n)*STRIDE)), (x)) +#define set_intnat(n, x) *(intnat*)(c_buffer+((n)*8)) = (x) +#define set_int32(n, x) *(int32_t*)(c_buffer+((n)*8)) = (x) +#define set_int64(n, x) *(int64_t*)(c_buffer+((n)*8)) = (x) +#define set_double(n, x) *(double*)(c_buffer+((n)*8)) = (x) #endif /* __TEST_COMMON_H */ diff --git a/testsuite/tests/asmcomp/poll_attr_both.compilers.reference b/testsuite/tests/asmcomp/poll_attr_both.compilers.reference index 11072d1d052..bf70ac7e2ef 100644 --- a/testsuite/tests/asmcomp/poll_attr_both.compilers.reference +++ b/testsuite/tests/asmcomp/poll_attr_both.compilers.reference @@ -3,4 +3,3 @@ Error: Function with poll-error attribute contains polling points: allocation at File "poll_attr_both.ml", line 17, characters 29-37 function call at File "poll_attr_both.ml", line 18, characters 13-16 (plus compiler-inserted polling point(s) in prologue and/or loop back edges) - diff --git a/testsuite/tests/unboxed-primitive-args/README b/testsuite/tests/unboxed-primitive-args/README new file mode 100644 index 00000000000..4bd7601e511 --- /dev/null +++ b/testsuite/tests/unboxed-primitive-args/README @@ -0,0 +1,26 @@ +This directory contains tests to check that OCaml values are correctly +passed between OCaml and C when a primitive takes some or all of its +arguments unboxed/untagged and/or return its result unboxed/untagged. + +To test one primitive we do: +- write all its argument and expected result in buffer A +- call the C external using arguments read from buffer A +- the C function write all the arguments it receive into buffer B +- the C function read the result from buffer A and returns it +- on the OCaml side we write the received result into buffer B +- the test is successful if A and B have the same contents + +Between each call, we call a function with 128 value arguments set to +0 and a function with 32 unboxed float arguments set to 0., just to +clean-up the registers and stacks in case garbage would make a test +succeed. We don't pass more floats as it doesn't build on arm32. + +We construct the set of primitives to test as follow: +- all combination of unboxed int32/int64/float arguments for functions + taking up to 6 arguments (with more than 6 ocamlopt takes a really + long time to compile the test files) +- a bunch of manual tests for the rest and specific patterns. + The list is [Gen_test.manual_tests] + +We test the set of primitives a thousand times, with different random +data each time. diff --git a/testsuite/tests/unboxed-primitive-args/common.ml b/testsuite/tests/unboxed-primitive-args/common.ml new file mode 100644 index 00000000000..98f19b5b373 --- /dev/null +++ b/testsuite/tests/unboxed-primitive-args/common.ml @@ -0,0 +1,304 @@ +open StdLabels + +open Bigarray + +type 'a typ = + | Int : int typ + | Int32 : int32 typ + | Int64 : int64 typ + | Nativeint : nativeint typ + | Float : float typ + | Vec128 : vec128 typ + +type 'a proto = + | Ret : 'a typ -> 'a proto + | Abs : 'a typ * 'b proto -> ('a -> 'b) proto + +let ( ** ) x y = Abs (x, y) + +(* This form is easier to process programmatically. We don't expose it as + ocamlopt takes a really really long time to compile a constant list + of these. *) +type simplified_test = Test : string * 'a * 'a proto -> simplified_test + +type test = + | T1 : string * ('a -> 'b) * 'a typ * 'b typ -> test + | T2 : string * ('a -> 'b -> 'c) * 'a typ * 'b typ * 'c typ -> test + | T3 : string * ('a -> 'b -> 'c -> 'd) * + 'a typ * 'b typ * 'c typ * 'd typ -> test + | T4 : string * ('a -> 'b -> 'c -> 'd -> 'e) * + 'a typ * 'b typ * 'c typ * 'd typ * 'e typ -> test + | T5 : string * ('a -> 'b -> 'c -> 'd -> 'e -> 'f) * + 'a typ * 'b typ * 'c typ * 'd typ * 'e typ * 'f typ -> test + | T6 : string * ('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g) * + 'a typ * 'b typ * 'c typ * 'd typ * 'e typ * 'f typ * 'g typ -> test + | T : string * 'a * 'a proto -> test + +let expand_test = function + | T1 (s, fn, a, b) -> Test (s, fn, a ** Ret b) + | T2 (s, fn, a, b, c) -> Test (s, fn, a ** b ** Ret c) + | T3 (s, fn, a, b, c, d) -> Test (s, fn, a ** b ** c ** Ret d) + | T4 (s, fn, a, b, c, d, e) -> Test (s, fn, a ** b ** c ** d ** Ret e) + | T5 (s, fn, a, b, c, d, e, f) -> + Test (s, fn, a ** b ** c ** d ** e ** Ret f) + | T6 (s, fn, a, b, c, d, e, f, g) -> + Test (s, fn, a ** b ** c ** d ** e ** f ** Ret g) + | T (s, fn, p) -> Test (s, fn, p) + +external vec128_of_int64s : int64 -> int64 -> vec128 = "" "vec128_of_int64s" [@@noalloc] [@@unboxed] +external vec128_low_int64 : vec128 -> int64 = "" "vec128_low_int64" [@@noalloc] [@@unboxed] +external vec128_high_int64 : vec128 -> int64 = "" "vec128_high_int64" [@@noalloc] [@@unboxed] + +let string_of : type a. a typ -> a -> string = function + | Int -> Int.to_string + | Int32 -> Printf.sprintf "%ldl" + | Int64 -> Printf.sprintf "%LdL" + | Nativeint -> Printf.sprintf "%ndn" + | Float -> + fun f -> Printf.sprintf "float_of_bits 0x%LxL" (Int64.bits_of_float f) + | Vec128 -> + fun v -> Printf.sprintf "vec128 %Ld:%Ld" (vec128_high_int64 v) (vec128_low_int64 v) + +let rec arity : type a. a proto -> int = function + | Ret _ -> 0 + | Abs (_, p) -> 1 + arity p + +module Buffer = struct + type t = (char, int8_unsigned_elt, c_layout) Array1.t + + let arg_size = 16 + + let create ~arity : t = + Array1.create char c_layout ((arity + 1) * arg_size) + + let clear (t : t) = Array1.fill t '\000' + + let length : t -> int = Array1.dim + + external init_c_side : ocaml_buffer:t -> c_buffer:t -> unit + = "test_set_buffers" + + external get_int32 : t -> int -> int32 = "%caml_bigstring_get32" + external get_int64 : t -> int -> int64 = "%caml_bigstring_get64" + external set_int32 : t -> int -> int32 -> unit = "%caml_bigstring_set32" + external set_int64 : t -> int -> int64 -> unit = "%caml_bigstring_set64" + + let get_vec128 buf ~arg = + let low, high = get_int64 buf (arg * arg_size), get_int64 buf (arg * arg_size + 8) in + vec128_of_int64s low high + + let set_vec128 buf ~arg x = + set_int64 buf (arg * arg_size) (vec128_low_int64 x); + set_int64 buf ((arg * arg_size) + 8) (vec128_high_int64 x) + + let get_int32 t ~arg = get_int32 t (arg * arg_size) + let get_int64 t ~arg = get_int64 t (arg * arg_size) + let set_int32 t ~arg x = set_int32 t (arg * arg_size) x + let set_int64 t ~arg x = set_int64 t (arg * arg_size) x + + let get_nativeint, set_nativeint = + match Sys.word_size with + | 32 -> ((fun t ~arg -> get_int32 t ~arg |> Nativeint.of_int32), + (fun t ~arg x -> set_int32 t ~arg (Nativeint.to_int32 x))) + | 64 -> ((fun t ~arg -> get_int64 t ~arg |> Int64.to_nativeint), + (fun t ~arg x -> set_int64 t ~arg (Int64.of_nativeint x))) + | n -> Printf.ksprintf failwith "unknown word size (%d)" n + + let get_int = + if Sys.word_size = 32 then + fun buf ~arg -> get_int32 buf ~arg |> Int32.to_int + else + fun buf ~arg -> get_int64 buf ~arg |> Int64.to_int + + let set_int = + if Sys.word_size = 32 then + fun buf ~arg x -> set_int32 buf ~arg (Int32.of_int x) + else + fun buf ~arg x -> set_int64 buf ~arg (Int64.of_int x) + + let get_float buf ~arg = get_int64 buf ~arg |> Int64.float_of_bits + let set_float buf ~arg x = set_int64 buf ~arg (Int64.bits_of_float x) + + let get : type a. a typ -> t -> arg:int -> a = function + | Int -> get_int + | Int32 -> get_int32 + | Int64 -> get_int64 + | Nativeint -> get_nativeint + | Float -> get_float + | Vec128 -> get_vec128 + + let set : type a. a typ -> t -> arg:int -> a -> unit = function + | Int -> set_int + | Int32 -> set_int32 + | Int64 -> set_int64 + | Nativeint -> set_nativeint + | Float -> set_float + | Vec128 -> set_vec128 + + (* This is almost a memcpy except that we use get/set which should + ensure that the values in [dst] don't overflow. *) + let copy_args ~src ~dst proto = + let rec loop : type a. a proto -> int -> unit = fun proto arg -> + match proto with + | Ret typ -> + set typ dst ~arg (get typ src ~arg) + | Abs (typ, rest) -> + set typ dst ~arg (get typ src ~arg); + loop rest (arg + 1) + in + loop proto 0 +end + +let exec proto f ~ocaml_buffer ~c_buffer = + let rec loop : type a. a proto -> a -> int -> unit = fun proto f arg -> + match proto with + | Ret typ -> + Buffer.set typ c_buffer ~arg f + | Abs (typ, rest) -> + let x = Buffer.get typ ocaml_buffer ~arg in + loop rest (f x) (arg + 1) + in + loop proto f 0 + +let strings_of_test_instance name proto buffer = + let rec loop : type a. a proto -> int -> string list -> string list * string = + fun proto arg acc -> + match proto with + | Ret typ -> + (List.rev acc, string_of typ (Buffer.get typ buffer ~arg)) + | Abs (typ, rest) -> + let s = string_of typ (Buffer.get typ buffer ~arg) in + loop rest (arg + 1) (s :: acc) + in + loop proto 0 [] + +let typ_size : type a. a typ -> int = function + | Int -> Sys.word_size / 8 + | Int32 -> 4 + | Int64 -> 8 + | Nativeint -> Sys.word_size / 8 + | Float -> 8 + | Vec128 -> 16 + +let rec sizes : type a. a proto -> int list = function + | Ret typ -> [typ_size typ] + | Abs (typ, rest) -> typ_size typ :: sizes rest + +let print_hex ~sizes ~arity buffer = + let printf = Printf.printf in + printf "("; + for i = 0 to arity do + if i = arity then + printf ") -> " + else if i > 0 then + printf ", "; + for ofs = i * Buffer.arg_size to i * Buffer.arg_size + sizes.(i) - 1 do + printf "%02x" (Char.code buffer.{ofs}); + done; + done + +let printed_mismatches = ref 0 + +let print_mismatch name proto ~ocaml_buffer ~c_buffer = + let printf = Printf.printf in + printf "Mismatch for %s\n" name; + let o_args, o_res = strings_of_test_instance name proto ocaml_buffer in + let c_args, c_res = strings_of_test_instance name proto c_buffer in + let o_args, c_args = + (* Align arguments *) + List.map2 o_args c_args ~f:(fun a b -> + let len_a = String.length a and len_b = String.length b in + let len = max len_a len_b in + (Printf.sprintf "%*s" len a, + Printf.sprintf "%*s" len b)) + |> List.split + in + printf "ocaml side : (%s) -> %s\n" (String.concat ~sep:", " o_args) o_res; + printf "c side : (%s) -> %s\n" (String.concat ~sep:", " c_args) c_res; + let sizes = sizes proto |> Array.of_list in + let arity = arity proto in + printf "ocaml side : "; print_hex ~sizes ~arity ocaml_buffer; printf "\n"; + printf "c side : "; print_hex ~sizes ~arity c_buffer; printf "\n"; + incr printed_mismatches; + if !printed_mismatches >= 1000 then begin + printf "Output truncated at 1000 failures."; + exit 0 + end + +external cleanup_normal + : int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int -> int -> int -> int -> int -> int -> int -> int + -> int = "" "test_cleanup_normal" [@@noalloc] + +external cleanup_float + : float -> float -> float -> float -> float -> float -> float -> float + -> float -> float -> float -> float -> float -> float -> float -> float + -> float -> float -> float -> float -> float -> float -> float -> float + -> float -> float -> float -> float -> float -> float -> float -> float + -> float = "" "test_cleanup_float" [@@noalloc] [@@unboxed] + +let cleanup_args_and_stack () = + let _ : int = + cleanup_normal + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + in + let _ : float = + cleanup_float + 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. + 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. + in + () + +let run_test ~random_data ~ocaml_buffer ~c_buffer (Test (name, f, proto)) = + Buffer.clear ocaml_buffer; + Buffer.clear c_buffer; + Buffer.copy_args ~src:random_data ~dst:ocaml_buffer proto; + cleanup_args_and_stack (); + exec proto f ~ocaml_buffer ~c_buffer; + let success = ocaml_buffer = c_buffer in + if not success then print_mismatch name proto ~ocaml_buffer ~c_buffer; + success + +let run_tests tests = + let tests = List.map tests ~f:expand_test in + let max_args = + List.fold_left tests ~init:0 ~f:(fun acc (Test (_, _, p)) -> + max acc (arity p)) + in + + let ocaml_buffer = Buffer.create ~arity:max_args + and c_buffer = Buffer.create ~arity:max_args in + Buffer.init_c_side ~ocaml_buffer ~c_buffer; + + let random_data = Buffer.create ~arity:max_args in + let new_random_data () = + for i = 0 to Buffer.length random_data - 1 do + random_data.{i} <- char_of_int (Random.int 256) + done + in + + let failure = ref false in + for i = 1 to 1000 do + new_random_data (); + List.iter tests ~f:(fun test -> + if not (run_test ~random_data ~ocaml_buffer ~c_buffer test) then + failure := true) + done; + exit (if !failure then 1 else 0) diff --git a/testsuite/tests/unboxed-primitive-args/common.mli b/testsuite/tests/unboxed-primitive-args/common.mli new file mode 100644 index 00000000000..362ef4f916b --- /dev/null +++ b/testsuite/tests/unboxed-primitive-args/common.mli @@ -0,0 +1,30 @@ +(** Type of arguments/result *) +type 'a typ = + | Int : int typ + | Int32 : int32 typ + | Int64 : int64 typ + | Nativeint : nativeint typ + | Float : float typ + | Vec128 : vec128 typ + +type 'a proto = + | Ret : 'a typ -> 'a proto + | Abs : 'a typ * 'b proto -> ('a -> 'b) proto + +(** Same as [Abs]. We choose this operator for its associativity. *) +val ( ** ) : 'a typ -> 'b proto -> ('a -> 'b) proto + +type test = + | T1 : string * ('a -> 'b) * 'a typ * 'b typ -> test + | T2 : string * ('a -> 'b -> 'c) * 'a typ * 'b typ * 'c typ -> test + | T3 : string * ('a -> 'b -> 'c -> 'd) * + 'a typ * 'b typ * 'c typ * 'd typ -> test + | T4 : string * ('a -> 'b -> 'c -> 'd -> 'e) * + 'a typ * 'b typ * 'c typ * 'd typ * 'e typ -> test + | T5 : string * ('a -> 'b -> 'c -> 'd -> 'e -> 'f) * + 'a typ * 'b typ * 'c typ * 'd typ * 'e typ * 'f typ -> test + | T6 : string * ('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g) * + 'a typ * 'b typ * 'c typ * 'd typ * 'e typ * 'f typ * 'g typ -> test + | T : string * 'a * 'a proto -> test + +val run_tests : test list -> unit diff --git a/testsuite/tests/unboxed-primitive-args/gen_test.ml b/testsuite/tests/unboxed-primitive-args/gen_test.ml new file mode 100644 index 00000000000..80e11178296 --- /dev/null +++ b/testsuite/tests/unboxed-primitive-args/gen_test.ml @@ -0,0 +1,249 @@ +(* This programs generate stubs with various prototype combinations *) + +open StdLabels + +type boxed_integer = Pnativeint | Pint32 | Pint64 + +type boxed_vector = Pvec128 + +type native_repr = + | Same_as_ocaml_repr + | Unboxed_float + | Unboxed_integer of boxed_integer + | Untagged_int + | Unboxed_vector of boxed_vector + +(* Generate primitives with up to this number of arguments *) +let test_all_combination_up_to_n_args = 6 + +(* Generate primitives using all combination of these argument + representations. No need to test all combination of other + representations: regarding the calling convention + [Same_as_ocaml_repr], [Untagged_int] and + [Unboxed_integer Pnativeint] are all the same, and are the + same as [Unboxed_integer Pint]. + + We have specific tests for the other representations and for the + result representation in [manual_tests]. +*) +let test_all_args_combination_of = + [ Unboxed_float + ; Unboxed_integer Pint32 + ; Unboxed_integer Pint64 + ; Unboxed_vector Pvec128 + ] + +let code_of_repr = function + | Same_as_ocaml_repr -> "v" (* for "value" *) + | Unboxed_float -> "f" + | Unboxed_integer Pint32 -> "l" + | Unboxed_integer Pint64 -> "L" + | Unboxed_integer Pnativeint -> "n" + | Untagged_int -> "i" + | Unboxed_vector Pvec128 -> "x" (* for "xmm" *) + +let repr_of_code = function + | 'v' -> Same_as_ocaml_repr + | 'f' -> Unboxed_float + | 'l' -> Unboxed_integer Pint32 + | 'L' -> Unboxed_integer Pint64 + | 'n' -> Unboxed_integer Pnativeint + | 'i' -> Untagged_int + | 'x' -> Unboxed_vector Pvec128 + | _ -> assert false + +let manual_tests = + [ "v_v" + ; "f_f" + ; "l_l" + ; "L_L" + ; "n_n" + ; "i_i" + ; "x_x" + ; "f_fffff" + ; "f_ffffff" + ; "f_fffffff" + ; "f_fffffffffffffffff" + ; "x_xxxxx" + ; "x_xxxxxx" + ; "x_xxxxxxx" + ; "x_xxxxxxxxxxxxxxxxx" + ; "v_iiiiiiiiiiiiiiiii" + ; "v_lllllllllllllllll" + ; "v_LLLLLLLLLLLLLLLLL" + ; "v_iLiLiLiLiLiLiLiLi" + ; "v_LiLiLiLiLiLiLiLiL" + ; "v_flflflflflflflflflflflflflflflflflfl" + ; "v_fLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfLfL" + ; "v_xfxfxfxfxfxfxfxfx" + ; "v_fxfxfxfxfxfxfxfxf" + ; "v_lfxlfxlfxlfxlfxlfx" + ; "v_lflxlxlflflxlxlflx" + ; "v_llllllfffffflxxllxx" + ] + +let ocaml_type_of_repr = function + (* Doesn't really matters what we choose for this case *) + | Same_as_ocaml_repr -> "int" + | Unboxed_float -> "(float [@unboxed])" + | Unboxed_integer Pint32 -> "(int32 [@unboxed])" + | Unboxed_integer Pint64 -> "(int64 [@unboxed])" + | Unboxed_integer Pnativeint -> "(nativeint [@unboxed])" + | Untagged_int -> "(int [@untagged])" + | Unboxed_vector Pvec128 -> "(vec128 [@unboxed])" + +let ocaml_type_gadt_of_repr = function + (* Doesn't really matters what we choose for this case *) + | Same_as_ocaml_repr -> "Int" + | Unboxed_float -> "Float" + | Unboxed_integer Pint32 -> "Int32" + | Unboxed_integer Pint64 -> "Int64" + | Unboxed_integer Pnativeint -> "Nativeint" + | Untagged_int -> "Int" + | Unboxed_vector Pvec128 -> "Vec128" + +let c_type_of_repr = function + | Same_as_ocaml_repr -> "value" + | Unboxed_float -> "double" + | Unboxed_integer Pint32 -> "int32_t" + | Unboxed_integer Pint64 -> "int64_t" + | Unboxed_integer Pnativeint -> "intnat" + | Untagged_int -> "intnat" + | Unboxed_vector Pvec128 -> "__m128i" + +type proto = + { params : native_repr list + ; return : native_repr + } + +let rec explode s = + let rec loop i acc = + if i < 0 then + acc + else + loop (i - 1) (s.[i] :: acc) + in + loop (String.length s - 1) [] + +let proto_of_str s = + Scanf.sscanf s "%c_%s" (fun return params -> + { params = List.map (explode params) ~f:repr_of_code + ; return = repr_of_code return + }) + +let function_name_of_proto proto = + Printf.sprintf "test_%s_%s" (code_of_repr proto.return) + (String.concat ~sep:"" (List.map proto.params ~f:code_of_repr)) + +let ocaml_type_gadt_of_proto proto = + Printf.sprintf "%s ** Ret %s" + (String.concat ~sep:" ** " + (List.map proto.params ~f:ocaml_type_gadt_of_repr)) + (ocaml_type_gadt_of_repr proto.return) + +let ocaml_type_of_proto proto = + String.concat ~sep:" -> " + (List.map proto.params ~f:ocaml_type_of_repr + @ [ocaml_type_of_repr proto.return]) + +let c_args_of_proto proto = + String.concat ~sep:", " + (List.mapi proto.params ~f:(fun i p -> + Printf.sprintf "%s x%d" (c_type_of_repr p) i)) + +let manual_protos = List.map manual_tests ~f:proto_of_str + +let iter_protos ~f = + let iter_for_arity arity = + let rec loop params to_gen = + List.iter test_all_args_combination_of ~f:(fun repr -> + let params = repr :: params in + let to_gen = to_gen - 1 in + if to_gen = 0 then + f { params = List.rev params + ; return = Same_as_ocaml_repr + } + else + loop params to_gen) + in + loop [] arity + in + let rec iter_arities arity = + if arity <= test_all_combination_up_to_n_args then begin + iter_for_arity arity; + iter_arities (arity + 1) + end + in + List.iter manual_protos ~f; + iter_arities 1 + +let pr fmt = Printf.ksprintf (fun s -> print_string s; print_char '\n') fmt + +let generate_ml () = + pr "open Common"; + pr ""; + iter_protos ~f:(fun proto -> + let name = function_name_of_proto proto in + pr "external %s : %s = \"\" %S [@@noalloc]" + name (ocaml_type_of_proto proto) name; + ); + pr ""; + pr "let tests = []"; + iter_protos ~f:(fun proto -> + let name = function_name_of_proto proto in + let arity = List.length proto.params in + if arity <= 6 then + pr "let tests = T%d (%S, %s, %s, %s) :: tests" + arity name name + (List.map proto.params ~f:ocaml_type_gadt_of_repr + |> String.concat ~sep:", ") + (ocaml_type_gadt_of_repr proto.return) + else + pr "let tests = T (%S, %s, %s) :: tests" + name name (ocaml_type_gadt_of_proto proto)); + pr ""; + pr "let () = run_tests (List.rev tests)" + +let generate_stubs () = + pr "#include "; + pr "#include "; + pr "#include \"test_common.h\""; + iter_protos ~f:(fun proto -> + let name = function_name_of_proto proto in + pr ""; + pr "%s %s(%s)" + (c_type_of_repr proto.return) + name + (c_args_of_proto proto); + pr "{"; + List.iteri proto.params ~f:(fun i p -> + pr " %(%d%d%);" + (match p with + | Same_as_ocaml_repr -> "set_intnat(%d, Long_val(x%d))" + | Unboxed_float -> "set_double(%d, x%d)" + | Unboxed_integer Pint32 -> "set_int32(%d, x%d)" + | Unboxed_integer Pint64 -> "set_int64(%d, x%d)" + | Unboxed_integer Pnativeint -> "set_intnat(%d, x%d)" + | Untagged_int -> "set_intnat(%d, x%d)" + | Unboxed_vector Pvec128 -> "set_vec128(%d, x%d)") + i i); + pr " return %(%d%);" + (match proto.return with + | Same_as_ocaml_repr -> "Val_long(get_intnat(%d))" + | Unboxed_float -> "get_double(%d)" + | Unboxed_integer Pint32 -> "get_int32(%d)" + | Unboxed_integer Pint64 -> "get_int64(%d)" + | Unboxed_integer Pnativeint -> "get_intnat(%d)" + | Untagged_int -> "get_intnat(%d)" + | Unboxed_vector Pvec128 -> "get_vec128(%d)") + (List.length proto.params); + pr "}" + ) + +let () = + match Sys.argv with + | [|_; "ml"|] -> generate_ml () + | [|_; "c" |] -> generate_stubs () + | _ -> + prerr_endline "Usage: ocaml gen_test.ml {ml|c}"; + exit 2 diff --git a/testsuite/tests/unboxed-primitive-args/test.ml b/testsuite/tests/unboxed-primitive-args/test.ml new file mode 100644 index 00000000000..d14ddc5f38e --- /dev/null +++ b/testsuite/tests/unboxed-primitive-args/test.ml @@ -0,0 +1,23 @@ +(* TEST + +readonly_files = "common.mli common.ml test_common.c test_common.h" + +* setup-ocamlopt.opt-build-env +** ocaml +test_file = "${test_source_directory}/gen_test.ml" +ocaml_script_as_argument = "true" +arguments = "c" +compiler_output = "stubs.c" +*** ocaml +arguments = "ml" +compiler_output = "main.ml" +**** script +script = "${cc} -msse4.2 -c test_common.c -I ../../../../../../../../runtime" +***** script +script = "${cc} -msse4.2 -c stubs.c -I ../../../../../../../../runtime" +****** ocamlopt.opt +all_modules = "test_common.o stubs.o common.mli common.ml main.ml" +******* run +******** check-program-output + +*) diff --git a/testsuite/tests/unboxed-primitive-args/test.reference b/testsuite/tests/unboxed-primitive-args/test.reference new file mode 100644 index 00000000000..e69de29bb2d diff --git a/testsuite/tests/unboxed-primitive-args/test_common.c b/testsuite/tests/unboxed-primitive-args/test_common.c new file mode 100644 index 00000000000..687695dbfbd --- /dev/null +++ b/testsuite/tests/unboxed-primitive-args/test_common.c @@ -0,0 +1,54 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Jeremie Dimino, Jane Street Europe */ +/* */ +/* Copyright 2015 Institut National de Recherche en Informatique et */ +/* en Automatique. */ +/* */ +/* All rights reserved. This file is distributed under the terms of */ +/* the GNU Lesser General Public License version 2.1, with the */ +/* special exception on linking described in the file LICENSE. */ +/* */ +/**************************************************************************/ + +#include +#include +#include +#include + +char *ocaml_buffer; +char *c_buffer; + +value test_set_buffers(value v_ocaml_buffer, value v_c_buffer) +{ + ocaml_buffer = Caml_ba_data_val(v_ocaml_buffer); + c_buffer = Caml_ba_data_val(v_c_buffer); + return Val_unit; +} + +value test_cleanup_normal(void) +{ + return Val_int(0); +} + +double test_cleanup_float(void) +{ + return 0.; +} + +int64_t vec128_low_int64(__m128i v) +{ + return _mm_extract_epi64(v, 0); +} + +int64_t vec128_high_int64(__m128i v) +{ + return _mm_extract_epi64(v, 1); +} + +__m128i vec128_of_int64s(int64_t low, int64_t high) +{ + return _mm_set_epi64x(high, low); +} diff --git a/testsuite/tests/unboxed-primitive-args/test_common.h b/testsuite/tests/unboxed-primitive-args/test_common.h new file mode 100644 index 00000000000..fb3c08c86be --- /dev/null +++ b/testsuite/tests/unboxed-primitive-args/test_common.h @@ -0,0 +1,50 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Jeremie Dimino, Jane Street Europe */ +/* */ +/* Copyright 2015 Institut National de Recherche en Informatique et */ +/* en Automatique. */ +/* */ +/* All rights reserved. This file is distributed under the terms of */ +/* the GNU Lesser General Public License version 2.1, with the */ +/* special exception on linking described in the file LICENSE. */ +/* */ +/**************************************************************************/ + +#ifndef __TEST_COMMON_H +#define __TEST_COMMON_H + +#include + +/* Where the OCaml side stores the arguments and result for a test + case. The C function will read the result it is supposed to return + from this buffer. + + Argument [n] is stored at [n * 8] and the result is stored at + [arity * 8]. +*/ +extern char *ocaml_buffer; + +/* Where the C function stores the arguments it receive for a test + case. The OCaml side will store the result from the C function in + this buffer. At the of a test case, both these buffers must be + equal. */ +extern char *c_buffer; + +#define STRIDE 16 + +#define get_intnat(n) *(intnat*)(ocaml_buffer+((n)*STRIDE)) +#define get_int32(n) *(int32_t*)(ocaml_buffer+((n)*STRIDE)) +#define get_int64(n) *(int64_t*)(ocaml_buffer+((n)*STRIDE)) +#define get_double(n) *(double*)(ocaml_buffer+((n)*STRIDE)) +#define get_vec128(n) _mm_loadu_si128((__m128i*)(ocaml_buffer+((n)*STRIDE))) + +#define set_intnat(n, x) *(intnat*)(c_buffer+((n)*STRIDE)) = (x) +#define set_int32(n, x) *(int32_t*)(c_buffer+((n)*STRIDE)) = (x) +#define set_int64(n, x) *(int64_t*)(c_buffer+((n)*STRIDE)) = (x) +#define set_double(n, x) *(double*)(c_buffer+((n)*STRIDE)) = (x) +#define set_vec128(n, x) _mm_storeu_si128((__m128i*)(c_buffer+((n)*STRIDE)), (x)) + +#endif /* __TEST_COMMON_H */ From e7e90dcdbfa454e778d835d157b5612fc6f0206c Mon Sep 17 00:00:00 2001 From: Max Slater Date: Fri, 23 Jun 2023 16:09:33 -0400 Subject: [PATCH 27/81] ... --- testsuite/tests/asmcomp/poll_attr_both.compilers.reference | 1 + 1 file changed, 1 insertion(+) diff --git a/testsuite/tests/asmcomp/poll_attr_both.compilers.reference b/testsuite/tests/asmcomp/poll_attr_both.compilers.reference index bf70ac7e2ef..11072d1d052 100644 --- a/testsuite/tests/asmcomp/poll_attr_both.compilers.reference +++ b/testsuite/tests/asmcomp/poll_attr_both.compilers.reference @@ -3,3 +3,4 @@ Error: Function with poll-error attribute contains polling points: allocation at File "poll_attr_both.ml", line 17, characters 29-37 function call at File "poll_attr_both.ml", line 18, characters 13-16 (plus compiler-inserted polling point(s) in prologue and/or loop back edges) + From dc883fd9c77a75d765799e6f4cbc05be252ed440 Mon Sep 17 00:00:00 2001 From: Max Slater Date: Fri, 23 Jun 2023 17:09:55 -0400 Subject: [PATCH 28/81] add simd dune tests --- tests/simd/dune | 22 +++++ tests/simd/simd.expected | 0 tests/simd/simd.ml | 186 +++++++++++++++++++++++++++++++++++++++ tests/simd/stubs.c | 103 ++++++++++++++++++++++ 4 files changed, 311 insertions(+) create mode 100644 tests/simd/dune create mode 100644 tests/simd/simd.expected create mode 100644 tests/simd/simd.ml create mode 100644 tests/simd/stubs.c diff --git a/tests/simd/dune b/tests/simd/dune new file mode 100644 index 00000000000..e9b9d996c74 --- /dev/null +++ b/tests/simd/dune @@ -0,0 +1,22 @@ +(executable + (name simd) + (modules simd) + (foreign_stubs (language c) (names stubs) (flags -msse4.2)) + (ocamlopt_flags (:standard))) + +(rule + (enabled_if + (= %{context_name} "main")) + (target simd.output) + (deps simd.exe) + (action + (with-outputs-to + simd.output + (run ./simd.exe)))) + +(rule + (alias runtest) + (enabled_if + (= %{context_name} "main")) + (action + (diff simd.expected simd.output))) diff --git a/tests/simd/simd.expected b/tests/simd/simd.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/simd/simd.ml b/tests/simd/simd.ml new file mode 100644 index 00000000000..bfc3dd89496 --- /dev/null +++ b/tests/simd/simd.ml @@ -0,0 +1,186 @@ +open Stdlib + +external vec128_of_int64s : int64 -> int64 -> vec128 = "" "vec128_of_int64s" [@@noalloc] [@@unboxed] +external vec128_low_int64 : vec128 -> int64 = "" "vec128_low_int64" [@@noalloc] [@@unboxed] +external vec128_high_int64 : vec128 -> int64 = "" "vec128_high_int64" [@@noalloc] [@@unboxed] + +let eq l r = if l <> r then Printf.printf "%Ld <> %Ld\n" l r + +let[@inline never] check v l h = + let vl, vh = vec128_low_int64 v, vec128_high_int64 v in + eq vl l; + eq vh h +;; + +let[@inline never] combine v0 v1 = + let l0, h0 = vec128_low_int64 v0, vec128_high_int64 v0 in + let l1, h1 = vec128_low_int64 v1, vec128_high_int64 v1 in + vec128_of_int64s (Int64.add l0 l1) (Int64.add h0 h1) +;; + +(* Identity *) +let () = + let v = vec128_of_int64s 1L 2L in + let v = Sys.opaque_identity v in + check v 1L 2L +;; + +(* Identity fn *) +let () = + let v = vec128_of_int64s 1L 2L in + let[@inline never] id v = v in + let v = id v in + check v 1L 2L +;; + +(* Pass to function *) +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v = combine v0 v1 in + check v 4L 6L +;; + +(* Capture in closure *) +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let f = combine v0 in + let f = Sys.opaque_identity f in + let v = f v1 in + check v 4L 6L +;; + +(* More vectors in closure *) +let () = + let[@inline never] f v0 v1 v2 v3 = + combine (combine v0 v1) (combine v2 v3) + in + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v2 = vec128_of_int64s 4L 5L in + let v3 = vec128_of_int64s 6L 7L in + let f = f v0 v1 v2 in + let f = Sys.opaque_identity f in + let v = f v3 in + check v 14L 18L +;; + +(* Store in record *) +type record = { a : vec128 + ; mutable b : vec128 } + +let () = + let record = { a = vec128_of_int64s 1L 2L; b = vec128_of_int64s 3L 4L } in + check record.a 1L 2L; + check record.b 3L 4L; + let record = Sys.opaque_identity record in + record.b <- vec128_of_int64s 5L 6L; + check record.a 1L 2L; + check record.b 5L 6L; + let v = combine record.a record.b in + check v 6L 8L +;; + +(* Store in variant *) +type variant = A of vec128 | B of vec128 | C + +let () = + let variant = A (vec128_of_int64s 1L 2L) in + let variant = Sys.opaque_identity variant in + match variant with + | A v -> check v 1L 2L + | _ -> print_endline "fail"; + let variant = ref C in + let variant = Sys.opaque_identity variant in + variant := B (vec128_of_int64s 3L 4L); + match !variant with + | B v -> check v 3L 4L + | _ -> print_endline "fail" +;; + +(* Pass boxed vectors to an external *) +external boxed_combine : vec128 -> vec128 -> vec128 = "" "boxed_combine" [@@noalloc] + +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v = boxed_combine v0 v1 in + check v 4L 6L +;; + +(* Pass lots of vectors to an external *) +external lots_of_vectors : + vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> + vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> + vec128 + = "" "lots_of_vectors" [@@noalloc] [@@unboxed] + +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v2 = vec128_of_int64s 5L 6L in + let v3 = vec128_of_int64s 7L 8L in + let v4 = vec128_of_int64s 9L 10L in + let v5 = vec128_of_int64s 11L 12L in + let v6 = vec128_of_int64s 13L 14L in + let v7 = vec128_of_int64s 15L 16L in + let v8 = vec128_of_int64s 17L 18L in + let v9 = vec128_of_int64s 19L 20L in + let v10 = vec128_of_int64s 21L 22L in + let v11 = vec128_of_int64s 23L 24L in + let v12 = vec128_of_int64s 25L 26L in + let v13 = vec128_of_int64s 27L 28L in + let v14 = vec128_of_int64s 29L 30L in + let v15 = vec128_of_int64s 31L 32L in + let v = lots_of_vectors v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 in + check v 256L 272L +;; + +(* Pass mixed floats/vectors to an external *) +external vectors_and_floats : + vec128 -> float -> vec128 -> float -> vec128 -> float -> vec128 -> float -> + float -> vec128 -> vec128 -> float -> float -> vec128 -> vec128 -> float -> + float -> float -> vec128 -> vec128 -> vec128 -> float -> float -> float -> + vec128 + = "" "vectors_and_floats" [@@noalloc] [@@unboxed] + +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v2 = vec128_of_int64s 5L 6L in + let v3 = vec128_of_int64s 7L 8L in + let v4 = vec128_of_int64s 9L 10L in + let v5 = vec128_of_int64s 11L 12L in + let v6 = vec128_of_int64s 13L 14L in + let v7 = vec128_of_int64s 15L 16L in + let v8 = vec128_of_int64s 17L 18L in + let v9 = vec128_of_int64s 19L 20L in + let v10 = vec128_of_int64s 21L 22L in + let v = vectors_and_floats v0 23. v1 24. v2 25. v3 26. 27. v4 v5 28. 29. v6 v7 30. 31. 32. v8 v9 v10 33. 34. 35. in + check v 377L 253L +;; + +(* Pass mixed ints/floats/vectors to an external *) +external vectors_and_floats_and_ints : + vec128 -> float -> vec128 -> int64 -> vec128 -> float -> vec128 -> int64 -> + int64 -> vec128 -> vec128 -> float -> float -> vec128 -> vec128 -> int64 -> + int64 -> float -> vec128 -> vec128 -> vec128 -> int64 -> int64 -> float -> + vec128 + = "" "vectors_and_floats_and_ints" [@@noalloc] [@@unboxed] + +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v2 = vec128_of_int64s 5L 6L in + let v3 = vec128_of_int64s 7L 8L in + let v4 = vec128_of_int64s 9L 10L in + let v5 = vec128_of_int64s 11L 12L in + let v6 = vec128_of_int64s 13L 14L in + let v7 = vec128_of_int64s 15L 16L in + let v8 = vec128_of_int64s 17L 18L in + let v9 = vec128_of_int64s 19L 20L in + let v10 = vec128_of_int64s 21L 22L in + let v = vectors_and_floats_and_ints v0 23. v1 24L v2 25. v3 26L 27L v4 v5 28. 29. v6 v7 30L 31L 32. v8 v9 v10 33L 34L 35. in + check v 377L 253L +;; diff --git a/tests/simd/stubs.c b/tests/simd/stubs.c new file mode 100644 index 00000000000..a30870e5052 --- /dev/null +++ b/tests/simd/stubs.c @@ -0,0 +1,103 @@ + +#include +#include +#include +#include +#include + +int64_t vec128_low_int64(__m128i v) +{ + return _mm_extract_epi64(v, 0); +} + +int64_t vec128_high_int64(__m128i v) +{ + return _mm_extract_epi64(v, 1); +} + +__m128i vec128_of_int64s(int64_t low, int64_t high) +{ + return _mm_set_epi64x(high, low); +} + +CAMLprim value boxed_combine(value v0, value v1) +{ + CAMLparam2(v0, v1); + CAMLlocal1(res); + + __m128i l = _mm_loadu_si128((__m128i*)v0); + __m128i r = _mm_loadu_si128((__m128i*)v1); + __m128i result = _mm_add_epi64(l, r); + res = caml_alloc_small(2, Abstract_tag); + _mm_storeu_si128((__m128i*)res, result); + + CAMLreturn(res); +} + +__m128i lots_of_vectors( + __m128i v0, __m128i v1, __m128i v2, __m128i v3, + __m128i v4, __m128i v5, __m128i v6, __m128i v7, + __m128i v8, __m128i v9, __m128i v10, __m128i v11, + __m128i v12, __m128i v13, __m128i v14, __m128i v15) +{ + __m128i x0 = _mm_add_epi64(v0, v1); + __m128i x1 = _mm_add_epi64(v2, v3); + __m128i x2 = _mm_add_epi64(v4, v5); + __m128i x3 = _mm_add_epi64(v6, v7); + __m128i x4 = _mm_add_epi64(v8, v9); + __m128i x5 = _mm_add_epi64(v10, v11); + __m128i x6 = _mm_add_epi64(v12, v13); + __m128i x7 = _mm_add_epi64(v14, v15); + __m128i y0 = _mm_add_epi64(x0, x1); + __m128i y1 = _mm_add_epi64(x2, x3); + __m128i y2 = _mm_add_epi64(x4, x5); + __m128i y3 = _mm_add_epi64(x6, x7); + __m128i z0 = _mm_add_epi64(y0, y1); + __m128i z1 = _mm_add_epi64(y2, y3); + return _mm_add_epi64(z0, z1); +} + +__m128i vectors_and_floats( + __m128i v0, double f0, __m128i v1, double f1, + __m128i v2, double f2, __m128i v3, double f3, + double f4, __m128i v4, __m128i v5, double f5, + double f6, __m128i v6, __m128i v7, double f7, + double f8, double f9, __m128i v8, __m128i v9, + __m128i v10, double f10, double f11, double f12) +{ + __m128i x0 = _mm_add_epi64(v0, v1); + __m128i x1 = _mm_add_epi64(v2, v3); + __m128i x2 = _mm_add_epi64(v4, v5); + __m128i x3 = _mm_add_epi64(v6, v7); + __m128i x4 = _mm_add_epi64(v8, v9); + __m128i y0 = _mm_add_epi64(x0, x1); + __m128i y1 = _mm_add_epi64(x2, x3); + __m128i y2 = _mm_add_epi64(v10, x4); + __m128i z0 = _mm_add_epi64(y0, y1); + __m128i z = _mm_add_epi64(z0, y2); + double f = f0 + f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + f10 + f11 + f12; + return vec128_of_int64s((int64_t)f, vec128_low_int64(z) + vec128_high_int64(z)); +} + +__m128i vectors_and_floats_and_ints( + __m128i v0, double f0, __m128i v1, int64_t i0, + __m128i v2, double f1, __m128i v3, int64_t i1, + int64_t i2, __m128i v4, __m128i v5, double f2, + double f3, __m128i v6, __m128i v7, int64_t i3, + int64_t i4, double f4, __m128i v8, __m128i v9, + __m128i v10, int64_t i5, int64_t i6, double f5) +{ + __m128i x0 = _mm_add_epi64(v0, v1); + __m128i x1 = _mm_add_epi64(v2, v3); + __m128i x2 = _mm_add_epi64(v4, v5); + __m128i x3 = _mm_add_epi64(v6, v7); + __m128i x4 = _mm_add_epi64(v8, v9); + __m128i y0 = _mm_add_epi64(x0, x1); + __m128i y1 = _mm_add_epi64(x2, x3); + __m128i y2 = _mm_add_epi64(v10, x4); + __m128i z0 = _mm_add_epi64(y0, y1); + __m128i z = _mm_add_epi64(z0, y2); + double f = f0 + f1 + f2 + f3 + f4 + f5; + int64_t i = i0 + i1 + i2 + i3 + i4 + i5 + i6; + return vec128_of_int64s((int64_t)f + i, vec128_low_int64(z) + vec128_high_int64(z)); +} From 7fd59cf8274d922c451a814dd31aab1040eebdbd Mon Sep 17 00:00:00 2001 From: Max Slater Date: Fri, 23 Jun 2023 17:46:35 -0400 Subject: [PATCH 29/81] fix linscan? --- backend/linscan.ml | 9 ++++++++- backend/regalloc/regalloc_ls.ml | 22 ++++++++++++++++------ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/backend/linscan.ml b/backend/linscan.ml index 4a765a2ae2f..acdc44b6d80 100644 --- a/backend/linscan.ml +++ b/backend/linscan.ml @@ -151,6 +151,7 @@ let allocate_free_register num_stack_slots i = let allocate_blocked_register num_stack_slots i = let cl = Proc.register_class i.reg in + let sibling_classes = Proc.sibling_classes cl in let ci = active.(cl) in match ci.ci_active with | ilast :: il when @@ -165,7 +166,13 @@ let allocate_blocked_register num_stack_slots i = (* Use register from last interval for current interval *) i.reg.loc <- ilast.reg.loc; (* Remove the last interval from active and insert the current *) - ci.ci_active <- insert_interval_sorted i il; + Array.iter (fun sibling_class -> + let sib = active.(sibling_class) in + match sib.ci_active with + | silast :: sil -> + assert (silast = ilast); + sib.ci_active <- insert_interval_sorted i sil + | _ -> assert false) sibling_classes; (* Now get a new stack slot for the spilled register *) allocate_stack_slot num_stack_slots ilast | _ -> diff --git a/backend/regalloc/regalloc_ls.ml b/backend/regalloc/regalloc_ls.ml index d969aec2b87..84de55d05d0 100644 --- a/backend/regalloc/regalloc_ls.ml +++ b/backend/regalloc/regalloc_ls.ml @@ -185,21 +185,31 @@ let allocate_blocked_register : State.t -> Interval.t -> spilling_reg = fun state interval -> let reg = interval.reg in let reg_class = Proc.register_class reg in - let intervals = State.active state ~reg_class in + let sibling_classes = Proc.sibling_classes reg_class in + let cl_intervals = State.active_classes state in + let intervals = cl_intervals.(reg_class) in match intervals.active with - | hd :: tl -> + | hd :: _ -> let chk r = - assert (same_reg_class r.Interval.reg hd.Interval.reg); + assert (interfering_reg_class r.Interval.reg hd.Interval.reg); Reg.same_loc r.Interval.reg hd.Interval.reg && Interval.overlap r interval in if hd.end_ > interval.end_ && not - (List.exists ~f:chk intervals.fixed - || List.exists ~f:chk intervals.inactive) + (Array.exists sibling_classes ~f:(fun sibling_class -> + let intervals = cl_intervals.(sibling_class) in + List.exists ~f:chk intervals.fixed + || List.exists ~f:chk intervals.inactive)) then ( (match hd.reg.loc with Reg _ -> () | Stack _ | Unknown -> assert false); interval.reg.loc <- hd.reg.loc; - intervals.active <- Interval.List.insert_sorted tl interval; + Array.iter sibling_classes ~f:(fun sibling_class -> + let intervals = cl_intervals.(sibling_class) in + match intervals.active with + | sib_hd :: sib_tl -> + assert (sib_hd = hd); + intervals.active <- Interval.List.insert_sorted sib_tl interval + | _ -> assert false); allocate_stack_slot hd.reg) else allocate_stack_slot reg | [] -> allocate_stack_slot reg From 3289255347539d6e4775e648862445ffd764ee04 Mon Sep 17 00:00:00 2001 From: Max Slater Date: Fri, 23 Jun 2023 18:03:14 -0400 Subject: [PATCH 30/81] add more floats to simd test --- tests/simd/simd.ml | 75 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 12 deletions(-) diff --git a/tests/simd/simd.ml b/tests/simd/simd.ml index bfc3dd89496..4a084844064 100644 --- a/tests/simd/simd.ml +++ b/tests/simd/simd.ml @@ -18,6 +18,15 @@ let[@inline never] combine v0 v1 = vec128_of_int64s (Int64.add l0 l1) (Int64.add h0 h1) ;; +let[@inline never] combine_with_floats v0 f0 v1 f1 = + let l0, h0 = vec128_low_int64 v0, vec128_high_int64 v0 in + let l1, h1 = vec128_low_int64 v1, vec128_high_int64 v1 in + let l, h = Int64.add l0 l1, Int64.add h0 h1 in + let l = Int64.add (Int64.of_float f0) l in + let h = Int64.add (Int64.of_float f1) h in + vec128_of_int64s l h +;; + (* Identity *) let () = let v = vec128_of_int64s 1L 2L in @@ -41,6 +50,31 @@ let () = check v 4L 6L ;; +(* Pass to function (inlined) *) +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v = (combine[@inlined]) v0 v1 in + check v 4L 6L +;; + +(* Pass to function with floats *) +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let f0 = Sys.opaque_identity 5. in + let v = combine_with_floats v0 f0 v1 6. in + check v 9L 12L +;; + +(* Pass to function with floats (inlined) *) +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v = (combine_with_floats[@inlined]) v0 5. v1 6. in + check v 9L 12L +;; + (* Capture in closure *) let () = let v0 = vec128_of_int64s 1L 2L in @@ -51,39 +85,56 @@ let () = check v 4L 6L ;; -(* More vectors in closure *) +(* Capture vectors and floats in a closure *) let () = - let[@inline never] f v0 v1 v2 v3 = - combine (combine v0 v1) (combine v2 v3) + let[@inline never] f v0 v1 f0 v2 f1 v3 = + combine (combine_with_floats v0 f0 v1 f1) (combine v2 v3) in let v0 = vec128_of_int64s 1L 2L in let v1 = vec128_of_int64s 3L 4L in let v2 = vec128_of_int64s 4L 5L in let v3 = vec128_of_int64s 6L 7L in - let f = f v0 v1 v2 in + let f = f v0 v1 7. v2 in let f = Sys.opaque_identity f in - let v = f v3 in - check v 14L 18L + let v = f 8. v3 in + check v 21L 26L +;; + +(* Capture vectors and floats in a closure (inlined) *) +let () = + let[@inline always] f v0 v1 f0 v2 f1 v3 = + (combine[@inlined]) + ((combine_with_floats[@inlined]) v0 f0 v1 f1) + ((combine[@inlined]) v2 v3) + in + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v2 = vec128_of_int64s 4L 5L in + let v3 = vec128_of_int64s 6L 7L in + let f = f v0 v1 7. v2 in + let v = f 8. v3 in + check v 21L 26L ;; (* Store in record *) type record = { a : vec128 - ; mutable b : vec128 } + ; mutable b : vec128 + ; c : float } let () = - let record = { a = vec128_of_int64s 1L 2L; b = vec128_of_int64s 3L 4L } in + let record = { a = vec128_of_int64s 1L 2L; b = vec128_of_int64s 3L 4L; c = 5. } in check record.a 1L 2L; check record.b 3L 4L; let record = Sys.opaque_identity record in record.b <- vec128_of_int64s 5L 6L; check record.a 1L 2L; check record.b 5L 6L; - let v = combine record.a record.b in - check v 6L 8L + let v = combine_with_floats record.a record.c record.b 6. in + check v 11L 14L ;; (* Store in variant *) -type variant = A of vec128 | B of vec128 | C +type variant = A of vec128 | B of vec128 | C of float let () = let variant = A (vec128_of_int64s 1L 2L) in @@ -91,7 +142,7 @@ let () = match variant with | A v -> check v 1L 2L | _ -> print_endline "fail"; - let variant = ref C in + let variant = ref (C 5.) in let variant = Sys.opaque_identity variant in variant := B (vec128_of_int64s 3L 4L); match !variant with From a97dd4fd2d0284bb52dedd002758909fb2338e18 Mon Sep 17 00:00:00 2001 From: Max Slater Date: Tue, 27 Jun 2023 14:00:39 -0400 Subject: [PATCH 31/81] found missing case --- middle_end/flambda2/types/provers.ml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/middle_end/flambda2/types/provers.ml b/middle_end/flambda2/types/provers.ml index 089649a75d1..c5a897e21c2 100644 --- a/middle_end/flambda2/types/provers.ml +++ b/middle_end/flambda2/types/provers.ml @@ -914,6 +914,9 @@ let prove_physical_equality env t1 t2 = | Naked_nativeint (Ok s1), Naked_nativeint (Ok s2) -> let module IS = Targetint_32_64.Set in IS.is_empty (IS.inter (s1 :> IS.t) (s2 :> IS.t)) + | Naked_vec128 (Ok s1), Naked_vec128 (Ok s2) -> + let module IS = Numeric_types.Vec128_by_bit_pattern.Set in + IS.is_empty (IS.inter (s1 :> IS.t) (s2 :> IS.t)) | _, _ -> false in let check_heads () : _ proof_of_property = From bf4dc9c34c2c40f0eedb066a7e87100eede6805a Mon Sep 17 00:00:00 2001 From: Max Slater Date: Tue, 27 Jun 2023 16:23:37 -0400 Subject: [PATCH 32/81] fix static const kind --- middle_end/flambda2/to_cmm/to_cmm_static.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/middle_end/flambda2/to_cmm/to_cmm_static.ml b/middle_end/flambda2/to_cmm/to_cmm_static.ml index 403a8deedd6..dca50a7c408 100644 --- a/middle_end/flambda2/to_cmm/to_cmm_static.ml +++ b/middle_end/flambda2/to_cmm/to_cmm_static.ml @@ -163,7 +163,7 @@ let static_const0 env res ~updates (bound_static : Bound_static.Pattern.t) let transl = Numeric_types.Vec128_by_bit_pattern.to_int64s in let structured (v0, v1) = Clambda.Uconst_vec128 (v0, v1) in let res, env, updates = - static_boxed_number ~kind:Word_int ~env ~symbol ~default + static_boxed_number ~kind:Onetwentyeight ~env ~symbol ~default ~emit:C.emit_vec128_constant ~transl ~structured v res updates in env, res, updates From 4e685f00b393877bcea6df12e1bb5a10415cb68f Mon Sep 17 00:00:00 2001 From: Max Slater Date: Tue, 27 Jun 2023 17:17:09 -0400 Subject: [PATCH 33/81] remove vec128 consts from upstream clambda --- ocaml/asmcomp/cmmgen.ml | 2 -- ocaml/middle_end/clambda.ml | 5 ----- ocaml/middle_end/clambda.mli | 1 - ocaml/middle_end/closure/closure.ml | 2 +- ocaml/middle_end/printclambda.ml | 1 - 5 files changed, 1 insertion(+), 10 deletions(-) diff --git a/ocaml/asmcomp/cmmgen.ml b/ocaml/asmcomp/cmmgen.ml index 7c46367962a..05c075dd144 100644 --- a/ocaml/asmcomp/cmmgen.ml +++ b/ocaml/asmcomp/cmmgen.ml @@ -230,8 +230,6 @@ let emit_structured_constant ((_sym, is_global) as symb) cst cont = emit_int64_constant symb n cont | Uconst_nativeint n -> emit_nativeint_constant symb n cont - | Uconst_vec128 _ -> - Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." | Uconst_block (tag, csts) -> let cont = List.fold_right emit_constant csts cont in emit_block symb (block_header tag (List.length csts)) cont diff --git a/ocaml/middle_end/clambda.ml b/ocaml/middle_end/clambda.ml index e5c9b7091b0..39ddb424930 100644 --- a/ocaml/middle_end/clambda.ml +++ b/ocaml/middle_end/clambda.ml @@ -32,7 +32,6 @@ type ustructured_constant = | Uconst_int32 of int32 | Uconst_int64 of int64 | Uconst_nativeint of nativeint - | Uconst_vec128 of int64 * int64 | Uconst_block of int * uconstant list | Uconst_float_array of float list | Uconst_string of string @@ -212,7 +211,6 @@ let rank_structured_constant = function | Uconst_float_array _ -> 5 | Uconst_string _ -> 6 | Uconst_closure _ -> 7 - | Uconst_vec128 _ -> 8 let compare_structured_constants c1 c2 = match c1, c2 with @@ -228,9 +226,6 @@ let compare_structured_constants c1 c2 = | Uconst_string s1, Uconst_string s2 -> String.compare s1 s2 | Uconst_closure (_,lbl1,_), Uconst_closure (_,lbl2,_) -> String.compare lbl1 lbl2 - | Uconst_vec128 (l0, l1), Uconst_vec128 (r0, r1) -> - let cmp = Int64.compare l0 r0 in - if cmp = 0 then Int64.compare l1 r1 else cmp | _, _ -> (* no overflow possible here *) rank_structured_constant c1 - rank_structured_constant c2 diff --git a/ocaml/middle_end/clambda.mli b/ocaml/middle_end/clambda.mli index 84f50236b9e..ed7254d40da 100644 --- a/ocaml/middle_end/clambda.mli +++ b/ocaml/middle_end/clambda.mli @@ -32,7 +32,6 @@ type ustructured_constant = | Uconst_int32 of int32 | Uconst_int64 of int64 | Uconst_nativeint of nativeint - | Uconst_vec128 of int64 * int64 | Uconst_block of int * uconstant list | Uconst_float_array of float list | Uconst_string of string diff --git a/ocaml/middle_end/closure/closure.ml b/ocaml/middle_end/closure/closure.ml index 93e8b142d0e..7d009724b70 100644 --- a/ocaml/middle_end/closure/closure.ml +++ b/ocaml/middle_end/closure/closure.ml @@ -1749,7 +1749,7 @@ let collect_exported_structured_constants a = and structured_constant = function | Uconst_block (_, ul) -> List.iter const ul | Uconst_float _ | Uconst_int32 _ - | Uconst_int64 _ | Uconst_nativeint _ | Uconst_vec128 _ + | Uconst_int64 _ | Uconst_nativeint _ | Uconst_float_array _ | Uconst_string _ -> () | Uconst_closure _ -> assert false (* Cannot be generated *) and ulam = function diff --git a/ocaml/middle_end/printclambda.ml b/ocaml/middle_end/printclambda.ml index efe81994d85..0919908b4eb 100644 --- a/ocaml/middle_end/printclambda.ml +++ b/ocaml/middle_end/printclambda.ml @@ -68,7 +68,6 @@ let rec structured_constant ppf = function | Uconst_int32 x -> fprintf ppf "%ldl" x | Uconst_int64 x -> fprintf ppf "%LdL" x | Uconst_nativeint x -> fprintf ppf "%ndn" x - | Uconst_vec128 (v0, v1) -> fprintf ppf "%Ld:%Ld" v0 v1 | Uconst_block (tag, l) -> fprintf ppf "block(%i" tag; List.iter (fun u -> fprintf ppf ",%a" uconstant u) l; From 95022556c8a5c34e2b393f75806b572554c399b5 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Wed, 5 Jul 2023 13:02:19 -0400 Subject: [PATCH 34/81] int64*int64 -> record --- backend/amd64/emit.mlp | 24 +++++++++---------- backend/cfg/cfg.ml | 3 ++- backend/cfg/cfg_intf.ml | 2 +- backend/cfg/cfg_to_linear_desc.ml | 2 +- backend/cfg/cfgize.ml | 2 +- backend/cfg/linear_to_cfg.ml | 2 +- backend/cmm.ml | 6 +++-- backend/cmm.mli | 8 +++++-- backend/cmm_helpers.ml | 12 +++++----- backend/cmm_helpers.mli | 6 ++--- backend/cmmgen.ml | 4 ++-- backend/mach.ml | 2 +- backend/mach.mli | 2 +- backend/printcmm.ml | 5 ++-- backend/printmach.ml | 2 +- backend/selectgen.ml | 4 ++-- middle_end/clambda.ml | 4 ++-- middle_end/clambda.mli | 2 +- middle_end/flambda2/numbers/numeric_types.ml | 13 ++++++---- middle_end/flambda2/numbers/numeric_types.mli | 9 +++++-- middle_end/flambda2/parser/fexpr.ml | 4 ++-- .../flambda2/parser/fexpr_to_flambda.ml | 6 ++--- .../flambda2/parser/flambda_to_fexpr.ml | 5 ++-- middle_end/flambda2/parser/print_fexpr.ml | 4 ++-- middle_end/flambda2/to_cmm/to_cmm_expr.ml | 2 +- middle_end/flambda2/to_cmm/to_cmm_shared.ml | 11 +++++++-- middle_end/flambda2/to_cmm/to_cmm_static.ml | 9 +++++-- middle_end/printclambda.ml | 2 +- 28 files changed, 93 insertions(+), 64 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 90eaeb18bab..ac4c6d9c13c 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -684,21 +684,21 @@ let emit_float_constant f lbl = (* Vector constants *) -let vec128_constants = ref ([] : ((int64 * int64) * int) list) +let vec128_constants = ref ([] : (Cmm.vec128_bits * int) list) -let add_vec128_constant (v0, v1) = +let add_vec128_constant bits = try - List.assoc (v0, v1) !vec128_constants + List.assoc bits !vec128_constants with Not_found -> let lbl = new_label() in - vec128_constants := ((v0, v1), lbl) :: !vec128_constants; + vec128_constants := (bits, lbl) :: !vec128_constants; lbl -let emit_vec128_constant (v0, v1) lbl = +let emit_vec128_constant {high; low} lbl = _label (emit_label lbl); (* SIMD vectors respect little-endian byte order *) - D.qword (Const v1); - D.qword (Const v0) + D.qword (Const low); + D.qword (Const high) let emit_global_label_for_symbol lbl = add_def_symbol lbl; @@ -945,12 +945,12 @@ let emit_instr fallthrough i = let lbl = add_float_constant f in I.movsd (mem64_rip REAL8 (emit_label lbl)) (res i 0) end - | Lop(Iconst_vec128 (v0, v1)) -> - begin match (v0, v1) with + | Lop(Iconst_vec128 {high; low}) -> + begin match (high, low) with | 0x0000_0000_0000_0000L, 0x0000_0000_0000_0000L -> I.xorpd (res i 0) (res i 0) | _ -> - let lbl = add_vec128_constant (v0, v1) in + let lbl = add_vec128_constant {high; low} in I.movupd (mem64_rip VEC128 (emit_label lbl)) (res i 0) end | Lop(Iconst_symbol s) -> @@ -1524,7 +1524,7 @@ let emit_item = function | Csingle f -> D.long (Const (Int64.of_int32 (Int32.bits_of_float f))) | Cdouble f -> D.qword (Const (Int64.bits_of_float f)) (* SIMD vectors respect little-endian byte order *) - | Cvec128 (v0, v1) -> D.qword (Const v1); D.qword (Const v0) + | Cvec128 {high; low} -> D.qword (Const low); D.qword (Const high) | Csymbol_address s -> add_used_symbol s.sym_name; D.qword (ConstLabel (emit_cmm_symbol s)) @@ -1917,7 +1917,7 @@ let end_assembly () = end; D.align ~data:true 8; List.iter (fun (cst,lbl) -> emit_float_constant cst lbl) !float_constants; - List.iter (fun ((v0,v1),lbl) -> emit_vec128_constant (v0, v1) lbl) !vec128_constants; + List.iter (fun (cst,lbl) -> emit_vec128_constant cst lbl) !vec128_constants; end; (* Emit probe handler wrappers *) diff --git a/backend/cfg/cfg.ml b/backend/cfg/cfg.ml index c30171cb5e9..a8db9e5b474 100644 --- a/backend/cfg/cfg.ml +++ b/backend/cfg/cfg.ml @@ -247,7 +247,8 @@ let dump_op ppf = function | Const_int n -> Format.fprintf ppf "const_int %nd" n | Const_float f -> Format.fprintf ppf "const_float %F" (Int64.float_of_bits f) | Const_symbol s -> Format.fprintf ppf "const_symbol %s" s.sym_name - | Const_vec128 (v0, v1) -> Format.fprintf ppf "const vec128 %Ld:%Ld" v0 v1 + | Const_vec128 { high; low } -> + Format.fprintf ppf "const vec128 %Ld:%Ld" high low | Stackoffset n -> Format.fprintf ppf "stackoffset %d" n | Load _ -> Format.fprintf ppf "load" | Store _ -> Format.fprintf ppf "store" diff --git a/backend/cfg/cfg_intf.ml b/backend/cfg/cfg_intf.ml index 6587d8950c6..02e6d06447b 100644 --- a/backend/cfg/cfg_intf.ml +++ b/backend/cfg/cfg_intf.ml @@ -62,7 +62,7 @@ module S = struct | Const_int of nativeint (* CR-someday xclerc: change to `Targetint.t` *) | Const_float of int64 | Const_symbol of Cmm.symbol - | Const_vec128 of int64 * int64 + | Const_vec128 of Cmm.vec128_bits | Stackoffset of int | Load of Cmm.memory_chunk * Arch.addressing_mode * Mach.mutable_flag | Store of Cmm.memory_chunk * Arch.addressing_mode * bool diff --git a/backend/cfg/cfg_to_linear_desc.ml b/backend/cfg/cfg_to_linear_desc.ml index 9e28121d746..1391f887ff0 100644 --- a/backend/cfg/cfg_to_linear_desc.ml +++ b/backend/cfg/cfg_to_linear_desc.ml @@ -15,7 +15,7 @@ let from_basic (basic : basic) : Linear.instruction_desc = | Const_int n -> Iconst_int n | Const_float n -> Iconst_float n | Const_symbol n -> Iconst_symbol n - | Const_vec128 (v0, v1) -> Iconst_vec128 (v0, v1) + | Const_vec128 bits -> Iconst_vec128 bits | Stackoffset n -> Istackoffset n | Load (c, m, i) -> Iload (c, m, i) | Store (c, m, b) -> Istore (c, m, b) diff --git a/backend/cfg/cfgize.ml b/backend/cfg/cfgize.ml index c2ea69c1320..9b54bda1556 100644 --- a/backend/cfg/cfgize.ml +++ b/backend/cfg/cfgize.ml @@ -144,7 +144,7 @@ let basic_or_terminator_of_operation : | Iconst_int i -> Basic (Op (Const_int i)) | Iconst_float f -> Basic (Op (Const_float f)) | Iconst_symbol s -> Basic (Op (Const_symbol s)) - | Iconst_vec128 (v0, v1) -> Basic (Op (Const_vec128 (v0, v1))) + | Iconst_vec128 bits -> Basic (Op (Const_vec128 bits)) | Icall_ind -> With_next_label (fun label_after -> Call { op = Indirect; label_after }) | Icall_imm { func } -> diff --git a/backend/cfg/linear_to_cfg.ml b/backend/cfg/linear_to_cfg.ml index 5c9e0f78e13..ec063de200c 100644 --- a/backend/cfg/linear_to_cfg.ml +++ b/backend/cfg/linear_to_cfg.ml @@ -616,7 +616,7 @@ let rec create_blocks (t : t) (i : L.instruction) (block : C.basic_block) | Iconst_int n -> basic (Const_int n) | Iconst_float n -> basic (Const_float n) | Iconst_symbol n -> basic (Const_symbol n) - | Iconst_vec128 (v0, v1) -> basic (Const_vec128 (v0, v1)) + | Iconst_vec128 bits -> basic (Const_vec128 bits) | Inegf -> basic Negf | Iabsf -> basic Absf | Iaddf -> basic Addf diff --git a/backend/cmm.ml b/backend/cmm.ml index 28b08ee64a6..b44aaad58f9 100644 --- a/backend/cmm.ml +++ b/backend/cmm.ml @@ -250,13 +250,15 @@ type symbol = { sym_name : string; sym_global : is_global } +type vec128_bits = { low : int64; high: int64 } + let global_symbol sym_name = { sym_name; sym_global = Global } type expression = Cconst_int of int * Debuginfo.t | Cconst_natint of nativeint * Debuginfo.t | Cconst_float of float * Debuginfo.t - | Cconst_vec128 of int64 * int64 * Debuginfo.t + | Cconst_vec128 of vec128_bits * Debuginfo.t | Cconst_symbol of symbol * Debuginfo.t | Cvar of Backend_var.t | Clet of Backend_var.With_provenance.t * expression * expression @@ -311,7 +313,7 @@ type data_item = | Cint of nativeint | Csingle of float | Cdouble of float - | Cvec128 of int64 * int64 + | Cvec128 of vec128_bits | Csymbol_address of symbol | Cstring of string | Cskip of int diff --git a/backend/cmm.mli b/backend/cmm.mli index 091daa90b6f..ba87b7cc7d5 100644 --- a/backend/cmm.mli +++ b/backend/cmm.mli @@ -257,6 +257,10 @@ type symbol = { sym_name : string; sym_global : is_global } +(* SIMD vectors are untyped in the backend. + This record holds the bitwise representation of a 128-bit value. *) +type vec128_bits = { low : int64; high: int64 } + val global_symbol : string -> symbol (** Every basic block should have a corresponding [Debuginfo.t] for its @@ -265,7 +269,7 @@ type expression = Cconst_int of int * Debuginfo.t | Cconst_natint of nativeint * Debuginfo.t | Cconst_float of float * Debuginfo.t - | Cconst_vec128 of int64 * int64 * Debuginfo.t + | Cconst_vec128 of vec128_bits * Debuginfo.t | Cconst_symbol of symbol * Debuginfo.t | Cvar of Backend_var.t | Clet of Backend_var.With_provenance.t * expression * expression @@ -323,7 +327,7 @@ type data_item = | Cint of nativeint | Csingle of float | Cdouble of float - | Cvec128 of int64 * int64 + | Cvec128 of vec128_bits | Csymbol_address of symbol | Cstring of string | Cskip of int diff --git a/backend/cmm_helpers.ml b/backend/cmm_helpers.ml index 785711d8467..a9ee20c18f8 100644 --- a/backend/cmm_helpers.ml +++ b/backend/cmm_helpers.ml @@ -727,9 +727,9 @@ let rec unbox_vector dbg vi = c | Cconst_symbol (s, _dbg) as cmm -> ( match Cmmgen_state.structured_constant_of_sym s.sym_name with - | Some (Uconst_vec128 (v0, v1)) -> + | Some (Uconst_vec128 { low; high }) -> assert (vi = Primitive.Pvec128); - Cconst_vec128 (v0, v1, dbg) (* or keep _dbg? *) + Cconst_vec128 ({ low; high }, dbg) (* or keep _dbg? *) | _ -> Cop (Cload (load, Immutable), [cmm], dbg)) | Cregion e as cmm -> ( (* It is valid to push unboxing inside a Cregion except when the extra @@ -3760,8 +3760,8 @@ let emit_nativeint_constant symb n cont = emit_block symb boxedintnat_header (emit_boxed_nativeint_constant_fields n cont) -let emit_vec128_constant symb (v0, v1) cont = - emit_block symb boxedvec128_header (Cvec128 (v0, v1) :: cont) +let emit_vec128_constant symb bits cont = + emit_block symb boxedvec128_header (Cvec128 bits :: cont) let emit_float_array_constant symb fields cont = emit_block symb @@ -4121,7 +4121,7 @@ let int32 ~dbg i = natint_const_untagged dbg (Nativeint.of_int32 i) cross-compiling for 64-bit on a 32-bit host *) let int64 ~dbg i = natint_const_untagged dbg (Int64.to_nativeint i) -let vec128 ~dbg (v0, v1) = Cconst_vec128 (v0, v1, dbg) +let vec128 ~dbg bits = Cconst_vec128 (bits, dbg) let nativeint ~dbg i = natint_const_untagged dbg i @@ -4386,7 +4386,7 @@ let cint i = Cmm.Cint i let cfloat f = Cmm.Cdouble f -let cvec128 (a, b) = Cmm.Cvec128 (a, b) +let cvec128 bits = Cmm.Cvec128 bits let symbol_address s = Cmm.Csymbol_address s diff --git a/backend/cmm_helpers.mli b/backend/cmm_helpers.mli index 912fb8606b4..ae606d726ab 100644 --- a/backend/cmm_helpers.mli +++ b/backend/cmm_helpers.mli @@ -957,7 +957,7 @@ val emit_nativeint_constant : symbol -> nativeint -> data_item list -> data_item list val emit_vec128_constant : - symbol -> int64 * int64 -> data_item list -> data_item list + symbol -> Cmm.vec128_bits -> data_item list -> data_item list val emit_float_array_constant : symbol -> float list -> data_item list -> data_item list @@ -1006,7 +1006,7 @@ val int32 : dbg:Debuginfo.t -> int32 -> expression val int64 : dbg:Debuginfo.t -> int64 -> expression (** Create a constant vec128 expression from two int64s. *) -val vec128 : dbg:Debuginfo.t -> int64 * int64 -> expression +val vec128 : dbg:Debuginfo.t -> Cmm.vec128_bits -> expression (** Create a constant int expression from a nativeint. *) val nativeint : dbg:Debuginfo.t -> Nativeint.t -> expression @@ -1254,7 +1254,7 @@ val cint : nativeint -> data_item val cfloat : float -> data_item (** Static 128-bit vector. *) -val cvec128 : int64 * int64 -> data_item +val cvec128 : Cmm.vec128_bits -> data_item (** Static symbol. *) val symbol_address : symbol -> data_item diff --git a/backend/cmmgen.ml b/backend/cmmgen.ml index 698bfaa867d..65574c3c4f3 100644 --- a/backend/cmmgen.ml +++ b/backend/cmmgen.ml @@ -276,8 +276,8 @@ let emit_structured_constant symb cst cont = emit_int64_constant symb n cont | Uconst_nativeint n -> emit_nativeint_constant symb n cont - | Uconst_vec128 (v0, v1) -> - emit_vec128_constant symb (v0, v1) cont + | Uconst_vec128 {high; low} -> + emit_vec128_constant symb {high; low} cont | Uconst_block (tag, csts) -> let cont = List.fold_right emit_constant csts cont in emit_block symb (block_header tag (List.length csts)) cont diff --git a/backend/mach.ml b/backend/mach.ml index aa4ad3a5169..0c532ddf0aa 100644 --- a/backend/mach.ml +++ b/backend/mach.ml @@ -52,7 +52,7 @@ type operation = | Ireload | Iconst_int of nativeint | Iconst_float of int64 - | Iconst_vec128 of int64 * int64 + | Iconst_vec128 of Cmm.vec128_bits | Iconst_symbol of Cmm.symbol | Icall_ind | Icall_imm of { func : Cmm.symbol; } diff --git a/backend/mach.mli b/backend/mach.mli index 5790e16523a..83b5c81315b 100644 --- a/backend/mach.mli +++ b/backend/mach.mli @@ -55,7 +55,7 @@ type operation = | Ireload | Iconst_int of nativeint | Iconst_float of int64 - | Iconst_vec128 of int64 * int64 + | Iconst_vec128 of Cmm.vec128_bits | Iconst_symbol of Cmm.symbol | Icall_ind | Icall_imm of { func : Cmm.symbol; } diff --git a/backend/printcmm.ml b/backend/printcmm.ml index 95f7e1370a0..35d7d52f025 100644 --- a/backend/printcmm.ml +++ b/backend/printcmm.ml @@ -247,7 +247,7 @@ let rec expr ppf = function | Cconst_int (n, _dbg) -> fprintf ppf "%i" n | Cconst_natint (n, _dbg) -> fprintf ppf "%s" (Nativeint.to_string n) - | Cconst_vec128 (v0, v1, _dbg) -> fprintf ppf "%Ld:%Ld" v0 v1 + | Cconst_vec128 ({low; high}, _dbg) -> fprintf ppf "%Ld:%Ld" high low | Cconst_float (n, _dbg) -> fprintf ppf "%F" n | Cconst_symbol (s, _dbg) -> fprintf ppf "%a:\"%s\"" is_global s.sym_global s.sym_name | Cvar id -> V.print ppf id @@ -415,7 +415,8 @@ let data_item ppf = function | Cint n -> fprintf ppf "int %s" (Nativeint.to_string n) | Csingle f -> fprintf ppf "single %F" f | Cdouble f -> fprintf ppf "double %F" f - | Cvec128 (v0, v1) -> fprintf ppf "vec128 %s:%s" (Int64.to_string v0) (Int64.to_string v1) + | Cvec128 {high; low} -> + fprintf ppf "vec128 %s:%s" (Int64.to_string high) (Int64.to_string low) | Csymbol_address s -> fprintf ppf "addr %a:\"%s\"" is_global s.sym_global s.sym_name | Cstring s -> fprintf ppf "string \"%s\"" s | Cskip n -> fprintf ppf "skip %i" n diff --git a/backend/printmach.ml b/backend/printmach.ml index 5bef68ef63c..c041246bae7 100644 --- a/backend/printmach.ml +++ b/backend/printmach.ml @@ -164,7 +164,7 @@ let operation' ?(print_reg = reg) op arg ppf res = | Iconst_int n -> fprintf ppf "%s" (Nativeint.to_string n) | Iconst_float f -> fprintf ppf "%F" (Int64.float_of_bits f) | Iconst_symbol s -> fprintf ppf "\"%s\"" s.sym_name - | Iconst_vec128 (v0, v1) -> fprintf ppf "%Ld:%Ld" v0 v1 + | Iconst_vec128 {high; low} -> fprintf ppf "%Ld:%Ld" high low | Icall_ind -> fprintf ppf "call %a" regs arg | Icall_imm { func; } -> fprintf ppf "call \"%s\" %a" func.sym_name regs arg | Itailcall_ind -> fprintf ppf "tailcall %a" regs arg diff --git a/backend/selectgen.ml b/backend/selectgen.ml index 96356ff9c84..d4845c0540a 100644 --- a/backend/selectgen.ml +++ b/backend/selectgen.ml @@ -857,9 +857,9 @@ method emit_expr_aux (env:environment) exp : | Cconst_float (n, _dbg) -> let r = self#regs_for typ_float in ret (self#insert_op env (Iconst_float (Int64.bits_of_float n)) [||] r) - | Cconst_vec128 (v0, v1, _dbg) -> + | Cconst_vec128 (bits, _dbg) -> let r = self#regs_for typ_vec128 in - ret (self#insert_op env (Iconst_vec128 (v0, v1)) [||] r) + ret (self#insert_op env (Iconst_vec128 bits) [||] r) | Cconst_symbol (n, _dbg) -> (* Cconst_symbol _ evaluates to a statically-allocated address, so its value fits in a typ_int register and is never changed by the GC. diff --git a/middle_end/clambda.ml b/middle_end/clambda.ml index 74ccc443ce6..b33bccf65ff 100644 --- a/middle_end/clambda.ml +++ b/middle_end/clambda.ml @@ -32,7 +32,7 @@ type ustructured_constant = | Uconst_int32 of int32 | Uconst_int64 of int64 | Uconst_nativeint of nativeint - | Uconst_vec128 of int64 * int64 + | Uconst_vec128 of { high : int64; low : int64 } | Uconst_block of int * uconstant list | Uconst_float_array of float list | Uconst_string of string @@ -229,7 +229,7 @@ let compare_structured_constants c1 c2 = | Uconst_string s1, Uconst_string s2 -> String.compare s1 s2 | Uconst_closure (_,lbl1,_), Uconst_closure (_,lbl2,_) -> String.compare lbl1 lbl2 - | Uconst_vec128 (l0, l1), Uconst_vec128 (r0, r1) -> + | Uconst_vec128 {high = l0; low = l1}, Uconst_vec128 {high = r0; low = r1} -> let cmp = Int64.compare l0 r0 in if cmp = 0 then Int64.compare l1 r1 else cmp | _, _ -> diff --git a/middle_end/clambda.mli b/middle_end/clambda.mli index 4c25b90f2bd..42250fb7010 100644 --- a/middle_end/clambda.mli +++ b/middle_end/clambda.mli @@ -32,7 +32,7 @@ type ustructured_constant = | Uconst_int32 of int32 | Uconst_int64 of int64 | Uconst_nativeint of nativeint - | Uconst_vec128 of int64 * int64 + | Uconst_vec128 of { high : int64; low : int64 } | Uconst_block of int * uconstant list | Uconst_float_array of float list | Uconst_string of string diff --git a/middle_end/flambda2/numbers/numeric_types.ml b/middle_end/flambda2/numbers/numeric_types.ml index 0ef2c9ac472..cf99cd4e044 100644 --- a/middle_end/flambda2/numbers/numeric_types.ml +++ b/middle_end/flambda2/numbers/numeric_types.ml @@ -294,10 +294,15 @@ module Vec128_by_bit_pattern = struct let size_in_int64s = 2 end) - let to_int64s t = + type bits = + { high : int64; + low : int64 + } + + let to_bits t = match to_int64_array t with - | [| a; b |] -> a, b - | _ -> Misc.fatal_error "Vec128.to_int64s: wrong size vector" + | [| high; low |] -> { high; low } + | _ -> Misc.fatal_error "Vec128.to_bits: wrong size vector" - let of_int64s (v0, v1) = of_int64_array [| v0; v1 |] + let of_bits { high; low } = of_int64_array [| high; low |] end diff --git a/middle_end/flambda2/numbers/numeric_types.mli b/middle_end/flambda2/numbers/numeric_types.mli index 6fd80ecf7de..2ccbd662930 100644 --- a/middle_end/flambda2/numbers/numeric_types.mli +++ b/middle_end/flambda2/numbers/numeric_types.mli @@ -143,7 +143,12 @@ module Vec128_by_bit_pattern : sig val zero : t - val to_int64s : t -> int64 * int64 + type bits = + { high : int64; + low : int64 + } - val of_int64s : int64 * int64 -> t + val to_bits : t -> bits + + val of_bits : bits -> t end diff --git a/middle_end/flambda2/parser/fexpr.ml b/middle_end/flambda2/parser/fexpr.ml index 07da8bd9979..1fd0b889764 100644 --- a/middle_end/flambda2/parser/fexpr.ml +++ b/middle_end/flambda2/parser/fexpr.ml @@ -57,7 +57,7 @@ type const = | Naked_float of float | Naked_int32 of int32 | Naked_int64 of int64 - | Naked_vec128 of int64 * int64 + | Naked_vec128 of Numeric_types.Vec128_by_bit_pattern.bits | Naked_nativeint of targetint type field_of_block = @@ -90,7 +90,7 @@ type static_data = | Boxed_int32 of int32 or_variable | Boxed_int64 of int64 or_variable | Boxed_nativeint of targetint or_variable - | Boxed_vec128 of (int64 * int64) or_variable + | Boxed_vec128 of Numeric_types.Vec128_by_bit_pattern.bits or_variable | Immutable_float_block of float or_variable list | Immutable_float_array of float or_variable list | Immutable_value_array of field_of_block list diff --git a/middle_end/flambda2/parser/fexpr_to_flambda.ml b/middle_end/flambda2/parser/fexpr_to_flambda.ml index efd545ff5c3..7d13c088030 100644 --- a/middle_end/flambda2/parser/fexpr_to_flambda.ml +++ b/middle_end/flambda2/parser/fexpr_to_flambda.ml @@ -238,8 +238,8 @@ let targetint (i : Fexpr.targetint) : Targetint_32_64.t = let targetint_31_63 (i : Fexpr.targetint) : Targetint_31_63.t = Targetint_31_63.of_int64 i -let vec128 (v0, v1) : Numeric_types.Vec128_by_bit_pattern.t = - Numeric_types.Vec128_by_bit_pattern.of_int64s (v0, v1) +let vec128 bits : Numeric_types.Vec128_by_bit_pattern.t = + Numeric_types.Vec128_by_bit_pattern.of_bits bits let tag_scannable (tag : Fexpr.tag_scannable) : Tag.Scannable.t = Tag.Scannable.create_exn tag @@ -297,7 +297,7 @@ let const (c : Fexpr.const) : Reg_width_const.t = | Naked_int32 i -> Reg_width_const.naked_int32 i | Naked_int64 i -> Reg_width_const.naked_int64 i | Naked_nativeint i -> Reg_width_const.naked_nativeint (i |> targetint) - | Naked_vec128 (v0, v1) -> Reg_width_const.naked_vec128 ((v0, v1) |> vec128) + | Naked_vec128 bits -> Reg_width_const.naked_vec128 (bits |> vec128) let rec rec_info env (ri : Fexpr.rec_info) : Rec_info_expr.t = let module US = Rec_info_expr.Unrolling_state in diff --git a/middle_end/flambda2/parser/flambda_to_fexpr.ml b/middle_end/flambda2/parser/flambda_to_fexpr.ml index 010bfff8c72..f1725cb35b7 100644 --- a/middle_end/flambda2/parser/flambda_to_fexpr.ml +++ b/middle_end/flambda2/parser/flambda_to_fexpr.ml @@ -354,7 +354,7 @@ let name env n = let float f = f |> Numeric_types.Float_by_bit_pattern.to_float -let vec128 v = v |> Numeric_types.Vec128_by_bit_pattern.to_int64s +let vec128 v = v |> Numeric_types.Vec128_by_bit_pattern.to_bits let targetint i = i |> Targetint_32_64.to_int64 @@ -370,8 +370,7 @@ let const c : Fexpr.const = | Naked_int32 i -> Naked_int32 i | Naked_int64 i -> Naked_int64 i | Naked_vec128 i -> - let v0, v1 = Numeric_types.Vec128_by_bit_pattern.to_int64s i in - Naked_vec128 (v0, v1) + Naked_vec128 (Numeric_types.Vec128_by_bit_pattern.to_bits i) | Naked_nativeint i -> Naked_nativeint (i |> targetint) let depth_or_infinity (d : int Or_infinity.t) : Fexpr.rec_info = diff --git a/middle_end/flambda2/parser/print_fexpr.ml b/middle_end/flambda2/parser/print_fexpr.ml index dd14227a5a9..316fce77ca0 100644 --- a/middle_end/flambda2/parser/print_fexpr.ml +++ b/middle_end/flambda2/parser/print_fexpr.ml @@ -257,7 +257,7 @@ let const ppf (c : Fexpr.const) = | Naked_int32 i -> Format.fprintf ppf "%lil" i | Naked_int64 i -> Format.fprintf ppf "%LiL" i | Naked_nativeint i -> Format.fprintf ppf "%Lin" i - | Naked_vec128 (v0, v1) -> Format.fprintf ppf "%Ld:%Ld" v0 v1 + | Naked_vec128 { high; low } -> Format.fprintf ppf "%Ld:%Ld" high low let rec simple ppf : simple -> unit = function | Symbol s -> symbol ppf s @@ -322,7 +322,7 @@ let static_data ppf : static_data -> unit = function | Boxed_int32 (Const i) -> Format.fprintf ppf "%lil" i | Boxed_int64 (Const i) -> Format.fprintf ppf "%LiL" i | Boxed_nativeint (Const i) -> Format.fprintf ppf "%Lin" i - | Boxed_vec128 (Const (v0, v1)) -> Format.fprintf ppf "%Ld:%Ld" v0 v1 + | Boxed_vec128 (Const { high; low }) -> Format.fprintf ppf "%Ld:%Ld" high low | Boxed_float (Var v) -> boxed_variable ppf v ~kind:"float" | Boxed_int32 (Var v) -> boxed_variable ppf v ~kind:"int32" | Boxed_int64 (Var v) -> boxed_variable ppf v ~kind:"int64" diff --git a/middle_end/flambda2/to_cmm/to_cmm_expr.ml b/middle_end/flambda2/to_cmm/to_cmm_expr.ml index 236eee5d426..6e2deec94e0 100644 --- a/middle_end/flambda2/to_cmm/to_cmm_expr.ml +++ b/middle_end/flambda2/to_cmm/to_cmm_expr.ml @@ -630,7 +630,7 @@ and let_cont_exn_handler env res k body vars handler free_vars_of_handler | Naked_number (Naked_immediate | Naked_int32 | Naked_int64 | Naked_nativeint) -> C.int ~dbg 0 - | Naked_number Naked_vec128 -> C.vec128 ~dbg (0L, 0L) + | Naked_number Naked_vec128 -> C.vec128 ~dbg { high = 0L; low = 0L } | Region | Rec_info -> Misc.fatal_errorf "No dummy value available for kind %a" K.With_subkind.print kind diff --git a/middle_end/flambda2/to_cmm/to_cmm_shared.ml b/middle_end/flambda2/to_cmm/to_cmm_shared.ml index 0d02646c65c..c2311f6cd4f 100644 --- a/middle_end/flambda2/to_cmm/to_cmm_shared.ml +++ b/middle_end/flambda2/to_cmm/to_cmm_shared.ml @@ -136,7 +136,10 @@ let const ~dbg cst = | Naked_int32 i -> int32 ~dbg i | Naked_int64 i -> int64 ~dbg i | Naked_vec128 i -> - vec128 ~dbg (Numeric_types.Vec128_by_bit_pattern.to_int64s i) + let { Numeric_types.Vec128_by_bit_pattern.high; low } = + Numeric_types.Vec128_by_bit_pattern.to_bits i + in + vec128 ~dbg { high; low } | Naked_nativeint t -> targetint ~dbg t let simple ?consider_inlining_effectful_expressions ~dbg env res s = @@ -172,7 +175,11 @@ let const_static cst = (* We don't compile flambda-backend in 32-bit mode, so nativeint is 64 bits. *) | Naked_int64 i -> [cint (Int64.to_nativeint i)] - | Naked_vec128 v -> [cvec128 (Numeric_types.Vec128_by_bit_pattern.to_int64s v)] + | Naked_vec128 v -> + let { Numeric_types.Vec128_by_bit_pattern.high; low } = + Numeric_types.Vec128_by_bit_pattern.to_bits v + in + [cvec128 { high; low }] | Naked_nativeint t -> [cint (nativeint_of_targetint t)] let simple_static res s = diff --git a/middle_end/flambda2/to_cmm/to_cmm_static.ml b/middle_end/flambda2/to_cmm/to_cmm_static.ml index dca50a7c408..cfcc47862b7 100644 --- a/middle_end/flambda2/to_cmm/to_cmm_static.ml +++ b/middle_end/flambda2/to_cmm/to_cmm_static.ml @@ -160,8 +160,13 @@ let static_const0 env res ~updates (bound_static : Bound_static.Pattern.t) env, res, updates | Block_like symbol, Boxed_vec128 v -> let default = Numeric_types.Vec128_by_bit_pattern.zero in - let transl = Numeric_types.Vec128_by_bit_pattern.to_int64s in - let structured (v0, v1) = Clambda.Uconst_vec128 (v0, v1) in + let transl v = + let { Numeric_types.Vec128_by_bit_pattern.high; low } = + Numeric_types.Vec128_by_bit_pattern.to_bits v + in + { Cmm.high; low } + in + let structured { Cmm.high; low } = Clambda.Uconst_vec128 { high; low } in let res, env, updates = static_boxed_number ~kind:Onetwentyeight ~env ~symbol ~default ~emit:C.emit_vec128_constant ~transl ~structured v res updates diff --git a/middle_end/printclambda.ml b/middle_end/printclambda.ml index ff35b38f319..79cca1a8b8f 100644 --- a/middle_end/printclambda.ml +++ b/middle_end/printclambda.ml @@ -68,7 +68,7 @@ let rec structured_constant ppf = function | Uconst_int32 x -> fprintf ppf "%ldl" x | Uconst_int64 x -> fprintf ppf "%LdL" x | Uconst_nativeint x -> fprintf ppf "%ndn" x - | Uconst_vec128 (v0, v1) -> fprintf ppf "%Ld:%Ld" v0 v1 + | Uconst_vec128 {high; low} -> fprintf ppf "%Ld:%Ld" high low | Uconst_block (tag, l) -> fprintf ppf "block(%i" tag; List.iter (fun u -> fprintf ppf ",%a" uconstant u) l; From f12768ea2c7a5902ca5ae891de4bb7ae81e8d8eb Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Wed, 5 Jul 2023 13:31:16 -0400 Subject: [PATCH 35/81] address comments --- backend/amd64/emit.mlp | 8 +++---- backend/amd64/proc.ml | 6 ++--- backend/cmm_helpers.ml | 43 +++++++++++++++++++----------------- backend/selectgen.ml | 8 +++---- backend/x86_masm.ml | 4 ++-- ocaml/asmcomp/cmm_helpers.ml | 7 +++--- ocaml/asmcomp/cmmgen.ml | 10 +++++---- 7 files changed, 46 insertions(+), 40 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index ac4c6d9c13c..6c28da0f1c0 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -92,11 +92,11 @@ let frame_required = ref false let frame_size () = (* includes return address *) if !frame_required then begin let sz = - (!stack_offset + (!stack_offset + 8 - + 8 * num_stack_slots.(0) + + 8 * num_stack_slots.(0) + 8 * num_stack_slots.(1) - + 16 * num_stack_slots.(2) + + 16 * num_stack_slots.(2) + (if fp then 8 else 0)) in Misc.align sz 16 end else @@ -107,7 +107,7 @@ let slot_offset loc cl = | Incoming n -> frame_size() + n | Local n -> (!stack_offset + - match cl with + match cl with | 2 -> n * 16 | 1 -> n * 8 + num_stack_slots.(2) * 16 | 0 -> n * 8 + num_stack_slots.(2) * 16 + num_stack_slots.(1) * 8 diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index c3ca3b4d807..ea4257d158c 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -179,9 +179,9 @@ let hard_vec128_reg = v let all_phys_regs = - hard_int_reg - |> Array.append hard_float_reg - |> Array.append hard_vec128_reg + Array.append + (Array.append hard_int_reg hard_float_reg) + hard_vec128_reg let phys_reg n = if n < 100 then hard_int_reg.(n) else diff --git a/backend/cmm_helpers.ml b/backend/cmm_helpers.ml index a9ee20c18f8..bc88be3e6f1 100644 --- a/backend/cmm_helpers.ml +++ b/backend/cmm_helpers.ml @@ -81,10 +81,10 @@ let float_header = block_header Obj.double_tag (size_float / size_addr) let float_local_header = local_block_header Obj.double_tag (size_float / size_addr) -let boxedvec128_header = block_header Obj.abstract_tag (16 / size_addr) +let boxedvec128_header = block_header Obj.abstract_tag (size_vec128 / size_addr) let boxedvec128_local_header = - local_block_header Obj.abstract_tag (16 / size_addr) + local_block_header Obj.abstract_tag (size_vec128 / size_addr) let floatarray_header len = (* Zero-sized float arrays have tag zero for consistency with @@ -718,19 +718,17 @@ let rec unbox_float dbg = let box_vector dbg vi m c = Cop (Calloc m, [alloc_boxedvector_header vi m dbg; c], dbg) -let rec unbox_vector dbg vi = - let load = match vi with Primitive.Pvec128 -> Onetwentyeight in +let rec unbox_vec128 dbg = map_tail ~kind:Any (function | Cop (Calloc _, [Cconst_natint (hdr, _); c], _) - when Nativeint.equal hdr float_header - || Nativeint.equal hdr float_local_header -> + when Nativeint.equal hdr boxedvec128_header + || Nativeint.equal hdr boxedvec128_local_header -> c | Cconst_symbol (s, _dbg) as cmm -> ( match Cmmgen_state.structured_constant_of_sym s.sym_name with | Some (Uconst_vec128 { low; high }) -> - assert (vi = Primitive.Pvec128); Cconst_vec128 ({ low; high }, dbg) (* or keep _dbg? *) - | _ -> Cop (Cload (load, Immutable), [cmm], dbg)) + | _ -> Cop (Cload (Onetwentyeight, Immutable), [cmm], dbg)) | Cregion e as cmm -> ( (* It is valid to push unboxing inside a Cregion except when the extra unboxing logic pushes a tail call out of tail position *) @@ -738,14 +736,17 @@ let rec unbox_vector dbg vi = map_tail ~kind:Any (function | Cop (Capply (_, Rc_close_at_apply), _, _) -> raise Exit - | Ctail e -> Ctail (unbox_vector dbg vi e) - | e -> unbox_vector dbg vi e) + | Ctail e -> Ctail (unbox_vec128 dbg e) + | e -> unbox_vec128 dbg e) e with | e -> Cregion e - | exception Exit -> Cop (Cload (load, Immutable), [cmm], dbg)) - | Ctail e -> Ctail (unbox_vector dbg vi e) - | cmm -> Cop (Cload (load, Immutable), [cmm], dbg)) + | exception Exit -> Cop (Cload (Onetwentyeight, Immutable), [cmm], dbg)) + | Ctail e -> Ctail (unbox_vec128 dbg e) + | cmm -> Cop (Cload (Onetwentyeight, Immutable), [cmm], dbg)) + +let unbox_vector dbg vi e = + match vi with Primitive.Pvec128 -> unbox_vec128 dbg e (* Complex *) @@ -2793,7 +2794,9 @@ let tuplify_function arity return = let max_arity_optimized = 15 -let ints_per_8b = if Arch.size_int = 4 then 2 else 1 +let ints_per_float = size_float / Arch.size_int + +let ints_per_vec128 = size_vec128 / Arch.size_int let machtype_stored_size t = Array.fold_left @@ -2801,8 +2804,8 @@ let machtype_stored_size t = match c with | Addr -> Misc.fatal_error "[Addr] cannot be stored" | Val | Int -> cur + 1 - | Float -> cur + ints_per_8b - | Vec128 -> cur + (2 * ints_per_8b)) + | Float -> cur + ints_per_float + | Vec128 -> cur + ints_per_vec128) 0 t let machtype_non_scanned_size t = @@ -2812,8 +2815,8 @@ let machtype_non_scanned_size t = | Addr -> Misc.fatal_error "[Addr] cannot be stored" | Val -> cur | Int -> cur + 1 - | Float -> cur + ints_per_8b - | Vec128 -> cur + (2 * ints_per_8b)) + | Float -> cur + ints_per_float + | Vec128 -> cur + ints_per_vec128) 0 t let make_tuple l = match l with [e] -> e | _ -> Ctuple l @@ -2841,10 +2844,10 @@ let read_from_closure_given_machtype t clos base_offset dbg = | Int -> (non_scanned_pos + 1, scanned_pos), load Word_int non_scanned_pos | Float -> - ( (non_scanned_pos + ints_per_8b, scanned_pos), + ( (non_scanned_pos + ints_per_float, scanned_pos), load Double non_scanned_pos ) | Vec128 -> - ( (non_scanned_pos + (2 * ints_per_8b), scanned_pos), + ( (non_scanned_pos + ints_per_vec128, scanned_pos), load Onetwentyeight non_scanned_pos ) | Val -> (non_scanned_pos, scanned_pos + 1), load Word_val scanned_pos | Addr -> Misc.fatal_error "[Addr] cannot be read") diff --git a/backend/selectgen.ml b/backend/selectgen.ml index d4845c0540a..080f4be5f99 100644 --- a/backend/selectgen.ml +++ b/backend/selectgen.ml @@ -477,7 +477,7 @@ method is_simple_expr = function | Cconst_natint _ -> true | Cconst_float _ -> true | Cconst_symbol _ -> true - | Cconst_vec128 _ -> true + | Cconst_vec128 _ -> true | Cvar _ -> true | Ctuple el -> List.for_all self#is_simple_expr el | Clet(_id, arg, body) | Clet_mut(_id, _, arg, body) -> @@ -1379,10 +1379,10 @@ method emit_stores env data regs_addr = Istore(_, _, _) -> for i = 0 to Array.length regs - 1 do let r = regs.(i) in - let kind = match r.typ with - | Float -> Double + let kind = match r.typ with + | Float -> Double | Vec128 -> Onetwentyeight - | _ -> Word_val + | Val | Addr | Int -> Word_val in self#insert env (Iop(Istore(kind, !a, false))) diff --git a/backend/x86_masm.ml b/backend/x86_masm.ml index e0261e6db7c..23c62c1215a 100644 --- a/backend/x86_masm.ml +++ b/backend/x86_masm.ml @@ -19,7 +19,7 @@ open X86_proc let bprintf = Printf.bprintf let string_of_datatype = function - | VEC128 -> "VEC128" + | VEC128 -> "XMMWORD" | QWORD -> "QWORD" | NONE -> assert false | REAL4 -> "REAL4" @@ -32,7 +32,7 @@ let string_of_datatype = function let string_of_datatype_ptr = function - | VEC128 -> "VEC128 PTR " + | VEC128 -> "XMMWORD PTR " | QWORD -> "QWORD PTR " | NONE -> "" | REAL4 -> "REAL4 PTR " diff --git a/ocaml/asmcomp/cmm_helpers.ml b/ocaml/asmcomp/cmm_helpers.ml index 52259433e25..af5683b7426 100644 --- a/ocaml/asmcomp/cmm_helpers.ml +++ b/ocaml/asmcomp/cmm_helpers.ml @@ -3283,9 +3283,10 @@ let kind_of_layout (layout : Lambda.layout) = match layout with | Pvalue Pfloatval -> Boxed_float | Pvalue (Pboxedintval bi) -> Boxed_integer bi - | Pvalue (Pboxedvectorval _) -> - Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." | Pvalue (Pgenval | Pintval | Pvariant _ | Parrayval _) - | Ptop | Pbottom | Punboxed_float | Punboxed_int _ | Punboxed_vector _ -> Any + | Ptop | Pbottom | Punboxed_float | Punboxed_int _ -> Any + | Pvalue (Pboxedvectorval _) + | Punboxed_vector _ -> + Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." let make_tuple l = match l with [e] -> e | _ -> Ctuple l diff --git a/ocaml/asmcomp/cmmgen.ml b/ocaml/asmcomp/cmmgen.ml index 05c075dd144..ed8cca18b92 100644 --- a/ocaml/asmcomp/cmmgen.ml +++ b/ocaml/asmcomp/cmmgen.ml @@ -1242,9 +1242,9 @@ and transl_let_value env str (kind : Lambda.value_kind) id exp transl_body = Boxed (Boxed_float (alloc_heap, dbg), false) | Mutable, Pboxedintval bi -> Boxed (Boxed_integer (bi, alloc_heap, dbg), false) - | Mutable, Pboxedvectorval _ -> - Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." - | _, (Pfloatval | Pboxedintval _ | Pboxedvectorval _) -> + | _, Pboxedvectorval _ -> + Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." + | _, (Pfloatval | Pboxedintval _) -> (* It would be safe to always unbox in this case, but we do it only if this indeed allows us to get rid of some allocations in the bound expression. *) @@ -1290,7 +1290,9 @@ and transl_let env str (layout : Lambda.layout) id exp transl_body = there may be constant closures inside that need lifting out. *) let _cbody : expression = transl_body env in cexp - | Punboxed_float | Punboxed_int _ | Punboxed_vector _ -> begin + | Punboxed_vector _ -> + Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." + | Punboxed_float | Punboxed_int _ -> begin let cexp = transl env exp in let cbody = transl_body env in match str with From c49a815211bc2635cc988e3f329f1cb15ba9457e Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Wed, 5 Jul 2023 13:32:31 -0400 Subject: [PATCH 36/81] format --- backend/amd64/proc.ml | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index ea4257d158c..77110823ff3 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -120,41 +120,41 @@ let num_available_registers = [| 13; 16; 16 |] let first_available_register = [| 0; 100; 200 |] let register_name r = - if r < 100 then int_reg_name.(r) + if r < 100 then int_reg_name.(r) else if r < 200 then float_reg_name.(r - 100) else vec128_reg_name.(r - 200) -let class_of reg = - if reg < 100 then 0 - else if reg < 200 then 1 - else if reg < 300 then 2 - else Misc.fatal_errorf "Register of unknown class (%d)" reg +let class_of reg = + if reg < 100 then 0 + else if reg < 200 then 1 + else if reg < 300 then 2 + else Misc.fatal_errorf "Register of unknown class (%d)" reg -(* +(* Sibling classes refer to the same set of physical registers. The number of available registers must be the same in all sibling classes, and their ID ranges must not overlap. - + Here, both class 1 and class 2 refer to the set of `xmm` registers, - but are represented by different ID ranges. Class 1 is reserved for + but are represented by different ID ranges. Class 1 is reserved for floating point values and class 2 is reserved for 128-bit SIMD vectors. This allows us to preserve sizing information based on the register IDs. The register allocators use the following two functions to check whether allocating a register in one range must also consume an ID in another class. *) -let sibling_classes reg_class = - match reg_class with +let sibling_classes reg_class = + match reg_class with | 0 -> [| 0 |] | 1 | 2 -> [| 1; 2 |] | c -> Misc.fatal_errorf "Unspecified register class %d" reg_class -let reg_id_in_class ~reg ~in_class = - let reg_class = class_of reg in - match reg_class, in_class with +let reg_id_in_class ~reg ~in_class = + let reg_class = class_of reg in + match reg_class, in_class with | 1, 2 -> Some (reg + 100) | 2, 1 -> Some (reg - 100) - | x, y when x = y -> Some reg + | x, y when x = y -> Some reg | _ -> None (* Pack registers starting at %rax so as to reduce the number of REX @@ -180,11 +180,11 @@ let hard_vec128_reg = let all_phys_regs = Array.append - (Array.append hard_int_reg hard_float_reg) + (Array.append hard_int_reg hard_float_reg) hard_vec128_reg let phys_reg n = - if n < 100 then hard_int_reg.(n) else + if n < 100 then hard_int_reg.(n) else if n < 200 then hard_float_reg.(n - 100) else hard_vec128_reg.(n - 200) @@ -310,7 +310,7 @@ let win64_float_external_arguments = let win64_vec128_external_arguments = [| 200 (*xmm0*); 201 (*xmm1*); 202 (*xmm2*); 203 (*xmm3*) |] - + let win64_loc_external_arguments arg = let loc = Array.make (Array.length arg) Reg.dummy in let reg = ref 0 @@ -642,8 +642,8 @@ let max_register_pressure = let frame_required ~fun_contains_calls ~fun_num_stack_slots = fp || fun_contains_calls || - fun_num_stack_slots.(0) > 0 || - fun_num_stack_slots.(1) > 0 || + fun_num_stack_slots.(0) > 0 || + fun_num_stack_slots.(1) > 0 || fun_num_stack_slots.(2) > 0 let prologue_required ~fun_contains_calls ~fun_num_stack_slots = From eddc1821023e465296f1ed32f990d97218b0eefb Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Wed, 5 Jul 2023 17:17:52 -0400 Subject: [PATCH 37/81] back to one class --- backend/amd64/emit.mlp | 6 +- backend/amd64/proc.ml | 107 +- backend/arm64/emit.mlp | 4 +- backend/arm64/proc.ml | 21 +- backend/coloring.ml | 50 +- backend/interf.ml | 6 +- backend/linscan.ml | 52 +- backend/proc.mli | 5 +- backend/regalloc/regalloc_invariants.ml | 6 +- backend/regalloc/regalloc_irc.ml | 23 +- backend/regalloc/regalloc_irc_state.ml | 3 +- backend/regalloc/regalloc_ls.ml | 69 +- backend/regalloc/regalloc_rewrite.ml | 4 +- backend/regalloc/regalloc_stack_slots.ml | 78 +- backend/regalloc/regalloc_stack_slots.mli | 4 +- backend/regalloc/regalloc_utils.ml | 5 - backend/regalloc/regalloc_utils.mli | 2 - backend/selectgen.ml | 2 +- backend/x86_ast.mli | 4 +- backend/x86_binary_emitter.ml | 14 +- backend/x86_gas.ml | 2 +- backend/x86_masm.ml | 2 +- backend/x86_proc.ml | 2 +- backend/x86_proc.mli | 2 +- ocaml/configure | 7958 +++++++---------- .../check_regalloc_validation.ml | 2 +- tests/simd/simd.ml | 10 +- 27 files changed, 3606 insertions(+), 4837 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 6c28da0f1c0..ccada9ba947 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -83,7 +83,7 @@ let fastcode_flag = ref true (* Layout of the stack frame *) let stack_offset = ref 0 -let num_stack_slots = Array.make Proc.num_register_classes 0 +let num_stack_slots = Array.make Proc.num_stack_slot_classes 0 let prologue_required = ref false @@ -1464,7 +1464,7 @@ let fundecl fundecl = local_realloc_sites := []; bound_error_sites := []; bound_error_call := 0; - for i = 0 to Proc.num_register_classes - 1 do + for i = 0 to Proc.num_stack_slot_classes - 1 do num_stack_slots.(i) <- fundecl.fun_num_stack_slots.(i); done; prologue_required := fundecl.fun_prologue_required; @@ -1677,7 +1677,7 @@ let emit_probe_handler_wrapper p = recall that the wrapper does however have its own frame.) *) frame_required := true; stack_offset := p.stack_offset; - for i = 0 to Proc.num_register_classes - 1 do + for i = 0 to Proc.num_stack_slot_classes - 1 do num_stack_slots.(i) <- p.num_stack_slots.(i); done; (* Account for the return address that is now pushed on the stack. *) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 77110823ff3..aa12162e01b 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -98,65 +98,41 @@ let float_reg_name = "%xmm8"; "%xmm9"; "%xmm10"; "%xmm11"; "%xmm12"; "%xmm13"; "%xmm14"; "%xmm15" |] -let vec128_reg_name = float_reg_name - -let num_register_classes = 3 +let num_register_classes = 2 let register_class r = match r.typ with | Val | Int | Addr -> 0 - | Float -> 1 - | Vec128 -> 2 + | Float | Vec128 -> 1 let register_class_tag c = match c with | 0 -> "i" | 1 -> "f" - | 2 -> "v128" | c -> Misc.fatal_errorf "Unspecified register class %d" c -let num_available_registers = [| 13; 16; 16 |] +let num_stack_slot_classes = 3 -let first_available_register = [| 0; 100; 200 |] +let stack_slot_class_for reg = + match reg.typ with + | Val | Addr | Int -> 0 + | Float -> 1 + | Vec128 -> 2 + +let num_available_registers = [| 13; 16 |] + +let first_available_register = [| 0; 100 |] let register_name r = if r < 100 then int_reg_name.(r) else if r < 200 then float_reg_name.(r - 100) - else vec128_reg_name.(r - 200) + else Misc.fatal_errorf "Register of unknown class (%d)" r let class_of reg = if reg < 100 then 0 else if reg < 200 then 1 - else if reg < 300 then 2 else Misc.fatal_errorf "Register of unknown class (%d)" reg -(* - Sibling classes refer to the same set of physical registers. - The number of available registers must be the same in all sibling classes, - and their ID ranges must not overlap. - - Here, both class 1 and class 2 refer to the set of `xmm` registers, - but are represented by different ID ranges. Class 1 is reserved for - floating point values and class 2 is reserved for 128-bit SIMD vectors. - This allows us to preserve sizing information based on the register IDs. - - The register allocators use the following two functions to check whether - allocating a register in one range must also consume an ID in another class. -*) -let sibling_classes reg_class = - match reg_class with - | 0 -> [| 0 |] - | 1 | 2 -> [| 1; 2 |] - | c -> Misc.fatal_errorf "Unspecified register class %d" reg_class - -let reg_id_in_class ~reg ~in_class = - let reg_class = class_of reg in - match reg_class, in_class with - | 1, 2 -> Some (reg + 100) - | 2, 1 -> Some (reg - 100) - | x, y when x = y -> Some reg - | _ -> None - (* Pack registers starting at %rax so as to reduce the number of REX prefixes and thus improve code density *) let rotate_registers = false @@ -173,20 +149,13 @@ let hard_float_reg = for i = 0 to 15 do v.(i) <- Reg.at_location Float (Reg (100 + i)) done; v -let hard_vec128_reg = - let v = Array.make 16 Reg.dummy in - for i = 0 to 15 do v.(i) <- Reg.at_location Vec128 (Reg (200 + i)) done; - v - let all_phys_regs = - Array.append - (Array.append hard_int_reg hard_float_reg) - hard_vec128_reg + Array.append hard_int_reg hard_float_reg let phys_reg n = if n < 100 then hard_int_reg.(n) else if n < 200 then hard_float_reg.(n - 100) - else hard_vec128_reg.(n - 200) + else Misc.fatal_errorf "Register of unknown class (%d)" n let rax = phys_reg 0 let rdx = phys_reg 4 @@ -195,8 +164,6 @@ let r11 = phys_reg 11 let rbp = phys_reg 12 let rxmm15f = phys_reg 115 -let rxmm15v = phys_reg 215 - let destroyed_by_plt_stub = if not X86_proc.use_plt then [| |] else [| r10; r11 |] @@ -215,13 +182,11 @@ let word_addressed = false let size_domainstate_args = 64 * size_int -let calling_conventions first_int last_int first_float last_float first_vec128 last_vec128 - make_stack first_stack +let calling_conventions first_int last_int first_float last_float make_stack first_stack arg = let loc = Array.make (Array.length arg) Reg.dummy in let int = ref first_int in let float = ref first_float in - let vec128 = ref first_vec128 in let ofs = ref first_stack in for i = 0 to Array.length arg - 1 do match arg.(i) with @@ -237,16 +202,14 @@ let calling_conventions first_int last_int first_float last_float first_vec128 l | Float -> if !float <= last_float then begin loc.(i) <- phys_reg !float; - incr float; - incr vec128 + incr float end else begin loc.(i) <- stack_slot (make_stack !ofs) Float; ofs := !ofs + size_float end | Vec128 -> - if !vec128 <= last_vec128 then begin - loc.(i) <- phys_reg !vec128; - incr vec128; + if !float <= last_float then begin + loc.(i) <- phys_reg !float; incr float end else begin ofs := Misc.align !ofs 16; @@ -268,18 +231,18 @@ let outgoing ofs = let not_supported _ofs = fatal_error "Proc.loc_results: cannot call" let loc_arguments arg = - calling_conventions 0 9 100 109 200 209 outgoing (- size_domainstate_args) arg + calling_conventions 0 9 100 109 outgoing (- size_domainstate_args) arg let loc_parameters arg = let (loc, _ofs) = - calling_conventions 0 9 100 109 200 209 incoming (- size_domainstate_args) arg + calling_conventions 0 9 100 109 incoming (- size_domainstate_args) arg in loc let loc_results_call res = - calling_conventions 0 9 100 109 200 209 outgoing (- size_domainstate_args) res + calling_conventions 0 9 100 109 outgoing (- size_domainstate_args) res let loc_results_return res = let (loc, _ofs) = - calling_conventions 0 9 100 109 200 209 incoming (- size_domainstate_args) res + calling_conventions 0 9 100 109 incoming (- size_domainstate_args) res in loc let max_arguments_for_tailcalls = 10 (* in regs *) + 64 (* in domain state *) @@ -298,19 +261,16 @@ let max_arguments_for_tailcalls = 10 (* in regs *) + 64 (* in domain state *) Return value in rax or xmm0. *) let loc_external_results res = - let (loc, _ofs) = calling_conventions 0 0 100 100 200 200 not_supported 0 res in loc + let (loc, _ofs) = calling_conventions 0 0 100 100 not_supported 0 res in loc let unix_loc_external_arguments arg = - calling_conventions 2 7 100 107 200 207 outgoing 0 arg + calling_conventions 2 7 100 107 outgoing 0 arg let win64_int_external_arguments = [| 5 (*rcx*); 4 (*rdx*); 6 (*r8*); 7 (*r9*) |] let win64_float_external_arguments = [| 100 (*xmm0*); 101 (*xmm1*); 102 (*xmm2*); 103 (*xmm3*) |] -let win64_vec128_external_arguments = - [| 200 (*xmm0*); 201 (*xmm1*); 202 (*xmm2*); 203 (*xmm3*) |] - let win64_loc_external_arguments arg = let loc = Array.make (Array.length arg) Reg.dummy in let reg = ref 0 @@ -335,7 +295,7 @@ let win64_loc_external_arguments arg = end | Vec128 -> if !reg < 4 then begin - loc.(i) <- phys_reg win64_vec128_external_arguments.(!reg); + loc.(i) <- phys_reg win64_float_external_arguments.(!reg); incr reg end else begin ofs := Misc.align !ofs 16; @@ -387,16 +347,13 @@ let destroyed_at_c_call = (* Win64: rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15 preserved *) Array.of_list(List.map phys_reg [0;4;5;6;7;10;11; - 100;101;102;103;104;105; - 200;201;202;203;204;205]) + 100;101;102;103;104;105]) else (* Unix: rbp, rbx, r12-r15 preserved *) Array.of_list(List.map phys_reg [0;2;3;4;5;6;7;10;11; 100;101;102;103;104;105;106;107; - 108;109;110;111;112;113;114;115; - 200;201;202;203;204;205;206;207; - 208;209;210;211;212;213;214;215]) + 108;109;110;111;112;113;114;115]) let destroyed_at_alloc_or_poll = if X86_proc.use_plt then @@ -417,7 +374,7 @@ let destroyed_at_oper = function | Iop(Iextcall { alloc = false; }) -> destroyed_at_c_call | Iop(Iintop(Idiv | Imod)) | Iop(Iintop_imm((Idiv | Imod), _)) -> [| rax; rdx |] - | Iop(Istore(Single, _, _)) -> [| rxmm15f; rxmm15v |] + | Iop(Istore(Single, _, _)) -> [| rxmm15f |] | Iop(Ialloc _ | Ipoll _) -> destroyed_at_alloc_or_poll | Iop(Iintop(Imulh _ | Icomp _) | Iintop_imm((Icomp _), _)) -> [| rax |] @@ -476,7 +433,7 @@ let destroyed_at_basic (basic : Cfg_intf.S.basic) = | Op (Intop (Idiv | Imod)) | Op (Intop_imm ((Idiv | Imod), _)) -> [| rax; rdx |] | Op(Store(Single, _, _)) -> - [| rxmm15f; rxmm15v |] + [| rxmm15f |] | Op(Intop(Imulh _ | Icomp _) | Intop_imm((Icomp _), _)) -> [| rax |] | Op (Specific (Irdtsc | Irdpmc)) -> @@ -597,8 +554,8 @@ let safe_register_pressure = function let max_register_pressure = let consumes ~int ~float = if fp - then [| 12 - int; 16 - float; 16 - float |] - else [| 13 - int; 16 - float; 16 - float |] + then [| 12 - int; 16 - float |] + else [| 13 - int; 16 - float |] in function Iextcall _ -> if win64 diff --git a/backend/arm64/emit.mlp b/backend/arm64/emit.mlp index 097cfc850de..8a8f0242437 100644 --- a/backend/arm64/emit.mlp +++ b/backend/arm64/emit.mlp @@ -90,7 +90,7 @@ let emit_wreg = function let stack_offset = ref 0 -let num_stack_slots = Array.make Proc.num_register_classes 0 +let num_stack_slots = Array.make Proc.num_stack_slot_classes 0 let prologue_required = ref false @@ -1138,7 +1138,7 @@ let fundecl fundecl = stack_offset := 0; call_gc_sites := []; bound_error_sites := []; - for i = 0 to Proc.num_register_classes - 1 do + for i = 0 to Proc.num_stack_slot_classes - 1 do num_stack_slots.(i) <- fundecl.fun_num_stack_slots.(i); done; prologue_required := fundecl.fun_prologue_required; diff --git a/backend/arm64/proc.ml b/backend/arm64/proc.ml index dc5e6626600..f55b4c4dfae 100644 --- a/backend/arm64/proc.ml +++ b/backend/arm64/proc.ml @@ -75,6 +75,15 @@ let register_class_tag c = | 1 -> "f" | c -> Misc.fatal_errorf "Unspecified register class %d" c +let num_stack_slot_classes = 2 + +let stack_slot_class_for r = + match r.typ with + | Val | Int | Addr -> 0 + | Float -> 1 + (* CR mslater: (SIMD) arm64 *) + | Vec128 -> fatal_error "arm64: got vec128 register" + let num_available_registers = [| 23; 32 |] (* first 23 int regs allocatable; all float regs allocatable *) @@ -91,18 +100,6 @@ let class_of reg = else if reg < 200 then 1 else Misc.fatal_errorf "Register of unknown class (%d)" reg -let sibling_classes reg_class = - match reg_class with - | 0 -> [| 0 |] - | 1 -> [| 1 |] - | c -> Misc.fatal_errorf "Unspecified register class %d" reg_class - -let reg_id_in_class ~reg ~in_class = - let reg_class = class_of reg in - match reg_class, in_class with - | x, y when x = y -> Some reg - | _ -> None - (* Representation of hard registers by pseudo-registers *) let hard_int_reg = diff --git a/backend/coloring.ml b/backend/coloring.ml index c33794b4d14..b22cf4521d1 100644 --- a/backend/coloring.ml +++ b/backend/coloring.ml @@ -44,27 +44,28 @@ let allocate_registers() = let unconstrained = ref [] in (* Reset the stack slot counts *) - let num_stack_slots = Array.make Proc.num_register_classes 0 in + let num_stack_slots = Array.make Proc.num_stack_slot_classes 0 in (* Preallocate the spilled registers in the stack. Split the remaining registers into constrained and unconstrained. *) let remove_reg reg = let cl = Proc.register_class reg in + let stack_cl = Proc.stack_slot_class_for reg in if reg.spill then begin (* Preallocate the registers in the stack *) - let nslots = num_stack_slots.(cl) in + let nslots = num_stack_slots.(stack_cl) in let conflict = Array.make nslots false in List.iter (fun r -> match r.loc with Stack(Local n) -> - if Proc.register_class r = cl then conflict.(n) <- true + if Proc.stack_slot_class_for r = stack_cl then conflict.(n) <- true | _ -> ()) reg.interf; let slot = ref 0 in while !slot < nslots && conflict.(!slot) do incr slot done; reg.loc <- Stack(Local !slot); - if !slot >= nslots then num_stack_slots.(cl) <- !slot + 1 + if !slot >= nslots then num_stack_slots.(stack_cl) <- !slot + 1 end else if reg.degree < Proc.num_available_registers.(cl) then unconstrained := reg :: !unconstrained else begin @@ -90,6 +91,7 @@ let allocate_registers() = (* Assign a location to a register, the best we can. *) let assign_location reg = let cl = Proc.register_class reg in + let stack_cl = Proc.stack_slot_class_for reg in let first_reg = Proc.first_available_register.(cl) in let num_regs = Proc.num_available_registers.(cl) in let score = Array.make num_regs 0 in @@ -102,22 +104,16 @@ let allocate_registers() = iter_preferred (fun r w -> match r.loc with - Reg n -> (match Proc.reg_id_in_class ~reg:n ~in_class:cl with - | None -> () - | Some n -> - let n = n - first_reg in - if n < num_regs then - score.(n) <- score.(n) + w) + Reg n -> let n = n - first_reg in + if n < num_regs then + score.(n) <- score.(n) + w | Unknown -> List.iter (fun neighbour -> match neighbour.loc with - Reg n -> (match Proc.reg_id_in_class ~reg:n ~in_class:cl with - | None -> () - | Some n -> - let n = n - first_reg in - if n < num_regs then - score.(n) <- score.(n) - w) + Reg n -> let n = n - first_reg in + if n < num_regs then + score.(n) <- score.(n) - w | _ -> ()) r.interf | _ -> ()) @@ -127,12 +123,9 @@ let allocate_registers() = (* Prohibit the registers that have been assigned to our neighbours *) begin match neighbour.loc with - Reg n -> (match Proc.reg_id_in_class ~reg:n ~in_class:cl with - | None -> () - | Some n -> - let n = n - first_reg in - if n < num_regs then - score.(n) <- (-1000000)) + Reg n -> let n = n - first_reg in + if n < num_regs then + score.(n) <- (-1000000) | _ -> () end; (* Avoid the registers that have been assigned to pseudoregs @@ -140,12 +133,9 @@ let allocate_registers() = iter_preferred (fun r w -> match r.loc with - Reg n -> (match Proc.reg_id_in_class ~reg:n ~in_class:cl with - | None -> () - | Some n -> - let n = n - first_reg in - if n < num_regs then - score.(n) <- score.(n) - (w-1)) + Reg n -> let n = n - first_reg in + if n < num_regs then + score.(n) <- score.(n) - (w-1) (* w-1 to break the symmetry when two conflicting regs have the same preference for a third reg. *) | _ -> ()) @@ -173,7 +163,7 @@ let allocate_registers() = if start >= num_regs then 0 else start) end else begin (* Sorry, we must put the pseudoreg in a stack location *) - let nslots = num_stack_slots.(cl) in + let nslots = num_stack_slots.(stack_cl) in let score = Array.make nslots 0 in (* Compute the scores as for registers *) List.iter @@ -219,7 +209,7 @@ let allocate_registers() = else begin (* Allocate a new stack slot *) reg.loc <- Stack(Local nslots); - num_stack_slots.(cl) <- nslots + 1 + num_stack_slots.(stack_cl) <- nslots + 1 end end; (* Cancel the preferences of this register so that they don't influence diff --git a/backend/interf.ml b/backend/interf.ml index 8781564804a..c34eaa0a867 100644 --- a/backend/interf.ml +++ b/backend/interf.ml @@ -38,13 +38,9 @@ let build_graph fundecl = IntPairSet.clear mat; - let classes_intefere ri rj = - let ci, cj = Proc.register_class ri, Proc.register_class rj in - Array.mem ci (Proc.sibling_classes cj) in - (* Record an interference between two registers *) let add_interf ri rj = - if classes_intefere ri rj then begin + if Proc.register_class ri = Proc.register_class rj then begin let i = ri.stamp and j = rj.stamp in if i <> j then begin let p = if i < j then (i, j) else (j, i) in diff --git a/backend/linscan.ml b/backend/linscan.ml index acdc44b6d80..7334d919d4d 100644 --- a/backend/linscan.ml +++ b/backend/linscan.ml @@ -72,7 +72,7 @@ let rec release_expired_inactive ci pos = function (* Allocate a new stack slot to the interval. *) let allocate_stack_slot num_stack_slots i = - let cl = Proc.register_class i.reg in + let cl = Proc.stack_slot_class_for i.reg in let ss = num_stack_slots.(cl) in num_stack_slots.(cl) <- succ ss; i.reg.loc <- Stack(Local ss); @@ -90,12 +90,12 @@ let allocate_free_register num_stack_slots i = | Unknown, _ -> (* We need to allocate a register to this interval somehow *) let cl = Proc.register_class i.reg in - let sibling_classes = Proc.sibling_classes cl in begin match Proc.num_available_registers.(cl) with 0 -> (* There are no registers available for this class *) raise Not_found | rn -> + let ci = active.(cl) in let r0 = Proc.first_available_register.(cl) in (* Create register mask for this class note: if frame pointers are enabled then some registers may have @@ -104,31 +104,21 @@ let allocate_free_register num_stack_slots i = registers) *) let regmask = Array.make rn true in (* Remove all assigned registers from the register mask *) - Array.iter (fun sibling_class -> - List.iter - (function - {reg = {loc = Reg r}} -> - (match Proc.reg_id_in_class ~reg:r ~in_class:cl with - | None -> () - | Some r -> - if r - r0 < rn then regmask.(r - r0) <- false) - | _ -> ()) - active.(sibling_class).ci_active) sibling_classes; + List.iter + (function + {reg = {loc = Reg r}} -> + if r - r0 < rn then regmask.(r - r0) <- false + | _ -> ()) + ci.ci_active; (* Remove all overlapping registers from the register mask *) let remove_bound_overlapping = function {reg = {loc = Reg r}} as j -> - (match Proc.reg_id_in_class ~reg:r ~in_class:cl with - | None -> () - | Some r -> - if r - r0 < rn && regmask.(r - r0) && Interval.overlap j i then - regmask.(r - r0) <- false) + if (r - r0 < rn) && regmask.(r - r0) + && Interval.overlap j i then + regmask.(r - r0) <- false | _ -> () in - Array.iter (fun sibling_class -> - List.iter remove_bound_overlapping active.(sibling_class).ci_inactive) - sibling_classes; - Array.iter (fun sibling_class -> - List.iter remove_bound_overlapping active.(sibling_class).ci_fixed) - sibling_classes; + List.iter remove_bound_overlapping ci.ci_inactive; + List.iter remove_bound_overlapping ci.ci_fixed; (* Assign the first free register (if any) *) let rec assign r = if r = rn then @@ -138,10 +128,7 @@ let allocate_free_register num_stack_slots i = current interval into the active list *) i.reg.loc <- Reg (r0 + r); i.reg.spill <- false; - Array.iter (fun sibling_class -> - active.(sibling_class).ci_active <- - insert_interval_sorted i active.(sibling_class).ci_active) - sibling_classes + ci.ci_active <- insert_interval_sorted i ci.ci_active end else assign (succ r) in assign 0 @@ -151,7 +138,6 @@ let allocate_free_register num_stack_slots i = let allocate_blocked_register num_stack_slots i = let cl = Proc.register_class i.reg in - let sibling_classes = Proc.sibling_classes cl in let ci = active.(cl) in match ci.ci_active with | ilast :: il when @@ -166,13 +152,7 @@ let allocate_blocked_register num_stack_slots i = (* Use register from last interval for current interval *) i.reg.loc <- ilast.reg.loc; (* Remove the last interval from active and insert the current *) - Array.iter (fun sibling_class -> - let sib = active.(sibling_class) in - match sib.ci_active with - | silast :: sil -> - assert (silast = ilast); - sib.ci_active <- insert_interval_sorted i sil - | _ -> assert false) sibling_classes; + ci.ci_active <- insert_interval_sorted i il; (* Now get a new stack slot for the spilled register *) allocate_stack_slot num_stack_slots ilast | _ -> @@ -209,7 +189,7 @@ let allocate_registers() = }; done; (* Reset the stack slot counts *) - let num_stack_slots = Array.make Proc.num_register_classes 0 in + let num_stack_slots = Array.make Proc.num_stack_slot_classes 0 in (* Add all fixed intervals (sorted by end position) *) List.iter (fun i -> diff --git a/backend/proc.mli b/backend/proc.mli index 25a629a0277..2425523a24b 100644 --- a/backend/proc.mli +++ b/backend/proc.mli @@ -28,8 +28,9 @@ val register_name: int -> string val phys_reg: int -> Reg.t val rotate_registers: bool val all_phys_regs : Reg.t array -val sibling_classes: int -> int array -val reg_id_in_class: reg:int -> in_class:int -> int option + +val num_stack_slot_classes: int +val stack_slot_class_for: Reg.t -> int (* Calling conventions *) val loc_arguments: Cmm.machtype -> Reg.t array * int diff --git a/backend/regalloc/regalloc_invariants.ml b/backend/regalloc/regalloc_invariants.ml index 2ff5c319750..4d46d9225ab 100644 --- a/backend/regalloc/regalloc_invariants.ml +++ b/backend/regalloc/regalloc_invariants.ml @@ -103,7 +103,7 @@ let precondition : Cfg_with_layout.t -> unit = in Array.iteri fun_num_stack_slots ~f:(fun reg_class num_slots -> if num_slots <> 0 - then fatal "register class %d has %d slots(s)" reg_class num_slots) + then fatal "stack slot class %d has %d slots(s)" reg_class num_slots) let postcondition_layout : Cfg_with_layout.t -> unit = fun cfg_with_layout -> @@ -215,12 +215,12 @@ let postcondition_layout : Cfg_with_layout.t -> unit = let invalid = Int.Set.diff used_stack_slots.(reg_class) available_slots in if not (Int.Set.is_empty invalid) then - fatal "register class %d uses the following invalid slots: %s" reg_class + fatal "stack slot class %d uses the following invalid slots: %s" reg_class (string_of_set invalid); let unused = Int.Set.diff available_slots used_stack_slots.(reg_class) in if not (Int.Set.is_empty unused) then - fatal "register class %d has the following unused slots: %s" reg_class + fatal "stack slot class %d has the following unused slots: %s" reg_class (string_of_set unused)) let postcondition_liveness : Cfg_with_infos.t -> unit = diff --git a/backend/regalloc/regalloc_irc.ml b/backend/regalloc/regalloc_irc.ml index 8b6a54fdde3..fc925c9f653 100644 --- a/backend/regalloc/regalloc_irc.ml +++ b/backend/regalloc/regalloc_irc.ml @@ -328,22 +328,19 @@ let assign_colors : State.t -> Cfg_with_layout.t -> unit = | hd :: tl -> let alias = State.find_alias state hd in if State.is_precolored_or_colored state alias - then + then ( match alias.Reg.irc_color with | None -> assert false - | Some color -> ( + | Some color -> if irc_debug then log ~indent:3 "color %d is not available" color; - match Proc.reg_id_in_class ~reg:color ~in_class:reg_class with - | None -> mark_adjacent_colors_and_get_first_available tl - | Some color -> - if Array.unsafe_get ok_colors (color - reg_first_avail) - then ( - Array.unsafe_set ok_colors (color - reg_first_avail) false; - decr counter; - if !counter > 0 - then mark_adjacent_colors_and_get_first_available tl - else reg_num_avail) - else mark_adjacent_colors_and_get_first_available tl) + if Array.unsafe_get ok_colors (color - reg_first_avail) + then ( + Array.unsafe_set ok_colors (color - reg_first_avail) false; + decr counter; + if !counter > 0 + then mark_adjacent_colors_and_get_first_available tl + else reg_num_avail) + else mark_adjacent_colors_and_get_first_available tl) else mark_adjacent_colors_and_get_first_available tl in let first_avail = diff --git a/backend/regalloc/regalloc_irc_state.ml b/backend/regalloc/regalloc_irc_state.ml index 00e9f01995b..d4f1ca80a40 100644 --- a/backend/regalloc/regalloc_irc_state.ml +++ b/backend/regalloc/regalloc_irc_state.ml @@ -341,8 +341,7 @@ let[@inline] add_edge state u v = in let pair = RegisterStamp.pair u.Reg.stamp v.Reg.stamp in if (not (Reg.same u v)) - && is_interesting_reg u && is_interesting_reg v - && interfering_reg_class u v + && is_interesting_reg u && is_interesting_reg v && same_reg_class u v && not (RegisterStamp.PairSet.mem state.adj_set pair) then ( RegisterStamp.PairSet.add state.adj_set pair; diff --git a/backend/regalloc/regalloc_ls.ml b/backend/regalloc/regalloc_ls.ml index 35416ca154a..7c65e41bb88 100644 --- a/backend/regalloc/regalloc_ls.ml +++ b/backend/regalloc/regalloc_ls.ml @@ -129,42 +129,29 @@ let allocate_free_register : State.t -> Interval.t -> spilling_reg = | Unknown, true -> allocate_stack_slot reg | Unknown, _ -> ( let reg_class = Proc.register_class reg in - let intervals_per_class = State.active_classes state in - let sibling_classes = Proc.sibling_classes reg_class in + let intervals = State.active state ~reg_class in let first_available = Proc.first_available_register.(reg_class) in match Proc.num_available_registers.(reg_class) with | 0 -> fatal "register class %d has no available registers" reg_class | num_available_registers -> let available = Array.make num_available_registers true in - Array.iter sibling_classes ~f:(fun sibling_class -> - let intervals = intervals_per_class.(sibling_class) in - List.iter intervals.active ~f:(fun (interval : Interval.t) -> - match interval.reg.loc with - | Reg r -> ( - match Proc.reg_id_in_class ~reg:r ~in_class:reg_class with - | None -> () - | Some id -> - if id - first_available < num_available_registers - then available.(id - first_available) <- false) - | Stack _ | Unknown -> ())); + List.iter intervals.active ~f:(fun (interval : Interval.t) -> + match interval.reg.loc with + | Reg r -> + if r - first_available < num_available_registers + then available.(r - first_available) <- false + | Stack _ | Unknown -> ()); let remove_bound_overlapping (itv : Interval.t) : unit = match itv.reg.loc with - | Reg r -> ( - match Proc.reg_id_in_class ~reg:r ~in_class:reg_class with - | None -> () - | Some id -> - if id - first_available < num_available_registers - && available.(id - first_available) - && Interval.overlap itv interval - then available.(id - first_available) <- false) + | Reg r -> + if r - first_available < num_available_registers + && available.(r - first_available) + && Interval.overlap itv interval + then available.(r - first_available) <- false | Stack _ | Unknown -> () in - Array.iter sibling_classes ~f:(fun sibling_class -> - List.iter intervals_per_class.(sibling_class).inactive - ~f:remove_bound_overlapping); - Array.iter sibling_classes ~f:(fun sibling_class -> - List.iter intervals_per_class.(sibling_class).fixed - ~f:remove_bound_overlapping); + List.iter intervals.inactive ~f:remove_bound_overlapping; + List.iter intervals.fixed ~f:remove_bound_overlapping; let rec assign idx = if idx >= num_available_registers then raise No_free_register @@ -172,10 +159,8 @@ let allocate_free_register : State.t -> Interval.t -> spilling_reg = then ( reg.loc <- Reg (first_available + idx); reg.spill <- false; - Array.iter sibling_classes ~f:(fun sibling_class -> - intervals_per_class.(sibling_class).active - <- Interval.List.insert_sorted - intervals_per_class.(sibling_class).active interval); + intervals.active + <- Interval.List.insert_sorted intervals.active interval; if ls_debug then log ~indent:3 "assigning %d to register %a" idx Printmach.reg reg; Not_spilling) @@ -188,31 +173,21 @@ let allocate_blocked_register : State.t -> Interval.t -> spilling_reg = fun state interval -> let reg = interval.reg in let reg_class = Proc.register_class reg in - let sibling_classes = Proc.sibling_classes reg_class in - let cl_intervals = State.active_classes state in - let intervals = cl_intervals.(reg_class) in + let intervals = State.active state ~reg_class in match intervals.active with - | hd :: _ -> + | hd :: tl -> let chk r = - assert (interfering_reg_class r.Interval.reg hd.Interval.reg); + assert (same_reg_class r.Interval.reg hd.Interval.reg); Reg.same_loc r.Interval.reg hd.Interval.reg && Interval.overlap r interval in if hd.end_ > interval.end_ && not - (Array.exists sibling_classes ~f:(fun sibling_class -> - let intervals = cl_intervals.(sibling_class) in - List.exists ~f:chk intervals.fixed - || List.exists ~f:chk intervals.inactive)) + (List.exists ~f:chk intervals.fixed + || List.exists ~f:chk intervals.inactive) then ( (match hd.reg.loc with Reg _ -> () | Stack _ | Unknown -> assert false); interval.reg.loc <- hd.reg.loc; - Array.iter sibling_classes ~f:(fun sibling_class -> - let intervals = cl_intervals.(sibling_class) in - match intervals.active with - | sib_hd :: sib_tl -> - assert (sib_hd = hd); - intervals.active <- Interval.List.insert_sorted sib_tl interval - | _ -> assert false); + intervals.active <- Interval.List.insert_sorted tl interval; allocate_stack_slot hd.reg) else allocate_stack_slot reg | [] -> allocate_stack_slot reg diff --git a/backend/regalloc/regalloc_rewrite.ml b/backend/regalloc/regalloc_rewrite.ml index 08679c22c87..e806716b820 100644 --- a/backend/regalloc/regalloc_rewrite.ml +++ b/backend/regalloc/regalloc_rewrite.ml @@ -263,8 +263,8 @@ let postlude : if Utils.debug then Array.iteri (Cfg_with_layout.cfg cfg_with_layout).fun_num_stack_slots - ~f:(fun reg_class num_stack_slots -> - Utils.log ~indent:1 "stack_slots[%d]=%d" reg_class num_stack_slots); + ~f:(fun ss_class num_stack_slots -> + Utils.log ~indent:1 "stack_slots[%d]=%d" ss_class num_stack_slots); remove_prologue_if_not_required cfg_with_layout; update_live_fields cfg_with_layout (Cfg_with_infos.liveness cfg_with_infos); f (); diff --git a/backend/regalloc/regalloc_stack_slots.ml b/backend/regalloc/regalloc_stack_slots.ml index 03238644308..22aeeb19782 100644 --- a/backend/regalloc/regalloc_stack_slots.ml +++ b/backend/regalloc/regalloc_stack_slots.ml @@ -14,22 +14,22 @@ type t = let[@inline] make () = let stack_slots = Reg.Tbl.create 128 in - let num_stack_slots = Array.make Proc.num_register_classes 0 in + let num_stack_slots = Array.make Proc.num_stack_slot_classes 0 in { stack_slots; num_stack_slots } -let[@inline] size_for_all_reg_classes t = +let[@inline] size_for_all_ss_classes t = Array.fold_left t.num_stack_slots ~f:( + ) ~init:0 -let[@inline] get_and_incr t ~reg_class = - let res = t.num_stack_slots.(reg_class) in - t.num_stack_slots.(reg_class) <- succ res; +let[@inline] get_and_incr t ~stack_class = + let res = t.num_stack_slots.(stack_class) in + t.num_stack_slots.(stack_class) <- succ res; res let[@inline] get_or_create t reg = match Reg.Tbl.find_opt t.stack_slots reg with | Some slot -> slot | None -> - let res = get_and_incr t ~reg_class:(Proc.register_class reg) in + let res = get_and_incr t ~stack_class:(Proc.stack_slot_class_for reg) in Reg.Tbl.replace t.stack_slots reg res; res @@ -47,8 +47,8 @@ let[@inline] update_cfg_with_layout t cfg_with_layout = let fun_num_stack_slots = (Cfg_with_layout.cfg cfg_with_layout).fun_num_stack_slots in - for reg_class = 0 to pred Proc.num_register_classes do - fun_num_stack_slots.(reg_class) <- t.num_stack_slots.(reg_class) + for ss_class = 0 to pred Proc.num_stack_slot_classes do + fun_num_stack_slots.(ss_class) <- t.num_stack_slots.(ss_class) done (** The optimization below is conceptually fairly close to what linscan does: @@ -148,14 +148,14 @@ with type slots := t = struct type t = Interval.t array array let make slots = - Array.init Proc.num_register_classes ~f:(fun reg_class -> - Array.init slots.num_stack_slots.(reg_class) ~f:(fun _ -> + Array.init Proc.num_stack_slot_classes ~f:(fun ss_class -> + Array.init slots.num_stack_slots.(ss_class) ~f:(fun _ -> { Interval.start = Point.dummy; end_ = Point.dummy })) let visit_reg (t : t) (point : Point.t) (reg : Reg.t) : unit = apply_reg_stack_local reg ~f:(fun slot_index -> - let reg_class = Proc.register_class reg in - let interval = t.(reg_class).(slot_index) in + let ss_class = Proc.stack_slot_class_for reg in + let interval = t.(ss_class).(slot_index) in if interval.start == Point.dummy then interval.start <- point; interval.end_ <- point) @@ -194,9 +194,9 @@ with type slots := t = struct intervals let print ppf t = - Array.iteri t ~f:(fun reg_class intervals -> + Array.iteri t ~f:(fun ss_class intervals -> Array.iteri intervals ~f:(fun slot_index interval -> - Format.fprintf ppf "reg_class=%d slot_index=%d -> %a\n" reg_class + Format.fprintf ppf "ss_class=%d slot_index=%d -> %a\n" ss_class slot_index Interval.print interval)) end @@ -211,7 +211,7 @@ module Buckets : sig val contains_empty : t -> bool - val find_bucket : t -> reg_class:int -> slot_index:slot -> int option + val find_bucket : t -> ss_class:int -> slot_index:slot -> int option val print : Format.formatter -> t -> unit end @@ -232,13 +232,13 @@ with type slots := t = struct let build_from_intervals slots intervals = let buckets = - Array.init Proc.num_register_classes ~f:(fun reg_class -> - let num_slots = slots.num_stack_slots.(reg_class) in + Array.init Proc.num_stack_slot_classes ~f:(fun ss_class -> + let num_slots = slots.num_stack_slots.(ss_class) in Array.init num_slots ~f:(fun _ -> Int.Tbl.create num_slots)) in - Array.iteri intervals ~f:(fun reg_class intervals -> + Array.iteri intervals ~f:(fun ss_class intervals -> Array.iteri intervals ~f:(fun slot_index interval -> - let buckets = buckets.(reg_class) in + let buckets = buckets.(ss_class) in let bucket_index = ref 0 in while !bucket_index < Array.length buckets @@ -259,8 +259,8 @@ with type slots := t = struct let last_bucket = buckets.(len - 1) in Int.Tbl.length last_bucket = 0) - let find_bucket t ~reg_class ~slot_index = - let buckets = t.(reg_class) in + let find_bucket t ~ss_class ~slot_index = + let buckets = t.(ss_class) in let len = Array.length buckets in let bucket_index = ref 0 in while @@ -272,9 +272,9 @@ with type slots := t = struct if !bucket_index < len then Some !bucket_index else None let print ppf t = - Array.iteri t ~f:(fun reg_class buckets -> + Array.iteri t ~f:(fun ss_class buckets -> Array.iteri buckets ~f:(fun bucket_index bucket -> - Format.fprintf ppf "reg_class=%d bucket_index=%d\n" reg_class + Format.fprintf ppf "ss_class=%d bucket_index=%d\n" ss_class bucket_index; Int.Tbl.iter (fun slot_index interval -> @@ -284,7 +284,7 @@ with type slots := t = struct end let optimize (t : t) (cfg_with_infos : Cfg_with_infos.t) : unit = - if size_for_all_reg_classes t > 0 + if size_for_all_ss_classes t > 0 then ( (* First, compute the intervals for all stack slots *) let intervals = Intervals.build_from_cfg t cfg_with_infos in @@ -299,36 +299,36 @@ let optimize (t : t) (cfg_with_infos : Cfg_with_infos.t) : unit = (* Finally, if so, reassign the slot indices *) if optimized then ( - let max_bucket_indices = Array.make Proc.num_register_classes (-1) in + let max_bucket_indices = Array.make Proc.num_stack_slot_classes (-1) in List.iter (Reg.all_registers ()) ~f:(fun (reg : Reg.t) -> apply_reg_stack_local reg ~f:(fun slot_index -> - let reg_class = Proc.register_class reg in - match Buckets.find_bucket buckets ~reg_class ~slot_index with + let ss_class = Proc.stack_slot_class_for reg in + match Buckets.find_bucket buckets ~ss_class ~slot_index with | None -> - fatal "slot %d (reg_class=%d) has in not in any of the buckets" - slot_index reg_class + fatal "slot %d (ss_class=%d) has in not in any of the buckets" + slot_index ss_class | Some bucket_index -> if debug then Format.eprintf "changing the slot index of %a (class %d): %d ~> %d\n%!" - Printmach.reg reg reg_class slot_index bucket_index; + Printmach.reg reg ss_class slot_index bucket_index; reg.loc <- Stack (Local bucket_index); - max_bucket_indices.(reg_class) - <- Stdlib.Int.max max_bucket_indices.(reg_class) bucket_index; + max_bucket_indices.(ss_class) + <- Stdlib.Int.max max_bucket_indices.(ss_class) bucket_index; if Reg.Tbl.mem t.stack_slots reg then Reg.Tbl.replace t.stack_slots reg bucket_index)); - for reg_class = 0 to pred Proc.num_register_classes do - let old_value = t.num_stack_slots.(reg_class) in - let new_value = succ max_bucket_indices.(reg_class) in + for ss_class = 0 to pred Proc.num_stack_slot_classes do + let old_value = t.num_stack_slots.(ss_class) in + let new_value = succ max_bucket_indices.(ss_class) in if new_value > old_value then fatal "more slots are now used for class %d (before: %d, after: %d)" - reg_class old_value new_value; + ss_class old_value new_value; if debug then - Format.eprintf "reg_class %d has %d fewer slots (%d ~> %d)\n%!" - reg_class (old_value - new_value) old_value new_value; - t.num_stack_slots.(reg_class) <- new_value + Format.eprintf "ss_class %d has %d fewer slots (%d ~> %d)\n%!" + ss_class (old_value - new_value) old_value new_value; + t.num_stack_slots.(ss_class) <- new_value done; Cfg_with_infos.invalidate_liveness cfg_with_infos)) diff --git a/backend/regalloc/regalloc_stack_slots.mli b/backend/regalloc/regalloc_stack_slots.mli index 77eaa4f1389..eb3855c0aab 100644 --- a/backend/regalloc/regalloc_stack_slots.mli +++ b/backend/regalloc/regalloc_stack_slots.mli @@ -6,9 +6,9 @@ type t val make : unit -> t -val size_for_all_reg_classes : t -> int +val size_for_all_ss_classes : t -> int -val get_and_incr : t -> reg_class:int -> slot +val get_and_incr : t -> stack_class:int -> slot val get_or_create : t -> Reg.t -> slot diff --git a/backend/regalloc/regalloc_utils.ml b/backend/regalloc/regalloc_utils.ml index a49e21e6158..ca5726e9838 100644 --- a/backend/regalloc/regalloc_utils.ml +++ b/backend/regalloc/regalloc_utils.ml @@ -252,11 +252,6 @@ let same_reg_class : Reg.t -> Reg.t -> bool = fun reg1 reg2 -> Int.equal (Proc.register_class reg1) (Proc.register_class reg2) -let interfering_reg_class : Reg.t -> Reg.t -> bool = - fun reg1 reg2 -> - let c1, c2 = Proc.register_class reg1, Proc.register_class reg2 in - Array.mem c1 ~set:(Proc.sibling_classes c2) - let make_temporary : same_class_and_base_name_as:Reg.t -> name_prefix:string -> Reg.t = fun ~same_class_and_base_name_as:reg ~name_prefix -> diff --git a/backend/regalloc/regalloc_utils.mli b/backend/regalloc/regalloc_utils.mli index 5652afc4c67..a9ce6085a4c 100644 --- a/backend/regalloc/regalloc_utils.mli +++ b/backend/regalloc/regalloc_utils.mli @@ -94,8 +94,6 @@ end val same_reg_class : Reg.t -> Reg.t -> bool -val interfering_reg_class : Reg.t -> Reg.t -> bool - val make_temporary : same_class_and_base_name_as:Reg.t -> name_prefix:string -> Reg.t diff --git a/backend/selectgen.ml b/backend/selectgen.ml index 080f4be5f99..7e513560f36 100644 --- a/backend/selectgen.ml +++ b/backend/selectgen.ml @@ -1671,7 +1671,7 @@ method emit_fundecl ~future_funcnames f = fun_codegen_options = f.Cmm.fun_codegen_options; fun_dbg = f.Cmm.fun_dbg; fun_poll = f.Cmm.fun_poll; - fun_num_stack_slots = Array.make Proc.num_register_classes 0; + fun_num_stack_slots = Array.make Proc.num_stack_slot_classes 0; fun_contains_calls = !contains_calls; } diff --git a/backend/x86_ast.mli b/backend/x86_ast.mli index feb0c70797a..ddd7629b6b6 100644 --- a/backend/x86_ast.mli +++ b/backend/x86_ast.mli @@ -70,7 +70,7 @@ type reg8h = type registerf = XMMf of int | TOS | ST of int -type regSIMD = XMM of int +type reg128 = XMM of int type arch = X64 | X86 @@ -104,7 +104,7 @@ type arg = | Reg16 of reg64 | Reg32 of reg64 | Reg64 of reg64 - | Reg128 of regSIMD + | Reg128 of reg128 | Regf of registerf | Mem of addr diff --git a/backend/x86_binary_emitter.ml b/backend/x86_binary_emitter.ml index 30512c1e468..e2d55d21a1d 100644 --- a/backend/x86_binary_emitter.ml +++ b/backend/x86_binary_emitter.ml @@ -281,8 +281,8 @@ let rd_of_regf regf = | TOS -> assert false (* TODO *) | ST _st -> assert false -let rd_of_regSIMD (regSIMD : regSIMD) = - match regSIMD with +let rd_of_reg128 (reg128 : reg128) = + match reg128 with | XMM n -> n (* TODO *) @@ -449,7 +449,7 @@ let emit_mod_rm_reg b rex opcodes rm reg = buf_opcodes b opcodes; buf_int8 b (mod_rm_reg 0b11 rm reg) | Reg128 rm -> - let rm = rd_of_regSIMD rm in + let rm = rd_of_reg128 rm in emit_rex b (rex lor rexr_reg reg lor rexb_rm rm); buf_opcodes b opcodes; buf_int8 b (mod_rm_reg 0b11 rm reg) @@ -583,20 +583,20 @@ let emit_movapd b dst src = emit_mod_rm_reg b 0 [ 0x0f; 0x29 ] rm (rd_of_regf reg) | Reg128 reg, ((Reg128 _ | Mem _ | Mem64_RIP _) as rm) -> buf_int8 b 0x66; - emit_mod_rm_reg b 0 [ 0x0f; 0x28 ] rm (rd_of_regSIMD reg) + emit_mod_rm_reg b 0 [ 0x0f; 0x28 ] rm (rd_of_reg128 reg) | ((Mem _ | Mem64_RIP _) as rm), Reg128 reg -> buf_int8 b 0x66; - emit_mod_rm_reg b 0 [ 0x0f; 0x29 ] rm (rd_of_regSIMD reg) + emit_mod_rm_reg b 0 [ 0x0f; 0x29 ] rm (rd_of_reg128 reg) | _ -> assert false let emit_movupd b dst src = match (dst, src) with | Reg128 reg, ((Reg128 _ | Mem _ | Mem64_RIP _) as rm) -> buf_int8 b 0x66; - emit_mod_rm_reg b 0 [ 0x0f; 0x10 ] rm (rd_of_regSIMD reg) + emit_mod_rm_reg b 0 [ 0x0f; 0x10 ] rm (rd_of_reg128 reg) | ((Mem _ | Mem64_RIP _) as rm), Reg128 reg -> buf_int8 b 0x66; - emit_mod_rm_reg b 0 [ 0x0f; 0x11 ] rm (rd_of_regSIMD reg) + emit_mod_rm_reg b 0 [ 0x0f; 0x11 ] rm (rd_of_reg128 reg) | _ -> assert false let emit_movd b ~dst ~src = diff --git a/backend/x86_gas.ml b/backend/x86_gas.ml index 23f2f64bf5c..8d32efd89bf 100644 --- a/backend/x86_gas.ml +++ b/backend/x86_gas.ml @@ -64,7 +64,7 @@ let arg b = function | Reg16 x -> print_reg b string_of_reg16 x | Reg32 x -> print_reg b string_of_reg32 x | Reg64 x -> print_reg b string_of_reg64 x - | Reg128 x -> print_reg b string_of_regSIMD x + | Reg128 x -> print_reg b string_of_reg128 x | Regf x -> print_reg b string_of_registerf x | Mem addr -> arg_mem b addr | Mem64_RIP (_, s, displ) -> bprintf b "%s%a(%%rip)" s opt_displ displ diff --git a/backend/x86_masm.ml b/backend/x86_masm.ml index 23c62c1215a..0869f8cb1fe 100644 --- a/backend/x86_masm.ml +++ b/backend/x86_masm.ml @@ -82,7 +82,7 @@ let arg b = function | Reg32 x -> Buffer.add_string b (string_of_reg32 x) | Reg64 x -> Buffer.add_string b (string_of_reg64 x) | Regf x -> Buffer.add_string b (string_of_registerf x) - | Reg128 x -> Buffer.add_string b (string_of_regSIMD x) + | Reg128 x -> Buffer.add_string b (string_of_reg128 x) (* We don't need to specify RIP on Win64, since EXTERN will provide the list of external symbols that need this addressing mode, and diff --git a/backend/x86_proc.ml b/backend/x86_proc.ml index b56adc148f4..3786f8604f7 100644 --- a/backend/x86_proc.ml +++ b/backend/x86_proc.ml @@ -243,7 +243,7 @@ let string_of_registerf : registerf -> string = function | TOS -> Printf.sprintf "tos" | ST n -> Printf.sprintf "st(%d)" n -let string_of_regSIMD = function +let string_of_reg128 = function | XMM n -> Printf.sprintf "xmm%d" n let string_of_condition = function diff --git a/backend/x86_proc.mli b/backend/x86_proc.mli index 358cae97a00..55ae124c8ef 100644 --- a/backend/x86_proc.mli +++ b/backend/x86_proc.mli @@ -25,7 +25,7 @@ val string_of_reg8h: reg8h -> string val string_of_reg16: reg64 -> string val string_of_reg32: reg64 -> string val string_of_reg64: reg64 -> string -val string_of_regSIMD: regSIMD -> string +val string_of_reg128: reg128 -> string val string_of_registerf: registerf -> string val string_of_substring_literal: int -> int -> string -> string val string_of_string_literal: string -> string diff --git a/ocaml/configure b/ocaml/configure index 9bfaf972b26..8961cbdde7f 100755 --- a/ocaml/configure +++ b/ocaml/configure @@ -1,12 +1,11 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for OCaml 4.14.1+jst. +# Generated by GNU Autoconf 2.69 for OCaml 4.14.1+jst. # # Report bugs to . # # -# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, -# Inc. +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation @@ -17,16 +16,14 @@ # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -as_nop=: -if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 -then : +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else $as_nop +else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -36,46 +33,46 @@ esac fi - -# Reset variables that may have inherited troublesome values from -# the environment. - -# IFS needs to be set, to space, tab, and newline, in precisely that order. -# (If _AS_PATH_WALK were called with IFS unset, it would have the -# side effect of setting IFS to empty, thus disabling word splitting.) -# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -IFS=" "" $as_nl" - -PS1='$ ' -PS2='> ' -PS4='+ ' - -# Ensure predictable behavior from utilities with locale-dependent output. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# We cannot yet rely on "unset" to work, but we need these variables -# to be unset--not just set to an empty or harmless value--now, to -# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct -# also avoids known problems related to "unset" and subshell syntax -# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). -for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH -do eval test \${$as_var+y} \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done - -# Ensure that fds 0, 1, and 2 are open. -if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi -if (exec 3>&2) ; then :; else exec 2>/dev/null; fi +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi # The user is always right. -if ${PATH_SEPARATOR+false} :; then +if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -84,6 +81,13 @@ if ${PATH_SEPARATOR+false} :; then fi +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -92,12 +96,8 @@ case $0 in #(( for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - test -r "$as_dir$0" && as_myself=$as_dir$0 && break + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS @@ -109,10 +109,30 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. @@ -134,22 +154,20 @@ esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="as_nop=: -if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 -then : + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST -else \$as_nop +else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( @@ -169,15 +187,12 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ) -then : +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : -else \$as_nop +else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 -blah=\$(echo \$(echo blah)) -test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO @@ -192,38 +207,30 @@ test -x / || exit 1" test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null -then : + if (eval "$as_required") 2>/dev/null; then : as_have_required=yes -else $as_nop +else as_have_required=no fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null -then : + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : -else $as_nop +else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. - as_shell=$as_dir$as_base + as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null -then : + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes - if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null -then : + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi @@ -231,21 +238,14 @@ fi esac as_found=false done -IFS=$as_save_IFS -if $as_found -then : - -else $as_nop - if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null -then : +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes -fi -fi +fi; } +IFS=$as_save_IFS - if test "x$CONFIG_SHELL" != x -then : + if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also @@ -263,19 +263,18 @@ esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi - if test x$as_have_required = xno -then : - printf "%s\n" "$0: This script requires a shell more modern than all" - printf "%s\n" "$0: the shells that I found on your system." - if test ${ZSH_VERSION+y} ; then - printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" - printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." else - printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and caml-list@inria.fr + $as_echo "$0: Please tell bug-autoconf@gnu.org and caml-list@inria.fr $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do @@ -303,7 +302,6 @@ as_fn_unset () } as_unset=as_fn_unset - # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -321,14 +319,6 @@ as_fn_exit () as_fn_set_status $1 exit $1 } # as_fn_exit -# as_fn_nop -# --------- -# Do nothing but, unlike ":", preserve the value of $?. -as_fn_nop () -{ - return $? -} -as_nop=as_fn_nop # as_fn_mkdir_p # ------------- @@ -343,7 +333,7 @@ as_fn_mkdir_p () as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -352,7 +342,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -printf "%s\n" X"$as_dir" | +$as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -391,13 +381,12 @@ as_fn_executable_p () # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null -then : +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' -else $as_nop +else as_fn_append () { eval $1=\$$1\$2 @@ -409,27 +398,18 @@ fi # as_fn_append # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null -then : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else $as_nop +else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith -# as_fn_nop -# --------- -# Do nothing but, unlike ":", preserve the value of $?. -as_fn_nop () -{ - return $? -} -as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- @@ -441,9 +421,9 @@ as_fn_error () as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - printf "%s\n" "$as_me: error: $2" >&2 + $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error @@ -470,7 +450,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -printf "%s\n" X/"$0" | +$as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -514,7 +494,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall @@ -528,10 +508,6 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits exit } - -# Determine whether it's possible to make 'echo' print without a newline. -# These variables are no longer used directly by Autoconf, but are AC_SUBSTed -# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -545,13 +521,6 @@ case `echo -n x` in #((((( ECHO_N='-n';; esac -# For backward compatibility with old third-party macros, we provide -# the shell variables $as_echo and $as_echo_n. New code should use -# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. -as_echo='printf %s\n' -as_echo_n='printf %s' - - rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -629,36 +598,40 @@ PACKAGE_URL='http://www.ocaml.org' ac_unique_file="runtime/interp.c" # Factoring default headers for most tests. ac_includes_default="\ -#include -#ifdef HAVE_STDIO_H -# include +#include +#ifdef HAVE_SYS_TYPES_H +# include #endif -#ifdef HAVE_STDLIB_H +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS # include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif #endif #ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif # include #endif +#ifdef HAVE_STRINGS_H +# include +#endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif #ifdef HAVE_UNISTD_H # include #endif" -ac_header_c_list= ac_subst_vars='LTLIBOBJS LIBOBJS PTHREAD_CFLAGS @@ -671,9 +644,9 @@ INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM flexlink -CPP ac_ct_DEP_CC DEP_CC +CPP LT_SYS_LIBRARY_PATH OTOOL64 OTOOL @@ -841,7 +814,6 @@ infodir docdir oldincludedir includedir -runstatedir localstatedir sharedstatedir sysconfdir @@ -967,7 +939,6 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -997,6 +968,8 @@ do *) ac_optarg=yes ;; esac + # Accept the important Cygnus configure options, so we can diagnose typos. + case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; @@ -1037,9 +1010,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: \`$ac_useropt'" + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt - ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -1063,9 +1036,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: \`$ac_useropt'" + as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt - ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -1218,15 +1191,6 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; - -runstatedir | --runstatedir | --runstatedi | --runstated \ - | --runstate | --runstat | --runsta | --runst | --runs \ - | --run | --ru | --r) - ac_prev=runstatedir ;; - -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ - | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ - | --run=* | --ru=* | --r=*) - runstatedir=$ac_optarg ;; - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1276,9 +1240,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: \`$ac_useropt'" + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt - ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1292,9 +1256,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: \`$ac_useropt'" + as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt - ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1338,9 +1302,9 @@ Try \`$0 --help' for more information" *) # FIXME: should be removed in autoconf 3.0. - printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; @@ -1356,7 +1320,7 @@ if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1364,7 +1328,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir runstatedir + libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1420,7 +1384,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -printf "%s\n" X"$as_myself" | +$as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -1517,7 +1481,6 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1669,9 +1632,9 @@ if test "$ac_init_help" = "recursive"; then case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; @@ -1699,8 +1662,7 @@ esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } - # Check for configure.gnu first; this name is used for a wrapper for - # Metaconfig's "Configure" on case-insensitive file systems. + # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive @@ -1708,7 +1670,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix echo && $SHELL "$ac_srcdir/configure" --help=recursive else - printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done @@ -1718,9 +1680,9 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF OCaml configure 4.14.1+jst -generated by GNU Autoconf 2.71 +generated by GNU Autoconf 2.69 -Copyright (C) 2021 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1737,14 +1699,14 @@ fi ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest.beam + rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -printf "%s\n" "$ac_try_echo"; } >&5 +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1752,15 +1714,14 @@ printf "%s\n" "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err - } && test -s conftest.$ac_objext -then : + } && test -s conftest.$ac_objext; then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1776,14 +1737,14 @@ fi ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -printf "%s\n" "$ac_try_echo"; } >&5 +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1791,18 +1752,17 @@ printf "%s\n" "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext - } -then : + }; then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1824,94 +1784,30 @@ fi ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -printf %s "checking for $2... " >&6; } -if eval test \${$3+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" -else $as_nop +else eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -printf "%s\n" "$ac_res" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -printf %s "checking for $2... " >&6; } -if eval test \${$3+y} -then : - printf %s "(cached) " >&6 -else $as_nop - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. */ - -#include -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main (void) -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO" -then : - eval "$3=yes" -else $as_nop - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -printf "%s\n" "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_func - # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. @@ -1924,7 +1820,7 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -printf "%s\n" "$ac_try_echo"; } >&5 +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1932,15 +1828,14 @@ printf "%s\n" "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err - } -then : + }; then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1952,8 +1847,8 @@ fi # ac_fn_c_try_run LINENO # ---------------------- -# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that -# executables *can* be run. +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack @@ -1963,26 +1858,25 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -printf "%s\n" "$ac_try_echo"; } >&5 +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -printf "%s\n" "$ac_try_echo"; } >&5 +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; } -then : + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : ac_retval=0 -else $as_nop - printf "%s\n" "$as_me: program exited with status $ac_status" >&5 - printf "%s\n" "$as_me: failed program was:" >&5 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status @@ -1993,6 +1887,164 @@ fi } # ac_fn_c_try_run +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## --------------------------------- ## +## Report this to caml-list@inria.fr ## +## --------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache @@ -2000,18 +2052,17 @@ fi ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -printf %s "checking for $2... " >&6; } -if eval test \${$3+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main (void) +main () { if (sizeof ($2)) return 0; @@ -2019,13 +2070,12 @@ if (sizeof ($2)) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main (void) +main () { if (sizeof (($2))) return 0; @@ -2033,19 +2083,18 @@ if (sizeof (($2))) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : -else $as_nop +else eval "$3=yes" fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -printf "%s\n" "$ac_res" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type @@ -2064,7 +2113,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main (void) +main () { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; @@ -2074,15 +2123,14 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main (void) +main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; @@ -2092,10 +2140,9 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid; break -else $as_nop +else as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= @@ -2103,14 +2150,14 @@ else $as_nop fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done -else $as_nop +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main (void) +main () { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; @@ -2120,15 +2167,14 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main (void) +main () { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; @@ -2138,10 +2184,9 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_lo=$ac_mid; break -else $as_nop +else as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= @@ -2149,14 +2194,14 @@ else $as_nop fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done -else $as_nop +else ac_lo= ac_hi= fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val @@ -2164,7 +2209,7 @@ while test "x$ac_lo" != "x$ac_hi"; do /* end confdefs.h. */ $4 int -main (void) +main () { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; @@ -2174,13 +2219,12 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_hi=$ac_mid -else $as_nop +else as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; @@ -2190,12 +2234,12 @@ esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 -static long int longval (void) { return $2; } -static unsigned long int ulongval (void) { return $2; } +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } #include #include int -main (void) +main () { FILE *f = fopen ("conftest.val", "w"); @@ -2223,10 +2267,9 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO" -then : +if ac_fn_c_try_run "$LINENO"; then : echo >>conftest.val; read $3 &5 -printf %s "checking whether $as_decl_name is declared... " >&6; } -if eval test \${$3+y} -then : - printf %s "(cached) " >&6 -else $as_nop as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` - eval ac_save_FLAGS=\$$6 - as_fn_append $6 " $5" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main (void) +main () { #ifndef $as_decl_name #ifdef __cplusplus @@ -2274,22 +2314,19 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" -else $as_nop +else eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - eval $6=\$ac_save_FLAGS - +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -printf "%s\n" "$ac_res" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -} # ac_fn_check_decl +} # ac_fn_c_check_decl # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- @@ -2298,17 +2335,16 @@ printf "%s\n" "$ac_res" >&6; } ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 -printf %s "checking for $2.$3... " >&6; } -if eval test \${$4+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +$as_echo_n "checking for $2.$3... " >&6; } +if eval \${$4+:} false; then : + $as_echo_n "(cached) " >&6 +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int -main (void) +main () { static $2 ac_aggr; if (ac_aggr.$3) @@ -2317,15 +2353,14 @@ return 0; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" -else $as_nop +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int -main (void) +main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) @@ -2334,50 +2369,29 @@ return 0; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" -else $as_nop +else eval "$4=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -printf "%s\n" "$ac_res" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member -ac_configure_args_raw= -for ac_arg -do - case $ac_arg in - *\'*) - ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - as_fn_append ac_configure_args_raw " '$ac_arg'" -done - -case $ac_configure_args_raw in - *$as_nl*) - ac_safe_unquote= ;; - *) - ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. - ac_unsafe_a="$ac_unsafe_z#~" - ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" - ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; -esac - cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by OCaml $as_me 4.14.1+jst, which was -generated by GNU Autoconf 2.71. Invocation command line was +generated by GNU Autoconf 2.69. Invocation command line was - $ $0$ac_configure_args_raw + $ $0 $@ _ACEOF exec 5>>config.log @@ -2410,12 +2424,8 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - printf "%s\n" "PATH: $as_dir" + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" done IFS=$as_save_IFS @@ -2450,7 +2460,7 @@ do | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) - ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; @@ -2485,13 +2495,11 @@ done # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? - # Sanitize IFS. - IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo - printf "%s\n" "## ---------------- ## + $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo @@ -2502,8 +2510,8 @@ trap 'exit_status=$? case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -2527,7 +2535,7 @@ printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ) echo - printf "%s\n" "## ----------------- ## + $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo @@ -2535,14 +2543,14 @@ printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - printf "%s\n" "$ac_var='\''$ac_val'\''" + $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then - printf "%s\n" "## ------------------- ## + $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo @@ -2550,15 +2558,15 @@ printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - printf "%s\n" "$ac_var='\''$ac_val'\''" + $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then - printf "%s\n" "## ----------- ## + $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo @@ -2566,8 +2574,8 @@ printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} echo fi test "$ac_signal" != 0 && - printf "%s\n" "$as_me: caught signal $ac_signal" - printf "%s\n" "$as_me: exit $exit_status" + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && @@ -2581,48 +2589,63 @@ ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h -printf "%s\n" "/* confdefs.h */" > confdefs.h +$as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. -printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF -printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF -printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF -printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF -printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF -printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - ac_site_files="$CONFIG_SITE" + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac elif test "x$prefix" != xNONE; then - ac_site_files="$prefix/share/config.site $prefix/etc/config.site" + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site else - ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site fi - -for ac_site_file in $ac_site_files +for ac_site_file in "$ac_site_file1" "$ac_site_file2" do - case $ac_site_file in #( - */*) : - ;; #( - *) : - ac_site_file=./$ac_site_file ;; -esac - if test -f "$ac_site_file" && test -r "$ac_site_file"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ - || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi @@ -2632,434 +2655,19 @@ if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -printf "%s\n" "$as_me: loading cache $cache_file" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -printf "%s\n" "$as_me: creating cache $cache_file" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi -# Test code for whether the C compiler supports C89 (global declarations) -ac_c_conftest_c89_globals=' -/* Does the compiler advertise C89 conformance? - Do not test the value of __STDC__, because some compilers set it to 0 - while being otherwise adequately conformant. */ -#if !defined __STDC__ -# error "Compiler does not advertise C89 conformance" -#endif - -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ -struct buf { int x; }; -struct buf * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not \xHH hex character constants. - These do not provoke an error unfortunately, instead are silently treated - as an "x". The following induces an error, until -std is added to get - proper ANSI mode. Curiously \x00 != x always comes out true, for an - array size at least. It is necessary to write \x00 == 0 to get something - that is true only with -std. */ -int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; - -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) '\''x'\'' -int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; - -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), - int, int);' - -# Test code for whether the C compiler supports C89 (body of main). -ac_c_conftest_c89_main=' -ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); -' - -# Test code for whether the C compiler supports C99 (global declarations) -ac_c_conftest_c99_globals=' -// Does the compiler advertise C99 conformance? -#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L -# error "Compiler does not advertise C99 conformance" -#endif - -#include -extern int puts (const char *); -extern int printf (const char *, ...); -extern int dprintf (int, const char *, ...); -extern void *malloc (size_t); - -// Check varargs macros. These examples are taken from C99 6.10.3.5. -// dprintf is used instead of fprintf to avoid needing to declare -// FILE and stderr. -#define debug(...) dprintf (2, __VA_ARGS__) -#define showlist(...) puts (#__VA_ARGS__) -#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) -static void -test_varargs_macros (void) -{ - int x = 1234; - int y = 5678; - debug ("Flag"); - debug ("X = %d\n", x); - showlist (The first, second, and third items.); - report (x>y, "x is %d but y is %d", x, y); -} - -// Check long long types. -#define BIG64 18446744073709551615ull -#define BIG32 4294967295ul -#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) -#if !BIG_OK - #error "your preprocessor is broken" -#endif -#if BIG_OK -#else - #error "your preprocessor is broken" -#endif -static long long int bignum = -9223372036854775807LL; -static unsigned long long int ubignum = BIG64; - -struct incomplete_array -{ - int datasize; - double data[]; -}; - -struct named_init { - int number; - const wchar_t *name; - double average; -}; - -typedef const char *ccp; - -static inline int -test_restrict (ccp restrict text) -{ - // See if C++-style comments work. - // Iterate through items via the restricted pointer. - // Also check for declarations in for loops. - for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) - continue; - return 0; -} - -// Check varargs and va_copy. -static bool -test_varargs (const char *format, ...) -{ - va_list args; - va_start (args, format); - va_list args_copy; - va_copy (args_copy, args); - - const char *str = ""; - int number = 0; - float fnumber = 0; - - while (*format) - { - switch (*format++) - { - case '\''s'\'': // string - str = va_arg (args_copy, const char *); - break; - case '\''d'\'': // int - number = va_arg (args_copy, int); - break; - case '\''f'\'': // float - fnumber = va_arg (args_copy, double); - break; - default: - break; - } - } - va_end (args_copy); - va_end (args); - - return *str && number && fnumber; -} -' - -# Test code for whether the C compiler supports C99 (body of main). -ac_c_conftest_c99_main=' - // Check bool. - _Bool success = false; - success |= (argc != 0); - - // Check restrict. - if (test_restrict ("String literal") == 0) - success = true; - char *restrict newvar = "Another string"; - - // Check varargs. - success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); - test_varargs_macros (); - - // Check flexible array members. - struct incomplete_array *ia = - malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); - ia->datasize = 10; - for (int i = 0; i < ia->datasize; ++i) - ia->data[i] = i * 1.234; - - // Check named initializers. - struct named_init ni = { - .number = 34, - .name = L"Test wide string", - .average = 543.34343, - }; - - ni.number = 58; - - int dynamic_array[ni.number]; - dynamic_array[0] = argv[0][0]; - dynamic_array[ni.number - 1] = 543; - - // work around unused variable warnings - ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' - || dynamic_array[ni.number - 1] != 543); -' - -# Test code for whether the C compiler supports C11 (global declarations) -ac_c_conftest_c11_globals=' -// Does the compiler advertise C11 conformance? -#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L -# error "Compiler does not advertise C11 conformance" -#endif - -// Check _Alignas. -char _Alignas (double) aligned_as_double; -char _Alignas (0) no_special_alignment; -extern char aligned_as_int; -char _Alignas (0) _Alignas (int) aligned_as_int; - -// Check _Alignof. -enum -{ - int_alignment = _Alignof (int), - int_array_alignment = _Alignof (int[100]), - char_alignment = _Alignof (char) -}; -_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); - -// Check _Noreturn. -int _Noreturn does_not_return (void) { for (;;) continue; } - -// Check _Static_assert. -struct test_static_assert -{ - int x; - _Static_assert (sizeof (int) <= sizeof (long int), - "_Static_assert does not work in struct"); - long int y; -}; - -// Check UTF-8 literals. -#define u8 syntax error! -char const utf8_literal[] = u8"happens to be ASCII" "another string"; - -// Check duplicate typedefs. -typedef long *long_ptr; -typedef long int *long_ptr; -typedef long_ptr long_ptr; - -// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. -struct anonymous -{ - union { - struct { int i; int j; }; - struct { int k; long int l; } w; - }; - int m; -} v1; -' - -# Test code for whether the C compiler supports C11 (body of main). -ac_c_conftest_c11_main=' - _Static_assert ((offsetof (struct anonymous, i) - == offsetof (struct anonymous, w.k)), - "Anonymous union alignment botch"); - v1.i = 2; - v1.w.k = 5; - ok |= v1.i != 5; -' - -# Test code for whether the C compiler supports C11 (complete). -ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} -${ac_c_conftest_c99_globals} -${ac_c_conftest_c11_globals} - -int -main (int argc, char **argv) -{ - int ok = 0; - ${ac_c_conftest_c89_main} - ${ac_c_conftest_c99_main} - ${ac_c_conftest_c11_main} - return ok; -} -" - -# Test code for whether the C compiler supports C99 (complete). -ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} -${ac_c_conftest_c99_globals} - -int -main (int argc, char **argv) -{ - int ok = 0; - ${ac_c_conftest_c89_main} - ${ac_c_conftest_c99_main} - return ok; -} -" - -# Test code for whether the C compiler supports C89 (complete). -ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} - -int -main (int argc, char **argv) -{ - int ok = 0; - ${ac_c_conftest_c89_main} - return ok; -} -" - -as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" -as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" -as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" -as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" -as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" -as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" -as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" -as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" -as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" - -# Auxiliary files required by this configure script. -ac_aux_files="install-sh ltmain.sh config.guess config.sub" - -# Locations in which to look for auxiliary files. -ac_aux_dir_candidates="${srcdir}/build-aux" - -# Search for a directory containing all of the required auxiliary files, -# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. -# If we don't find one directory that contains all the files we need, -# we report the set of missing files from the *first* directory in -# $ac_aux_dir_candidates and give up. -ac_missing_aux_files="" -ac_first_candidate=: -printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in $ac_aux_dir_candidates -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - as_found=: - - printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 - ac_aux_dir_found=yes - ac_install_sh= - for ac_aux in $ac_aux_files - do - # As a special case, if "install-sh" is required, that requirement - # can be satisfied by any of "install-sh", "install.sh", or "shtool", - # and $ac_install_sh is set appropriately for whichever one is found. - if test x"$ac_aux" = x"install-sh" - then - if test -f "${as_dir}install-sh"; then - printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 - ac_install_sh="${as_dir}install-sh -c" - elif test -f "${as_dir}install.sh"; then - printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 - ac_install_sh="${as_dir}install.sh -c" - elif test -f "${as_dir}shtool"; then - printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 - ac_install_sh="${as_dir}shtool install -c" - else - ac_aux_dir_found=no - if $ac_first_candidate; then - ac_missing_aux_files="${ac_missing_aux_files} install-sh" - else - break - fi - fi - else - if test -f "${as_dir}${ac_aux}"; then - printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 - else - ac_aux_dir_found=no - if $ac_first_candidate; then - ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" - else - break - fi - fi - fi - done - if test "$ac_aux_dir_found" = yes; then - ac_aux_dir="$as_dir" - break - fi - ac_first_candidate=false - - as_found=false -done -IFS=$as_save_IFS -if $as_found -then : - -else $as_nop - as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 -fi - - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -if test -f "${ac_aux_dir}config.guess"; then - ac_config_guess="$SHELL ${ac_aux_dir}config.guess" -fi -if test -f "${ac_aux_dir}config.sub"; then - ac_config_sub="$SHELL ${ac_aux_dir}config.sub" -fi -if test -f "$ac_aux_dir/configure"; then - ac_configure="$SHELL ${ac_aux_dir}configure" -fi - # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false @@ -3070,12 +2678,12 @@ for ac_var in $ac_precious_vars; do eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) @@ -3084,24 +2692,24 @@ printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in - *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in @@ -3111,12 +2719,11 @@ printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi done if $ac_cache_corrupted; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' - and start over" "$LINENO" 5 + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## @@ -3130,8 +2737,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Configuring OCaml version 4.14.1+jst" >&5 -printf "%s\n" "$as_me: Configuring OCaml version 4.14.1+jst" >&6;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring OCaml version 4.14.1+jst" >&5 +$as_echo "$as_me: Configuring OCaml version 4.14.1+jst" >&6;} # Configuration variables @@ -3173,6 +2780,34 @@ bootstrapping_flexdll=false ## Directory containing auxiliary scripts used during build +ac_aux_dir= +for ac_dir in build-aux "$srcdir"/build-aux; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + ## Output variables @@ -3314,47 +2949,43 @@ ac_config_headers="$ac_config_headers runtime/caml/version.h" # Definitions related to the version of OCaml -printf "%s\n" "#define OCAML_VERSION_MAJOR 4" >>confdefs.h +$as_echo "#define OCAML_VERSION_MAJOR 4" >>confdefs.h -printf "%s\n" "#define OCAML_VERSION_MINOR 14" >>confdefs.h +$as_echo "#define OCAML_VERSION_MINOR 14" >>confdefs.h -printf "%s\n" "#define OCAML_VERSION_PATCHLEVEL 1" >>confdefs.h +$as_echo "#define OCAML_VERSION_PATCHLEVEL 1" >>confdefs.h -printf "%s\n" "#define OCAML_VERSION_ADDITIONAL \"jst\"" >>confdefs.h +$as_echo "#define OCAML_VERSION_ADDITIONAL \"jst\"" >>confdefs.h - printf "%s\n" "#define OCAML_VERSION_EXTRA \"jst\"" >>confdefs.h + $as_echo "#define OCAML_VERSION_EXTRA \"jst\"" >>confdefs.h -printf "%s\n" "#define OCAML_VERSION 41401" >>confdefs.h +$as_echo "#define OCAML_VERSION 41401" >>confdefs.h -printf "%s\n" "#define OCAML_VERSION_STRING \"4.14.1+jst\"" >>confdefs.h +$as_echo "#define OCAML_VERSION_STRING \"4.14.1+jst\"" >>confdefs.h # Checks for system types +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - - - # Make sure we can run config.sub. -$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 - -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -printf %s "checking build system type... " >&6; } -if test ${ac_cv_build+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_build_alias=$build_alias test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -printf "%s\n" "$ac_cv_build" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; @@ -3373,22 +3004,21 @@ IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -printf %s "checking host system type... " >&6; } -if test ${ac_cv_host+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else - ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || - as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -printf "%s\n" "$ac_cv_host" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; @@ -3407,22 +3037,21 @@ IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 -printf %s "checking target system type... " >&6; } -if test ${ac_cv_target+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 +$as_echo_n "checking target system type... " >&6; } +if ${ac_cv_target+:} false; then : + $as_echo_n "(cached) " >&6 +else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else - ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` || - as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5 + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 -printf "%s\n" "$ac_cv_target" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 +$as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; @@ -3478,12 +3107,11 @@ esac # Extract the first word of "dune", so it can be a program name with args. set dummy dune; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_path_dune+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_dune+:} false; then : + $as_echo_n "(cached) " >&6 +else case $dune in [\\/]* | ?:[\\/]*) ac_cv_path_dune="$dune" # Let the user override the test with a path. @@ -3493,15 +3121,11 @@ else $as_nop for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_path_dune="$as_dir$ac_word$ac_exec_ext" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_dune="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3513,43 +3137,39 @@ esac fi dune=$ac_cv_path_dune if test -n "$dune"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dune" >&5 -printf "%s\n" "$dune" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dune" >&5 +$as_echo "$dune" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi # Check whether --with-dune was given. -if test ${with_dune+y} -then : +if test "${with_dune+set}" = set; then : withval=$with_dune; dune=$with_dune fi # Check whether --enable-debug-runtime was given. -if test ${enable_debug_runtime+y} -then : +if test "${enable_debug_runtime+set}" = set; then : enableval=$enable_debug_runtime; fi # Check whether --enable-debugger was given. -if test ${enable_debugger+y} -then : +if test "${enable_debugger+set}" = set; then : enableval=$enable_debugger; -else $as_nop +else enable_debugger=auto fi # Check whether --enable-dependency-generation was given. -if test ${enable_dependency_generation+y} -then : +if test "${enable_dependency_generation+set}" = set; then : enableval=$enable_dependency_generation; -else $as_nop +else enable_dependency_generation=auto fi @@ -3557,32 +3177,28 @@ fi # Check whether --enable-instrumented-runtime was given. -if test ${enable_instrumented_runtime+y} -then : +if test "${enable_instrumented_runtime+set}" = set; then : enableval=$enable_instrumented_runtime; -else $as_nop +else enable_instrumented_runtime=auto fi # Check whether --enable-vmthreads was given. -if test ${enable_vmthreads+y} -then : +if test "${enable_vmthreads+set}" = set; then : enableval=$enable_vmthreads; as_fn_error $? "The vmthreads library is no longer available. \ It was deleted in OCaml 4.09." "$LINENO" 5 fi # Check whether --enable-systhreads was given. -if test ${enable_systhreads+y} -then : +if test "${enable_systhreads+set}" = set; then : enableval=$enable_systhreads; fi # Check whether --enable-graph-lib was given. -if test ${enable_graph_lib+y} -then : +if test "${enable_graph_lib+set}" = set; then : enableval=$enable_graph_lib; as_fn_error $? "The graphics library is no longer distributed with OCaml \ since version 4.09. It is now distributed as a separate \"graphics\" package: \ https://github.com/ocaml/graphics" "$LINENO" 5 @@ -3590,166 +3206,143 @@ fi # Check whether --enable-str-lib was given. -if test ${enable_str_lib+y} -then : +if test "${enable_str_lib+set}" = set; then : enableval=$enable_str_lib; fi # Check whether --enable-unix-lib was given. -if test ${enable_unix_lib+y} -then : +if test "${enable_unix_lib+set}" = set; then : enableval=$enable_unix_lib; fi # Check whether --enable-bigarray-lib was given. -if test ${enable_bigarray_lib+y} -then : +if test "${enable_bigarray_lib+set}" = set; then : enableval=$enable_bigarray_lib; fi # Check whether --enable-ocamldoc was given. -if test ${enable_ocamldoc+y} -then : +if test "${enable_ocamldoc+set}" = set; then : enableval=$enable_ocamldoc; -else $as_nop +else ocamldoc=auto fi # Check whether --with-odoc was given. -if test ${with_odoc+y} -then : +if test "${with_odoc+set}" = set; then : withval=$with_odoc; fi # Check whether --enable-ocamltest was given. -if test ${enable_ocamltest+y} -then : +if test "${enable_ocamltest+set}" = set; then : enableval=$enable_ocamltest; fi # Check whether --enable-native-toplevel was given. -if test ${enable_native_toplevel+y} -then : +if test "${enable_native_toplevel+set}" = set; then : enableval=$enable_native_toplevel; fi # Check whether --enable-frame-pointers was given. -if test ${enable_frame_pointers+y} -then : +if test "${enable_frame_pointers+set}" = set; then : enableval=$enable_frame_pointers; fi # Check whether --enable-cpp-mangling was given. -if test ${enable_cpp_mangling+y} -then : +if test "${enable_cpp_mangling+set}" = set; then : enableval=$enable_cpp_mangling; fi # Check whether --enable-naked-pointers was given. -if test ${enable_naked_pointers+y} -then : +if test "${enable_naked_pointers+set}" = set; then : enableval=$enable_naked_pointers; fi # Check whether --enable-naked-pointers-checker was given. -if test ${enable_naked_pointers_checker+y} -then : +if test "${enable_naked_pointers_checker+set}" = set; then : enableval=$enable_naked_pointers_checker; fi # Check whether --enable-spacetime was given. -if test ${enable_spacetime+y} -then : +if test "${enable_spacetime+set}" = set; then : enableval=$enable_spacetime; as_fn_error $? "spacetime profiling was deleted in OCaml 4.12." "$LINENO" 5 fi # Check whether --enable-cfi was given. -if test ${enable_cfi+y} -then : +if test "${enable_cfi+set}" = set; then : enableval=$enable_cfi; fi # Check whether --enable-imprecise-c99-float-ops was given. -if test ${enable_imprecise_c99_float_ops+y} -then : +if test "${enable_imprecise_c99_float_ops+set}" = set; then : enableval=$enable_imprecise_c99_float_ops; fi # Check whether --enable-installing-source-artifacts was given. -if test ${enable_installing_source_artifacts+y} -then : +if test "${enable_installing_source_artifacts+set}" = set; then : enableval=$enable_installing_source_artifacts; fi # Check whether --enable-installing-bytecode-programs was given. -if test ${enable_installing_bytecode_programs+y} -then : +if test "${enable_installing_bytecode_programs+set}" = set; then : enableval=$enable_installing_bytecode_programs; fi # Check whether --enable-native-compiler was given. -if test ${enable_native_compiler+y} -then : +if test "${enable_native_compiler+set}" = set; then : enableval=$enable_native_compiler; fi # Check whether --enable-flambda was given. -if test ${enable_flambda+y} -then : +if test "${enable_flambda+set}" = set; then : enableval=$enable_flambda; fi # Check whether --enable-flambda-invariants was given. -if test ${enable_flambda_invariants+y} -then : +if test "${enable_flambda_invariants+set}" = set; then : enableval=$enable_flambda_invariants; fi # Check whether --enable-flambda2 was given. -if test ${enable_flambda2+y} -then : +if test "${enable_flambda2+set}" = set; then : enableval=$enable_flambda2; fi # Check whether --enable-cmm-invariants was given. -if test ${enable_cmm_invariants+y} -then : +if test "${enable_cmm_invariants+set}" = set; then : enableval=$enable_cmm_invariants; fi # Check whether --with-target-bindir was given. -if test ${with_target_bindir+y} -then : +if test "${with_target_bindir+set}" = set; then : withval=$with_target_bindir; fi # Check whether --enable-reserved-header-bits was given. -if test ${enable_reserved_header_bits+y} -then : +if test "${enable_reserved_header_bits+set}" = set; then : enableval=$enable_reserved_header_bits; case $enable_reserved_header_bits in #( 0) : with_profinfo=false @@ -3764,15 +3357,13 @@ fi # Check whether --enable-stdlib-manpages was given. -if test ${enable_stdlib_manpages+y} -then : +if test "${enable_stdlib_manpages+set}" = set; then : enableval=$enable_stdlib_manpages; fi # Check whether --enable-warn-error was given. -if test ${enable_warn_error+y} -then : +if test "${enable_warn_error+set}" = set; then : enableval=$enable_warn_error; fi @@ -3805,8 +3396,7 @@ fi # to be removed in the future. # Check whether --enable-force-safe-string was given. -if test ${enable_force_safe_string+y} -then : +if test "${enable_force_safe_string+set}" = set; then : enableval=$enable_force_safe_string; fi @@ -3814,78 +3404,66 @@ fi # Check whether --enable-flat-float-array was given. -if test ${enable_flat_float_array+y} -then : +if test "${enable_flat_float_array+set}" = set; then : enableval=$enable_flat_float_array; fi # Check whether --enable-function-sections was given. -if test ${enable_function_sections+y} -then : +if test "${enable_function_sections+set}" = set; then : enableval=$enable_function_sections; -else $as_nop +else enable_function_sections=auto fi # Check whether --with-afl was given. -if test ${with_afl+y} -then : +if test "${with_afl+set}" = set; then : withval=$with_afl; fi # Check whether --enable-stack-allocation was given. -if test ${enable_stack_allocation+y} -then : +if test "${enable_stack_allocation+set}" = set; then : enableval=$enable_stack_allocation; fi # Check whether --enable-poll-insertion was given. -if test ${enable_poll_insertion+y} -then : +if test "${enable_poll_insertion+set}" = set; then : enableval=$enable_poll_insertion; fi # Check whether --with-flexdll was given. -if test ${with_flexdll+y} -then : - withval=$with_flexdll; if test x"$withval" = 'xyes' -then : +if test "${with_flexdll+set}" = set; then : + withval=$with_flexdll; if test x"$withval" = 'xyes'; then : with_flexdll=flexdll fi fi -if test x"$enable_unix_lib" = "xno" -then : - if test x"$enable_debugger" = "xyes" -then : +if test x"$enable_unix_lib" = "xno"; then : + if test x"$enable_debugger" = "xyes"; then : as_fn_error $? "replay debugger requires the unix library" "$LINENO" 5 -else $as_nop +else enable_debugger="no" fi - if test x"$enable_bigarray_lib" = "xyes" -then : + if test x"$enable_bigarray_lib" = "xyes"; then : as_fn_error $? "legacy bigarray library requires the unix library" "$LINENO" 5 fi fi -if test x"$enable_unix_lib" = "xno" -o x"$enable_str_lib" = "xno" -then : - if test x"$enable_ocamldoc" = "xyes" -then : +if test x"$enable_unix_lib" = "xno" -o x"$enable_str_lib" = "xno"; then : + if test x"$enable_ocamldoc" = "xyes"; then : as_fn_error $? "ocamldoc requires the unix and str libraries" "$LINENO" 5 -else $as_nop +else enable_ocamldoc="no" with_camltex="" fi -else $as_nop +else with_camltex="true" fi @@ -3897,12 +3475,11 @@ if test -n "$ac_tool_prefix"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_LD+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$LD"; then ac_cv_prog_LD="$LD" # Let the user override the test. else @@ -3910,15 +3487,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LD="$ac_tool_prefix$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3929,11 +3502,11 @@ fi fi LD=$ac_cv_prog_LD if test -n "$LD"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -printf "%s\n" "$LD" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -3946,12 +3519,11 @@ if test -z "$LD"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_LD+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_LD"; then ac_cv_prog_ac_ct_LD="$ac_ct_LD" # Let the user override the test. else @@ -3959,15 +3531,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LD="$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3978,11 +3546,11 @@ fi fi ac_ct_LD=$ac_cv_prog_ac_ct_LD if test -n "$ac_ct_LD"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LD" >&5 -printf "%s\n" "$ac_ct_LD" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LD" >&5 +$as_echo "$ac_ct_LD" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -3994,8 +3562,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LD=$ac_ct_LD @@ -4007,16 +3575,14 @@ fi # alters the CFLAGS variable, so we save its value before calling the macro # and restore it after the call old_host_os=$host_os -if test x"$host_os" = "xwindows" -then : +if test x"$host_os" = "xwindows"; then : host_os=mingw fi saved_CFLAGS="$CFLAGS" - case `pwd` in *\ * | *\ *) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac @@ -4036,7 +3602,6 @@ macro_revision='2.4.6' - ltmain=$ac_aux_dir/ltmain.sh # Backslashify metacharacters that are still active within @@ -4060,8 +3625,8 @@ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -printf %s "checking how to print strings... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then @@ -4087,12 +3652,12 @@ func_echo_all () } case $ECHO in - printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -printf "%s\n" "printf" >&6; } ;; - print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -printf "%s\n" "print -r" >&6; } ;; - *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -printf "%s\n" "cat" >&6; } ;; + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; esac @@ -4105,15 +3670,6 @@ esac - - - - - - - - - @@ -4125,12 +3681,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_CC+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -4138,15 +3693,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4157,11 +3708,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -printf "%s\n" "$CC" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -4170,12 +3721,11 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_CC+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -4183,15 +3733,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4202,11 +3748,11 @@ fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -printf "%s\n" "$ac_ct_CC" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then @@ -4214,8 +3760,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -4228,12 +3774,11 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_CC+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -4241,15 +3786,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4260,11 +3801,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -printf "%s\n" "$CC" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -4273,12 +3814,11 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_CC+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -4287,19 +3827,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4315,18 +3851,18 @@ if test $ac_prog_rejected = yes; then # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift - ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -printf "%s\n" "$CC" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -4337,12 +3873,11 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_CC+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -4350,15 +3885,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4369,11 +3900,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -printf "%s\n" "$CC" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -4386,12 +3917,11 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_CC+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -4399,15 +3929,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4418,11 +3944,11 @@ fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -printf "%s\n" "$ac_ct_CC" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -4434,138 +3960,34 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - CC=$ac_ct_CC - fi -fi - -fi -if test -z "$CC"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. -set dummy ${ac_tool_prefix}clang; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_CC+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}clang" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -CC=$ac_cv_prog_CC -if test -n "$CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -printf "%s\n" "$CC" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_CC"; then - ac_ct_CC=$CC - # Extract the first word of "clang", so it can be a program name with args. -set dummy clang; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_CC+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if test -n "$ac_ct_CC"; then - ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="clang" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_CC=$ac_cv_prog_ac_ct_CC -if test -n "$ac_ct_CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -printf "%s\n" "$ac_ct_CC" >&6; } -else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -fi - - if test "x$ac_ct_CC" = x; then - CC="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi -else - CC="$ac_cv_prog_CC" fi fi -test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. -printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion -version; do +for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -printf "%s\n" "$ac_try_echo"; } >&5 +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -4575,7 +3997,7 @@ printf "%s\n" "$ac_try_echo"; } >&5 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done @@ -4583,7 +4005,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main (void) +main () { ; @@ -4595,9 +4017,9 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -printf %s "checking whether the C compiler works... " >&6; } -ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" @@ -4618,12 +4040,11 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -printf "%s\n" "$ac_try_echo"; } >&5 +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -then : + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, @@ -4640,7 +4061,7 @@ do # certainly right. break;; *.* ) - if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -4656,46 +4077,44 @@ do done test "$ac_cv_exeext" = no && ac_cv_exeext= -else $as_nop +else ac_file='' fi -if test -z "$ac_file" -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -printf "%s\n" "$as_me: failed program was:" >&5 +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -printf %s "checking for C compiler default output file name... " >&6; } -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -printf "%s\n" "$ac_file" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -printf %s "checking for suffix of executables... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -printf "%s\n" "$ac_try_echo"; } >&5 +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -then : + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -4709,15 +4128,15 @@ for ac_file in conftest.exe conftest conftest.*; do * ) break;; esac done -else $as_nop - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -printf "%s\n" "$ac_cv_exeext" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext @@ -4726,7 +4145,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main (void) +main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; @@ -4738,8 +4157,8 @@ _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -printf %s "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in @@ -4747,10 +4166,10 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -printf "%s\n" "$ac_try_echo"; } >&5 +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in @@ -4758,40 +4177,39 @@ printf "%s\n" "$ac_try_echo"; } >&5 *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -printf "%s\n" "$ac_try_echo"; } >&5 +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot run C compiled programs. + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -printf "%s\n" "$cross_compiling" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -printf %s "checking for suffix of object files... " >&6; } -if test ${ac_cv_objext+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main (void) +main () { ; @@ -4805,12 +4223,11 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -printf "%s\n" "$ac_try_echo"; } >&5 +$as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -then : + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in @@ -4819,32 +4236,31 @@ then : break;; esac done -else $as_nop - printf "%s\n" "$as_me: failed program was:" >&5 +else + $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -printf "%s\n" "$ac_cv_objext" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 -printf %s "checking whether the compiler supports GNU C... " >&6; } -if test ${ac_cv_c_compiler_gnu+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main (void) +main () { #ifndef __GNUC__ choke me @@ -4854,33 +4270,29 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes -else $as_nop +else ac_compiler_gnu=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } -ac_compiler_gnu=$ac_cv_c_compiler_gnu - +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi -ac_test_CFLAGS=${CFLAGS+y} +ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -printf %s "checking whether $CC accepts -g... " >&6; } -if test ${ac_cv_prog_cc_g+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no @@ -4889,60 +4301,57 @@ else $as_nop /* end confdefs.h. */ int -main (void) +main () { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes -else $as_nop +else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main (void) +main () { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : -else $as_nop +else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main (void) +main () { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -printf "%s\n" "$ac_cv_prog_cc_g" >&6; } -if test $ac_test_CFLAGS; then +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then @@ -4957,144 +4366,94 @@ else CFLAGS= fi fi -ac_prog_cc_stdc=no -if test x$ac_prog_cc_stdc = xno -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 -printf %s "checking for $CC option to enable C11 features... " >&6; } -if test ${ac_cv_prog_cc_c11+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c11=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$ac_c_conftest_c11_program -_ACEOF -for ac_arg in '' -std=gnu11 -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO" -then : - ac_cv_prog_cc_c11=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam - test "x$ac_cv_prog_cc_c11" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC -fi +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} -if test "x$ac_cv_prog_cc_c11" = xno -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c11" = x -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 -printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } - CC="$CC $ac_cv_prog_cc_c11" -fi - ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 - ac_prog_cc_stdc=c11 -fi -fi -if test x$ac_prog_cc_stdc = xno -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 -printf %s "checking for $CC option to enable C99 features... " >&6; } -if test ${ac_cv_prog_cc_c99+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c99=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_c_conftest_c99_program -_ACEOF -for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= -do - CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO" -then : - ac_cv_prog_cc_c99=$ac_arg -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam - test "x$ac_cv_prog_cc_c99" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC -fi +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; -if test "x$ac_cv_prog_cc_c99" = xno -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c99" = x -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 -printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } - CC="$CC $ac_cv_prog_cc_c99" -fi - ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 - ac_prog_cc_stdc=c99 -fi -fi -if test x$ac_prog_cc_stdc = xno -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 -printf %s "checking for $CC option to enable C89 features... " >&6; } -if test ${ac_cv_prog_cc_c89+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_cv_prog_cc_c89=no -ac_save_CC=$CC -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_c_conftest_c89_program +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} _ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO" -then : + if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi -rm -f core conftest.err conftest.$ac_objext conftest.beam +rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC -fi -if test "x$ac_cv_prog_cc_c89" = xno -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -printf "%s\n" "unsupported" >&6; } -else $as_nop - if test "x$ac_cv_prog_cc_c89" = x -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -printf "%s\n" "none needed" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } - CC="$CC $ac_cv_prog_cc_c89" -fi - ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 - ac_prog_cc_stdc=c89 fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + fi ac_ext=c @@ -5103,12 +4462,11 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -printf %s "checking for a sed that does not truncate output... " >&6; } -if test ${ac_cv_path_SED+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" @@ -5122,15 +4480,10 @@ else $as_nop for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in sed gsed - do + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir$ac_prog$ac_exec_ext" + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED @@ -5139,13 +4492,13 @@ case `"$ac_path_SED" --version 2>&1` in ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 - printf %s 0123456789 >"conftest.in" + $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - printf "%s\n" '' >> "conftest.nl" + $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -5173,8 +4526,8 @@ else fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -printf "%s\n" "$ac_cv_path_SED" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed @@ -5191,12 +4544,11 @@ Xsed="$SED -e 1s/^X//" -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -printf %s "checking for grep that handles long lines and -e... " >&6; } -if test ${ac_cv_path_GREP+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST @@ -5204,15 +4556,10 @@ else $as_nop for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in grep ggrep - do + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP @@ -5221,13 +4568,13 @@ case `"$ac_path_GREP" --version 2>&1` in ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 - printf %s 0123456789 >"conftest.in" + $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - printf "%s\n" 'GREP' >> "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -5255,17 +4602,16 @@ else fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -printf "%s\n" "$ac_cv_path_GREP" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -printf %s "checking for egrep... " >&6; } -if test ${ac_cv_path_EGREP+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else @@ -5276,15 +4622,10 @@ else $as_nop for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in egrep - do + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP @@ -5293,13 +4634,13 @@ case `"$ac_path_EGREP" --version 2>&1` in ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 - printf %s 0123456789 >"conftest.in" + $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - printf "%s\n" 'EGREP' >> "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -5328,17 +4669,16 @@ fi fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -printf "%s\n" "$ac_cv_path_EGREP" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -printf %s "checking for fgrep... " >&6; } -if test ${ac_cv_path_FGREP+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else @@ -5349,15 +4689,10 @@ else $as_nop for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in fgrep - do + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP @@ -5366,13 +4701,13 @@ case `"$ac_path_FGREP" --version 2>&1` in ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 - printf %s 0123456789 >"conftest.in" + $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - printf "%s\n" 'FGREP' >> "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -5401,8 +4736,8 @@ fi fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -printf "%s\n" "$ac_cv_path_FGREP" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" @@ -5427,18 +4762,17 @@ test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. -if test ${with_gnu_ld+y} -then : +if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes -else $as_nop +else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -printf %s "checking for ld used by $CC... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw @@ -5467,16 +4801,15 @@ printf %s "checking for ld used by $CC... " >&6; } ;; esac elif test yes = "$with_gnu_ld"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -printf %s "checking for GNU ld... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -printf %s "checking for non-GNU ld... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } fi -if test ${lt_cv_path_LD+y} -then : - printf %s "(cached) " >&6 -else $as_nop +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do @@ -5505,19 +4838,18 @@ fi LD=$lt_cv_path_LD if test -n "$LD"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -printf "%s\n" "$LD" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -printf %s "checking if the linker ($LD) is GNU ld... " >&6; } -if test ${lt_cv_prog_gnu_ld+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &1 &5 -printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld @@ -5540,12 +4872,11 @@ with_gnu_ld=$lt_cv_prog_gnu_ld -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if test ${lt_cv_path_NM+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM @@ -5595,8 +4926,8 @@ else : ${lt_cv_path_NM=no} fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -printf "%s\n" "$lt_cv_path_NM" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else @@ -5609,12 +4940,11 @@ else do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_DUMPBIN+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else @@ -5622,15 +4952,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5641,11 +4967,11 @@ fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -printf "%s\n" "$DUMPBIN" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -5658,12 +4984,11 @@ if test -z "$DUMPBIN"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_DUMPBIN+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else @@ -5671,15 +4996,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5690,11 +5011,11 @@ fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -printf "%s\n" "$ac_ct_DUMPBIN" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -5706,8 +5027,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN @@ -5735,12 +5056,11 @@ test -z "$NM" && NM=nm -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -printf %s "checking the name lister ($NM) interface... " >&6; } -if test ${lt_cv_nm_interface+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) @@ -5756,27 +5076,26 @@ else $as_nop fi rm -f conftest* fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -printf "%s\n" "$lt_cv_nm_interface" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -printf %s "checking whether ln -s works... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -printf "%s\n" "no, using $LN_S" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -printf %s "checking the maximum length of command line arguments... " >&6; } -if test ${lt_cv_sys_max_cmd_len+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else i=0 teststring=ABCD @@ -5903,11 +5222,11 @@ else $as_nop fi if test -n "$lt_cv_sys_max_cmd_len"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 -printf "%s\n" "none" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len @@ -5951,12 +5270,11 @@ esac -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -printf %s "checking how to convert $build file names to $host format... " >&6; } -if test ${lt_cv_to_host_file_cmd+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else case $host in *-*-mingw* ) case $build in @@ -5992,19 +5310,18 @@ esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -printf %s "checking how to convert $build file names to toolchain format... " >&6; } -if test ${lt_cv_to_tool_file_cmd+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in @@ -6020,23 +5337,22 @@ esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -printf %s "checking for $LD option to reload object files... " >&6; } -if test ${lt_cv_ld_reload_flag+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_ld_reload_flag='-r' fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; @@ -6069,12 +5385,11 @@ esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_OBJDUMP+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else @@ -6082,15 +5397,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6101,11 +5412,11 @@ fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -printf "%s\n" "$OBJDUMP" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -6114,12 +5425,11 @@ if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_OBJDUMP+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else @@ -6127,15 +5437,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6146,11 +5452,11 @@ fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -printf "%s\n" "$ac_ct_OBJDUMP" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then @@ -6158,8 +5464,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP @@ -6178,12 +5484,11 @@ test -z "$OBJDUMP" && OBJDUMP=objdump -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -printf %s "checking how to recognize dependent libraries... " >&6; } -if test ${lt_cv_deplibs_check_method+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' @@ -6379,8 +5684,8 @@ os2*) esac fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no @@ -6424,12 +5729,11 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_DLLTOOL+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else @@ -6437,15 +5741,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6456,11 +5756,11 @@ fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -printf "%s\n" "$DLLTOOL" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -6469,12 +5769,11 @@ if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_DLLTOOL+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else @@ -6482,15 +5781,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6501,11 +5796,11 @@ fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -printf "%s\n" "$ac_ct_DLLTOOL" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then @@ -6513,8 +5808,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL @@ -6534,12 +5829,11 @@ test -z "$DLLTOOL" && DLLTOOL=dlltool -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -printf %s "checking how to associate runtime and link libraries... " >&6; } -if test ${lt_cv_sharedlib_from_linklib_cmd+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in @@ -6562,8 +5856,8 @@ cygwin* | mingw* | pw32* | cegcc*) esac fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO @@ -6579,12 +5873,11 @@ if test -n "$ac_tool_prefix"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_AR+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else @@ -6592,15 +5885,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6611,11 +5900,11 @@ fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -printf "%s\n" "$AR" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -6628,12 +5917,11 @@ if test -z "$AR"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_AR+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else @@ -6641,15 +5929,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6660,11 +5944,11 @@ fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -printf "%s\n" "$ac_ct_AR" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -6676,8 +5960,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR @@ -6697,32 +5981,30 @@ fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -printf %s "checking for archiver @FILE support... " >&6; } -if test ${lt_cv_ar_at_file+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main (void) +main () { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. @@ -6730,7 +6012,7 @@ then : { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ @@ -6739,11 +6021,11 @@ then : rm -f conftest.* libconftest.a fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -printf "%s\n" "$lt_cv_ar_at_file" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= @@ -6760,12 +6042,11 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_STRIP+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else @@ -6773,15 +6054,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6792,11 +6069,11 @@ fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -printf "%s\n" "$STRIP" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -6805,12 +6082,11 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_STRIP+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else @@ -6818,15 +6094,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6837,11 +6109,11 @@ fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -printf "%s\n" "$ac_ct_STRIP" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then @@ -6849,8 +6121,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP @@ -6869,12 +6141,11 @@ test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_RANLIB+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else @@ -6882,15 +6153,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6901,11 +6168,11 @@ fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -printf "%s\n" "$RANLIB" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -6914,12 +6181,11 @@ if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_RANLIB+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else @@ -6927,15 +6193,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6946,11 +6208,11 @@ fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -printf "%s\n" "$ac_ct_RANLIB" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then @@ -6958,8 +6220,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB @@ -7023,12 +6285,11 @@ for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_AWK+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else @@ -7036,15 +6297,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7055,11 +6312,11 @@ fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -printf "%s\n" "$AWK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -7095,12 +6352,11 @@ compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -printf %s "checking command to parse $NM output from $compiler object... " >&6; } -if test ${lt_cv_sys_global_symbol_pipe+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] @@ -7252,14 +6508,14 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then @@ -7328,7 +6584,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi @@ -7363,11 +6619,11 @@ if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -printf "%s\n" "failed" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -printf "%s\n" "ok" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } fi # Response file support. @@ -7413,14 +6669,13 @@ fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -printf %s "checking for sysroot... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. -if test ${with_sysroot+y} -then : +if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; -else $as_nop +else with_sysroot=no fi @@ -7438,25 +6693,24 @@ case $with_sysroot in #( no|'') ;; #( *) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 -printf "%s\n" "$with_sysroot" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -printf "%s\n" "${lt_sysroot:-no}" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 -printf %s "checking for a working dd... " >&6; } -if test ${ac_cv_path_lt_DD+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} @@ -7467,15 +6721,10 @@ if test -z "$lt_DD"; then for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - for ac_prog in dd - do + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ @@ -7495,16 +6744,15 @@ fi rm -f conftest.i conftest2.i conftest.out fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 -printf "%s\n" "$ac_cv_path_lt_DD" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 -printf %s "checking how to truncate binary pipes... " >&6; } -if test ${lt_cv_truncate_bin+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= @@ -7515,8 +6763,8 @@ fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 -printf "%s\n" "$lt_cv_truncate_bin" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } @@ -7539,8 +6787,7 @@ func_cc_basename () } # Check whether --enable-libtool-lock was given. -if test ${enable_libtool_lock+y} -then : +if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi @@ -7556,7 +6803,7 @@ ia64-*-hpux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) @@ -7576,7 +6823,7 @@ ia64-*-hpux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in @@ -7614,7 +6861,7 @@ mips64*-*linux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in @@ -7655,7 +6902,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) @@ -7718,12 +6965,11 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -printf %s "checking whether the C compiler needs -belf... " >&6; } -if test ${lt_cv_cc_needs_belf+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -7734,20 +6980,19 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu /* end confdefs.h. */ int -main (void) +main () { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes -else $as_nop +else lt_cv_cc_needs_belf=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -7756,8 +7001,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS @@ -7770,7 +7015,7 @@ printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) @@ -7807,12 +7052,11 @@ need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_MANIFEST_TOOL+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else @@ -7820,15 +7064,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7839,11 +7079,11 @@ fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -printf "%s\n" "$MANIFEST_TOOL" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -7852,12 +7092,11 @@ if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else @@ -7865,15 +7104,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7884,11 +7119,11 @@ fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then @@ -7896,8 +7131,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL @@ -7907,12 +7142,11 @@ else fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if test ${lt_cv_path_mainfest_tool+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out @@ -7922,8 +7156,8 @@ else $as_nop fi rm -f conftest* fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi @@ -7938,12 +7172,11 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_DSYMUTIL+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else @@ -7951,15 +7184,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7970,11 +7199,11 @@ fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -printf "%s\n" "$DSYMUTIL" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -7983,12 +7212,11 @@ if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else @@ -7996,15 +7224,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8015,11 +7239,11 @@ fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then @@ -8027,8 +7251,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL @@ -8040,12 +7264,11 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_NMEDIT+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else @@ -8053,15 +7276,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8072,11 +7291,11 @@ fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -printf "%s\n" "$NMEDIT" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -8085,12 +7304,11 @@ if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_NMEDIT+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else @@ -8098,15 +7316,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8117,11 +7331,11 @@ fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -printf "%s\n" "$ac_ct_NMEDIT" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then @@ -8129,8 +7343,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT @@ -8142,12 +7356,11 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_LIPO+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else @@ -8155,15 +7368,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8174,11 +7383,11 @@ fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -printf "%s\n" "$LIPO" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -8187,12 +7396,11 @@ if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_LIPO+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else @@ -8200,15 +7408,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8219,11 +7423,11 @@ fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -printf "%s\n" "$ac_ct_LIPO" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then @@ -8231,8 +7435,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO @@ -8244,12 +7448,11 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_OTOOL+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else @@ -8257,15 +7460,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8276,11 +7475,11 @@ fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -printf "%s\n" "$OTOOL" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -8289,12 +7488,11 @@ if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_OTOOL+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else @@ -8302,15 +7500,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8321,11 +7515,11 @@ fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -printf "%s\n" "$ac_ct_OTOOL" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then @@ -8333,8 +7527,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL @@ -8346,12 +7540,11 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_OTOOL64+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else @@ -8359,15 +7552,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8378,11 +7567,11 @@ fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -printf "%s\n" "$OTOOL64" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -8391,12 +7580,11 @@ if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_OTOOL64+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else @@ -8404,15 +7592,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -8423,11 +7607,11 @@ fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -printf "%s\n" "$ac_ct_OTOOL64" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then @@ -8435,8 +7619,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 @@ -8471,12 +7655,11 @@ fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -printf %s "checking for -single_module linker flag... " >&6; } -if test ${lt_cv_apple_cc_single_mod+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override @@ -8505,15 +7688,14 @@ else $as_nop rm -f conftest.* fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -printf %s "checking for -exported_symbols_list linker flag... " >&6; } -if test ${lt_cv_ld_exported_symbols_list+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym @@ -8522,33 +7704,31 @@ else $as_nop /* end confdefs.h. */ int -main (void) +main () { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes -else $as_nop +else lt_cv_ld_exported_symbols_list=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -printf %s "checking for -force_load linker flag... " >&6; } -if test ${lt_cv_ld_force_load+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} @@ -8576,8 +7756,8 @@ _LT_EOF rm -rf conftest.dSYM fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -printf "%s\n" "$lt_cv_ld_force_load" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; @@ -8648,43 +7828,286 @@ func_munge_path_list () esac } -ac_header= ac_cache= -for ac_item in $ac_header_c_list +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes do - if test $ac_cache; then - ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" - if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then - printf "%s\n" "#define $ac_item 1" >> confdefs.h - fi - ac_header= ac_cache= - elif test $ac_header; then - ac_cache=$ac_item - else - ac_header=$ac_item - fi + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then +$as_echo "#define STDC_HEADERS 1" >>confdefs.h +fi +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF +fi -if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes -then : +done -printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h -fi -ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " -if test "x$ac_cv_header_dlfcn_h" = xyes -then : - printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF fi +done + @@ -8700,8 +8123,7 @@ fi # Check whether --enable-shared was given. -if test ${enable_shared+y} -then : +if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; @@ -8719,7 +8141,7 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop +else enable_shared=yes fi @@ -8732,8 +8154,7 @@ fi # Check whether --enable-static was given. -if test ${enable_static+y} -then : +if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; @@ -8751,7 +8172,7 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop +else enable_static=yes fi @@ -8765,8 +8186,7 @@ fi # Check whether --with-pic was given. -if test ${with_pic+y} -then : +if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; @@ -8783,7 +8203,7 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop +else pic_mode=default fi @@ -8795,8 +8215,7 @@ fi # Check whether --enable-fast-install was given. -if test ${enable_fast_install+y} -then : +if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; @@ -8814,7 +8233,7 @@ then : IFS=$lt_save_ifs ;; esac -else $as_nop +else enable_fast_install=yes fi @@ -8828,12 +8247,11 @@ fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 -printf %s "checking which variant of shared library versioning to provide... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. -if test ${with_aix_soname+y} -then : +if test "${with_aix_soname+set}" = set; then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; @@ -8842,19 +8260,18 @@ then : ;; esac lt_cv_with_aix_soname=$with_aix_soname -else $as_nop - if test ${lt_cv_with_aix_soname+y} -then : - printf %s "(cached) " >&6 -else $as_nop +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 -printf "%s\n" "$with_aix_soname" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', @@ -8936,12 +8353,11 @@ if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -printf %s "checking for objdir... " >&6; } -if test ${lt_cv_objdir+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then @@ -8952,15 +8368,17 @@ else fi rmdir .libs 2>/dev/null fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -printf "%s\n" "$lt_cv_objdir" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir -printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF @@ -9006,12 +8424,11 @@ test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -printf %s "checking for ${ac_tool_prefix}file... " >&6; } -if test ${lt_cv_path_MAGIC_CMD+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. @@ -9060,11 +8477,11 @@ fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -printf "%s\n" "$MAGIC_CMD" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -9073,12 +8490,11 @@ fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -printf %s "checking for file... " >&6; } -if test ${lt_cv_path_MAGIC_CMD+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. @@ -9127,11 +8543,11 @@ fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -printf "%s\n" "$MAGIC_CMD" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -9216,12 +8632,11 @@ if test yes = "$GCC"; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if test ${lt_cv_prog_compiler_rtti_exceptions+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -9252,8 +8667,8 @@ else $as_nop $RM conftest* fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" @@ -9610,28 +9025,26 @@ case $host_os in ;; esac -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -printf %s "checking for $compiler option to produce PIC... " >&6; } -if test ${lt_cv_prog_compiler_pic+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if test ${lt_cv_prog_compiler_pic_works+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -9662,8 +9075,8 @@ else $as_nop $RM conftest* fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in @@ -9691,12 +9104,11 @@ fi # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if test ${lt_cv_prog_compiler_static_works+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" @@ -9720,8 +9132,8 @@ else $as_nop LDFLAGS=$save_LDFLAGS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : @@ -9735,12 +9147,11 @@ fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test ${lt_cv_prog_compiler_c_o+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest @@ -9783,20 +9194,19 @@ else $as_nop $RM conftest* fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test ${lt_cv_prog_compiler_c_o+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest @@ -9839,8 +9249,8 @@ else $as_nop $RM conftest* fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } @@ -9848,19 +9258,19 @@ printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -printf %s "checking if we can lock with hard links... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -printf "%s\n" "$hard_links" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } if test no = "$hard_links"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 -printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else @@ -9872,8 +9282,8 @@ fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= @@ -10431,23 +9841,21 @@ _LT_EOF if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else - if test ${lt_cv_aix_libpath_+y} -then : - printf %s "(cached) " >&6 -else $as_nop + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main (void) +main () { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -10462,7 +9870,7 @@ then : lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib @@ -10486,23 +9894,21 @@ fi if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else - if test ${lt_cv_aix_libpath_+y} -then : - printf %s "(cached) " >&6 -else $as_nop + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main (void) +main () { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -10517,7 +9923,7 @@ then : lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib @@ -10768,12 +10174,11 @@ fi # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -printf %s "checking if $CC understands -b... " >&6; } -if test ${lt_cv_prog_compiler__b+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" @@ -10797,8 +10202,8 @@ else $as_nop LDFLAGS=$save_LDFLAGS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' @@ -10838,30 +10243,28 @@ fi # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if test ${lt_cv_irix_exported_symbol+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes -else $as_nop +else lt_cv_irix_exported_symbol=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi @@ -11142,8 +10545,8 @@ printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -printf "%s\n" "$ld_shlibs" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld @@ -11179,19 +10582,18 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -printf %s "checking whether -lc should be explicitly linked in... " >&6; } -if test ${lt_cv_archive_cmds_need_lc+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest @@ -11209,7 +10611,7 @@ else $as_nop if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no @@ -11223,8 +10625,8 @@ else $as_nop $RM conftest* fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac @@ -11383,8 +10785,8 @@ esac - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -printf %s "checking dynamic linker characteristics... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in @@ -11945,10 +11347,9 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH - if test ${lt_cv_shlibpath_overrides_runpath+y} -then : - printf %s "(cached) " >&6 -else $as_nop + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir @@ -11958,21 +11359,19 @@ else $as_nop /* end confdefs.h. */ int -main (void) +main () { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null -then : +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir @@ -12216,8 +11615,8 @@ uts4*) dynamic_linker=no ;; esac -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -printf "%s\n" "$dynamic_linker" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -12338,8 +11737,8 @@ configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -printf %s "checking how to hardcode library paths into programs... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || @@ -12363,8 +11762,8 @@ else # directories. hardcode_action=unsupported fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -printf "%s\n" "$hardcode_action" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then @@ -12408,12 +11807,11 @@ else darwin*) # if libdl is installed we need to link against it - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -printf %s "checking for dlopen in -ldl... " >&6; } -if test ${ac_cv_lib_dl_dlopen+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -12422,31 +11820,32 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif char dlopen (); int -main (void) +main () { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes -else $as_nop +else ac_cv_lib_dl_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes -then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else $as_nop +else lt_cv_dlopen=dyld lt_cv_dlopen_libs= @@ -12466,16 +11865,14 @@ fi *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes -then : +if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen=shl_load -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -printf %s "checking for shl_load in -ldld... " >&6; } -if test ${ac_cv_lib_dld_shl_load+y} -then : - printf %s "(cached) " >&6 -else $as_nop +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -12484,42 +11881,41 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif char shl_load (); int -main (void) +main () { return shl_load (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes -else $as_nop +else ac_cv_lib_dld_shl_load=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes -then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld -else $as_nop +else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes -then : +if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen=dlopen -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -printf %s "checking for dlopen in -ldl... " >&6; } -if test ${ac_cv_lib_dl_dlopen+y} -then : - printf %s "(cached) " >&6 -else $as_nop +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -12528,37 +11924,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif char dlopen (); int -main (void) +main () { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes -else $as_nop +else ac_cv_lib_dl_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes -then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -printf %s "checking for dlopen in -lsvld... " >&6; } -if test ${ac_cv_lib_svld_dlopen+y} -then : - printf %s "(cached) " >&6 -else $as_nop +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -12567,37 +11963,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif char dlopen (); int -main (void) +main () { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes -else $as_nop +else ac_cv_lib_svld_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes -then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -printf %s "checking for dld_link in -ldld... " >&6; } -if test ${ac_cv_lib_dld_dld_link+y} -then : - printf %s "(cached) " >&6 -else $as_nop +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -12606,29 +12002,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif char dld_link (); int -main (void) +main () { return dld_link (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes -else $as_nop +else ac_cv_lib_dld_dld_link=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes -then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi @@ -12667,12 +12064,11 @@ fi save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -printf %s "checking whether a program can dlopen itself... " >&6; } -if test ${lt_cv_dlopen_self+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else @@ -12751,7 +12147,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? @@ -12769,17 +12165,16 @@ rm -fr conftest* fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -printf "%s\n" "$lt_cv_dlopen_self" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -printf %s "checking whether a statically linked program can dlopen itself... " >&6; } -if test ${lt_cv_dlopen_self_static+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else @@ -12858,7 +12253,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? @@ -12876,8 +12271,8 @@ rm -fr conftest* fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS @@ -12915,13 +12310,13 @@ fi striplib= old_striplib= -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -printf %s "checking whether stripping libraries is possible... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in @@ -12929,16 +12324,16 @@ else if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi ;; *) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } ;; esac fi @@ -12955,13 +12350,13 @@ fi # Report what library types will actually be built - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -printf %s "checking if libtool supports shared libraries... " >&6; } - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -printf "%s\n" "$can_build_shared" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -printf %s "checking whether to build shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and @@ -12985,15 +12380,15 @@ printf %s "checking whether to build shared libraries... " >&6; } fi ;; esac - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -printf "%s\n" "$enable_shared" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -printf %s "checking whether to build static libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -printf "%s\n" "$enable_static" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } @@ -13041,12 +12436,11 @@ case $host in #( do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_DEP_CC+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DEP_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$DEP_CC"; then ac_cv_prog_DEP_CC="$DEP_CC" # Let the user override the test. else @@ -13054,15 +12448,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DEP_CC="$ac_tool_prefix$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -13073,11 +12463,11 @@ fi fi DEP_CC=$ac_cv_prog_DEP_CC if test -n "$DEP_CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DEP_CC" >&5 -printf "%s\n" "$DEP_CC" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DEP_CC" >&5 +$as_echo "$DEP_CC" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -13090,12 +12480,11 @@ if test -z "$DEP_CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_DEP_CC+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DEP_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_DEP_CC"; then ac_cv_prog_ac_ct_DEP_CC="$ac_ct_DEP_CC" # Let the user override the test. else @@ -13103,15 +12492,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DEP_CC="$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -13122,11 +12507,11 @@ fi fi ac_ct_DEP_CC=$ac_cv_prog_ac_ct_DEP_CC if test -n "$ac_ct_DEP_CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DEP_CC" >&5 -printf "%s\n" "$ac_ct_DEP_CC" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DEP_CC" >&5 +$as_echo "$ac_ct_DEP_CC" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -13138,8 +12523,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DEP_CC=$ac_ct_DEP_CC @@ -13152,24 +12537,21 @@ esac case $enable_dependency_generation in #( yes) : - if test "$DEP_CC" = "false" -then : + if test "$DEP_CC" = "false"; then : as_fn_error $? "The MSVC ports cannot generate dependency information. Install gcc (or another CC-like compiler)" "$LINENO" 5 -else $as_nop +else compute_deps=true fi ;; #( no) : compute_deps=false ;; #( *) : - if test -e .git -then : - if test "$DEP_CC" = "false" -then : + if test -e .git; then : + if test "$DEP_CC" = "false"; then : compute_deps=false -else $as_nop +else compute_deps=true fi -else $as_nop +else compute_deps=false fi ;; esac @@ -13185,10 +12567,9 @@ case $host in #( libext=lib AR="" - if test "$host_cpu" = "x86_64" -then : + if test "$host_cpu" = "x86_64" ; then : machine="-machine:AMD64 " -else $as_nop +else machine="" fi mklib="link -lib -nologo $machine /out:\$(1) \$(2)" @@ -13200,144 +12581,11 @@ fi esac ## Find vendor of the C compiler -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -printf %s "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if test ${ac_cv_prog_CPP+y} -then : - printf %s "(cached) " >&6 -else $as_nop - # Double quotes because $CC needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO" -then : - -else $as_nop - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO" -then : - # Broken: success on invalid input. -continue -else $as_nop - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok -then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -printf "%s\n" "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO" -then : - -else $as_nop - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO" -then : - # Broken: success on invalid input. -continue -else $as_nop - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok -then : - -else $as_nop - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking C compiler vendor" >&5 -printf %s "checking C compiler vendor... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking C compiler vendor" >&5 +$as_echo_n "checking C compiler vendor... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13358,52 +12606,48 @@ unknown #endif _ACEOF -if ac_fn_c_try_cpp "$LINENO" -then : - if test ${ocaml_cv_cc_vendor+y} -then : - printf %s "(cached) " >&6 -else $as_nop +if ac_fn_c_try_cpp "$LINENO"; then : + if ${ocaml_cv_cc_vendor+:} false; then : + $as_echo_n "(cached) " >&6 +else ocaml_cv_cc_vendor=`grep '^[a-z]' conftest.i | tr -s ' ' '-' \ | tr -d '\r'` fi -else $as_nop - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "unexpected preprocessor failure See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.err conftest.i conftest.$ac_ext - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ocaml_cv_cc_vendor" >&5 -printf "%s\n" "$ocaml_cv_cc_vendor" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ocaml_cv_cc_vendor" >&5 +$as_echo "$ocaml_cv_cc_vendor" >&6; } ## In cross-compilation mode, can we run executables produced? # At the moment, it's required, but the fact is used in C99 function detection - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether host executables can be run in the build" >&5 -printf %s "checking whether host executables can be run in the build... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether host executables can be run in the build" >&5 +$as_echo_n "checking whether host executables can be run in the build... " >&6; } old_cross_compiling="$cross_compiling" cross_compiling='no' - if test "$cross_compiling" = yes -then : + if test "$cross_compiling" = yes; then : # autoconf displays a warning if this parameter is missing, but # cross-compilation mode was disabled above. assert=false -else $as_nop +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) {return 0;} _ACEOF -if ac_fn_c_try_run "$LINENO" -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } host_runnable=true -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } host_runnable=false fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -13456,18 +12700,15 @@ case $host in #( esac otherlibraries="dynlink" -if test x"$enable_unix_lib" != "xno" -then : +if test x"$enable_unix_lib" != "xno"; then : enable_unix_lib=yes - if test x"$enable_bigarray_lib" != "xno" -then : + if test x"$enable_bigarray_lib" != "xno"; then : otherlibraries="$otherlibraries $unixlib bigarray" -else $as_nop +else otherlibraries="$otherlibraries $unixlib" fi fi -if test x"$enable_str_lib" != "xno" -then : +if test x"$enable_str_lib" != "xno"; then : otherlibraries="$otherlibraries str" fi @@ -13475,12 +12716,11 @@ fi ## Test whether #! scripts are supported ## TODO: have two values, one for host and one for target -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether #! works in shell scripts" >&5 -printf %s "checking whether #! works in shell scripts... " >&6; } -if test ${ac_cv_sys_interpreter+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether #! works in shell scripts" >&5 +$as_echo_n "checking whether #! works in shell scripts... " >&6; } +if ${ac_cv_sys_interpreter+:} false; then : + $as_echo_n "(cached) " >&6 +else echo '#! /bin/cat exit 69 ' >conftest @@ -13493,46 +12733,42 @@ else fi rm -f conftest fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_interpreter" >&5 -printf "%s\n" "$ac_cv_sys_interpreter" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_interpreter" >&5 +$as_echo "$ac_cv_sys_interpreter" >&6; } interpval=$ac_cv_sys_interpreter long_shebang=false -if test "x$interpval" = "xyes" -then : +if test "x$interpval" = "xyes"; then : case $host in #( *-cygwin|*-*-mingw32|*-pc-windows) : shebangscripts=false ;; #( *) : shebangscripts=true prev_exec_prefix="$exec_prefix" - if test "x$exec_prefix" = "xNONE" -then : + if test "x$exec_prefix" = "xNONE"; then : exec_prefix="$prefix" fi eval "expanded_bindir=\"$bindir\"" exec_prefix="$prev_exec_prefix" # Assume maximum shebang is 128 chars; less #!, /ocamlrun, an optional # 1 char suffix and the \0 leaving 115 characters - if test "${#expanded_bindir}" -gt 115 -then : + if test "${#expanded_bindir}" -gt 115; then : long_shebang=true fi ;; esac -else $as_nop +else shebangscripts=false fi # Are we building a cross-compiler -if test x"$host" = x"$target" -then : +if test x"$host" = x"$target"; then : cross_compiler=false -else $as_nop +else cross_compiler=true fi @@ -13614,10 +12850,10 @@ esac ;; #( gcc-3-*|gcc-4-[01]) : # No -fwrapv option before GCC 3.4. # Known problems with -fwrapv fixed in 4.2 only. - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: This version of GCC is rather old. Reducing optimization level.\"" >&5 -printf "%s\n" "$as_me: WARNING: This version of GCC is rather old. Reducing optimization level.\"" >&2;}; - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Consider using GCC version 4.2 or above." >&5 -printf "%s\n" "$as_me: WARNING: Consider using GCC version 4.2 or above." >&2;}; + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: This version of GCC is rather old. Reducing optimization level.\"" >&5 +$as_echo "$as_me: WARNING: This version of GCC is rather old. Reducing optimization level.\"" >&2;}; + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Consider using GCC version 4.2 or above." >&5 +$as_echo "$as_me: WARNING: Consider using GCC version 4.2 or above." >&2;}; common_cflags="-std=gnu99 -O"; internal_cflags="$cc_warnings" ;; #( gcc-4-[234]) : @@ -13638,29 +12874,27 @@ printf "%s\n" "$as_me: WARNING: Consider using GCC version 4.2 or above." >&2;}; common_cppflags="-D_CRT_SECURE_NO_DEPRECATE" internal_cppflags='-DUNICODE -D_UNICODE' - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports -d2VolatileMetadata-" >&5 -printf %s "checking whether the C compiler supports -d2VolatileMetadata-... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports -d2VolatileMetadata-" >&5 +$as_echo_n "checking whether the C compiler supports -d2VolatileMetadata-... " >&6; } saved_CFLAGS="$CFLAGS" CFLAGS="-d2VolatileMetadata- $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main() { return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : cl_has_volatile_metadata=true - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else cl_has_volatile_metadata=false - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$saved_CFLAGS" - if test "x$cl_has_volatile_metadata" = "xtrue" -then : + if test "x$cl_has_volatile_metadata" = "xtrue"; then : internal_cflags='-d2VolatileMetadata-' fi internal_cppflags="$internal_cppflags -DWINDOWS_UNICODE=" @@ -13706,8 +12940,7 @@ esac # [*-pc-windows], # [enable_shared=yes]) -if test x"$enable_shared" = "xno" -then : +if test x"$enable_shared" = "xno"; then : supports_shared_libraries=false case $host in #( *-pc-windows|*-w64-mingw32) : @@ -13715,7 +12948,7 @@ then : *) : ;; esac -else $as_nop +else supports_shared_libraries=true fi @@ -13745,66 +12978,58 @@ case $host in #( ;; esac -if test x"$supports_shared_libraries" != 'xfalse' -then : +if test x"$supports_shared_libraries" != 'xfalse'; then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for flexdll sources" >&5 -printf %s "checking for flexdll sources... " >&6; } - if test x"$with_flexdll" = "xno" -then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flexdll sources" >&5 +$as_echo_n "checking for flexdll sources... " >&6; } + if test x"$with_flexdll" = "xno"; then : flexdir='' - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 -printf "%s\n" "disabled" >&6; } -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 +$as_echo "disabled" >&6; } +else flexmsg='' case $target in #( *-*-cygwin*|*-w64-mingw32|*-pc-windows) : - if test x"$with_flexdll" = 'x' -o x"$with_flexdll" = 'xflexdll' -then : - if test -f 'flexdll/flexdll.h' -then : + if test x"$with_flexdll" = 'x' -o x"$with_flexdll" = 'xflexdll'; then : + if test -f 'flexdll/flexdll.h'; then : flexdir=flexdll iflexdir='$(ROOTDIR)/flexdll' with_flexdll="$iflexdir" -else $as_nop - if test x"$with_flexdll" != 'x' -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: requested but not available" >&5 -printf "%s\n" "requested but not available" >&6; } +else + if test x"$with_flexdll" != 'x'; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: requested but not available" >&5 +$as_echo "requested but not available" >&6; } as_fn_error $? "exiting" "$LINENO" 5 fi fi -else $as_nop +else rm -rf flexdll-sources - if test -f "$with_flexdll/flexdll.h" -then : + if test -f "$with_flexdll/flexdll.h"; then : mkdir -p flexdll-sources cp -r "$with_flexdll"/* flexdll-sources/ flexdir='flexdll-sources' iflexdir='$(ROOTDIR)/flexdll-sources' flexmsg=" (from $with_flexdll)" -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: requested but not available" >&5 -printf "%s\n" "requested but not available" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: requested but not available" >&5 +$as_echo "requested but not available" >&6; } as_fn_error $? "exiting" "$LINENO" 5 fi fi - if test x"$flexdir" = 'x' -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iflexdir$flexmsg" >&5 -printf "%s\n" "$iflexdir$flexmsg" >&6; } + if test x"$flexdir" = 'x'; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $iflexdir$flexmsg" >&5 +$as_echo "$iflexdir$flexmsg" >&6; } bootstrapping_flexdll=true # The submodule should be searched *before* any other -I paths internal_cppflags="-I $iflexdir $internal_cppflags" fi ;; #( *) : - if test x"$with_flexdll" != 'x' -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: requested but not supported" >&5 -printf "%s\n" "requested but not supported" >&6; } + if test x"$with_flexdll" != 'x'; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: requested but not supported" >&5 +$as_echo "requested but not supported" >&6; } as_fn_error $? "exiting" "$LINENO" 5 fi ;; esac @@ -13812,12 +13037,11 @@ fi # Extract the first word of "flexlink", so it can be a program name with args. set dummy flexlink; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_flexlink+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_flexlink+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$flexlink"; then ac_cv_prog_flexlink="$flexlink" # Let the user override the test. else @@ -13825,15 +13049,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_flexlink="flexlink" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -13844,17 +13064,16 @@ fi fi flexlink=$ac_cv_prog_flexlink if test -n "$flexlink"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $flexlink" >&5 -printf "%s\n" "$flexlink" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flexlink" >&5 +$as_echo "$flexlink" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi - if test -n "$flexlink" -a -z "$flexdir" -then : + if test -n "$flexlink" -a -z "$flexdir"; then : @@ -13870,15 +13089,14 @@ then : touch confdefs.h - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $flexlink works" >&5 -printf %s "checking whether $flexlink works... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $flexlink works" >&5 +$as_echo_n "checking whether $flexlink works... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int answer = 42; _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : # Create conftest1.$ac_objext as a symlink on Cygwin to ensure that native # flexlink can cope. The reverse test is unnecessary (a Cygwin-compiled # flexlink can read anything). @@ -13898,23 +13116,22 @@ esac /* end confdefs.h. */ int main() { return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } as_fn_error $? "$flexlink does not work" "$LINENO" 5 fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unexpected compile error" >&5 -printf "%s\n" "unexpected compile error" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unexpected compile error" >&5 +$as_echo "unexpected compile error" >&6; } as_fn_error $? "error calling the C compiler" "$LINENO" 5 fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Restore the content of confdefs.h @@ -13931,8 +13148,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext case $host in #( *-w64-mingw32|*-pc-windows) : flexlink_where="$(cmd /c "$flexlink" -where 2>/dev/null)" - if test -z "$flexlink_where" -then : + if test -z "$flexlink_where"; then : as_fn_error $? "$flexlink is not executable from a native Win32 process" "$LINENO" 5 fi ;; #( @@ -13956,23 +13172,20 @@ fi touch confdefs.h - if test -n "$flexdir" -then : + if test -n "$flexdir"; then : CPPFLAGS="-I $flexdir $CPPFLAGS" fi have_flexdll_h=no - ac_fn_c_check_header_compile "$LINENO" "flexdll.h" "ac_cv_header_flexdll_h" "$ac_includes_default" -if test "x$ac_cv_header_flexdll_h" = xyes -then : + ac_fn_c_check_header_mongrel "$LINENO" "flexdll.h" "ac_cv_header_flexdll_h" "$ac_includes_default" +if test "x$ac_cv_header_flexdll_h" = xyes; then : have_flexdll_h=yes -else $as_nop +else have_flexdll_h=no fi - if test x"$have_flexdll_h" = 'xno' -then : - if test -n "$flexdir" -then : + + if test x"$have_flexdll_h" = 'xno'; then : + if test -n "$flexdir"; then : as_fn_error $? "$flexdir/flexdll.h appears unusable" "$LINENO" 5 fi fi @@ -13989,8 +13202,7 @@ fi - if test -n "$flexlink" -a x"$have_flexdll_h" = 'xno' -then : + if test -n "$flexlink" -a x"$have_flexdll_h" = 'xno'; then : saved_CC="$CC" @@ -14005,8 +13217,8 @@ then : touch confdefs.h - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if \"$flexlink -where\" includes flexdll.h" >&5 -printf %s "checking if \"$flexlink -where\" includes flexdll.h... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if \"$flexlink -where\" includes flexdll.h" >&5 +$as_echo_n "checking if \"$flexlink -where\" includes flexdll.h... " >&6; } flexlink_where="$($flexlink -where | tr -d '\r')" CPPFLAGS="$CPPFLAGS -I \"$flexlink_where\"" cat > conftest.c <<"EOF" @@ -14017,14 +13229,13 @@ EOF all: $CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.c $LIBS EOF - if make -f conftest.Makefile >/dev/null 2>/dev/null -then : + if make -f conftest.Makefile >/dev/null 2>/dev/null; then : have_flexdll_h=yes - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -14038,8 +13249,7 @@ fi LIBS="$saved_LIBS" - if test "x$have_flexdll_h" = 'xyes' -then : + if test "x$have_flexdll_h" = 'xyes'; then : internal_cppflags="$internal_cppflags -I \"$flexlink_where\"" fi @@ -14050,8 +13260,8 @@ fi case $have_flexdll_h,$supports_shared_libraries,$host in #( no,true,*-*-cygwin*) : supports_shared_libraries=false - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: flexdll.h not found: shared library support disabled." >&5 -printf "%s\n" "$as_me: WARNING: flexdll.h not found: shared library support disabled." >&2;} ;; #( + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: flexdll.h not found: shared library support disabled." >&5 +$as_echo "$as_me: WARNING: flexdll.h not found: shared library support disabled." >&2;} ;; #( no,*,*-w64-mingw32|no,*,*-pc-windows) : as_fn_error $? "flexdll.h is required for native Win32" "$LINENO" 5 ;; #( *) : @@ -14061,8 +13271,8 @@ esac case $flexdir,$supports_shared_libraries,$flexlink,$host in #( ,true,,*-*-cygwin*) : supports_shared_libraries=false - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: flexlink not found: shared library support disabled." >&5 -printf "%s\n" "$as_me: WARNING: flexlink not found: shared library support disabled." >&2;} ;; #( + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: flexlink not found: shared library support disabled." >&5 +$as_echo "$as_me: WARNING: flexlink not found: shared library support disabled." >&2;} ;; #( ,*,,*-w64-mingw32|,*,,*-pc-windows) : as_fn_error $? "flexlink is required for native Win32" "$LINENO" 5 ;; #( *) : @@ -14072,17 +13282,16 @@ esac case $cc_basename,$host in #( *,*-*-darwin*) : mkexe="$mkexe -Wl,-no_compact_unwind"; - printf "%s\n" "#define HAS_ARCH_CODE32 1" >>confdefs.h + $as_echo "#define HAS_ARCH_CODE32 1" >>confdefs.h ;; #( *,*-*-haiku*) : mathlib="" ;; #( *,*-*-cygwin*) : common_cppflags="$common_cppflags -U_WIN32" - if $supports_shared_libraries -then : + if $supports_shared_libraries; then : mkexe='$(FLEXLINK) -exe $(if $(OC_LDFLAGS),-link "$(OC_LDFLAGS)")' mkexedebugflag="-link -g" -else $as_nop +else mkexe="$mkexe -Wl,--stack,16777216" oc_ldflags="-Wl,--stack,16777216" @@ -14108,12 +13317,12 @@ esac oc_ldflags='/ENTRY:wmainCRTStartup' mkexedebugflag='' ;; #( *,x86_64-*-linux*) : - printf "%s\n" "#define HAS_ARCH_CODE32 1" >>confdefs.h + $as_echo "#define HAS_ARCH_CODE32 1" >>confdefs.h ;; #( xlc*,powerpc-ibm-aix*) : mkexe="$mkexe " oc_ldflags="-brtl -bexpfull" - printf "%s\n" "#define HAS_ARCH_CODE32 1" >>confdefs.h + $as_echo "#define HAS_ARCH_CODE32 1" >>confdefs.h ;; #( gcc*,powerpc-*-linux*) : oc_ldflags="-mbss-plt" ;; #( @@ -14123,8 +13332,7 @@ esac ## Program to use to install files - - # Find a good install program. We prefer a C program (faster), +# Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install @@ -14138,25 +13346,20 @@ esac # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -printf %s "checking for a BSD-compatible install... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if test ${ac_cv_path_install+y} -then : - printf %s "(cached) " >&6 -else $as_nop +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - # Account for fact that we put trailing slashes in our PATH walk. -case $as_dir in #(( - ./ | /[cC]/* | \ + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; @@ -14166,13 +13369,13 @@ case $as_dir in #(( # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && - grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && - grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else @@ -14180,12 +13383,12 @@ case $as_dir in #(( echo one > conftest.one echo two > conftest.two mkdir conftest.dir - if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then - ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi @@ -14201,7 +13404,7 @@ IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi - if test ${ac_cv_path_install+y}; then + if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a @@ -14211,8 +13414,8 @@ fi INSTALL=$ac_install_sh fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -printf "%s\n" "$INSTALL" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. @@ -14226,12 +13429,11 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' # Checks for libraries ## Mathematical library -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 -printf %s "checking for cos in -lm... " >&6; } -if test ${ac_cv_lib_m_cos+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +$as_echo_n "checking for cos in -lm... " >&6; } +if ${ac_cv_lib_m_cos+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -14240,97 +13442,102 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif char cos (); int -main (void) +main () { return cos (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes -else $as_nop +else ac_cv_lib_m_cos=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 -printf "%s\n" "$ac_cv_lib_m_cos" >&6; } -if test "x$ac_cv_lib_m_cos" = xyes -then : - printf "%s\n" "#define HAVE_LIBM 1" >>confdefs.h +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +$as_echo "$ac_cv_lib_m_cos" >&6; } +if test "x$ac_cv_lib_m_cos" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBM 1 +_ACEOF LIBS="-lm $LIBS" fi -if test "x$ac_cv_lib_m_cos" = xyes -then : +if test "x$ac_cv_lib_m_cos" = xyes ; then : mathlib="-lm" -else $as_nop +else mathlib="" fi # Checks for header files -ac_fn_c_check_header_compile "$LINENO" "math.h" "ac_cv_header_math_h" "$ac_includes_default" -if test "x$ac_cv_header_math_h" = xyes -then : +ac_fn_c_check_header_mongrel "$LINENO" "math.h" "ac_cv_header_math_h" "$ac_includes_default" +if test "x$ac_cv_header_math_h" = xyes; then : fi - for ac_header in unistd.h + +for ac_header in unistd.h do : - ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" -if test "x$ac_cv_header_unistd_h" = xyes -then : - printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h - printf "%s\n" "#define HAS_UNISTD 1" >>confdefs.h + ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +if test "x$ac_cv_header_unistd_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_UNISTD_H 1 +_ACEOF + $as_echo "#define HAS_UNISTD 1" >>confdefs.h fi done -ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" -if test "x$ac_cv_header_stdint_h" = xyes -then : - printf "%s\n" "#define HAS_STDINT_H 1" >>confdefs.h + +ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes; then : + $as_echo "#define HAS_STDINT_H 1" >>confdefs.h fi + ac_fn_c_check_header_compile "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "#include " -if test "x$ac_cv_header_dirent_h" = xyes -then : - printf "%s\n" "#define HAS_DIRENT 1" >>confdefs.h +if test "x$ac_cv_header_dirent_h" = xyes; then : + $as_echo "#define HAS_DIRENT 1" >>confdefs.h fi + ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "#include " -if test "x$ac_cv_header_sys_select_h" = xyes -then : - printf "%s\n" "#define HAS_SYS_SELECT_H 1" >>confdefs.h +if test "x$ac_cv_header_sys_select_h" = xyes; then : + $as_echo "#define HAS_SYS_SELECT_H 1" >>confdefs.h fi + # Checks for types ## off_t ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" -if test "x$ac_cv_type_off_t" = xyes -then : +if test "x$ac_cv_type_off_t" = xyes; then : -else $as_nop +else -printf "%s\n" "#define off_t long int" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define off_t long int +_ACEOF fi @@ -14343,19 +13550,17 @@ fi # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 -printf %s "checking size of int... " >&6; } -if test ${ac_cv_sizeof_int+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default" -then : - -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if ${ac_cv_sizeof_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : + +else if test "$ac_cv_type_int" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else @@ -14364,31 +13569,31 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 -printf "%s\n" "$ac_cv_sizeof_int" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } -printf "%s\n" "#define SIZEOF_INT $ac_cv_sizeof_int" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 -printf %s "checking size of long... " >&6; } -if test ${ac_cv_sizeof_long+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default" -then : - -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if ${ac_cv_sizeof_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : + +else if test "$ac_cv_type_long" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) See \`config.log' for more details" "$LINENO" 5; } else @@ -14397,31 +13602,31 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 -printf "%s\n" "$ac_cv_sizeof_long" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } -printf "%s\n" "#define SIZEOF_LONG $ac_cv_sizeof_long" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG $ac_cv_sizeof_long +_ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long *" >&5 -printf %s "checking size of long *... " >&6; } -if test ${ac_cv_sizeof_long_p+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long *))" "ac_cv_sizeof_long_p" "$ac_includes_default" -then : - -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long *" >&5 +$as_echo_n "checking size of long *... " >&6; } +if ${ac_cv_sizeof_long_p+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long *))" "ac_cv_sizeof_long_p" "$ac_includes_default"; then : + +else if test "$ac_cv_type_long_p" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long *) See \`config.log' for more details" "$LINENO" 5; } else @@ -14430,31 +13635,31 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_p" >&5 -printf "%s\n" "$ac_cv_sizeof_long_p" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_p" >&5 +$as_echo "$ac_cv_sizeof_long_p" >&6; } -printf "%s\n" "#define SIZEOF_LONG_P $ac_cv_sizeof_long_p" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_P $ac_cv_sizeof_long_p +_ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 -printf %s "checking size of short... " >&6; } -if test ${ac_cv_sizeof_short+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default" -then : - -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 +$as_echo_n "checking size of short... " >&6; } +if ${ac_cv_sizeof_short+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : + +else if test "$ac_cv_type_short" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (short) See \`config.log' for more details" "$LINENO" 5; } else @@ -14463,31 +13668,31 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 -printf "%s\n" "$ac_cv_sizeof_short" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 +$as_echo "$ac_cv_sizeof_short" >&6; } -printf "%s\n" "#define SIZEOF_SHORT $ac_cv_sizeof_short" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SHORT $ac_cv_sizeof_short +_ACEOF # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 -printf %s "checking size of long long... " >&6; } -if test ${ac_cv_sizeof_long_long+y} -then : - printf %s "(cached) " >&6 -else $as_nop - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default" -then : - -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 +$as_echo_n "checking size of long long... " >&6; } +if ${ac_cv_sizeof_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : + +else if test "$ac_cv_type_long_long" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long long) See \`config.log' for more details" "$LINENO" 5; } else @@ -14496,56 +13701,57 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 -printf "%s\n" "$ac_cv_sizeof_long_long" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 +$as_echo "$ac_cv_sizeof_long_long" >&6; } -printf "%s\n" "#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long +_ACEOF -if test "x$ac_cv_sizeof_long_p" = "x4" -then : +if test "x$ac_cv_sizeof_long_p" = "x4" ; then : bits=32; arch64=false -elif test "x$ac_cv_sizeof_long_p" = "x8" -then : +elif test "x$ac_cv_sizeof_long_p" = "x8" ; then : bits=64; arch64=true - printf "%s\n" "#define ARCH_SIXTYFOUR 1" >>confdefs.h + $as_echo "#define ARCH_SIXTYFOUR 1" >>confdefs.h -else $as_nop +else as_fn_error $? "Neither 32 nor 64 bits architecture." "$LINENO" 5 fi if test "x$ac_cv_sizeof_int" != "x4" && test "x$ac_cv_sizeof_long" != "x4" \ - && test "x$ac_cv_sizeof_short" != "x4" -then : + && test "x$ac_cv_sizeof_short" != "x4"; then : as_fn_error $? "Sorry, we can't find a 32-bit integer type." "$LINENO" 5 fi if test "x$ac_cv_sizeof_long" != "x8" && - test "x$ac_cv_sizeof_long_long" != "x8" -then : + test "x$ac_cv_sizeof_long_long" != "x8"; then : as_fn_error $? "Sorry, we can't find a 64-bit integer type." "$LINENO" 5 fi -printf "%s\n" "#define SIZEOF_PTR $ac_cv_sizeof_long_p" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define SIZEOF_PTR $ac_cv_sizeof_long_p +_ACEOF -printf "%s\n" "#define SIZEOF_LONGLONG $ac_cv_sizeof_long_long" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONGLONG $ac_cv_sizeof_long_long +_ACEOF -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Target is a $bits bits architecture" >&5 -printf "%s\n" "$as_me: Target is a $bits bits architecture" >&6;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: Target is a $bits bits architecture" >&5 +$as_echo "$as_me: Target is a $bits bits architecture" >&6;} - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 -printf %s "checking whether byte ordering is bigendian... " >&6; } -if test ${ac_cv_c_bigendian+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if ${ac_cv_c_bigendian+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -14556,8 +13762,7 @@ else $as_nop typedef int dummy; _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. @@ -14581,7 +13786,7 @@ then : fi done fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -14590,7 +13795,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext #include int -main (void) +main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ @@ -14602,8 +13807,7 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14611,7 +13815,7 @@ then : #include int -main (void) +main () { #if BYTE_ORDER != BIG_ENDIAN not big endian @@ -14621,15 +13825,14 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes -else $as_nop +else ac_cv_c_bigendian=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). @@ -14638,7 +13841,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext #include int -main (void) +main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros @@ -14648,15 +13851,14 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main (void) +main () { #ifndef _BIG_ENDIAN not big endian @@ -14666,33 +13868,31 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes -else $as_nop +else ac_cv_c_bigendian=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. - if test "$cross_compiling" = yes -then : + if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -unsigned short int ascii_mm[] = +short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; - unsigned short int ascii_ii[] = + short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } - unsigned short int ebcdic_ii[] = + short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; - unsigned short int ebcdic_mm[] = + short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; @@ -14700,15 +13900,14 @@ unsigned short int ascii_mm[] = extern int foo; int -main (void) +main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi @@ -14721,13 +13920,13 @@ then : fi fi fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext -else $as_nop +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int -main (void) +main () { /* Are we little or big endian? From Harbison&Steele. */ @@ -14743,10 +13942,9 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO" -then : +if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no -else $as_nop +else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -14755,12 +13953,12 @@ fi fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -printf "%s\n" "$ac_cv_c_bigendian" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) - printf "%s\n" "#define ARCH_BIG_ENDIAN 1" >>confdefs.h + $as_echo "#define ARCH_BIG_ENDIAN 1" >>confdefs.h endianness="be" ;; #( @@ -14777,20 +13975,21 @@ printf "%s\n" "$ac_cv_c_bigendian" >&6; } # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking alignment of double" >&5 -printf %s "checking alignment of double... " >&6; } -if test ${ac_cv_alignof_double+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of double" >&5 +$as_echo_n "checking alignment of double... " >&6; } +if ${ac_cv_alignof_double+:} false; then : + $as_echo_n "(cached) " >&6 +else if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_double" "$ac_includes_default -typedef struct { char x; double y; } ac__type_alignof_;" -then : +#ifndef offsetof +# define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) +#endif +typedef struct { char x; double y; } ac__type_alignof_;"; then : -else $as_nop +else if test "$ac_cv_type_double" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of double See \`config.log' for more details" "$LINENO" 5; } else @@ -14799,30 +13998,33 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_double" >&5 -printf "%s\n" "$ac_cv_alignof_double" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_double" >&5 +$as_echo "$ac_cv_alignof_double" >&6; } -printf "%s\n" "#define ALIGNOF_DOUBLE $ac_cv_alignof_double" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define ALIGNOF_DOUBLE $ac_cv_alignof_double +_ACEOF # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking alignment of long" >&5 -printf %s "checking alignment of long... " >&6; } -if test ${ac_cv_alignof_long+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of long" >&5 +$as_echo_n "checking alignment of long... " >&6; } +if ${ac_cv_alignof_long+:} false; then : + $as_echo_n "(cached) " >&6 +else if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_long" "$ac_includes_default -typedef struct { char x; long y; } ac__type_alignof_;" -then : +#ifndef offsetof +# define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) +#endif +typedef struct { char x; long y; } ac__type_alignof_;"; then : -else $as_nop +else if test "$ac_cv_type_long" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of long See \`config.log' for more details" "$LINENO" 5; } else @@ -14831,30 +14033,33 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_long" >&5 -printf "%s\n" "$ac_cv_alignof_long" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_long" >&5 +$as_echo "$ac_cv_alignof_long" >&6; } -printf "%s\n" "#define ALIGNOF_LONG $ac_cv_alignof_long" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define ALIGNOF_LONG $ac_cv_alignof_long +_ACEOF # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking alignment of long long" >&5 -printf %s "checking alignment of long long... " >&6; } -if test ${ac_cv_alignof_long_long+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of long long" >&5 +$as_echo_n "checking alignment of long long... " >&6; } +if ${ac_cv_alignof_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_long_long" "$ac_includes_default -typedef struct { char x; long long y; } ac__type_alignof_;" -then : +#ifndef offsetof +# define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) +#endif +typedef struct { char x; long long y; } ac__type_alignof_;"; then : -else $as_nop +else if test "$ac_cv_type_long_long" = yes; then - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of long long See \`config.log' for more details" "$LINENO" 5; } else @@ -14863,36 +14068,34 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_long_long" >&5 -printf "%s\n" "$ac_cv_alignof_long_long" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_long_long" >&5 +$as_echo "$ac_cv_alignof_long_long" >&6; } -printf "%s\n" "#define ALIGNOF_LONG_LONG $ac_cv_alignof_long_long" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define ALIGNOF_LONG_LONG $ac_cv_alignof_long_long +_ACEOF -if ! $arch64 -then : +if ! $arch64; then : case $target_cpu in #( i686) : ;; #( *) : - if test "$ac_cv_alignof_double" -gt 4 -then : - printf "%s\n" "#define ARCH_ALIGN_DOUBLE 1" >>confdefs.h + if test "$ac_cv_alignof_double" -gt 4; then : + $as_echo "#define ARCH_ALIGN_DOUBLE 1" >>confdefs.h fi if test "x$ac_cv_sizeof_long" = "x8" && - test "$ac_cv_alignof_long" -gt 4 -then : - printf "%s\n" "#define ARCH_ALIGN_INT64 1" >>confdefs.h + test "$ac_cv_alignof_long" -gt 4; then : + $as_echo "#define ARCH_ALIGN_INT64 1" >>confdefs.h -else $as_nop +else if test "x$ac_cv_sizeof_long_long" = "x8" && - test "$ac_cv_alignof_long_long" -gt 4 -then : - printf "%s\n" "#define ARCH_ALIGN_INT64 1" >>confdefs.h + test "$ac_cv_alignof_long_long" -gt 4; then : + $as_echo "#define ARCH_ALIGN_INT64 1" >>confdefs.h fi fi @@ -14908,8 +14111,7 @@ rpath='' mksharedlibrpath='' natdynlinkopts="" -if test x"$enable_shared" != "xno" -then : +if test x"$enable_shared" != "xno"; then : case $host in #( *-apple-darwin*) : mksharedlib="$CC -shared \ @@ -14919,8 +14121,7 @@ then : *-*-mingw32) : mksharedlib='$(FLEXLINK)' mkmaindll='$(FLEXLINK) -maindll' - if test -n "$oc_dll_ldflags" -then : + if test -n "$oc_dll_ldflags"; then : mksharedlib="$mksharedlib -link \"$oc_dll_ldflags\"" mkmaindll="$mkmaindll -link \"$oc_dll_ldflags\"" @@ -14968,8 +14169,7 @@ esac esac fi -if test -z "$mkmaindll" -then : +if test -z "$mkmaindll"; then : mkmaindll=$mksharedlib fi @@ -14977,8 +14177,7 @@ fi natdynlink=false -if test x"$supports_shared_libraries" = 'xtrue' -then : +if test x"$supports_shared_libraries" = 'xtrue'; then : case "$host" in #( *-*-cygwin*) : natdynlink=true ;; #( @@ -15058,29 +14257,27 @@ esac case "$cc_basename,$host" in #( *gcc*,x86_64-*|*gcc*,i686-*) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports -fno-tree-vrp" >&5 -printf %s "checking whether the C compiler supports -fno-tree-vrp... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports -fno-tree-vrp" >&5 +$as_echo_n "checking whether the C compiler supports -fno-tree-vrp... " >&6; } saved_CFLAGS="$CFLAGS" CFLAGS="-Werror -fno-tree-vrp $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main() { return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : cc_has_fno_tree_vrp=true - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else cc_has_fno_tree_vrp=false - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$saved_CFLAGS" - if $cc_has_fno_tree_vrp -then : + if $cc_has_fno_tree_vrp; then : internal_cflags="$internal_cflags -fno-tree-vrp" fi ;; #( *) : @@ -15088,28 +14285,27 @@ fi ;; #( esac - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports __attribute__((aligned(n)))" >&5 -printf %s "checking whether the C compiler supports __attribute__((aligned(n)))... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports __attribute__((aligned(n)))" >&5 +$as_echo_n "checking whether the C compiler supports __attribute__((aligned(n)))... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef struct {__attribute__((aligned(8))) int t;} t; _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : - printf "%s\n" "#define SUPPORTS_ALIGNED_ATTRIBUTE 1" >>confdefs.h +if ac_fn_c_try_compile "$LINENO"; then : + $as_echo "#define SUPPORTS_ALIGNED_ATTRIBUTE 1" >>confdefs.h - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ## Check whether __attribute__((optimize("tree-vectorize")))) is supported - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports __attribute__((optimize(\"tree-vectorize\")))" >&5 -printf %s "checking whether the C compiler supports __attribute__((optimize(\"tree-vectorize\")))... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports __attribute__((optimize(\"tree-vectorize\")))" >&5 +$as_echo_n "checking whether the C compiler supports __attribute__((optimize(\"tree-vectorize\")))... " >&6; } saved_CFLAGS="$CFLAGS" CFLAGS="-Werror $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -15119,17 +14315,16 @@ printf %s "checking whether the C compiler supports __attribute__((optimize(\"tr int main() { f(); return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : - printf "%s\n" "#define SUPPORTS_TREE_VECTORIZE 1" >>confdefs.h +if ac_fn_c_try_compile "$LINENO"; then : + $as_echo "#define SUPPORTS_TREE_VECTORIZE 1" >>confdefs.h - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$saved_CFLAGS" @@ -15159,10 +14354,9 @@ case $host in #( powerpc64le*-*-linux*) : arch=power; model=ppc64le; system=elf ;; #( powerpc*-*-linux*) : - arch=power; if $arch64 -then : + arch=power; if $arch64; then : model=ppc64 -else $as_nop +else model=ppc fi; system=elf ;; #( s390x*-*-linux*) : @@ -15239,39 +14433,37 @@ fi; system=elf ;; #( ;; esac -if test x"$enable_native_compiler" = "xno" -then : +if test x"$enable_native_compiler" = "xno"; then : native_compiler=false - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: the native compiler is disabled" >&5 -printf "%s\n" "$as_me: the native compiler is disabled" >&6;} -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: the native compiler is disabled" >&5 +$as_echo "$as_me: the native compiler is disabled" >&6;} +else native_compiler=true fi -if ! $native_compiler -then : +if ! $native_compiler; then : natdynlink=false fi -if $natdynlink -then : +if $natdynlink; then : cmxs="cmxs" -else $as_nop +else cmxs="cmx" fi -printf "%s\n" "#define OCAML_OS_TYPE \"$ostype\"" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define OCAML_OS_TYPE "$ostype" +_ACEOF if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args. set dummy ${ac_tool_prefix}ld; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_DIRECT_LD+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DIRECT_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$DIRECT_LD"; then ac_cv_prog_DIRECT_LD="$DIRECT_LD" # Let the user override the test. else @@ -15279,15 +14471,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DIRECT_LD="${ac_tool_prefix}ld" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -15298,11 +14486,11 @@ fi fi DIRECT_LD=$ac_cv_prog_DIRECT_LD if test -n "$DIRECT_LD"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DIRECT_LD" >&5 -printf "%s\n" "$DIRECT_LD" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DIRECT_LD" >&5 +$as_echo "$DIRECT_LD" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -15311,12 +14499,11 @@ if test -z "$ac_cv_prog_DIRECT_LD"; then ac_ct_DIRECT_LD=$DIRECT_LD # Extract the first word of "ld", so it can be a program name with args. set dummy ld; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ac_ct_DIRECT_LD+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DIRECT_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ac_ct_DIRECT_LD"; then ac_cv_prog_ac_ct_DIRECT_LD="$ac_ct_DIRECT_LD" # Let the user override the test. else @@ -15324,15 +14511,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DIRECT_LD="ld" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -15343,11 +14526,11 @@ fi fi ac_ct_DIRECT_LD=$ac_cv_prog_ac_ct_DIRECT_LD if test -n "$ac_ct_DIRECT_LD"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DIRECT_LD" >&5 -printf "%s\n" "$ac_ct_DIRECT_LD" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DIRECT_LD" >&5 +$as_echo "$ac_ct_DIRECT_LD" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi if test "x$ac_ct_DIRECT_LD" = x; then @@ -15355,8 +14538,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DIRECT_LD=$ac_ct_DIRECT_LD @@ -15365,8 +14548,7 @@ else DIRECT_LD="$ac_cv_prog_DIRECT_LD" fi -if test -z "$PARTIALLD" -then : +if test -z "$PARTIALLD"; then : case "$arch,$cc_basename,$system,$model" in #( amd64,*gcc*,macosx,*) : PACKLD_FLAGS=' -arch x86_64' ;; #( @@ -15383,15 +14565,14 @@ esac # output filename. Don't assume that all C compilers understand GNU -ofoo # form, so ensure that the definition includes a space at the end (which is # achieved using the $(EMPTY) expansion trick). - if test x"$cc_basename" = "xcl" -then : + if test x"$cc_basename" = "xcl"; then : # For the Microsoft C compiler there must be no space at the end of the # string. PACKLD="link -lib -nologo $machine -out:" -else $as_nop +else PACKLD="$DIRECT_LD -r$PACKLD_FLAGS -o \$(EMPTY)" fi -else $as_nop +else PACKLD="$PARTIALLD -o \$(EMPTY)" fi @@ -15428,12 +14609,11 @@ esac intel_jcc_bug_cflags='' case $arch in #( amd64) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wa,-mbranches-within-32B-boundaries" >&5 -printf %s "checking whether C compiler accepts -Wa,-mbranches-within-32B-boundaries... " >&6; } -if test ${ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wa,-mbranches-within-32B-boundaries" >&5 +$as_echo_n "checking whether C compiler accepts -Wa,-mbranches-within-32B-boundaries... " >&6; } +if ${ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries+:} false; then : + $as_echo_n "(cached) " >&6 +else ax_check_save_flags=$CFLAGS CFLAGS="$CFLAGS -Wa,-mbranches-within-32B-boundaries" @@ -15441,28 +14621,26 @@ else $as_nop /* end confdefs.h. */ int -main (void) +main () { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries=yes -else $as_nop +else ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$ax_check_save_flags fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" >&5 -printf "%s\n" "$ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" >&6; } -if test "x$ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" = xyes -then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" >&5 +$as_echo "$ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" >&6; } +if test "x$ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" = xyes; then : intel_jcc_bug_cflags=-Wa,-mbranches-within-32B-boundaries -else $as_nop +else : fi ;; #( @@ -15472,18 +14650,16 @@ esac # Assembler -if test -n "$target_alias" -then : +if test -n "$target_alias"; then : toolpref="${target_alias}-" as_target="$target" as_cpu="$target_cpu" -else $as_nop - if test -n "$host_alias" -then : +else + if test -n "$host_alias"; then : toolpref="${host_alias}-" as_target="$host" as_cpu="$host_cpu" -else $as_nop +else toolpref="" as_target="$build" as_cpu="$build_cpu" @@ -15524,36 +14700,32 @@ esac ;; #( ;; esac -if test "$with_pic" -then : +if test "$with_pic"; then : fpic=true - printf "%s\n" "#define CAML_WITH_FPIC 1" >>confdefs.h + $as_echo "#define CAML_WITH_FPIC 1" >>confdefs.h internal_cflags="$internal_cflags $sharedlib_cflags" default_aspp="$default_aspp $sharedlib_cflags" -else $as_nop +else fpic=false fi -if test -z "$AS" -then : +if test -z "$AS"; then : AS="$default_as" fi -if test -z "$ASPP" -then : +if test -z "$ASPP"; then : ASPP="$default_aspp" fi # Utilities # Extract the first word of "rlwrap", so it can be a program name with args. set dummy rlwrap; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_rlwrap+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_rlwrap+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$rlwrap"; then ac_cv_prog_rlwrap="$rlwrap" # Let the user override the test. else @@ -15561,15 +14733,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_rlwrap="rlwrap" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -15580,18 +14748,18 @@ fi fi rlwrap=$ac_cv_prog_rlwrap if test -n "$rlwrap"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $rlwrap" >&5 -printf "%s\n" "$rlwrap" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $rlwrap" >&5 +$as_echo "$rlwrap" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi case $rlwrap,$system in #( rlwrap,win*|rlwrap,mingw*) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: rlwrap doesn't work with native win32 - disabling" >&5 -printf "%s\n" "$as_me: rlwrap doesn't work with native win32 - disabling" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: rlwrap doesn't work with native win32 - disabling" >&5 +$as_echo "$as_me: rlwrap doesn't work with native win32 - disabling" >&6;} rlwrap='' ;; #( *) : ;; @@ -15601,33 +14769,30 @@ esac ## Check the semantics of signal handlers - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking semantics of signal handlers" >&5 -printf "%s\n" "$as_me: checking semantics of signal handlers" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: checking semantics of signal handlers" >&5 +$as_echo "$as_me: checking semantics of signal handlers" >&6;} ac_fn_c_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction" -if test "x$ac_cv_func_sigaction" = xyes -then : +if test "x$ac_cv_func_sigaction" = xyes; then : has_sigaction=true -else $as_nop +else has_sigaction=false fi ac_fn_c_check_func "$LINENO" "sigprocmask" "ac_cv_func_sigprocmask" -if test "x$ac_cv_func_sigprocmask" = xyes -then : +if test "x$ac_cv_func_sigprocmask" = xyes; then : has_sigprocmask=true -else $as_nop +else has_sigprocmask=false fi - if $has_sigaction && $has_sigprocmask -then : - printf "%s\n" "#define POSIX_SIGNALS 1" >>confdefs.h + if $has_sigaction && $has_sigprocmask; then : + $as_echo "#define POSIX_SIGNALS 1" >>confdefs.h - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: POSIX signal handling found." >&5 -printf "%s\n" "$as_me: POSIX signal handling found." >&6;} -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: assuming signals have the System V semantics." >&5 -printf "%s\n" "$as_me: assuming signals have the System V semantics." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: POSIX signal handling found." >&5 +$as_echo "$as_me: POSIX signal handling found." >&6;} +else + { $as_echo "$as_me:${as_lineno-$LINENO}: assuming signals have the System V semantics." >&5 +$as_echo "$as_me: assuming signals have the System V semantics." >&6;} fi @@ -15636,50 +14801,45 @@ fi ## Check for C99 float ops has_c99_float_ops=true - - for ac_func in expm1 log1p hypot fma exp2 log2 cbrt acosh asinh atanh erf erfc trunc round copysign +for ac_func in expm1 log1p hypot fma exp2 log2 cbrt acosh asinh atanh erf erfc trunc round copysign do : - as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes" -then : +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF -#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF -else $as_nop +else has_c99_float_ops=false fi - done -if $has_c99_float_ops -then : - printf "%s\n" "#define HAS_C99_FLOAT_OPS 1" >>confdefs.h + +if $has_c99_float_ops; then : + $as_echo "#define HAS_C99_FLOAT_OPS 1" >>confdefs.h # Check whether round works (known bug in mingw-w64) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether round works" >&5 -printf %s "checking whether round works... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether round works" >&5 +$as_echo_n "checking whether round works... " >&6; } old_cross_compiling="$cross_compiling" - if test "x$host_runnable" = 'xtrue' -then : + if test "x$host_runnable" = 'xtrue'; then : cross_compiling='no' fi - if test "$cross_compiling" = yes -then : + if test "$cross_compiling" = yes; then : case $target in #( x86_64-w64-mingw32) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume not" >&5 -printf "%s\n" "cross-compiling; assume not" >&6; } ;; #( + { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume not" >&5 +$as_echo "cross-compiling; assume not" >&6; } ;; #( *) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume yes" >&5 -printf "%s\n" "cross-compiling; assume yes" >&6; } - printf "%s\n" "#define HAS_WORKING_ROUND 1" >>confdefs.h + { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume yes" >&5 +$as_echo "cross-compiling; assume yes" >&6; } + $as_echo "#define HAS_WORKING_ROUND 1" >>confdefs.h ;; esac -else $as_nop +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15690,15 +14850,14 @@ int main (void) { } _ACEOF -if ac_fn_c_try_run "$LINENO" -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - printf "%s\n" "#define HAS_WORKING_ROUND 1" >>confdefs.h - -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAS_WORKING_ROUND 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } case $enable_imprecise_c99_float_ops,$target in #( no,*) : hard_error=true ;; #( @@ -15709,12 +14868,11 @@ printf "%s\n" "no" >&6; } *) : hard_error=true ;; esac - if test x"$hard_error" = "xtrue" -then : + if test x"$hard_error" = "xtrue"; then : as_fn_error $? "round does not work, enable emulation with --enable-imprecise-c99-float-ops" "$LINENO" 5 -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: round does not work; emulation enabled" >&5 -printf "%s\n" "$as_me: WARNING: round does not work; emulation enabled" >&2;} +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: round does not work; emulation enabled" >&5 +$as_echo "$as_me: WARNING: round does not work; emulation enabled" >&2;} fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -15727,27 +14885,25 @@ fi # Check whether fma works (regressed in mingw-w64 8.0.0; present, but broken, # in VS2013-2017 and present but unimplemented in Cygwin64) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fma works" >&5 -printf %s "checking whether fma works... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fma works" >&5 +$as_echo_n "checking whether fma works... " >&6; } old_cross_compiling="$cross_compiling" - if test "x$host_runnable" = 'xtrue' -then : + if test "x$host_runnable" = 'xtrue'; then : cross_compiling='no' fi - if test "$cross_compiling" = yes -then : + if test "$cross_compiling" = yes; then : case $target in #( x86_64-w64-mingw32|x86_64-*-cygwin*) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume not" >&5 -printf "%s\n" "cross-compiling; assume not" >&6; } ;; #( + { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume not" >&5 +$as_echo "cross-compiling; assume not" >&6; } ;; #( *) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume yes" >&5 -printf "%s\n" "cross-compiling; assume yes" >&6; } - printf "%s\n" "#define HAS_WORKING_FMA 1" >>confdefs.h + { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume yes" >&5 +$as_echo "cross-compiling; assume yes" >&6; } + $as_echo "#define HAS_WORKING_FMA 1" >>confdefs.h ;; esac -else $as_nop +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15780,15 +14936,14 @@ int main (void) { } _ACEOF -if ac_fn_c_try_run "$LINENO" -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } - printf "%s\n" "#define HAS_WORKING_FMA 1" >>confdefs.h - -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAS_WORKING_FMA 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } case $enable_imprecise_c99_float_ops,$target in #( no,*) : hard_error=true ;; #( @@ -15799,22 +14954,20 @@ printf "%s\n" "no" >&6; } *) : case $ocaml_cv_cc_vendor in #( msvc-*) : - if test "${ocaml_cv_cc_vendor#msvc-}" -lt 1920 -then : + if test "${ocaml_cv_cc_vendor#msvc-}" -lt 1920 ; then : hard_error=false -else $as_nop +else hard_error=true fi ;; #( *) : hard_error=true ;; esac ;; esac - if test x"$hard_error" = "xtrue" -then : + if test x"$hard_error" = "xtrue"; then : as_fn_error $? "fma does not work, enable emulation with --enable-imprecise-c99-float-ops" "$LINENO" 5 -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: fma does not work; emulation enabled" >&5 -printf "%s\n" "$as_me: WARNING: fma does not work; emulation enabled" >&2;} +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: fma does not work; emulation enabled" >&5 +$as_echo "$as_me: WARNING: fma does not work; emulation enabled" >&2;} fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -15824,46 +14977,41 @@ fi cross_compiling="$old_cross_compiling" -else $as_nop - if test x"$enable_imprecise_c99_float_ops" != "xyes" -then : +else + if test x"$enable_imprecise_c99_float_ops" != "xyes" ; then : case $enable_imprecise_c99_float_ops,$ocaml_cv_cc_vendor in #( no,*) : hard_error=true ;; #( ,msvc-*) : - if test "${ocaml_cv_cc_vendor#msvc-}" -lt 1800 -then : + if test "${ocaml_cv_cc_vendor#msvc-}" -lt 1800 ; then : hard_error=false -else $as_nop +else hard_error=true fi ;; #( *) : hard_error=true ;; esac - if test x"$hard_error" = 'xtrue' -then : + if test x"$hard_error" = 'xtrue'; then : as_fn_error $? "C99 float ops unavailable, enable replacements with --enable-imprecise-c99-float-ops" "$LINENO" 5 -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: C99 float ops unavailable, replacements enabled (ancient Visual Studio)" >&5 -printf "%s\n" "$as_me: WARNING: C99 float ops unavailable, replacements enabled (ancient Visual Studio)" >&2;} +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C99 float ops unavailable, replacements enabled (ancient Visual Studio)" >&5 +$as_echo "$as_me: WARNING: C99 float ops unavailable, replacements enabled (ancient Visual Studio)" >&2;} fi fi fi ## getrusage ac_fn_c_check_func "$LINENO" "getrusage" "ac_cv_func_getrusage" -if test "x$ac_cv_func_getrusage" = xyes -then : - printf "%s\n" "#define HAS_GETRUSAGE 1" >>confdefs.h +if test "x$ac_cv_func_getrusage" = xyes; then : + $as_echo "#define HAS_GETRUSAGE 1" >>confdefs.h fi ## times ac_fn_c_check_func "$LINENO" "times" "ac_cv_func_times" -if test "x$ac_cv_func_times" = xyes -then : - printf "%s\n" "#define HAS_TIMES 1" >>confdefs.h +if test "x$ac_cv_func_times" = xyes; then : + $as_echo "#define HAS_TIMES 1" >>confdefs.h fi @@ -15874,15 +15022,13 @@ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="-D_GNU_SOURCE $CPPFLAGS" ac_fn_c_check_func "$LINENO" "secure_getenv" "ac_cv_func_secure_getenv" -if test "x$ac_cv_func_secure_getenv" = xyes -then : - printf "%s\n" "#define HAS_SECURE_GETENV 1" >>confdefs.h +if test "x$ac_cv_func_secure_getenv" = xyes; then : + $as_echo "#define HAS_SECURE_GETENV 1" >>confdefs.h -else $as_nop +else ac_fn_c_check_func "$LINENO" "__secure_getenv" "ac_cv_func___secure_getenv" -if test "x$ac_cv_func___secure_getenv" = xyes -then : - printf "%s\n" "#define HAS___SECURE_GETENV 1" >>confdefs.h +if test "x$ac_cv_func___secure_getenv" = xyes; then : + $as_echo "#define HAS___SECURE_GETENV 1" >>confdefs.h fi @@ -15894,9 +15040,8 @@ CPPFLAGS="$saved_CPPFLAGS" ## issetugid ac_fn_c_check_func "$LINENO" "issetugid" "ac_cv_func_issetugid" -if test "x$ac_cv_func_issetugid" = xyes -then : - printf "%s\n" "#define HAS_ISSETUGID 1" >>confdefs.h +if test "x$ac_cv_func_issetugid" = xyes; then : + $as_echo "#define HAS_ISSETUGID 1" >>confdefs.h fi @@ -15913,26 +15058,24 @@ case $host in #( has_monotonic_clock=true ;; #( *-apple-darwin*) : - - for ac_func in mach_timebase_info mach_absolute_time + for ac_func in mach_timebase_info mach_absolute_time do : - as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes" -then : +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF -#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF has_monotonic_clock=true - printf "%s\n" "#define HAS_MACH_ABSOLUTE_TIME 1" >>confdefs.h + $as_echo "#define HAS_MACH_ABSOLUTE_TIME 1" >>confdefs.h -else $as_nop +else has_monotonic_clock=false fi - -done ;; #( +done + ;; #( *) : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15949,17 +15092,16 @@ done ;; #( } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : has_monotonic_clock=true - printf "%s\n" "#define HAS_POSIX_MONOTONIC_CLOCK 1" >>confdefs.h + $as_echo "#define HAS_POSIX_MONOTONIC_CLOCK 1" >>confdefs.h -else $as_nop +else has_monotonic_clock=false fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; esac @@ -15968,8 +15110,7 @@ esac # if the proper clock source is found. # If asked via --enable-instrumented-runtime, configuration fails if the proper # clock source is missing. -if test "x$enable_instrumented_runtime" != "xno" -then : +if test "x$enable_instrumented_runtime" != "xno" ; then : case $host in #( sparc-sun-solaris*) : @@ -15993,12 +15134,11 @@ but no proper monotonic clock source was found." "$LINENO" 5 ;; esac ;; #( *) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 -printf %s "checking for library containing clock_gettime... " >&6; } -if test ${ac_cv_search_clock_gettime+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 +$as_echo_n "checking for library containing clock_gettime... " >&6; } +if ${ac_cv_search_clock_gettime+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -16006,51 +15146,49 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif char clock_gettime (); int -main (void) +main () { return clock_gettime (); ; return 0; } _ACEOF -for ac_lib in '' rt -do +for ac_lib in '' rt; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO" -then : + if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_clock_gettime=$ac_res fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext - if test ${ac_cv_search_clock_gettime+y} -then : + if ${ac_cv_search_clock_gettime+:} false; then : break fi done -if test ${ac_cv_search_clock_gettime+y} -then : +if ${ac_cv_search_clock_gettime+:} false; then : -else $as_nop +else ac_cv_search_clock_gettime=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 -printf "%s\n" "$ac_cv_search_clock_gettime" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 +$as_echo "$ac_cv_search_clock_gettime" >&6; } ac_res=$ac_cv_search_clock_gettime -if test "$ac_res" != no -then : +if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" has_clock_gettime=true -else $as_nop +else has_clock_gettime=false fi @@ -16062,10 +15200,9 @@ fi *,true,true) : instrumented_runtime=true - if test "x$ac_cv_search_clock_gettime" = "xnone required" -then : + if test "x$ac_cv_search_clock_gettime" = "xnone required"; then : instrumented_runtime_libs="" -else $as_nop +else instrumented_runtime_libs=$ac_cv_search_clock_gettime fi @@ -16098,12 +15235,11 @@ sockets=true case $host in #( *-*-mingw32|*-pc-windows) : cclibs="$cclibs -lws2_32" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 -printf %s "checking for library containing socket... " >&6; } -if test ${ac_cv_search_socket+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +$as_echo_n "checking for library containing socket... " >&6; } +if ${ac_cv_search_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -16111,67 +15247,63 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif char socket (); int -main (void) +main () { return socket (); ; return 0; } _ACEOF -for ac_lib in '' ws2_32 -do +for ac_lib in '' ws2_32; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO" -then : + if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_socket=$ac_res fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext - if test ${ac_cv_search_socket+y} -then : + if ${ac_cv_search_socket+:} false; then : break fi done -if test ${ac_cv_search_socket+y} -then : +if ${ac_cv_search_socket+:} false; then : -else $as_nop +else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 -printf "%s\n" "$ac_cv_search_socket" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +$as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket -if test "$ac_res" != no -then : +if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi ac_fn_c_check_func "$LINENO" "socketpair" "ac_cv_func_socketpair" -if test "x$ac_cv_func_socketpair" = xyes -then : - printf "%s\n" "#define HAS_SOCKETPAIR 1" >>confdefs.h +if test "x$ac_cv_func_socketpair" = xyes; then : + $as_echo "#define HAS_SOCKETPAIR 1" >>confdefs.h fi ;; #( *-*-haiku) : cclibs="$cclibs -lnetwork" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 -printf %s "checking for library containing socket... " >&6; } -if test ${ac_cv_search_socket+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +$as_echo_n "checking for library containing socket... " >&6; } +if ${ac_cv_search_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -16179,60 +15311,57 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif char socket (); int -main (void) +main () { return socket (); ; return 0; } _ACEOF -for ac_lib in '' network -do +for ac_lib in '' network; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO" -then : + if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_socket=$ac_res fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext - if test ${ac_cv_search_socket+y} -then : + if ${ac_cv_search_socket+:} false; then : break fi done -if test ${ac_cv_search_socket+y} -then : +if ${ac_cv_search_socket+:} false; then : -else $as_nop +else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 -printf "%s\n" "$ac_cv_search_socket" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +$as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket -if test "$ac_res" != no -then : +if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi ;; #( *-*-solaris*) : cclibs="$cclibs -lsocket -lnsl" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 -printf %s "checking for library containing socket... " >&6; } -if test ${ac_cv_search_socket+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +$as_echo_n "checking for library containing socket... " >&6; } +if ${ac_cv_search_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -16240,58 +15369,55 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif char socket (); int -main (void) +main () { return socket (); ; return 0; } _ACEOF -for ac_lib in '' socket -do +for ac_lib in '' socket; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO" -then : + if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_socket=$ac_res fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext - if test ${ac_cv_search_socket+y} -then : + if ${ac_cv_search_socket+:} false; then : break fi done -if test ${ac_cv_search_socket+y} -then : +if ${ac_cv_search_socket+:} false; then : -else $as_nop +else ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 -printf "%s\n" "$ac_cv_search_socket" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +$as_echo "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket -if test "$ac_res" != no -then : +if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing inet_ntop" >&5 -printf %s "checking for library containing inet_ntop... " >&6; } -if test ${ac_cv_search_inet_ntop+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing inet_ntop" >&5 +$as_echo_n "checking for library containing inet_ntop... " >&6; } +if ${ac_cv_search_inet_ntop+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -16299,77 +15425,72 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif char inet_ntop (); int -main (void) +main () { return inet_ntop (); ; return 0; } _ACEOF -for ac_lib in '' nsl -do +for ac_lib in '' nsl; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO" -then : + if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_inet_ntop=$ac_res fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext - if test ${ac_cv_search_inet_ntop+y} -then : + if ${ac_cv_search_inet_ntop+:} false; then : break fi done -if test ${ac_cv_search_inet_ntop+y} -then : +if ${ac_cv_search_inet_ntop+:} false; then : -else $as_nop +else ac_cv_search_inet_ntop=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5 -printf "%s\n" "$ac_cv_search_inet_ntop" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5 +$as_echo "$ac_cv_search_inet_ntop" >&6; } ac_res=$ac_cv_search_inet_ntop -if test "$ac_res" != no -then : +if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi ;; #( *) : - - for ac_func in socket socketpair bind listen accept connect + for ac_func in socket socketpair bind listen accept connect do : - as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes" -then : +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF -#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF -else $as_nop +else sockets=false fi - done + ;; esac -if $sockets -then : - printf "%s\n" "#define HAS_SOCKETS 1" >>confdefs.h +if $sockets; then : + $as_echo "#define HAS_SOCKETS 1" >>confdefs.h fi @@ -16379,27 +15500,24 @@ case $host in #( *-*-mingw32|*-pc-windows) : ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "#include " -if test "x$ac_cv_type_socklen_t" = xyes -then : - printf "%s\n" "#define HAS_SOCKLEN_T 1" >>confdefs.h +if test "x$ac_cv_type_socklen_t" = xyes; then : + $as_echo "#define HAS_SOCKLEN_T 1" >>confdefs.h fi ;; #( *) : ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "#include " -if test "x$ac_cv_type_socklen_t" = xyes -then : - printf "%s\n" "#define HAS_SOCKLEN_T 1" >>confdefs.h +if test "x$ac_cv_type_socklen_t" = xyes; then : + $as_echo "#define HAS_SOCKLEN_T 1" >>confdefs.h fi ;; esac ac_fn_c_check_func "$LINENO" "inet_aton" "ac_cv_func_inet_aton" -if test "x$ac_cv_func_inet_aton" = xyes -then : - printf "%s\n" "#define HAS_INET_ATON 1" >>confdefs.h +if test "x$ac_cv_func_inet_aton" = xyes; then : + $as_echo "#define HAS_INET_ATON 1" >>confdefs.h fi @@ -16408,18 +15526,20 @@ fi case $host in #( *-*-mingw32|*-pc-windows) : - for ac_header in afunix.h + for ac_header in afunix.h do : ac_fn_c_check_header_compile "$LINENO" "afunix.h" "ac_cv_header_afunix_h" "#include " -if test "x$ac_cv_header_afunix_h" = xyes -then : - printf "%s\n" "#define HAVE_AFUNIX_H 1" >>confdefs.h - printf "%s\n" "#define HAS_AFUNIX_H 1" >>confdefs.h +if test "x$ac_cv_header_afunix_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_AFUNIX_H 1 +_ACEOF + $as_echo "#define HAS_AFUNIX_H 1" >>confdefs.h fi -done ;; #( +done + ;; #( *) : ;; esac @@ -16432,10 +15552,9 @@ case $host in #( *-*-mingw32|*-pc-windows) : ac_fn_c_check_type "$LINENO" "struct sockaddr_in6" "ac_cv_type_struct_sockaddr_in6" "#include " -if test "x$ac_cv_type_struct_sockaddr_in6" = xyes -then : +if test "x$ac_cv_type_struct_sockaddr_in6" = xyes; then : -else $as_nop +else ipv6=false fi ;; #( @@ -16447,182 +15566,89 @@ fi " -if test "x$ac_cv_type_struct_sockaddr_in6" = xyes -then : +if test "x$ac_cv_type_struct_sockaddr_in6" = xyes; then : -else $as_nop +else ipv6=false fi ;; esac -if $ipv6 -then : +if $ipv6; then : ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo" -if test "x$ac_cv_func_getaddrinfo" = xyes -then : +if test "x$ac_cv_func_getaddrinfo" = xyes; then : -else $as_nop +else ipv6=false fi fi -if $ipv6 -then : +if $ipv6; then : ac_fn_c_check_func "$LINENO" "getnameinfo" "ac_cv_func_getnameinfo" -if test "x$ac_cv_func_getnameinfo" = xyes -then : +if test "x$ac_cv_func_getnameinfo" = xyes; then : -else $as_nop +else ipv6=false fi fi -if $ipv6 -then : +if $ipv6; then : ac_fn_c_check_func "$LINENO" "inet_pton" "ac_cv_func_inet_pton" -if test "x$ac_cv_func_inet_pton" = xyes -then : +if test "x$ac_cv_func_inet_pton" = xyes; then : -else $as_nop +else ipv6=false fi fi -if $ipv6 -then : +if $ipv6; then : ac_fn_c_check_func "$LINENO" "inet_ntop" "ac_cv_func_inet_ntop" -if test "x$ac_cv_func_inet_ntop" = xyes -then : - printf "%s\n" "#define HAS_IPV6 1" >>confdefs.h +if test "x$ac_cv_func_inet_ntop" = xyes; then : + $as_echo "#define HAS_IPV6 1" >>confdefs.h fi fi ac_fn_c_check_func "$LINENO" "rewinddir" "ac_cv_func_rewinddir" -if test "x$ac_cv_func_rewinddir" = xyes -then : - printf "%s\n" "#define HAS_REWINDDIR 1" >>confdefs.h +if test "x$ac_cv_func_rewinddir" = xyes; then : + $as_echo "#define HAS_REWINDDIR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "lockf" "ac_cv_func_lockf" -if test "x$ac_cv_func_lockf" = xyes -then : - printf "%s\n" "#define HAS_LOCKF 1" >>confdefs.h +if test "x$ac_cv_func_lockf" = xyes; then : + $as_echo "#define HAS_LOCKF 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "mkfifo" "ac_cv_func_mkfifo" -if test "x$ac_cv_func_mkfifo" = xyes -then : - printf "%s\n" "#define HAS_MKFIFO 1" >>confdefs.h +if test "x$ac_cv_func_mkfifo" = xyes; then : + $as_echo "#define HAS_MKFIFO 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd" -if test "x$ac_cv_func_getcwd" = xyes -then : - printf "%s\n" "#define HAS_GETCWD 1" >>confdefs.h +if test "x$ac_cv_func_getcwd" = xyes; then : + $as_echo "#define HAS_GETCWD 1" >>confdefs.h fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 -printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } -if test ${ac_cv_c_undeclared_builtin_options+y} -then : - printf %s "(cached) " >&6 -else $as_nop - ac_save_CFLAGS=$CFLAGS - ac_cv_c_undeclared_builtin_options='cannot detect' - for ac_arg in '' -fno-builtin; do - CFLAGS="$ac_save_CFLAGS $ac_arg" - # This test program should *not* compile successfully. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main (void) -{ -(void) strchr; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO" -then : - -else $as_nop - # This test program should compile successfully. - # No library function is consistently available on - # freestanding implementations, so test against a dummy - # declaration. Include always-available headers on the - # off chance that they somehow elicit warnings. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include -extern void ac_decl (int, char *); - -int -main (void) -{ -(void) ac_decl (0, (char *) 0); - (void) ac_decl; +ac_fn_c_check_decl "$LINENO" "system" "ac_cv_have_decl_system" "#include +" +if test "x$ac_cv_have_decl_system" = xyes; then : + $as_echo "#define HAS_SYSTEM 1" >>confdefs.h - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO" -then : - if test x"$ac_arg" = x -then : - ac_cv_c_undeclared_builtin_options='none needed' -else $as_nop - ac_cv_c_undeclared_builtin_options=$ac_arg -fi - break -fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - done - CFLAGS=$ac_save_CFLAGS - -fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 -printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } - case $ac_cv_c_undeclared_builtin_options in #( - 'cannot detect') : - { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot make $CC report undeclared builtins -See \`config.log' for more details" "$LINENO" 5; } ;; #( - 'none needed') : - ac_c_undeclared_builtin_options='' ;; #( - *) : - ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; -esac - -ac_fn_check_decl "$LINENO" "system" "ac_cv_have_decl_system" "#include -" "$ac_c_undeclared_builtin_options" "CFLAGS" -if test "x$ac_cv_have_decl_system" = xyes -then : - printf "%s\n" "#define HAS_SYSTEM 1" >>confdefs.h -fi ## utime ## Note: this was defined in config/s-nt.h but the autoconf macros do not @@ -16630,43 +15656,39 @@ fi # of HAS_UTIME on Windows but this will probably need to be clarified case $host in #( *-*-mingw32|*-pc-windows) : - printf "%s\n" "#define HAS_UTIME 1" >>confdefs.h + $as_echo "#define HAS_UTIME 1" >>confdefs.h ;; #( *) : - ac_fn_c_check_header_compile "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_types_h" = xyes -then : - ac_fn_c_check_header_compile "$LINENO" "utime.h" "ac_cv_header_utime_h" "$ac_includes_default" -if test "x$ac_cv_header_utime_h" = xyes -then : + ac_fn_c_check_header_mongrel "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_types_h" = xyes; then : + ac_fn_c_check_header_mongrel "$LINENO" "utime.h" "ac_cv_header_utime_h" "$ac_includes_default" +if test "x$ac_cv_header_utime_h" = xyes; then : ac_fn_c_check_func "$LINENO" "utime" "ac_cv_func_utime" -if test "x$ac_cv_func_utime" = xyes -then : - printf "%s\n" "#define HAS_UTIME 1" >>confdefs.h +if test "x$ac_cv_func_utime" = xyes; then : + $as_echo "#define HAS_UTIME 1" >>confdefs.h fi fi + fi + ;; esac ac_fn_c_check_func "$LINENO" "utimes" "ac_cv_func_utimes" -if test "x$ac_cv_func_utimes" = xyes -then : - printf "%s\n" "#define HAS_UTIMES 1" >>confdefs.h +if test "x$ac_cv_func_utimes" = xyes; then : + $as_echo "#define HAS_UTIMES 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "fchmod" "ac_cv_func_fchmod" -if test "x$ac_cv_func_fchmod" = xyes -then : +if test "x$ac_cv_func_fchmod" = xyes; then : ac_fn_c_check_func "$LINENO" "fchown" "ac_cv_func_fchown" -if test "x$ac_cv_func_fchown" = xyes -then : - printf "%s\n" "#define HAS_FCHMOD 1" >>confdefs.h +if test "x$ac_cv_func_fchown" = xyes; then : + $as_echo "#define HAS_FCHMOD 1" >>confdefs.h fi @@ -16674,12 +15696,10 @@ fi ac_fn_c_check_func "$LINENO" "truncate" "ac_cv_func_truncate" -if test "x$ac_cv_func_truncate" = xyes -then : +if test "x$ac_cv_func_truncate" = xyes; then : ac_fn_c_check_func "$LINENO" "ftruncate" "ac_cv_func_ftruncate" -if test "x$ac_cv_func_ftruncate" = xyes -then : - printf "%s\n" "#define HAS_TRUNCATE 1" >>confdefs.h +if test "x$ac_cv_func_ftruncate" = xyes; then : + $as_echo "#define HAS_TRUNCATE 1" >>confdefs.h fi @@ -16688,19 +15708,17 @@ fi ## select ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select" -if test "x$ac_cv_func_select" = xyes -then : +if test "x$ac_cv_func_select" = xyes; then : ac_fn_c_check_type "$LINENO" "fd_set" "ac_cv_type_fd_set" " #include #include " -if test "x$ac_cv_type_fd_set" = xyes -then : - printf "%s\n" "#define HAS_SELECT 1" >>confdefs.h +if test "x$ac_cv_type_fd_set" = xyes; then : + $as_echo "#define HAS_SELECT 1" >>confdefs.h select=true -else $as_nop +else select=false fi @@ -16708,23 +15726,19 @@ fi ac_fn_c_check_func "$LINENO" "nanosleep" "ac_cv_func_nanosleep" -if test "x$ac_cv_func_nanosleep" = xyes -then : - printf "%s\n" "#define HAS_NANOSLEEP 1" >>confdefs.h +if test "x$ac_cv_func_nanosleep" = xyes; then : + $as_echo "#define HAS_NANOSLEEP 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "symlink" "ac_cv_func_symlink" -if test "x$ac_cv_func_symlink" = xyes -then : +if test "x$ac_cv_func_symlink" = xyes; then : ac_fn_c_check_func "$LINENO" "readlink" "ac_cv_func_readlink" -if test "x$ac_cv_func_readlink" = xyes -then : +if test "x$ac_cv_func_readlink" = xyes; then : ac_fn_c_check_func "$LINENO" "lstat" "ac_cv_func_lstat" -if test "x$ac_cv_func_lstat" = xyes -then : - printf "%s\n" "#define HAS_SYMLINK 1" >>confdefs.h +if test "x$ac_cv_func_lstat" = xyes; then : + $as_echo "#define HAS_SYMLINK 1" >>confdefs.h fi @@ -16734,33 +15748,30 @@ fi ac_fn_c_check_func "$LINENO" "realpath" "ac_cv_func_realpath" -if test "x$ac_cv_func_realpath" = xyes -then : - printf "%s\n" "#define HAS_REALPATH 1" >>confdefs.h +if test "x$ac_cv_func_realpath" = xyes; then : + $as_echo "#define HAS_REALPATH 1" >>confdefs.h fi # wait ac_fn_c_check_func "$LINENO" "waitpid" "ac_cv_func_waitpid" -if test "x$ac_cv_func_waitpid" = xyes -then : +if test "x$ac_cv_func_waitpid" = xyes; then : wait=true - printf "%s\n" "#define HAS_WAITPID 1" >>confdefs.h + $as_echo "#define HAS_WAITPID 1" >>confdefs.h -else $as_nop +else wait=false fi ac_fn_c_check_func "$LINENO" "wait4" "ac_cv_func_wait4" -if test "x$ac_cv_func_wait4" = xyes -then : +if test "x$ac_cv_func_wait4" = xyes; then : has_wait=true - printf "%s\n" "#define HAS_WAIT4 1" >>confdefs.h + $as_echo "#define HAS_WAIT4 1" >>confdefs.h fi @@ -16768,52 +15779,43 @@ fi ## getgroups ac_fn_c_check_func "$LINENO" "getgroups" "ac_cv_func_getgroups" -if test "x$ac_cv_func_getgroups" = xyes -then : - printf "%s\n" "#define HAS_GETGROUPS 1" >>confdefs.h +if test "x$ac_cv_func_getgroups" = xyes; then : + $as_echo "#define HAS_GETGROUPS 1" >>confdefs.h fi ## setgroups ac_fn_c_check_func "$LINENO" "setgroups" "ac_cv_func_setgroups" -if test "x$ac_cv_func_setgroups" = xyes -then : - printf "%s\n" "#define HAS_SETGROUPS 1" >>confdefs.h +if test "x$ac_cv_func_setgroups" = xyes; then : + $as_echo "#define HAS_SETGROUPS 1" >>confdefs.h fi ## initgroups ac_fn_c_check_func "$LINENO" "initgroups" "ac_cv_func_initgroups" -if test "x$ac_cv_func_initgroups" = xyes -then : - printf "%s\n" "#define HAS_INITGROUPS 1" >>confdefs.h +if test "x$ac_cv_func_initgroups" = xyes; then : + $as_echo "#define HAS_INITGROUPS 1" >>confdefs.h fi ## termios -ac_fn_c_check_header_compile "$LINENO" "termios.h" "ac_cv_header_termios_h" "$ac_includes_default" -if test "x$ac_cv_header_termios_h" = xyes -then : +ac_fn_c_check_header_mongrel "$LINENO" "termios.h" "ac_cv_header_termios_h" "$ac_includes_default" +if test "x$ac_cv_header_termios_h" = xyes; then : ac_fn_c_check_func "$LINENO" "tcgetattr" "ac_cv_func_tcgetattr" -if test "x$ac_cv_func_tcgetattr" = xyes -then : +if test "x$ac_cv_func_tcgetattr" = xyes; then : ac_fn_c_check_func "$LINENO" "tcsetattr" "ac_cv_func_tcsetattr" -if test "x$ac_cv_func_tcsetattr" = xyes -then : +if test "x$ac_cv_func_tcsetattr" = xyes; then : ac_fn_c_check_func "$LINENO" "tcsendbreak" "ac_cv_func_tcsendbreak" -if test "x$ac_cv_func_tcsendbreak" = xyes -then : +if test "x$ac_cv_func_tcsendbreak" = xyes; then : ac_fn_c_check_func "$LINENO" "tcflush" "ac_cv_func_tcflush" -if test "x$ac_cv_func_tcflush" = xyes -then : +if test "x$ac_cv_func_tcflush" = xyes; then : ac_fn_c_check_func "$LINENO" "tcflow" "ac_cv_func_tcflow" -if test "x$ac_cv_func_tcflow" = xyes -then : - printf "%s\n" "#define HAS_TERMIOS 1" >>confdefs.h +if test "x$ac_cv_func_tcflow" = xyes; then : + $as_echo "#define HAS_TERMIOS 1" >>confdefs.h fi @@ -16828,17 +15830,17 @@ fi fi + ## setitimer ac_fn_c_check_func "$LINENO" "setitimer" "ac_cv_func_setitimer" -if test "x$ac_cv_func_setitimer" = xyes -then : +if test "x$ac_cv_func_setitimer" = xyes; then : setitimer=true - printf "%s\n" "#define HAS_SETITIMER 1" >>confdefs.h + $as_echo "#define HAS_SETITIMER 1" >>confdefs.h -else $as_nop +else setitimer=false fi @@ -16848,13 +15850,12 @@ fi # (should be debugged later) case $host in #( *-*-mingw32|*-pc-windows) : - printf "%s\n" "#define HAS_GETHOSTNAME 1" >>confdefs.h + $as_echo "#define HAS_GETHOSTNAME 1" >>confdefs.h ;; #( *) : ac_fn_c_check_func "$LINENO" "gethostname" "ac_cv_func_gethostname" -if test "x$ac_cv_func_gethostname" = xyes -then : - printf "%s\n" "#define HAS_GETHOSTNAME 1" >>confdefs.h +if test "x$ac_cv_func_gethostname" = xyes; then : + $as_echo "#define HAS_GETHOSTNAME 1" >>confdefs.h fi ;; @@ -16862,30 +15863,28 @@ esac ## uname -ac_fn_c_check_header_compile "$LINENO" "sys/utsname.h" "ac_cv_header_sys_utsname_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_utsname_h" = xyes -then : +ac_fn_c_check_header_mongrel "$LINENO" "sys/utsname.h" "ac_cv_header_sys_utsname_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_utsname_h" = xyes; then : ac_fn_c_check_func "$LINENO" "uname" "ac_cv_func_uname" -if test "x$ac_cv_func_uname" = xyes -then : - printf "%s\n" "#define HAS_UNAME 1" >>confdefs.h +if test "x$ac_cv_func_uname" = xyes; then : + $as_echo "#define HAS_UNAME 1" >>confdefs.h fi fi + ## gettimeofday ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" -if test "x$ac_cv_func_gettimeofday" = xyes -then : +if test "x$ac_cv_func_gettimeofday" = xyes; then : gettimeofday=true - printf "%s\n" "#define HAS_GETTIMEOFDAY 1" >>confdefs.h + $as_echo "#define HAS_GETTIMEOFDAY 1" >>confdefs.h -else $as_nop +else gettimeofday=false fi @@ -16893,9 +15892,8 @@ fi ## mktime ac_fn_c_check_func "$LINENO" "mktime" "ac_cv_func_mktime" -if test "x$ac_cv_func_mktime" = xyes -then : - printf "%s\n" "#define HAS_MKTIME 1" >>confdefs.h +if test "x$ac_cv_func_mktime" = xyes; then : + $as_echo "#define HAS_MKTIME 1" >>confdefs.h fi @@ -16907,9 +15905,8 @@ case $host in #( ;; #( *) : ac_fn_c_check_func "$LINENO" "setsid" "ac_cv_func_setsid" -if test "x$ac_cv_func_setsid" = xyes -then : - printf "%s\n" "#define HAS_SETSID 1" >>confdefs.h +if test "x$ac_cv_func_setsid" = xyes; then : + $as_echo "#define HAS_SETSID 1" >>confdefs.h fi ;; @@ -16918,9 +15915,8 @@ esac ## putenv ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv" -if test "x$ac_cv_func_putenv" = xyes -then : - printf "%s\n" "#define HAS_PUTENV 1" >>confdefs.h +if test "x$ac_cv_func_putenv" = xyes; then : + $as_echo "#define HAS_PUTENV 1" >>confdefs.h fi @@ -16928,12 +15924,10 @@ fi ## setenv and unsetenv ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv" -if test "x$ac_cv_func_setenv" = xyes -then : +if test "x$ac_cv_func_setenv" = xyes; then : ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv" -if test "x$ac_cv_func_unsetenv" = xyes -then : - printf "%s\n" "#define HAS_SETENV_UNSETENV 1" >>confdefs.h +if test "x$ac_cv_func_unsetenv" = xyes; then : + $as_echo "#define HAS_SETENV_UNSETENV 1" >>confdefs.h fi @@ -16945,22 +15939,18 @@ fi # (should be debugged later) case $host in #( *-pc-windows) : - printf "%s\n" "#define HAS_LOCALE_H 1" >>confdefs.h + $as_echo "#define HAS_LOCALE_H 1" >>confdefs.h ;; #( *) : - ac_fn_c_check_header_compile "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" -if test "x$ac_cv_header_locale_h" = xyes -then : + ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = xyes; then : ac_fn_c_check_func "$LINENO" "newlocale" "ac_cv_func_newlocale" -if test "x$ac_cv_func_newlocale" = xyes -then : +if test "x$ac_cv_func_newlocale" = xyes; then : ac_fn_c_check_func "$LINENO" "freelocale" "ac_cv_func_freelocale" -if test "x$ac_cv_func_freelocale" = xyes -then : +if test "x$ac_cv_func_freelocale" = xyes; then : ac_fn_c_check_func "$LINENO" "uselocale" "ac_cv_func_uselocale" -if test "x$ac_cv_func_uselocale" = xyes -then : - printf "%s\n" "#define HAS_LOCALE_H 1" >>confdefs.h +if test "x$ac_cv_func_uselocale" = xyes; then : + $as_echo "#define HAS_LOCALE_H 1" >>confdefs.h fi @@ -16969,22 +15959,19 @@ fi fi fi + ;; esac -ac_fn_c_check_header_compile "$LINENO" "xlocale.h" "ac_cv_header_xlocale_h" "$ac_includes_default" -if test "x$ac_cv_header_xlocale_h" = xyes -then : +ac_fn_c_check_header_mongrel "$LINENO" "xlocale.h" "ac_cv_header_xlocale_h" "$ac_includes_default" +if test "x$ac_cv_header_xlocale_h" = xyes; then : ac_fn_c_check_func "$LINENO" "newlocale" "ac_cv_func_newlocale" -if test "x$ac_cv_func_newlocale" = xyes -then : +if test "x$ac_cv_func_newlocale" = xyes; then : ac_fn_c_check_func "$LINENO" "freelocale" "ac_cv_func_freelocale" -if test "x$ac_cv_func_freelocale" = xyes -then : +if test "x$ac_cv_func_freelocale" = xyes; then : ac_fn_c_check_func "$LINENO" "uselocale" "ac_cv_func_uselocale" -if test "x$ac_cv_func_uselocale" = xyes -then : - printf "%s\n" "#define HAS_XLOCALE_H 1" >>confdefs.h +if test "x$ac_cv_func_uselocale" = xyes; then : + $as_echo "#define HAS_XLOCALE_H 1" >>confdefs.h fi @@ -16995,41 +15982,38 @@ fi fi + ## strtod_l # Note: not detected on MSVC so hardcoding the result # (should be debugged later) case $host in #( *-pc-windows) : - printf "%s\n" "#define HAS_STRTOD_L 1" >>confdefs.h + $as_echo "#define HAS_STRTOD_L 1" >>confdefs.h ;; #( *) : ac_fn_c_check_func "$LINENO" "strtod_l" "ac_cv_func_strtod_l" -if test "x$ac_cv_func_strtod_l" = xyes -then : - printf "%s\n" "#define HAS_STRTOD_L 1" >>confdefs.h +if test "x$ac_cv_func_strtod_l" = xyes; then : + $as_echo "#define HAS_STRTOD_L 1" >>confdefs.h fi ;; esac ## shared library support -if $supports_shared_libraries -then : +if $supports_shared_libraries; then : case $host in #( *-*-mingw32|*-pc-windows|*-*-cygwin*) : DLLIBS="" ;; #( *) : ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes -then : +if test "x$ac_cv_func_dlopen" = xyes; then : supports_shared_libraries=true DLLIBS="" -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -printf %s "checking for dlopen in -ldl... " >&6; } -if test ${ac_cv_lib_dl_dlopen+y} -then : - printf %s "(cached) " >&6 -else $as_nop +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -17038,64 +16022,61 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif char dlopen (); int -main (void) +main () { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes -else $as_nop +else ac_cv_lib_dl_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes -then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : supports_shared_libraries=true DLLIBS="-ldl $DLLIBS" -else $as_nop +else supports_shared_libraries=false fi fi ;; esac -else $as_nop +else supports_shared_libraries=false fi -if $supports_shared_libraries -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Dynamic loading of shared libraries is supported." >&5 -printf "%s\n" "$as_me: Dynamic loading of shared libraries is supported." >&6;} - printf "%s\n" "#define SUPPORT_DYNAMIC_LINKING 1" >>confdefs.h +if $supports_shared_libraries; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: Dynamic loading of shared libraries is supported." >&5 +$as_echo "$as_me: Dynamic loading of shared libraries is supported." >&6;} + $as_echo "#define SUPPORT_DYNAMIC_LINKING 1" >>confdefs.h -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Dynamic loading of shared libraries is not supported." >&5 -printf "%s\n" "$as_me: Dynamic loading of shared libraries is not supported." >&6;} +else + { $as_echo "$as_me:${as_lineno-$LINENO}: Dynamic loading of shared libraries is not supported." >&5 +$as_echo "$as_me: Dynamic loading of shared libraries is not supported." >&6;} fi ## mmap -ac_fn_c_check_header_compile "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_mman_h" = xyes -then : +ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mman_h" = xyes; then : ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" -if test "x$ac_cv_func_mmap" = xyes -then : +if test "x$ac_cv_func_mmap" = xyes; then : ac_fn_c_check_func "$LINENO" "munmap" "ac_cv_func_munmap" -if test "x$ac_cv_func_munmap" = xyes -then : - printf "%s\n" "#define HAS_MMAP 1" >>confdefs.h +if test "x$ac_cv_func_munmap" = xyes; then : + $as_echo "#define HAS_MMAP 1" >>confdefs.h fi @@ -17104,12 +16085,12 @@ fi fi + ## pwrite ac_fn_c_check_func "$LINENO" "pwrite" "ac_cv_func_pwrite" -if test "x$ac_cv_func_pwrite" = xyes -then : - printf "%s\n" "#define HAS_PWRITE 1" >>confdefs.h +if test "x$ac_cv_func_pwrite" = xyes; then : + $as_echo "#define HAS_PWRITE 1" >>confdefs.h fi @@ -17126,25 +16107,24 @@ case $ocaml_cv_cc_vendor,$host in #( cc_has_debug_prefix_map=false ;; #( *) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports -fdebug-prefix-map" >&5 -printf %s "checking whether the C compiler supports -fdebug-prefix-map... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports -fdebug-prefix-map" >&5 +$as_echo_n "checking whether the C compiler supports -fdebug-prefix-map... " >&6; } saved_CFLAGS="$CFLAGS" CFLAGS="-fdebug-prefix-map=old=new $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main() { return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : cc_has_debug_prefix_map=true - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else cc_has_debug_prefix_map=false - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$saved_CFLAGS" ;; esac @@ -17156,54 +16136,48 @@ ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.tv_nsec" "ac_cv_member_str #include " -if test "x$ac_cv_member_struct_stat_st_atim_tv_nsec" = xyes -then : +if test "x$ac_cv_member_struct_stat_st_atim_tv_nsec" = xyes; then : stat_has_ns_precision=true - printf "%s\n" "#define HAS_NANOSECOND_STAT 1" >>confdefs.h + $as_echo "#define HAS_NANOSECOND_STAT 1" >>confdefs.h fi -if ! $stat_has_ns_precision -then : +if ! $stat_has_ns_precision; then : ac_fn_c_check_member "$LINENO" "struct stat" "st_atimespec.tv_nsec" "ac_cv_member_struct_stat_st_atimespec_tv_nsec" " $ac_includes_default #include " -if test "x$ac_cv_member_struct_stat_st_atimespec_tv_nsec" = xyes -then : +if test "x$ac_cv_member_struct_stat_st_atimespec_tv_nsec" = xyes; then : stat_has_ns_precision=true - printf "%s\n" "#define HAS_NANOSECOND_STAT 2" >>confdefs.h + $as_echo "#define HAS_NANOSECOND_STAT 2" >>confdefs.h fi fi -if ! $stat_has_ns_precision -then : +if ! $stat_has_ns_precision; then : ac_fn_c_check_member "$LINENO" "struct stat" "st_atimensec" "ac_cv_member_struct_stat_st_atimensec" " $ac_includes_default #include " -if test "x$ac_cv_member_struct_stat_st_atimensec" = xyes -then : +if test "x$ac_cv_member_struct_stat_st_atimensec" = xyes; then : stat_has_ns_precision=true - printf "%s\n" "#define HAS_NANOSECOND_STAT 3" >>confdefs.h + $as_echo "#define HAS_NANOSECOND_STAT 3" >>confdefs.h fi fi -if $stat_has_ns_precision -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: stat supports nanosecond precision" >&5 -printf "%s\n" "$as_me: stat supports nanosecond precision" >&6;} -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: stat does not support nanosecond precision" >&5 -printf "%s\n" "$as_me: stat does not support nanosecond precision" >&6;} +if $stat_has_ns_precision; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: stat supports nanosecond precision" >&5 +$as_echo "$as_me: stat supports nanosecond precision" >&6;} +else + { $as_echo "$as_me:${as_lineno-$LINENO}: stat does not support nanosecond precision" >&5 +$as_echo "$as_me: stat does not support nanosecond precision" >&6;} fi # Number of arguments of gethostbyname_r @@ -17216,13 +16190,12 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how many arguments gethostbyname_r() takes" >&5 -printf %s "checking how many arguments gethostbyname_r() takes... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how many arguments gethostbyname_r() takes" >&5 +$as_echo_n "checking how many arguments gethostbyname_r() takes... " >&6; } - if test ${ac_cv_func_which_gethostbyname_r+y} -then : - printf %s "(cached) " >&6 -else $as_nop + if ${ac_cv_func_which_gethostbyname_r+:} false; then : + $as_echo_n "(cached) " >&6 +else ################################################################ @@ -17242,7 +16215,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main (void) +main () { char *name = "www.gnu.org"; @@ -17252,11 +16225,10 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_which_gethostbyname_r=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # # SIX ARGUMENTS @@ -17269,7 +16241,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main (void) +main () { char *name = "www.gnu.org"; @@ -17283,11 +16255,10 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_which_gethostbyname_r=six fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi @@ -17302,7 +16273,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main (void) +main () { char *name = "www.gnu.org"; @@ -17316,11 +16287,10 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_which_gethostbyname_r=five fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi @@ -17335,7 +16305,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main (void) +main () { char *name = "www.gnu.org"; @@ -17347,11 +16317,10 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_which_gethostbyname_r=three fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi @@ -17363,44 +16332,44 @@ fi case "$ac_cv_func_which_gethostbyname_r" in three|five|six) -printf "%s\n" "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h +$as_echo "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h ;; esac case "$ac_cv_func_which_gethostbyname_r" in three) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: three" >&5 -printf "%s\n" "three" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: three" >&5 +$as_echo "three" >&6; } -printf "%s\n" "#define HAVE_FUNC_GETHOSTBYNAME_R_3 1" >>confdefs.h +$as_echo "#define HAVE_FUNC_GETHOSTBYNAME_R_3 1" >>confdefs.h ;; five) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: five" >&5 -printf "%s\n" "five" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: five" >&5 +$as_echo "five" >&6; } -printf "%s\n" "#define HAVE_FUNC_GETHOSTBYNAME_R_5 1" >>confdefs.h +$as_echo "#define HAVE_FUNC_GETHOSTBYNAME_R_5 1" >>confdefs.h ;; six) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: six" >&5 -printf "%s\n" "six" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: six" >&5 +$as_echo "six" >&6; } -printf "%s\n" "#define HAVE_FUNC_GETHOSTBYNAME_R_6 1" >>confdefs.h +$as_echo "#define HAVE_FUNC_GETHOSTBYNAME_R_6 1" >>confdefs.h ;; no) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cannot find function declaration in netdb.h" >&5 -printf "%s\n" "cannot find function declaration in netdb.h" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot find function declaration in netdb.h" >&5 +$as_echo "cannot find function declaration in netdb.h" >&6; } ;; unknown) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: can't tell" >&5 -printf "%s\n" "can't tell" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: can't tell" >&5 +$as_echo "can't tell" >&6; } ;; *) @@ -17419,14 +16388,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu case $ac_cv_func_which_gethostbyname_r in #( six) : - printf "%s\n" "#define HAS_GETHOSTBYNAME_R 6" >>confdefs.h + $as_echo "#define HAS_GETHOSTBYNAME_R 6" >>confdefs.h ;; #( five) : - printf "%s\n" "#define HAS_GETHOSTBYNAME_R 5" >>confdefs.h + $as_echo "#define HAS_GETHOSTBYNAME_R 5" >>confdefs.h ;; #( three) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: OCaml does not support this variant" >&5 -printf "%s\n" "$as_me: WARNING: OCaml does not support this variant" >&2;} ;; #( + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: OCaml does not support this variant" >&5 +$as_echo "$as_me: WARNING: OCaml does not support this variant" >&2;} ;; #( *) : ;; esac @@ -17441,13 +16410,12 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how many arguments gethostbyaddr_r() takes" >&5 -printf %s "checking how many arguments gethostbyaddr_r() takes... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how many arguments gethostbyaddr_r() takes" >&5 +$as_echo_n "checking how many arguments gethostbyaddr_r() takes... " >&6; } - if test ${ac_cv_func_which_gethostbyaddr_r+y} -then : - printf %s "(cached) " >&6 -else $as_nop + if ${ac_cv_func_which_gethostbyaddr_r+:} false; then : + $as_echo_n "(cached) " >&6 +else ################################################################ @@ -17467,7 +16435,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main (void) +main () { char *addr = "192.168.1.1"; @@ -17477,11 +16445,10 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_which_gethostbyaddr_r=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # # EIGHT ARGUMENTS @@ -17494,7 +16461,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main (void) +main () { char *addr = "192.168.1.1"; @@ -17509,11 +16476,10 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_which_gethostbyaddr_r=eight fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi @@ -17528,7 +16494,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main (void) +main () { char *addr = "192.168.1.1"; @@ -17543,11 +16509,10 @@ main (void) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_which_gethostbyaddr_r=seven fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi @@ -17559,36 +16524,36 @@ fi case "$ac_cv_func_which_gethostbyaddr_r" in seven|eight) -printf "%s\n" "#define HAVE_GETHOSTBYADDR_R 1" >>confdefs.h +$as_echo "#define HAVE_GETHOSTBYADDR_R 1" >>confdefs.h ;; esac case "$ac_cv_func_which_gethostbyaddr_r" in eight) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: eight" >&5 -printf "%s\n" "eight" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: eight" >&5 +$as_echo "eight" >&6; } -printf "%s\n" "#define HAVE_FUNC_GETHOSTBYADDR_R_8 1" >>confdefs.h +$as_echo "#define HAVE_FUNC_GETHOSTBYADDR_R_8 1" >>confdefs.h ;; seven) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: seven" >&5 -printf "%s\n" "seven" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: seven" >&5 +$as_echo "seven" >&6; } -printf "%s\n" "#define HAVE_FUNC_GETHOSTBYADDR_R_7 1" >>confdefs.h +$as_echo "#define HAVE_FUNC_GETHOSTBYADDR_R_7 1" >>confdefs.h ;; no) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cannot find function declaration in netdb.h" >&5 -printf "%s\n" "cannot find function declaration in netdb.h" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot find function declaration in netdb.h" >&5 +$as_echo "cannot find function declaration in netdb.h" >&6; } ;; unknown) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: can't tell" >&5 -printf "%s\n" "can't tell" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: can't tell" >&5 +$as_echo "can't tell" >&6; } ;; *) @@ -17607,10 +16572,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu case $ac_cv_func_which_gethostbyaddr_r in #( eight) : - printf "%s\n" "#define HAS_GETHOSTBYADDR_R 8" >>confdefs.h + $as_echo "#define HAS_GETHOSTBYADDR_R 8" >>confdefs.h ;; #( seven) : - printf "%s\n" "#define HAS_GETHOSTBYADDR_R 7" >>confdefs.h + $as_echo "#define HAS_GETHOSTBYADDR_R 7" >>confdefs.h ;; #( *) : ;; @@ -17619,9 +16584,8 @@ esac ## mkstemp ac_fn_c_check_func "$LINENO" "mkstemp" "ac_cv_func_mkstemp" -if test "x$ac_cv_func_mkstemp" = xyes -then : - printf "%s\n" "#define HAS_MKSTEMP 1" >>confdefs.h +if test "x$ac_cv_func_mkstemp" = xyes; then : + $as_echo "#define HAS_MKSTEMP 1" >>confdefs.h fi @@ -17629,9 +16593,8 @@ fi ## nice ac_fn_c_check_func "$LINENO" "nice" "ac_cv_func_nice" -if test "x$ac_cv_func_nice" = xyes -then : - printf "%s\n" "#define HAS_NICE 1" >>confdefs.h +if test "x$ac_cv_func_nice" = xyes; then : + $as_echo "#define HAS_NICE 1" >>confdefs.h fi @@ -17639,9 +16602,8 @@ fi ## dup3 ac_fn_c_check_func "$LINENO" "dup3" "ac_cv_func_dup3" -if test "x$ac_cv_func_dup3" = xyes -then : - printf "%s\n" "#define HAS_DUP3 1" >>confdefs.h +if test "x$ac_cv_func_dup3" = xyes; then : + $as_echo "#define HAS_DUP3 1" >>confdefs.h fi @@ -17649,9 +16611,8 @@ fi ## pipe2 ac_fn_c_check_func "$LINENO" "pipe2" "ac_cv_func_pipe2" -if test "x$ac_cv_func_pipe2" = xyes -then : - printf "%s\n" "#define HAS_PIPE2 1" >>confdefs.h +if test "x$ac_cv_func_pipe2" = xyes; then : + $as_echo "#define HAS_PIPE2 1" >>confdefs.h fi @@ -17659,9 +16620,8 @@ fi ## accept4 ac_fn_c_check_func "$LINENO" "accept4" "ac_cv_func_accept4" -if test "x$ac_cv_func_accept4" = xyes -then : - printf "%s\n" "#define HAS_ACCEPT4 1" >>confdefs.h +if test "x$ac_cv_func_accept4" = xyes; then : + $as_echo "#define HAS_ACCEPT4 1" >>confdefs.h fi @@ -17669,24 +16629,21 @@ fi ## getauxval ac_fn_c_check_func "$LINENO" "getauxval" "ac_cv_func_getauxval" -if test "x$ac_cv_func_getauxval" = xyes -then : - printf "%s\n" "#define HAS_GETAUXVAL 1" >>confdefs.h +if test "x$ac_cv_func_getauxval" = xyes; then : + $as_echo "#define HAS_GETAUXVAL 1" >>confdefs.h fi ## shmat -ac_fn_c_check_header_compile "$LINENO" "sys/shm.h" "ac_cv_header_sys_shm_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_shm_h" = xyes -then : +ac_fn_c_check_header_mongrel "$LINENO" "sys/shm.h" "ac_cv_header_sys_shm_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_shm_h" = xyes; then : - printf "%s\n" "#define HAS_SYS_SHM_H 1" >>confdefs.h + $as_echo "#define HAS_SYS_SHM_H 1" >>confdefs.h ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" -if test "x$ac_cv_func_shmat" = xyes -then : - printf "%s\n" "#define HAS_SHMAT 1" >>confdefs.h +if test "x$ac_cv_func_shmat" = xyes; then : + $as_echo "#define HAS_SHMAT 1" >>confdefs.h fi @@ -17694,28 +16651,25 @@ fi fi + ## execvpe ac_fn_c_check_func "$LINENO" "execvpe" "ac_cv_func_execvpe" -if test "x$ac_cv_func_execvpe" = xyes -then : - printf "%s\n" "#define HAS_EXECVPE 1" >>confdefs.h +if test "x$ac_cv_func_execvpe" = xyes; then : + $as_echo "#define HAS_EXECVPE 1" >>confdefs.h fi ## posix_spawn -ac_fn_c_check_header_compile "$LINENO" "spawn.h" "ac_cv_header_spawn_h" "$ac_includes_default" -if test "x$ac_cv_header_spawn_h" = xyes -then : +ac_fn_c_check_header_mongrel "$LINENO" "spawn.h" "ac_cv_header_spawn_h" "$ac_includes_default" +if test "x$ac_cv_header_spawn_h" = xyes; then : ac_fn_c_check_func "$LINENO" "posix_spawn" "ac_cv_func_posix_spawn" -if test "x$ac_cv_func_posix_spawn" = xyes -then : +if test "x$ac_cv_func_posix_spawn" = xyes; then : ac_fn_c_check_func "$LINENO" "posix_spawnp" "ac_cv_func_posix_spawnp" -if test "x$ac_cv_func_posix_spawnp" = xyes -then : - printf "%s\n" "#define HAS_POSIX_SPAWN 1" >>confdefs.h +if test "x$ac_cv_func_posix_spawnp" = xyes; then : + $as_echo "#define HAS_POSIX_SPAWN 1" >>confdefs.h fi @@ -17724,19 +16678,18 @@ fi fi + ## ffs or _BitScanForward ac_fn_c_check_func "$LINENO" "ffs" "ac_cv_func_ffs" -if test "x$ac_cv_func_ffs" = xyes -then : - printf "%s\n" "#define HAS_FFS 1" >>confdefs.h +if test "x$ac_cv_func_ffs" = xyes; then : + $as_echo "#define HAS_FFS 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "_BitScanForward" "ac_cv_func__BitScanForward" -if test "x$ac_cv_func__BitScanForward" = xyes -then : - printf "%s\n" "#define HAS_BITSCANFORWARD 1" >>confdefs.h +if test "x$ac_cv_func__BitScanForward" = xyes; then : + $as_echo "#define HAS_BITSCANFORWARD 1" >>confdefs.h fi @@ -17746,18 +16699,17 @@ fi case $enable_debugger in #( no) : with_debugger="" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: replay debugger disabled" >&5 -printf "%s\n" "$as_me: replay debugger disabled" >&6;} ;; #( + { $as_echo "$as_me:${as_lineno-$LINENO}: replay debugger disabled" >&5 +$as_echo "$as_me: replay debugger disabled" >&6;} ;; #( *) : - if $sockets -then : + if $sockets; then : with_debugger="ocamldebugger" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: replay debugger supported" >&5 -printf "%s\n" "$as_me: replay debugger supported" >&6;} -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: replay debugger supported" >&5 +$as_echo "$as_me: replay debugger supported" >&6;} +else with_debugger="" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: replay debugger not supported" >&5 -printf "%s\n" "$as_me: replay debugger not supported" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: replay debugger not supported" >&5 +$as_echo "$as_me: replay debugger not supported" >&6;} fi ;; esac @@ -17772,19 +16724,19 @@ esac ## Determine if system stack overflows can be detected -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stack overflows can be detected" >&5 -printf %s "checking whether stack overflows can be detected... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stack overflows can be detected" >&5 +$as_echo_n "checking whether stack overflows can be detected... " >&6; } case $arch,$system in #( i386,linux_elf|amd64,linux|amd64,macosx \ |amd64,openbsd|i386,bsd_elf|arm64,linux|arm64,macosx) : - printf "%s\n" "#define HAS_STACK_OVERFLOW_DETECTION 1" >>confdefs.h + $as_echo "#define HAS_STACK_OVERFLOW_DETECTION 1" >>confdefs.h - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } ;; #( + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } ;; #( *) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } ;; + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } ;; esac ## Determine if the POSIX threads library is supported @@ -17795,15 +16747,15 @@ case $enable_systhreads,$enable_unix_lib in #( as_fn_error $? "the Win32/POSIX threads library requires the unix library" "$LINENO" 5 ;; #( no,*|*,no) : systhread_support=false - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: the Win32/POSIX threads library is disabled" >&5 -printf "%s\n" "$as_me: the Win32/POSIX threads library is disabled" >&6;} ;; #( + { $as_echo "$as_me:${as_lineno-$LINENO}: the Win32/POSIX threads library is disabled" >&5 +$as_echo "$as_me: the Win32/POSIX threads library is disabled" >&6;} ;; #( *) : case $host in #( *-*-mingw32|*-pc-windows) : systhread_support=true otherlibraries="$otherlibraries systhreads" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: the Win32 threads library is supported" >&5 -printf "%s\n" "$as_me: the Win32 threads library is supported" >&6;} ;; #( + { $as_echo "$as_me:${as_lineno-$LINENO}: the Win32 threads library is supported" >&5 +$as_echo "$as_me: the Win32 threads library is supported" >&6;} ;; #( *) : @@ -17828,37 +16780,38 @@ if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then ax_pthread_save_CC="$CC" ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" - if test "x$PTHREAD_CC" != "x" -then : + if test "x$PTHREAD_CC" != "x"; then : CC="$PTHREAD_CC" fi CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 -printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 +$as_echo_n "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif char pthread_join (); int -main (void) +main () { return pthread_join (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : ax_pthread_ok=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 -printf "%s\n" "$ax_pthread_ok" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +$as_echo "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" @@ -17936,12 +16889,11 @@ case $host_os in _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 -printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} + $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 +$as_echo "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} fi -rm -rf conftest* +rm -f conftest* ;; @@ -17961,12 +16913,11 @@ esac # Are we compiling with Clang? -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 -printf %s "checking whether $CC is Clang... " >&6; } -if test ${ax_cv_PTHREAD_CLANG+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 +$as_echo_n "checking whether $CC is Clang... " >&6; } +if ${ax_cv_PTHREAD_CLANG+:} false; then : + $as_echo_n "(cached) " >&6 +else ax_cv_PTHREAD_CLANG=no # Note that Autoconf sets GCC=yes for Clang as well as GCC if test "x$GCC" = "xyes"; then @@ -17979,17 +16930,16 @@ else $as_nop _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 -then : + $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1; then : ax_cv_PTHREAD_CLANG=yes fi -rm -rf conftest* +rm -f conftest* fi fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 -printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 +$as_echo "$ax_cv_PTHREAD_CLANG" >&6; } ax_pthread_clang="$ax_cv_PTHREAD_CLANG" @@ -18003,15 +16953,13 @@ ax_pthread_clang="$ax_cv_PTHREAD_CLANG" # [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 # To solve this, first try -pthread together with -lpthread for GCC -if test "x$GCC" = "xyes" -then : +if test "x$GCC" = "xyes"; then : ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" fi # Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first -if test "x$ax_pthread_clang" = "xyes" -then : +if test "x$ax_pthread_clang" = "xyes"; then : ax_pthread_flags="-pthread,-lpthread -pthread" fi @@ -18033,10 +16981,9 @@ case $host_os in ax_pthread_check_macro="--" ;; esac -if test "x$ax_pthread_check_macro" = "x--" -then : +if test "x$ax_pthread_check_macro" = "x--"; then : ax_pthread_check_cond=0 -else $as_nop +else ax_pthread_check_cond="!defined($ax_pthread_check_macro)" fi @@ -18046,32 +16993,31 @@ for ax_pthread_try_flag in $ax_pthread_flags; do case $ax_pthread_try_flag in none) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 -printf %s "checking whether pthreads work without any flags... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +$as_echo_n "checking whether pthreads work without any flags... " >&6; } ;; *,*) PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 -printf %s "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 +$as_echo_n "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } ;; -*) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 -printf %s "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 +$as_echo_n "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } PTHREAD_CFLAGS="$ax_pthread_try_flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_ax_pthread_config+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ax_pthread_config+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. else @@ -18079,15 +17025,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ax_pthread_config="yes" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -18099,16 +17041,15 @@ fi fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 -printf "%s\n" "$ax_pthread_config" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 +$as_echo "$ax_pthread_config" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi - if test "x$ax_pthread_config" = "xno" -then : + if test "x$ax_pthread_config" = "xno"; then : continue fi PTHREAD_CFLAGS="`pthread-config --cflags`" @@ -18116,8 +17057,8 @@ fi ;; *) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 -printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 +$as_echo_n "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac @@ -18152,7 +17093,7 @@ printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } } static void *start_routine(void *a) { return a; } int -main (void) +main () { pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); @@ -18164,20 +17105,18 @@ pthread_t th; pthread_attr_t attr; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : ax_pthread_ok=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 -printf "%s\n" "$ax_pthread_ok" >&6; } - if test "x$ax_pthread_ok" = "xyes" -then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +$as_echo "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xyes"; then : break fi @@ -18223,12 +17162,11 @@ if test "x$ax_pthread_clang" = "xyes"; then # that build with -Werror. So if the active version of Clang has # this misfeature, we search for an option to squash it. - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 -printf %s "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } -if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 +$as_echo_n "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } +if ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+:} false; then : + $as_echo_n "(cached) " >&6 +else ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown # Create an alternate version of $ac_link that compiles and # links in two steps (.c -> .o, .o -> exe) instead of one @@ -18240,8 +17178,7 @@ else $as_nop ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" ax_pthread_save_CFLAGS="$CFLAGS" for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do - if test "x$ax_pthread_try" = "xunknown" -then : + if test "x$ax_pthread_try" = "xunknown"; then : break fi CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" @@ -18250,35 +17187,32 @@ fi /* end confdefs.h. */ int main(void){return 0;} _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : ac_link="$ax_pthread_2step_ac_link" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void){return 0;} _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : break fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done ac_link="$ax_pthread_save_ac_link" CFLAGS="$ax_pthread_save_CFLAGS" - if test "x$ax_pthread_try" = "x" -then : + if test "x$ax_pthread_try" = "x"; then : ax_pthread_try=no fi ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 -printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 +$as_echo "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in no | unknown) ;; @@ -18297,53 +17231,51 @@ if test "x$ax_pthread_ok" = "xyes"; then LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 -printf %s "checking for joinable pthread attribute... " >&6; } -if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +$as_echo_n "checking for joinable pthread attribute... " >&6; } +if ${ax_cv_PTHREAD_JOINABLE_ATTR+:} false; then : + $as_echo_n "(cached) " >&6 +else ax_cv_PTHREAD_JOINABLE_ATTR=unknown for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main (void) +main () { int attr = $ax_pthread_attr; return attr /* ; */ ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext done fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 -printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 +$as_echo "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ - test "x$ax_pthread_joinable_attr_defined" != "xyes" -then : + test "x$ax_pthread_joinable_attr_defined" != "xyes"; then : -printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR +_ACEOF ax_pthread_joinable_attr_defined=yes fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 -printf %s "checking whether more special flags are required for pthreads... " >&6; } -if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 +$as_echo_n "checking whether more special flags are required for pthreads... " >&6; } +if ${ax_cv_PTHREAD_SPECIAL_FLAGS+:} false; then : + $as_echo_n "(cached) " >&6 +else ax_cv_PTHREAD_SPECIAL_FLAGS=no case $host_os in solaris*) @@ -18352,26 +17284,24 @@ else $as_nop esac fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 -printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 +$as_echo "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ - test "x$ax_pthread_special_flags_added" != "xyes" -then : + test "x$ax_pthread_special_flags_added" != "xyes"; then : PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" ax_pthread_special_flags_added=yes fi - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 -printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } -if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} -then : - printf %s "(cached) " >&6 -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 +$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; } +if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then : + $as_echo_n "(cached) " >&6 +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main (void) +main () { int i = PTHREAD_PRIO_INHERIT; return i; @@ -18379,23 +17309,21 @@ int i = PTHREAD_PRIO_INHERIT; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO" -then : +if ac_fn_c_try_link "$LINENO"; then : ax_cv_PTHREAD_PRIO_INHERIT=yes -else $as_nop +else ax_cv_PTHREAD_PRIO_INHERIT=no fi -rm -f core conftest.err conftest.$ac_objext conftest.beam \ +rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 -printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 +$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ - test "x$ax_pthread_prio_inherit_defined" != "xyes" -then : + test "x$ax_pthread_prio_inherit_defined" != "xyes"; then : -printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h +$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h ax_pthread_prio_inherit_defined=yes @@ -18413,8 +17341,7 @@ fi #handle absolute path differently from PATH based program lookup case "x$CC" in #( x/*) : - if as_fn_executable_p ${CC}_r -then : + if as_fn_executable_p ${CC}_r; then : PTHREAD_CC="${CC}_r" fi ;; #( *) : @@ -18422,12 +17349,11 @@ fi ;; #( do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -printf %s "checking for $ac_word... " >&6; } -if test ${ac_cv_prog_PTHREAD_CC+y} -then : - printf %s "(cached) " >&6 -else $as_nop +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_PTHREAD_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else @@ -18435,15 +17361,11 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac + test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PTHREAD_CC="$ac_prog" - printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -18454,11 +17376,11 @@ fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 -printf "%s\n" "$PTHREAD_CC" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +$as_echo "$PTHREAD_CC" >&6; } else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi @@ -18486,16 +17408,15 @@ if test "x$ax_pthread_ok" = "xyes"; then systhread_support=true otherlibraries="$otherlibraries systhreads" common_cflags="$common_cflags $PTHREAD_CFLAGS" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: the POSIX threads library is supported" >&5 -printf "%s\n" "$as_me: the POSIX threads library is supported" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: the POSIX threads library is supported" >&5 +$as_echo "$as_me: the POSIX threads library is supported" >&6;} saved_CFLAGS="$CFLAGS" saved_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$LIBS $PTHREAD_LIBS" ac_fn_c_check_func "$LINENO" "sigwait" "ac_cv_func_sigwait" -if test "x$ac_cv_func_sigwait" = xyes -then : - printf "%s\n" "#define HAS_SIGWAIT 1" >>confdefs.h +if test "x$ac_cv_func_sigwait" = xyes; then : + $as_echo "#define HAS_SIGWAIT 1" >>confdefs.h fi @@ -18504,13 +17425,12 @@ fi : else ax_pthread_ok=no - if test x"$enable_systhreads" = "xyes" -then : + if test x"$enable_systhreads" = "xyes"; then : as_fn_error $? "the POSIX thread library is not available" "$LINENO" 5 -else $as_nop +else systhread_support=false - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: the POSIX threads library is not supported" >&5 -printf "%s\n" "$as_me: the POSIX threads library is not supported" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: the POSIX threads library is not supported" >&5 +$as_echo "$as_me: the POSIX threads library is not supported" >&6;} fi fi ac_ext=c @@ -18526,15 +17446,14 @@ esac ## Does the assembler support debug prefix map and CFI directives as_has_debug_prefix_map=false asm_cfi_supported=false -if $native_compiler -then : +if $native_compiler; then : case $host in #( *-*-mingw32|*-pc-windows) : ;; #( *) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the assembler supports --debug-prefix-map" >&5 -printf %s "checking whether the assembler supports --debug-prefix-map... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the assembler supports --debug-prefix-map" >&5 +$as_echo_n "checking whether the assembler supports --debug-prefix-map... " >&6; } saved_CC="$CC" @@ -18564,17 +17483,16 @@ camlPervasives__loop_1128: .loc 1 193 _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : as_has_debug_prefix_map=true - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else ashas_debug_prefix_map=false - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Restore the content of confdefs.h @@ -18588,14 +17506,13 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the assembler supports CFI directives" >&5 -printf %s "checking whether the assembler supports CFI directives... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the assembler supports CFI directives" >&5 +$as_echo_n "checking whether the assembler supports CFI directives... " >&6; } - if test x"$enable_cfi" = "xno" -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 -printf "%s\n" "disabled" >&6; } -else $as_nop + if test x"$enable_cfi" = "xno"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 +$as_echo "disabled" >&6; } +else saved_CC="$CC" saved_CFLAGS="$CFLAGS" @@ -18627,18 +17544,16 @@ camlPervasives__loop_1128: .cfi_endproc _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : aspp_ok=true -else $as_nop +else aspp_ok=false fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - if test "$AS" = "$ASPP" -then : + if test "$AS" = "$ASPP"; then : as_ok="$aspp_ok" -else $as_nop +else CC="$AS" ac_compile='$CC $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -18652,13 +17567,12 @@ camlPervasives__loop_1128: .cfi_endproc _ACEOF -if ac_fn_c_try_compile "$LINENO" -then : +if ac_fn_c_try_compile "$LINENO"; then : as_ok=true -else $as_nop +else as_ok=false fi -rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi @@ -18672,24 +17586,22 @@ fi LIBS="$saved_LIBS" - if $aspp_ok && $as_ok -then : + if $aspp_ok && $as_ok; then : asm_cfi_supported=true - printf "%s\n" "#define ASM_CFI_SUPPORTED 1" >>confdefs.h - - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } -else $as_nop - if test x"$enable_cfi" = "xyes" -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: requested but not available + $as_echo "#define ASM_CFI_SUPPORTED 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + if test x"$enable_cfi" = "xyes"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: requested but not available as_fn_error $? "exiting" "$LINENO" 5" >&5 -printf "%s\n" "requested but not available +$as_echo "requested but not available as_fn_error $? "exiting" "$LINENO" 5" >&6; } -else $as_nop +else asm_cfi_supported=false - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi fi @@ -18699,52 +17611,47 @@ fi ## Frame pointers -if test x"$enable_frame_pointers" = "xyes" -then : +if test x"$enable_frame_pointers" = "xyes"; then : case "$host,$cc_basename" in #( x86_64-*-linux*,gcc*|x86_64-*-linux*,clang*) : common_cflags="$common_cflags -g -fno-omit-frame-pointer" frame_pointers=true - printf "%s\n" "#define WITH_FRAME_POINTERS 1" >>confdefs.h + $as_echo "#define WITH_FRAME_POINTERS 1" >>confdefs.h - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: using frame pointers" >&5 -printf "%s\n" "$as_me: using frame pointers" >&6;} ;; #( + { $as_echo "$as_me:${as_lineno-$LINENO}: using frame pointers" >&5 +$as_echo "$as_me: using frame pointers" >&6;} ;; #( *) : as_fn_error $? "frame pointers not supported on this platform" "$LINENO" 5 ;; esac -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not using frame pointers" >&5 -printf "%s\n" "$as_me: not using frame pointers" >&6;} +else + { $as_echo "$as_me:${as_lineno-$LINENO}: not using frame pointers" >&5 +$as_echo "$as_me: not using frame pointers" >&6;} frame_pointers=false fi ## CPP mangling -if test x"$enable_cpp_mangling" = "xyes" -then : +if test x"$enable_cpp_mangling" = "xyes"; then : cpp_mangling=true - printf "%s\n" "#define WITH_CPP_MANGLING 1" >>confdefs.h + $as_echo "#define WITH_CPP_MANGLING 1" >>confdefs.h -else $as_nop +else cpp_mangling=false fi ## No naked pointers -if test x"$enable_naked_pointers" = "xno" -then : +if test x"$enable_naked_pointers" = "xno" ; then : naked_pointers=false - printf "%s\n" "#define NO_NAKED_POINTERS 1" >>confdefs.h + $as_echo "#define NO_NAKED_POINTERS 1" >>confdefs.h -else $as_nop +else naked_pointers=true fi -if test x"$enable_naked_pointers_checker" = "xyes" -then : - if test x"$enable_naked_pointers" = "xno" -then : +if test x"$enable_naked_pointers_checker" = "xyes" ; then : + if test x"$enable_naked_pointers" = "xno" ; then : as_fn_error $? "--enable-naked-pointers-checker and --disable-naked-pointers are incompatible" "$LINENO" 5 fi case "$arch","$system" in #( @@ -18753,7 +17660,7 @@ fi |amd64,freebsd|amd64,solaris \ |arm64,linux|arm64,macosx) : naked_pointers_checker=true - printf "%s\n" "#define NAKED_POINTERS_CHECKER 1" >>confdefs.h + $as_echo "#define NAKED_POINTERS_CHECKER 1" >>confdefs.h ;; #( *) : as_fn_error $? "naked pointers checker not supported on this platform" "$LINENO" 5 @@ -18761,19 +17668,18 @@ fi *) : ;; esac -else $as_nop +else naked_pointers_checker=false fi ## Check for mmap support for huge pages and contiguous heap - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mmap supports huge pages" >&5 -printf %s "checking whether mmap supports huge pages... " >&6; } - if test "$cross_compiling" = yes -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no assumed" >&5 -printf "%s\n" "no assumed" >&6; } -else $as_nop + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap supports huge pages" >&5 +$as_echo_n "checking whether mmap supports huge pages... " >&6; } + if test "$cross_compiling" = yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no assumed" >&5 +$as_echo "no assumed" >&6; } +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -18815,17 +17721,18 @@ int main (int argc, char *argv[]){ } _ACEOF -if ac_fn_c_try_run "$LINENO" -then : - printf "%s\n" "#define HAS_HUGE_PAGES 1" >>confdefs.h +if ac_fn_c_try_run "$LINENO"; then : + $as_echo "#define HAS_HUGE_PAGES 1" >>confdefs.h - printf "%s\n" "#define HUGE_PAGE_SIZE (4 * 1024 * 1024)" >>confdefs.h + cat >>confdefs.h <<_ACEOF +#define HUGE_PAGE_SIZE (4 * 1024 * 1024) +_ACEOF - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -printf "%s\n" "yes" >&6; } -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 -printf "%s\n" "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -18833,40 +17740,37 @@ fi -printf "%s\n" "#define PROFINFO_WIDTH $profinfo_width" >>confdefs.h +cat >>confdefs.h <<_ACEOF +#define PROFINFO_WIDTH $profinfo_width +_ACEOF -if $profinfo -then : - printf "%s\n" "#define WITH_PROFINFO 1" >>confdefs.h +if $profinfo; then : + $as_echo "#define WITH_PROFINFO 1" >>confdefs.h fi -if test x"$enable_installing_bytecode_programs" = "xno" -then : +if test x"$enable_installing_bytecode_programs" = "xno"; then : install_bytecode_programs=false -else $as_nop +else install_bytecode_programs=true fi -if test x"$enable_installing_source_artifacts" = "xno" -then : +if test x"$enable_installing_source_artifacts" = "xno"; then : install_source_artifacts=false -else $as_nop +else install_source_artifacts=true fi -if test x"$enable_ocamldoc" = "xno" -then : +if test x"$enable_ocamldoc" = "xno"; then : ocamldoc="" -else $as_nop +else ocamldoc=ocamldoc fi documentation_tool_cmd='' # Check whether --with-odoc was given. -if test ${with_odoc+y} -then : +if test "${with_odoc+set}" = set; then : withval=$with_odoc; case $withval in #( yes) : documentation_tool='odoc' ;; #( @@ -18876,13 +17780,12 @@ then : documentation_tool_cmd="$withval" documentation_tool='odoc' ;; esac -else $as_nop +else documentation_tool='ocamldoc' fi if test "x$documentation_tool_cmd" = 'x' - documentation_tool_cmd="$documentation_tool" -then : + documentation_tool_cmd="$documentation_tool"; then : fi @@ -18895,92 +17798,84 @@ case $enable_ocamltest,false in #( ocamltest='' ;; esac -if test x"$enable_flambda" = "xyes" -then : +if test x"$enable_flambda" = "xyes"; then : flambda=true flambda2=false - if test x"$enable_flambda2" = "xyes" -then : + if test x"$enable_flambda2" = "xyes"; then : as_fn_error $? "please enable only one of Flambda 1 and Flambda 2" "$LINENO" 5 fi -else $as_nop +else flambda=false fi -if test x"$enable_flambda2" = "xyes" -then : +if test x"$enable_flambda2" = "xyes"; then : flambda2=true flambda=false -else $as_nop +else flambda2=false fi -if test x"$enable_flambda_invariants" = "xyes" -then : +if test x"$enable_flambda_invariants" = "xyes"; then : flambda_invariants=true -else $as_nop +else flambda_invariants=false fi -if test x"$enable_cmm_invariants" = "xyes" -then : +if test x"$enable_cmm_invariants" = "xyes"; then : cmm_invariants=true -else $as_nop +else cmm_invariants=false fi -if test x"$enable_cmm_invariants" = "xyes" -then : +if test x"$enable_cmm_invariants" = "xyes"; then : cmm_invariants=true -else $as_nop +else cmm_invariants=false fi -if test x"$enable_flat_float_array" = "xno" -then : +if test x"$enable_flat_float_array" = "xno"; then : flat_float_array=false -else $as_nop - printf "%s\n" "#define FLAT_FLOAT_ARRAY 1" >>confdefs.h +else + $as_echo "#define FLAT_FLOAT_ARRAY 1" >>confdefs.h flat_float_array=true fi -if test x"$enable_function_sections" = "xno" -then : +if test x"$enable_function_sections" = "xno"; then : function_sections=false -else $as_nop +else case $arch in #( amd64|i386|arm64) : # not supported on arm32, see issue #9124. case $target in #( *-cygwin*|*-mingw*|*-windows|*-apple-darwin*) : function_sections=false; - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No support for function sections on $target." >&5 -printf "%s\n" "$as_me: No support for function sections on $target." >&6;} ;; #( + { $as_echo "$as_me:${as_lineno-$LINENO}: No support for function sections on $target." >&5 +$as_echo "$as_me: No support for function sections on $target." >&6;} ;; #( *) : case $ocaml_cv_cc_vendor in #( gcc-0123-*|gcc-4-01234567) : function_sections=false; - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Function sections are not + { $as_echo "$as_me:${as_lineno-$LINENO}: Function sections are not supported in GCC prior to version 4.8." >&5 -printf "%s\n" "$as_me: Function sections are not +$as_echo "$as_me: Function sections are not supported in GCC prior to version 4.8." >&6;} ;; #( clang-012-*|clang-3-01234) : function_sections=false; - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Function sections are not supported + { $as_echo "$as_me:${as_lineno-$LINENO}: Function sections are not supported in Clang prior to version 3.5." >&5 -printf "%s\n" "$as_me: Function sections are not supported +$as_echo "$as_me: Function sections are not supported in Clang prior to version 3.5." >&6;} ;; #( gcc-*|clang-*) : function_sections=true; internal_cflags="$internal_cflags -ffunction-sections"; - printf "%s\n" "#define FUNCTION_SECTIONS 1" >>confdefs.h + $as_echo "#define FUNCTION_SECTIONS 1" >>confdefs.h ;; #( *) : function_sections=false; - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Function sections are not supported by + { $as_echo "$as_me:${as_lineno-$LINENO}: Function sections are not supported by $ocaml_cv_cc_vendor." >&5 -printf "%s\n" "$as_me: Function sections are not supported by +$as_echo "$as_me: Function sections are not supported by $ocaml_cv_cc_vendor." >&6;} ;; #( *) : ;; @@ -18991,14 +17886,12 @@ esac ;; #( *) : function_sections=false ;; esac; - if test x"$function_sections" = "xfalse" -then : - if test x"$enable_function_sections" = "xyes" -then : + if test x"$function_sections" = "xfalse"; then : + if test x"$enable_function_sections" = "xyes"; then : as_fn_error $? "Function sections are not supported." "$LINENO" 5 -else $as_nop - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Disabling function sections." >&5 -printf "%s\n" "$as_me: Disabling function sections." >&6;} +else + { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling function sections." >&5 +$as_echo "$as_me: Disabling function sections." >&6;} fi fi fi @@ -19019,56 +17912,49 @@ esac ;; #( ;; esac -if test x"$probes" = "xfalse" -then : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Disabling tracing probes: no support on $target." >&5 -printf "%s\n" "$as_me: Disabling tracing probes: no support on $target." >&6;} +if test x"$probes" = "xfalse"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling tracing probes: no support on $target." >&5 +$as_echo "$as_me: Disabling tracing probes: no support on $target." >&6;} fi -if test x"$with_afl" = "xyes" -then : +if test x"$with_afl" = "xyes"; then : afl=true -else $as_nop +else afl=false fi -if test x"$enable_force_safe_string" = "xno" -then : +if test x"$enable_force_safe_string" = "xno"; then : force_safe_string=false -else $as_nop - printf "%s\n" "#define CAML_SAFE_STRING 1" >>confdefs.h +else + $as_echo "#define CAML_SAFE_STRING 1" >>confdefs.h force_safe_string=true fi -if test x"$DEFAULT_STRING" = "xunsafe" -then : +if test x"$DEFAULT_STRING" = "xunsafe"; then : default_safe_string=false -else $as_nop +else default_safe_string=true fi -if test x"$enable_stack_allocation" = "xno" -then : +if test x"$enable_stack_allocation" = "xno"; then : stack_allocation=false -else $as_nop - if $arch64 -then : - printf "%s\n" "#define STACK_ALLOCATION 1" >>confdefs.h +else + if $arch64; then : + $as_echo "#define STACK_ALLOCATION 1" >>confdefs.h stack_allocation=true -else $as_nop +else as_fn_error $? "Stack allocation is only supported on 64-bit platforms. \ Please pass '--enable-stack-allocation=no'." "$LINENO" 5 fi fi -if test x"$enable_poll_insertion" = "xyes" -then : - printf "%s\n" "#define POLL_INSERTION 1" >>confdefs.h +if test x"$enable_poll_insertion" = "xyes"; then : + $as_echo "#define POLL_INSERTION 1" >>confdefs.h poll_insertion=true -else $as_nop +else poll_insertion=false fi @@ -19090,13 +17976,11 @@ case $host in #( nativecclibs="$cclibs $DLLIBS" ;; esac -if test x"$libdir" = x'${exec_prefix}/lib' -then : +if test x"$libdir" = x'${exec_prefix}/lib'; then : libdir="$libdir"/ocaml fi -if test x"$mandir" = x'${datarootdir}/man' -then : +if test x"$mandir" = x'${datarootdir}/man'; then : mandir='${prefix}/man' fi @@ -19115,8 +17999,7 @@ esac ;; #( esac # Define default prefix correctly for the different Windows ports -if test x"$prefix" = "xNONE" -then : +if test x"$prefix" = "xNONE"; then : case $host in #( i686-w64-mingw32) : prefix='C:/ocamlmgw' ;; #( @@ -19129,10 +18012,9 @@ then : *) : ;; esac -else $as_nop +else if test x"$unix_or_win32" = "xwin32" \ - && test "$host_vendor-$host_os" != "$build_vendor-$build_os" -then : + && test "$host_vendor-$host_os" != "$build_vendor-$build_os" ; then : case $build in #( *-pc-cygwin) : prefix="$(LC_ALL=C.UTF-8 cygpath -m "$prefix")" ;; #( @@ -19147,36 +18029,35 @@ fi # (all this should be understood and fixed) case $host in #( *-*-mingw32) : - printf "%s\n" "#define HAS_BROKEN_PRINTF 1" >>confdefs.h + $as_echo "#define HAS_BROKEN_PRINTF 1" >>confdefs.h - printf "%s\n" "#define HAS_STRERROR 1" >>confdefs.h + $as_echo "#define HAS_STRERROR 1" >>confdefs.h - printf "%s\n" "#define HAS_IPV6 1" >>confdefs.h + $as_echo "#define HAS_IPV6 1" >>confdefs.h - printf "%s\n" "#define HAS_NICE 1" >>confdefs.h + $as_echo "#define HAS_NICE 1" >>confdefs.h ;; #( *-pc-windows) : - printf "%s\n" "#define HAS_BROKEN_PRINTF 1" >>confdefs.h + $as_echo "#define HAS_BROKEN_PRINTF 1" >>confdefs.h - printf "%s\n" "#define HAS_STRERROR 1" >>confdefs.h + $as_echo "#define HAS_STRERROR 1" >>confdefs.h - printf "%s\n" "#define HAS_IPV6 1" >>confdefs.h + $as_echo "#define HAS_IPV6 1" >>confdefs.h - printf "%s\n" "#define HAS_NICE 1" >>confdefs.h + $as_echo "#define HAS_NICE 1" >>confdefs.h ;; #( *-*-solaris*) : # This is required as otherwise floats are printed # as "Infinity" and "Inf" instead of the expected "inf" - printf "%s\n" "#define HAS_BROKEN_PRINTF 1" >>confdefs.h + $as_echo "#define HAS_BROKEN_PRINTF 1" >>confdefs.h ;; #( *) : ;; esac -if test x"$enable_stdlib_manpages" != "xno" -then : +if test x"$enable_stdlib_manpages" != "xno"; then : stdlib_manpages=true -else $as_nop +else stdlib_manpages=false fi @@ -19210,8 +18091,8 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -19241,15 +18122,15 @@ printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} /^ac_cv_env_/b end t clear :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -printf "%s\n" "$as_me: updating cache $cache_file" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else @@ -19263,8 +18144,8 @@ printf "%s\n" "$as_me: updating cache $cache_file" >&6;} fi fi else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -19281,7 +18162,7 @@ U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" @@ -19297,8 +18178,8 @@ LTLIBOBJS=$ac_ltlibobjs ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL @@ -19321,16 +18202,14 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -as_nop=: -if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 -then : +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else $as_nop +else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -19340,46 +18219,46 @@ esac fi - -# Reset variables that may have inherited troublesome values from -# the environment. - -# IFS needs to be set, to space, tab, and newline, in precisely that order. -# (If _AS_PATH_WALK were called with IFS unset, it would have the -# side effect of setting IFS to empty, thus disabling word splitting.) -# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -IFS=" "" $as_nl" - -PS1='$ ' -PS2='> ' -PS4='+ ' - -# Ensure predictable behavior from utilities with locale-dependent output. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# We cannot yet rely on "unset" to work, but we need these variables -# to be unset--not just set to an empty or harmless value--now, to -# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct -# also avoids known problems related to "unset" and subshell syntax -# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). -for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH -do eval test \${$as_var+y} \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done - -# Ensure that fds 0, 1, and 2 are open. -if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi -if (exec 3>&2) ; then :; else exec 2>/dev/null; fi +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi # The user is always right. -if ${PATH_SEPARATOR+false} :; then +if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -19388,6 +18267,13 @@ if ${PATH_SEPARATOR+false} :; then fi +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -19396,12 +18282,8 @@ case $0 in #(( for as_dir in $PATH do IFS=$as_save_IFS - case $as_dir in #((( - '') as_dir=./ ;; - */) ;; - *) as_dir=$as_dir/ ;; - esac - test -r "$as_dir$0" && as_myself=$as_dir$0 && break + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS @@ -19413,10 +18295,30 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] @@ -19429,14 +18331,13 @@ as_fn_error () as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - printf "%s\n" "$as_me: error: $2" >&2 + $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error - # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -19463,20 +18364,18 @@ as_fn_unset () { eval $1=; unset $1;} } as_unset=as_fn_unset - # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null -then : +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' -else $as_nop +else as_fn_append () { eval $1=\$$1\$2 @@ -19488,13 +18387,12 @@ fi # as_fn_append # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null -then : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else $as_nop +else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` @@ -19525,7 +18423,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -printf "%s\n" X/"$0" | +$as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -19547,10 +18445,6 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits - -# Determine whether it's possible to make 'echo' print without a newline. -# These variables are no longer used directly by Autoconf, but are AC_SUBSTed -# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -19564,12 +18458,6 @@ case `echo -n x` in #((((( ECHO_N='-n';; esac -# For backward compatibility with old third-party macros, we provide -# the shell variables $as_echo and $as_echo_n. New code should use -# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. -as_echo='printf %s\n' -as_echo_n='printf %s' - rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -19611,7 +18499,7 @@ as_fn_mkdir_p () as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -19620,7 +18508,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -printf "%s\n" X"$as_dir" | +$as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -19683,7 +18571,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # values after options handling. ac_log=" This file was extended by OCaml $as_me 4.14.1+jst, which was -generated by GNU Autoconf 2.71. Invocation command line was +generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -19746,16 +18634,14 @@ Report bugs to . OCaml home page: ." _ACEOF -ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` -ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config='$ac_cs_config_escaped' +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ OCaml config.status 4.14.1+jst -configured by $0, generated by GNU Autoconf 2.71, +configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" -Copyright (C) 2021 Free Software Foundation, Inc. +Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -19794,15 +18680,15 @@ do -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - printf "%s\n" "$ac_cs_version"; exit ;; + $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) - printf "%s\n" "$ac_cs_config"; exit ;; + $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in - *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" @@ -19810,7 +18696,7 @@ do --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in - *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; @@ -19819,7 +18705,7 @@ do as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) - printf "%s\n" "$ac_cs_usage"; exit ;; + $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; @@ -19847,7 +18733,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift - \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" @@ -19861,7 +18747,7 @@ exec 5>>config.log sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX - printf "%s\n" "$ac_log" + $as_echo "$ac_log" } >&5 _ACEOF @@ -20182,9 +19068,9 @@ done # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then - test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files - test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers - test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree @@ -20520,7 +19406,7 @@ do esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac - case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done @@ -20528,17 +19414,17 @@ do # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` - printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -printf "%s\n" "$as_me: creating $ac_file" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) - ac_sed_conf_input=`printf "%s\n" "$configure_input" | + ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac @@ -20555,7 +19441,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -printf "%s\n" X"$ac_file" | +$as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -20579,9 +19465,9 @@ printf "%s\n" X"$ac_file" | case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; @@ -20638,8 +19524,8 @@ ac_sed_dataroot=' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' @@ -20682,9 +19568,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 -printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" @@ -20700,27 +19586,27 @@ which seems to be undefined. Please make sure it is defined" >&2;} # if test x"$ac_file" != x-; then { - printf "%s\n" "/* $configure_input */" >&1 \ + $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else - printf "%s\n" "/* $configure_input */" >&1 \ + $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; - :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -printf "%s\n" "$as_me: executing $ac_file commands" >&6;} + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac @@ -21253,7 +20139,6 @@ _LT_EOF esac - ltmain=$ac_aux_dir/ltmain.sh @@ -21303,8 +20188,7 @@ if test "$no_create" != yes; then $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi - diff --git a/tests/backend/regalloc_validator/check_regalloc_validation.ml b/tests/backend/regalloc_validator/check_regalloc_validation.ml index c5f3728bdde..5764c1d2a63 100644 --- a/tests/backend/regalloc_validator/check_regalloc_validation.ml +++ b/tests/backend/regalloc_validator/check_regalloc_validation.ml @@ -559,7 +559,7 @@ let () = cfg, cfg) ~exp_std:"fatal exception raised when validating description" ~exp_err: - ">> Fatal error: instruction 20 has a register (V/53) with an unknown \ + ">> Fatal error: instruction 20 has a register (V/37) with an unknown \ location" let () = diff --git a/tests/simd/simd.ml b/tests/simd/simd.ml index 4a084844064..d2aca2ca85f 100644 --- a/tests/simd/simd.ml +++ b/tests/simd/simd.ml @@ -54,7 +54,7 @@ let () = let () = let v0 = vec128_of_int64s 1L 2L in let v1 = vec128_of_int64s 3L 4L in - let v = (combine[@inlined]) v0 v1 in + let v = (combine[@inlined hint]) v0 v1 in check v 4L 6L ;; @@ -71,7 +71,7 @@ let () = let () = let v0 = vec128_of_int64s 1L 2L in let v1 = vec128_of_int64s 3L 4L in - let v = (combine_with_floats[@inlined]) v0 5. v1 6. in + let v = (combine_with_floats[@inlined hint]) v0 5. v1 6. in check v 9L 12L ;; @@ -103,9 +103,9 @@ let () = (* Capture vectors and floats in a closure (inlined) *) let () = let[@inline always] f v0 v1 f0 v2 f1 v3 = - (combine[@inlined]) - ((combine_with_floats[@inlined]) v0 f0 v1 f1) - ((combine[@inlined]) v2 v3) + (combine[@inlined hint]) + ((combine_with_floats[@inlined hint]) v0 f0 v1 f1) + ((combine[@inlined hint]) v2 v3) in let v0 = vec128_of_int64s 1L 2L in let v1 = vec128_of_int64s 3L 4L in From 52ab32faf23789125289ff988dccc912b54a07c4 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Wed, 5 Jul 2023 17:49:50 -0400 Subject: [PATCH 38/81] edits --- backend/cfg/cfg.ml | 2 +- backend/regalloc/regalloc_invariants.ml | 6 +++--- backend/regalloc/regalloc_validate.ml | 28 ++++++++++++------------- backend/reloadgen.ml | 2 +- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/backend/cfg/cfg.ml b/backend/cfg/cfg.ml index a8db9e5b474..97b90c8600a 100644 --- a/backend/cfg/cfg.ml +++ b/backend/cfg/cfg.ml @@ -505,7 +505,7 @@ let is_noop_move instr = (match instr.arg.(0).loc with | Unknown -> false | Reg _ | Stack _ -> Reg.same_loc instr.arg.(0) instr.res.(0)) - && Proc.register_class instr.arg.(0) = Proc.register_class instr.res.(0) + && Proc.stack_slot_class_for instr.arg.(0) = Proc.stack_slot_class_for instr.res.(0) | Op (Csel _) -> ( match instr.res.(0).loc with | Unknown -> false diff --git a/backend/regalloc/regalloc_invariants.ml b/backend/regalloc/regalloc_invariants.ml index 4d46d9225ab..5885677044f 100644 --- a/backend/regalloc/regalloc_invariants.ml +++ b/backend/regalloc/regalloc_invariants.ml @@ -170,9 +170,9 @@ let postcondition_layout : Cfg_with_layout.t -> unit = | Stack stack_loc -> ( match stack_loc with | Local index -> - let reg_class = Proc.register_class reg in - used_stack_slots.(reg_class) - <- Int.Set.add index used_stack_slots.(reg_class) + let ss_class = Proc.stack_slot_class_for reg in + used_stack_slots.(ss_class) + <- Int.Set.add index used_stack_slots.(ss_class) | Incoming _ -> () | Outgoing _ -> () | Domainstate _ -> ()) diff --git a/backend/regalloc/regalloc_validate.ml b/backend/regalloc/regalloc_validate.ml index 42c5bc7e6ca..9d9b3b60802 100644 --- a/backend/regalloc/regalloc_validate.ml +++ b/backend/regalloc/regalloc_validate.ml @@ -35,15 +35,15 @@ module Location : sig end = struct module Stack = struct (** This type is based on [Reg.stack_location]. The first difference is that - for [Stack (Local index)] this types additionally stores [reg_class] - because local stacks are separate for different register classes. + for [Stack (Local index)] this types additionally stores [ss_class] + because local stacks are separate for different stack slot classes. Secondly for all stacks it stores index in words and not byte offset. That gives the guarantee that if indices are different then the locations do not overlap. *) type t = | Local of { index : int; - reg_class : int + ss_class : int } | Incoming of { index : int } | Outgoing of { index : int } @@ -84,9 +84,9 @@ end = struct let word_index_to_byte_offset index = index * word_size - let of_stack_loc ~reg_class loc = + let of_stack_loc ~ss_class loc = match loc with - | Reg.Local index -> Local { index; reg_class } + | Reg.Local index -> Local { index; ss_class } | Reg.Incoming offset -> Incoming { index = byte_offset_to_word_index offset } | Reg.Outgoing offset -> @@ -102,12 +102,12 @@ end = struct | Domainstate { index } -> Reg.Domainstate (word_index_to_byte_offset index) - let unknown_reg_class = -1 + let unknown_ss_class = -1 - let reg_class_lossy t = + let ss_class_lossy t = match t with - | Local { reg_class; _ } -> reg_class - | Incoming _ | Outgoing _ | Domainstate _ -> unknown_reg_class + | Local { ss_class; _ } -> ss_class + | Incoming _ | Outgoing _ | Domainstate _ -> unknown_ss_class end type t = @@ -120,7 +120,7 @@ end = struct | Reg.Reg idx -> Some (Reg idx) | Reg.Stack stack -> Some - (Stack (Stack.of_stack_loc ~reg_class:(Proc.register_class reg) stack)) + (Stack (Stack.of_stack_loc ~ss_class:(Proc.stack_slot_class_for reg) stack)) let of_reg_exn reg = of_reg reg |> Option.get @@ -131,11 +131,11 @@ end = struct | Reg idx -> Reg.Reg idx | Stack stack -> Reg.Stack (Stack.to_stack_loc_lossy stack) - let reg_class_lossy t = - match t with Reg _ -> -1 | Stack stack -> Stack.reg_class_lossy stack + let ss_class_lossy t = + match t with Reg _ -> -1 | Stack stack -> Stack.ss_class_lossy stack let print ppf t = - Printmach.loc ~reg_class:(reg_class_lossy t) + Printmach.loc ~reg_class:(ss_class_lossy t) ~unknown:(fun _ -> assert false) ppf (to_loc_lossy t) @@ -964,7 +964,7 @@ module type Description_value = sig end let print_reg_as_loc ppf reg = - Printmach.loc ~reg_class:(Proc.register_class reg) + Printmach.loc ~reg_class:(Proc.stack_slot_class_for reg) ~unknown:(fun ppf -> Format.fprintf ppf "") ppf reg.Reg.loc diff --git a/backend/reloadgen.ml b/backend/reloadgen.ml index d5ca5521b3d..7d67450fcdd 100644 --- a/backend/reloadgen.ml +++ b/backend/reloadgen.ml @@ -67,7 +67,7 @@ method reload_operation op arg res = begin match arg.(0), res.(0) with {loc = Stack s1}, {loc = Stack s2} -> if s1 = s2 - && Proc.register_class arg.(0) = Proc.register_class res.(0) then + && Proc.stack_slot_class_for arg.(0) = Proc.stack_slot_class_for res.(0) then (* nothing will be emitted later, not necessary to apply constraints *) (arg, res) From ba608da655aa889ba1f146dcc1d0e31e03c05058 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Wed, 5 Jul 2023 18:00:23 -0400 Subject: [PATCH 39/81] fix emit --- backend/amd64/emit.mlp | 8 ++++---- backend/proc.mli | 3 +++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index ccada9ba947..7d0eeb92ad8 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -293,7 +293,7 @@ let reg = function let ofs = n + Domainstate.(idx_of_field Domain_extra_params) * 8 in mem64 (x86_data_type_for_stack_slot ty) ofs R14 | { loc = Stack s; typ = ty } as r -> - let ofs = slot_offset s (register_class r) in + let ofs = slot_offset s (stack_slot_class_for r) in mem64 (x86_data_type_for_stack_slot ty) ofs RSP | { loc = Unknown } -> assert false @@ -316,7 +316,7 @@ let reg_low_32_name = Array.map (fun r -> Reg32 r) int_reg_name let emit_subreg tbl typ r = match r.loc with | Reg.Reg r when r < 13 -> tbl.(r) - | Stack s -> mem64 typ (slot_offset s (register_class r)) RSP + | Stack s -> mem64 typ (slot_offset s (stack_slot_class_for r)) RSP | _ -> assert false let arg8 i n = emit_subreg reg_low_8_name BYTE i.arg.(n) @@ -358,7 +358,7 @@ let record_frame_label live dbg = | {typ = Val; loc = Reg r} -> live_offset := ((r lsl 1) + 1) :: !live_offset | {typ = Val; loc = Stack s} as reg -> - live_offset := slot_offset s (register_class reg) :: !live_offset + live_offset := slot_offset s (stack_slot_class_for reg) :: !live_offset | {typ = Addr} as r -> Misc.fatal_error ("bad GC root " ^ Reg.name r) | _ -> () @@ -1815,7 +1815,7 @@ let emit_probe_notes0 () = let arg_name = match arg.loc with | Stack s -> - Printf.sprintf "%d(%%rsp)" (slot_offset s (register_class arg)) + Printf.sprintf "%d(%%rsp)" (slot_offset s (stack_slot_class_for arg)) | Reg reg -> Proc.register_name reg | Unknown -> Misc.fatal_errorf "Cannot create probe: illegal argument: %a" diff --git a/backend/proc.mli b/backend/proc.mli index 2425523a24b..66c80b2a63c 100644 --- a/backend/proc.mli +++ b/backend/proc.mli @@ -29,6 +29,9 @@ val phys_reg: int -> Reg.t val rotate_registers: bool val all_phys_regs : Reg.t array +(* The number of stack slot classes may differ from the number of register classes. + On x86, we use the same class for floating point and SIMD vector registers, + but they take up different amounts of space on the stack. *) val num_stack_slot_classes: int val stack_slot_class_for: Reg.t -> int From e6aa4dddf05b62193382289ac2efcc739a7a6cb5 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Wed, 5 Jul 2023 18:14:14 -0400 Subject: [PATCH 40/81] reset configure changes --- ocaml/configure | 7972 +++++++++++++++++++++++++++-------------------- 1 file changed, 4544 insertions(+), 3428 deletions(-) diff --git a/ocaml/configure b/ocaml/configure index 8961cbdde7f..9bfaf972b26 100755 --- a/ocaml/configure +++ b/ocaml/configure @@ -1,11 +1,12 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for OCaml 4.14.1+jst. +# Generated by GNU Autoconf 2.71 for OCaml 4.14.1+jst. # # Report bugs to . # # -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +# Inc. # # # This configure script is free software; the Free Software Foundation @@ -16,14 +17,16 @@ # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -33,46 +36,46 @@ esac fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -81,13 +84,6 @@ if test "${PATH_SEPARATOR+set}" != set; then fi -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -96,8 +92,12 @@ case $0 in #(( for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -109,30 +109,10 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. @@ -154,20 +134,22 @@ esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST -else +else \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( @@ -187,12 +169,15 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : -else +else \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO @@ -207,30 +192,38 @@ test -x / || exit 1" test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : + if (eval "$as_required") 2>/dev/null +then : as_have_required=yes -else +else $as_nop as_have_required=no fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : -else +else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base + as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : break 2 fi fi @@ -238,14 +231,21 @@ fi esac as_found=false done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi +fi - if test "x$CONFIG_SHELL" != x; then : + if test "x$CONFIG_SHELL" != x +then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also @@ -263,18 +263,19 @@ esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else - $as_echo "$0: Please tell bug-autoconf@gnu.org and caml-list@inria.fr + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and caml-list@inria.fr $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do @@ -302,6 +303,7 @@ as_fn_unset () } as_unset=as_fn_unset + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -319,6 +321,14 @@ as_fn_exit () as_fn_set_status $1 exit $1 } # as_fn_exit +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_mkdir_p # ------------- @@ -333,7 +343,7 @@ as_fn_mkdir_p () as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -342,7 +352,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | +printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -381,12 +391,13 @@ as_fn_executable_p () # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : eval 'as_fn_append () { eval $1+=\$2 }' -else +else $as_nop as_fn_append () { eval $1=\$$1\$2 @@ -398,18 +409,27 @@ fi # as_fn_append # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else +else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- @@ -421,9 +441,9 @@ as_fn_error () as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $2" >&2 + printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error @@ -450,7 +470,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | +printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -494,7 +514,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall @@ -508,6 +528,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits exit } + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -521,6 +545,13 @@ case `echo -n x` in #((((( ECHO_N='-n';; esac +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -598,40 +629,36 @@ PACKAGE_URL='http://www.ocaml.org' ac_unique_file="runtime/interp.c" # Factoring default headers for most tests. ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include +#include +#ifdef HAVE_STDIO_H +# include #endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS +#ifdef HAVE_STDLIB_H # include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif #endif #ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif # include #endif -#ifdef HAVE_STRINGS_H -# include -#endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif #ifdef HAVE_UNISTD_H # include #endif" +ac_header_c_list= ac_subst_vars='LTLIBOBJS LIBOBJS PTHREAD_CFLAGS @@ -644,9 +671,9 @@ INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM flexlink +CPP ac_ct_DEP_CC DEP_CC -CPP LT_SYS_LIBRARY_PATH OTOOL64 OTOOL @@ -814,6 +841,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -939,6 +967,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -968,8 +997,6 @@ do *) ac_optarg=yes ;; esac - # Accept the important Cygnus configure options, so we can diagnose typos. - case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; @@ -1010,9 +1037,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -1036,9 +1063,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -1191,6 +1218,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1240,9 +1276,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1256,9 +1292,9 @@ do ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1302,9 +1338,9 @@ Try \`$0 --help' for more information" *) # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; @@ -1320,7 +1356,7 @@ if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1328,7 +1364,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1384,7 +1420,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | +printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -1481,6 +1517,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1632,9 +1669,9 @@ if test "$ac_init_help" = "recursive"; then case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; @@ -1662,7 +1699,8 @@ esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive @@ -1670,7 +1708,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix echo && $SHELL "$ac_srcdir/configure" --help=recursive else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done @@ -1680,9 +1718,9 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF OCaml configure 4.14.1+jst -generated by GNU Autoconf 2.69 +generated by GNU Autoconf 2.71 -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1699,14 +1737,14 @@ fi ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext + rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1714,14 +1752,15 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err - } && test -s conftest.$ac_objext; then : + } && test -s conftest.$ac_objext +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1737,14 +1776,14 @@ fi ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext conftest$ac_exeext + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1752,17 +1791,18 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext - }; then : + } +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1784,30 +1824,94 @@ fi ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. */ + +#include +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main (void) +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. @@ -1820,7 +1924,7 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1828,14 +1932,15 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err - }; then : + } +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1847,8 +1952,8 @@ fi # ac_fn_c_try_run LINENO # ---------------------- -# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes -# that executables *can* be run. +# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that +# executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack @@ -1858,25 +1963,26 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then : + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then : ac_retval=0 -else - $as_echo "$as_me: program exited with status $ac_status" >&5 - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: program exited with status $ac_status" >&5 + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status @@ -1887,164 +1993,6 @@ fi } # ac_fn_c_try_run -# ac_fn_c_check_func LINENO FUNC VAR -# ---------------------------------- -# Tests whether FUNC exists, setting the cache variable VAR accordingly -ac_fn_c_check_func () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -/* Define $2 to an innocuous variant, in case declares $2. - For example, HP-UX 11i declares gettimeofday. */ -#define $2 innocuous_$2 - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $2 (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $2 - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $2 (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$2 || defined __stub___$2 -choke me -#endif - -int -main () -{ -return $2 (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_func - -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES -# ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$4 -#include <$2> -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes -else - ac_header_compiler=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## --------------------------------- ## -## Report this to caml-list@inria.fr ## -## --------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno - -} # ac_fn_c_check_header_mongrel - # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache @@ -2052,17 +2000,18 @@ fi ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof ($2)) return 0; @@ -2070,12 +2019,13 @@ if (sizeof ($2)) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof (($2))) return 0; @@ -2083,18 +2033,19 @@ if (sizeof (($2))) return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop eval "$3=yes" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type @@ -2113,7 +2064,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; @@ -2123,14 +2074,15 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; @@ -2140,9 +2092,10 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_hi=$ac_mid; break -else +else $as_nop as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= @@ -2150,14 +2103,14 @@ else fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; @@ -2167,14 +2120,15 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; @@ -2184,9 +2138,10 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_lo=$ac_mid; break -else +else $as_nop as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= @@ -2194,14 +2149,14 @@ else fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done -else +else $as_nop ac_lo= ac_hi= fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val @@ -2209,7 +2164,7 @@ while test "x$ac_lo" != "x$ac_hi"; do /* end confdefs.h. */ $4 int -main () +main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; @@ -2219,12 +2174,13 @@ return test_array [0]; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_hi=$ac_mid -else +else $as_nop as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; @@ -2234,12 +2190,12 @@ esac cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 -static long int longval () { return $2; } -static unsigned long int ulongval () { return $2; } +static long int longval (void) { return $2; } +static unsigned long int ulongval (void) { return $2; } #include #include int -main () +main (void) { FILE *f = fopen ("conftest.val", "w"); @@ -2267,9 +2223,10 @@ main () return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : echo >>conftest.val; read $3 &5 +printf %s "checking whether $as_decl_name is declared... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 -$as_echo_n "checking whether $as_decl_name is declared... " >&6; } -if eval \${$3+:} false; then : - $as_echo_n "(cached) " >&6 -else + eval ac_save_FLAGS=\$$6 + as_fn_append $6 " $5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { #ifndef $as_decl_name #ifdef __cplusplus @@ -2314,19 +2274,22 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + eval $6=\$ac_save_FLAGS + fi eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -} # ac_fn_c_check_decl +} # ac_fn_check_decl # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- @@ -2335,16 +2298,17 @@ $as_echo "$ac_res" >&6; } ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 -$as_echo_n "checking for $2.$3... " >&6; } -if eval \${$4+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +printf %s "checking for $2.$3... " >&6; } +if eval test \${$4+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int -main () +main (void) { static $2 ac_aggr; if (ac_aggr.$3) @@ -2353,14 +2317,15 @@ return 0; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$4=yes" -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int -main () +main (void) { static $2 ac_aggr; if (sizeof ac_aggr.$3) @@ -2369,29 +2334,50 @@ return 0; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$4=yes" -else +else $as_nop eval "$4=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$4 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member +ac_configure_args_raw= +for ac_arg +do + case $ac_arg in + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_configure_args_raw " '$ac_arg'" +done + +case $ac_configure_args_raw in + *$as_nl*) + ac_safe_unquote= ;; + *) + ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. + ac_unsafe_a="$ac_unsafe_z#~" + ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" + ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; +esac + cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by OCaml $as_me 4.14.1+jst, which was -generated by GNU Autoconf 2.69. Invocation command line was +generated by GNU Autoconf 2.71. Invocation command line was - $ $0 $@ + $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log @@ -2424,8 +2410,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS @@ -2460,7 +2450,7 @@ do | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; @@ -2495,11 +2485,13 @@ done # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo - $as_echo "## ---------------- ## + printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo @@ -2510,8 +2502,8 @@ trap 'exit_status=$? case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -2535,7 +2527,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; ) echo - $as_echo "## ----------------- ## + printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo @@ -2543,14 +2535,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - $as_echo "$ac_var='\''$ac_val'\''" + printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## + printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo @@ -2558,15 +2550,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; do eval ac_val=\$$ac_var case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - $as_echo "$ac_var='\''$ac_val'\''" + printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then - $as_echo "## ----------- ## + printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo @@ -2574,8 +2566,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; echo fi test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && @@ -2589,63 +2581,48 @@ ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h -$as_echo "/* confdefs.h */" > confdefs.h +printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF +printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF +printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF +printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF +printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF +printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF +printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac + ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" + +for ac_site_file in $ac_site_files do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} + case $ac_site_file in #( + */*) : + ;; #( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi @@ -2655,35 +2632,450 @@ if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif + +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not \xHH hex character constants. + These do not provoke an error unfortunately, instead are silently treated + as an "x". The following induces an error, until -std is added to get + proper ANSI mode. Curiously \x00 != x always comes out true, for an + array size at least. It is necessary to write \x00 == 0 to get something + that is true only with -std. */ +int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) '\''x'\'' +int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), + int, int);' + +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' + +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +// Does the compiler advertise C99 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif + +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "your preprocessor is broken" +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static bool +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str = ""; + int number = 0; + float fnumber = 0; + + while (*format) + { + switch (*format++) + { + case '\''s'\'': // string + str = va_arg (args_copy, const char *); + break; + case '\''d'\'': // int + number = va_arg (args_copy, int); + break; + case '\''f'\'': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); + + return *str && number && fnumber; +} +' + +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' + +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +// Does the compiler advertise C11 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif + +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; + +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); + +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } + +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; + +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; + +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; + +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' + +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' + +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" + +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" + +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" + +# Auxiliary files required by this configure script. +ac_aux_files="install-sh ltmain.sh config.guess config.sub" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}/build-aux" + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in $ac_aux_dir_candidates +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break + fi + ac_first_candidate=false + + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 +fi + + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +if test -f "${ac_aux_dir}config.guess"; then + ac_config_guess="$SHELL ${ac_aux_dir}config.guess" +fi +if test -f "${ac_aux_dir}config.sub"; then + ac_config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_configure="$SHELL ${ac_aux_dir}configure" +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) @@ -2692,24 +3084,24 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in @@ -2719,11 +3111,12 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi done if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## @@ -2737,8 +3130,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring OCaml version 4.14.1+jst" >&5 -$as_echo "$as_me: Configuring OCaml version 4.14.1+jst" >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Configuring OCaml version 4.14.1+jst" >&5 +printf "%s\n" "$as_me: Configuring OCaml version 4.14.1+jst" >&6;} # Configuration variables @@ -2780,34 +3173,6 @@ bootstrapping_flexdll=false ## Directory containing auxiliary scripts used during build -ac_aux_dir= -for ac_dir in build-aux "$srcdir"/build-aux; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - ## Output variables @@ -2949,43 +3314,47 @@ ac_config_headers="$ac_config_headers runtime/caml/version.h" # Definitions related to the version of OCaml -$as_echo "#define OCAML_VERSION_MAJOR 4" >>confdefs.h +printf "%s\n" "#define OCAML_VERSION_MAJOR 4" >>confdefs.h -$as_echo "#define OCAML_VERSION_MINOR 14" >>confdefs.h +printf "%s\n" "#define OCAML_VERSION_MINOR 14" >>confdefs.h -$as_echo "#define OCAML_VERSION_PATCHLEVEL 1" >>confdefs.h +printf "%s\n" "#define OCAML_VERSION_PATCHLEVEL 1" >>confdefs.h -$as_echo "#define OCAML_VERSION_ADDITIONAL \"jst\"" >>confdefs.h +printf "%s\n" "#define OCAML_VERSION_ADDITIONAL \"jst\"" >>confdefs.h - $as_echo "#define OCAML_VERSION_EXTRA \"jst\"" >>confdefs.h + printf "%s\n" "#define OCAML_VERSION_EXTRA \"jst\"" >>confdefs.h -$as_echo "#define OCAML_VERSION 41401" >>confdefs.h +printf "%s\n" "#define OCAML_VERSION 41401" >>confdefs.h -$as_echo "#define OCAML_VERSION_STRING \"4.14.1+jst\"" >>confdefs.h +printf "%s\n" "#define OCAML_VERSION_STRING \"4.14.1+jst\"" >>confdefs.h # Checks for system types -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if ${ac_cv_build+:} false; then : - $as_echo_n "(cached) " >&6 -else + + + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_build_alias=$build_alias test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; @@ -3004,21 +3373,22 @@ IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if ${ac_cv_host+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; @@ -3037,21 +3407,22 @@ IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 -$as_echo_n "checking target system type... " >&6; } -if ${ac_cv_target+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 +printf %s "checking target system type... " >&6; } +if test ${ac_cv_target+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else - ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 + ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5 fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 -$as_echo "$ac_cv_target" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 +printf "%s\n" "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; @@ -3107,11 +3478,12 @@ esac # Extract the first word of "dune", so it can be a program name with args. set dummy dune; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_dune+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_dune+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $dune in [\\/]* | ?:[\\/]*) ac_cv_path_dune="$dune" # Let the user override the test with a path. @@ -3121,11 +3493,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_dune="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_path_dune="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3137,39 +3513,43 @@ esac fi dune=$ac_cv_path_dune if test -n "$dune"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dune" >&5 -$as_echo "$dune" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dune" >&5 +printf "%s\n" "$dune" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi # Check whether --with-dune was given. -if test "${with_dune+set}" = set; then : +if test ${with_dune+y} +then : withval=$with_dune; dune=$with_dune fi # Check whether --enable-debug-runtime was given. -if test "${enable_debug_runtime+set}" = set; then : +if test ${enable_debug_runtime+y} +then : enableval=$enable_debug_runtime; fi # Check whether --enable-debugger was given. -if test "${enable_debugger+set}" = set; then : +if test ${enable_debugger+y} +then : enableval=$enable_debugger; -else +else $as_nop enable_debugger=auto fi # Check whether --enable-dependency-generation was given. -if test "${enable_dependency_generation+set}" = set; then : +if test ${enable_dependency_generation+y} +then : enableval=$enable_dependency_generation; -else +else $as_nop enable_dependency_generation=auto fi @@ -3177,28 +3557,32 @@ fi # Check whether --enable-instrumented-runtime was given. -if test "${enable_instrumented_runtime+set}" = set; then : +if test ${enable_instrumented_runtime+y} +then : enableval=$enable_instrumented_runtime; -else +else $as_nop enable_instrumented_runtime=auto fi # Check whether --enable-vmthreads was given. -if test "${enable_vmthreads+set}" = set; then : +if test ${enable_vmthreads+y} +then : enableval=$enable_vmthreads; as_fn_error $? "The vmthreads library is no longer available. \ It was deleted in OCaml 4.09." "$LINENO" 5 fi # Check whether --enable-systhreads was given. -if test "${enable_systhreads+set}" = set; then : +if test ${enable_systhreads+y} +then : enableval=$enable_systhreads; fi # Check whether --enable-graph-lib was given. -if test "${enable_graph_lib+set}" = set; then : +if test ${enable_graph_lib+y} +then : enableval=$enable_graph_lib; as_fn_error $? "The graphics library is no longer distributed with OCaml \ since version 4.09. It is now distributed as a separate \"graphics\" package: \ https://github.com/ocaml/graphics" "$LINENO" 5 @@ -3206,143 +3590,166 @@ fi # Check whether --enable-str-lib was given. -if test "${enable_str_lib+set}" = set; then : +if test ${enable_str_lib+y} +then : enableval=$enable_str_lib; fi # Check whether --enable-unix-lib was given. -if test "${enable_unix_lib+set}" = set; then : +if test ${enable_unix_lib+y} +then : enableval=$enable_unix_lib; fi # Check whether --enable-bigarray-lib was given. -if test "${enable_bigarray_lib+set}" = set; then : +if test ${enable_bigarray_lib+y} +then : enableval=$enable_bigarray_lib; fi # Check whether --enable-ocamldoc was given. -if test "${enable_ocamldoc+set}" = set; then : +if test ${enable_ocamldoc+y} +then : enableval=$enable_ocamldoc; -else +else $as_nop ocamldoc=auto fi # Check whether --with-odoc was given. -if test "${with_odoc+set}" = set; then : +if test ${with_odoc+y} +then : withval=$with_odoc; fi # Check whether --enable-ocamltest was given. -if test "${enable_ocamltest+set}" = set; then : +if test ${enable_ocamltest+y} +then : enableval=$enable_ocamltest; fi # Check whether --enable-native-toplevel was given. -if test "${enable_native_toplevel+set}" = set; then : +if test ${enable_native_toplevel+y} +then : enableval=$enable_native_toplevel; fi # Check whether --enable-frame-pointers was given. -if test "${enable_frame_pointers+set}" = set; then : +if test ${enable_frame_pointers+y} +then : enableval=$enable_frame_pointers; fi # Check whether --enable-cpp-mangling was given. -if test "${enable_cpp_mangling+set}" = set; then : +if test ${enable_cpp_mangling+y} +then : enableval=$enable_cpp_mangling; fi # Check whether --enable-naked-pointers was given. -if test "${enable_naked_pointers+set}" = set; then : +if test ${enable_naked_pointers+y} +then : enableval=$enable_naked_pointers; fi # Check whether --enable-naked-pointers-checker was given. -if test "${enable_naked_pointers_checker+set}" = set; then : +if test ${enable_naked_pointers_checker+y} +then : enableval=$enable_naked_pointers_checker; fi # Check whether --enable-spacetime was given. -if test "${enable_spacetime+set}" = set; then : +if test ${enable_spacetime+y} +then : enableval=$enable_spacetime; as_fn_error $? "spacetime profiling was deleted in OCaml 4.12." "$LINENO" 5 fi # Check whether --enable-cfi was given. -if test "${enable_cfi+set}" = set; then : +if test ${enable_cfi+y} +then : enableval=$enable_cfi; fi # Check whether --enable-imprecise-c99-float-ops was given. -if test "${enable_imprecise_c99_float_ops+set}" = set; then : +if test ${enable_imprecise_c99_float_ops+y} +then : enableval=$enable_imprecise_c99_float_ops; fi # Check whether --enable-installing-source-artifacts was given. -if test "${enable_installing_source_artifacts+set}" = set; then : +if test ${enable_installing_source_artifacts+y} +then : enableval=$enable_installing_source_artifacts; fi # Check whether --enable-installing-bytecode-programs was given. -if test "${enable_installing_bytecode_programs+set}" = set; then : +if test ${enable_installing_bytecode_programs+y} +then : enableval=$enable_installing_bytecode_programs; fi # Check whether --enable-native-compiler was given. -if test "${enable_native_compiler+set}" = set; then : +if test ${enable_native_compiler+y} +then : enableval=$enable_native_compiler; fi # Check whether --enable-flambda was given. -if test "${enable_flambda+set}" = set; then : +if test ${enable_flambda+y} +then : enableval=$enable_flambda; fi # Check whether --enable-flambda-invariants was given. -if test "${enable_flambda_invariants+set}" = set; then : +if test ${enable_flambda_invariants+y} +then : enableval=$enable_flambda_invariants; fi # Check whether --enable-flambda2 was given. -if test "${enable_flambda2+set}" = set; then : +if test ${enable_flambda2+y} +then : enableval=$enable_flambda2; fi # Check whether --enable-cmm-invariants was given. -if test "${enable_cmm_invariants+set}" = set; then : +if test ${enable_cmm_invariants+y} +then : enableval=$enable_cmm_invariants; fi # Check whether --with-target-bindir was given. -if test "${with_target_bindir+set}" = set; then : +if test ${with_target_bindir+y} +then : withval=$with_target_bindir; fi # Check whether --enable-reserved-header-bits was given. -if test "${enable_reserved_header_bits+set}" = set; then : +if test ${enable_reserved_header_bits+y} +then : enableval=$enable_reserved_header_bits; case $enable_reserved_header_bits in #( 0) : with_profinfo=false @@ -3357,13 +3764,15 @@ fi # Check whether --enable-stdlib-manpages was given. -if test "${enable_stdlib_manpages+set}" = set; then : +if test ${enable_stdlib_manpages+y} +then : enableval=$enable_stdlib_manpages; fi # Check whether --enable-warn-error was given. -if test "${enable_warn_error+set}" = set; then : +if test ${enable_warn_error+y} +then : enableval=$enable_warn_error; fi @@ -3396,7 +3805,8 @@ fi # to be removed in the future. # Check whether --enable-force-safe-string was given. -if test "${enable_force_safe_string+set}" = set; then : +if test ${enable_force_safe_string+y} +then : enableval=$enable_force_safe_string; fi @@ -3404,66 +3814,78 @@ fi # Check whether --enable-flat-float-array was given. -if test "${enable_flat_float_array+set}" = set; then : +if test ${enable_flat_float_array+y} +then : enableval=$enable_flat_float_array; fi # Check whether --enable-function-sections was given. -if test "${enable_function_sections+set}" = set; then : +if test ${enable_function_sections+y} +then : enableval=$enable_function_sections; -else +else $as_nop enable_function_sections=auto fi # Check whether --with-afl was given. -if test "${with_afl+set}" = set; then : +if test ${with_afl+y} +then : withval=$with_afl; fi # Check whether --enable-stack-allocation was given. -if test "${enable_stack_allocation+set}" = set; then : +if test ${enable_stack_allocation+y} +then : enableval=$enable_stack_allocation; fi # Check whether --enable-poll-insertion was given. -if test "${enable_poll_insertion+set}" = set; then : +if test ${enable_poll_insertion+y} +then : enableval=$enable_poll_insertion; fi # Check whether --with-flexdll was given. -if test "${with_flexdll+set}" = set; then : - withval=$with_flexdll; if test x"$withval" = 'xyes'; then : +if test ${with_flexdll+y} +then : + withval=$with_flexdll; if test x"$withval" = 'xyes' +then : with_flexdll=flexdll fi fi -if test x"$enable_unix_lib" = "xno"; then : - if test x"$enable_debugger" = "xyes"; then : +if test x"$enable_unix_lib" = "xno" +then : + if test x"$enable_debugger" = "xyes" +then : as_fn_error $? "replay debugger requires the unix library" "$LINENO" 5 -else +else $as_nop enable_debugger="no" fi - if test x"$enable_bigarray_lib" = "xyes"; then : + if test x"$enable_bigarray_lib" = "xyes" +then : as_fn_error $? "legacy bigarray library requires the unix library" "$LINENO" 5 fi fi -if test x"$enable_unix_lib" = "xno" -o x"$enable_str_lib" = "xno"; then : - if test x"$enable_ocamldoc" = "xyes"; then : +if test x"$enable_unix_lib" = "xno" -o x"$enable_str_lib" = "xno" +then : + if test x"$enable_ocamldoc" = "xyes" +then : as_fn_error $? "ocamldoc requires the unix and str libraries" "$LINENO" 5 -else +else $as_nop enable_ocamldoc="no" with_camltex="" fi -else +else $as_nop with_camltex="true" fi @@ -3475,11 +3897,12 @@ if test -n "$ac_tool_prefix"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$LD"; then ac_cv_prog_LD="$LD" # Let the user override the test. else @@ -3487,11 +3910,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_LD="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3502,11 +3929,11 @@ fi fi LD=$ac_cv_prog_LD if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +printf "%s\n" "$LD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3519,11 +3946,12 @@ if test -z "$LD"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_LD"; then ac_cv_prog_ac_ct_LD="$ac_ct_LD" # Let the user override the test. else @@ -3531,11 +3959,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LD="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3546,11 +3978,11 @@ fi fi ac_ct_LD=$ac_cv_prog_ac_ct_LD if test -n "$ac_ct_LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LD" >&5 -$as_echo "$ac_ct_LD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LD" >&5 +printf "%s\n" "$ac_ct_LD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3562,8 +3994,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LD=$ac_ct_LD @@ -3575,14 +4007,16 @@ fi # alters the CFLAGS variable, so we save its value before calling the macro # and restore it after the call old_host_os=$host_os -if test x"$host_os" = "xwindows"; then : +if test x"$host_os" = "xwindows" +then : host_os=mingw fi saved_CFLAGS="$CFLAGS" + case `pwd` in *\ * | *\ *) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac @@ -3602,6 +4036,7 @@ macro_revision='2.4.6' + ltmain=$ac_aux_dir/ltmain.sh # Backslashify metacharacters that are still active within @@ -3625,8 +4060,8 @@ ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +printf %s "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then @@ -3652,12 +4087,12 @@ func_echo_all () } case $ECHO in - printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 -$as_echo "cat" >&6; } ;; + printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +printf "%s\n" "printf" >&6; } ;; + print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +printf "%s\n" "print -r" >&6; } ;; + *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +printf "%s\n" "cat" >&6; } ;; esac @@ -3670,6 +4105,15 @@ esac + + + + + + + + + @@ -3681,11 +4125,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3693,11 +4138,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3708,11 +4157,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3721,11 +4170,12 @@ if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -3733,11 +4183,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3748,11 +4202,11 @@ fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then @@ -3760,8 +4214,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -3774,11 +4228,12 @@ if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3786,11 +4241,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3801,11 +4260,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3814,11 +4273,12 @@ fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3827,15 +4287,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3851,18 +4315,18 @@ if test $ac_prog_rejected = yes; then # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift - ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3873,11 +4337,12 @@ if test -z "$CC"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3885,11 +4350,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3900,11 +4369,11 @@ fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 -$as_echo "$CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3917,11 +4386,12 @@ if test -z "$CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -3929,11 +4399,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3944,11 +4418,11 @@ fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 -$as_echo "$ac_ct_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3960,8 +4434,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -3969,25 +4443,129 @@ esac fi fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. -$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 -for ac_option in --version -v -V -qversion; do +for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -3997,7 +4575,7 @@ $as_echo "$ac_try_echo"; } >&5 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done @@ -4005,7 +4583,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -4017,9 +4595,9 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 -$as_echo_n "checking whether the C compiler works... " >&6; } -ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" @@ -4040,11 +4618,12 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, @@ -4061,7 +4640,7 @@ do # certainly right. break;; *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -4077,44 +4656,46 @@ do done test "$ac_cv_exeext" = no && ac_cv_exeext= -else +else $as_nop ac_file='' fi -if test -z "$ac_file"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -$as_echo "$as_me: failed program was:" >&5 +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 -$as_echo_n "checking for C compiler default output file name... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 -$as_echo "$ac_file" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 -$as_echo_n "checking for suffix of executables... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with @@ -4128,15 +4709,15 @@ for ac_file in conftest.exe conftest conftest.*; do * ) break;; esac done -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 -$as_echo "$ac_cv_exeext" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext @@ -4145,7 +4726,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; @@ -4157,8 +4738,8 @@ _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 -$as_echo_n "checking whether we are cross compiling... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in @@ -4166,10 +4747,10 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in @@ -4177,39 +4758,40 @@ $as_echo "$ac_try_echo"; } >&5 *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "cannot run C compiled programs. + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 -$as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -4223,11 +4805,12 @@ case "(($ac_try" in *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then : + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in @@ -4236,31 +4819,32 @@ $as_echo "$ac_try_echo"; } >&5 break;; esac done -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 -$as_echo "$ac_cv_objext" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 -$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { #ifndef __GNUC__ choke me @@ -4270,29 +4854,33 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_compiler_gnu=yes -else +else $as_nop ac_compiler_gnu=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 -$as_echo "$ac_cv_c_compiler_gnu" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi -ac_test_CFLAGS=${CFLAGS+set} +ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 -$as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no @@ -4301,57 +4889,60 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_g=yes -else +else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_g=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 -$as_echo "$ac_cv_prog_cc_g" >&6; } -if test "$ac_test_CFLAGS" = set; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then @@ -4366,95 +4957,145 @@ else CFLAGS= fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 -$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -struct stat; -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -std is added to get - proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an - array size at least. It's necessary to write '\x00'==0 to get something - that's true only with -std. */ -int osf4_cc_array ['\x00' == 0 ? 1 : -1]; +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi -/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters - inside strings and character constants. */ -#define FOO(x) 'x' -int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi -int test (int i, double x); -struct s1 {int (*f) (int a);}; -struct s2 {int (*f) (double a);}; -int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); -int argc; -char **argv; -int -main () -{ -return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; - ; - return 0; -} +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program _ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" - if ac_fn_c_try_compile "$LINENO"; then : + if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_c89=$ac_arg fi -rm -f core conftest.err conftest.$ac_objext +rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC +fi +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c89" in - x) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c89" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 -$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; -esac -if test "x$ac_cv_prog_cc_c89" != xno; then : - -fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -4462,11 +5103,12 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +printf %s "checking for a sed that does not truncate output... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" @@ -4480,10 +5122,15 @@ else for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in sed gsed + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + ac_path_SED="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED @@ -4492,13 +5139,13 @@ case `"$ac_path_SED" --version 2>&1` in ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 - $as_echo_n 0123456789 >"conftest.in" + printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" + printf "%s\n" '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -4526,8 +5173,8 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +printf "%s\n" "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed @@ -4544,11 +5191,12 @@ Xsed="$SED -e 1s/^X//" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST @@ -4556,10 +5204,15 @@ else for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP @@ -4568,13 +5221,13 @@ case `"$ac_path_GREP" --version 2>&1` in ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 - $as_echo_n 0123456789 >"conftest.in" + printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" + printf "%s\n" 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -4602,16 +5255,17 @@ else fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else @@ -4622,10 +5276,15 @@ else for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP @@ -4634,13 +5293,13 @@ case `"$ac_path_EGREP" --version 2>&1` in ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 - $as_echo_n 0123456789 >"conftest.in" + printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -4669,16 +5328,17 @@ fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if ${ac_cv_path_FGREP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +printf %s "checking for fgrep... " >&6; } +if test ${ac_cv_path_FGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else @@ -4689,10 +5349,15 @@ else for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in fgrep + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP @@ -4701,13 +5366,13 @@ case `"$ac_path_FGREP" --version 2>&1` in ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 - $as_echo_n 0123456789 >"conftest.in" + printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" + printf "%s\n" 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val @@ -4736,8 +5401,8 @@ fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +printf "%s\n" "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" @@ -4762,17 +5427,18 @@ test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then : +if test ${with_gnu_ld+y} +then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes -else +else $as_nop with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw @@ -4801,15 +5467,16 @@ $as_echo_n "checking for ld used by $CC... " >&6; } ;; esac elif test yes = "$with_gnu_ld"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } fi -if ${lt_cv_path_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do @@ -4838,18 +5505,19 @@ fi LD=$lt_cv_path_LD if test -n "$LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 -$as_echo "$LD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +printf "%s\n" "$LD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if ${lt_cv_prog_gnu_ld+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld @@ -4872,11 +5540,12 @@ with_gnu_ld=$lt_cv_prog_gnu_ld -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if ${lt_cv_path_NM+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test ${lt_cv_path_NM+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM @@ -4926,8 +5595,8 @@ else : ${lt_cv_path_NM=no} fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +printf "%s\n" "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else @@ -4940,11 +5609,12 @@ else do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else @@ -4952,11 +5622,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -4967,11 +5641,11 @@ fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +printf "%s\n" "$DUMPBIN" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -4984,11 +5658,12 @@ if test -z "$DUMPBIN"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else @@ -4996,11 +5671,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5011,11 +5690,11 @@ fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +printf "%s\n" "$ac_ct_DUMPBIN" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5027,8 +5706,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN @@ -5056,11 +5735,12 @@ test -z "$NM" && NM=nm -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if ${lt_cv_nm_interface+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +printf %s "checking the name lister ($NM) interface... " >&6; } +if test ${lt_cv_nm_interface+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) @@ -5076,26 +5756,27 @@ else fi rm -f conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +printf "%s\n" "$lt_cv_nm_interface" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 -$as_echo_n "checking the maximum length of command line arguments... " >&6; } -if ${lt_cv_sys_max_cmd_len+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +printf %s "checking the maximum length of command line arguments... " >&6; } +if test ${lt_cv_sys_max_cmd_len+y} +then : + printf %s "(cached) " >&6 +else $as_nop i=0 teststring=ABCD @@ -5222,11 +5903,11 @@ else fi if test -n "$lt_cv_sys_max_cmd_len"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 -$as_echo "$lt_cv_sys_max_cmd_len" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len @@ -5270,11 +5951,12 @@ esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if ${lt_cv_to_host_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +printf %s "checking how to convert $build file names to $host format... " >&6; } +if test ${lt_cv_to_host_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $host in *-*-mingw* ) case $build in @@ -5310,18 +5992,19 @@ esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if ${lt_cv_to_tool_file_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +printf %s "checking how to convert $build file names to toolchain format... " >&6; } +if test ${lt_cv_to_tool_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in @@ -5337,22 +6020,23 @@ esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if ${lt_cv_ld_reload_flag+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +printf %s "checking for $LD option to reload object files... " >&6; } +if test ${lt_cv_ld_reload_flag+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ld_reload_flag='-r' fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; @@ -5385,11 +6069,12 @@ esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else @@ -5397,11 +6082,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5412,11 +6101,11 @@ fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5425,11 +6114,12 @@ if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else @@ -5437,11 +6127,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5452,11 +6146,11 @@ fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then @@ -5464,8 +6158,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP @@ -5484,11 +6178,12 @@ test -z "$OBJDUMP" && OBJDUMP=objdump -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if ${lt_cv_deplibs_check_method+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +printf %s "checking how to recognize dependent libraries... " >&6; } +if test ${lt_cv_deplibs_check_method+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' @@ -5684,8 +6379,8 @@ os2*) esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no @@ -5729,11 +6424,12 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else @@ -5741,11 +6437,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5756,11 +6456,11 @@ fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5769,11 +6469,12 @@ if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else @@ -5781,11 +6482,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5796,11 +6501,11 @@ fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then @@ -5808,8 +6513,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL @@ -5829,11 +6534,12 @@ test -z "$DLLTOOL" && DLLTOOL=dlltool -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +printf %s "checking how to associate runtime and link libraries... " >&6; } +if test ${lt_cv_sharedlib_from_linklib_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in @@ -5856,8 +6562,8 @@ cygwin* | mingw* | pw32* | cegcc*) esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO @@ -5873,11 +6579,12 @@ if test -n "$ac_tool_prefix"; then do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else @@ -5885,11 +6592,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5900,11 +6611,11 @@ fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 -$as_echo "$AR" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5917,11 +6628,12 @@ if test -z "$AR"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_AR+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else @@ -5929,11 +6641,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5944,11 +6660,11 @@ fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 -$as_echo "$ac_ct_AR" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5960,8 +6676,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR @@ -5981,30 +6697,32 @@ fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if ${lt_cv_ar_at_file+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +printf %s "checking for archiver @FILE support... " >&6; } +if test ${lt_cv_ar_at_file+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. @@ -6012,7 +6730,7 @@ if ac_fn_c_try_compile "$LINENO"; then : { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ @@ -6021,11 +6739,11 @@ if ac_fn_c_try_compile "$LINENO"; then : rm -f conftest.* libconftest.a fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +printf "%s\n" "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= @@ -6042,11 +6760,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else @@ -6054,11 +6773,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6069,11 +6792,11 @@ fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6082,11 +6805,12 @@ if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_STRIP+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else @@ -6094,11 +6818,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6109,11 +6837,11 @@ fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then @@ -6121,8 +6849,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP @@ -6141,11 +6869,12 @@ test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else @@ -6153,11 +6882,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6168,11 +6901,11 @@ fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 -$as_echo "$RANLIB" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6181,11 +6914,12 @@ if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else @@ -6193,11 +6927,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6208,11 +6946,11 @@ fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 -$as_echo "$ac_ct_RANLIB" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then @@ -6220,8 +6958,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB @@ -6285,11 +7023,12 @@ for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else @@ -6297,11 +7036,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6312,11 +7055,11 @@ fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6352,11 +7095,12 @@ compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if ${lt_cv_sys_global_symbol_pipe+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +printf %s "checking command to parse $NM output from $compiler object... " >&6; } +if test ${lt_cv_sys_global_symbol_pipe+y} +then : + printf %s "(cached) " >&6 +else $as_nop # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] @@ -6508,14 +7252,14 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then @@ -6584,7 +7328,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi @@ -6619,11 +7363,11 @@ if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 -$as_echo "failed" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +printf "%s\n" "failed" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +printf "%s\n" "ok" >&6; } fi # Response file support. @@ -6669,13 +7413,14 @@ fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +printf %s "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : +if test ${with_sysroot+y} +then : withval=$with_sysroot; -else +else $as_nop with_sysroot=no fi @@ -6693,24 +7438,25 @@ case $with_sysroot in #( no|'') ;; #( *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 -$as_echo "$with_sysroot" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +printf "%s\n" "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +printf "%s\n" "${lt_sysroot:-no}" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 -$as_echo_n "checking for a working dd... " >&6; } -if ${ac_cv_path_lt_DD+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +printf %s "checking for a working dd... " >&6; } +if test ${ac_cv_path_lt_DD+y} +then : + printf %s "(cached) " >&6 +else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} @@ -6721,10 +7467,15 @@ if test -z "$lt_DD"; then for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in dd; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in dd + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ @@ -6744,15 +7495,16 @@ fi rm -f conftest.i conftest2.i conftest.out fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 -$as_echo "$ac_cv_path_lt_DD" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +printf "%s\n" "$ac_cv_path_lt_DD" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 -$as_echo_n "checking how to truncate binary pipes... " >&6; } -if ${lt_cv_truncate_bin+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +printf %s "checking how to truncate binary pipes... " >&6; } +if test ${lt_cv_truncate_bin+y} +then : + printf %s "(cached) " >&6 +else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= @@ -6763,8 +7515,8 @@ fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 -$as_echo "$lt_cv_truncate_bin" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +printf "%s\n" "$lt_cv_truncate_bin" >&6; } @@ -6787,7 +7539,8 @@ func_cc_basename () } # Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : +if test ${enable_libtool_lock+y} +then : enableval=$enable_libtool_lock; fi @@ -6803,7 +7556,7 @@ ia64-*-hpux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) @@ -6823,7 +7576,7 @@ ia64-*-hpux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in @@ -6861,7 +7614,7 @@ mips64*-*linux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in @@ -6902,7 +7655,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) @@ -6965,11 +7718,12 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if ${lt_cv_cc_needs_belf+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +printf %s "checking whether the C compiler needs -belf... " >&6; } +if test ${lt_cv_cc_needs_belf+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -6980,19 +7734,20 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_cc_needs_belf=yes -else +else $as_nop lt_cv_cc_needs_belf=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -7001,8 +7756,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS @@ -7015,7 +7770,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; } if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) @@ -7052,11 +7807,12 @@ need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else @@ -7064,11 +7820,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7079,11 +7839,11 @@ fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +printf "%s\n" "$MANIFEST_TOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7092,11 +7852,12 @@ if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else @@ -7104,11 +7865,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7119,11 +7884,11 @@ fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then @@ -7131,8 +7896,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL @@ -7142,11 +7907,12 @@ else fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if ${lt_cv_path_mainfest_tool+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if test ${lt_cv_path_mainfest_tool+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out @@ -7156,8 +7922,8 @@ else fi rm -f conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi @@ -7172,11 +7938,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else @@ -7184,11 +7951,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7199,11 +7970,11 @@ fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 -$as_echo "$DSYMUTIL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +printf "%s\n" "$DSYMUTIL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7212,11 +7983,12 @@ if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else @@ -7224,11 +7996,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7239,11 +8015,11 @@ fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 -$as_echo "$ac_ct_DSYMUTIL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then @@ -7251,8 +8027,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL @@ -7264,11 +8040,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else @@ -7276,11 +8053,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7291,11 +8072,11 @@ fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 -$as_echo "$NMEDIT" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +printf "%s\n" "$NMEDIT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7304,11 +8085,12 @@ if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else @@ -7316,11 +8098,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7331,11 +8117,11 @@ fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 -$as_echo "$ac_ct_NMEDIT" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +printf "%s\n" "$ac_ct_NMEDIT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then @@ -7343,8 +8129,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT @@ -7356,11 +8142,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else @@ -7368,11 +8155,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7383,11 +8174,11 @@ fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +printf "%s\n" "$LIPO" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7396,11 +8187,12 @@ if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_LIPO+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else @@ -7408,11 +8200,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7423,11 +8219,11 @@ fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +printf "%s\n" "$ac_ct_LIPO" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then @@ -7435,8 +8231,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO @@ -7448,11 +8244,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else @@ -7460,11 +8257,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7475,11 +8276,11 @@ fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +printf "%s\n" "$OTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7488,11 +8289,12 @@ if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else @@ -7500,11 +8302,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7515,11 +8321,11 @@ fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +printf "%s\n" "$ac_ct_OTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then @@ -7527,8 +8333,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL @@ -7540,11 +8346,12 @@ fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else @@ -7552,11 +8359,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7567,11 +8378,11 @@ fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +printf "%s\n" "$OTOOL64" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7580,11 +8391,12 @@ if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else @@ -7592,11 +8404,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7607,11 +8423,11 @@ fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +printf "%s\n" "$ac_ct_OTOOL64" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then @@ -7619,8 +8435,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 @@ -7655,11 +8471,12 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 -$as_echo_n "checking for -single_module linker flag... " >&6; } -if ${lt_cv_apple_cc_single_mod+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +printf %s "checking for -single_module linker flag... " >&6; } +if test ${lt_cv_apple_cc_single_mod+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override @@ -7688,14 +8505,15 @@ else rm -f conftest.* fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 -$as_echo "$lt_cv_apple_cc_single_mod" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 -$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } -if ${lt_cv_ld_exported_symbols_list+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +printf %s "checking for -exported_symbols_list linker flag... " >&6; } +if test ${lt_cv_ld_exported_symbols_list+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym @@ -7704,31 +8522,33 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_ld_exported_symbols_list=yes -else +else $as_nop lt_cv_ld_exported_symbols_list=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 -$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if ${lt_cv_ld_force_load+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +printf %s "checking for -force_load linker flag... " >&6; } +if test ${lt_cv_ld_force_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} @@ -7756,8 +8576,8 @@ _LT_EOF rm -rf conftest.dSYM fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +printf "%s\n" "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; @@ -7828,285 +8648,42 @@ func_munge_path_list () esac } -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 -$as_echo_n "checking how to run the C preprocessor... " >&6; } -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : - $as_echo_n "(cached) " >&6 -else - # Double quotes because CPP needs to be expanded - for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" - do - ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - - done - ac_cv_prog_CPP=$CPP - -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 -$as_echo "$CPP" >&6; } -ac_preproc_ok=false -for ac_c_preproc_warn_flag in '' yes +ac_header= ac_cache= +for ac_item in $ac_header_c_list do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - -else - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.i conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # Broken: success on invalid input. -continue -else - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.i conftest.$ac_ext - + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.i conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } -fi - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 -$as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdc=yes -else - ac_cv_header_stdc=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then : - -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : -else - ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 -$as_echo "$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then -$as_echo "#define STDC_HEADERS 1" >>confdefs.h -fi -# On IRIX 5.3, sys/types and inttypes.h are conflicting. -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF -fi -done +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default -" -if test "x$ac_cv_header_dlfcn_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes +then : + printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h -done +fi @@ -8123,7 +8700,8 @@ done # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : +if test ${enable_shared+y} +then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; @@ -8141,7 +8719,7 @@ if test "${enable_shared+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop enable_shared=yes fi @@ -8154,7 +8732,8 @@ fi # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : +if test ${enable_static+y} +then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; @@ -8172,7 +8751,7 @@ if test "${enable_static+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop enable_static=yes fi @@ -8186,7 +8765,8 @@ fi # Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : +if test ${with_pic+y} +then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; @@ -8203,7 +8783,7 @@ if test "${with_pic+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop pic_mode=default fi @@ -8215,7 +8795,8 @@ fi # Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then : +if test ${enable_fast_install+y} +then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; @@ -8233,7 +8814,7 @@ if test "${enable_fast_install+set}" = set; then : IFS=$lt_save_ifs ;; esac -else +else $as_nop enable_fast_install=yes fi @@ -8247,11 +8828,12 @@ fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 -$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +printf %s "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. -if test "${with_aix_soname+set}" = set; then : +if test ${with_aix_soname+y} +then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; @@ -8260,18 +8842,19 @@ if test "${with_aix_soname+set}" = set; then : ;; esac lt_cv_with_aix_soname=$with_aix_soname -else - if ${lt_cv_with_aix_soname+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + if test ${lt_cv_with_aix_soname+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 -$as_echo "$with_aix_soname" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +printf "%s\n" "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', @@ -8353,11 +8936,12 @@ if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if ${lt_cv_objdir+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +printf %s "checking for objdir... " >&6; } +if test ${lt_cv_objdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then @@ -8368,17 +8952,15 @@ else fi rmdir .libs 2>/dev/null fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +printf "%s\n" "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF +printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h @@ -8424,11 +9006,12 @@ test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +printf %s "checking for ${ac_tool_prefix}file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. @@ -8477,11 +9060,11 @@ fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8490,11 +9073,12 @@ fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if ${lt_cv_path_MAGIC_CMD+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +printf %s "checking for file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. @@ -8543,11 +9127,11 @@ fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8632,11 +9216,12 @@ if test yes = "$GCC"; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 -$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } -if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test ${lt_cv_prog_compiler_rtti_exceptions+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -8667,8 +9252,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 -$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" @@ -9025,26 +9610,28 @@ case $host_os in ;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if ${lt_cv_prog_compiler_pic+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 -$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } -if ${lt_cv_prog_compiler_pic_works+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext @@ -9075,8 +9662,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 -$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in @@ -9104,11 +9691,12 @@ fi # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 -$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } -if ${lt_cv_prog_compiler_static_works+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" @@ -9132,8 +9720,8 @@ else LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 -$as_echo "$lt_cv_prog_compiler_static_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : @@ -9147,11 +9735,12 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest @@ -9194,19 +9783,20 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if ${lt_cv_prog_compiler_c_o+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest @@ -9249,8 +9839,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } @@ -9258,19 +9848,19 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 -$as_echo_n "checking if we can lock with hard links... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 -$as_echo "$hard_links" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 -$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else @@ -9282,8 +9872,8 @@ fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 -$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= @@ -9841,21 +10431,23 @@ _LT_EOF if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -9870,7 +10462,7 @@ if ac_fn_c_try_link "$LINENO"; then : lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib @@ -9894,21 +10486,23 @@ fi if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else - if ${lt_cv_aix_libpath_+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -9923,7 +10517,7 @@ if ac_fn_c_try_link "$LINENO"; then : lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib @@ -10174,11 +10768,12 @@ fi # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if ${lt_cv_prog_compiler__b+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +printf %s "checking if $CC understands -b... " >&6; } +if test ${lt_cv_prog_compiler__b+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" @@ -10202,8 +10797,8 @@ else LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' @@ -10243,28 +10838,30 @@ fi # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if ${lt_cv_irix_exported_symbol+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if test ${lt_cv_irix_exported_symbol+y} +then : + printf %s "(cached) " >&6 +else $as_nop save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_irix_exported_symbol=yes -else +else $as_nop lt_cv_irix_exported_symbol=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi @@ -10545,8 +11142,8 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 -$as_echo "$ld_shlibs" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +printf "%s\n" "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld @@ -10582,18 +11179,19 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 -$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if ${lt_cv_archive_cmds_need_lc+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc+y} +then : + printf %s "(cached) " >&6 +else $as_nop $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest @@ -10611,7 +11209,7 @@ else if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no @@ -10625,8 +11223,8 @@ else $RM conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac @@ -10785,8 +11383,8 @@ esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 -$as_echo_n "checking dynamic linker characteristics... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in @@ -11347,9 +11945,10 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH - if ${lt_cv_shlibpath_overrides_runpath+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir @@ -11359,19 +11958,21 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : +if ac_fn_c_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : lt_cv_shlibpath_overrides_runpath=yes fi fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir @@ -11615,8 +12216,8 @@ uts4*) dynamic_linker=no ;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 -$as_echo "$dynamic_linker" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" @@ -11737,8 +12338,8 @@ configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 -$as_echo_n "checking how to hardcode library paths into programs... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || @@ -11762,8 +12363,8 @@ else # directories. hardcode_action=unsupported fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 -$as_echo "$hardcode_action" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +printf "%s\n" "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then @@ -11807,11 +12408,12 @@ else darwin*) # if libdl is installed we need to link against it - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -11820,32 +12422,31 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dlopen (); int -main () +main (void) { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dl_dlopen=yes -else +else $as_nop ac_cv_lib_dl_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else +else $as_nop lt_cv_dlopen=dyld lt_cv_dlopen_libs= @@ -11865,14 +12466,16 @@ fi *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" -if test "x$ac_cv_func_shl_load" = xyes; then : +if test "x$ac_cv_func_shl_load" = xyes +then : lt_cv_dlopen=shl_load -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 -$as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +printf %s "checking for shl_load in -ldld... " >&6; } +if test ${ac_cv_lib_dld_shl_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -11881,41 +12484,42 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char shl_load (); int -main () +main (void) { return shl_load (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dld_shl_load=yes -else +else $as_nop ac_cv_lib_dld_shl_load=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 -$as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes +then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld -else +else $as_nop ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : +if test "x$ac_cv_func_dlopen" = xyes +then : lt_cv_dlopen=dlopen -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -11924,37 +12528,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dlopen (); int -main () +main (void) { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dl_dlopen=yes -else +else $as_nop ac_cv_lib_dl_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 -$as_echo_n "checking for dlopen in -lsvld... " >&6; } -if ${ac_cv_lib_svld_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +printf %s "checking for dlopen in -lsvld... " >&6; } +if test ${ac_cv_lib_svld_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -11963,37 +12567,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dlopen (); int -main () +main (void) { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_svld_dlopen=yes -else +else $as_nop ac_cv_lib_svld_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 -$as_echo "$ac_cv_lib_svld_dlopen" >&6; } -if test "x$ac_cv_lib_svld_dlopen" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes +then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 -$as_echo_n "checking for dld_link in -ldld... " >&6; } -if ${ac_cv_lib_dld_dld_link+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +printf %s "checking for dld_link in -ldld... " >&6; } +if test ${ac_cv_lib_dld_dld_link+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -12002,30 +12606,29 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dld_link (); int -main () +main (void) { return dld_link (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dld_dld_link=yes -else +else $as_nop ac_cv_lib_dld_dld_link=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 -$as_echo "$ac_cv_lib_dld_dld_link" >&6; } -if test "x$ac_cv_lib_dld_dld_link" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes +then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi @@ -12064,11 +12667,12 @@ fi save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 -$as_echo_n "checking whether a program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +printf %s "checking whether a program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else @@ -12147,7 +12751,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? @@ -12165,16 +12769,17 @@ rm -fr conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 -$as_echo "$lt_cv_dlopen_self" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +printf "%s\n" "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 -$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } -if ${lt_cv_dlopen_self_static+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +printf %s "checking whether a statically linked program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self_static+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else @@ -12253,7 +12858,7 @@ _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? @@ -12271,8 +12876,8 @@ rm -fr conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 -$as_echo "$lt_cv_dlopen_self_static" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS @@ -12310,13 +12915,13 @@ fi striplib= old_striplib= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +printf %s "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in @@ -12324,16 +12929,16 @@ else if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi ;; *) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; esac fi @@ -12350,13 +12955,13 @@ fi # Report what library types will actually be built - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 -$as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 -$as_echo "$can_build_shared" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +printf %s "checking if libtool supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +printf "%s\n" "$can_build_shared" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 -$as_echo_n "checking whether to build shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +printf %s "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and @@ -12380,15 +12985,15 @@ $as_echo_n "checking whether to build shared libraries... " >&6; } fi ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 -$as_echo "$enable_shared" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +printf "%s\n" "$enable_shared" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 -$as_echo_n "checking whether to build static libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +printf %s "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 -$as_echo "$enable_static" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +printf "%s\n" "$enable_static" >&6; } @@ -12436,11 +13041,12 @@ case $host in #( do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DEP_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DEP_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DEP_CC"; then ac_cv_prog_DEP_CC="$DEP_CC" # Let the user override the test. else @@ -12448,11 +13054,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DEP_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -12463,11 +13073,11 @@ fi fi DEP_CC=$ac_cv_prog_DEP_CC if test -n "$DEP_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DEP_CC" >&5 -$as_echo "$DEP_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DEP_CC" >&5 +printf "%s\n" "$DEP_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -12480,11 +13090,12 @@ if test -z "$DEP_CC"; then do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DEP_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DEP_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DEP_CC"; then ac_cv_prog_ac_ct_DEP_CC="$ac_ct_DEP_CC" # Let the user override the test. else @@ -12492,11 +13103,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DEP_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -12507,11 +13122,11 @@ fi fi ac_ct_DEP_CC=$ac_cv_prog_ac_ct_DEP_CC if test -n "$ac_ct_DEP_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DEP_CC" >&5 -$as_echo "$ac_ct_DEP_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DEP_CC" >&5 +printf "%s\n" "$ac_ct_DEP_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -12523,8 +13138,8 @@ done else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DEP_CC=$ac_ct_DEP_CC @@ -12537,21 +13152,24 @@ esac case $enable_dependency_generation in #( yes) : - if test "$DEP_CC" = "false"; then : + if test "$DEP_CC" = "false" +then : as_fn_error $? "The MSVC ports cannot generate dependency information. Install gcc (or another CC-like compiler)" "$LINENO" 5 -else +else $as_nop compute_deps=true fi ;; #( no) : compute_deps=false ;; #( *) : - if test -e .git; then : - if test "$DEP_CC" = "false"; then : + if test -e .git +then : + if test "$DEP_CC" = "false" +then : compute_deps=false -else +else $as_nop compute_deps=true fi -else +else $as_nop compute_deps=false fi ;; esac @@ -12567,9 +13185,10 @@ case $host in #( libext=lib AR="" - if test "$host_cpu" = "x86_64" ; then : + if test "$host_cpu" = "x86_64" +then : machine="-machine:AMD64 " -else +else $as_nop machine="" fi mklib="link -lib -nologo $machine /out:\$(1) \$(2)" @@ -12581,11 +13200,144 @@ fi esac ## Find vendor of the C compiler +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +printf %s "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test ${ac_cv_prog_CPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CC needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +printf "%s\n" "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + - { $as_echo "$as_me:${as_lineno-$LINENO}: checking C compiler vendor" >&5 -$as_echo_n "checking C compiler vendor... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking C compiler vendor" >&5 +printf %s "checking C compiler vendor... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -12606,48 +13358,52 @@ unknown #endif _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - if ${ocaml_cv_cc_vendor+:} false; then : - $as_echo_n "(cached) " >&6 -else +if ac_fn_c_try_cpp "$LINENO" +then : + if test ${ocaml_cv_cc_vendor+y} +then : + printf %s "(cached) " >&6 +else $as_nop ocaml_cv_cc_vendor=`grep '^[a-z]' conftest.i | tr -s ' ' '-' \ | tr -d '\r'` fi -else - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "unexpected preprocessor failure See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.err conftest.i conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ocaml_cv_cc_vendor" >&5 -$as_echo "$ocaml_cv_cc_vendor" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ocaml_cv_cc_vendor" >&5 +printf "%s\n" "$ocaml_cv_cc_vendor" >&6; } ## In cross-compilation mode, can we run executables produced? # At the moment, it's required, but the fact is used in C99 function detection - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether host executables can be run in the build" >&5 -$as_echo_n "checking whether host executables can be run in the build... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether host executables can be run in the build" >&5 +printf %s "checking whether host executables can be run in the build... " >&6; } old_cross_compiling="$cross_compiling" cross_compiling='no' - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes +then : # autoconf displays a warning if this parameter is missing, but # cross-compilation mode was disabled above. assert=false -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) {return 0;} _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } host_runnable=true -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } host_runnable=false fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -12700,15 +13456,18 @@ case $host in #( esac otherlibraries="dynlink" -if test x"$enable_unix_lib" != "xno"; then : +if test x"$enable_unix_lib" != "xno" +then : enable_unix_lib=yes - if test x"$enable_bigarray_lib" != "xno"; then : + if test x"$enable_bigarray_lib" != "xno" +then : otherlibraries="$otherlibraries $unixlib bigarray" -else +else $as_nop otherlibraries="$otherlibraries $unixlib" fi fi -if test x"$enable_str_lib" != "xno"; then : +if test x"$enable_str_lib" != "xno" +then : otherlibraries="$otherlibraries str" fi @@ -12716,11 +13475,12 @@ fi ## Test whether #! scripts are supported ## TODO: have two values, one for host and one for target -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether #! works in shell scripts" >&5 -$as_echo_n "checking whether #! works in shell scripts... " >&6; } -if ${ac_cv_sys_interpreter+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether #! works in shell scripts" >&5 +printf %s "checking whether #! works in shell scripts... " >&6; } +if test ${ac_cv_sys_interpreter+y} +then : + printf %s "(cached) " >&6 +else $as_nop echo '#! /bin/cat exit 69 ' >conftest @@ -12733,42 +13493,46 @@ else fi rm -f conftest fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_interpreter" >&5 -$as_echo "$ac_cv_sys_interpreter" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_interpreter" >&5 +printf "%s\n" "$ac_cv_sys_interpreter" >&6; } interpval=$ac_cv_sys_interpreter long_shebang=false -if test "x$interpval" = "xyes"; then : +if test "x$interpval" = "xyes" +then : case $host in #( *-cygwin|*-*-mingw32|*-pc-windows) : shebangscripts=false ;; #( *) : shebangscripts=true prev_exec_prefix="$exec_prefix" - if test "x$exec_prefix" = "xNONE"; then : + if test "x$exec_prefix" = "xNONE" +then : exec_prefix="$prefix" fi eval "expanded_bindir=\"$bindir\"" exec_prefix="$prev_exec_prefix" # Assume maximum shebang is 128 chars; less #!, /ocamlrun, an optional # 1 char suffix and the \0 leaving 115 characters - if test "${#expanded_bindir}" -gt 115; then : + if test "${#expanded_bindir}" -gt 115 +then : long_shebang=true fi ;; esac -else +else $as_nop shebangscripts=false fi # Are we building a cross-compiler -if test x"$host" = x"$target"; then : +if test x"$host" = x"$target" +then : cross_compiler=false -else +else $as_nop cross_compiler=true fi @@ -12850,10 +13614,10 @@ esac ;; #( gcc-3-*|gcc-4-[01]) : # No -fwrapv option before GCC 3.4. # Known problems with -fwrapv fixed in 4.2 only. - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: This version of GCC is rather old. Reducing optimization level.\"" >&5 -$as_echo "$as_me: WARNING: This version of GCC is rather old. Reducing optimization level.\"" >&2;}; - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Consider using GCC version 4.2 or above." >&5 -$as_echo "$as_me: WARNING: Consider using GCC version 4.2 or above." >&2;}; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: This version of GCC is rather old. Reducing optimization level.\"" >&5 +printf "%s\n" "$as_me: WARNING: This version of GCC is rather old. Reducing optimization level.\"" >&2;}; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Consider using GCC version 4.2 or above." >&5 +printf "%s\n" "$as_me: WARNING: Consider using GCC version 4.2 or above." >&2;}; common_cflags="-std=gnu99 -O"; internal_cflags="$cc_warnings" ;; #( gcc-4-[234]) : @@ -12874,27 +13638,29 @@ $as_echo "$as_me: WARNING: Consider using GCC version 4.2 or above." >&2;}; common_cppflags="-D_CRT_SECURE_NO_DEPRECATE" internal_cppflags='-DUNICODE -D_UNICODE' - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports -d2VolatileMetadata-" >&5 -$as_echo_n "checking whether the C compiler supports -d2VolatileMetadata-... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports -d2VolatileMetadata-" >&5 +printf %s "checking whether the C compiler supports -d2VolatileMetadata-... " >&6; } saved_CFLAGS="$CFLAGS" CFLAGS="-d2VolatileMetadata- $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main() { return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : cl_has_volatile_metadata=true - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop cl_has_volatile_metadata=false - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$saved_CFLAGS" - if test "x$cl_has_volatile_metadata" = "xtrue"; then : + if test "x$cl_has_volatile_metadata" = "xtrue" +then : internal_cflags='-d2VolatileMetadata-' fi internal_cppflags="$internal_cppflags -DWINDOWS_UNICODE=" @@ -12940,7 +13706,8 @@ esac # [*-pc-windows], # [enable_shared=yes]) -if test x"$enable_shared" = "xno"; then : +if test x"$enable_shared" = "xno" +then : supports_shared_libraries=false case $host in #( *-pc-windows|*-w64-mingw32) : @@ -12948,7 +13715,7 @@ if test x"$enable_shared" = "xno"; then : *) : ;; esac -else +else $as_nop supports_shared_libraries=true fi @@ -12978,58 +13745,66 @@ case $host in #( ;; esac -if test x"$supports_shared_libraries" != 'xfalse'; then : +if test x"$supports_shared_libraries" != 'xfalse' +then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flexdll sources" >&5 -$as_echo_n "checking for flexdll sources... " >&6; } - if test x"$with_flexdll" = "xno"; then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for flexdll sources" >&5 +printf %s "checking for flexdll sources... " >&6; } + if test x"$with_flexdll" = "xno" +then : flexdir='' - { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 -$as_echo "disabled" >&6; } -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 +printf "%s\n" "disabled" >&6; } +else $as_nop flexmsg='' case $target in #( *-*-cygwin*|*-w64-mingw32|*-pc-windows) : - if test x"$with_flexdll" = 'x' -o x"$with_flexdll" = 'xflexdll'; then : - if test -f 'flexdll/flexdll.h'; then : + if test x"$with_flexdll" = 'x' -o x"$with_flexdll" = 'xflexdll' +then : + if test -f 'flexdll/flexdll.h' +then : flexdir=flexdll iflexdir='$(ROOTDIR)/flexdll' with_flexdll="$iflexdir" -else - if test x"$with_flexdll" != 'x'; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: requested but not available" >&5 -$as_echo "requested but not available" >&6; } +else $as_nop + if test x"$with_flexdll" != 'x' +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: requested but not available" >&5 +printf "%s\n" "requested but not available" >&6; } as_fn_error $? "exiting" "$LINENO" 5 fi fi -else +else $as_nop rm -rf flexdll-sources - if test -f "$with_flexdll/flexdll.h"; then : + if test -f "$with_flexdll/flexdll.h" +then : mkdir -p flexdll-sources cp -r "$with_flexdll"/* flexdll-sources/ flexdir='flexdll-sources' iflexdir='$(ROOTDIR)/flexdll-sources' flexmsg=" (from $with_flexdll)" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: requested but not available" >&5 -$as_echo "requested but not available" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: requested but not available" >&5 +printf "%s\n" "requested but not available" >&6; } as_fn_error $? "exiting" "$LINENO" 5 fi fi - if test x"$flexdir" = 'x'; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $iflexdir$flexmsg" >&5 -$as_echo "$iflexdir$flexmsg" >&6; } + if test x"$flexdir" = 'x' +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $iflexdir$flexmsg" >&5 +printf "%s\n" "$iflexdir$flexmsg" >&6; } bootstrapping_flexdll=true # The submodule should be searched *before* any other -I paths internal_cppflags="-I $iflexdir $internal_cppflags" fi ;; #( *) : - if test x"$with_flexdll" != 'x'; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: requested but not supported" >&5 -$as_echo "requested but not supported" >&6; } + if test x"$with_flexdll" != 'x' +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: requested but not supported" >&5 +printf "%s\n" "requested but not supported" >&6; } as_fn_error $? "exiting" "$LINENO" 5 fi ;; esac @@ -13037,11 +13812,12 @@ fi # Extract the first word of "flexlink", so it can be a program name with args. set dummy flexlink; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_flexlink+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_flexlink+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$flexlink"; then ac_cv_prog_flexlink="$flexlink" # Let the user override the test. else @@ -13049,11 +13825,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_flexlink="flexlink" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -13064,16 +13844,17 @@ fi fi flexlink=$ac_cv_prog_flexlink if test -n "$flexlink"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flexlink" >&5 -$as_echo "$flexlink" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $flexlink" >&5 +printf "%s\n" "$flexlink" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test -n "$flexlink" -a -z "$flexdir"; then : + if test -n "$flexlink" -a -z "$flexdir" +then : @@ -13089,14 +13870,15 @@ fi touch confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $flexlink works" >&5 -$as_echo_n "checking whether $flexlink works... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $flexlink works" >&5 +printf %s "checking whether $flexlink works... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int answer = 42; _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : # Create conftest1.$ac_objext as a symlink on Cygwin to ensure that native # flexlink can cope. The reverse test is unnecessary (a Cygwin-compiled # flexlink can read anything). @@ -13116,22 +13898,23 @@ esac /* end confdefs.h. */ int main() { return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +if ac_fn_c_try_link "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } as_fn_error $? "$flexlink does not work" "$LINENO" 5 fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: unexpected compile error" >&5 -$as_echo "unexpected compile error" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unexpected compile error" >&5 +printf "%s\n" "unexpected compile error" >&6; } as_fn_error $? "error calling the C compiler" "$LINENO" 5 fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # Restore the content of confdefs.h @@ -13148,7 +13931,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext case $host in #( *-w64-mingw32|*-pc-windows) : flexlink_where="$(cmd /c "$flexlink" -where 2>/dev/null)" - if test -z "$flexlink_where"; then : + if test -z "$flexlink_where" +then : as_fn_error $? "$flexlink is not executable from a native Win32 process" "$LINENO" 5 fi ;; #( @@ -13172,20 +13956,23 @@ fi touch confdefs.h - if test -n "$flexdir"; then : + if test -n "$flexdir" +then : CPPFLAGS="-I $flexdir $CPPFLAGS" fi have_flexdll_h=no - ac_fn_c_check_header_mongrel "$LINENO" "flexdll.h" "ac_cv_header_flexdll_h" "$ac_includes_default" -if test "x$ac_cv_header_flexdll_h" = xyes; then : + ac_fn_c_check_header_compile "$LINENO" "flexdll.h" "ac_cv_header_flexdll_h" "$ac_includes_default" +if test "x$ac_cv_header_flexdll_h" = xyes +then : have_flexdll_h=yes -else +else $as_nop have_flexdll_h=no fi - - if test x"$have_flexdll_h" = 'xno'; then : - if test -n "$flexdir"; then : + if test x"$have_flexdll_h" = 'xno' +then : + if test -n "$flexdir" +then : as_fn_error $? "$flexdir/flexdll.h appears unusable" "$LINENO" 5 fi fi @@ -13202,7 +13989,8 @@ fi - if test -n "$flexlink" -a x"$have_flexdll_h" = 'xno'; then : + if test -n "$flexlink" -a x"$have_flexdll_h" = 'xno' +then : saved_CC="$CC" @@ -13217,8 +14005,8 @@ fi touch confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if \"$flexlink -where\" includes flexdll.h" >&5 -$as_echo_n "checking if \"$flexlink -where\" includes flexdll.h... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if \"$flexlink -where\" includes flexdll.h" >&5 +printf %s "checking if \"$flexlink -where\" includes flexdll.h... " >&6; } flexlink_where="$($flexlink -where | tr -d '\r')" CPPFLAGS="$CPPFLAGS -I \"$flexlink_where\"" cat > conftest.c <<"EOF" @@ -13229,13 +14017,14 @@ EOF all: $CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.c $LIBS EOF - if make -f conftest.Makefile >/dev/null 2>/dev/null; then : + if make -f conftest.Makefile >/dev/null 2>/dev/null +then : have_flexdll_h=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -13249,7 +14038,8 @@ fi LIBS="$saved_LIBS" - if test "x$have_flexdll_h" = 'xyes'; then : + if test "x$have_flexdll_h" = 'xyes' +then : internal_cppflags="$internal_cppflags -I \"$flexlink_where\"" fi @@ -13260,8 +14050,8 @@ fi case $have_flexdll_h,$supports_shared_libraries,$host in #( no,true,*-*-cygwin*) : supports_shared_libraries=false - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: flexdll.h not found: shared library support disabled." >&5 -$as_echo "$as_me: WARNING: flexdll.h not found: shared library support disabled." >&2;} ;; #( + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: flexdll.h not found: shared library support disabled." >&5 +printf "%s\n" "$as_me: WARNING: flexdll.h not found: shared library support disabled." >&2;} ;; #( no,*,*-w64-mingw32|no,*,*-pc-windows) : as_fn_error $? "flexdll.h is required for native Win32" "$LINENO" 5 ;; #( *) : @@ -13271,8 +14061,8 @@ esac case $flexdir,$supports_shared_libraries,$flexlink,$host in #( ,true,,*-*-cygwin*) : supports_shared_libraries=false - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: flexlink not found: shared library support disabled." >&5 -$as_echo "$as_me: WARNING: flexlink not found: shared library support disabled." >&2;} ;; #( + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: flexlink not found: shared library support disabled." >&5 +printf "%s\n" "$as_me: WARNING: flexlink not found: shared library support disabled." >&2;} ;; #( ,*,,*-w64-mingw32|,*,,*-pc-windows) : as_fn_error $? "flexlink is required for native Win32" "$LINENO" 5 ;; #( *) : @@ -13282,16 +14072,17 @@ esac case $cc_basename,$host in #( *,*-*-darwin*) : mkexe="$mkexe -Wl,-no_compact_unwind"; - $as_echo "#define HAS_ARCH_CODE32 1" >>confdefs.h + printf "%s\n" "#define HAS_ARCH_CODE32 1" >>confdefs.h ;; #( *,*-*-haiku*) : mathlib="" ;; #( *,*-*-cygwin*) : common_cppflags="$common_cppflags -U_WIN32" - if $supports_shared_libraries; then : + if $supports_shared_libraries +then : mkexe='$(FLEXLINK) -exe $(if $(OC_LDFLAGS),-link "$(OC_LDFLAGS)")' mkexedebugflag="-link -g" -else +else $as_nop mkexe="$mkexe -Wl,--stack,16777216" oc_ldflags="-Wl,--stack,16777216" @@ -13317,12 +14108,12 @@ esac oc_ldflags='/ENTRY:wmainCRTStartup' mkexedebugflag='' ;; #( *,x86_64-*-linux*) : - $as_echo "#define HAS_ARCH_CODE32 1" >>confdefs.h + printf "%s\n" "#define HAS_ARCH_CODE32 1" >>confdefs.h ;; #( xlc*,powerpc-ibm-aix*) : mkexe="$mkexe " oc_ldflags="-brtl -bexpfull" - $as_echo "#define HAS_ARCH_CODE32 1" >>confdefs.h + printf "%s\n" "#define HAS_ARCH_CODE32 1" >>confdefs.h ;; #( gcc*,powerpc-*-linux*) : oc_ldflags="-mbss-plt" ;; #( @@ -13332,7 +14123,8 @@ esac ## Program to use to install files -# Find a good install program. We prefer a C program (faster), + + # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install @@ -13346,20 +14138,25 @@ esac # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in #(( + ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; @@ -13369,13 +14166,13 @@ case $as_dir/ in #(( # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else @@ -13383,12 +14180,12 @@ case $as_dir/ in #(( echo one > conftest.one echo two > conftest.two mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi @@ -13404,7 +14201,7 @@ IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi - if test "${ac_cv_path_install+set}" = set; then + if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a @@ -13414,8 +14211,8 @@ fi INSTALL=$ac_install_sh fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. @@ -13429,11 +14226,12 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' # Checks for libraries ## Mathematical library -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 -$as_echo_n "checking for cos in -lm... " >&6; } -if ${ac_cv_lib_m_cos+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +printf %s "checking for cos in -lm... " >&6; } +if test ${ac_cv_lib_m_cos+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13442,102 +14240,97 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char cos (); int -main () +main (void) { return cos (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_m_cos=yes -else +else $as_nop ac_cv_lib_m_cos=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 -$as_echo "$ac_cv_lib_m_cos" >&6; } -if test "x$ac_cv_lib_m_cos" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LIBM 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 +printf "%s\n" "$ac_cv_lib_m_cos" >&6; } +if test "x$ac_cv_lib_m_cos" = xyes +then : + printf "%s\n" "#define HAVE_LIBM 1" >>confdefs.h LIBS="-lm $LIBS" fi -if test "x$ac_cv_lib_m_cos" = xyes ; then : +if test "x$ac_cv_lib_m_cos" = xyes +then : mathlib="-lm" -else +else $as_nop mathlib="" fi # Checks for header files -ac_fn_c_check_header_mongrel "$LINENO" "math.h" "ac_cv_header_math_h" "$ac_includes_default" -if test "x$ac_cv_header_math_h" = xyes; then : +ac_fn_c_check_header_compile "$LINENO" "math.h" "ac_cv_header_math_h" "$ac_includes_default" +if test "x$ac_cv_header_math_h" = xyes +then : fi - -for ac_header in unistd.h + for ac_header in unistd.h do : - ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" -if test "x$ac_cv_header_unistd_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_UNISTD_H 1 -_ACEOF - $as_echo "#define HAS_UNISTD 1" >>confdefs.h + ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +if test "x$ac_cv_header_unistd_h" = xyes +then : + printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h + printf "%s\n" "#define HAS_UNISTD 1" >>confdefs.h fi done - -ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" -if test "x$ac_cv_header_stdint_h" = xyes; then : - $as_echo "#define HAS_STDINT_H 1" >>confdefs.h +ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes +then : + printf "%s\n" "#define HAS_STDINT_H 1" >>confdefs.h fi - ac_fn_c_check_header_compile "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "#include " -if test "x$ac_cv_header_dirent_h" = xyes; then : - $as_echo "#define HAS_DIRENT 1" >>confdefs.h +if test "x$ac_cv_header_dirent_h" = xyes +then : + printf "%s\n" "#define HAS_DIRENT 1" >>confdefs.h fi - ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "#include " -if test "x$ac_cv_header_sys_select_h" = xyes; then : - $as_echo "#define HAS_SYS_SELECT_H 1" >>confdefs.h +if test "x$ac_cv_header_sys_select_h" = xyes +then : + printf "%s\n" "#define HAS_SYS_SELECT_H 1" >>confdefs.h fi - # Checks for types ## off_t ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" -if test "x$ac_cv_type_off_t" = xyes; then : +if test "x$ac_cv_type_off_t" = xyes +then : -else +else $as_nop -cat >>confdefs.h <<_ACEOF -#define off_t long int -_ACEOF +printf "%s\n" "#define off_t long int" >>confdefs.h fi @@ -13550,17 +14343,19 @@ fi # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 -$as_echo_n "checking size of int... " >&6; } -if ${ac_cv_sizeof_int+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : - -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +printf %s "checking size of int... " >&6; } +if test ${ac_cv_sizeof_int+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default" +then : + +else $as_nop if test "$ac_cv_type_int" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else @@ -13569,31 +14364,31 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 -$as_echo "$ac_cv_sizeof_int" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +printf "%s\n" "$ac_cv_sizeof_int" >&6; } -cat >>confdefs.h <<_ACEOF -#define SIZEOF_INT $ac_cv_sizeof_int -_ACEOF +printf "%s\n" "#define SIZEOF_INT $ac_cv_sizeof_int" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 -$as_echo_n "checking size of long... " >&6; } -if ${ac_cv_sizeof_long+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : - -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +printf %s "checking size of long... " >&6; } +if test ${ac_cv_sizeof_long+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default" +then : + +else $as_nop if test "$ac_cv_type_long" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) See \`config.log' for more details" "$LINENO" 5; } else @@ -13602,31 +14397,31 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 -$as_echo "$ac_cv_sizeof_long" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +printf "%s\n" "$ac_cv_sizeof_long" >&6; } -cat >>confdefs.h <<_ACEOF -#define SIZEOF_LONG $ac_cv_sizeof_long -_ACEOF +printf "%s\n" "#define SIZEOF_LONG $ac_cv_sizeof_long" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long *" >&5 -$as_echo_n "checking size of long *... " >&6; } -if ${ac_cv_sizeof_long_p+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long *))" "ac_cv_sizeof_long_p" "$ac_includes_default"; then : - -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long *" >&5 +printf %s "checking size of long *... " >&6; } +if test ${ac_cv_sizeof_long_p+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long *))" "ac_cv_sizeof_long_p" "$ac_includes_default" +then : + +else $as_nop if test "$ac_cv_type_long_p" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long *) See \`config.log' for more details" "$LINENO" 5; } else @@ -13635,31 +14430,31 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_p" >&5 -$as_echo "$ac_cv_sizeof_long_p" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_p" >&5 +printf "%s\n" "$ac_cv_sizeof_long_p" >&6; } -cat >>confdefs.h <<_ACEOF -#define SIZEOF_LONG_P $ac_cv_sizeof_long_p -_ACEOF +printf "%s\n" "#define SIZEOF_LONG_P $ac_cv_sizeof_long_p" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 -$as_echo_n "checking size of short... " >&6; } -if ${ac_cv_sizeof_short+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : - -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 +printf %s "checking size of short... " >&6; } +if test ${ac_cv_sizeof_short+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default" +then : + +else $as_nop if test "$ac_cv_type_short" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (short) See \`config.log' for more details" "$LINENO" 5; } else @@ -13668,31 +14463,31 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 -$as_echo "$ac_cv_sizeof_short" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 +printf "%s\n" "$ac_cv_sizeof_short" >&6; } -cat >>confdefs.h <<_ACEOF -#define SIZEOF_SHORT $ac_cv_sizeof_short -_ACEOF +printf "%s\n" "#define SIZEOF_SHORT $ac_cv_sizeof_short" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 -$as_echo_n "checking size of long long... " >&6; } -if ${ac_cv_sizeof_long_long+:} false; then : - $as_echo_n "(cached) " >&6 -else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : - -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 +printf %s "checking size of long long... " >&6; } +if test ${ac_cv_sizeof_long_long+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default" +then : + +else $as_nop if test "$ac_cv_type_long_long" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long long) See \`config.log' for more details" "$LINENO" 5; } else @@ -13701,57 +14496,56 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 -$as_echo "$ac_cv_sizeof_long_long" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 +printf "%s\n" "$ac_cv_sizeof_long_long" >&6; } -cat >>confdefs.h <<_ACEOF -#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long -_ACEOF +printf "%s\n" "#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long" >>confdefs.h -if test "x$ac_cv_sizeof_long_p" = "x4" ; then : +if test "x$ac_cv_sizeof_long_p" = "x4" +then : bits=32; arch64=false -elif test "x$ac_cv_sizeof_long_p" = "x8" ; then : +elif test "x$ac_cv_sizeof_long_p" = "x8" +then : bits=64; arch64=true - $as_echo "#define ARCH_SIXTYFOUR 1" >>confdefs.h + printf "%s\n" "#define ARCH_SIXTYFOUR 1" >>confdefs.h -else +else $as_nop as_fn_error $? "Neither 32 nor 64 bits architecture." "$LINENO" 5 fi if test "x$ac_cv_sizeof_int" != "x4" && test "x$ac_cv_sizeof_long" != "x4" \ - && test "x$ac_cv_sizeof_short" != "x4"; then : + && test "x$ac_cv_sizeof_short" != "x4" +then : as_fn_error $? "Sorry, we can't find a 32-bit integer type." "$LINENO" 5 fi if test "x$ac_cv_sizeof_long" != "x8" && - test "x$ac_cv_sizeof_long_long" != "x8"; then : + test "x$ac_cv_sizeof_long_long" != "x8" +then : as_fn_error $? "Sorry, we can't find a 64-bit integer type." "$LINENO" 5 fi -cat >>confdefs.h <<_ACEOF -#define SIZEOF_PTR $ac_cv_sizeof_long_p -_ACEOF +printf "%s\n" "#define SIZEOF_PTR $ac_cv_sizeof_long_p" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define SIZEOF_LONGLONG $ac_cv_sizeof_long_long -_ACEOF +printf "%s\n" "#define SIZEOF_LONGLONG $ac_cv_sizeof_long_long" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: Target is a $bits bits architecture" >&5 -$as_echo "$as_me: Target is a $bits bits architecture" >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Target is a $bits bits architecture" >&5 +printf "%s\n" "$as_me: Target is a $bits bits architecture" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 -$as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if ${ac_cv_c_bigendian+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +printf %s "checking whether byte ordering is bigendian... " >&6; } +if test ${ac_cv_c_bigendian+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13762,7 +14556,8 @@ else typedef int dummy; _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. @@ -13786,7 +14581,7 @@ if ac_fn_c_try_compile "$LINENO"; then : fi done fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13795,7 +14590,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext #include int -main () +main (void) { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ @@ -13807,7 +14602,8 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -13815,7 +14611,7 @@ if ac_fn_c_try_compile "$LINENO"; then : #include int -main () +main (void) { #if BYTE_ORDER != BIG_ENDIAN not big endian @@ -13825,14 +14621,15 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_c_bigendian=yes -else +else $as_nop ac_cv_c_bigendian=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). @@ -13841,7 +14638,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext #include int -main () +main (void) { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros @@ -13851,14 +14648,15 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { #ifndef _BIG_ENDIAN not big endian @@ -13868,31 +14666,33 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_c_bigendian=yes -else +else $as_nop ac_cv_c_bigendian=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes +then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -short int ascii_mm[] = +unsigned short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; - short int ascii_ii[] = + unsigned short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } - short int ebcdic_ii[] = + unsigned short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; - short int ebcdic_mm[] = + unsigned short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; @@ -13900,14 +14700,15 @@ short int ascii_mm[] = extern int foo; int -main () +main (void) { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi @@ -13920,13 +14721,13 @@ if ac_fn_c_try_compile "$LINENO"; then : fi fi fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int -main () +main (void) { /* Are we little or big endian? From Harbison&Steele. */ @@ -13942,9 +14743,10 @@ main () return 0; } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : ac_cv_c_bigendian=no -else +else $as_nop ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -13953,12 +14755,12 @@ fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 -$as_echo "$ac_cv_c_bigendian" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +printf "%s\n" "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) - $as_echo "#define ARCH_BIG_ENDIAN 1" >>confdefs.h + printf "%s\n" "#define ARCH_BIG_ENDIAN 1" >>confdefs.h endianness="be" ;; #( @@ -13975,21 +14777,20 @@ $as_echo "$ac_cv_c_bigendian" >&6; } # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of double" >&5 -$as_echo_n "checking alignment of double... " >&6; } -if ${ac_cv_alignof_double+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking alignment of double" >&5 +printf %s "checking alignment of double... " >&6; } +if test ${ac_cv_alignof_double+y} +then : + printf %s "(cached) " >&6 +else $as_nop if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_double" "$ac_includes_default -#ifndef offsetof -# define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) -#endif -typedef struct { char x; double y; } ac__type_alignof_;"; then : +typedef struct { char x; double y; } ac__type_alignof_;" +then : -else +else $as_nop if test "$ac_cv_type_double" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of double See \`config.log' for more details" "$LINENO" 5; } else @@ -13998,33 +14799,30 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_double" >&5 -$as_echo "$ac_cv_alignof_double" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_double" >&5 +printf "%s\n" "$ac_cv_alignof_double" >&6; } -cat >>confdefs.h <<_ACEOF -#define ALIGNOF_DOUBLE $ac_cv_alignof_double -_ACEOF +printf "%s\n" "#define ALIGNOF_DOUBLE $ac_cv_alignof_double" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of long" >&5 -$as_echo_n "checking alignment of long... " >&6; } -if ${ac_cv_alignof_long+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking alignment of long" >&5 +printf %s "checking alignment of long... " >&6; } +if test ${ac_cv_alignof_long+y} +then : + printf %s "(cached) " >&6 +else $as_nop if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_long" "$ac_includes_default -#ifndef offsetof -# define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) -#endif -typedef struct { char x; long y; } ac__type_alignof_;"; then : +typedef struct { char x; long y; } ac__type_alignof_;" +then : -else +else $as_nop if test "$ac_cv_type_long" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of long See \`config.log' for more details" "$LINENO" 5; } else @@ -14033,33 +14831,30 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_long" >&5 -$as_echo "$ac_cv_alignof_long" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_long" >&5 +printf "%s\n" "$ac_cv_alignof_long" >&6; } -cat >>confdefs.h <<_ACEOF -#define ALIGNOF_LONG $ac_cv_alignof_long -_ACEOF +printf "%s\n" "#define ALIGNOF_LONG $ac_cv_alignof_long" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of long long" >&5 -$as_echo_n "checking alignment of long long... " >&6; } -if ${ac_cv_alignof_long_long+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking alignment of long long" >&5 +printf %s "checking alignment of long long... " >&6; } +if test ${ac_cv_alignof_long_long+y} +then : + printf %s "(cached) " >&6 +else $as_nop if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_long_long" "$ac_includes_default -#ifndef offsetof -# define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) -#endif -typedef struct { char x; long long y; } ac__type_alignof_;"; then : +typedef struct { char x; long long y; } ac__type_alignof_;" +then : -else +else $as_nop if test "$ac_cv_type_long_long" = yes; then - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute alignment of long long See \`config.log' for more details" "$LINENO" 5; } else @@ -14068,34 +14863,36 @@ See \`config.log' for more details" "$LINENO" 5; } fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_long_long" >&5 -$as_echo "$ac_cv_alignof_long_long" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_long_long" >&5 +printf "%s\n" "$ac_cv_alignof_long_long" >&6; } -cat >>confdefs.h <<_ACEOF -#define ALIGNOF_LONG_LONG $ac_cv_alignof_long_long -_ACEOF +printf "%s\n" "#define ALIGNOF_LONG_LONG $ac_cv_alignof_long_long" >>confdefs.h -if ! $arch64; then : +if ! $arch64 +then : case $target_cpu in #( i686) : ;; #( *) : - if test "$ac_cv_alignof_double" -gt 4; then : - $as_echo "#define ARCH_ALIGN_DOUBLE 1" >>confdefs.h + if test "$ac_cv_alignof_double" -gt 4 +then : + printf "%s\n" "#define ARCH_ALIGN_DOUBLE 1" >>confdefs.h fi if test "x$ac_cv_sizeof_long" = "x8" && - test "$ac_cv_alignof_long" -gt 4; then : - $as_echo "#define ARCH_ALIGN_INT64 1" >>confdefs.h + test "$ac_cv_alignof_long" -gt 4 +then : + printf "%s\n" "#define ARCH_ALIGN_INT64 1" >>confdefs.h -else +else $as_nop if test "x$ac_cv_sizeof_long_long" = "x8" && - test "$ac_cv_alignof_long_long" -gt 4; then : - $as_echo "#define ARCH_ALIGN_INT64 1" >>confdefs.h + test "$ac_cv_alignof_long_long" -gt 4 +then : + printf "%s\n" "#define ARCH_ALIGN_INT64 1" >>confdefs.h fi fi @@ -14111,7 +14908,8 @@ rpath='' mksharedlibrpath='' natdynlinkopts="" -if test x"$enable_shared" != "xno"; then : +if test x"$enable_shared" != "xno" +then : case $host in #( *-apple-darwin*) : mksharedlib="$CC -shared \ @@ -14121,7 +14919,8 @@ if test x"$enable_shared" != "xno"; then : *-*-mingw32) : mksharedlib='$(FLEXLINK)' mkmaindll='$(FLEXLINK) -maindll' - if test -n "$oc_dll_ldflags"; then : + if test -n "$oc_dll_ldflags" +then : mksharedlib="$mksharedlib -link \"$oc_dll_ldflags\"" mkmaindll="$mkmaindll -link \"$oc_dll_ldflags\"" @@ -14169,7 +14968,8 @@ esac esac fi -if test -z "$mkmaindll"; then : +if test -z "$mkmaindll" +then : mkmaindll=$mksharedlib fi @@ -14177,7 +14977,8 @@ fi natdynlink=false -if test x"$supports_shared_libraries" = 'xtrue'; then : +if test x"$supports_shared_libraries" = 'xtrue' +then : case "$host" in #( *-*-cygwin*) : natdynlink=true ;; #( @@ -14257,27 +15058,29 @@ esac case "$cc_basename,$host" in #( *gcc*,x86_64-*|*gcc*,i686-*) : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports -fno-tree-vrp" >&5 -$as_echo_n "checking whether the C compiler supports -fno-tree-vrp... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports -fno-tree-vrp" >&5 +printf %s "checking whether the C compiler supports -fno-tree-vrp... " >&6; } saved_CFLAGS="$CFLAGS" CFLAGS="-Werror -fno-tree-vrp $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main() { return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : cc_has_fno_tree_vrp=true - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop cc_has_fno_tree_vrp=false - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$saved_CFLAGS" - if $cc_has_fno_tree_vrp; then : + if $cc_has_fno_tree_vrp +then : internal_cflags="$internal_cflags -fno-tree-vrp" fi ;; #( *) : @@ -14285,27 +15088,28 @@ fi ;; #( esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports __attribute__((aligned(n)))" >&5 -$as_echo_n "checking whether the C compiler supports __attribute__((aligned(n)))... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports __attribute__((aligned(n)))" >&5 +printf %s "checking whether the C compiler supports __attribute__((aligned(n)))... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef struct {__attribute__((aligned(8))) int t;} t; _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - $as_echo "#define SUPPORTS_ALIGNED_ATTRIBUTE 1" >>confdefs.h +if ac_fn_c_try_compile "$LINENO" +then : + printf "%s\n" "#define SUPPORTS_ALIGNED_ATTRIBUTE 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ## Check whether __attribute__((optimize("tree-vectorize")))) is supported - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports __attribute__((optimize(\"tree-vectorize\")))" >&5 -$as_echo_n "checking whether the C compiler supports __attribute__((optimize(\"tree-vectorize\")))... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports __attribute__((optimize(\"tree-vectorize\")))" >&5 +printf %s "checking whether the C compiler supports __attribute__((optimize(\"tree-vectorize\")))... " >&6; } saved_CFLAGS="$CFLAGS" CFLAGS="-Werror $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -14315,16 +15119,17 @@ $as_echo_n "checking whether the C compiler supports __attribute__((optimize(\"t int main() { f(); return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - $as_echo "#define SUPPORTS_TREE_VECTORIZE 1" >>confdefs.h +if ac_fn_c_try_compile "$LINENO" +then : + printf "%s\n" "#define SUPPORTS_TREE_VECTORIZE 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$saved_CFLAGS" @@ -14354,9 +15159,10 @@ case $host in #( powerpc64le*-*-linux*) : arch=power; model=ppc64le; system=elf ;; #( powerpc*-*-linux*) : - arch=power; if $arch64; then : + arch=power; if $arch64 +then : model=ppc64 -else +else $as_nop model=ppc fi; system=elf ;; #( s390x*-*-linux*) : @@ -14433,37 +15239,39 @@ fi; system=elf ;; #( ;; esac -if test x"$enable_native_compiler" = "xno"; then : +if test x"$enable_native_compiler" = "xno" +then : native_compiler=false - { $as_echo "$as_me:${as_lineno-$LINENO}: the native compiler is disabled" >&5 -$as_echo "$as_me: the native compiler is disabled" >&6;} -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: the native compiler is disabled" >&5 +printf "%s\n" "$as_me: the native compiler is disabled" >&6;} +else $as_nop native_compiler=true fi -if ! $native_compiler; then : +if ! $native_compiler +then : natdynlink=false fi -if $natdynlink; then : +if $natdynlink +then : cmxs="cmxs" -else +else $as_nop cmxs="cmx" fi -cat >>confdefs.h <<_ACEOF -#define OCAML_OS_TYPE "$ostype" -_ACEOF +printf "%s\n" "#define OCAML_OS_TYPE \"$ostype\"" >>confdefs.h if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args. set dummy ${ac_tool_prefix}ld; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_DIRECT_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DIRECT_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DIRECT_LD"; then ac_cv_prog_DIRECT_LD="$DIRECT_LD" # Let the user override the test. else @@ -14471,11 +15279,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DIRECT_LD="${ac_tool_prefix}ld" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -14486,11 +15298,11 @@ fi fi DIRECT_LD=$ac_cv_prog_DIRECT_LD if test -n "$DIRECT_LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DIRECT_LD" >&5 -$as_echo "$DIRECT_LD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DIRECT_LD" >&5 +printf "%s\n" "$DIRECT_LD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -14499,11 +15311,12 @@ if test -z "$ac_cv_prog_DIRECT_LD"; then ac_ct_DIRECT_LD=$DIRECT_LD # Extract the first word of "ld", so it can be a program name with args. set dummy ld; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_DIRECT_LD+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DIRECT_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DIRECT_LD"; then ac_cv_prog_ac_ct_DIRECT_LD="$ac_ct_DIRECT_LD" # Let the user override the test. else @@ -14511,11 +15324,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DIRECT_LD="ld" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -14526,11 +15343,11 @@ fi fi ac_ct_DIRECT_LD=$ac_cv_prog_ac_ct_DIRECT_LD if test -n "$ac_ct_DIRECT_LD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DIRECT_LD" >&5 -$as_echo "$ac_ct_DIRECT_LD" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DIRECT_LD" >&5 +printf "%s\n" "$ac_ct_DIRECT_LD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DIRECT_LD" = x; then @@ -14538,8 +15355,8 @@ fi else case $cross_compiling:$ac_tool_warned in yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DIRECT_LD=$ac_ct_DIRECT_LD @@ -14548,7 +15365,8 @@ else DIRECT_LD="$ac_cv_prog_DIRECT_LD" fi -if test -z "$PARTIALLD"; then : +if test -z "$PARTIALLD" +then : case "$arch,$cc_basename,$system,$model" in #( amd64,*gcc*,macosx,*) : PACKLD_FLAGS=' -arch x86_64' ;; #( @@ -14565,14 +15383,15 @@ esac # output filename. Don't assume that all C compilers understand GNU -ofoo # form, so ensure that the definition includes a space at the end (which is # achieved using the $(EMPTY) expansion trick). - if test x"$cc_basename" = "xcl"; then : + if test x"$cc_basename" = "xcl" +then : # For the Microsoft C compiler there must be no space at the end of the # string. PACKLD="link -lib -nologo $machine -out:" -else +else $as_nop PACKLD="$DIRECT_LD -r$PACKLD_FLAGS -o \$(EMPTY)" fi -else +else $as_nop PACKLD="$PARTIALLD -o \$(EMPTY)" fi @@ -14609,11 +15428,12 @@ esac intel_jcc_bug_cflags='' case $arch in #( amd64) : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wa,-mbranches-within-32B-boundaries" >&5 -$as_echo_n "checking whether C compiler accepts -Wa,-mbranches-within-32B-boundaries... " >&6; } -if ${ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wa,-mbranches-within-32B-boundaries" >&5 +printf %s "checking whether C compiler accepts -Wa,-mbranches-within-32B-boundaries... " >&6; } +if test ${ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries+y} +then : + printf %s "(cached) " >&6 +else $as_nop ax_check_save_flags=$CFLAGS CFLAGS="$CFLAGS -Wa,-mbranches-within-32B-boundaries" @@ -14621,26 +15441,28 @@ else /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries=yes -else +else $as_nop ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS=$ax_check_save_flags fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" >&5 -$as_echo "$ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" >&6; } -if test "x$ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" >&5 +printf "%s\n" "$ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" >&6; } +if test "x$ax_cv_check_cflags___Wa__mbranches_within_32B_boundaries" = xyes +then : intel_jcc_bug_cflags=-Wa,-mbranches-within-32B-boundaries -else +else $as_nop : fi ;; #( @@ -14650,16 +15472,18 @@ esac # Assembler -if test -n "$target_alias"; then : +if test -n "$target_alias" +then : toolpref="${target_alias}-" as_target="$target" as_cpu="$target_cpu" -else - if test -n "$host_alias"; then : +else $as_nop + if test -n "$host_alias" +then : toolpref="${host_alias}-" as_target="$host" as_cpu="$host_cpu" -else +else $as_nop toolpref="" as_target="$build" as_cpu="$build_cpu" @@ -14700,32 +15524,36 @@ esac ;; #( ;; esac -if test "$with_pic"; then : +if test "$with_pic" +then : fpic=true - $as_echo "#define CAML_WITH_FPIC 1" >>confdefs.h + printf "%s\n" "#define CAML_WITH_FPIC 1" >>confdefs.h internal_cflags="$internal_cflags $sharedlib_cflags" default_aspp="$default_aspp $sharedlib_cflags" -else +else $as_nop fpic=false fi -if test -z "$AS"; then : +if test -z "$AS" +then : AS="$default_as" fi -if test -z "$ASPP"; then : +if test -z "$ASPP" +then : ASPP="$default_aspp" fi # Utilities # Extract the first word of "rlwrap", so it can be a program name with args. set dummy rlwrap; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_rlwrap+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_rlwrap+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$rlwrap"; then ac_cv_prog_rlwrap="$rlwrap" # Let the user override the test. else @@ -14733,11 +15561,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_rlwrap="rlwrap" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -14748,18 +15580,18 @@ fi fi rlwrap=$ac_cv_prog_rlwrap if test -n "$rlwrap"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $rlwrap" >&5 -$as_echo "$rlwrap" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $rlwrap" >&5 +printf "%s\n" "$rlwrap" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi case $rlwrap,$system in #( rlwrap,win*|rlwrap,mingw*) : - { $as_echo "$as_me:${as_lineno-$LINENO}: rlwrap doesn't work with native win32 - disabling" >&5 -$as_echo "$as_me: rlwrap doesn't work with native win32 - disabling" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: rlwrap doesn't work with native win32 - disabling" >&5 +printf "%s\n" "$as_me: rlwrap doesn't work with native win32 - disabling" >&6;} rlwrap='' ;; #( *) : ;; @@ -14769,30 +15601,33 @@ esac ## Check the semantics of signal handlers - { $as_echo "$as_me:${as_lineno-$LINENO}: checking semantics of signal handlers" >&5 -$as_echo "$as_me: checking semantics of signal handlers" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking semantics of signal handlers" >&5 +printf "%s\n" "$as_me: checking semantics of signal handlers" >&6;} ac_fn_c_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction" -if test "x$ac_cv_func_sigaction" = xyes; then : +if test "x$ac_cv_func_sigaction" = xyes +then : has_sigaction=true -else +else $as_nop has_sigaction=false fi ac_fn_c_check_func "$LINENO" "sigprocmask" "ac_cv_func_sigprocmask" -if test "x$ac_cv_func_sigprocmask" = xyes; then : +if test "x$ac_cv_func_sigprocmask" = xyes +then : has_sigprocmask=true -else +else $as_nop has_sigprocmask=false fi - if $has_sigaction && $has_sigprocmask; then : - $as_echo "#define POSIX_SIGNALS 1" >>confdefs.h + if $has_sigaction && $has_sigprocmask +then : + printf "%s\n" "#define POSIX_SIGNALS 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: POSIX signal handling found." >&5 -$as_echo "$as_me: POSIX signal handling found." >&6;} -else - { $as_echo "$as_me:${as_lineno-$LINENO}: assuming signals have the System V semantics." >&5 -$as_echo "$as_me: assuming signals have the System V semantics." >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: POSIX signal handling found." >&5 +printf "%s\n" "$as_me: POSIX signal handling found." >&6;} +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: assuming signals have the System V semantics." >&5 +printf "%s\n" "$as_me: assuming signals have the System V semantics." >&6;} fi @@ -14801,45 +15636,50 @@ fi ## Check for C99 float ops has_c99_float_ops=true -for ac_func in expm1 log1p hypot fma exp2 log2 cbrt acosh asinh atanh erf erfc trunc round copysign + + for ac_func in expm1 log1p hypot fma exp2 log2 cbrt acosh asinh atanh erf erfc trunc round copysign do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : +if eval test \"x\$"$as_ac_var"\" = x"yes" +then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF -else +else $as_nop has_c99_float_ops=false fi -done +done -if $has_c99_float_ops; then : - $as_echo "#define HAS_C99_FLOAT_OPS 1" >>confdefs.h +if $has_c99_float_ops +then : + printf "%s\n" "#define HAS_C99_FLOAT_OPS 1" >>confdefs.h # Check whether round works (known bug in mingw-w64) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether round works" >&5 -$as_echo_n "checking whether round works... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether round works" >&5 +printf %s "checking whether round works... " >&6; } old_cross_compiling="$cross_compiling" - if test "x$host_runnable" = 'xtrue'; then : + if test "x$host_runnable" = 'xtrue' +then : cross_compiling='no' fi - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes +then : case $target in #( x86_64-w64-mingw32) : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume not" >&5 -$as_echo "cross-compiling; assume not" >&6; } ;; #( + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume not" >&5 +printf "%s\n" "cross-compiling; assume not" >&6; } ;; #( *) : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume yes" >&5 -$as_echo "cross-compiling; assume yes" >&6; } - $as_echo "#define HAS_WORKING_ROUND 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume yes" >&5 +printf "%s\n" "cross-compiling; assume yes" >&6; } + printf "%s\n" "#define HAS_WORKING_ROUND 1" >>confdefs.h ;; esac -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14850,14 +15690,15 @@ int main (void) { } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - $as_echo "#define HAS_WORKING_ROUND 1" >>confdefs.h - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + printf "%s\n" "#define HAS_WORKING_ROUND 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } case $enable_imprecise_c99_float_ops,$target in #( no,*) : hard_error=true ;; #( @@ -14868,11 +15709,12 @@ $as_echo "no" >&6; } *) : hard_error=true ;; esac - if test x"$hard_error" = "xtrue"; then : + if test x"$hard_error" = "xtrue" +then : as_fn_error $? "round does not work, enable emulation with --enable-imprecise-c99-float-ops" "$LINENO" 5 -else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: round does not work; emulation enabled" >&5 -$as_echo "$as_me: WARNING: round does not work; emulation enabled" >&2;} +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: round does not work; emulation enabled" >&5 +printf "%s\n" "$as_me: WARNING: round does not work; emulation enabled" >&2;} fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -14885,25 +15727,27 @@ fi # Check whether fma works (regressed in mingw-w64 8.0.0; present, but broken, # in VS2013-2017 and present but unimplemented in Cygwin64) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fma works" >&5 -$as_echo_n "checking whether fma works... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether fma works" >&5 +printf %s "checking whether fma works... " >&6; } old_cross_compiling="$cross_compiling" - if test "x$host_runnable" = 'xtrue'; then : + if test "x$host_runnable" = 'xtrue' +then : cross_compiling='no' fi - if test "$cross_compiling" = yes; then : + if test "$cross_compiling" = yes +then : case $target in #( x86_64-w64-mingw32|x86_64-*-cygwin*) : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume not" >&5 -$as_echo "cross-compiling; assume not" >&6; } ;; #( + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume not" >&5 +printf "%s\n" "cross-compiling; assume not" >&6; } ;; #( *) : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume yes" >&5 -$as_echo "cross-compiling; assume yes" >&6; } - $as_echo "#define HAS_WORKING_FMA 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume yes" >&5 +printf "%s\n" "cross-compiling; assume yes" >&6; } + printf "%s\n" "#define HAS_WORKING_FMA 1" >>confdefs.h ;; esac -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -14936,14 +15780,15 @@ int main (void) { } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - $as_echo "#define HAS_WORKING_FMA 1" >>confdefs.h - -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +if ac_fn_c_try_run "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + printf "%s\n" "#define HAS_WORKING_FMA 1" >>confdefs.h + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } case $enable_imprecise_c99_float_ops,$target in #( no,*) : hard_error=true ;; #( @@ -14954,20 +15799,22 @@ $as_echo "no" >&6; } *) : case $ocaml_cv_cc_vendor in #( msvc-*) : - if test "${ocaml_cv_cc_vendor#msvc-}" -lt 1920 ; then : + if test "${ocaml_cv_cc_vendor#msvc-}" -lt 1920 +then : hard_error=false -else +else $as_nop hard_error=true fi ;; #( *) : hard_error=true ;; esac ;; esac - if test x"$hard_error" = "xtrue"; then : + if test x"$hard_error" = "xtrue" +then : as_fn_error $? "fma does not work, enable emulation with --enable-imprecise-c99-float-ops" "$LINENO" 5 -else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: fma does not work; emulation enabled" >&5 -$as_echo "$as_me: WARNING: fma does not work; emulation enabled" >&2;} +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: fma does not work; emulation enabled" >&5 +printf "%s\n" "$as_me: WARNING: fma does not work; emulation enabled" >&2;} fi fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -14977,41 +15824,46 @@ fi cross_compiling="$old_cross_compiling" -else - if test x"$enable_imprecise_c99_float_ops" != "xyes" ; then : +else $as_nop + if test x"$enable_imprecise_c99_float_ops" != "xyes" +then : case $enable_imprecise_c99_float_ops,$ocaml_cv_cc_vendor in #( no,*) : hard_error=true ;; #( ,msvc-*) : - if test "${ocaml_cv_cc_vendor#msvc-}" -lt 1800 ; then : + if test "${ocaml_cv_cc_vendor#msvc-}" -lt 1800 +then : hard_error=false -else +else $as_nop hard_error=true fi ;; #( *) : hard_error=true ;; esac - if test x"$hard_error" = 'xtrue'; then : + if test x"$hard_error" = 'xtrue' +then : as_fn_error $? "C99 float ops unavailable, enable replacements with --enable-imprecise-c99-float-ops" "$LINENO" 5 -else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C99 float ops unavailable, replacements enabled (ancient Visual Studio)" >&5 -$as_echo "$as_me: WARNING: C99 float ops unavailable, replacements enabled (ancient Visual Studio)" >&2;} +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: C99 float ops unavailable, replacements enabled (ancient Visual Studio)" >&5 +printf "%s\n" "$as_me: WARNING: C99 float ops unavailable, replacements enabled (ancient Visual Studio)" >&2;} fi fi fi ## getrusage ac_fn_c_check_func "$LINENO" "getrusage" "ac_cv_func_getrusage" -if test "x$ac_cv_func_getrusage" = xyes; then : - $as_echo "#define HAS_GETRUSAGE 1" >>confdefs.h +if test "x$ac_cv_func_getrusage" = xyes +then : + printf "%s\n" "#define HAS_GETRUSAGE 1" >>confdefs.h fi ## times ac_fn_c_check_func "$LINENO" "times" "ac_cv_func_times" -if test "x$ac_cv_func_times" = xyes; then : - $as_echo "#define HAS_TIMES 1" >>confdefs.h +if test "x$ac_cv_func_times" = xyes +then : + printf "%s\n" "#define HAS_TIMES 1" >>confdefs.h fi @@ -15022,13 +15874,15 @@ saved_CPPFLAGS="$CPPFLAGS" CPPFLAGS="-D_GNU_SOURCE $CPPFLAGS" ac_fn_c_check_func "$LINENO" "secure_getenv" "ac_cv_func_secure_getenv" -if test "x$ac_cv_func_secure_getenv" = xyes; then : - $as_echo "#define HAS_SECURE_GETENV 1" >>confdefs.h +if test "x$ac_cv_func_secure_getenv" = xyes +then : + printf "%s\n" "#define HAS_SECURE_GETENV 1" >>confdefs.h -else +else $as_nop ac_fn_c_check_func "$LINENO" "__secure_getenv" "ac_cv_func___secure_getenv" -if test "x$ac_cv_func___secure_getenv" = xyes; then : - $as_echo "#define HAS___SECURE_GETENV 1" >>confdefs.h +if test "x$ac_cv_func___secure_getenv" = xyes +then : + printf "%s\n" "#define HAS___SECURE_GETENV 1" >>confdefs.h fi @@ -15040,8 +15894,9 @@ CPPFLAGS="$saved_CPPFLAGS" ## issetugid ac_fn_c_check_func "$LINENO" "issetugid" "ac_cv_func_issetugid" -if test "x$ac_cv_func_issetugid" = xyes; then : - $as_echo "#define HAS_ISSETUGID 1" >>confdefs.h +if test "x$ac_cv_func_issetugid" = xyes +then : + printf "%s\n" "#define HAS_ISSETUGID 1" >>confdefs.h fi @@ -15058,24 +15913,26 @@ case $host in #( has_monotonic_clock=true ;; #( *-apple-darwin*) : - for ac_func in mach_timebase_info mach_absolute_time + + for ac_func in mach_timebase_info mach_absolute_time do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : +if eval test \"x\$"$as_ac_var"\" = x"yes" +then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF has_monotonic_clock=true - $as_echo "#define HAS_MACH_ABSOLUTE_TIME 1" >>confdefs.h + printf "%s\n" "#define HAS_MACH_ABSOLUTE_TIME 1" >>confdefs.h -else +else $as_nop has_monotonic_clock=false fi -done - ;; #( + +done ;; #( *) : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15092,16 +15949,17 @@ done } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : has_monotonic_clock=true - $as_echo "#define HAS_POSIX_MONOTONIC_CLOCK 1" >>confdefs.h + printf "%s\n" "#define HAS_POSIX_MONOTONIC_CLOCK 1" >>confdefs.h -else +else $as_nop has_monotonic_clock=false fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac @@ -15110,7 +15968,8 @@ esac # if the proper clock source is found. # If asked via --enable-instrumented-runtime, configuration fails if the proper # clock source is missing. -if test "x$enable_instrumented_runtime" != "xno" ; then : +if test "x$enable_instrumented_runtime" != "xno" +then : case $host in #( sparc-sun-solaris*) : @@ -15134,11 +15993,12 @@ but no proper monotonic clock source was found." "$LINENO" 5 ;; esac ;; #( *) : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 -$as_echo_n "checking for library containing clock_gettime... " >&6; } -if ${ac_cv_search_clock_gettime+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5 +printf %s "checking for library containing clock_gettime... " >&6; } +if test ${ac_cv_search_clock_gettime+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15146,49 +16006,51 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char clock_gettime (); int -main () +main (void) { return clock_gettime (); ; return 0; } _ACEOF -for ac_lib in '' rt; do +for ac_lib in '' rt +do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO"; then : + if ac_fn_c_try_link "$LINENO" +then : ac_cv_search_clock_gettime=$ac_res fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext - if ${ac_cv_search_clock_gettime+:} false; then : + if test ${ac_cv_search_clock_gettime+y} +then : break fi done -if ${ac_cv_search_clock_gettime+:} false; then : +if test ${ac_cv_search_clock_gettime+y} +then : -else +else $as_nop ac_cv_search_clock_gettime=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 -$as_echo "$ac_cv_search_clock_gettime" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5 +printf "%s\n" "$ac_cv_search_clock_gettime" >&6; } ac_res=$ac_cv_search_clock_gettime -if test "$ac_res" != no; then : +if test "$ac_res" != no +then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" has_clock_gettime=true -else +else $as_nop has_clock_gettime=false fi @@ -15200,9 +16062,10 @@ fi *,true,true) : instrumented_runtime=true - if test "x$ac_cv_search_clock_gettime" = "xnone required"; then : + if test "x$ac_cv_search_clock_gettime" = "xnone required" +then : instrumented_runtime_libs="" -else +else $as_nop instrumented_runtime_libs=$ac_cv_search_clock_gettime fi @@ -15235,11 +16098,12 @@ sockets=true case $host in #( *-*-mingw32|*-pc-windows) : cclibs="$cclibs -lws2_32" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 -$as_echo_n "checking for library containing socket... " >&6; } -if ${ac_cv_search_socket+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +printf %s "checking for library containing socket... " >&6; } +if test ${ac_cv_search_socket+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15247,63 +16111,67 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char socket (); int -main () +main (void) { return socket (); ; return 0; } _ACEOF -for ac_lib in '' ws2_32; do +for ac_lib in '' ws2_32 +do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO"; then : + if ac_fn_c_try_link "$LINENO" +then : ac_cv_search_socket=$ac_res fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext - if ${ac_cv_search_socket+:} false; then : + if test ${ac_cv_search_socket+y} +then : break fi done -if ${ac_cv_search_socket+:} false; then : +if test ${ac_cv_search_socket+y} +then : -else +else $as_nop ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 -$as_echo "$ac_cv_search_socket" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +printf "%s\n" "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket -if test "$ac_res" != no; then : +if test "$ac_res" != no +then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi ac_fn_c_check_func "$LINENO" "socketpair" "ac_cv_func_socketpair" -if test "x$ac_cv_func_socketpair" = xyes; then : - $as_echo "#define HAS_SOCKETPAIR 1" >>confdefs.h +if test "x$ac_cv_func_socketpair" = xyes +then : + printf "%s\n" "#define HAS_SOCKETPAIR 1" >>confdefs.h fi ;; #( *-*-haiku) : cclibs="$cclibs -lnetwork" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 -$as_echo_n "checking for library containing socket... " >&6; } -if ${ac_cv_search_socket+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +printf %s "checking for library containing socket... " >&6; } +if test ${ac_cv_search_socket+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15311,57 +16179,60 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char socket (); int -main () +main (void) { return socket (); ; return 0; } _ACEOF -for ac_lib in '' network; do +for ac_lib in '' network +do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO"; then : + if ac_fn_c_try_link "$LINENO" +then : ac_cv_search_socket=$ac_res fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext - if ${ac_cv_search_socket+:} false; then : + if test ${ac_cv_search_socket+y} +then : break fi done -if ${ac_cv_search_socket+:} false; then : +if test ${ac_cv_search_socket+y} +then : -else +else $as_nop ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 -$as_echo "$ac_cv_search_socket" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +printf "%s\n" "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket -if test "$ac_res" != no; then : +if test "$ac_res" != no +then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi ;; #( *-*-solaris*) : cclibs="$cclibs -lsocket -lnsl" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 -$as_echo_n "checking for library containing socket... " >&6; } -if ${ac_cv_search_socket+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +printf %s "checking for library containing socket... " >&6; } +if test ${ac_cv_search_socket+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15369,55 +16240,58 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char socket (); int -main () +main (void) { return socket (); ; return 0; } _ACEOF -for ac_lib in '' socket; do +for ac_lib in '' socket +do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO"; then : + if ac_fn_c_try_link "$LINENO" +then : ac_cv_search_socket=$ac_res fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext - if ${ac_cv_search_socket+:} false; then : + if test ${ac_cv_search_socket+y} +then : break fi done -if ${ac_cv_search_socket+:} false; then : +if test ${ac_cv_search_socket+y} +then : -else +else $as_nop ac_cv_search_socket=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 -$as_echo "$ac_cv_search_socket" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +printf "%s\n" "$ac_cv_search_socket" >&6; } ac_res=$ac_cv_search_socket -if test "$ac_res" != no; then : +if test "$ac_res" != no +then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing inet_ntop" >&5 -$as_echo_n "checking for library containing inet_ntop... " >&6; } -if ${ac_cv_search_inet_ntop+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing inet_ntop" >&5 +printf %s "checking for library containing inet_ntop... " >&6; } +if test ${ac_cv_search_inet_ntop+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -15425,72 +16299,77 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char inet_ntop (); int -main () +main (void) { return inet_ntop (); ; return 0; } _ACEOF -for ac_lib in '' nsl; do +for ac_lib in '' nsl +do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi - if ac_fn_c_try_link "$LINENO"; then : + if ac_fn_c_try_link "$LINENO" +then : ac_cv_search_inet_ntop=$ac_res fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext - if ${ac_cv_search_inet_ntop+:} false; then : + if test ${ac_cv_search_inet_ntop+y} +then : break fi done -if ${ac_cv_search_inet_ntop+:} false; then : +if test ${ac_cv_search_inet_ntop+y} +then : -else +else $as_nop ac_cv_search_inet_ntop=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5 -$as_echo "$ac_cv_search_inet_ntop" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5 +printf "%s\n" "$ac_cv_search_inet_ntop" >&6; } ac_res=$ac_cv_search_inet_ntop -if test "$ac_res" != no; then : +if test "$ac_res" != no +then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi ;; #( *) : - for ac_func in socket socketpair bind listen accept connect + + for ac_func in socket socketpair bind listen accept connect do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` + as_ac_var=`printf "%s\n" "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : +if eval test \"x\$"$as_ac_var"\" = x"yes" +then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define `printf "%s\n" "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF -else +else $as_nop sockets=false fi -done +done ;; esac -if $sockets; then : - $as_echo "#define HAS_SOCKETS 1" >>confdefs.h +if $sockets +then : + printf "%s\n" "#define HAS_SOCKETS 1" >>confdefs.h fi @@ -15500,24 +16379,27 @@ case $host in #( *-*-mingw32|*-pc-windows) : ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "#include " -if test "x$ac_cv_type_socklen_t" = xyes; then : - $as_echo "#define HAS_SOCKLEN_T 1" >>confdefs.h +if test "x$ac_cv_type_socklen_t" = xyes +then : + printf "%s\n" "#define HAS_SOCKLEN_T 1" >>confdefs.h fi ;; #( *) : ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "#include " -if test "x$ac_cv_type_socklen_t" = xyes; then : - $as_echo "#define HAS_SOCKLEN_T 1" >>confdefs.h +if test "x$ac_cv_type_socklen_t" = xyes +then : + printf "%s\n" "#define HAS_SOCKLEN_T 1" >>confdefs.h fi ;; esac ac_fn_c_check_func "$LINENO" "inet_aton" "ac_cv_func_inet_aton" -if test "x$ac_cv_func_inet_aton" = xyes; then : - $as_echo "#define HAS_INET_ATON 1" >>confdefs.h +if test "x$ac_cv_func_inet_aton" = xyes +then : + printf "%s\n" "#define HAS_INET_ATON 1" >>confdefs.h fi @@ -15526,20 +16408,18 @@ fi case $host in #( *-*-mingw32|*-pc-windows) : - for ac_header in afunix.h + for ac_header in afunix.h do : ac_fn_c_check_header_compile "$LINENO" "afunix.h" "ac_cv_header_afunix_h" "#include " -if test "x$ac_cv_header_afunix_h" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_AFUNIX_H 1 -_ACEOF - $as_echo "#define HAS_AFUNIX_H 1" >>confdefs.h +if test "x$ac_cv_header_afunix_h" = xyes +then : + printf "%s\n" "#define HAVE_AFUNIX_H 1" >>confdefs.h + printf "%s\n" "#define HAS_AFUNIX_H 1" >>confdefs.h fi -done - ;; #( +done ;; #( *) : ;; esac @@ -15552,9 +16432,10 @@ case $host in #( *-*-mingw32|*-pc-windows) : ac_fn_c_check_type "$LINENO" "struct sockaddr_in6" "ac_cv_type_struct_sockaddr_in6" "#include " -if test "x$ac_cv_type_struct_sockaddr_in6" = xyes; then : +if test "x$ac_cv_type_struct_sockaddr_in6" = xyes +then : -else +else $as_nop ipv6=false fi ;; #( @@ -15566,89 +16447,182 @@ fi " -if test "x$ac_cv_type_struct_sockaddr_in6" = xyes; then : +if test "x$ac_cv_type_struct_sockaddr_in6" = xyes +then : -else +else $as_nop ipv6=false fi ;; esac -if $ipv6; then : +if $ipv6 +then : ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo" -if test "x$ac_cv_func_getaddrinfo" = xyes; then : +if test "x$ac_cv_func_getaddrinfo" = xyes +then : -else +else $as_nop ipv6=false fi fi -if $ipv6; then : +if $ipv6 +then : ac_fn_c_check_func "$LINENO" "getnameinfo" "ac_cv_func_getnameinfo" -if test "x$ac_cv_func_getnameinfo" = xyes; then : +if test "x$ac_cv_func_getnameinfo" = xyes +then : -else +else $as_nop ipv6=false fi fi -if $ipv6; then : +if $ipv6 +then : ac_fn_c_check_func "$LINENO" "inet_pton" "ac_cv_func_inet_pton" -if test "x$ac_cv_func_inet_pton" = xyes; then : +if test "x$ac_cv_func_inet_pton" = xyes +then : -else +else $as_nop ipv6=false fi fi -if $ipv6; then : +if $ipv6 +then : ac_fn_c_check_func "$LINENO" "inet_ntop" "ac_cv_func_inet_ntop" -if test "x$ac_cv_func_inet_ntop" = xyes; then : - $as_echo "#define HAS_IPV6 1" >>confdefs.h +if test "x$ac_cv_func_inet_ntop" = xyes +then : + printf "%s\n" "#define HAS_IPV6 1" >>confdefs.h fi fi ac_fn_c_check_func "$LINENO" "rewinddir" "ac_cv_func_rewinddir" -if test "x$ac_cv_func_rewinddir" = xyes; then : - $as_echo "#define HAS_REWINDDIR 1" >>confdefs.h +if test "x$ac_cv_func_rewinddir" = xyes +then : + printf "%s\n" "#define HAS_REWINDDIR 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "lockf" "ac_cv_func_lockf" -if test "x$ac_cv_func_lockf" = xyes; then : - $as_echo "#define HAS_LOCKF 1" >>confdefs.h +if test "x$ac_cv_func_lockf" = xyes +then : + printf "%s\n" "#define HAS_LOCKF 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "mkfifo" "ac_cv_func_mkfifo" -if test "x$ac_cv_func_mkfifo" = xyes; then : - $as_echo "#define HAS_MKFIFO 1" >>confdefs.h +if test "x$ac_cv_func_mkfifo" = xyes +then : + printf "%s\n" "#define HAS_MKFIFO 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd" -if test "x$ac_cv_func_getcwd" = xyes; then : - $as_echo "#define HAS_GETCWD 1" >>confdefs.h +if test "x$ac_cv_func_getcwd" = xyes +then : + printf "%s\n" "#define HAS_GETCWD 1" >>confdefs.h fi -ac_fn_c_check_decl "$LINENO" "system" "ac_cv_have_decl_system" "#include -" -if test "x$ac_cv_have_decl_system" = xyes; then : - $as_echo "#define HAS_SYSTEM 1" >>confdefs.h +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 +printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } +if test ${ac_cv_c_undeclared_builtin_options+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_CFLAGS=$CFLAGS + ac_cv_c_undeclared_builtin_options='cannot detect' + for ac_arg in '' -fno-builtin; do + CFLAGS="$ac_save_CFLAGS $ac_arg" + # This test program should *not* compile successfully. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +(void) strchr; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + # This test program should compile successfully. + # No library function is consistently available on + # freestanding implementations, so test against a dummy + # declaration. Include always-available headers on the + # off chance that they somehow elicit warnings. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +extern void ac_decl (int, char *); + +int +main (void) +{ +(void) ac_decl (0, (char *) 0); + (void) ac_decl; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + if test x"$ac_arg" = x +then : + ac_cv_c_undeclared_builtin_options='none needed' +else $as_nop + ac_cv_c_undeclared_builtin_options=$ac_arg +fi + break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + CFLAGS=$ac_save_CFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 +printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } + case $ac_cv_c_undeclared_builtin_options in #( + 'cannot detect') : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot make $CC report undeclared builtins +See \`config.log' for more details" "$LINENO" 5; } ;; #( + 'none needed') : + ac_c_undeclared_builtin_options='' ;; #( + *) : + ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; +esac + +ac_fn_check_decl "$LINENO" "system" "ac_cv_have_decl_system" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_system" = xyes +then : + printf "%s\n" "#define HAS_SYSTEM 1" >>confdefs.h +fi ## utime ## Note: this was defined in config/s-nt.h but the autoconf macros do not @@ -15656,39 +16630,43 @@ fi # of HAS_UTIME on Windows but this will probably need to be clarified case $host in #( *-*-mingw32|*-pc-windows) : - $as_echo "#define HAS_UTIME 1" >>confdefs.h + printf "%s\n" "#define HAS_UTIME 1" >>confdefs.h ;; #( *) : - ac_fn_c_check_header_mongrel "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_types_h" = xyes; then : - ac_fn_c_check_header_mongrel "$LINENO" "utime.h" "ac_cv_header_utime_h" "$ac_includes_default" -if test "x$ac_cv_header_utime_h" = xyes; then : + ac_fn_c_check_header_compile "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_types_h" = xyes +then : + ac_fn_c_check_header_compile "$LINENO" "utime.h" "ac_cv_header_utime_h" "$ac_includes_default" +if test "x$ac_cv_header_utime_h" = xyes +then : ac_fn_c_check_func "$LINENO" "utime" "ac_cv_func_utime" -if test "x$ac_cv_func_utime" = xyes; then : - $as_echo "#define HAS_UTIME 1" >>confdefs.h +if test "x$ac_cv_func_utime" = xyes +then : + printf "%s\n" "#define HAS_UTIME 1" >>confdefs.h fi fi - fi - ;; esac ac_fn_c_check_func "$LINENO" "utimes" "ac_cv_func_utimes" -if test "x$ac_cv_func_utimes" = xyes; then : - $as_echo "#define HAS_UTIMES 1" >>confdefs.h +if test "x$ac_cv_func_utimes" = xyes +then : + printf "%s\n" "#define HAS_UTIMES 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "fchmod" "ac_cv_func_fchmod" -if test "x$ac_cv_func_fchmod" = xyes; then : +if test "x$ac_cv_func_fchmod" = xyes +then : ac_fn_c_check_func "$LINENO" "fchown" "ac_cv_func_fchown" -if test "x$ac_cv_func_fchown" = xyes; then : - $as_echo "#define HAS_FCHMOD 1" >>confdefs.h +if test "x$ac_cv_func_fchown" = xyes +then : + printf "%s\n" "#define HAS_FCHMOD 1" >>confdefs.h fi @@ -15696,10 +16674,12 @@ fi ac_fn_c_check_func "$LINENO" "truncate" "ac_cv_func_truncate" -if test "x$ac_cv_func_truncate" = xyes; then : +if test "x$ac_cv_func_truncate" = xyes +then : ac_fn_c_check_func "$LINENO" "ftruncate" "ac_cv_func_ftruncate" -if test "x$ac_cv_func_ftruncate" = xyes; then : - $as_echo "#define HAS_TRUNCATE 1" >>confdefs.h +if test "x$ac_cv_func_ftruncate" = xyes +then : + printf "%s\n" "#define HAS_TRUNCATE 1" >>confdefs.h fi @@ -15708,17 +16688,19 @@ fi ## select ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select" -if test "x$ac_cv_func_select" = xyes; then : +if test "x$ac_cv_func_select" = xyes +then : ac_fn_c_check_type "$LINENO" "fd_set" "ac_cv_type_fd_set" " #include #include " -if test "x$ac_cv_type_fd_set" = xyes; then : - $as_echo "#define HAS_SELECT 1" >>confdefs.h +if test "x$ac_cv_type_fd_set" = xyes +then : + printf "%s\n" "#define HAS_SELECT 1" >>confdefs.h select=true -else +else $as_nop select=false fi @@ -15726,19 +16708,23 @@ fi ac_fn_c_check_func "$LINENO" "nanosleep" "ac_cv_func_nanosleep" -if test "x$ac_cv_func_nanosleep" = xyes; then : - $as_echo "#define HAS_NANOSLEEP 1" >>confdefs.h +if test "x$ac_cv_func_nanosleep" = xyes +then : + printf "%s\n" "#define HAS_NANOSLEEP 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "symlink" "ac_cv_func_symlink" -if test "x$ac_cv_func_symlink" = xyes; then : +if test "x$ac_cv_func_symlink" = xyes +then : ac_fn_c_check_func "$LINENO" "readlink" "ac_cv_func_readlink" -if test "x$ac_cv_func_readlink" = xyes; then : +if test "x$ac_cv_func_readlink" = xyes +then : ac_fn_c_check_func "$LINENO" "lstat" "ac_cv_func_lstat" -if test "x$ac_cv_func_lstat" = xyes; then : - $as_echo "#define HAS_SYMLINK 1" >>confdefs.h +if test "x$ac_cv_func_lstat" = xyes +then : + printf "%s\n" "#define HAS_SYMLINK 1" >>confdefs.h fi @@ -15748,30 +16734,33 @@ fi ac_fn_c_check_func "$LINENO" "realpath" "ac_cv_func_realpath" -if test "x$ac_cv_func_realpath" = xyes; then : - $as_echo "#define HAS_REALPATH 1" >>confdefs.h +if test "x$ac_cv_func_realpath" = xyes +then : + printf "%s\n" "#define HAS_REALPATH 1" >>confdefs.h fi # wait ac_fn_c_check_func "$LINENO" "waitpid" "ac_cv_func_waitpid" -if test "x$ac_cv_func_waitpid" = xyes; then : +if test "x$ac_cv_func_waitpid" = xyes +then : wait=true - $as_echo "#define HAS_WAITPID 1" >>confdefs.h + printf "%s\n" "#define HAS_WAITPID 1" >>confdefs.h -else +else $as_nop wait=false fi ac_fn_c_check_func "$LINENO" "wait4" "ac_cv_func_wait4" -if test "x$ac_cv_func_wait4" = xyes; then : +if test "x$ac_cv_func_wait4" = xyes +then : has_wait=true - $as_echo "#define HAS_WAIT4 1" >>confdefs.h + printf "%s\n" "#define HAS_WAIT4 1" >>confdefs.h fi @@ -15779,43 +16768,52 @@ fi ## getgroups ac_fn_c_check_func "$LINENO" "getgroups" "ac_cv_func_getgroups" -if test "x$ac_cv_func_getgroups" = xyes; then : - $as_echo "#define HAS_GETGROUPS 1" >>confdefs.h +if test "x$ac_cv_func_getgroups" = xyes +then : + printf "%s\n" "#define HAS_GETGROUPS 1" >>confdefs.h fi ## setgroups ac_fn_c_check_func "$LINENO" "setgroups" "ac_cv_func_setgroups" -if test "x$ac_cv_func_setgroups" = xyes; then : - $as_echo "#define HAS_SETGROUPS 1" >>confdefs.h +if test "x$ac_cv_func_setgroups" = xyes +then : + printf "%s\n" "#define HAS_SETGROUPS 1" >>confdefs.h fi ## initgroups ac_fn_c_check_func "$LINENO" "initgroups" "ac_cv_func_initgroups" -if test "x$ac_cv_func_initgroups" = xyes; then : - $as_echo "#define HAS_INITGROUPS 1" >>confdefs.h +if test "x$ac_cv_func_initgroups" = xyes +then : + printf "%s\n" "#define HAS_INITGROUPS 1" >>confdefs.h fi ## termios -ac_fn_c_check_header_mongrel "$LINENO" "termios.h" "ac_cv_header_termios_h" "$ac_includes_default" -if test "x$ac_cv_header_termios_h" = xyes; then : +ac_fn_c_check_header_compile "$LINENO" "termios.h" "ac_cv_header_termios_h" "$ac_includes_default" +if test "x$ac_cv_header_termios_h" = xyes +then : ac_fn_c_check_func "$LINENO" "tcgetattr" "ac_cv_func_tcgetattr" -if test "x$ac_cv_func_tcgetattr" = xyes; then : +if test "x$ac_cv_func_tcgetattr" = xyes +then : ac_fn_c_check_func "$LINENO" "tcsetattr" "ac_cv_func_tcsetattr" -if test "x$ac_cv_func_tcsetattr" = xyes; then : +if test "x$ac_cv_func_tcsetattr" = xyes +then : ac_fn_c_check_func "$LINENO" "tcsendbreak" "ac_cv_func_tcsendbreak" -if test "x$ac_cv_func_tcsendbreak" = xyes; then : +if test "x$ac_cv_func_tcsendbreak" = xyes +then : ac_fn_c_check_func "$LINENO" "tcflush" "ac_cv_func_tcflush" -if test "x$ac_cv_func_tcflush" = xyes; then : +if test "x$ac_cv_func_tcflush" = xyes +then : ac_fn_c_check_func "$LINENO" "tcflow" "ac_cv_func_tcflow" -if test "x$ac_cv_func_tcflow" = xyes; then : - $as_echo "#define HAS_TERMIOS 1" >>confdefs.h +if test "x$ac_cv_func_tcflow" = xyes +then : + printf "%s\n" "#define HAS_TERMIOS 1" >>confdefs.h fi @@ -15830,17 +16828,17 @@ fi fi - ## setitimer ac_fn_c_check_func "$LINENO" "setitimer" "ac_cv_func_setitimer" -if test "x$ac_cv_func_setitimer" = xyes; then : +if test "x$ac_cv_func_setitimer" = xyes +then : setitimer=true - $as_echo "#define HAS_SETITIMER 1" >>confdefs.h + printf "%s\n" "#define HAS_SETITIMER 1" >>confdefs.h -else +else $as_nop setitimer=false fi @@ -15850,12 +16848,13 @@ fi # (should be debugged later) case $host in #( *-*-mingw32|*-pc-windows) : - $as_echo "#define HAS_GETHOSTNAME 1" >>confdefs.h + printf "%s\n" "#define HAS_GETHOSTNAME 1" >>confdefs.h ;; #( *) : ac_fn_c_check_func "$LINENO" "gethostname" "ac_cv_func_gethostname" -if test "x$ac_cv_func_gethostname" = xyes; then : - $as_echo "#define HAS_GETHOSTNAME 1" >>confdefs.h +if test "x$ac_cv_func_gethostname" = xyes +then : + printf "%s\n" "#define HAS_GETHOSTNAME 1" >>confdefs.h fi ;; @@ -15863,28 +16862,30 @@ esac ## uname -ac_fn_c_check_header_mongrel "$LINENO" "sys/utsname.h" "ac_cv_header_sys_utsname_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_utsname_h" = xyes; then : +ac_fn_c_check_header_compile "$LINENO" "sys/utsname.h" "ac_cv_header_sys_utsname_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_utsname_h" = xyes +then : ac_fn_c_check_func "$LINENO" "uname" "ac_cv_func_uname" -if test "x$ac_cv_func_uname" = xyes; then : - $as_echo "#define HAS_UNAME 1" >>confdefs.h +if test "x$ac_cv_func_uname" = xyes +then : + printf "%s\n" "#define HAS_UNAME 1" >>confdefs.h fi fi - ## gettimeofday ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" -if test "x$ac_cv_func_gettimeofday" = xyes; then : +if test "x$ac_cv_func_gettimeofday" = xyes +then : gettimeofday=true - $as_echo "#define HAS_GETTIMEOFDAY 1" >>confdefs.h + printf "%s\n" "#define HAS_GETTIMEOFDAY 1" >>confdefs.h -else +else $as_nop gettimeofday=false fi @@ -15892,8 +16893,9 @@ fi ## mktime ac_fn_c_check_func "$LINENO" "mktime" "ac_cv_func_mktime" -if test "x$ac_cv_func_mktime" = xyes; then : - $as_echo "#define HAS_MKTIME 1" >>confdefs.h +if test "x$ac_cv_func_mktime" = xyes +then : + printf "%s\n" "#define HAS_MKTIME 1" >>confdefs.h fi @@ -15905,8 +16907,9 @@ case $host in #( ;; #( *) : ac_fn_c_check_func "$LINENO" "setsid" "ac_cv_func_setsid" -if test "x$ac_cv_func_setsid" = xyes; then : - $as_echo "#define HAS_SETSID 1" >>confdefs.h +if test "x$ac_cv_func_setsid" = xyes +then : + printf "%s\n" "#define HAS_SETSID 1" >>confdefs.h fi ;; @@ -15915,8 +16918,9 @@ esac ## putenv ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv" -if test "x$ac_cv_func_putenv" = xyes; then : - $as_echo "#define HAS_PUTENV 1" >>confdefs.h +if test "x$ac_cv_func_putenv" = xyes +then : + printf "%s\n" "#define HAS_PUTENV 1" >>confdefs.h fi @@ -15924,10 +16928,12 @@ fi ## setenv and unsetenv ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv" -if test "x$ac_cv_func_setenv" = xyes; then : +if test "x$ac_cv_func_setenv" = xyes +then : ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv" -if test "x$ac_cv_func_unsetenv" = xyes; then : - $as_echo "#define HAS_SETENV_UNSETENV 1" >>confdefs.h +if test "x$ac_cv_func_unsetenv" = xyes +then : + printf "%s\n" "#define HAS_SETENV_UNSETENV 1" >>confdefs.h fi @@ -15939,18 +16945,22 @@ fi # (should be debugged later) case $host in #( *-pc-windows) : - $as_echo "#define HAS_LOCALE_H 1" >>confdefs.h + printf "%s\n" "#define HAS_LOCALE_H 1" >>confdefs.h ;; #( *) : - ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" -if test "x$ac_cv_header_locale_h" = xyes; then : + ac_fn_c_check_header_compile "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = xyes +then : ac_fn_c_check_func "$LINENO" "newlocale" "ac_cv_func_newlocale" -if test "x$ac_cv_func_newlocale" = xyes; then : +if test "x$ac_cv_func_newlocale" = xyes +then : ac_fn_c_check_func "$LINENO" "freelocale" "ac_cv_func_freelocale" -if test "x$ac_cv_func_freelocale" = xyes; then : +if test "x$ac_cv_func_freelocale" = xyes +then : ac_fn_c_check_func "$LINENO" "uselocale" "ac_cv_func_uselocale" -if test "x$ac_cv_func_uselocale" = xyes; then : - $as_echo "#define HAS_LOCALE_H 1" >>confdefs.h +if test "x$ac_cv_func_uselocale" = xyes +then : + printf "%s\n" "#define HAS_LOCALE_H 1" >>confdefs.h fi @@ -15959,19 +16969,22 @@ fi fi fi - ;; esac -ac_fn_c_check_header_mongrel "$LINENO" "xlocale.h" "ac_cv_header_xlocale_h" "$ac_includes_default" -if test "x$ac_cv_header_xlocale_h" = xyes; then : +ac_fn_c_check_header_compile "$LINENO" "xlocale.h" "ac_cv_header_xlocale_h" "$ac_includes_default" +if test "x$ac_cv_header_xlocale_h" = xyes +then : ac_fn_c_check_func "$LINENO" "newlocale" "ac_cv_func_newlocale" -if test "x$ac_cv_func_newlocale" = xyes; then : +if test "x$ac_cv_func_newlocale" = xyes +then : ac_fn_c_check_func "$LINENO" "freelocale" "ac_cv_func_freelocale" -if test "x$ac_cv_func_freelocale" = xyes; then : +if test "x$ac_cv_func_freelocale" = xyes +then : ac_fn_c_check_func "$LINENO" "uselocale" "ac_cv_func_uselocale" -if test "x$ac_cv_func_uselocale" = xyes; then : - $as_echo "#define HAS_XLOCALE_H 1" >>confdefs.h +if test "x$ac_cv_func_uselocale" = xyes +then : + printf "%s\n" "#define HAS_XLOCALE_H 1" >>confdefs.h fi @@ -15982,38 +16995,41 @@ fi fi - ## strtod_l # Note: not detected on MSVC so hardcoding the result # (should be debugged later) case $host in #( *-pc-windows) : - $as_echo "#define HAS_STRTOD_L 1" >>confdefs.h + printf "%s\n" "#define HAS_STRTOD_L 1" >>confdefs.h ;; #( *) : ac_fn_c_check_func "$LINENO" "strtod_l" "ac_cv_func_strtod_l" -if test "x$ac_cv_func_strtod_l" = xyes; then : - $as_echo "#define HAS_STRTOD_L 1" >>confdefs.h +if test "x$ac_cv_func_strtod_l" = xyes +then : + printf "%s\n" "#define HAS_STRTOD_L 1" >>confdefs.h fi ;; esac ## shared library support -if $supports_shared_libraries; then : +if $supports_shared_libraries +then : case $host in #( *-*-mingw32|*-pc-windows|*-*-cygwin*) : DLLIBS="" ;; #( *) : ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : +if test "x$ac_cv_func_dlopen" = xyes +then : supports_shared_libraries=true DLLIBS="" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 -$as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : - $as_echo_n "(cached) " >&6 -else +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -16022,61 +17038,64 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char dlopen (); int -main () +main (void) { return dlopen (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_cv_lib_dl_dlopen=yes -else +else $as_nop ac_cv_lib_dl_dlopen=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 -$as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : supports_shared_libraries=true DLLIBS="-ldl $DLLIBS" -else +else $as_nop supports_shared_libraries=false fi fi ;; esac -else +else $as_nop supports_shared_libraries=false fi -if $supports_shared_libraries; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: Dynamic loading of shared libraries is supported." >&5 -$as_echo "$as_me: Dynamic loading of shared libraries is supported." >&6;} - $as_echo "#define SUPPORT_DYNAMIC_LINKING 1" >>confdefs.h +if $supports_shared_libraries +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Dynamic loading of shared libraries is supported." >&5 +printf "%s\n" "$as_me: Dynamic loading of shared libraries is supported." >&6;} + printf "%s\n" "#define SUPPORT_DYNAMIC_LINKING 1" >>confdefs.h -else - { $as_echo "$as_me:${as_lineno-$LINENO}: Dynamic loading of shared libraries is not supported." >&5 -$as_echo "$as_me: Dynamic loading of shared libraries is not supported." >&6;} +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Dynamic loading of shared libraries is not supported." >&5 +printf "%s\n" "$as_me: Dynamic loading of shared libraries is not supported." >&6;} fi ## mmap -ac_fn_c_check_header_mongrel "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_mman_h" = xyes; then : +ac_fn_c_check_header_compile "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mman_h" = xyes +then : ac_fn_c_check_func "$LINENO" "mmap" "ac_cv_func_mmap" -if test "x$ac_cv_func_mmap" = xyes; then : +if test "x$ac_cv_func_mmap" = xyes +then : ac_fn_c_check_func "$LINENO" "munmap" "ac_cv_func_munmap" -if test "x$ac_cv_func_munmap" = xyes; then : - $as_echo "#define HAS_MMAP 1" >>confdefs.h +if test "x$ac_cv_func_munmap" = xyes +then : + printf "%s\n" "#define HAS_MMAP 1" >>confdefs.h fi @@ -16085,12 +17104,12 @@ fi fi - ## pwrite ac_fn_c_check_func "$LINENO" "pwrite" "ac_cv_func_pwrite" -if test "x$ac_cv_func_pwrite" = xyes; then : - $as_echo "#define HAS_PWRITE 1" >>confdefs.h +if test "x$ac_cv_func_pwrite" = xyes +then : + printf "%s\n" "#define HAS_PWRITE 1" >>confdefs.h fi @@ -16107,24 +17126,25 @@ case $ocaml_cv_cc_vendor,$host in #( cc_has_debug_prefix_map=false ;; #( *) : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports -fdebug-prefix-map" >&5 -$as_echo_n "checking whether the C compiler supports -fdebug-prefix-map... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler supports -fdebug-prefix-map" >&5 +printf %s "checking whether the C compiler supports -fdebug-prefix-map... " >&6; } saved_CFLAGS="$CFLAGS" CFLAGS="-fdebug-prefix-map=old=new $CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main() { return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : cc_has_debug_prefix_map=true - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop cc_has_debug_prefix_map=false - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$saved_CFLAGS" ;; esac @@ -16136,48 +17156,54 @@ ac_fn_c_check_member "$LINENO" "struct stat" "st_atim.tv_nsec" "ac_cv_member_str #include " -if test "x$ac_cv_member_struct_stat_st_atim_tv_nsec" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_atim_tv_nsec" = xyes +then : stat_has_ns_precision=true - $as_echo "#define HAS_NANOSECOND_STAT 1" >>confdefs.h + printf "%s\n" "#define HAS_NANOSECOND_STAT 1" >>confdefs.h fi -if ! $stat_has_ns_precision; then : +if ! $stat_has_ns_precision +then : ac_fn_c_check_member "$LINENO" "struct stat" "st_atimespec.tv_nsec" "ac_cv_member_struct_stat_st_atimespec_tv_nsec" " $ac_includes_default #include " -if test "x$ac_cv_member_struct_stat_st_atimespec_tv_nsec" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_atimespec_tv_nsec" = xyes +then : stat_has_ns_precision=true - $as_echo "#define HAS_NANOSECOND_STAT 2" >>confdefs.h + printf "%s\n" "#define HAS_NANOSECOND_STAT 2" >>confdefs.h fi fi -if ! $stat_has_ns_precision; then : +if ! $stat_has_ns_precision +then : ac_fn_c_check_member "$LINENO" "struct stat" "st_atimensec" "ac_cv_member_struct_stat_st_atimensec" " $ac_includes_default #include " -if test "x$ac_cv_member_struct_stat_st_atimensec" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_atimensec" = xyes +then : stat_has_ns_precision=true - $as_echo "#define HAS_NANOSECOND_STAT 3" >>confdefs.h + printf "%s\n" "#define HAS_NANOSECOND_STAT 3" >>confdefs.h fi fi -if $stat_has_ns_precision; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: stat supports nanosecond precision" >&5 -$as_echo "$as_me: stat supports nanosecond precision" >&6;} -else - { $as_echo "$as_me:${as_lineno-$LINENO}: stat does not support nanosecond precision" >&5 -$as_echo "$as_me: stat does not support nanosecond precision" >&6;} +if $stat_has_ns_precision +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: stat supports nanosecond precision" >&5 +printf "%s\n" "$as_me: stat supports nanosecond precision" >&6;} +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: stat does not support nanosecond precision" >&5 +printf "%s\n" "$as_me: stat does not support nanosecond precision" >&6;} fi # Number of arguments of gethostbyname_r @@ -16190,12 +17216,13 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how many arguments gethostbyname_r() takes" >&5 -$as_echo_n "checking how many arguments gethostbyname_r() takes... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how many arguments gethostbyname_r() takes" >&5 +printf %s "checking how many arguments gethostbyname_r() takes... " >&6; } - if ${ac_cv_func_which_gethostbyname_r+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${ac_cv_func_which_gethostbyname_r+y} +then : + printf %s "(cached) " >&6 +else $as_nop ################################################################ @@ -16215,7 +17242,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { char *name = "www.gnu.org"; @@ -16225,10 +17252,11 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_func_which_gethostbyname_r=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # # SIX ARGUMENTS @@ -16241,7 +17269,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { char *name = "www.gnu.org"; @@ -16255,10 +17283,11 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_func_which_gethostbyname_r=six fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi @@ -16273,7 +17302,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { char *name = "www.gnu.org"; @@ -16287,10 +17316,11 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_func_which_gethostbyname_r=five fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi @@ -16305,7 +17335,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { char *name = "www.gnu.org"; @@ -16317,10 +17347,11 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_func_which_gethostbyname_r=three fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi @@ -16332,44 +17363,44 @@ fi case "$ac_cv_func_which_gethostbyname_r" in three|five|six) -$as_echo "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h +printf "%s\n" "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h ;; esac case "$ac_cv_func_which_gethostbyname_r" in three) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: three" >&5 -$as_echo "three" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: three" >&5 +printf "%s\n" "three" >&6; } -$as_echo "#define HAVE_FUNC_GETHOSTBYNAME_R_3 1" >>confdefs.h +printf "%s\n" "#define HAVE_FUNC_GETHOSTBYNAME_R_3 1" >>confdefs.h ;; five) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: five" >&5 -$as_echo "five" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: five" >&5 +printf "%s\n" "five" >&6; } -$as_echo "#define HAVE_FUNC_GETHOSTBYNAME_R_5 1" >>confdefs.h +printf "%s\n" "#define HAVE_FUNC_GETHOSTBYNAME_R_5 1" >>confdefs.h ;; six) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: six" >&5 -$as_echo "six" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: six" >&5 +printf "%s\n" "six" >&6; } -$as_echo "#define HAVE_FUNC_GETHOSTBYNAME_R_6 1" >>confdefs.h +printf "%s\n" "#define HAVE_FUNC_GETHOSTBYNAME_R_6 1" >>confdefs.h ;; no) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot find function declaration in netdb.h" >&5 -$as_echo "cannot find function declaration in netdb.h" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cannot find function declaration in netdb.h" >&5 +printf "%s\n" "cannot find function declaration in netdb.h" >&6; } ;; unknown) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: can't tell" >&5 -$as_echo "can't tell" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: can't tell" >&5 +printf "%s\n" "can't tell" >&6; } ;; *) @@ -16388,14 +17419,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu case $ac_cv_func_which_gethostbyname_r in #( six) : - $as_echo "#define HAS_GETHOSTBYNAME_R 6" >>confdefs.h + printf "%s\n" "#define HAS_GETHOSTBYNAME_R 6" >>confdefs.h ;; #( five) : - $as_echo "#define HAS_GETHOSTBYNAME_R 5" >>confdefs.h + printf "%s\n" "#define HAS_GETHOSTBYNAME_R 5" >>confdefs.h ;; #( three) : - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: OCaml does not support this variant" >&5 -$as_echo "$as_me: WARNING: OCaml does not support this variant" >&2;} ;; #( + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: OCaml does not support this variant" >&5 +printf "%s\n" "$as_me: WARNING: OCaml does not support this variant" >&2;} ;; #( *) : ;; esac @@ -16410,12 +17441,13 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - { $as_echo "$as_me:${as_lineno-$LINENO}: checking how many arguments gethostbyaddr_r() takes" >&5 -$as_echo_n "checking how many arguments gethostbyaddr_r() takes... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how many arguments gethostbyaddr_r() takes" >&5 +printf %s "checking how many arguments gethostbyaddr_r() takes... " >&6; } - if ${ac_cv_func_which_gethostbyaddr_r+:} false; then : - $as_echo_n "(cached) " >&6 -else + if test ${ac_cv_func_which_gethostbyaddr_r+y} +then : + printf %s "(cached) " >&6 +else $as_nop ################################################################ @@ -16435,7 +17467,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { char *addr = "192.168.1.1"; @@ -16445,10 +17477,11 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_func_which_gethostbyaddr_r=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # # EIGHT ARGUMENTS @@ -16461,7 +17494,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { char *addr = "192.168.1.1"; @@ -16476,10 +17509,11 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_func_which_gethostbyaddr_r=eight fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi @@ -16494,7 +17528,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { char *addr = "192.168.1.1"; @@ -16509,10 +17543,11 @@ main () return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_func_which_gethostbyaddr_r=seven fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi @@ -16524,36 +17559,36 @@ fi case "$ac_cv_func_which_gethostbyaddr_r" in seven|eight) -$as_echo "#define HAVE_GETHOSTBYADDR_R 1" >>confdefs.h +printf "%s\n" "#define HAVE_GETHOSTBYADDR_R 1" >>confdefs.h ;; esac case "$ac_cv_func_which_gethostbyaddr_r" in eight) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: eight" >&5 -$as_echo "eight" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: eight" >&5 +printf "%s\n" "eight" >&6; } -$as_echo "#define HAVE_FUNC_GETHOSTBYADDR_R_8 1" >>confdefs.h +printf "%s\n" "#define HAVE_FUNC_GETHOSTBYADDR_R_8 1" >>confdefs.h ;; seven) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: seven" >&5 -$as_echo "seven" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: seven" >&5 +printf "%s\n" "seven" >&6; } -$as_echo "#define HAVE_FUNC_GETHOSTBYADDR_R_7 1" >>confdefs.h +printf "%s\n" "#define HAVE_FUNC_GETHOSTBYADDR_R_7 1" >>confdefs.h ;; no) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot find function declaration in netdb.h" >&5 -$as_echo "cannot find function declaration in netdb.h" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cannot find function declaration in netdb.h" >&5 +printf "%s\n" "cannot find function declaration in netdb.h" >&6; } ;; unknown) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: can't tell" >&5 -$as_echo "can't tell" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: can't tell" >&5 +printf "%s\n" "can't tell" >&6; } ;; *) @@ -16572,10 +17607,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu case $ac_cv_func_which_gethostbyaddr_r in #( eight) : - $as_echo "#define HAS_GETHOSTBYADDR_R 8" >>confdefs.h + printf "%s\n" "#define HAS_GETHOSTBYADDR_R 8" >>confdefs.h ;; #( seven) : - $as_echo "#define HAS_GETHOSTBYADDR_R 7" >>confdefs.h + printf "%s\n" "#define HAS_GETHOSTBYADDR_R 7" >>confdefs.h ;; #( *) : ;; @@ -16584,8 +17619,9 @@ esac ## mkstemp ac_fn_c_check_func "$LINENO" "mkstemp" "ac_cv_func_mkstemp" -if test "x$ac_cv_func_mkstemp" = xyes; then : - $as_echo "#define HAS_MKSTEMP 1" >>confdefs.h +if test "x$ac_cv_func_mkstemp" = xyes +then : + printf "%s\n" "#define HAS_MKSTEMP 1" >>confdefs.h fi @@ -16593,8 +17629,9 @@ fi ## nice ac_fn_c_check_func "$LINENO" "nice" "ac_cv_func_nice" -if test "x$ac_cv_func_nice" = xyes; then : - $as_echo "#define HAS_NICE 1" >>confdefs.h +if test "x$ac_cv_func_nice" = xyes +then : + printf "%s\n" "#define HAS_NICE 1" >>confdefs.h fi @@ -16602,8 +17639,9 @@ fi ## dup3 ac_fn_c_check_func "$LINENO" "dup3" "ac_cv_func_dup3" -if test "x$ac_cv_func_dup3" = xyes; then : - $as_echo "#define HAS_DUP3 1" >>confdefs.h +if test "x$ac_cv_func_dup3" = xyes +then : + printf "%s\n" "#define HAS_DUP3 1" >>confdefs.h fi @@ -16611,8 +17649,9 @@ fi ## pipe2 ac_fn_c_check_func "$LINENO" "pipe2" "ac_cv_func_pipe2" -if test "x$ac_cv_func_pipe2" = xyes; then : - $as_echo "#define HAS_PIPE2 1" >>confdefs.h +if test "x$ac_cv_func_pipe2" = xyes +then : + printf "%s\n" "#define HAS_PIPE2 1" >>confdefs.h fi @@ -16620,8 +17659,9 @@ fi ## accept4 ac_fn_c_check_func "$LINENO" "accept4" "ac_cv_func_accept4" -if test "x$ac_cv_func_accept4" = xyes; then : - $as_echo "#define HAS_ACCEPT4 1" >>confdefs.h +if test "x$ac_cv_func_accept4" = xyes +then : + printf "%s\n" "#define HAS_ACCEPT4 1" >>confdefs.h fi @@ -16629,21 +17669,24 @@ fi ## getauxval ac_fn_c_check_func "$LINENO" "getauxval" "ac_cv_func_getauxval" -if test "x$ac_cv_func_getauxval" = xyes; then : - $as_echo "#define HAS_GETAUXVAL 1" >>confdefs.h +if test "x$ac_cv_func_getauxval" = xyes +then : + printf "%s\n" "#define HAS_GETAUXVAL 1" >>confdefs.h fi ## shmat -ac_fn_c_check_header_mongrel "$LINENO" "sys/shm.h" "ac_cv_header_sys_shm_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_shm_h" = xyes; then : +ac_fn_c_check_header_compile "$LINENO" "sys/shm.h" "ac_cv_header_sys_shm_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_shm_h" = xyes +then : - $as_echo "#define HAS_SYS_SHM_H 1" >>confdefs.h + printf "%s\n" "#define HAS_SYS_SHM_H 1" >>confdefs.h ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" -if test "x$ac_cv_func_shmat" = xyes; then : - $as_echo "#define HAS_SHMAT 1" >>confdefs.h +if test "x$ac_cv_func_shmat" = xyes +then : + printf "%s\n" "#define HAS_SHMAT 1" >>confdefs.h fi @@ -16651,25 +17694,28 @@ fi fi - ## execvpe ac_fn_c_check_func "$LINENO" "execvpe" "ac_cv_func_execvpe" -if test "x$ac_cv_func_execvpe" = xyes; then : - $as_echo "#define HAS_EXECVPE 1" >>confdefs.h +if test "x$ac_cv_func_execvpe" = xyes +then : + printf "%s\n" "#define HAS_EXECVPE 1" >>confdefs.h fi ## posix_spawn -ac_fn_c_check_header_mongrel "$LINENO" "spawn.h" "ac_cv_header_spawn_h" "$ac_includes_default" -if test "x$ac_cv_header_spawn_h" = xyes; then : +ac_fn_c_check_header_compile "$LINENO" "spawn.h" "ac_cv_header_spawn_h" "$ac_includes_default" +if test "x$ac_cv_header_spawn_h" = xyes +then : ac_fn_c_check_func "$LINENO" "posix_spawn" "ac_cv_func_posix_spawn" -if test "x$ac_cv_func_posix_spawn" = xyes; then : +if test "x$ac_cv_func_posix_spawn" = xyes +then : ac_fn_c_check_func "$LINENO" "posix_spawnp" "ac_cv_func_posix_spawnp" -if test "x$ac_cv_func_posix_spawnp" = xyes; then : - $as_echo "#define HAS_POSIX_SPAWN 1" >>confdefs.h +if test "x$ac_cv_func_posix_spawnp" = xyes +then : + printf "%s\n" "#define HAS_POSIX_SPAWN 1" >>confdefs.h fi @@ -16678,18 +17724,19 @@ fi fi - ## ffs or _BitScanForward ac_fn_c_check_func "$LINENO" "ffs" "ac_cv_func_ffs" -if test "x$ac_cv_func_ffs" = xyes; then : - $as_echo "#define HAS_FFS 1" >>confdefs.h +if test "x$ac_cv_func_ffs" = xyes +then : + printf "%s\n" "#define HAS_FFS 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "_BitScanForward" "ac_cv_func__BitScanForward" -if test "x$ac_cv_func__BitScanForward" = xyes; then : - $as_echo "#define HAS_BITSCANFORWARD 1" >>confdefs.h +if test "x$ac_cv_func__BitScanForward" = xyes +then : + printf "%s\n" "#define HAS_BITSCANFORWARD 1" >>confdefs.h fi @@ -16699,17 +17746,18 @@ fi case $enable_debugger in #( no) : with_debugger="" - { $as_echo "$as_me:${as_lineno-$LINENO}: replay debugger disabled" >&5 -$as_echo "$as_me: replay debugger disabled" >&6;} ;; #( + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: replay debugger disabled" >&5 +printf "%s\n" "$as_me: replay debugger disabled" >&6;} ;; #( *) : - if $sockets; then : + if $sockets +then : with_debugger="ocamldebugger" - { $as_echo "$as_me:${as_lineno-$LINENO}: replay debugger supported" >&5 -$as_echo "$as_me: replay debugger supported" >&6;} -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: replay debugger supported" >&5 +printf "%s\n" "$as_me: replay debugger supported" >&6;} +else $as_nop with_debugger="" - { $as_echo "$as_me:${as_lineno-$LINENO}: replay debugger not supported" >&5 -$as_echo "$as_me: replay debugger not supported" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: replay debugger not supported" >&5 +printf "%s\n" "$as_me: replay debugger not supported" >&6;} fi ;; esac @@ -16724,19 +17772,19 @@ esac ## Determine if system stack overflows can be detected -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stack overflows can be detected" >&5 -$as_echo_n "checking whether stack overflows can be detected... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stack overflows can be detected" >&5 +printf %s "checking whether stack overflows can be detected... " >&6; } case $arch,$system in #( i386,linux_elf|amd64,linux|amd64,macosx \ |amd64,openbsd|i386,bsd_elf|arm64,linux|arm64,macosx) : - $as_echo "#define HAS_STACK_OVERFLOW_DETECTION 1" >>confdefs.h + printf "%s\n" "#define HAS_STACK_OVERFLOW_DETECTION 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } ;; #( + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; #( *) : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; esac ## Determine if the POSIX threads library is supported @@ -16747,15 +17795,15 @@ case $enable_systhreads,$enable_unix_lib in #( as_fn_error $? "the Win32/POSIX threads library requires the unix library" "$LINENO" 5 ;; #( no,*|*,no) : systhread_support=false - { $as_echo "$as_me:${as_lineno-$LINENO}: the Win32/POSIX threads library is disabled" >&5 -$as_echo "$as_me: the Win32/POSIX threads library is disabled" >&6;} ;; #( + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: the Win32/POSIX threads library is disabled" >&5 +printf "%s\n" "$as_me: the Win32/POSIX threads library is disabled" >&6;} ;; #( *) : case $host in #( *-*-mingw32|*-pc-windows) : systhread_support=true otherlibraries="$otherlibraries systhreads" - { $as_echo "$as_me:${as_lineno-$LINENO}: the Win32 threads library is supported" >&5 -$as_echo "$as_me: the Win32 threads library is supported" >&6;} ;; #( + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: the Win32 threads library is supported" >&5 +printf "%s\n" "$as_me: the Win32 threads library is supported" >&6;} ;; #( *) : @@ -16780,38 +17828,37 @@ if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then ax_pthread_save_CC="$CC" ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" - if test "x$PTHREAD_CC" != "x"; then : + if test "x$PTHREAD_CC" != "x" +then : CC="$PTHREAD_CC" fi CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 -$as_echo_n "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 +printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif char pthread_join (); int -main () +main (void) { return pthread_join (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ax_pthread_ok=yes fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 -$as_echo "$ax_pthread_ok" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" @@ -16889,11 +17936,12 @@ case $host_os in _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 -$as_echo "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} + $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 +printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} fi -rm -f conftest* +rm -rf conftest* ;; @@ -16913,11 +17961,12 @@ esac # Are we compiling with Clang? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 -$as_echo_n "checking whether $CC is Clang... " >&6; } -if ${ax_cv_PTHREAD_CLANG+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 +printf %s "checking whether $CC is Clang... " >&6; } +if test ${ax_cv_PTHREAD_CLANG+y} +then : + printf %s "(cached) " >&6 +else $as_nop ax_cv_PTHREAD_CLANG=no # Note that Autoconf sets GCC=yes for Clang as well as GCC if test "x$GCC" = "xyes"; then @@ -16930,16 +17979,17 @@ else _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1; then : + $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 +then : ax_cv_PTHREAD_CLANG=yes fi -rm -f conftest* +rm -rf conftest* fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 -$as_echo "$ax_cv_PTHREAD_CLANG" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 +printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } ax_pthread_clang="$ax_cv_PTHREAD_CLANG" @@ -16953,13 +18003,15 @@ ax_pthread_clang="$ax_cv_PTHREAD_CLANG" # [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 # To solve this, first try -pthread together with -lpthread for GCC -if test "x$GCC" = "xyes"; then : +if test "x$GCC" = "xyes" +then : ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" fi # Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first -if test "x$ax_pthread_clang" = "xyes"; then : +if test "x$ax_pthread_clang" = "xyes" +then : ax_pthread_flags="-pthread,-lpthread -pthread" fi @@ -16981,9 +18033,10 @@ case $host_os in ax_pthread_check_macro="--" ;; esac -if test "x$ax_pthread_check_macro" = "x--"; then : +if test "x$ax_pthread_check_macro" = "x--" +then : ax_pthread_check_cond=0 -else +else $as_nop ax_pthread_check_cond="!defined($ax_pthread_check_macro)" fi @@ -16993,31 +18046,32 @@ for ax_pthread_try_flag in $ax_pthread_flags; do case $ax_pthread_try_flag in none) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 -$as_echo_n "checking whether pthreads work without any flags... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +printf %s "checking whether pthreads work without any flags... " >&6; } ;; *,*) PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 -$as_echo_n "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 +printf %s "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } ;; -*) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 -$as_echo_n "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 +printf %s "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } PTHREAD_CFLAGS="$ax_pthread_try_flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ax_pthread_config+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ax_pthread_config+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. else @@ -17025,11 +18079,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ax_pthread_config="yes" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -17041,15 +18099,16 @@ fi fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 -$as_echo "$ax_pthread_config" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 +printf "%s\n" "$ax_pthread_config" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ax_pthread_config" = "xno"; then : + if test "x$ax_pthread_config" = "xno" +then : continue fi PTHREAD_CFLAGS="`pthread-config --cflags`" @@ -17057,8 +18116,8 @@ fi ;; *) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 -$as_echo_n "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 +printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac @@ -17093,7 +18152,7 @@ $as_echo_n "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } } static void *start_routine(void *a) { return a; } int -main () +main (void) { pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); @@ -17105,18 +18164,20 @@ pthread_t th; pthread_attr_t attr; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ax_pthread_ok=yes fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 -$as_echo "$ax_pthread_ok" >&6; } - if test "x$ax_pthread_ok" = "xyes"; then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 +printf "%s\n" "$ax_pthread_ok" >&6; } + if test "x$ax_pthread_ok" = "xyes" +then : break fi @@ -17162,11 +18223,12 @@ if test "x$ax_pthread_clang" = "xyes"; then # that build with -Werror. So if the active version of Clang has # this misfeature, we search for an option to squash it. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 -$as_echo_n "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } -if ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 +printf %s "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } +if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} +then : + printf %s "(cached) " >&6 +else $as_nop ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown # Create an alternate version of $ac_link that compiles and # links in two steps (.c -> .o, .o -> exe) instead of one @@ -17178,7 +18240,8 @@ else ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" ax_pthread_save_CFLAGS="$CFLAGS" for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do - if test "x$ax_pthread_try" = "xunknown"; then : + if test "x$ax_pthread_try" = "xunknown" +then : break fi CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" @@ -17187,32 +18250,35 @@ fi /* end confdefs.h. */ int main(void){return 0;} _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ac_link="$ax_pthread_2step_ac_link" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void){return 0;} _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done ac_link="$ax_pthread_save_ac_link" CFLAGS="$ax_pthread_save_CFLAGS" - if test "x$ax_pthread_try" = "x"; then : + if test "x$ax_pthread_try" = "x" +then : ax_pthread_try=no fi ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 -$as_echo "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 +printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in no | unknown) ;; @@ -17231,51 +18297,53 @@ if test "x$ax_pthread_ok" = "xyes"; then LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 -$as_echo_n "checking for joinable pthread attribute... " >&6; } -if ${ax_cv_PTHREAD_JOINABLE_ATTR+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +printf %s "checking for joinable pthread attribute... " >&6; } +if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} +then : + printf %s "(cached) " >&6 +else $as_nop ax_cv_PTHREAD_JOINABLE_ATTR=unknown for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { int attr = $ax_pthread_attr; return attr /* ; */ ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 -$as_echo "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 +printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ - test "x$ax_pthread_joinable_attr_defined" != "xyes"; then : + test "x$ax_pthread_joinable_attr_defined" != "xyes" +then : -cat >>confdefs.h <<_ACEOF -#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR -_ACEOF +printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR" >>confdefs.h ax_pthread_joinable_attr_defined=yes fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 -$as_echo_n "checking whether more special flags are required for pthreads... " >&6; } -if ${ax_cv_PTHREAD_SPECIAL_FLAGS+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 +printf %s "checking whether more special flags are required for pthreads... " >&6; } +if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} +then : + printf %s "(cached) " >&6 +else $as_nop ax_cv_PTHREAD_SPECIAL_FLAGS=no case $host_os in solaris*) @@ -17284,24 +18352,26 @@ else esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 -$as_echo "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 +printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ - test "x$ax_pthread_special_flags_added" != "xyes"; then : + test "x$ax_pthread_special_flags_added" != "xyes" +then : PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" ax_pthread_special_flags_added=yes fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 -$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; } -if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 +printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } +if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { int i = PTHREAD_PRIO_INHERIT; return i; @@ -17309,21 +18379,23 @@ int i = PTHREAD_PRIO_INHERIT; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : ax_cv_PTHREAD_PRIO_INHERIT=yes -else +else $as_nop ax_cv_PTHREAD_PRIO_INHERIT=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 -$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 +printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ - test "x$ax_pthread_prio_inherit_defined" != "xyes"; then : + test "x$ax_pthread_prio_inherit_defined" != "xyes" +then : -$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h +printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h ax_pthread_prio_inherit_defined=yes @@ -17341,7 +18413,8 @@ fi #handle absolute path differently from PATH based program lookup case "x$CC" in #( x/*) : - if as_fn_executable_p ${CC}_r; then : + if as_fn_executable_p ${CC}_r +then : PTHREAD_CC="${CC}_r" fi ;; #( *) : @@ -17349,11 +18422,12 @@ fi ;; #( do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_PTHREAD_CC+:} false; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PTHREAD_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else @@ -17361,11 +18435,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_PTHREAD_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -17376,11 +18454,11 @@ fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 -$as_echo "$PTHREAD_CC" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +printf "%s\n" "$PTHREAD_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -17408,15 +18486,16 @@ if test "x$ax_pthread_ok" = "xyes"; then systhread_support=true otherlibraries="$otherlibraries systhreads" common_cflags="$common_cflags $PTHREAD_CFLAGS" - { $as_echo "$as_me:${as_lineno-$LINENO}: the POSIX threads library is supported" >&5 -$as_echo "$as_me: the POSIX threads library is supported" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: the POSIX threads library is supported" >&5 +printf "%s\n" "$as_me: the POSIX threads library is supported" >&6;} saved_CFLAGS="$CFLAGS" saved_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$LIBS $PTHREAD_LIBS" ac_fn_c_check_func "$LINENO" "sigwait" "ac_cv_func_sigwait" -if test "x$ac_cv_func_sigwait" = xyes; then : - $as_echo "#define HAS_SIGWAIT 1" >>confdefs.h +if test "x$ac_cv_func_sigwait" = xyes +then : + printf "%s\n" "#define HAS_SIGWAIT 1" >>confdefs.h fi @@ -17425,12 +18504,13 @@ fi : else ax_pthread_ok=no - if test x"$enable_systhreads" = "xyes"; then : + if test x"$enable_systhreads" = "xyes" +then : as_fn_error $? "the POSIX thread library is not available" "$LINENO" 5 -else +else $as_nop systhread_support=false - { $as_echo "$as_me:${as_lineno-$LINENO}: the POSIX threads library is not supported" >&5 -$as_echo "$as_me: the POSIX threads library is not supported" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: the POSIX threads library is not supported" >&5 +printf "%s\n" "$as_me: the POSIX threads library is not supported" >&6;} fi fi ac_ext=c @@ -17446,14 +18526,15 @@ esac ## Does the assembler support debug prefix map and CFI directives as_has_debug_prefix_map=false asm_cfi_supported=false -if $native_compiler; then : +if $native_compiler +then : case $host in #( *-*-mingw32|*-pc-windows) : ;; #( *) : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the assembler supports --debug-prefix-map" >&5 -$as_echo_n "checking whether the assembler supports --debug-prefix-map... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the assembler supports --debug-prefix-map" >&5 +printf %s "checking whether the assembler supports --debug-prefix-map... " >&6; } saved_CC="$CC" @@ -17483,16 +18564,17 @@ camlPervasives__loop_1128: .loc 1 193 _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : as_has_debug_prefix_map=true - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop ashas_debug_prefix_map=false - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # Restore the content of confdefs.h @@ -17506,13 +18588,14 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the assembler supports CFI directives" >&5 -$as_echo_n "checking whether the assembler supports CFI directives... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the assembler supports CFI directives" >&5 +printf %s "checking whether the assembler supports CFI directives... " >&6; } - if test x"$enable_cfi" = "xno"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 -$as_echo "disabled" >&6; } -else + if test x"$enable_cfi" = "xno" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 +printf "%s\n" "disabled" >&6; } +else $as_nop saved_CC="$CC" saved_CFLAGS="$CFLAGS" @@ -17544,16 +18627,18 @@ camlPervasives__loop_1128: .cfi_endproc _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : aspp_ok=true -else +else $as_nop aspp_ok=false fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext - if test "$AS" = "$ASPP"; then : + if test "$AS" = "$ASPP" +then : as_ok="$aspp_ok" -else +else $as_nop CC="$AS" ac_compile='$CC $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -17567,12 +18652,13 @@ camlPervasives__loop_1128: .cfi_endproc _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : as_ok=true -else +else $as_nop as_ok=false fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi @@ -17586,22 +18672,24 @@ fi LIBS="$saved_LIBS" - if $aspp_ok && $as_ok; then : + if $aspp_ok && $as_ok +then : asm_cfi_supported=true - $as_echo "#define ASM_CFI_SUPPORTED 1" >>confdefs.h - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - if test x"$enable_cfi" = "xyes"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: requested but not available + printf "%s\n" "#define ASM_CFI_SUPPORTED 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + if test x"$enable_cfi" = "xyes" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: requested but not available as_fn_error $? "exiting" "$LINENO" 5" >&5 -$as_echo "requested but not available +printf "%s\n" "requested but not available as_fn_error $? "exiting" "$LINENO" 5" >&6; } -else +else $as_nop asm_cfi_supported=false - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi fi @@ -17611,47 +18699,52 @@ fi ## Frame pointers -if test x"$enable_frame_pointers" = "xyes"; then : +if test x"$enable_frame_pointers" = "xyes" +then : case "$host,$cc_basename" in #( x86_64-*-linux*,gcc*|x86_64-*-linux*,clang*) : common_cflags="$common_cflags -g -fno-omit-frame-pointer" frame_pointers=true - $as_echo "#define WITH_FRAME_POINTERS 1" >>confdefs.h + printf "%s\n" "#define WITH_FRAME_POINTERS 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: using frame pointers" >&5 -$as_echo "$as_me: using frame pointers" >&6;} ;; #( + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: using frame pointers" >&5 +printf "%s\n" "$as_me: using frame pointers" >&6;} ;; #( *) : as_fn_error $? "frame pointers not supported on this platform" "$LINENO" 5 ;; esac -else - { $as_echo "$as_me:${as_lineno-$LINENO}: not using frame pointers" >&5 -$as_echo "$as_me: not using frame pointers" >&6;} +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not using frame pointers" >&5 +printf "%s\n" "$as_me: not using frame pointers" >&6;} frame_pointers=false fi ## CPP mangling -if test x"$enable_cpp_mangling" = "xyes"; then : +if test x"$enable_cpp_mangling" = "xyes" +then : cpp_mangling=true - $as_echo "#define WITH_CPP_MANGLING 1" >>confdefs.h + printf "%s\n" "#define WITH_CPP_MANGLING 1" >>confdefs.h -else +else $as_nop cpp_mangling=false fi ## No naked pointers -if test x"$enable_naked_pointers" = "xno" ; then : +if test x"$enable_naked_pointers" = "xno" +then : naked_pointers=false - $as_echo "#define NO_NAKED_POINTERS 1" >>confdefs.h + printf "%s\n" "#define NO_NAKED_POINTERS 1" >>confdefs.h -else +else $as_nop naked_pointers=true fi -if test x"$enable_naked_pointers_checker" = "xyes" ; then : - if test x"$enable_naked_pointers" = "xno" ; then : +if test x"$enable_naked_pointers_checker" = "xyes" +then : + if test x"$enable_naked_pointers" = "xno" +then : as_fn_error $? "--enable-naked-pointers-checker and --disable-naked-pointers are incompatible" "$LINENO" 5 fi case "$arch","$system" in #( @@ -17660,7 +18753,7 @@ fi |amd64,freebsd|amd64,solaris \ |arm64,linux|arm64,macosx) : naked_pointers_checker=true - $as_echo "#define NAKED_POINTERS_CHECKER 1" >>confdefs.h + printf "%s\n" "#define NAKED_POINTERS_CHECKER 1" >>confdefs.h ;; #( *) : as_fn_error $? "naked pointers checker not supported on this platform" "$LINENO" 5 @@ -17668,18 +18761,19 @@ fi *) : ;; esac -else +else $as_nop naked_pointers_checker=false fi ## Check for mmap support for huge pages and contiguous heap - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mmap supports huge pages" >&5 -$as_echo_n "checking whether mmap supports huge pages... " >&6; } - if test "$cross_compiling" = yes; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no assumed" >&5 -$as_echo "no assumed" >&6; } -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether mmap supports huge pages" >&5 +printf %s "checking whether mmap supports huge pages... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no assumed" >&5 +printf "%s\n" "no assumed" >&6; } +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -17721,18 +18815,17 @@ int main (int argc, char *argv[]){ } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - $as_echo "#define HAS_HUGE_PAGES 1" >>confdefs.h +if ac_fn_c_try_run "$LINENO" +then : + printf "%s\n" "#define HAS_HUGE_PAGES 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define HUGE_PAGE_SIZE (4 * 1024 * 1024) -_ACEOF + printf "%s\n" "#define HUGE_PAGE_SIZE (4 * 1024 * 1024)" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext @@ -17740,37 +18833,40 @@ fi -cat >>confdefs.h <<_ACEOF -#define PROFINFO_WIDTH $profinfo_width -_ACEOF +printf "%s\n" "#define PROFINFO_WIDTH $profinfo_width" >>confdefs.h -if $profinfo; then : - $as_echo "#define WITH_PROFINFO 1" >>confdefs.h +if $profinfo +then : + printf "%s\n" "#define WITH_PROFINFO 1" >>confdefs.h fi -if test x"$enable_installing_bytecode_programs" = "xno"; then : +if test x"$enable_installing_bytecode_programs" = "xno" +then : install_bytecode_programs=false -else +else $as_nop install_bytecode_programs=true fi -if test x"$enable_installing_source_artifacts" = "xno"; then : +if test x"$enable_installing_source_artifacts" = "xno" +then : install_source_artifacts=false -else +else $as_nop install_source_artifacts=true fi -if test x"$enable_ocamldoc" = "xno"; then : +if test x"$enable_ocamldoc" = "xno" +then : ocamldoc="" -else +else $as_nop ocamldoc=ocamldoc fi documentation_tool_cmd='' # Check whether --with-odoc was given. -if test "${with_odoc+set}" = set; then : +if test ${with_odoc+y} +then : withval=$with_odoc; case $withval in #( yes) : documentation_tool='odoc' ;; #( @@ -17780,12 +18876,13 @@ if test "${with_odoc+set}" = set; then : documentation_tool_cmd="$withval" documentation_tool='odoc' ;; esac -else +else $as_nop documentation_tool='ocamldoc' fi if test "x$documentation_tool_cmd" = 'x' - documentation_tool_cmd="$documentation_tool"; then : + documentation_tool_cmd="$documentation_tool" +then : fi @@ -17798,84 +18895,92 @@ case $enable_ocamltest,false in #( ocamltest='' ;; esac -if test x"$enable_flambda" = "xyes"; then : +if test x"$enable_flambda" = "xyes" +then : flambda=true flambda2=false - if test x"$enable_flambda2" = "xyes"; then : + if test x"$enable_flambda2" = "xyes" +then : as_fn_error $? "please enable only one of Flambda 1 and Flambda 2" "$LINENO" 5 fi -else +else $as_nop flambda=false fi -if test x"$enable_flambda2" = "xyes"; then : +if test x"$enable_flambda2" = "xyes" +then : flambda2=true flambda=false -else +else $as_nop flambda2=false fi -if test x"$enable_flambda_invariants" = "xyes"; then : +if test x"$enable_flambda_invariants" = "xyes" +then : flambda_invariants=true -else +else $as_nop flambda_invariants=false fi -if test x"$enable_cmm_invariants" = "xyes"; then : +if test x"$enable_cmm_invariants" = "xyes" +then : cmm_invariants=true -else +else $as_nop cmm_invariants=false fi -if test x"$enable_cmm_invariants" = "xyes"; then : +if test x"$enable_cmm_invariants" = "xyes" +then : cmm_invariants=true -else +else $as_nop cmm_invariants=false fi -if test x"$enable_flat_float_array" = "xno"; then : +if test x"$enable_flat_float_array" = "xno" +then : flat_float_array=false -else - $as_echo "#define FLAT_FLOAT_ARRAY 1" >>confdefs.h +else $as_nop + printf "%s\n" "#define FLAT_FLOAT_ARRAY 1" >>confdefs.h flat_float_array=true fi -if test x"$enable_function_sections" = "xno"; then : +if test x"$enable_function_sections" = "xno" +then : function_sections=false -else +else $as_nop case $arch in #( amd64|i386|arm64) : # not supported on arm32, see issue #9124. case $target in #( *-cygwin*|*-mingw*|*-windows|*-apple-darwin*) : function_sections=false; - { $as_echo "$as_me:${as_lineno-$LINENO}: No support for function sections on $target." >&5 -$as_echo "$as_me: No support for function sections on $target." >&6;} ;; #( + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No support for function sections on $target." >&5 +printf "%s\n" "$as_me: No support for function sections on $target." >&6;} ;; #( *) : case $ocaml_cv_cc_vendor in #( gcc-0123-*|gcc-4-01234567) : function_sections=false; - { $as_echo "$as_me:${as_lineno-$LINENO}: Function sections are not + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Function sections are not supported in GCC prior to version 4.8." >&5 -$as_echo "$as_me: Function sections are not +printf "%s\n" "$as_me: Function sections are not supported in GCC prior to version 4.8." >&6;} ;; #( clang-012-*|clang-3-01234) : function_sections=false; - { $as_echo "$as_me:${as_lineno-$LINENO}: Function sections are not supported + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Function sections are not supported in Clang prior to version 3.5." >&5 -$as_echo "$as_me: Function sections are not supported +printf "%s\n" "$as_me: Function sections are not supported in Clang prior to version 3.5." >&6;} ;; #( gcc-*|clang-*) : function_sections=true; internal_cflags="$internal_cflags -ffunction-sections"; - $as_echo "#define FUNCTION_SECTIONS 1" >>confdefs.h + printf "%s\n" "#define FUNCTION_SECTIONS 1" >>confdefs.h ;; #( *) : function_sections=false; - { $as_echo "$as_me:${as_lineno-$LINENO}: Function sections are not supported by + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Function sections are not supported by $ocaml_cv_cc_vendor." >&5 -$as_echo "$as_me: Function sections are not supported by +printf "%s\n" "$as_me: Function sections are not supported by $ocaml_cv_cc_vendor." >&6;} ;; #( *) : ;; @@ -17886,12 +18991,14 @@ esac ;; #( *) : function_sections=false ;; esac; - if test x"$function_sections" = "xfalse"; then : - if test x"$enable_function_sections" = "xyes"; then : + if test x"$function_sections" = "xfalse" +then : + if test x"$enable_function_sections" = "xyes" +then : as_fn_error $? "Function sections are not supported." "$LINENO" 5 -else - { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling function sections." >&5 -$as_echo "$as_me: Disabling function sections." >&6;} +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Disabling function sections." >&5 +printf "%s\n" "$as_me: Disabling function sections." >&6;} fi fi fi @@ -17912,49 +19019,56 @@ esac ;; #( ;; esac -if test x"$probes" = "xfalse"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: Disabling tracing probes: no support on $target." >&5 -$as_echo "$as_me: Disabling tracing probes: no support on $target." >&6;} +if test x"$probes" = "xfalse" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Disabling tracing probes: no support on $target." >&5 +printf "%s\n" "$as_me: Disabling tracing probes: no support on $target." >&6;} fi -if test x"$with_afl" = "xyes"; then : +if test x"$with_afl" = "xyes" +then : afl=true -else +else $as_nop afl=false fi -if test x"$enable_force_safe_string" = "xno"; then : +if test x"$enable_force_safe_string" = "xno" +then : force_safe_string=false -else - $as_echo "#define CAML_SAFE_STRING 1" >>confdefs.h +else $as_nop + printf "%s\n" "#define CAML_SAFE_STRING 1" >>confdefs.h force_safe_string=true fi -if test x"$DEFAULT_STRING" = "xunsafe"; then : +if test x"$DEFAULT_STRING" = "xunsafe" +then : default_safe_string=false -else +else $as_nop default_safe_string=true fi -if test x"$enable_stack_allocation" = "xno"; then : +if test x"$enable_stack_allocation" = "xno" +then : stack_allocation=false -else - if $arch64; then : - $as_echo "#define STACK_ALLOCATION 1" >>confdefs.h +else $as_nop + if $arch64 +then : + printf "%s\n" "#define STACK_ALLOCATION 1" >>confdefs.h stack_allocation=true -else +else $as_nop as_fn_error $? "Stack allocation is only supported on 64-bit platforms. \ Please pass '--enable-stack-allocation=no'." "$LINENO" 5 fi fi -if test x"$enable_poll_insertion" = "xyes"; then : - $as_echo "#define POLL_INSERTION 1" >>confdefs.h +if test x"$enable_poll_insertion" = "xyes" +then : + printf "%s\n" "#define POLL_INSERTION 1" >>confdefs.h poll_insertion=true -else +else $as_nop poll_insertion=false fi @@ -17976,11 +19090,13 @@ case $host in #( nativecclibs="$cclibs $DLLIBS" ;; esac -if test x"$libdir" = x'${exec_prefix}/lib'; then : +if test x"$libdir" = x'${exec_prefix}/lib' +then : libdir="$libdir"/ocaml fi -if test x"$mandir" = x'${datarootdir}/man'; then : +if test x"$mandir" = x'${datarootdir}/man' +then : mandir='${prefix}/man' fi @@ -17999,7 +19115,8 @@ esac ;; #( esac # Define default prefix correctly for the different Windows ports -if test x"$prefix" = "xNONE"; then : +if test x"$prefix" = "xNONE" +then : case $host in #( i686-w64-mingw32) : prefix='C:/ocamlmgw' ;; #( @@ -18012,9 +19129,10 @@ if test x"$prefix" = "xNONE"; then : *) : ;; esac -else +else $as_nop if test x"$unix_or_win32" = "xwin32" \ - && test "$host_vendor-$host_os" != "$build_vendor-$build_os" ; then : + && test "$host_vendor-$host_os" != "$build_vendor-$build_os" +then : case $build in #( *-pc-cygwin) : prefix="$(LC_ALL=C.UTF-8 cygpath -m "$prefix")" ;; #( @@ -18029,35 +19147,36 @@ fi # (all this should be understood and fixed) case $host in #( *-*-mingw32) : - $as_echo "#define HAS_BROKEN_PRINTF 1" >>confdefs.h + printf "%s\n" "#define HAS_BROKEN_PRINTF 1" >>confdefs.h - $as_echo "#define HAS_STRERROR 1" >>confdefs.h + printf "%s\n" "#define HAS_STRERROR 1" >>confdefs.h - $as_echo "#define HAS_IPV6 1" >>confdefs.h + printf "%s\n" "#define HAS_IPV6 1" >>confdefs.h - $as_echo "#define HAS_NICE 1" >>confdefs.h + printf "%s\n" "#define HAS_NICE 1" >>confdefs.h ;; #( *-pc-windows) : - $as_echo "#define HAS_BROKEN_PRINTF 1" >>confdefs.h + printf "%s\n" "#define HAS_BROKEN_PRINTF 1" >>confdefs.h - $as_echo "#define HAS_STRERROR 1" >>confdefs.h + printf "%s\n" "#define HAS_STRERROR 1" >>confdefs.h - $as_echo "#define HAS_IPV6 1" >>confdefs.h + printf "%s\n" "#define HAS_IPV6 1" >>confdefs.h - $as_echo "#define HAS_NICE 1" >>confdefs.h + printf "%s\n" "#define HAS_NICE 1" >>confdefs.h ;; #( *-*-solaris*) : # This is required as otherwise floats are printed # as "Infinity" and "Inf" instead of the expected "inf" - $as_echo "#define HAS_BROKEN_PRINTF 1" >>confdefs.h + printf "%s\n" "#define HAS_BROKEN_PRINTF 1" >>confdefs.h ;; #( *) : ;; esac -if test x"$enable_stdlib_manpages" != "xno"; then : +if test x"$enable_stdlib_manpages" != "xno" +then : stdlib_manpages=true -else +else $as_nop stdlib_manpages=false fi @@ -18091,8 +19210,8 @@ _ACEOF case $ac_val in #( *${as_nl}*) case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -18122,15 +19241,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; /^ac_cv_env_/b end t clear :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else @@ -18144,8 +19263,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;} fi fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -18162,7 +19281,7 @@ U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" @@ -18178,8 +19297,8 @@ LTLIBOBJS=$ac_ltlibobjs ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL @@ -18202,14 +19321,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST -else +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -18219,46 +19340,46 @@ esac fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || @@ -18267,13 +19388,6 @@ if test "${PATH_SEPARATOR+set}" != set; then fi -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( @@ -18282,8 +19396,12 @@ case $0 in #(( for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -18295,30 +19413,10 @@ if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] @@ -18331,13 +19429,14 @@ as_fn_error () as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $2" >&2 + printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -18364,18 +19463,20 @@ as_fn_unset () { eval $1=; unset $1;} } as_unset=as_fn_unset + # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : eval 'as_fn_append () { eval $1+=\$2 }' -else +else $as_nop as_fn_append () { eval $1=\$$1\$2 @@ -18387,12 +19488,13 @@ fi # as_fn_append # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else +else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` @@ -18423,7 +19525,7 @@ as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | +printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -18445,6 +19547,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -18458,6 +19564,12 @@ case `echo -n x` in #((((( ECHO_N='-n';; esac +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -18499,7 +19611,7 @@ as_fn_mkdir_p () as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -18508,7 +19620,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | +printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -18571,7 +19683,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # values after options handling. ac_log=" This file was extended by OCaml $as_me 4.14.1+jst, which was -generated by GNU Autoconf 2.69. Invocation command line was +generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -18634,14 +19746,16 @@ Report bugs to . OCaml home page: ." _ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ OCaml config.status 4.14.1+jst -configured by $0, generated by GNU Autoconf 2.69, +configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" -Copyright (C) 2012 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -18680,15 +19794,15 @@ do -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; + printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; + printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" @@ -18696,7 +19810,7 @@ do --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; @@ -18705,7 +19819,7 @@ do as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; + printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; @@ -18733,7 +19847,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" @@ -18747,7 +19861,7 @@ exec 5>>config.log sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX - $as_echo "$ac_log" + printf "%s\n" "$ac_log" } >&5 _ACEOF @@ -19068,9 +20182,9 @@ done # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers + test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree @@ -19406,7 +20520,7 @@ do esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done @@ -19414,17 +20528,17 @@ do # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | + ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac @@ -19441,7 +20555,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | +printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -19465,9 +20579,9 @@ $as_echo X"$ac_file" | case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; @@ -19524,8 +20638,8 @@ ac_sed_dataroot=' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' @@ -19568,9 +20682,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" @@ -19586,27 +20700,27 @@ which seems to be undefined. Please make sure it is defined" >&2;} # if test x"$ac_file" != x-; then { - $as_echo "/* $configure_input */" \ + printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else - $as_echo "/* $configure_input */" \ + printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; - :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 -$as_echo "$as_me: executing $ac_file commands" >&6;} + :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac @@ -20139,6 +21253,7 @@ _LT_EOF esac + ltmain=$ac_aux_dir/ltmain.sh @@ -20188,7 +21303,8 @@ if test "$no_create" != yes; then $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi + From e5aa304c05d05ec5d8eadd7603afd37e62ae50bb Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Wed, 5 Jul 2023 18:16:54 -0400 Subject: [PATCH 41/81] comment --- backend/amd64/proc.ml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index aa12162e01b..db4dc700603 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -48,8 +48,7 @@ let win64 = Arch.win64 r14 domain state pointer r15 allocation pointer - xmm0 - xmm15 100 - 115 (for floats) - xmm0 - xmm15 200 - 215 (for 128-bit SIMD vectors) *) + xmm0 - xmm15 100 - 115 (for floats and SIMD vectors) *) (* Conventions: rax - r13: OCaml function arguments From 029996665d5d2d0a2b9bb39c994ac00f304347a3 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Wed, 5 Jul 2023 18:17:28 -0400 Subject: [PATCH 42/81] xmm15f --- backend/amd64/proc.ml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index db4dc700603..e6aca5b9b79 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -161,7 +161,7 @@ let rdx = phys_reg 4 let r10 = phys_reg 10 let r11 = phys_reg 11 let rbp = phys_reg 12 -let rxmm15f = phys_reg 115 +let rxmm15 = phys_reg 115 let destroyed_by_plt_stub = if not X86_proc.use_plt then [| |] else [| r10; r11 |] @@ -373,7 +373,7 @@ let destroyed_at_oper = function | Iop(Iextcall { alloc = false; }) -> destroyed_at_c_call | Iop(Iintop(Idiv | Imod)) | Iop(Iintop_imm((Idiv | Imod), _)) -> [| rax; rdx |] - | Iop(Istore(Single, _, _)) -> [| rxmm15f |] + | Iop(Istore(Single, _, _)) -> [| rxmm15 |] | Iop(Ialloc _ | Ipoll _) -> destroyed_at_alloc_or_poll | Iop(Iintop(Imulh _ | Icomp _) | Iintop_imm((Icomp _), _)) -> [| rax |] @@ -432,7 +432,7 @@ let destroyed_at_basic (basic : Cfg_intf.S.basic) = | Op (Intop (Idiv | Imod)) | Op (Intop_imm ((Idiv | Imod), _)) -> [| rax; rdx |] | Op(Store(Single, _, _)) -> - [| rxmm15f |] + [| rxmm15 |] | Op(Intop(Imulh _ | Icomp _) | Intop_imm((Icomp _), _)) -> [| rax |] | Op (Specific (Irdtsc | Irdpmc)) -> From f318fb7ac927d6f362fc5f6b54bdf844ef8cbfe2 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Wed, 5 Jul 2023 18:19:43 -0400 Subject: [PATCH 43/81] remove class_of --- backend/amd64/proc.ml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index e6aca5b9b79..889d7ed82be 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -127,11 +127,6 @@ let register_name r = else if r < 200 then float_reg_name.(r - 100) else Misc.fatal_errorf "Register of unknown class (%d)" r -let class_of reg = - if reg < 100 then 0 - else if reg < 200 then 1 - else Misc.fatal_errorf "Register of unknown class (%d)" reg - (* Pack registers starting at %rax so as to reduce the number of REX prefixes and thus improve code density *) let rotate_registers = false From 4061d16d7cf2b91108dbb8e56f10e1c813a4d502 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Thu, 6 Jul 2023 11:52:57 -0400 Subject: [PATCH 44/81] regalloc fixes --- backend/amd64/emit.mlp | 5 +- backend/amd64/proc.ml | 52 ++++++++++--------- backend/amd64/selection.ml | 6 +-- backend/arm64/emit.mlp | 4 +- backend/cfg/cfg.ml | 6 ++- backend/debug/available_regs.ml | 8 ++- backend/debug/reg_with_debug_info.ml | 16 +++--- backend/debug/reg_with_debug_info.mli | 13 ++++- backend/proc.mli | 2 +- backend/regalloc/regalloc_invariants.ml | 14 ++--- backend/regalloc/regalloc_irc_utils.ml | 3 +- .../check_regalloc_validation.ml | 14 ++--- 12 files changed, 83 insertions(+), 60 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 7d0eeb92ad8..f8e0d4478bf 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -1373,8 +1373,8 @@ let emit_instr fallthrough i = we must be careful not to clobber it before use. *) let (tmp1, tmp2) = if i.arg.(0).loc = Reg 0 (* rax *) - then (phys_reg 4 (*rdx*), phys_reg 0 (*rax*)) - else (phys_reg 0 (*rax*), phys_reg 4 (*rdx*)) in + then (phys_reg Int 4 (*rdx*), phys_reg Int 0 (*rax*)) + else (phys_reg Int 0 (*rax*), phys_reg Int 4 (*rdx*)) in I.lea (mem64_rip NONE lbl) (reg tmp1); I.movsxd (mem64 DWORD 0 (arg64 i 0) ~scale:4 ~base:(reg64 tmp1)) @@ -1605,6 +1605,7 @@ let begin_assembly unix = () +(* CR mslater: (SIMD) fix this *) let make_stack_loc ~offset i (r : Reg.t) = (* Use "Outgoing" stack locations, instead of "Local", because [slot_offset] emits (Outgoing n) directly diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 889d7ed82be..036587d73a9 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -112,8 +112,8 @@ let register_class_tag c = let num_stack_slot_classes = 3 -let stack_slot_class_for reg = - match reg.typ with +let stack_slot_class_for reg = + match reg.typ with | Val | Addr | Int -> 0 | Float -> 1 | Vec128 -> 2 @@ -146,17 +146,15 @@ let hard_float_reg = let all_phys_regs = Array.append hard_int_reg hard_float_reg -let phys_reg n = - if n < 100 then hard_int_reg.(n) else - if n < 200 then hard_float_reg.(n - 100) - else Misc.fatal_errorf "Register of unknown class (%d)" n +let phys_reg ty n = + Reg.at_location ty (Reg n) -let rax = phys_reg 0 -let rdx = phys_reg 4 -let r10 = phys_reg 10 -let r11 = phys_reg 11 -let rbp = phys_reg 12 -let rxmm15 = phys_reg 115 +let rax = phys_reg Int 0 +let rdx = phys_reg Int 4 +let r10 = phys_reg Int 10 +let r11 = phys_reg Int 11 +let rbp = phys_reg Int 12 +let rxmm15 = phys_reg Float 115 let destroyed_by_plt_stub = if not X86_proc.use_plt then [| |] else [| r10; r11 |] @@ -186,7 +184,7 @@ let calling_conventions first_int last_int first_float last_float make_stack fir match arg.(i) with | Val | Int | Addr as ty -> if !int <= last_int then begin - loc.(i) <- phys_reg !int; + loc.(i) <- phys_reg ty !int; incr int end else begin loc.(i) <- stack_slot (make_stack !ofs) ty; @@ -195,7 +193,7 @@ let calling_conventions first_int last_int first_float last_float make_stack fir assert (not (Reg.Set.mem loc.(i) destroyed_by_plt_stub_set)) | Float -> if !float <= last_float then begin - loc.(i) <- phys_reg !float; + loc.(i) <- phys_reg Float !float; incr float end else begin loc.(i) <- stack_slot (make_stack !ofs) Float; @@ -203,7 +201,7 @@ let calling_conventions first_int last_int first_float last_float make_stack fir end | Vec128 -> if !float <= last_float then begin - loc.(i) <- phys_reg !float; + loc.(i) <- phys_reg Vec128 !float; incr float end else begin ofs := Misc.align !ofs 16; @@ -273,7 +271,7 @@ let win64_loc_external_arguments arg = match arg.(i) with | Val | Int | Addr as ty -> if !reg < 4 then begin - loc.(i) <- phys_reg win64_int_external_arguments.(!reg); + loc.(i) <- phys_reg ty win64_int_external_arguments.(!reg); incr reg end else begin loc.(i) <- stack_slot (Outgoing !ofs) ty; @@ -281,7 +279,7 @@ let win64_loc_external_arguments arg = end | Float -> if !reg < 4 then begin - loc.(i) <- phys_reg win64_float_external_arguments.(!reg); + loc.(i) <- phys_reg Float win64_float_external_arguments.(!reg); incr reg end else begin loc.(i) <- stack_slot (Outgoing !ofs) Float; @@ -289,7 +287,7 @@ let win64_loc_external_arguments arg = end | Vec128 -> if !reg < 4 then begin - loc.(i) <- phys_reg win64_float_external_arguments.(!reg); + loc.(i) <- phys_reg Vec128 win64_float_external_arguments.(!reg); incr reg end else begin ofs := Misc.align !ofs 16; @@ -339,15 +337,19 @@ let regs_are_volatile _rs = false let destroyed_at_c_call = if win64 then (* Win64: rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15 preserved *) - Array.of_list(List.map phys_reg - [0;4;5;6;7;10;11; - 100;101;102;103;104;105]) + Array.append + (Array.of_list(List.map (phys_reg Int) + [0;4;5;6;7;10;11])) + (Array.of_list(List.map (phys_reg Float) + [100;101;102;103;104;105])) else (* Unix: rbp, rbx, r12-r15 preserved *) - Array.of_list(List.map phys_reg - [0;2;3;4;5;6;7;10;11; - 100;101;102;103;104;105;106;107; - 108;109;110;111;112;113;114;115]) + Array.append + (Array.of_list(List.map (phys_reg Int) + [0;2;3;4;5;6;7;10;11])) + (Array.of_list(List.map (phys_reg Float) + [100;101;102;103;104;105;106;107; + 108;109;110;111;112;113;114;115])) let destroyed_at_alloc_or_poll = if X86_proc.use_plt then diff --git a/backend/amd64/selection.ml b/backend/amd64/selection.ml index 5cf0c4877ee..60b15935cc7 100644 --- a/backend/amd64/selection.ml +++ b/backend/amd64/selection.ml @@ -87,9 +87,9 @@ let rec select_addr exp = exception Use_default -let rax = phys_reg 0 -let rcx = phys_reg 5 -let rdx = phys_reg 4 +let rax = phys_reg Int 0 +let rcx = phys_reg Int 5 +let rdx = phys_reg Int 4 let pseudoregs_for_operation op arg res = match op with diff --git a/backend/arm64/emit.mlp b/backend/arm64/emit.mlp index 8a8f0242437..d22c7e523af 100644 --- a/backend/arm64/emit.mlp +++ b/backend/arm64/emit.mlp @@ -130,7 +130,7 @@ let emit_stack r = let ofs = n + Domainstate.(idx_of_field Domain_extra_params) * 8 in `[{emit_reg reg_domain_state_ptr}, #{emit_int ofs}]` | Stack s -> - let ofs = slot_offset s (register_class r) in + let ofs = slot_offset s (stack_slot_class_for r) in `[sp, #{emit_int ofs}]` | _ -> fatal_error "Emit.emit_stack" @@ -160,7 +160,7 @@ let record_frame_label live dbg = | {typ = Val; loc = Reg r} -> live_offset := ((r lsl 1) + 1) :: !live_offset | {typ = Val; loc = Stack s} as reg -> - live_offset := slot_offset s (register_class reg) :: !live_offset + live_offset := slot_offset s (stack_slot_class_for reg) :: !live_offset | {typ = Addr} as r -> Misc.fatal_error ("bad GC root " ^ Reg.name r) | _ -> ()) diff --git a/backend/cfg/cfg.ml b/backend/cfg/cfg.ml index 97b90c8600a..ec7175b08ae 100644 --- a/backend/cfg/cfg.ml +++ b/backend/cfg/cfg.ml @@ -504,8 +504,10 @@ let is_noop_move instr = | Op (Move | Spill | Reload) -> (match instr.arg.(0).loc with | Unknown -> false - | Reg _ | Stack _ -> Reg.same_loc instr.arg.(0) instr.res.(0)) - && Proc.stack_slot_class_for instr.arg.(0) = Proc.stack_slot_class_for instr.res.(0) + | Reg _ -> Reg.same_loc instr.arg.(0) instr.res.(0) && + Proc.register_class instr.arg.(0) = Proc.register_class instr.res.(0) + | Stack _ -> Reg.same_loc instr.arg.(0) instr.res.(0) && + Proc.stack_slot_class_for instr.arg.(0) = Proc.stack_slot_class_for instr.res.(0)) | Op (Csel _) -> ( match instr.res.(0).loc with | Unknown -> false diff --git a/backend/debug/available_regs.ml b/backend/debug/available_regs.ml index b792fa48c7a..5cd4e9978a8 100644 --- a/backend/debug/available_regs.ml +++ b/backend/debug/available_regs.ml @@ -183,7 +183,9 @@ let rec available_regs (instr : M.instruction) ~(avail_before : RAS.t) : RAS.t = then RD.Set.empty else RD.Set.made_unavailable_by_clobber avail_before - ~regs_clobbered:instr.res ~register_class:Proc.register_class + ~regs_clobbered:instr.res + ~register_class:Proc.register_class + ~stack_class:Proc.stack_slot_class_for in let results = Array.map2 @@ -208,8 +210,10 @@ let rec available_regs (instr : M.instruction) ~(avail_before : RAS.t) : RAS.t = let regs_clobbered = Array.append (Proc.destroyed_at_oper instr.desc) instr.res in - RD.Set.made_unavailable_by_clobber avail_before ~regs_clobbered + RD.Set.made_unavailable_by_clobber avail_before + ~regs_clobbered ~register_class:Proc.register_class + ~stack_class:Proc.stack_slot_class_for in (* Second: the cases of (a) allocations and (b) OCaml to OCaml function calls. In these cases, since the GC may run, registers always become diff --git a/backend/debug/reg_with_debug_info.ml b/backend/debug/reg_with_debug_info.ml index 0cfd23a1f17..fd90a345e29 100644 --- a/backend/debug/reg_with_debug_info.ml +++ b/backend/debug/reg_with_debug_info.ml @@ -106,16 +106,20 @@ let holds_non_pointer t = not (holds_pointer t) let assigned_to_stack t = match t.reg.loc with Stack _ -> true | Reg _ | Unknown -> false -let regs_at_same_location (reg1 : Reg.t) (reg2 : Reg.t) ~register_class = +let regs_at_same_location (reg1 : Reg.t) (reg2 : Reg.t) ~register_class ~stack_class = (* We need to check the register classes too: two locations both saying "stack offset N" might actually be different physical locations, for example if one is of class "Int" and another "Float" on amd64. [register_class] will be [Proc.register_class], but cannot be here, due to a circular dependency. *) - reg1.loc = reg2.loc && register_class reg1 = register_class reg2 + reg1.loc = reg2.loc && + match reg1.loc with + | Reg _ -> register_class reg1 = register_class reg2 + | Stack _ -> stack_class reg1 = stack_class reg2 + | Unknown -> false -let at_same_location t (reg : Reg.t) ~register_class = - regs_at_same_location t.reg reg ~register_class +let at_same_location t (reg : Reg.t) ~register_class ~stack_class = + regs_at_same_location t.reg reg ~register_class ~stack_class let debug_info t = t.debug_info @@ -152,12 +156,12 @@ module Set = struct (fun reg acc -> add (create_without_debug_info ~reg) acc) regs empty - let made_unavailable_by_clobber t ~regs_clobbered ~register_class = + let made_unavailable_by_clobber t ~regs_clobbered ~register_class ~stack_class = Reg.Set.fold (fun reg acc -> let made_unavailable = filter - (fun reg' -> regs_at_same_location reg'.reg reg ~register_class) + (fun reg' -> regs_at_same_location reg'.reg reg ~register_class ~stack_class) t in union made_unavailable acc) diff --git a/backend/debug/reg_with_debug_info.mli b/backend/debug/reg_with_debug_info.mli index a26d1e12359..56619dd597f 100644 --- a/backend/debug/reg_with_debug_info.mli +++ b/backend/debug/reg_with_debug_info.mli @@ -63,7 +63,12 @@ val debug_info : t -> Debug_info.t option (physical or pseudoregister) location as the register [reg], which is not equipped with debugging information. [register_class] should be [Proc.register_class]. *) -val at_same_location : t -> Reg.t -> register_class:(Reg.t -> int) -> bool +val at_same_location : + t -> + Reg.t -> + register_class:(Reg.t -> int) -> + stack_class:(Reg.t -> int) -> + bool val holds_pointer : t -> bool @@ -98,7 +103,11 @@ module Set : sig registers in [regs_clobbered]. (Think of [t] as a set of available registers.) [register_class] should always be [Proc.register_class]. *) val made_unavailable_by_clobber : - t -> regs_clobbered:Reg.t array -> register_class:(Reg.t -> int) -> t + t -> + regs_clobbered:Reg.t array -> + register_class:(Reg.t -> int) -> + stack_class:(Reg.t -> int) -> + t end val print : diff --git a/backend/proc.mli b/backend/proc.mli index 66c80b2a63c..7d754bbb7a4 100644 --- a/backend/proc.mli +++ b/backend/proc.mli @@ -25,7 +25,7 @@ val register_class_tag: int -> string val num_available_registers: int array val first_available_register: int array val register_name: int -> string -val phys_reg: int -> Reg.t +val phys_reg: Cmm.machtype_component -> int -> Reg.t val rotate_registers: bool val all_phys_regs : Reg.t array diff --git a/backend/regalloc/regalloc_invariants.ml b/backend/regalloc/regalloc_invariants.ml index 5885677044f..7461dee0644 100644 --- a/backend/regalloc/regalloc_invariants.ml +++ b/backend/regalloc/regalloc_invariants.ml @@ -147,7 +147,7 @@ let postcondition_layout : Cfg_with_layout.t -> unit = unit = match reg.Reg.loc with | Reg phys_reg -> - let phys_reg = Proc.phys_reg phys_reg in + let phys_reg = Proc.phys_reg reg.typ phys_reg in if not (same_reg_class reg phys_reg) then fatal @@ -161,7 +161,7 @@ let postcondition_layout : Cfg_with_layout.t -> unit = in let module Int = Numbers.Int in let used_stack_slots = - Array.init Proc.num_register_classes ~f:(fun _ -> Int.Set.empty) + Array.init Proc.num_stack_slot_classes ~f:(fun _ -> Int.Set.empty) in let record_stack_slot_use (reg : Reg.t) : unit = match reg.loc with @@ -204,7 +204,7 @@ let postcondition_layout : Cfg_with_layout.t -> unit = let fun_num_stack_slots = (Cfg_with_layout.cfg cfg_with_layout).fun_num_stack_slots in - Array.iteri fun_num_stack_slots ~f:(fun reg_class num_slots -> + Array.iteri fun_num_stack_slots ~f:(fun ss_class num_slots -> let available_slots = Seq.ints 0 |> Seq.take num_slots |> Int.Set.of_seq in @@ -212,15 +212,15 @@ let postcondition_layout : Cfg_with_layout.t -> unit = set |> Int.Set.elements |> List.map ~f:string_of_int |> String.concat ", " in - let invalid = Int.Set.diff used_stack_slots.(reg_class) available_slots in + let invalid = Int.Set.diff used_stack_slots.(ss_class) available_slots in if not (Int.Set.is_empty invalid) then - fatal "stack slot class %d uses the following invalid slots: %s" reg_class + fatal "stack slot class %d uses the following invalid slots: %s" ss_class (string_of_set invalid); - let unused = Int.Set.diff available_slots used_stack_slots.(reg_class) in + let unused = Int.Set.diff available_slots used_stack_slots.(ss_class) in if not (Int.Set.is_empty unused) then - fatal "stack slot class %d has the following unused slots: %s" reg_class + fatal "stack slot class %d has the following unused slots: %s" ss_class (string_of_set unused)) let postcondition_liveness : Cfg_with_infos.t -> unit = diff --git a/backend/regalloc/regalloc_irc_utils.ml b/backend/regalloc/regalloc_irc_utils.ml index 57085167752..1f06cbd7d39 100644 --- a/backend/regalloc/regalloc_irc_utils.ml +++ b/backend/regalloc/regalloc_irc_utils.ml @@ -152,7 +152,8 @@ let all_precolored_regs : Reg.t array = let first_available_register = Proc.first_available_register.(reg_class) in let num_available_registers = Proc.num_available_registers.(reg_class) in for reg_idx = 0 to pred num_available_registers do - res.(!i) <- Proc.phys_reg (first_available_register + reg_idx); + (* The machtype does not matter here, only the IDs *) + res.(!i) <- Proc.phys_reg Int (first_available_register + reg_idx); incr i done done; diff --git a/tests/backend/regalloc_validator/check_regalloc_validation.ml b/tests/backend/regalloc_validator/check_regalloc_validation.ml index 5764c1d2a63..43d4052e0e4 100644 --- a/tests/backend/regalloc_validator/check_regalloc_validation.ml +++ b/tests/backend/regalloc_validator/check_regalloc_validation.ml @@ -90,7 +90,7 @@ module Cfg_desc = struct let cfg = Cfg.create ~fun_name:"foo" ~fun_args:(Array.copy fun_args) ~fun_dbg:[] ~fun_fast:false ~fun_contains_calls - ~fun_num_stack_slots:(Array.make Proc.num_register_classes 0) + ~fun_num_stack_slots:(Array.make Proc.num_stack_slot_classes 0) in List.iter (fun (block : Block.t) -> @@ -120,10 +120,10 @@ module Cfg_desc = struct count. *) let update_stack_slots i = let update_slot (r : Reg.t) = - match r.loc, Proc.register_class r with - | Stack (Local idx), reg_class -> - cfg.fun_num_stack_slots.(reg_class) - <- max cfg.fun_num_stack_slots.(reg_class) (idx + 1) + match r.loc, Proc.stack_slot_class_for r with + | Stack (Local idx), ss_class -> + cfg.fun_num_stack_slots.(ss_class) + <- max cfg.fun_num_stack_slots.(ss_class) (idx + 1) | _ -> () in Array.iter update_slot i.arg; @@ -168,7 +168,7 @@ let entry_label = Cfg.create ~fun_name:"foo" ~fun_args:[| Proc.phys_reg 0 |] ~fun_dbg:[] ~fun_fast:false ~fun_contains_calls:false - ~fun_num_stack_slots:(Array.make Proc.num_register_classes 0) + ~fun_num_stack_slots:(Array.make Proc.num_stack_slot_classes 0) in Label.Tbl.add cfg.Cfg.blocks (Cfg.entry_label cfg) { start = Cfg.entry_label cfg; @@ -559,7 +559,7 @@ let () = cfg, cfg) ~exp_std:"fatal exception raised when validating description" ~exp_err: - ">> Fatal error: instruction 20 has a register (V/37) with an unknown \ + ">> Fatal error: instruction 20 has a register (V/68) with an unknown \ location" let () = From eb2efe78eb92964dc4820fe029023fdd4e042214 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Thu, 6 Jul 2023 12:01:00 -0400 Subject: [PATCH 45/81] whitespace/arm --- backend/amd64/regalloc_stack_operands.ml | 2 +- backend/arm64/emit.mlp | 4 +- backend/arm64/proc.ml | 38 +-- backend/cmm.ml | 28 +- backend/cmm.mli | 2 +- backend/cmmgen.ml | 8 +- backend/debug/available_regs.ml | 2 +- backend/debug/reg_with_debug_info.ml | 6 +- backend/mach.ml | 2 +- backend/printcmm.ml | 4 +- backend/printmach.ml | 10 +- backend/proc.mli | 2 +- backend/x86_binary_emitter.ml | 2 +- backend/x86_proc.mli | 2 +- middle_end/clambda.ml | 8 +- middle_end/flambda/flambda_to_clambda.ml | 2 +- middle_end/flambda2/parser/flambda_parser.mli | 14 +- ocaml/asmcomp/amd64/emit.mlp | 2 +- ocaml/asmcomp/cmm_helpers.ml | 4 +- ocaml/asmcomp/cmmgen.ml | 10 +- tests/simd/simd.ml | 274 +++++++++--------- tests/simd/stubs.c | 30 +- .../tests/unboxed-primitive-args/common.ml | 12 +- .../unboxed-primitive-args/test_common.c | 8 +- 24 files changed, 239 insertions(+), 237 deletions(-) diff --git a/backend/amd64/regalloc_stack_operands.ml b/backend/amd64/regalloc_stack_operands.ml index 863f5617dc6..ead88266d43 100644 --- a/backend/amd64/regalloc_stack_operands.ml +++ b/backend/amd64/regalloc_stack_operands.ml @@ -192,7 +192,7 @@ let basic (map : spilled_map) (instr : Cfg.basic Cfg.instruction) = | Op (Specific (Irdtsc | Irdpmc)) | Op (Intop (Ipopcnt | Iclz _| Ictz _)) | Op (Intop_atomic _) - | Op (Move | Spill | Reload | Negf | Absf | Const_float _ | Const_vec128 _ | Compf _ + | Op (Move | Spill | Reload | Negf | Absf | Const_float _ | Const_vec128 _ | Compf _ | Stackoffset _ | Load _ | Store _ | Name_for_debugger _ | Probe_is_enabled _ | Valueofint | Intofvalue | Opaque | Begin_region | End_region ) | Op (Specific (Isqrtf | Isextend32 | Izextend32 | Ilea _ diff --git a/backend/arm64/emit.mlp b/backend/arm64/emit.mlp index d22c7e523af..6ae45873aa7 100644 --- a/backend/arm64/emit.mlp +++ b/backend/arm64/emit.mlp @@ -495,7 +495,7 @@ module BR = Branch_relaxation.Make (struct num_instructions_for_intconst n | Lop (Iconst_float _) -> 2 | Lop (Iconst_symbol _) -> 2 - | Lop (Iconst_vec128 _) -> + | Lop (Iconst_vec128 _) -> (* CR mslater: (SIMD) arm64 *) Misc.fatal_error "128-bit vectors are not supported on this architecture" | Lop (Iintop_atomic _) -> @@ -1190,7 +1190,7 @@ let emit_item = function | Cint n -> ` .quad {emit_nativeint n}\n` | Csingle f -> emit_float32_directive ".long" (Int32.bits_of_float f) | Cdouble f -> emit_float64_directive ".quad" (Int64.bits_of_float f) - | Cvec128 _ -> + | Cvec128 _ -> (* CR mslater: (SIMD) arm64 *) Misc.fatal_error "128-bit vectors not supported on this architecture" | Csymbol_address s -> ` .quad {emit_symbol s.sym_name}\n` diff --git a/backend/arm64/proc.ml b/backend/arm64/proc.ml index f55b4c4dfae..d9b973bc81c 100644 --- a/backend/arm64/proc.ml +++ b/backend/arm64/proc.ml @@ -75,9 +75,9 @@ let register_class_tag c = | 1 -> "f" | c -> Misc.fatal_errorf "Unspecified register class %d" c -let num_stack_slot_classes = 2 +let num_stack_slot_classes = 2 -let stack_slot_class_for r = +let stack_slot_class_for r = match r.typ with | Val | Int | Addr -> 0 | Float -> 1 @@ -95,10 +95,10 @@ let register_name r = let rotate_registers = true -let class_of reg = - if reg < 100 then 0 - else if reg < 200 then 1 - else Misc.fatal_errorf "Register of unknown class (%d)" reg +let class_of reg = + if reg < 100 then 0 + else if reg < 200 then 1 + else Misc.fatal_errorf "Register of unknown class (%d)" reg (* Representation of hard registers by pseudo-registers *) @@ -119,11 +119,11 @@ let hard_float_reg = let all_phys_regs = Array.append hard_int_reg hard_float_reg -let phys_reg n = - if n < 100 then hard_int_reg.(n) else hard_float_reg.(n - 100) +let phys_reg ty n = + Reg.at_location ty (Reg n) -let reg_x8 = phys_reg 8 -let reg_d7 = phys_reg 107 +let reg_x8 = phys_reg Int 8 +let reg_d7 = phys_reg Float 107 let stack_slot slot ty = Reg.at_location ty (Stack slot) @@ -134,7 +134,7 @@ let size_domainstate_args = 64 * size_int let loc_int last_int make_stack int ofs = if !int <= last_int then begin - let l = phys_reg !int in + let l = phys_reg Int !int in incr int; l end else begin ofs := Misc.align !ofs size_int; @@ -144,7 +144,7 @@ let loc_int last_int make_stack int ofs = let loc_float last_float make_stack float ofs = if !float <= last_float then begin - let l = phys_reg !float in + let l = phys_reg Float !float in incr float; l end else begin ofs := Misc.align !ofs size_float; @@ -154,7 +154,7 @@ let loc_float last_float make_stack float ofs = let loc_int32 last_int make_stack int ofs = if !int <= last_int then begin - let l = phys_reg !int in + let l = phys_reg Int !int in incr int; l end else begin let l = stack_slot (make_stack !ofs) Int in @@ -250,7 +250,7 @@ let loc_external_arguments ty_args = let loc_external_results res = let (loc, _) = calling_conventions 0 1 100 100 not_supported 0 res in loc -let loc_exn_bucket = phys_reg 0 +let loc_exn_bucket = phys_reg Int 0 (* See "DWARF for the ARM 64-bit architecture (AArch64)" available from developer.arm.com. *) @@ -285,11 +285,13 @@ let regs_are_volatile _rs = false let destroyed_at_c_call = (* x19-x28, d8-d15 preserved *) - Array.of_list (List.map phys_reg - [0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15; - 100;101;102;103;104;105;106;107; + Array.append + (Array.of_list (List.map (phys_reg Int) + [0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15])) + (Array.of_list (List.map (phys_reg Float) + [100;101;102;103;104;105;106;107; 116;117;118;119;120;121;122;123; - 124;125;126;127;128;129;130;131]) + 124;125;126;127;128;129;130;131])) (* note: keep this function in sync with `destroyed_at_{basic,terminator}` below. *) let destroyed_at_oper = function diff --git a/backend/cmm.ml b/backend/cmm.ml index b44aaad58f9..f1e7376a2d7 100644 --- a/backend/cmm.ml +++ b/backend/cmm.ml @@ -78,10 +78,10 @@ let ge_component comp1 comp2 = | Addr, Addr -> true | Addr, Val -> true | Float, Float -> true - | Vec128, Vec128 -> true + | Vec128, Vec128 -> true | (Int | Addr | Val), (Float | Vec128) | (Float | Vec128), (Int | Addr | Val) - | Float, Vec128 + | Float, Vec128 | Vec128, Float -> assert false @@ -522,7 +522,7 @@ let equal_exttype left right = | XInt32, XInt32 -> true | XInt64, XInt64 -> true | XFloat, XFloat -> true - | XVec128, XVec128 -> true + | XVec128, XVec128 -> true | XInt, (XInt32 | XInt64 | XFloat | XVec128) | XInt32, (XInt | XInt64 | XFloat | XVec128) | XInt64, (XInt | XInt32 | XFloat | XVec128) @@ -568,37 +568,37 @@ let equal_memory_chunk left right = | Double, Double -> true | Onetwentyeight, Onetwentyeight -> true | Byte_unsigned, (Byte_signed | Sixteen_unsigned | Sixteen_signed | Thirtytwo_unsigned - | Thirtytwo_signed | Word_int | Word_val | Single | Double + | Thirtytwo_signed | Word_int | Word_val | Single | Double | Onetwentyeight) | Byte_signed, (Byte_unsigned | Sixteen_unsigned | Sixteen_signed | Thirtytwo_unsigned - | Thirtytwo_signed | Word_int | Word_val | Single | Double + | Thirtytwo_signed | Word_int | Word_val | Single | Double | Onetwentyeight) | Sixteen_unsigned, (Byte_unsigned | Byte_signed | Sixteen_signed | Thirtytwo_unsigned - | Thirtytwo_signed | Word_int | Word_val | Single | Double + | Thirtytwo_signed | Word_int | Word_val | Single | Double | Onetwentyeight) | Sixteen_signed, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Thirtytwo_unsigned - | Thirtytwo_signed | Word_int | Word_val | Single | Double + | Thirtytwo_signed | Word_int | Word_val | Single | Double | Onetwentyeight) | Thirtytwo_unsigned, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed - | Thirtytwo_signed | Word_int | Word_val | Single | Double + | Thirtytwo_signed | Word_int | Word_val | Single | Double | Onetwentyeight) | Thirtytwo_signed, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed - | Thirtytwo_unsigned | Word_int | Word_val | Single | Double + | Thirtytwo_unsigned | Word_int | Word_val | Single | Double | Onetwentyeight) | Word_int, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed - | Thirtytwo_unsigned | Thirtytwo_signed | Word_val | Single | Double + | Thirtytwo_unsigned | Thirtytwo_signed | Word_val | Single | Double | Onetwentyeight) | Word_val, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed - | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Single | Double + | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Single | Double | Onetwentyeight) | Single, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed - | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Word_val | Double + | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Word_val | Double | Onetwentyeight) | Double, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed - | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Word_val | Single + | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Word_val | Single | Onetwentyeight) | Onetwentyeight, (Byte_unsigned | Byte_signed | Sixteen_unsigned | Sixteen_signed - | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Word_val | Single + | Thirtytwo_unsigned | Thirtytwo_signed | Word_int | Word_val | Single | Double) -> false diff --git a/backend/cmm.mli b/backend/cmm.mli index ba87b7cc7d5..019c7603587 100644 --- a/backend/cmm.mli +++ b/backend/cmm.mli @@ -257,7 +257,7 @@ type symbol = { sym_name : string; sym_global : is_global } -(* SIMD vectors are untyped in the backend. +(* SIMD vectors are untyped in the backend. This record holds the bitwise representation of a 128-bit value. *) type vec128_bits = { low : int64; high: int64 } diff --git a/backend/cmmgen.ml b/backend/cmmgen.ml index 965310f0575..648bb0ebb84 100644 --- a/backend/cmmgen.ml +++ b/backend/cmmgen.ml @@ -276,8 +276,8 @@ let emit_structured_constant symb cst cont = emit_int64_constant symb n cont | Uconst_nativeint n -> emit_nativeint_constant symb n cont - | Uconst_vec128 {high; low} -> - emit_vec128_constant symb {high; low} cont + | Uconst_vec128 {high; low} -> + emit_vec128_constant symb {high; low} cont | Uconst_block (tag, csts) -> let cont = List.fold_right emit_constant csts cont in emit_block symb (block_header tag (List.length csts)) cont @@ -355,7 +355,7 @@ let unbox_number dbg bn arg = low_32 dbg (unbox_int dbg Pint32 arg) | Boxed_integer (bi, _, _) -> unbox_int dbg bi arg - | Boxed_vector (vi, _, _) -> + | Boxed_vector (vi, _, _) -> unbox_vector dbg vi arg (* Auxiliary functions for optimizing "let" of boxed numbers (floats and @@ -926,7 +926,7 @@ and transl_ccall env prim args dbg = let xty = match bi with | Pvec128 -> XVec128 - in + in (xty, transl_unbox_vector dbg env bi arg) | Untagged_int -> (XInt, untag_int (transl env arg) dbg) diff --git a/backend/debug/available_regs.ml b/backend/debug/available_regs.ml index 5cd4e9978a8..8926b0763cc 100644 --- a/backend/debug/available_regs.ml +++ b/backend/debug/available_regs.ml @@ -210,7 +210,7 @@ let rec available_regs (instr : M.instruction) ~(avail_before : RAS.t) : RAS.t = let regs_clobbered = Array.append (Proc.destroyed_at_oper instr.desc) instr.res in - RD.Set.made_unavailable_by_clobber avail_before + RD.Set.made_unavailable_by_clobber avail_before ~regs_clobbered ~register_class:Proc.register_class ~stack_class:Proc.stack_slot_class_for diff --git a/backend/debug/reg_with_debug_info.ml b/backend/debug/reg_with_debug_info.ml index fd90a345e29..c1c16ae5b2a 100644 --- a/backend/debug/reg_with_debug_info.ml +++ b/backend/debug/reg_with_debug_info.ml @@ -112,10 +112,10 @@ let regs_at_same_location (reg1 : Reg.t) (reg2 : Reg.t) ~register_class ~stack_c one is of class "Int" and another "Float" on amd64. [register_class] will be [Proc.register_class], but cannot be here, due to a circular dependency. *) - reg1.loc = reg2.loc && - match reg1.loc with + reg1.loc = reg2.loc && + match reg1.loc with | Reg _ -> register_class reg1 = register_class reg2 - | Stack _ -> stack_class reg1 = stack_class reg2 + | Stack _ -> stack_class reg1 = stack_class reg2 | Unknown -> false let at_same_location t (reg : Reg.t) ~register_class ~stack_class = diff --git a/backend/mach.ml b/backend/mach.ml index 0c532ddf0aa..fe5a5dce0d6 100644 --- a/backend/mach.ml +++ b/backend/mach.ml @@ -206,7 +206,7 @@ let operation_is_pure = function | Imove | Ispill | Ireload | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf | Icompf _ | Icsel _ - | Ifloatofint | Iintoffloat + | Ifloatofint | Iintoffloat | Iconst_int _ | Iconst_float _ | Iconst_symbol _ | Iconst_vec128 _ | Iload (_, _, _) | Iname_for_debugger _ -> true diff --git a/backend/printcmm.ml b/backend/printcmm.ml index 35d7d52f025..a3b52627e6f 100644 --- a/backend/printcmm.ml +++ b/backend/printcmm.ml @@ -247,7 +247,7 @@ let rec expr ppf = function | Cconst_int (n, _dbg) -> fprintf ppf "%i" n | Cconst_natint (n, _dbg) -> fprintf ppf "%s" (Nativeint.to_string n) - | Cconst_vec128 ({low; high}, _dbg) -> fprintf ppf "%Ld:%Ld" high low + | Cconst_vec128 ({low; high}, _dbg) -> fprintf ppf "%Ld:%Ld" high low | Cconst_float (n, _dbg) -> fprintf ppf "%F" n | Cconst_symbol (s, _dbg) -> fprintf ppf "%a:\"%s\"" is_global s.sym_global s.sym_name | Cvar id -> V.print ppf id @@ -415,7 +415,7 @@ let data_item ppf = function | Cint n -> fprintf ppf "int %s" (Nativeint.to_string n) | Csingle f -> fprintf ppf "single %F" f | Cdouble f -> fprintf ppf "double %F" f - | Cvec128 {high; low} -> + | Cvec128 {high; low} -> fprintf ppf "vec128 %s:%s" (Int64.to_string high) (Int64.to_string low) | Csymbol_address s -> fprintf ppf "addr %a:\"%s\"" is_global s.sym_global s.sym_name | Cstring s -> fprintf ppf "string \"%s\"" s diff --git a/backend/printmach.ml b/backend/printmach.ml index c041246bae7..882c2b26ecb 100644 --- a/backend/printmach.ml +++ b/backend/printmach.ml @@ -43,11 +43,11 @@ let reg ppf r = fprintf ppf "%s" (Reg.name r) else fprintf ppf "%s" - (match r.typ with - | Val -> "V" - | Addr -> "A" - | Int -> "I" - | Float -> "F" + (match r.typ with + | Val -> "V" + | Addr -> "A" + | Int -> "I" + | Float -> "F" | Vec128 -> "X"); fprintf ppf "/%i" r.stamp; loc diff --git a/backend/proc.mli b/backend/proc.mli index 7d754bbb7a4..859e1656024 100644 --- a/backend/proc.mli +++ b/backend/proc.mli @@ -30,7 +30,7 @@ val rotate_registers: bool val all_phys_regs : Reg.t array (* The number of stack slot classes may differ from the number of register classes. - On x86, we use the same class for floating point and SIMD vector registers, + On x86, we use the same class for floating point and SIMD vector registers, but they take up different amounts of space on the stack. *) val num_stack_slot_classes: int val stack_slot_class_for: Reg.t -> int diff --git a/backend/x86_binary_emitter.ml b/backend/x86_binary_emitter.ml index e2d55d21a1d..8746921e3f1 100644 --- a/backend/x86_binary_emitter.ml +++ b/backend/x86_binary_emitter.ml @@ -598,7 +598,7 @@ let emit_movupd b dst src = buf_int8 b 0x66; emit_mod_rm_reg b 0 [ 0x0f; 0x11 ] rm (rd_of_reg128 reg) | _ -> assert false - + let emit_movd b ~dst ~src = match (dst, src) with | Regf reg, ((Reg32 _ | Mem _ | Mem64_RIP _) as rm) -> diff --git a/backend/x86_proc.mli b/backend/x86_proc.mli index 55ae124c8ef..b602c1368a2 100644 --- a/backend/x86_proc.mli +++ b/backend/x86_proc.mli @@ -91,7 +91,7 @@ val windows:bool val use_plt : bool module Section_name : sig - type t + type t val equal : t -> t -> bool val hash : t -> int val compare : t -> t -> int diff --git a/middle_end/clambda.ml b/middle_end/clambda.ml index b33bccf65ff..4bd7fd68e57 100644 --- a/middle_end/clambda.ml +++ b/middle_end/clambda.ml @@ -213,7 +213,7 @@ let rank_structured_constant = function | Uconst_float_array _ -> 5 | Uconst_string _ -> 6 | Uconst_closure _ -> 7 - | Uconst_vec128 _ -> 8 + | Uconst_vec128 _ -> 8 let compare_structured_constants c1 c2 = match c1, c2 with @@ -229,9 +229,9 @@ let compare_structured_constants c1 c2 = | Uconst_string s1, Uconst_string s2 -> String.compare s1 s2 | Uconst_closure (_,lbl1,_), Uconst_closure (_,lbl2,_) -> String.compare lbl1 lbl2 - | Uconst_vec128 {high = l0; low = l1}, Uconst_vec128 {high = r0; low = r1} -> - let cmp = Int64.compare l0 r0 in - if cmp = 0 then Int64.compare l1 r1 else cmp + | Uconst_vec128 {high = l0; low = l1}, Uconst_vec128 {high = r0; low = r1} -> + let cmp = Int64.compare l0 r0 in + if cmp = 0 then Int64.compare l1 r1 else cmp | _, _ -> (* no overflow possible here *) rank_structured_constant c1 - rank_structured_constant c2 diff --git a/middle_end/flambda/flambda_to_clambda.ml b/middle_end/flambda/flambda_to_clambda.ml index c4d4eab629f..b2613464916 100644 --- a/middle_end/flambda/flambda_to_clambda.ml +++ b/middle_end/flambda/flambda_to_clambda.ml @@ -712,7 +712,7 @@ and to_clambda_set_of_closures t env and not stored in a closure." | Punboxed_float -> true | Punboxed_int _ -> true - | Punboxed_vector _ -> true + | Punboxed_vector _ -> true | Pvalue Pintval -> true | Pvalue _ -> false) free_vars diff --git a/middle_end/flambda2/parser/flambda_parser.mli b/middle_end/flambda2/parser/flambda_parser.mli index 97852cedadb..f1f876171ef 100644 --- a/middle_end/flambda2/parser/flambda_parser.mli +++ b/middle_end/flambda2/parser/flambda_parser.mli @@ -1,7 +1,7 @@ (* The type of tokens. *) -type token = +type token = | TILDEMINUS | TILDE | SYMBOL of (Fexpr.compilation_unit option * string) @@ -185,20 +185,20 @@ val flambda_unit: (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (Fexpr.flambda_un val expect_test_spec: (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (Fexpr.expect_test_spec) module MenhirInterpreter : sig - + (* The incremental API. *) - + include CamlinternalMenhirLib.IncrementalEngine.INCREMENTAL_ENGINE with type token = token - + end (* The entry point(s) to the incremental API. *) module Incremental : sig - + val flambda_unit: Lexing.position -> (Fexpr.flambda_unit) MenhirInterpreter.checkpoint - + val expect_test_spec: Lexing.position -> (Fexpr.expect_test_spec) MenhirInterpreter.checkpoint - + end diff --git a/ocaml/asmcomp/amd64/emit.mlp b/ocaml/asmcomp/amd64/emit.mlp index 39ccf590568..c69a07418b5 100644 --- a/ocaml/asmcomp/amd64/emit.mlp +++ b/ocaml/asmcomp/amd64/emit.mlp @@ -1210,7 +1210,7 @@ let probe_env p = env.stack_offset <- p.probe_stack_offset; (* Account for the return address that is now pushed on the stack. *) env.stack_offset <- env.stack_offset + 8; - env + env let emit_probe_handler_wrapper p = let wrap_label = probe_handler_wrapper_name p.probe_label in diff --git a/ocaml/asmcomp/cmm_helpers.ml b/ocaml/asmcomp/cmm_helpers.ml index 59ef239e43e..46a559aed81 100644 --- a/ocaml/asmcomp/cmm_helpers.ml +++ b/ocaml/asmcomp/cmm_helpers.ml @@ -919,7 +919,7 @@ module Extended_machtype = struct (* Only 64-bit architectures, so this is always [typ_int] *) typ_any_int | Pvalue Pintval -> typ_tagged_int - | Punboxed_vector _ -> + | Punboxed_vector _ -> Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." | Pvalue _ -> typ_val end @@ -3286,7 +3286,7 @@ let kind_of_layout (layout : Lambda.layout) = | Pvalue (Pgenval | Pintval | Pvariant _ | Parrayval _) | Ptop | Pbottom | Punboxed_float | Punboxed_int _ -> Any | Pvalue (Pboxedvectorval _) - | Punboxed_vector _ -> + | Punboxed_vector _ -> Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." let make_tuple l = match l with [e] -> e | _ -> Ctuple l diff --git a/ocaml/asmcomp/cmmgen.ml b/ocaml/asmcomp/cmmgen.ml index 1699aeb8946..a6b7dc5b20e 100644 --- a/ocaml/asmcomp/cmmgen.ml +++ b/ocaml/asmcomp/cmmgen.ml @@ -124,7 +124,7 @@ let get_field env layout ptr n dbg = | Pvalue Pintval | Punboxed_int _ -> Word_int | Pvalue _ -> Word_val | Punboxed_float -> Double - | Punboxed_vector _ -> + | Punboxed_vector _ -> Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." | Ptop -> Misc.fatal_errorf "get_field with Ptop: %a" Debuginfo.print_compact dbg @@ -844,7 +844,7 @@ and transl_ccall env prim args dbg = | Pint32 -> XInt32 | Pint64 -> XInt64 in (xty, transl_unbox_int dbg env bi arg) - | Unboxed_vector _ -> + | Unboxed_vector _ -> Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." | Untagged_int -> (XInt, untag_int (transl env arg) dbg) @@ -875,7 +875,7 @@ and transl_ccall env prim args dbg = ([|Int; Int|], box_int dbg Pint64 alloc_heap) | _, Unboxed_integer bi -> (typ_int, box_int dbg bi alloc_heap) | _, Untagged_int -> (typ_int, (fun i -> tag_int i dbg)) - | _, Unboxed_vector _ -> + | _, Unboxed_vector _ -> Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." in let typ_args, args = transl_args prim.prim_native_repr_args args in @@ -1250,7 +1250,7 @@ and transl_let_value env str (kind : Lambda.value_kind) id exp transl_body = Boxed (Boxed_float (alloc_heap, dbg), false) | Mutable, Pboxedintval bi -> Boxed (Boxed_integer (bi, alloc_heap, dbg), false) - | _, Pboxedvectorval _ -> + | _, Pboxedvectorval _ -> Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." | _, (Pfloatval | Pboxedintval _) -> (* It would be safe to always unbox in this case, but @@ -1298,7 +1298,7 @@ and transl_let env str (layout : Lambda.layout) id exp transl_body = there may be constant closures inside that need lifting out. *) let _cbody : expression = transl_body env in cexp - | Punboxed_vector _ -> + | Punboxed_vector _ -> Misc.fatal_error "SIMD vectors are not yet suppored in the upstream compiler build." | Punboxed_float | Punboxed_int _ -> begin let cexp = transl env exp in diff --git a/tests/simd/simd.ml b/tests/simd/simd.ml index d2aca2ca85f..8fab1d59302 100644 --- a/tests/simd/simd.ml +++ b/tests/simd/simd.ml @@ -1,151 +1,151 @@ open Stdlib -external vec128_of_int64s : int64 -> int64 -> vec128 = "" "vec128_of_int64s" [@@noalloc] [@@unboxed] +external vec128_of_int64s : int64 -> int64 -> vec128 = "" "vec128_of_int64s" [@@noalloc] [@@unboxed] external vec128_low_int64 : vec128 -> int64 = "" "vec128_low_int64" [@@noalloc] [@@unboxed] external vec128_high_int64 : vec128 -> int64 = "" "vec128_high_int64" [@@noalloc] [@@unboxed] -let eq l r = if l <> r then Printf.printf "%Ld <> %Ld\n" l r +let eq l r = if l <> r then Printf.printf "%Ld <> %Ld\n" l r -let[@inline never] check v l h = - let vl, vh = vec128_low_int64 v, vec128_high_int64 v in - eq vl l; +let[@inline never] check v l h = + let vl, vh = vec128_low_int64 v, vec128_high_int64 v in + eq vl l; eq vh h ;; -let[@inline never] combine v0 v1 = - let l0, h0 = vec128_low_int64 v0, vec128_high_int64 v0 in - let l1, h1 = vec128_low_int64 v1, vec128_high_int64 v1 in +let[@inline never] combine v0 v1 = + let l0, h0 = vec128_low_int64 v0, vec128_high_int64 v0 in + let l1, h1 = vec128_low_int64 v1, vec128_high_int64 v1 in vec128_of_int64s (Int64.add l0 l1) (Int64.add h0 h1) ;; -let[@inline never] combine_with_floats v0 f0 v1 f1 = - let l0, h0 = vec128_low_int64 v0, vec128_high_int64 v0 in - let l1, h1 = vec128_low_int64 v1, vec128_high_int64 v1 in - let l, h = Int64.add l0 l1, Int64.add h0 h1 in +let[@inline never] combine_with_floats v0 f0 v1 f1 = + let l0, h0 = vec128_low_int64 v0, vec128_high_int64 v0 in + let l1, h1 = vec128_low_int64 v1, vec128_high_int64 v1 in + let l, h = Int64.add l0 l1, Int64.add h0 h1 in let l = Int64.add (Int64.of_float f0) l in let h = Int64.add (Int64.of_float f1) h in vec128_of_int64s l h ;; (* Identity *) -let () = - let v = vec128_of_int64s 1L 2L in - let v = Sys.opaque_identity v in - check v 1L 2L +let () = + let v = vec128_of_int64s 1L 2L in + let v = Sys.opaque_identity v in + check v 1L 2L ;; (* Identity fn *) -let () = - let v = vec128_of_int64s 1L 2L in - let[@inline never] id v = v in - let v = id v in - check v 1L 2L +let () = + let v = vec128_of_int64s 1L 2L in + let[@inline never] id v = v in + let v = id v in + check v 1L 2L ;; (* Pass to function *) -let () = - let v0 = vec128_of_int64s 1L 2L in - let v1 = vec128_of_int64s 3L 4L in - let v = combine v0 v1 in +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v = combine v0 v1 in check v 4L 6L ;; (* Pass to function (inlined) *) -let () = - let v0 = vec128_of_int64s 1L 2L in - let v1 = vec128_of_int64s 3L 4L in - let v = (combine[@inlined hint]) v0 v1 in +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v = (combine[@inlined hint]) v0 v1 in check v 4L 6L ;; (* Pass to function with floats *) -let () = - let v0 = vec128_of_int64s 1L 2L in - let v1 = vec128_of_int64s 3L 4L in - let f0 = Sys.opaque_identity 5. in - let v = combine_with_floats v0 f0 v1 6. in +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let f0 = Sys.opaque_identity 5. in + let v = combine_with_floats v0 f0 v1 6. in check v 9L 12L ;; (* Pass to function with floats (inlined) *) -let () = - let v0 = vec128_of_int64s 1L 2L in - let v1 = vec128_of_int64s 3L 4L in - let v = (combine_with_floats[@inlined hint]) v0 5. v1 6. in +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v = (combine_with_floats[@inlined hint]) v0 5. v1 6. in check v 9L 12L ;; (* Capture in closure *) -let () = - let v0 = vec128_of_int64s 1L 2L in - let v1 = vec128_of_int64s 3L 4L in - let f = combine v0 in - let f = Sys.opaque_identity f in - let v = f v1 in - check v 4L 6L +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let f = combine v0 in + let f = Sys.opaque_identity f in + let v = f v1 in + check v 4L 6L ;; (* Capture vectors and floats in a closure *) -let () = - let[@inline never] f v0 v1 f0 v2 f1 v3 = - combine (combine_with_floats v0 f0 v1 f1) (combine v2 v3) - in - let v0 = vec128_of_int64s 1L 2L in - let v1 = vec128_of_int64s 3L 4L in - let v2 = vec128_of_int64s 4L 5L in - let v3 = vec128_of_int64s 6L 7L in - let f = f v0 v1 7. v2 in - let f = Sys.opaque_identity f in - let v = f 8. v3 in - check v 21L 26L +let () = + let[@inline never] f v0 v1 f0 v2 f1 v3 = + combine (combine_with_floats v0 f0 v1 f1) (combine v2 v3) + in + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v2 = vec128_of_int64s 4L 5L in + let v3 = vec128_of_int64s 6L 7L in + let f = f v0 v1 7. v2 in + let f = Sys.opaque_identity f in + let v = f 8. v3 in + check v 21L 26L ;; (* Capture vectors and floats in a closure (inlined) *) -let () = - let[@inline always] f v0 v1 f0 v2 f1 v3 = - (combine[@inlined hint]) - ((combine_with_floats[@inlined hint]) v0 f0 v1 f1) - ((combine[@inlined hint]) v2 v3) - in - let v0 = vec128_of_int64s 1L 2L in - let v1 = vec128_of_int64s 3L 4L in - let v2 = vec128_of_int64s 4L 5L in - let v3 = vec128_of_int64s 6L 7L in - let f = f v0 v1 7. v2 in - let v = f 8. v3 in - check v 21L 26L +let () = + let[@inline always] f v0 v1 f0 v2 f1 v3 = + (combine[@inlined hint]) + ((combine_with_floats[@inlined hint]) v0 f0 v1 f1) + ((combine[@inlined hint]) v2 v3) + in + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v2 = vec128_of_int64s 4L 5L in + let v3 = vec128_of_int64s 6L 7L in + let f = f v0 v1 7. v2 in + let v = f 8. v3 in + check v 21L 26L ;; (* Store in record *) -type record = { a : vec128 +type record = { a : vec128 ; mutable b : vec128 ; c : float } -let () = - let record = { a = vec128_of_int64s 1L 2L; b = vec128_of_int64s 3L 4L; c = 5. } in +let () = + let record = { a = vec128_of_int64s 1L 2L; b = vec128_of_int64s 3L 4L; c = 5. } in check record.a 1L 2L; check record.b 3L 4L; - let record = Sys.opaque_identity record in + let record = Sys.opaque_identity record in record.b <- vec128_of_int64s 5L 6L; check record.a 1L 2L; check record.b 5L 6L; - let v = combine_with_floats record.a record.c record.b 6. in + let v = combine_with_floats record.a record.c record.b 6. in check v 11L 14L ;; (* Store in variant *) type variant = A of vec128 | B of vec128 | C of float -let () = - let variant = A (vec128_of_int64s 1L 2L) in - let variant = Sys.opaque_identity variant in - match variant with +let () = + let variant = A (vec128_of_int64s 1L 2L) in + let variant = Sys.opaque_identity variant in + match variant with | A v -> check v 1L 2L | _ -> print_endline "fail"; - let variant = ref (C 5.) in - let variant = Sys.opaque_identity variant in + let variant = ref (C 5.) in + let variant = Sys.opaque_identity variant in variant := B (vec128_of_int64s 3L 4L); - match !variant with + match !variant with | B v -> check v 3L 4L | _ -> print_endline "fail" ;; @@ -153,85 +153,85 @@ let () = (* Pass boxed vectors to an external *) external boxed_combine : vec128 -> vec128 -> vec128 = "" "boxed_combine" [@@noalloc] -let () = - let v0 = vec128_of_int64s 1L 2L in - let v1 = vec128_of_int64s 3L 4L in - let v = boxed_combine v0 v1 in +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v = boxed_combine v0 v1 in check v 4L 6L ;; (* Pass lots of vectors to an external *) -external lots_of_vectors : +external lots_of_vectors : + vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> - vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> vec128 -> - vec128 + vec128 = "" "lots_of_vectors" [@@noalloc] [@@unboxed] -let () = - let v0 = vec128_of_int64s 1L 2L in - let v1 = vec128_of_int64s 3L 4L in - let v2 = vec128_of_int64s 5L 6L in - let v3 = vec128_of_int64s 7L 8L in - let v4 = vec128_of_int64s 9L 10L in - let v5 = vec128_of_int64s 11L 12L in - let v6 = vec128_of_int64s 13L 14L in - let v7 = vec128_of_int64s 15L 16L in - let v8 = vec128_of_int64s 17L 18L in - let v9 = vec128_of_int64s 19L 20L in - let v10 = vec128_of_int64s 21L 22L in - let v11 = vec128_of_int64s 23L 24L in - let v12 = vec128_of_int64s 25L 26L in - let v13 = vec128_of_int64s 27L 28L in - let v14 = vec128_of_int64s 29L 30L in - let v15 = vec128_of_int64s 31L 32L in - let v = lots_of_vectors v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 in +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v2 = vec128_of_int64s 5L 6L in + let v3 = vec128_of_int64s 7L 8L in + let v4 = vec128_of_int64s 9L 10L in + let v5 = vec128_of_int64s 11L 12L in + let v6 = vec128_of_int64s 13L 14L in + let v7 = vec128_of_int64s 15L 16L in + let v8 = vec128_of_int64s 17L 18L in + let v9 = vec128_of_int64s 19L 20L in + let v10 = vec128_of_int64s 21L 22L in + let v11 = vec128_of_int64s 23L 24L in + let v12 = vec128_of_int64s 25L 26L in + let v13 = vec128_of_int64s 27L 28L in + let v14 = vec128_of_int64s 29L 30L in + let v15 = vec128_of_int64s 31L 32L in + let v = lots_of_vectors v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 in check v 256L 272L ;; (* Pass mixed floats/vectors to an external *) -external vectors_and_floats : +external vectors_and_floats : vec128 -> float -> vec128 -> float -> vec128 -> float -> vec128 -> float -> float -> vec128 -> vec128 -> float -> float -> vec128 -> vec128 -> float -> float -> float -> vec128 -> vec128 -> vec128 -> float -> float -> float -> - vec128 + vec128 = "" "vectors_and_floats" [@@noalloc] [@@unboxed] -let () = - let v0 = vec128_of_int64s 1L 2L in - let v1 = vec128_of_int64s 3L 4L in - let v2 = vec128_of_int64s 5L 6L in - let v3 = vec128_of_int64s 7L 8L in - let v4 = vec128_of_int64s 9L 10L in - let v5 = vec128_of_int64s 11L 12L in - let v6 = vec128_of_int64s 13L 14L in - let v7 = vec128_of_int64s 15L 16L in - let v8 = vec128_of_int64s 17L 18L in - let v9 = vec128_of_int64s 19L 20L in - let v10 = vec128_of_int64s 21L 22L in - let v = vectors_and_floats v0 23. v1 24. v2 25. v3 26. 27. v4 v5 28. 29. v6 v7 30. 31. 32. v8 v9 v10 33. 34. 35. in +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v2 = vec128_of_int64s 5L 6L in + let v3 = vec128_of_int64s 7L 8L in + let v4 = vec128_of_int64s 9L 10L in + let v5 = vec128_of_int64s 11L 12L in + let v6 = vec128_of_int64s 13L 14L in + let v7 = vec128_of_int64s 15L 16L in + let v8 = vec128_of_int64s 17L 18L in + let v9 = vec128_of_int64s 19L 20L in + let v10 = vec128_of_int64s 21L 22L in + let v = vectors_and_floats v0 23. v1 24. v2 25. v3 26. 27. v4 v5 28. 29. v6 v7 30. 31. 32. v8 v9 v10 33. 34. 35. in check v 377L 253L ;; (* Pass mixed ints/floats/vectors to an external *) -external vectors_and_floats_and_ints : +external vectors_and_floats_and_ints : vec128 -> float -> vec128 -> int64 -> vec128 -> float -> vec128 -> int64 -> int64 -> vec128 -> vec128 -> float -> float -> vec128 -> vec128 -> int64 -> int64 -> float -> vec128 -> vec128 -> vec128 -> int64 -> int64 -> float -> - vec128 + vec128 = "" "vectors_and_floats_and_ints" [@@noalloc] [@@unboxed] -let () = - let v0 = vec128_of_int64s 1L 2L in - let v1 = vec128_of_int64s 3L 4L in - let v2 = vec128_of_int64s 5L 6L in - let v3 = vec128_of_int64s 7L 8L in - let v4 = vec128_of_int64s 9L 10L in - let v5 = vec128_of_int64s 11L 12L in - let v6 = vec128_of_int64s 13L 14L in - let v7 = vec128_of_int64s 15L 16L in - let v8 = vec128_of_int64s 17L 18L in - let v9 = vec128_of_int64s 19L 20L in - let v10 = vec128_of_int64s 21L 22L in - let v = vectors_and_floats_and_ints v0 23. v1 24L v2 25. v3 26L 27L v4 v5 28. 29. v6 v7 30L 31L 32. v8 v9 v10 33L 34L 35. in +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v2 = vec128_of_int64s 5L 6L in + let v3 = vec128_of_int64s 7L 8L in + let v4 = vec128_of_int64s 9L 10L in + let v5 = vec128_of_int64s 11L 12L in + let v6 = vec128_of_int64s 13L 14L in + let v7 = vec128_of_int64s 15L 16L in + let v8 = vec128_of_int64s 17L 18L in + let v9 = vec128_of_int64s 19L 20L in + let v10 = vec128_of_int64s 21L 22L in + let v = vectors_and_floats_and_ints v0 23. v1 24L v2 25. v3 26L 27L v4 v5 28. 29. v6 v7 30L 31L 32. v8 v9 v10 33L 34L 35. in check v 377L 253L ;; diff --git a/tests/simd/stubs.c b/tests/simd/stubs.c index a30870e5052..edcb7692cfd 100644 --- a/tests/simd/stubs.c +++ b/tests/simd/stubs.c @@ -5,22 +5,22 @@ #include #include -int64_t vec128_low_int64(__m128i v) +int64_t vec128_low_int64(__m128i v) { return _mm_extract_epi64(v, 0); } -int64_t vec128_high_int64(__m128i v) +int64_t vec128_high_int64(__m128i v) { return _mm_extract_epi64(v, 1); } -__m128i vec128_of_int64s(int64_t low, int64_t high) +__m128i vec128_of_int64s(int64_t low, int64_t high) { - return _mm_set_epi64x(high, low); + return _mm_set_epi64x(high, low); } -CAMLprim value boxed_combine(value v0, value v1) +CAMLprim value boxed_combine(value v0, value v1) { CAMLparam2(v0, v1); CAMLlocal1(res); @@ -30,15 +30,15 @@ CAMLprim value boxed_combine(value v0, value v1) __m128i result = _mm_add_epi64(l, r); res = caml_alloc_small(2, Abstract_tag); _mm_storeu_si128((__m128i*)res, result); - + CAMLreturn(res); } __m128i lots_of_vectors( - __m128i v0, __m128i v1, __m128i v2, __m128i v3, + __m128i v0, __m128i v1, __m128i v2, __m128i v3, __m128i v4, __m128i v5, __m128i v6, __m128i v7, __m128i v8, __m128i v9, __m128i v10, __m128i v11, - __m128i v12, __m128i v13, __m128i v14, __m128i v15) + __m128i v12, __m128i v13, __m128i v14, __m128i v15) { __m128i x0 = _mm_add_epi64(v0, v1); __m128i x1 = _mm_add_epi64(v2, v3); @@ -58,11 +58,11 @@ __m128i lots_of_vectors( } __m128i vectors_and_floats( - __m128i v0, double f0, __m128i v1, double f1, + __m128i v0, double f0, __m128i v1, double f1, __m128i v2, double f2, __m128i v3, double f3, - double f4, __m128i v4, __m128i v5, double f5, + double f4, __m128i v4, __m128i v5, double f5, double f6, __m128i v6, __m128i v7, double f7, - double f8, double f9, __m128i v8, __m128i v9, + double f8, double f9, __m128i v8, __m128i v9, __m128i v10, double f10, double f11, double f12) { __m128i x0 = _mm_add_epi64(v0, v1); @@ -80,11 +80,11 @@ __m128i vectors_and_floats( } __m128i vectors_and_floats_and_ints( - __m128i v0, double f0, __m128i v1, int64_t i0, + __m128i v0, double f0, __m128i v1, int64_t i0, __m128i v2, double f1, __m128i v3, int64_t i1, - int64_t i2, __m128i v4, __m128i v5, double f2, + int64_t i2, __m128i v4, __m128i v5, double f2, double f3, __m128i v6, __m128i v7, int64_t i3, - int64_t i4, double f4, __m128i v8, __m128i v9, + int64_t i4, double f4, __m128i v8, __m128i v9, __m128i v10, int64_t i5, int64_t i6, double f5) { __m128i x0 = _mm_add_epi64(v0, v1); @@ -96,7 +96,7 @@ __m128i vectors_and_floats_and_ints( __m128i y1 = _mm_add_epi64(x2, x3); __m128i y2 = _mm_add_epi64(v10, x4); __m128i z0 = _mm_add_epi64(y0, y1); - __m128i z = _mm_add_epi64(z0, y2); + __m128i z = _mm_add_epi64(z0, y2); double f = f0 + f1 + f2 + f3 + f4 + f5; int64_t i = i0 + i1 + i2 + i3 + i4 + i5 + i6; return vec128_of_int64s((int64_t)f + i, vec128_low_int64(z) + vec128_high_int64(z)); diff --git a/testsuite/tests/unboxed-primitive-args/common.ml b/testsuite/tests/unboxed-primitive-args/common.ml index 98f19b5b373..2826412cc29 100644 --- a/testsuite/tests/unboxed-primitive-args/common.ml +++ b/testsuite/tests/unboxed-primitive-args/common.ml @@ -45,7 +45,7 @@ let expand_test = function Test (s, fn, a ** b ** c ** d ** e ** f ** Ret g) | T (s, fn, p) -> Test (s, fn, p) -external vec128_of_int64s : int64 -> int64 -> vec128 = "" "vec128_of_int64s" [@@noalloc] [@@unboxed] +external vec128_of_int64s : int64 -> int64 -> vec128 = "" "vec128_of_int64s" [@@noalloc] [@@unboxed] external vec128_low_int64 : vec128 -> int64 = "" "vec128_low_int64" [@@noalloc] [@@unboxed] external vec128_high_int64 : vec128 -> int64 = "" "vec128_high_int64" [@@noalloc] [@@unboxed] @@ -56,7 +56,7 @@ let string_of : type a. a typ -> a -> string = function | Nativeint -> Printf.sprintf "%ndn" | Float -> fun f -> Printf.sprintf "float_of_bits 0x%LxL" (Int64.bits_of_float f) - | Vec128 -> + | Vec128 -> fun v -> Printf.sprintf "vec128 %Ld:%Ld" (vec128_high_int64 v) (vec128_low_int64 v) let rec arity : type a. a proto -> int = function @@ -83,12 +83,12 @@ module Buffer = struct external set_int32 : t -> int -> int32 -> unit = "%caml_bigstring_set32" external set_int64 : t -> int -> int64 -> unit = "%caml_bigstring_set64" - let get_vec128 buf ~arg = - let low, high = get_int64 buf (arg * arg_size), get_int64 buf (arg * arg_size + 8) in + let get_vec128 buf ~arg = + let low, high = get_int64 buf (arg * arg_size), get_int64 buf (arg * arg_size + 8) in vec128_of_int64s low high - let set_vec128 buf ~arg x = - set_int64 buf (arg * arg_size) (vec128_low_int64 x); + let set_vec128 buf ~arg x = + set_int64 buf (arg * arg_size) (vec128_low_int64 x); set_int64 buf ((arg * arg_size) + 8) (vec128_high_int64 x) let get_int32 t ~arg = get_int32 t (arg * arg_size) diff --git a/testsuite/tests/unboxed-primitive-args/test_common.c b/testsuite/tests/unboxed-primitive-args/test_common.c index 687695dbfbd..9f453c354ce 100644 --- a/testsuite/tests/unboxed-primitive-args/test_common.c +++ b/testsuite/tests/unboxed-primitive-args/test_common.c @@ -38,17 +38,17 @@ double test_cleanup_float(void) return 0.; } -int64_t vec128_low_int64(__m128i v) +int64_t vec128_low_int64(__m128i v) { return _mm_extract_epi64(v, 0); } -int64_t vec128_high_int64(__m128i v) +int64_t vec128_high_int64(__m128i v) { return _mm_extract_epi64(v, 1); } -__m128i vec128_of_int64s(int64_t low, int64_t high) +__m128i vec128_of_int64s(int64_t low, int64_t high) { - return _mm_set_epi64x(high, low); + return _mm_set_epi64x(high, low); } From 19120e3de3d9c4cf42129f4eb223494e656c33c2 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Thu, 6 Jul 2023 12:07:34 -0400 Subject: [PATCH 46/81] address middle end comments --- backend/cfg/cfg.ml | 2 +- backend/printcmm.ml | 2 +- backend/printmach.ml | 2 +- middle_end/flambda2/numbers/numeric_types.ml | 5 ++++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/backend/cfg/cfg.ml b/backend/cfg/cfg.ml index ec7175b08ae..c448ea33f26 100644 --- a/backend/cfg/cfg.ml +++ b/backend/cfg/cfg.ml @@ -248,7 +248,7 @@ let dump_op ppf = function | Const_float f -> Format.fprintf ppf "const_float %F" (Int64.float_of_bits f) | Const_symbol s -> Format.fprintf ppf "const_symbol %s" s.sym_name | Const_vec128 { high; low } -> - Format.fprintf ppf "const vec128 %Ld:%Ld" high low + Format.fprintf ppf "const vec128 %016Lx:%016Lx" high low | Stackoffset n -> Format.fprintf ppf "stackoffset %d" n | Load _ -> Format.fprintf ppf "load" | Store _ -> Format.fprintf ppf "store" diff --git a/backend/printcmm.ml b/backend/printcmm.ml index a3b52627e6f..85b2f7ff65b 100644 --- a/backend/printcmm.ml +++ b/backend/printcmm.ml @@ -247,7 +247,7 @@ let rec expr ppf = function | Cconst_int (n, _dbg) -> fprintf ppf "%i" n | Cconst_natint (n, _dbg) -> fprintf ppf "%s" (Nativeint.to_string n) - | Cconst_vec128 ({low; high}, _dbg) -> fprintf ppf "%Ld:%Ld" high low + | Cconst_vec128 ({low; high}, _dbg) -> fprintf ppf "%016Lx:%016Lx" high low | Cconst_float (n, _dbg) -> fprintf ppf "%F" n | Cconst_symbol (s, _dbg) -> fprintf ppf "%a:\"%s\"" is_global s.sym_global s.sym_name | Cvar id -> V.print ppf id diff --git a/backend/printmach.ml b/backend/printmach.ml index 882c2b26ecb..407a8e660c8 100644 --- a/backend/printmach.ml +++ b/backend/printmach.ml @@ -164,7 +164,7 @@ let operation' ?(print_reg = reg) op arg ppf res = | Iconst_int n -> fprintf ppf "%s" (Nativeint.to_string n) | Iconst_float f -> fprintf ppf "%F" (Int64.float_of_bits f) | Iconst_symbol s -> fprintf ppf "\"%s\"" s.sym_name - | Iconst_vec128 {high; low} -> fprintf ppf "%Ld:%Ld" high low + | Iconst_vec128 {high; low} -> fprintf ppf "%016Lx:%016Lx" high low | Icall_ind -> fprintf ppf "call %a" regs arg | Icall_imm { func; } -> fprintf ppf "call \"%s\" %a" func.sym_name regs arg | Itailcall_ind -> fprintf ppf "tailcall %a" regs arg diff --git a/middle_end/flambda2/numbers/numeric_types.ml b/middle_end/flambda2/numbers/numeric_types.ml index cf99cd4e044..4945afba9c6 100644 --- a/middle_end/flambda2/numbers/numeric_types.ml +++ b/middle_end/flambda2/numbers/numeric_types.ml @@ -286,7 +286,10 @@ module Vector_by_bit_pattern (Width : Vector_width) = struct let to_int64_array t = t - let of_int64_array t = t + let of_int64_array t = + if not (Array.length t = Width.size_in_int64s) then + Misc.fatal_error "Vector_by_bit_pattern.of_int64_array: wrong length array"; + t end module Vec128_by_bit_pattern = struct From 77fb950b6da34e0f2dbbca0b2fdd228ca7e792f2 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Thu, 6 Jul 2023 12:10:27 -0400 Subject: [PATCH 47/81] print vec128 --- middle_end/flambda2/numbers/numeric_types.ml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/middle_end/flambda2/numbers/numeric_types.ml b/middle_end/flambda2/numbers/numeric_types.ml index 4945afba9c6..0791b9b2714 100644 --- a/middle_end/flambda2/numbers/numeric_types.ml +++ b/middle_end/flambda2/numbers/numeric_types.ml @@ -275,7 +275,8 @@ module Vector_by_bit_pattern (Width : Vector_width) = struct let print ppf t = Format.pp_print_list ~pp_sep:(fun ppf () -> Format.pp_print_char ppf ':') - Int64.print ppf (Array.to_list t) + (fun ppf i64 -> Format.pp_print_string ppf (Format.sprintf "%016Lx" i64)) + ppf (Array.to_list t) end include T0 From 18c7c17d2f8712242afb56b078b1c78aae95e403 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Thu, 6 Jul 2023 12:11:32 -0400 Subject: [PATCH 48/81] oops --- middle_end/flambda2/numbers/numeric_types.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/middle_end/flambda2/numbers/numeric_types.ml b/middle_end/flambda2/numbers/numeric_types.ml index 0791b9b2714..e15ec7779eb 100644 --- a/middle_end/flambda2/numbers/numeric_types.ml +++ b/middle_end/flambda2/numbers/numeric_types.ml @@ -275,7 +275,7 @@ module Vector_by_bit_pattern (Width : Vector_width) = struct let print ppf t = Format.pp_print_list ~pp_sep:(fun ppf () -> Format.pp_print_char ppf ':') - (fun ppf i64 -> Format.pp_print_string ppf (Format.sprintf "%016Lx" i64)) + (fun ppf i64 -> Format.fprintf ppf "%016Lx" i64) ppf (Array.to_list t) end From 6fb9b7dbb7c7a032c37ba9e888cf0bd4de390d69 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Thu, 6 Jul 2023 12:17:56 -0400 Subject: [PATCH 49/81] arm64 fix --- backend/arm64/emit.mlp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/arm64/emit.mlp b/backend/arm64/emit.mlp index 6ae45873aa7..16965aca798 100644 --- a/backend/arm64/emit.mlp +++ b/backend/arm64/emit.mlp @@ -33,11 +33,11 @@ let fastcode_flag = ref true (* Names for special regs *) -let reg_domain_state_ptr = phys_reg 25 (* x28 *) -let reg_trap_ptr = phys_reg 23 (* x26 *) -let reg_alloc_ptr = phys_reg 24 (* x27 *) -let reg_tmp1 = phys_reg 26 (* x16 *) -let reg_x8 = phys_reg 8 (* x8 *) +let reg_domain_state_ptr = phys_reg Int 25 (* x28 *) +let reg_trap_ptr = phys_reg Int 23 (* x26 *) +let reg_alloc_ptr = phys_reg Int 24 (* x27 *) +let reg_tmp1 = phys_reg Int 26 (* x16 *) +let reg_x8 = phys_reg Int 8 (* x8 *) (* Output a label *) From d68365b2e1d20ee236f06c3c14f4237b04f506da Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Thu, 6 Jul 2023 13:02:06 -0400 Subject: [PATCH 50/81] remove x87 fp regs --- backend/amd64/emit.mlp | 6 ++---- backend/x86_ast.mli | 7 ++----- backend/x86_binary_emitter.ml | 39 +++++++---------------------------- backend/x86_dsl.ml | 4 +--- backend/x86_dsl.mli | 2 -- backend/x86_gas.ml | 12 +++-------- backend/x86_masm.ml | 3 +-- backend/x86_proc.ml | 7 +------ backend/x86_proc.mli | 3 +-- 9 files changed, 18 insertions(+), 65 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index f8e0d4478bf..df7127cf29e 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -45,14 +45,12 @@ let int_reg_name = [| RAX; RBX; RDI; RSI; RDX; RCX; R8; R9; R12; R13; R10; R11; RBP; |] -let float_reg_name = Array.init 16 (fun i -> XMMf i) - -let vec128_reg_name = Array.init 16 (fun i -> XMM i) +let float_reg_name = Array.init 16 (fun i -> XMM i) let register_name r = if r < 100 then Reg64 (int_reg_name.(r)) else if r < 200 then Regf (float_reg_name.(r - 100)) - else Reg128 (vec128_reg_name.(r - 200)) + else Misc.fatal_errorf "Bad register id %d" r (* CFI directives *) diff --git a/backend/x86_ast.mli b/backend/x86_ast.mli index ddd7629b6b6..89b1e310400 100644 --- a/backend/x86_ast.mli +++ b/backend/x86_ast.mli @@ -68,9 +68,7 @@ type reg64 = type reg8h = | AH | BH | CH | DH -type registerf = XMMf of int | TOS | ST of int - -type reg128 = XMM of int +type regf = XMM of int type arch = X64 | X86 @@ -104,8 +102,7 @@ type arg = | Reg16 of reg64 | Reg32 of reg64 | Reg64 of reg64 - | Reg128 of reg128 - | Regf of registerf + | Regf of regf | Mem of addr | Mem64_RIP of data_type * string * int diff --git a/backend/x86_binary_emitter.ml b/backend/x86_binary_emitter.ml index 8746921e3f1..e23ff155a21 100644 --- a/backend/x86_binary_emitter.ml +++ b/backend/x86_binary_emitter.ml @@ -36,7 +36,6 @@ let print_old_arg ppf = function | Reg16 _ -> Format.fprintf ppf "Reg16" | Reg32 _ -> Format.fprintf ppf "Reg32" | Reg64 _ -> Format.fprintf ppf "Reg64" - | Reg128 _ -> Format.fprintf ppf "Reg128" | Regf _ -> Format.fprintf ppf "Regf" | Mem _ -> Format.fprintf ppf "Mem" | Mem64_RIP _ -> Format.fprintf ppf "Mem64_RIP" @@ -277,12 +276,6 @@ let is_imm8L x = x < 128L && x >= -128L let rd_of_regf regf = match regf with - | XMMf n -> n - | TOS -> assert false (* TODO *) - | ST _st -> assert false - -let rd_of_reg128 (reg128 : reg128) = - match reg128 with | XMM n -> n (* TODO *) @@ -443,16 +436,11 @@ let emit_mod_rm_reg b rex opcodes rm reg = emit_rex b (rex lor rex_of_reg16 reg16 lor rexr_reg reg lor rexb_rm rm); buf_opcodes b opcodes; buf_int8 b (mod_rm_reg 0b11 rm reg) - | Regf rm -> + | Regf (XMM _ as rm) -> let rm = rd_of_regf rm in emit_rex b (rex lor rexr_reg reg lor rexb_rm rm); buf_opcodes b opcodes; buf_int8 b (mod_rm_reg 0b11 rm reg) - | Reg128 rm -> - let rm = rd_of_reg128 rm in - emit_rex b (rex lor rexr_reg reg lor rexb_rm rm); - buf_opcodes b opcodes; - buf_int8 b (mod_rm_reg 0b11 rm reg) (* 64 bits memory access *) | Mem64_RIP (_, symbol, offset) -> emit_rex b (rex lor rexr_reg reg); @@ -581,22 +569,16 @@ let emit_movapd b dst src = | ((Mem _ | Mem64_RIP _) as rm), Regf reg -> buf_int8 b 0x66; emit_mod_rm_reg b 0 [ 0x0f; 0x29 ] rm (rd_of_regf reg) - | Reg128 reg, ((Reg128 _ | Mem _ | Mem64_RIP _) as rm) -> - buf_int8 b 0x66; - emit_mod_rm_reg b 0 [ 0x0f; 0x28 ] rm (rd_of_reg128 reg) - | ((Mem _ | Mem64_RIP _) as rm), Reg128 reg -> - buf_int8 b 0x66; - emit_mod_rm_reg b 0 [ 0x0f; 0x29 ] rm (rd_of_reg128 reg) | _ -> assert false let emit_movupd b dst src = match (dst, src) with - | Reg128 reg, ((Reg128 _ | Mem _ | Mem64_RIP _) as rm) -> + | Regf reg, ((Regf _ | Mem _ | Mem64_RIP _) as rm) -> buf_int8 b 0x66; - emit_mod_rm_reg b 0 [ 0x0f; 0x10 ] rm (rd_of_reg128 reg) - | ((Mem _ | Mem64_RIP _) as rm), Reg128 reg -> + emit_mod_rm_reg b 0 [ 0x0f; 0x10 ] rm (rd_of_regf reg) + | ((Mem _ | Mem64_RIP _) as rm), Regf reg -> buf_int8 b 0x66; - emit_mod_rm_reg b 0 [ 0x0f; 0x11 ] rm (rd_of_reg128 reg) + emit_mod_rm_reg b 0 [ 0x0f; 0x11 ] rm (rd_of_regf reg) | _ -> assert false let emit_movd b ~dst ~src = @@ -1218,9 +1200,6 @@ let emit_FSTP b dst = match dst with | Mem { typ = REAL8 | QWORD } as rm -> emit_mod_rm_reg b 0 [ 0xDD ] rm 3 | Mem { typ = REAL4 } as rm -> emit_mod_rm_reg b 0 [ 0xD9 ] rm 3 - | Regf (ST i) -> - (* assert (i >= 0 && i < float_stack_size); *) - buf_opcodes b [ 0xDD; 0xD8 + i ] | _ -> assert false let emit_neg b dst = @@ -1424,20 +1403,17 @@ let emit_FLDCW b = function | (Mem _ | Mem64_RIP _) as rm -> emit_mod_rm_reg b no_rex [ 0xD9 ] rm 5 | _ -> assert false -let emit_FXCH b = function - | Regf (ST i) -> buf_opcodes b [ 0xD9; 0xC8 + i ] +let emit_FXCH _b = function | _ -> assert false let emit_FLD b = function | Mem { typ = REAL4 | DWORD } as rm -> emit_mod_rm_reg b 0 [ 0xD9 ] rm 0 | Mem { typ = REAL8 | QWORD } as rm -> emit_mod_rm_reg b 0 [ 0xDD ] rm 0 - | Regf (ST i) -> buf_opcodes b [ 0xD9; 0xC0 + i ] | _ -> assert false let emit_FCOMP b = function | Mem { typ = REAL4 | DWORD } as rm -> emit_mod_rm_reg b no_rex [ 0xD8 ] rm 3 | Mem { typ = REAL8 | QWORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDC ] rm 3 - | Regf (ST i) -> buf_opcodes b [ 0xD8; 0xD8 + i ] | _ -> assert false let emit_FXXX reg b rm = @@ -1482,9 +1458,8 @@ let emit_FNSTSW b = function | Mem { typ = NONE | WORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDD ] rm 7 | _ -> assert false -let emit_FXXXP opcode b a1 a2 = +let emit_FXXXP _opcode _b a1 a2 = match (a1, a2) with - | Regf (ST i), Regf (ST 0) -> buf_opcodes b [ 0xDE; opcode + i ] | _ -> assert false let emit_FADDP b = emit_FXXXP 0xC0 b diff --git a/backend/x86_dsl.ml b/backend/x86_dsl.ml index 02092b3c4f8..74bd0da0fd9 100644 --- a/backend/x86_dsl.ml +++ b/backend/x86_dsl.ml @@ -55,15 +55,13 @@ let r14 = Reg64 R14 let r15 = Reg64 R15 let rsp = Reg64 RSP let rbp = Reg64 RBP -let xmm15 = Regf (XMMf 15) +let xmm15 = Regf (XMM 15) let eax = Reg32 RAX let ebx = Reg32 RBX let ecx = Reg32 RCX let edx = Reg32 RDX let ebp = Reg32 RBP let esp = Reg32 RSP -let st0 = Regf (ST 0) -let st1 = Regf (ST 1) let mem32 typ ?(scale = 1) ?base ?sym displ idx = assert(scale >= 0); diff --git a/backend/x86_dsl.mli b/backend/x86_dsl.mli index f6dc911040d..2ac71ba60c9 100644 --- a/backend/x86_dsl.mli +++ b/backend/x86_dsl.mli @@ -51,8 +51,6 @@ val ecx: arg val edx: arg val ebp: arg val esp: arg -val st0: arg -val st1: arg val mem32: data_type -> ?scale:int -> ?base:reg64 -> ?sym:string -> diff --git a/backend/x86_gas.ml b/backend/x86_gas.ml index 8d32efd89bf..8fd569032f1 100644 --- a/backend/x86_gas.ml +++ b/backend/x86_gas.ml @@ -64,8 +64,7 @@ let arg b = function | Reg16 x -> print_reg b string_of_reg16 x | Reg32 x -> print_reg b string_of_reg32 x | Reg64 x -> print_reg b string_of_reg64 x - | Reg128 x -> print_reg b string_of_reg128 x - | Regf x -> print_reg b string_of_registerf x + | Regf x -> print_reg b string_of_regf x | Mem addr -> arg_mem b addr | Mem64_RIP (_, s, displ) -> bprintf b "%s%a(%%rip)" s opt_displ displ @@ -89,7 +88,6 @@ let typeof = function | Reg16 _ -> WORD | Reg32 _ -> DWORD | Reg64 _ -> QWORD - | Reg128 _ -> VEC128 | Imm _ | Sym _ -> NONE | Regf _ -> assert false @@ -100,8 +98,8 @@ let suf arg = | DWORD | REAL8 -> "l" | QWORD -> "q" | REAL4 -> "s" - | VEC128 | NONE -> "" - | NEAR | PROC -> assert false + | NONE -> "" + | VEC128 | NEAR | PROC -> assert false let i0 b s = bprintf b "\t%s" s let i1 b s x = bprintf b "\t%s\t%a" s arg x @@ -153,10 +151,8 @@ let print_instr b = function | FCOMPP -> i0 b "fcompp" | FCOS -> i0 b "fcos" | FDIV arg -> i1_s b "fdiv" arg - | FDIVP (Regf (ST 0), arg2) -> i2 b "fdivrp" (Regf (ST 0)) arg2 (* bug *) | FDIVP (arg1, arg2) -> i2 b "fdivp" arg1 arg2 | FDIVR arg -> i1_s b "fdivr" arg - | FDIVRP (Regf (ST 0), arg2) -> i2 b "fdivp" (Regf (ST 0)) arg2 (* bug *) | FDIVRP (arg1, arg2) -> i2 b "fdivrp" arg1 arg2 | FILD arg -> i1_s b "fild" arg | FISTP arg -> i1_s b "fistp" arg @@ -178,10 +174,8 @@ let print_instr b = function | FSTP (Mem {typ=REAL4; _} as arg) -> i1 b "fstps" arg | FSTP arg -> i1 b "fstpl" arg | FSUB arg -> i1_s b "fsub" arg - | FSUBP (Regf (ST 0), arg2) -> i2 b "fsubrp" (Regf (ST 0)) arg2 (* bug *) | FSUBP (arg1, arg2) -> i2 b "fsubp" arg1 arg2 | FSUBR arg -> i1_s b "fsubr" arg - | FSUBRP (Regf (ST 0), arg2) -> i2 b "fsubp" (Regf (ST 0)) arg2 (* bug *) | FSUBRP (arg1, arg2) -> i2 b "fsubrp" arg1 arg2 | FXCH arg -> i1 b "fxch" arg | FYL2X -> i0 b "fyl2x" diff --git a/backend/x86_masm.ml b/backend/x86_masm.ml index 0869f8cb1fe..b6024428514 100644 --- a/backend/x86_masm.ml +++ b/backend/x86_masm.ml @@ -81,8 +81,7 @@ let arg b = function | Reg16 x -> Buffer.add_string b (string_of_reg16 x) | Reg32 x -> Buffer.add_string b (string_of_reg32 x) | Reg64 x -> Buffer.add_string b (string_of_reg64 x) - | Regf x -> Buffer.add_string b (string_of_registerf x) - | Reg128 x -> Buffer.add_string b (string_of_reg128 x) + | Regf x -> Buffer.add_string b (string_of_regf x) (* We don't need to specify RIP on Win64, since EXTERN will provide the list of external symbols that need this addressing mode, and diff --git a/backend/x86_proc.ml b/backend/x86_proc.ml index 3786f8604f7..b5bf6734884 100644 --- a/backend/x86_proc.ml +++ b/backend/x86_proc.ml @@ -238,12 +238,7 @@ let string_of_reg32 = function | R14 -> "r14d" | R15 -> "r15d" -let string_of_registerf : registerf -> string = function - | XMMf n -> Printf.sprintf "xmm%d" n - | TOS -> Printf.sprintf "tos" - | ST n -> Printf.sprintf "st(%d)" n - -let string_of_reg128 = function +let string_of_regf = function | XMM n -> Printf.sprintf "xmm%d" n let string_of_condition = function diff --git a/backend/x86_proc.mli b/backend/x86_proc.mli index b602c1368a2..80d0ca1d6f4 100644 --- a/backend/x86_proc.mli +++ b/backend/x86_proc.mli @@ -25,8 +25,7 @@ val string_of_reg8h: reg8h -> string val string_of_reg16: reg64 -> string val string_of_reg32: reg64 -> string val string_of_reg64: reg64 -> string -val string_of_reg128: reg128 -> string -val string_of_registerf: registerf -> string +val string_of_regf: regf -> string val string_of_substring_literal: int -> int -> string -> string val string_of_string_literal: string -> string val string_of_condition: condition -> string From ca4e617cf86ff7df9d4ff7f73fb663d9a7827905 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Thu, 6 Jul 2023 13:03:38 -0400 Subject: [PATCH 51/81] codeowners --- .github/CODEOWNERS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a449144f231..155733ae13e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -76,3 +76,6 @@ testsuite/flambda2-test-list @xclerc tools/merge_archives.ml @mshinwell @xclerc tools/merge_dot_a_files.sh @mshinwell @xclerc tools/objinfo.ml @mshinwell @xclerc + +testsuite/tests/unboxed-primitive-args @TheNumbat +tests/simd @TheNumbat From 2d370d1237e0c888469443e0264a67896f08842d Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Thu, 6 Jul 2023 13:12:32 -0400 Subject: [PATCH 52/81] preallocate phys regs --- backend/amd64/proc.ml | 11 ++++++++++- backend/arm64/proc.ml | 7 +++++++ backend/regalloc/regalloc_irc_utils.ml | 4 +++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 036587d73a9..1d756c56112 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -143,11 +143,20 @@ let hard_float_reg = for i = 0 to 15 do v.(i) <- Reg.at_location Float (Reg (100 + i)) done; v +let hard_vec128_reg = + let v = Array.make 16 Reg.dummy in + for i = 0 to 15 do v.(i) <- Reg.at_location Vec128 (Reg (100 + i)) done; + v + +(* We don't need to include vec128 regs here, as they use the same IDs as floats. *) let all_phys_regs = Array.append hard_int_reg hard_float_reg let phys_reg ty n = - Reg.at_location ty (Reg n) + match ty with + | Int | Addr | Val -> hard_int_reg.(n) + | Float -> hard_float_reg.(n - 100) + | Vec128 -> hard_vec128_reg.(n - 100) let rax = phys_reg Int 0 let rdx = phys_reg Int 4 diff --git a/backend/arm64/proc.ml b/backend/arm64/proc.ml index d9b973bc81c..721f72cea29 100644 --- a/backend/arm64/proc.ml +++ b/backend/arm64/proc.ml @@ -119,6 +119,13 @@ let hard_float_reg = let all_phys_regs = Array.append hard_int_reg hard_float_reg +let phys_reg ty n = + match ty with + | Int | Addr | Val -> hard_int_reg.(n) + | Float -> hard_float_reg.(n - 100) + (* CR mslater: (SIMD) arm64 *) + | Vec128 -> fatal_error "arm64: got vec128 register" + let phys_reg ty n = Reg.at_location ty (Reg n) diff --git a/backend/regalloc/regalloc_irc_utils.ml b/backend/regalloc/regalloc_irc_utils.ml index 1f06cbd7d39..751802ce153 100644 --- a/backend/regalloc/regalloc_irc_utils.ml +++ b/backend/regalloc/regalloc_irc_utils.ml @@ -153,7 +153,9 @@ let all_precolored_regs : Reg.t array = let num_available_registers = Proc.num_available_registers.(reg_class) in for reg_idx = 0 to pred num_available_registers do (* The machtype does not matter here, only the IDs *) - res.(!i) <- Proc.phys_reg Int (first_available_register + reg_idx); + res.(!i) <- Proc.phys_reg + (if first_available_register < 100 then Int else Float) + (first_available_register + reg_idx); incr i done done; From 32786882dbd430661c81ee9d5cfeec7097f6b1ad Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Thu, 6 Jul 2023 13:12:45 -0400 Subject: [PATCH 53/81] fmt --- backend/cfg/cfg.ml | 15 +++++++++------ backend/debug/available_regs.ml | 6 ++---- backend/debug/reg_with_debug_info.ml | 12 ++++++++---- backend/regalloc/regalloc_invariants.ml | 4 ++-- backend/regalloc/regalloc_irc_utils.ml | 7 ++++--- backend/regalloc/regalloc_validate.ml | 6 ++++-- middle_end/flambda2/numbers/numeric_types.ml | 6 ++++-- 7 files changed, 33 insertions(+), 23 deletions(-) diff --git a/backend/cfg/cfg.ml b/backend/cfg/cfg.ml index c448ea33f26..ebaae9df289 100644 --- a/backend/cfg/cfg.ml +++ b/backend/cfg/cfg.ml @@ -501,13 +501,16 @@ let is_pure_basic : basic -> bool = function let is_noop_move instr = match instr.desc with - | Op (Move | Spill | Reload) -> - (match instr.arg.(0).loc with + | Op (Move | Spill | Reload) -> ( + match instr.arg.(0).loc with | Unknown -> false - | Reg _ -> Reg.same_loc instr.arg.(0) instr.res.(0) && - Proc.register_class instr.arg.(0) = Proc.register_class instr.res.(0) - | Stack _ -> Reg.same_loc instr.arg.(0) instr.res.(0) && - Proc.stack_slot_class_for instr.arg.(0) = Proc.stack_slot_class_for instr.res.(0)) + | Reg _ -> + Reg.same_loc instr.arg.(0) instr.res.(0) + && Proc.register_class instr.arg.(0) = Proc.register_class instr.res.(0) + | Stack _ -> + Reg.same_loc instr.arg.(0) instr.res.(0) + && Proc.stack_slot_class_for instr.arg.(0) + = Proc.stack_slot_class_for instr.res.(0)) | Op (Csel _) -> ( match instr.res.(0).loc with | Unknown -> false diff --git a/backend/debug/available_regs.ml b/backend/debug/available_regs.ml index 8926b0763cc..623571ae30b 100644 --- a/backend/debug/available_regs.ml +++ b/backend/debug/available_regs.ml @@ -183,8 +183,7 @@ let rec available_regs (instr : M.instruction) ~(avail_before : RAS.t) : RAS.t = then RD.Set.empty else RD.Set.made_unavailable_by_clobber avail_before - ~regs_clobbered:instr.res - ~register_class:Proc.register_class + ~regs_clobbered:instr.res ~register_class:Proc.register_class ~stack_class:Proc.stack_slot_class_for in let results = @@ -210,8 +209,7 @@ let rec available_regs (instr : M.instruction) ~(avail_before : RAS.t) : RAS.t = let regs_clobbered = Array.append (Proc.destroyed_at_oper instr.desc) instr.res in - RD.Set.made_unavailable_by_clobber avail_before - ~regs_clobbered + RD.Set.made_unavailable_by_clobber avail_before ~regs_clobbered ~register_class:Proc.register_class ~stack_class:Proc.stack_slot_class_for in diff --git a/backend/debug/reg_with_debug_info.ml b/backend/debug/reg_with_debug_info.ml index c1c16ae5b2a..dd9ad57d8de 100644 --- a/backend/debug/reg_with_debug_info.ml +++ b/backend/debug/reg_with_debug_info.ml @@ -106,13 +106,15 @@ let holds_non_pointer t = not (holds_pointer t) let assigned_to_stack t = match t.reg.loc with Stack _ -> true | Reg _ | Unknown -> false -let regs_at_same_location (reg1 : Reg.t) (reg2 : Reg.t) ~register_class ~stack_class = +let regs_at_same_location (reg1 : Reg.t) (reg2 : Reg.t) ~register_class + ~stack_class = (* We need to check the register classes too: two locations both saying "stack offset N" might actually be different physical locations, for example if one is of class "Int" and another "Float" on amd64. [register_class] will be [Proc.register_class], but cannot be here, due to a circular dependency. *) - reg1.loc = reg2.loc && + reg1.loc = reg2.loc + && match reg1.loc with | Reg _ -> register_class reg1 = register_class reg2 | Stack _ -> stack_class reg1 = stack_class reg2 @@ -156,12 +158,14 @@ module Set = struct (fun reg acc -> add (create_without_debug_info ~reg) acc) regs empty - let made_unavailable_by_clobber t ~regs_clobbered ~register_class ~stack_class = + let made_unavailable_by_clobber t ~regs_clobbered ~register_class ~stack_class + = Reg.Set.fold (fun reg acc -> let made_unavailable = filter - (fun reg' -> regs_at_same_location reg'.reg reg ~register_class ~stack_class) + (fun reg' -> + regs_at_same_location reg'.reg reg ~register_class ~stack_class) t in union made_unavailable acc) diff --git a/backend/regalloc/regalloc_invariants.ml b/backend/regalloc/regalloc_invariants.ml index 7461dee0644..1f68b01c3d2 100644 --- a/backend/regalloc/regalloc_invariants.ml +++ b/backend/regalloc/regalloc_invariants.ml @@ -215,8 +215,8 @@ let postcondition_layout : Cfg_with_layout.t -> unit = let invalid = Int.Set.diff used_stack_slots.(ss_class) available_slots in if not (Int.Set.is_empty invalid) then - fatal "stack slot class %d uses the following invalid slots: %s" ss_class - (string_of_set invalid); + fatal "stack slot class %d uses the following invalid slots: %s" + ss_class (string_of_set invalid); let unused = Int.Set.diff available_slots used_stack_slots.(ss_class) in if not (Int.Set.is_empty unused) then diff --git a/backend/regalloc/regalloc_irc_utils.ml b/backend/regalloc/regalloc_irc_utils.ml index 751802ce153..bd46c1f7ef2 100644 --- a/backend/regalloc/regalloc_irc_utils.ml +++ b/backend/regalloc/regalloc_irc_utils.ml @@ -153,9 +153,10 @@ let all_precolored_regs : Reg.t array = let num_available_registers = Proc.num_available_registers.(reg_class) in for reg_idx = 0 to pred num_available_registers do (* The machtype does not matter here, only the IDs *) - res.(!i) <- Proc.phys_reg - (if first_available_register < 100 then Int else Float) - (first_available_register + reg_idx); + res.(!i) + <- Proc.phys_reg + (if first_available_register < 100 then Int else Float) + (first_available_register + reg_idx); incr i done done; diff --git a/backend/regalloc/regalloc_validate.ml b/backend/regalloc/regalloc_validate.ml index 9d9b3b60802..9b0d3c4d3fc 100644 --- a/backend/regalloc/regalloc_validate.ml +++ b/backend/regalloc/regalloc_validate.ml @@ -120,7 +120,8 @@ end = struct | Reg.Reg idx -> Some (Reg idx) | Reg.Stack stack -> Some - (Stack (Stack.of_stack_loc ~ss_class:(Proc.stack_slot_class_for reg) stack)) + (Stack + (Stack.of_stack_loc ~ss_class:(Proc.stack_slot_class_for reg) stack)) let of_reg_exn reg = of_reg reg |> Option.get @@ -964,7 +965,8 @@ module type Description_value = sig end let print_reg_as_loc ppf reg = - Printmach.loc ~reg_class:(Proc.stack_slot_class_for reg) + Printmach.loc + ~reg_class:(Proc.stack_slot_class_for reg) ~unknown:(fun ppf -> Format.fprintf ppf "") ppf reg.Reg.loc diff --git a/middle_end/flambda2/numbers/numeric_types.ml b/middle_end/flambda2/numbers/numeric_types.ml index e15ec7779eb..c6ef3377661 100644 --- a/middle_end/flambda2/numbers/numeric_types.ml +++ b/middle_end/flambda2/numbers/numeric_types.ml @@ -288,8 +288,10 @@ module Vector_by_bit_pattern (Width : Vector_width) = struct let to_int64_array t = t let of_int64_array t = - if not (Array.length t = Width.size_in_int64s) then - Misc.fatal_error "Vector_by_bit_pattern.of_int64_array: wrong length array"; + if not (Array.length t = Width.size_in_int64s) + then + Misc.fatal_error + "Vector_by_bit_pattern.of_int64_array: wrong length array"; t end From 540ad8eb24a18aaf413e82b6b8470f290b701d37 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Thu, 6 Jul 2023 13:31:11 -0400 Subject: [PATCH 54/81] fix phys_reg id error --- backend/regalloc/regalloc_invariants.ml | 4 ++-- tests/backend/regalloc_validator/check_regalloc_validation.ml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/regalloc/regalloc_invariants.ml b/backend/regalloc/regalloc_invariants.ml index 1f68b01c3d2..ea4977e399d 100644 --- a/backend/regalloc/regalloc_invariants.ml +++ b/backend/regalloc/regalloc_invariants.ml @@ -101,9 +101,9 @@ let precondition : Cfg_with_layout.t -> unit = let fun_num_stack_slots = (Cfg_with_layout.cfg cfg_with_layout).fun_num_stack_slots in - Array.iteri fun_num_stack_slots ~f:(fun reg_class num_slots -> + Array.iteri fun_num_stack_slots ~f:(fun ss_class num_slots -> if num_slots <> 0 - then fatal "stack slot class %d has %d slots(s)" reg_class num_slots) + then fatal "stack slot class %d has %d slots(s)" ss_class num_slots) let postcondition_layout : Cfg_with_layout.t -> unit = fun cfg_with_layout -> diff --git a/tests/backend/regalloc_validator/check_regalloc_validation.ml b/tests/backend/regalloc_validator/check_regalloc_validation.ml index 43d4052e0e4..209caaf8a7d 100644 --- a/tests/backend/regalloc_validator/check_regalloc_validation.ml +++ b/tests/backend/regalloc_validator/check_regalloc_validation.ml @@ -559,7 +559,7 @@ let () = cfg, cfg) ~exp_std:"fatal exception raised when validating description" ~exp_err: - ">> Fatal error: instruction 20 has a register (V/68) with an unknown \ + ">> Fatal error: instruction 20 has a register (V/53) with an unknown \ location" let () = From d0867d94ca792c81e5edd13d26a50cc4f11b5814 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Thu, 6 Jul 2023 14:16:48 -0400 Subject: [PATCH 55/81] restore destroy v128 reg behavior --- backend/amd64/proc.ml | 62 ++++++++++++++++---------- backend/arm64/proc.ml | 14 +++--- backend/printmach.ml | 6 +-- backend/printmach.mli | 2 +- backend/proc.mli | 8 ++-- backend/regalloc/regalloc_irc_utils.ml | 19 +------- backend/regalloc/regalloc_validate.ml | 4 +- 7 files changed, 57 insertions(+), 58 deletions(-) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 1d756c56112..f1d62c266bc 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -104,12 +104,6 @@ let register_class r = | Val | Int | Addr -> 0 | Float | Vec128 -> 1 -let register_class_tag c = - match c with - | 0 -> "i" - | 1 -> "f" - | c -> Misc.fatal_errorf "Unspecified register class %d" c - let num_stack_slot_classes = 3 let stack_slot_class_for reg = @@ -118,6 +112,13 @@ let stack_slot_class_for reg = | Float -> 1 | Vec128 -> 2 +let stack_class_tag c = + match c with + | 0 -> "i" + | 1 -> "f" + | 2 -> "x" + | c -> Misc.fatal_errorf "Unspecified stack slot class %d" c + let num_available_registers = [| 13; 16 |] let first_available_register = [| 0; 100 |] @@ -148,9 +149,8 @@ let hard_vec128_reg = for i = 0 to 15 do v.(i) <- Reg.at_location Vec128 (Reg (100 + i)) done; v -(* We don't need to include vec128 regs here, as they use the same IDs as floats. *) let all_phys_regs = - Array.append hard_int_reg hard_float_reg + Array.concat [hard_int_reg; hard_float_reg; hard_vec128_reg] let phys_reg ty n = match ty with @@ -163,7 +163,9 @@ let rdx = phys_reg Int 4 let r10 = phys_reg Int 10 let r11 = phys_reg Int 11 let rbp = phys_reg Int 12 -let rxmm15 = phys_reg Float 115 + +(* CSE needs to know that all versions of xmm15 are destroyed. *) +let destroy_xmm15 = [| phys_reg Float 115; phys_reg Vec128 115 |] let destroyed_by_plt_stub = if not X86_proc.use_plt then [| |] else [| r10; r11 |] @@ -326,13 +328,10 @@ let int_dwarf_reg_numbers = let float_dwarf_reg_numbers = [| 17; 18; 19; 20; 21; 22; 23; 24; 25; 26; 27; 28; 29; 30; 31; 32 |] -let vec128_dwarf_reg_numbers = float_dwarf_reg_numbers - let dwarf_register_numbers ~reg_class = match reg_class with | 0 -> int_dwarf_reg_numbers | 1 -> float_dwarf_reg_numbers - | 2 -> vec128_dwarf_reg_numbers | _ -> Misc.fatal_errorf "Bad register class %d" reg_class let stack_ptr_dwarf_register_number = 7 @@ -346,19 +345,24 @@ let regs_are_volatile _rs = false let destroyed_at_c_call = if win64 then (* Win64: rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15 preserved *) - Array.append - (Array.of_list(List.map (phys_reg Int) - [0;4;5;6;7;10;11])) - (Array.of_list(List.map (phys_reg Float) - [100;101;102;103;104;105])) + Array.concat + [Array.of_list(List.map (phys_reg Int) + [0;4;5;6;7;10;11]); + Array.of_list(List.map (phys_reg Float) + [100;101;102;103;104;105]); + Array.of_list(List.map (phys_reg Vec128) + [100;101;102;103;104;105])] else (* Unix: rbp, rbx, r12-r15 preserved *) - Array.append - (Array.of_list(List.map (phys_reg Int) - [0;2;3;4;5;6;7;10;11])) - (Array.of_list(List.map (phys_reg Float) + Array.concat + [Array.of_list(List.map (phys_reg Int) + [0;2;3;4;5;6;7;10;11]); + Array.of_list(List.map (phys_reg Float) [100;101;102;103;104;105;106;107; - 108;109;110;111;112;113;114;115])) + 108;109;110;111;112;113;114;115]); + Array.of_list(List.map (phys_reg Vec128) + [100;101;102;103;104;105;106;107; + 108;109;110;111;112;113;114;115])] let destroyed_at_alloc_or_poll = if X86_proc.use_plt then @@ -379,7 +383,8 @@ let destroyed_at_oper = function | Iop(Iextcall { alloc = false; }) -> destroyed_at_c_call | Iop(Iintop(Idiv | Imod)) | Iop(Iintop_imm((Idiv | Imod), _)) -> [| rax; rdx |] - | Iop(Istore(Single, _, _)) -> [| rxmm15 |] + | Iop(Istore(Single, _, _)) -> + destroy_xmm15 | Iop(Ialloc _ | Ipoll _) -> destroyed_at_alloc_or_poll | Iop(Iintop(Imulh _ | Icomp _) | Iintop_imm((Icomp _), _)) -> [| rax |] @@ -438,7 +443,7 @@ let destroyed_at_basic (basic : Cfg_intf.S.basic) = | Op (Intop (Idiv | Imod)) | Op (Intop_imm ((Idiv | Imod), _)) -> [| rax; rdx |] | Op(Store(Single, _, _)) -> - [| rxmm15 |] + destroy_xmm15 | Op(Intop(Imulh _ | Icomp _) | Intop_imm((Icomp _), _)) -> [| rax |] | Op (Specific (Irdtsc | Irdpmc)) -> @@ -622,6 +627,15 @@ let init () = end else num_available_registers.(0) <- 13 +(* CR mslater for xclerc: is this ok? *) +(* This is not always the same as [all_phys_regs], as some physical registers + may not be allocatable (e.g. rbp when frame pointers are enabled). *) +let precolored_regs () = + let ints = Array.sub hard_int_reg 0 num_available_registers.(0) in + let floats = Array.sub hard_float_reg 0 num_available_registers.(1) in + let vec128s = Array.sub hard_vec128_reg 0 num_available_registers.(1) in + Array.append (Array.append ints floats) vec128s + let operation_supported = function | Cpopcnt -> !popcnt_support | Cprefetch _ | Catomic _ diff --git a/backend/arm64/proc.ml b/backend/arm64/proc.ml index 721f72cea29..bf72eee9f5f 100644 --- a/backend/arm64/proc.ml +++ b/backend/arm64/proc.ml @@ -69,12 +69,6 @@ let register_class r = (* CR mslater: (SIMD) arm64 *) | Vec128 -> fatal_error "arm64: got vec128 register" -let register_class_tag c = - match c with - | 0 -> "i" - | 1 -> "f" - | c -> Misc.fatal_errorf "Unspecified register class %d" c - let num_stack_slot_classes = 2 let stack_slot_class_for r = @@ -84,6 +78,12 @@ let stack_slot_class_for r = (* CR mslater: (SIMD) arm64 *) | Vec128 -> fatal_error "arm64: got vec128 register" +let stack_class_tag c = + match c with + | 0 -> "i" + | 1 -> "f" + | c -> Misc.fatal_errorf "Unspecified stack slot class %d" c + let num_available_registers = [| 23; 32 |] (* first 23 int regs allocatable; all float regs allocatable *) @@ -119,6 +119,8 @@ let hard_float_reg = let all_phys_regs = Array.append hard_int_reg hard_float_reg +let precolored_regs () = all_phys_regs + let phys_reg ty n = match ty with | Int | Addr | Val -> hard_int_reg.(n) diff --git a/backend/printmach.ml b/backend/printmach.ml index 407a8e660c8..e6b85e6d088 100644 --- a/backend/printmach.ml +++ b/backend/printmach.ml @@ -23,14 +23,14 @@ open Interval module V = Backend_var -let loc ?(wrap_out = fun ppf f -> f ppf) ~reg_class ~unknown ppf l = +let loc ?(wrap_out = fun ppf f -> f ppf) ~ss_class ~unknown ppf l = match l with | Unknown -> unknown ppf | Reg r -> wrap_out ppf (fun ppf -> fprintf ppf "%s" (Proc.register_name r)) | Stack(Local s) -> wrap_out ppf (fun ppf -> - fprintf ppf "s[%s:%i]" (Proc.register_class_tag reg_class) s) + fprintf ppf "s[%s:%i]" (Proc.stack_class_tag ss_class) s) | Stack(Incoming s) -> wrap_out ppf (fun ppf -> fprintf ppf "par[%i]" s) | Stack(Outgoing s) -> @@ -52,7 +52,7 @@ let reg ppf r = fprintf ppf "/%i" r.stamp; loc ~wrap_out:(fun ppf f -> fprintf ppf "[%t]" f) - ~reg_class:(Proc.register_class r) ~unknown:(fun _ -> ()) ppf r.loc + ~ss_class:(Proc.stack_slot_class_for r) ~unknown:(fun _ -> ()) ppf r.loc let regs' ?(print_reg = reg) ppf v = let reg = print_reg in diff --git a/backend/printmach.mli b/backend/printmach.mli index 1f0672230b2..0530978acef 100644 --- a/backend/printmach.mli +++ b/backend/printmach.mli @@ -17,7 +17,7 @@ open Format -val loc: ?wrap_out:(formatter -> (formatter -> unit) -> unit) -> reg_class:int -> unknown:(formatter -> unit) -> formatter -> Reg.location -> unit +val loc: ?wrap_out:(formatter -> (formatter -> unit) -> unit) -> ss_class:int -> unknown:(formatter -> unit) -> formatter -> Reg.location -> unit val reg: formatter -> Reg.t -> unit val regs': ?print_reg:(formatter -> Reg.t -> unit) -> formatter -> Reg.t array -> unit val regs: formatter -> Reg.t array -> unit diff --git a/backend/proc.mli b/backend/proc.mli index 859e1656024..8e741a51618 100644 --- a/backend/proc.mli +++ b/backend/proc.mli @@ -21,19 +21,19 @@ val word_addressed: bool (* Registers available for register allocation *) val num_register_classes: int val register_class: Reg.t -> int -val register_class_tag: int -> string val num_available_registers: int array val first_available_register: int array val register_name: int -> string val phys_reg: Cmm.machtype_component -> int -> Reg.t val rotate_registers: bool -val all_phys_regs : Reg.t array +val precolored_regs : unit -> Reg.t array (* The number of stack slot classes may differ from the number of register classes. - On x86, we use the same class for floating point and SIMD vector registers, - but they take up different amounts of space on the stack. *) +On x86, we use the same class for floating point and SIMD vector registers, +but they take up different amounts of space on the stack. *) val num_stack_slot_classes: int val stack_slot_class_for: Reg.t -> int +val stack_class_tag: int -> string (* Calling conventions *) val loc_arguments: Cmm.machtype -> Reg.t array * int diff --git a/backend/regalloc/regalloc_irc_utils.ml b/backend/regalloc/regalloc_irc_utils.ml index bd46c1f7ef2..695b8adbb5a 100644 --- a/backend/regalloc/regalloc_irc_utils.ml +++ b/backend/regalloc/regalloc_irc_utils.ml @@ -143,24 +143,7 @@ let is_move_instruction : Cfg.basic Cfg.instruction -> bool = let all_precolored_regs : Reg.t array = Proc.init (); - let num_available_registers = - Array.fold_left Proc.num_available_registers ~f:( + ) ~init:0 - in - let res = Array.make num_available_registers Reg.dummy in - let i = ref 0 in - for reg_class = 0 to pred Proc.num_register_classes do - let first_available_register = Proc.first_available_register.(reg_class) in - let num_available_registers = Proc.num_available_registers.(reg_class) in - for reg_idx = 0 to pred num_available_registers do - (* The machtype does not matter here, only the IDs *) - res.(!i) - <- Proc.phys_reg - (if first_available_register < 100 then Int else Float) - (first_available_register + reg_idx); - incr i - done - done; - res + Proc.precolored_regs () let k reg = Proc.num_available_registers.(Proc.register_class reg) diff --git a/backend/regalloc/regalloc_validate.ml b/backend/regalloc/regalloc_validate.ml index 9b0d3c4d3fc..c661cbfc5f8 100644 --- a/backend/regalloc/regalloc_validate.ml +++ b/backend/regalloc/regalloc_validate.ml @@ -136,7 +136,7 @@ end = struct match t with Reg _ -> -1 | Stack stack -> Stack.ss_class_lossy stack let print ppf t = - Printmach.loc ~reg_class:(ss_class_lossy t) + Printmach.loc ~ss_class:(ss_class_lossy t) ~unknown:(fun _ -> assert false) ppf (to_loc_lossy t) @@ -966,7 +966,7 @@ end let print_reg_as_loc ppf reg = Printmach.loc - ~reg_class:(Proc.stack_slot_class_for reg) + ~ss_class:(Proc.stack_slot_class_for reg) ~unknown:(fun ppf -> Format.fprintf ppf "") ppf reg.Reg.loc From 483ba78114e2ab871419a4b5efb3bb7a76fb5e51 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Thu, 6 Jul 2023 17:28:01 -0400 Subject: [PATCH 56/81] fix probe handler spills --- backend/amd64/emit.mlp | 39 ++++++++++++++++++-------- tests/simd/simd.ml | 63 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 12 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index df7127cf29e..62d26d8697b 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -1603,15 +1603,14 @@ let begin_assembly unix = () -(* CR mslater: (SIMD) fix this *) -let make_stack_loc ~offset i (r : Reg.t) = +let make_stack_loc ~offset n (r : Reg.t) = (* Use "Outgoing" stack locations, instead of "Local", because [slot_offset] emits (Outgoing n) directly as offset [n] from the stack pointer, rather than a calculation relative to the stack frame, which is incorrect for naked floats (arising from live variables, not probe arguments) in the wrapper's frame. *) - let loc = Stack (Outgoing (offset + (8*i))) in + let loc = Stack (Outgoing (offset + n)) in (* Manufacture stack entry with this register's type *) Reg.at_location r.typ loc @@ -1663,6 +1662,24 @@ let make_stack_loc ~offset i (r : Reg.t) = This assumption might no longer hold in the presence of unboxed types. *) +let size_of_regs regs = + Array.fold_right + (fun r acc -> + match r.Reg.typ with + | Int | Addr | Val -> acc + size_int + | Float -> acc + size_float + | Vec128 -> acc + size_vec128) + regs 0 + +let stack_locations ~offset regs = + let _, locs = Array.fold_right (fun r (n, offsets) -> + let next = n + match r.Reg.typ with + | Int | Val | Addr -> size_int + | Float -> size_float + | Vec128 -> size_vec128 in + next, (make_stack_loc n r ~offset :: offsets)) regs (0, []) in + locs |> List.rev |> Array.of_list + let emit_probe_handler_wrapper p = let wrap_label = probe_handler_wrapper_name p.probe_label in let probe_name, handler_code_sym = @@ -1692,18 +1709,16 @@ let emit_probe_handler_wrapper p = I.mov rsp rbp; end; (* Prepare to call the handler: calculate and allocate stack space. - The calculations are simplified using the following property. *) - assert (size_addr = 8 && size_int = 8 && size_float = 8); - (* Compute the size of stack slots for all live hard registers. *) + Compute the size of stack slots for all live hard registers. *) let live = Reg.Set.elements p.probe_insn.live |> List.filter Reg.is_reg |> Array.of_list in - let live_offset = 8 * (Array.length live) in + let live_offset = size_of_regs live in (* Compute the size of stack slots for spilling all arguments of the probe. *) let aux_offset = 8 (* for saving r15 *) in - let tmp_offset = 8 * (Array.length p.probe_insn.arg) in + let tmp_offset = size_of_regs p.probe_insn.arg in let loc_args, loc_offset = Proc.loc_arguments (Reg.typv p.probe_insn.arg) in (* Ensure the stack is aligned. Assuming that the stack at the probe site is 16-byte aligned, @@ -1719,7 +1734,7 @@ let emit_probe_handler_wrapper p = emit_stack_offset n; (* Save all live hard registers *) let offset = aux_offset + tmp_offset + loc_offset in - let saved_live = Array.mapi (make_stack_loc ~offset) live in + let saved_live = stack_locations ~offset live in Array.iteri (fun i reg -> move reg saved_live.(i)) live; (* Spill r15 to free it to be used as a temporary register for stack to stack copying. *) @@ -1728,11 +1743,11 @@ let emit_probe_handler_wrapper p = I.mov r15 (reg saved_r15); (* Spill all arguments of the probe. Some of these may already be on the stack, in which case a temporary is used for the move. *) - let tmp = Array.mapi (make_stack_loc ~offset:loc_offset) p.probe_insn.arg in - Array.iteri (fun i reg -> move_allowing_stack_to_stack reg (tmp.(i))) + let saved_args = stack_locations ~offset:loc_offset p.probe_insn.arg in + Array.iteri (fun i reg -> move_allowing_stack_to_stack reg (saved_args.(i))) p.probe_insn.arg; (* Load probe arguments to correct locations for the handler *) - Array.iteri (fun i reg -> move_allowing_stack_to_stack tmp.(i) reg) loc_args; + Array.iteri (fun i reg -> move_allowing_stack_to_stack saved_args.(i) reg) loc_args; (* Reload spilled registers used as temporaries *) I.mov (reg saved_r15) r15; (* Emit call to handler *) diff --git a/tests/simd/simd.ml b/tests/simd/simd.ml index 8fab1d59302..e59e824193c 100644 --- a/tests/simd/simd.ml +++ b/tests/simd/simd.ml @@ -235,3 +235,66 @@ let () = let v = vectors_and_floats_and_ints v0 23. v1 24L v2 25. v3 26L 27L v4 v5 28. 29. v6 v7 30L 31L 32. v8 v9 v10 33L 34L 35. in check v 377L 253L ;; + +(* Vectors live across a probe handler *) +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v2 = vec128_of_int64s 5L 6L in + let v3 = vec128_of_int64s 7L 8L in + let v4 = vec128_of_int64s 9L 10L in + let v5 = vec128_of_int64s 11L 12L in + let v6 = vec128_of_int64s 13L 14L in + let v7 = vec128_of_int64s 15L 16L in + let v8 = vec128_of_int64s 17L 18L in + let v9 = vec128_of_int64s 19L 20L in + let v10 = vec128_of_int64s 21L 22L in + let v11 = vec128_of_int64s 23L 24L in + let v12 = vec128_of_int64s 25L 26L in + let v13 = vec128_of_int64s 27L 28L in + let v14 = vec128_of_int64s 29L 30L in + let v15 = vec128_of_int64s 31L 32L in + [%probe "hello" ~enabled_at_init:true ( + let xxx = vec128_of_int64s 0L 0L in + check xxx 0L 0L)]; + let v = lots_of_vectors v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 in + check v 256L 272L +;; + +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v2 = vec128_of_int64s 5L 6L in + let v3 = vec128_of_int64s 7L 8L in + let v4 = vec128_of_int64s 9L 10L in + let v5 = vec128_of_int64s 11L 12L in + let v6 = vec128_of_int64s 13L 14L in + let v7 = vec128_of_int64s 15L 16L in + let v8 = vec128_of_int64s 17L 18L in + let v9 = vec128_of_int64s 19L 20L in + let v10 = vec128_of_int64s 21L 22L in + [%probe "hello" ~enabled_at_init:true ( + let xxx = vec128_of_int64s 0L 0L in + check xxx 0L 0L)]; + let v = vectors_and_floats v0 23. v1 24. v2 25. v3 26. 27. v4 v5 28. 29. v6 v7 30. 31. 32. v8 v9 v10 33. 34. 35. in + check v 377L 253L +;; + +let () = + let v0 = vec128_of_int64s 1L 2L in + let v1 = vec128_of_int64s 3L 4L in + let v2 = vec128_of_int64s 5L 6L in + let v3 = vec128_of_int64s 7L 8L in + let v4 = vec128_of_int64s 9L 10L in + let v5 = vec128_of_int64s 11L 12L in + let v6 = vec128_of_int64s 13L 14L in + let v7 = vec128_of_int64s 15L 16L in + let v8 = vec128_of_int64s 17L 18L in + let v9 = vec128_of_int64s 19L 20L in + let v10 = vec128_of_int64s 21L 22L in + [%probe "hello" ~enabled_at_init:true ( + let xxx = vec128_of_int64s 0L 0L in + check xxx 0L 0L)]; + let v = vectors_and_floats_and_ints v0 23. v1 24L v2 25. v3 26L 27L v4 v5 28. 29. v6 v7 30L 31L 32. v8 v9 v10 33L 34L 35. in + check v 377L 253L +;; From 19fe68def0f034cde9031dc701cb0aa254f4477f Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Fri, 7 Jul 2023 09:25:45 -0400 Subject: [PATCH 57/81] vec128 suffix --- backend/x86_gas.ml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/x86_gas.ml b/backend/x86_gas.ml index 8fd569032f1..473ba8981e3 100644 --- a/backend/x86_gas.ml +++ b/backend/x86_gas.ml @@ -98,8 +98,8 @@ let suf arg = | DWORD | REAL8 -> "l" | QWORD -> "q" | REAL4 -> "s" - | NONE -> "" - | VEC128 | NEAR | PROC -> assert false + | VEC128 | NONE -> "" + | NEAR | PROC -> assert false let i0 b s = bprintf b "\t%s" s let i1 b s x = bprintf b "\t%s\t%a" s arg x From a43de38a040d721a5c5716c3c66edbb0f0a97bb9 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Fri, 7 Jul 2023 09:41:10 -0400 Subject: [PATCH 58/81] comments --- backend/debug/reg_with_debug_info.ml | 2 +- backend/regalloc/regalloc_invariants.ml | 4 ++-- backend/regalloc/regalloc_utils.ml | 4 ++++ backend/regalloc/regalloc_utils.mli | 2 ++ middle_end/flambda2/types/provers.ml | 3 ++- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/backend/debug/reg_with_debug_info.ml b/backend/debug/reg_with_debug_info.ml index dd9ad57d8de..6da74b6f615 100644 --- a/backend/debug/reg_with_debug_info.ml +++ b/backend/debug/reg_with_debug_info.ml @@ -118,7 +118,7 @@ let regs_at_same_location (reg1 : Reg.t) (reg2 : Reg.t) ~register_class match reg1.loc with | Reg _ -> register_class reg1 = register_class reg2 | Stack _ -> stack_class reg1 = stack_class reg2 - | Unknown -> false + | Unknown -> Misc.fatal_errorf "regs_at_same_location got Unknown locations" let at_same_location t (reg : Reg.t) ~register_class ~stack_class = regs_at_same_location t.reg reg ~register_class ~stack_class diff --git a/backend/regalloc/regalloc_invariants.ml b/backend/regalloc/regalloc_invariants.ml index ea4977e399d..cd9d3d9de98 100644 --- a/backend/regalloc/regalloc_invariants.ml +++ b/backend/regalloc/regalloc_invariants.ml @@ -148,10 +148,10 @@ let postcondition_layout : Cfg_with_layout.t -> unit = match reg.Reg.loc with | Reg phys_reg -> let phys_reg = Proc.phys_reg reg.typ phys_reg in - if not (same_reg_class reg phys_reg) + if not (same_stack_class reg phys_reg) then fatal - "instruction %d assigned %a to %a but they are in different classes" + "instruction %d assigned %a to %a but they are in different stack slot classes" id Printmach.reg reg Printmach.reg phys_reg | Stack _ | Unknown -> () in diff --git a/backend/regalloc/regalloc_utils.ml b/backend/regalloc/regalloc_utils.ml index ca5726e9838..3feabbfdfd1 100644 --- a/backend/regalloc/regalloc_utils.ml +++ b/backend/regalloc/regalloc_utils.ml @@ -252,6 +252,10 @@ let same_reg_class : Reg.t -> Reg.t -> bool = fun reg1 reg2 -> Int.equal (Proc.register_class reg1) (Proc.register_class reg2) +let same_stack_class : Reg.t -> Reg.t -> bool = + fun reg1 reg2 -> + Int.equal (Proc.stack_slot_class_for reg1) (Proc.stack_slot_class_for reg2) + let make_temporary : same_class_and_base_name_as:Reg.t -> name_prefix:string -> Reg.t = fun ~same_class_and_base_name_as:reg ~name_prefix -> diff --git a/backend/regalloc/regalloc_utils.mli b/backend/regalloc/regalloc_utils.mli index a9ce6085a4c..028e50bab8b 100644 --- a/backend/regalloc/regalloc_utils.mli +++ b/backend/regalloc/regalloc_utils.mli @@ -94,6 +94,8 @@ end val same_reg_class : Reg.t -> Reg.t -> bool +val same_stack_class : Reg.t -> Reg.t -> bool + val make_temporary : same_class_and_base_name_as:Reg.t -> name_prefix:string -> Reg.t diff --git a/middle_end/flambda2/types/provers.ml b/middle_end/flambda2/types/provers.ml index c5a897e21c2..58877aa7d35 100644 --- a/middle_end/flambda2/types/provers.ml +++ b/middle_end/flambda2/types/provers.ml @@ -917,7 +917,8 @@ let prove_physical_equality env t1 t2 = | Naked_vec128 (Ok s1), Naked_vec128 (Ok s2) -> let module IS = Numeric_types.Vec128_by_bit_pattern.Set in IS.is_empty (IS.inter (s1 :> IS.t) (s2 :> IS.t)) - | _, _ -> false + | (Naked_float _ | Naked_int32 _ | Naked_int64 _ | Naked_nativeint _ | + Naked_vec128 _ | Value _ | Naked_immediate _ | Region _ | Rec_info _), _ -> false in let check_heads () : _ proof_of_property = match expand_head env t1, expand_head env t2 with From e8d3192ba6c22cd0af7c3e9e203799f9e3fd86fc Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Fri, 7 Jul 2023 09:49:46 -0400 Subject: [PATCH 59/81] fmt --- backend/regalloc/regalloc_invariants.ml | 3 ++- backend/regalloc/regalloc_utils.ml | 4 ++-- middle_end/flambda2/types/provers.ml | 7 +++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/backend/regalloc/regalloc_invariants.ml b/backend/regalloc/regalloc_invariants.ml index cd9d3d9de98..62e8a2c201d 100644 --- a/backend/regalloc/regalloc_invariants.ml +++ b/backend/regalloc/regalloc_invariants.ml @@ -151,7 +151,8 @@ let postcondition_layout : Cfg_with_layout.t -> unit = if not (same_stack_class reg phys_reg) then fatal - "instruction %d assigned %a to %a but they are in different stack slot classes" + "instruction %d assigned %a to %a but they are in different stack \ + slot classes" id Printmach.reg reg Printmach.reg phys_reg | Stack _ | Unknown -> () in diff --git a/backend/regalloc/regalloc_utils.ml b/backend/regalloc/regalloc_utils.ml index 3feabbfdfd1..1ad65e0b149 100644 --- a/backend/regalloc/regalloc_utils.ml +++ b/backend/regalloc/regalloc_utils.ml @@ -253,8 +253,8 @@ let same_reg_class : Reg.t -> Reg.t -> bool = Int.equal (Proc.register_class reg1) (Proc.register_class reg2) let same_stack_class : Reg.t -> Reg.t -> bool = - fun reg1 reg2 -> - Int.equal (Proc.stack_slot_class_for reg1) (Proc.stack_slot_class_for reg2) + fun reg1 reg2 -> + Int.equal (Proc.stack_slot_class_for reg1) (Proc.stack_slot_class_for reg2) let make_temporary : same_class_and_base_name_as:Reg.t -> name_prefix:string -> Reg.t = diff --git a/middle_end/flambda2/types/provers.ml b/middle_end/flambda2/types/provers.ml index 58877aa7d35..707a3aea834 100644 --- a/middle_end/flambda2/types/provers.ml +++ b/middle_end/flambda2/types/provers.ml @@ -917,8 +917,11 @@ let prove_physical_equality env t1 t2 = | Naked_vec128 (Ok s1), Naked_vec128 (Ok s2) -> let module IS = Numeric_types.Vec128_by_bit_pattern.Set in IS.is_empty (IS.inter (s1 :> IS.t) (s2 :> IS.t)) - | (Naked_float _ | Naked_int32 _ | Naked_int64 _ | Naked_nativeint _ | - Naked_vec128 _ | Value _ | Naked_immediate _ | Region _ | Rec_info _), _ -> false + | ( ( Naked_float _ | Naked_int32 _ | Naked_int64 _ | Naked_nativeint _ + | Naked_vec128 _ | Value _ | Naked_immediate _ | Region _ | Rec_info _ + ), + _ ) -> + false in let check_heads () : _ proof_of_property = match expand_head env t1, expand_head env t2 with From 6d66ab0070c66e51d1110833a150e1962d1d644d Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Fri, 7 Jul 2023 16:11:12 -0400 Subject: [PATCH 60/81] disable simd register allocation by default --- backend/amd64/arch.ml | 7 ++ backend/amd64/emit.mlp | 6 +- backend/amd64/proc.ml | 112 +++++++++++++----------- backend/arm64/emit.mlp | 2 +- backend/arm64/proc.ml | 14 +-- backend/interf.ml | 2 +- backend/interval.ml | 2 +- backend/proc.mli | 6 +- backend/regalloc/regalloc_irc.ml | 4 +- backend/regalloc/regalloc_irc_state.ml | 12 +-- backend/regalloc/regalloc_irc_utils.ml | 4 +- backend/regalloc/regalloc_irc_utils.mli | 2 +- backend/regalloc/regalloc_ls.ml | 2 +- backend/regalloc/regalloc_validate.ml | 2 +- tests/simd/dune | 2 +- 15 files changed, 101 insertions(+), 78 deletions(-) diff --git a/backend/amd64/arch.ml b/backend/amd64/arch.ml index 171e76652d3..4165d7bf1a4 100644 --- a/backend/amd64/arch.ml +++ b/backend/amd64/arch.ml @@ -31,6 +31,9 @@ let prefetchwt1_support = ref false (* Emit elf notes with trap handling information. *) let trap_notes = ref true +(* Enables usage of vector registers. *) +let simd_regalloc_support = ref false + (* Machine-specific command-line options *) let command_line_options = @@ -59,6 +62,10 @@ let command_line_options = " Emit .note.ocaml_eh section with trap handling information (default)"; "-fno-trap-notes", Arg.Clear trap_notes, " Do not emit .note.ocaml_eh section with trap handling information"; + "-fsimd", Arg.Set simd_regalloc_support, + " Enable register allocation for SIMD vectors"; + "-fno-simd", Arg.Clear simd_regalloc_support, + " Disable register allocation for SIMD vectors (default)" ] (* Specific operations for the AMD64 processor *) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 62d26d8697b..08b8048b5ae 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -89,6 +89,7 @@ let frame_required = ref false let frame_size () = (* includes return address *) if !frame_required then begin + if not !simd_regalloc_support then assert (num_stack_slots.(2) = 0); let sz = (!stack_offset + 8 @@ -104,11 +105,12 @@ let slot_offset loc cl = match loc with | Incoming n -> frame_size() + n | Local n -> + if not !simd_regalloc_support then assert (num_stack_slots.(2) = 0 && cl < 2); (!stack_offset + match cl with | 2 -> n * 16 - | 1 -> n * 8 + num_stack_slots.(2) * 16 - | 0 -> n * 8 + num_stack_slots.(2) * 16 + num_stack_slots.(1) * 8 + | 1 -> num_stack_slots.(2) * 16 + n * 8 + | 0 -> num_stack_slots.(2) * 16 + num_stack_slots.(1) * 8 + n * 8 | _ -> Misc.fatal_error "Unknown register class") | Outgoing n -> n | Domainstate _ -> assert false (* not a stack slot *) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index f1d62c266bc..6743d9d4a25 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -48,7 +48,7 @@ let win64 = Arch.win64 r14 domain state pointer r15 allocation pointer - xmm0 - xmm15 100 - 115 (for floats and SIMD vectors) *) + xmm0 - xmm15 100 - 115 *) (* Conventions: rax - r13: OCaml function arguments @@ -102,7 +102,11 @@ let num_register_classes = 2 let register_class r = match r.typ with | Val | Int | Addr -> 0 - | Float | Vec128 -> 1 + | Float -> 1 + | Vec128 -> + if not !simd_regalloc_support then + Misc.fatal_error "SIMD register allocation is not enabled."; + 1 let num_stack_slot_classes = 3 @@ -110,13 +114,19 @@ let stack_slot_class_for reg = match reg.typ with | Val | Addr | Int -> 0 | Float -> 1 - | Vec128 -> 2 + | Vec128 -> + if not !simd_regalloc_support then + Misc.fatal_error "SIMD register allocation is not enabled."; + 2 let stack_class_tag c = match c with | 0 -> "i" | 1 -> "f" - | 2 -> "x" + | 2 -> + if not !simd_regalloc_support then + Misc.fatal_error "SIMD register allocation is not enabled."; + "x" | c -> Misc.fatal_errorf "Unspecified stack slot class %d" c let num_available_registers = [| 13; 16 |] @@ -150,7 +160,9 @@ let hard_vec128_reg = v let all_phys_regs = - Array.concat [hard_int_reg; hard_float_reg; hard_vec128_reg] + let basic_regs = Array.append hard_int_reg hard_float_reg in + let simd_regs = Array.append basic_regs hard_vec128_reg in + fun () -> if !simd_regalloc_support then simd_regs else basic_regs let phys_reg ty n = match ty with @@ -165,7 +177,10 @@ let r11 = phys_reg Int 11 let rbp = phys_reg Int 12 (* CSE needs to know that all versions of xmm15 are destroyed. *) -let destroy_xmm15 = [| phys_reg Float 115; phys_reg Vec128 115 |] +let destroy_xmm15 () = + if !simd_regalloc_support + then [| phys_reg Float 115; phys_reg Vec128 115 |] + else [| phys_reg Float 115 |] let destroyed_by_plt_stub = if not X86_proc.use_plt then [| |] else [| r10; r11 |] @@ -211,6 +226,8 @@ let calling_conventions first_int last_int first_float last_float make_stack fir ofs := !ofs + size_float end | Vec128 -> + if not !simd_regalloc_support then + Misc.fatal_error "SIMD register allocation is not enabled."; if !float <= last_float then begin loc.(i) <- phys_reg Vec128 !float; incr float @@ -297,6 +314,8 @@ let win64_loc_external_arguments arg = ofs := !ofs + size_float end | Vec128 -> + if not !simd_regalloc_support then + Misc.fatal_error "SIMD register allocation is not enabled."; if !reg < 4 then begin loc.(i) <- phys_reg Vec128 win64_float_external_arguments.(!reg); incr reg @@ -343,34 +362,28 @@ let regs_are_volatile _rs = false (* Registers destroyed by operations *) let destroyed_at_c_call = - if win64 then - (* Win64: rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15 preserved *) - Array.concat - [Array.of_list(List.map (phys_reg Int) - [0;4;5;6;7;10;11]); - Array.of_list(List.map (phys_reg Float) - [100;101;102;103;104;105]); - Array.of_list(List.map (phys_reg Vec128) - [100;101;102;103;104;105])] - else + let basic_regs, simd_regs = + match win64 with + | true -> + (List.map (phys_reg Int) [0;4;5;6;7;10;11]) @ + (List.map (phys_reg Float) [100;101;102;103;104;105]), + (List.map (phys_reg Vec128) [100;101;102;103;104;105]) + | false -> (* Unix: rbp, rbx, r12-r15 preserved *) - Array.concat - [Array.of_list(List.map (phys_reg Int) - [0;2;3;4;5;6;7;10;11]); - Array.of_list(List.map (phys_reg Float) - [100;101;102;103;104;105;106;107; - 108;109;110;111;112;113;114;115]); - Array.of_list(List.map (phys_reg Vec128) - [100;101;102;103;104;105;106;107; - 108;109;110;111;112;113;114;115])] - -let destroyed_at_alloc_or_poll = + (List.map (phys_reg Int) [0;2;3;4;5;6;7;10;11]) @ + (List.map (phys_reg Float) [100;101;102;103;104;105;106;107;108;109;110;111;112;113;114;115]), + (List.map (phys_reg Vec128) [100;101;102;103;104;105;106;107;108;109;110;111;112;113;114;115]) + in + let basic_regs, simd_regs = Array.of_list basic_regs, Array.of_list (basic_regs @ simd_regs) in + fun () -> if !simd_regalloc_support then simd_regs else basic_regs + +let destroyed_at_alloc_or_poll () = if X86_proc.use_plt then destroyed_by_plt_stub else [| r11 |] -let destroyed_at_pushtrap = +let destroyed_at_pushtrap () = [| r11 |] let has_pushtrap traps = @@ -378,19 +391,19 @@ let has_pushtrap traps = (* note: keep this function in sync with `destroyed_at_{basic,terminator}` below. *) let destroyed_at_oper = function - Iop(Icall_ind | Icall_imm _ | Iextcall { alloc = true; }) -> - all_phys_regs - | Iop(Iextcall { alloc = false; }) -> destroyed_at_c_call + Iop(Icall_ind | Icall_imm _ | Iextcall { alloc = true; }) + -> all_phys_regs () + | Iop(Iextcall { alloc = false; }) -> destroyed_at_c_call () | Iop(Iintop(Idiv | Imod)) | Iop(Iintop_imm((Idiv | Imod), _)) -> [| rax; rdx |] - | Iop(Istore(Single, _, _)) -> - destroy_xmm15 - | Iop(Ialloc _ | Ipoll _) -> destroyed_at_alloc_or_poll + | Iop(Istore(Single, _, _)) + -> destroy_xmm15 () + | Iop(Ialloc _ | Ipoll _) -> destroyed_at_alloc_or_poll () | Iop(Iintop(Imulh _ | Icomp _) | Iintop_imm((Icomp _), _)) -> [| rax |] | Iswitch(_, _) -> [| rax; rdx |] - | Itrywith _ -> destroyed_at_pushtrap - | Iexit (_, traps) when has_pushtrap traps -> destroyed_at_pushtrap + | Itrywith _ -> destroyed_at_pushtrap () + | Iexit (_, traps) when has_pushtrap traps -> destroyed_at_pushtrap () | Ireturn traps when has_pushtrap traps -> assert false | Iop(Ispecific (Irdtsc | Irdpmc)) -> [| rax; rdx |] | Iop(Ispecific(Ilfence | Isfence | Imfence)) -> [||] @@ -429,21 +442,21 @@ let destroyed_at_oper = function [||] -let destroyed_at_raise = all_phys_regs +let destroyed_at_raise () = all_phys_regs () -let destroyed_at_reloadretaddr = [| |] +let destroyed_at_reloadretaddr () = [| |] (* note: keep this function in sync with `destroyed_at_oper` above. *) let destroyed_at_basic (basic : Cfg_intf.S.basic) = match basic with | Reloadretaddr -> - destroyed_at_reloadretaddr + destroyed_at_reloadretaddr () | Pushtrap _ -> - destroyed_at_pushtrap + destroyed_at_pushtrap () | Op (Intop (Idiv | Imod)) | Op (Intop_imm ((Idiv | Imod), _)) -> [| rax; rdx |] | Op(Store(Single, _, _)) -> - destroy_xmm15 + destroy_xmm15 () | Op(Intop(Imulh _ | Icomp _) | Intop_imm((Icomp _), _)) -> [| rax |] | Op (Specific (Irdtsc | Irdpmc)) -> @@ -487,7 +500,7 @@ let destroyed_at_terminator (terminator : Cfg_intf.S.terminator) = match terminator with | Never -> assert false | Prim {op = Alloc _; _} -> - destroyed_at_alloc_or_poll + destroyed_at_alloc_or_poll () | Always _ | Parity_test _ | Truth_test _ | Float_test _ | Int_test _ | Return | Raise _ | Tailcall_self _ | Tailcall_func _ | Prim {op = Checkbound _ | Probe _; _} @@ -497,9 +510,9 @@ let destroyed_at_terminator (terminator : Cfg_intf.S.terminator) = [| rax; rdx |] | Call_no_return { func_symbol = _; alloc; ty_res = _; ty_args = _; } | Prim {op = External { func_symbol = _; alloc; ty_res = _; ty_args = _; }; _} -> - if alloc then all_phys_regs else destroyed_at_c_call + if alloc then all_phys_regs () else destroyed_at_c_call () | Call {op = Indirect | Direct _; _} -> - all_phys_regs + all_phys_regs () | Specific_can_raise { op = (Ilea _ | Ibswap _ | Isqrtf | Isextend32 | Izextend32 | Ifloatarithmem _ | Ifloatsqrtf _ | Ifloat_iround | Ifloat_round _ | Ifloat_min | Ifloat_max @@ -508,7 +521,7 @@ let destroyed_at_terminator (terminator : Cfg_intf.S.terminator) = | Istore_int (_, _, _) | Ioffset_loc (_, _) | Iprefetch _); _ } -> Misc.fatal_error "no instructions specific for this architecture can raise" - | Poll_and_jump _ -> destroyed_at_alloc_or_poll + | Poll_and_jump _ -> destroyed_at_alloc_or_poll () (* CR-soon xclerc for xclerc: consider having more destruction points. We current return `true` when `destroyed_at_terminator` returns @@ -611,7 +624,7 @@ let frame_required ~fun_contains_calls ~fun_num_stack_slots = fp || fun_contains_calls || fun_num_stack_slots.(0) > 0 || fun_num_stack_slots.(1) > 0 || - fun_num_stack_slots.(2) > 0 + (!simd_regalloc_support && fun_num_stack_slots.(2) > 0) let prologue_required ~fun_contains_calls ~fun_num_stack_slots = frame_required ~fun_contains_calls ~fun_num_stack_slots @@ -627,14 +640,15 @@ let init () = end else num_available_registers.(0) <- 13 -(* CR mslater for xclerc: is this ok? *) (* This is not always the same as [all_phys_regs], as some physical registers may not be allocatable (e.g. rbp when frame pointers are enabled). *) -let precolored_regs () = +let precolored_regs = let ints = Array.sub hard_int_reg 0 num_available_registers.(0) in let floats = Array.sub hard_float_reg 0 num_available_registers.(1) in let vec128s = Array.sub hard_vec128_reg 0 num_available_registers.(1) in - Array.append (Array.append ints floats) vec128s + let basic_regs = Array.append ints floats in + let simd_regs = Array.append basic_regs vec128s in + fun () -> if !simd_regalloc_support then simd_regs else basic_regs let operation_supported = function | Cpopcnt -> !popcnt_support diff --git a/backend/arm64/emit.mlp b/backend/arm64/emit.mlp index 16965aca798..2866692f842 100644 --- a/backend/arm64/emit.mlp +++ b/backend/arm64/emit.mlp @@ -1138,7 +1138,7 @@ let fundecl fundecl = stack_offset := 0; call_gc_sites := []; bound_error_sites := []; - for i = 0 to Proc.num_stack_slot_classes - 1 do + for i = 0 to Proc.num_stack_slot_classes - 1 do num_stack_slots.(i) <- fundecl.fun_num_stack_slots.(i); done; prologue_required := fundecl.fun_prologue_required; diff --git a/backend/arm64/proc.ml b/backend/arm64/proc.ml index bf72eee9f5f..19cbecfe3ef 100644 --- a/backend/arm64/proc.ml +++ b/backend/arm64/proc.ml @@ -315,21 +315,21 @@ let destroyed_at_oper = function [| reg_d7 |] (* d7 / s7 destroyed *) | _ -> [||] -let destroyed_at_raise = all_phys_regs +let destroyed_at_raise () = all_phys_regs -let destroyed_at_reloadretaddr = [| |] +let destroyed_at_reloadretaddr () = [| |] -let destroyed_at_pushtrap = [| |] +let destroyed_at_pushtrap () = [| |] -let destroyed_at_alloc_or_poll = [| reg_x8 |] +let destroyed_at_alloc_or_poll () = [| reg_x8 |] (* note: keep this function in sync with `destroyed_at_oper` above. *) let destroyed_at_basic (basic : Cfg_intf.S.basic) = match basic with | Reloadretaddr -> - destroyed_at_reloadretaddr + destroyed_at_reloadretaddr () | Pushtrap _ -> - destroyed_at_pushtrap + destroyed_at_pushtrap () | Op (Intop Icheckbound | Intop_imm (Icheckbound, _)) -> assert false | Op( Intoffloat | Floatofint @@ -355,7 +355,7 @@ let destroyed_at_terminator (terminator : Cfg_intf.S.terminator) = | Call_no_return { func_symbol = _; alloc; ty_res = _; ty_args = _; } | Prim {op = External { func_symbol = _; alloc; ty_res = _; ty_args = _; }; _} -> if alloc then all_phys_regs else destroyed_at_c_call - | Poll_and_jump _ -> destroyed_at_alloc_or_poll + | Poll_and_jump _ -> destroyed_at_alloc_or_poll () (* CR-soon xclerc for xclerc: consider having more destruction points. We current return `true` when `destroyed_at_terminator` returns diff --git a/backend/interf.ml b/backend/interf.ml index c34eaa0a867..6436e344bf1 100644 --- a/backend/interf.ml +++ b/backend/interf.ml @@ -114,7 +114,7 @@ let build_graph fundecl = | Iexit _ -> () | Itrywith(body, _kind, (_ts, handler)) -> - add_interf_set Proc.destroyed_at_raise handler.live; + add_interf_set (Proc.destroyed_at_raise ()) handler.live; interf body; interf handler; interf i.next | Iraise _ -> () in diff --git a/backend/interval.ml b/backend/interval.ml index 1546e39effa..4955ba7b812 100644 --- a/backend/interval.ml +++ b/backend/interval.ml @@ -108,7 +108,7 @@ let insert_destroyed_at_oper intervals instr pos = update_interval_position_by_array intervals destroyed pos Result let insert_destroyed_at_raise intervals pos = - let destroyed = Proc.destroyed_at_raise in + let destroyed = Proc.destroyed_at_raise () in if Array.length destroyed > 0 then update_interval_position_by_array intervals destroyed pos Result diff --git a/backend/proc.mli b/backend/proc.mli index 8e741a51618..56b0a894a69 100644 --- a/backend/proc.mli +++ b/backend/proc.mli @@ -61,9 +61,9 @@ val max_register_pressure: Mach.operation -> int array (* Registers destroyed by operations *) val destroyed_at_oper: Mach.instruction_desc -> Reg.t array -val destroyed_at_raise: Reg.t array -val destroyed_at_reloadretaddr : Reg.t array -val destroyed_at_pushtrap : Reg.t array +val destroyed_at_raise: unit -> Reg.t array +val destroyed_at_reloadretaddr : unit -> Reg.t array +val destroyed_at_pushtrap : unit -> Reg.t array val destroyed_at_basic : Cfg_intf.S.basic -> Reg.t array val destroyed_at_terminator : Cfg_intf.S.terminator -> Reg.t array val is_destruction_point : Cfg_intf.S.terminator -> bool diff --git a/backend/regalloc/regalloc_irc.ml b/backend/regalloc/regalloc_irc.ml index fc925c9f653..8db6e297b37 100644 --- a/backend/regalloc/regalloc_irc.ml +++ b/backend/regalloc/regalloc_irc.ml @@ -89,7 +89,7 @@ let build : State.t -> Cfg_with_infos.t -> unit = let live = Cfg_dataflow.Instr.Tbl.find liveness first_id in Reg.Set.iter (fun reg1 -> - Array.iter (filter_fp Proc.destroyed_at_raise) ~f:(fun reg2 -> + Array.iter (filter_fp (Proc.destroyed_at_raise ())) ~f:(fun reg2 -> State.add_edge state reg1 reg2)) (Reg.Set.remove Proc.loc_exn_bucket live.before)) @@ -525,6 +525,6 @@ let run : Cfg_with_infos.t -> Cfg_with_infos.t = state ~f:(fun () -> update_register_locations (); - Array.iter all_precolored_regs ~f:(fun reg -> reg.Reg.degree <- 0)) + Array.iter (all_precolored_regs ()) ~f:(fun reg -> reg.Reg.degree <- 0)) cfg_with_infos; cfg_with_infos diff --git a/backend/regalloc/regalloc_irc_state.ml b/backend/regalloc/regalloc_irc_state.ml index d4f1ca80a40..e06c76cfec2 100644 --- a/backend/regalloc/regalloc_irc_state.ml +++ b/backend/regalloc/regalloc_irc_state.ml @@ -60,7 +60,7 @@ let[@inline] make ~initial ~stack_slots ~next_instruction_id () = reg.Reg.interf <- []; reg.Reg.degree <- 0); List.iter initial ~f:(fun reg -> reg.Reg.irc_work_list <- Initial); - Array.iter all_precolored_regs ~f:(fun reg -> + Array.iter (all_precolored_regs ()) ~f:(fun reg -> reg.Reg.irc_work_list <- Reg.Precolored; reg.Reg.irc_color <- (match reg.Reg.loc with @@ -140,7 +140,7 @@ let[@inline] reset state ~new_temporaries = reg.Reg.irc_alias <- None; reg.Reg.interf <- []; reg.Reg.degree <- 0); - Array.iter all_precolored_regs ~f:(fun reg -> + Array.iter (all_precolored_regs ()) ~f:(fun reg -> assert (reg.Reg.irc_work_list = Reg.Precolored); (match reg.Reg.loc, reg.Reg.irc_color with | Reg color, Some color' -> assert (color = color') @@ -534,10 +534,10 @@ let[@inline] invariant state = then ( (* interf (list) is morally a set *) List.iter (Reg.all_registers ()) ~f:check_inter_has_no_duplicates; - Array.iter all_precolored_regs ~f:check_inter_has_no_duplicates; + Array.iter (all_precolored_regs ()) ~f:check_inter_has_no_duplicates; (* register sets are disjoint *) check_disjoint ~is_disjoint:Reg.Set.disjoint - [ "precolored", Reg.set_of_array all_precolored_regs; + [ "precolored", Reg.set_of_array (all_precolored_regs ()); "initial", reg_set_of_doubly_linked_list state.initial; "simplify_work_list", reg_set_of_reg_work_list state.simplify_work_list; "freeze_work_list", reg_set_of_reg_work_list state.freeze_work_list; @@ -547,7 +547,7 @@ let[@inline] invariant state = "colored_nodes", reg_set_of_doubly_linked_list state.colored_nodes; "select_stack", Reg.Set.of_list state.select_stack ]; List.iter ~f:check_set_and_field_consistency_reg - [ "precolored", Reg.set_of_array all_precolored_regs, Reg.Precolored; + [ "precolored", Reg.set_of_array (all_precolored_regs ()), Reg.Precolored; "initial", reg_set_of_doubly_linked_list state.initial, Reg.Initial; ( "simplify_work_list", reg_set_of_reg_work_list state.simplify_work_list, @@ -605,7 +605,7 @@ let[@inline] invariant state = (reg_set_of_reg_work_list state.spill_work_list)) in let work_lists_or_precolored = - Reg.Set.union (Reg.set_of_array all_precolored_regs) work_lists + Reg.Set.union (Reg.set_of_array (all_precolored_regs ())) work_lists in Reg.Set.iter (fun u -> diff --git a/backend/regalloc/regalloc_irc_utils.ml b/backend/regalloc/regalloc_irc_utils.ml index 695b8adbb5a..eadd4d95f84 100644 --- a/backend/regalloc/regalloc_irc_utils.ml +++ b/backend/regalloc/regalloc_irc_utils.ml @@ -141,9 +141,9 @@ let is_move_basic : Cfg.basic -> bool = let is_move_instruction : Cfg.basic Cfg.instruction -> bool = fun instr -> is_move_basic instr.desc -let all_precolored_regs : Reg.t array = +let all_precolored_regs : unit -> Reg.t array = Proc.init (); - Proc.precolored_regs () + Proc.precolored_regs let k reg = Proc.num_available_registers.(Proc.register_class reg) diff --git a/backend/regalloc/regalloc_irc_utils.mli b/backend/regalloc/regalloc_irc_utils.mli index a2123413f85..81a3c5f9d59 100644 --- a/backend/regalloc/regalloc_irc_utils.mli +++ b/backend/regalloc/regalloc_irc_utils.mli @@ -64,7 +64,7 @@ end val is_move_instruction : Instruction.t -> bool -val all_precolored_regs : Reg.t array +val all_precolored_regs : unit -> Reg.t array val k : Reg.t -> int diff --git a/backend/regalloc/regalloc_ls.ml b/backend/regalloc/regalloc_ls.ml index 7c65e41bb88..7644bb4dce1 100644 --- a/backend/regalloc/regalloc_ls.ml +++ b/backend/regalloc/regalloc_ls.ml @@ -75,7 +75,7 @@ let build_intervals : State.t -> Cfg_with_infos.t -> unit = let off = on + 1 in if trap_handler then - Array.iter Proc.destroyed_at_raise ~f:(fun reg -> + Array.iter (Proc.destroyed_at_raise ()) ~f:(fun reg -> update_range reg ~begin_:on ~end_:on); instr.ls_order <- on; Array.iter instr.arg ~f:(fun reg -> update_range reg ~begin_:on ~end_:on); diff --git a/backend/regalloc/regalloc_validate.ml b/backend/regalloc/regalloc_validate.ml index c661cbfc5f8..bfd96eb3f9c 100644 --- a/backend/regalloc/regalloc_validate.ml +++ b/backend/regalloc/regalloc_validate.ml @@ -1127,7 +1127,7 @@ module Transfer (Desc_val : Description_value) : equations |> Equation_set.verify_destroyed_locations ~destroyed: - (Location.of_regs_exn Proc.destroyed_at_raise) + (Location.of_regs_exn (Proc.destroyed_at_raise ())) |> Result.map_error (fun message -> Printf.sprintf "While verifying locations destroyed at raise: %s" diff --git a/tests/simd/dune b/tests/simd/dune index e9b9d996c74..142f04bf0db 100644 --- a/tests/simd/dune +++ b/tests/simd/dune @@ -2,7 +2,7 @@ (name simd) (modules simd) (foreign_stubs (language c) (names stubs) (flags -msse4.2)) - (ocamlopt_flags (:standard))) + (ocamlopt_flags (:standard -fsimd))) (rule (enabled_if From cc2ce097bbb15e65a4368ced752d93fb6b31f241 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Fri, 7 Jul 2023 16:11:32 -0400 Subject: [PATCH 61/81] fmt --- backend/regalloc/regalloc_irc.ml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/regalloc/regalloc_irc.ml b/backend/regalloc/regalloc_irc.ml index 8db6e297b37..82f33751600 100644 --- a/backend/regalloc/regalloc_irc.ml +++ b/backend/regalloc/regalloc_irc.ml @@ -89,8 +89,9 @@ let build : State.t -> Cfg_with_infos.t -> unit = let live = Cfg_dataflow.Instr.Tbl.find liveness first_id in Reg.Set.iter (fun reg1 -> - Array.iter (filter_fp (Proc.destroyed_at_raise ())) ~f:(fun reg2 -> - State.add_edge state reg1 reg2)) + Array.iter + (filter_fp (Proc.destroyed_at_raise ())) + ~f:(fun reg2 -> State.add_edge state reg1 reg2)) (Reg.Set.remove Proc.loc_exn_bucket live.before)) let make_work_list : State.t -> unit = From c6b5096158c0bf4f2d6563d0f1675e90dc4aa55e Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Fri, 7 Jul 2023 16:18:00 -0400 Subject: [PATCH 62/81] unecessary check --- backend/amd64/proc.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 6743d9d4a25..63302775282 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -624,7 +624,7 @@ let frame_required ~fun_contains_calls ~fun_num_stack_slots = fp || fun_contains_calls || fun_num_stack_slots.(0) > 0 || fun_num_stack_slots.(1) > 0 || - (!simd_regalloc_support && fun_num_stack_slots.(2) > 0) + fun_num_stack_slots.(2) > 0 let prologue_required ~fun_contains_calls ~fun_num_stack_slots = frame_required ~fun_contains_calls ~fun_num_stack_slots From eec8b62d5b4ed3712a64d5da7cbad879f99ef8bc Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Fri, 7 Jul 2023 16:27:07 -0400 Subject: [PATCH 63/81] add simd to upstream test --- testsuite/tests/unboxed-primitive-args/test.ml | 1 + 1 file changed, 1 insertion(+) diff --git a/testsuite/tests/unboxed-primitive-args/test.ml b/testsuite/tests/unboxed-primitive-args/test.ml index d14ddc5f38e..a7b75037919 100644 --- a/testsuite/tests/unboxed-primitive-args/test.ml +++ b/testsuite/tests/unboxed-primitive-args/test.ml @@ -16,6 +16,7 @@ script = "${cc} -msse4.2 -c test_common.c -I ../../../../../../../../runtime" ***** script script = "${cc} -msse4.2 -c stubs.c -I ../../../../../../../../runtime" ****** ocamlopt.opt +ocamlopt_flags = "-fsimd" all_modules = "test_common.o stubs.o common.mli common.ml main.ml" ******* run ******** check-program-output From 6ef7047fe802f5542db43498f56b110ee214c259 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Fri, 7 Jul 2023 19:03:26 -0400 Subject: [PATCH 64/81] preserve previous stack slot ordering --- backend/amd64/emit.mlp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 08b8048b5ae..50bf2a947ba 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -107,11 +107,12 @@ let slot_offset loc cl = | Local n -> if not !simd_regalloc_support then assert (num_stack_slots.(2) = 0 && cl < 2); (!stack_offset + - match cl with - | 2 -> n * 16 - | 1 -> num_stack_slots.(2) * 16 + n * 8 - | 0 -> num_stack_slots.(2) * 16 + num_stack_slots.(1) * 8 + n * 8 - | _ -> Misc.fatal_error "Unknown register class") + (* Preserves original ordering (int -> float) *) + match cl with + | 2 -> n * 16 + | 0 -> num_stack_slots.(2) * 16 + n * 8 + | 1 -> num_stack_slots.(2) * 16 + num_stack_slots.(0) * 8 + n * 8 + | _ -> Misc.fatal_error "Unknown register class") | Outgoing n -> n | Domainstate _ -> assert false (* not a stack slot *) From ad5f370618835d0f4a1a656c5c643eb8d59934c5 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Mon, 10 Jul 2023 13:21:11 -0400 Subject: [PATCH 65/81] more edits --- backend/amd64/emit.mlp | 12 +-- backend/amd64/proc.ml | 89 +++++++++++-------- backend/arm64/emit.mlp | 6 +- backend/arm64/proc.ml | 26 +++--- backend/cfg/cfg.ml | 4 +- backend/coloring.ml | 6 +- backend/debug/available_regs.ml | 6 +- backend/linscan.ml | 2 +- backend/printmach.ml | 10 +-- backend/printmach.mli | 2 +- backend/proc.mli | 12 +-- backend/regalloc/regalloc_invariants.ml | 32 ++++--- backend/regalloc/regalloc_rewrite.ml | 4 +- backend/regalloc/regalloc_stack_slots.ml | 73 +++++++-------- backend/regalloc/regalloc_stack_slots.mli | 2 +- backend/regalloc/regalloc_utils.ml | 2 +- backend/regalloc/regalloc_validate.ml | 47 ++++------ backend/reloadgen.ml | 2 +- .../check_regalloc_validation.ml | 8 +- 19 files changed, 179 insertions(+), 166 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 50bf2a947ba..28bceccec90 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -286,7 +286,7 @@ let emit_Llabel fallthrough lbl section_name = let x86_data_type_for_stack_slot = function | Float -> REAL8 | Vec128 -> VEC128 - | _ -> QWORD + | Int | Addr | Val -> QWORD let reg = function | { loc = Reg.Reg r } -> register_name r @@ -294,7 +294,7 @@ let reg = function let ofs = n + Domainstate.(idx_of_field Domain_extra_params) * 8 in mem64 (x86_data_type_for_stack_slot ty) ofs R14 | { loc = Stack s; typ = ty } as r -> - let ofs = slot_offset s (stack_slot_class_for r) in + let ofs = slot_offset s (stack_slot_class r.typ) in mem64 (x86_data_type_for_stack_slot ty) ofs RSP | { loc = Unknown } -> assert false @@ -317,7 +317,7 @@ let reg_low_32_name = Array.map (fun r -> Reg32 r) int_reg_name let emit_subreg tbl typ r = match r.loc with | Reg.Reg r when r < 13 -> tbl.(r) - | Stack s -> mem64 typ (slot_offset s (stack_slot_class_for r)) RSP + | Stack s -> mem64 typ (slot_offset s (stack_slot_class r.Reg.typ)) RSP | _ -> assert false let arg8 i n = emit_subreg reg_low_8_name BYTE i.arg.(n) @@ -359,7 +359,7 @@ let record_frame_label live dbg = | {typ = Val; loc = Reg r} -> live_offset := ((r lsl 1) + 1) :: !live_offset | {typ = Val; loc = Stack s} as reg -> - live_offset := slot_offset s (stack_slot_class_for reg) :: !live_offset + live_offset := slot_offset s (stack_slot_class reg.typ) :: !live_offset | {typ = Addr} as r -> Misc.fatal_error ("bad GC root " ^ Reg.name r) | _ -> () @@ -1832,8 +1832,8 @@ let emit_probe_notes0 () = let arg_name = match arg.loc with | Stack s -> - Printf.sprintf "%d(%%rsp)" (slot_offset s (stack_slot_class_for arg)) - | Reg reg -> Proc.register_name reg + Printf.sprintf "%d(%%rsp)" (slot_offset s (stack_slot_class arg.Reg.typ)) + | Reg reg -> Proc.register_name arg.Reg.typ reg | Unknown -> Misc.fatal_errorf "Cannot create probe: illegal argument: %a" Printmach.reg arg diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 63302775282..020721f6958 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -110,8 +110,8 @@ let register_class r = let num_stack_slot_classes = 3 -let stack_slot_class_for reg = - match reg.typ with +let stack_slot_class typ = + match typ with | Val | Addr | Int -> 0 | Float -> 1 | Vec128 -> @@ -133,10 +133,17 @@ let num_available_registers = [| 13; 16 |] let first_available_register = [| 0; 100 |] -let register_name r = - if r < 100 then int_reg_name.(r) - else if r < 200 then float_reg_name.(r - 100) - else Misc.fatal_errorf "Register of unknown class (%d)" r +let register_name ty r = + (* If the ID doesn't match the type, the array access will raise. *) + match ty with + | Int | Addr | Val -> + int_reg_name.(r - first_available_register.(0)) + | Float -> + float_reg_name.(r - first_available_register.(1)) + | Vec128 -> + if not !simd_regalloc_support then + Misc.fatal_error "SIMD register allocation is not enabled."; + float_reg_name.(r - first_available_register.(1)) (* Pack registers starting at %rax so as to reduce the number of REX prefixes and thus improve code density *) @@ -160,15 +167,18 @@ let hard_vec128_reg = v let all_phys_regs = - let basic_regs = Array.append hard_int_reg hard_float_reg in - let simd_regs = Array.append basic_regs hard_vec128_reg in - fun () -> if !simd_regalloc_support then simd_regs else basic_regs + let hard_basic_regs = Array.append hard_int_reg hard_float_reg in + let hard_basic_and_simd_regs = Array.append hard_basic_regs hard_vec128_reg in + fun () -> if !simd_regalloc_support then hard_basic_and_simd_regs else hard_basic_regs let phys_reg ty n = match ty with | Int | Addr | Val -> hard_int_reg.(n) | Float -> hard_float_reg.(n - 100) - | Vec128 -> hard_vec128_reg.(n - 100) + | Vec128 -> + if not !simd_regalloc_support then + Misc.fatal_error "SIMD register allocation is not enabled."; + hard_vec128_reg.(n - 100) let rax = phys_reg Int 0 let rdx = phys_reg Int 4 @@ -226,8 +236,6 @@ let calling_conventions first_int last_int first_float last_float make_stack fir ofs := !ofs + size_float end | Vec128 -> - if not !simd_regalloc_support then - Misc.fatal_error "SIMD register allocation is not enabled."; if !float <= last_float then begin loc.(i) <- phys_reg Vec128 !float; incr float @@ -314,8 +322,6 @@ let win64_loc_external_arguments arg = ofs := !ofs + size_float end | Vec128 -> - if not !simd_regalloc_support then - Misc.fatal_error "SIMD register allocation is not enabled."; if !reg < 4 then begin loc.(i) <- phys_reg Vec128 win64_float_external_arguments.(!reg); incr reg @@ -365,25 +371,27 @@ let destroyed_at_c_call = let basic_regs, simd_regs = match win64 with | true -> - (List.map (phys_reg Int) [0;4;5;6;7;10;11]) @ - (List.map (phys_reg Float) [100;101;102;103;104;105]), - (List.map (phys_reg Vec128) [100;101;102;103;104;105]) + Array.append + (Array.map (phys_reg Int) [|0;4;5;6;7;10;11|]) + (Array.sub hard_float_reg 0 6), + Array.sub hard_vec128_reg 0 6 | false -> (* Unix: rbp, rbx, r12-r15 preserved *) - (List.map (phys_reg Int) [0;2;3;4;5;6;7;10;11]) @ - (List.map (phys_reg Float) [100;101;102;103;104;105;106;107;108;109;110;111;112;113;114;115]), - (List.map (phys_reg Vec128) [100;101;102;103;104;105;106;107;108;109;110;111;112;113;114;115]) + Array.append + (Array.map (phys_reg Int) [|0;2;3;4;5;6;7;10;11|]) + hard_float_reg, + hard_vec128_reg in - let basic_regs, simd_regs = Array.of_list basic_regs, Array.of_list (basic_regs @ simd_regs) in - fun () -> if !simd_regalloc_support then simd_regs else basic_regs + let basic_and_simd_regs = Array.append basic_regs simd_regs in + fun () -> if !simd_regalloc_support then basic_and_simd_regs else basic_regs -let destroyed_at_alloc_or_poll () = +let destroyed_at_alloc_or_poll = if X86_proc.use_plt then destroyed_by_plt_stub else [| r11 |] -let destroyed_at_pushtrap () = +let destroyed_at_pushtrap = [| r11 |] let has_pushtrap traps = @@ -398,12 +406,12 @@ let destroyed_at_oper = function -> [| rax; rdx |] | Iop(Istore(Single, _, _)) -> destroy_xmm15 () - | Iop(Ialloc _ | Ipoll _) -> destroyed_at_alloc_or_poll () + | Iop(Ialloc _ | Ipoll _) -> destroyed_at_alloc_or_poll | Iop(Iintop(Imulh _ | Icomp _) | Iintop_imm((Icomp _), _)) -> [| rax |] | Iswitch(_, _) -> [| rax; rdx |] - | Itrywith _ -> destroyed_at_pushtrap () - | Iexit (_, traps) when has_pushtrap traps -> destroyed_at_pushtrap () + | Itrywith _ -> destroyed_at_pushtrap + | Iexit (_, traps) when has_pushtrap traps -> destroyed_at_pushtrap | Ireturn traps when has_pushtrap traps -> assert false | Iop(Ispecific (Irdtsc | Irdpmc)) -> [| rax; rdx |] | Iop(Ispecific(Ilfence | Isfence | Imfence)) -> [||] @@ -444,15 +452,15 @@ let destroyed_at_oper = function let destroyed_at_raise () = all_phys_regs () -let destroyed_at_reloadretaddr () = [| |] +let destroyed_at_reloadretaddr = [| |] (* note: keep this function in sync with `destroyed_at_oper` above. *) let destroyed_at_basic (basic : Cfg_intf.S.basic) = match basic with | Reloadretaddr -> - destroyed_at_reloadretaddr () + destroyed_at_reloadretaddr | Pushtrap _ -> - destroyed_at_pushtrap () + destroyed_at_pushtrap | Op (Intop (Idiv | Imod)) | Op (Intop_imm ((Idiv | Imod), _)) -> [| rax; rdx |] | Op(Store(Single, _, _)) -> @@ -500,7 +508,7 @@ let destroyed_at_terminator (terminator : Cfg_intf.S.terminator) = match terminator with | Never -> assert false | Prim {op = Alloc _; _} -> - destroyed_at_alloc_or_poll () + destroyed_at_alloc_or_poll | Always _ | Parity_test _ | Truth_test _ | Float_test _ | Int_test _ | Return | Raise _ | Tailcall_self _ | Tailcall_func _ | Prim {op = Checkbound _ | Probe _; _} @@ -521,7 +529,7 @@ let destroyed_at_terminator (terminator : Cfg_intf.S.terminator) = | Istore_int (_, _, _) | Ioffset_loc (_, _) | Iprefetch _); _ } -> Misc.fatal_error "no instructions specific for this architecture can raise" - | Poll_and_jump _ -> destroyed_at_alloc_or_poll () + | Poll_and_jump _ -> destroyed_at_alloc_or_poll (* CR-soon xclerc for xclerc: consider having more destruction points. We current return `true` when `destroyed_at_terminator` returns @@ -643,12 +651,17 @@ let init () = (* This is not always the same as [all_phys_regs], as some physical registers may not be allocatable (e.g. rbp when frame pointers are enabled). *) let precolored_regs = - let ints = Array.sub hard_int_reg 0 num_available_registers.(0) in - let floats = Array.sub hard_float_reg 0 num_available_registers.(1) in - let vec128s = Array.sub hard_vec128_reg 0 num_available_registers.(1) in - let basic_regs = Array.append ints floats in - let simd_regs = Array.append basic_regs vec128s in - fun () -> if !simd_regalloc_support then simd_regs else basic_regs + let ints_no_fp = Array.sub hard_int_reg 0 12 in + let basic_regs = Array.append hard_int_reg hard_float_reg in + let basic_regs_no_fp = Array.append ints_no_fp hard_float_reg in + let basic_and_simd_regs = Array.append basic_regs hard_vec128_reg in + let basic_and_simd_regs_no_fp = Array.append basic_regs_no_fp hard_vec128_reg in + fun () -> + match fp, !simd_regalloc_support with + | false, false -> basic_regs + | true, false -> basic_regs_no_fp + | false, true -> basic_and_simd_regs + | true, true -> basic_and_simd_regs_no_fp let operation_supported = function | Cpopcnt -> !popcnt_support diff --git a/backend/arm64/emit.mlp b/backend/arm64/emit.mlp index 2866692f842..22711e03c1d 100644 --- a/backend/arm64/emit.mlp +++ b/backend/arm64/emit.mlp @@ -71,7 +71,7 @@ let emit_symbol_size sym = (* Output a pseudo-register *) let emit_reg = function - {loc = Reg r} -> emit_string (register_name r) + {loc = Reg r; typ} -> emit_string (register_name typ r) | _ -> fatal_error "Emit.emit_reg" (* Likewise, but with the 32-bit name of the register *) @@ -130,7 +130,7 @@ let emit_stack r = let ofs = n + Domainstate.(idx_of_field Domain_extra_params) * 8 in `[{emit_reg reg_domain_state_ptr}, #{emit_int ofs}]` | Stack s -> - let ofs = slot_offset s (stack_slot_class_for r) in + let ofs = slot_offset s (stack_slot_class r.typ) in `[sp, #{emit_int ofs}]` | _ -> fatal_error "Emit.emit_stack" @@ -160,7 +160,7 @@ let record_frame_label live dbg = | {typ = Val; loc = Reg r} -> live_offset := ((r lsl 1) + 1) :: !live_offset | {typ = Val; loc = Stack s} as reg -> - live_offset := slot_offset s (stack_slot_class_for reg) :: !live_offset + live_offset := slot_offset s (stack_slot_class reg.typ) :: !live_offset | {typ = Addr} as r -> Misc.fatal_error ("bad GC root " ^ Reg.name r) | _ -> ()) diff --git a/backend/arm64/proc.ml b/backend/arm64/proc.ml index 19cbecfe3ef..ce090ba538a 100644 --- a/backend/arm64/proc.ml +++ b/backend/arm64/proc.ml @@ -71,8 +71,8 @@ let register_class r = let num_stack_slot_classes = 2 -let stack_slot_class_for r = - match r.typ with +let stack_slot_class typ = + match typ with | Val | Int | Addr -> 0 | Float -> 1 (* CR mslater: (SIMD) arm64 *) @@ -90,8 +90,14 @@ let num_available_registers = let first_available_register = [| 0; 100 |] -let register_name r = - if r < 100 then int_reg_name.(r) else float_reg_name.(r - 100) +let register_name ty r = + match ty with + | Val | Int | Addr -> + int_reg_name.(r - first_available_register.(0)) + | Float -> + float_reg_name.(r - first_available_register.(1)) + (* CR mslater: (SIMD) arm64 *) + | Vec128 -> fatal_error "arm64: got vec128 register" let rotate_registers = true @@ -317,19 +323,19 @@ let destroyed_at_oper = function let destroyed_at_raise () = all_phys_regs -let destroyed_at_reloadretaddr () = [| |] +let destroyed_at_reloadretaddr = [| |] -let destroyed_at_pushtrap () = [| |] +let destroyed_at_pushtrap = [| |] -let destroyed_at_alloc_or_poll () = [| reg_x8 |] +let destroyed_at_alloc_or_poll = [| reg_x8 |] (* note: keep this function in sync with `destroyed_at_oper` above. *) let destroyed_at_basic (basic : Cfg_intf.S.basic) = match basic with | Reloadretaddr -> - destroyed_at_reloadretaddr () + destroyed_at_reloadretaddr | Pushtrap _ -> - destroyed_at_pushtrap () + destroyed_at_pushtrap | Op (Intop Icheckbound | Intop_imm (Icheckbound, _)) -> assert false | Op( Intoffloat | Floatofint @@ -355,7 +361,7 @@ let destroyed_at_terminator (terminator : Cfg_intf.S.terminator) = | Call_no_return { func_symbol = _; alloc; ty_res = _; ty_args = _; } | Prim {op = External { func_symbol = _; alloc; ty_res = _; ty_args = _; }; _} -> if alloc then all_phys_regs else destroyed_at_c_call - | Poll_and_jump _ -> destroyed_at_alloc_or_poll () + | Poll_and_jump _ -> destroyed_at_alloc_or_poll (* CR-soon xclerc for xclerc: consider having more destruction points. We current return `true` when `destroyed_at_terminator` returns diff --git a/backend/cfg/cfg.ml b/backend/cfg/cfg.ml index ebaae9df289..2683a18a0f6 100644 --- a/backend/cfg/cfg.ml +++ b/backend/cfg/cfg.ml @@ -509,8 +509,8 @@ let is_noop_move instr = && Proc.register_class instr.arg.(0) = Proc.register_class instr.res.(0) | Stack _ -> Reg.same_loc instr.arg.(0) instr.res.(0) - && Proc.stack_slot_class_for instr.arg.(0) - = Proc.stack_slot_class_for instr.res.(0)) + && Proc.stack_slot_class instr.arg.(0).typ + = Proc.stack_slot_class instr.res.(0).typ) | Op (Csel _) -> ( match instr.res.(0).loc with | Unknown -> false diff --git a/backend/coloring.ml b/backend/coloring.ml index b22cf4521d1..46f55697efb 100644 --- a/backend/coloring.ml +++ b/backend/coloring.ml @@ -50,7 +50,7 @@ let allocate_registers() = Split the remaining registers into constrained and unconstrained. *) let remove_reg reg = let cl = Proc.register_class reg in - let stack_cl = Proc.stack_slot_class_for reg in + let stack_cl = Proc.stack_slot_class reg.typ in if reg.spill then begin (* Preallocate the registers in the stack *) let nslots = num_stack_slots.(stack_cl) in @@ -59,7 +59,7 @@ let allocate_registers() = (fun r -> match r.loc with Stack(Local n) -> - if Proc.stack_slot_class_for r = stack_cl then conflict.(n) <- true + if Proc.stack_slot_class r.typ = stack_cl then conflict.(n) <- true | _ -> ()) reg.interf; let slot = ref 0 in @@ -91,7 +91,7 @@ let allocate_registers() = (* Assign a location to a register, the best we can. *) let assign_location reg = let cl = Proc.register_class reg in - let stack_cl = Proc.stack_slot_class_for reg in + let stack_cl = Proc.stack_slot_class reg.typ in let first_reg = Proc.first_available_register.(cl) in let num_regs = Proc.num_available_registers.(cl) in let score = Array.make num_regs 0 in diff --git a/backend/debug/available_regs.ml b/backend/debug/available_regs.ml index 623571ae30b..7ea2d378849 100644 --- a/backend/debug/available_regs.ml +++ b/backend/debug/available_regs.ml @@ -184,7 +184,7 @@ let rec available_regs (instr : M.instruction) ~(avail_before : RAS.t) : RAS.t = else RD.Set.made_unavailable_by_clobber avail_before ~regs_clobbered:instr.res ~register_class:Proc.register_class - ~stack_class:Proc.stack_slot_class_for + ~stack_class:(fun r -> Proc.stack_slot_class r.typ) in let results = Array.map2 @@ -210,8 +210,8 @@ let rec available_regs (instr : M.instruction) ~(avail_before : RAS.t) : RAS.t = Array.append (Proc.destroyed_at_oper instr.desc) instr.res in RD.Set.made_unavailable_by_clobber avail_before ~regs_clobbered - ~register_class:Proc.register_class - ~stack_class:Proc.stack_slot_class_for + ~register_class:Proc.register_class ~stack_class:(fun r -> + Proc.stack_slot_class r.typ) in (* Second: the cases of (a) allocations and (b) OCaml to OCaml function calls. In these cases, since the GC may run, registers always become diff --git a/backend/linscan.ml b/backend/linscan.ml index 7334d919d4d..802779f4298 100644 --- a/backend/linscan.ml +++ b/backend/linscan.ml @@ -72,7 +72,7 @@ let rec release_expired_inactive ci pos = function (* Allocate a new stack slot to the interval. *) let allocate_stack_slot num_stack_slots i = - let cl = Proc.stack_slot_class_for i.reg in + let cl = Proc.stack_slot_class i.reg.typ in let ss = num_stack_slots.(cl) in num_stack_slots.(cl) <- succ ss; i.reg.loc <- Stack(Local ss); diff --git a/backend/printmach.ml b/backend/printmach.ml index e6b85e6d088..e7306848c7a 100644 --- a/backend/printmach.ml +++ b/backend/printmach.ml @@ -23,14 +23,14 @@ open Interval module V = Backend_var -let loc ?(wrap_out = fun ppf f -> f ppf) ~ss_class ~unknown ppf l = - match l with +let loc ?(wrap_out = fun ppf f -> f ppf) ~unknown ppf loc typ = + match loc with | Unknown -> unknown ppf | Reg r -> - wrap_out ppf (fun ppf -> fprintf ppf "%s" (Proc.register_name r)) + wrap_out ppf (fun ppf -> fprintf ppf "%s" (Proc.register_name typ r)) | Stack(Local s) -> wrap_out ppf (fun ppf -> - fprintf ppf "s[%s:%i]" (Proc.stack_class_tag ss_class) s) + fprintf ppf "s[%s:%i]" (Proc.stack_class_tag (Proc.stack_slot_class typ)) s) | Stack(Incoming s) -> wrap_out ppf (fun ppf -> fprintf ppf "par[%i]" s) | Stack(Outgoing s) -> @@ -52,7 +52,7 @@ let reg ppf r = fprintf ppf "/%i" r.stamp; loc ~wrap_out:(fun ppf f -> fprintf ppf "[%t]" f) - ~ss_class:(Proc.stack_slot_class_for r) ~unknown:(fun _ -> ()) ppf r.loc + ~unknown:(fun _ -> ()) ppf r.loc r.typ let regs' ?(print_reg = reg) ppf v = let reg = print_reg in diff --git a/backend/printmach.mli b/backend/printmach.mli index 0530978acef..c4086611157 100644 --- a/backend/printmach.mli +++ b/backend/printmach.mli @@ -17,7 +17,7 @@ open Format -val loc: ?wrap_out:(formatter -> (formatter -> unit) -> unit) -> ss_class:int -> unknown:(formatter -> unit) -> formatter -> Reg.location -> unit +val loc: ?wrap_out:(formatter -> (formatter -> unit) -> unit) -> unknown:(formatter -> unit) -> formatter -> Reg.location -> Cmm.machtype_component -> unit val reg: formatter -> Reg.t -> unit val regs': ?print_reg:(formatter -> Reg.t -> unit) -> formatter -> Reg.t array -> unit val regs: formatter -> Reg.t array -> unit diff --git a/backend/proc.mli b/backend/proc.mli index 56b0a894a69..f4e7f9c2b5b 100644 --- a/backend/proc.mli +++ b/backend/proc.mli @@ -23,16 +23,16 @@ val num_register_classes: int val register_class: Reg.t -> int val num_available_registers: int array val first_available_register: int array -val register_name: int -> string +val register_name: Cmm.machtype_component -> int -> string val phys_reg: Cmm.machtype_component -> int -> Reg.t val rotate_registers: bool val precolored_regs : unit -> Reg.t array (* The number of stack slot classes may differ from the number of register classes. -On x86, we use the same class for floating point and SIMD vector registers, -but they take up different amounts of space on the stack. *) + On x86, we use the same class for floating point and SIMD vector registers, + but they take up different amounts of space on the stack. *) val num_stack_slot_classes: int -val stack_slot_class_for: Reg.t -> int +val stack_slot_class: Cmm.machtype_component -> int val stack_class_tag: int -> string (* Calling conventions *) @@ -62,8 +62,8 @@ val max_register_pressure: Mach.operation -> int array (* Registers destroyed by operations *) val destroyed_at_oper: Mach.instruction_desc -> Reg.t array val destroyed_at_raise: unit -> Reg.t array -val destroyed_at_reloadretaddr : unit -> Reg.t array -val destroyed_at_pushtrap : unit -> Reg.t array +val destroyed_at_reloadretaddr : Reg.t array +val destroyed_at_pushtrap : Reg.t array val destroyed_at_basic : Cfg_intf.S.basic -> Reg.t array val destroyed_at_terminator : Cfg_intf.S.terminator -> Reg.t array val is_destruction_point : Cfg_intf.S.terminator -> bool diff --git a/backend/regalloc/regalloc_invariants.ml b/backend/regalloc/regalloc_invariants.ml index 62e8a2c201d..928a9ff6e0c 100644 --- a/backend/regalloc/regalloc_invariants.ml +++ b/backend/regalloc/regalloc_invariants.ml @@ -101,9 +101,9 @@ let precondition : Cfg_with_layout.t -> unit = let fun_num_stack_slots = (Cfg_with_layout.cfg cfg_with_layout).fun_num_stack_slots in - Array.iteri fun_num_stack_slots ~f:(fun ss_class num_slots -> + Array.iteri fun_num_stack_slots ~f:(fun stack_class num_slots -> if num_slots <> 0 - then fatal "stack slot class %d has %d slots(s)" ss_class num_slots) + then fatal "stack slot class %d has %d slots(s)" stack_class num_slots) let postcondition_layout : Cfg_with_layout.t -> unit = fun cfg_with_layout -> @@ -148,11 +148,11 @@ let postcondition_layout : Cfg_with_layout.t -> unit = match reg.Reg.loc with | Reg phys_reg -> let phys_reg = Proc.phys_reg reg.typ phys_reg in - if not (same_stack_class reg phys_reg) + if not (same_stack_class reg phys_reg && same_reg_class reg phys_reg) then fatal - "instruction %d assigned %a to %a but they are in different stack \ - slot classes" + "instruction %d assigned %a to %a but they are in different register \ + or stack slot classes" id Printmach.reg reg Printmach.reg phys_reg | Stack _ | Unknown -> () in @@ -171,9 +171,9 @@ let postcondition_layout : Cfg_with_layout.t -> unit = | Stack stack_loc -> ( match stack_loc with | Local index -> - let ss_class = Proc.stack_slot_class_for reg in - used_stack_slots.(ss_class) - <- Int.Set.add index used_stack_slots.(ss_class) + let stack_class = Proc.stack_slot_class reg.typ in + used_stack_slots.(stack_class) + <- Int.Set.add index used_stack_slots.(stack_class) | Incoming _ -> () | Outgoing _ -> () | Domainstate _ -> ()) @@ -205,7 +205,7 @@ let postcondition_layout : Cfg_with_layout.t -> unit = let fun_num_stack_slots = (Cfg_with_layout.cfg cfg_with_layout).fun_num_stack_slots in - Array.iteri fun_num_stack_slots ~f:(fun ss_class num_slots -> + Array.iteri fun_num_stack_slots ~f:(fun stack_class num_slots -> let available_slots = Seq.ints 0 |> Seq.take num_slots |> Int.Set.of_seq in @@ -213,16 +213,20 @@ let postcondition_layout : Cfg_with_layout.t -> unit = set |> Int.Set.elements |> List.map ~f:string_of_int |> String.concat ", " in - let invalid = Int.Set.diff used_stack_slots.(ss_class) available_slots in + let invalid = + Int.Set.diff used_stack_slots.(stack_class) available_slots + in if not (Int.Set.is_empty invalid) then fatal "stack slot class %d uses the following invalid slots: %s" - ss_class (string_of_set invalid); - let unused = Int.Set.diff available_slots used_stack_slots.(ss_class) in + stack_class (string_of_set invalid); + let unused = + Int.Set.diff available_slots used_stack_slots.(stack_class) + in if not (Int.Set.is_empty unused) then - fatal "stack slot class %d has the following unused slots: %s" ss_class - (string_of_set unused)) + fatal "stack slot class %d has the following unused slots: %s" + stack_class (string_of_set unused)) let postcondition_liveness : Cfg_with_infos.t -> unit = fun cfg_with_infos -> diff --git a/backend/regalloc/regalloc_rewrite.ml b/backend/regalloc/regalloc_rewrite.ml index e806716b820..faba4a955e2 100644 --- a/backend/regalloc/regalloc_rewrite.ml +++ b/backend/regalloc/regalloc_rewrite.ml @@ -263,8 +263,8 @@ let postlude : if Utils.debug then Array.iteri (Cfg_with_layout.cfg cfg_with_layout).fun_num_stack_slots - ~f:(fun ss_class num_stack_slots -> - Utils.log ~indent:1 "stack_slots[%d]=%d" ss_class num_stack_slots); + ~f:(fun stack_class num_stack_slots -> + Utils.log ~indent:1 "stack_slots[%d]=%d" stack_class num_stack_slots); remove_prologue_if_not_required cfg_with_layout; update_live_fields cfg_with_layout (Cfg_with_infos.liveness cfg_with_infos); f (); diff --git a/backend/regalloc/regalloc_stack_slots.ml b/backend/regalloc/regalloc_stack_slots.ml index 22aeeb19782..eacf06ef116 100644 --- a/backend/regalloc/regalloc_stack_slots.ml +++ b/backend/regalloc/regalloc_stack_slots.ml @@ -17,7 +17,7 @@ let[@inline] make () = let num_stack_slots = Array.make Proc.num_stack_slot_classes 0 in { stack_slots; num_stack_slots } -let[@inline] size_for_all_ss_classes t = +let[@inline] size_for_all_stack_classes t = Array.fold_left t.num_stack_slots ~f:( + ) ~init:0 let[@inline] get_and_incr t ~stack_class = @@ -29,7 +29,7 @@ let[@inline] get_or_create t reg = match Reg.Tbl.find_opt t.stack_slots reg with | Some slot -> slot | None -> - let res = get_and_incr t ~stack_class:(Proc.stack_slot_class_for reg) in + let res = get_and_incr t ~stack_class:(Proc.stack_slot_class reg.Reg.typ) in Reg.Tbl.replace t.stack_slots reg res; res @@ -47,8 +47,8 @@ let[@inline] update_cfg_with_layout t cfg_with_layout = let fun_num_stack_slots = (Cfg_with_layout.cfg cfg_with_layout).fun_num_stack_slots in - for ss_class = 0 to pred Proc.num_stack_slot_classes do - fun_num_stack_slots.(ss_class) <- t.num_stack_slots.(ss_class) + for stack_class = 0 to pred Proc.num_stack_slot_classes do + fun_num_stack_slots.(stack_class) <- t.num_stack_slots.(stack_class) done (** The optimization below is conceptually fairly close to what linscan does: @@ -148,14 +148,14 @@ with type slots := t = struct type t = Interval.t array array let make slots = - Array.init Proc.num_stack_slot_classes ~f:(fun ss_class -> - Array.init slots.num_stack_slots.(ss_class) ~f:(fun _ -> + Array.init Proc.num_stack_slot_classes ~f:(fun stack_class -> + Array.init slots.num_stack_slots.(stack_class) ~f:(fun _ -> { Interval.start = Point.dummy; end_ = Point.dummy })) let visit_reg (t : t) (point : Point.t) (reg : Reg.t) : unit = apply_reg_stack_local reg ~f:(fun slot_index -> - let ss_class = Proc.stack_slot_class_for reg in - let interval = t.(ss_class).(slot_index) in + let stack_class = Proc.stack_slot_class reg.typ in + let interval = t.(stack_class).(slot_index) in if interval.start == Point.dummy then interval.start <- point; interval.end_ <- point) @@ -194,10 +194,10 @@ with type slots := t = struct intervals let print ppf t = - Array.iteri t ~f:(fun ss_class intervals -> + Array.iteri t ~f:(fun stack_class intervals -> Array.iteri intervals ~f:(fun slot_index interval -> - Format.fprintf ppf "ss_class=%d slot_index=%d -> %a\n" ss_class - slot_index Interval.print interval)) + Format.fprintf ppf "stack_class=%d slot_index=%d -> %a\n" + stack_class slot_index Interval.print interval)) end module Int = Numbers.Int @@ -211,7 +211,7 @@ module Buckets : sig val contains_empty : t -> bool - val find_bucket : t -> ss_class:int -> slot_index:slot -> int option + val find_bucket : t -> stack_class:int -> slot_index:slot -> int option val print : Format.formatter -> t -> unit end @@ -232,13 +232,13 @@ with type slots := t = struct let build_from_intervals slots intervals = let buckets = - Array.init Proc.num_stack_slot_classes ~f:(fun ss_class -> - let num_slots = slots.num_stack_slots.(ss_class) in + Array.init Proc.num_stack_slot_classes ~f:(fun stack_class -> + let num_slots = slots.num_stack_slots.(stack_class) in Array.init num_slots ~f:(fun _ -> Int.Tbl.create num_slots)) in - Array.iteri intervals ~f:(fun ss_class intervals -> + Array.iteri intervals ~f:(fun stack_class intervals -> Array.iteri intervals ~f:(fun slot_index interval -> - let buckets = buckets.(ss_class) in + let buckets = buckets.(stack_class) in let bucket_index = ref 0 in while !bucket_index < Array.length buckets @@ -259,8 +259,8 @@ with type slots := t = struct let last_bucket = buckets.(len - 1) in Int.Tbl.length last_bucket = 0) - let find_bucket t ~ss_class ~slot_index = - let buckets = t.(ss_class) in + let find_bucket t ~stack_class ~slot_index = + let buckets = t.(stack_class) in let len = Array.length buckets in let bucket_index = ref 0 in while @@ -272,9 +272,9 @@ with type slots := t = struct if !bucket_index < len then Some !bucket_index else None let print ppf t = - Array.iteri t ~f:(fun ss_class buckets -> + Array.iteri t ~f:(fun stack_class buckets -> Array.iteri buckets ~f:(fun bucket_index bucket -> - Format.fprintf ppf "ss_class=%d bucket_index=%d\n" ss_class + Format.fprintf ppf "stack_class=%d bucket_index=%d\n" stack_class bucket_index; Int.Tbl.iter (fun slot_index interval -> @@ -284,7 +284,7 @@ with type slots := t = struct end let optimize (t : t) (cfg_with_infos : Cfg_with_infos.t) : unit = - if size_for_all_ss_classes t > 0 + if size_for_all_stack_classes t > 0 then ( (* First, compute the intervals for all stack slots *) let intervals = Intervals.build_from_cfg t cfg_with_infos in @@ -302,33 +302,36 @@ let optimize (t : t) (cfg_with_infos : Cfg_with_infos.t) : unit = let max_bucket_indices = Array.make Proc.num_stack_slot_classes (-1) in List.iter (Reg.all_registers ()) ~f:(fun (reg : Reg.t) -> apply_reg_stack_local reg ~f:(fun slot_index -> - let ss_class = Proc.stack_slot_class_for reg in - match Buckets.find_bucket buckets ~ss_class ~slot_index with + let stack_class = Proc.stack_slot_class reg.typ in + match Buckets.find_bucket buckets ~stack_class ~slot_index with | None -> - fatal "slot %d (ss_class=%d) has in not in any of the buckets" - slot_index ss_class + fatal + "slot %d (stack_class=%d) has in not in any of the buckets" + slot_index stack_class | Some bucket_index -> if debug then Format.eprintf "changing the slot index of %a (class %d): %d ~> %d\n%!" - Printmach.reg reg ss_class slot_index bucket_index; + Printmach.reg reg stack_class slot_index bucket_index; reg.loc <- Stack (Local bucket_index); - max_bucket_indices.(ss_class) - <- Stdlib.Int.max max_bucket_indices.(ss_class) bucket_index; + max_bucket_indices.(stack_class) + <- Stdlib.Int.max + max_bucket_indices.(stack_class) + bucket_index; if Reg.Tbl.mem t.stack_slots reg then Reg.Tbl.replace t.stack_slots reg bucket_index)); - for ss_class = 0 to pred Proc.num_stack_slot_classes do - let old_value = t.num_stack_slots.(ss_class) in - let new_value = succ max_bucket_indices.(ss_class) in + for stack_class = 0 to pred Proc.num_stack_slot_classes do + let old_value = t.num_stack_slots.(stack_class) in + let new_value = succ max_bucket_indices.(stack_class) in if new_value > old_value then fatal "more slots are now used for class %d (before: %d, after: %d)" - ss_class old_value new_value; + stack_class old_value new_value; if debug then - Format.eprintf "ss_class %d has %d fewer slots (%d ~> %d)\n%!" - ss_class (old_value - new_value) old_value new_value; - t.num_stack_slots.(ss_class) <- new_value + Format.eprintf "stack_class %d has %d fewer slots (%d ~> %d)\n%!" + stack_class (old_value - new_value) old_value new_value; + t.num_stack_slots.(stack_class) <- new_value done; Cfg_with_infos.invalidate_liveness cfg_with_infos)) diff --git a/backend/regalloc/regalloc_stack_slots.mli b/backend/regalloc/regalloc_stack_slots.mli index eb3855c0aab..b24de06185a 100644 --- a/backend/regalloc/regalloc_stack_slots.mli +++ b/backend/regalloc/regalloc_stack_slots.mli @@ -6,7 +6,7 @@ type t val make : unit -> t -val size_for_all_ss_classes : t -> int +val size_for_all_stack_classes : t -> int val get_and_incr : t -> stack_class:int -> slot diff --git a/backend/regalloc/regalloc_utils.ml b/backend/regalloc/regalloc_utils.ml index 1ad65e0b149..620c29da78a 100644 --- a/backend/regalloc/regalloc_utils.ml +++ b/backend/regalloc/regalloc_utils.ml @@ -254,7 +254,7 @@ let same_reg_class : Reg.t -> Reg.t -> bool = let same_stack_class : Reg.t -> Reg.t -> bool = fun reg1 reg2 -> - Int.equal (Proc.stack_slot_class_for reg1) (Proc.stack_slot_class_for reg2) + Int.equal (Proc.stack_slot_class reg1.typ) (Proc.stack_slot_class reg2.typ) let make_temporary : same_class_and_base_name_as:Reg.t -> name_prefix:string -> Reg.t = diff --git a/backend/regalloc/regalloc_validate.ml b/backend/regalloc/regalloc_validate.ml index bfd96eb3f9c..a458da5d6cd 100644 --- a/backend/regalloc/regalloc_validate.ml +++ b/backend/regalloc/regalloc_validate.ml @@ -35,16 +35,13 @@ module Location : sig end = struct module Stack = struct (** This type is based on [Reg.stack_location]. The first difference is that - for [Stack (Local index)] this types additionally stores [ss_class] + for [Stack (Local index)] this types additionally stores [stack_class] because local stacks are separate for different stack slot classes. Secondly for all stacks it stores index in words and not byte offset. That gives the guarantee that if indices are different then the locations do not overlap. *) type t = - | Local of - { index : int; - ss_class : int - } + | Local of { index : int } | Incoming of { index : int } | Outgoing of { index : int } | Domainstate of { index : int } @@ -84,9 +81,9 @@ end = struct let word_index_to_byte_offset index = index * word_size - let of_stack_loc ~ss_class loc = + let of_stack_loc loc = match loc with - | Reg.Local index -> Local { index; ss_class } + | Reg.Local index -> Local { index } | Reg.Incoming offset -> Incoming { index = byte_offset_to_word_index offset } | Reg.Outgoing offset -> @@ -101,44 +98,35 @@ end = struct | Outgoing { index } -> Reg.Outgoing (word_index_to_byte_offset index) | Domainstate { index } -> Reg.Domainstate (word_index_to_byte_offset index) - - let unknown_ss_class = -1 - - let ss_class_lossy t = - match t with - | Local { ss_class; _ } -> ss_class - | Incoming _ | Outgoing _ | Domainstate _ -> unknown_ss_class end - type t = + type location = | Reg of int | Stack of Stack.t - let of_reg reg = + type t = + { typ : Cmm.machtype_component; + loc : location + } + + let of_reg reg : t option = match reg.Reg.loc with | Reg.Unknown -> None - | Reg.Reg idx -> Some (Reg idx) + | Reg.Reg idx -> Some { typ = reg.Reg.typ; loc = Reg idx } | Reg.Stack stack -> - Some - (Stack - (Stack.of_stack_loc ~ss_class:(Proc.stack_slot_class_for reg) stack)) + Some { typ = reg.Reg.typ; loc = Stack (Stack.of_stack_loc stack) } let of_reg_exn reg = of_reg reg |> Option.get let of_regs_exn loc_arr = Array.map of_reg_exn loc_arr - let to_loc_lossy t = - match t with + let to_loc_lossy { loc; _ } = + match loc with | Reg idx -> Reg.Reg idx | Stack stack -> Reg.Stack (Stack.to_stack_loc_lossy stack) - let ss_class_lossy t = - match t with Reg _ -> -1 | Stack stack -> Stack.ss_class_lossy stack - let print ppf t = - Printmach.loc ~ss_class:(ss_class_lossy t) - ~unknown:(fun _ -> assert false) - ppf (to_loc_lossy t) + Printmach.loc ~unknown:(fun _ -> assert false) ppf (to_loc_lossy t) t.typ let compare (t1 : t) (t2 : t) : int = (* CR-someday azewierzejew: Implement proper comparison. *) @@ -966,9 +954,8 @@ end let print_reg_as_loc ppf reg = Printmach.loc - ~ss_class:(Proc.stack_slot_class_for reg) ~unknown:(fun ppf -> Format.fprintf ppf "") - ppf reg.Reg.loc + ppf reg.Reg.loc reg.Reg.typ module Domain : Cfg_dataflow.Domain_S with type t = Equation_set.t = struct (** This type corresponds to the set of equations in the dataflow from the diff --git a/backend/reloadgen.ml b/backend/reloadgen.ml index 7d67450fcdd..53cb179c8f1 100644 --- a/backend/reloadgen.ml +++ b/backend/reloadgen.ml @@ -67,7 +67,7 @@ method reload_operation op arg res = begin match arg.(0), res.(0) with {loc = Stack s1}, {loc = Stack s2} -> if s1 = s2 - && Proc.stack_slot_class_for arg.(0) = Proc.stack_slot_class_for res.(0) then + && Proc.stack_slot_class arg.(0).typ = Proc.stack_slot_class res.(0).typ then (* nothing will be emitted later, not necessary to apply constraints *) (arg, res) diff --git a/tests/backend/regalloc_validator/check_regalloc_validation.ml b/tests/backend/regalloc_validator/check_regalloc_validation.ml index 209caaf8a7d..92b65fb0f85 100644 --- a/tests/backend/regalloc_validator/check_regalloc_validation.ml +++ b/tests/backend/regalloc_validator/check_regalloc_validation.ml @@ -120,10 +120,10 @@ module Cfg_desc = struct count. *) let update_stack_slots i = let update_slot (r : Reg.t) = - match r.loc, Proc.stack_slot_class_for r with - | Stack (Local idx), ss_class -> - cfg.fun_num_stack_slots.(ss_class) - <- max cfg.fun_num_stack_slots.(ss_class) (idx + 1) + match r.loc, Proc.stack_slot_class r.typ with + | Stack (Local idx), stack_class -> + cfg.fun_num_stack_slots.(stack_class) + <- max cfg.fun_num_stack_slots.(stack_class) (idx + 1) | _ -> () in Array.iter update_slot i.arg; From 4b059cc38310a10a89d68284e7cba888aceed652 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Mon, 10 Jul 2023 14:51:05 -0400 Subject: [PATCH 66/81] fix regalloc validator stack slot comparison --- backend/amd64/proc.ml | 4 +++ backend/regalloc/regalloc_stack_slots.ml | 3 +- backend/regalloc/regalloc_validate.ml | 35 +++++++++++++++++------- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 020721f6958..6c0d71b28af 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -200,6 +200,10 @@ let num_destroyed_by_plt_stub = Array.length destroyed_by_plt_stub let destroyed_by_plt_stub_set = Reg.set_of_array destroyed_by_plt_stub let stack_slot slot ty = + (match ty with + | Float | Int | Addr | Val -> () + | Vec128 -> if not !simd_regalloc_support then + Misc.fatal_error "SIMD register allocation is not enabled."); Reg.at_location ty (Stack slot) (* Instruction selection *) diff --git a/backend/regalloc/regalloc_stack_slots.ml b/backend/regalloc/regalloc_stack_slots.ml index eacf06ef116..967a41fcd8f 100644 --- a/backend/regalloc/regalloc_stack_slots.ml +++ b/backend/regalloc/regalloc_stack_slots.ml @@ -305,8 +305,7 @@ let optimize (t : t) (cfg_with_infos : Cfg_with_infos.t) : unit = let stack_class = Proc.stack_slot_class reg.typ in match Buckets.find_bucket buckets ~stack_class ~slot_index with | None -> - fatal - "slot %d (stack_class=%d) has in not in any of the buckets" + fatal "slot %d (stack_class=%d) is not in any of the buckets" slot_index stack_class | Some bucket_index -> if debug diff --git a/backend/regalloc/regalloc_validate.ml b/backend/regalloc/regalloc_validate.ml index a458da5d6cd..5f2871c24b5 100644 --- a/backend/regalloc/regalloc_validate.ml +++ b/backend/regalloc/regalloc_validate.ml @@ -34,10 +34,8 @@ module Location : sig module Map : Map.S with type key = t end = struct module Stack = struct - (** This type is based on [Reg.stack_location]. The first difference is that - for [Stack (Local index)] this types additionally stores [stack_class] - because local stacks are separate for different stack slot classes. - Secondly for all stacks it stores index in words and not byte offset. + (** This type is based on [Reg.stack_location]. + For all stacks it stores index in words and not byte offset. That gives the guarantee that if indices are different then the locations do not overlap. *) type t = @@ -93,7 +91,7 @@ end = struct let to_stack_loc_lossy t = match t with - | Local { index; _ } -> Reg.Local index + | Local { index } -> Reg.Local index | Incoming { index } -> Reg.Incoming (word_index_to_byte_offset index) | Outgoing { index } -> Reg.Outgoing (word_index_to_byte_offset index) | Domainstate { index } -> @@ -129,8 +127,22 @@ end = struct Printmach.loc ~unknown:(fun _ -> assert false) ppf (to_loc_lossy t) t.typ let compare (t1 : t) (t2 : t) : int = - (* CR-someday azewierzejew: Implement proper comparison. *) - Stdlib.compare t1 t2 + match t1.loc, t2.loc with + (* Reg < Stack *) + | Reg _, Stack _ -> -1 + | Stack _, Reg _ -> 1 + | Reg r1, Reg r2 -> + (* Compare register index only. Indices never overlap between classes *) + Int.compare r1 r2 + | Stack s1, Stack s2 -> + (* Compare stack slot class and then slot index. Indices do overlap + between classes. *) + let stack_class_cmp = + Int.compare + (Proc.stack_slot_class t1.typ) + (Proc.stack_slot_class t2.typ) + in + if stack_class_cmp = 0 then Stdlib.compare s1 s2 else stack_class_cmp let equal (t1 : t) (t2 : t) : bool = compare t1 t2 = 0 @@ -861,11 +873,14 @@ end = struct then ( Format.fprintf Format.str_formatter "Unsatisfiable equations when removing result equations.\n\ - Existing equation has to agree one 0 or 2 sides (cannot on exactly \ + Existing equation has to agree on 0 or 2 sides (cannot be exactly \ 1) with the removed equation.\n\ + (%s, %s)\n\ Existing equation %a.\n\ - Removed equation: %a." Equation.print (eq_reg, eq_loc) Equation.print - (reg, loc); + Removed equation: %a." + (if reg_eq then "matches" else "differs") + (if loc_eq then "matches" else "differs") + Equation.print (eq_reg, eq_loc) Equation.print (reg, loc); let message = Format.flush_str_formatter () in raise (Verification_failed message)) in From f393f5bf3f2ad3d140a29cdc46850a2382ee970a Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Mon, 10 Jul 2023 15:30:01 -0400 Subject: [PATCH 67/81] more robust fix --- backend/amd64/proc.ml | 5 ++ backend/arm64/proc.ml | 5 ++ backend/proc.mli | 1 + backend/regalloc/regalloc_validate.ml | 75 +++++++++---------- .../check_regalloc_validation.ml | 2 +- 5 files changed, 47 insertions(+), 41 deletions(-) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 6c0d71b28af..67ef690daad 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -145,6 +145,11 @@ let register_name ty r = Misc.fatal_error "SIMD register allocation is not enabled."; float_reg_name.(r - first_available_register.(1)) +let register_name_lossy idx = + if idx < 100 then int_reg_name.(idx) + else if idx < 200 then float_reg_name.(idx - 100) + else Misc.fatal_errorf "Unknown register ID %d" idx + (* Pack registers starting at %rax so as to reduce the number of REX prefixes and thus improve code density *) let rotate_registers = false diff --git a/backend/arm64/proc.ml b/backend/arm64/proc.ml index ce090ba538a..da916768596 100644 --- a/backend/arm64/proc.ml +++ b/backend/arm64/proc.ml @@ -99,6 +99,11 @@ let register_name ty r = (* CR mslater: (SIMD) arm64 *) | Vec128 -> fatal_error "arm64: got vec128 register" +let register_name_lossy idx = + if idx < 100 then int_reg_name.(idx) + else if idx < 200 then float_reg_name.(idx - 100) + else Misc.fatal_errorf "Unknown register ID %d" idx + let rotate_registers = true let class_of reg = diff --git a/backend/proc.mli b/backend/proc.mli index f4e7f9c2b5b..dd000050fdb 100644 --- a/backend/proc.mli +++ b/backend/proc.mli @@ -24,6 +24,7 @@ val register_class: Reg.t -> int val num_available_registers: int array val first_available_register: int array val register_name: Cmm.machtype_component -> int -> string +val register_name_lossy: int -> string val phys_reg: Cmm.machtype_component -> int -> Reg.t val rotate_registers: bool val precolored_regs : unit -> Reg.t array diff --git a/backend/regalloc/regalloc_validate.ml b/backend/regalloc/regalloc_validate.ml index 5f2871c24b5..23df8ddec1d 100644 --- a/backend/regalloc/regalloc_validate.ml +++ b/backend/regalloc/regalloc_validate.ml @@ -34,12 +34,17 @@ module Location : sig module Map : Map.S with type key = t end = struct module Stack = struct - (** This type is based on [Reg.stack_location]. - For all stacks it stores index in words and not byte offset. + (** This type is based on [Reg.stack_location]. The first difference is that + for [Stack (Local index)] this types additionally stores [stack_class] + because local stacks are separate for different stack slot classes. + Secondly for all stacks it stores index in words and not byte offset. That gives the guarantee that if indices are different then the locations do not overlap. *) type t = - | Local of { index : int } + | Local of + { index : int; + stack_class : int + } | Incoming of { index : int } | Outgoing of { index : int } | Domainstate of { index : int } @@ -79,9 +84,9 @@ end = struct let word_index_to_byte_offset index = index * word_size - let of_stack_loc loc = + let of_stack_loc ~stack_class loc = match loc with - | Reg.Local index -> Local { index } + | Reg.Local index -> Local { index; stack_class } | Reg.Incoming offset -> Incoming { index = byte_offset_to_word_index offset } | Reg.Outgoing offset -> @@ -91,58 +96,51 @@ end = struct let to_stack_loc_lossy t = match t with - | Local { index } -> Reg.Local index + | Local { index; _ } -> Reg.Local index | Incoming { index } -> Reg.Incoming (word_index_to_byte_offset index) | Outgoing { index } -> Reg.Outgoing (word_index_to_byte_offset index) | Domainstate { index } -> Reg.Domainstate (word_index_to_byte_offset index) + + let print ppf = function + | Local { index; stack_class } -> + Format.fprintf ppf "s[%s:%i]" (Proc.stack_class_tag stack_class) index + | Incoming { index } -> Format.fprintf ppf "par[%i]" index + | Outgoing { index } -> Format.fprintf ppf "arg[%i]" index + | Domainstate { index } -> Format.fprintf ppf "ds[%i]" index end - type location = + type t = | Reg of int | Stack of Stack.t - type t = - { typ : Cmm.machtype_component; - loc : location - } - - let of_reg reg : t option = + let of_reg reg = match reg.Reg.loc with | Reg.Unknown -> None - | Reg.Reg idx -> Some { typ = reg.Reg.typ; loc = Reg idx } + | Reg.Reg idx -> Some (Reg idx) | Reg.Stack stack -> - Some { typ = reg.Reg.typ; loc = Stack (Stack.of_stack_loc stack) } + Some + (Stack + (Stack.of_stack_loc + ~stack_class:(Proc.stack_slot_class reg.Reg.typ) + stack)) let of_reg_exn reg = of_reg reg |> Option.get let of_regs_exn loc_arr = Array.map of_reg_exn loc_arr - let to_loc_lossy { loc; _ } = - match loc with + let to_loc_lossy t = + match t with | Reg idx -> Reg.Reg idx | Stack stack -> Reg.Stack (Stack.to_stack_loc_lossy stack) - let print ppf t = - Printmach.loc ~unknown:(fun _ -> assert false) ppf (to_loc_lossy t) t.typ + let print ppf = function + | Reg r -> Format.pp_print_string ppf (Proc.register_name_lossy r) + | Stack s -> Stack.print ppf s let compare (t1 : t) (t2 : t) : int = - match t1.loc, t2.loc with - (* Reg < Stack *) - | Reg _, Stack _ -> -1 - | Stack _, Reg _ -> 1 - | Reg r1, Reg r2 -> - (* Compare register index only. Indices never overlap between classes *) - Int.compare r1 r2 - | Stack s1, Stack s2 -> - (* Compare stack slot class and then slot index. Indices do overlap - between classes. *) - let stack_class_cmp = - Int.compare - (Proc.stack_slot_class t1.typ) - (Proc.stack_slot_class t2.typ) - in - if stack_class_cmp = 0 then Stdlib.compare s1 s2 else stack_class_cmp + (* CR-someday azewierzejew: Implement proper comparison. *) + Stdlib.compare t1 t2 let equal (t1 : t) (t2 : t) : bool = compare t1 t2 = 0 @@ -875,12 +873,9 @@ end = struct "Unsatisfiable equations when removing result equations.\n\ Existing equation has to agree on 0 or 2 sides (cannot be exactly \ 1) with the removed equation.\n\ - (%s, %s)\n\ Existing equation %a.\n\ - Removed equation: %a." - (if reg_eq then "matches" else "differs") - (if loc_eq then "matches" else "differs") - Equation.print (eq_reg, eq_loc) Equation.print (reg, loc); + Removed equation: %a." Equation.print (eq_reg, eq_loc) Equation.print + (reg, loc); let message = Format.flush_str_formatter () in raise (Verification_failed message)) in diff --git a/tests/backend/regalloc_validator/check_regalloc_validation.ml b/tests/backend/regalloc_validator/check_regalloc_validation.ml index 92b65fb0f85..cb63fe81b90 100644 --- a/tests/backend/regalloc_validator/check_regalloc_validation.ml +++ b/tests/backend/regalloc_validator/check_regalloc_validation.ml @@ -1024,7 +1024,7 @@ let test_loop ~loop_loc_first n = ~exp_std: "Validation failed: Bad equations at entry point, reason: Unsatisfiable \ equations when removing result equations.\n\ - Existing equation has to agree one 0 or 2 sides (cannot on exactly 1) \ + Existing equation has to agree on 0 or 2 sides (cannot be exactly 1) \ with the removed equation.\n\ Existing equation R[%rdi]=%rbx.\n\ Removed equation: R[%rbx]=%rbx.\n\ From 2fe41709c677c31b6566ef256a19b69c132c6d20 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Mon, 10 Jul 2023 16:13:12 -0400 Subject: [PATCH 68/81] more consistent prints --- middle_end/flambda2/parser/print_fexpr.ml | 5 +++-- middle_end/printclambda.ml | 2 +- testsuite/tests/unboxed-primitive-args/common.ml | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/middle_end/flambda2/parser/print_fexpr.ml b/middle_end/flambda2/parser/print_fexpr.ml index 316fce77ca0..6371ccae309 100644 --- a/middle_end/flambda2/parser/print_fexpr.ml +++ b/middle_end/flambda2/parser/print_fexpr.ml @@ -257,7 +257,7 @@ let const ppf (c : Fexpr.const) = | Naked_int32 i -> Format.fprintf ppf "%lil" i | Naked_int64 i -> Format.fprintf ppf "%LiL" i | Naked_nativeint i -> Format.fprintf ppf "%Lin" i - | Naked_vec128 { high; low } -> Format.fprintf ppf "%Ld:%Ld" high low + | Naked_vec128 { high; low } -> Format.fprintf ppf "%016Lx:%016Lx" high low let rec simple ppf : simple -> unit = function | Symbol s -> symbol ppf s @@ -322,7 +322,8 @@ let static_data ppf : static_data -> unit = function | Boxed_int32 (Const i) -> Format.fprintf ppf "%lil" i | Boxed_int64 (Const i) -> Format.fprintf ppf "%LiL" i | Boxed_nativeint (Const i) -> Format.fprintf ppf "%Lin" i - | Boxed_vec128 (Const { high; low }) -> Format.fprintf ppf "%Ld:%Ld" high low + | Boxed_vec128 (Const { high; low }) -> + Format.fprintf ppf "%016Lx:%016Lx" high low | Boxed_float (Var v) -> boxed_variable ppf v ~kind:"float" | Boxed_int32 (Var v) -> boxed_variable ppf v ~kind:"int32" | Boxed_int64 (Var v) -> boxed_variable ppf v ~kind:"int64" diff --git a/middle_end/printclambda.ml b/middle_end/printclambda.ml index 79cca1a8b8f..923fcaf112f 100644 --- a/middle_end/printclambda.ml +++ b/middle_end/printclambda.ml @@ -68,7 +68,7 @@ let rec structured_constant ppf = function | Uconst_int32 x -> fprintf ppf "%ldl" x | Uconst_int64 x -> fprintf ppf "%LdL" x | Uconst_nativeint x -> fprintf ppf "%ndn" x - | Uconst_vec128 {high; low} -> fprintf ppf "%Ld:%Ld" high low + | Uconst_vec128 {high; low} -> fprintf ppf "%016Lx:%016Lx" high low | Uconst_block (tag, l) -> fprintf ppf "block(%i" tag; List.iter (fun u -> fprintf ppf ",%a" uconstant u) l; diff --git a/testsuite/tests/unboxed-primitive-args/common.ml b/testsuite/tests/unboxed-primitive-args/common.ml index 2826412cc29..03b1f0543e2 100644 --- a/testsuite/tests/unboxed-primitive-args/common.ml +++ b/testsuite/tests/unboxed-primitive-args/common.ml @@ -57,7 +57,7 @@ let string_of : type a. a typ -> a -> string = function | Float -> fun f -> Printf.sprintf "float_of_bits 0x%LxL" (Int64.bits_of_float f) | Vec128 -> - fun v -> Printf.sprintf "vec128 %Ld:%Ld" (vec128_high_int64 v) (vec128_low_int64 v) + fun v -> Printf.sprintf "vec128 %016Lx:%016Lx" (vec128_high_int64 v) (vec128_low_int64 v) let rec arity : type a. a proto -> int = function | Ret _ -> 0 From bbc84cb8be385b16655679ef9bdd373adeab99ff Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Tue, 11 Jul 2023 12:53:13 -0400 Subject: [PATCH 69/81] more refactoring --- backend/amd64/emit.mlp | 19 ++++-- backend/amd64/proc.ml | 83 ++++++++++-------------- backend/interf.ml | 2 +- backend/interval.ml | 2 +- backend/proc.mli | 5 +- backend/regalloc/regalloc_invariants.ml | 13 ++-- backend/regalloc/regalloc_irc.ml | 7 +- backend/regalloc/regalloc_irc_state.ml | 12 ++-- backend/regalloc/regalloc_irc_utils.ml | 2 +- backend/regalloc/regalloc_irc_utils.mli | 2 +- backend/regalloc/regalloc_ls.ml | 2 +- backend/regalloc/regalloc_stack_slots.ml | 6 +- backend/regalloc/regalloc_validate.ml | 32 +++++---- backend/x86_binary_emitter.ml | 4 +- 14 files changed, 96 insertions(+), 95 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 28bceccec90..e25199a4479 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -47,10 +47,14 @@ let int_reg_name = let float_reg_name = Array.init 16 (fun i -> XMM i) -let register_name r = - if r < 100 then Reg64 (int_reg_name.(r)) - else if r < 200 then Regf (float_reg_name.(r - 100)) - else Misc.fatal_errorf "Bad register id %d" r +let register_name typ r = + match typ with + | Int | Val | Addr -> Reg64 (int_reg_name.(r)) + | Float -> Regf (float_reg_name.(r - 100)) + | Vec128 -> + if not !simd_regalloc_support then + Misc.fatal_error "SIMD register allocation is not enabled."; + Regf (float_reg_name.(r - 100)) (* CFI directives *) @@ -289,7 +293,7 @@ let x86_data_type_for_stack_slot = function | Int | Addr | Val -> QWORD let reg = function - | { loc = Reg.Reg r } -> register_name r + | { loc = Reg.Reg r; typ = ty } -> register_name ty r | { loc = Stack (Domainstate n); typ = ty } -> let ofs = n + Domainstate.(idx_of_field Domain_extra_params) * 8 in mem64 (x86_data_type_for_stack_slot ty) ofs R14 @@ -1615,6 +1619,11 @@ let make_stack_loc ~offset n (r : Reg.t) = probe arguments) in the wrapper's frame. *) let loc = Stack (Outgoing (offset + n)) in (* Manufacture stack entry with this register's type *) + (match r.typ with + | Int | Val | Addr | Float -> () + | Vec128 -> + if not !simd_regalloc_support then + Misc.fatal_error "SIMD register allocation is not enabled."); Reg.at_location r.typ loc (* CR mshinwell: Not now, but after code review, it would be better to diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 67ef690daad..0e3d5ab2a6a 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -145,11 +145,6 @@ let register_name ty r = Misc.fatal_error "SIMD register allocation is not enabled."; float_reg_name.(r - first_available_register.(1)) -let register_name_lossy idx = - if idx < 100 then int_reg_name.(idx) - else if idx < 200 then float_reg_name.(idx - 100) - else Misc.fatal_errorf "Unknown register ID %d" idx - (* Pack registers starting at %rax so as to reduce the number of REX prefixes and thus improve code density *) let rotate_registers = false @@ -167,14 +162,13 @@ let hard_float_reg = v let hard_vec128_reg = - let v = Array.make 16 Reg.dummy in - for i = 0 to 15 do v.(i) <- Reg.at_location Vec128 (Reg (100 + i)) done; - v + if !simd_regalloc_support then + let v = Array.make 16 Reg.dummy in + for i = 0 to 15 do v.(i) <- Reg.at_location Vec128 (Reg (100 + i)) done; + v + else [||] -let all_phys_regs = - let hard_basic_regs = Array.append hard_int_reg hard_float_reg in - let hard_basic_and_simd_regs = Array.append hard_basic_regs hard_vec128_reg in - fun () -> if !simd_regalloc_support then hard_basic_and_simd_regs else hard_basic_regs +let all_phys_regs = Array.concat [hard_int_reg; hard_float_reg; hard_vec128_reg] let phys_reg ty n = match ty with @@ -192,7 +186,7 @@ let r11 = phys_reg Int 11 let rbp = phys_reg Int 12 (* CSE needs to know that all versions of xmm15 are destroyed. *) -let destroy_xmm15 () = +let destroy_xmm15 = if !simd_regalloc_support then [| phys_reg Float 115; phys_reg Vec128 115 |] else [| phys_reg Float 115 |] @@ -376,23 +370,21 @@ let regs_are_volatile _rs = false (* Registers destroyed by operations *) +let destroyed_at_c_call_win64 = + Array.concat + [Array.map (phys_reg Int) [|0;4;5;6;7;10;11|]; + Array.sub hard_float_reg 0 6; + Array.sub hard_vec128_reg 0 (if !simd_regalloc_support then 6 else 0)] + +let destroyed_at_c_call_unix = + (* Unix: rbp, rbx, r12-r15 preserved *) + Array.concat + [Array.map (phys_reg Int) [|0;2;3;4;5;6;7;10;11|]; + hard_float_reg; + hard_vec128_reg] + let destroyed_at_c_call = - let basic_regs, simd_regs = - match win64 with - | true -> - Array.append - (Array.map (phys_reg Int) [|0;4;5;6;7;10;11|]) - (Array.sub hard_float_reg 0 6), - Array.sub hard_vec128_reg 0 6 - | false -> - (* Unix: rbp, rbx, r12-r15 preserved *) - Array.append - (Array.map (phys_reg Int) [|0;2;3;4;5;6;7;10;11|]) - hard_float_reg, - hard_vec128_reg - in - let basic_and_simd_regs = Array.append basic_regs simd_regs in - fun () -> if !simd_regalloc_support then basic_and_simd_regs else basic_regs + if win64 then destroyed_at_c_call_win64 else destroyed_at_c_call_unix let destroyed_at_alloc_or_poll = if X86_proc.use_plt then @@ -409,12 +401,12 @@ let has_pushtrap traps = (* note: keep this function in sync with `destroyed_at_{basic,terminator}` below. *) let destroyed_at_oper = function Iop(Icall_ind | Icall_imm _ | Iextcall { alloc = true; }) - -> all_phys_regs () - | Iop(Iextcall { alloc = false; }) -> destroyed_at_c_call () + -> all_phys_regs + | Iop(Iextcall { alloc = false; }) -> destroyed_at_c_call | Iop(Iintop(Idiv | Imod)) | Iop(Iintop_imm((Idiv | Imod), _)) -> [| rax; rdx |] | Iop(Istore(Single, _, _)) - -> destroy_xmm15 () + -> destroy_xmm15 | Iop(Ialloc _ | Ipoll _) -> destroyed_at_alloc_or_poll | Iop(Iintop(Imulh _ | Icomp _) | Iintop_imm((Icomp _), _)) -> [| rax |] @@ -458,8 +450,7 @@ let destroyed_at_oper = function else [||] - -let destroyed_at_raise () = all_phys_regs () +let destroyed_at_raise = all_phys_regs let destroyed_at_reloadretaddr = [| |] @@ -473,7 +464,7 @@ let destroyed_at_basic (basic : Cfg_intf.S.basic) = | Op (Intop (Idiv | Imod)) | Op (Intop_imm ((Idiv | Imod), _)) -> [| rax; rdx |] | Op(Store(Single, _, _)) -> - destroy_xmm15 () + destroy_xmm15 | Op(Intop(Imulh _ | Icomp _) | Intop_imm((Icomp _), _)) -> [| rax |] | Op (Specific (Irdtsc | Irdpmc)) -> @@ -527,9 +518,9 @@ let destroyed_at_terminator (terminator : Cfg_intf.S.terminator) = [| rax; rdx |] | Call_no_return { func_symbol = _; alloc; ty_res = _; ty_args = _; } | Prim {op = External { func_symbol = _; alloc; ty_res = _; ty_args = _; }; _} -> - if alloc then all_phys_regs () else destroyed_at_c_call () + if alloc then all_phys_regs else destroyed_at_c_call | Call {op = Indirect | Direct _; _} -> - all_phys_regs () + all_phys_regs | Specific_can_raise { op = (Ilea _ | Ibswap _ | Isqrtf | Isextend32 | Izextend32 | Ifloatarithmem _ | Ifloatsqrtf _ | Ifloat_iround | Ifloat_round _ | Ifloat_min | Ifloat_max @@ -657,20 +648,14 @@ let init () = end else num_available_registers.(0) <- 13 -(* This is not always the same as [all_phys_regs], as some physical registers +(* Precolored_regs is always the same as [all_phys_regs], as some physical registers may not be allocatable (e.g. rbp when frame pointers are enabled). *) +let all_phys_regs_minus_fp = + let hard_int_reg = Array.sub hard_int_reg 0 12 in + Array.concat [hard_int_reg; hard_float_reg; hard_vec128_reg] + let precolored_regs = - let ints_no_fp = Array.sub hard_int_reg 0 12 in - let basic_regs = Array.append hard_int_reg hard_float_reg in - let basic_regs_no_fp = Array.append ints_no_fp hard_float_reg in - let basic_and_simd_regs = Array.append basic_regs hard_vec128_reg in - let basic_and_simd_regs_no_fp = Array.append basic_regs_no_fp hard_vec128_reg in - fun () -> - match fp, !simd_regalloc_support with - | false, false -> basic_regs - | true, false -> basic_regs_no_fp - | false, true -> basic_and_simd_regs - | true, true -> basic_and_simd_regs_no_fp + if fp then all_phys_regs_minus_fp else all_phys_regs let operation_supported = function | Cpopcnt -> !popcnt_support diff --git a/backend/interf.ml b/backend/interf.ml index 6436e344bf1..c34eaa0a867 100644 --- a/backend/interf.ml +++ b/backend/interf.ml @@ -114,7 +114,7 @@ let build_graph fundecl = | Iexit _ -> () | Itrywith(body, _kind, (_ts, handler)) -> - add_interf_set (Proc.destroyed_at_raise ()) handler.live; + add_interf_set Proc.destroyed_at_raise handler.live; interf body; interf handler; interf i.next | Iraise _ -> () in diff --git a/backend/interval.ml b/backend/interval.ml index 4955ba7b812..1546e39effa 100644 --- a/backend/interval.ml +++ b/backend/interval.ml @@ -108,7 +108,7 @@ let insert_destroyed_at_oper intervals instr pos = update_interval_position_by_array intervals destroyed pos Result let insert_destroyed_at_raise intervals pos = - let destroyed = Proc.destroyed_at_raise () in + let destroyed = Proc.destroyed_at_raise in if Array.length destroyed > 0 then update_interval_position_by_array intervals destroyed pos Result diff --git a/backend/proc.mli b/backend/proc.mli index dd000050fdb..40ca311aac7 100644 --- a/backend/proc.mli +++ b/backend/proc.mli @@ -24,10 +24,9 @@ val register_class: Reg.t -> int val num_available_registers: int array val first_available_register: int array val register_name: Cmm.machtype_component -> int -> string -val register_name_lossy: int -> string val phys_reg: Cmm.machtype_component -> int -> Reg.t val rotate_registers: bool -val precolored_regs : unit -> Reg.t array +val precolored_regs : Reg.t array (* The number of stack slot classes may differ from the number of register classes. On x86, we use the same class for floating point and SIMD vector registers, @@ -62,7 +61,7 @@ val max_register_pressure: Mach.operation -> int array (* Registers destroyed by operations *) val destroyed_at_oper: Mach.instruction_desc -> Reg.t array -val destroyed_at_raise: unit -> Reg.t array +val destroyed_at_raise: Reg.t array val destroyed_at_reloadretaddr : Reg.t array val destroyed_at_pushtrap : Reg.t array val destroyed_at_basic : Cfg_intf.S.basic -> Reg.t array diff --git a/backend/regalloc/regalloc_invariants.ml b/backend/regalloc/regalloc_invariants.ml index 928a9ff6e0c..ebc6a68f4d3 100644 --- a/backend/regalloc/regalloc_invariants.ml +++ b/backend/regalloc/regalloc_invariants.ml @@ -146,14 +146,13 @@ let postcondition_layout : Cfg_with_layout.t -> unit = let register_classes_must_be_consistent (id : Instruction.id) (reg : Reg.t) : unit = match reg.Reg.loc with - | Reg phys_reg -> - let phys_reg = Proc.phys_reg reg.typ phys_reg in - if not (same_stack_class reg phys_reg && same_reg_class reg phys_reg) - then + | Reg phys_reg -> ( + try Proc.phys_reg reg.typ phys_reg |> ignore + with Invalid_argument _ -> fatal - "instruction %d assigned %a to %a but they are in different register \ - or stack slot classes" - id Printmach.reg reg Printmach.reg phys_reg + "instruction %d assigned %a to register %i, which has an \ + incompatible class" + id Printmach.reg reg phys_reg) | Stack _ | Unknown -> () in let register_classes_must_be_consistent (id : Instruction.id) diff --git a/backend/regalloc/regalloc_irc.ml b/backend/regalloc/regalloc_irc.ml index 82f33751600..fc925c9f653 100644 --- a/backend/regalloc/regalloc_irc.ml +++ b/backend/regalloc/regalloc_irc.ml @@ -89,9 +89,8 @@ let build : State.t -> Cfg_with_infos.t -> unit = let live = Cfg_dataflow.Instr.Tbl.find liveness first_id in Reg.Set.iter (fun reg1 -> - Array.iter - (filter_fp (Proc.destroyed_at_raise ())) - ~f:(fun reg2 -> State.add_edge state reg1 reg2)) + Array.iter (filter_fp Proc.destroyed_at_raise) ~f:(fun reg2 -> + State.add_edge state reg1 reg2)) (Reg.Set.remove Proc.loc_exn_bucket live.before)) let make_work_list : State.t -> unit = @@ -526,6 +525,6 @@ let run : Cfg_with_infos.t -> Cfg_with_infos.t = state ~f:(fun () -> update_register_locations (); - Array.iter (all_precolored_regs ()) ~f:(fun reg -> reg.Reg.degree <- 0)) + Array.iter all_precolored_regs ~f:(fun reg -> reg.Reg.degree <- 0)) cfg_with_infos; cfg_with_infos diff --git a/backend/regalloc/regalloc_irc_state.ml b/backend/regalloc/regalloc_irc_state.ml index e06c76cfec2..d4f1ca80a40 100644 --- a/backend/regalloc/regalloc_irc_state.ml +++ b/backend/regalloc/regalloc_irc_state.ml @@ -60,7 +60,7 @@ let[@inline] make ~initial ~stack_slots ~next_instruction_id () = reg.Reg.interf <- []; reg.Reg.degree <- 0); List.iter initial ~f:(fun reg -> reg.Reg.irc_work_list <- Initial); - Array.iter (all_precolored_regs ()) ~f:(fun reg -> + Array.iter all_precolored_regs ~f:(fun reg -> reg.Reg.irc_work_list <- Reg.Precolored; reg.Reg.irc_color <- (match reg.Reg.loc with @@ -140,7 +140,7 @@ let[@inline] reset state ~new_temporaries = reg.Reg.irc_alias <- None; reg.Reg.interf <- []; reg.Reg.degree <- 0); - Array.iter (all_precolored_regs ()) ~f:(fun reg -> + Array.iter all_precolored_regs ~f:(fun reg -> assert (reg.Reg.irc_work_list = Reg.Precolored); (match reg.Reg.loc, reg.Reg.irc_color with | Reg color, Some color' -> assert (color = color') @@ -534,10 +534,10 @@ let[@inline] invariant state = then ( (* interf (list) is morally a set *) List.iter (Reg.all_registers ()) ~f:check_inter_has_no_duplicates; - Array.iter (all_precolored_regs ()) ~f:check_inter_has_no_duplicates; + Array.iter all_precolored_regs ~f:check_inter_has_no_duplicates; (* register sets are disjoint *) check_disjoint ~is_disjoint:Reg.Set.disjoint - [ "precolored", Reg.set_of_array (all_precolored_regs ()); + [ "precolored", Reg.set_of_array all_precolored_regs; "initial", reg_set_of_doubly_linked_list state.initial; "simplify_work_list", reg_set_of_reg_work_list state.simplify_work_list; "freeze_work_list", reg_set_of_reg_work_list state.freeze_work_list; @@ -547,7 +547,7 @@ let[@inline] invariant state = "colored_nodes", reg_set_of_doubly_linked_list state.colored_nodes; "select_stack", Reg.Set.of_list state.select_stack ]; List.iter ~f:check_set_and_field_consistency_reg - [ "precolored", Reg.set_of_array (all_precolored_regs ()), Reg.Precolored; + [ "precolored", Reg.set_of_array all_precolored_regs, Reg.Precolored; "initial", reg_set_of_doubly_linked_list state.initial, Reg.Initial; ( "simplify_work_list", reg_set_of_reg_work_list state.simplify_work_list, @@ -605,7 +605,7 @@ let[@inline] invariant state = (reg_set_of_reg_work_list state.spill_work_list)) in let work_lists_or_precolored = - Reg.Set.union (Reg.set_of_array (all_precolored_regs ())) work_lists + Reg.Set.union (Reg.set_of_array all_precolored_regs) work_lists in Reg.Set.iter (fun u -> diff --git a/backend/regalloc/regalloc_irc_utils.ml b/backend/regalloc/regalloc_irc_utils.ml index eadd4d95f84..886d7da68cc 100644 --- a/backend/regalloc/regalloc_irc_utils.ml +++ b/backend/regalloc/regalloc_irc_utils.ml @@ -141,7 +141,7 @@ let is_move_basic : Cfg.basic -> bool = let is_move_instruction : Cfg.basic Cfg.instruction -> bool = fun instr -> is_move_basic instr.desc -let all_precolored_regs : unit -> Reg.t array = +let all_precolored_regs = Proc.init (); Proc.precolored_regs diff --git a/backend/regalloc/regalloc_irc_utils.mli b/backend/regalloc/regalloc_irc_utils.mli index 81a3c5f9d59..a2123413f85 100644 --- a/backend/regalloc/regalloc_irc_utils.mli +++ b/backend/regalloc/regalloc_irc_utils.mli @@ -64,7 +64,7 @@ end val is_move_instruction : Instruction.t -> bool -val all_precolored_regs : unit -> Reg.t array +val all_precolored_regs : Reg.t array val k : Reg.t -> int diff --git a/backend/regalloc/regalloc_ls.ml b/backend/regalloc/regalloc_ls.ml index 7644bb4dce1..7c65e41bb88 100644 --- a/backend/regalloc/regalloc_ls.ml +++ b/backend/regalloc/regalloc_ls.ml @@ -75,7 +75,7 @@ let build_intervals : State.t -> Cfg_with_infos.t -> unit = let off = on + 1 in if trap_handler then - Array.iter (Proc.destroyed_at_raise ()) ~f:(fun reg -> + Array.iter Proc.destroyed_at_raise ~f:(fun reg -> update_range reg ~begin_:on ~end_:on); instr.ls_order <- on; Array.iter instr.arg ~f:(fun reg -> update_range reg ~begin_:on ~end_:on); diff --git a/backend/regalloc/regalloc_stack_slots.ml b/backend/regalloc/regalloc_stack_slots.ml index 967a41fcd8f..13314fa702f 100644 --- a/backend/regalloc/regalloc_stack_slots.ml +++ b/backend/regalloc/regalloc_stack_slots.ml @@ -52,7 +52,7 @@ let[@inline] update_cfg_with_layout t cfg_with_layout = done (** The optimization below is conceptually fairly close to what linscan does: - - for each register class / stack slot couple, we compute the interval of + - for each stack slot class / stack slot couple, we compute the interval of uses; - we re-assign slots by putting in the same "bucket" slots whose intervals do not overlap. @@ -138,7 +138,7 @@ module Intervals : sig type slots = t type t = Interval.t array array - (* first index is register class, second index is slot index *) + (* first index is stack slot class, second index is slot index *) val build_from_cfg : slots -> Cfg_with_infos.t -> t @@ -217,7 +217,7 @@ module Buckets : sig end with type slots := t = struct type t = Interval.t Int.Tbl.t array array - (* first index is register class, second index is bucket index, table key is + (* first index is stack slot class, second index is bucket index, table key is slot index *) let does_not_fit (bucket : Interval.t Int.Tbl.t) (interval : Interval.t) : diff --git a/backend/regalloc/regalloc_validate.ml b/backend/regalloc/regalloc_validate.ml index 23df8ddec1d..5f4b6371a2c 100644 --- a/backend/regalloc/regalloc_validate.ml +++ b/backend/regalloc/regalloc_validate.ml @@ -25,7 +25,7 @@ module Location : sig val to_loc_lossy : t -> Reg.location - val print : Format.formatter -> t -> unit + val print : Cmm.machtype_component -> Format.formatter -> t -> unit val equal : t -> t -> bool @@ -134,8 +134,8 @@ end = struct | Reg idx -> Reg.Reg idx | Stack stack -> Reg.Stack (Stack.to_stack_loc_lossy stack) - let print ppf = function - | Reg r -> Format.pp_print_string ppf (Proc.register_name_lossy r) + let print typ ppf = function + | Reg r -> Format.pp_print_string ppf (Proc.register_name typ r) | Stack s -> Stack.print ppf s let compare (t1 : t) (t2 : t) : int = @@ -209,6 +209,8 @@ module Register : sig val print : Format.formatter -> t -> unit + val typ : t -> Cmm.machtype_component + module Set : Set.S with type elt = t module Map : Map.S with type key = t @@ -239,10 +241,12 @@ end = struct loc = Reg_id.to_loc_lossy t.reg_id } + let typ (t : t) = t.for_print.typ + let print (ppf : Format.formatter) (t : t) : unit = match t.reg_id with | Preassigned { location } -> - Format.fprintf ppf "R[%a]" Location.print location + Format.fprintf ppf "R[%a]" (Location.print t.for_print.typ) location | Named _ -> Printmach.reg ppf (to_dummy_reg t) let compare (t1 : t) (t2 : t) : int = Reg_id.compare t1.reg_id t2.reg_id @@ -453,7 +457,10 @@ end = struct | Preassigned { location = prev_loc }, Some new_loc -> Regalloc_utils.fatal "%s: changed preassigned register's location from %a to %a" context - Location.print prev_loc Location.print new_loc) + (Location.print (Register.typ reg_desc)) + prev_loc + (Location.print loc_reg.Reg.typ) + new_loc) reg_arr loc_arr; () @@ -772,7 +779,9 @@ end = struct type t = Register.t * Location.t let print ppf (r, l) = - Format.fprintf ppf "%a=%a" Register.print r Location.print l + Format.fprintf ppf "%a=%a" Register.print r + (Location.print (Register.typ r)) + l end exception Verification_failed of string @@ -912,9 +921,10 @@ end = struct | None -> () | Some regs -> assert (not (Register.Set.is_empty regs)); + let typ = Register.Set.choose regs |> Register.typ in Format.fprintf Format.str_formatter - "Destroying a location %a in which a live registers %a is stored" - Location.print destroyed_loc + "Destroying a location %a in which live registers %a are stored" + (Location.print typ) destroyed_loc (Format.pp_print_seq ~pp_sep:(fun ppf () -> Format.fprintf ppf ", ") Register.print) @@ -1124,7 +1134,7 @@ module Transfer (Desc_val : Description_value) : equations |> Equation_set.verify_destroyed_locations ~destroyed: - (Location.of_regs_exn (Proc.destroyed_at_raise ())) + (Location.of_regs_exn Proc.destroyed_at_raise) |> Result.map_error (fun message -> Printf.sprintf "While verifying locations destroyed at raise: %s" @@ -1305,8 +1315,8 @@ end = struct Format.fprintf ppf "Function argument locations: %a\n" (Format.pp_print_seq ~pp_sep:(fun ppf () -> Format.pp_print_string ppf ", ") - Location.print) - (Array.to_seq loc_fun_args); + (fun ppf (reg, loc) -> Location.print (Register.typ reg) ppf loc)) + (Array.to_seq (Array.combine reg_fun_args loc_fun_args)); () end diff --git a/backend/x86_binary_emitter.ml b/backend/x86_binary_emitter.ml index e23ff155a21..27c1fcc6006 100644 --- a/backend/x86_binary_emitter.ml +++ b/backend/x86_binary_emitter.ml @@ -436,8 +436,8 @@ let emit_mod_rm_reg b rex opcodes rm reg = emit_rex b (rex lor rex_of_reg16 reg16 lor rexr_reg reg lor rexb_rm rm); buf_opcodes b opcodes; buf_int8 b (mod_rm_reg 0b11 rm reg) - | Regf (XMM _ as rm) -> - let rm = rd_of_regf rm in + | Regf regf -> + let rm = rd_of_regf regf in emit_rex b (rex lor rexr_reg reg lor rexb_rm rm); buf_opcodes b opcodes; buf_int8 b (mod_rm_reg 0b11 rm reg) From 647416d8de55785e7b6c947d88b4b155737c3470 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Tue, 11 Jul 2023 12:57:15 -0400 Subject: [PATCH 70/81] restore error message again --- tests/backend/regalloc_validator/check_regalloc_validation.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/backend/regalloc_validator/check_regalloc_validation.ml b/tests/backend/regalloc_validator/check_regalloc_validation.ml index cb63fe81b90..f5434b11912 100644 --- a/tests/backend/regalloc_validator/check_regalloc_validation.ml +++ b/tests/backend/regalloc_validator/check_regalloc_validation.ml @@ -559,7 +559,7 @@ let () = cfg, cfg) ~exp_std:"fatal exception raised when validating description" ~exp_err: - ">> Fatal error: instruction 20 has a register (V/53) with an unknown \ + ">> Fatal error: instruction 20 has a register (V/37) with an unknown \ location" let () = From 98d3be4587cd8201afca7a86cf1b1455514b5dbf Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Tue, 11 Jul 2023 13:34:42 -0400 Subject: [PATCH 71/81] restage simd checks --- backend/amd64/proc.ml | 60 +++++++++++-------- backend/arm64/proc.ml | 5 -- backend/interf.ml | 2 +- backend/interval.ml | 2 +- backend/proc.mli | 4 +- backend/regalloc/regalloc_irc.ml | 7 ++- backend/regalloc/regalloc_irc_state.ml | 12 ++-- backend/regalloc/regalloc_irc_utils.mli | 2 +- backend/regalloc/regalloc_ls.ml | 2 +- backend/regalloc/regalloc_validate.ml | 2 +- .../check_regalloc_validation.ml | 2 +- 11 files changed, 52 insertions(+), 48 deletions(-) diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 0e3d5ab2a6a..73732c94d61 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -162,22 +162,21 @@ let hard_float_reg = v let hard_vec128_reg = - if !simd_regalloc_support then - let v = Array.make 16 Reg.dummy in - for i = 0 to 15 do v.(i) <- Reg.at_location Vec128 (Reg (100 + i)) done; - v - else [||] + let v = Array.make 16 Reg.dummy in + for i = 0 to 15 do v.(i) <- Reg.at_location Vec128 (Reg (100 + i)) done; + fun () -> if !simd_regalloc_support then v + else Misc.fatal_error "SIMD register allocation is not enabled." -let all_phys_regs = Array.concat [hard_int_reg; hard_float_reg; hard_vec128_reg] +let all_phys_regs = + let basic_regs = Array.append hard_int_reg hard_float_reg in + fun () -> if !simd_regalloc_support then Array.append basic_regs (hard_vec128_reg ()) + else basic_regs let phys_reg ty n = match ty with | Int | Addr | Val -> hard_int_reg.(n) | Float -> hard_float_reg.(n - 100) - | Vec128 -> - if not !simd_regalloc_support then - Misc.fatal_error "SIMD register allocation is not enabled."; - hard_vec128_reg.(n - 100) + | Vec128 -> (hard_vec128_reg ()).(n - 100) let rax = phys_reg Int 0 let rdx = phys_reg Int 4 @@ -186,7 +185,7 @@ let r11 = phys_reg Int 11 let rbp = phys_reg Int 12 (* CSE needs to know that all versions of xmm15 are destroyed. *) -let destroy_xmm15 = +let destroy_xmm15 () = if !simd_regalloc_support then [| phys_reg Float 115; phys_reg Vec128 115 |] else [| phys_reg Float 115 |] @@ -371,17 +370,23 @@ let regs_are_volatile _rs = false (* Registers destroyed by operations *) let destroyed_at_c_call_win64 = - Array.concat - [Array.map (phys_reg Int) [|0;4;5;6;7;10;11|]; - Array.sub hard_float_reg 0 6; - Array.sub hard_vec128_reg 0 (if !simd_regalloc_support then 6 else 0)] + let basic_regs = Array.append + (Array.map (phys_reg Int) [|0;4;5;6;7;10;11|]) + (Array.sub hard_float_reg 0 6) + in + fun () -> if !simd_regalloc_support + then Array.append basic_regs (Array.sub (hard_vec128_reg ()) 0 6) + else basic_regs let destroyed_at_c_call_unix = (* Unix: rbp, rbx, r12-r15 preserved *) - Array.concat - [Array.map (phys_reg Int) [|0;2;3;4;5;6;7;10;11|]; - hard_float_reg; - hard_vec128_reg] + let basic_regs = Array.append + (Array.map (phys_reg Int) [|0;2;3;4;5;6;7;10;11|]) + hard_float_reg + in + fun () -> if !simd_regalloc_support + then Array.append basic_regs (hard_vec128_reg ()) + else basic_regs let destroyed_at_c_call = if win64 then destroyed_at_c_call_win64 else destroyed_at_c_call_unix @@ -401,12 +406,12 @@ let has_pushtrap traps = (* note: keep this function in sync with `destroyed_at_{basic,terminator}` below. *) let destroyed_at_oper = function Iop(Icall_ind | Icall_imm _ | Iextcall { alloc = true; }) - -> all_phys_regs - | Iop(Iextcall { alloc = false; }) -> destroyed_at_c_call + -> all_phys_regs () + | Iop(Iextcall { alloc = false; }) -> destroyed_at_c_call () | Iop(Iintop(Idiv | Imod)) | Iop(Iintop_imm((Idiv | Imod), _)) -> [| rax; rdx |] | Iop(Istore(Single, _, _)) - -> destroy_xmm15 + -> destroy_xmm15 () | Iop(Ialloc _ | Ipoll _) -> destroyed_at_alloc_or_poll | Iop(Iintop(Imulh _ | Icomp _) | Iintop_imm((Icomp _), _)) -> [| rax |] @@ -464,7 +469,7 @@ let destroyed_at_basic (basic : Cfg_intf.S.basic) = | Op (Intop (Idiv | Imod)) | Op (Intop_imm ((Idiv | Imod), _)) -> [| rax; rdx |] | Op(Store(Single, _, _)) -> - destroy_xmm15 + destroy_xmm15 () | Op(Intop(Imulh _ | Icomp _) | Intop_imm((Icomp _), _)) -> [| rax |] | Op (Specific (Irdtsc | Irdpmc)) -> @@ -518,9 +523,9 @@ let destroyed_at_terminator (terminator : Cfg_intf.S.terminator) = [| rax; rdx |] | Call_no_return { func_symbol = _; alloc; ty_res = _; ty_args = _; } | Prim {op = External { func_symbol = _; alloc; ty_res = _; ty_args = _; }; _} -> - if alloc then all_phys_regs else destroyed_at_c_call + if alloc then all_phys_regs () else destroyed_at_c_call () | Call {op = Indirect | Direct _; _} -> - all_phys_regs + all_phys_regs () | Specific_can_raise { op = (Ilea _ | Ibswap _ | Isqrtf | Isextend32 | Izextend32 | Ifloatarithmem _ | Ifloatsqrtf _ | Ifloat_iround | Ifloat_round _ | Ifloat_min | Ifloat_max @@ -652,7 +657,10 @@ let init () = may not be allocatable (e.g. rbp when frame pointers are enabled). *) let all_phys_regs_minus_fp = let hard_int_reg = Array.sub hard_int_reg 0 12 in - Array.concat [hard_int_reg; hard_float_reg; hard_vec128_reg] + let basic_regs = Array.append hard_int_reg hard_float_reg in + fun () -> if !simd_regalloc_support + then Array.append basic_regs (hard_vec128_reg ()) + else basic_regs let precolored_regs = if fp then all_phys_regs_minus_fp else all_phys_regs diff --git a/backend/arm64/proc.ml b/backend/arm64/proc.ml index da916768596..ce090ba538a 100644 --- a/backend/arm64/proc.ml +++ b/backend/arm64/proc.ml @@ -99,11 +99,6 @@ let register_name ty r = (* CR mslater: (SIMD) arm64 *) | Vec128 -> fatal_error "arm64: got vec128 register" -let register_name_lossy idx = - if idx < 100 then int_reg_name.(idx) - else if idx < 200 then float_reg_name.(idx - 100) - else Misc.fatal_errorf "Unknown register ID %d" idx - let rotate_registers = true let class_of reg = diff --git a/backend/interf.ml b/backend/interf.ml index c34eaa0a867..6436e344bf1 100644 --- a/backend/interf.ml +++ b/backend/interf.ml @@ -114,7 +114,7 @@ let build_graph fundecl = | Iexit _ -> () | Itrywith(body, _kind, (_ts, handler)) -> - add_interf_set Proc.destroyed_at_raise handler.live; + add_interf_set (Proc.destroyed_at_raise ()) handler.live; interf body; interf handler; interf i.next | Iraise _ -> () in diff --git a/backend/interval.ml b/backend/interval.ml index 1546e39effa..4955ba7b812 100644 --- a/backend/interval.ml +++ b/backend/interval.ml @@ -108,7 +108,7 @@ let insert_destroyed_at_oper intervals instr pos = update_interval_position_by_array intervals destroyed pos Result let insert_destroyed_at_raise intervals pos = - let destroyed = Proc.destroyed_at_raise in + let destroyed = Proc.destroyed_at_raise () in if Array.length destroyed > 0 then update_interval_position_by_array intervals destroyed pos Result diff --git a/backend/proc.mli b/backend/proc.mli index 40ca311aac7..f4e7f9c2b5b 100644 --- a/backend/proc.mli +++ b/backend/proc.mli @@ -26,7 +26,7 @@ val first_available_register: int array val register_name: Cmm.machtype_component -> int -> string val phys_reg: Cmm.machtype_component -> int -> Reg.t val rotate_registers: bool -val precolored_regs : Reg.t array +val precolored_regs : unit -> Reg.t array (* The number of stack slot classes may differ from the number of register classes. On x86, we use the same class for floating point and SIMD vector registers, @@ -61,7 +61,7 @@ val max_register_pressure: Mach.operation -> int array (* Registers destroyed by operations *) val destroyed_at_oper: Mach.instruction_desc -> Reg.t array -val destroyed_at_raise: Reg.t array +val destroyed_at_raise: unit -> Reg.t array val destroyed_at_reloadretaddr : Reg.t array val destroyed_at_pushtrap : Reg.t array val destroyed_at_basic : Cfg_intf.S.basic -> Reg.t array diff --git a/backend/regalloc/regalloc_irc.ml b/backend/regalloc/regalloc_irc.ml index fc925c9f653..82f33751600 100644 --- a/backend/regalloc/regalloc_irc.ml +++ b/backend/regalloc/regalloc_irc.ml @@ -89,8 +89,9 @@ let build : State.t -> Cfg_with_infos.t -> unit = let live = Cfg_dataflow.Instr.Tbl.find liveness first_id in Reg.Set.iter (fun reg1 -> - Array.iter (filter_fp Proc.destroyed_at_raise) ~f:(fun reg2 -> - State.add_edge state reg1 reg2)) + Array.iter + (filter_fp (Proc.destroyed_at_raise ())) + ~f:(fun reg2 -> State.add_edge state reg1 reg2)) (Reg.Set.remove Proc.loc_exn_bucket live.before)) let make_work_list : State.t -> unit = @@ -525,6 +526,6 @@ let run : Cfg_with_infos.t -> Cfg_with_infos.t = state ~f:(fun () -> update_register_locations (); - Array.iter all_precolored_regs ~f:(fun reg -> reg.Reg.degree <- 0)) + Array.iter (all_precolored_regs ()) ~f:(fun reg -> reg.Reg.degree <- 0)) cfg_with_infos; cfg_with_infos diff --git a/backend/regalloc/regalloc_irc_state.ml b/backend/regalloc/regalloc_irc_state.ml index d4f1ca80a40..e06c76cfec2 100644 --- a/backend/regalloc/regalloc_irc_state.ml +++ b/backend/regalloc/regalloc_irc_state.ml @@ -60,7 +60,7 @@ let[@inline] make ~initial ~stack_slots ~next_instruction_id () = reg.Reg.interf <- []; reg.Reg.degree <- 0); List.iter initial ~f:(fun reg -> reg.Reg.irc_work_list <- Initial); - Array.iter all_precolored_regs ~f:(fun reg -> + Array.iter (all_precolored_regs ()) ~f:(fun reg -> reg.Reg.irc_work_list <- Reg.Precolored; reg.Reg.irc_color <- (match reg.Reg.loc with @@ -140,7 +140,7 @@ let[@inline] reset state ~new_temporaries = reg.Reg.irc_alias <- None; reg.Reg.interf <- []; reg.Reg.degree <- 0); - Array.iter all_precolored_regs ~f:(fun reg -> + Array.iter (all_precolored_regs ()) ~f:(fun reg -> assert (reg.Reg.irc_work_list = Reg.Precolored); (match reg.Reg.loc, reg.Reg.irc_color with | Reg color, Some color' -> assert (color = color') @@ -534,10 +534,10 @@ let[@inline] invariant state = then ( (* interf (list) is morally a set *) List.iter (Reg.all_registers ()) ~f:check_inter_has_no_duplicates; - Array.iter all_precolored_regs ~f:check_inter_has_no_duplicates; + Array.iter (all_precolored_regs ()) ~f:check_inter_has_no_duplicates; (* register sets are disjoint *) check_disjoint ~is_disjoint:Reg.Set.disjoint - [ "precolored", Reg.set_of_array all_precolored_regs; + [ "precolored", Reg.set_of_array (all_precolored_regs ()); "initial", reg_set_of_doubly_linked_list state.initial; "simplify_work_list", reg_set_of_reg_work_list state.simplify_work_list; "freeze_work_list", reg_set_of_reg_work_list state.freeze_work_list; @@ -547,7 +547,7 @@ let[@inline] invariant state = "colored_nodes", reg_set_of_doubly_linked_list state.colored_nodes; "select_stack", Reg.Set.of_list state.select_stack ]; List.iter ~f:check_set_and_field_consistency_reg - [ "precolored", Reg.set_of_array all_precolored_regs, Reg.Precolored; + [ "precolored", Reg.set_of_array (all_precolored_regs ()), Reg.Precolored; "initial", reg_set_of_doubly_linked_list state.initial, Reg.Initial; ( "simplify_work_list", reg_set_of_reg_work_list state.simplify_work_list, @@ -605,7 +605,7 @@ let[@inline] invariant state = (reg_set_of_reg_work_list state.spill_work_list)) in let work_lists_or_precolored = - Reg.Set.union (Reg.set_of_array all_precolored_regs) work_lists + Reg.Set.union (Reg.set_of_array (all_precolored_regs ())) work_lists in Reg.Set.iter (fun u -> diff --git a/backend/regalloc/regalloc_irc_utils.mli b/backend/regalloc/regalloc_irc_utils.mli index a2123413f85..81a3c5f9d59 100644 --- a/backend/regalloc/regalloc_irc_utils.mli +++ b/backend/regalloc/regalloc_irc_utils.mli @@ -64,7 +64,7 @@ end val is_move_instruction : Instruction.t -> bool -val all_precolored_regs : Reg.t array +val all_precolored_regs : unit -> Reg.t array val k : Reg.t -> int diff --git a/backend/regalloc/regalloc_ls.ml b/backend/regalloc/regalloc_ls.ml index 7c65e41bb88..7644bb4dce1 100644 --- a/backend/regalloc/regalloc_ls.ml +++ b/backend/regalloc/regalloc_ls.ml @@ -75,7 +75,7 @@ let build_intervals : State.t -> Cfg_with_infos.t -> unit = let off = on + 1 in if trap_handler then - Array.iter Proc.destroyed_at_raise ~f:(fun reg -> + Array.iter (Proc.destroyed_at_raise ()) ~f:(fun reg -> update_range reg ~begin_:on ~end_:on); instr.ls_order <- on; Array.iter instr.arg ~f:(fun reg -> update_range reg ~begin_:on ~end_:on); diff --git a/backend/regalloc/regalloc_validate.ml b/backend/regalloc/regalloc_validate.ml index 5f4b6371a2c..baf1720d10f 100644 --- a/backend/regalloc/regalloc_validate.ml +++ b/backend/regalloc/regalloc_validate.ml @@ -1134,7 +1134,7 @@ module Transfer (Desc_val : Description_value) : equations |> Equation_set.verify_destroyed_locations ~destroyed: - (Location.of_regs_exn Proc.destroyed_at_raise) + (Location.of_regs_exn (Proc.destroyed_at_raise ())) |> Result.map_error (fun message -> Printf.sprintf "While verifying locations destroyed at raise: %s" diff --git a/tests/backend/regalloc_validator/check_regalloc_validation.ml b/tests/backend/regalloc_validator/check_regalloc_validation.ml index f5434b11912..cb63fe81b90 100644 --- a/tests/backend/regalloc_validator/check_regalloc_validation.ml +++ b/tests/backend/regalloc_validator/check_regalloc_validation.ml @@ -559,7 +559,7 @@ let () = cfg, cfg) ~exp_std:"fatal exception raised when validating description" ~exp_err: - ">> Fatal error: instruction 20 has a register (V/37) with an unknown \ + ">> Fatal error: instruction 20 has a register (V/53) with an unknown \ location" let () = From f352a7c0acf383e1873ced506ffa40b61f20e2ba Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Tue, 11 Jul 2023 14:25:06 -0400 Subject: [PATCH 72/81] delete unused x87 fp ops from amd64 backend --- backend/x86_ast.mli | 38 +--------- backend/x86_binary_emitter.ml | 126 ---------------------------------- backend/x86_dsl.ml | 36 ---------- backend/x86_dsl.mli | 36 ---------- backend/x86_gas.ml | 42 +----------- backend/x86_masm.ml | 36 +--------- backend/x86_proc.ml | 4 +- backend/x86_proc.mli | 4 +- 8 files changed, 7 insertions(+), 315 deletions(-) diff --git a/backend/x86_ast.mli b/backend/x86_ast.mli index 25c054f2f12..52b1c3b37cb 100644 --- a/backend/x86_ast.mli +++ b/backend/x86_ast.mli @@ -68,7 +68,7 @@ type reg8h = | AH | BH | CH | DH -type registerf = XMM of int | TOS | ST of int +type regf = XMM of int type arch = X64 | X86 @@ -102,7 +102,7 @@ type arg = | Reg16 of reg64 | Reg32 of reg64 | Reg64 of reg64 - | Regf of registerf + | Regf of regf | Mem of addr | Mem64_RIP of data_type * string * int @@ -130,40 +130,6 @@ type instruction = | CVTTSD2SI of arg * arg | DEC of arg | DIVSD of arg * arg - | FABS - | FADD of arg - | FADDP of arg * arg - | FCHS - | FCOMP of arg - | FCOMPP - | FCOS - | FDIV of arg - | FDIVP of arg * arg - | FDIVR of arg - | FDIVRP of arg * arg - | FILD of arg - | FISTP of arg - | FLD of arg - | FLD1 - | FLDCW of arg - | FLDLG2 - | FLDLN2 - | FLDZ - | FMUL of arg - | FMULP of arg * arg - | FNSTCW of arg - | FNSTSW of arg - | FPATAN - | FPTAN - | FSIN - | FSQRT - | FSTP of arg - | FSUB of arg - | FSUBP of arg * arg - | FSUBR of arg - | FSUBRP of arg * arg - | FXCH of arg - | FYL2X | HLT | IDIV of arg | IMUL of arg * arg option diff --git a/backend/x86_binary_emitter.ml b/backend/x86_binary_emitter.ml index 425c78acd96..15b11cf3adc 100644 --- a/backend/x86_binary_emitter.ml +++ b/backend/x86_binary_emitter.ml @@ -277,10 +277,6 @@ let is_imm8L x = x < 128L && x >= -128L let rd_of_regf regf = match regf with | XMM n -> n - | TOS -> assert false (* TODO *) - | ST _st -> assert false - -(* TODO *) let rd_of_reg64 = function | RAX -> 0 @@ -1188,15 +1184,6 @@ let emit_MOVZX b dst src = emit_mod_rm_reg b 0 [ 0x0F; 0xB7 ] rm reg | _ -> assert false -let emit_FSTP b dst = - match dst with - | Mem { typ = REAL8 | QWORD } as rm -> emit_mod_rm_reg b 0 [ 0xDD ] rm 3 - | Mem { typ = REAL4 } as rm -> emit_mod_rm_reg b 0 [ 0xD9 ] rm 3 - | Regf (ST i) -> - (* assert (i >= 0 && i < float_stack_size); *) - buf_opcodes b [ 0xDD; 0xD8 + i ] - | _ -> assert false - let emit_neg b dst = match dst with | (Reg64 _ | Reg32 _ | Mem _ | Mem64_RIP _) as rm -> @@ -1394,85 +1381,6 @@ let emit_BSWAP b = function buf_opcodes b [ 0x0F; 0xC8 + reg7 reg ] | _ -> assert false -let emit_FLDCW b = function - | (Mem _ | Mem64_RIP _) as rm -> emit_mod_rm_reg b no_rex [ 0xD9 ] rm 5 - | _ -> assert false - -let emit_FXCH b = function - | Regf (ST i) -> buf_opcodes b [ 0xD9; 0xC8 + i ] - | _ -> assert false - -let emit_FLD b = function - | Mem { typ = REAL4 | DWORD } as rm -> emit_mod_rm_reg b 0 [ 0xD9 ] rm 0 - | Mem { typ = REAL8 | QWORD } as rm -> emit_mod_rm_reg b 0 [ 0xDD ] rm 0 - | Regf (ST i) -> buf_opcodes b [ 0xD9; 0xC0 + i ] - | _ -> assert false - -let emit_FCOMP b = function - | Mem { typ = REAL4 | DWORD } as rm -> emit_mod_rm_reg b no_rex [ 0xD8 ] rm 3 - | Mem { typ = REAL8 | QWORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDC ] rm 3 - | Regf (ST i) -> buf_opcodes b [ 0xD8; 0xD8 + i ] - | _ -> assert false - -let emit_FXXX reg b rm = - match rm with - | Mem { typ = REAL4 | DWORD } -> emit_mod_rm_reg b no_rex [ 0xD8 ] rm reg - | Mem { typ = REAL8 | QWORD } -> emit_mod_rm_reg b no_rex [ 0xDC ] rm reg - | _ -> assert false - -let emit_FADD = emit_FXXX 0 - -let emit_FMUL = emit_FXXX 1 - -(* let emit_FCOM = emit_FXXX 2 *) -(* let emit_FCOMP = emit_FXXX 3 *) -let emit_FSUB = emit_FXXX 4 - -let emit_FSUBR = emit_FXXX 5 - -let emit_FDIV = emit_FXXX 6 - -let emit_FDIVR = emit_FXXX 7 - -let emit_FILD b = function - | Mem { typ = QWORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDF ] rm 5 - | Mem { typ = DWORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDB ] rm 0 - | Mem { typ = WORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDF ] rm 0 - | _ -> assert false - -let emit_FISTP b = function - | Mem { typ = WORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDF ] rm 3 - | Mem { typ = DWORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDB ] rm 3 - | Mem { typ = QWORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDF ] rm 7 - | _ -> assert false - -let emit_FNSTCW b = function - | Mem { typ = NONE | WORD } as rm -> - emit_mod_rm_reg b no_rex [ 0x9B; 0xD9 ] rm 7 - | _ -> assert false - -let emit_FNSTSW b = function - | Reg16 RAX -> buf_opcodes b [ 0xDF; 0xE0 ] - | Mem { typ = NONE | WORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDD ] rm 7 - | _ -> assert false - -let emit_FXXXP opcode b a1 a2 = - match (a1, a2) with - | Regf (ST i), Regf (ST 0) -> buf_opcodes b [ 0xDE; opcode + i ] - | _ -> assert false - -let emit_FADDP b = emit_FXXXP 0xC0 b - -let emit_FMULP b = emit_FXXXP 0xC8 b - -let emit_FSUBRP b = emit_FXXXP 0xE0 b - -let emit_FSUBP b = emit_FXXXP 0xE8 b - -let emit_FDIVRP b = emit_FXXXP 0xF0 b - -let emit_FDIVP b = emit_FXXXP 0xF8 b - let emit_XCHG b src dst = (* TODO: test ! *) match (dst, src) with @@ -1518,40 +1426,6 @@ let assemble_instr b loc = function | CDQ -> buf_int8 b 0x99 | DIVSD (src, dst) -> emit_divsd b dst src | DEC dst -> emit_DEC b [ dst ] - | FCOMPP -> buf_opcodes b [ 0xDE; 0xD9 ] - | FLD1 -> buf_opcodes b [ 0xD9; 0xE8 ] - | FLDLG2 -> buf_opcodes b [ 0xD9; 0xEC ] - | FLDLN2 -> buf_opcodes b [ 0xD9; 0xED ] - | FLDZ -> buf_opcodes b [ 0xD9; 0xEE ] - | FPATAN -> buf_opcodes b [ 0xD9; 0xF3 ] - | FCOS -> buf_opcodes b [ 0xD9; 0xFF ] - | FYL2X -> buf_opcodes b [ 0xD9; 0xF1 ] - | FSIN -> buf_opcodes b [ 0xD9; 0xFE ] - | FSQRT -> buf_opcodes b [ 0xD9; 0xFA ] - | FPTAN -> buf_opcodes b [ 0xD9; 0xF2 ] - | FSTP dst -> emit_FSTP b dst - | FXCH arg -> emit_FXCH b arg - | FCOMP arg -> emit_FCOMP b arg - | FNSTSW arg -> emit_FNSTSW b arg - | FNSTCW arg -> emit_FNSTCW b arg - | FCHS -> buf_opcodes b [ 0xD9; 0xE0 ] - | FABS -> buf_opcodes b [ 0xD9; 0xE1 ] - | FADD arg -> emit_FADD b arg - | FSUB arg -> emit_FSUB b arg - | FMUL arg -> emit_FMUL b arg - | FDIV arg -> emit_FDIV b arg - | FDIVR arg -> emit_FDIVR b arg - | FSUBR arg -> emit_FSUBR b arg - | FILD arg -> emit_FILD b arg - | FISTP arg -> emit_FISTP b arg - | FLD arg -> emit_FLD b arg - | FLDCW arg -> emit_FLDCW b arg - | FADDP (src, dst) -> emit_FADDP b dst src - | FSUBP (src, dst) -> emit_FSUBP b dst src - | FMULP (src, dst) -> emit_FMULP b dst src - | FDIVP (src, dst) -> emit_FDIVP b dst src - | FSUBRP (src, dst) -> emit_FSUBRP b dst src - | FDIVRP (src, dst) -> emit_FDIVRP b dst src | HLT -> buf_int8 b 0xF4 | INC dst -> emit_inc b dst | IMUL (src, dst) -> emit_imul b dst src diff --git a/backend/x86_dsl.ml b/backend/x86_dsl.ml index e99711898e8..0e39a6d1eb7 100644 --- a/backend/x86_dsl.ml +++ b/backend/x86_dsl.ml @@ -62,8 +62,6 @@ let ecx = Reg32 RCX let edx = Reg32 RDX let ebp = Reg32 RBP let esp = Reg32 RSP -let st0 = Regf (ST 0) -let st1 = Regf (ST 1) let mem32 typ ?(scale = 1) ?base ?sym displ idx = assert(scale >= 0); @@ -136,40 +134,6 @@ module I = struct let cvttsd2si x y = emit (CVTTSD2SI (x, y)) let dec x = emit (DEC x) let divsd x y = emit (DIVSD (x, y)) - let fabs () = emit FABS - let fadd x = emit (FADD x) - let faddp x y = emit (FADDP (x, y)) - let fchs () = emit FCHS - let fcomp x = emit (FCOMP x) - let fcompp () = emit FCOMPP - let fcos () = emit FCOS - let fdiv x = emit (FDIV x) - let fdivp x y = emit (FDIVP (x, y)) - let fdivr x = emit (FDIVR x) - let fdivrp x y = emit (FDIVRP (x, y)) - let fild x = emit (FILD x) - let fistp x = emit (FISTP x) - let fld x = emit (FLD x) - let fld1 () = emit FLD1 - let fldcw x = emit (FLDCW x) - let fldlg2 () = emit FLDLG2 - let fldln2 () = emit FLDLN2 - let fldz () = emit FLDZ - let fmul x = emit (FMUL x) - let fmulp x y = emit (FMULP (x, y)) - let fnstcw x = emit (FNSTCW x) - let fnstsw x = emit (FNSTSW x) - let fpatan () = emit FPATAN - let fptan () = emit FPTAN - let fsin () = emit FSIN - let fsqrt () = emit FSQRT - let fstp x = emit (FSTP x) - let fsub x = emit (FSUB x) - let fsubp x y = emit (FSUBP (x, y)) - let fsubr x = emit (FSUBR x) - let fsubrp x y = emit (FSUBRP (x, y)) - let fxch x = emit (FXCH x) - let fyl2x () = emit FYL2X let hlt () = emit HLT let idiv x = emit (IDIV x) let imul x y = emit (IMUL (x, y)) diff --git a/backend/x86_dsl.mli b/backend/x86_dsl.mli index f00f56f285c..bfc9e4b1b8d 100644 --- a/backend/x86_dsl.mli +++ b/backend/x86_dsl.mli @@ -51,8 +51,6 @@ val ecx: arg val edx: arg val ebp: arg val esp: arg -val st0: arg -val st1: arg val mem32: data_type -> ?scale:int -> ?base:reg64 -> ?sym:string -> @@ -131,40 +129,6 @@ module I : sig val cvttsd2si: arg -> arg -> unit val dec: arg -> unit val divsd: arg -> arg -> unit - val fabs: unit -> unit - val fadd: arg -> unit - val faddp: arg -> arg -> unit - val fchs: unit -> unit - val fcomp: arg -> unit - val fcompp: unit -> unit - val fcos: unit -> unit - val fdiv: arg -> unit - val fdivp: arg -> arg -> unit - val fdivr: arg -> unit - val fdivrp: arg -> arg -> unit - val fild: arg -> unit - val fistp: arg -> unit - val fld1: unit -> unit - val fld: arg -> unit - val fldcw: arg -> unit - val fldlg2: unit -> unit - val fldln2: unit -> unit - val fldz: unit -> unit - val fmul: arg -> unit - val fmulp: arg -> arg -> unit - val fnstcw: arg -> unit - val fnstsw: arg -> unit - val fpatan: unit -> unit - val fptan: unit -> unit - val fsin: unit -> unit - val fsqrt: unit -> unit - val fstp: arg -> unit - val fsub: arg -> unit - val fsubp: arg -> arg -> unit - val fsubr: arg -> unit - val fsubrp: arg -> arg -> unit - val fxch: arg -> unit - val fyl2x: unit -> unit val hlt: unit -> unit val idiv: arg -> unit val imul: arg -> arg option -> unit diff --git a/backend/x86_gas.ml b/backend/x86_gas.ml index 76fdff5229b..e88e5efd708 100644 --- a/backend/x86_gas.ml +++ b/backend/x86_gas.ml @@ -64,7 +64,7 @@ let arg b = function | Reg16 x -> print_reg b string_of_reg16 x | Reg32 x -> print_reg b string_of_reg32 x | Reg64 x -> print_reg b string_of_reg64 x - | Regf x -> print_reg b string_of_registerf x + | Regf x -> print_reg b string_of_regf x | Mem addr -> arg_mem b addr | Mem64_RIP (_, s, displ) -> bprintf b "%s%a(%%rip)" s opt_displ displ @@ -143,46 +143,6 @@ let print_instr b = function | CVTTSD2SI (arg1, arg2) -> i2_s b "cvttsd2si" arg1 arg2 | DEC arg -> i1_s b "dec" arg | DIVSD (arg1, arg2) -> i2 b "divsd" arg1 arg2 - | FABS -> i0 b "fabs" - | FADD arg -> i1_s b "fadd" arg - | FADDP (arg1, arg2) -> i2 b "faddp" arg1 arg2 - | FCHS -> i0 b "fchs" - | FCOMP arg -> i1_s b "fcomp" arg - | FCOMPP -> i0 b "fcompp" - | FCOS -> i0 b "fcos" - | FDIV arg -> i1_s b "fdiv" arg - | FDIVP (Regf (ST 0), arg2) -> i2 b "fdivrp" (Regf (ST 0)) arg2 (* bug *) - | FDIVP (arg1, arg2) -> i2 b "fdivp" arg1 arg2 - | FDIVR arg -> i1_s b "fdivr" arg - | FDIVRP (Regf (ST 0), arg2) -> i2 b "fdivp" (Regf (ST 0)) arg2 (* bug *) - | FDIVRP (arg1, arg2) -> i2 b "fdivrp" arg1 arg2 - | FILD arg -> i1_s b "fild" arg - | FISTP arg -> i1_s b "fistp" arg - | FLD (Mem {typ=REAL4; _} as arg) -> i1 b "flds" arg - | FLD arg -> i1 b "fldl" arg - | FLD1 -> i0 b "fld1" - | FLDCW arg -> i1 b "fldcw" arg - | FLDLG2 -> i0 b "fldlg2" - | FLDLN2 -> i0 b "fldln2" - | FLDZ -> i0 b "fldz" - | FMUL arg -> i1_s b "fmul" arg - | FMULP (arg1, arg2) -> i2 b "fmulp" arg1 arg2 - | FNSTCW arg -> i1 b "fnstcw" arg - | FNSTSW arg -> i1 b "fnstsw" arg - | FPATAN -> i0 b "fpatan" - | FPTAN -> i0 b "fptan" - | FSIN -> i0 b "fsin" - | FSQRT -> i0 b "fsqrt" - | FSTP (Mem {typ=REAL4; _} as arg) -> i1 b "fstps" arg - | FSTP arg -> i1 b "fstpl" arg - | FSUB arg -> i1_s b "fsub" arg - | FSUBP (Regf (ST 0), arg2) -> i2 b "fsubrp" (Regf (ST 0)) arg2 (* bug *) - | FSUBP (arg1, arg2) -> i2 b "fsubp" arg1 arg2 - | FSUBR arg -> i1_s b "fsubr" arg - | FSUBRP (Regf (ST 0), arg2) -> i2 b "fsubp" (Regf (ST 0)) arg2 (* bug *) - | FSUBRP (arg1, arg2) -> i2 b "fsubrp" arg1 arg2 - | FXCH arg -> i1 b "fxch" arg - | FYL2X -> i0 b "fyl2x" | HLT -> i0 b "hlt" | IDIV arg -> i1_s b "idiv" arg | IMUL (arg, None) -> i1_s b "imul" arg diff --git a/backend/x86_masm.ml b/backend/x86_masm.ml index 0c691eb56fb..ae78851ec58 100644 --- a/backend/x86_masm.ml +++ b/backend/x86_masm.ml @@ -81,7 +81,7 @@ let arg b = function | Reg16 x -> Buffer.add_string b (string_of_reg16 x) | Reg32 x -> Buffer.add_string b (string_of_reg32 x) | Reg64 x -> Buffer.add_string b (string_of_reg64 x) - | Regf x -> Buffer.add_string b (string_of_registerf x) + | Regf x -> Buffer.add_string b (string_of_regf x) (* We don't need to specify RIP on Win64, since EXTERN will provide the list of external symbols that need this addressing mode, and @@ -139,40 +139,6 @@ let print_instr b = function | CVTTSD2SI (arg1, arg2) -> i2 b "cvttsd2si" arg1 arg2 | DEC arg -> i1 b "dec" arg | DIVSD (arg1, arg2) -> i2 b "divsd" arg1 arg2 - | FABS -> i0 b "fabs" - | FADD arg -> i1 b "fadd" arg - | FADDP (arg1, arg2) -> i2 b "faddp" arg1 arg2 - | FCHS -> i0 b "fchs" - | FCOMP arg -> i1 b "fcomp" arg - | FCOMPP -> i0 b "fcompp" - | FCOS -> i0 b "fcos" - | FDIV arg -> i1 b "fdiv" arg - | FDIVP (arg1, arg2) -> i2 b "fdivp" arg1 arg2 - | FDIVR arg -> i1 b "fdivr" arg - | FDIVRP (arg1, arg2) -> i2 b "fdivrp" arg1 arg2 - | FILD arg -> i1 b "fild" arg - | FISTP arg -> i1 b "fistp" arg - | FLD arg -> i1 b "fld" arg - | FLD1 -> i0 b "fld1" - | FLDCW arg -> i1 b "fldcw" arg - | FLDLG2 -> i0 b "fldlg2" - | FLDLN2 -> i0 b "fldln2" - | FLDZ -> i0 b "fldz" - | FMUL arg -> i1 b "fmul" arg - | FMULP (arg1, arg2) -> i2 b "fmulp" arg1 arg2 - | FNSTCW arg -> i1 b "fnstcw" arg - | FNSTSW arg -> i1 b "fnstsw" arg - | FPATAN -> i0 b "fpatan" - | FPTAN -> i0 b "fptan" - | FSIN -> i0 b "fsin" - | FSQRT -> i0 b "fsqrt" - | FSTP arg -> i1 b "fstp" arg - | FSUB arg -> i1 b "fsub" arg - | FSUBP (arg1, arg2) -> i2 b "fsubp" arg1 arg2 - | FSUBR arg -> i1 b "fsubr" arg - | FSUBRP (arg1, arg2) -> i2 b "fsubrp" arg1 arg2 - | FXCH arg -> i1 b "fxch" arg - | FYL2X -> i0 b "fyl2x" | HLT -> assert false | IDIV arg -> i1 b "idiv" arg | IMUL (arg, None) -> i1 b "imul" arg diff --git a/backend/x86_proc.ml b/backend/x86_proc.ml index 68bf41e5bf8..b5bf6734884 100644 --- a/backend/x86_proc.ml +++ b/backend/x86_proc.ml @@ -238,10 +238,8 @@ let string_of_reg32 = function | R14 -> "r14d" | R15 -> "r15d" -let string_of_registerf = function +let string_of_regf = function | XMM n -> Printf.sprintf "xmm%d" n - | TOS -> Printf.sprintf "tos" - | ST n -> Printf.sprintf "st(%d)" n let string_of_condition = function | E -> "e" diff --git a/backend/x86_proc.mli b/backend/x86_proc.mli index aa18668d844..80d0ca1d6f4 100644 --- a/backend/x86_proc.mli +++ b/backend/x86_proc.mli @@ -25,7 +25,7 @@ val string_of_reg8h: reg8h -> string val string_of_reg16: reg64 -> string val string_of_reg32: reg64 -> string val string_of_reg64: reg64 -> string -val string_of_registerf: registerf -> string +val string_of_regf: regf -> string val string_of_substring_literal: int -> int -> string -> string val string_of_string_literal: string -> string val string_of_condition: condition -> string @@ -90,7 +90,7 @@ val windows:bool val use_plt : bool module Section_name : sig - type t + type t val equal : t -> t -> bool val hash : t -> int val compare : t -> t -> int From b7e376d2586d7a4b54f9feebb9209a726ed3297a Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Tue, 11 Jul 2023 14:40:42 -0400 Subject: [PATCH 73/81] missed a merge conflict --- backend/x86_binary_emitter.ml | 87 ----------------------------------- 1 file changed, 87 deletions(-) diff --git a/backend/x86_binary_emitter.ml b/backend/x86_binary_emitter.ml index 2495ec7da67..09ab0ed0d22 100644 --- a/backend/x86_binary_emitter.ml +++ b/backend/x86_binary_emitter.ml @@ -1194,15 +1194,6 @@ let emit_MOVZX b dst src = emit_mod_rm_reg b 0 [ 0x0F; 0xB7 ] rm reg | _ -> assert false -<<<<<<< HEAD -let emit_FSTP b dst = - match dst with - | Mem { typ = REAL8 | QWORD } as rm -> emit_mod_rm_reg b 0 [ 0xDD ] rm 3 - | Mem { typ = REAL4 } as rm -> emit_mod_rm_reg b 0 [ 0xD9 ] rm 3 - | _ -> assert false - -======= ->>>>>>> upstream/remove-x87 let emit_neg b dst = match dst with | (Reg64 _ | Reg32 _ | Mem _ | Mem64_RIP _) as rm -> @@ -1400,84 +1391,6 @@ let emit_BSWAP b = function buf_opcodes b [ 0x0F; 0xC8 + reg7 reg ] | _ -> assert false -<<<<<<< HEAD -let emit_FLDCW b = function - | (Mem _ | Mem64_RIP _) as rm -> emit_mod_rm_reg b no_rex [ 0xD9 ] rm 5 - | _ -> assert false - -let emit_FXCH _b = function - | _ -> assert false - -let emit_FLD b = function - | Mem { typ = REAL4 | DWORD } as rm -> emit_mod_rm_reg b 0 [ 0xD9 ] rm 0 - | Mem { typ = REAL8 | QWORD } as rm -> emit_mod_rm_reg b 0 [ 0xDD ] rm 0 - | _ -> assert false - -let emit_FCOMP b = function - | Mem { typ = REAL4 | DWORD } as rm -> emit_mod_rm_reg b no_rex [ 0xD8 ] rm 3 - | Mem { typ = REAL8 | QWORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDC ] rm 3 - | _ -> assert false - -let emit_FXXX reg b rm = - match rm with - | Mem { typ = REAL4 | DWORD } -> emit_mod_rm_reg b no_rex [ 0xD8 ] rm reg - | Mem { typ = REAL8 | QWORD } -> emit_mod_rm_reg b no_rex [ 0xDC ] rm reg - | _ -> assert false - -let emit_FADD = emit_FXXX 0 - -let emit_FMUL = emit_FXXX 1 - -(* let emit_FCOM = emit_FXXX 2 *) -(* let emit_FCOMP = emit_FXXX 3 *) -let emit_FSUB = emit_FXXX 4 - -let emit_FSUBR = emit_FXXX 5 - -let emit_FDIV = emit_FXXX 6 - -let emit_FDIVR = emit_FXXX 7 - -let emit_FILD b = function - | Mem { typ = QWORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDF ] rm 5 - | Mem { typ = DWORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDB ] rm 0 - | Mem { typ = WORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDF ] rm 0 - | _ -> assert false - -let emit_FISTP b = function - | Mem { typ = WORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDF ] rm 3 - | Mem { typ = DWORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDB ] rm 3 - | Mem { typ = QWORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDF ] rm 7 - | _ -> assert false - -let emit_FNSTCW b = function - | Mem { typ = NONE | WORD } as rm -> - emit_mod_rm_reg b no_rex [ 0x9B; 0xD9 ] rm 7 - | _ -> assert false - -let emit_FNSTSW b = function - | Reg16 RAX -> buf_opcodes b [ 0xDF; 0xE0 ] - | Mem { typ = NONE | WORD } as rm -> emit_mod_rm_reg b no_rex [ 0xDD ] rm 7 - | _ -> assert false - -let emit_FXXXP _opcode _b a1 a2 = - match (a1, a2) with - | _ -> assert false - -let emit_FADDP b = emit_FXXXP 0xC0 b - -let emit_FMULP b = emit_FXXXP 0xC8 b - -let emit_FSUBRP b = emit_FXXXP 0xE0 b - -let emit_FSUBP b = emit_FXXXP 0xE8 b - -let emit_FDIVRP b = emit_FXXXP 0xF0 b - -let emit_FDIVP b = emit_FXXXP 0xF8 b - -======= ->>>>>>> upstream/remove-x87 let emit_XCHG b src dst = (* TODO: test ! *) match (dst, src) with From 8b1e567a6322066eae764a04f5ca872bd7aa802b Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Tue, 11 Jul 2023 14:47:49 -0400 Subject: [PATCH 74/81] delete arm64 class_of --- backend/arm64/proc.ml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/backend/arm64/proc.ml b/backend/arm64/proc.ml index ce090ba538a..d0d005605ad 100644 --- a/backend/arm64/proc.ml +++ b/backend/arm64/proc.ml @@ -101,11 +101,6 @@ let register_name ty r = let rotate_registers = true -let class_of reg = - if reg < 100 then 0 - else if reg < 200 then 1 - else Misc.fatal_errorf "Register of unknown class (%d)" reg - (* Representation of hard registers by pseudo-registers *) let hard_int_reg = From 19ca0a245a886130a4e53986cb94bd4a1841407f Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Tue, 11 Jul 2023 14:49:01 -0400 Subject: [PATCH 75/81] and duplicate arm64 phys_reg --- backend/arm64/proc.ml | 3 --- 1 file changed, 3 deletions(-) diff --git a/backend/arm64/proc.ml b/backend/arm64/proc.ml index d0d005605ad..1e75f0820c8 100644 --- a/backend/arm64/proc.ml +++ b/backend/arm64/proc.ml @@ -129,9 +129,6 @@ let phys_reg ty n = (* CR mslater: (SIMD) arm64 *) | Vec128 -> fatal_error "arm64: got vec128 register" -let phys_reg ty n = - Reg.at_location ty (Reg n) - let reg_x8 = phys_reg Int 8 let reg_d7 = phys_reg Float 107 From 22db95ba9b46df7de512fb002040d2560aa1c3fc Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Tue, 11 Jul 2023 14:56:51 -0400 Subject: [PATCH 76/81] and restore printmach.loc --- backend/regalloc/regalloc_validate.ml | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/backend/regalloc/regalloc_validate.ml b/backend/regalloc/regalloc_validate.ml index baf1720d10f..53d83347919 100644 --- a/backend/regalloc/regalloc_validate.ml +++ b/backend/regalloc/regalloc_validate.ml @@ -101,13 +101,6 @@ end = struct | Outgoing { index } -> Reg.Outgoing (word_index_to_byte_offset index) | Domainstate { index } -> Reg.Domainstate (word_index_to_byte_offset index) - - let print ppf = function - | Local { index; stack_class } -> - Format.fprintf ppf "s[%s:%i]" (Proc.stack_class_tag stack_class) index - | Incoming { index } -> Format.fprintf ppf "par[%i]" index - | Outgoing { index } -> Format.fprintf ppf "arg[%i]" index - | Domainstate { index } -> Format.fprintf ppf "ds[%i]" index end type t = @@ -134,9 +127,8 @@ end = struct | Reg idx -> Reg.Reg idx | Stack stack -> Reg.Stack (Stack.to_stack_loc_lossy stack) - let print typ ppf = function - | Reg r -> Format.pp_print_string ppf (Proc.register_name typ r) - | Stack s -> Stack.print ppf s + let print typ ppf t = + Printmach.loc ~unknown:(fun _ -> assert false) ppf (to_loc_lossy t) typ let compare (t1 : t) (t2 : t) : int = (* CR-someday azewierzejew: Implement proper comparison. *) From 6aee9501d29ba7e48373b9952732be02a004094c Mon Sep 17 00:00:00 2001 From: Max Slater Date: Wed, 12 Jul 2023 10:28:17 -0400 Subject: [PATCH 77/81] Update backend/regalloc/regalloc_invariants.ml Co-authored-by: Xavier Clerc --- backend/regalloc/regalloc_invariants.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/regalloc/regalloc_invariants.ml b/backend/regalloc/regalloc_invariants.ml index ebc6a68f4d3..28da9c0f829 100644 --- a/backend/regalloc/regalloc_invariants.ml +++ b/backend/regalloc/regalloc_invariants.ml @@ -147,7 +147,7 @@ let postcondition_layout : Cfg_with_layout.t -> unit = unit = match reg.Reg.loc with | Reg phys_reg -> ( - try Proc.phys_reg reg.typ phys_reg |> ignore + try let _ : Reg.t = Proc.phys_reg reg.typ phys_reg in () with Invalid_argument _ -> fatal "instruction %d assigned %a to register %i, which has an \ From ad350a256c0b9dd4ad1b5813312eb2bc3ec5f5ae Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Wed, 12 Jul 2023 11:05:40 -0400 Subject: [PATCH 78/81] final edits --- backend/amd64/emit.mlp | 18 ++++++++++++------ backend/amd64/proc.ml | 14 ++++---------- backend/proc.mli | 2 +- backend/regalloc/regalloc_irc.ml | 2 +- backend/regalloc/regalloc_irc_state.ml | 20 ++++++++++++-------- backend/regalloc/regalloc_irc_utils.mli | 2 +- 6 files changed, 31 insertions(+), 27 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index e25199a4479..1c87348567f 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -718,18 +718,24 @@ let emit_global_label s = let move (src : Reg.t) (dst : Reg.t) = if src.loc <> dst.loc then begin match src.typ, src.loc, dst.typ, dst.loc with - | Float, Reg.Reg _, Float, Reg.Reg _ - | Vec128, Reg.Reg _, Vec128, Reg.Reg _ -> I.movapd (reg src) (reg dst) + | (Float | Vec128), Reg.Reg _, (Float | Vec128), Reg.Reg _ -> + I.movapd (reg src) (reg dst) | Vec128, _, Vec128, _ -> I.movupd (reg src) (reg dst) - | Float, _, Float, _ -> I.movsd (reg src) (reg dst) - | Float, _, Int, _ - | Int, _, Float, _ -> I.movq (reg src) (reg dst) + | Float, _, Float, _ -> + I.movsd (reg src) (reg dst) + | Float, _, Int, _ | Int, _, Float, _ -> + I.movq (reg src) (reg dst) + | (Int | Val | Addr), _, (Int | Val | Addr), _ -> + I.mov (reg src) (reg dst) | Vec128, _, _, _ | _, _, Vec128, _ -> Misc.fatal_errorf "Illegal move between a vector and non-vector register (%s to %s)\n" (Reg.name src) (Reg.name dst) - | _ -> I.mov (reg src) (reg dst) + | Float, _, (Val | Addr), _ | (Val | Addr), _, Float, _ -> + Misc.fatal_errorf + "Illegal move between a float and val/addr register (%s to %s)\n" + (Reg.name src) (Reg.name dst) end let stack_to_stack_move (src : Reg.t) (dst : Reg.t) = diff --git a/backend/amd64/proc.ml b/backend/amd64/proc.ml index 73732c94d61..dc08ca0ce12 100644 --- a/backend/amd64/proc.ml +++ b/backend/amd64/proc.ml @@ -653,17 +653,11 @@ let init () = end else num_available_registers.(0) <- 13 -(* Precolored_regs is always the same as [all_phys_regs], as some physical registers +(* Precolored_regs is not always the same as [all_phys_regs], as some physical registers may not be allocatable (e.g. rbp when frame pointers are enabled). *) -let all_phys_regs_minus_fp = - let hard_int_reg = Array.sub hard_int_reg 0 12 in - let basic_regs = Array.append hard_int_reg hard_float_reg in - fun () -> if !simd_regalloc_support - then Array.append basic_regs (hard_vec128_reg ()) - else basic_regs - -let precolored_regs = - if fp then all_phys_regs_minus_fp else all_phys_regs +let precolored_regs () = + let phys_regs = Reg.set_of_array (all_phys_regs ()) in + if fp then Reg.Set.remove rbp phys_regs else phys_regs let operation_supported = function | Cpopcnt -> !popcnt_support diff --git a/backend/proc.mli b/backend/proc.mli index f4e7f9c2b5b..f541a790cc4 100644 --- a/backend/proc.mli +++ b/backend/proc.mli @@ -26,7 +26,7 @@ val first_available_register: int array val register_name: Cmm.machtype_component -> int -> string val phys_reg: Cmm.machtype_component -> int -> Reg.t val rotate_registers: bool -val precolored_regs : unit -> Reg.t array +val precolored_regs : unit -> Reg.Set.t (* The number of stack slot classes may differ from the number of register classes. On x86, we use the same class for floating point and SIMD vector registers, diff --git a/backend/regalloc/regalloc_irc.ml b/backend/regalloc/regalloc_irc.ml index 82f33751600..84e5b70f095 100644 --- a/backend/regalloc/regalloc_irc.ml +++ b/backend/regalloc/regalloc_irc.ml @@ -526,6 +526,6 @@ let run : Cfg_with_infos.t -> Cfg_with_infos.t = state ~f:(fun () -> update_register_locations (); - Array.iter (all_precolored_regs ()) ~f:(fun reg -> reg.Reg.degree <- 0)) + Reg.Set.iter (fun reg -> reg.Reg.degree <- 0) (all_precolored_regs ())) cfg_with_infos; cfg_with_infos diff --git a/backend/regalloc/regalloc_irc_state.ml b/backend/regalloc/regalloc_irc_state.ml index e06c76cfec2..abe423381aa 100644 --- a/backend/regalloc/regalloc_irc_state.ml +++ b/backend/regalloc/regalloc_irc_state.ml @@ -60,7 +60,8 @@ let[@inline] make ~initial ~stack_slots ~next_instruction_id () = reg.Reg.interf <- []; reg.Reg.degree <- 0); List.iter initial ~f:(fun reg -> reg.Reg.irc_work_list <- Initial); - Array.iter (all_precolored_regs ()) ~f:(fun reg -> + Reg.Set.iter + (fun reg -> reg.Reg.irc_work_list <- Reg.Precolored; reg.Reg.irc_color <- (match reg.Reg.loc with @@ -70,7 +71,8 @@ let[@inline] make ~initial ~stack_slots ~next_instruction_id () = Printmach.reg reg); reg.Reg.irc_alias <- None; reg.Reg.interf <- []; - reg.Reg.degree <- Degree.infinite); + reg.Reg.degree <- Degree.infinite) + (all_precolored_regs ()); let num_registers = List.length initial in let original_capacity = Int.min max_capacity num_registers in let simplify_work_list = RegWorkList.make ~original_capacity in @@ -140,7 +142,8 @@ let[@inline] reset state ~new_temporaries = reg.Reg.irc_alias <- None; reg.Reg.interf <- []; reg.Reg.degree <- 0); - Array.iter (all_precolored_regs ()) ~f:(fun reg -> + Reg.Set.iter + (fun reg -> assert (reg.Reg.irc_work_list = Reg.Precolored); (match reg.Reg.loc, reg.Reg.irc_color with | Reg color, Some color' -> assert (color = color') @@ -148,7 +151,8 @@ let[@inline] reset state ~new_temporaries = | (Unknown | Stack _), _ -> assert false); reg.Reg.irc_alias <- None; reg.Reg.interf <- []; - assert (reg.Reg.degree = Degree.infinite)); + assert (reg.Reg.degree = Degree.infinite)) + (all_precolored_regs ()); state.initial <- Doubly_linked_list.of_list new_temporaries; Doubly_linked_list.transfer ~from:state.colored_nodes ~to_:state.initial (); RegWorkList.iter state.coalesced_nodes ~f:(fun reg -> @@ -534,10 +538,10 @@ let[@inline] invariant state = then ( (* interf (list) is morally a set *) List.iter (Reg.all_registers ()) ~f:check_inter_has_no_duplicates; - Array.iter (all_precolored_regs ()) ~f:check_inter_has_no_duplicates; + Reg.Set.iter check_inter_has_no_duplicates (all_precolored_regs ()); (* register sets are disjoint *) check_disjoint ~is_disjoint:Reg.Set.disjoint - [ "precolored", Reg.set_of_array (all_precolored_regs ()); + [ "precolored", all_precolored_regs (); "initial", reg_set_of_doubly_linked_list state.initial; "simplify_work_list", reg_set_of_reg_work_list state.simplify_work_list; "freeze_work_list", reg_set_of_reg_work_list state.freeze_work_list; @@ -547,7 +551,7 @@ let[@inline] invariant state = "colored_nodes", reg_set_of_doubly_linked_list state.colored_nodes; "select_stack", Reg.Set.of_list state.select_stack ]; List.iter ~f:check_set_and_field_consistency_reg - [ "precolored", Reg.set_of_array (all_precolored_regs ()), Reg.Precolored; + [ "precolored", all_precolored_regs (), Reg.Precolored; "initial", reg_set_of_doubly_linked_list state.initial, Reg.Initial; ( "simplify_work_list", reg_set_of_reg_work_list state.simplify_work_list, @@ -605,7 +609,7 @@ let[@inline] invariant state = (reg_set_of_reg_work_list state.spill_work_list)) in let work_lists_or_precolored = - Reg.Set.union (Reg.set_of_array (all_precolored_regs ())) work_lists + Reg.Set.union (all_precolored_regs ()) work_lists in Reg.Set.iter (fun u -> diff --git a/backend/regalloc/regalloc_irc_utils.mli b/backend/regalloc/regalloc_irc_utils.mli index 81a3c5f9d59..5333ff04b89 100644 --- a/backend/regalloc/regalloc_irc_utils.mli +++ b/backend/regalloc/regalloc_irc_utils.mli @@ -64,7 +64,7 @@ end val is_move_instruction : Instruction.t -> bool -val all_precolored_regs : unit -> Reg.t array +val all_precolored_regs : unit -> Reg.Set.t val k : Reg.t -> int From b73e2c5b301ea89859a43f87eb81c88fd0fe0349 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Wed, 12 Jul 2023 11:06:26 -0400 Subject: [PATCH 79/81] arm --- backend/arm64/proc.ml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/arm64/proc.ml b/backend/arm64/proc.ml index 1e75f0820c8..7e742cc3955 100644 --- a/backend/arm64/proc.ml +++ b/backend/arm64/proc.ml @@ -120,7 +120,9 @@ let hard_float_reg = let all_phys_regs = Array.append hard_int_reg hard_float_reg -let precolored_regs () = all_phys_regs +let precolored_regs = + let phys_regs = Reg.set_of_array all_phys_regs in + fun () -> phys_regs let phys_reg ty n = match ty with From b73c7b77a37f908f24985dd5dcb43b3145e62855 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Wed, 12 Jul 2023 12:08:38 -0400 Subject: [PATCH 80/81] adjust emit.move --- backend/amd64/emit.mlp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/amd64/emit.mlp b/backend/amd64/emit.mlp index 1c87348567f..58714e7d458 100644 --- a/backend/amd64/emit.mlp +++ b/backend/amd64/emit.mlp @@ -718,13 +718,16 @@ let emit_global_label s = let move (src : Reg.t) (dst : Reg.t) = if src.loc <> dst.loc then begin match src.typ, src.loc, dst.typ, dst.loc with - | (Float | Vec128), Reg.Reg _, (Float | Vec128), Reg.Reg _ -> - I.movapd (reg src) (reg dst) + | Float, Reg.Reg _, Float, Reg.Reg _ | Vec128, _, Vec128, _ -> - I.movupd (reg src) (reg dst) + (* Vec128 stack slots are always aligned. *) + I.movapd (reg src) (reg dst) | Float, _, Float, _ -> I.movsd (reg src) (reg dst) | Float, _, Int, _ | Int, _, Float, _ -> + (* CR-soon gyorsh: this case is used by the bits_of_float/float_of_bits intrinsics. + They should instead generate a separate Ispecific and this case should be + removed. *) I.movq (reg src) (reg dst) | (Int | Val | Addr), _, (Int | Val | Addr), _ -> I.mov (reg src) (reg dst) From 6649ebb9652d4ffc8093f29281d47e6e0034ccf9 Mon Sep 17 00:00:00 2001 From: TheNumbat Date: Wed, 12 Jul 2023 12:21:12 -0400 Subject: [PATCH 81/81] format --- backend/regalloc/regalloc_invariants.ml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/regalloc/regalloc_invariants.ml b/backend/regalloc/regalloc_invariants.ml index 28da9c0f829..7ea23b64233 100644 --- a/backend/regalloc/regalloc_invariants.ml +++ b/backend/regalloc/regalloc_invariants.ml @@ -147,7 +147,9 @@ let postcondition_layout : Cfg_with_layout.t -> unit = unit = match reg.Reg.loc with | Reg phys_reg -> ( - try let _ : Reg.t = Proc.phys_reg reg.typ phys_reg in () + try + let (_ : Reg.t) = Proc.phys_reg reg.typ phys_reg in + () with Invalid_argument _ -> fatal "instruction %d assigned %a to register %i, which has an \