Skip to content

Support architectures where long is smaller than pointers

Alexander Richardson requested to merge arichardson/freetype:uintptr_t into master

I am currently trying to compile fretype for CHERI-extended ISAs (CHERI-RISC-V and Arm's Morello), but I am getting compiler warnings from the FT_UINT_TO_POINTER() macro. When compiling with the CHERI Clang compiler, not using uinptr_t for casts between integers an pointers will result in the following -Werror build failures:

In file included from ../../freetype2/src/truetype/truetype.c:22:
../../freetype2/src/truetype/ttgload.c:1925:22: error: cast from provenance-free integer type to pointer type will give pointer that can not be dereferenced [-Werror,-Wcheri-capability-misuse]
        node->data = FT_UINT_TO_POINTER( glyph_index );
                     ^
../../freetype2/include/freetype/internal/compiler-macros.h:79:34: note: expanded from macro 'FT_UINT_TO_POINTER'
#define FT_UINT_TO_POINTER( x )  (void *)(unsigned long)(x)

The ISO C standard compliant fix for this would be to use uintptr_t from <stdint.h>, but I am not sure if this is supported by the minimum compiler version. Therefore, use the compiler-defined __UINTPTR_TYPE__ macro (supported in GCC 4.6+ and Clang since about 3.0) before checking for _WIN64 and falling back to unsigned long.

Edited by Alexander Richardson

Merge request reports