2004-03-03 Hans Dorn <hjdorn AT users.sourceforge.net>
[fw/sdcc] / src / avr / gen.c
index 7a453019833be0c989be7794495af7eaa1f473ca..68eca463be1d66aa408c97230b59cff87579db25 100644 (file)
@@ -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)
 
 #include "SDCCglobl.h"
 #include "newalloc.h"
 
-#ifdef HAVE_SYS_ISA_DEFS_H
-#include <sys/isa_defs.h>
-#else
-#ifdef HAVE_MACHINE_ENDIAN_H
-#include <machine/endian.h>
-#else
-#ifdef HAVE_ENDIAN_H
-#include <endian.h>
-#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"
@@ -290,6 +273,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 + <sizeof *op> */
@@ -783,6 +767,10 @@ 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 */
+                   sym->usl.spillLoc->aop = NULL;
+               }
                sym->aop = op->aop = aop =
                        aopForSym (ic, sym->usl.spillLoc, result);
                aop->size = getSize (sym->type);
@@ -4583,6 +4571,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 +4928,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 +4943,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%d", gpVal);
+                       aopPut (AOP (result), gpValStr, GPTRSIZE - 1);
+                   }               
+                   goto release;
                }
 
                /* just copy the pointers */
@@ -5104,6 +5086,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            */
 /*-----------------------------------------------------------------*/
@@ -5121,7 +5115,7 @@ genAVRCode (iCode * lic)
        /* if debug information required */
        /*     if (options.debug && currFunc) { */
        if (currFunc) {
-               cdbSymbol (currFunc, cdbFile, FALSE, TRUE);
+               debugFile->writeFunction(currFunc);
                _G.debugLine = 1;
 /*             emitcode ("", ".type %s,@function", currFunc->name); */
                _G.debugLine = 0;
@@ -5335,6 +5329,10 @@ genAVRCode (iCode * lic)
                        addSet (&_G.sendSet, ic);
                        break;
 
+               case DUMMY_READ_VOLATILE:
+                       genDummyRead (ic);
+                       break;
+
                default:
                        ic = ic;
                }