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
This commit is contained in:
Ilya Leoshkevich 2018-10-25 13:47:10 +00:00 committed by Ilya Leoshkevich
parent 0f317ef762
commit cd747405e4
2 changed files with 20 additions and 1 deletions

View File

@ -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

View File

@ -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) \