diff options
author | Ilya Leoshkevich <iii@linux.ibm.com> | 2018-10-25 13:47:10 +0000 |
---|---|---|
committer | Ilya Leoshkevich <iii@gcc.gnu.org> | 2018-10-25 13:47:10 +0000 |
commit | cd747405e4cb332d639b248be140424b5e06b609 (patch) | |
tree | 92e7c35227a53ac41bb0459c440d67ebf18735d7 | |
parent | 0f317ef76269a989ae751a808f946d15b740baf9 (diff) | |
download | gcc-cd747405e4cb332d639b248be140424b5e06b609.zip gcc-cd747405e4cb332d639b248be140424b5e06b609.tar.gz gcc-cd747405e4cb332d639b248be140424b5e06b609.tar.bz2 |
Fix rtx_code_size static initialization order fiasco
r264556 and r264537 changed the format of EQ_ATTR_ALT RTXs to "ww",
which also required adjusting rtx_code_size initializer. In order to
simplify things, the list of rtx_codes known to use HOST_WIDE_INTs was
replaced by the format string check. However, unlike the old one, this
new check cannot be always performed at compile time, in which case a
static constructor is generated. This may lead to a static
initialization order fiasco with respect to other static constructors
in the compiler, in case of PR87747, cselib's pool_allocator.
gcc/ChangeLog:
2018-10-25 Ilya Leoshkevich <iii@linux.ibm.com>
PR bootstrap/87747
* rtl.c (RTX_CODE_HWINT_P_1): New helper macro.
(RTX_CODE_HWINT_P): New macro.
(rtx_code_size): Use RTX_CODE_HWINT_P ().
From-SVN: r265488
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/rtl.c | 14 |
2 files changed, 20 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2490eef..425c620 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-10-25 Ilya Leoshkevich <iii@linux.ibm.com> + + PR bootstrap/87747 + * rtl.c (RTX_CODE_HWINT_P_1): New helper macro. + (RTX_CODE_HWINT_P): New macro. + (rtx_code_size): Use RTX_CODE_HWINT_P (). + 2018-10-25 Jan Hubicka <jh@suse.cz> * ipa-devirt.c (odr_types_equivalent_p): Do not ICE if one of types @@ -106,11 +106,23 @@ const enum rtx_class rtx_class[NUM_RTX_CODE] = { #undef DEF_RTL_EXPR }; +/* Whether rtxs with the given code code store data in the hwint field. */ + +#define RTX_CODE_HWINT_P_1(ENUM) \ + ((ENUM) == CONST_INT || (ENUM) == CONST_DOUBLE \ + || (ENUM) == CONST_FIXED || (ENUM) == CONST_WIDE_INT) +#ifdef GENERATOR_FILE +#define RTX_CODE_HWINT_P(ENUM) \ + (RTX_CODE_HWINT_P_1 (ENUM) || (ENUM) == EQ_ATTR_ALT) +#else +#define RTX_CODE_HWINT_P RTX_CODE_HWINT_P_1 +#endif + /* Indexed by rtx code, gives the size of the rtx in bytes. */ const unsigned char rtx_code_size[NUM_RTX_CODE] = { #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS) \ - ((FORMAT)[0] == 'w' \ + (RTX_CODE_HWINT_P (ENUM) \ ? RTX_HDR_SIZE + (sizeof FORMAT - 1) * sizeof (HOST_WIDE_INT) \ : (ENUM) == REG \ ? RTX_HDR_SIZE + sizeof (reg_info) \ |