Mercurial > projects > ldc
diff gen/typinf.cpp @ 1284:5851c18e4c6d
Add metadata for TypeInfo -> llvm::Type mapping.
Disabled for LLVM versions before the introduction of metadata.
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Sat, 02 May 2009 11:58:50 +0200 |
parents | 450897f5aae9 |
children | 875afb7a93b6 |
line wrap: on
line diff
--- 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<LLConstant>(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); }