[COMMITTED] algol68: factorize out a68_get_line_location
Jose E. Marchesi
jemarch@gnu.org
Fri Mar 14 09:46:53 GMT 2025
---
gcc/algol68/a68-diagnostics.cc | 36 ++++++++++------------------------
gcc/algol68/a68-parser.cc | 16 ++++++++++++++-
gcc/algol68/a68.h | 1 +
3 files changed, 26 insertions(+), 27 deletions(-)
diff --git a/gcc/algol68/a68-diagnostics.cc b/gcc/algol68/a68-diagnostics.cc
index 6063a4fb011..3b5d0dae795 100644
--- a/gcc/algol68/a68-diagnostics.cc
+++ b/gcc/algol68/a68-diagnostics.cc
@@ -358,14 +358,7 @@ diagnostic (int sev, int opt,
if (p != NO_NODE)
loc = a68_get_node_location (p);
else if (line != NO_LINE)
- {
- /* XXX abstract this in a function and use it in an
- a68_get_line_location function. */
- linemap_add (line_table, LC_ENTER, 0, FILENAME (line), NUMBER (line));
- linemap_line_start (line_table, NUMBER (line), 0);
- loc = linemap_position_for_column (line_table, pos - STRING (line) + 1);
- linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
- }
+ loc = a68_get_line_location (line, pos);
else
loc = UNKNOWN_LOCATION;
@@ -438,32 +431,23 @@ a68_warning (NODE_T *p, int opt,
/* Emit diagnostics. */
void
-a68_emit_diagnostics (LINE_T *p)
+a68_emit_diagnostics (LINE_T *line)
{
- for (; p != NO_LINE; FORWARD (p))
+ for (; line != NO_LINE; FORWARD (line))
{
- for (DIAGNOSTIC_T *d = DIAGNOSTICS (p); d != NO_DIAGNOSTIC; FORWARD (d))
+ for (DIAGNOSTIC_T *d = DIAGNOSTICS (line); d != NO_DIAGNOSTIC; FORWARD (d))
{
- location_t gcc_location = input_location;
- const char *filename = FILENAME (p);
- char *pos;
- int column = 0;
+ location_t loc;
- if (WHERE (d) != NO_NODE && p == LINE (INFO (WHERE (d))))
- pos = CHAR_IN_LINE (INFO (WHERE (d)));
+ if (WHERE (d) != NO_NODE && line == LINE (INFO (WHERE (d))))
+ loc = a68_get_node_location (WHERE (d));
else
- pos = STRING (p);
- column = pos - STRING (p) + 1;
-
- linemap_add (line_table, LC_ENTER, 0, filename, NUMBER (p));
- linemap_line_start (line_table, NUMBER (p), 0);
- gcc_location = linemap_position_for_column (line_table, column);
- linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
+ loc = a68_get_line_location (line, STRING (line));
if (SEVERITY (d) == A68_WARNING)
- warning_at (gcc_location, OPT (d), "%s", TEXT (d));
+ warning_at (loc, OPT (d), "%s", TEXT (d));
else if (SEVERITY (d) == A68_ERROR)
- error_at (gcc_location, "%s", TEXT (d));
+ error_at (loc, "%s", TEXT (d));
else
/* Fatal errors are emitted immediately. */
gcc_unreachable ();
diff --git a/gcc/algol68/a68-parser.cc b/gcc/algol68/a68-parser.cc
index 0eaba12f6e2..a88d8c6056e 100644
--- a/gcc/algol68/a68-parser.cc
+++ b/gcc/algol68/a68-parser.cc
@@ -1121,7 +1121,7 @@ a68_get_node_location (NODE_T *p)
unsigned column_number = CHAR_IN_LINE (INFO (p)) - STRING (line) + 1;
const char *filename = FILENAME (line);
- location_t gcc_location = input_location;
+ location_t gcc_location;
linemap_add (line_table, LC_ENTER, 0, filename, line_number);
linemap_line_start (line_table, line_number, 0);
@@ -1130,3 +1130,17 @@ a68_get_node_location (NODE_T *p)
return gcc_location;
}
+
+/* Get the location of POS inside LINE as a GCC location. */
+
+location_t
+a68_get_line_location (LINE_T *line, const char *pos)
+{
+ location_t loc;
+
+ linemap_add (line_table, LC_ENTER, 0, FILENAME (line), NUMBER (line));
+ linemap_line_start (line_table, NUMBER (line), 0);
+ loc = linemap_position_for_column (line_table, pos - STRING (line) + 1);
+ linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
+ return loc;
+}
diff --git a/gcc/algol68/a68.h b/gcc/algol68/a68.h
index 2c9881070a3..1dc82406a01 100644
--- a/gcc/algol68/a68.h
+++ b/gcc/algol68/a68.h
@@ -245,6 +245,7 @@ void a68_bufcpy (char *dst, const char *src, int len);
char *a68_new_string (const char *t, ...);
const char *a68_attribute_name (enum a68_attribute attr);
location_t a68_get_node_location (NODE_T *p);
+location_t a68_get_line_location (LINE_T *line, const char *pos);
/* a68-parser-top-down.cc */
--
2.30.2
More information about the Algol68
mailing list