Patch title: Release 85 bulk changes
Abstract:
File: /pliant/language/declare/global.c
Key:
    Removed line
    Added line
// Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation.
// 
// This program 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
// version 2 along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

/*
abstract
  text "Declares all the global variables used in the C part of Pliant"
doc
  text "These are all the Pliant C part global variables: "
  text "they are defined as a structure instead of standard global C variables because in function 'process_backup' and 'process_restore' in " ; link "process.c" "../process/process.c" ; text " it's easier to save a big structure that to enumerate all variables.[lf]" 
  text "There is only one instance of 'Global' data type which is named 'G'."
*/


struct Globals {

/*
doc
  text "These two ones are for debugging purpose only: if an address is outside the bounds, then we know it's a wrong one."
*/
  Address memory_minimal_address,memory_maximal_address;

/*
doc
  text "'memory_start_address' is used to grant that the required pages at available at loading a .dump file time."
  text "'memory_decommit_threshold' is used to improve dynamic memory allocation through releasing pages in large unused areas."
*/
  Address memory_base_address;
  Address memory_limit_address;
  Int memory_decommit_threshold;
/*
doc
  text "These are kept up to date so that the application can know how much memory it's currently consuming.[lf]"
  text "'consumed' means the number of bytes that have been requested at OS level through committing pages, excluding the pages requested for threads stacks. So this is the significant value to determine how much memory has been eaten by this Pliant process.[lf]"
  text "'used' means the bytes count that have been allocated using 'memory_allocate' or friends (the equivalent of the C 'malloc' functions)."
*/

  Int memory_current_consumed;
  Int memory_current_used;
  Int memory_maximum_consumed;
/*
doc
  text "Now the internal variables of the Doug lea malloc/free algorithm"
  text "The Doug lea malloc/free algorithm based on a single data area that is extended calling 'sbrk' C function."
  text "Pliant is using a different approach that does not hide some of the new OS features, and so enable better control for some very special application: it allocates large areas of addressing space, then commits pages as requested. Each large memory area behaves a bit like the single date segment in standard Unix."
*/
  struct MemoryPool memory_pool;
  struct Type *type_MemoryPool;
/*
doc
  text "The C part of Pliant does not know multithreading, so uses a set of hooks that will be filled with semaphore functions when the PDEE defines threads functions."
*/
  // Int memory_semaphore;
  Address (*memory_allocate_hook)(Int asked,Address with);
  Address (*memory_zallocate_hook)(Int asked,Address with);
  Void (*memory_free_hook)(Address mem);
  Address (*memory_resize_hook)(Address oldmem,Int asked,Address with);
  Address (*memory_zresize_hook)(Address oldmem,Int asked,Address with);
  Int (*memory_size_hook)(Address mem);
  Void (*memory_checkup_hook)();
  Void (*memory_shrink_hook)(Bool clearalso);
  Void (*memory_enumerate_hook)(Void (*hook)(Address area));
  Void (*memory_pre_extend_hook)(Int size);
  Void (*memory_post_extend_hook)();

/*
doc
  text "At debugging level 2 and more, we keep a list of all the objects in memory so that at the end of the process, we may list all the lost objects due to the limits of references count allocation mechanism."
*/
  #ifdef _CHECK_
    Void (*entry_lock_hook)();
    Void (*entry_unlock_hook)();
    struct EntryHeader *entry_first,*entry_last;
    struct List entry_roots;
  #endif

  Void (*error_push_record_hook)(struct ErrorRecord *buffer,Int filter);
  Void (*error_pull_record_hook)(struct ErrorRecord *buffer);
  struct ErrorRecord *(*error_top_record_hook)();
  Void (*error_fatal_hook)(Int id,struct Str *message);
  struct ErrorRecord *top_error;
  struct ErrorRecord bottom_error;
  Int error_first_available_id;

  Int debugging_level;
  Int generator_level;
  Int verbose_level;
  Int execution_phase;
  Void (*action_push_record_hook)(struct ActionRecord *ca,struct Str *action);
  Void (*action_pull_record_hook)(struct ActionRecord *ca);
  struct ActionRecord *(*action_top_record_hook)();
  struct ActionRecord *top_action;

  struct Function *first_function;
  struct Function *last_function;
  Int default_function_flags;
  Void (*function_lock_hook)();
  Void (*function_unlock_hook)();

  struct Relation *pointer_types,*link_types,*star_types;

  struct Dictionary *general_dictionary;
  struct Dictionary *module_dictionary;

  Int generic_nb_indices;
  struct GenericIndex *generic_indices;

  Int generic_method_build;
  Int generic_method_destroy;
  Int generic_method_copy;
  Int generic_method_active_type;

  Bool *true_constant,*false_constant;
  Address *null_constant;
  struct List *parser_sections;
  struct List *optimizer_sections;

  struct List *wakeup_actions;
  struct List *shutdown_actions;
  struct List *backup_actions;
  struct List *restore_actions;
  struct List *exit_actions;

