changeset 1595:628433c343b4

Fixed DStress tests nocompile/c/{const_32_B.d,const_32_C.d}. Updated the runtest script to build libtangobos-partial.a if it hasn't already been built. Added in signbit() and va_arg!()() to libtangobos-partial.a so more of the phobos dependent DStress tests pass.
author Robert Clipsham <robert@octarineparrot.com>
date Sun, 08 Nov 2009 16:16:17 +0000
parents 9f7151d890ff
children 42fc0d955a0d
files gen/toir.cpp tests/runtest tests/testincludes/Makefile tests/testincludes/std/IEEE.d tests/testincludes/std/stdarg.d
diffstat 5 files changed, 177 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/gen/toir.cpp	Sat Nov 07 14:21:56 2009 +0000
+++ b/gen/toir.cpp	Sun Nov 08 16:16:17 2009 +0000
@@ -266,8 +266,16 @@
     VarDeclaration* vd = var->isVarDeclaration();
     if (vd && vd->isConst() && vd->init)
     {
+        if (vd->inuse)
+        {
+            error("recursive reference %s", toChars());
+            return llvm::UndefValue::get(DtoType(type));
+        }
+        vd->inuse++;
+        LLConstant* ret = DtoConstInitializer(loc, type, vd->init);
+        vd->inuse--;
         // return the initializer
-        return DtoConstInitializer(loc, type, vd->init);
+        return ret;
     }
 
     // fail
--- a/tests/runtest	Sat Nov 07 14:21:56 2009 +0000
+++ b/tests/runtest	Sun Nov 08 16:16:17 2009 +0000
@@ -7,6 +7,14 @@
 fi
 TARGETFILE=$1
 
+# check for libtangobos-partial
+if ! [ -f testincludes/libtangobos-partial.a ] ; then
+    echo "Could not find libtangobos-partial.a, attempting to build."
+    cd testincludes
+    make
+    cd ..
+fi
+
 # check for dstress
 if ! [ -d dstress ] ; then
     echo "Testing requires DStress to be checked out into dstress/"
--- a/tests/testincludes/Makefile	Sat Nov 07 14:21:56 2009 +0000
+++ b/tests/testincludes/Makefile	Sun Nov 08 16:16:17 2009 +0000
@@ -58,9 +58,9 @@
 OBJ_CORE= \
     std/gc.bc \
     std/outofmemory.bc \
+    std/IEEE.bc \
+    std/stdarg.bc \
 #    std/asserterror.bc \
-#    std/math.bc \
-#    std/stdarg.bc
 #    std/format.bc \
 
 ALL_OBJS= \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/testincludes/std/IEEE.d	Sun Nov 08 16:16:17 2009 +0000
