================
@@ -199,6 +199,25 @@ typedef __UINTPTR_TYPE__ ptrauth_generic_signature_t;
   ptrauth_auth_and_resign(__value, __old_key, __old_data,                      
\
                           ptrauth_key_function_pointer, 0)
 
+/* Cast a value to the given type without changing any signature.
+
+   The type must be a pointer sized type compatible with the __ptrauth
+   qualifier.
+   The value must be an expression with a non-address diversified pointer
+   authentication schema, and will be converted to an rvalue prior to the cast.
+   The result has type given by the first argument.
+
+   The result has an identical bit-pattern to the input pointer. */
+#define ptrauth_nop_cast(__type, __value)                                      
\
+  ({                                                                           
\
+    union {                                                                    
\
+      typeof(*(__value)) *__fptr;                                              
\
+      typeof(__type) __opaque;                                                 
\
+    } __storage;                                                               
\
+    __storage.__fptr = (__value);                                              
\
+    __storage.__opaque;                                                        
\
----------------
ojhunt wrote:

using memcpy isn't an option as this may be used in environments where they're 
not available, hence the awkward union

https://github.com/llvm/llvm-project/pull/161027
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to