Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
match: Properly align heapframes for CHERI/Arm's Morello prototype (#72)
On CHERI, and thus Arm's Morello prototype, pointers are represented as hardware capabilities, which consist of both an integer address and additional metadata, meaning they are twice the size of the platform's size_t type, i.e. 16 bytes on a 64-bit system. The ovector member of heapframe happens to only be 8 byte aligned, and so computing frame_size ends up with a multiple of 8 but not 16. Whilst the first frame is always suitably aligned, this then misaligns the frame that follows it, resulting in an alignment fault when storing a pointer to Fecode at the start of match. Thus, round up frame_size to a multiple of heapframe's alignment to ensure alignment is preserved. This can be completely optimised away on traditional architectures and, since CHERI's capabilities are in fact 2 * sizeof(PCRE2_SIZE) bytes in size, the variable part of the expression is also proven to be a multiple of the alignment and so the aligning gets folded into the offsetof part by adding an additional 8, so no dynamic alignment code is needed even on CHERI architectures.
- Loading branch information