From adf1fd4d449b1bbfb90fb67802e1ee813d269921 Mon Sep 17 00:00:00 2001 From: Frits van Bommel Date: Fri, 8 May 2009 16:00:44 +0200 Subject: [PATCH] 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 --- gen/metadata.h | 5 ++++- gen/passes/GarbageCollect2Stack.cpp | 2 +- gen/typinf.cpp | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/gen/metadata.h b/gen/metadata.h index 2e9363e1..d202789b 100644 --- a/gen/metadata.h +++ b/gen/metadata.h @@ -15,7 +15,10 @@ /// The fields in the metadata node for a TypeInfo instance. /// (Its name will be TD_PREFIX ~ ) 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: diff --git a/gen/passes/GarbageCollect2Stack.cpp b/gen/passes/GarbageCollect2Stack.cpp index 91fb7fa0..09239d65 100644 --- a/gen/passes/GarbageCollect2Stack.cpp +++ b/gen/passes/GarbageCollect2Stack.cpp @@ -347,7 +347,7 @@ const Type* Analysis::getTypeFor(Value* typeinfo) const { 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(); diff --git a/gen/typinf.cpp b/gen/typinf.cpp index a240ada5..fad45739 100644 --- a/gen/typinf.cpp +++ b/gen/typinf.cpp @@ -295,7 +295,8 @@ void DtoResolveTypeInfo(TypeInfoDeclaration* tid) if (!meta && tid->tinfo->toBasetype()->ty < Terror) { // Construct the fields LLConstant* mdVals[TD_NumFields]; - mdVals[TD_Confirm] = llvm::cast(irg->value); + if (TD_Confirm >= 0) + mdVals[TD_Confirm] = llvm::cast(irg->value); mdVals[TD_Type] = llvm::UndefValue::get(DtoType(tid->tinfo)); // Construct the metadata llvm::MDNode* metadata = llvm::MDNode::get(mdVals, TD_NumFields);