#include <stdio.h>
#include <stddef.h>

#ifdef __GNU_LIBRARY__
#if __GLIBC_PREREQ(2, 4)
#define USE_POINTER_GUARD
#endif
#endif

#ifdef USE_POINTER_GUARD
#if defined(__linux__) && defined(__i386__)
/** taken from glibc */
typedef struct
{
    void *tcb;
    void *dtv;
    void *self;
    int multiple_threads;
    unsigned int sysinfo;
    unsigned int stack_guard;
    unsigned int pointer_guard;
} tcbhead_t;

#define PTR_MANGLE(var)    asm ("xorl %%gs:%c2, %0"              \
                 : "=r" (var)                  \
                 : "0" (var),                  \
                   "i" (offsetof (tcbhead_t,          \
                          pointer_guard)))
#define PTR_DEMANGLE(var)    PTR_MANGLE (var)
#else
#error POINTER_GUARD support not implemented for this architecture
#endif
#else
#define PTR_MANGLE(var)
#define PTR_DEMANGLE(var)
#endif

int main(int argc, char *argv[]) {
    char *ptr = 0;
    PTR_MANGLE(ptr);
    printf("%p\n", ptr);
    return 0;
}
