2016-09-17 22:02:16 +00:00
|
|
|
#ifndef MCG_H
|
|
|
|
#define MCG_H
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <assert.h>
|
|
|
|
#include "em_arith.h"
|
|
|
|
#include "em_label.h"
|
|
|
|
#include "em.h"
|
|
|
|
#include "em_comp.h"
|
|
|
|
#include "em_pseu.h"
|
|
|
|
#include "em_mnem.h"
|
|
|
|
#include "em_flag.h"
|
|
|
|
#include "em_ptyp.h"
|
2016-09-18 21:24:54 +00:00
|
|
|
#include "array.h"
|
2016-09-23 21:59:15 +00:00
|
|
|
#include "map.h"
|
2016-09-18 21:24:54 +00:00
|
|
|
#include "ir.h"
|
2016-09-25 21:29:59 +00:00
|
|
|
#include "mcgg.h"
|
|
|
|
#include "hop.h"
|
2016-09-17 22:02:16 +00:00
|
|
|
|
|
|
|
extern char em_pseu[][4];
|
|
|
|
extern char em_mnem[][4];
|
|
|
|
extern char em_flag[];
|
|
|
|
|
2016-09-18 21:24:54 +00:00
|
|
|
enum {
|
|
|
|
SECTION_UNKNOWN = 0,
|
|
|
|
SECTION_ROM,
|
|
|
|
SECTION_DATA,
|
|
|
|
SECTION_BSS,
|
|
|
|
SECTION_TEXT
|
|
|
|
};
|
|
|
|
|
2016-09-19 21:06:59 +00:00
|
|
|
struct symbol
|
|
|
|
{
|
2016-09-18 21:24:54 +00:00
|
|
|
const char* name;
|
|
|
|
int section;
|
2016-09-23 23:04:00 +00:00
|
|
|
struct procedure* proc;
|
2016-09-18 21:24:54 +00:00
|
|
|
bool is_defined : 1;
|
|
|
|
bool is_exported : 1;
|
|
|
|
bool is_proc : 1;
|
|
|
|
};
|
|
|
|
|
2016-09-19 21:06:59 +00:00
|
|
|
enum
|
|
|
|
{
|
2016-09-18 21:24:54 +00:00
|
|
|
PARAM_NONE,
|
2016-09-19 21:06:59 +00:00
|
|
|
PARAM_IVALUE,
|
|
|
|
PARAM_LVALUE,
|
|
|
|
PARAM_BVALUE,
|
|
|
|
};
|
|
|
|
|
2016-09-25 10:29:03 +00:00
|
|
|
struct em
|
2016-09-19 21:06:59 +00:00
|
|
|
{
|
|
|
|
int opcode;
|
|
|
|
int paramtype;
|
|
|
|
union {
|
|
|
|
arith ivalue;
|
|
|
|
struct {
|
|
|
|
const char* label;
|
|
|
|
arith offset;
|
|
|
|
} lvalue;
|
|
|
|
struct {
|
|
|
|
struct basicblock* left;
|
|
|
|
struct basicblock* right;
|
|
|
|
} bvalue;
|
|
|
|
} u;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct procedure
|
|
|
|
{
|
|
|
|
const char* name;
|
|
|
|
struct basicblock* root_bb;
|
|
|
|
size_t nlocals;
|
|
|
|
ARRAY(struct basicblock, blocks);
|
2016-09-18 21:24:54 +00:00
|
|
|
};
|
|
|
|
|
2016-09-19 21:06:59 +00:00
|
|
|
struct basicblock
|
|
|
|
{
|
2016-09-18 21:24:54 +00:00
|
|
|
const char* name;
|
2016-09-25 10:29:03 +00:00
|
|
|
ARRAY(struct em, ems);
|
2016-09-18 21:24:54 +00:00
|
|
|
ARRAY(struct ir, irs);
|
2016-09-25 21:29:59 +00:00
|
|
|
ARRAY(struct hop, hops);
|
2016-09-23 21:59:15 +00:00
|
|
|
bool is_fake : 1;
|
2016-09-19 22:19:39 +00:00
|
|
|
bool is_root : 1;
|
2016-09-19 21:06:59 +00:00
|
|
|
bool is_terminated : 1;
|
2016-09-18 21:24:54 +00:00
|
|
|
};
|
2016-09-17 22:02:16 +00:00
|
|
|
|
|
|
|
extern void fatal(const char* s, ...);
|
2016-09-18 21:24:54 +00:00
|
|
|
extern const char* aprintf(const char* fmt, ...);
|
2016-09-21 22:15:48 +00:00
|
|
|
extern void tracef(char k, const char* fmt, ...);
|
|
|
|
extern bool tracing(char k);
|
2016-09-17 22:02:16 +00:00
|
|
|
|
|
|
|
extern void parse_em(void);
|
|
|
|
|
2016-09-18 21:24:54 +00:00
|
|
|
extern void symbol_init(void);
|
|
|
|
extern bool symbol_exists(const char* name);
|
|
|
|
extern struct symbol* symbol_get(const char* name);
|
|
|
|
extern void symbol_declare(const char* name, bool is_exported, bool is_proc);
|
|
|
|
|
2016-09-23 23:04:00 +00:00
|
|
|
typedef bool symbol_walker_t(struct symbol* symbol, void* user);
|
|
|
|
extern struct symbol* symbol_walk(symbol_walker_t* walker, void* user);
|
|
|
|
|
2016-09-18 21:24:54 +00:00
|
|
|
extern void data_label(const char* name);
|
|
|
|
extern void data_int(arith data, size_t size, bool is_ro);
|
|
|
|
extern void data_block(const uint8_t* data, size_t size, bool is_ro);
|
|
|
|
extern void data_offset(const char* label, arith offset, bool is_ro);
|
|
|
|
extern void data_bss(arith size, int init);
|
|
|
|
|
|
|
|
extern void bb_init(void);
|
|
|
|
extern struct basicblock* bb_get(const char* name);
|
|
|
|
extern void bb_alias(struct basicblock* block, const char* name);
|
2016-09-21 22:15:48 +00:00
|
|
|
extern void bb_print(char k, struct basicblock* block);
|
2016-09-18 21:24:54 +00:00
|
|
|
|
2016-09-17 22:02:16 +00:00
|
|
|
extern void tb_filestart(void);
|
|
|
|
extern void tb_fileend(void);
|
2016-09-19 21:06:59 +00:00
|
|
|
extern void tb_procedure(struct procedure* proc);
|
2016-09-17 22:02:16 +00:00
|
|
|
extern void tb_regvar(arith offset, int size, int type, int priority);
|
|
|
|
|
2016-09-23 19:07:16 +00:00
|
|
|
extern void pass_convert_stack_ops(struct procedure* proc);
|
|
|
|
extern void pass_remove_dead_blocks(struct procedure* proc);
|
2016-09-23 21:59:15 +00:00
|
|
|
extern void pass_eliminate_trivial_blocks(struct procedure* proc);
|
2016-09-24 20:46:08 +00:00
|
|
|
extern void pass_instruction_selector(struct procedure* proc);
|
2016-09-22 21:19:29 +00:00
|
|
|
|
2016-09-23 23:04:00 +00:00
|
|
|
extern void procedure_compile(struct procedure* proc);
|
2016-09-21 22:15:48 +00:00
|
|
|
|
2016-09-17 22:02:16 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* vim: set sw=4 ts=4 expandtab : */
|