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

Julien Fischer juliensf at csse.unimelb.edu.au
Fri Jun 8 15:11:24 AEST 2007


On Fri, 8 Jun 2007, Jonathan Morgan wrote:

> On 6/7/07, Julien Fischer <juliensf at csse.unimelb.edu.au> wrote:
>> 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.
>> 
>> 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,
>
> The workaround looks fine with respect to my changes.  You could move
> the construction of MemberName and ManagedMemberName inside the
> if-then-else and remove all the PredLabel0's and similar if you felt
> it made it clearer.

I'll do that.

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