[gcc r14-9237] Change 'v1' float and int code to fall back to v0

Tom Tromey tromey@gcc.gnu.org
Thu Feb 29 16:07:50 GMT 2024


https://gcc.gnu.org/g:fd846abc2d0b9d7c9d4d2965a63b80ddc300b870

commit r14-9237-gfd846abc2d0b9d7c9d4d2965a63b80ddc300b870
Author: Tom Tromey <tom@tromey.com>
Date:   Thu Feb 22 19:34:23 2024 -0700

    Change 'v1' float and int code to fall back to v0
    
    While working on another patch, I discovered that the libcc1 plugin
    code never did version negotiation correctly.  So, the patches to
    introduce v1 never did anything -- the new code, as far as I know, has
    never been run.
    
    Making version negotiation work shows that the existing code causes
    crashes.  For example, safe_lookup_builtin_type might return
    error_mark_node in some cases, which the callers aren't prepared to
    accept.
    
    Looking into it some more, I couldn't find any justification for this
    v1 code for the C compiler plugin.  Since it's not run at all, it's
    also clear that removing it doesn't cause any regressions in gdb.
    
    However, rather than remove it, this patch changes it to handle
    ERROR_MARK better, and then to fall back to the v0 code if the new
    code fails to find the type it's looking for.
    
    libcc1
    
            * libcc1plugin.cc (safe_lookup_builtin_type): Handle ERROR_MARK.
            (plugin_int_type): Fall back to plugin_int_type_v0.
            (plugin_float_type): Fall back to plugin_float_type_v0.

Diff:
---
 libcc1/libcc1plugin.cc | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/libcc1/libcc1plugin.cc b/libcc1/libcc1plugin.cc
index 00d3963029d..f1082d8e9d3 100644
--- a/libcc1/libcc1plugin.cc
+++ b/libcc1/libcc1plugin.cc
@@ -555,7 +555,7 @@ safe_lookup_builtin_type (const char *builtin_name)
 
   gcc_assert (TREE_CODE (result) == TYPE_DECL);
   result = TREE_TYPE (result);
-  return result;
+  return TREE_CODE (result) == ERROR_MARK ? nullptr : result;
 }
 
 static gcc_type
@@ -592,13 +592,14 @@ plugin_int_type (cc1_plugin::connection *self,
 		 int is_unsigned, unsigned long size_in_bytes,
 		 const char *builtin_name)
 {
-  if (!builtin_name)
-    return plugin_int_type_v0 (self, is_unsigned, size_in_bytes);
-
-  tree result = safe_lookup_builtin_type (builtin_name);
-  gcc_assert (!result || TREE_CODE (result) == INTEGER_TYPE);
-
-  return plugin_int_check (self, is_unsigned, size_in_bytes, result);
+  if (builtin_name != nullptr)
+    {
+      tree result = safe_lookup_builtin_type (builtin_name);
+      gcc_assert (!result || TREE_CODE (result) == INTEGER_TYPE);
+      if (result != nullptr)
+	return plugin_int_check (self, is_unsigned, size_in_bytes, result);
+    }
+  return plugin_int_type_v0 (self, is_unsigned, size_in_bytes);
 }
 
 gcc_type
@@ -631,7 +632,7 @@ plugin_float_type (cc1_plugin::connection *self,
   tree result = safe_lookup_builtin_type (builtin_name);
 
   if (!result)
-    return convert_out (error_mark_node);
+    return plugin_float_type_v0 (self, size_in_bytes);
 
   gcc_assert (SCALAR_FLOAT_TYPE_P (result));
   gcc_assert (BITS_PER_UNIT * size_in_bytes == TYPE_PRECISION (result));


More information about the Gcc-cvs mailing list