//File instlist.cpp #include "instlist.h" #include "token.h" #include "quad.h" #include "inst.h" #include "pmglobs.h" #include instlist::instlist() { qnum=0; inum=0; head=NULL; }; instlist::~instlist() { //yet to be implemented }; void instlist::createentry(quadruple q) { qnum++; headnode* p=new headnode; p->quadnum=qnum; p->instnum=inum; if (q.oper==BF || q.oper==B || q.oper==JSR) p->jumptoquad=q.result; else p->jumptoquad=0; p->nextinst=NULL; p->nexthead=NULL; if (head==NULL) { head=p; hptr=p; } else { hptr->nexthead=p; hptr=hptr->nexthead; }; }; void instlist::enterinst(int opco,token opnd) { inum++; instnode* r=new instnode; r->opcode=opco; r->operand=opnd.getvalue(); r->nextinst=NULL; if (hptr->nextinst==NULL) { hptr->nextinst=r; iptr=r; } else { iptr->nextinst=r; iptr=iptr->nextinst; }; }; void instlist::repairjumps() { int k=1; instnode* r; headnode* q; headnode* p=head; while (p!=NULL) { if (p->jumptoquad!=0 && p->jumptoquad!=p->quadnum+1) { if (p->jumptoquad<=k) q=head; else q=p; while (q->quadnum!=p->jumptoquad) q=q->nexthead; r=p->nextinst; while (r->opcode/100!=JUMPINST1STDIGIT) //singles out jump insts r=r->nextinst; r->operand=q->instnum; }; p=p->nexthead; k++; }; };