Disable metadata for typeid(void).

This commit is contained in:
Tomas Lindquist Olsen 2009-07-31 01:44:47 +02:00
parent 652a4b39c0
commit b7b671ce48

View file

@ -302,21 +302,24 @@ void DtoResolveTypeInfo(TypeInfoDeclaration* tid)
tid->ir.irGlobal = irg; tid->ir.irGlobal = irg;
// Add some metadata for use by optimization passes. // don't do this for void or llvm will crash
std::string metaname = std::string(TD_PREFIX) + mangle; if (tid->tinfo->ty != Tvoid) {
llvm::NamedMDNode* meta = gIR->module->getNamedMetadata(metaname); // Add some metadata for use by optimization passes.
// Don't generate metadata for non-concrete types std::string metaname = std::string(TD_PREFIX) + mangle;
// (such as tuple types, slice types, typeof(expr), etc.) llvm::NamedMDNode* meta = gIR->module->getNamedMetadata(metaname);
if (!meta && tid->tinfo->toBasetype()->ty < Terror) { // Don't generate metadata for non-concrete types
// Construct the fields // (such as tuple types, slice types, typeof(expr), etc.)
MDNodeField* mdVals[TD_NumFields]; if (!meta && tid->tinfo->toBasetype()->ty < Terror) {
if (TD_Confirm >= 0) // Construct the fields
mdVals[TD_Confirm] = llvm::cast<MDNodeField>(irg->value); MDNodeField* mdVals[TD_NumFields];
mdVals[TD_Type] = llvm::UndefValue::get(DtoType(tid->tinfo)); if (TD_Confirm >= 0)
// Construct the metadata mdVals[TD_Confirm] = llvm::cast<MDNodeField>(irg->value);
llvm::MetadataBase* metadata = gIR->context().getMDNode(mdVals, TD_NumFields); mdVals[TD_Type] = llvm::UndefValue::get(DtoType(tid->tinfo));
// Insert it into the module // Construct the metadata
llvm::NamedMDNode::Create(metaname, &metadata, 1, gIR->module); llvm::MetadataBase* metadata = gIR->context().getMDNode(mdVals, TD_NumFields);
// Insert it into the module
llvm::NamedMDNode::Create(metaname, &metadata, 1, gIR->module);
}
} }
DtoDeclareTypeInfo(tid); DtoDeclareTypeInfo(tid);