X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Favr%2Fgen.c;h=7c17501518f6b2e52645cd68e34217f0b4197c5f;hb=3062f96ccb55d1d05caf9c8782f4961f87b341ce;hp=7a453019833be0c989be7794495af7eaa1f473ca;hpb=f16c49a6cfb8c57d8b8ca9174a2b5256bcae07f1;p=fw%2Fsdcc diff --git a/src/avr/gen.c b/src/avr/gen.c index 7a453019..7c175015 100644 --- a/src/avr/gen.c +++ b/src/avr/gen.c @@ -1,5 +1,5 @@ /*------------------------------------------------------------------------- - 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) @@ -31,23 +31,6 @@ #include "SDCCglobl.h" #include "newalloc.h" -#ifdef HAVE_SYS_ISA_DEFS_H -#include -#else -#ifdef HAVE_MACHINE_ENDIAN_H -#include -#else -#ifdef HAVE_ENDIAN_H -#include -#else -#if !defined(__BORLANDC__) && !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__CYGWIN__) -#warning "Cannot determine ENDIANESS of this machine assuming LITTLE_ENDIAN" -#warning "If you running sdcc on an INTEL 80x86 Platform you are okay" -#endif -#endif -#endif -#endif - #include "common.h" #include "SDCCpeeph.h" #include "ralloc.h" @@ -82,7 +65,7 @@ static struct { 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 ) @@ -266,7 +249,7 @@ emitcode (char *inst, char *fmt, ...) else vsprintf (lb, fmt, ap); - while (isspace (*lbp)) + while (isspace ((unsigned char)*lbp)) lbp++; if (lbp && *lbp) @@ -278,6 +261,18 @@ emitcode (char *inst, char *fmt, ...) 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 */ /*-----------------------------------------------------------------*/ @@ -290,6 +285,7 @@ hasInc (operand *op, iCode *ic) int isize ; if (IS_BITVAR(retype)||!IS_PTR(type)) return NULL; + if (IS_AGGREGATE(type->next)) return NULL; isize = getSize(type->next); while (lic) { /* if operand of the form op = op + */ @@ -300,7 +296,7 @@ hasInc (operand *op, iCode *ic) 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; @@ -762,6 +758,8 @@ aopOp (operand * op, iCode * ic, bool result) 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); @@ -783,8 +781,17 @@ aopOp (operand * op, iCode * ic, bool result) } /* 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; } @@ -1041,7 +1048,7 @@ aopPut (asmop * aop, char *s, int offset) 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); @@ -1109,7 +1116,7 @@ aopPut (asmop * aop, char *s, int offset) 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); @@ -1545,7 +1552,7 @@ static void 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; @@ -1700,12 +1707,6 @@ resultRemat (iCode * ic) return 0; } -#if defined(__BORLANDC__) || defined(_MSC_VER) -#define STRCASECMP stricmp -#else -#define STRCASECMP strcasecmp -#endif - /*-----------------------------------------------------------------*/ /* genFunction - generated code for function entry */ /*-----------------------------------------------------------------*/ @@ -1827,6 +1828,10 @@ genEndFunction (iCode * ic) if (IFFUNC_ISCRITICAL (sym->type)) emitcode ("sti", ""); + if (options.debug && currFunc) { + debugFile->writeEndFunction (currFunc, ic, 1); + } + if (IFFUNC_ISISR (sym->type)) { emitcode ("rti", ""); } @@ -2675,7 +2680,7 @@ genBitWise (iCode * ic, iCode * ifx, int bitop) (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, @@ -4583,6 +4588,10 @@ genPointerSet (iCode * ic, iCode *pi) case GPOINTER: genGenPointerSet (right, result, ic, pi); break; + + default: + werror (E_INTERNAL_ERROR, __FILE__, __LINE__, + "genPointerSet: illegal pointer type"); } } @@ -4936,8 +4945,6 @@ genCast (iCode * ic) /* pointer to generic pointer */ if (IS_GENPTR (ctype)) { - char *l = zero; - if (IS_PTR (type)) p_type = DCL_TYPE (type); else { @@ -4953,30 +4960,22 @@ genCast (iCode * ic) aopGet (AOP (right), offset), offset); offset++; } - /* the last byte depending on type */ - switch (p_type) { - case IPOINTER: - case POINTER: - l = zero; - break; - case FPOINTER: - l = one; - break; - case CPOINTER: - l = "0x02"; - break; - case PPOINTER: - l = "0x03"; - break; - - default: - /* this should never happen */ - werror (E_INTERNAL_ERROR, __FILE__, __LINE__, - "got unknown pointer type"); - exit (1); + + /* the last byte depending on type */ + { + int gpVal = pointerTypeToGPByte(p_type, NULL, NULL); + char gpValStr[10]; + + if (gpVal == -1) + { + // pointerTypeToGPByte will have bitched. + exit(1); } - aopPut (AOP (result), l, GPTRSIZE - 1); - goto release; + + sprintf(gpValStr, "#0x%x", gpVal); + aopPut (AOP (result), gpValStr, GPTRSIZE - 1); + } + goto release; } /* just copy the pointers */ @@ -5104,6 +5103,18 @@ genReceive (iCode * ic) 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 */ /*-----------------------------------------------------------------*/ @@ -5117,14 +5128,10 @@ genAVRCode (iCode * lic) recvCnt = 0; /* print the allocation information */ if (allocInfo) - printAllocInfo (currFunc, codeOutFile); + printAllocInfo (currFunc, codeOutBuf); /* if debug information required */ - /* if (options.debug && currFunc) { */ - if (currFunc) { - cdbSymbol (currFunc, cdbFile, FALSE, TRUE); - _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"; @@ -5134,11 +5141,7 @@ genAVRCode (iCode * lic) 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; @@ -5335,6 +5338,10 @@ genAVRCode (iCode * lic) addSet (&_G.sendSet, ic); break; + case DUMMY_READ_VOLATILE: + genDummyRead (ic); + break; + default: ic = ic; } @@ -5347,6 +5354,6 @@ genAVRCode (iCode * lic) peepHole (&lineHead); /* now do the actual printing */ - printLine (lineHead, codeOutFile); + printLine (lineHead, codeOutBuf); return; }