This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] fix a couple of bugs in const string folding (PR 86532)

+      while (TREE_CODE (chartype) != INTEGER_TYPE)
+    chartype = TREE_TYPE (chartype);
This is a bit concerning.  First under what conditions is chartype not
going to be an INTEGER_TYPE?  And under what conditions will extracting
its type ultimately lead to something that is an INTEGER_TYPE?

chartype is usually (maybe even always) pointer type here:

  const char a[] = "123";
  extern int i;
  n = strlen (&a[i]);

But your hunch was correct that the loop isn't safe because
the element type need not be an integer (I didn't know/forgot
that the function is called for non-strings too).  The loop
should be replaced by:

      while (TREE_CODE (chartype) == ARRAY_TYPE
	     || TREE_CODE (chartype) == POINTER_TYPE)
	chartype = TREE_TYPE (chartype);

     if (TREE_CODE (chartype) != INTEGER_TYPE)
	return NULL;

I will update the patch before committing.

FWIW, it seems like it would be useful to extend the function to
non-string arguments.  That way it would be able to return array
initializers in cases like this:

  const struct A { int a[2]; }
    a = { { 1, 2 } },
    b = { { 1, 2 } };

  int f (void)
    return __builtin_memcmp (&a, &b, sizeof a);

which would in turn make it possible to fold the result of
such calls analogously to strlen or strcmp.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]