Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revise for self-hosting at commit 2b5d7b6 #89

Merged
merged 2 commits into from
Dec 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
696 changes: 336 additions & 360 deletions src/arm-codegen.c

Large diffs are not rendered by default.

23 changes: 17 additions & 6 deletions src/cfront.c
Original file line number Diff line number Diff line change
Expand Up @@ -1729,6 +1729,8 @@ void read_lvalue(lvalue_t *lvalue,
strcpy(vd->var_name, gen_name());
vd->init_val = 1;
side_effect[se_idx].dest = vd;
side_effect[se_idx].src0 = NULL;
side_effect[se_idx].src1 = NULL;
se_idx++;

side_effect[se_idx].op = lex_accept(T_increment) ? OP_add : OP_sub;
Expand All @@ -1744,15 +1746,17 @@ void read_lvalue(lvalue_t *lvalue,

if (lvalue->is_reference) {
side_effect[se_idx].op = OP_write;
side_effect[se_idx].src0 = vd;
side_effect[se_idx].dest = opstack_pop();
side_effect[se_idx].src1 = vd;
side_effect[se_idx].src0 = opstack_pop();
side_effect[se_idx].size = lvalue->size;
side_effect[se_idx].dest = NULL;
opstack_push(t);
se_idx++;
} else {
side_effect[se_idx].op = OP_assign;
side_effect[se_idx].src0 = vd;
side_effect[se_idx].dest = operand_stack[operand_stack_idx - 1];
side_effect[se_idx].src1 = NULL;
se_idx++;
}
} else {
Expand Down Expand Up @@ -1780,10 +1784,6 @@ void read_ternary_operation(block_t *parent, basic_block_t **bb)
if (!lex_accept(T_question))
return;

basic_block_t *n = bb_create(parent);
bb_connect(*bb, n, NEXT);
*bb = n;

/* ternary-operator */
ph1_ir = add_ph1_ir(OP_branch);
ph1_ir->dest = opstack_pop();
Expand Down Expand Up @@ -1849,6 +1849,7 @@ void read_ternary_operation(block_t *parent, basic_block_t **bb)
strcpy(vd->var_name, end_label);
ph1_ir->src0 = vd;

var->is_ternary_ret = 1;
opstack_push(var);
*bb = end_ternary;
}
Expand Down Expand Up @@ -2693,6 +2694,15 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)

strcpy(var_break->var_name, vd->var_name);
break_exit_idx--;

int i, dangling = 1;
for (i = 0; i < MAX_BB_PRED; i++)
if (switch_end->prev[i].bb)
dangling = 0;

if (dangling)
return NULL;

return switch_end;
}

