Skip to content

Commit

Permalink
Test3
Browse files Browse the repository at this point in the history
  • Loading branch information
fuhsnn committed Dec 20, 2024
1 parent fa61e23 commit 8b816e5
Show file tree
Hide file tree
Showing 8 changed files with 280 additions and 200 deletions.
113 changes: 40 additions & 73 deletions arena.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,100 +16,36 @@ const char *__asan_default_options(void) {
}
#endif

#define PAGE_SIZE 4048

typedef struct Page Page;
#define PAGE_SIZE 4064
struct Page {
#if USE_ASAN
Page *next;
__attribute__((aligned(16))) char buf[PAGE_SIZE];
#else
char buf[PAGE_SIZE];
Page *next;
#endif
};

typedef struct {
bool on;
size_t used;
Page *page;
Page *head_page;
} Arena;

static Arena ast_arena;
static Arena pp_arena;
Arena ast_arena;
Arena pp_arena;
Arena node_arena;
bool free_stuff;

static Page *new_page(void) {
Page *p;
if (posix_memalign((void **)&p, 16, sizeof(Page)))
error("posix_memalign failed");
Page *p = malloc(sizeof(Page));
p->next = NULL;

#if USE_ASAN
__asan_poison_memory_region(&p->buf, PAGE_SIZE);
#endif
return p;
}

static void arena_on2(Arena *arena) {
if (!arena->head_page)
arena->head_page = new_page();

arena->page = arena->head_page;
arena->on = true;
arena->used = 0;
}


static void arena_off2(Arena *arena) {
arena->on = false;

while (arena->head_page) {
Page *nxt = arena->head_page->next;
free(arena->head_page);
arena->head_page = nxt;
}
}

void arena_combine(void) {
// if (ast_arena.page) {
// while (ast_arena.page->next)
// ast_arena.page = ast_arena.page->next;
// ast_arena.page->next = pp_arena.head_page;
// } else {
// ast_arena.head_page = pp_arena.head_page;
// }
// pp_arena_off();
// pp_arena.head_page = NULL;
}

void arena_on(void) {
arena_on2(&ast_arena);
}

void arena_off(void) {
arena_off2(&ast_arena);
}

void pp_arena_on(void) {
arena_on2(&pp_arena);
}

void pp_arena_off(void) {
arena_off2(&pp_arena);
}


