| break; |
break; |
| } |
} |
| } |
} |
| |
pi->length = prim_len; |
| /* fprintf(stderr,"checking primitive %d: memcmp(%p, %p, %d)\n", |
/* fprintf(stderr,"checking primitive %d: memcmp(%p, %p, %d)\n", |
| i, symbols1[i], symbols2[i], prim_len);*/ |
i, symbols1[i], symbols2[i], prim_len);*/ |
| if (memcmp(symbols1[i],symbols2[i],prim_len)!=0) { |
if (memcmp(symbols1[i],symbols2[i],prim_len)!=0) { |
| i, symbols1[i], symbols2[i], prim_len); |
i, symbols1[i], symbols2[i], prim_len); |
| } else { |
} else { |
| pi->start = symbols1[i]; |
pi->start = symbols1[i]; |
| pi->length = prim_len; |
|
| if (debug) |
if (debug) |
| fprintf(stderr,"Primitive %d relocatable: start %p, length %ld, super_end %d\n", |
fprintf(stderr,"Primitive %d relocatable: start %p, length %ld, super_end %d\n", |
| i, pi->start, pi->length, pi->super_end); |
i, pi->start, pi->length, pi->super_end); |
| } else |
} else |
| return prim-((Label)xts)+((Label)vm_prims); |
return prim-((Label)xts)+((Label)vm_prims); |
| #else /* !defined(DOUBLY_INDIRECT) */ |
#else /* !defined(DOUBLY_INDIRECT) */ |
| #ifdef IND_JUMP_LENGTH |
#if defined(IND_JUMP_LENGTH) && !defined(VM_PROFILING) |
| unsigned i; |
unsigned i; |
| Address old_code_here=code_here; |
Address old_code_here=code_here; |
| static Address last_jump=0; |
static Address last_jump=0; |
| #endif /* !defined(DOUBLY_INDIRECT) */ |
#endif /* !defined(DOUBLY_INDIRECT) */ |
| } |
} |
| |
|
| |
#ifdef PRINT_SUPER_LENGTHS |
| |
Cell prim_length(Cell prim) |
| |
{ |
| |
return priminfos[prim+DOESJUMP+1].length; |
| |
} |
| |
#endif |
| |
|
| Address loader(FILE *imagefile, char* filename) |
Address loader(FILE *imagefile, char* filename) |
| /* returns the address of the image proper (after the preamble) */ |
/* returns the address of the image proper (after the preamble) */ |
| { |
{ |
| vm_prims = engine(0,0,0,0,0); |
vm_prims = engine(0,0,0,0,0); |
| check_prims(vm_prims); |
check_prims(vm_prims); |
| #ifndef DOUBLY_INDIRECT |
#ifndef DOUBLY_INDIRECT |
| |
#ifdef PRINT_SUPER_LENGTHS |
| |
print_super_lengths(); |
| |
#endif |
| check_sum = checksum(vm_prims); |
check_sum = checksum(vm_prims); |
| #else /* defined(DOUBLY_INDIRECT) */ |
#else /* defined(DOUBLY_INDIRECT) */ |
| check_sum = (UCell)vm_prims; |
check_sum = (UCell)vm_prims; |