| Anonymous | Login | Signup for a new account | 2013-05-24 17:35 CEST | ![]() |
| Main | My View | View Issues | Change Log | Roadmap |
| View Issue Details [ Jump to Notes ] | [ Issue History ] [ Print ] | |||||||||||
| ID | Project | Category | View Status | Date Submitted | Last Update | |||||||
| 0005355 | OCaml | OCaml general | public | 2011-09-06 00:03 | 2012-03-14 10:45 | |||||||
| Reporter | jfc | |||||||||||
| Assigned To | ||||||||||||
| Priority | normal | Severity | minor | Reproducibility | always | |||||||
| Status | resolved | Resolution | no change required | |||||||||
| Platform | OS | OS Version | ||||||||||
| Product Version | 3.12.1 | |||||||||||
| Target Version | Fixed in Version | |||||||||||
| Summary | 0005355: Sys.word_size and related fields should be constants | |||||||||||
| Description | I want to make some code conditional at compile time on the word size, i.e. I don't want the comparison word_size=64 to be done at runtime. In OCaml 3.12 Sys.word_size is initialized by a function call at program startup. The value is not available to the compiler. However, the value will not change from compile to runtime. It should be treated as a constant the same as sizeof() in C. I have sample code showing where this matters. I attached a diff showing how to make Sys.word_size a constant. Pervasives.max_int and related values should be treated the same way. See caml-list traffic of September 5, 2011 for more background. | |||||||||||
| Additional Information | module type M = sig type t val add : t -> t -> t val of_int : int -> t end;; module Int : M = struct type t = int let add = (+) let of_int x = x end;; module M = (val (if Sys.word_size = 64 then (module Int : M) else (module Int32 : M)) : M);; (* The intent is for the module M to provide the usual int operations on a 64 bit system and degenerate to boxed integers and function calls on 32 bit systems. This is appropriate when an integer of 32-63 bits is required. In OCaml 3.12 the test (Sys.word_size = 64) is done at runtime and the functions below make indirect calls through the module. If Sys.word_size is changed to a compile time constant ocamlopt looks through the module pack and unpack and, on a 64 bit system, compiles these functions to use plain "int" addition. *) let f x = M.add (M.of_int x) (M.of_int 1) let g x = x + Sys.word_size | |||||||||||
| Tags | No tags attached. | |||||||||||
| Attached Files | ||||||||||||
Notes |
|
|
(0006114) xleroy (administrator) 2011-09-06 15:46 edited on: 2011-09-06 15:47 |
This patch would break something much more important: bytecode executables generated by ocamlc are portable across 32 and 64-bit platforms. Therefore, Sys.word_size must be determined at program start-up time, and cannot be a link-time constant. (Otherwise, a bytecode executable generated on a 32-bit machine would run with the wrong word_size on a 64-bit machine.) So, thanks, but no, thanks. A slightly more acceptable approach would be let word_size = if 1 lsl 32 = 0 then 32 else 64 As long as the bytecode compiler doesn't do compile-time constant folding, the right value will be computed at program start-up time. On the other hand, ocamlopt folds the constant at compile-time. This won't help with native cross-compilation between 32 and 64-bit platforms, but such cross-compilation is already broken in many other ways. At any rate, your particular problem should be solved by writing module M = (val (if 1 lsl 32 <> 0 then (module Int : M) else (module Int32 : M)) : M);; |
|
(0007073) xleroy (administrator) 2012-03-14 10:45 |
In my proposed approach, please replace "1 lsl 32" with "1 lsl 31" to avoid running into "unspecified behavior" territory. In the absence of further discussion, I'm moving this PR to "no change required". |
Issue History |
|||
| Date Modified | Username | Field | Change |
| 2011-09-06 00:03 | jfc | New Issue | |
| 2011-09-06 00:03 | jfc | File Added: word_size.diff | |
| 2011-09-06 15:46 | xleroy | Note Added: 0006114 | |
| 2011-09-06 15:46 | xleroy | Status | new => feedback |
| 2011-09-06 15:47 | xleroy | Note Edited: 0006114 | |
| 2012-03-14 10:45 | xleroy | Note Added: 0007073 | |
| 2012-03-14 10:45 | xleroy | Status | feedback => resolved |
| 2012-03-14 10:45 | xleroy | Resolution | open => no change required |
| Copyright © 2000 - 2011 MantisBT Group |