Skip to content

Commit

Permalink
Use (u)intptr_t in khrplatform.h if available (#137)
Browse files Browse the repository at this point in the history
While most architectures allow casting a pointer to `long`/`long long`
and back, this does not work on CHERI-enabled architectures such as
e.g. Arm Morello, where pointers are 128-bits but `long long` is still 64.
We use (u)inptr_t when possible to handle more platforms. Ideally, we
could just use (u)intptr_t everywhere, but this could result in ABI
breakage if khronos_uintptr_t is changed from unsigned long to
unsigned long long or similar (this results in different C++ name
mangling). To avoid changes for existing platforms, we restrict usage
of intptr_t to platforms where the size of a pointer is larger than the
size of long.
  • Loading branch information
arichardson authored Dec 15, 2021
1 parent 8d7de5e commit 57b4876
Showing 1 changed file with 24 additions and 3 deletions.
27 changes: 24 additions & 3 deletions api/KHR/khrplatform.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,20 @@ typedef int64_t khronos_int64_t;
typedef uint64_t khronos_uint64_t;
#define KHRONOS_SUPPORT_INT64 1
#define KHRONOS_SUPPORT_FLOAT 1
/*
* To support platform where unsigned long cannot be used interchangeably with
* inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t.
* Ideally, we could just use (u)intptr_t everywhere, but this could result in
* ABI breakage if khronos_uintptr_t is changed from unsigned long to
* unsigned long long or similar (this results in different C++ name mangling).
* To avoid changes for existing platforms, we restrict usage of intptr_t to
* platforms where the size of a pointer is larger than the size of long.
*/
#if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__)
#if __SIZEOF_POINTER__ > __SIZEOF_LONG__
#define KHRONOS_USE_INTPTR_T
#endif
#endif

#elif defined(__VMS ) || defined(__sgi)

Expand Down Expand Up @@ -235,14 +249,21 @@ typedef unsigned short int khronos_uint16_t;
* pointers are 64 bits, but 'long' is still 32 bits. Win64 appears
* to be the only LLP64 architecture in current use.
*/
#ifdef _WIN64
#ifdef KHRONOS_USE_INTPTR_T
typedef intptr_t khronos_intptr_t;
typedef uintptr_t khronos_uintptr_t;
#elif defined(_WIN64)
typedef signed long long int khronos_intptr_t;
typedef unsigned long long int khronos_uintptr_t;
typedef signed long long int khronos_ssize_t;
typedef unsigned long long int khronos_usize_t;
#else
typedef signed long int khronos_intptr_t;
typedef unsigned long int khronos_uintptr_t;
#endif

#if defined(_WIN64)
typedef signed long long int khronos_ssize_t;
typedef unsigned long long int khronos_usize_t;
#else
typedef signed long int khronos_ssize_t;
typedef unsigned long int khronos_usize_t;
#endif
Expand Down

0 comments on commit 57b4876

Please sign in to comment.