ipa/92606 - properly handle no_icf attribute for variables

Message ID 20231211091920.EC4A83858413@sourceware.org
State Committed
Commit eee13a3730bd1d7aa7b40687b1ee49c17d95159f
Headers
Series ipa/92606 - properly handle no_icf attribute for variables |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Testing passed

Commit Message

Richard Biener Dec. 11, 2023, 9:17 a.m. UTC
  The following adds no_icf handling for variables where the attribute
was rejected.  It also fixes the check for no_icf by checking both
the source and the targets decl.

Bootstrap / regtest running on x86_64-unknown-linux-gnu.

This would solve the AVR issue with merging of "progmem" attributed
and non-"progmem" attributed variables if they'd also add no_icf there.

OK?

Thanks,
Richard.

	PR ipa/92606
gcc/c-family/
	* c-attribs.cc (handle_noicf_attribute): Also allow the
	attribute on global variables.

gcc/
	* ipa-icf.cc (sem_item_optimizer::merge_classes): Check
	both source and alias for the no_icf attribute.
	* doc/extend.texi (no_icf): Document variable attribute.
---
 gcc/c-family/c-attribs.cc | 3 ++-
 gcc/doc/extend.texi       | 5 +++++
 gcc/ipa-icf.cc            | 3 ++-
 3 files changed, 9 insertions(+), 2 deletions(-)
  

Patch

diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc
index 854e987dc79..a3671fe3a57 100644
--- a/gcc/c-family/c-attribs.cc
+++ b/gcc/c-family/c-attribs.cc
@@ -1649,7 +1649,8 @@  handle_noicf_attribute (tree *node, tree name,
 			tree ARG_UNUSED (args),
 			int ARG_UNUSED (flags), bool *no_add_attrs)
 {
-  if (TREE_CODE (*node) != FUNCTION_DECL)
+  if (TREE_CODE (*node) != FUNCTION_DECL
+      && (TREE_CODE (*node) != VAR_DECL || !is_global_var (*node)))
     {
       warning (OPT_Wattributes, "%qE attribute ignored", name);
       *no_add_attrs = true;
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index e8b5e771f7a..f0c789f6cb4 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -8152,6 +8152,11 @@  script to place the sections with the @code{.persistent} prefix in the
 right location.  Specifically, some type of non-volatile, writeable
 memory is required.
 
+@cindex @code{no_icf} variable attribute
+@item no_icf
+This variable attribute prevents a variable from being merged with another
+equivalent variable.
+
 @cindex @code{objc_nullability} variable attribute
 @item objc_nullability (@var{nullability kind}) @r{(Objective-C and Objective-C++ only)}
 This attribute applies to pointer variables only.  It allows marking the
diff --git a/gcc/ipa-icf.cc b/gcc/ipa-icf.cc
index 81232d5706e..e27536d73a9 100644
--- a/gcc/ipa-icf.cc
+++ b/gcc/ipa-icf.cc
@@ -3422,7 +3422,8 @@  sem_item_optimizer::merge_classes (unsigned int prev_class_count,
 				 alias->node->dump_asm_name ());
 	      }
 
-	    if (lookup_attribute ("no_icf", DECL_ATTRIBUTES (alias->decl)))
+	    if (lookup_attribute ("no_icf", DECL_ATTRIBUTES (alias->decl))
+		|| lookup_attribute ("no_icf", DECL_ATTRIBUTES (source->decl)))
 	      {
 		if (dump_enabled_p ())
 		  dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,