bytes.h (1975B)
1 #ifndef KIT_BYTES_H 2 #define KIT_BYTES_H 3 4 /* Byte read/write helpers โ canonical for encoding multi-byte integers 5 * into byte buffers. ELF, AArch64 instruction emission, relocation 6 * patches all use little-endian. The only big-endian site is ar archive 7 * symbol-index headers (POSIX ar(5) ยง"Archive symbol table"). */ 8 9 #include "core/core.h" 10 11 static inline u16 rd_u16_le(const u8* p) { 12 return (u16)((u32)p[0] | ((u32)p[1] << 8)); 13 } 14 15 static inline u32 rd_u32_le(const u8* p) { 16 return (u32)p[0] | ((u32)p[1] << 8) | ((u32)p[2] << 16) | ((u32)p[3] << 24); 17 } 18 19 static inline u64 rd_u64_le(const u8* p) { 20 return (u64)rd_u32_le(p) | ((u64)rd_u32_le(p + 4) << 32); 21 } 22 23 static inline void wr_u16_le(u8* p, u16 v) { 24 p[0] = (u8)(v); 25 p[1] = (u8)(v >> 8); 26 } 27 28 static inline void wr_u32_le(u8* p, u32 v) { 29 p[0] = (u8)(v); 30 p[1] = (u8)(v >> 8); 31 p[2] = (u8)(v >> 16); 32 p[3] = (u8)(v >> 24); 33 } 34 35 static inline void wr_u64_le(u8* p, u64 v) { 36 wr_u32_le(p, (u32)(v)); 37 wr_u32_le(p + 4, (u32)(v >> 32)); 38 } 39 40 /* Big-endian โ ar symbol index. */ 41 42 static inline u32 rd_u32_be(const u8* p) { 43 return ((u32)p[0] << 24) | ((u32)p[1] << 16) | ((u32)p[2] << 8) | (u32)p[3]; 44 } 45 46 static inline void wr_u32_be(u8* p, u32 v) { 47 p[0] = (u8)(v >> 24); 48 p[1] = (u8)(v >> 16); 49 p[2] = (u8)(v >> 8); 50 p[3] = (u8)(v); 51 } 52 53 /* Writer-bridging little-endian emit helpers โ stage to a stack buffer 54 * via the wr_*_le primitives above, then push the bytes through a 55 * Writer. ELF / COFF / Mach-O object emitters all share these. */ 56 57 static inline void writer_u8_le(Writer* w, u32 v) { 58 u8 b = (u8)v; 59 kit_writer_write(w, &b, 1); 60 } 61 62 static inline void writer_u16_le(Writer* w, u32 v) { 63 u8 b[2]; 64 wr_u16_le(b, (u16)v); 65 kit_writer_write(w, b, 2); 66 } 67 68 static inline void writer_u32_le(Writer* w, u32 v) { 69 u8 b[4]; 70 wr_u32_le(b, v); 71 kit_writer_write(w, b, 4); 72 } 73 74 static inline void writer_u64_le(Writer* w, u64 v) { 75 u8 b[8]; 76 wr_u64_le(b, v); 77 kit_writer_write(w, b, 8); 78 } 79 80 #endif