mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-16 22:35:41 +00:00
Estimated hours taken: 18 Branches: main Move the univ, maybe, pair and unit types from std_util into their own modules. std_util still contains the general purpose higher-order programming constructs. library/std_util.m: Move univ, maybe, pair and unit (plus any other related types and procedures) into their own modules. library/maybe.m: New module. This contains the maybe and maybe_error types and the associated procedures. library/pair.m: New module. This contains the pair type and associated procedures. library/unit.m: New module. This contains the types unit/0 and unit/1. library/univ.m: New module. This contains the univ type and associated procedures. library/library.m: Add the new modules. library/private_builtin.m: Update the declaration of the type_ctor_info struct for univ. runtime/mercury.h: Update the declaration for the type_ctor_info struct for univ. runtime/mercury_mcpp.h: runtime/mercury_hlc_types.h: Update the definition of MR_Univ. runtime/mercury_init.h: Fix a comment: ML_type_name is now exported from type_desc.m. compiler/mlds_to_il.m: Update the the name of the module that defines univs (which are handled specially by the il code generator.) library/*.m: compiler/*.m: browser/*.m: mdbcomp/*.m: profiler/*.m: deep_profiler/*.m: Conform to the above changes. Import the new modules where they are needed; don't import std_util where it isn't needed. Fix formatting in lots of modules. Delete duplicate module imports. tests/*: Update the test suite to confrom to the above changes.
166 lines
5.7 KiB
Mathematica
166 lines
5.7 KiB
Mathematica
%-----------------------------------------------------------------------------%
|
|
% vim: ft=mercury ts=4 sw=4 et
|
|
%-----------------------------------------------------------------------------%
|
|
% Copyright (C) 1999-2006 The University of Melbourne.
|
|
% This file may only be copied under the terms of the GNU General
|
|
% Public License - see the file COPYING in the Mercury distribution.
|
|
%-----------------------------------------------------------------------------%
|
|
|
|
% File: mlds_to_ilasm.m.
|
|
% Main author: trd.
|
|
|
|
% This code converts the MLDS representation into IL assembler. This module
|
|
% takes care of creating the appropriate files and generating output, while
|
|
% mlds_to_il takes care of generated IL from MLDS.
|
|
|
|
%-----------------------------------------------------------------------------%
|
|
|
|
:- module ml_backend.mlds_to_ilasm.
|
|
:- interface.
|
|
|
|
:- import_module ml_backend.mlds.
|
|
|
|
:- import_module io.
|
|
|
|
%-----------------------------------------------------------------------------%
|
|
|
|
% Convert the MLDS to IL and write it to a file.
|
|
%
|
|
:- pred mlds_to_ilasm.output_mlds(mlds::in, io::di, io::uo) is det.
|
|
|
|
%-----------------------------------------------------------------------------%
|
|
%-----------------------------------------------------------------------------%
|
|
|
|
:- implementation.
|
|
|
|
:- import_module backend_libs.builtin_ops.
|
|
:- import_module backend_libs.c_util.
|
|
:- import_module backend_libs.foreign.
|
|
:- import_module backend_libs.rtti.
|
|
:- import_module check_hlds.type_util.
|
|
:- import_module hlds.hlds_pred. % for `pred_proc_id'.
|
|
:- import_module hlds.passes_aux.
|
|
:- import_module libs.compiler_util.
|
|
:- import_module libs.globals.
|
|
:- import_module libs.options.
|
|
:- import_module libs.tree.
|
|
:- import_module ml_backend.ilasm.
|
|
:- import_module ml_backend.ilds.
|
|
:- import_module ml_backend.il_peephole.
|
|
:- import_module ml_backend.ml_code_util.
|
|
:- import_module ml_backend.mlds_to_il.
|
|
:- import_module ml_backend.mlds_to_managed.
|
|
:- import_module ml_backend.ml_util.
|
|
:- import_module parse_tree.modules.
|
|
:- import_module parse_tree.prog_data.
|
|
:- import_module parse_tree.prog_foreign.
|
|
:- import_module parse_tree.prog_out.
|
|
|
|
:- import_module assoc_list.
|
|
:- import_module bool.
|
|
:- import_module counter.
|
|
:- import_module int.
|
|
:- import_module library.
|
|
:- import_module list.
|
|
:- import_module map.
|
|
:- import_module maybe.
|
|
:- import_module set.
|
|
:- import_module string.
|
|
:- import_module term.
|
|
|
|
%-----------------------------------------------------------------------------%
|
|
|
|
output_mlds(MLDS, !IO) :-
|
|
ModuleName = mlds_get_module_name(MLDS),
|
|
module_name_to_file_name(ModuleName, ".il", yes, ILAsmFile, !IO),
|
|
output_to_file(ILAsmFile, output_assembler(MLDS), Result, !IO),
|
|
|
|
(
|
|
Result = yes(ForeignLangs),
|
|
% Output any outline foreign_code to the appropriate foreign
|
|
% language file.
|
|
list.foldl(output_foreign_file(MLDS),
|
|
set.to_sorted_list(ForeignLangs), !IO)
|
|
;
|
|
% An I/O error occurred; output_to_file has already reported
|
|
% an error message, so we don't need to do anything here.
|
|
Result = no
|
|
).
|
|
|
|
:- pred output_foreign_file(mlds::in, foreign_language::in,
|
|
io::di, io::uo) is det.
|
|
|
|
output_foreign_file(MLDS, ForeignLang, !IO) :-
|
|
ModuleName = mlds_get_module_name(MLDS),
|
|
(
|
|
ForeignModuleName = foreign_language_module_name(ModuleName,
|
|
ForeignLang),
|
|
Extension = foreign_language_file_extension(ForeignLang)
|
|
->
|
|
handle_foreign_lang(ForeignLang, CodeGenerator),
|
|
module_name_to_file_name(ForeignModuleName, Extension,
|
|
yes, File, !IO),
|
|
output_to_file(File,
|
|
(pred(di, uo) is det --> CodeGenerator(MLDS)), !IO)
|
|
;
|
|
unexpected(this_file, "output_foreign_file: " ++
|
|
"unexpected language")
|
|
).
|
|
|
|
:- pred handle_foreign_lang(foreign_language::in,
|
|
pred(mlds, io, io)::out(pred(in, di, uo) is det)) is det.
|
|
|
|
handle_foreign_lang(managed_cplusplus, output_managed_code(managed_cplusplus)).
|
|
handle_foreign_lang(csharp, output_managed_code(csharp)).
|
|
handle_foreign_lang(c, _) :-
|
|
sorry(this_file, "language C foreign code not supported").
|
|
handle_foreign_lang(il, _) :-
|
|
sorry(this_file, "language IL foreign code not supported").
|
|
handle_foreign_lang(java, _) :-
|
|
sorry(this_file, "language Java foreign code not supported").
|
|
|
|
% Generate the `.il' file.
|
|
% Returns the set of foreign language
|
|
%
|
|
:- pred output_assembler(mlds::in, set(foreign_language)::out,
|
|
io::di, io::uo) is det.
|
|
|
|
output_assembler(MLDS, ForeignLangs, !IO) :-
|
|
MLDS = mlds(ModuleName, _ForeignCode, _Imports, _Defns,
|
|
_InitPreds, _FinalPreds),
|
|
output_src_start(ModuleName, !IO),
|
|
io.nl(!IO),
|
|
|
|
generate_il(MLDS, ILAsm0, ForeignLangs, !IO),
|
|
|
|
% Perform peephole optimization if requested. If peephole
|
|
% optimization was not requested, we may still need to invoke
|
|
% the peephole optimization pass, because some of the peephole
|
|
% optimizations are actually needed for verifiability of the
|
|
% generated IL.
|
|
globals.io_lookup_bool_option(optimize_peep, Peephole, !IO),
|
|
globals.io_lookup_bool_option(verifiable_code, Verifiable, !IO),
|
|
( Peephole = yes ->
|
|
VerifyOnly = no,
|
|
il_peephole_optimize(VerifyOnly, ILAsm0, ILAsm)
|
|
; Verifiable = yes ->
|
|
VerifyOnly = yes,
|
|
il_peephole_optimize(VerifyOnly, ILAsm0, ILAsm)
|
|
;
|
|
ILAsm0 = ILAsm
|
|
),
|
|
|
|
% Output the assembly.
|
|
ilasm.output(ILAsm, !IO),
|
|
output_src_end(ModuleName, !IO).
|
|
|
|
%-----------------------------------------------------------------------------%
|
|
|
|
:- func this_file = string.
|
|
|
|
this_file = "mlds_to_ilasm.m".
|
|
|
|
%-----------------------------------------------------------------------------%
|
|
:- end_module mlds_to_ilasm.
|
|
%-----------------------------------------------------------------------------%
|