in reply to Re^7: 64-bit *nix/gcc expertise required
in thread 64-bit *nix/gcc expertise required (THIS IS NOT OFF TOPIC!)

Tux Many thanks for your assistance. Up for a bit more?

In theory, based on my reading the gcc headers, this should compile clean under 32/64-bit. It probably won't, but once you recover from your seasonal revelries, I'd appreciated seeing the warnings/errors produced on your various platforms.

#include <stdio.h> #define __STDC_LIMIT_MACROS #include <stdint.h> #include <stddef.h> #define ALIGN_BITS ( sizeof(void*) >> __UINT64_C( 1 ) ) #define BIT_BITS __UINT64_C( 3 ) #define BYTE_BITS __UINT64_C( 14 ) #define SLOT_BITS ( sizeof( void*) * 8 ) - ( ALIGN_BITS + BIT_BITS + + BYTE_BITS ) #define BYTES_PER_SLOT __UINT64_C( 1 ) << BYTE_BITS #define TRACKING_SLOTS 8192 // max. 8192 for 4GB/32-bit machine int check_new( uintptr_t p ) { ptrdiff_t slot = ( p >> (BYTE_BITS + BIT_BITS + ALIGN_BITS) ); ptrdiff_t byte = ( p >> (ALIGN_BITS + BIT_BITS)) & __UINT64_C( 0x0 +0003fff ) ptrdiff_t bit = ( p >> ALIGN_BITS) & __UINT64_C( 0x0 +0000007 ); ptrdiff_t nop = p & __UINT64_C( 0x3 + ); printf( "address: %p slot: %p byte: %4x bit: %4x nop:%x\n", p, slot, byte, bit, nop ); return 1; } void main( void ) { uintptr_t p; for( p = __UINT64_C( 123456 ); p < ( __UINT64_C( 1 ) << 34 ); p += + ( __UINT64_C( 1 ) << 29 ) ) { check_new( p ); } }

Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^9: 64-bit *nix/gcc expertise required
by Tux (Canon) on Dec 26, 2010 at 09:06 UTC

    ; missing on line 16, the return type of main (int argc, char *argv[]) should be int. Besides that, lets try simple ...

    $ cat test2.c
    $ gcc -dumpversion 4.2.4 $ gcc -o test2 test2.c test2.c: In function 'main': test2.c:29: warning: left shift count >= width of type ld: Unsatisfied symbol "__UINT64_C" in file /tmp/ccAAXIbg.o 1 errors. $ gcc -mlp64 -fno-strict-aliasing -pipe -fPIC -o test2 test2.c test2.c: In function 'main': test2.c:29: warning: left shift count >= width of type ld: Unsatisfied symbol "__UINT64_C" in file /tmp/ccvHbmFn.o 1 errors.

    Did you actually try this yourself, and with what version of gcc? If this is gcc-only code I could try on my various platforms, but I'm sure that that would work just as on any 32bit capable 64bit platform.

    Older versions of gcc do not know about stdint.h

    $ gcc -dumpversion 3.4.6 $ gcc -fno-strict-aliasing -pipe -fPIC -o test2 test2.c test2.c:3:20: stdint.h: No such file or directory test2.c: In function `main': test2.c:29: warning: left shift count >= width of type $

    Above won't compile with HP C-ANSI-C for example.


    Enjoy, Have FUN! H.Merijn

      I have now tested my assumptions with gcc:

      Nigel@PB-IM2424 ~ $ gcc --version gcc.exe (GCC) 4.5.0 Copyright (C) 2010 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There i +s NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PUR +POSE. Nigel@PB-IM2424 ~ $ gcc -Wall tracking.c tracking.c: In function 'check_new': tracking.c:22:5: warning: format '%p' expects type 'void *', but argum +ent 2 has type 'uintptr_t' tracking.c:22:5: warning: format '%p' expects type 'void *', but argum +ent 3 has type 'ptrdiff_t' tracking.c: At top level: tracking.c:26:6: warning: return type of 'main' is not 'int' Nigel@PB-IM2424 ~ $ cat tracking.c #include <stdio.h> #define __STDC_LIMIT_MACROS #include <stdint.h> #include <stddef.h> #define ALIGN_BITS ( sizeof(void*) >> __UINT64_C( 1 ) ) #define BIT_BITS __UINT64_C( 3 ) #define BYTE_BITS __UINT64_C( 14 ) #define SLOT_BITS ( sizeof( void*) * 8 ) - ( ALIGN_BITS + BIT_BITS + + BYTE_BITS ) #define BYTES_PER_SLOT __UINT64_C( 1 ) << BYTE_BITS #define TRACKING_SLOTS 8192 // max. 8192 for 4GB/32-bit machine int check_new( uintptr_t p ) { ptrdiff_t slot = ( p >> ( ALIGN_BITS + BIT_BITS + BYTE_BITS ) ); ptrdiff_t byte = ( p >> ( ALIGN_BITS + BIT_BITS)) & ( BYTE_BITS - + 1 ); ptrdiff_t bit = ( p >> ALIGN_BITS) & ( BIT_BITS - + 1 ); ptrdiff_t nop = p & ( ALIGN_BITS - + 1 ); printf( "address: %p slot: %p byte: %4x bit: %4x nop:%x\n", p, slot, byte, bit, nop ); return 1; } void main( void ) { uintptr_t p; for( p = __UINT64_C( 123456 ); p < ( __UINT64_C( 1 ) << 34 ); p += ( __UINT64_C( 1 ) << 29 ) ) { check_new( p ); } }

      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
      Did you actually try this yourself, and with what version of gcc?

      No, I'm trying to piece this together from various bit of documentation: stddef.h stdint.h


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.