From a9c518d82b82d13fb36e4f1a510c5e841cf30e3f Mon Sep 17 00:00:00 2001 From: Frits van Bommel Date: Sat, 2 May 2009 11:58:50 +0200 Subject: [PATCH] Add metadata for TypeInfo -> llvm::Type mapping. Disabled for LLVM versions before the introduction of metadata. --- gen/metadata.h | 11 +++++++++++ gen/typinf.cpp | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 gen/metadata.h diff --git a/gen/metadata.h b/gen/metadata.h new file mode 100644 index 00000000..ece5b75f --- /dev/null +++ b/gen/metadata.h @@ -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 --git a/gen/typinf.cpp b/gen/typinf.cpp index 66d5c402..de7a35ad 100644 --- a/gen/typinf.cpp +++ b/gen/typinf.cpp @@ -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 @@ void DtoResolveTypeInfo(TypeInfoDeclaration* tid) 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); }