* src/pic16/ralloc.c (newReg): fixed bug #908929
[fw/sdcc] / src / pic16 / ralloc.c
index 0a7a9413de5ba58ad915d50d6fccabad96a14d9d..2ffbce10884f624d012649ece12b84f3754c8d3e 100644 (file)
@@ -384,7 +384,8 @@ regs* newReg(short type, short pc_type, int rIdx, char *name, int size, int alia
        dReg->reglives.assignedpFlows = newSet();
        dReg->regop = refop;
   
-       hTabAddItem(&dynDirectRegNames, regname2key(name), dReg);
+       if(!(type == REG_SFR && alias == 0x80))
+               hTabAddItem(&dynDirectRegNames, regname2key(name), dReg);
 
   return dReg;
 }
@@ -566,11 +567,21 @@ pic16_allocDirReg (operand *op )
 
        if(!IS_SYMOP(op)) {
                debugLog ("%s BAD, op is NULL\n", __FUNCTION__);
+//             fprintf(stderr, "%s BAD, op is NULL\n", __FUNCTION__);
          return NULL;
        }
 
        name = OP_SYMBOL (op)->rname[0] ? OP_SYMBOL (op)->rname : OP_SYMBOL (op)->name;
 
+       if(!SPEC_OCLS( OP_SYM_ETYPE(op))) {                                                                     // patch 13
+               if(pic16_debug_verbose)                                                                         //
+               {                                                                                               //
+                       fprintf(stderr, "%s:%d symbol %s(r:%s) is not assigned to a memmap\n", __FILE__, __LINE__,      //
+                               OP_SYMBOL(op)->name, OP_SYMBOL(op)->rname);                                                             //
+               }                                                                                               //
+               return NULL;                                                                                    //
+       }                                                                                                       // patch 13
+
        debugLog ("%s symbol name %s\n", __FUNCTION__,name);
 //     fprintf(stderr, "%s symbol name %s\n", __FUNCTION__,name);
 
@@ -638,6 +649,7 @@ pic16_allocDirReg (operand *op )
                        if(pic16_debug_verbose)
                                fprintf(stderr, "%s:%d symbol %s in codespace\n", __FILE__, __LINE__,
                                        OP_SYMBOL(op)->name);
+                       debugLog("%s:%d sym: %s in codespace\n", __FUNCTION__, __LINE__, OP_SYMBOL(op)->name);
                  return NULL;
                }
 
@@ -646,6 +658,15 @@ pic16_allocDirReg (operand *op )
 
                        if(SPEC_SCLS(OP_SYM_ETYPE(op)))regtype = REG_SFR;
        
+                       if(!IN_DIRSPACE( SPEC_OCLS( OP_SYM_ETYPE(op)))) {                                               // patch 13
+                               if(pic16_debug_verbose)                                                                 //
+                               {                                                                                       //
+                                       fprintf(stderr, "%s:%d symbol %s NOT in dirspace\n", __FILE__, __LINE__,        //
+                                               OP_SYMBOL(op)->name);                                                   //
+                               }                                                                                       //
+//                             return NULL;                                                                            //
+                       }                                                                                               // patch 13
+
                        reg = newReg(regtype, PO_DIR, rDirectIdx++, name,getSize (OP_SYMBOL (op)->type),0, op);
                        debugLog ("%d  -- added %s to hash, size = %d\n", __LINE__, name,reg->size);
 
@@ -676,6 +697,12 @@ pic16_allocDirReg (operand *op )
        if (SPEC_ABSA ( OP_SYM_ETYPE(op)) ) {
                reg->isFixed = 1;
                reg->address = SPEC_ADDR ( OP_SYM_ETYPE(op));
+
+               /* work around for user defined registers in access bank */
+               if((reg->address < 0x80)
+                       || (reg->address >= 0xf80))
+                       reg->accessBank = 1;
+               
                debugLog ("  -- and it is at a fixed address 0x%02x\n",reg->address);
        }
 
@@ -726,6 +753,7 @@ regs *pic16_typeRegWithIdx (int idx, int type, int fixed)
   regs *dReg;
 
   debugLog ("%s - requesting index = 0x%x\n", __FUNCTION__,idx);
