Mercurial > projects > ldc
changeset 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 | 91d9386d4a5a |
files | gen/metadata.h gen/typinf.cpp |
diffstat | 2 files changed, 31 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /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
--- 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); }