[PR,d/90130] Committed dmd fixes for big endian targets

Message ID CABOHX+dSOEuX2j-3PihZUfepN=hOrX2ttFMPwVePqeB9KKS6_A@mail.gmail.com
State New
Headers show
Series
  • [PR,d/90130] Committed dmd fixes for big endian targets
Related show

Commit Message

Iain Buclaw April 21, 2019, 8:27 p.m.
Hi,

This patch merges the D front-end implementation with dmd upstream 065fbd452.

Fixes one endian bug in CTFE, and corrects tests in the D2 testsuite
that failed on big endian targets.

Boostrapped and regression tested on x86_64-linux-gnu.

Committed to trunk as r270485.

-- 
Iain
---

Patch

diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE
index be0c5a50da2..c360fe5c2ed 100644
--- a/gcc/d/dmd/MERGE
+++ b/gcc/d/dmd/MERGE
@@ -1,4 +1,4 @@ 
-c185f9df1789456c7d88d047f2df23dd784f1182
+065fbd452f2aa498fc3a554be48a5495bd98aa14
 
 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/constfold.c b/gcc/d/dmd/constfold.c
index ddd356bb966..ed3e7491983 100644
--- a/gcc/d/dmd/constfold.c
+++ b/gcc/d/dmd/constfold.c
@@ -1752,14 +1752,16 @@  UnionExp Cat(Type *type, Expression *e1, Expression *e2)
     }
     else if (e1->op == TOKint64 && e2->op == TOKstring)
     {
-        // Concatenate the strings
+        // [w|d]?char ~ string --> string
+        // We assume that we only ever prepend one char of the same type
+        // (wchar,dchar) as the string's characters.
         StringExp *es2 = (StringExp *)e2;
         size_t len = 1 + es2->len;
         unsigned char sz = es2->sz;
         dinteger_t v = e1->toInteger();
 
         void *s = mem.xmalloc((len + 1) * sz);
-        memcpy((char *)s, &v, sz);
+        Port::valcpy((char *)s, v, sz);
         memcpy((char *)s + sz, es2->string, es2->len * sz);
 
         // Add terminating 0
diff --git a/gcc/testsuite/gdc.test/runnable/mars1.d b/gcc/testsuite/gdc.test/runnable/mars1.d
index 1f4e55d9ac4..91d93dbf81e 100644
--- a/gcc/testsuite/gdc.test/runnable/mars1.d
+++ b/gcc/testsuite/gdc.test/runnable/mars1.d
@@ -238,13 +238,13 @@  void test13023(ulong n)
 
 struct U { int a; union { char c; int d; } long b; }
 
-U f = { b:3, d:2, a:1 };
+U f = { b:3, d:0x22222222, a:1 };
 
 void testU()
 {
     assert(f.b == 3);
-    assert(f.d == 2);
-    assert(f.c == 2);
+    assert(f.d == 0x22222222);
+    assert(f.c == 0x22);
     assert(f.a == 1);
     assert(f.sizeof == 16);
     assert(U.sizeof == 16);
diff --git a/gcc/testsuite/gdc.test/runnable/test12.d b/gcc/testsuite/gdc.test/runnable/test12.d
index 7656de70af6..2b1fb0e62f7 100644
--- a/gcc/testsuite/gdc.test/runnable/test12.d
+++ b/gcc/testsuite/gdc.test/runnable/test12.d
@@ -622,9 +622,12 @@  struct S29 {
 
 int hoge(S29 s) {
     char[10] b;
-    printf("%x\n", s);
-    sprintf(b.ptr, "%x", s);
-    assert(b[0 .. 7] == "4030201");
+    printf("%x\n", *cast(int*)&s);
+    sprintf(b.ptr, "%x", *cast(int*)&s);
+    version (LittleEndian)
+        assert(b[0 .. 7] == "4030201");
+    version (BigEndian)
+        assert(b[0 .. 7] == "1020304");
     return 0;
 }
 
diff --git a/gcc/testsuite/gdc.test/runnable/test23.d b/gcc/testsuite/gdc.test/runnable/test23.d
index ee17be0b00f..f43f6a46091 100644
--- a/gcc/testsuite/gdc.test/runnable/test23.d
+++ b/gcc/testsuite/gdc.test/runnable/test23.d
@@ -553,19 +553,22 @@  void test24()
 
 void test25()
 {
-  char[6] cstr = "123456"c;
-  auto str1 = cast(wchar[3])(cstr);
-
-  writefln("str1: ", (cast(char[])str1).length , " : ", (cast(char[])str1));
-  assert(cast(char[])str1 == "123456"c);
-
-  auto str2 = cast(wchar[3])("789abc"c);
-  writefln("str2: ", (cast(char[])str2).length , " : ", (cast(char[])str2));
-  assert(cast(char[])str2 == "789abc"c);
-
-  auto str3 = cast(wchar[3])("defghi");
-  writefln("str3: ", (cast(char[])str3).length , " : ", (cast(char[])str3));
-  assert(cast(char[])str3 == "d\000e\000f\000"c);
+    char[6] cstr = "123456"c;
+    auto str1 = cast(wchar[3])(cstr);
+
+    writefln("str1: ", (cast(char[])str1).length , " : ", (cast(char[])str1));
+    assert(cast(char[])str1 == "123456"c);
+
+    auto str2 = cast(wchar[3])("789abc"c);
+    writefln("str2: ", (cast(char[])str2).length , " : ", (cast(char[])str2));
+    assert(cast(char[])str2 == "789abc"c);
+
+    auto str3 = cast(wchar[3])("defghi");
+    writefln("str3: ", (cast(char[])str3).length , " : ", (cast(char[])str3));
+    version (LittleEndian)
+        assert(cast(char[])str3 == "d\000e\000f\000"c);
+    version (BigEndian)
+        assert(cast(char[])str3 == "\000d\000e\000f"c);
 }
 
 /*******************************************/