debug_form.c (1748B)
1 /* DWARF form/value byte encoders. Operate on a Buf so callers can stage 2 * bytes without an active ObjBuilder section context (the section is 3 * picked at debug_emit time). */ 4 5 #include "core/buf.h" 6 #include "core/core.h" 7 #include "debug/debug_internal.h" 8 9 void form_u8(Buf* b, u8 v) { buf_write(b, &v, 1); } 10 11 void form_u16(Buf* b, u16 v) { 12 u8 bytes[2]; 13 bytes[0] = (u8)(v & 0xff); 14 bytes[1] = (u8)((v >> 8) & 0xff); 15 buf_write(b, bytes, 2); 16 } 17 18 void form_u32(Buf* b, u32 v) { 19 u8 bytes[4]; 20 bytes[0] = (u8)(v & 0xff); 21 bytes[1] = (u8)((v >> 8) & 0xff); 22 bytes[2] = (u8)((v >> 16) & 0xff); 23 bytes[3] = (u8)((v >> 24) & 0xff); 24 buf_write(b, bytes, 4); 25 } 26 27 void form_u64(Buf* b, u64 v) { 28 u8 bytes[8]; 29 int i; 30 for (i = 0; i < 8; ++i) bytes[i] = (u8)((v >> (i * 8)) & 0xff); 31 buf_write(b, bytes, 8); 32 } 33 34 void form_uleb(Buf* b, u64 v) { 35 u8 byte; 36 for (;;) { 37 byte = (u8)(v & 0x7f); 38 v >>= 7; 39 if (v == 0) { 40 buf_write(b, &byte, 1); 41 return; 42 } 43 byte |= 0x80; 44 buf_write(b, &byte, 1); 45 } 46 } 47 48 void form_sleb(Buf* b, i64 v) { 49 int more = 1; 50 while (more) { 51 u8 byte = (u8)(v & 0x7f); 52 /* arithmetic shift */ 53 v >>= 7; 54 /* sign bit of byte is second high-order bit (0x40) */ 55 if ((v == 0 && (byte & 0x40) == 0) || (v == -1 && (byte & 0x40) != 0)) { 56 more = 0; 57 } else { 58 byte |= 0x80; 59 } 60 buf_write(b, &byte, 1); 61 } 62 } 63 64 size_t form_uleb_size(u64 v) { 65 size_t n = 0; 66 do { 67 ++n; 68 v >>= 7; 69 } while (v); 70 return n; 71 } 72 73 size_t form_sleb_size(i64 v) { 74 size_t n = 0; 75 int more = 1; 76 while (more) { 77 u8 byte = (u8)(v & 0x7f); 78 v >>= 7; 79 if ((v == 0 && (byte & 0x40) == 0) || (v == -1 && (byte & 0x40) != 0)) { 80 more = 0; 81 } 82 ++n; 83 } 84 return n; 85 }