| | 509 | |
|---|
| | 510 | /* |
|---|
| | 511 | * GDC dyld memory module: |
|---|
| | 512 | * http://www.dsource.org/projects/tango/browser/trunk/lib/compiler/gdc/memory_dyld.c |
|---|
| | 513 | * Port to the D programming language: Jacob Carlborg |
|---|
| | 514 | */ |
|---|
| | 515 | version (GC_Use_Data_Dyld) |
|---|
| | 516 | { |
|---|
| | 517 | private |
|---|
| | 518 | { |
|---|
| | 519 | const char* SEG_DATA = "__DATA".ptr; |
|---|
| | 520 | const char* SECT_DATA = "__data".ptr; |
|---|
| | 521 | const char* SECT_BSS = "__bss".ptr; |
|---|
| | 522 | const char* SECT_COMMON = "__common".ptr; |
|---|
| | 523 | |
|---|
| | 524 | struct SegmentSection |
|---|
| | 525 | { |
|---|
| | 526 | const char* segment; |
|---|
| | 527 | const char* section; |
|---|
| | 528 | } |
|---|
| | 529 | |
|---|
| | 530 | struct mach_header |
|---|
| | 531 | { |
|---|
| | 532 | uint magic; |
|---|
| | 533 | int cputype; |
|---|
| | 534 | int cpusubtype; |
|---|
| | 535 | uint filetype; |
|---|
| | 536 | uint ncmds; |
|---|
| | 537 | uint sizeofcmds; |
|---|
| | 538 | uint flags; |
|---|
| | 539 | } |
|---|
| | 540 | |
|---|
| | 541 | struct section |
|---|
| | 542 | { |
|---|
| | 543 | char[16] sectname; |
|---|
| | 544 | char[16] segname; |
|---|
| | 545 | uint addr; |
|---|
| | 546 | uint size; |
|---|
| | 547 | uint offset; |
|---|
| | 548 | uint align_; |
|---|
| | 549 | uint reloff; |
|---|
| | 550 | uint nreloc; |
|---|
| | 551 | uint flags; |
|---|
| | 552 | uint reserved1; |
|---|
| | 553 | uint reserved2; |
|---|
| | 554 | } |
|---|
| | 555 | |
|---|
| | 556 | alias extern (C) void function (mach_header* mh, ptrdiff_t vmaddr_slide) DyldFuncPointer; |
|---|
| | 557 | |
|---|
| | 558 | extern (C) /*const*/ section* getsectbynamefromheader(/*const*/ mach_header* mhp, /*const*/ char* segname, /*const*/ char* sectname); |
|---|
| | 559 | extern (C) void _dyld_register_func_for_add_image(DyldFuncPointer func); |
|---|
| | 560 | extern (C) void _dyld_register_func_for_remove_image(DyldFuncPointer func); |
|---|
| | 561 | |
|---|
| | 562 | const SegmentSection[3] GC_dyld_sections = [SegmentSection(SEG_DATA, SECT_DATA), SegmentSection(SEG_DATA, SECT_BSS), SegmentSection(SEG_DATA, SECT_COMMON)]; |
|---|
| | 563 | |
|---|
| | 564 | extern (C) void on_dyld_add_image (/*const*/ mach_header* hdr, ptrdiff_t slide) |
|---|
| | 565 | { |
|---|
| | 566 | void* start; |
|---|
| | 567 | void* end; |
|---|
| | 568 | /*const*/ section* sec; |
|---|
| | 569 | |
|---|
| | 570 | foreach (s ; GC_dyld_sections) |
|---|
| | 571 | { |
|---|
| | 572 | sec = getsectbynamefromheader(hdr, s.segment, s.section); |
|---|
| | 573 | |
|---|
| | 574 | if (sec == null || sec.size == 0) |
|---|
| | 575 | continue; |
|---|
| | 576 | |
|---|
| | 577 | start = cast(void*) (sec.addr + slide); |
|---|
| | 578 | end = cast(void*) (start + sec.size); |
|---|
| | 579 | |
|---|
| | 580 | _d_gc_add_range(start, end); |
|---|
| | 581 | } |
|---|
| | 582 | } |
|---|
| | 583 | |
|---|
| | 584 | extern (C) void on_dyld_remove_image (/*const*/ mach_header* hdr, ptrdiff_t slide) |
|---|
| | 585 | { |
|---|
| | 586 | void* start; |
|---|
| | 587 | void* end; |
|---|
| | 588 | /*const*/ section* sec; |
|---|
| | 589 | |
|---|
| | 590 | foreach (s ; GC_dyld_sections) |
|---|
| | 591 | { |
|---|
| | 592 | sec = getsectbynamefromheader(hdr, s.segment, s.section); |
|---|
| | 593 | |
|---|
| | 594 | if (sec == null || sec.size == 0) |
|---|
| | 595 | continue; |
|---|
| | 596 | |
|---|
| | 597 | start = cast(void*) (sec.addr + slide); |
|---|
| | 598 | end = cast(void*) (start + sec.size); |
|---|
| | 599 | |
|---|
| | 600 | _d_gc_remove_range(start); |
|---|
| | 601 | } |
|---|
| | 602 | } |
|---|
| | 603 | |
|---|
| | 604 | void _d_dyld_start () |
|---|
| | 605 | { |
|---|
| | 606 | static bool started; |
|---|
| | 607 | |
|---|
| | 608 | if (!started) |
|---|
| | 609 | { |
|---|
| | 610 | started = true; |
|---|
| | 611 | |
|---|
| | 612 | _dyld_register_func_for_add_image(&on_dyld_add_image); |
|---|
| | 613 | _dyld_register_func_for_remove_image(&on_dyld_remove_image); |
|---|
| | 614 | } |
|---|
| | 615 | } |
|---|
| | 616 | } |
|---|
| | 617 | } |
|---|
| | 618 | |
|---|