changeset 1316:8c65217be813

Work around an LLVM bug by not referring to globals from metadata. This was only used for consistency checking anyway. For the LLVM bug, see http://llvm.org/PR4180 / http://llvm.org/PR4046
author Frits van Bommel <fvbommel wxs.nl>
date Fri, 08 May 2009 16:00:44 +0200
parents c48dcf2e2c02
children 4099548c80e0
files gen/metadata.h gen/passes/GarbageCollect2Stack.cpp gen/typinf.cpp
diffstat 3 files changed, 7 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/gen/metadata.h	Fri May 08 12:21:53 2009 +0200
+++ b/gen/metadata.h	Fri May 08 16:00:44 2009 +0200
@@ -15,7 +15,10 @@
 /// The fields in the metadata node for a TypeInfo instance.
 /// (Its name will be TD_PREFIX ~ <Name of TypeInfo global>)
 enum TypeDataFields {
-    TD_Confirm,     /// The TypeInfo this node is for
+    // TD_Confirm is disabled for now due to an LLVM bug when MDNodes contain
+    // globals (see http://llvm.org/PR4180 / http://llvm.org/PR4046 )
+    TD_Confirm = -1,/// The TypeInfo this node is for.
+    
     TD_Type,        /// A value of the LLVM type corresponding to this D type
     
     // Must be kept last:
--- a/gen/passes/GarbageCollect2Stack.cpp	Fri May 08 12:21:53 2009 +0200
+++ b/gen/passes/GarbageCollect2Stack.cpp	Fri May 08 16:00:44 2009 +0200
@@ -347,7 +347,7 @@
         return NULL;
     
     if (node->getNumOperands() != TD_NumFields ||
-            node->getOperand(TD_Confirm)->stripPointerCasts() != ti_global)
+            (TD_Confirm >= 0 && node->getOperand(TD_Confirm)->stripPointerCasts() != ti_global))
         return NULL;
     
     return node->getOperand(TD_Type)->getType();
--- a/gen/typinf.cpp	Fri May 08 12:21:53 2009 +0200
+++ b/gen/typinf.cpp	Fri May 08 16:00:44 2009 +0200
@@ -295,7 +295,8 @@
     if (!meta && tid->tinfo->toBasetype()->ty < Terror) {
         // Construct the fields
         LLConstant* mdVals[TD_NumFields];
-        mdVals[TD_Confirm] = llvm::cast<LLConstant>(irg->value);
+        if (TD_Confirm >= 0)
+            mdVals[TD_Confirm] = llvm::cast<LLConstant>(irg->value);
         mdVals[TD_Type] = llvm::UndefValue::get(DtoType(tid->tinfo));
         // Construct the metadata
         llvm::MDNode* metadata = llvm::MDNode::get(mdVals, TD_NumFields);