Call to veneers in ARM mode
authorThomas Preud'homme <robotux@celest.fr>
Fri, 9 Nov 2012 09:59:06 +0000 (9 10:59 +0100)
committerThomas Preud'homme <robotux@celest.fr>
Fri, 9 Nov 2012 09:59:06 +0000 (9 10:59 +0100)
Since commit c6630ef92a21ca33af08b1faa03fba578e12315f, 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.

tccelf.c

index e8af18a..a2559ee 100644 (file)
--- a/tccelf.c
+++ b/tccelf.c
@@ -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)