This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH, d] Committed merge with upstream dmd 375ed10aa


Hi,

This patch merges the dmd frontend implementation with upstream dmd 375ed10aa.

This allows the frontend to be able to compile on targets where the
pointer size is 16-bits.

Bootstrapped and regression tested the D testsuite on
x86_64-linux-gnu, with further checking done on msp430-elf
cross-compiler target to verify that at least simple programs can be
compiled on 16-bit targets.

Committed to trunk as r274768.

--
Iain
---
gcc/d/ChangeLog:

        * d-target.cc: Include diagnostic.h.
        (Target::_init): Set Tsize_t and Tptrdiff_t as D ushort and short if
        the target pointer size is 2.  Add sorry if the pointer size is not
        either 2, 4, or 8.
---
diff --git a/gcc/d/d-target.cc b/gcc/d/d-target.cc
index 8d85534f054..dfaf9bf3792 100644
--- a/gcc/d/d-target.cc
+++ b/gcc/d/d-target.cc
@@ -30,6 +30,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree.h"
 #include "memmodel.h"
 #include "fold-const.h"
+#include "diagnostic.h"
 #include "stor-layout.h"
 #include "tm.h"
 #include "tm_p.h"
@@ -145,17 +146,24 @@ Target::_init (void)
   Target::maxStaticDataSize = tree_to_shwi (TYPE_MAX_VALUE (integer_type_node));
 
   /* Define what type to use for size_t, ptrdiff_t.  */
-  if (POINTER_SIZE == 64)
+  if (Target::ptrsize == 8)
     {
       global.params.isLP64 = true;
       Tsize_t = Tuns64;
       Tptrdiff_t = Tint64;
     }
-  else
+  else if (Target::ptrsize == 4)
     {
       Tsize_t = Tuns32;
       Tptrdiff_t = Tint32;
     }
+  else if (Target::ptrsize == 2)
+    {
+      Tsize_t = Tuns16;
+      Tptrdiff_t = Tint16;
+    }
+  else
+    sorry ("D does not support pointers on this target.");
 
   Type::tsize_t = Type::basic[Tsize_t];
   Type::tptrdiff_t = Type::basic[Tptrdiff_t];
diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index d208aea3717..cb7b6bfac7f 100644
--- a/gcc/d/dmd/MERGE
+++ b/gcc/d/dmd/MERGE
@@ -1,4 +1,4 @@
-792f0fdf249b21531dc91690024827f4f9ecbb97
+375ed10aa7eb28755f92775ca5c5399550cd100b
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/dmd repository.
diff --git a/gcc/d/dmd/expression.c b/gcc/d/dmd/expression.c
index c674392095e..5f1bfa8f5a9 100644
--- a/gcc/d/dmd/expression.c
+++ b/gcc/d/dmd/expression.c
@@ -2920,10 +2920,12 @@ void IntegerExp::normalize()
         case Tint64:        value = (d_int64) value;        break;
         case Tuns64:        value = (d_uns64) value;        break;
         case Tpointer:
-            if (Target::ptrsize == 4)
-                value = (d_uns32) value;
-            else if (Target::ptrsize == 8)
+            if (Target::ptrsize == 8)
                 value = (d_uns64) value;
+            else if (Target::ptrsize == 4)
+                value = (d_uns32) value;
+            else if (Target::ptrsize == 2)
+                value = (d_uns16) value;
             else
                 assert(0);
             break;
diff --git a/gcc/d/dmd/hdrgen.c b/gcc/d/dmd/hdrgen.c
index 4eaa1ae1050..395aa3212b5 100644
--- a/gcc/d/dmd/hdrgen.c
+++ b/gcc/d/dmd/hdrgen.c
@@ -2152,10 +2152,12 @@ public:
             if ((sinteger_t)uval >= 0)
             {
                 dinteger_t sizemax;
-                if (Target::ptrsize == 4)
-                    sizemax = 0xFFFFFFFFUL;
-                else if (Target::ptrsize == 8)
+                if (Target::ptrsize == 8)
                     sizemax = 0xFFFFFFFFFFFFFFFFULL;
+                else if (Target::ptrsize == 4)
+                    sizemax = 0xFFFFFFFFUL;
+                else if (Target::ptrsize == 2)
+                    sizemax = 0xFFFFUL;
                 else
                     assert(0);
                 if (uval <= sizemax && uval <= 0x7FFFFFFFFFFFFFFFULL)
@@ -2296,12 +2298,10 @@ public:
                     buf->writestring("cast(");
                     buf->writestring(t->toChars());
                     buf->writeByte(')');
-                    if (Target::ptrsize == 4)
-                        goto L3;
-                    else if (Target::ptrsize == 8)
+                    if (Target::ptrsize == 8)
                         goto L4;
                     else
-                        assert(0);
+                        goto L3;
 
                 default:
                     /* This can happen if errors, such as

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]