Re: [PATCH v6 2/5] Convert references with "counted_by" attributes to/from .ACCESS_WITH_SIZE.
> On Mar 11, 2024, at 13:09, Siddhesh Poyarekar wrote: > > > > On 2024-02-16 14:47, Qing Zhao wrote: >> Including the following changes: >> * The definition of the new internal function .ACCESS_WITH_SIZE >> in internal-fn.def. >> * C FE converts every reference to a FAM with a "counted_by" attribute >> to a call to the internal function .ACCESS_WITH_SIZE. >> (build_component_ref in c_typeck.cc) >> This includes the case when the object is statically allocated and >> initialized. >> In order to make this working, the routines initializer_constant_valid_p_1 >> and output_constant in varasm.cc are updated to handle calls to >> .ACCESS_WITH_SIZE. >> (initializer_constant_valid_p_1 and output_constant in varasm.c) >> However, for the reference inside "offsetof", the "counted_by" attribute is >> ignored since it's not useful at all. >> (c_parser_postfix_expression in c/c-parser.cc) >> In addtion to "offsetof", for the reference inside operator "typeof" and >> "alignof", we ignore counted_by attribute too. >> When building ADDR_EXPR for the .ACCESS_WITH_SIZE in C FE, >> replace the call with its first argument. >> * Convert every call to .ACCESS_WITH_SIZE to its first argument. >> (expand_ACCESS_WITH_SIZE in internal-fn.cc) >> * Adjust alias analysis to exclude the new internal from clobbering anything. >> (ref_maybe_used_by_call_p_1 and call_may_clobber_ref_p_1 in >> tree-ssa-alias.cc) >> * Adjust dead code elimination to eliminate the call to .ACCESS_WITH_SIZE >> when >> it's LHS is eliminated as dead code. >> (eliminate_unnecessary_stmts in tree-ssa-dce.cc) >> * Provide the utility routines to check the call is .ACCESS_WITH_SIZE and >> get the reference from the call to .ACCESS_WITH_SIZE. >> (is_access_with_size_p and get_ref_from_access_with_size in tree.cc) >> gcc/c/ChangeLog: >> * c-parser.cc (c_parser_postfix_expression): Ignore the counted-by >> attribute when build_component_ref inside offsetof operator. >> * c-tree.h (build_component_ref): Add one more parameter. >> * c-typeck.cc (build_counted_by_ref): New function. >> (build_access_with_size_for_counted_by): New function. >> (build_component_ref): Check the counted-by attribute and build >> call to .ACCESS_WITH_SIZE. >> (build_unary_op): When building ADDR_EXPR for >> .ACCESS_WITH_SIZE, use its first argument. >> (lvalue_p): Accept call to .ACCESS_WITH_SIZE. >> gcc/ChangeLog: >> * internal-fn.cc (expand_ACCESS_WITH_SIZE): New function. >> * internal-fn.def (ACCESS_WITH_SIZE): New internal function. >> * tree-ssa-alias.cc (ref_maybe_used_by_call_p_1): Special case >> IFN_ACCESS_WITH_SIZE. >> (call_may_clobber_ref_p_1): Special case IFN_ACCESS_WITH_SIZE. >> * tree-ssa-dce.cc (eliminate_unnecessary_stmts): Eliminate the call >> to .ACCESS_WITH_SIZE when its LHS is dead. >> * tree.cc (process_call_operands): Adjust side effect for function >> .ACCESS_WITH_SIZE. >> (is_access_with_size_p): New function. >> (get_ref_from_access_with_size): New function. >> * tree.h (is_access_with_size_p): New prototype. >> (get_ref_from_access_with_size): New prototype. >> * varasm.cc (initializer_constant_valid_p_1): Handle call to >> .ACCESS_WITH_SIZE. >> (output_constant): Handle call to .ACCESS_WITH_SIZE. >> gcc/testsuite/ChangeLog: >> * gcc.dg/flex-array-counted-by-2.c: New test. >> --- >> gcc/c/c-parser.cc | 10 +- >> gcc/c/c-tree.h| 2 +- >> gcc/c/c-typeck.cc | 128 +- >> gcc/internal-fn.cc| 36 + >> gcc/internal-fn.def | 4 + >> .../gcc.dg/flex-array-counted-by-2.c | 112 +++ >> gcc/tree-ssa-alias.cc | 2 + >> gcc/tree-ssa-dce.cc | 5 +- >> gcc/tree.cc | 25 +++- >> gcc/tree.h| 8 ++ >> gcc/varasm.cc | 10 ++ >> 11 files changed, 332 insertions(+), 10 deletions(-) >> create mode 100644 gcc/testsuite/gcc.dg/flex-array-counted-by-2.c >> diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc >> index c31349dae2ff..a6ed5ac43bb1 100644 >> --- a/gcc/c/c-parser.cc >> +++ b/gcc/c/c-parser.cc >> @@ -10850,9 +10850,12 @@ c_parser_postfix_expression (c_parser *parser) >> if (c_parser_next_token_is (parser, CPP_NAME)) >>{ >> c_token *comp_tok = c_parser_peek_token (parser); >> +/* Ignore the counted_by attribute for reference inside >> + offsetof since the information is not useful at all. */ >> offsetof_ref >>= build_component_ref (loc, offsetof_ref, comp_tok->value, >> - comp_tok->location, UNKNOWN_LOCATION); >> +
Re: [PATCH v6 2/5] Convert references with "counted_by" attributes to/from .ACCESS_WITH_SIZE.
On 2024-02-16 14:47, Qing Zhao wrote: Including the following changes: * The definition of the new internal function .ACCESS_WITH_SIZE in internal-fn.def. * C FE converts every reference to a FAM with a "counted_by" attribute to a call to the internal function .ACCESS_WITH_SIZE. (build_component_ref in c_typeck.cc) This includes the case when the object is statically allocated and initialized. In order to make this working, the routines initializer_constant_valid_p_1 and output_constant in varasm.cc are updated to handle calls to .ACCESS_WITH_SIZE. (initializer_constant_valid_p_1 and output_constant in varasm.c) However, for the reference inside "offsetof", the "counted_by" attribute is ignored since it's not useful at all. (c_parser_postfix_expression in c/c-parser.cc) In addtion to "offsetof", for the reference inside operator "typeof" and "alignof", we ignore counted_by attribute too. When building ADDR_EXPR for the .ACCESS_WITH_SIZE in C FE, replace the call with its first argument. * Convert every call to .ACCESS_WITH_SIZE to its first argument. (expand_ACCESS_WITH_SIZE in internal-fn.cc) * Adjust alias analysis to exclude the new internal from clobbering anything. (ref_maybe_used_by_call_p_1 and call_may_clobber_ref_p_1 in tree-ssa-alias.cc) * Adjust dead code elimination to eliminate the call to .ACCESS_WITH_SIZE when it's LHS is eliminated as dead code. (eliminate_unnecessary_stmts in tree-ssa-dce.cc) * Provide the utility routines to check the call is .ACCESS_WITH_SIZE and get the reference from the call to .ACCESS_WITH_SIZE. (is_access_with_size_p and get_ref_from_access_with_size in tree.cc) gcc/c/ChangeLog: * c-parser.cc (c_parser_postfix_expression): Ignore the counted-by attribute when build_component_ref inside offsetof operator. * c-tree.h (build_component_ref): Add one more parameter. * c-typeck.cc (build_counted_by_ref): New function. (build_access_with_size_for_counted_by): New function. (build_component_ref): Check the counted-by attribute and build call to .ACCESS_WITH_SIZE. (build_unary_op): When building ADDR_EXPR for .ACCESS_WITH_SIZE, use its first argument. (lvalue_p): Accept call to .ACCESS_WITH_SIZE. gcc/ChangeLog: * internal-fn.cc (expand_ACCESS_WITH_SIZE): New function. * internal-fn.def (ACCESS_WITH_SIZE): New internal function. * tree-ssa-alias.cc (ref_maybe_used_by_call_p_1): Special case IFN_ACCESS_WITH_SIZE. (call_may_clobber_ref_p_1): Special case IFN_ACCESS_WITH_SIZE. * tree-ssa-dce.cc (eliminate_unnecessary_stmts): Eliminate the call to .ACCESS_WITH_SIZE when its LHS is dead. * tree.cc (process_call_operands): Adjust side effect for function .ACCESS_WITH_SIZE. (is_access_with_size_p): New function. (get_ref_from_access_with_size): New function. * tree.h (is_access_with_size_p): New prototype. (get_ref_from_access_with_size): New prototype. * varasm.cc (initializer_constant_valid_p_1): Handle call to .ACCESS_WITH_SIZE. (output_constant): Handle call to .ACCESS_WITH_SIZE. gcc/testsuite/ChangeLog: * gcc.dg/flex-array-counted-by-2.c: New test. --- gcc/c/c-parser.cc | 10 +- gcc/c/c-tree.h| 2 +- gcc/c/c-typeck.cc | 128 +- gcc/internal-fn.cc| 36 + gcc/internal-fn.def | 4 + .../gcc.dg/flex-array-counted-by-2.c | 112 +++ gcc/tree-ssa-alias.cc | 2 + gcc/tree-ssa-dce.cc | 5 +- gcc/tree.cc | 25 +++- gcc/tree.h| 8 ++ gcc/varasm.cc | 10 ++ 11 files changed, 332 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/flex-array-counted-by-2.c diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index c31349dae2ff..a6ed5ac43bb1 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -10850,9 +10850,12 @@ c_parser_postfix_expression (c_parser *parser) if (c_parser_next_token_is (parser, CPP_NAME)) { c_token *comp_tok = c_parser_peek_token (parser); + /* Ignore the counted_by attribute for reference inside + offsetof since the information is not useful at all. */ offsetof_ref = build_component_ref (loc, offsetof_ref, comp_tok->value, -comp_tok->location, UNKNOWN_LOCATION); +comp_tok->location, UNKNOWN_LOCATION, +false); c_parser_consume_token (parser);
[PATCH v6 2/5] Convert references with "counted_by" attributes to/from .ACCESS_WITH_SIZE.
Including the following changes: * The definition of the new internal function .ACCESS_WITH_SIZE in internal-fn.def. * C FE converts every reference to a FAM with a "counted_by" attribute to a call to the internal function .ACCESS_WITH_SIZE. (build_component_ref in c_typeck.cc) This includes the case when the object is statically allocated and initialized. In order to make this working, the routines initializer_constant_valid_p_1 and output_constant in varasm.cc are updated to handle calls to .ACCESS_WITH_SIZE. (initializer_constant_valid_p_1 and output_constant in varasm.c) However, for the reference inside "offsetof", the "counted_by" attribute is ignored since it's not useful at all. (c_parser_postfix_expression in c/c-parser.cc) In addtion to "offsetof", for the reference inside operator "typeof" and "alignof", we ignore counted_by attribute too. When building ADDR_EXPR for the .ACCESS_WITH_SIZE in C FE, replace the call with its first argument. * Convert every call to .ACCESS_WITH_SIZE to its first argument. (expand_ACCESS_WITH_SIZE in internal-fn.cc) * Adjust alias analysis to exclude the new internal from clobbering anything. (ref_maybe_used_by_call_p_1 and call_may_clobber_ref_p_1 in tree-ssa-alias.cc) * Adjust dead code elimination to eliminate the call to .ACCESS_WITH_SIZE when it's LHS is eliminated as dead code. (eliminate_unnecessary_stmts in tree-ssa-dce.cc) * Provide the utility routines to check the call is .ACCESS_WITH_SIZE and get the reference from the call to .ACCESS_WITH_SIZE. (is_access_with_size_p and get_ref_from_access_with_size in tree.cc) gcc/c/ChangeLog: * c-parser.cc (c_parser_postfix_expression): Ignore the counted-by attribute when build_component_ref inside offsetof operator. * c-tree.h (build_component_ref): Add one more parameter. * c-typeck.cc (build_counted_by_ref): New function. (build_access_with_size_for_counted_by): New function. (build_component_ref): Check the counted-by attribute and build call to .ACCESS_WITH_SIZE. (build_unary_op): When building ADDR_EXPR for .ACCESS_WITH_SIZE, use its first argument. (lvalue_p): Accept call to .ACCESS_WITH_SIZE. gcc/ChangeLog: * internal-fn.cc (expand_ACCESS_WITH_SIZE): New function. * internal-fn.def (ACCESS_WITH_SIZE): New internal function. * tree-ssa-alias.cc (ref_maybe_used_by_call_p_1): Special case IFN_ACCESS_WITH_SIZE. (call_may_clobber_ref_p_1): Special case IFN_ACCESS_WITH_SIZE. * tree-ssa-dce.cc (eliminate_unnecessary_stmts): Eliminate the call to .ACCESS_WITH_SIZE when its LHS is dead. * tree.cc (process_call_operands): Adjust side effect for function .ACCESS_WITH_SIZE. (is_access_with_size_p): New function. (get_ref_from_access_with_size): New function. * tree.h (is_access_with_size_p): New prototype. (get_ref_from_access_with_size): New prototype. * varasm.cc (initializer_constant_valid_p_1): Handle call to .ACCESS_WITH_SIZE. (output_constant): Handle call to .ACCESS_WITH_SIZE. gcc/testsuite/ChangeLog: * gcc.dg/flex-array-counted-by-2.c: New test. --- gcc/c/c-parser.cc | 10 +- gcc/c/c-tree.h| 2 +- gcc/c/c-typeck.cc | 128 +- gcc/internal-fn.cc| 36 + gcc/internal-fn.def | 4 + .../gcc.dg/flex-array-counted-by-2.c | 112 +++ gcc/tree-ssa-alias.cc | 2 + gcc/tree-ssa-dce.cc | 5 +- gcc/tree.cc | 25 +++- gcc/tree.h| 8 ++ gcc/varasm.cc | 10 ++ 11 files changed, 332 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/flex-array-counted-by-2.c diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index c31349dae2ff..a6ed5ac43bb1 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -10850,9 +10850,12 @@ c_parser_postfix_expression (c_parser *parser) if (c_parser_next_token_is (parser, CPP_NAME)) { c_token *comp_tok = c_parser_peek_token (parser); + /* Ignore the counted_by attribute for reference inside + offsetof since the information is not useful at all. */ offsetof_ref = build_component_ref (loc, offsetof_ref, comp_tok->value, -comp_tok->location, UNKNOWN_LOCATION); +comp_tok->location, UNKNOWN_LOCATION, +false); c_parser_consume_token (parser); while (c_parser_next_token_is (parser, CPP_DOT) ||