From fc7253e4120bb0ee3ad3ca64ca85ce53cff3aefb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nils=20O=2E=20Sel=C3=A5sdal?= Date: Fri, 5 Jun 2026 01:11:49 +0200 Subject: [PATCH] More stuff --- .gitignore | 6 ++++++ .vscode/launch.json | 16 ++++++++++++++++ .vscode/settings.json | 3 +++ .vscode/tasks.json | 16 ++++++++++++++++ build.sh | 3 +++ src/arena.c | 43 +++++++++++++++++++++++-------------------- src/arena.h | 3 +++ src/base_core.h | 13 ++++++++----- src/main.c | 41 +++++++++++++++++++++++++++++++++++++++++ 9 files changed, 119 insertions(+), 25 deletions(-) create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100755 build.sh create mode 100644 src/main.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6f3c119 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +a.out +*.~* +.gdb_history +*.o +*.a +.clang-format diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..4955596 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch", + "type": "lldb", + "request": "launch", + "program": "${workspaceRoot}/a.out", + "args": [], + "cwd": "${workspaceRoot}" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..37425b4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "C_Cpp.default.cStandard": "gnu23" +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..f51cef5 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,16 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "type": "shell", + "command": "${workspaceFolder}/build.sh && ./a.out", + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..1483a3a --- /dev/null +++ b/build.sh @@ -0,0 +1,3 @@ +#!/bin/sh +set -x +gcc -ggdb -Wall -Wextra -Wno-unused-parameter -Wno-unused-variable -std=gnu23 src/*c diff --git a/src/arena.c b/src/arena.c index 3fdb9d3..d18afed 100644 --- a/src/arena.c +++ b/src/arena.c @@ -15,12 +15,15 @@ static void memory_release(void *mem) Arena *arena_alloc_(const ArenaParams *params) { + Assert(params->size > ARENA_HEADER_SZ); + Assert(params->size < (U32_Max - ARENA_HEADER_SZ - 1)); + // Note: only backend now is malloc - Assert(params.size > ARENA_HEADER_SZ); void *base = memory_allocate(params->size); Assert(base != NULL); Arena *arena = (Arena *)base; + arena->base = base; arena->current = arena; arena->size = params->size; arena->pos = ARENA_HEADER_SZ; @@ -29,7 +32,6 @@ Arena *arena_alloc_(const ArenaParams *params) return arena; } - void arena_free(Arena *arena) { Arena *it = arena->current; @@ -42,35 +44,36 @@ void arena_free(Arena *arena) } } - - void *arena_push(Arena *arena, U32 size, U32 align) { + Assert(size < (U32_Max - align - ARENA_HEADER_SZ - 1)); + Assert(IsPow2(align)); Arena *current = arena->current; U32 start_pos = AlignUpPow2(arena->pos, align); - U32 available = current->size - start_pos; + U32 available = arena_available(current); - if (available > size) { - - U8 *mem = ¤t->base[start_pos]; - arena->pos = start_pos + size; - return mem; - - } else { - // Note: We could hunt for a previous arena that still have room + if (available < size) { U32 new_size = current->size; if (new_size < size) { - new_size = size; + new_size = AlignUpPow2(size + ARENA_HEADER_SZ,align); } ArenaParams new_params = {}; - new_params.flags = current->flags; - new_params.size = size + ARENA_HEADER_SZ; + new_params.flags = current->flags; + new_params.size = new_size; + Arena *new_arena = arena_alloc_(&new_params); - - new_arena->prev = current; + new_arena->prev = current; current->current = new_arena; - current = new_arena; - + current = new_arena; + start_pos = AlignUpPow2(current->pos, align); } + + U32 end_pos = start_pos + size; + Assert(end_pos <= current->size); + + U8 *mem = ¤t->base[start_pos]; + arena->pos = start_pos + size; + + return mem; } diff --git a/src/arena.h b/src/arena.h index 46a5231..33ab094 100644 --- a/src/arena.h +++ b/src/arena.h @@ -32,3 +32,6 @@ INLINE U32 arena_available(const Arena *arena) } +Arena *arena_alloc_(const ArenaParams *params); +void arena_free(Arena *arena); +void *arena_push(Arena *arena, U32 size, U32 align); diff --git a/src/base_core.h b/src/base_core.h index 40540a4..104665b 100644 --- a/src/base_core.h +++ b/src/base_core.h @@ -4,6 +4,7 @@ #include #include #include +#include // Types typedef int8_t S8; @@ -16,8 +17,10 @@ typedef uint32_t U32; typedef uint64_t U64; typedef float F32; typedef double F64; -#if defined(__FLT128_MANT_DIG__) || defined(__FLOAT128__) -typedef __float128 F128; +#if defined(__FLT128_MANT_DIG__) + typedef _Float128 F128; +#elif defined(__SIZEOF_FLOAT128__) + typedef __float128 F128; #endif #ifdef __SIZEOF_INT128__ typedef __int128 S128; @@ -179,12 +182,12 @@ typedef unsigned __int128 U128; #define TB(n) (((U64)(n)) << 40) #define Thousand(n) (((U64)(n) * 1000)) -#define Million(n) (((U64)(n) * 1000_000)) -#define Billion(n) (((U64)(n) * 1000_000_000)) +#define Million(n) (((U64)(n) * 1000000)) +#define Billion(n) (((U64)(n) * 1000000000)) // memory #define MemSet(ptr, val, len) memset(ptr, val, len) -#define MemoryZero(ptr, len) memset_explicit(ptr, 0, len) +#define MemoryZero(ptr, len) explicit_bzero(ptr,len) #define MemMove(dst, src, len) memmove(dst, src, len) #define MemCpy(dst, src, len) memcpy(dst, src, len) #define MemAppend(dst, src, len) mempcpy(dst, src, len) diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..d20c6cf --- /dev/null +++ b/src/main.c @@ -0,0 +1,41 @@ +#include "base_core.h" +#include "arena.h" +#include +#include + +void arena_dump(const Arena *arena) +{ + arena = arena->current; + puts("@@@@@@@@@@"); + while (arena) { + puts("-----Arena-----"); + printf("base: %p\n", arena->base); + printf("size: %u\n", arena->size); + printf("pos: %u\n", arena->pos); + printf("prev: %p\n", arena->prev); + puts("-----Arena end-"); + arena = arena->prev; + } +} + +int main(int argc, char *argv[]) +{ + ArenaParams arena_params = {}; + arena_params.size = 1024+ARENA_HEADER_SZ; + Arena *arena = arena_alloc_(&arena_params); + arena_dump(arena); + char *ptr = arena_push(arena, 1024, 1); + MemoryZero(ptr, 1024); + printf("Allocated ptr %p\n", ptr); + arena_dump(arena); + ptr = arena_push(arena, 512, 1); + MemoryZero(ptr, 512); + printf("Allocated ptr %p\n", ptr); + arena_dump(arena); + + ptr = arena_push(arena, 1, 1); + MemoryZero(ptr, 1); + printf("Allocated ptr %p\n", ptr); + arena_dump(arena); + arena_free(arena); +}