OLD | NEW |
1 // Inferno utils/6l/span.c | 1 // Inferno utils/6l/span.c |
2 // http://code.google.com/p/inferno-os/source/browse/utils/6l/span.c | 2 // http://code.google.com/p/inferno-os/source/browse/utils/6l/span.c |
3 // | 3 // |
4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. | 4 // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved. |
5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) | 5 // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net) |
6 // Portions Copyright © 1997-1999 Vita Nuova Limited | 6 // Portions Copyright © 1997-1999 Vita Nuova Limited |
7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuov
a.com) | 7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuov
a.com) |
8 // Portions Copyright © 2004,2006 Bruce Ellis | 8 // Portions Copyright © 2004,2006 Bruce Ellis |
9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) | 9 // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net) |
10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others | 10 // Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 } | 263 } |
264 | 264 |
265 void | 265 void |
266 asmplan9sym(void) | 266 asmplan9sym(void) |
267 { | 267 { |
268 genasmsym(putplan9sym); | 268 genasmsym(putplan9sym); |
269 } | 269 } |
270 | 270 |
271 static LSym *symt; | 271 static LSym *symt; |
272 | 272 |
273 static void | |
274 scput(int b) | |
275 { | |
276 uchar *p; | |
277 | |
278 symgrow(ctxt, symt, symt->size+1); | |
279 p = symt->p + symt->size; | |
280 *p = b; | |
281 symt->size++; | |
282 } | |
283 | |
284 static void | |
285 slputb(int32 v) | |
286 { | |
287 uchar *p; | |
288 | |
289 symgrow(ctxt, symt, symt->size+4); | |
290 p = symt->p + symt->size; | |
291 *p++ = v>>24; | |
292 *p++ = v>>16; | |
293 *p++ = v>>8; | |
294 *p = v; | |
295 symt->size += 4; | |
296 } | |
297 | |
298 static void | |
299 slputl(int32 v) | |
300 { | |
301 uchar *p; | |
302 | |
303 symgrow(ctxt, symt, symt->size+4); | |
304 p = symt->p + symt->size; | |
305 *p++ = v; | |
306 *p++ = v>>8; | |
307 *p++ = v>>16; | |
308 *p = v>>24; | |
309 symt->size += 4; | |
310 } | |
311 | |
312 static void (*slput)(int32); | |
313 | |
314 void | 273 void |
315 wputl(ushort w) | 274 wputl(ushort w) |
316 { | 275 { |
317 cput(w); | 276 cput(w); |
318 cput(w>>8); | 277 cput(w>>8); |
319 } | 278 } |
320 | 279 |
321 void | 280 void |
322 wputb(ushort w) | 281 wputb(ushort w) |
323 { | 282 { |
(...skipping 26 matching lines...) Expand all Loading... |
350 lputb(v); | 309 lputb(v); |
351 } | 310 } |
352 | 311 |
353 void | 312 void |
354 vputl(uint64 v) | 313 vputl(uint64 v) |
355 { | 314 { |
356 lputl(v); | 315 lputl(v); |
357 lputl(v >> 32); | 316 lputl(v >> 32); |
358 } | 317 } |
359 | 318 |
360 // Emit symbol table entry. | |
361 // The table format is described at the top of ../../pkg/runtime/symtab.c. | |
362 void | |
363 putsymb(LSym *s, char *name, int t, vlong v, vlong size, int ver, LSym *typ) | |
364 { | |
365 int i, f, c; | |
366 vlong v1; | |
367 Reloc *rel; | |
368 | |
369 USED(size); | |
370 | |
371 // type byte | |
372 if('A' <= t && t <= 'Z') | |
373 c = t - 'A' + (ver ? 26 : 0); | |
374 else if('a' <= t && t <= 'z') | |
375 c = t - 'a' + 26; | |
376 else { | |
377 diag("invalid symbol table type %c", t); | |
378 errorexit(); | |
379 return; | |
380 } | |
381 ········ | |
382 if(s != nil) | |
383 c |= 0x40; // wide value | |
384 if(typ != nil) | |
385 c |= 0x80; // has go type | |
386 scput(c); | |
387 | |
388 // value | |
389 if(s != nil) { | |
390 // full width | |
391 rel = addrel(symt); | |
392 rel->siz = PtrSize; | |
393 rel->sym = s; | |
394 rel->type = D_ADDR; | |
395 rel->off = symt->size; | |
396 if(PtrSize == 8) | |
397 slput(0); | |
398 slput(0); | |
399 } else { | |
400 // varint | |
401 if(v < 0) { | |
402 diag("negative value in symbol table: %s %lld", name, v)
; | |
403 errorexit(); | |
404 } | |
405 v1 = v; | |
406 while(v1 >= 0x80) { | |
407 scput(v1 | 0x80); | |
408 v1 >>= 7; | |
409 } | |
410 scput(v1); | |
411 } | |
412 | |
413 // go type if present | |
414 if(typ != nil) { | |
415 if(!typ->reachable) | |
416 diag("unreachable type %s", typ->name); | |
417 rel = addrel(symt); | |
418 rel->siz = PtrSize; | |
419 rel->sym = typ; | |
420 rel->type = D_ADDR; | |
421 rel->off = symt->size; | |
422 if(PtrSize == 8) | |
423 slput(0); | |
424 slput(0); | |
425 } | |
426 ········ | |
427 // name· | |
428 if(t == 'f') | |
429 name++; | |
430 | |
431 if(t == 'Z' || t == 'z') { | |
432 scput(name[0]); | |
433 for(i=1; name[i] != 0 || name[i+1] != 0; i += 2) { | |
434 scput(name[i]); | |
435 scput(name[i+1]); | |
436 } | |
437 scput(0); | |
438 scput(0); | |
439 } else { | |
440 for(i=0; name[i]; i++) | |
441 scput(name[i]); | |
442 scput(0); | |
443 } | |
444 | |
445 if(debug['n']) { | |
446 if(t == 'z' || t == 'Z') { | |
447 Bprint(&bso, "%c %.8llux ", t, v); | |
448 for(i=1; name[i] != 0 || name[i+1] != 0; i+=2) { | |
449 f = ((name[i]&0xff) << 8) | (name[i+1]&0xff); | |
450 Bprint(&bso, "/%x", f); | |
451 } | |
452 Bprint(&bso, "\n"); | |
453 return; | |
454 } | |
455 if(ver) | |
456 Bprint(&bso, "%c %.8llux %s<%d> %s\n", t, v, name, ver,
typ ? typ->name : ""); | |
457 else | |
458 Bprint(&bso, "%c %.8llux %s %s\n", t, v, name, typ ? typ
->name : ""); | |
459 } | |
460 } | |
461 | |
462 void | 319 void |
463 symtab(void) | 320 symtab(void) |
464 { | 321 { |
465 LSym *s, *symtype, *symtypelink, *symgostring, *symgofunc; | 322 LSym *s, *symtype, *symtypelink, *symgostring, *symgofunc; |
466 | 323 |
467 dosymtype(); | 324 dosymtype(); |
468 | 325 |
469 // Define these so that they'll get put into the symbol table. | 326 // Define these so that they'll get put into the symbol table. |
470 // data.c:/^address will provide the actual values. | 327 // data.c:/^address will provide the actual values. |
471 xdefine("text", STEXT, 0); | 328 xdefine("text", STEXT, 0); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 s->type = SGOSTRING; | 403 s->type = SGOSTRING; |
547 s->hide = 1; | 404 s->hide = 1; |
548 s->outer = symgostring; | 405 s->outer = symgostring; |
549 } | 406 } |
550 if(strncmp(s->name, "go.func.", 8) == 0) { | 407 if(strncmp(s->name, "go.func.", 8) == 0) { |
551 s->type = SGOFUNC; | 408 s->type = SGOFUNC; |
552 s->hide = 1; | 409 s->hide = 1; |
553 s->outer = symgofunc; | 410 s->outer = symgofunc; |
554 } | 411 } |
555 } | 412 } |
556 | |
557 if(debug['s']) | |
558 return; | |
559 | |
560 switch(thechar) { | |
561 default: | |
562 diag("unknown architecture %c", thechar); | |
563 errorexit(); | |
564 case '5': | |
565 case '6': | |
566 case '8': | |
567 // little-endian symbol table | |
568 slput = slputl; | |
569 break; | |
570 case 'v': | |
571 // big-endian symbol table | |
572 slput = slputb; | |
573 break; | |
574 } | |
575 // new symbol table header. | |
576 slput(0xfffffffd); | |
577 scput(0); | |
578 scput(0); | |
579 scput(0); | |
580 scput(PtrSize); | |
581 | |
582 genasmsym(putsymb); | |
583 } | 413 } |
OLD | NEW |