changeset 1289:4a5eea0334e5

Add runtime support for darwin x86_64
author Benjamin Kramer <benny.kra@gmail.com>
date Sat, 02 May 2009 16:39:26 +0200
parents e109e4031e8a
children c86a629f24dd
files runtime/internal/eh.d runtime/internal/memory.d
diffstat 2 files changed, 31 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/internal/eh.d	Sat May 02 19:03:33 2009 +0300
+++ b/runtime/internal/eh.d	Sat May 02 16:39:26 2009 +0200
@@ -18,6 +18,7 @@
 }
 version(X86_64) {
     version(linux) version=X86_UNWIND;
+    version(darwin) version=X86_UNWIND;
     version(solaris) version=X86_UNWIND;
 }
 
--- a/runtime/internal/memory.d	Sat May 02 19:03:33 2009 +0300
+++ b/runtime/internal/memory.d	Sat May 02 16:39:26 2009 +0200
@@ -120,7 +120,10 @@
     else version( darwin )
     {
         // darwin has a fixed stack bottom
-        return cast(void*) 0xc0000000;
+        version(X86_64)
+            return cast(void*) 0x7fff5fc00000;
+        else
+            return cast(void*) 0xc0000000;
     }
     else version( solaris )
     {
@@ -529,14 +532,24 @@
             uint ncmds;
             uint sizeofcmds;
             uint flags;
+            version(X86_64)
+                uint reserved;
         }
 
         struct section
         {
             char[16] sectname;
             char[16] segname;
-            uint addr;
-            uint size;
+            version(X86_64)
+            {
+                ulong addr;
+                ulong size;
+            }
+            else
+            {
+                uint addr;
+                uint size;
+            }
             uint offset;
             uint align_;
             uint reloff;
@@ -544,11 +557,16 @@
             uint flags;
             uint reserved1;
             uint reserved2;
+            version(X86_64)
+                uint reserved3;
         }
 
         alias extern (C) void function (mach_header* mh, ptrdiff_t vmaddr_slide) DyldFuncPointer;
 
-        extern (C) /*const*/ section* getsectbynamefromheader(/*const*/ mach_header* mhp, /*const*/ char* segname, /*const*/ char* sectname);
+        version(X86_64)
+            extern (C) /*const*/ section* getsectbynamefromheader_64(/*const*/ mach_header* mhp, /*const*/ char* segname, /*const*/ char* sectname);
+        else
+            extern (C) /*const*/ section* getsectbynamefromheader(/*const*/ mach_header* mhp, /*const*/ char* segname, /*const*/ char* sectname);
         extern (C) void _dyld_register_func_for_add_image(DyldFuncPointer func);
         extern (C) void _dyld_register_func_for_remove_image(DyldFuncPointer func);
 
@@ -562,7 +580,10 @@
 
             foreach (s ; GC_dyld_sections)
             {
-                sec = getsectbynamefromheader(hdr, s.segment, s.section);
+                version(X86_64)
+                    sec = getsectbynamefromheader_64(hdr, s.segment, s.section);
+                else
+                    sec = getsectbynamefromheader(hdr, s.segment, s.section);
 
                 if (sec == null || sec.size == 0)
                     continue;
@@ -582,7 +603,10 @@
 
             foreach (s ; GC_dyld_sections)
             {
-                sec = getsectbynamefromheader(hdr, s.segment, s.section);
+                version(X86_64)
+                    sec = getsectbynamefromheader_64(hdr, s.segment, s.section);
+                else
+                    sec = getsectbynamefromheader(hdr, s.segment, s.section);
 
                 if (sec == null || sec.size == 0)
                     continue;