freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2] master f7c6a06: Support architectures where `long` is smalle


From: Werner Lemberg
Subject: [freetype2] master f7c6a06: Support architectures where `long` is smaller than pointers.
Date: Thu, 15 Jul 2021 06:09:56 -0400 (EDT)

branch: master
commit f7c6a06cb7458c8972955ebd698058d0957a0a47
Author: Alex Richardson <Alexander.Richardson@cl.cam.ac.uk>
Commit: Werner Lemberg <wl@gnu.org>

    Support architectures where `long` is smaller than pointers.
    
    I am currently trying to compile FreeType 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 results in the following `-Werror` build failures:
    
    ```
    In file included from .../src/truetype/truetype.c:22:
      .../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 );
                   ^
      .../include/freetype/internal/compiler-macros.h:79:34: note:
        expanded from macro 'FT_UINT_TO_POINTER'
    ```
    
    * include/freetype/internal/compiler-macros.h (FT_UINT_TO_POINTER):
    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`.
---
 ChangeLog                                   | 30 +++++++++++++++++++++++++++++
 include/freetype/internal/compiler-macros.h | 12 +++++++++---
 2 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c8a0795..751fdd4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,33 @@
+2021-07-15  Alex Richardson  <Alexander.Richardson@cl.cam.ac.uk>
+
+       Support architectures where `long` is smaller than pointers.
+
+       I am currently trying to compile FreeType 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 results in the following `-Werror` build failures:
+
+       ```
+       In file included from .../src/truetype/truetype.c:22:
+         .../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 );
+                      ^
+         .../include/freetype/internal/compiler-macros.h:79:34: note:
+           expanded from macro 'FT_UINT_TO_POINTER'
+       ```
+
+       * include/freetype/internal/compiler-macros.h (FT_UINT_TO_POINTER):
+       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`.
+
 2021-07-13  Oleg Oshmyan  <chortos@inbox.lv>
 
        [base] Fix `FT_Open_Face`'s handling of user-supplied streams.
diff --git a/include/freetype/internal/compiler-macros.h 
b/include/freetype/internal/compiler-macros.h
index 0eb5e24..d8b61b3 100644
--- a/include/freetype/internal/compiler-macros.h
+++ b/include/freetype/internal/compiler-macros.h
@@ -71,12 +71,18 @@ FT_BEGIN_HEADER
    */
 #define FT_DUMMY_STMNT  FT_BEGIN_STMNT FT_END_STMNT
 
-#ifdef _WIN64
+#ifdef __UINTPTR_TYPE__
+  /*
+   * GCC and Clang both provide a `__UINTPTR_TYPE__` that can be used to
+   * avoid a dependency on `stdint.h`.
+   */
+#  define FT_UINT_TO_POINTER( x )  (void *)(__UINTPTR_TYPE__)(x)
+#elif defined( _WIN64 )
   /* only 64bit Windows uses the LLP64 data model, i.e., */
   /* 32-bit integers, 64-bit pointers.                   */
-#define FT_UINT_TO_POINTER( x )  (void *)(unsigned __int64)(x)
+#  define FT_UINT_TO_POINTER( x )  (void *)(unsigned __int64)(x)
 #else
-#define FT_UINT_TO_POINTER( x )  (void *)(unsigned long)(x)
+#  define FT_UINT_TO_POINTER( x )  (void *)(unsigned long)(x)
 #endif
 
   /*



reply via email to

[Prev in Thread] Current Thread [Next in Thread]