<div dir="ltr">On Wed, Sep 7, 2016 at 7:55 PM, Peter Smith via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello Simon,<br><br>Yes it is okay to write ARM thunks before an InputSection. There is a<br>similar "inline state change" thunk in ARM that does BX PC, NOP to<br>change state and fall through.</blockquote><div> </div>Maybe it's a little bit evil, but I've found that SUB PC,PC,#3 works just fine to change to Thumb state without any NOP needed on all current-generation CPUs I've tried it on, and in particular  Raspberry Pi 2 (Cortex A7), Pi 3 (Cortex A53) and Odroid XU4 (Cortex A15).<div><br></div><div>Unfortunately I never though to try this ten years ago on the ARM7TDMI</div><div><br></div><div>e.g. (assumes Linux EABI kernel)</div><div><br></div><div><div>.equ SYSCALL_EXIT,<span class="gmail-Apple-tab-span" style="white-space:pre">    </span>1</div><div>.equ SYSCALL_WRITE,<span class="gmail-Apple-tab-span" style="white-space:pre">   </span>4<br></div><div>.equ STDOUT,<span class="gmail-Apple-tab-span" style="white-space:pre">        </span>1<br></div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">   </span>.globl<span class="gmail-Apple-tab-span" style="white-space:pre">        </span>_start</div><div><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>.syntax unified</div><div>_start:<br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">        </span><span class="gmail-Apple-tab-span">sub</span><span class="gmail-Apple-tab-span" style="white-space:pre">   </span>pc,pc,#3<br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>.thumb</div><div><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>movs<span class="gmail-Apple-tab-span" style="white-space:pre">  </span>r0,#STDOUT</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>adr<span class="gmail-Apple-tab-span" style="white-space:pre">   </span>r1,hello</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">       </span>movs<span class="gmail-Apple-tab-span" style="white-space:pre">  </span>r2,#11</div><div><span class="gmail-Apple-tab-span" style="white-space:pre"> </span>movs<span class="gmail-Apple-tab-span" style="white-space:pre">  </span>r7,#SYSCALL_WRITE</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>swi<span class="gmail-Apple-tab-span" style="white-space:pre">   </span>0</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">      </span>movs<span class="gmail-Apple-tab-span" style="white-space:pre">  </span>r7,#SYSCALL_EXIT</div><div><span class="gmail-Apple-tab-span" style="white-space:pre">       </span>swi<span class="gmail-Apple-tab-span" style="white-space:pre">   </span>0</div><div><br></div><div><span class="gmail-Apple-tab-span" style="white-space:pre">     </span>.align 2</div><div>hello:<span class="gmail-Apple-tab-span" style="white-space:pre"> </span>.asciz "Hello asm!\n"</div></div><div><br></div><div class="gmail_extra"><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">It is worth mentioning that disassembly of ARM and Thumb Thunks may<br>
look a bit strange if they are moved from after the InputSection. This<br>
is because they lack a mapping symbol ($a or $t) that tells the<br>
disassembler what instruction set to disassemble. I've got adding<br>
mapping symbol for linker generated InputSections on my list of things<br>
to do.<br></blockquote><div><br></div><div>This disassembles fine when built in the standard way so there's clearly no fundamental problem with disassembling past inline thunks:</div><div><br></div><div>$ as asm_test.s -o asm_test.o</div><div>$ ld asm_test.o -o asm_test</div><div><div>$ ./asm_test</div><div>Hello asm!</div></div><div>$ objdump -d asm_test<br></div></div><div class="gmail_extra"><br></div><div class="gmail_extra">asm_test:     file format elf32-littlearm</div><div class="gmail_extra"><br></div><div class="gmail_extra">Disassembly of section .text:<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">00010054 <_start>:</div><div class="gmail_extra">   10054:<span class="gmail-Apple-tab-span" style="white-space:pre">        </span>e24ff003 <span class="gmail-Apple-tab-span" style="white-space:pre">     </span>sub<span class="gmail-Apple-tab-span" style="white-space:pre">   </span>pc, pc, #3</div><div class="gmail_extra">   10058:<span class="gmail-Apple-tab-span" style="white-space:pre">    </span>2001      <span class="gmail-Apple-tab-span" style="white-space:pre"> </span>movs<span class="gmail-Apple-tab-span" style="white-space:pre">  </span>r0, #1</div><div class="gmail_extra">   1005a:<span class="gmail-Apple-tab-span" style="white-space:pre">        </span>a103      <span class="gmail-Apple-tab-span" style="white-space:pre"> </span>add<span class="gmail-Apple-tab-span" style="white-space:pre">   </span>r1, pc, #12<span class="gmail-Apple-tab-span" style="white-space:pre">   </span>; (adr r1, 10068 <hello>)</div><div class="gmail_extra">   1005c:<span class="gmail-Apple-tab-span" style="white-space:pre">       </span>220b      <span class="gmail-Apple-tab-span" style="white-space:pre"> </span>movs<span class="gmail-Apple-tab-span" style="white-space:pre">  </span>r2, #11</div><div class="gmail_extra">   1005e:<span class="gmail-Apple-tab-span" style="white-space:pre">       </span>2704      <span class="gmail-Apple-tab-span" style="white-space:pre"> </span>movs<span class="gmail-Apple-tab-span" style="white-space:pre">  </span>r7, #4</div><div class="gmail_extra">   10060:<span class="gmail-Apple-tab-span" style="white-space:pre">        </span>df00      <span class="gmail-Apple-tab-span" style="white-space:pre"> </span>svc<span class="gmail-Apple-tab-span" style="white-space:pre">   </span>0</div><div class="gmail_extra">   10062:<span class="gmail-Apple-tab-span" style="white-space:pre">     </span>2701      <span class="gmail-Apple-tab-span" style="white-space:pre"> </span>movs<span class="gmail-Apple-tab-span" style="white-space:pre">  </span>r7, #1</div><div class="gmail_extra">   10064:<span class="gmail-Apple-tab-span" style="white-space:pre">        </span>df00      <span class="gmail-Apple-tab-span" style="white-space:pre"> </span>svc<span class="gmail-Apple-tab-span" style="white-space:pre">   </span>0</div><div class="gmail_extra">   10066:<span class="gmail-Apple-tab-span" style="white-space:pre">     </span>46c0      <span class="gmail-Apple-tab-span" style="white-space:pre"> </span>nop<span class="gmail-Apple-tab-span" style="white-space:pre">                   </span>; (mov r8, r8)</div><div class="gmail_extra"><br></div><div class="gmail_extra">00010068 <hello>:</div><div class="gmail_extra">   10068:<span class="gmail-Apple-tab-span" style="white-space:pre">     </span>6c6c6548 <span class="gmail-Apple-tab-span" style="white-space:pre">     </span>.word<span class="gmail-Apple-tab-span" style="white-space:pre"> </span>0x6c6c6548</div><div class="gmail_extra">   1006c:<span class="gmail-Apple-tab-span" style="white-space:pre">    </span>7361206f <span class="gmail-Apple-tab-span" style="white-space:pre">     </span>.word<span class="gmail-Apple-tab-span" style="white-space:pre"> </span>0x7361206f</div><div class="gmail_extra">   10070:<span class="gmail-Apple-tab-span" style="white-space:pre">    </span>000a216d <span class="gmail-Apple-tab-span" style="white-space:pre">     </span>.word<span class="gmail-Apple-tab-span" style="white-space:pre"> </span>0x000a216d</div><div><br></div><div>NB that first e24ff003 is an ARM instruction, *not* Thumb2.</div><div><br></div></div></div>