X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fhc08%2Fmain.c;h=a86d3a127bdc1160baf373b2b9931b74e06a475a;hb=81cd49cd3298b973e88c4b9cdce1fa6f86a2f2b0;hp=c25636b2f71957b7f4d6b5775371c829bbf47232;hpb=7709397297c098d91f4e0745713ca6a39459adf2;p=fw%2Fsdcc diff --git a/src/hc08/main.c b/src/hc08/main.c index c25636b2..a86d3a12 100644 --- a/src/hc08/main.c +++ b/src/hc08/main.c @@ -12,6 +12,8 @@ void copyFile(FILE *dest, FILE *src); extern char * iComments2; +extern DEBUGFILE dwarf2DebugFile; +extern int dwarf2FinalizeFile(FILE *); static char _defaultRules[] = { @@ -49,7 +51,7 @@ static char *_hc08_keywords[] = }; -void hc08_assignRegisters (eBBlock ** ebbs, int count); +void hc08_assignRegisters (ebbIndex *); static int regParmFlg = 0; /* determine if we can register a parameter */ @@ -60,13 +62,13 @@ _hc08_init (void) } static void -_hc08_reset_regparm () +_hc08_reset_regparm (void) { regParmFlg = 0; } static int -_hc08_regparm (sym_link * l) +_hc08_regparm (sym_link * l, bool reentrant) { int size = getSize(l); @@ -99,6 +101,7 @@ _hc08_parseOptions (int *pargc, char **argv, int *i) if (!strcmp (argv[*i], "--out-fmt-elf")) { options.out_fmt = 2; + debugFile = &dwarf2DebugFile; return TRUE; } @@ -128,6 +131,7 @@ _hc08_finaliseOptions (void) port->mem.default_globl_map = data; } + istack->ptrType = FPOINTER; } static void @@ -135,7 +139,7 @@ _hc08_setDefaultOptions (void) { options.code_loc = 0x8000; options.data_loc = 0x80; - options.xdata_loc = 0x100; + options.xdata_loc = 0; /* 0 means immediately following data */ options.stack_loc = 0x7fff; options.out_fmt = 1; /* use motorola S19 output */ @@ -160,10 +164,13 @@ _hc08_genAssemblerPreamble (FILE * of) symbol *mainExists=newSymbol("main", 0); mainExists->block=0; - fprintf (of, "\t.area %s\n",port->mem.code_name); + fprintf (of, "\t.area %s\n",HOME_NAME); + fprintf (of, "\t.area GSINIT0 (CODE)\n"); fprintf (of, "\t.area %s\n",port->mem.static_name); fprintf (of, "\t.area %s\n",port->mem.post_static_name); + fprintf (of, "\t.area %s\n",CODE_NAME); fprintf (of, "\t.area %s\n",port->mem.xinit_name); + fprintf (of, "\t.area %s\n",port->mem.const_name); fprintf (of, "\t.area %s\n",port->mem.data_name); fprintf (of, "\t.area %s\n",port->mem.overlay_name); fprintf (of, "\t.area %s\n",port->mem.bit_name); @@ -193,7 +200,7 @@ _hc08_genAssemblerPreamble (FILE * of) fprintf (of, "\t.org\t0xfffe\n"); fprintf (of, "\t.dw\t%s", "__sdcc_gs_init_startup\n\n"); - fprintf (of, "\t.area GSINIT\n"); + fprintf (of, "\t.area GSINIT0\n"); fprintf (of, "__sdcc_gs_init_startup:\n"); if (options.stack_loc) { @@ -230,6 +237,15 @@ _hc08_genAssemblerPreamble (FILE * of) } } +static void +_hc08_genAssemblerEnd (FILE * of) +{ + if (options.out_fmt == 2 && options.debug) + { + dwarf2FinalizeFile (of); + } +} + static void _hc08_genExtraAreas (FILE * asmFile, bool mainExists) { @@ -329,6 +345,26 @@ oclsExpense (struct memmap *oclass) } +/*----------------------------------------------------------------------*/ +/* hc08_dwarfRegNum - return the DWARF register number for a register. */ +/* These are defined for the HC08 in "Motorola 8- and 16-bit Embedded */ +/* Application Binary Interface (M8/16EABI)" */ +/*----------------------------------------------------------------------*/ +static int +hc08_dwarfRegNum (regs * reg) +{ + switch (reg->rIdx) + { + case A_IDX: return 0; + case H_IDX: return 1; + case X_IDX: return 2; + case CND_IDX: return 17; + case SP_IDX: return 15; + } + return -1; +} + + /** $1 is always the basename. $2 is always the output file. @@ -389,6 +425,7 @@ PORT hc08_port = "CSEG (CODE)", "DSEG", NULL, /* "ISEG" */ + NULL, /* "PSEG" */ "XSEG", "BSEG", "RSEG", @@ -398,6 +435,7 @@ PORT hc08_port = "HOME (CODE)", "XISEG", // initialized xdata "XINIT", // a code copy of xiseg + "CONST (CODE)", // const_name - const data (code or not) NULL, NULL, 1 @@ -405,23 +443,50 @@ PORT hc08_port = { _hc08_genExtraAreas, NULL }, { - -1, 0, 4, 2, 0, 0 + -1, /* direction (-1 = stack grows down) */ + 0, /* bank_overhead (switch between register banks) */ + 4, /* isr_overhead */ + 2, /* call_overhead */ + 0, /* reent_overhead */ + 0 /* banked_overhead (switch between code banks) */ }, /* hc08 has an 8 bit mul */ { 1, -1 }, + { + hc08_emitDebuggerSymbol, + { + hc08_dwarfRegNum, + NULL, + NULL, + 4, /* addressSize */ + 14, /* regNumRet */ + 15, /* regNumSP */ + -1, /* regNumBP */ + 1, /* offsetSP */ + }, + }, + { + 256, /* maxCount */ + 2, /* sizeofElement */ + {8,16,32}, /* sizeofMatchJump[] */ + {8,16,32}, /* sizeofRangeCompare[] */ + 5, /* sizeofSubtract */ + 10, /* sizeofDispatch */ + }, "_", _hc08_init, _hc08_parseOptions, _hc08_options, + NULL, _hc08_finaliseOptions, _hc08_setDefaultOptions, hc08_assignRegisters, _hc08_getRegName, _hc08_keywords, _hc08_genAssemblerPreamble, - NULL, /* no genAssemblerEnd */ + _hc08_genAssemblerEnd, /* no genAssemblerEnd */ _hc08_genIVT, _hc08_genXINIT, NULL, /* genInitStartup */