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

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

$ cat test2.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 + B +YTE_BITS) #define BYTES_PER_SLOT __UINT64_C (1) << BYTE_BITS #define TRACKING_SLOTS 8192 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; } /* check_new */ int main (int argc, char *argv[]) { uintptr_t p; for (p = __UINT64_C (123456); p < (__UINT64_C (1) << 34); p += (__ +UINT64_C (+1) << 29)) check_new (p); return (1); } /* main */
$ 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.

$ cc -Ae -z +Z +w +DD64 -o test2 test2.c "test2.c", line 15: warning #2223-D: function "__UINT64_C" declared im +plicitly ptrdiff_t slot = ( p >> (BYTE_BITS + BIT_BITS + ALIGN_BITS)); ^ "test2.c", line 15: remark #4242-D: no prototype or definition in scop +e for call to "__UINT64_C" ptrdiff_t slot = ( p >> (BYTE_BITS + BIT_BITS + ALIGN_BITS)); ^ "test2.c", line 21: warning #2181-D: argument is incompatible with corresponding format string conversion p, slot, byte, bit, nop); ^ "test2.c", line 21: warning #2181-D: argument is incompatible with corresponding format string conversion p, slot, byte, bit, nop); ^ "test2.c", line 21: warning #2181-D: argument is incompatible with corresponding format string conversion p, slot, byte, bit, nop); ^ "test2.c", line 21: warning #2181-D: argument is incompatible with corresponding format string conversion p, slot, byte, bit, nop); ^ "test2.c", line 21: warning #2181-D: argument is incompatible with corresponding format string conversion p, slot, byte, bit, nop); ^ "test2.c", line 25: warning #2951-D: return type of function "main" mu +st be "int" void main (int argc, char *argv[]) ^ "test2.c", line 29: warning #2223-D: function "__UINT64_C" declared im +plicitly for (p = __UINT64_C (123456); p < (__UINT64_C (1) << 34); p += ( +__UINT64_C (+1) << 29)) { ^ "test2.c", line 29: remark #4272-D: conversion from "int" to "uintptr_ +t" may lose sign for (p = __UINT64_C (123456); p < (__UINT64_C (1) << 34); p += ( +__UINT64_C (+1) << 29)) { ^ "test2.c", line 29: warning #2063-D: shift count is too large for (p = __UINT64_C (123456); p < (__UINT64_C (1) << 34); p += ( +__UINT64_C (+1) << 29)) { ^ "test2.c", line 29: remark #4248-D: comparison of unsigned integer wit +h a signed integer for (p = __UINT64_C (123456); p < (__UINT64_C (1) << 34); p += ( +__UINT64_C (+1) << 29)) { ^ "test2.c", line 15: remark #4298-D: addition result could be truncated + before cast to bigger sized type ptrdiff_t slot = ( p >> (BYTE_BITS + BIT_BITS + ALIGN_BITS)); ^ "test2.c", line 29: remark #4249-D: value could be truncated before ca +st to bigger sized type for (p = __UINT64_C (123456); p < (__UINT64_C (1) << 34); p += ( +__UINT64_C (+1) << 29)) { ^ "test2.c", line 29: remark #4249-D: value could be truncated before ca +st to bigger sized type for (p = __UINT64_C (123456); p < (__UINT64_C (1) << 34); p += ( +__UINT64_C (+1) << 29)) { + ^ ld: Unsatisfied symbol "__UINT64_C" in file test2.o

Enjoy, Have FUN! H.Merijn

Replies are listed 'Best First'.
Re^10: 64-bit *nix/gcc expertise required
by BrowserUk (Patriarch) on Dec 26, 2010 at 16:32 UTC

    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.
Re^10: 64-bit *nix/gcc expertise required
by BrowserUk (Patriarch) on Dec 26, 2010 at 11:06 UTC
    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.