Call to veneers in ARM mode

Since commit c6630ef92a, Call to a veneer
when the final symbol to be reached is thumb is made through a blx
instruction. This is a mistake since veneers are ARM instructions and
should thus be called with a simple bl. This commit prevent the bl ->
blx conversion when a veneer is used.
This commit is contained in:
Thomas Preud'homme 2012-11-09 10:59:06 +01:00
parent 061b5799cc
commit 14c99236da

View file

@ -615,8 +615,10 @@ ST_FUNC void relocate_section(TCCState *s1, Section *s)
#ifndef TCC_TARGET_PE
if ((x & 3) || x >= 0x4000000 || x < -0x4000000)
if (!(x & 3) || !blx_avail || !is_call)
if (s1->output_type == TCC_OUTPUT_MEMORY)
if (s1->output_type == TCC_OUTPUT_MEMORY) {
x += add_jmp_table(s1, val) - val; /* add veneer */
is_thumb = 0; /* Veneer uses ARM instructions */
}
#endif
if ((x & 3) || x >= 0x4000000 || x < -0x4000000)
if (!(x & 3) || !blx_avail || !is_call)