  Any (*file_open_hook)(struct Str *name,Int mode);
  Int (*file_read_hook)(Any handle,Address buffer,Int size);
  Int (*file_write_hook)(Any handle,Address buffer,Int size);
  Err (*file_close_hook)(Any handle);
  struct Str pliant_root_path;

  struct List *type_build_hooks;
  struct List *type_destroy_hooks;
  struct List *execute_begin_hooks;
  struct List *execute_end_hooks;
  struct List *generator_context_begin_hooks;
  struct List *generator_context_end_hooks;
  Void (*yield_hook)();
  
  struct Module *bparser_module;
  struct Module *boptimizer_module;
  struct Module *safe_module;
  struct Module *unsafe_module;
  struct Module *unused_module;

  struct Type *type_Universal;
  struct Type *type_Void;
  struct Type *type_CBool;

  struct Type *type_Int;
  struct Type *type_Address;
  struct Type *type_Arrow;

  struct Type *type_Str;
  struct Type *type_Ident;
  struct Type *type_InlineText;
  struct Type *type_ListingPosition;
  struct Type *type_ListingPositions;

  struct Type *type_List;
  struct Type *type_Array;
  struct Type *type_Dictionary;
  struct Type *type_Relation;
  struct Type *type_Tickets;
  struct Type *type_Module;

  struct Type *type_Argument;
  struct Type *type_Argument2;
  struct Type *type_Instruction;
  struct Type *type_GeneratorContext;
  struct Type *type_Function;
  struct Type *type_FunctionPrototype;
  struct Type *type_FunctionExternal;
  struct Type *type_FunctionUse;
  struct Type *type_FunctionName;
  struct Type *type_LocalVariable;
  struct Type *type_GlobalVariable;
  struct Type *type_Meta;
  struct Type *type_Type;
  struct Type *type_TypeField;

  struct Type *type_Expression;
  struct Type *type_ParserContext;
  struct Type *type_ParserFilter;
  struct Type *type_ParserPending;
  struct Type *type_ParserOperator;
  struct Type *type_ParserFilterOperatorT1;
  struct Type *type_ParserFilterOperatorT2;

  struct Type *type_DelayedAction;
  struct Type *type_BacktrackingAction;
  struct Type *type_BacktrackingDefinition;
  struct Function *function_backtrack_definition;

  struct Type *type_ErrorID;
  struct Type *type_ErrorRecord;
  struct Type *type_ActionRecord;

  /* parser.c */
  struct Function *function_pending_open_bloc,*function_pending_close_bloc,*function_pending_close_instruction;
  struct Function *function_operator_t1,*function_filter_t1;
  struct Function *function_filter_openop,*function_filter_closeop;
  Void (*pre_execute_hook)(struct Expression *e);
  Void (*post_active_hook)(Arrow object, Int access, struct Expression *e);

  /* i386.c */
  struct Function *function_i386_mov;
  struct Function *function_i386_lea;
  struct Function *function_i386_push;
  struct Function *function_i386_pop;
  struct Function *function_i386_jump;
  struct Function *function_i386_jump_if;
  struct Function *function_i386_return;
  struct Function *function_i386_add;
  struct Function *function_i386_sub;
  struct Function *function_i386_cmp;
  struct Function *function_i386_imul;

  /* arithmetic.c */
  struct Function *function_plus_Int;
  struct Function *function_minus_Int;
  struct Function *function_multiply_Int;

  /* basics.c */
  struct Function *function_build_universal;
  struct Function *function_destroy_universal;
  struct Function *function_copy_universal;
  struct Function *function_copy_atomic;
  struct Function *function_copy_scalar;
  struct Function *function_compare_int;
  struct Function *function_compare_address;
  struct Function *function_compare_apply_mode;
  struct Function *function_address_universal;
  struct Function *function_arrow_universal;
  struct Function *function_translate_universal; // defined early in type.c

  /* controls.c */
  struct Function *function_do_nothing;
  #ifdef _EXPERIMENTAL_
    struct Function *function_do_nothing1;
  #endif
  struct Function *function_jump_if;
  struct Function *function_jump_if_not;

  /* extend.c */
  struct Function *function_module_add_scope;
  struct Function *function_module_set_ring;
  struct Function *function_module_load;
  struct Function *function_entry_new;
  struct Function *function_entry_lock;
  struct Function *function_entry_unlock;
  struct Function *function_entry_type;

/*
doc
  text "These are for generating listings at various optimization stages of the function being compile, so better understand what's wrong with it."
*/
  #ifdef _LISTING_
    struct Str initial_listing_function_name;
    struct Str expanded_listing_function_name;
    struct Str middle_listing_function_name;
    struct Str final_listing_function_name;
    Int listing_counter;
  #endif
};

static struct Globals G;

/*
doc
  text "Now the few variables that must not be backedup and restored."
*/

#if defined(_LINUX_API_) || defined(_POSIX_API_)
  char **process_args;
  char **process_env;
  #if defined(_LINUX_API_) && !defined(_DLL_)
    int process_argc;
  #endif
#endif
static char **script_args = null;