[PATCH] Initial support for __sptr and __uptr

Aaron Ballman aaron at aaronballman.com
Tue May 14 17:41:55 PDT 2013


On Tue, May 14, 2013 at 8:34 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> On Tue, May 14, 2013 at 4:07 PM, Charles Davis <cdavis5x at gmail.com> wrote:
>>
>>
>> On May 14, 2013, at 4:26 PM, Aaron Ballman wrote:
>> >
>> >> Do __sptr and __uptr get different manglings?
>> >
>> > They do:
>> >
>> > void func( int * __ptr32 p ) {}
>> > void func2( int * __ptr64 p ) {}
>> >
>> > PUBLIC ?func@@YAXPAH at Z ; func
>> > PUBLIC ?func2@@YAXPEAH at Z ; func2
>> >
>> > Namely, the presence of E (rnk pointed this out previously).
>> He was asking about __sptr and __uptr :). They don't by the way:
>>
>> > cl /c test.cpp
>> [extraneous banner output omitted]
>> > dumpbin /symbols test.obj
>> [...]
>> 00F 00000010 SECT4  notype ()    External     | ?func@@YAXPAH at Z (void
>> __cdecl func(int *))
>> 010 00000020 SECT4  notype ()    External     | ?func2@@YAXPAH at Z (void
>> __cdecl func2(int *))
>
>
> Thanks. One more thing:
>
> template<typename T> void f(void **p, T *q) { *p = *q; }
>
> void *g(int *__ptr32 __sptr a) {
>   void *result;
>   f(&result, &a);
>   return result;
> }
> void *h(char *__ptr32 __uptr a) {
>   void *result;
>   f(&result, &a);
>   return result;
> }
>
> int main() {
>   printf("%p\n", g((int *__ptr32 __sptr)0xdeadbeef));
>   printf("%p\n", h((char *__ptr32 __uptr)0xdeadbeef));
> }
>
> Does one of these get sign-extended and the other one get zero-extended?

The first is sign extended, and the second is zero extended in 64-bit.

~Aaron



More information about the cfe-commits mailing list