static void *allocate(Arena *arena, size_t sz, bool clear) {
size_t aligned_sz = (sz + 15) & -16LL;

void *ptr;
if ((arena->used + aligned_sz) <= PAGE_SIZE) {
ptr = &arena->page->buf[arena->used];
arena->used += aligned_sz;
} else {
if (!arena->page->next)
arena->page->next = new_page();

arena->page = arena->page->next;
ptr = &arena->page->buf;
arena->used = aligned_sz;
Expand All @@ -122,17 +58,48 @@ static void *allocate(Arena *arena, size_t sz, bool clear) {
#else
if (clear)
memset(ptr, 0, aligned_sz);
// for (int i = 0; i < (aligned_sz >> 3); i++)
// ((int64_t *)ptr)[i] = 0;
#endif
return ptr;
}

void *arena_malloc(size_t sz) {
void arena_on(Arena *arena) {
if (!arena->head_page)
arena->head_page = new_page();

arena->page = arena->head_page;
arena->on = true;
arena->used = 0;
}

void arena_off(Arena *arena) {
arena->on = false;

if (free_stuff) {
while (arena->head_page) {
Page *nxt = arena->head_page->next;
free(arena->head_page);
arena->head_page = nxt;
}
}
}

void *arena_malloc(Arena *a, size_t sz) {
return allocate(a, sz, false);
}

void *arena_calloc(Arena *a, size_t sz) {
return allocate(a, sz, true);
}

void *ast_arena_malloc(size_t sz) {
if (!ast_arena.on)
return malloc(sz);
return allocate(&ast_arena, sz, false);
}

void *arena_calloc(size_t n, size_t sz) {
void *ast_arena_calloc(size_t n, size_t sz) {
if (!ast_arena.on)
return calloc(n, sz);
return allocate(&ast_arena, n * sz, true);
Expand Down
50 changes: 27 additions & 23 deletions codegen.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,10 @@ static void insrtln(char *fmt, long loc, ...) {
fseek(output_file, cur_loc, SEEK_SET);
}

static char *asm_name(Obj *var) {
return var->asm_name ? var->asm_name : var->name;
}

static int count(void) {
static int i = 1;
return i++;
Expand Down Expand Up @@ -225,7 +229,7 @@ static bool eval_memop(Node *node, char *ofs, char **ptr, bool let_subarray, boo
*ptr = var->ptr;
return true;
} else if (!var->is_tls && (!opt_fpic || var->is_static)) {
snprintf(ofs, STRBUF_SZ, "%d+\"%s\"", offset, var->name);
snprintf(ofs, STRBUF_SZ, "%d+\"%s\"", offset, asm_name(var));
*ptr = "%rip";
return true;
}
Expand Down Expand Up @@ -713,22 +717,22 @@ static void gen_addr(Node *node) {
// Thread-local variable
if (node->var->is_tls) {
clobber_all_regs();
println(" data16 lea \"%s\"@tlsgd(%%rip), %%rdi", node->var->name);
println(" data16 lea \"%s\"@tlsgd(%%rip), %%rdi", asm_name(node->var));
println(" .value 0x6666");
println(" rex64");
println(" call __tls_get_addr@PLT");
return;
}

// Function or global variable
println(" mov \"%s\"@GOTPCREL(%%rip), %%rax", node->var->name);
println(" mov \"%s\"@GOTPCREL(%%rip), %%rax", asm_name(node->var));
return;
}

// Thread-local variable
if (node->var->is_tls) {
println(" mov %%fs:0, %%rax");
println(" add $\"%s\"@tpoff, %%rax", node->var->name);
println(" add $\"%s\"@tpoff, %%rax", asm_name(node->var));
return;
}

Expand Down Expand Up @@ -758,14 +762,14 @@ static void gen_addr(Node *node) {
// Function
if (node->ty->kind == TY_FUNC) {
if (node->var->is_definition)
println(" lea \"%s\"(%%rip), %%rax", node->var->name);
println(" lea \"%s\"(%%rip), %%rax", asm_name(node->var));
else
println(" mov \"%s\"@GOTPCREL(%%rip), %%rax", node->var->name);
println(" mov \"%s\"@GOTPCREL(%%rip), %%rax", asm_name(node->var));
return;
}

// Global variable
println(" lea \"%s\"(%%rip), %%rax", node->var->name);
println(" lea \"%s\"(%%rip), %%rax", asm_name(node->var));
return;
case ND_DEREF:
gen_expr(node->lhs);
Expand Down Expand Up @@ -1748,7 +1752,7 @@ static void gen_expr(Node *node) {
}
return;
case ND_FUNCALL: {
if (node->lhs->kind == ND_VAR && !strcmp(node->lhs->var->name, "alloca")) {
if (node->lhs->kind == ND_VAR && !strcmp(asm_name(node->lhs->var), "alloca")) {
gen_expr(node->args->arg_expr);
builtin_alloca(node);
return;
Expand Down Expand Up @@ -1798,7 +1802,7 @@ static void gen_expr(Node *node) {
}
println(" call *%s", pop_inreg("%r10"));
} else {
println(" call \"%s\"%s", node->lhs->var->name, opt_fpic ? "@PLT" : "");
println(" call \"%s\"%s", asm_name(node->lhs->var), opt_fpic ? "@PLT" : "");
}

clobber_all_regs();
Expand Down Expand Up @@ -3733,7 +3737,7 @@ static void asm_body(Node *node) {
continue;
case ASMOP_SYMBOLIC:{
if (ap->arg->kind == ND_VAR && !ap->arg->var->is_local && !opt_fpic) {
fprintf(output_file, "%s\"%s\"", punct, ap->arg->var->name);
fprintf(output_file, "%s\"%s\"", punct, asm_name(ap->arg->var));
continue;
}
char ofs[STRBUF_SZ], *ptr;
Expand Down Expand Up @@ -3929,19 +3933,19 @@ static int assign_lvar_offsets(Scope *sc, int bottom) {

static void emit_symbol(Obj *var) {
if (var->is_static)
println(" .local \"%s\"", var->name);
println(" .local \"%s\"", asm_name(var));
else if (var->is_weak)
println(" .weak \"%s\"", var->name);
println(" .weak \"%s\"", asm_name(var));
else
println(" .globl \"%s\"", var->name);
println(" .globl \"%s\"", asm_name(var));

if (var->alias_name)
println(" .set \"%s\", %.*s", var->name, var->alias_name->len, var->alias_name->loc);

char *vis_mode = var->visibility ? var->visibility->tval->str : opt_visibility;
if (vis_mode && (!strcmp(vis_mode, "hidden") ||
!strcmp(vis_mode, "internal") || !strcmp(vis_mode, "protected")))
println(" .%s \"%s\"", vis_mode, var->name);
println(" .%s \"%s\"", vis_mode, asm_name(var));
}

static void emit_data(Obj *var) {
Expand All @@ -3956,7 +3960,7 @@ static void emit_data(Obj *var) {

// Common symbol
if (!var->is_weak && opt_fcommon) {
println(" .comm \"%s\", %"PRIi64", %d", var->name, var->ty->size, align);
println(" .comm \"%s\", %"PRIi64", %d", asm_name(var), var->ty->size, align);
return;
}
}
Expand All @@ -3972,7 +3976,7 @@ static void emit_data(Obj *var) {
Printstrf(" .section .%s", var->init_data ? "data" : "bss");

if (opt_data_sections)
Printstrf(".\"%s\"", var->name);
Printstrf(".\"%s\"", asm_name(var));

if (var->is_tls)
Printstr(",\"awT\"");
Expand All @@ -3986,9 +3990,9 @@ static void emit_data(Obj *var) {
else
println(",@progbits");

println(" .size \"%s\", %"PRIi64, var->name, var->ty->size);
println(" .size \"%s\", %"PRIi64, asm_name(var), var->ty->size);
println(" .align %d", align);
println("\"%s\":", var->name);
println("\"%s\":", asm_name(var));

if (!var->init_data) {
println(" .zero %"PRIi64, var->ty->size);
Expand Down Expand Up @@ -4047,11 +4051,11 @@ void emit_text(Obj *fn) {
emit_symbol(fn);

if (opt_func_sections)
println(" .section .text.\"%s\",\"ax\",@progbits", fn->name);
println(" .section .text.\"%s\",\"ax\",@progbits", asm_name(fn));
else
println(" .text");
println(" .type \"%s\", @function", fn->name);
println("\"%s\":", fn->name);
println(" .type \"%s\", @function", asm_name(fn));
println("\"%s\":", asm_name(fn));

bool rtn_by_stk = fn->ty->return_ty->size > 16;
int gp_count = rtn_by_stk;
Expand Down Expand Up @@ -4162,12 +4166,12 @@ void emit_text(Obj *fn) {
insrtln(" sub $%d, %%rsp", stack_alloc_loc, align_to(peak_stk_usage, 16));

// Epilogue
gen_label_ph(rtn_label, !strcmp(fn->name, "main"));
gen_label_ph(rtn_label, !strcmp(asm_name(fn), "main"));
if (lvar_align > 16)
println(" mov -8(%%rbp), %%rbx");
println(" leave");
println(" ret");
println(" .size \"%s\", .-\"%s\"", fn->name, fn->name);
println(" .size \"%s\", .-\"%s\"", asm_name(fn), asm_name(fn));
}

typedef struct {
Expand Down
Loading

0 comments on commit 8b816e5

Please sign in to comment.