Expand Down Expand Up @@ -2936,6 +2946,7 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
/* multiple (partial) declarations */
nv = require_var(parent);
read_partial_var_decl(nv, var); /* partial */
add_insn(parent, bb, OP_allocat, nv, NULL, NULL, 0, NULL);
add_symbol(bb, nv);
if (lex_accept(T_assign)) {
read_expr(parent, &bb);
Expand Down
16 changes: 9 additions & 7 deletions src/defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@
#define MAX_VAR_LEN 32
#define MAX_TYPE_LEN 32
#define MAX_PARAMS 8
#define MAX_LOCALS 900
#define MAX_LOCALS 1450
#define MAX_FIELDS 32
#define MAX_FUNCS 256
#define MAX_FUNC_TRIES 1536
#define MAX_BLOCKS 750
#define MAX_BLOCKS 900
#define MAX_TYPES 64
#define MAX_IR_INSTR 32768
#define MAX_BB_PRED 16
#define MAX_BB_PRED 128
#define MAX_BB_DOM_SUCC 64
#define MAX_GLOBAL_IR 256
#define MAX_LABEL 4096
Expand All @@ -37,6 +37,7 @@
#define MAX_CASES 128
#define MAX_NESTING 128
#define MAX_OPERAND_STACK_SIZE 32
#define MAX_ANALYSIS_STACK_SIZE 700
vacantron marked this conversation as resolved.
Show resolved Hide resolved

#define ELF_START 0x10000
#define PTR_SIZE 4
Expand Down Expand Up @@ -152,6 +153,7 @@ struct var {
rename_t rename;
ref_block_list_t ref_block_list; /* blocks which kill variable */
int consumed;
int is_ternary_ret;
};

typedef struct var var_t;
Expand Down Expand Up @@ -326,13 +328,13 @@ struct basic_block {
struct basic_block *idom;
struct basic_block *rpo_next;
struct basic_block *rpo_r_next;
var_t *live_gen[64];
var_t *live_gen[MAX_ANALYSIS_STACK_SIZE];
int live_gen_idx;
var_t *live_kill[64];
var_t *live_kill[MAX_ANALYSIS_STACK_SIZE];
int live_kill_idx;
var_t *live_in[64];
var_t *live_in[MAX_ANALYSIS_STACK_SIZE];
int live_in_idx;
var_t *live_out[64];
var_t *live_out[MAX_ANALYSIS_STACK_SIZE];
int live_out_idx;
int rpo;
int rpo_r;
Expand Down
1 change: 1 addition & 0 deletions src/globals.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ char *elf_header;
int elf_header_idx = 0;
int elf_header_len = 0x54; /* ELF fixed: 0x34 + 1 * 0x20 */
int elf_code_start;
int elf_data_start;
char *elf_symtab;
char *elf_strtab;
char *elf_section;
Expand Down
37 changes: 27 additions & 10 deletions src/reg-alloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -227,26 +227,39 @@ void reg_alloc()
global_insn = global_insn->next) {
ph2_ir_t *ir;
int dest, src0;
int sz;

switch (global_insn->opcode) {
case OP_allocat:
sz = global_insn->rd->is_ptr
? PTR_SIZE
: find_type(global_insn->rd->type_name)->size;
if (global_insn->rd->array_size) {
GLOBAL_FUNC.stack_size += (global_insn->rd->array_size * sz);
global_insn->rd->offset = GLOBAL_FUNC.stack_size;
GLOBAL_FUNC.stack_size += PTR_SIZE;
src0 = GLOBAL_FUNC.stack_size;
if (global_insn->rd->is_ptr)
GLOBAL_FUNC.stack_size +=
(PTR_SIZE * global_insn->rd->array_size);
else {
type_t *type = find_type(global_insn->rd->type_name);
GLOBAL_FUNC.stack_size +=
(global_insn->rd->array_size * type->size);
}

dest =
prepare_dest(GLOBAL_FUNC.fn->bbs, global_insn->rd, -1, -1);
ir = bb_add_ph2_ir(GLOBAL_FUNC.fn->bbs, OP_global_address_of);
ir->src0 = global_insn->rd->offset;
ir->src0 = src0;
ir->dest = dest;
spill_var(GLOBAL_FUNC.fn->bbs, global_insn->rd, dest);
} else {
global_insn->rd->offset = GLOBAL_FUNC.stack_size;
GLOBAL_FUNC.stack_size += sz;
if (global_insn->rd->is_ptr)
GLOBAL_FUNC.stack_size += PTR_SIZE;
else if (strcmp(global_insn->rd->type_name, "int") &&
strcmp(global_insn->rd->type_name, "char"))
GLOBAL_FUNC.stack_size +=
find_type(global_insn->rd->type_name)->size;
else
/* `char` is aligned to one byte for the convenience */
GLOBAL_FUNC.stack_size += 4;
}
break;
case OP_load_constant:
Expand All @@ -262,6 +275,9 @@ void reg_alloc()
ir->src0 = src0;
ir->dest = dest;
spill_var(GLOBAL_FUNC.fn->bbs, global_insn->rd, dest);
/* release the unused constant number in register manually */
REGS[src0].polluted = 0;
REGS[src0].var = NULL;
break;
default:
printf("Unsupported global operation\n");
Expand Down Expand Up @@ -331,6 +347,8 @@ void reg_alloc()
insn->rd->array_size == 0)
break;

insn->rd->offset = fn->func->stack_size;
fn->func->stack_size += PTR_SIZE;
src0 = fn->func->stack_size;

if (insn->rd->is_ptr)
Expand All @@ -343,9 +361,6 @@ void reg_alloc()
else
fn->func->stack_size += sz;

insn->rd->offset = fn->func->stack_size;
fn->func->stack_size += PTR_SIZE;

dest = prepare_dest(bb, insn->rd, -1, -1);
ir = bb_add_ph2_ir(bb, OP_address_of);
ir->src0 = src0;
Expand Down Expand Up @@ -444,6 +459,8 @@ void reg_alloc()
ir = bb_add_ph2_ir(bb, OP_assign);
ir->src0 = src0;
ir->dest = args++;
REGS[ir->dest].var = insn->rs1;
REGS[ir->dest].polluted = 0;
break;
case OP_call:
if (!find_func(insn->str)->num_params)
Expand Down
Loading