[m-rev.] For review: Improve the name mangling of foreign methods in the IL backend

Julien Fischer juliensf at csse.unimelb.edu.au
Thu Jun 7 18:57:23 AEST 2007


On Thu, 7 Jun 2007, Julien Fischer wrote:

>
> On Thu, 7 Jun 2007, Julien Fischer wrote:
>
>> 
>> On Thu, 7 Jun 2007, Jonathan Morgan wrote:
>> 
>>> On 6/6/07, Julien Fischer <juliensf at csse.unimelb.edu.au> wrote:
>>>> 
>>>> On Tue, 5 Jun 2007, Jonathan Morgan wrote:
>>>> 
>>>> > Estimated hours taken: 4
>>>> > Branches: main
>>>> >
>>>> > Improve the name mangling for foreign language methods under the IL 
>>>> backend.
>>>> > Currently, method names containing spaces, punctuation, and other 
>>>> unusual
>>>> > characters are acceptable in IL (because all method names are quoted), 
>>>> but
>>>> > are
>>>> > not acceptable in C# or Managed C++.  This change converts all such 
>>>> foreign
>>>> > names that are not alphanumeric or underscore to a valid C identifier 
>>>> in the
>>>> > same way as in the C-based backends.
>>>> >
>>>> > compiler/mlds_to_il.m:
>>>> >       Alter the name mangling routines to allow it to mangle foreign 
>>>> names
>>>> >       differently from ordinary IL names.  Alter the forwarding methods 
>>>> for
>>>> >       foreign routines to call the mangled version of the method in the
>>>> >       foreign module, rather than calling one with the IL method name.
>>>> >
>>>> > compiler/mlds_to_managed.m:
>>>> >       Alter the generation of foreign methods to use the new mangled 
>>>> name.
>>>> 
>>>> This change causes tests/valid/foreign_type_spec to fail.
>>> 
>>> The error message given is:
>>> 
>>> mercury_compile: cannot find `foreign_type_spec.foreign_type.int' in
>>> directories ., 
>>> C:/cygwin/usr/local/mercury-rotd-2007-05-26/lib/mercury/ints.
>>> foreign_type_spec.m:007: In definition of type `foreign_type_spec.ft2'/0:
>>> foreign_type_spec.m:007:   error: undefined type `foreign'/0.
>>> mercury_compile: cannot find `foreign_type_spec.int0' in directories
>>> ., C:/cygwin/usr/local/mercury-rotd-2007-05-26/lib/mercury/ints.
>>> 
>>> While I'm no expert in the Mercury build system, I wouldn't expect my
>>> change to cause this problem.
>> 
>> With rotd-2006-06-06, the error I'm getting is:
>> 
>> 	Uncaught Mercury exception:
>> 	Software Error: mlds_to_il.m: Unexpected: IL procedure is not a 
>> function
>> 
>> which was is an assertion that your change introduced.
>> 
>> Are you sure your copy of tests is up-to-date?  foreign_type_spec was
>> failing but Simon Taylor fixed it at the beginning of May and AFAIK it
>> has been working ever since.
>
> The problem here is that the ml code generator introduces constructors for 
> the classes it generates for du types.  (The relevant
> piece of code is ml_type_gen.m:795.)
>
> The mlds_defn's for these constructor methods have their entity_name
> field set to `entity_export("<constructor>")' for some reason.  (This
> doesn't quite line with the documentation for entity_export/1 in
> mlds.m which says they are for pragma exported entities.)
>
> It looks (from the comments in ml_type_gen.m) that this particular name
> is just used as a place-holder, as the actual constructor names are
> backend specific.  I not sure why we do things in this particular way?
> Pete, do you have any ideas?
>
> I think we can work-around the problem at the moment by only performing
> the sanity check when we do not have a constructor method.  The diff below 
> makes this change.  With it the valid/foreign_type_spec
> passes again - I haven't checked whether it is okay with respect to
> the rest of Jon's change.

Nor have I committed it.

Julien.
--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to:       mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions:          mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------



More information about the reviews mailing list