[LLVMdev] A new builtin: __builtin_stack_pointer()

Behan Webster behanw at converseincode.com
Tue Nov 5 10:00:24 PST 2013


On 11/05/13 09:26, Konstantin Tokarev wrote:
>
> 11.10.2013, 01:39, "Jakob Stoklund Olesen" <stoklund at 2pi.dk>:
>> On Oct 10, 2013, at 12:32 PM, Behan Webster <behanw at converseincode.com> wrote:
>>
>>>  One of the issues the LLVMLinux project is having is with the use of
>>>  named registers in the Linux kernel code. The kernel uses something like
>>>  this in order to assign a C variable name to a register (one for each
>>>  kernel arch).
>>>
>>>     register unsigned long current_stack_pointer asm("esp");
>>>
>>>  clang doesn't allow this kind of thing which required a patch which less
>>>  efficient:
>>>
>>>  #define current_stack_pointer ({ \
>>>        unsigned long esp; \
>>>        asm("mov %%esp, %0" : "=r"(esp)); \
>>>        esp; \
>>>  })
>>>
>>>  This works for both gcc and clang, but often adds in 3 extra
>>>  instructions since you need to copy the stack pointer to another
>>>  register, but first that register needs to be saved to the stack and
>>>  then restored after the stackpointer has been used; inefficient.
>> #define current_stack_pointer ({ \
>>         register unsigned long esp asm("esp"); \
>>         asm("" : "=r"(esp)); \
>>         esp; \
>>     })
> And #ifdef it for each arch? Builtin would be much more handy.
Actually no #ifdef is required with Jakob's suggestion (works the same
in both clang and gcc).

However the builtin is indeed nicer, easier to read and much more in
keeping with the other builtins...

Behan

-- 
Behan Webster
behanw at converseincode.com




More information about the llvm-dev mailing list