Index: head/share/mk/bsd.compiler.mk =================================================================== --- head/share/mk/bsd.compiler.mk +++ head/share/mk/bsd.compiler.mk @@ -24,6 +24,7 @@ # - c++11: supports full (or nearly full) C++11 programming environment. # - retpoline: supports the retpoline speculative execution vulnerability # mitigation. +# - init-all: supports stack variable initialization. # # These variables with an X_ prefix will also be provided if XCC is set. # @@ -214,7 +215,7 @@ ${X_}COMPILER_FEATURES+= c++17 .endif .if ${${X_}COMPILER_TYPE} == "clang" -${X_}COMPILER_FEATURES+= retpoline +${X_}COMPILER_FEATURES+= retpoline init-all .endif .else Index: head/share/mk/bsd.lib.mk =================================================================== --- head/share/mk/bsd.lib.mk +++ head/share/mk/bsd.lib.mk @@ -85,6 +85,25 @@ .endif .endif +# Initialize stack variables on function entry +.if ${MK_INIT_ALL_ZERO} == "yes" +.if ${COMPILER_FEATURES:Minit-all} +CFLAGS+= -ftrivial-auto-var-init=zero \ + -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang +CXXFLAGS+= -ftrivial-auto-var-init=zero \ + -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang +.else +.warning InitAll (zeros) requested but not support by compiler +.endif +.elif ${MK_INIT_ALL_PATTERN} == "yes" +.if ${COMPILER_FEATURES:Minit-all} +CFLAGS+= -ftrivial-auto-var-init=pattern +CXXFLAGS+= -ftrivial-auto-var-init=pattern +.else +.warning InitAll (pattern) requested but not support by compiler +.endif +.endif + .if ${MK_DEBUG_FILES} != "no" && empty(DEBUG_FLAGS:M-g) && \ empty(DEBUG_FLAGS:M-gdwarf*) CFLAGS+= ${DEBUG_FILES_CFLAGS} Index: head/share/mk/bsd.opts.mk =================================================================== --- head/share/mk/bsd.opts.mk +++ head/share/mk/bsd.opts.mk @@ -71,6 +71,8 @@ BIND_NOW \ CCACHE_BUILD \ CTF \ + INIT_ALL_PATTERN \ + INIT_ALL_ZERO \ INSTALL_AS_USER \ PIE \ RETPOLINE \ @@ -84,6 +86,10 @@ .include + +.if ${MK_INIT_ALL_PATTERN} == "yes" && ${MK_INIT_ALL_ZERO} == "yes" +.error WITH_INIT_ALL_PATTERN and WITH_INIT_ALL_ZERO are mutually exclusive. +.endif # # Supported NO_* options (if defined, MK_* will be forced to "no", Index: head/share/mk/bsd.prog.mk =================================================================== --- head/share/mk/bsd.prog.mk +++ head/share/mk/bsd.prog.mk @@ -60,6 +60,25 @@ .endif .endif +# Initialize stack variables on function entry +.if ${MK_INIT_ALL_ZERO} == "yes" +.if ${COMPILER_FEATURES:Minit-all} +CFLAGS+= -ftrivial-auto-var-init=zero \ + -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang +CXXFLAGS+= -ftrivial-auto-var-init=zero \ + -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang +.else +.warning InitAll (zeros) requested but not support by compiler +.endif +.elif ${MK_INIT_ALL_PATTERN} == "yes" +.if ${COMPILER_FEATURES:Minit-all} +CFLAGS+= -ftrivial-auto-var-init=pattern +CXXFLAGS+= -ftrivial-auto-var-init=pattern +.else +.warning InitAll (pattern) requested but not support by compiler +.endif +.endif + .if ${MACHINE_CPUARCH} == "riscv" && ${LINKER_FEATURES:Mriscv-relaxations} == "" CFLAGS += -mno-relax .endif Index: head/sys/conf/kern.mk =================================================================== --- head/sys/conf/kern.mk +++ head/sys/conf/kern.mk @@ -228,6 +228,24 @@ .endif # +# Initialize stack variables on function entry +# +.if ${MK_INIT_ALL_ZERO} == "yes" +.if ${COMPILER_FEATURES:Minit-all} +CFLAGS+= -ftrivial-auto-var-init=zero \ + -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang +.else +.warning InitAll (zeros) requested but not support by compiler +.endif +.elif ${MK_INIT_ALL_PATTERN} == "yes" +.if ${COMPILER_FEATURES:Minit-all} +CFLAGS+= -ftrivial-auto-var-init=pattern +.else +.warning InitAll (pattern) requested but not support by compiler +.endif +.endif + +# # Add -gdwarf-2 when compiling -g. The default starting in clang v3.4 # and gcc 4.8 is to generate DWARF version 4. However, our tools don't # cope well with DWARF 4, so force it to genereate DWARF2, which they Index: head/tools/build/options/WITH_INIT_ALL_PATTERN =================================================================== --- head/tools/build/options/WITH_INIT_ALL_PATTERN +++ head/tools/build/options/WITH_INIT_ALL_PATTERN @@ -0,0 +1,5 @@ +.\" $FreeBSD$ +Set to build the base system or kernel with stack variables initialized to +.Pq compiler defined +debugging patterns on function entry. +This option requires the clang compiler. Index: head/tools/build/options/WITH_INIT_ALL_ZERO =================================================================== --- head/tools/build/options/WITH_INIT_ALL_ZERO +++ head/tools/build/options/WITH_INIT_ALL_ZERO @@ -0,0 +1,4 @@ +.\" $FreeBSD$ +Set to build the base system or kernel with stack variables initialized +to zero on function entry. +This option requires that the clang compiler be used.