(* m2block.def definition module for m2block.cc.

Copyright (C) 2011-2025 Free Software Foundation, Inc.
Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.

This file is part of GNU Modula-2.

GNU Modula-2 is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.

GNU Modula-2 is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Modula-2; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  *)

DEFINITION MODULE FOR "C" m2block ;

FROM gcctypes IMPORT location_t, tree ;
FROM CDataTypes IMPORT CharStar ;


(*
    init - initialise the data structures in this module.
*)

PROCEDURE init ;


(*
    toplevel - return TRUE if we are in the global scope.
*)

PROCEDURE toplevel () : BOOLEAN ;


(*
    global_constant - t is a constant, we keep a chain of all constants
                      in the global binding level.
*)

PROCEDURE global_constant (t: tree) : tree ;


(*
    RememberInitModuleFunction - records tree, t, in the global binding level.
                                 So that it will not be garbage collected.
                                 In theory the inner modules could be placed
                                 inside the current_binding_level I suspect.
*)

PROCEDURE RememberInitModuleFunction (t: tree) : tree ;


(*
    DumpGlobalConstants - displays all global constants and checks none are
                          poisoned.
*)

PROCEDURE DumpGlobalConstants () : tree ;


(*
    RememberConstant - adds a tree, t, onto the list of constants to be marked
                       whenever the ggc re-marks all used storage.  Constants
                       live throughout the whole compilation - and they
                       can be used by many different functions if necessary.
*)

PROCEDURE RememberConstant (t: tree) : tree ;


(*
    RememberType - remember the type, t, in the ggc marked list.
*)

PROCEDURE RememberType (t: tree) : tree ;


(*
    pushDecl - pushes a declaration onto the current binding level.
*)

PROCEDURE pushDecl (decl: tree) : tree ;


(*
    popGlobalScope - pops the current binding level, it expects this binding level
                     to be the global binding level.
*)

PROCEDURE popGlobalScope ;


(*
    pushGlobalScope - push the global scope onto the binding level stack.
                      There can only ever be one instance of the global binding
                      level on the stack.
*)

PROCEDURE pushGlobalScope ;


(*
    popFunctionScope - pops a binding level, returning the function associated with the
                       binding level.
*)

PROCEDURE popFunctionScope () : tree ;


(*
    pushFunctionScope - push a binding level.
*)

PROCEDURE pushFunctionScope (fndecl: tree) ;


(*
   finishFunctionCode - adds cur_stmt_list to fndecl.  The current binding level
                        is then able to be destroyed by a call to popFunctionScope.
                        The cur_stmt_list is appended to the STATEMENT_LIST.
*)

PROCEDURE finishFunctionCode (fndecl: tree) ;


(*
   finishFunctionDecl - removes declarations from the current binding level and places
                        them inside fndecl.  The current binding level is then able to
                        be destroyed by a call to popFunctionScope.

                        The extra tree nodes associated with fndecl will be created
                        such as BIND_EXPR, BLOCK and the initial STATEMENT_LIST
                        containing the DECL_EXPR is also created.
*)

PROCEDURE finishFunctionDecl (location: location_t; fndecl: tree) ;


(*
    getLabel - return the label, name, or create a label, name
               in the current scope.
*)

PROCEDURE getLabel (location: location_t; name: CharStar) : tree ;


(*
   GetErrorNode - returns the gcc error_mark_node.
*)

PROCEDURE GetErrorNode () : tree ;


(*
   includeDecl - pushes a declaration onto the current binding level providing
                 it is not already present.
*)

PROCEDURE includeDecl (decl: tree) ;


(*
   GetGlobals - returns a list of global variables, functions, constants.
*)

PROCEDURE GetGlobals () : tree ;


(*
   GetGlobalContext - returns the global context tree.
*)

PROCEDURE GetGlobalContext () : tree ;


(*
   begin_statement_list - starts a tree statement.  It pushes the
                          statement list and returns the list node.
*)

PROCEDURE begin_statement_list () : tree ;


(*
   push_statement_list - pushes the statement list, t, onto the
                         current binding level.
*)

PROCEDURE push_statement_list (t: tree) : tree ;


(*
   pop_statement_list - pops and returns a statement list from the
                        current binding level.
*)

PROCEDURE pop_statement_list () : tree ;


(*
   addStmtNote - remember this location represents the start of a Modula-2
                 statement.  It is flushed if another different location is
                 generated or another tree is given to add_stmt.
*)

PROCEDURE addStmtNote (location: location_t) ;


(*
   removeStmtNote - removes any pending stmt note.
*)

PROCEDURE removeStmtNote ;


END m2block.