aboutsummaryrefslogtreecommitdiff
path: root/gcc/attr-fnspec.h
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2021-11-13 15:20:00 +0100
committerJan Hubicka <jh@suse.cz>2021-11-13 15:20:00 +0100
commite2dd12ab66d14ac76a92b4538af81f8361132ba0 (patch)
treecee2ae844d596479c28b09dfa893bd4828ed2aea /gcc/attr-fnspec.h
parentb7a23949b0dcc4205fcc2be6b84b91441faa384d (diff)
downloadgcc-e2dd12ab66d14ac76a92b4538af81f8361132ba0.zip
gcc-e2dd12ab66d14ac76a92b4538af81f8361132ba0.tar.gz
gcc-e2dd12ab66d14ac76a92b4538af81f8361132ba0.tar.bz2
Remember fnspec based EAF flags in modref summary.
gcc/ChangeLog: * attr-fnspec.h (attr_fnspec::arg_eaf_flags): Break out from ... * gimple.c (gimple_call_arg_flags): ... here. * ipa-modref.c (analyze_parms): Record flags known from fnspec. (modref_merge_call_site_flags): Use arg_eaf_flags.
Diffstat (limited to 'gcc/attr-fnspec.h')
-rw-r--r--gcc/attr-fnspec.h23
1 files changed, 23 insertions, 0 deletions
diff --git a/gcc/attr-fnspec.h b/gcc/attr-fnspec.h
index 1154c30..cd618cb 100644
--- a/gcc/attr-fnspec.h
+++ b/gcc/attr-fnspec.h
@@ -264,6 +264,29 @@ public:
return str[1] == 'C' || str[1] == 'P';
}
+ /* Return EAF flags for arg I. */
+ int
+ arg_eaf_flags (unsigned int i)
+ {
+ int flags = 0;
+
+ if (!arg_specified_p (i))
+ ;
+ else if (!arg_used_p (i))
+ flags = EAF_UNUSED;
+ else
+ {
+ if (arg_direct_p (i))
+ flags |= EAF_NO_INDIRECT_READ | EAF_NO_INDIRECT_ESCAPE
+ | EAF_NOT_RETURNED_INDIRECTLY | EAF_NO_INDIRECT_CLOBBER;
+ if (arg_noescape_p (i))
+ flags |= EAF_NO_DIRECT_ESCAPE | EAF_NO_INDIRECT_ESCAPE;
+ if (arg_readonly_p (i))
+ flags |= EAF_NO_DIRECT_CLOBBER | EAF_NO_INDIRECT_CLOBBER;
+ }
+ return flags;
+ }
+
/* Check validity of the string. */
void verify ();