assert.h: Do not use __FILE__ nor __LINE__ on timeless builds

When refactoring, one can move code around quite a bit while preserving
reproducibility, unless there is an assert-style macro somewhere... As
these macros use __FILE__ and __LINE__, just moving them is enough to
change the resulting binary, making timeless builds rather useless.

To improve reproducibility, do not use __FILE__ nor __LINE__ inside the
assert-style macros. Instead, use hardcoded values. Plus, mention that
timeless builds lack such information in place of the file name, so that
grepping for the printed string directs one towards this commit. And for
the immutable line number, we can use 404: line number not found :-)

Change-Id: Id42d7121b6864759c042f8e4e438ee77a8ac0b41
Signed-off-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/42196
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
This commit is contained in:
Angel Pons 2020-06-08 15:52:03 +02:00
parent 579e096ec8
commit 464519769b
3 changed files with 42 additions and 22 deletions

View File

@ -411,6 +411,10 @@ CPPFLAGS_common += -include $(src)/commonlib/bsd/include/commonlib/bsd/compiler.
CPPFLAGS_common += -I3rdparty CPPFLAGS_common += -I3rdparty
CPPFLAGS_common += -D__BUILD_DIR__=\"$(obj)\" CPPFLAGS_common += -D__BUILD_DIR__=\"$(obj)\"
ifeq ($(BUILD_TIMELESS),1)
CPPFLAGS_common += -D__TIMELESS__
endif
ifeq ($(CONFIG_PCI_OPTION_ROM_RUN_YABEL)$(CONFIG_PCI_OPTION_ROM_RUN_REALMODE),y) ifeq ($(CONFIG_PCI_OPTION_ROM_RUN_YABEL)$(CONFIG_PCI_OPTION_ROM_RUN_REALMODE),y)
CPPFLAGS_ramstage += -Isrc/device/oprom/include CPPFLAGS_ramstage += -Isrc/device/oprom/include
endif endif

View File

@ -12,31 +12,41 @@
#undef ASSERT #undef ASSERT
#endif #endif
/* Do not use filenames nor line numbers on timeless builds, to preserve reproducibility */
#if ENV_TIMELESS
#define __ASSERT_FILE__ "(filenames not available on timeless builds)"
#define __ASSERT_LINE__ 404
#else
#define __ASSERT_FILE__ __FILE__
#define __ASSERT_LINE__ __LINE__
#endif
/* GCC and CAR versions */ /* GCC and CAR versions */
#define ASSERT(x) { \ #define ASSERT(x) { \
if (!(x)) { \ if (!(x)) { \
printk(BIOS_EMERG, "ASSERTION ERROR: file '%s'" \ printk(BIOS_EMERG, \
", line %d\n", __FILE__, __LINE__); \ "ASSERTION ERROR: file '%s', line %d\n", \
if (CONFIG(FATAL_ASSERTS)) \ __ASSERT_FILE__, __ASSERT_LINE__); \
hlt(); \ if (CONFIG(FATAL_ASSERTS)) \
} \ hlt(); \
} \
} }
#define ASSERT_MSG(x, msg) { \
#define ASSERT_MSG(x, msg) { \ if (!(x)) { \
if (!(x)) { \ printk(BIOS_EMERG, \
printk(BIOS_EMERG, "ASSERTION ERROR: file '%s'" \ "ASSERTION ERROR: file '%s', line %d\n", \
", line %d\n", __FILE__, __LINE__); \ __ASSERT_FILE__, __ASSERT_LINE__); \
printk(BIOS_EMERG, "%s", msg); \ printk(BIOS_EMERG, "%s", msg); \
if (CONFIG(FATAL_ASSERTS)) \ if (CONFIG(FATAL_ASSERTS)) \
hlt(); \ hlt(); \
} \ } \
} }
#define BUG() { \
#define BUG() { \ printk(BIOS_EMERG, \
printk(BIOS_EMERG, "ERROR: BUG ENCOUNTERED at file '%s'"\ "ERROR: BUG ENCOUNTERED at file '%s', line %d\n", \
", line %d\n", __FILE__, __LINE__); \ __ASSERT_FILE__, __ASSERT_LINE__); \
if (CONFIG(FATAL_ASSERTS)) \ if (CONFIG(FATAL_ASSERTS)) \
hlt(); \ hlt(); \
} }
#define assert(statement) ASSERT(statement) #define assert(statement) ASSERT(statement)

View File

@ -3,6 +3,12 @@
#ifndef _RULES_H #ifndef _RULES_H
#define _RULES_H #define _RULES_H
#if defined(__TIMELESS__)
#define ENV_TIMELESS 1
#else
#define ENV_TIMELESS 0
#endif
/* Useful helpers to tell whether the code is executing in bootblock, /* Useful helpers to tell whether the code is executing in bootblock,
* romstage, ramstage or SMM. * romstage, ramstage or SMM.
*/ */