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);
 }