[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:56:05 AEST 2007


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.

Julien.

Index: mlds_to_il.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/mlds_to_il.m,v
retrieving revision 1.181
diff -u -r1.181 mlds_to_il.m
--- mlds_to_il.m	6 Jun 2007 01:17:34 -0000	1.181
+++ mlds_to_il.m	7 Jun 2007 08:46:24 -0000
@@ -1051,13 +1051,6 @@
          ClassMember, !Info) :-
      Entity = mlds_function(_MaybePredProcId, Params, MaybeStatement,
          Attributes, EnvVarNames),
-    ( Name = entity_function(PredLabel0, ProcId0, MaybeSeqNum0, _PredId) ->
-        PredLabel = PredLabel0,
-        ProcId = ProcId0,
-        MaybeSeqNum = MaybeSeqNum0
-    ;
-        unexpected(this_file, "IL procedure is not a function")
-    ),

      expect(set.empty(EnvVarNames), this_file,
          "generate_method: EnvVarNames"),
@@ -1087,6 +1080,13 @@
              class_member_name(ParentClass, ctor), []))]
      ;
          IsCons = no,
+        ( Name = entity_function(PredLabel0, ProcId0, MaybeSeqNum0, _) ->
+            PredLabel = PredLabel0,
+            ProcId = ProcId0,
+            MaybeSeqNum = MaybeSeqNum0
+        ;
+            unexpected(this_file, "IL procedure is not a function")
+        ),
          predlabel_to_il_id(PredLabel, ProcId, MaybeSeqNum, MemberName0),
          predlabel_to_managed_id(PredLabel, ProcId, MaybeSeqNum,
                  ManagedMemberName0),
@@ -1160,9 +1160,9 @@
      % in an exception handler and call the initialization instructions
      % in the cctor of this module.
      (
-        PredLabel = mlds_user_pred_label(pf_predicate, no, "main", 2,
-            model_det, no),
-        MaybeSeqNum = no
+        Name = entity_function(MainPredLabel, _, no, _PredId),
+        MainPredLabel = mlds_user_pred_label(pf_predicate, no, "main", 2,
+            model_det, no)
      ->
          EntryPoint = [entrypoint],
          !:Info = !.Info ^ has_main := yes,





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