Fix thumbv4t indirect calls
authorJonathan Roelofs <jonathan@codesourcery.com>
Thu, 4 Dec 2014 19:34:50 +0000 (19:34 +0000)
committerJonathan Roelofs <jonathan@codesourcery.com>
Thu, 4 Dec 2014 19:34:50 +0000 (19:34 +0000)
commit3d478553942d796764a9ae4ba8f6aca378ab867d
treeaa727898e9818bd4e445ffd754b9250ee7f4f80c
parentef7c2ff0f38b1181f39cc3882db80c31b71b9d62
Fix thumbv4t indirect calls

So there are a couple of issues with indirect calls on thumbv4t. First, the most
'obvious' instruction, 'blx' isn't available until v5t. And secondly, the
next-most-obvious sequence: 'mov lr, pc; bx rN' doesn't DTRT in thumb code
because the saved off pc has its thumb bit cleared, so when the callee returns
we end up in ARM mode.... yuck.

The solution is to 'bl' to a nearby landing pad with a 'bx rN' in it.

We could cut down on code size by sharing the landing pads between call sites
that are close enough, but for the moment let's do correctness first and look at
performance later.

Patch by: Iain Sandoe

http://reviews.llvm.org/D6519

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223380 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/ARM/ARMAsmPrinter.cpp
lib/Target/ARM/ARMAsmPrinter.h
test/CodeGen/ARM/none-macho-v4t.ll
test/CodeGen/ARM/thumb_indirect_calls.ll [new file with mode: 0644]