@@ -0,0 +1,136 @@
+// Written in the D programming language
+/*
+ * Authors:
+ *      Walter Bright, Don Clugston
+ * Copyright:
+ *      Copyright (c) 2001-2005 by Digital Mars,
+ *      All Rights Reserved,
+ *      www.digitalmars.com
+ * License:
+ *  This software is provided 'as-is', without any express or implied
+ *  warranty. In no event will the authors be held liable for any damages
+ *  arising from the use of this software.
+ *
+ *  Permission is granted to anyone to use this software for any purpose,
+ *  including commercial applications, and to alter it and redistribute it
+ *  freely, subject to the following restrictions:
+ *
+ *  <ul>
+ *  <li> The origin of this software must not be misrepresented; you must not
+ *       claim that you wrote the original software. If you use this software
+ *       in a product, an acknowledgment in the product documentation would be
+ *       appreciated but is not required.
+ *  </li>
+ *  <li> Altered source versions must be plainly marked as such, and must not
+ *       be misrepresented as being the original software.
+ *  </li>
+ *  <li> This notice may not be removed or altered from any source
+ *       distribution.
+ *  </li>
+ *  </ul>
+ */
+/* Cut down version for libtangobos-partial/dstress */
+
+module tango.math.IEEE;
+
+
+private:
+/*
+ * The following IEEE 'real' formats are currently supported:
+ * 64 bit Big-endian  'double' (eg PowerPC)
+ * 128 bit Big-endian 'quadruple' (eg SPARC)
+ * 64 bit Little-endian 'double' (eg x86-SSE2)
+ * 80 bit Little-endian, with implied bit 'real80' (eg x87, Itanium).
+ * 128 bit Little-endian 'quadruple' (not implemented on any known processor!)
+ *
+ * Non-IEEE 128 bit Big-endian 'doubledouble' (eg PowerPC) has partial support
+ */
+version(LittleEndian) {
+    static assert(real.mant_dig == 53 || real.mant_dig==64
+               || real.mant_dig == 113,
+      "Only 64-bit, 80-bit, and 128-bit reals"
+      " are supported for LittleEndian CPUs");
+} else {
+    static assert(real.mant_dig == 53 || real.mant_dig==106
+               || real.mant_dig == 113,
+    "Only 64-bit and 128-bit reals are supported for BigEndian CPUs."
+    " double-double reals have partial support");
+}
+
+// Constants used for extracting the components of the representation.
+// They supplement the built-in floating point properties.
+template floatTraits(T) {
+ // EXPMASK is a ushort mask to select the exponent portion (without sign)
+ // POW2MANTDIG = pow(2, real.mant_dig) is the value such that
+ //  (smallest_denormal)*POW2MANTDIG == real.min
+ // EXPPOS_SHORT is the index of the exponent when represented as a ushort array.
+ // SIGNPOS_BYTE is the index of the sign when represented as a ubyte array.
+ static if (T.mant_dig == 24) { // float
+    const ushort EXPMASK = 0x7F80;
+    const ushort EXPBIAS = 0x3F00;
+    const uint EXPMASK_INT = 0x7F80_0000;
+    const uint MANTISSAMASK_INT = 0x007F_FFFF;
+    const real POW2MANTDIG = 0x1p+24;
+    version(LittleEndian) {
+      const EXPPOS_SHORT = 1;
+    } else {
+      const EXPPOS_SHORT = 0;
+    }
+ } else static if (T.mant_dig == 53) { // double, or real==double
+    const ushort EXPMASK = 0x7FF0;
+    const ushort EXPBIAS = 0x3FE0;
+    const uint EXPMASK_INT = 0x7FF0_0000;
+    const uint MANTISSAMASK_INT = 0x000F_FFFF; // for the MSB only
+    const real POW2MANTDIG = 0x1p+53;
+    version(LittleEndian) {
+      const EXPPOS_SHORT = 3;
+      const SIGNPOS_BYTE = 7;
+    } else {
+      const EXPPOS_SHORT = 0;
+      const SIGNPOS_BYTE = 0;
+    }
+ } else static if (T.mant_dig == 64) { // real80
+    const ushort EXPMASK = 0x7FFF;
+    const ushort EXPBIAS = 0x3FFE;
+    const real POW2MANTDIG = 0x1p+63;
+    version(LittleEndian) {
+      const EXPPOS_SHORT = 4;
+      const SIGNPOS_BYTE = 9;
+    } else {
+      const EXPPOS_SHORT = 0;
+      const SIGNPOS_BYTE = 0;
+    }
+ } else static if (real.mant_dig == 113){ // quadruple
+    const ushort EXPMASK = 0x7FFF;
+    const real POW2MANTDIG = 0x1p+113;
+    version(LittleEndian) {
+      const EXPPOS_SHORT = 7;
+      const SIGNPOS_BYTE = 15;
+    } else {
+      const EXPPOS_SHORT = 0;
+      const SIGNPOS_BYTE = 0;
+    }
+ } else static if (real.mant_dig == 106) { // doubledouble
+    const ushort EXPMASK = 0x7FF0;
+    const real POW2MANTDIG = 0x1p+53;  // doubledouble denormals are strange
+    // and the exponent byte is not unique
+    version(LittleEndian) {
+      const EXPPOS_SHORT = 7; // [3] is also an exp short
+      const SIGNPOS_BYTE = 15;
+    } else {
+      const EXPPOS_SHORT = 0; // [4] is also an exp short
+      const SIGNPOS_BYTE = 0;
+    }
+ }
+}
+
+
+public:
+/*********************************
+ * Return 1 if sign bit of e is set, 0 if not.
+ */
+
+int signbit(real x)
+{
+    return ((cast(ubyte *)&x)[floatTraits!(real).SIGNPOS_BYTE] & 0x80) != 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/testincludes/std/stdarg.d	Sun Nov 08 16:16:17 2009 +0000
@@ -0,0 +1,22 @@
+
+/*
+ * Placed in public domain.
+ * Written by Hauke Duden and Walter Bright
+ */
+
+/* This is for use with variable argument lists with extern(D) linkage. */
+
+module std.stdarg;
+
+alias void* va_list;
+
+template va_arg(T)
+{
+    T va_arg(inout va_list _argptr)
+    {
+	T arg = *cast(T*)_argptr;
+	_argptr = _argptr + ((T.sizeof + int.sizeof - 1) & ~(int.sizeof - 1));
+	return arg;
+    }
+}
+