On 03/24/2011 03:24 PM, Richard Earnshaw wrote: > > On Wed, 2011-03-23 at 16:46 +0100, Bernd Schmidt wrote: >> I've discovered a problem with -mlong-calls on ARM. The bug was first >> reported against a new target, but I'd copied the relevant code from the >> ARM backend. >> >> We use current_function_section in arm_is_long_call_p to decide whether >> we're calling something that goes into the same section. The problem >> with this is that current_function_section can only be used during >> final, since it relies on the global variable in_cold_section_p which is >> set up only in assemble_start_function. On ARM, this problem manifests >> as short-calls when a long-call would be required; in the other port it >> was an "insn doesn't satisfy its constraints" error. >> >> The following patch is against 4.5, since the problem appears hidden in >> mainline (the initialization of first_function_block_is_cold has >> changed). Ok for trunk and branches after arm-linux tests complete? >> >> >> Bernd > > The ARM port currently doesn't support hot/cold partitioning of code > (and can't until the constant pool code is rewritten to deal with it), > so how is this a problem?
Different functions can still go into different sections. When we start expanding a function, in_cold_section_p still contains the value that was correct for the previous one. It will change at the start of final, which means that current_function_section can return different values while compiling a function. See the included testcase. Bernd