From: Axy Date: Mon, 8 Jun 2026 12:00:10 +0000 (+0200) Subject: Impl of more cmp operations X-Git-Url: https://git.uwuaxy.net/?a=commitdiff_plain;h=refs%2Fheads%2Fmaster;p=axy%2Fft%2Fc-cera.git Impl of more cmp operations --- diff --git a/.deps b/.deps index cee5ecb..02021cd 100644 --- a/.deps +++ b/.deps @@ -1,5 +1,9 @@ ${BUILDDIR}/arc.o: src/arc.c src/arc.h src/memutils.h src/panic.h src/jmp.h \ src/arith.h src/atomic.h +${BUILDDIR}/builtim_gt.o: src/builtim_gt.c src/builtin_register.h src/value_types.h \ + src/value.h src/value_get.h src/panic.h src/jmp.h src/value_new.h \ + src/defer.h src/framealloc.h src/align.h src/stacktrack.h \ + src/memutils.h ${BUILDDIR}/builtin_add.o: src/builtin_add.c src/builtin_register.h src/value_types.h \ src/value.h src/value_get.h src/panic.h src/jmp.h src/value_new.h \ src/defer.h src/framealloc.h src/align.h src/stacktrack.h \ @@ -17,6 +21,10 @@ ${BUILDDIR}/builtin_list_set.o: src/builtin_list_set.c src/builtin_register.h \ ${BUILDDIR}/builtin_list_set_drop.o: src/builtin_list_set_drop.c src/value.h \ src/value_get.h src/value_types.h src/panic.h src/jmp.h \ src/value_new.h src/arc.h src/memutils.h src/arith.h +${BUILDDIR}/builtin_lt.o: src/builtin_lt.c src/builtin_register.h src/value_types.h \ + src/value.h src/value_get.h src/panic.h src/jmp.h src/value_new.h \ + src/defer.h src/framealloc.h src/align.h src/stacktrack.h \ + src/memutils.h ${BUILDDIR}/builtin_lte.o: src/builtin_lte.c src/builtin_register.h src/value_types.h \ src/value.h src/value_get.h src/panic.h src/jmp.h src/value_new.h \ src/defer.h src/framealloc.h src/align.h src/stacktrack.h \ @@ -39,20 +47,24 @@ ${BUILDDIR}/eval.o: src/eval.c src/ccera.h src/jmp.h src/defer.h src/framealloc. src/align.h src/stacktrack.h src/memutils.h src/panic.h src/value.h \ src/value_get.h src/value_types.h src/value_new.h src/arith.h \ src/arc.h src/atomic.h src/builtin_register.h src/execalloc.h \ - src/miniobj.h + src/miniobj.h src/vec.h ${BUILDDIR}/execalloc.o: src/execalloc.c src/panic.h src/jmp.h ${BUILDDIR}/framealloc.o: src/framealloc.c src/framealloc.h src/align.h \ src/stacktrack.h -${BUILDDIR}/miniobj.o: src/miniobj.c src/miniobj.h src/panic.h src/jmp.h src/defer.h \ - src/framealloc.h src/align.h src/stacktrack.h src/memutils.h src/vec.h \ - src/execalloc.h -${BUILDDIR}/miniobj_lifetime.o: src/miniobj_lifetime.c src/miniobj.h src/memutils.h \ - src/panic.h src/jmp.h +${BUILDDIR}/miniobj.o: src/miniobj.c src/miniobj.h src/vec.h src/memutils.h \ + src/panic.h src/jmp.h src/defer.h src/framealloc.h src/align.h \ + src/stacktrack.h src/execalloc.h +${BUILDDIR}/miniobj_lifetime.o: src/miniobj_lifetime.c src/miniobj.h src/vec.h \ + src/memutils.h src/panic.h src/jmp.h ${BUILDDIR}/panic.o: src/panic.c src/panic.h src/jmp.h src/defer.h src/framealloc.h \ src/align.h src/stacktrack.h src/memutils.h ${BUILDDIR}/stacktrack.o: src/stacktrack.c src/stacktrack.h ${BUILDDIR}/value_debug.o: src/value_debug.c src/value.h src/value_get.h \ src/value_types.h src/panic.h src/jmp.h src/value_new.h +${BUILDDIR}/value_gte.o: src/value_gte.c src/builtin_register.h src/value_types.h \ + src/value.h src/value_get.h src/panic.h src/jmp.h src/value_new.h \ + src/defer.h src/framealloc.h src/align.h src/stacktrack.h \ + src/memutils.h ${BUILDDIR}/value_lifetime.o: src/value_lifetime.c src/arc.h src/memutils.h \ src/panic.h src/jmp.h src/arith.h src/defer.h src/framealloc.h \ src/align.h src/stacktrack.h src/value.h src/value_get.h \ diff --git a/Makefile b/Makefile index 5df2d45..29fe344 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ NAME=ccera.a -SRCS=src/arc.c src/builtin_add.c src/builtin.c src/builtin_list_get.c src/builtin_list_set.c src/builtin_list_set_drop.c src/builtin_lte.c src/builtin_mul.c src/builtin_noop.c src/builtin_register.c src/builtin_sub.c src/defer.c src/eval.c src/execalloc.c src/framealloc.c src/miniobj.c src/miniobj_lifetime.c src/panic.c src/stacktrack.c src/value_debug.c src/value_lifetime.c src/value_list.c src/value_move.c src/value_new.c src/value_new_utils.c +SRCS=src/arc.c src/builtim_gt.c src/builtin_add.c src/builtin.c src/builtin_list_get.c src/builtin_list_set.c src/builtin_list_set_drop.c src/builtin_lt.c src/builtin_lte.c src/builtin_mul.c src/builtin_noop.c src/builtin_register.c src/builtin_sub.c src/defer.c src/eval.c src/execalloc.c src/framealloc.c src/miniobj.c src/miniobj_lifetime.c src/panic.c src/stacktrack.c src/value_debug.c src/value_gte.c src/value_lifetime.c src/value_list.c src/value_move.c src/value_new.c src/value_new_utils.c HEADERS=src/align.h src/arc.h src/arith.h src/atomic.h src/builtin_register.h src/ccera.h src/defer.h src/execalloc.h src/framealloc.h src/jmp.h src/memutils.h src/miniobj.h src/panic.h src/stacktrack.h src/value_get.h src/value.h src/value_new.h src/value_types.h src/vec.h diff --git a/conf.mk b/conf.mk index c54d73c..29d93f5 100644 --- a/conf.mk +++ b/conf.mk @@ -1,6 +1,6 @@ -LTO=0 -OPT=0 -CC=clang +LTO=1 +OPT=1 +CC=cc #UBSAN=1 #TSAN=1 #ASAN=1 diff --git a/src/builtim_gt.c b/src/builtim_gt.c new file mode 100644 index 0000000..5a87fe3 --- /dev/null +++ b/src/builtim_gt.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* builtim_gt.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/06/08 13:59:16 by agilliar #+# #+# */ +/* Updated: 2026/06/08 13:59:54 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "builtin_register.h" +#include "value.h" +#include "defer.h" + +t_value builtin_igt_impl(t_value self, t_value arg) +{ + t_value res; + + (void) self; + errdefer(value_drop, &arg); + res = value_new_builtin(BUILTIN_IGT1); + res.val.v_int = *value_int(&arg); + return (res); +} + +t_value builtin_igt1_impl(t_value self, t_value arg) +{ + errdefer(value_drop, &arg); + return (value_new_uint(self.val.v_int > *value_int(&arg))); +} + +t_value builtin_ugt_impl(t_value self, t_value arg) +{ + t_value res; + + (void) self; + errdefer(value_drop, &arg); + res = value_new_builtin(BUILTIN_UGT1); + res.val.v_uint = *value_uint(&arg); + return (res); +} + +t_value builtin_ugt1_impl(t_value self, t_value arg) +{ + errdefer(value_drop, &arg); + return (value_new_uint(self.val.v_uint > *value_uint(&arg))); +} + +__attribute__((constructor)) +void builtin_gt_register(void) +{ + builtin_register(BUILTIN_IGT, &builtin_igt_impl, "igt"); + builtin_register(BUILTIN_IGT1, &builtin_igt1_impl, "igt1"); + builtin_register(BUILTIN_UGT, &builtin_ugt_impl, "ugt"); + builtin_register(BUILTIN_UGT1, &builtin_ugt1_impl, "ugt1"); +} diff --git a/src/builtin_lt.c b/src/builtin_lt.c new file mode 100644 index 0000000..c713201 --- /dev/null +++ b/src/builtin_lt.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* builtin_lt.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/06/08 13:54:41 by agilliar #+# #+# */ +/* Updated: 2026/06/08 13:55:41 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "builtin_register.h" +#include "value.h" +#include "defer.h" + +t_value builtin_ilt_impl(t_value self, t_value arg) +{ + t_value res; + + (void) self; + errdefer(value_drop, &arg); + res = value_new_builtin(BUILTIN_ILT1); + res.val.v_int = *value_int(&arg); + return (res); +} + +t_value builtin_ilt1_impl(t_value self, t_value arg) +{ + errdefer(value_drop, &arg); + return (value_new_uint(self.val.v_int < *value_int(&arg))); +} + +t_value builtin_ult_impl(t_value self, t_value arg) +{ + t_value res; + + (void) self; + errdefer(value_drop, &arg); + res = value_new_builtin(BUILTIN_ULT1); + res.val.v_uint = *value_uint(&arg); + return (res); +} + +t_value builtin_ult1_impl(t_value self, t_value arg) +{ + errdefer(value_drop, &arg); + return (value_new_uint(self.val.v_uint < *value_uint(&arg))); +} + +__attribute__((constructor)) +void builtin_lt_register(void) +{ + builtin_register(BUILTIN_ILT, &builtin_ilt_impl, "ilt"); + builtin_register(BUILTIN_ILT1, &builtin_ilt1_impl, "ilt1"); + builtin_register(BUILTIN_ULT, &builtin_ult_impl, "ult"); + builtin_register(BUILTIN_ULT1, &builtin_ult1_impl, "ult1"); +} diff --git a/src/miniobj.c b/src/miniobj.c index 820819a..8114ab3 100644 --- a/src/miniobj.c +++ b/src/miniobj.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/05/31 22:55:45 by agilliar #+# #+# */ -/* Updated: 2026/06/01 18:55:02 by agilliar ### ########.fr */ +/* Updated: 2026/06/04 14:40:21 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,26 +25,26 @@ void miniobj_write_s(t_miniobj *obj, const char *s) void miniobj_write(t_miniobj *obj, const char *s, size_t n) { - vec_grow((void **) &obj->byte_buf, &obj->byte_capacity, obj->byte_len + n); - cera_memcpy(&obj->byte_buf[obj->byte_len], s, n); - obj->byte_len += n; + vec_push(&obj->byte_vec, s, n); } t_objaddr miniobj_label(t_miniobj *obj, t_label label) { - obj->resolved_labels[label] = obj->byte_len; - return (obj->byte_len); + obj->resolved_labels[label] = obj->byte_vec.len; + return (obj->byte_vec.len); } void miniobj_write_reloc(t_miniobj *obj, t_label label, t_reloc_kind kind) { - const uintptr_t s = 0; + const t_relocation reloc = { + obj->byte_vec.len, + label, + kind + }; + const uintptr_t s = 0; - vec_grow((void **) &obj->reloc_buf, - &obj->reloc_capacity, (obj->reloc_len + 1) * sizeof(t_relocation)); - obj->reloc_buf[obj->reloc_len] = (t_relocation){obj->byte_len, label, kind}; + vec_push(&obj->reloc_vec, &reloc, sizeof(t_relocation)); miniobj_write(obj, (const char *)&s, sizeof(int32_t)); - obj->reloc_len += 1; } const char *miniobj_finish(t_miniobj obj) @@ -55,12 +55,12 @@ const char *miniobj_finish(t_miniobj obj) int32_t offset; defer(miniobj_drop, &obj); - res = execalloc(obj.byte_len); - cera_memcpy(res, obj.byte_buf, obj.byte_len); + res = execalloc(obj.byte_vec.len); + cera_memcpy(res, obj.byte_vec.buf, obj.byte_vec.len); i = 0; - while (i < obj.reloc_len) + while (i * sizeof(t_relocation) < obj.reloc_vec.len) { - reloc = obj.reloc_buf[i++]; + reloc = ((t_relocation *)obj.reloc_vec.buf)[i++]; if (reloc.kind == REL_I32) { offset = obj.resolved_labels[reloc.label] - reloc.loc diff --git a/src/miniobj.h b/src/miniobj.h index 235500c..d41c377 100644 --- a/src/miniobj.h +++ b/src/miniobj.h @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/05/31 22:55:56 by agilliar #+# #+# */ -/* Updated: 2026/06/01 17:56:03 by agilliar ### ########.fr */ +/* Updated: 2026/06/04 14:24:54 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,6 +14,7 @@ # define MINIOBJ_H # include +# include "vec.h" typedef size_t t_objaddr; typedef size_t t_label; @@ -32,12 +33,8 @@ typedef struct s_relocation typedef struct s_miniobj { - char *byte_buf; - size_t byte_len; - size_t byte_capacity; - t_relocation *reloc_buf; - size_t reloc_len; - size_t reloc_capacity; + t_vec byte_vec; + t_vec reloc_vec; t_objaddr *resolved_labels; } t_miniobj; diff --git a/src/miniobj_lifetime.c b/src/miniobj_lifetime.c index 4eac03d..6ab4b17 100644 --- a/src/miniobj_lifetime.c +++ b/src/miniobj_lifetime.c @@ -6,25 +6,23 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/06/01 00:06:44 by agilliar #+# #+# */ -/* Updated: 2026/06/01 00:09:00 by agilliar ### ########.fr */ +/* Updated: 2026/06/04 14:27:16 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ #include "miniobj.h" #include "memutils.h" +#include "vec.h" t_miniobj miniobj_new(size_t label_count) { - t_miniobj res; - - cera_memset(&res, 0, sizeof(t_miniobj)); - res.resolved_labels = cera_malloc(label_count * sizeof(t_objaddr)); - return (res); + return ((t_miniobj){vec_new(), vec_new(), + cera_malloc(label_count * sizeof(t_objaddr))}); } void miniobj_drop(t_miniobj *obj) { - free(obj->byte_buf); - free(obj->reloc_buf); + free(obj->byte_vec.buf); + free(obj->reloc_vec.buf); free(obj->resolved_labels); } diff --git a/src/value_gte.c b/src/value_gte.c new file mode 100644 index 0000000..f1057a2 --- /dev/null +++ b/src/value_gte.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* value_gte.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: agilliar +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2026/06/08 13:56:19 by agilliar #+# #+# */ +/* Updated: 2026/06/08 13:59:01 by agilliar ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "builtin_register.h" +#include "value.h" +#include "defer.h" + +t_value builtin_igte_impl(t_value self, t_value arg) +{ + t_value res; + + (void) self; + errdefer(value_drop, &arg); + res = value_new_builtin(BUILTIN_IGTE1); + res.val.v_int = *value_int(&arg); + return (res); +} + +t_value builtin_igte1_impl(t_value self, t_value arg) +{ + errdefer(value_drop, &arg); + return (value_new_uint(self.val.v_int >= *value_int(&arg))); +} + +t_value builtin_ugte_impl(t_value self, t_value arg) +{ + t_value res; + + (void) self; + errdefer(value_drop, &arg); + res = value_new_builtin(BUILTIN_UGTE1); + res.val.v_uint = *value_uint(&arg); + return (res); +} + +t_value builtin_ugte1_impl(t_value self, t_value arg) +{ + errdefer(value_drop, &arg); + return (value_new_uint(self.val.v_uint >= *value_uint(&arg))); +} + +__attribute__((constructor)) +void builtin_gte_register(void) +{ + builtin_register(BUILTIN_IGTE, &builtin_igte_impl, "igte"); + builtin_register(BUILTIN_IGTE1, &builtin_igte1_impl, "igte1"); + builtin_register(BUILTIN_UGTE, &builtin_ugte_impl, "ugte"); + builtin_register(BUILTIN_UGTE1, &builtin_ugte1_impl, "ugte1"); +} diff --git a/src/vec.h b/src/vec.h index bddae52..8489432 100644 --- a/src/vec.h +++ b/src/vec.h @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/05/31 23:16:07 by agilliar #+# #+# */ -/* Updated: 2026/06/01 18:31:18 by agilliar ### ########.fr */ +/* Updated: 2026/06/04 14:28:52 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,21 +14,46 @@ # define VEC_H # include +# include # include "memutils.h" +# include "panic.h" -static inline void vec_grow(void **p, size_t *cap, size_t to) +typedef struct s_vec +{ + void *buf; + size_t len; + size_t cap; +} t_vec; + +static inline t_vec vec_new(void) +{ + return ((t_vec){NULL, 0, 0}); +} + +static inline void vec_reserve(t_vec *vec, size_t n) { void *nxt; + size_t to; - if (to <= *cap) + if (__builtin_add_overflow(n, vec->len, &to)) + panic("Vec too large"); + if (to <= vec->cap) return ; - if (to < *cap * 2) - to = *cap * 2; - nxt = cera_malloc(to); - cera_memcpy(nxt, *p, *cap); - free(*p); - *p = nxt; - *cap = to; + if (__builtin_mul_overflow(vec->cap, 2, &vec->cap)) + vec->cap = SIZE_MAX; + if (vec->cap < to) + vec->cap = to; + nxt = cera_malloc(vec->cap); + cera_memcpy(nxt, vec->buf, vec->len); + free(vec->buf); + vec->buf = nxt; +} + +static inline void vec_push(t_vec *vec, const void *p, size_t len) +{ + vec_reserve(vec, len); + cera_memcpy(vec->buf + vec->len, p, len); + vec->len += len; } #endif diff --git a/test.c b/test.c index 837e24b..273f3ef 100644 --- a/test.c +++ b/test.c @@ -6,7 +6,7 @@ /* By: agilliar +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2026/04/30 17:19:58 by agilliar #+# #+# */ -/* Updated: 2026/06/01 18:55:35 by agilliar ### ########.fr */ +/* Updated: 2026/06/08 13:49:37 by agilliar ### ########.fr */ /* */ /* ************************************************************************** */ @@ -216,7 +216,6 @@ void main2(void *_orig) printf("%s\n", s2); } -/* int main(void) { char *msg; @@ -234,8 +233,8 @@ int main(void) char *s2 = malloc(strlen(orig) + 1); defer(free, s2); } -*/ +/* int main(void) { t_miniobj obj; @@ -250,7 +249,7 @@ int main(void) miniobj_write_s(&obj, "\x57"); // push rdi miniobj_write_s(&obj, "\x48\xff\xcf"); // dec rdi miniobj_write_s(&obj, "\xe8"); - miniobj_write_reloc(&obj, 0, REL_I32); // call func + miniobj_write_reloc(&obj, 0, REL_I32); // call rel32 func miniobj_write_s(&obj, "\x5f"); // pop rdi miniobj_write_s(&obj, "\x48\x0f\xaf\xc7"); // imul rdi, rax miniobj_write_s(&obj, "\xc3"); // ret @@ -260,3 +259,4 @@ int main(void) fact = (void *) &miniobj_finish(obj)[func]; printf("%lu\n", fact(10)); } +*/