pic16_printIvalChar (symbol *sym, sym_link * type, initList * ilist, char *s, char ptype, void *p)
{
value *val;
- int remain, len;
+ int remain, len, ilen;
if(!p)
return 0;
#endif
if(!s) {
+ /* length of initializer string (might contain \0, so do not use strlen) */
+ ilen = getNelements (type, ilist);
+
val = list2val (ilist);
/* if the value is a character string */
if(IS_ARRAY (val->type) && IS_CHAR (val->etype)) {
if(!DCL_ELEM (type))
- DCL_ELEM (type) = strlen (SPEC_CVAL (val->etype).v_char) + 1;
+ DCL_ELEM (type) = ilen;
/* len is 0 if declartion equals initializer,
* >0 if declaration greater than initializer
* if <0 then emit only the length of declaration elements
* and warn user
*/
- len = DCL_ELEM (type) - (strlen (SPEC_CVAL (val->etype).v_char)+1);
+ len = DCL_ELEM (type) - ilen;
-// fprintf(stderr, "%s:%d len = %i DCL_ELEM(type) = %i SPEC_CVAL-len = %i\n", __FILE__, __LINE__,
-// len, DCL_ELEM(type), strlen(SPEC_CVAL(val->etype).v_char));
+// fprintf(stderr, "%s:%d ilen = %i len = %i DCL_ELEM(type) = %i SPEC_CVAL-len = %i\n", __FILE__, __LINE__,
+// ilen, len, DCL_ELEM(type), strlen(SPEC_CVAL(val->etype).v_char));
- remain=0;
if(len >= 0) {
- for(remain=0; remain<strlen(SPEC_CVAL(val->etype).v_char)+1; remain++)
+ /* emit initializer */
+ for(remain=0; remain<ilen; remain++)
pic16_emitDB(SPEC_CVAL(val->etype).v_char[ remain ], ptype, p);
- if(len>0) {
- len -= remain;
+ /* fill array with 0x00 */
while(len--) {
pic16_emitDB(0x00, ptype, p);
}
- }
-
} else {
werror (W_EXCESS_INITIALIZERS, "array of chars", sym->name, sym->lineDef);
regs *reg;
symbol *sym;
+ if (!stackPosS) {
+ fprintf (stderr, "%s:%d: #pragma stack [stack-pos] [stack-length] -- stack-position missing\n", filename, lineno-1);
+
+ return 0; /* considered an error */
+ }
+
stackPosVal = constVal( stackPosS );
stackPos = (unsigned int)floatFromVal( stackPosVal );
}
// fprintf(stderr, "Initializing stack pointer at 0x%x len 0x%x\n", stackPos, stackLen);
-
+
+ /* check sanity of stack */
+ if ((stackPos >> 8) != ((stackPos+stackLen) >> 8)) {
+ fprintf (stderr, "%s:%u: warning: stack [0x%03X,0x%03X] crosses memory bank boundaries (not fully tested)\n",
+ filename,lineno-1, stackPos, stackPos+stackLen-1);
+ }
+
+ if (pic16) {
+ if (stackPos < pic16->acsSplitOfs) {
+ fprintf (stderr, "%s:%u: warning: stack [0x%03X, 0x%03X] intersects with the access bank [0x000,0x%03x] -- this is highly discouraged!\n",
+ filename, lineno-1, stackPos, stackPos+stackLen-1, pic16->acsSplitOfs);
+ }
+
+ if (stackPos+stackLen > 0xF00 + pic16->acsSplitOfs) {
+ fprintf (stderr, "%s:%u: warning: stack [0x%03X,0x%03X] intersects with special function registers [0x%03X,0xFFF]-- this is highly discouraged!\n",
+ filename, lineno-1, stackPos, stackPos+stackLen-1, 0xF00 + pic16->acsSplitOfs);
+ }
+
+ if (stackPos+stackLen > pic16->RAMsize) {
+ fprintf (stderr, "%s:%u: error: stack [0x%03X,0x%03X] is placed outside available memory [0x000,0x%03X]!\n",
+ filename, lineno-1, stackPos, stackPos+stackLen-1, pic16->RAMsize-1);
+ exit(-1);
+ return 1; /* considered an error, but this reports "invalid pragma stack"... */
+ }
+ }
+
reg=newReg(REG_SFR, PO_SFR_REGISTER, stackPos, "_stack", stackLen-1, 0, NULL);
addSet(&pic16_fix_udata, reg);
if (!symname || !location) {
fprintf (stderr, "%s:%d: #pragma code [symbol] [location] -- symbol or location missing\n", filename, lineno-1);
- return 1; /* considered an error */
+ exit (-1);
+ return 1; /* considered an error, but this reports "invalid pragma code"... */
}
absS = Safe_calloc(1, sizeof(absSym));
if (!symname || !sectname) {
fprintf (stderr, "%s:%d: #pragma udata [section-name] [symbol] -- section-name or symbol missing!\n", filename, lineno-1);
- return 1; /* considered an error */
+ exit (-1);
+ return 1; /* considered an error, but this reports "invalid pragma code"... */
}
while(symname) {