caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
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




  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).