Hi. I'm sending the updated patch based on Egeyar's work. It utilizes a new environmental variable and uses the currently existing -frecord-gcc-switches option.
Thoughts? Martin
>From 9436d12e7a540691c6f2d6e2db4730a138e5c458 Mon Sep 17 00:00:00 2001 From: Martin Liska <mli...@suse.cz> Date: Thu, 5 Mar 2020 09:39:17 +0100 Subject: [PATCH] Change semantics of -frecord-gcc-switches. gcc/ChangeLog: 2020-03-05 Martin Liska <mli...@suse.cz> Egeyar Bagcioglu <egeyar.bagcio...@oracle.com> * common.opt: Make flag_record_gcc_switches also a driver option. * doc/tm.texi: Regenerate. * gcc.c (set_driver_command_line_envvar): New. (driver_handle_option): Handle OPT_frecord_gcc_switches and export command line into a ENV variable. (driver::main): Save command line. (driver::set_commandline): New. * gcc.h (set_commandline): New. * target.def: Simplify documentation by removal of unused enum values. * target.h (elf_record_gcc_switches): Change function type. * toplev.c (init_asm_output): Update call. * varasm.c (elf_record_gcc_switches): Record GCC version string and content of GCC_DRIVER_COMMAND_LINE. --- gcc/common.opt | 2 +- gcc/doc/tm.texi | 37 ++----------------------------------- gcc/gcc.c | 41 +++++++++++++++++++++++++++++++++++++++++ gcc/gcc.h | 1 + gcc/target.def | 37 ++----------------------------------- gcc/target.h | 2 +- gcc/toplev.c | 11 +---------- gcc/varasm.c | 46 ++++++++++------------------------------------ 8 files changed, 59 insertions(+), 118 deletions(-) diff --git a/gcc/common.opt b/gcc/common.opt index fa9da505fc2..60ca5a521c5 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -2246,7 +2246,7 @@ Common Joined RejectNegative Var(common_deferred_options) Defer ; records information in the assembler output file as comments, so ; they never reach the object file. frecord-gcc-switches -Common Report Var(flag_record_gcc_switches) +Common Driver Report Var(flag_record_gcc_switches) Record gcc command line switches in the object file. freg-struct-return diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 19985adac3e..30c71d60aff 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -8061,43 +8061,10 @@ need to override this if your target has special flags that might be set via @code{__attribute__}. @end deftypefn -@deftypefn {Target Hook} int TARGET_ASM_RECORD_GCC_SWITCHES (print_switch_type @var{type}, const char *@var{text}) +@deftypefn {Target Hook} void TARGET_ASM_RECORD_GCC_SWITCHES (void) Provides the target with the ability to record the gcc command line switches that have been passed to the compiler, and options that are -enabled. The @var{type} argument specifies what is being recorded. -It can take the following values: - -@table @gcctabopt -@item SWITCH_TYPE_PASSED -@var{text} is a command line switch that has been set by the user. - -@item SWITCH_TYPE_ENABLED -@var{text} is an option which has been enabled. This might be as a -direct result of a command line switch, or because it is enabled by -default or because it has been enabled as a side effect of a different -command line switch. For example, the @option{-O2} switch enables -various different individual optimization passes. - -@item SWITCH_TYPE_DESCRIPTIVE -@var{text} is either NULL or some descriptive text which should be -ignored. If @var{text} is NULL then it is being used to warn the -target hook that either recording is starting or ending. The first -time @var{type} is SWITCH_TYPE_DESCRIPTIVE and @var{text} is NULL, the -warning is for start up and the second time the warning is for -wind down. This feature is to allow the target hook to make any -necessary preparations before it starts to record switches and to -perform any necessary tidying up after it has finished recording -switches. - -@item SWITCH_TYPE_LINE_START -This option can be ignored by this target hook. - -@item SWITCH_TYPE_LINE_END -This option can be ignored by this target hook. -@end table - -The hook's return value must be zero. Other return values may be -supported in the future. +enabled. By default this hook is set to NULL, but an example implementation is provided for ELF based targets. Called @var{elf_record_gcc_switches}, diff --git a/gcc/gcc.c b/gcc/gcc.c index 9f790db0daf..673ba2935f9 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -235,6 +235,11 @@ static int verbose_only_flag; static int print_subprocess_help; +/* argc and argv used to call gcc. Necessary for + --record-gcc-command-line option. */ +static unsigned int driver_gcc_argc; +static const char **driver_gcc_argv; + /* Linker suffix passed to -fuse-ld=... */ static const char *use_ld; @@ -3724,6 +3729,28 @@ set_source_date_epoch_envvar () setenv ("SOURCE_DATE_EPOCH", source_date_epoch, 0); } +/* Set GCC_DRIVER_COMMAND_LINE enviromental variable that is later + used by -frecord-gcc-switches option. */ + +static void +set_driver_command_line_envvar () +{ + unsigned int length = 0; + for (unsigned int i = 0; i < driver_gcc_argc; i++) + length += strlen (driver_gcc_argv[i]) + 1; + + char *buffer = (char *)xmalloc (length); + char *ptr = buffer; + for (unsigned int i = 0; i < driver_gcc_argc; i++) + { + unsigned l = sprintf (ptr, i == 0 ? "%s" : " %s", driver_gcc_argv[i]); + ptr += l; + } + + setenv ("GCC_DRIVER_COMMAND_LINE", buffer, 0); + free (buffer); +} + /* Handle an option DECODED that is unknown to the option-processing machinery. */ @@ -4289,6 +4316,10 @@ driver_handle_option (struct gcc_options *opts, handle_foffload_option (arg); break; + case OPT_frecord_gcc_switches: + set_driver_command_line_envvar (); + break; + default: /* Various driver options need no special processing at this point, having been handled in a prescan above or being @@ -7387,6 +7418,7 @@ driver::main (int argc, char **argv) set_progname (argv[0]); expand_at_files (&argc, &argv); + set_commandline (argc, const_cast <const char **> (argv)); decode_argv (argc, const_cast <const char **> (argv)); global_initializations (); build_multilib_strings (); @@ -7430,6 +7462,15 @@ driver::set_progname (const char *argv0) const xmalloc_set_program_name (progname); } +/* Keep command line for --record-gcc-command-line. */ + +void +driver::set_commandline (int argc, const char **argv) const +{ + driver_gcc_argc = argc; + driver_gcc_argv = argv; +} + /* Expand any @ files within the command-line args, setting at_file_supplied if any were expanded. */ diff --git a/gcc/gcc.h b/gcc/gcc.h index 70d8f08f059..cde77fbaad7 100644 --- a/gcc/gcc.h +++ b/gcc/gcc.h @@ -37,6 +37,7 @@ class driver private: void set_progname (const char *argv0) const; + void set_commandline (int argc, const char **argv) const; void expand_at_files (int *argc, char ***argv) const; void decode_argv (int argc, const char **argv); void global_initializations (); diff --git a/gcc/target.def b/gcc/target.def index b5e82ff826e..9cb9dab60ab 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -746,40 +746,7 @@ DEFHOOK (record_gcc_switches, "Provides the target with the ability to record the gcc command line\n\ switches that have been passed to the compiler, and options that are\n\ -enabled. The @var{type} argument specifies what is being recorded.\n\ -It can take the following values:\n\ -\n\ -@table @gcctabopt\n\ -@item SWITCH_TYPE_PASSED\n\ -@var{text} is a command line switch that has been set by the user.\n\ -\n\ -@item SWITCH_TYPE_ENABLED\n\ -@var{text} is an option which has been enabled. This might be as a\n\ -direct result of a command line switch, or because it is enabled by\n\ -default or because it has been enabled as a side effect of a different\n\ -command line switch. For example, the @option{-O2} switch enables\n\ -various different individual optimization passes.\n\ -\n\ -@item SWITCH_TYPE_DESCRIPTIVE\n\ -@var{text} is either NULL or some descriptive text which should be\n\ -ignored. If @var{text} is NULL then it is being used to warn the\n\ -target hook that either recording is starting or ending. The first\n\ -time @var{type} is SWITCH_TYPE_DESCRIPTIVE and @var{text} is NULL, the\n\ -warning is for start up and the second time the warning is for\n\ -wind down. This feature is to allow the target hook to make any\n\ -necessary preparations before it starts to record switches and to\n\ -perform any necessary tidying up after it has finished recording\n\ -switches.\n\ -\n\ -@item SWITCH_TYPE_LINE_START\n\ -This option can be ignored by this target hook.\n\ -\n\ -@item SWITCH_TYPE_LINE_END\n\ -This option can be ignored by this target hook.\n\ -@end table\n\ -\n\ -The hook's return value must be zero. Other return values may be\n\ -supported in the future.\n\ +enabled.\n\ \n\ By default this hook is set to NULL, but an example implementation is\n\ provided for ELF based targets. Called @var{elf_record_gcc_switches},\n\ @@ -787,7 +754,7 @@ it records the switches as ASCII text inside a new, string mergeable\n\ section in the assembler output file. The name of the new section is\n\ provided by the @code{TARGET_ASM_RECORD_GCC_SWITCHES_SECTION} target\n\ hook.", - int, (print_switch_type type, const char *text), + void, (void), NULL) /* The name of the section that the example ELF implementation of diff --git a/gcc/target.h b/gcc/target.h index 2f47c577d00..f01ce812c60 100644 --- a/gcc/target.h +++ b/gcc/target.h @@ -99,7 +99,7 @@ extern unsigned HOST_WIDE_INT by_pieces_ninsns (unsigned HOST_WIDE_INT, typedef int (* print_switch_fn_type) (print_switch_type, const char *); /* An example implementation for ELF targets. Defined in varasm.c */ -extern int elf_record_gcc_switches (print_switch_type type, const char *); +extern void elf_record_gcc_switches (void); /* Some places still assume that all pointer or address modes are the standard Pmode and ptr_mode. These optimizations become invalid if diff --git a/gcc/toplev.c b/gcc/toplev.c index 4c8be502c71..9df9d630e16 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -871,16 +871,7 @@ init_asm_output (const char *name) if (flag_record_gcc_switches) { if (targetm.asm_out.record_gcc_switches) - { - /* Let the target know that we are about to start recording. */ - targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE, - NULL); - /* Now record the switches. */ - print_switch_values (targetm.asm_out.record_gcc_switches); - /* Let the target know that the recording is over. */ - targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE, - NULL); - } + targetm.asm_out.record_gcc_switches (); else inform (UNKNOWN_LOCATION, "%<-frecord-gcc-switches%> is not supported by " diff --git a/gcc/varasm.c b/gcc/varasm.c index dc6da6c0b5b..0dfb243adad 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -43,6 +43,7 @@ along with GCC; see the file COPYING3. If not see #include "fold-const.h" #include "stor-layout.h" #include "varasm.h" +#include "version.h" #include "flags.h" #include "stmt.h" #include "expr.h" @@ -7803,45 +7804,18 @@ output_object_blocks (void) we want to emit NUL strings terminators into the object file we have to use ASM_OUTPUT_SKIP. */ -int -elf_record_gcc_switches (print_switch_type type, const char * name) +void +elf_record_gcc_switches () { - switch (type) - { - case SWITCH_TYPE_PASSED: - ASM_OUTPUT_ASCII (asm_out_file, name, strlen (name)); - ASM_OUTPUT_SKIP (asm_out_file, HOST_WIDE_INT_1U); - break; - - case SWITCH_TYPE_DESCRIPTIVE: - if (name == NULL) - { - /* Distinguish between invocations where name is NULL. */ - static bool started = false; - - if (!started) - { - section * sec; - - sec = get_section (targetm.asm_out.record_gcc_switches_section, - SECTION_DEBUG - | SECTION_MERGE - | SECTION_STRINGS - | (SECTION_ENTSIZE & 1), - NULL); - switch_to_section (sec); - started = true; - } - } + section *sec = get_section (targetm.asm_out.record_gcc_switches_section, + SECTION_DEBUG | SECTION_MERGE + | SECTION_STRINGS | (SECTION_ENTSIZE & 1), NULL); + switch_to_section (sec); - default: - break; - } + ASM_OUTPUT_ASCII (asm_out_file, version_string, strlen (version_string)); - /* The return value is currently ignored by the caller, but must be 0. - For -fverbose-asm the return value would be the number of characters - emitted into the assembler file. */ - return 0; + const char *cmdline = getenv ("GCC_DRIVER_COMMAND_LINE"); + ASM_OUTPUT_ASCII (asm_out_file, cmdline, strlen (cmdline) + 1); } /* Emit text to declare externally defined symbols. It is needed to -- 2.25.1