Skip to content

Commit 36b58a0

Browse files
committed
Integrate function-related structures
Since the introduction of SSA middle end, there exists 2 different usage of function-related structures that is heavily coupled, but used under different scenarios. This causes unnecessary confusions to anyone who tries to understand it, and makes maintenance costly. In this patch, "func_t" and "fn_t" are now integrated into "func_t", and related variables are renamed into "func" instead of "fd" or "fn" to keep naming consistency and avoid confusions to previous structures. Additionally, few comments are refined, and unused label definitions removed to keep codebase tidy.
1 parent e104d70 commit 36b58a0

File tree

11 files changed

+251
-356
lines changed

11 files changed

+251
-356
lines changed

src/arm-codegen.c

Lines changed: 13 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -119,18 +119,13 @@ void update_elf_offset(ph2_ir_t *ph2_ir)
119119
case OP_return:
120120
elf_offset += 24;
121121
return;
122-
case OP_trunc:
123-
elf_offset += 4;
124-
return;
125-
case OP_sign_ext:
126-
elf_offset += 4;
127-
return;
128122
default:
129-
fatal("Unknown opcode");
123+
printf("Unknown opcode\n");
124+
abort();
130125
}
131126
}
132127

133-
void cfg_flatten(void)
128+
void cfg_flatten()
134129
{
135130
func_t *func = find_func("__syscall");
136131
func->bbs->elf_offset = 44; /* offset of start + exit in codegen */
@@ -184,7 +179,7 @@ void cfg_flatten(void)
184179

185180
void emit(int code)
186181
{
187-
elf_write_int(elf_code, code);
182+
elf_write_code_int(code);
188183
}
189184

190185
void emit_ph2_ir(ph2_ir_t *ph2_ir)
@@ -276,16 +271,16 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
276271
emit(__teq(rn));
277272
if (ph2_ir->is_branch_detached) {
278273
emit(__b(__NE, 8));
279-
emit(__b(__AL, ph2_ir->else_bb->elf_offset - elf_code->size));
274+
emit(__b(__AL, ph2_ir->else_bb->elf_offset - elf_code_idx));
280275
} else
281-
emit(__b(__NE, ph2_ir->then_bb->elf_offset - elf_code->size));
276+
emit(__b(__NE, ph2_ir->then_bb->elf_offset - elf_code_idx));
282277
return;
283278
case OP_jump:
284-
emit(__b(__AL, ph2_ir->next_bb->elf_offset - elf_code->size));
279+
emit(__b(__AL, ph2_ir->next_bb->elf_offset - elf_code_idx));
285280
return;
286281
case OP_call:
287282
func = find_func(ph2_ir->func_name);
288-
emit(__bl(__AL, func->bbs->elf_offset - elf_code->size));
283+
emit(__bl(__AL, func->bbs->elf_offset - elf_code_idx));
289284
return;
290285
case OP_load_data_address:
291286
emit(__movw(__AL, rd, ph2_ir->src0 + elf_data_start));
@@ -426,28 +421,13 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
426421
emit(__mov_i(__NE, rd, 0));
427422
emit(__mov_i(__EQ, rd, 1));
428423
return;
429-
case OP_trunc:
430-
if (rm == 1)
431-
rm = 0xFF;
432-
else if (rm == 2)
433-
rm = 0xFFFF;
434-
else if (rm == 4)
435-
rm = 0xFFFFFFFF;
436-
else
437-
fatal("Unsupported truncation operation with invalid target size");
438-
439-
emit(__and_i(__AL, rd, rn, rm));
440-
return;
441-
case OP_sign_ext:
442-
/* TODO: Allow to sign extends to other types */
443-
emit(__sxtb(__AL, rd, rn, 0));
444-
return;
445424
default:
446-
fatal("Unknown opcode");
425+
printf("Unknown opcode\n");
426+
abort();
447427
}
448428
}
449429

