Mercurial > projects > ldc
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);