I'm fixing a bug. It's caused by uninitialized caller save pass data.
One function in the test case uses the "optimize" attribute with "O2"
option. So even with -O0 in command line, GCC calls caller save pass for
that function. The problem is init_caller_save is called in
backend_inti_target if flag_caller_saves is set. Apparently, in this
case, flag_caller_saves is not set when came to backend_inti_target. I
think there are several ways to fix this bug, but I don't know which way
should/can I go:
1. Always call init_caller_save in backend_inti_target. But it seems a
waste for most cases if -O0.
2. Call init_caller_save in IRA main function. But by this way it will
be called multiple times unless we create a flag to remember if it has
been called or not. Maybe we can reuse test_reg or test_mem. If they are
NULL_TREE, just call init_caller_save.
3. Call init_caller_save in handle_optimize_attribute. If
flag_caller_saves is not set before parse_optimize_options but set
after, call init_caller_save. Considering there might be multiple
functions using optimize attribute, we also need a flag to remember if
init_caller_save has been called or not.
4. There are only three global function in caller-save.c:
init_save_areas, setup_save_areas, and save_call_clobbered_regs. We can
just add a check in the beginning of those functions. If the data has
not been initialized, just init_caller_save first.
Any suggestions?
Thanks in advance.
--
Jie Zhang
CodeSourcery
(650) 331-3385 x735