[LLVMdev] A new builtin: __builtin_stack_pointer()

Behan Webster behanw at converseincode.com
Sun Oct 20 08:22:36 PDT 2013


On 10/10/13 22:01, Jakob Stoklund Olesen wrote:
> 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; \
>     })
>
> /jakob
That seems to work! Though I'm still testing it in all our situations
for LLVMLinux. It looks like I can get this to work with LLVM 3.3 and
the LLVMLinux kernel patches. Thanks!

However, I'd still like to see __builtin_stack_pointer() added since it
is simple, obvious, and mirrors other builtins like
__builtin_frame_address().

Behan

-- 
Behan Webster
behanw at converseincode.com




More information about the llvm-dev mailing list