+2006-06-13 Vangelis Rokas <vrokas AT users.sourceforge.net>
+
+ * src/port.h (struct PORT): added field gp_tags, to hold the tag
+ value of generic pointers,
+ * src/avr/main.c,
+ src/ds390/main.c,
+ src/hc08/main.c,
+ src/izt/i186.c,
+ src/izt/tlcs900h.c,
+ src/mcs51/main.c,
+ src/pic/main.c,
+ src/pic16/main.c,
+ src/xa51/main.c,
+ src/z80/main.c: PORT structure, added elements for gp_tags field,
+ * src/SDCCsymt.h: replaced hardwired values of GPTYPE_* macros with
+ fields in the PORT structure of each port,
+ * src/SDCCast.c (decorateType): allow processing of generic pointers
+ for PIC16 port (FPTRSIZE equals GPTRSIZE), also set GPTYPE_NEAR for
+ S_FIXED symbols
+
2006-06-12 Maarten Brock <sourceforge.brock AT dse.nl>
* link/z80/lkgb.c,
unsigned int gptype = 0;
unsigned int addr = SPEC_ADDR (sym->etype);
- if (IS_GENPTR (LTYPE (tree)) && GPTRSIZE > FPTRSIZE)
+ if (IS_GENPTR (LTYPE (tree)) && ((GPTRSIZE > FPTRSIZE)
+ || TARGET_IS_PIC16) )
{
switch (SPEC_SCLS (sym->etype))
{
break;
default:
gptype = 0;
+
+ if(TARGET_IS_PIC16 && (SPEC_SCLS(sym->etype) == S_FIXED))
+ gptype = GPTYPE_NEAR;
}
addr |= gptype << (8*(GPTRSIZE - 1));
}
};
// values for first byte (or 3 most significant bits) of generic pointer.
+#if 0
#define GPTYPE_FAR 0x00
#define GPTYPE_NEAR 0x40
#define GPTYPE_XSTACK 0x60
#define GPTYPE_CODE 0x80
+#else
+#define GPTYPE_FAR (port->gp_tags.tag_far)
+#define GPTYPE_NEAR (port->gp_tags.tag_near)
+#define GPTYPE_XSTACK (port->gp_tags.tag_xstack)
+#define GPTYPE_CODE (port->gp_tags.tag_code)
+#endif
#define HASHTAB_SIZE 256
{
/* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
1, 2, 2, 4, 2, 2, 3, 1, 4, 4},
+
+ /* tags for generic pointers */
+ { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */
+
{
"XSEG",
"STACK",
/* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
1, 2, 2, 4, 1, 2, 3, 1, 4, 4
},
+
+ /* tags for generic pointers */
+ { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */
+
{
"XSEG (XDATA)",
"STACK (DATA)",
/* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
1, 2, 2, 4, 1, 3, 3, 1, 4, 4
},
+ /* tags for generic pointers */
+ { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */
+
{
"XSEG (XDATA)",
"STACK (DATA)",
/* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
1, 2, 2, 4, 1, 2, 3, 1, 4, 4
},
+
+ /* tags for generic pointers */
+ { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */
+
{
"XSEG (XDATA)",
"STACK (DATA)",
/* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
1, 2, 2, 4, 2, 2, 2, 1, 4, 4
},
+ /* tags for generic pointers */
+ { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */
+
{
"XSEG",
"STACK",
/* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
1, 2, 2, 4, 2, 2, 2, 1, 4, 4
},
+ /* tags for generic pointers */
+ { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */
+
{
".BSS",
".BSS",
/* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
1, 2, 2, 4, 2, 2, 2, 1, 4, 4
},
+ /* tags for generic pointers */
+ { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */
{
"XSEG (XDATA)",
"STACK (DATA)",
/* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
1, 2, 2, 4, 1, 2, 3, 1, 4, 4
},
+ /* tags for generic pointers */
+ { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */
{
"XSTK (PAG,XDATA)", // xstack_name
"STACK (DATA)", // istack_name
16f877)
*/
},
+ /* tags for generic pointers */
+ { 0x00, 0x00, 0x00, 0x80 }, /* far, near, xstack, code */
{
"XSEG (XDATA)",
"STACK (DATA)",
{
unsigned long lit=1;
operand *op;
-
+
op = IC_LEFT(ic);
// this fails for is_LitOp(op) (if op is an AOP_PCODE)
4, /* float */
4 /* max */
},
+
+ /* generic pointer tags */
+ {
+ 0x00, /* far */
+ 0x80, /* near */
+ 0x00, /* xstack */
+ 0x00 /* code */
+ },
+
{
"XSEG (XDATA)", // xstack
"STACK (DATA)", // istack
}
s;
+/** tags for far, near, xstack, code generic pointers */
+ struct
+ {
+ int tag_far;
+ int tag_near;
+ int tag_xstack;
+ int tag_code;
+ }
+ gp_tags;
+
/** memory regions related stuff */
struct
{
/* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
1, 2, 2, 4, 2, 2, 3, 1, 4, 4
},
+ /* tags for generic pointers */
+ { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */
{
"XSEG (XDATA)",
"STACK (XDATA)",
/* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
1, 2, 2, 4, 2, 2, 2, 1, 4, 4
},
+ /* tags for generic pointers */
+ { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */
{
"XSEG",
"STACK",
/* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
1, 2, 2, 4, 2, 2, 2, 1, 4, 4
},
+ /* tags for generic pointers */
+ { 0x00, 0x40, 0x60, 0x80 }, /* far, near, xstack, code */
{
"XSEG",
"STACK",