Wiki Roadmap Timeline Tickets New Ticket Source Search Help / Guide About Trac Login

Changeset 905:bd000a7fab18

Show
Ignore:
Timestamp:
01/23/09 18:33:06 (3 years ago)
Author:
Christian Kamm <kamm incasoftware de>
branch:
default
Message:

Applied doob's patch to port GDC's Dyld data segment tracking for Mac.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • runtime/internal/memory.d

    r903 r905  
    2828version = GC_Use_Dynamic_Ranges; 
    2929 
    30 version(Posix) 
     30version(darwin) 
     31
     32    version = GC_Use_Data_Dyld; 
     33    version = GC_Use_Dynamic_Ranges; 
     34
     35else version(Posix) 
    3136{ 
    3237    version = GC_Use_Data_Proc_Maps; 
    3338} 
    34 version(solaris) 
     39else version(solaris) 
    3540{ 
    3641    version = GC_Use_Data_Proc_Maps; 
     
    299304        dataStart = adjust_up( &Data_Start ); 
    300305        dataEnd   = adjust_down( &Data_End ); 
     306    } 
     307    else version(GC_Use_Data_Dyld) 
     308    { 
     309        _d_dyld_start(); 
    301310    } 
    302311    else 
     
    498507} 
    499508} 
     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 */ 
     515version (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 
Copyright © 2008, LDC Development Team.