mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-16 04:50:51 +01:00
* also use blx instead of bl for direct calls on ARMv5+, since the target
may be thumb(2) (mantis #19896) * don't conditionalize "blx <imm target>", because that's not a valid encoding git-svn-id: trunk@18984 -
This commit is contained in:
parent
16859976da
commit
852ae48cb7
@ -51,7 +51,11 @@ Implementation
|
||||
|
||||
function CanBeCond(p : tai) : boolean;
|
||||
begin
|
||||
result:=(p.typ=ait_instruction) and (taicpu(p).condition=C_None);
|
||||
result:=
|
||||
(p.typ=ait_instruction) and
|
||||
(taicpu(p).condition=C_None) and
|
||||
((taicpu(p).opcode<>A_BLX) or
|
||||
(taicpu(p).oper[0]^.typ=top_reg));
|
||||
end;
|
||||
|
||||
|
||||
|
||||
@ -510,14 +510,21 @@ unit cgcpu;
|
||||
|
||||
|
||||
procedure tcgarm.a_call_name(list : TAsmList;const s : string; weak: boolean);
|
||||
var
|
||||
branchopcode: tasmop;
|
||||
begin
|
||||
{ check not really correct: should only be used for non-Thumb cpus }
|
||||
if (current_settings.cputype<cpu_armv5) then
|
||||
branchopcode:=A_BL
|
||||
else
|
||||
branchopcode:=A_BLX;
|
||||
if target_info.system<>system_arm_darwin then
|
||||
if not weak then
|
||||
list.concat(taicpu.op_sym(A_BL,current_asmdata.RefAsmSymbol(s)))
|
||||
list.concat(taicpu.op_sym(branchopcode,current_asmdata.RefAsmSymbol(s)))
|
||||
else
|
||||
list.concat(taicpu.op_sym(A_BL,current_asmdata.WeakRefAsmSymbol(s)))
|
||||
list.concat(taicpu.op_sym(branchopcode,current_asmdata.WeakRefAsmSymbol(s)))
|
||||
else
|
||||
list.concat(taicpu.op_sym(A_BL,get_darwin_call_stub(s,weak)));
|
||||
list.concat(taicpu.op_sym(branchopcode,get_darwin_call_stub(s,weak)));
|
||||
{
|
||||
the compiler does not properly set this flag anymore in pass 1, and
|
||||
for now we only need it after pass 2 (I hope) (JM)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user