From: Xavier Leroy <Xavier.Leroy@inria.fr>
To: John Prevost <prevost@maya.com>, caml-list@inria.fr
Subject: Re: Internals details for cmmgen.ml
Date: Sat, 11 Dec 1999 19:09:08 +0100 [thread overview]
Message-ID: <19991211190908.14090@pauillac.inria.fr> (raw)
In-Reply-To: <87emcv5i5d.fsf@isil.maya.com>; from John Prevost on Fri, Dec 10, 1999 at 03:12:14AM -0500
> My main focus has been on adding small bits of code to
> asmcomp/cmmgen.ml for the new functionality. Two of the new
> primitives (Pregionrefs and Pregionsets) need to check the protection
> bits recorded for the region before trying to access it, and somehow
> raise an exception if the access check fails.
>
> I'm currently using the following kludge to make bad region access
> checks fail:
>
> let region_checkaccess exp = function
> | Reg_Read ->
> Cifthenelse(
> Cop(Cand, [region_prot exp; Cconst_int 1]),
> Cconst_pointer 1,
> Cop(Ccheckbound, [Cconst_int 0; Cconst_int 0]))
> | Reg_Write ->
> Cifthenelse(
> Cop(Cand, [region_prot exp; Cconst_int 2]),
> Cconst_pointer 1,
> Cop(Ccheckbound, [Cconst_int 0; Cconst_int 0]))
> (* XXX Bounds check on 0 is a kludge to force exception *)
>
> Is there a better way for me to cause an exception to be thrown at
> this point? Do I need to fall back to a Cextcall to ask someone to
> throw an exception for me? Or could (and should) I actually use
> Craise with arcane knowledge that a certain exception maps to a
> certain integer value?
Using a "checkbound" is perhaps the simplest solution. Otherwise,
some system-wide exceptions such as Invalid_argument are assigned
global symbols and you don't need to guess their integer index inside
their defining module: just emit the C-- code corresponding to
(raise (symbol "Invalid_argument") (string "my message"))
If you're really into high-performance stuff, you could fold the
permission check and the bounds check in one "checkbound" instruction.
Just arrange the "write enable" flag to be (the Caml integer) 0 if
write is allowed, and -1 if it is not. Then, generate something like
(checkbound (or index (write_enable_flag region) (size region)))
Although hacking cmmgen.ml is fun, you could get a more portable
implementation by writing it in ML using unsafe string accesses.
Those will happily work on any char *, not necessarily on well-formed
Caml strings. Something like:
external mmap : ... -> string
type t = { data: string; length: int }
let read_char reg idx =
if idx < 0 || idx >= reg.length
then raise (Invalid_argument "Region.read_char")
else String.unsafe_get reg.data idx
It will be a bit slower, but maybe not too much.
- Xavier Leroy
next prev parent reply other threads:[~1999-12-12 22:10 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
1999-12-10 8:12 John Prevost
1999-12-11 18:09 ` Xavier Leroy [this message]
1999-12-18 0:51 ` John Prevost
1999-12-18 18:56 ` Jerome Vouillon
1999-12-23 5:26 ` John Prevost
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=19991211190908.14090@pauillac.inria.fr \
--to=xavier.leroy@inria.fr \
--cc=caml-list@inria.fr \
--cc=prevost@maya.com \
/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;
as well as URLs for NNTP newsgroup(s).