[llvm] r175576 - [ms-inline asm] Force the use of a base pointer if the MachineFunction includes

Reid Kleckner rnk at google.com
Thu Aug 8 10:42:44 PDT 2013


gcc will try really hard to find a free register from which to address your
stack variables, starting with esp, and then falling back to any free
register.  If you clobber every register except for ebp *and* require stack
realignment, it errors out.

If you remove any clobber from the following example, it will compile.

$ cat realign_inline_asm.c
int foo(int a) {
  __attribute__((aligned(16))) int r = -1;
  asm volatile ("push %%edi\n\t"
                "xor %%eax, %%eax\n\t"
                "xor %%ebx, %%ebx\n\t"
                "xor %%ecx, %%ecx\n\t"
                "xor %%edx, %%edx\n\t"
                "xor %%esi, %%esi\n\t"
                "mov %0, %%eax\n\t"
                "pop %%edi\n\t"
                "xor %%edi, %%edi\n\t"
                : "=m"(r) /* out */
                : /* in */
                : "eax", "ebx", "ecx", "edx", "esi", "edi", "esp");
  return r;
}

$ gcc -m32 -c realign_inline_asm.c -S -o -  -mstackrealign
        .file   "realign_inline_asm.c"
realign_inline_asm.c: In function ‘foo’:
realign_inline_asm.c:3:3: error: can’t find a register in class
‘GENERAL_REGS’ while reloading ‘asm’

For now, at least, it would be nice to report a fatal error when we want to
use esi for the BP, but we have inline asm that clobbers it.  We already
have the clobber list with that info.


On Thu, Aug 8, 2013 at 7:39 AM, Chad Rosier <chad.rosier at gmail.com> wrote:

>
> On Wed, Aug 7, 2013 at 8:38 PM, Jakob Stoklund Olesen <stoklund at 2pi.dk>wrote:
>
>> On Aug 7, 2013, at 5:17 PM, Reid Kleckner <rnk at google.com> wrote:
>>
>> > Wouldn't it be much better to use ebp for the base pointer and put the
>> pre-alignment SP into a local that could be spilled or register allocated
>> as necessary?  Is that just a matter of work?
>>
>> I think stack unwinders would expect to find the frame pointer in %ebp.
>>
>> /jakob
>
>
> Unfortunately, I can't think of a simple solution here.  How does gcc
> handle this case?  IIRC, gcc was the original motivating factor for forcing
> the use of the FP?
>
>  Chad
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130808/5a4fe20f/attachment.html>


More information about the llvm-commits mailing list