changeset 761:fa306ca8843b

Applied fvbommel's patch from #112 Added missing TypeInfoInvariant codegen for D2
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Wed, 12 Nov 2008 02:30:28 +0100
parents 6f33b427bfd1
children d7aae6f09754
files dmd/root.c dmd2/root.c gen/typinf.cpp
diffstat 3 files changed, 29 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/dmd/root.c	Wed Nov 12 00:19:18 2008 +0100
+++ b/dmd/root.c	Wed Nov 12 02:30:28 2008 +0100
@@ -1613,6 +1613,11 @@
     unsigned psize;
     int count;
 
+    // On some platforms (i.e. x86_64) va_list is an array and thus passed by
+    // reference. Copy the input list so we can copy it back before retrying.
+    va_list orig_args;
+    va_copy(orig_args, args);
+
     p = buffer;
     psize = sizeof(buffer);
     for (;;)
@@ -1622,8 +1627,7 @@
 	if (count != -1)
 	    break;
 	psize *= 2;
-#endif
-#if POSIX
+#elif POSIX
 	count = vsnprintf(p,psize,format,args);
 	if (count == -1)
 	    psize *= 2;
@@ -1632,6 +1636,7 @@
 	else
 	    break;
 #endif
+	va_copy(args, orig_args);
 	p = (char *) alloca(psize);	// buffer too small, try again with larger size
     }
     write(p,count);
--- a/dmd2/root.c	Wed Nov 12 00:19:18 2008 +0100
+++ b/dmd2/root.c	Wed Nov 12 02:30:28 2008 +0100
@@ -1613,6 +1613,11 @@
     unsigned psize;
     int count;
 
+    // On some platforms (i.e. x86_64) va_list is an array and thus passed by
+    // reference. Copy the input list so we can copy it back before retrying.
+    va_list orig_args;
+    va_copy(orig_args, args);
+
     p = buffer;
     psize = sizeof(buffer);
     for (;;)
@@ -1622,8 +1627,7 @@
 	if (count != -1)
 	    break;
 	psize *= 2;
-#endif
-#if POSIX
+#elif POSIX
 	count = vsnprintf(p,psize,format,args);
 	if (count == -1)
 	    psize *= 2;
@@ -1632,6 +1636,7 @@
 	else
 	    break;
 #endif
+	va_copy(args, orig_args);
 	p = (char *) alloca(psize);	// buffer too small, try again with larger size
     }
     write(p,count);
--- a/gen/typinf.cpp	Wed Nov 12 00:19:18 2008 +0100
+++ b/gen/typinf.cpp	Wed Nov 12 02:30:28 2008 +0100
@@ -1229,45 +1229,32 @@
     assert(0);
 }
 
-// void TypeInfoConstDeclaration::toDt(dt_t **pdt)
-// {
-//     //printf("TypeInfoConstDeclaration::toDt() %s\n", toChars());
-//     dtxoff(pdt, Type::typeinfoconst->toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfo_Const
-//     dtdword(pdt, 0);                // monitor
-//     Type *tm = tinfo->mutableOf();
-//     tm = tm->merge();
-//     tm->getTypeInfo(NULL);
-//     dtxoff(pdt, tm->vtinfo->toSymbol(), 0, TYnptr);
-// }
-
 ///////////////////////////////////////////////////////////
 
 /* ========================================================================= */
 
-void TypeInfoInvariantDeclaration::toDt(dt_t **pdt)
-{
-    assert(0 && "TypeInfoInvariantDeclaration::toDt");
-}
-
 void TypeInfoInvariantDeclaration::llvmDeclare()
 {
-    assert(0 && "TypeInfoInvariantDeclaration::llvmDeclare");
+    Logger::println("TypeInfoInvariantDeclaration::toDt() %s", toChars());
+    LOG_SCOPE;
+
+    LLVM_D_Declare_TypeInfoBase(this, Type::typeinfoinvariant);
 }
 
 void TypeInfoInvariantDeclaration::llvmDefine()
 {
-    assert(0 && "TypeInfoInvariantDeclaration::llvmDeclare");
+    Logger::println("TypeInfoInvariantDeclaration::toDt() %s", toChars());
+    LOG_SCOPE;
+
+    Type *tm = tinfo->mutableOf();
+    tm = tm->merge();
+
+    LLVM_D_Define_TypeInfoBase(tm, this, Type::typeinfoinvariant);
 }
 
-// void TypeInfoInvariantDeclaration::toDt(dt_t **pdt)
-// {
-//     //printf("TypeInfoInvariantDeclaration::toDt() %s\n", toChars());
-//     dtxoff(pdt, Type::typeinfoinvariant->toVtblSymbol(), 0, TYnptr); // vtbl for TypeInfo_Invariant
-//     dtdword(pdt, 0);                // monitor
-//     Type *tm = tinfo->mutableOf();
-//     tm = tm->merge();
-//     tm->getTypeInfo(NULL);
-//     dtxoff(pdt, tm->vtinfo->toSymbol(), 0, TYnptr);
-// }
+void TypeInfoInvariantDeclaration::toDt(dt_t **pdt)
+{
+    assert(0);
+}
 
 #endif
\ No newline at end of file