DWARF2 debugging (almost) working
Stack pointer setup is removed since it is already set to 0x3FF for the STM8S003F3/K3, according to the datasheet.
This commit is contained in:
parent
9d2f975be4
commit
4de313f145
|
@ -402,7 +402,7 @@ err_no_line:
|
|||
|
||||
static const ASM_MAPPING _gas_mapping[] = {
|
||||
{"labeldef", "%s:"},
|
||||
{"slabeldef", "%s:"},
|
||||
{"slabeldef", ".%s:"},
|
||||
{"tlabeldef", "%05d$:"},
|
||||
{"tlabel", "%05d$"},
|
||||
{"immed", "#"},
|
||||
|
@ -449,6 +449,7 @@ static const ASM_MAPPING _gas_mapping[] = {
|
|||
{"hihihil", "(%05d$ >> 24)"},
|
||||
{"equ", "="},
|
||||
{"org", ".org 0x%04X"},
|
||||
{"noload", ", \"\""},
|
||||
{0}
|
||||
};
|
||||
|
||||
|
@ -501,6 +502,7 @@ static const ASM_MAPPING _asxxxx_mapping[] = {
|
|||
{"hihihil", "(%05d$ >> 24)"},
|
||||
{"equ", "="},
|
||||
{"org", ".org 0x%04X"},
|
||||
{"noload", "(NOLOAD)"},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
@ -553,6 +555,7 @@ static const ASM_MAPPING _asxxxx_smallpdk_mapping[] = {
|
|||
{"hihihil", "(%05d$ >> 24)"},
|
||||
{"equ", "="},
|
||||
{"org", ".org 0x%04X"},
|
||||
{"noload", "(NOLOAD)"},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
@ -605,6 +608,7 @@ static const ASM_MAPPING _a390_mapping[] = {
|
|||
{"hihihil", "((L%09d / 16777216) & 0FFh)"},
|
||||
{"equ", " equ"},
|
||||
{"org", ".org 0x%04X"},
|
||||
{"noload", "(NOLOAD)"},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
|
|
@ -49,6 +49,7 @@ int dwWriteALine (const char *module, int Line);
|
|||
int dwWriteFrameAddress (const char *variable, struct reg_info *reg, int offset);
|
||||
int dwWriteBasicSymbol (symbol *sym, int isStructSym, int isFunc);
|
||||
|
||||
#define LOCAL_LABEL(str) "." str
|
||||
|
||||
DEBUGFILE dwarf2DebugFile =
|
||||
{
|
||||
|
@ -101,7 +102,7 @@ dwNewDebugSymbol (void)
|
|||
char debugSym[SDCC_NAME_MAX];
|
||||
|
||||
if (options.gasOutput)
|
||||
sprintf (debugSym, "%s_%s_%d$", dwModuleName, currFunc->name, dwDebugSymbol);
|
||||
sprintf (debugSym, LOCAL_LABEL("L%s_%s_%d"), dwModuleName, currFunc->name, dwDebugSymbol);
|
||||
else
|
||||
sprintf (debugSym, "S%s$%s$%d", dwModuleName, currFunc->name, dwDebugSymbol);
|
||||
|
||||
|
@ -729,7 +730,7 @@ dwWriteLocLists (void)
|
|||
dwlocregion * lrp;
|
||||
dwloclist * llp;
|
||||
|
||||
tfprintf (dwarf2FilePtr, "\n\t!area\n", ".debug_loc (NOLOAD)");
|
||||
tfprintf (dwarf2FilePtr, "\n\t!area!noload\n", ".debug_loc");
|
||||
tfprintf (dwarf2FilePtr, "!slabeldef\n", "Ldebug_loc_start");
|
||||
|
||||
llp = dwRootLocList;
|
||||
|
@ -1007,7 +1008,7 @@ dwWriteAttr (dwattr * ap)
|
|||
break;
|
||||
case DW_AT_location:
|
||||
case DW_AT_frame_base:
|
||||
dwWriteWord ("Ldebug_loc_start", ap->val.loclist->baseOffset, NULL);
|
||||
dwWriteWord (LOCAL_LABEL ("Ldebug_loc_start"), ap->val.loclist->baseOffset, NULL);
|
||||
break;
|
||||
default:
|
||||
dwWriteWord (NULL, ap->val.data, NULL);
|
||||
|
@ -1345,7 +1346,7 @@ dwWriteAbbrevs (void)
|
|||
dwattr * ap;
|
||||
int key;
|
||||
|
||||
tfprintf (dwarf2FilePtr, "\n\t!area\n", ".debug_abbrev (NOLOAD)");
|
||||
tfprintf (dwarf2FilePtr, "\n\t!area!noload\n", ".debug_abbrev");
|
||||
tfprintf (dwarf2FilePtr, "!slabeldef\n", "Ldebug_abbrev");
|
||||
|
||||
tp = hTabFirstItem (dwAbbrevTable, &key);
|
||||
|
@ -1411,15 +1412,15 @@ dwWriteTag (dwtag *tp, void *info)
|
|||
static void
|
||||
dwWriteTags (void)
|
||||
{
|
||||
tfprintf (dwarf2FilePtr, "\n\t!area\n", ".debug_info (NOLOAD)");
|
||||
tfprintf (dwarf2FilePtr, "\n\t!area!noload\n", ".debug_info");
|
||||
|
||||
dwWriteWordDelta ("Ldebug_info_end", "Ldebug_info_start");
|
||||
dwWriteWordDelta (LOCAL_LABEL ("Ldebug_info_end"), LOCAL_LABEL ("Ldebug_info_start"));
|
||||
|
||||
tfprintf (dwarf2FilePtr, "!slabeldef\n", "Ldebug_info_start");
|
||||
|
||||
dwWriteHalf (NULL, 2, NULL); /* DWARF version */
|
||||
|
||||
dwWriteWord ("Ldebug_abbrev", 0, NULL);
|
||||
dwWriteWord (LOCAL_LABEL ("Ldebug_abbrev"), 0, NULL);
|
||||
|
||||
dwWriteByte (NULL, port->debugger.dwarf.addressSize, NULL);
|
||||
|
||||
|
@ -1528,16 +1529,15 @@ dwWritePubnames (void)
|
|||
dwattr * ap1;
|
||||
dwattr * ap2;
|
||||
|
||||
tfprintf (dwarf2FilePtr, "\n\t!area\n", ".debug_pubnames (NOLOAD)");
|
||||
tfprintf (dwarf2FilePtr, "\n\t!area!noload\n", ".debug_pubnames");
|
||||
|
||||
dwWriteWordDelta ("Ldebug_pubnames_end", "Ldebug_pubnames_start");
|
||||
dwWriteWordDelta (LOCAL_LABEL ("Ldebug_pubnames_end"), LOCAL_LABEL ("Ldebug_pubnames_start"));
|
||||
|
||||
tfprintf (dwarf2FilePtr, "!slabeldef\n", "Ldebug_pubnames_start");
|
||||
|
||||
dwWriteHalf (NULL, 2, NULL); /* DWARF version */
|
||||
|
||||
dwWriteWord ("Ldebug_info_start-4", 0, NULL);
|
||||
dwWriteWordDelta ("4+Ldebug_info_end", "Ldebug_info_start");
|
||||
dwWriteWord (LOCAL_LABEL ("Ldebug_info_start")"-4", 0, NULL);
|
||||
dwWriteWordDelta ("4+"LOCAL_LABEL ("Ldebug_info_end"), LOCAL_LABEL ("Ldebug_info_start"));
|
||||
|
||||
if (dwRootTag && dwRootTag->firstChild)
|
||||
{
|
||||
|
@ -1754,15 +1754,15 @@ dwWriteLineNumbers (void)
|
|||
dwfile * srcfile;
|
||||
dwline * lp;
|
||||
|
||||
tfprintf (dwarf2FilePtr, "\n\t!area\n", ".debug_line (NOLOAD)");
|
||||
tfprintf (dwarf2FilePtr, "\n\t!area!noload\n", ".debug_line");
|
||||
|
||||
dwWriteWordDelta ("Ldebug_line_end", "Ldebug_line_start");
|
||||
dwWriteWordDelta (LOCAL_LABEL ("Ldebug_line_end"), LOCAL_LABEL ("Ldebug_line_start"));
|
||||
|
||||
tfprintf (dwarf2FilePtr, "!slabeldef\n", "Ldebug_line_start");
|
||||
|
||||
dwWriteHalf (NULL, 2, NULL); /* DWARF version */
|
||||
|
||||
dwWriteWordDelta ("Ldebug_line_stmt-6", "Ldebug_line_start");
|
||||
dwWriteWordDelta (LOCAL_LABEL ("Ldebug_line_stmt") "-6", LOCAL_LABEL ("Ldebug_line_start"));
|
||||
|
||||
dwWriteByte (NULL, 1, NULL); /* we track everything in 1 byte increments */
|
||||
|
||||
|
@ -1974,12 +1974,13 @@ dwGenCFIins (int callsize, int id)
|
|||
int i;
|
||||
char s[32];
|
||||
|
||||
tfprintf (dwarf2FilePtr, "\n\t!area\n", ".debug_frame (NOLOAD)");
|
||||
tfprintf (dwarf2FilePtr, "\n\t!area!noload\n", ".debug_frame");
|
||||
|
||||
/* FIXME: these two dw should be combined into a dd */
|
||||
tfprintf (dwarf2FilePtr, "\t!dw\t0\n");
|
||||
tfprintf (dwarf2FilePtr, "\t!dw\t");
|
||||
tfprintf (dwarf2FilePtr, "Ldebug_CIE%d_end-Ldebug_CIE%d_start\n", id, id);
|
||||
|
||||
tfprintf (dwarf2FilePtr, "4+" LOCAL_LABEL ("Ldebug_CIE")"%d_end-" LOCAL_LABEL ("Ldebug_CIE") "%d_start\n", id, id);
|
||||
|
||||
snprintf(s, sizeof(s), "Ldebug_CIE%d_start", id);
|
||||
tfprintf (dwarf2FilePtr, "!slabeldef\n", s);
|
||||
|
@ -2060,7 +2061,7 @@ dwWriteFDE (dwfde * fp, int id)
|
|||
|
||||
//CIE ptr
|
||||
char s[32];
|
||||
snprintf(s, sizeof(s), "Ldebug_CIE%d_start-4", id);
|
||||
snprintf(s, sizeof(s), LOCAL_LABEL ("Ldebug_CIE") "%d_start-4", id);
|
||||
dwWriteWord (s, 0, NULL);
|
||||
|
||||
//initial loc
|
||||
|
@ -2799,7 +2800,6 @@ dwWriteSymbolInternal (symbol *sym)
|
|||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* dwWriteFunction - generate a tag for a function. */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
@ -2884,10 +2884,14 @@ dwWriteEndFunction (symbol *sym, iCode *ic, int offset)
|
|||
dwLineLast->end_sequence = 1;
|
||||
}
|
||||
|
||||
if (IS_STATIC (sym->etype))
|
||||
sprintf (debugSym, "XF%s$%s$0$0", dwModuleName, sym->name);
|
||||
if (!options.gasOutput)
|
||||
if (IS_STATIC (sym->etype))
|
||||
sprintf (debugSym, "XF%s$%s$0$0", dwModuleName, sym->name);
|
||||
else
|
||||
sprintf (debugSym, "XG$%s$0$0", sym->name);
|
||||
else
|
||||
sprintf (debugSym, "XG$%s$0$0", sym->name);
|
||||
sprintf (debugSym, LOCAL_LABEL("L%s_%sendf"), dwModuleName, sym->name);
|
||||
|
||||
emitDebuggerSymbol (debugSym);
|
||||
|
||||
dwAddTagAttr (dwFuncTag, dwNewAttrAddrLabel (DW_AT_high_pc,
|
||||
|
@ -3035,7 +3039,7 @@ dwWriteModule (const char *name)
|
|||
dwAddTagAttr (tp, dwNewAttrString (DW_AT_name, fullSrcFileName));
|
||||
|
||||
dwAddTagAttr (tp, dwNewAttrLabelRef (DW_AT_stmt_list,
|
||||
"Ldebug_line_start", -4));
|
||||
LOCAL_LABEL ("Ldebug_line_start"), -4));
|
||||
|
||||
dwRootTag = tp;
|
||||
|
||||
|
|
|
@ -2512,26 +2512,15 @@ glue (void)
|
|||
/* create the stack segment MOF */
|
||||
if (mainf && IFFUNC_HASBODY (mainf->type))
|
||||
{
|
||||
const char *const start_stack = "__start__stack";
|
||||
const unsigned int size = 1;
|
||||
|
||||
fprintf (asmFile, "%s", iComments2);
|
||||
fprintf (asmFile, "; Stack segment in internal ram \n");
|
||||
fprintf (asmFile, "%s", iComments2);
|
||||
|
||||
if (options.gasOutput)
|
||||
{
|
||||
char section_name[100];
|
||||
|
||||
snprintf( section_name, sizeof section_name / sizeof *section_name,
|
||||
".%s", start_stack);
|
||||
/* Set alloc/write flags. */
|
||||
tfprintf(asmFile, "\t!area , \"aw\"\n", section_name);
|
||||
tfprintf(asmFile, "\t!local\n", start_stack);
|
||||
tfprintf(asmFile, "\t!comm\n\n", start_stack, size, 1);
|
||||
}
|
||||
else
|
||||
if (!options.gasOutput)
|
||||
{
|
||||
const char *const start_stack = "__start__stack";
|
||||
tfprintf(asmFile, "\t!area\n", "SSEG");
|
||||
tfprintf(asmFile, "\t!labeldef\n", start_stack);
|
||||
tfprintf(asmFile, "\t!ds\n\n", size);
|
||||
|
|
|
@ -334,7 +334,8 @@ newSymbol (const char *name, long scope)
|
|||
sym->for_newralloc = 0;
|
||||
sym->isinscope = 1;
|
||||
sym->usl.spillLoc = 0;
|
||||
sym->funcDivFlagSafe = 0;
|
||||
#warning Please check this
|
||||
sym->funcDivFlagSafe = 1;
|
||||
sym->funcUsesVolatile = 1;
|
||||
|
||||
return sym;
|
||||
|
@ -4407,7 +4408,7 @@ initCSupport (void)
|
|||
dbuf_init (&dbuf, 128);
|
||||
dbuf_printf (&dbuf, "_%s%s%s", srlrr[slsr], ssu[su * 3], sbwd[bwd]);
|
||||
rlrr[slsr][bwd][su] = sym =
|
||||
funcOfTypeVarg (_mangleFunctionName (dbuf_c_str (&dbuf)),
|
||||
funcOfTypeVarg (_mangleFunctionName (dbuf_c_str (&dbuf)),
|
||||
sbwdCodes[bwd + 4*su], 2, ¶ms[0]);
|
||||
FUNC_ISREENT (sym->type) = options.intlong_rent ? 1 : 0;
|
||||
FUNC_NONBANKED (sym->type) = 1;
|
||||
|
|
|
@ -3385,16 +3385,6 @@ genFunction (iCode *ic)
|
|||
emit2 (";", " function %s", sym->name);
|
||||
emit2 (";", "-----------------------------------------");
|
||||
|
||||
/* Place each new function into its own section so GNU ld
|
||||
* can perform dead code elimination via --gc-sections. */
|
||||
if (options.function_sections && options.gasOutput)
|
||||
{
|
||||
char name[256];
|
||||
|
||||
snprintf(name, sizeof name, "%s.%s", CODE_NAME, sym->name);
|
||||
emit2(".section", " %s", name);
|
||||
}
|
||||
|
||||
D (emit2 (";", stm8_assignment_optimal ? "Register assignment is optimal." : "Register assignment might be sub-optimal."));
|
||||
D (emit2 (";", "Stack space usage: %d bytes.", sym->stack));
|
||||
|
||||
|
@ -8200,6 +8190,16 @@ genSTM8Code (iCode *lic)
|
|||
int cln = 0;
|
||||
regalloc_dry_run = FALSE;
|
||||
|
||||
/* Place each new function into its own section so GNU ld
|
||||
* can perform dead code elimination via --gc-sections. */
|
||||
if (options.function_sections && options.gasOutput && currFunc)
|
||||
{
|
||||
char name[256];
|
||||
|
||||
snprintf(name, sizeof name, "%s.%s", CODE_NAME, currFunc->rname);
|
||||
emit2(".section", " %s", name);
|
||||
}
|
||||
|
||||
/* if debug information required */
|
||||
if (options.debug && currFunc && !regalloc_dry_run)
|
||||
debugFile->writeFunction (currFunc, lic);
|
||||
|
|
Loading…
Reference in New Issue