On 06/05/2018 03:43 PM, Martin Sebor wrote: > The attached patch adds basic support for handling strnlen > as a built-in function. It touches the strlen pass where > it folds constant results of the function, and builtins.c > to add simple support for expanding strnlen calls with known > results. It also changes calls.c to detect excessive bounds > to the function and unsafe calls with arguments declared > attribute nonstring. > > A side-effect of the strlen change I should call out is that > strlen() calls to all zero-length arrays that aren't considered > flexible array members (i.e., internal members or non-members) > are folded into zero. No warning is issued for such invalid > uses of zero-length arrays but based on the responses to my > question Re: aliasing between internal zero-length-arrays and > other members(*) it sounds like one would be appropriate. > I will see about adding one in a separate patch. > > Martin > > [*] https://gcc.gnu.org/ml/gcc/2018-06/msg00046.html > > gcc-81384.diff > > > PR tree-optimization/81384 - built-in form of strnlen missing > > gcc/ChangeLog: > > PR tree-optimization/81384 > * builtin-types.def (BT_FN_SIZE_CONST_STRING_SIZE): New. > * builtins.c (expand_builtin_strnlen): New function. > (expand_builtin): Call it. > (fold_builtin_n): Avoid setting TREE_NO_WARNING. > * builtins.def (BUILT_IN_STRNLEN): New. > * calls.c (maybe_warn_nonstring_arg): Handle BUILT_IN_STRNLEN. > Warn for bounds in excess of maximum object size. > * tree-ssa-strlen.c (maybe_set_strlen_range): Return tree representing > single-value ranges. Handle strnlen. > (handle_builtin_strlen): Handle strnlen. > (strlen_check_and_optimize_stmt): Same. > > gcc/testsuite/ChangeLog: > > PR tree-optimization/81384 > * gcc.c-torture/execute/builtins/lib/strnlen.c: New test. > * gcc.c-torture/execute/builtins/strnlen-lib.c: New test. > * gcc.c-torture/execute/builtins/strnlen.c: New test. > * gcc.dg/attr-nonstring-2.c: New test. > * gcc.dg/attr-nonstring-3.c: New test. > * gcc.dg/attr-nonstring-4.c: New test. > * gcc.dg/strlenopt-44.c: New test. > * gcc.dg/strlenopt.h (strnlen): Declare. > > diff --git a/gcc/builtin-types.def b/gcc/builtin-types.def > index 5365bef..1f15350 100644 > --- a/gcc/builtin-types.def > +++ b/gcc/builtin-types.def > @@ -322,6 +322,8 @@ DEF_FUNCTION_TYPE_2 (BT_FN_STRING_CONST_STRING_INT, > BT_STRING, BT_CONST_STRING, BT_INT) > DEF_FUNCTION_TYPE_2 (BT_FN_STRING_CONST_STRING_SIZE, > BT_STRING, BT_CONST_STRING, BT_SIZE) > +DEF_FUNCTION_TYPE_2 (BT_FN_SIZE_CONST_STRING_SIZE, > + BT_SIZE, BT_CONST_STRING, BT_SIZE) > DEF_FUNCTION_TYPE_2 (BT_FN_INT_CONST_STRING_FILEPTR, > BT_INT, BT_CONST_STRING, BT_FILEPTR) > DEF_FUNCTION_TYPE_2 (BT_FN_INT_INT_FILEPTR, I believe Jakub already suggested these change and you ack'd that.
You have some hunks which will need updating now that the CHKP/MPX bits are gone. So OK after the cleanups noted above and a fresh bootstrap & regression test cycle. jeff