# HG changeset patch # User Frits van Bommel # Date 1241258330 -7200 # Node ID 5851c18e4c6db916f875caa255e2a6f01c0b39be # Parent 450897f5aae923fc8eb7d684a7e9950604d5f0a8 Add metadata for TypeInfo -> llvm::Type mapping. Disabled for LLVM versions before the introduction of metadata. diff -r 450897f5aae9 -r 5851c18e4c6d gen/metadata.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gen/metadata.h Sat May 02 11:58:50 2009 +0200 @@ -0,0 +1,11 @@ +#ifndef LDC_GEN_METADATA_H +#define LDC_GEN_METADATA_H + +#include "gen/llvm-version.h" + +#if LLVM_REV >= 68420 +# define USE_METADATA +# define METADATA_LINKAGE_TYPE llvm::GlobalValue::WeakODRLinkage +#endif + +#endif diff -r 450897f5aae9 -r 5851c18e4c6d gen/typinf.cpp --- a/gen/typinf.cpp Sat May 02 11:58:50 2009 +0200 +++ b/gen/typinf.cpp Sat May 02 11:58:50 2009 +0200 @@ -40,6 +40,7 @@ #include "gen/structs.h" #include "gen/classes.h" #include "gen/linkage.h" +#include "gen/metadata.h" #include "ir/irvar.h" @@ -285,6 +286,25 @@ tid->ir.irGlobal = irg; +#ifdef USE_METADATA + // Add some metadata for use by optimization passes. + static std::string prefix = "llvm.ldc.typeinfo."; + std::string metaname = prefix + mangle; + LLGlobalVariable* meta = gIR->module->getGlobalVariable(metaname); + // Don't generate metadata for non-concrete types + // (such as tuple types, slice types, typeof(expr), etc.) + if (!meta && tid->tinfo->toBasetype()->ty < Terror) { + LLConstant* mdVals[] = { + llvm::cast(irg->value), + llvm::UndefValue::get(DtoType(tid->tinfo)) + }; + llvm::MDNode* metadata = + llvm::MDNode::get(mdVals, sizeof(mdVals) / sizeof(mdVals[0])); + new llvm::GlobalVariable(metadata->getType(), true, + METADATA_LINKAGE_TYPE, metadata, metaname, gIR->module); + } +#endif + DtoDeclareTypeInfo(tid); }