[LLVMdev] A new builtin: __builtin_stack_pointer()

Alp Toker alp at nuanti.com
Tue Nov 5 00:20:34 PST 2013


On 20/10/2013 16:22, Behan Webster wrote:
> 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().

Ping on this?

It seems like a legitimate builtin to have in clang, if only for
compatibility and the nicer IR representation.

Alp.

>
> Behan
>

-- 
http://www.nuanti.com
the browser experts




More information about the llvm-dev mailing list