gcc/0288-Enable-macro-use-commandline.patch
2024-11-21 11:35:14 +08:00

208 lines
7.0 KiB
Diff

From 7a578a8725f8fd7d92fcbbac14841ea7e8d0870f Mon Sep 17 00:00:00 2001
From: zhangxiaohua <xiaohua20100827@163.com>
Date: Sun, 25 Aug 2024 23:08:53 +0800
Subject: [PATCH 157/157] Enable macro-use-commandline
Signed-off-by: zhangxiaohua <xiaohua20100827@163.com>
---
gcc/c-family/c-opts.cc | 4 +++
gcc/c-family/c.opt | 4 +++
gcc/doc/cppopts.texi | 4 +++
gcc/doc/invoke.texi | 1 +
.../gcc.dg/cpp/macro-use-cmdline-1.c | 26 ++++++++++++++
.../gcc.dg/cpp/macro-use-cmdline-2.c | 34 +++++++++++++++++++
libcpp/include/cpplib.h | 3 ++
libcpp/init.cc | 1 +
libcpp/macro.cc | 16 ++++++++-
9 files changed, 92 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/gcc.dg/cpp/macro-use-cmdline-1.c
create mode 100644 gcc/testsuite/gcc.dg/cpp/macro-use-cmdline-2.c
diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc
index 5134f6128..744b54dc3 100644
--- a/gcc/c-family/c-opts.cc
+++ b/gcc/c-family/c-opts.cc
@@ -527,6 +527,10 @@ c_common_handle_option (size_t scode, const char *arg, HOST_WIDE_INT value,
cpp_opts->track_macro_expansion = 2;
break;
+ case OPT_fmacro_use_commandline:
+ cpp_opts->macro_use_commandline = 1;
+ break;
+
case OPT_fexec_charset_:
cpp_opts->narrow_charset = arg;
break;
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index 07da40ef4..a36c27f07 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -2012,6 +2012,10 @@ ftrack-macro-expansion=
C ObjC C++ ObjC++ JoinedOrMissing RejectNegative UInteger
-ftrack-macro-expansion=<0|1|2> Track locations of tokens coming from macro expansion and display them in error messages.
+fmacro-use-commandline
+C ObjC C++ ObjC++ JoinedOrMissing RejectNegative UInteger
+Preferentially use options from the commandline.
+
fpretty-templates
C++ ObjC++ Var(flag_pretty_templates) Init(1)
Do not pretty-print template specializations as the template signature followed by the arguments.
diff --git a/gcc/doc/cppopts.texi b/gcc/doc/cppopts.texi
index c0a92b370..8c8a81eac 100644
--- a/gcc/doc/cppopts.texi
+++ b/gcc/doc/cppopts.texi
@@ -277,6 +277,10 @@ correct column numbers in warnings or errors, even if tabs appear on the
line. If the value is less than 1 or greater than 100, the option is
ignored. The default is 8.
+@item -fmacro-use-commandline
+@opindex fmacro-use-commandline
+Preferentially use options from the command line.
+
@item -ftrack-macro-expansion@r{[}=@var{level}@r{]}
@opindex ftrack-macro-expansion
Track locations of tokens across macro expansions. This allows the
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index bdd8b9429..2ff7d860d 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -630,6 +630,7 @@ Objective-C and Objective-C++ Dialects}.
-fexec-charset=@var{charset} -fextended-identifiers @gol
-finput-charset=@var{charset} -flarge-source-files @gol
-fmacro-prefix-map=@var{old}=@var{new} -fmax-include-depth=@var{depth} @gol
+-fmacro-use-commandline @gol
-fno-canonical-system-headers -fpch-deps -fpch-preprocess @gol
-fpreprocessed -ftabstop=@var{width} -ftrack-macro-expansion @gol
-fwide-exec-charset=@var{charset} -fworking-directory @gol
diff --git a/gcc/testsuite/gcc.dg/cpp/macro-use-cmdline-1.c b/gcc/testsuite/gcc.dg/cpp/macro-use-cmdline-1.c
new file mode 100644
index 000000000..f85d9c268
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/macro-use-cmdline-1.c
@@ -0,0 +1,26 @@
+/*
+ { dg-options "-fmacro-use-commandline -DTEST_MACRO=1 -DTEST_MACRO=20" }
+ { dg-do compile }
+ { dg-do run }
+*/
+
+/* { dg-warning "-:redefined" "redef TEST_MACRO" { target *-*-* } 0 }
+ { dg-message "-:previous" "prev def TEST_MACRO" { target *-*-* } 0 }
+*/
+
+#if DEBUG
+extern int puts (const char *);
+#else
+#define puts(X)
+#endif
+extern void abort (void);
+
+#define err(str) do { puts(str); abort(); } while (0)
+
+int main (int argc, char *argv[])
+{
+ int macroValue = TEST_MACRO;
+ if (macroValue != 20)
+ err("macroValue");
+ return 0;
+}
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.dg/cpp/macro-use-cmdline-2.c b/gcc/testsuite/gcc.dg/cpp/macro-use-cmdline-2.c
new file mode 100644
index 000000000..99d92d1e4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/macro-use-cmdline-2.c
@@ -0,0 +1,34 @@
+/*
+ { dg-options "-fmacro-use-commandline -DTEST_MACRO=1" }
+ { dg-do compile }
+ { dg-do run }
+*/
+
+#define TEST_MACRO 300
+#define TEST_MACRO_1 400
+/*
+ { dg-warning "-:redefined" "redef TEST_MACRO" { target *-*-* } 7 }
+ { dg-message "-:previous" "prev def TEST_MACRO" { target *-*-* } 0 }
+*/
+
+#if DEBUG
+extern int puts (const char *);
+#else
+#define puts(X)
+#endif
+
+extern void abort (void);
+
+#define err(str) do { puts(str); abort(); } while (0)
+
+int main (int argc, char *argv[])
+{
+ int macroValue = TEST_MACRO;
+ if (macroValue != 1)
+ err("macroValue");
+
+ int macroValue1 = TEST_MACRO_1;
+ if (macroValue1 != 400)
+ err("macroValue1");
+ return 0;
+}
\ No newline at end of file
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index 3eba6f74b..c6101ca01 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -471,6 +471,9 @@ struct cpp_options
consumes the highest amount of memory. */
unsigned char track_macro_expansion;
+ /* Use the options on the command line first. */
+ unsigned char macro_use_commandline;
+
/* Nonzero means handle C++ alternate operator names. */
unsigned char operator_names;
diff --git a/libcpp/init.cc b/libcpp/init.cc
index f4ab83d21..47be60a36 100644
--- a/libcpp/init.cc
+++ b/libcpp/init.cc
@@ -215,6 +215,7 @@ cpp_create_reader (enum c_lang lang, cpp_hash_table *table,
cpp_options::track_macro_expansion to learn about the other
values. */
CPP_OPTION (pfile, track_macro_expansion) = 2;
+ CPP_OPTION (pfile, macro_use_commandline) = 0;
CPP_OPTION (pfile, warn_normalize) = normalized_C;
CPP_OPTION (pfile, warn_literal_suffix) = 1;
CPP_OPTION (pfile, canonical_system_headers)
diff --git a/libcpp/macro.cc b/libcpp/macro.cc
index 8ebf360c0..aa9e4ffa6 100644
--- a/libcpp/macro.cc
+++ b/libcpp/macro.cc
@@ -3852,7 +3852,21 @@ _cpp_create_definition (cpp_reader *pfile, cpp_hashnode *node)
node->value.macro->line, 0,
"this is the location of the previous definition");
}
- _cpp_free_definition (node);
+#define LOCATION_FROM_LINEMAP 0
+#define MIN_LINE_OF_MACRO_BEEN_OVERRIDDEN 96
+#define MAX_LINE_OF_MACRO_BEEN_OVERRIDDEN 128
+ if (CPP_OPTION (pfile, macro_use_commandline)
+ && node->value.macro->line >= MIN_LINE_OF_MACRO_BEEN_OVERRIDDEN
+ && node->value.macro->line <= MAX_LINE_OF_MACRO_BEEN_OVERRIDDEN
+ && pfile->forced_token_location == LOCATION_FROM_LINEMAP)
+ {
+ cpp_pedwarning_with_line (pfile, CPP_W_NONE,
+ node->value.macro->line, 0,
+ "use the previous definition from commandline");
+ return false;
+ }
+ else
+ _cpp_free_definition (node);
}
/* Enter definition in hash table. */
--
2.33.0