[m-rev.] for review: grade independent .mh files (bug #52)
Julien Fischer
juliensf at csse.unimelb.edu.au
Thu Mar 27 15:36:13 AEDT 2008
On Thu, 27 Mar 2008, Julien Fischer wrote:
> For review by anyone.
>
> Estimated hours taken: 2
> Branches: main
>
> Make the .mh files grade independent again. They were not grade independent
> because the types of the globals used to implement mutables can differ
> between
> the high- and low-level C backends. The fix is to output declarations for
> both backends in .mh files and select between them using #ifdef
> MR_HIGHLEVEL_CODE.
>
> compiler/make_hlds_passes.m:
> Write out #ifdef protected declarations for the globals used to
> implement mutables that are appropriate for both C backends.
>
> Separate out the code for generating the mutable declarations and
> definitions. While there is some common structure the above change
> makes it quite hard to follow if they are combined. In this case
> separating them is the lesser of two evils.
>
> compiler/handle_options.m:
> Add a comment mentioning that if the value of the
> mutable_always_boxed option is changed then the code in
> make_hlds_passes that processes mutable declarations will need to be
> updated.
The original diff was broken in several places; here is the correct one.
Index: handle_options.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/handle_options.m,v
retrieving revision 1.317
diff -u -r1.317 handle_options.m
--- handle_options.m 23 Jan 2008 13:12:15 -0000 1.317
+++ handle_options.m 27 Mar 2008 04:35:02 -0000
@@ -1088,6 +1088,9 @@
option_implies(single_prec_float, unboxed_float, bool(yes),
!Globals),
+ % Changing this means that the code in make_hlds_passes.m that
+ % handles the declarations for the global variables used by
+ % mutables should also be updated.
option_implies(highlevel_code, mutable_always_boxed, bool(no),
!Globals),
Index: make_hlds_passes.m
===================================================================
RCS file: /home/mercury/mercury1/repository/mercury/compiler/make_hlds_passes.m,v
retrieving revision 1.77
diff -u -r1.77 make_hlds_passes.m
--- make_hlds_passes.m 15 Feb 2008 08:31:58 -0000 1.77
+++ make_hlds_passes.m 27 Mar 2008 04:35:02 -0000
@@ -1657,9 +1657,12 @@
% We add the foreign code declaration and definition here rather than
% in pass 2 because the target-language-specific type name depends on
% whether there are any foreign_type declarations for Type.
- get_c_mutable_global_foreign_decl_defn(!.ModuleInfo, Type,
+ get_c_mutable_global_foreign_decl(!.ModuleInfo, Type,
TargetMutableName, IsConstant, IsThreadLocal, Context,
- ForeignDecl, ForeignDefn),
+ ForeignDecl),
+ get_c_mutable_global_foreign_defn(!.ModuleInfo, Type,
+ TargetMutableName, IsConstant, IsThreadLocal, Context,
+ ForeignDefn),
ItemStatus0 = item_status(status_local, may_be_unqualified),
add_item_decl_pass_2(ForeignDecl, ItemStatus0, _, !ModuleInfo, !Specs),
add_item_decl_pass_2(ForeignDefn, ItemStatus0, _, !ModuleInfo, !Specs).
@@ -1668,23 +1671,34 @@
% The bool argument says whether the mutable is a constant mutable
% or not.
%
-:- pred get_c_mutable_global_foreign_decl_defn(module_info::in, mer_type::in,
+:- pred get_c_mutable_global_foreign_decl(module_info::in, mer_type::in,
string::in, bool::in, mutable_thread_local::in, prog_context::in,
- item::out, item::out) is det.
+ item::out) is det.
-get_c_mutable_global_foreign_decl_defn(ModuleInfo, Type, TargetMutableName,
- IsConstant, IsThreadLocal, Context, DeclItem, DefnItem) :-
- module_info_get_globals(ModuleInfo, Globals),
- globals.lookup_bool_option(Globals, mutable_always_boxed, AlwaysBoxed),
+get_c_mutable_global_foreign_decl(ModuleInfo, Type, TargetMutableName,
+ IsConstant, IsThreadLocal, Context, DeclItem) :-
+ % This declaration will be included in the .mh files. Since these are
+ % grade independent we need to output both the high- and low-level C
+ % declarations for the global used to implement the mutable and make
+ % the choice conditional on whether MR_HIGHLEVEL_CODE is defined.
+ %
(
IsThreadLocal = mutable_not_thread_local,
- TypeName = global_foreign_type_name(AlwaysBoxed, lang_c,
- ModuleInfo, Type)
+ % The first argument in the following calls to
+ % global_foreign_type_name says whether the mutable should always be
+ % boxed or not. The only difference between the high- and low-level
+ % C backends is that in the latter mutables are *always* boxed,
+ % whereas in the former they may not be.
+ HighLevelTypeName = global_foreign_type_name(no, lang_c, ModuleInfo,
+ Type),
+ LowLevelTypeName = global_foreign_type_name(yes, lang_c, ModuleInfo,
+ Type)
;
IsThreadLocal = mutable_thread_local,
% For thread-local mutables, the variable holds an index into an
% array.
- TypeName = "MR_Unsigned"
+ HighLevelTypeName = "MR_Unsigned",
+ LowLevelTypeName = "MR_Unsigned"
),
% Constant mutables do not require mutexes as their values are never
@@ -1694,30 +1708,68 @@
; IsThreadLocal = mutable_thread_local
)
->
- LockDecl = [],
- LockDefn = []
+ LockDecl = []
;
LockDecl = [
"#ifdef MR_THREAD_SAFE\n",
" extern MercuryLock ",
mutable_mutex_var_name(TargetMutableName), ";\n",
"#endif\n"
- ],
- LockDefn = [
- "#ifdef MR_THREAD_SAFE\n",
- " MercuryLock ",
- mutable_mutex_var_name(TargetMutableName), ";\n",
- "#endif\n"
]
),
DeclBody = string.append_list([
- "extern ", TypeName, " ", TargetMutableName, ";\n" | LockDecl]),
+ "#ifdef MR_HIGHLEVEL_CODE\n",
+ " extern ", HighLevelTypeName, " ", TargetMutableName, ";\n",
+ "#else\n",
+ " extern ", LowLevelTypeName, " ", TargetMutableName, ";\n",
+ "#endif\n" | LockDecl]),
+
DeclPragma =
pragma_foreign_decl(lang_c, foreign_decl_is_exported, DeclBody),
DeclItemPragma = item_pragma_info(compiler(mutable_decl), DeclPragma,
Context),
- DeclItem = item_pragma(DeclItemPragma),
+ DeclItem = item_pragma(DeclItemPragma).
+
+ % Create the C foreign_defn for the mutable.
+ % The bool argument says whether the mutable is a constant mutable
+ % or not.
+ %
+:- pred get_c_mutable_global_foreign_defn(module_info::in, mer_type::in,
+ string::in, bool::in, mutable_thread_local::in, prog_context::in,
+ item::out) is det.
+
+get_c_mutable_global_foreign_defn(ModuleInfo, Type, TargetMutableName,
+ IsConstant, IsThreadLocal, Context, DefnItem) :-
+ module_info_get_globals(ModuleInfo, Globals),
+ globals.lookup_bool_option(Globals, mutable_always_boxed, AlwaysBoxed),
+ (
+ IsThreadLocal = mutable_not_thread_local,
+ TypeName = global_foreign_type_name(AlwaysBoxed, lang_c, ModuleInfo,
+ Type)
+ ;
+ IsThreadLocal = mutable_thread_local,
+ % For thread-local mutables, the variable holds an index into an
+ % array.
+ TypeName = "MR_Unsigned"
+ ),
+
+ % Constant mutables do not require mutexes as their values are never
+ % updated. Thread-local mutables do not require mutexes either.
+ (
+ ( IsConstant = yes
+ ; IsThreadLocal = mutable_thread_local
+ )
+ ->
+ LockDefn = []
+ ;
+ LockDefn = [
+ "#ifdef MR_THREAD_SAFE\n",
+ " MercuryLock ",
+ mutable_mutex_var_name(TargetMutableName), ";\n",
+ "#endif\n"
+ ]
+ ),
DefnBody = string.append_list([
TypeName, " ", TargetMutableName, ";\n" | LockDefn]),
--------------------------------------------------------------------------
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