Hi, New patches attached. I also reformatted them with contrib/clang-format. For now, only tested with DEB_BUILD_OPTIONS="parallel=12 gcc-ice=XXX" make -j12 check-gcc-c++ from an existing build, with multiple combinations of XXX = { "nodump,norepro", "nodump", "norepro", "default" }.
Also made standalone tests for the has_deb_build_options() function. Regards, Gwenole. Le jeu. 7 déc. 2023 à 10:45, Matthias Klose <d...@debian.org> a écrit : > > On 06.12.23 10:30, Gwenole Beauchesne wrote: > > Package: gcc-13 > > Version: 13.2.0-7 > > > > The gcc-ice-dump.diff patch causes the GCC driver to test for the > > DEB_BUILD_OPTIONS environment variable and generate extra debug output > > when an ICE occurs, for instance. This is an interesting feature, > > while building other packages, but not while building GCC itself IMHO. > > Dejagnu would consider that as excess errors. > > > > I suggest to add variables to DEB_BUILD_OPTIONS to disable that > > feature, and use them accordingly for the gcc-13 package itself. > > Patches attached. Regression tested on x86_64-linux-gnu for > > --enable-languages=c,c++ on bullseye and bookworm. Not essential, but > > interesting to have for testing / trixie. > > please change that to also accept gcc-ice=norepro,nodump, > gcc-ice=nodump,norepro. > > please base your patches on > https://salsa.debian.org/toolchain-team/gcc/tree/gcc-13-debian > updating the gcc-ice-dump and gcc-ice-apport patches. > > thanks, Matthias
# DP: Report an ICE to apport (if apport is available # DP: and the environment variable GCC_NOAPPORT is not set) --- a/src/gcc/gcc.cc +++ b/src/gcc/gcc.cc @@ -7935,13 +7935,16 @@ do_report_bug (const char **new_argv, const int nargs, if (status == ATTEMPT_STATUS_SUCCESS) { const bool gcc_dump = has_deb_build_options ("gcc-ice", "nodump"); + const bool gcc_apport + = !env.get ("GCC_NOAPPORT") + && !access ("/usr/share/apport/gcc_ice_hook", R_OK | X_OK); if (gcc_dump) fnotice (stderr, "Preprocessed source stored into %s file," " please attach this to your bugreport.\n", *out_file); - if (gcc_dump) + if (gcc_dump || gcc_apport) { char *cmd = XNEWVEC (char, 50 + strlen (*out_file)); @@ -7955,6 +7958,15 @@ do_report_bug (const char **new_argv, const int nargs, fflush (stderr); free (cmd); } + if (gcc_apport) + { + char *cmd + = XNEWVEC (char, 50 + strlen (*out_file) + strlen (new_argv[0])); + sprintf (cmd, "/usr/share/apport/gcc_ice_hook %s %s", new_argv[0], + *out_file); + system (cmd); + free (cmd); + } /* Make sure it is not deleted. */ free (*out_file); *out_file = NULL;
# DP: For ICEs, dump the preprocessed source file to stderr # DP: when in a distro build environment. --- a/src/gcc/gcc.cc +++ b/src/gcc/gcc.cc @@ -3108,6 +3108,61 @@ access_check (const char *name, int mode) return access (name, mode); } +/* Check whether options line contains the specified variable, and + optionally set to the supplied value */ + +static bool +check_options (const char *options, const char *var = nullptr, + const char *val = nullptr) +{ + if (!var) + return false; + + const char *const var_found = strstr (options, var); + if (!var_found) + return false; + + if (val) + { + if (var_found[strlen (var)] != '=') + return false; + + const char *var_end = strchr (var_found, ' '); + if (!var_end) + var_end = strchr (var_found, '\0'); + + const char *const val_found = strstr (var_found, val); + if (!val_found || val_found > var_end) + return false; + + const char c0 = val_found[-1]; + const char c1 = val_found[strlen (val)]; + if ((c0 == '=' || c0 == ',') && (c1 == ',' || c1 == ' ' || c1 == '\0')) + return true; + } + else + { + const char c1 = var_found[strlen (var)]; + if (c1 == ' ' || c1 == '\0') + return true; + } + return false; +} + +/* Check whether DEB_BUILD_OPTIONS environment variable is set, and + that it does not contain the specified exclusion keyword. */ + +static bool +has_deb_build_options (const char *exclude_var = nullptr, + const char *exclude_val = nullptr) +{ + const char *const deb_build_options = env.get ("DEB_BUILD_OPTIONS"); + if (!deb_build_options) + return false; + + return !check_options (deb_build_options, exclude_var, exclude_val); +} + /* Callback for find_a_file. Appends the file name to the directory path. If the resulting file exists in the right mode, return the full pathname to the file. */ @@ -3634,9 +3673,10 @@ execute (void) /* For ICEs in cc1, cc1obj, cc1plus see if it is reproducible or not. */ const char *p; - if (flag_report_bug - && WEXITSTATUS (status) == ICE_EXIT_CODE - && i == 0 + const bool deb_build_options + = has_deb_build_options ("gcc-ice", "norepro"); + if ((flag_report_bug || deb_build_options) + && WEXITSTATUS (status) == ICE_EXIT_CODE && i == 0 && (p = strrchr (commands[0].argv[0], DIR_SEPARATOR)) && startswith (p + 1, "cc1")) try_generate_repro (commands[0].argv); @@ -7894,8 +7934,27 @@ do_report_bug (const char **new_argv, const int nargs, if (status == ATTEMPT_STATUS_SUCCESS) { - fnotice (stderr, "Preprocessed source stored into %s file," - " please attach this to your bugreport.\n", *out_file); + const bool gcc_dump = has_deb_build_options ("gcc-ice", "nodump"); + + if (gcc_dump) + fnotice (stderr, + "Preprocessed source stored into %s file," + " please attach this to your bugreport.\n", + *out_file); + if (gcc_dump) + { + char *cmd = XNEWVEC (char, 50 + strlen (*out_file)); + + sprintf (cmd, "/usr/bin/awk '{print \"%d:\", $0}' %s >&2", getpid (), + *out_file); + fprintf (stderr, "=== BEGIN GCC DUMP ===\n"); + fflush (stderr); + system (cmd); + fflush (stderr); + fprintf (stderr, "=== END GCC DUMP ===\n"); + fflush (stderr); + free (cmd); + } /* Make sure it is not deleted. */ free (*out_file); *out_file = NULL;