+//  fprintf(stderr, "%s - requesting index = 0x%x\n", __FUNCTION__, idx);
 
   switch (type) {
 
@@ -793,6 +821,7 @@ pic16_allocWithIdx (int idx)
   regs *dReg;
 
   debugLog ("%s - allocating with index = 0x%x\n", __FUNCTION__,idx);
+//  fprintf(stderr, "%s - allocating with index = 0x%x\n", __FUNCTION__,idx);
 
   if( (dReg = regWithIdx ( pic16_dynAllocRegs, idx,0)) != NULL) {
 
@@ -928,6 +957,7 @@ extern void pic16_dump_equates(FILE *of, set *equs);
 //extern void pic16_dump_map(void);
 extern void pic16_dump_section(FILE *of, set *section, int fix);
 extern void pic16_dump_int_registers(FILE *of, set *section);
+extern void pic16_dump_idata(FILE *of, set *idataSymSet);
 
 static void packBits(set *bregs)
 {
@@ -1081,14 +1111,17 @@ void pic16_writeUsedRegs(FILE *of)
 
        /* dump equates */
        pic16_dump_equates(of, pic16_equ_data);
-       
+
+       /* dump initialised data */
+       pic16_dump_idata(of, idataSymSet);
+
        /* dump internal registers */
        pic16_dump_int_registers(of, pic16_int_regs);
        
        /* dump other variables */
        pic16_dump_section(of, pic16_rel_udata, 0);
        pic16_dump_section(of, pic16_fix_udata, 1);
-
+       
 }
 
 #if 0
@@ -2563,8 +2596,9 @@ regTypeNum ()
 #else
     if(IS_CODEPTR (sym->type)) {
 #endif
-      debugLog ("  %d const pointer type requires %d registers, changing to 2\n",__LINE__,sym->nRegs);
-      sym->nRegs = 2;
+      // what IS this ???? (HJD)
+      debugLog ("  %d const pointer type requires %d registers, changing to 3\n",__LINE__,sym->nRegs); // patch 14
+      sym->nRegs = 3; // patch 14
     }
 
       if (sym->nRegs > 4) {
@@ -2985,6 +3019,17 @@ pack:
 
 }
 
+#if 1
+
+#define NO_packRegsForAccUse
+#define NO_packRegsForSupport
+#define NO_packRegsForOneuse
+#define NO_cast_peep
+
+#endif
+
+
+#ifndef NO_packRegsForSupport
 /*-----------------------------------------------------------------*/
 /* findAssignToSym : scanning backwards looks for first assig found */
 /*-----------------------------------------------------------------*/
@@ -3062,7 +3107,10 @@ findAssignToSym (operand * op, iCode * ic)
 
 
 }
+#endif
+
 
+#ifndef NO_packRegsForSupport
 /*-----------------------------------------------------------------*/
 /* packRegsForSupport :- reduce some registers for support calls   */
 /*-----------------------------------------------------------------*/
@@ -3140,10 +3188,12 @@ right:
 
   return change;
 }
+#endif
 
-#define IS_OP_RUONLY(x) (x && IS_SYMOP(x) && OP_SYMBOL(x)->ruonly)
 
+#define IS_OP_RUONLY(x) (x && IS_SYMOP(x) && OP_SYMBOL(x)->ruonly)
 
+#ifndef NO_packRegsForOneuse
 /*-----------------------------------------------------------------*/
 /* packRegsForOneuse : - will reduce some registers for single Use */
 /*-----------------------------------------------------------------*/
@@ -3273,6 +3323,8 @@ packRegsForOneuse (iCode * ic, operand * op, eBBlock * ebp)
   return sic;
 
 }
+#endif
+
 
 /*-----------------------------------------------------------------*/
 /* isBitwiseOptimizable - requirements of JEAN LOUIS VERN          */
@@ -3304,6 +3356,9 @@ isBitwiseOptimizable (iCode * ic)
     return FALSE;
 }
 
+
+#ifndef NO_packRegsForAccUse
+
 /*-----------------------------------------------------------------*/
 /* packRegsForAccUse - pack registers for acc use                  */
 /*-----------------------------------------------------------------*/
@@ -3460,6 +3515,8 @@ accuse:
 
 
 }
+#endif
+
 
 /*-----------------------------------------------------------------*/
 /* packForPush - hueristics to reduce iCode for pushing            */
@@ -3579,14 +3636,6 @@ static void isData(sym_link *sl)
 }
 
 
-/* set if conditional to 1 to disable optimizations */
-
-#define NO_packRegsForAccUse
-#if 0
-#define NO_packRegsForSupport
-#define NO_packRegsForOneuse
-//#define NO_cast_peep
-#endif
 /*--------------------------------------------------------------------*/
 /* pic16_packRegisters - does some transformations to reduce          */
 /*                   register pressure                                */
@@ -3613,7 +3662,8 @@ pic16_packRegisters (eBBlock * ebp)
 //             debugLog("%d\n", __LINE__);
        /* find assignment of the form TrueSym := iTempNN:1 */
        /* see BUGLOG0001 for workaround with the CAST - VR */
-       if ((ic->op == '=' || ic->op == CAST) && !POINTER_SET (ic))
+       if ( (ic->op == '=' || ic->op == CAST) && !POINTER_SET (ic) ) // patch 11
+//     if ( (ic->op == '=') && !POINTER_SET (ic) ) // patch 11
          change += packRegsForAssign (ic, ebp);
        /* debug stuff */
        if (ic->op == '=')
@@ -4037,6 +4087,10 @@ pic16_assignRegisters (eBBlock ** ebbs, int count)
   /* and serially allocate registers */
   serialRegAssign (ebbs, count);
 
+//  debugLog ("ebbs after serialRegAssign:\n");
+//  dumpEbbsToDebug (ebbs, count);
+
+
   //pic16_freeAllRegs();
 
   /* if stack was extended then tell the user */