X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fpic%2Fpcode.c;h=95da354efd3198dab43976dc340230b6cd5fe210;hb=024f3c6ed19758bb991e41644b2b3f9415c47894;hp=9c3e288bf4fb7641925e932e75b6f052cd681cc0;hpb=7899677e61d2e5f44cfb329b8d8326a7a0acdcaa;p=fw%2Fsdcc diff --git a/src/pic/pcode.c b/src/pic/pcode.c index 9c3e288b..95da354e 100644 --- a/src/pic/pcode.c +++ b/src/pic/pcode.c @@ -689,6 +689,39 @@ char *Safe_strdup(char *str) } + +/*-----------------------------------------------------------------*/ +/* SAFE_snprintf - like snprintf except the string pointer is */ +/* after the string has been printed to. This is */ +/* useful for printing to string as though if it */ +/* were a stream. */ +/*-----------------------------------------------------------------*/ +void SAFE_snprintf(char **str, size_t *size, const char *format, ...) +{ + va_list val; + int len; + + if(!str || !*str) + return; + + va_start(val, format); +#if 0 + // Alas, vsnprintf is not ANSI standard, and does not exist + // on Solaris (and probably other non-Gnu flavored Unixes). + vsnprintf(*str, *size, format, val); +#else + // This, of course, is *not* safe, despite the name. + vsprintf(*str, format, val); +#endif + + va_end (val); + + len = strlen(*str); + *str += len; + *size -= len; + +} + void pCodeInitRegisters(void) { @@ -784,7 +817,7 @@ void pic14initMnemonics(void) mnemonics_initialized = 1; } -int getpCode(char *mnem,int dest) +int getpCode(char *mnem,unsigned dest) { pCodeInstruction *pci; @@ -1157,7 +1190,7 @@ pBlock *newpBlock(void) } /*-----------------------------------------------------------------*/ -/* newpCodeChain - create a new chain of pCodes */ +/* newpCodeChai0n - create a new chain of pCodes */ /*-----------------------------------------------------------------* * * This function will create a new pBlock and the pointer to the @@ -1297,12 +1330,18 @@ pCodeOp *newpCodeOp(char *name, PIC_OPTYPE type) /*-----------------------------------------------------------------*/ void addpCode2pBlock(pBlock *pb, pCode *pc) { - - pb->pcTail->next = pc; - pc->prev = pb->pcTail; - pc->next = NULL; - pc->pb = pb; - pb->pcTail = pc; + if(!pb->pcHead) { + /* If this is the first pcode to be added to a block that + * was initialized with a NULL pcode, then go ahead and + * make this pcode the head and tail */ + pb->pcHead = pb->pcTail = pc; + } else { + pb->pcTail->next = pc; + pc->prev = pb->pcTail; + pc->next = NULL; + pc->pb = pb; + pb->pcTail = pc; + } } /*-----------------------------------------------------------------*/ @@ -1394,7 +1433,6 @@ void pBlockRegs(FILE *of, pBlock *pb) r = setFirstItem(pb->registers); while (r) { - fprintf(of," %s\n",r->name); r = setNextItem(pb->registers); } } @@ -1412,7 +1450,7 @@ static char *get_op( pCodeInstruction *pcc) case PO_FSR: case PO_GPR_TEMP: r = pic14_regWithIdx(PCOR(pcc->pcop)->r->rIdx); - fprintf(stderr,"getop: getting %s\nfrom:\n",r->name); //pcc->pcop->name); + //fprintf(stderr,"getop: getting %s\nfrom:\n",r->name); //pcc->pcop->name); pBlockRegs(stderr,pcc->pc.pb); return r->name; @@ -1434,6 +1472,70 @@ static void pCodeOpPrint(FILE *of, pCodeOp *pcop) fprintf(of,"pcodeopprint\n"); } +char *pCode2str(char *str, int size, pCode *pc) +{ + char *s = str; + + switch(pc->type) { + + case PC_OPCODE: + + SAFE_snprintf(&s,&size, "\t%s\t", PCI(pc)->mnemonic); + + if( (PCI(pc)->num_ops >= 1) && (PCI(pc)->pcop)) { + + if(PCI(pc)->bit_inst) { + if(PCI(pc)->pcop->type == PO_BIT) { + if( (((pCodeOpBit *)(PCI(pc)->pcop))->inBitSpace) ) + SAFE_snprintf(&s,&size,"(%s >> 3), (%s & 7)", + PCI(pc)->pcop->name , + PCI(pc)->pcop->name ); + else + SAFE_snprintf(&s,&size,"%s,%d", get_op(PCI(pc)), + (((pCodeOpBit *)(PCI(pc)->pcop))->bit )); + } else + SAFE_snprintf(&s,&size,"%s,0 ; ?bug", get_op(PCI(pc))); + //PCI(pc)->pcop->t.bit ); + } else { + + if(PCI(pc)->pcop->type == PO_BIT) { + if( PCI(pc)->num_ops == 2) + SAFE_snprintf(&s,&size,"(%s >> 3),%c",get_op(PCI(pc)),((PCI(pc)->dest) ? 'F':'W')); + else + SAFE_snprintf(&s,&size,"(1 << (%s & 7))",get_op(PCI(pc))); + + }else { + SAFE_snprintf(&s,&size,"%s",get_op(PCI(pc))); + + if( PCI(pc)->num_ops == 2) + SAFE_snprintf(&s,&size,",%c", ( (PCI(pc)->dest) ? 'F':'W')); + } + } + + } + break; + + case PC_COMMENT: + /* assuming that comment ends with a \n */ + SAFE_snprintf(&s,&size,";%s", ((pCodeComment *)pc)->comment); + break; + + case PC_LABEL: + SAFE_snprintf(&s,&size,";label=%s, key=%d\n",PCL(pc)->label,PCL(pc)->key); + break; + case PC_FUNCTION: + SAFE_snprintf(&s,&size,";modname=%s,function=%s: id=%d\n",PCF(pc)->modname,PCF(pc)->fname); + break; + case PC_WILD: + SAFE_snprintf(&s,&size,";\tWild opcode: id=%d\n",PCW(pc)->id); + break; + + } + + return str; + +} + /*-----------------------------------------------------------------*/ /* genericPrint - the contents of a pCode to a file */ /*-----------------------------------------------------------------*/ @@ -1459,41 +1561,13 @@ static void genericPrint(FILE *of, pCode *pc) } } - fprintf(of, "\t%s\t", PCI(pc)->mnemonic); - if( (PCI(pc)->num_ops >= 1) && (PCI(pc)->pcop)) { - if(PCI(pc)->bit_inst) { - if(PCI(pc)->pcop->type == PO_BIT) { - if( (((pCodeOpBit *)(PCI(pc)->pcop))->inBitSpace) ) - fprintf(of,"(%s >> 3), (%s & 7)", - PCI(pc)->pcop->name , - PCI(pc)->pcop->name ); - else - fprintf(of,"%s,%d", get_op(PCI(pc)), (((pCodeOpBit *)(PCI(pc)->pcop))->bit )); - } else - fprintf(of,"%s,0 ; ?bug", get_op(PCI(pc))); - //PCI(pc)->pcop->t.bit ); - } else { - - if(PCI(pc)->pcop->type == PO_BIT) { - if( PCI(pc)->num_ops == 2) - fprintf(of,"(%s >> 3),%c",get_op(PCI(pc)),((PCI(pc)->dest) ? 'F':'W')); - else - fprintf(of,"(1 << (%s & 7))",get_op(PCI(pc))); - -/* - if( PCI(pc)->num_ops == 2) - fprintf(of,"(%s >> 3),%c",PCI(pc)->pcop->name,((PCI(pc)->dest) ? 'F':'W')); - else - fprintf(of,"(1 << (%s & 7))",PCI(pc)->pcop->name); -*/ - }else { - fprintf(of,"%s",get_op(PCI(pc))); + { + char str[256]; + + pCode2str(str, 256, pc); - if( PCI(pc)->num_ops == 2) - fprintf(of,",%c", ( (PCI(pc)->dest) ? 'F':'W')); - } - } + fprintf(of,"%s",str); } { @@ -1522,6 +1596,9 @@ static void genericPrint(FILE *of, pCode *pc) case PC_WILD: fprintf(of,";\tWild opcode: id=%d\n",PCW(pc)->id); + if(pc->label) + pCodePrintLabel(of, pc->label->pc); + if(PCW(pc)->operand) { fprintf(of,";\toperand "); pCodeOpPrint(of,PCW(pc)->operand ); @@ -1583,7 +1660,7 @@ static void pCodePrintLabel(FILE *of, pCode *pc) else if (PCL(pc)->key >=0) fprintf(of,"_%05d_DS_:\n",PCL(pc)->key); else - fprintf(of,";wild card label\n"); + fprintf(of,";wild card label: id=%d\n",-PCL(pc)->key); } /*-----------------------------------------------------------------*/ @@ -1766,7 +1843,7 @@ pCode * findNextInstruction(pCode *pc) { while(pc) { - if(pc->type == PC_OPCODE) + if((pc->type == PC_OPCODE) || (pc->type == PC_WILD)) return pc; pc = pc->next;