nooc

nooc programming language compiler
git clone git://git.nihaljere.xyz/nooc
Log | Files | Refs | LICENSE

commit f1afc70c36f562fdb3cb9ae39a80e01c3dac1566
parent 4d0e68ae8339813f94cb46ed56140ae72031ae51
Author: Nihal Jere <nihal@nihaljere.xyz>
Date:   Thu, 27 Jan 2022 23:36:21 -0600

use const

Obviously not exhaustive, but it's a good start.

Diffstat:
Marray.c | 4++--
Marray.h | 4++--
Mblockstack.c | 8++++----
Mblockstack.h | 2+-
Melf.c | 2+-
Melf.h | 2+-
Mir.c | 30+++++++++++++++---------------
Mir.h | 6+++---
Mlex.c | 2+-
Mmain.c | 30+++++++++++++++---------------
Mnooc.h | 8++++----
Mparse.c | 26+++++++++++++-------------
Mparse.h | 2+-
Mtype.c | 32++++++++++++++++----------------
Mtype.h | 8++++----
Mutil.c | 24++++++++++++------------
Mutil.h | 18+++++++++---------
Mx64.c | 136++++++++++++++++++++++++++++++++++++++++----------------------------------------
18 files changed, 172 insertions(+), 172 deletions(-)

diff --git a/array.c b/array.c @@ -9,7 +9,7 @@ #include "array.h" int -_array_add(void **data, size_t *len, size_t *cap, void *new, size_t size, size_t count) +_array_add(void **data, size_t *len, size_t *cap, const void *const new, const size_t size, const size_t count) { bool need_realloc; while (*cap < *len + count) { @@ -28,7 +28,7 @@ _array_add(void **data, size_t *len, size_t *cap, void *new, size_t size, size_t // should only be called when size is 1 int -_array_zero(void **data, size_t *len, size_t *cap, size_t count) +_array_zero(void **data, size_t *len, size_t *cap, const size_t count) { bool need_realloc; while (*cap < *len + count) { diff --git a/array.h b/array.h @@ -10,5 +10,5 @@ #define array_zero(arr, count) \ _array_zero((void **) &(arr->data), &(arr->len), &(arr->cap), count); -int _array_add(void **data, size_t *len, size_t *cap, void *new, size_t size, size_t count); -int _array_zero(void **data, size_t *len, size_t *cap, size_t count); +int _array_add(void **data, size_t *len, size_t *cap, const void *const new, const size_t size, const size_t count); +int _array_zero(void **data, size_t *len, size_t *cap, const size_t count); diff --git a/blockstack.c b/blockstack.c @@ -6,11 +6,11 @@ #include "ir.h" #include "util.h" -struct block *blockstack[BLOCKSTACKSIZE]; +const struct block *blockstack[BLOCKSTACKSIZE]; size_t blocki; void -blockpush(struct block *block) +blockpush(const struct block *const block) { if (blocki >= BLOCKSTACKSIZE - 1) die("blockpush: too many blocks!"); @@ -19,7 +19,7 @@ blockpush(struct block *block) blocki++; } -struct block * +const struct block *const blockpop() { if (blocki == 0) @@ -29,7 +29,7 @@ blockpop() return blockstack[blocki]; } -struct block * +const struct block *const blockpeek() { if (blocki == 0) diff --git a/blockstack.h b/blockstack.h @@ -1,3 +1,3 @@ -void blockpush(struct block *block); +void blockpush(const struct block *const block); struct block *blockpop(); struct block *blockpeek(); diff --git a/elf.c b/elf.c @@ -6,7 +6,7 @@ #include "elf.h" void -elf(size_t entry, struct data *text, struct data *data, FILE *f) +elf(const size_t entry, const struct data *const text, const struct data *const data, FILE *const f) { Elf64_Ehdr ehdr = { 0 }; Elf64_Phdr phdr_text = { 0 }; diff --git a/elf.h b/elf.h @@ -1 +1 @@ -void elf(size_t entry, struct data *text, struct data *data, FILE *f); +void elf(size_t entry, const struct data *const text, const struct data *const data, FILE *const f); diff --git a/ir.c b/ir.c @@ -48,17 +48,17 @@ regalloc() } static void -regfree(uint8_t reg) +regfree(const uint8_t reg) { assert(regs & (1 << reg)); regs &= ~(1 << reg); } static void -genblock(struct iproc *out, struct block *block); +genblock(struct iproc *const out, const struct block *const block); static uint64_t -procindex(struct slice *s) +procindex(const struct slice *const s) { for (size_t i = 0; i < toplevel.code.len; i++) { struct iproc *iproc = &toplevel.code.data[i]; @@ -71,7 +71,7 @@ procindex(struct slice *s) } static void -putins(struct iproc *out, int op, uint64_t val, int valtype) +putins(struct iproc *const out, const int op, const uint64_t val, const int valtype) { assert(op); assert(valtype); @@ -145,7 +145,7 @@ putins(struct iproc *out, int op, uint64_t val, int valtype) } static uint64_t -bumplabel(struct iproc *out) +bumplabel(struct iproc *const out) { uint64_t temp; array_addlit((&out->labels), 0); @@ -153,7 +153,7 @@ bumplabel(struct iproc *out) } static size_t -assign(struct iproc *out, uint8_t size) +assign(struct iproc *const out, const uint8_t size) { size_t t = NEWTMP; STARTINS(IR_ASSIGN, t, VT_TEMP); @@ -162,7 +162,7 @@ assign(struct iproc *out, uint8_t size) } static size_t -immediate(struct iproc *out, uint8_t size, uint64_t val) +immediate(struct iproc *const out, const uint8_t size, const uint64_t val) { size_t t = assign(out, size); putins(out, IR_IMM, val, VT_IMM); @@ -170,7 +170,7 @@ immediate(struct iproc *out, uint8_t size, uint64_t val) } static size_t -load(struct iproc *out, uint8_t size, uint64_t index) +load(struct iproc *const out, const uint8_t size, const uint64_t index) { size_t t = assign(out, size);; putins(out, IR_LOAD, index, VT_TEMP); @@ -178,7 +178,7 @@ load(struct iproc *out, uint8_t size, uint64_t index) } static size_t -alloc(struct iproc *out, uint8_t size, uint64_t count) +alloc(struct iproc *const out, const uint8_t size, const uint64_t count) { size_t t = assign(out, size); out->temps.data[t].flags = TF_PTR; @@ -187,14 +187,14 @@ alloc(struct iproc *out, uint8_t size, uint64_t count) } static void -store(struct iproc *out, uint8_t size, uint64_t src, uint64_t dest) +store(struct iproc *const out, const uint8_t size, const uint64_t src, const uint64_t dest) { STARTINS(IR_STORE, src, VT_TEMP); putins(out, IR_EXTRA, dest, VT_TEMP); } static int -genexpr(struct iproc *out, size_t expri, uint64_t *val) +genexpr(struct iproc *const out, const size_t expri, uint64_t *const val) { struct expr *expr = &exprs.data[expri]; uint64_t temp2 = 0; @@ -364,7 +364,7 @@ genexpr(struct iproc *out, size_t expri, uint64_t *val) } static void -genassign(struct iproc *out, struct decl *decl, size_t val) +genassign(struct iproc *const out, const struct decl *const decl, const size_t val) { struct type *type = &types.data[decl->type]; uint64_t what; @@ -388,7 +388,7 @@ genassign(struct iproc *out, struct decl *decl, size_t val) } static void -genblock(struct iproc *out, struct block *block) +genblock(struct iproc *const out, const struct block *const block) { struct decl *decl; struct type *type; @@ -431,7 +431,7 @@ genblock(struct iproc *out, struct block *block) } static void -chooseregs(struct iproc *proc) +chooseregs(struct iproc *const proc) { bool active[proc->temps.len]; memset(active, 0, proc->temps.len * sizeof(*active)); @@ -466,7 +466,7 @@ chooseregs(struct iproc *proc) } size_t -genproc(struct decl *decl, struct proc *proc) +genproc(struct decl *const decl, const struct proc *const proc) { tmpi = labeli = curi = 1; rblocki = reali = 0; diff --git a/ir.h b/ir.h @@ -96,10 +96,10 @@ struct toplevel { uint64_t entry; }; -size_t genproc(struct decl *decl, struct proc *proc); +size_t genproc(struct decl *const decl, const struct proc *const proc); struct target { uint32_t reserved; - size_t (*emitsyscall)(struct data *text, uint8_t paramcount); - size_t (*emitproc)(struct data *text, struct iproc *proc); + size_t (*emitsyscall)(struct data *const text, const uint8_t paramcount); + size_t (*emitproc)(struct data *const text, const struct iproc *const proc); }; diff --git a/lex.c b/lex.c @@ -18,7 +18,7 @@ lex(struct slice start) { size_t line = 1; size_t col = 1; - struct token *head = calloc(1, sizeof(struct token)); + struct token *const head = calloc(1, sizeof(struct token)); if (!head) return NULL; diff --git a/main.c b/main.c @@ -38,21 +38,21 @@ struct toplevel toplevel; char *infile; uint64_t -data_push(char *ptr, size_t len) +data_push(const char *const ptr, const size_t len) { array_push((&toplevel.data), ptr, len); return DATA_OFFSET + toplevel.data.len - len; } uint64_t -data_pushzero(size_t len) +data_pushzero(const size_t len) { array_zero((&toplevel.data), len); return DATA_OFFSET + toplevel.data.len - len; } void -data_set(uint64_t addr, void *ptr, size_t len) +data_set(const uint64_t addr, const void *const ptr, const size_t len) { memcpy(&toplevel.data.data[addr - DATA_OFFSET], ptr, len); } @@ -60,9 +60,9 @@ data_set(uint64_t addr, void *ptr, size_t len) void decl_alloc(struct block *block, struct decl *decl) { - struct type *type = &types.data[decl->type]; + const struct type *const type = &types.data[decl->type]; if (type->class == TYPE_ARRAY) { - struct type *subtype = &types.data[type->d.arr.subtype]; + const struct type *const subtype = &types.data[type->d.arr.subtype]; decl->w.addr = data_pushzero(subtype->size * type->d.arr.len); } else { decl->w.addr = data_pushzero(type->size); @@ -70,18 +70,18 @@ decl_alloc(struct block *block, struct decl *decl) } void -evalexpr(struct decl *decl) +evalexpr(struct decl *const decl) { struct expr *expr = &exprs.data[decl->val]; if (expr->kind == EXPR_LIT) { switch (expr->class) { case C_INT: { - struct type *type = &types.data[decl->type]; + const struct type *const type = &types.data[decl->type]; data_set(decl->w.addr, &expr->d.v.v, type->size); break; } case C_STR: { - uint64_t addr = data_push(expr->d.v.v.s.data, expr->d.v.v.s.len); + const uint64_t addr = data_push(expr->d.v.v.s.data, expr->d.v.v.s.len); decl->w.addr = addr; break; } @@ -111,7 +111,7 @@ gentoplevel(struct toplevel *toplevel, struct block *block) curaddr += targ.emitsyscall(&toplevel->text, i); } for (int i = 0; i < block->len; i++) { - struct statement *statement = &block->data[i]; + const struct statement *const statement = &block->data[i]; switch (statement->kind) { case STMT_EXPR: @@ -119,8 +119,8 @@ gentoplevel(struct toplevel *toplevel, struct block *block) case STMT_ASSGN: die("toplevel assignments are unimplemented"); case STMT_DECL: { - struct decl *decl = &block->decls.data[statement->idx]; - struct expr *expr = &exprs.data[decl->val]; + struct decl *const decl = &block->decls.data[statement->idx]; + struct expr *const expr = &exprs.data[decl->val]; decl_alloc(block, decl); @@ -159,7 +159,7 @@ main(int argc, char *argv[]) } infile = argv[1]; - int in = open(infile, 0, O_RDONLY); + const int in = open(infile, 0, O_RDONLY); if (in < 0) { fprintf(stderr, "couldn't open input\n"); return 1; @@ -171,14 +171,14 @@ main(int argc, char *argv[]) return 1; } - char *addr = mmap(NULL, statbuf.st_size, PROT_READ, MAP_PRIVATE, in, 0); + char *const addr = mmap(NULL, statbuf.st_size, PROT_READ, MAP_PRIVATE, in, 0); close(in); if (addr == NULL) { fprintf(stderr, "failed to map input file into memory\n"); return 1; } - struct token *head = lex((struct slice){statbuf.st_size, statbuf.st_size, addr}); + const struct token *const head = lex((struct slice){statbuf.st_size, statbuf.st_size, addr}); typesmap = mkmap(16); inittypes(); @@ -186,7 +186,7 @@ main(int argc, char *argv[]) gentoplevel(&toplevel, &statements); - FILE *out = fopen(argv[2], "w"); + FILE *const out = fopen(argv[2], "w"); if (!out) { close(in); fprintf(stderr, "couldn't open output\n"); diff --git a/nooc.h b/nooc.h @@ -108,7 +108,7 @@ struct nametypes { struct assgn { struct slice s; size_t val; // struct exprs - struct token *start; + const struct token *start; }; struct assgns { @@ -130,7 +130,7 @@ struct decl { int64_t offset; uint64_t addr; } w; - struct token *start; + const struct token *start; }; struct decls { @@ -153,7 +153,7 @@ struct statement { STMT_RETURN, } kind; size_t idx; - struct token *start; + const struct token *start; }; struct block { @@ -243,7 +243,7 @@ struct expr { struct loop loop; struct proc proc; } d; - struct token *start; + const struct token *start; }; struct exprs { diff --git a/parse.c b/parse.c @@ -22,13 +22,13 @@ extern struct exprs exprs; extern struct types types; extern struct map *typesmap; -struct token *tok; +const struct token *tok; -static void parsenametypes(struct nametypes *nametypes); +static void parsenametypes(struct nametypes *const nametypes); static size_t parsetype(); struct decl * -finddecl(struct slice s) +finddecl(const struct slice s) { for (int j = blocki - 1; j >= 0; j--) { for (int i = 0; i < blockstack[j]->decls.len; i++) { @@ -43,7 +43,7 @@ finddecl(struct slice s) } static void -expect(enum tokentype type) +expect(const enum tokentype type) { if (!tok) error(tok->line, tok->col, "unexpected null token!"); @@ -53,7 +53,7 @@ expect(enum tokentype type) } static void -parsestring(struct expr *expr) +parsestring(struct expr *const expr) { expr->start = tok; expr->kind = EXPR_LIT; @@ -89,7 +89,7 @@ parsestring(struct expr *expr) } static void -parsenum(struct expr *expr) +parsenum(struct expr *const expr) { expr->start = tok; expr->kind = EXPR_LIT; @@ -110,7 +110,7 @@ parsenum(struct expr *expr) } enum class -typetoclass(struct type *type) +typetoclass(const struct type *const type) { switch (type->class) { case TYPE_INT: @@ -126,10 +126,10 @@ typetoclass(struct type *type) return 0; // warning } -static void parseblock(struct block *block); +static void parseblock(struct block *const block); static size_t -parseexpr(struct block *block) +parseexpr(struct block *const block) { struct expr expr = { 0 }; switch (tok->type) { @@ -300,7 +300,7 @@ binary_common: } void -parsetypelist(struct typelist *list) +parsetypelist(struct typelist *const list) { expect(TOK_LPAREN); tok = tok->next; @@ -371,7 +371,7 @@ parsetype() } static void -parsenametypes(struct nametypes *nametypes) +parsenametypes(struct nametypes *const nametypes) { expect(TOK_LPAREN); tok = tok->next; @@ -398,7 +398,7 @@ parsenametypes(struct nametypes *nametypes) } static void -parseblock(struct block *block) +parseblock(struct block *const block) { struct statement statement; bool curlies = false; @@ -469,7 +469,7 @@ parseblock(struct block *block) } struct block -parse(struct token *start) +parse(const struct token *const start) { tok = start; struct block block = { 0 }; diff --git a/parse.h b/parse.h @@ -1,3 +1,3 @@ -struct block parse(struct token *tok); +struct block parse(const struct token *const tok); struct nametype *findparam(struct nametypes *params, struct slice s); struct decl *finddecl(struct slice s); diff --git a/type.c b/type.c @@ -70,7 +70,7 @@ inittypes() } static void -hashtype(struct type *type, uint8_t *out) +hashtype(const struct type *const type, uint8_t *const out) { static bool empty_found = false; struct blake3 b3; @@ -100,8 +100,8 @@ hashtype(struct type *type, uint8_t *out) blake3_out(&b3, out, 16); } -static size_t -getindex(uint8_t hash[16]) +static const size_t +getindex(const uint8_t hash[16]) { uint64_t i = hash[0] & (table.cap - 1); while (table.keys[i].present && memcmp(table.keys[i].hash, hash, 16)) { @@ -111,23 +111,23 @@ getindex(uint8_t hash[16]) return i; } -size_t -type_query(struct type *type) +const size_t +type_query(const struct type *const type) { uint8_t hash[16]; hashtype(type, hash); return type_get(hash); } -size_t -type_get(uint8_t hash[16]) +const size_t +type_get(const uint8_t hash[16]) { size_t i = getindex(hash); return table.keys[i].present ? table.vals[i] : 0; } -size_t -type_put(struct type *type) +const size_t +type_put(const struct type *const type) { struct typekey *oldkeys; size_t *oldvals, oldcap, i, j; @@ -166,7 +166,7 @@ type_put(struct type *type) } void -typecompat(size_t typei, size_t expri) +typecompat(const size_t typei, const size_t expri) { struct type *type = &types.data[typei]; struct expr *expr = &exprs.data[expri]; @@ -201,8 +201,8 @@ typecompat(size_t typei, size_t expri) } } -size_t -typeref(size_t typei) +const size_t +typeref(const size_t typei) { struct type ref = { .class = TYPE_REF, @@ -214,7 +214,7 @@ typeref(size_t typei) } static void -typecheckcall(struct expr *expr) +typecheckcall(const struct expr *const expr) { assert(expr->kind == EXPR_FCALL); struct decl *fdecl = finddecl(expr->d.call.name); @@ -238,7 +238,7 @@ typecheckcall(struct expr *expr) } static void -typecheckexpr(size_t expri) +typecheckexpr(const size_t expri) { struct expr *expr = &exprs.data[expri]; switch (expr->kind) { @@ -266,10 +266,10 @@ typecheckexpr(size_t expri) } void -typecheck(struct block *block) +typecheck(const struct block *const block) { for (size_t i = 0; i < block->len; i++) { - struct statement *statement = &block->data[i]; + const struct statement *const statement = &block->data[i]; struct decl *decl; struct assgn *assgn; switch (block->data[i].kind) { diff --git a/type.h b/type.h @@ -1,5 +1,5 @@ -size_t type_get(uint8_t hash[16]); -size_t type_put(struct type *type); +const size_t type_get(const uint8_t hash[16]); +const size_t type_put(const struct type *const type); void inittypes(); -size_t typeref(size_t typei); -void typecheck(struct block *block); +const size_t typeref(const size_t typei); +void typecheck(const struct block *const block); diff --git a/util.c b/util.c @@ -34,8 +34,8 @@ const char *const tokenstr[] = { [TOK_RETURN] = "TOK_RETURN", }; -char * -exprkind_str(enum exprkind kind) +const char *const +exprkind_str(const enum exprkind kind) { switch (kind) { case EXPR_LIT: @@ -56,7 +56,7 @@ exprkind_str(enum exprkind kind) } void -dumpval(struct expr *e) +dumpval(const struct expr *const e) { switch (e->class) { case C_INT: @@ -75,7 +75,7 @@ dumpval(struct expr *e) } void -dumpbinop(struct binop *op) +dumpbinop(const struct binop *const op) { switch (op->kind) { case BOP_PLUS: @@ -96,7 +96,7 @@ dumpbinop(struct binop *op) } void -dumpexpr(int indent, struct expr *expr) +dumpexpr(const int indent, const struct expr *const expr) { for (int i = 0; i < indent; i++) fputc(' ', stderr); @@ -127,7 +127,7 @@ dumpexpr(int indent, struct expr *expr) } static char -sigil(int valtype) +sigil(const int valtype) { switch (valtype) { case VT_EMPTY: @@ -147,7 +147,7 @@ sigil(int valtype) } void -dumpir(struct iproc *instrs) +dumpir(const struct iproc *const instrs) { bool callarg = false; char sig; @@ -232,7 +232,7 @@ dumpir(struct iproc *instrs) } int -slice_cmp(struct slice *s1, struct slice *s2) +slice_cmp(const struct slice *const s1, const struct slice *const s2) { if (s1->len != s2->len) return 1; @@ -241,7 +241,7 @@ slice_cmp(struct slice *s1, struct slice *s2) } int -slice_cmplit(struct slice *s1, char *s2) +slice_cmplit(const struct slice *const s1, const char *const s2) { size_t len = strlen(s2); if (s1->len < len) @@ -251,7 +251,7 @@ slice_cmplit(struct slice *s1, char *s2) } void -error(size_t line, size_t col, const char *error, ...) +error(const size_t line, const size_t col, const char *error, ...) { va_list args; @@ -264,14 +264,14 @@ error(size_t line, size_t col, const char *error, ...) } void -die(char *error) +die(const char *const error) { fprintf(stderr, "%s\n", error); exit(1); } void * -xmalloc(size_t size) +xmalloc(const size_t size) { char *p = malloc(size); if (!p) diff --git a/util.h b/util.h @@ -1,12 +1,12 @@ -char *exprkind_str(enum exprkind kind); -void dumpval(struct expr *e); -void dumpbinop(struct binop *op); -void dumpexpr(int indent, struct expr *expr); -void dumpir(struct iproc *instrs); -int slice_cmp(struct slice *s1, struct slice *s2); -int slice_cmplit(struct slice *s1, char *s2); -void error(size_t line, size_t col, const char *error, ...); -void die(char *error); +const char *const exprkind_str(const enum exprkind kind); +void dumpval(const struct expr *const e); +void dumpbinop(const struct binop *const op); +void dumpexpr(const int indent, const struct expr *const expr); +void dumpir(const struct iproc *const instrs); +int slice_cmp(const struct slice *const s1, const struct slice *const s2); +int slice_cmplit(const struct slice *const s1, const char *const s2); +void error(const size_t line, const size_t col, const char *error, ...); +void die(const char *const error); void *xmalloc(size_t size); void *xrealloc(void *, size_t); void *xcalloc(size_t, size_t); diff --git a/x64.c b/x64.c @@ -50,7 +50,7 @@ unsigned short used_reg; extern struct toplevel toplevel; static size_t -add_r64_imm(struct data *text, enum reg dest, uint64_t imm) +add_r64_imm(struct data *const text, const enum reg dest, const uint64_t imm) { uint8_t temp; if (text) { @@ -67,7 +67,7 @@ add_r64_imm(struct data *text, enum reg dest, uint64_t imm) } static size_t -mov_r64_imm(struct data *text, enum reg dest, uint64_t imm) +mov_r64_imm(struct data *const text, const enum reg dest, const uint64_t imm) { uint8_t temp; if (text) { @@ -87,7 +87,7 @@ mov_r64_imm(struct data *text, enum reg dest, uint64_t imm) } static size_t -mov_r32_imm(struct data *text, enum reg dest, uint32_t imm) +mov_r32_imm(struct data *const text, const enum reg dest, const uint32_t imm) { uint8_t temp; if (text) { @@ -102,7 +102,7 @@ mov_r32_imm(struct data *text, enum reg dest, uint32_t imm) } static size_t -mov_r16_imm(struct data *text, enum reg dest, uint16_t imm) +mov_r16_imm(struct data *const text, const enum reg dest, const uint16_t imm) { uint8_t temp; if (text) { @@ -116,7 +116,7 @@ mov_r16_imm(struct data *text, enum reg dest, uint16_t imm) } static size_t -mov_r8_imm(struct data *text, enum reg dest, uint8_t imm) +mov_r8_imm(struct data *const text, const enum reg dest, const uint8_t imm) { uint8_t temp; if (text) { @@ -128,7 +128,7 @@ mov_r8_imm(struct data *text, enum reg dest, uint8_t imm) } static size_t -mov_r64_m64(struct data *text, enum reg dest, uint64_t addr) +mov_r64_m64(struct data *const text, const enum reg dest, const uint64_t addr) { uint8_t temp; if (text) { @@ -146,7 +146,7 @@ mov_r64_m64(struct data *text, enum reg dest, uint64_t addr) } static size_t -mov_r32_m32(struct data *text, enum reg dest, uint32_t addr) +mov_r32_m32(struct data *const text, const enum reg dest, const uint32_t addr) { uint8_t temp; if (text) { @@ -164,7 +164,7 @@ mov_r32_m32(struct data *text, enum reg dest, uint32_t addr) } static size_t -mov_r16_m16(struct data *text, enum reg dest, uint32_t addr) +mov_r16_m16(struct data *const text, const enum reg dest, const uint32_t addr) { uint8_t temp; if (text) { @@ -183,7 +183,7 @@ mov_r16_m16(struct data *text, enum reg dest, uint32_t addr) } static size_t -mov_r8_m8(struct data *text, enum reg dest, uint32_t addr) +mov_r8_m8(struct data *const text, const enum reg dest, const uint32_t addr) { uint8_t temp; if (text) { @@ -201,7 +201,7 @@ mov_r8_m8(struct data *text, enum reg dest, uint32_t addr) } static size_t -mov_m64_r64(struct data *text, uint64_t addr, enum reg src) +mov_m64_r64(struct data *const text, const uint64_t addr, const enum reg src) { uint8_t temp; if (text) { @@ -221,7 +221,7 @@ mov_m64_r64(struct data *text, uint64_t addr, enum reg src) } static size_t -mov_m32_r32(struct data *text, uint64_t addr, enum reg src) +mov_m32_r32(struct data *const text, const uint64_t addr, const enum reg src) { uint8_t temp; if (text) { @@ -243,7 +243,7 @@ mov_m32_r32(struct data *text, uint64_t addr, enum reg src) #define MOVE_TOREG 1 static size_t -_move_between_reg_and_memaddr_in_reg(struct data *text, enum reg reg, enum reg mem, uint8_t opsize, bool dir) +_move_between_reg_and_memaddr_in_reg(struct data *const text, const enum reg reg, const enum reg mem, const uint8_t opsize, const bool dir) { uint8_t temp, rex = opsize == 8 ? REX_W : 0; rex |= (reg >= 8 ? REX_R : 0) | (mem >= 8 ? REX_B : 0); @@ -265,55 +265,55 @@ _move_between_reg_and_memaddr_in_reg(struct data *text, enum reg reg, enum reg m } static size_t -mov_mr64_r64(struct data *text, enum reg dest, enum reg src) +mov_mr64_r64(struct data *const text, const enum reg dest, const enum reg src) { return _move_between_reg_and_memaddr_in_reg(text, src, dest, 8, MOVE_FROMREG); } static size_t -mov_mr32_r32(struct data *text, enum reg dest, enum reg src) +mov_mr32_r32(struct data *const text, const enum reg dest, const enum reg src) { return _move_between_reg_and_memaddr_in_reg(text, src, dest, 4, MOVE_FROMREG); } static size_t -mov_mr16_r16(struct data *text, enum reg dest, enum reg src) +mov_mr16_r16(struct data *const text, const enum reg dest, const enum reg src) { return _move_between_reg_and_memaddr_in_reg(text, src, dest, 2, MOVE_FROMREG); } static size_t -mov_mr8_r8(struct data *text, enum reg dest, enum reg src) +mov_mr8_r8(struct data *const text, const enum reg dest, const enum reg src) { return _move_between_reg_and_memaddr_in_reg(text, src, dest, 1, MOVE_FROMREG); } static size_t -mov_r64_mr64(struct data *text, enum reg dest, enum reg src) +mov_r64_mr64(struct data *const text, const enum reg dest, const enum reg src) { return _move_between_reg_and_memaddr_in_reg(text, dest, src, 8, MOVE_TOREG); } static size_t -mov_r32_mr32(struct data *text, enum reg dest, enum reg src) +mov_r32_mr32(struct data *const text, const enum reg dest, const enum reg src) { return _move_between_reg_and_memaddr_in_reg(text, dest, src, 4, MOVE_TOREG); } static size_t -mov_r16_mr16(struct data *text, enum reg dest, enum reg src) +mov_r16_mr16(struct data *const text, const enum reg dest, const enum reg src) { return _move_between_reg_and_memaddr_in_reg(text, dest, src, 2, MOVE_TOREG); } static size_t -mov_r8_mr8(struct data *text, enum reg dest, enum reg src) +mov_r8_mr8(struct data *const text, const enum reg dest, const enum reg src) { return _move_between_reg_and_memaddr_in_reg(text, dest, src, 1, MOVE_TOREG); } static size_t -_move_between_reg_and_reg(struct data *text, enum reg dest, enum reg src, uint8_t opsize) +_move_between_reg_and_reg(struct data *const text, const enum reg dest, const enum reg src, const uint8_t opsize) { uint8_t temp, rex = (src >= 8 ? REX_R : 0) | (dest >= 8 ? REX_B : 0) | (opsize == 8 ? REX_W : 0); if (text) { @@ -331,31 +331,31 @@ _move_between_reg_and_reg(struct data *text, enum reg dest, enum reg src, uint8_ } static size_t -mov_r64_r64(struct data *text, enum reg dest, enum reg src) +mov_r64_r64(struct data *const text, const enum reg dest, const enum reg src) { return _move_between_reg_and_reg(text, dest, src, 8); } static size_t -mov_r32_r32(struct data *text, enum reg dest, enum reg src) +mov_r32_r32(struct data *const text, const enum reg dest, const enum reg src) { return _move_between_reg_and_reg(text, dest, src, 4); } static size_t -mov_r16_r16(struct data *text, enum reg dest, enum reg src) +mov_r16_r16(struct data *const text, const enum reg dest, const enum reg src) { return _move_between_reg_and_reg(text, dest, src, 2); } static size_t -mov_r8_r8(struct data *text, enum reg dest, enum reg src) +mov_r8_r8(struct data *const text, const enum reg dest, const enum reg src) { return _move_between_reg_and_reg(text, dest, src, 1); } static size_t -_move_between_reg_and_memaddr_in_reg_with_disp(struct data *text, enum reg reg, enum reg mem, int8_t disp, uint8_t opsize, bool dir) +_move_between_reg_and_memaddr_in_reg_with_disp(struct data *const text, const enum reg reg, const enum reg mem, const int8_t disp, const uint8_t opsize, const bool dir) { assert((reg & 7) != 4 && (mem & 7) != 4); uint8_t temp, rex = opsize == 8 ? REX_W : 0; @@ -379,55 +379,55 @@ _move_between_reg_and_memaddr_in_reg_with_disp(struct data *text, enum reg reg, } static size_t -mov_disp8_m64_r64(struct data *text, enum reg dest, int8_t disp, enum reg src) +mov_disp8_m64_r64(struct data *const text, const enum reg dest, const int8_t disp, const enum reg src) { return _move_between_reg_and_memaddr_in_reg_with_disp(text, src, dest, disp, 8, MOVE_FROMREG); } static size_t -mov_disp8_m32_r32(struct data *text, enum reg dest, int8_t disp, enum reg src) +mov_disp8_m32_r32(struct data *const text, const enum reg dest, const int8_t disp, const enum reg src) { return _move_between_reg_and_memaddr_in_reg_with_disp(text, src, dest, disp, 4, MOVE_FROMREG); } static size_t -mov_disp8_m16_r16(struct data *text, enum reg dest, int8_t disp, enum reg src) +mov_disp8_m16_r16(struct data *const text, const enum reg dest, const int8_t disp, const enum reg src) { return _move_between_reg_and_memaddr_in_reg_with_disp(text, src, dest, disp, 2, MOVE_FROMREG); } static size_t -mov_disp8_m8_r8(struct data *text, enum reg dest, int8_t disp, enum reg src) +mov_disp8_m8_r8(struct data *const text, const enum reg dest, const int8_t disp, const enum reg src) { return _move_between_reg_and_memaddr_in_reg_with_disp(text, src, dest, disp, 1, MOVE_FROMREG); } static size_t -mov_disp8_r64_m64(struct data *text, enum reg dest, enum reg src, int8_t disp) +mov_disp8_r64_m64(struct data *const text, const enum reg dest, const enum reg src, const int8_t disp) { return _move_between_reg_and_memaddr_in_reg_with_disp(text, dest, src, disp, 8, MOVE_TOREG); } static size_t -mov_disp8_r32_m32(struct data *text, enum reg dest, enum reg src, int8_t disp) +mov_disp8_r32_m32(struct data *const text, const enum reg dest, const enum reg src, const int8_t disp) { return _move_between_reg_and_memaddr_in_reg_with_disp(text, dest, src, disp, 4, MOVE_TOREG); } static size_t -mov_disp8_r16_m16(struct data *text, enum reg dest, enum reg src, int8_t disp) +mov_disp8_r16_m16(struct data *const text, const enum reg dest, const enum reg src, const int8_t disp) { return _move_between_reg_and_memaddr_in_reg_with_disp(text, dest, src, disp, 2, MOVE_TOREG); } static size_t -mov_disp8_r8_m8(struct data *text, enum reg dest, enum reg src, int8_t disp) +mov_disp8_r8_m8(struct data *const text, const enum reg dest, const enum reg src, const int8_t disp) { return _move_between_reg_and_memaddr_in_reg_with_disp(text, dest, src, disp, 1, MOVE_TOREG); } static size_t -_movezx_reg_to_reg(struct data *text, uint8_t destsize, uint8_t srcsize, enum reg dest, enum reg src) +_movezx_reg_to_reg(struct data *const text, const uint8_t destsize, const uint8_t srcsize, const enum reg dest, const enum reg src) { assert(srcsize == 1 || srcsize == 2); assert(destsize == 1 || destsize == 2 || destsize == 4 || destsize == 8); @@ -449,37 +449,37 @@ _movezx_reg_to_reg(struct data *text, uint8_t destsize, uint8_t srcsize, enum re } static size_t -movzx_r64_r8(struct data *text, enum reg dest, enum reg src) +movzx_r64_r8(struct data *const text, const enum reg dest, const enum reg src) { return _movezx_reg_to_reg(text, 8, 1, dest, src); } static size_t -movzx_r32_r8(struct data *text, enum reg dest, enum reg src) +movzx_r32_r8(struct data *const text, const enum reg dest, const enum reg src) { return _movezx_reg_to_reg(text, 4, 1, dest, src); } static size_t -movzx_r16_r8(struct data *text, enum reg dest, enum reg src) +movzx_r16_r8(struct data *const text, const enum reg dest, const enum reg src) { return _movezx_reg_to_reg(text, 2, 1, dest, src); } static size_t -movzx_r64_r16(struct data *text, enum reg dest, enum reg src) +movzx_r64_r16(struct data *const text, const enum reg dest, const enum reg src) { return _movezx_reg_to_reg(text, 8, 2, dest, src); } static size_t -movzx_r32_r16(struct data *text, enum reg dest, enum reg src) +movzx_r32_r16(struct data *const text, const enum reg dest, const enum reg src) { return _movezx_reg_to_reg(text, 4, 2, dest, src); } static size_t -lea_disp8(struct data *text, enum reg dest, enum reg src, int8_t disp) +lea_disp8(struct data *const text, const enum reg dest, const enum reg src, const int8_t disp) { uint8_t temp; assert(src != 4); @@ -494,7 +494,7 @@ lea_disp8(struct data *text, enum reg dest, enum reg src, int8_t disp) } static size_t -add_r64_r64(struct data *text, enum reg dest, enum reg src) +add_r64_r64(struct data *const text, const enum reg dest, const enum reg src) { uint8_t temp; if (text) { @@ -507,7 +507,7 @@ add_r64_r64(struct data *text, enum reg dest, enum reg src) } static size_t -sub_r64_r64(struct data *text, enum reg dest, enum reg src) +sub_r64_r64(struct data *const text, const enum reg dest, const enum reg src) { uint8_t temp; if (text) { @@ -520,7 +520,7 @@ sub_r64_r64(struct data *text, enum reg dest, enum reg src) } static size_t -sub_r64_imm(struct data *text, enum reg dest, int32_t imm) +sub_r64_imm(struct data *const text, const enum reg dest, int32_t imm) { uint8_t temp; if (text) { @@ -537,7 +537,7 @@ sub_r64_imm(struct data *text, enum reg dest, int32_t imm) } static size_t -_cmp_reg_to_reg(struct data *text, uint8_t size, enum reg reg1, enum reg reg2) +_cmp_reg_to_reg(struct data *const text, const uint8_t size, const enum reg reg1, const enum reg reg2) { uint8_t temp; uint8_t rex = (size == 8 ? REX_W : 0) | (reg1 >= 8 ? REX_R : 0) | (reg2 >= 8 ? REX_B : 0); @@ -556,31 +556,31 @@ _cmp_reg_to_reg(struct data *text, uint8_t size, enum reg reg1, enum reg reg2) } static size_t -cmp_r64_r64(struct data *text, enum reg reg1, enum reg reg2) +cmp_r64_r64(struct data *const text, const enum reg reg1, const enum reg reg2) { return _cmp_reg_to_reg(text, 8, reg1, reg2); } static size_t -cmp_r32_r32(struct data *text, enum reg reg1, enum reg reg2) +cmp_r32_r32(struct data *const text, const enum reg reg1, const enum reg reg2) { return _cmp_reg_to_reg(text, 4, reg1, reg2); } static size_t -cmp_r16_r16(struct data *text, enum reg reg1, enum reg reg2) +cmp_r16_r16(struct data *const text, const enum reg reg1, const enum reg reg2) { return _cmp_reg_to_reg(text, 2, reg1, reg2); } static size_t -cmp_r8_r8(struct data *text, enum reg reg1, enum reg reg2) +cmp_r8_r8(struct data *const text, const enum reg reg1, const enum reg reg2) { return _cmp_reg_to_reg(text, 1, reg1, reg2); } static size_t -cmp_r8_imm(struct data *text, enum reg reg, uint8_t imm) +cmp_r8_imm(struct data *const text, const enum reg reg, const uint8_t imm) { uint8_t temp; if (text) { @@ -595,7 +595,7 @@ cmp_r8_imm(struct data *text, enum reg reg, uint8_t imm) } static size_t -jng(struct data *text, int64_t offset) +jng(struct data *const text, const int64_t offset) { uint8_t temp; if (-256 <= offset && offset <= 255) { @@ -613,7 +613,7 @@ jng(struct data *text, int64_t offset) } static size_t -jg(struct data *text, int64_t offset) +jg(struct data *const text, const int64_t offset) { uint8_t temp; if (-256 <= offset && offset <= 255) { @@ -631,7 +631,7 @@ jg(struct data *text, int64_t offset) } static size_t -jne(struct data *text, int64_t offset) +jne(struct data *const text, const int64_t offset) { uint8_t temp; if (-256 <= offset && offset <= 255) { @@ -649,7 +649,7 @@ jne(struct data *text, int64_t offset) } static size_t -je(struct data *text, int64_t offset) +je(struct data *const text, const int64_t offset) { uint8_t temp; if (-128 <= offset && offset <= 127) { @@ -678,7 +678,7 @@ je(struct data *text, int64_t offset) } static size_t -sete_reg(struct data *text, enum reg reg) +sete_reg(struct data *const text, const enum reg reg) { uint8_t temp; if (text) { @@ -692,7 +692,7 @@ sete_reg(struct data *text, enum reg reg) } static size_t -setne_reg(struct data *text, enum reg reg) +setne_reg(struct data *const text, const enum reg reg) { uint8_t temp; if (text) { @@ -706,7 +706,7 @@ setne_reg(struct data *text, enum reg reg) } static size_t -jmp(struct data *text, int64_t offset) +jmp(struct data *const text, const int64_t offset) { uint8_t temp; if (-256 <= offset && offset <= 255) { @@ -724,7 +724,7 @@ jmp(struct data *text, int64_t offset) } static size_t -call(struct data *text, int32_t offset) +call(struct data *const text, const int32_t offset) { uint8_t temp; if (text) { @@ -739,7 +739,7 @@ call(struct data *text, int32_t offset) } static size_t -ret(struct data *text) +ret(struct data *const text) { uint8_t temp; if (text) @@ -749,7 +749,7 @@ ret(struct data *text) } static size_t -_pushpop_r64(struct data *text, uint8_t ioff, enum reg reg) +_pushpop_r64(struct data *const text, const uint8_t ioff, const enum reg reg) { uint8_t temp; if (text) { @@ -763,19 +763,19 @@ _pushpop_r64(struct data *text, uint8_t ioff, enum reg reg) } static size_t -push_r64(struct data *text, enum reg reg) +push_r64(struct data *const text, const enum reg reg) { return _pushpop_r64(text, 0, reg); } static size_t -pop_r64(struct data *text, enum reg reg) +pop_r64(struct data *const text, const enum reg reg) { return _pushpop_r64(text, 8, reg); } -static size_t emitsyscall(struct data *text, uint8_t paramcount); -static size_t emitproc(struct data *text, struct iproc *proc); +static size_t emitsyscall(struct data *const text, const uint8_t paramcount); +static size_t emitproc(struct data *const text, const struct iproc *const proc); const struct target x64_target = { .reserved = (1 << RSP) | (1 << RBP) | (1 << R12) | (1 << R13), @@ -786,7 +786,7 @@ const struct target x64_target = { #define NEXT ins++; assert(ins <= end); static size_t -emitsyscall(struct data *text, uint8_t paramcount) +emitsyscall(struct data *const text, const uint8_t paramcount) { assert(paramcount < 8); size_t total = 0; @@ -820,9 +820,9 @@ emitsyscall(struct data *text, uint8_t paramcount) } size_t -emitblock(struct data *text, struct iproc *proc, struct instr *start, struct instr *end, uint16_t active, uint16_t curi) +emitblock(struct data *const text, const struct iproc *const proc, const struct instr *const start, const struct instr *end, uint16_t active, uint16_t curi) { - struct instr *ins = start ? start : proc->data; + const struct instr *ins = start ? start : proc->data; end = end ? end : &proc->data[proc->len]; uint64_t dest, src, size, count, label; @@ -1061,7 +1061,7 @@ emitblock(struct data *text, struct iproc *proc, struct instr *start, struct ins } size_t -emitproc(struct data *text, struct iproc *proc) +emitproc(struct data *const text, const struct iproc *const proc) { return emitblock(text, proc, NULL, NULL, 0, 0); }