To: Xavier Leroy <Xavier.Leroy@inria.fr>
Subject: Re: Strange hugeness of .o, .cmo, and .cmi files
From: John Prevost <prevost@maya.com>
Date: 31 Mar 1999 16:36:20 -0500
In-Reply-To: Xavier Leroy's message of "Wed, 31 Mar 1999 17:59:12 +0200"
Xavier Leroy <Xavier.Leroy@inria.fr> writes:
> It's hard to say what's happening without seeing the source or the
> generated assembly code. If that kind of things doesn't scare you,
> just compile with ocamlopt -S and look at the resulting .s file.
> However, I'll venture a guess:
The source is almost exactly as you see, for the most part. I can
package it along to you if you'd like.
The start of the notably huge part of the .s file is at the end of
this message.
> OCaml 2.01 had a known code size problem with the
> { record with lbl = newval } construct, when "record" belongs to a
> type with many labels. This was fixed in OCaml 2.02, however.
I've been using 2.02 nearly since it came out, so it's not a 2.01 vs
2.02 problem. All I'm doing is:
let get_bool e n = try e.booleans.(n) with _ -> false
let get_number e n =
try
let contents = e.numbers.(n) in
if contents = -1 then None else Some contents
with _ -> None
let get_string e n =
try
let start = e.strings.(n) in
if start = -1 then
None
else
let finish = String.index_from e.string_table start '\000' in
Some (String.sub e.string_table start (finish - start))
with _ -> None
let process_entry e =
let get_bool = get_bool e in
let get_number = get_number e in
let get_string = get_string e in
{ auto_left_margin = get_bool 0;
auto_right_margin = get_bool 1;
no_esc_ctlc = get_bool 2;
[ ... for 463 total lines ... ]
enter_right_hl_mode = get_string 389;
enter_top_hl_mode = get_string 390;
enter_vertical_hl_mode = get_string 391 }
I'd guess from the below that it's for some reason making a long entry
in the frametable for each one of the lines above. I don't know
enough about how ocamlopt generates code to know what that means.
John.
Partial .s file:
Terminfo_frametable:
.long 502
.long .L648
.word 4
.word 0
.align 4
.long .L646
.word 16
.word 1
.word 8
.align 4
.long .L645
.word 12
.word 1
.word 0
.align 4
.long .L644
.word 12
.word 1
.word 0
.align 4
.long .L643
.word 12
.word 0
.align 4
.long .L642
.word 12
.word 0
.align 4
.long .L640
.word 12
.word 0
.align 4
.long .L639
.word 12
.word 1
.word 4
.align 4
.long .L638
.word 12
.word 1
.word 0
.align 4
.long .L636
.word 1852
.word 462
.word 0
.word 4
.word 12
.word 16
.word 20
.word 24
.word 28
.word 32
.word 36
.word 40
[ ... counting up by 4 to ... ]
.word 1844
.word 3
.align 4
.long .L633
.word 1852
.word 461
.word 0
.word 4
.word 12
[... again, counting down the .word 461 until it is .word 1, with one
less entry after each time... ]
[... a few more smaller bits... ...]
This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:21 MET