kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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 }