I've committed this patch to fix failures in g++.dg/pch.exp and gcc.dg/pch.exp
tests when compiling with -mmicromips. Invalid data was being read from the
precompiled-header causing a segfault while trying to switch compression
This patch fixes that segfault by initializing micromips_globals to zero prior
to writing the PCH file.
2016-10-13 Catherine Moore <c...@codesourcery.com>
* gcc/config/mips/mips.c (mips_prepare_pch_save): Initialize
micromips_globals to zero.
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index 43174b4..ebec68e 100644
@@ -20856,28 +20856,30 @@ mips_shift_truncation_mask (machine_mode mode)
- /* We are called in a context where the current MIPS16 vs. non-MIPS16
- setting should be irrelevant. The question then is: which setting
- makes most sense at load time?
+ /* We are called in a context where the current compression vs.
+ non-compression setting should be irrelevant. The question then is:
+ which setting makes most sense at load time?
- The PCH is loaded before the first token is read. We should never
- have switched into MIPS16 mode by that point, and thus should not
- have populated mips16_globals. Nor can we load the entire contents
- of mips16_globals from the PCH file, because mips16_globals contains
- a combination of GGC and non-GGC data.
+ The PCH is loaded before the first token is read. We should never have
+ switched into a compression mode by that point, and thus should not have
+ populated mips16_globals or micromips_globals. Nor can we load the
+ entire contents of mips16_globals or micromips_globals from the PCH file,
+ because they contain a combination of GGC and non-GGC data.
There is therefore no point in trying save the GGC part of
- mips16_globals to the PCH file, or to preserve MIPS16ness across
- the PCH save and load. The loading compiler would not have access
- to the non-GGC parts of mips16_globals (either from the PCH file,
- or from a copy that the loading compiler generated itself) and would
- have to call target_reinit anyway.
- It therefore seems best to switch back to non-MIPS16 mode at
- save time, and to ensure that mips16_globals remains null after
- a PCH load. */
+ mips16_globals/micromips_globals to the PCH file, or to preserve a
+ compression setting across the PCH save and load. The loading compiler
+ would not have access to the non-GGC parts of mips16_globals or
+ micromips_globals (either from the PCH file, or from a copy that the
+ loading compiler generated itself) and would have to call target_reinit
+ It therefore seems best to switch back to non-MIPS16 mode and
+ non-microMIPS mode to save time, and to ensure that mips16_globals and
+ micromips_globals remain null after a PCH load. */
mips16_globals = 0;
+ micromips_globals = 0;
/* Generate or test for an insn that supports a constant permutation. */