> Am 11.04.2025 um 21:10 schrieb Jakub Jelinek <ja...@redhat.com>:
>
> Hi!
>
> With --enable-host-pie -freport-bug almost never prepares preprocessed
> source and instead emits
> The bug is not reproducible, so it is likely a hardware or OS problem.
> message even for bogus which are 100% reproducible.
> The way -freport-bug works is that it reruns it 3 times, capturing stdout
> and stderr from each and then tries to compare the outputs in between
> different runs.
> The libbacktrace emitted hexadecimal addresses at the start of the lines
> can differ between runs due to ASLR, either of the PIE executable, or
> even if not PIE if there is some frame with e.g. libc function (say
> crash in strlen/memcpy etc.).
>
> The following patch fixes it by ignoring such differences at the start of
> the lines.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Ok
Richard
> 2025-04-11 Jakub Jelinek <ja...@redhat.com>
>
> PR driver/119727
> * gcc.cc (files_equal_p): Rewritten using fopen/fgets/fclose instead
> of open/fstat/read/close. At the start of lines, ignore lowercase
> hexadecimal addresses followed by space.
>
> --- gcc/gcc.cc.jj 2025-04-08 14:08:51.593277105 +0200
> +++ gcc/gcc.cc 2025-04-11 16:59:03.849154566 +0200
> @@ -7744,55 +7744,58 @@ print_configuration (FILE *file)
>
> #define RETRY_ICE_ATTEMPTS 3
>
> -/* Returns true if FILE1 and FILE2 contain equivalent data, 0 otherwise. */
> +/* Returns true if FILE1 and FILE2 contain equivalent data, 0 otherwise.
> + If lines start with 0x followed by 1-16 lowercase hexadecimal digits
> + followed by a space, ignore anything before that space. These are
> + typically function addresses from libbacktrace and those can differ
> + due to ASLR. */
>
> static bool
> files_equal_p (char *file1, char *file2)
> {
> - struct stat st1, st2;
> - off_t n, len;
> - int fd1, fd2;
> - const int bufsize = 8192;
> - char *buf = XNEWVEC (char, bufsize);
> + FILE *f1 = fopen (file1, "rb");
> + FILE *f2 = fopen (file2, "rb");
> + char line1[256], line2[256];
>
> - fd1 = open (file1, O_RDONLY);
> - fd2 = open (file2, O_RDONLY);
> -
> - if (fd1 < 0 || fd2 < 0)
> - goto error;
> -
> - if (fstat (fd1, &st1) < 0 || fstat (fd2, &st2) < 0)
> - goto error;
> -
> - if (st1.st_size != st2.st_size)
> - goto error;
> -
> - for (n = st1.st_size; n; n -= len)
> + bool line_start = true;
> + while (fgets (line1, sizeof (line1), f1))
> {
> - len = n;
> - if ((int) len > bufsize / 2)
> - len = bufsize / 2;
> -
> - if (read (fd1, buf, len) != (int) len
> - || read (fd2, buf + bufsize / 2, len) != (int) len)
> + if (!fgets (line2, sizeof (line2), f2))
> + goto error;
> + char *p1 = line1, *p2 = line2;
> + if (line_start
> + && line1[0] == '0'
> + && line1[1] == 'x'
> + && line2[0] == '0'
> + && line2[1] == 'x')
> {
> - goto error;
> + int i, j;
> + for (i = 0; i < 16; ++i)
> + if (!ISXDIGIT (line1[2 + i]) || ISUPPER (line1[2 + i]))
> + break;
> + for (j = 0; j < 16; ++j)
> + if (!ISXDIGIT (line2[2 + j]) || ISUPPER (line2[2 + j]))
> + break;
> + if (i && line1[2 + i] == ' ' && j && line2[2 + j] == ' ')
> + {
> + p1 = line1 + i + 3;
> + p2 = line2 + j + 3;
> + }
> }
> -
> - if (memcmp (buf, buf + bufsize / 2, len) != 0)
> + if (strcmp (p1, p2) != 0)
> goto error;
> + line_start = strchr (line1, '\n') != NULL;
> }
> + if (fgets (line2, sizeof (line2), f2))
> + goto error;
>
> - free (buf);
> - close (fd1);
> - close (fd2);
> -
> + fclose (f1);
> + fclose (f2);
> return 1;
>
> error:
> - free (buf);
> - close (fd1);
> - close (fd2);
> + fclose (f1);
> + fclose (f2);
> return 0;
> }
>
>
> Jakub
>