[PATCH, alpha]: Fix g++.dg/other/pr22003.C ICE
Uros Bizjak
ubizjak@gmail.com
Tue Aug 18 18:25:00 GMT 2009
Hello!
This ICE exposes the problem with generation of thunks with
-freorder-blocks-and-partition. The problem is, that function data,
needed to switch sections (i.e. names of hot and cold sections), is not
available any more after free_after_compilation is called throuh
ASM_DECLARE_FUNCTION_SIZE macro (aka alpha_end_function).
free_after_compilation is called in order to free data that was
allocated by our specific way that thunks are generated (see
alpha_emit_mi_thunk_osf). alpha_end_function that scans insn stream is
called throuh ASM_DECLARE_FUNCTION_SIZE macro, so insn stream that is
allocated by alpha_emit_mi_thunk can be released no earlier than after
the insn scan loop in alpha_end_function.
However, when -freorder-blocks-and-partition is in effect, compilation
still needs crtl data to output section labels and switch sections after
ASM_DECLARE_FUNCTION_SIZE is called (see assemble_end_function in
varasm.c). Calling free_after_compilation from alpha_end_function is
thus wrong.
Attached patch fixes this problem by freeing just crtl->emit structure
that is populated by alpha_emit_mi_thunk_osf, preserving other function
data. The crtl structure is still cleared by "*clean_state" pass, so
there is no leakage.
Also, emit_insn function needs insn locators (make insn_locator calls
curr_insn_locator), so this patch moves insn locator initialization
before the first call of emit_insn, and frees locators after all insn
processing is done in alpha_end_function. Oh, and we are sure that
alpha_output_mi_thunk_osf always processes thunks so assert is not needed ;)
2009-08-18 Uros Bizjak <ubizjak@gmail.com>
* config/alpha/alpha.c (alpha_output_mi_thunk_osf): Allocate insn
locators before emit_insn is called. Remove assert that
cfun->is_thunk.
(alpha_end_function): Clear crtl->emit structure and free insn
locators if cfun->is_thunk is true.
The patch was bootstrapped and regression tested on alphaev68-linux-gnu
and fixes:
FAIL: g++.dg/other/pr22003.C (internal compiler error)
FAIL: g++.dg/other/pr22003.C (test for excess errors)
OK for mainline, 4.4 and 4.3 ?
Uros.
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: a.diff.txt
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20090818/996ec0cc/attachment.txt>
More information about the Gcc-patches
mailing list