From: Gabriel Scherer <gabriel.scherer@gmail.com>
To: Bob Zhang <bobzhang1988@gmail.com>
Cc: Caml List <caml-list@inria.fr>, Xavier Leroy <Xavier.Leroy@inria.fr>
Subject: Re: [Caml-list] Questions about changing lambda IR
Date: Sat, 8 Aug 2015 16:13:18 +0200 [thread overview]
Message-ID: <CAPFanBGm+OyC9rrBhSKBwF9FwrxSnqrhuAMgCaECLnt8UzHndA@mail.gmail.com> (raw)
In-Reply-To: <CANcqPu4=9AsDKNYBNEUn67_OTWnpHuO05MsLHb_u5AT9+bfk1A@mail.gmail.com>
[-- Attachment #1.1: Type: text/plain, Size: 3007 bytes --]
Attached to this email is the patch I tried. It's exactly your proposed
change, with necessary dummy changes to make it compile. The following
process works reliably on my trunk:
- make world
- apply the patch
- make bootstrap
- make world
On Sat, Aug 8, 2015 at 1:28 PM, Bob Zhang <bobzhang1988@gmail.com> wrote:
> Before I changed Lambda.lambda, and it works, it might be that we
> serialized structured_constant somewhere in the bootstrapping process?
>
> On Sat, Aug 8, 2015 at 7:25 AM, Bob Zhang <bobzhang1988@gmail.com> wrote:
>
>> It does not work for me. Since it fails to compile, I pushed it to
>> another branch https://github.com/bobzhang/ocaml/tree/fails (sorry for
>> the misinformation)
>>
>> I did `git clean -fxd` and try configure, make world, it failed in the
>> same place.
>> Thank you for your time!
>>
>> On Sat, Aug 8, 2015 at 3:37 AM, Gabriel Scherer <
>> gabriel.scherer@gmail.com> wrote:
>>
>>> You need to run "make bootstrap" to avoid having part of the definition
>>> compiled against the stale definition of lambda.cmi. (I just checked that
>>> it works on your change: after a bootrsap, "make world", "make opt", "make
>>> opt.opt" work.)
>>>
>>> On Sat, Aug 8, 2015 at 5:50 AM, Bob Zhang <bobzhang1988@gmail.com>
>>> wrote:
>>>
>>>>
>>>> Dear caml develpers,
>>>>
>>>> I am working on an experimental branch to pass more information from
>>>> typedtree to lambda to enable ocaml generate user readable javascript code(
>>>> https://github.com/bobzhang/ocaml/tree/master) (online-demo:
>>>> http://zhanghongbo.me/js-demo/)
>>>>
>>>> Here I get a segfault, after I change const_block:
>>>> Below is my minimal change:
>>>>
>>>> ```
>>>> type pointer_info =
>>>> | NullConstructor of string
>>>> | NullVariant of string
>>>> | NAPointer
>>>>
>>>> type tag_info =
>>>> | Constructor of string
>>>> | Tuple
>>>> | Variant of string
>>>> | Record
>>>> | NA
>>>>
>>>> type structured_constant =
>>>> Const_base of constant
>>>> | Const_pointer of int * pointer_info
>>>> | Const_block of int * tag_info * structured_constant list
>>>> | Const_float_array of string list
>>>> | Const_immstring of string
>>>> ```
>>>> Note that the enriched info is not used in ``emitcode``, now I get a
>>>> segfault in make world:
>>>>
>>>> ```
>>>> ../../boot/ocamlrun ../../ocamlc -nostdlib -I ../../stdlib -c -w
>>>> +33..39 -warn-error A -bin-annot -g -safe-string -I ../../stdlib -I
>>>> ../../utils -I ../../typing -I ../../bytecomp -I ../../asmcomp
>>>> extract_crc.ml
>>>> ../../boot/ocamlrun ../../ocamlc -nostdlib -I ../../stdlib -o
>>>> extract_crc dynlink.cma extract_crc.cmo
>>>> make[3]: *** [extract_crc] Segmentation fault: 11
>>>> make[3]: *** Deleting file `extract_crc'
>>>> make[2]: *** [otherlibraries] Error 2
>>>> make[1]: *** [all] Error 2
>>>> ```
>>>>
>>>> Any help is appreciated : )
>>>>
>>>> --
>>>> Regards
>>>> -- Hongbo Zhang
>>>>
>>>
>>>
>>
>>
>> --
>> Regards
>> -- Hongbo Zhang
>>
>
>
>
> --
> Regards
> -- Hongbo Zhang
>
[-- Attachment #1.2: Type: text/html, Size: 5009 bytes --]
[-- Attachment #2: change-const_block-representation.patch --]
[-- Type: text/x-patch, Size: 15148 bytes --]
From 02ffdf8f2431f9e2d84c651ef4ebc72c872275b9 Mon Sep 17 00:00:00 2001
From: Gabriel Scherer <gabriel.scherer@gmail.com>
Date: Sat, 8 Aug 2015 09:30:16 +0200
Subject: [PATCH] change const_block representation
---
asmcomp/closure.ml | 4 ++--
bytecomp/emitcode.ml | 10 +++++-----
bytecomp/lambda.ml | 21 +++++++++++++++++----
bytecomp/lambda.mli | 16 ++++++++++++++--
bytecomp/matching.ml | 2 +-
bytecomp/printlambda.ml | 6 +++---
bytecomp/symtable.ml | 6 +++---
bytecomp/translclass.ml | 10 +++++-----
bytecomp/translcore.ml | 18 +++++++++---------
bytecomp/translmod.ml | 12 ++++++------
bytecomp/translobj.ml | 2 +-
tools/dumpobj.ml | 4 ++--
12 files changed, 68 insertions(+), 43 deletions(-)
diff --git a/asmcomp/closure.ml b/asmcomp/closure.ml
index 175932c..569e06b 100644
--- a/asmcomp/closure.ml
+++ b/asmcomp/closure.ml
@@ -822,8 +822,8 @@ let rec close fenv cenv = function
let rec transl = function
| Const_base(Const_int n) -> Uconst_int n
| Const_base(Const_char c) -> Uconst_int (Char.code c)
- | Const_pointer n -> Uconst_ptr n
- | Const_block (tag, fields) ->
+ | Const_pointer (n, _) -> Uconst_ptr n
+ | Const_block (tag, _, fields) ->
str (Uconst_block (tag, List.map transl fields))
| Const_float_array sl ->
(* constant float arrays are really immutable *)
diff --git a/bytecomp/emitcode.ml b/bytecomp/emitcode.ml
index 81e00b7..e3ba00b 100644
--- a/bytecomp/emitcode.ml
+++ b/bytecomp/emitcode.ml
@@ -50,7 +50,7 @@ exception AsInt
let const_as_int = function
| Const_base(Const_int i) -> i
| Const_base(Const_char c) -> Char.code c
- | Const_pointer i -> i
+ | Const_pointer (i, _) -> i
| _ -> raise AsInt
let is_immed i = immed_min <= i && i <= immed_max
@@ -210,11 +210,11 @@ let emit_instr = function
else (out opCONSTINT; out_int i)
| Const_base(Const_char c) ->
out opCONSTINT; out_int (Char.code c)
- | Const_pointer i ->
+ | Const_pointer (i, _) ->
if i >= 0 && i <= 3
then out (opCONST0 + i)
else (out opCONSTINT; out_int i)
- | Const_block(t, []) ->
+ | Const_block(t, _, []) ->
if t = 0 then out opATOM0 else (out opATOM; out_int t)
| _ ->
out opGETGLOBAL; slot_for_literal sc
@@ -336,11 +336,11 @@ let rec emit = function
else (out opPUSHCONSTINT; out_int i)
| Const_base(Const_char c) ->
out opPUSHCONSTINT; out_int(Char.code c)
- | Const_pointer i ->
+ | Const_pointer (i, _) ->
if i >= 0 && i <= 3
then out (opPUSHCONST0 + i)
else (out opPUSHCONSTINT; out_int i)
- | Const_block(t, []) ->
+ | Const_block(t, _, []) ->
if t = 0 then out opPUSHATOM0 else (out opPUSHATOM; out_int t)
| _ ->
out opPUSHGETGLOBAL; slot_for_literal sc
diff --git a/bytecomp/lambda.ml b/bytecomp/lambda.ml
index 7783368..17249b3 100644
--- a/bytecomp/lambda.ml
+++ b/bytecomp/lambda.ml
@@ -154,10 +154,23 @@ and raise_kind =
| Raise_reraise
| Raise_notrace
+
+type pointer_info =
+ | NullConstructor of string
+ | NullVariant of string
+ | NA
+
+type tag_info =
+ | Constructor of string
+ | Tuple
+ | Variant of string
+ | Record
+ | NA
+
type structured_constant =
Const_base of constant
- | Const_pointer of int
- | Const_block of int * structured_constant list
+ | Const_pointer of int * pointer_info
+ | Const_block of int * tag_info * structured_constant list
| Const_float_array of string list
| Const_immstring of string
@@ -226,7 +239,7 @@ and lambda_event_kind =
| Lev_after of Types.type_expr
| Lev_function
-let const_unit = Const_pointer 0
+let const_unit = Const_pointer (0, NA)
let lambda_unit = Lconst const_unit
@@ -549,7 +562,7 @@ let lam_of_loc kind loc =
loc_start.Lexing.pos_cnum + cnum in
match kind with
| Loc_POS ->
- Lconst (Const_block (0, [
+ Lconst (Const_block (0, NA, [
Const_immstring file;
Const_base (Const_int lnum);
Const_base (Const_int cnum);
diff --git a/bytecomp/lambda.mli b/bytecomp/lambda.mli
index eba9593..4cd880a 100644
--- a/bytecomp/lambda.mli
+++ b/bytecomp/lambda.mli
@@ -154,10 +154,22 @@ and raise_kind =
| Raise_reraise
| Raise_notrace
+type pointer_info =
+ | NullConstructor of string
+ | NullVariant of string
+ | NA
+
+type tag_info =
+ | Constructor of string
+ | Tuple
+ | Variant of string
+ | Record
+ | NA
+
type structured_constant =
Const_base of constant
- | Const_pointer of int
- | Const_block of int * structured_constant list
+ | Const_pointer of int * pointer_info
+ | Const_block of int * tag_info * structured_constant list
| Const_float_array of string list
| Const_immstring of string
diff --git a/bytecomp/matching.ml b/bytecomp/matching.ml
index 1bdeef8..fb5fc68 100644
--- a/bytecomp/matching.ml
+++ b/bytecomp/matching.ml
@@ -3000,7 +3000,7 @@ let partial_function loc () =
let (fname, line, char) = Location.get_pos_info loc.Location.loc_start in
Lprim(Praise Raise_regular, [Lprim(Pmakeblock(0, Immutable),
[transl_normal_path Predef.path_match_failure;
- Lconst(Const_block(0,
+ Lconst(Const_block(0, NA,
[Const_base(Const_string (fname, None));
Const_base(Const_int line);
Const_base(Const_int char)]))])])
diff --git a/bytecomp/printlambda.ml b/bytecomp/printlambda.ml
index 591822f3..392293d 100644
--- a/bytecomp/printlambda.ml
+++ b/bytecomp/printlambda.ml
@@ -26,10 +26,10 @@ let rec struct_const ppf = function
| Const_base(Const_int32 n) -> fprintf ppf "%lil" n
| Const_base(Const_int64 n) -> fprintf ppf "%LiL" n
| Const_base(Const_nativeint n) -> fprintf ppf "%nin" n
- | Const_pointer n -> fprintf ppf "%ia" n
- | Const_block(tag, []) ->
+ | Const_pointer (n, _) -> fprintf ppf "%ia" n
+ | Const_block(tag, _, []) ->
fprintf ppf "[%i]" tag
- | Const_block(tag, sc1::scl) ->
+ | Const_block(tag, _, sc1::scl) ->
let sconsts ppf scl =
List.iter (fun sc -> fprintf ppf "@ %a" struct_const sc) scl in
fprintf ppf "@[<1>[%i:@ @[%a%a@]]@]" tag struct_const sc1 sconsts scl
diff --git a/bytecomp/symtable.ml b/bytecomp/symtable.ml
index a0ce273..57a567e 100644
--- a/bytecomp/symtable.ml
+++ b/bytecomp/symtable.ml
@@ -142,7 +142,7 @@ let init () =
try List.assoc name Predef.builtin_values
with Not_found -> fatal_error "Symtable.init" in
let c = slot_for_setglobal id in
- let cst = Const_block(Obj.object_tag,
+ let cst = Const_block(Obj.object_tag, NA,
[Const_base(Const_string (name, None));
Const_base(Const_int (-i-1))
])
@@ -213,9 +213,9 @@ let rec transl_const = function
| Const_base(Const_int32 i) -> Obj.repr i
| Const_base(Const_int64 i) -> Obj.repr i
| Const_base(Const_nativeint i) -> Obj.repr i
- | Const_pointer i -> Obj.repr i
+ | Const_pointer (i, _) -> Obj.repr i
| Const_immstring s -> Obj.repr s
- | Const_block(tag, fields) ->
+ | Const_block(tag, _, fields) ->
let block = Obj.new_block tag (List.length fields) in
let pos = ref 0 in
List.iter
diff --git a/bytecomp/translclass.ml b/bytecomp/translclass.ml
index f172e9a..6ee6579 100644
--- a/bytecomp/translclass.ml
+++ b/bytecomp/translclass.ml
@@ -48,9 +48,9 @@ let lfield v i = Lprim(Pfield i, [Lvar v])
let transl_label l = share (Const_immstring l)
let transl_meth_list lst =
- if lst = [] then Lconst (Const_pointer 0) else
+ if lst = [] then Lconst (Const_pointer (0, NA)) else
share (Const_block
- (0, List.map (fun lab -> Const_immstring lab) lst))
+ (0, NA, List.map (fun lab -> Const_immstring lab) lst))
let set_inst_var obj id expr =
let kind = if Typeopt.maybe_pointer expr then Paddrarray else Pintarray in
@@ -358,7 +358,7 @@ let rec build_class_init cla cstr super inh_init cl_init msubst top cl =
(inh_init,
Llet (Strict, inh,
mkappl(oo_prim "inherits", narrow_args @
- [lpath; Lconst(Const_pointer(if top then 1 else 0))]),
+ [lpath; Lconst(Const_pointer((if top then 1 else 0), NA))]),
Llet(StrictOpt, obj_init, lfield inh 0, cl_init)))
| _ ->
let core cl_init =
@@ -503,7 +503,7 @@ let rec builtin_meths self env env2 body =
| Lprim(Parrayrefu _, [Lvar s; Lvar n]) when List.mem s self ->
"var", [Lvar n]
| Lprim(Pfield n, [Lvar e]) when Ident.same e env ->
- "env", [Lvar env2; Lconst(Const_pointer n)]
+ "env", [Lvar env2; Lconst(Const_pointer (n, NA))]
| Lsend(Self, met, Lvar s, [], _) when List.mem s self ->
"meth", [met]
| _ -> raise Not_found
@@ -574,7 +574,7 @@ module M = struct
| "send_env" -> SendEnv
| "send_meth" -> SendMeth
| _ -> assert false
- in Lconst(Const_pointer(Obj.magic tag)) :: args
+ in Lconst(Const_pointer(Obj.magic tag, NA)) :: args
end
open M
diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml
index e7f5a3a..f145050 100644
--- a/bytecomp/translcore.ml
+++ b/bytecomp/translcore.ml
@@ -648,7 +648,7 @@ let assert_failed exp =
Lprim(Praise Raise_regular, [event_after exp
(Lprim(Pmakeblock(0, Immutable),
[transl_normal_path Predef.path_assert_failure;
- Lconst(Const_block(0,
+ Lconst(Const_block(0, NA,
[Const_base(Const_string (fname, None));
Const_base(Const_int line);
Const_base(Const_int char)]))]))])
@@ -779,7 +779,7 @@ and transl_exp0 e =
| Texp_tuple el ->
let ll = transl_list el in
begin try
- Lconst(Const_block(0, List.map extract_constant ll))
+ Lconst(Const_block(0, NA, List.map extract_constant ll))
with Not_constant ->
Lprim(Pmakeblock(0, Immutable), ll)
end
@@ -790,10 +790,10 @@ and transl_exp0 e =
| _ -> assert false
end else begin match cstr.cstr_tag with
Cstr_constant n ->
- Lconst(Const_pointer n)
+ Lconst(Const_pointer (n, NA))
| Cstr_block n ->
begin try
- Lconst(Const_block(n, List.map extract_constant ll))
+ Lconst(Const_block(n, NA, List.map extract_constant ll))
with Not_constant ->
Lprim(Pmakeblock(n, Immutable), ll)
end
@@ -807,11 +807,11 @@ and transl_exp0 e =
| Texp_variant(l, arg) ->
let tag = Btype.hash_variant l in
begin match arg with
- None -> Lconst(Const_pointer tag)
+ None -> Lconst(Const_pointer (tag, NA))
| Some arg ->
let lam = transl_exp arg in
try
- Lconst(Const_block(0, [Const_base(Const_int tag);
+ Lconst(Const_block(0, NA, [Const_base(Const_int tag);
extract_constant lam]))
with Not_constant ->
Lprim(Pmakeblock(0, Immutable),
@@ -849,7 +849,7 @@ and transl_exp0 e =
let master =
match kind with
| Paddrarray | Pintarray ->
- Lconst(Const_block(0, cl))
+ Lconst(Const_block(0, NA, cl))
| Pfloatarray ->
Lconst(Const_float_array(List.map extract_float cl))
| Pgenarray ->
@@ -1154,8 +1154,8 @@ and transl_record env all_labels repres lbl_expr_list opt_init_expr =
if mut = Mutable then raise Not_constant;
let cl = List.map extract_constant ll in
match repres with
- | Record_regular -> Lconst(Const_block(0, cl))
- | Record_inlined tag -> Lconst(Const_block(tag, cl))
+ | Record_regular -> Lconst(Const_block(0, NA, cl))
+ | Record_inlined tag -> Lconst(Const_block(tag, NA, cl))
| Record_float ->
Lconst(Const_float_array(List.map extract_float cl))
| Record_extension ->
diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml
index 4ff70b7..896eaae 100644
--- a/bytecomp/translmod.ml
+++ b/bytecomp/translmod.ml
@@ -189,7 +189,7 @@ let mod_prim name =
let undefined_location loc =
let (fname, line, char) = Location.get_pos_info loc.Location.loc_start in
- Lconst(Const_block(0,
+ Lconst(Const_block(0, NA,
[Const_base(Const_string (fname, None));
Const_base(Const_int line);
Const_base(Const_int char)]))
@@ -200,9 +200,9 @@ let init_shape modl =
Mty_ident _ ->
raise Not_found
| Mty_alias _ ->
- Const_block (1, [Const_pointer 0])
+ Const_block (1, NA, [Const_pointer (0, NA)])
| Mty_signature sg ->
- Const_block(0, [Const_block(0, init_shape_struct env sg)])
+ Const_block(0, NA, [Const_block(0, NA, init_shape_struct env sg)])
| Mty_functor(id, arg, res) ->
raise Not_found (* can we do better? *)
and init_shape_struct env sg =
@@ -212,9 +212,9 @@ let init_shape modl =
let init_v =
match Ctype.expand_head env vdesc.val_type with
{desc = Tarrow(_,_,_,_)} ->
- Const_pointer 0 (* camlinternalMod.Function *)
+ Const_pointer (0, NA) (* camlinternalMod.Function *)
| {desc = Tconstr(p, _, _)} when Path.same p Predef.path_lazy_t ->
- Const_pointer 1 (* camlinternalMod.Lazy *)
+ Const_pointer (1, NA) (* camlinternalMod.Lazy *)
| _ -> raise Not_found in
init_v :: init_shape_struct env rem
| Sig_type(id, tdecl, _) :: rem ->
@@ -227,7 +227,7 @@ let init_shape modl =
| Sig_modtype(id, minfo) :: rem ->
init_shape_struct (Env.add_modtype id minfo env) rem
| Sig_class(id, cdecl, _) :: rem ->
- Const_pointer 2 (* camlinternalMod.Class *)
+ Const_pointer (2, NA) (* camlinternalMod.Class *)
:: init_shape_struct env rem
| Sig_class_type(id, ctyp, _) :: rem ->
init_shape_struct env rem
diff --git a/bytecomp/translobj.ml b/bytecomp/translobj.ml
index 02731ec..37a0516 100644
--- a/bytecomp/translobj.ml
+++ b/bytecomp/translobj.ml
@@ -31,7 +31,7 @@ let consts : (structured_constant, Ident.t) Hashtbl.t = Hashtbl.create 17
let share c =
match c with
- Const_block (n, l) when l <> [] ->
+ Const_block (n, _, l) when l <> [] ->
begin try
Lvar (Hashtbl.find consts c)
with Not_found ->
diff --git a/tools/dumpobj.ml b/tools/dumpobj.ml
index 7fd3e43..68559b0 100644
--- a/tools/dumpobj.ml
+++ b/tools/dumpobj.ml
@@ -88,8 +88,8 @@ let rec print_struct_const = function
| Const_base(Const_int32 i) -> printf "%ldl" i
| Const_base(Const_nativeint i) -> printf "%ndn" i
| Const_base(Const_int64 i) -> printf "%LdL" i
- | Const_pointer n -> printf "%da" n
- | Const_block(tag, args) ->
+ | Const_pointer (n, _) -> printf "%da" n
+ | Const_block(tag, _, args) ->
printf "<%d>" tag;
begin match args with
[] -> ()
--
2.1.0
next prev parent reply other threads:[~2015-08-08 14:14 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-08 3:50 Bob Zhang
2015-08-08 7:37 ` Gabriel Scherer
2015-08-08 11:25 ` Bob Zhang
2015-08-08 11:28 ` Bob Zhang
2015-08-08 14:13 ` Gabriel Scherer [this message]
2015-08-10 2:45 ` Bob Zhang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAPFanBGm+OyC9rrBhSKBwF9FwrxSnqrhuAMgCaECLnt8UzHndA@mail.gmail.com \
--to=gabriel.scherer@gmail.com \
--cc=Xavier.Leroy@inria.fr \
--cc=bobzhang1988@gmail.com \
--cc=caml-list@inria.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox