pike.git / src / peep.c

version» Context lines:

pike.git/src/peep.c:8:   #include "main.h"   #include "error.h"   #include "lex.h"   #include "pike_memory.h"   #include "peep.h"   #include "dmalloc.h"   #include "stuff.h"   #include "bignum.h"   #include "opcodes.h"    - RCSID("$Id: peep.c,v 1.40 2000/11/28 02:19:16 hubbe Exp $"); + RCSID("$Id: peep.c,v 1.41 2000/12/01 01:13:45 hubbe Exp $");    - struct p_instr_s - { -  short opcode; -  short line; -  struct pike_string *file; -  INT32 arg; -  INT32 arg2; - }; -  - typedef struct p_instr_s p_instr; +    static void asm_opt(void);      dynamic_buffer instrbuf;      static int hasarg(int opcode)   {    return instrs[opcode-F_OFFSET].flags & I_HASARG;   }      static int hasarg2(int opcode)
pike.git/src/peep.c:218:    ins_f_byte_with_arg(a,c);    add_to_program((unsigned char)b);   }      void assemble(void)   {    INT32 d,max_label,tmp;    INT32 *labels, *jumps, *uses;    ptrdiff_t e, length;    p_instr *c; +  int reoptimize=1;       c=(p_instr *)instrbuf.s.str;    length=instrbuf.s.len / sizeof(p_instr);       max_label=-1;    for(e=0;e<length;e++,c++)    if(c->opcode == F_LABEL)    if(c->arg > max_label)    max_label = c->arg;          labels=(INT32 *)xalloc(sizeof(INT32) * (max_label+2));    jumps=(INT32 *)xalloc(sizeof(INT32) * (max_label+2));    uses=(INT32 *)xalloc(sizeof(INT32) * (max_label+2));    -  +  while(reoptimize) +  { +  reoptimize=0;    for(e=0;e<=max_label;e++)    {    labels[e]=jumps[e]=-1;    uses[e]=0;    }       c=(p_instr *)instrbuf.s.str;    for(e=0;e<length;e++)    if(c[e].opcode == F_LABEL && c[e].arg>=0)    labels[c[e].arg]=DO_NOT_WARN((INT32)e);
pike.git/src/peep.c:301:    if(c[e].file) add_ref(c[e].file);    break;    }    break;    }    uses[c[e].arg]++;    }    }       for(e=0;e<=max_label;e++) +  {    if(!uses[e] && labels[e]>=0) -  +  {    c[labels[e]].opcode=F_NOP; -  +  reoptimize++; +  } +  } +  if(!reoptimize) break;       asm_opt(); -  +  reoptimize=0; +  }       c=(p_instr *)instrbuf.s.str;    length=instrbuf.s.len / sizeof(p_instr);       for(e=0;e<=max_label;e++) labels[e]=jumps[e]=-1;       c=(p_instr *)instrbuf.s.str;    for(e=0;e<length;e++)    {   #ifdef PIKE_DEBUG
pike.git/src/peep.c:330: Inside #if defined(PIKE_DEBUG)
   fprintf(stderr,"\n");    }   #endif       if(store_linenumbers)    store_linenumber(c->line, c->file);       switch(c->opcode)    {    case F_NOP: +  case F_NOTREACHED:    case F_START_FUNCTION:    break;    case F_ALIGN:    while(PC % c->arg) add_to_program(0);    break;       case F_BYTE:    add_to_program((unsigned char)(c->arg));    break;