[RFC] Adding functions for unaligned load/store to Support for JIT/RuntimeDyld

Hi,

I’ve noticed that certain parts of LLVM (RuntimeDyld, JIT) use unaligned memory accesses to load/store pointers or just 32- or 64-bit integers. Technically, this is undefined behavior, and UBSan reports errors when this happens. Even if we believe we’re running some x86-specific code (e.g. RuntimeDyldELF::resolveX86_64Relocation) what matters for unaligned acceses in source code is the host architecture, not the target one.

What do you think of adding

T unaligned_load(const void *addr)
void unaligned_store(void *addr, T value);

to support headers? We can then provide the default memcpy implementations of these methods and, optionally, straightforward implementations for x86 hosts (and disable UBSan alignment checks for the latter).

Hi Alexey,

That sounds good to me. RuntimeDyldMachO already has writeBytesUnaligned for this reason, though it’s use is somewhat patchy. We should also make better use of the facilities provided in llvm/Support/Endian.h - it has alignment and endianness aware definitions for common primitive types.

Cheers,
Lang.

Hi Lang,

Excellent. Thank you for looking in to this.

  • Lang.