${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 \
${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 \
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 \
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
-LTO=0
-OPT=0
-CC=clang
+LTO=1
+OPT=1
+CC=cc
#UBSAN=1
#TSAN=1
#ASAN=1
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* builtim_gt.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* 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");
+}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* builtin_lt.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* 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");
+}
/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */
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)
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
/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */
# define MINIOBJ_H
# include <stddef.h>
+# include "vec.h"
typedef size_t t_objaddr;
typedef size_t t_label;
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;
/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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);
}
--- /dev/null
+/* ************************************************************************** */
+/* */
+/* ::: :::::::: */
+/* value_gte.c :+: :+: :+: */
+/* +:+ +:+ +:+ */
+/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
+/* +#+#+#+#+#+ +#+ */
+/* 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");
+}
/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */
# define VEC_H
# include <stddef.h>
+# include <stdint.h>
# 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
/* By: agilliar <agilliar@student.42mulhouse.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* 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 */
/* */
/* ************************************************************************** */
printf("%s\n", s2);
}
-/*
int main(void)
{
char *msg;
char *s2 = malloc(strlen(orig) + 1);
defer(free, s2);
}
-*/
+/*
int main(void)
{
t_miniobj obj;
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
fact = (void *) &miniobj_finish(obj)[func];
printf("%lu\n", fact(10));
}
+*/