Version française
Home     About     Download     Resources     Contact us    
Browse thread
Strange hugeness of .o, .cmo, and .cmi files
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: John Prevost <prevost@m...>
Subject: Re: Strange hugeness of .o, .cmo, and .cmi files
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... ...]