[COMMITTED] a68: use GC for parser node memory management
Jose E. Marchesi
jemarch@gnu.org
Sat Nov 22 16:06:18 GMT 2025
---
gcc/algol68/a68-exports.cc | 85 ++++++++---------------------
gcc/algol68/a68-imports.cc | 26 ++++-----
gcc/algol68/a68-lang.cc | 6 +-
gcc/algol68/a68-low-ranges.cc | 4 +-
gcc/algol68/a68-parser-bottom-up.cc | 1 -
gcc/algol68/a68-parser-scanner.cc | 3 +-
gcc/algol68/a68-parser.cc | 14 ++---
gcc/algol68/a68-types.h | 39 +++++++------
gcc/algol68/config-lang.in | 2 +-
9 files changed, 72 insertions(+), 108 deletions(-)
diff --git a/gcc/algol68/a68-exports.cc b/gcc/algol68/a68-exports.cc
index 3092467a730..99ac1d200c2 100644
--- a/gcc/algol68/a68-exports.cc
+++ b/gcc/algol68/a68-exports.cc
@@ -52,64 +52,28 @@
MOIF_T *
a68_moif_new (const char *module_name)
{
- MOIF_T *moif = (MOIF_T *) xmalloc (sizeof (MOIF_T));
+ MOIF_T *moif = ggc_cleared_alloc<MOIF_T> ();
VERSION (moif) = GA68_EXPORTS_VERSION;
NAME (moif) = (module_name == NULL ? NULL : xstrdup (module_name));
PRELUDE (moif) = NULL;
POSTLUDE (moif) = NULL;
- MODES (moif).create (16);
- MODULES (moif).create (16);
- IDENTIFIERS (moif).create (16);
- INDICANTS (moif).create (16);
- PRIOS (moif).create (16);
- OPERATORS (moif).create (16);
+ vec_alloc (MODES (moif), 16);
+ vec_alloc (MODULES (moif), 16);
+ vec_alloc (IDENTIFIERS (moif), 16);
+ vec_alloc (INDICANTS (moif), 16);
+ vec_alloc (PRIOS (moif), 16);
+ vec_alloc (OPERATORS (moif), 16);
return moif;
}
-/* Free resources used by a moif. */
-
-void
-a68_moif_free (MOIF_T *moif)
-{
- free (NAME (moif));
- free (PRELUDE (moif));
- free (POSTLUDE (moif));
- for (EXTRACT_T *e : MODULES (moif))
- {
- free (EXTRACT_SYMBOL (e));
- free (e);
- }
- for (EXTRACT_T *e : INDICANTS (moif))
- {
- free (EXTRACT_SYMBOL (e));
- free (e);
- }
- for (EXTRACT_T *e : IDENTIFIERS (moif))
- {
- free (EXTRACT_SYMBOL (e));
- free (e);
- }
- for (EXTRACT_T *e : PRIOS (moif))
- {
- free (EXTRACT_SYMBOL (e));
- free (e);
- }
- for (EXTRACT_T *e : OPERATORS (moif))
- {
- free (EXTRACT_SYMBOL (e));
- free (e);
- }
- free (moif);
-}
-
/* Add a new mode to a module interface. */
static void
a68_add_moid_to_moif (MOIF_T *moif, MOID_T *m)
{
- if (! MODES(moif).contains (m))
- MODES (moif).safe_push (m);
+ if (! MODES(moif)->contains (m))
+ vec_safe_push (MODES (moif), m);
}
/* Add a new identifier extract to a module interface. */
@@ -117,7 +81,7 @@ a68_add_moid_to_moif (MOIF_T *moif, MOID_T *m)
void
a68_add_identifier_to_moif (MOIF_T *moif, TAG_T *tag)
{
- EXTRACT_T *e = (EXTRACT_T *) xmalloc (sizeof (struct EXTRACT_T));
+ EXTRACT_T *e = ggc_alloc<EXTRACT_T> ();
const char *tag_symbol = IDENTIFIER_POINTER (DECL_NAME (TAX_TREE_DECL (tag)));
EXTRACT_KIND (e) = GA68_EXTRACT_IDEN;
@@ -127,10 +91,10 @@ a68_add_identifier_to_moif (MOIF_T *moif, TAG_T *tag)
EXTRACT_VARIABLE (e) = VARIABLE (tag);
EXTRACT_IN_PROC (e) = IN_PROC (tag);
- if (! IDENTIFIERS (moif).contains (e))
+ if (! IDENTIFIERS (moif)->contains (e))
{
a68_add_moid_to_moif (moif, MOID (tag));
- IDENTIFIERS (moif).safe_push (e);
+ vec_safe_push (IDENTIFIERS (moif), e);
}
}
@@ -139,7 +103,7 @@ a68_add_identifier_to_moif (MOIF_T *moif, TAG_T *tag)
static void
a68_add_indicant_to_moif (MOIF_T *moif, TAG_T *tag)
{
- EXTRACT_T *e = (EXTRACT_T *) xmalloc (sizeof (struct EXTRACT_T));
+ EXTRACT_T *e = ggc_alloc<EXTRACT_T> ();
/* Mode tags are not associated with declarations, so we have to do the
mangling here. */
tree id = a68_get_mangled_indicant (NSYMBOL (NODE (tag)), NAME (moif));
@@ -152,10 +116,10 @@ a68_add_indicant_to_moif (MOIF_T *moif, TAG_T *tag)
EXTRACT_VARIABLE (e) = false;
EXTRACT_IN_PROC (e) = false;
- if (! INDICANTS (moif).contains (e))
+ if (! INDICANTS (moif)->contains (e))
{
a68_add_moid_to_moif (moif, MOID (tag));
- INDICANTS (moif).safe_push (e);
+ vec_safe_push (INDICANTS (moif), e);
}
}
@@ -164,7 +128,7 @@ a68_add_indicant_to_moif (MOIF_T *moif, TAG_T *tag)
static void
a68_add_module_to_moif (MOIF_T *moif, TAG_T *tag)
{
- EXTRACT_T *e = (EXTRACT_T *) xmalloc (sizeof (struct EXTRACT_T));
+ EXTRACT_T *e = ggc_alloc<EXTRACT_T> ();
/* Module tags are not associated with declarations, so we have to do the
mangling here. */
tree id = a68_get_mangled_indicant (NSYMBOL (NODE (tag)), NAME (moif));
@@ -177,8 +141,8 @@ a68_add_module_to_moif (MOIF_T *moif, TAG_T *tag)
EXTRACT_VARIABLE (e) = false;
EXTRACT_IN_PROC (e) = false;
- if (! MODULES (moif).contains (e))
- MODULES (moif).safe_push (e);
+ if (! MODULES (moif)->contains (e))
+ vec_safe_push (MODULES (moif), e);
}
/* Add a new priority extract to a module interface. */
@@ -186,7 +150,7 @@ a68_add_module_to_moif (MOIF_T *moif, TAG_T *tag)
static void
a68_add_prio_to_moif (MOIF_T *moif, TAG_T *tag)
{
- EXTRACT_T *e = (EXTRACT_T *) xmalloc (sizeof (struct EXTRACT_T));
+ EXTRACT_T *e = ggc_alloc<EXTRACT_T> ();
/* Priority tags are not associated with declarations, so we have to do the
mangling here. */
tree id = a68_get_mangled_indicant (NSYMBOL (NODE (tag)), NAME (moif));
@@ -199,8 +163,8 @@ a68_add_prio_to_moif (MOIF_T *moif, TAG_T *tag)
EXTRACT_VARIABLE (e) = false;
EXTRACT_IN_PROC (e) = false;
- if (! PRIOS (moif).contains (e))
- PRIOS (moif).safe_push (e);
+ if (! PRIOS (moif)->contains (e))
+ vec_safe_push (PRIOS (moif), e);
}
/* Add a new operator extract to a module interface. */
@@ -208,7 +172,7 @@ a68_add_prio_to_moif (MOIF_T *moif, TAG_T *tag)
static void
a68_add_operator_to_moif (MOIF_T *moif, TAG_T *tag)
{
- EXTRACT_T *e = (EXTRACT_T *) xmalloc (sizeof (struct EXTRACT_T));
+ EXTRACT_T *e = ggc_alloc<EXTRACT_T> ();
const char *tag_symbol = IDENTIFIER_POINTER (DECL_NAME (TAX_TREE_DECL (tag)));
EXTRACT_KIND (e) = GA68_EXTRACT_OPER;
@@ -220,10 +184,10 @@ a68_add_operator_to_moif (MOIF_T *moif, TAG_T *tag)
gcc_assert (EXTRACT_VARIABLE (e) == false);
EXTRACT_IN_PROC (e) = IN_PROC (tag);
- if (! OPERATORS (moif).contains (e))
+ if (! OPERATORS (moif)->contains (e))
{
a68_add_moid_to_moif (moif, MOID (tag));
- OPERATORS (moif).safe_push (e);
+ vec_safe_push (OPERATORS (moif), e);
}
}
@@ -625,7 +589,6 @@ a68_do_exports (NODE_T *p)
a68_asm_output_moif (moif);
if (flag_a68_dump_moif)
a68_dump_moif (moif);
- a68_moif_free (moif);
}
}
else
diff --git a/gcc/algol68/a68-imports.cc b/gcc/algol68/a68-imports.cc
index 55fdfb6ac22..fd1414be4c8 100644
--- a/gcc/algol68/a68-imports.cc
+++ b/gcc/algol68/a68-imports.cc
@@ -811,14 +811,15 @@ a68_replace_submode (MOID_T *t, MOID_T *m, MOID_T *r)
The entry for M in MODES_LIST is set to NO_MOID. */
static void
-a68_replace_equivalent_mode (vec<MOID_T*> mode_list, MOID_T *m, MOID_T *r)
+a68_replace_equivalent_mode (vec<MOID_T*,va_gc> *mode_list,
+ MOID_T *m, MOID_T *r)
{
- for (size_t i = 0; i < mode_list.length (); ++i)
+ for (size_t i = 0; i < mode_list->length (); ++i)
{
- if (mode_list[i] == m)
- mode_list[i] = NO_MOID;
- else if (mode_list[i] != NO_MOID)
- a68_replace_submode (mode_list[i], m, r);
+ if ((*mode_list)[i] == m)
+ (*mode_list)[i] = NO_MOID;
+ else if ((*mode_list)[i] != NO_MOID)
+ a68_replace_submode ((*mode_list)[i], m, r);
}
}
@@ -973,7 +974,7 @@ a68_decode_modes (MOIF_T *moif, encoded_modes_map_t &encoded_modes,
for (auto entry : encoded_modes)
{
struct encoded_mode *em = entry.second;
- MODES (moif).safe_push (em->moid);
+ vec_safe_push (MODES (moif), em->moid);
}
/* Next step is to see if equivalent modes the any of the modes in the moif
@@ -1048,7 +1049,7 @@ a68_decode_extracts (MOIF_T *moif, encoded_modes_map_t &encoded_modes,
EXTRACT_PRIO (e) = 0;
EXTRACT_VARIABLE (e) = false;
EXTRACT_IN_PROC (e) = false;
- MODULES (moif).safe_push (e);
+ vec_safe_push (MODULES (moif), e);
break;
case GA68_EXTRACT_IDEN:
DSTR (name);
@@ -1067,7 +1068,7 @@ a68_decode_extracts (MOIF_T *moif, encoded_modes_map_t &encoded_modes,
EXTRACT_PRIO (e) = 0;
EXTRACT_VARIABLE (e) = variable;
EXTRACT_IN_PROC (e) = in_proc;
- IDENTIFIERS (moif).safe_push (e);
+ vec_safe_push (IDENTIFIERS (moif), e);
break;
case GA68_EXTRACT_MODE:
DSTR (name);
@@ -1084,7 +1085,7 @@ a68_decode_extracts (MOIF_T *moif, encoded_modes_map_t &encoded_modes,
EXTRACT_PRIO (e) = 0;
EXTRACT_VARIABLE (e) = false;
EXTRACT_IN_PROC (e) = false;
- INDICANTS (moif).safe_push (e);
+ vec_safe_push (INDICANTS (moif), e);
break;
case GA68_EXTRACT_PRIO:
DSTR (name);
@@ -1101,7 +1102,7 @@ a68_decode_extracts (MOIF_T *moif, encoded_modes_map_t &encoded_modes,
EXTRACT_PRIO (e) = prio;
EXTRACT_VARIABLE (e) = false;
EXTRACT_IN_PROC (e) = false;
- PRIOS (moif).safe_push (e);
+ vec_safe_push (PRIOS (moif), e);
break;
case GA68_EXTRACT_OPER:
DSTR (name);
@@ -1120,7 +1121,7 @@ a68_decode_extracts (MOIF_T *moif, encoded_modes_map_t &encoded_modes,
EXTRACT_PRIO (e) = 0;
EXTRACT_VARIABLE (e) = variable;
EXTRACT_IN_PROC (e) = in_proc;
- OPERATORS (moif).safe_push (e);
+ vec_safe_push (OPERATORS (moif), e);
break;
default:
*errstr = "invalid marker in extract";
@@ -1210,7 +1211,6 @@ a68_decode_moif (const char *data, size_t size, const char **errstr)
decode_error:
if (*errstr == NULL)
*errstr = "premature end of data";
- a68_moif_free (moif);
return NULL;
}
diff --git a/gcc/algol68/a68-lang.cc b/gcc/algol68/a68-lang.cc
index 2cbafd49382..4cb1d931b65 100644
--- a/gcc/algol68/a68-lang.cc
+++ b/gcc/algol68/a68-lang.cc
@@ -32,8 +32,6 @@
#include "stor-layout.h" /* For layout_type */
#include "vec.h"
-#include <string>
-
#include "a68.h"
/* Global state for the Algol 68 front end. */
@@ -56,12 +54,12 @@ tree a68_global_trees[ATI_MAX];
struct GTY(()) lang_type
{
- MOID_T * GTY((skip)) moid;
+ MOID_T * moid;
};
struct GTY(()) lang_decl
{
- NODE_T * GTY((skip)) node;
+ NODE_T * node;
};
/* Language-specific identifier information. This must include a
diff --git a/gcc/algol68/a68-low-ranges.cc b/gcc/algol68/a68-low-ranges.cc
index 8b9a802b249..9a2008aa571 100644
--- a/gcc/algol68/a68-low-ranges.cc
+++ b/gcc/algol68/a68-low-ranges.cc
@@ -530,7 +530,7 @@ a68_push_serial_clause_range (MOID_T *clause_mode,
clause_type);
char *clause_result_name = xasprintf ("clause_result%d%%", DECL_UID (clause_result_decl));
DECL_NAME (clause_result_decl) = get_identifier (clause_result_name);
- free (clause_result_name);
+ // free (clause_result_name);
DECL_INITIAL (clause_result_decl) = a68_get_skip_tree (clause_mode);
DECL_CONTEXT (clause_result_decl) = current_range->context;
current_range->clause_result_decl = clause_result_decl;
@@ -695,3 +695,5 @@ a68_init_ranges (void)
global_range->context = build_translation_unit_decl (NULL);
current_range = global_range;
}
+
+#include "gt-algol68-a68-low-ranges.h"
diff --git a/gcc/algol68/a68-parser-bottom-up.cc b/gcc/algol68/a68-parser-bottom-up.cc
index 68c735a5327..a87a94007b7 100644
--- a/gcc/algol68/a68-parser-bottom-up.cc
+++ b/gcc/algol68/a68-parser-bottom-up.cc
@@ -3019,7 +3019,6 @@ a68_bottom_up_coalesce_pub (NODE_T *p)
/* Unlink the PUBLIC_SYMBOL node and get rid of it. */
SUB (p) = NEXT (public_symbol);
PREVIOUS (NEXT (public_symbol)) = NO_NODE;
- free (public_symbol);
}
}
a68_bottom_up_coalesce_pub (SUB (p));
diff --git a/gcc/algol68/a68-parser-scanner.cc b/gcc/algol68/a68-parser-scanner.cc
index 87708f2c650..c0edb6685fc 100644
--- a/gcc/algol68/a68-parser-scanner.cc
+++ b/gcc/algol68/a68-parser-scanner.cc
@@ -189,7 +189,7 @@ restore_state (LINE_T **ref_l, char **ref_s, char *ch)
static LINE_T *
new_source_line (void)
{
- LINE_T *z = (LINE_T *) xmalloc (sizeof (LINE_T));
+ LINE_T *z = ggc_cleared_alloc<LINE_T> ();
MARKER (z)[0] = '\0';
STRING (z) = NO_TEXT;
@@ -2330,7 +2330,6 @@ a68_lexical_analyser (const char *filename)
PREVIOUS (NEXT (p)) = PREVIOUS (p);
NODE_T *next = NEXT (p);
- free (p);
p = next;
}
else
diff --git a/gcc/algol68/a68-parser.cc b/gcc/algol68/a68-parser.cc
index 1f59177c81b..f01ecbee434 100644
--- a/gcc/algol68/a68-parser.cc
+++ b/gcc/algol68/a68-parser.cc
@@ -615,7 +615,7 @@ a68_parser (const char *filename)
NODE_INFO_T *
a68_new_node_info (void)
{
- NODE_INFO_T *z = (NODE_INFO_T *) xmalloc (sizeof (NODE_INFO_T));
+ NODE_INFO_T *z = ggc_cleared_alloc<NODE_INFO_T> ();
A68 (new_node_infos)++;
PROCEDURE_LEVEL (z) = 0;
@@ -638,7 +638,7 @@ a68_new_node_info (void)
GINFO_T *
a68_new_genie_info (void)
{
- GINFO_T *z = (GINFO_T *) xmalloc (sizeof (GINFO_T));
+ GINFO_T *z = ggc_cleared_alloc<GINFO_T> ();
A68 (new_genie_infos)++;
PARTIAL_PROC (z) = NO_MOID;
@@ -651,7 +651,7 @@ a68_new_genie_info (void)
NODE_T *
a68_new_node (void)
{
- NODE_T *z = (NODE_T *) xmalloc (sizeof (NODE_T));
+ NODE_T *z = ggc_cleared_alloc<NODE_T> ();
A68 (new_nodes)++;
TABLE (z) = NO_TABLE;
@@ -691,7 +691,7 @@ a68_some_node (const char *t)
TABLE_T *
a68_new_symbol_table (TABLE_T *p)
{
- TABLE_T *z = (TABLE_T *) xmalloc (sizeof (TABLE_T));
+ TABLE_T *z = ggc_cleared_alloc<TABLE_T> ();
NUM (z) = A68 (symbol_table_count);
LEVEL (z) = A68 (symbol_table_count)++;
@@ -720,7 +720,7 @@ a68_new_symbol_table (TABLE_T *p)
MOID_T *
a68_new_moid (void)
{
- MOID_T *z = (MOID_T *) xmalloc (sizeof (MOID_T));
+ MOID_T *z = ggc_cleared_alloc<MOID_T> ();
A68 (new_modes)++;
ATTRIBUTE (z) = 0;
@@ -750,7 +750,7 @@ a68_new_moid (void)
PACK_T *
a68_new_pack (void)
{
- PACK_T *z = (PACK_T *) xmalloc (sizeof (PACK_T));
+ PACK_T *z = ggc_cleared_alloc<PACK_T> ();
MOID (z) = NO_MOID;
TEXT (z) = NO_TEXT;
@@ -765,7 +765,7 @@ a68_new_pack (void)
TAG_T *
a68_new_tag (void)
{
- TAG_T *z = (TAG_T *) xmalloc (sizeof (TAG_T));
+ TAG_T *z = ggc_cleared_alloc<TAG_T> ();
STATUS (z) = NULL_MASK;
TAG_TABLE (z) = NO_TABLE;
diff --git a/gcc/algol68/a68-types.h b/gcc/algol68/a68-types.h
index f96afa0ff2c..fd9d90c9b3e 100644
--- a/gcc/algol68/a68-types.h
+++ b/gcc/algol68/a68-types.h
@@ -22,6 +22,9 @@
#ifndef __A68_TYPES_H__
#define __A68_TYPES_H__
+#include "config.h"
+#include "system.h"
+
#include <setjmp.h>
#include "vec.h"
@@ -236,7 +239,7 @@ struct KEYWORD_T
#define NO_MOID ((MOID_T *) 0)
-struct MOID_T
+struct GTY(()) MOID_T
{
int number;
int attribute;
@@ -431,7 +434,7 @@ struct OPTIONS_T
CDECL is a GCC GENERIC tree corresponding to a DECL_FIELD for FIELD
nodes. */
-struct NODE_T
+struct GTY(()) NODE_T
{
GINFO_T *genie;
int number;
@@ -475,7 +478,7 @@ struct NODE_T
This is set for tree nodes representing tokens and is set by the
parser-scanner. */
-struct NODE_INFO_T
+struct GTY(()) NODE_INFO_T
{
int procedure_level;
int priority;
@@ -492,12 +495,12 @@ struct NODE_INFO_T
LINE_T *line;
};
-struct GINFO_T
+struct GTY(()) GINFO_T
{
MOID_T *partial_proc, *partial_locale;
};
-struct PACK_T
+struct GTY(()) PACK_T
{
MOID_T *type;
const char *text;
@@ -523,7 +526,7 @@ struct SOID_T
SOID_T *next;
};
-struct LINE_T
+struct GTY(()) LINE_T
{
char marker[6], *string;
const char *filename;
@@ -539,7 +542,7 @@ struct LINE_T
ranges will be put in the top-level block. This is used for top-level
module declarations. */
-struct TABLE_T
+struct GTY(()) TABLE_T
{
int num, level, nest, attribute;
bool initialise_frame, initialise_anon, proc_ops, public_range;
@@ -610,7 +613,7 @@ struct TABLE_T
LOWERER is a lowering routine defined in a68-low-prelude.cc. These are used
in taxes that denote some pre-defined operator. */
-struct TAG_T
+struct GTY(()) TAG_T
{
TABLE_T *symbol_table;
MOID_T *type;
@@ -673,9 +676,9 @@ struct MODULE_T
set, the exported symbol shall not be indirected. This is compiler-specific
and part of mdextra. */
-struct EXTRACT_T
+struct GTY(()) EXTRACT_T
{
- uint8_t kind;
+ unsigned int kind;
char *symbol;
MOID_T *mode;
int priority;
@@ -702,18 +705,18 @@ struct EXTRACT_T
#define NO_MOIF ((MOIF_T *) 0)
-struct MOIF_T
+struct GTY(()) MOIF_T
{
- uint16_t version;
+ unsigned int version;
char *name;
char *prelude;
char *postlude;
- vec<MOID_T*> modes;
- vec<EXTRACT_T*> modules;
- vec<EXTRACT_T*> indicants;
- vec<EXTRACT_T*> identifiers;
- vec<EXTRACT_T*> prios;
- vec<EXTRACT_T*> operators;
+ vec<MOID_T*,va_gc> *modes;
+ vec<EXTRACT_T*,va_gc> *modules;
+ vec<EXTRACT_T*,va_gc> *indicants;
+ vec<EXTRACT_T*,va_gc> *identifiers;
+ vec<EXTRACT_T*,va_gc> *prios;
+ vec<EXTRACT_T*,va_gc> *operators;
};
struct MODE_CACHE_T
diff --git a/gcc/algol68/config-lang.in b/gcc/algol68/config-lang.in
index 88370b06cad..881bd033ea8 100644
--- a/gcc/algol68/config-lang.in
+++ b/gcc/algol68/config-lang.in
@@ -24,6 +24,6 @@
language="algol68"
compilers="a681\$(exeext)"
-gtfiles="\$(srcdir)/algol68/a68-lang.cc"
+gtfiles="\$(srcdir)/algol68/a68-types.h \$(srcdir)/algol68/a68.h \$(srcdir)/algol68/a68-lang.cc \$(srcdir)/algol68/a68-low-ranges.cc"
target_libs="target-libga68"
--
2.30.2
More information about the Algol68
mailing list