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