450-
void code_generate(void)
430+
void code_generate()
451431
{
452432
elf_data_start = elf_code_start + elf_offset;
453433

@@ -456,7 +436,7 @@ void code_generate(void)
456436
emit(__movt(__AL, __r8, GLOBAL_FUNC->stack_size));
457437
emit(__sub_r(__AL, __sp, __sp, __r8));
458438
emit(__mov_r(__AL, __r12, __sp));
459-
emit(__bl(__AL, GLOBAL_FUNC->bbs->elf_offset - elf_code->size));
439+
emit(__bl(__AL, GLOBAL_FUNC->bbs->elf_offset - elf_code_idx));
460440

461441
/* exit */
462442
emit(__movw(__AL, __r8, GLOBAL_FUNC->stack_size));
@@ -488,7 +468,7 @@ void code_generate(void)
488468
emit(__add_r(__AL, __r8, __r12, __r8));
489469
emit(__lw(__AL, __r0, __r8, 0));
490470
emit(__add_i(__AL, __r1, __r8, 4));
491-
emit(__b(__AL, MAIN_BB->elf_offset - elf_code->size));
471+
emit(__b(__AL, MAIN_BB->elf_offset - elf_code_idx));
492472

493473
for (int i = 0; i < ph2_ir_idx; i++) {
494474
ph2_ir = PH2_IR_FLATTEN[i];

src/defs.h

Lines changed: 35 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,12 @@ typedef enum {
205205
OP_load_data_address, /* lookup address of a constant in data section */
206206

207207
/* control flow */
208-
OP_branch, /* conditional jump */
209-
OP_jump, /* unconditional jump */
210-
OP_func_ret, /* returned value */
208+
OP_label,
209+
OP_branch, /* conditional jump */
210+
OP_jump, /* unconditional jump */
211+
OP_func_ret, /* returned value */
212+
OP_block_start, /* code block start */
213+
OP_block_end, /* code block end */
211214

212215
/* function pointer */
213216
OP_address_of_func, /* resolve function entry */
@@ -248,10 +251,6 @@ typedef enum {
248251
OP_bit_not,
249252
OP_negate,
250253

251-
/* data type conversion */
252-
OP_trunc,
253-
OP_sign_ext,
254-
255254
/* entry point of the state machine */
256255
OP_start
257256
} opcode_t;
@@ -280,17 +279,8 @@ typedef struct use_chain_node {
280279
struct use_chain_node *prev;
281280
} use_chain_t;
282281

283-
typedef struct var var_t;
284-
typedef struct type type_t;
285-
286-
typedef struct var_list {
287-
int capacity;
288-
int size;
289-
var_t **elements;
290-
} var_list_t;
291-
292282
struct var {
293-
type_t *type;
283+
char type_name[MAX_TYPE_LEN];
294284
char var_name[MAX_VAR_LEN];
295285
int is_ptr;
296286
bool is_func;
@@ -315,6 +305,8 @@ struct var {
315305
bool is_const; /* whether a constant representaion or not */
316306
};
317307

308+
typedef struct var var_t;
309+
318310
typedef struct {
319311
char name[MAX_VAR_LEN];
320312
bool is_variadic;
@@ -330,17 +322,36 @@ typedef struct func func_t;
330322

331323
/* block definition */
332324
struct block {
333-
var_list_t locals;
325+
var_t locals[MAX_LOCALS];
326+
int next_local;
334327
struct block *parent;
335328
func_t *func;
336329
macro_t *macro;
330+
int locals_size;
337331
struct block *next;
338332
};
339333

340334
typedef struct block block_t;
335+
336+
typedef struct {
337+
block_t *head;
338+
block_t *tail;
339+
} block_list_t;
340+
341+
/* phase-1 IR definition */
342+
typedef struct {
343+
opcode_t op;
344+
char func_name[MAX_VAR_LEN];
345+
int param_num;
346+
int size;
347+
var_t *dest;
348+
var_t *src0;
349+
var_t *src1;
350+
} ph1_ir_t;
351+
341352
typedef struct basic_block basic_block_t;
342353

343-
/* Definition of a growable buffer for a mutable null-terminated string
354+
/* Definition of a dynamic array structure for sources in src/globals.c
344355
* size: Current number of elements in the array
345356
* capacity: Number of elements that can be stored without resizing
346357
* elements: Pointer to the array of characters
@@ -349,7 +360,7 @@ typedef struct {
349360
int size;
350361
int capacity;
351362
char *elements;
352-
} strbuf_t;
363+
} source_t;
353364

354365
/* phase-2 IR definition */
355366
struct ph2_ir {
@@ -377,6 +388,8 @@ struct type {
377388
int num_fields;
378389
};
379390

391+
typedef struct type type_t;
392+
380393
/* lvalue details */
381394
typedef struct {
382395
int size;
@@ -456,10 +469,8 @@ struct basic_block {
456469
insn_list_t insn_list;
457470
ph2_ir_list_t ph2_ir_list;
458471
bb_connection_t prev[MAX_BB_PRED];
459-
char bb_label_name[MAX_VAR_LEN]; /* Used in instruction dumping when ir_dump
460-
is enabled. */
461-
struct basic_block *next; /* normal BB */
462-
struct basic_block *then_; /* conditional BB */
472+
struct basic_block *next; /* normal BB */
473+
struct basic_block *then_; /* conditional BB */
463474
struct basic_block *else_;
464475
struct basic_block *idom;
465476
struct basic_block *r_idom;
@@ -536,48 +547,3 @@ typedef struct {
536547
var_t *var;
537548
int polluted;
538549
} regfile_t;
539-
540-
/* FIXME: replace char[2] with a short data type in ELF header structures */
541-
/* ELF header */
542-
typedef struct {
543-
char e_ident[16];
544-
char e_type[2];
545-
char e_machine[2];
546-
int e_version;
547-
int e_entry;
548-
int e_phoff;
549-
int e_shoff;
550-
int e_flags;
551-
char e_ehsize[2];
552-
char e_phentsize[2];
553-
char e_phnum[2];
554-
char e_shentsize[2];
555-
char e_shnum[2];
556-
char e_shstrndx[2];
557-
} elf32_hdr_t;
558-
559-
/* ELF program header */
560-
typedef struct {
561-
int p_type;
562-
int p_offset;
563-
int p_vaddr;
564-
int p_paddr;
565-
int p_filesz;
566-
int p_memsz;
567-
int p_flags;
568-
int p_align;
569-
} elf32_phdr_t;
570-
571-
/* ELF section header */
572-
typedef struct {
573-
int sh_name;
574-
int sh_type;
575-
int sh_flags;
576-
int sh_addr;
577-
int sh_offset;
578-
int sh_size;
579-
int sh_link;
580-
int sh_info;
581-
int sh_addralign;
582-
int sh_entsize;
583-
} elf32_shdr_t;

0 commit comments

Comments
 (0)