On 4/23/21 12:59 PM, Richard Biener wrote:
> True, the question is on how much detail we have to pay attention to.
Agree with that.
> For us of course the build-id solution works fine. And hopefully the
> days of PCH are counted...
Yes.
I have a tentative patch that emits the attached checksum.h header file.
We also include flags in the checksum:
...
build/genchecksum$(build_exeext) $(C_OBJS) $(BACKEND) $(LIBDEPS) \
checksum-options > cc1-checksum.c.tmp && \
...
$ cat checksum-options
g++ -no-pie -g -DIN_GCC -fPIC -fno-exceptions -fno-rtti
-fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings
-Wcast-qual -Wno-error=format-diag -Wmissing-format-attribute
-Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros
-Wno-overlength-strings -fno-common -DHAVE_CONFIG_H -static-libstdc++
-static-libgcc
Can we ignore them in the checksum calculation?
Martin
/* Checksum based on the following files:
gt-ada-decl.h
gt-ada-misc.h
gt-ada-trans.h
gt-ada-utils.h
gt-alias.h
gt-asan.h
gt-bitmap.h
gt-brig-brig-lang.h
gt-caller-save.h
gt-calls.h
gt-c-c-decl.h
gt-c-c-parser.h
gt-c-family-c-common.h
gt-c-family-c-cppbuiltin.h
gt-c-family-c-format.h
gt-c-family-c-pragma.h
gt-cfgrtl.h
gt-cgraphclones.h
gt-cgraph.h
gt-coverage.h
gt-cp-call.h
gt-cp-class.h
gt-cp-constexpr.h
gt-cp-constraint.h
gt-cp-coroutines.h
gt-cp-cp-gimplify.h
gt-cp-cp-lang.h
gt-cp-cp-objcp-common.h
gt-cp-decl2.h
gt-cp-decl.h
gt-cp-except.h
gt-cp-friend.h
gt-cp-init.h
gt-cp-lambda.h
gt-cp-lex.h
gt-cp-logic.h
gt-cp-mangle.h
gt-cp-method.h
gt-cp-module.h
gt-cp-name-lookup.h
gt-cp-parser.h
gt-cp-pt.h
gt-cp-rtti.h
gt-cp-semantics.h
gt-cp-tree.h
gt-cp-vtable-class-hierarchy.h
gt-cselib.h
gt-dbxout.h
gt-d-d-builtins.h
gt-d-d-lang.h
gt-dojump.h
gt-d-typeinfo.h
gt-dwarf2asm.h
gt-dwarf2cfi.h
gt-dwarf2out.h
gt-emit-rtl.h
gt-except.h
gt-explow.h
gt-fortran-f95-lang.h
gt-fortran-trans-decl.h
gt-fortran-trans-intrinsic.h
gt-fortran-trans-io.h
gt-fortran-trans-stmt.h
gt-fortran-trans-types.h
gt-function.h
gt-gcse.h
gt-ggc-tests.h
gt-gimple-expr.h
gt-godump.h
gt-go-go-lang.h
gt-i386-builtins.h
gt-i386-expand.h
gt-i386.h
gt-i386-options.h
gt-ipa-devirt.h
gt-ipa-modref.h
gt-ipa-prop.h
gt-ipa-sra.h
gt-jit-dummy-frontend.h
gt-lists.h
gt-lto-lto-common.h
gt-lto-lto-lang.h
gt-objc-objc-act.h
gt-objc-objc-gnu-runtime-abi-01.h
gt-objc-objc-map.h
gt-objc-objc-next-runtime-abi-01.h
gt-objc-objc-next-runtime-abi-02.h
gt-objc-objc-runtime-shared-support.h
gt-omp-general.h
gt-omp-low.h
gt-optabs-libfuncs.h
gt-stor-layout.h
gt-stringpool.h
gt-symtab-thunks.h
gt-targhooks.h
gt-trans-mem.h
gt-tree.h
gt-tree-iterator.h
gt-tree-nested.h
gt-tree-phinodes.h
gt-tree-profile.h
gt-tree-scalar-evolution.h
gt-tree-ssa-address.h
gt-tree-ssa-loop-ivopts.h
gt-tree-vect-generic.h
gt-ubsan.h
gt-varasm.h
gt-vtable-verify.h
auto-host.h
*/
constexpr unsigned char executable_checksum[] = { 0xcf, 0xee, 0xca, 0xc0, 0x17, 0x97, 0x80, 0x55, 0x3a, 0xdd, 0xd4, 0x1e, 0xd4, 0xb9, 0xe7, 0x91 };
>From d5025b3148c895f78edaddca0637dc668ae81be9 Mon Sep 17 00:00:00 2001
From: Martin Liska <[email protected]>
Date: Fri, 23 Apr 2021 13:33:55 +0200
Subject: [PATCH] Emit checksum.h from gt-*.h and auto-host.h.
---
gcc/Makefile.in | 12 ++++++++----
gcc/c-family/c-common.h | 3 ---
gcc/c-family/c-opts.c | 1 +
gcc/c-family/c-pch.c | 1 +
gcc/c/Make-lang.in | 20 +++-----------------
gcc/cp/Make-lang.in | 20 +++-----------------
gcc/genchecksum.c | 9 ++++++---
gcc/objc/Make-lang.in | 12 +++---------
gcc/objcp/Make-lang.in | 13 +++----------
9 files changed, 28 insertions(+), 63 deletions(-)
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index e5d07fb98b0..d1c2da97f52 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1765,7 +1765,7 @@ MOSTLYCLEANFILES = insn-flags.h insn-config.h insn-codes.h \
gcc-ranlib$(exeext) \
genversion$(build_exeext) gcov$(exeext) gcov-dump$(exeext) \
gcov-tool$(exeect) \
- gengtype$(exeext) *.[0-9][0-9].* *.[si] *-checksum.c libbackend.a \
+ gengtype$(exeext) genchecksum$(exeext) *.[0-9][0-9].* *.[si] libbackend.a \
libcommon-target.a libcommon.a libgcc.mk perf.data
# This symlink makes the full installation name of the driver be available
@@ -2814,7 +2814,6 @@ build/genautomata.o : genautomata.c $(RTL_BASE_H) $(OBSTACK_H) \
build/gencheck.o : gencheck.c all-tree.def $(BCONFIG_H) $(GTM_H) \
$(SYSTEM_H) $(CORETYPES_H) tree.def c-family/c-common.def \
$(lang_tree_files) gimple.def
-build/genchecksum.o : genchecksum.c $(BCONFIG_H) $(SYSTEM_H) $(MD5_H)
build/gencodes.o : gencodes.c $(RTL_BASE_H) $(BCONFIG_H) $(SYSTEM_H) \
$(CORETYPES_H) $(GTM_H) errors.h $(GENSUPPORT_H)
build/genconditions.o : genconditions.c $(RTL_BASE_H) $(BCONFIG_H) \
@@ -3037,6 +3036,13 @@ s-version: build/genversion$(build_exeext)
$(SHELL) $(srcdir)/../move-if-change tmp-version.h version.h
$(STAMP) s-version
+build/genchecksum.o : genchecksum.c $(BCONFIG_H) $(SYSTEM_H) $(MD5_H)
+
+checksum.h: s-checksum; @true
+s-checksum: build/genchecksum$(build_exeext) s-gtype auto-host.h
+ build/genchecksum$(build_exeext) gt-*.h auto-host.h > tmp-checksum.h
+ $(SHELL) $(srcdir)/../move-if-change tmp-checksum.h checksum.h
+
# gcov.o needs $(ZLIBINC) added to the include flags.
CFLAGS-gcov.o += $(ZLIBINC)
@@ -3505,8 +3511,6 @@ mostlyclean: lang.mostlyclean
-rm -f gtype-*
-rm -f gt-*
-rm -f gtype.state
-# Delete genchecksum outputs
- -rm -f *-checksum.c
# Delete lock-and-run bits
-rm -rf linkfe.lck lock-stamp.*
diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
index f30b6c6ac33..660c60b49eb 100644
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -1162,9 +1162,6 @@ extern void c_common_write_pch (void);
extern void c_common_no_more_pch (void);
extern void c_common_pch_pragma (cpp_reader *pfile, const char *);
-/* In *-checksum.c */
-extern const unsigned char executable_checksum[16];
-
/* In c-cppbuiltin.c */
extern void builtin_define_std (const char *macro);
extern void builtin_define_with_value (const char *, const char *, int);
diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c
index 89e05a4c551..4b28e107877 100644
--- a/gcc/c-family/c-opts.c
+++ b/gcc/c-family/c-opts.c
@@ -41,6 +41,7 @@ along with GCC; see the file COPYING3. If not see
#include "mkdeps.h"
#include "dumpfile.h"
#include "file-prefix-map.h" /* add_*_prefix_map() */
+#include "checksum.h"
#ifndef DOLLARS_IN_IDENTIFIERS
# define DOLLARS_IN_IDENTIFIERS true
diff --git a/gcc/c-family/c-pch.c b/gcc/c-family/c-pch.c
index fd94c3799ac..8e1d2ffbfd5 100644
--- a/gcc/c-family/c-pch.c
+++ b/gcc/c-family/c-pch.c
@@ -28,6 +28,7 @@ along with GCC; see the file COPYING3. If not see
#include "c-pragma.h"
#include "langhooks.h"
#include "hosthooks.h"
+#include "checksum.h"
/* This is a list of flag variables that must match exactly, and their
names for the error message. The possible values for *flag_var must
diff --git a/gcc/c/Make-lang.in b/gcc/c/Make-lang.in
index a1cdee87264..320ab19cf31 100644
--- a/gcc/c/Make-lang.in
+++ b/gcc/c/Make-lang.in
@@ -57,7 +57,7 @@ C_AND_OBJC_OBJS = attribs.o c/c-errors.o c/c-decl.o c/c-typeck.o \
# Language-specific object files for C.
C_OBJS = c/c-lang.o c-family/stub-objc.o $(C_AND_OBJC_OBJS)
-c_OBJS = $(C_OBJS) cc1-checksum.o c/gccspec.o
+c_OBJS = $(C_OBJS) c/gccspec.o
# Use strict warnings for this front end.
c-warn = $(STRICT_WARN)
@@ -68,24 +68,10 @@ $(C_OBJS): ALL_COMPILERFLAGS += -fauto-profile=cc1.fda
$(C_OBJS): cc1.fda
endif
-# compute checksum over all object files and the options
-# re-use the checksum from the prev-final stage so it passes
-# the bootstrap comparison and allows comparing of the cc1 binary
-cc1-checksum.c : build/genchecksum$(build_exeext) checksum-options \
- $(C_OBJS) $(BACKEND) $(LIBDEPS)
- if [ -f ../stage_final ] \
- && cmp -s ../stage_current ../stage_final; then \
- cp ../prev-gcc/cc1-checksum.c cc1-checksum.c; \
- else \
- build/genchecksum$(build_exeext) $(C_OBJS) $(BACKEND) $(LIBDEPS) \
- checksum-options > cc1-checksum.c.tmp && \
- $(srcdir)/../move-if-change cc1-checksum.c.tmp cc1-checksum.c; \
- fi
-
-cc1$(exeext): $(C_OBJS) cc1-checksum.o $(BACKEND) $(LIBDEPS)
+cc1$(exeext): $(C_OBJS) checksum.h $(BACKEND) $(LIBDEPS)
@$(call LINK_PROGRESS,$(INDEX.c),start)
+$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ $(C_OBJS) \
- cc1-checksum.o $(BACKEND) $(LIBS) $(BACKENDLIBS)
+ $(BACKEND) $(LIBS) $(BACKENDLIBS)
@$(call LINK_PROGRESS,$(INDEX.c),end)
cc1.fda: ../stage1-gcc/cc1$(exeext) ../prev-gcc/$(PERF_DATA)
diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in
index 155be74efdb..b933477f849 100644
--- a/gcc/cp/Make-lang.in
+++ b/gcc/cp/Make-lang.in
@@ -112,29 +112,15 @@ endif
# Language-specific object files for C++.
CXX_OBJS = cp/cp-lang.o c-family/stub-objc.o $(CXX_AND_OBJCXX_OBJS)
-c++_OBJS = $(CXX_OBJS) cc1plus-checksum.o cp/g++spec.o
+c++_OBJS = $(CXX_OBJS) cp/g++spec.o
# Use strict warnings for this front end.
cp-warn = $(STRICT_WARN)
-# compute checksum over all object files and the options
-# re-use the checksum from the prev-final stage so it passes
-# the bootstrap comparison and allows comparing of the cc1 binary
-cc1plus-checksum.c : build/genchecksum$(build_exeext) checksum-options \
- $(CXX_OBJS) $(BACKEND) $(CODYLIB) $(LIBDEPS)
- if [ -f ../stage_final ] \
- && cmp -s ../stage_current ../stage_final; then \
- cp ../prev-gcc/cc1plus-checksum.c cc1plus-checksum.c; \
- else \
- build/genchecksum$(build_exeext) $(CXX_OBJS) $(BACKEND) $(CODYLIB) $(LIBDEPS) \
- checksum-options > cc1plus-checksum.c.tmp && \
- $(srcdir)/../move-if-change cc1plus-checksum.c.tmp cc1plus-checksum.c; \
- fi
-
-cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(CODYLIB) $(LIBDEPS) $(c++.prev)
+cc1plus$(exeext): $(CXX_OBJS) checksum.h $(BACKEND) $(CODYLIB) $(LIBDEPS) $(c++.prev)
@$(call LINK_PROGRESS,$(INDEX.c++),start)
+$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
- $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(CODYLIB) $(NETLIBS) \
+ $(CXX_OBJS) $(BACKEND) $(CODYLIB) $(NETLIBS) \
$(LIBS) $(BACKENDLIBS)
@$(call LINK_PROGRESS,$(INDEX.c++),end)
diff --git a/gcc/genchecksum.c b/gcc/genchecksum.c
index 47280f5147b..c23228e68d2 100644
--- a/gcc/genchecksum.c
+++ b/gcc/genchecksum.c
@@ -110,9 +110,12 @@ main (int argc, char ** argv)
dosum (&ctx, argv[i]);
md5_finish_ctx (&ctx, result);
- puts ("#include \"config.h\"");
- puts ("#include \"system.h\"");
- fputs ("EXPORTED_CONST unsigned char executable_checksum[16] = { ", stdout);
+ puts ("/* Checksum based on the following files:\n");
+ for (i = 1; i < argc; i++)
+ printf (" %s\n", argv[i]);
+ puts ("*/\n");
+
+ fputs ("constexpr unsigned char executable_checksum[] = { ", stdout);
for (i = 0; i < 16; i++)
printf ("0x%02x%s", result[i], i == 15 ? " };\n" : ", ");
diff --git a/gcc/objc/Make-lang.in b/gcc/objc/Make-lang.in
index c91148a578e..8258d877d1c 100644
--- a/gcc/objc/Make-lang.in
+++ b/gcc/objc/Make-lang.in
@@ -55,19 +55,13 @@ OBJC_OBJS = objc/objc-lang.o objc/objc-act.o hash-table.o \
objc/objc-encoding.o \
objc/objc-map.o
-objc_OBJS = $(OBJC_OBJS) cc1obj-checksum.o
+objc_OBJS = $(OBJC_OBJS)
-cc1obj-checksum.c : build/genchecksum$(build_exeext) checksum-options \
- $(OBJC_OBJS) $(C_AND_OBJC_OBJS) $(BACKEND) $(LIBDEPS)
- build/genchecksum$(build_exeext) $(OBJC_OBJS) $(C_AND_OBJC_OBJS) \
- $(BACKEND) $(LIBDEPS) checksum-options > cc1obj-checksum.c.tmp && \
- $(srcdir)/../move-if-change cc1obj-checksum.c.tmp cc1obj-checksum.c
-
-cc1obj$(exeext): $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o $(BACKEND) \
+cc1obj$(exeext): $(OBJC_OBJS) version.h $(C_AND_OBJC_OBJS) $(BACKEND) \
$(LIBDEPS) $(objc.prev)
@$(call LINK_PROGRESS,$(INDEX.objc),start)
+$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
- $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o \
+ $(OBJC_OBJS) $(C_AND_OBJC_OBJS) \
$(BACKEND) $(LIBS) $(BACKENDLIBS)
@$(call LINK_PROGRESS,$(INDEX.objc),end)
diff --git a/gcc/objcp/Make-lang.in b/gcc/objcp/Make-lang.in
index dfa4d230eac..dd40466cb6f 100644
--- a/gcc/objcp/Make-lang.in
+++ b/gcc/objcp/Make-lang.in
@@ -58,20 +58,13 @@ OBJCXX_OBJS = objcp/objcp-act.o objcp/objcp-lang.o objcp/objcp-decl.o \
objcp/objc-map.o \
$(CXX_AND_OBJCXX_OBJS)
-obj-c++_OBJS = $(OBJCXX_OBJS) cc1objplus-checksum.o
+obj-c++_OBJS = $(OBJCXX_OBJS)
-cc1objplus-checksum.c : build/genchecksum$(build_exeext) checksum-options \
- $(OBJCXX_OBJS) $(BACKEND) $(CODYLIB) $(LIBDEPS)
- build/genchecksum$(build_exeext) $(OBJCXX_OBJS) $(BACKEND) $(CODYLIB) \
- $(LIBDEPS) checksum-options > cc1objplus-checksum.c.tmp && \
- $(srcdir)/../move-if-change cc1objplus-checksum.c.tmp \
- cc1objplus-checksum.c
-
-cc1objplus$(exeext): $(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) \
+cc1objplus$(exeext): $(OBJCXX_OBJS) version.h $(BACKEND) \
$(CODYLIB) $(LIBDEPS) $(obj-c++.prev)
@$(call LINK_PROGRESS,$(INDEX.obj-c++),start)
+$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
- $(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) \
+ $(OBJCXX_OBJS) $(BACKEND) \
$(CODYLIB) $(NETLIBS) $(LIBS) $(BACKENDLIBS)
@$(call LINK_PROGRESS,$(INDEX.obj-c++),end)
--
2.31.1