kit

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

symbol.c (3988B)


      1 #include "cg/internal.h"
      2 
      3 SymBind api_map_bind(KitSymBind b) {
      4   switch (b) {
      5     case KIT_SB_LOCAL:
      6       return SB_LOCAL;
      7     case KIT_SB_GLOBAL:
      8       return SB_GLOBAL;
      9     case KIT_SB_WEAK:
     10       return SB_WEAK;
     11   }
     12   return SB_LOCAL;
     13 }
     14 
     15 SymVis api_map_vis(KitCgVisibility v) {
     16   switch (v) {
     17     case KIT_CG_VIS_DEFAULT:
     18       return SV_DEFAULT;
     19     case KIT_CG_VIS_HIDDEN:
     20       return SV_HIDDEN;
     21     case KIT_CG_VIS_PROTECTED:
     22       return SV_PROTECTED;
     23   }
     24   return SV_DEFAULT;
     25 }
     26 
     27 SymKind api_decl_sym_kind(KitCgDecl decl) {
     28   if (decl.kind == KIT_CG_DECL_FUNC) {
     29     if (decl.as.func.flags & KIT_CG_FUNC_IFUNC) return SK_IFUNC;
     30     return SK_FUNC;
     31   }
     32   if (decl.as.object.flags & KIT_CG_OBJ_TLS) return SK_TLS;
     33   return SK_OBJ;
     34 }
     35 
     36 Sym api_cg_symbol_section_name(KitCg* g, Slice base, KitSym linkage_name) {
     37   Compiler* c;
     38   Heap* h;
     39   Slice name;
     40   size_t len;
     41   char* buf;
     42   Sym out;
     43   if (!g || !base.len || !linkage_name) return 0;
     44   c = g->c;
     45   name = pool_slice(c->global, (Sym)linkage_name);
     46   if (!name.len) return 0;
     47   if (base.len > SIZE_MAX - 2u || name.len > SIZE_MAX - base.len - 2u) {
     48     compiler_panic(c, api_no_loc(), "KitCg: section name too long");
     49     return 0;
     50   }
     51   len = base.len + 1u + name.len;
     52   h = c->ctx->heap;
     53   buf = (char*)h->alloc(h, len + 1u, 1);
     54   if (!buf) {
     55     compiler_panic(c, api_no_loc(), "KitCg: oom building section name");
     56     return 0;
     57   }
     58   memcpy(buf, base.s, base.len);
     59   buf[base.len] = '.';
     60   memcpy(buf + base.len + 1u, name.s, name.len);
     61   buf[len] = '\0';
     62   out = pool_intern_slice(c->global, (Slice){.s = buf, .len = len});
     63   h->free(h, buf, len + 1u);
     64   return out;
     65 }
     66 
     67 void api_remember_sym(KitCg* g, ObjSymId sym, KitCgTypeId ty, KitCgDecl decl) {
     68   Heap* h;
     69   KitCgTypeId* nts;
     70   KitCgDecl* nas;
     71   u32 cap;
     72   if (!g || sym == OBJ_SYM_NONE) return;
     73   if (sym < g->sym_cap) {
     74     g->sym_types[sym] = ty;
     75     g->sym_attrs[sym] = decl;
     76     return;
     77   }
     78   h = g->c->ctx->heap;
     79   cap = g->sym_cap ? g->sym_cap : 16u;
     80   while (cap <= sym) cap *= 2u;
     81   nts = (KitCgTypeId*)h->alloc(h, sizeof(*nts) * cap, _Alignof(KitCgTypeId));
     82   nas = (KitCgDecl*)h->alloc(h, sizeof(*nas) * cap, _Alignof(KitCgDecl));
     83   if (!nts || !nas) {
     84     if (nts) h->free(h, nts, sizeof(*nts) * cap);
     85     if (nas) h->free(h, nas, sizeof(*nas) * cap);
     86     return;
     87   }
     88   memset(nts, 0, sizeof(*nts) * cap);
     89   memset(nas, 0, sizeof(*nas) * cap);
     90   if (g->sym_types) {
     91     memcpy(nts, g->sym_types, sizeof(*nts) * g->sym_cap);
     92     h->free(h, g->sym_types, sizeof(*g->sym_types) * g->sym_cap);
     93   }
     94   if (g->sym_attrs) {
     95     memcpy(nas, g->sym_attrs, sizeof(*nas) * g->sym_cap);
     96     h->free(h, g->sym_attrs, sizeof(*g->sym_attrs) * g->sym_cap);
     97   }
     98   g->sym_types = nts;
     99   g->sym_attrs = nas;
    100   g->sym_cap = cap;
    101   g->sym_types[sym] = ty;
    102   g->sym_attrs[sym] = decl;
    103 }
    104 
    105 KitCgTypeId api_sym_type(KitCg* g, KitCgSym sym) {
    106   if (!g || sym == KIT_CG_SYM_NONE || sym >= g->sym_cap) {
    107     return KIT_CG_TYPE_NONE;
    108   }
    109   return g->sym_types[sym];
    110 }
    111 
    112 KitCgDecl api_sym_attrs(KitCg* g, KitCgSym sym) {
    113   KitCgDecl decl;
    114   memset(&decl, 0, sizeof(decl));
    115   decl.kind = KIT_CG_DECL_OBJECT;
    116   decl.sym.bind = KIT_SB_GLOBAL;
    117   decl.sym.visibility = KIT_CG_VIS_DEFAULT;
    118   if (!g || sym == KIT_CG_SYM_NONE || sym >= g->sym_cap) return decl;
    119   return g->sym_attrs[sym];
    120 }
    121 
    122 int api_sym_is_tls(KitCg* g, KitCgSym sym) {
    123   KitCgDecl decl = api_sym_attrs(g, sym);
    124   return decl.kind == KIT_CG_DECL_OBJECT &&
    125          (decl.as.object.flags & KIT_CG_OBJ_TLS);
    126 }
    127 
    128 RelocKind api_data_reloc_kind(int pcrel, uint32_t width) {
    129   if (pcrel) {
    130     if (width == 4) return R_PC32;
    131     if (width == 8) return R_PC64;
    132   } else {
    133     if (width == 4) return R_ABS32;
    134     if (width == 8) return R_ABS64;
    135   }
    136   return R_NONE;
    137 }
    138 
    139 /* ============================================================
    140  * Public API: KitCg lifecycle
    141  * ============================================================ */
    142 
    143 SrcLoc api_no_loc(void) {
    144   SrcLoc loc;
    145   loc.file_id = 0;
    146   loc.line = 0;
    147   loc.col = 0;
    148   return loc;
    149 }