From: Thomas Preud'homme Date: Fri, 9 Nov 2012 09:59:06 +0000 (+0100) Subject: Call to veneers in ARM mode X-Git-Tag: release_0_9_26~107 X-Git-Url: https://repo.or.cz/w/tinycc.git/commitdiff_plain/14c99236da35f393e25d08868126284b687008f7 Call to veneers in ARM mode 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. --- diff --git a/tccelf.c b/tccelf.c index e8af18a9..a2559eec 100644 --- 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)