/*-------------------------------------------------------------------------
- avrgen.c - source file for code generation for ATMEL AVR
+ gen.c - source file for code generation for ATMEL AVR
Written By - Sandeep Dutta . sandeep.dutta@usa.net (2000)
extern int avr_ptrRegReq;
extern int avr_nRegs;
-extern FILE *codeOutFile;
+extern struct dbuf_s *codeOutBuf;
#define RESULTONSTACK(x) \
(IC_RESULT(x) && IC_RESULT(x)->aop && \
IC_RESULT(x)->aop->type == AOP_STK )
else
vsprintf (lb, fmt, ap);
- while (isspace (*lbp))
+ while (isspace ((unsigned char)*lbp))
lbp++;
if (lbp && *lbp)
va_end (ap);
}
+/*-----------------------------------------------------------------*/
+/* avr_emitDebuggerSymbol - associate the current code location */
+/* with a debugger symbol */
+/*-----------------------------------------------------------------*/
+void
+avr_emitDebuggerSymbol (char * debugSym)
+{
+ _G.debugLine = 1;
+ emitcode ("", "%s ==.", debugSym);
+ _G.debugLine = 0;
+}
+
/*-----------------------------------------------------------------*/
/* hasInc - operand is incremented before any other use */
/*-----------------------------------------------------------------*/
return lic;
}
/* if the operand used or deffed */
- if (bitVectBitValue(OP_USES(op),lic->key) || ((unsigned) lic->defKey == op->key)) {
+ if (bitVectBitValue(OP_USES(op),lic->key) || (lic->defKey == op->key)) {
return NULL;
}
lic = lic->next;
b) has a spill location */
if (sym->isspilt || sym->nRegs == 0) {
+ asmop *oldAsmOp = NULL;
+
/* rematerialize it NOW */
if (sym->remat) {
sym->aop = op->aop = aop = aopForRemat (sym);
/* else spill location */
if (sym->usl.spillLoc && getSize(sym->type) != getSize(sym->usl.spillLoc->type)) {
/* force a new aop if sizes differ */
+ oldAsmOp = sym->usl.spillLoc->aop;
sym->usl.spillLoc->aop = NULL;
}
sym->aop = op->aop = aop =
aopForSym (ic, sym->usl.spillLoc, result);
+ if (getSize(sym->type) != getSize(sym->usl.spillLoc->type)) {
+ /* Don't reuse the new aop, go with the last one */
+ sym->usl.spillLoc->aop = oldAsmOp;
+ }
aop->size = getSize (sym->type);
return;
}
break;
case AOP_REG:
- if (toupper (*s) != 'R') {
+ if (toupper ((unsigned char)*s) != 'R') {
if (s == zero) {
emitcode ("clr", "%s",
aop->aopu.aop_reg[offset]->name);
case AOP_CRY:
/* if used only for a condition code check */
- assert (toupper (*s) == 'R');
+ assert (toupper ((unsigned char)*s) == 'R');
if (offset == 0) {
emitcode ("xrl", "r0,r0");
emitcode ("cpi", "%s,0", s);
genCall (iCode * ic)
{
- /* if send set is not empty the assign */
+ /* if send set is not empty then assign */
if (_G.sendSet) {
iCode *sic;
int rnum = 16;
return 0;
}
-#if defined(__BORLANDC__) || defined(_MSC_VER)
-#define STRCASECMP stricmp
-#else
-#define STRCASECMP strcasecmp
-#endif
-
/*-----------------------------------------------------------------*/
/* genFunction - generated code for function entry */
/*-----------------------------------------------------------------*/
if (IFFUNC_ISCRITICAL (sym->type))
emitcode ("sti", "");
+ if (options.debug && currFunc) {
+ debugFile->writeEndFunction (currFunc, ic, 1);
+ }
+
if (IFFUNC_ISISR (sym->type)) {
emitcode ("rti", "");
}
(int) floatFromVal (AOP (right)->aopu.
aop_lit);
int p2 = powof2 (lit);
- if (bitop == AVR_AND && p2) { /* right side is a power of 2 */
+ if (bitop == AVR_AND && (p2 >= 0)) { /* right side is a power of 2 */
l = aopGet (AOP (left), p2 / 8);
if (IC_TRUE (ifx)) {
emitcode ("sbrc", "%s,%d", l,
exit(1);
}
- sprintf(gpValStr, "#0x%d", gpVal);
+ sprintf(gpValStr, "#0x%x", gpVal);
aopPut (AOP (result), gpValStr, GPTRSIZE - 1);
}
goto release;
freeAsmop (IC_RESULT (ic), NULL, ic, TRUE);
}
+/*-----------------------------------------------------------------*/
+/* genDummyRead - generate code for dummy read of volatiles */
+/*-----------------------------------------------------------------*/
+static void
+genDummyRead (iCode * ic)
+{
+ emitcode ("; genDummyRead","");
+ emitcode ("; not implemented","");
+
+ ic = ic;
+}
+
/*-----------------------------------------------------------------*/
/* gen51Code - generate code for 8051 based controllers */
/*-----------------------------------------------------------------*/
recvCnt = 0;
/* print the allocation information */
if (allocInfo)
- printAllocInfo (currFunc, codeOutFile);
+ printAllocInfo (currFunc, codeOutBuf);
/* if debug information required */
- /* if (options.debug && currFunc) { */
- if (currFunc) {
- debugFile->writeFunction(currFunc);
- _G.debugLine = 1;
-/* emitcode ("", ".type %s,@function", currFunc->name); */
- _G.debugLine = 0;
+ if (options.debug && currFunc) {
+ debugFile->writeFunction (currFunc, lic);
}
/* stack pointer name */
spname = "sp";
if (cln != ic->lineno) {
if (options.debug) {
- _G.debugLine = 1;
- emitcode ("", "C$%s$%d$%d$%d ==.",
- FileBaseName (ic->filename),
- ic->lineno, ic->level, ic->block);
- _G.debugLine = 0;
+ debugFile->writeCLine (ic);
}
emitcode (";", "%s %d", ic->filename, ic->lineno);
cln = ic->lineno;
addSet (&_G.sendSet, ic);
break;
+ case DUMMY_READ_VOLATILE:
+ genDummyRead (ic);
+ break;
+
default:
ic = ic;
}
peepHole (&lineHead);
/* now do the actual printing */
- printLine (lineHead, codeOutFile);
+ printLine (lineHead, codeOutBuf);
return;
}