Round-tripping pointers via size_t is not portable, the C/C++ standards
only require this to be valid when using (u)intptr_t. While touching
these lines also make use of the Clang 10+ __builtin_align_up to avoid
the need for reinterpret_cast.
Originally committed to the CHERI fork of LLVM as
https://github.com/CTSRD-CHERI/llvm-project/commit/dd01245185ab9e71b70b418bee8f11ea0199e1a3,
but I forgot to upstream the change. I rediscovered this issue due to a
compiler warning when building libc++ on a Arm Morello system.