changeset 1291:875afb7a93b6

Factor out some constants into the header so producers and consumers of metadata stay in sync (and are more readable).
author Frits van Bommel <fvbommel wxs.nl>
date Sat, 02 May 2009 20:42:58 +0200
parents c86a629f24dd
children ad41053c336e
files gen/metadata.h gen/passes/GarbageCollect2Stack.cpp gen/typinf.cpp
diffstat 3 files changed, 30 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/gen/metadata.h	Sat May 02 14:00:57 2009 +0200
+++ b/gen/metadata.h	Sat May 02 20:42:58 2009 +0200
@@ -4,8 +4,24 @@
 #include "gen/llvm-version.h"
 
 #if LLVM_REV >= 68420
-#  define USE_METADATA
-#  define METADATA_LINKAGE_TYPE  llvm::GlobalValue::WeakODRLinkage
+// Yay, we have metadata!
+
+#define USE_METADATA
+#define METADATA_LINKAGE_TYPE  llvm::GlobalValue::WeakODRLinkage
+
+// *** Metadata for TypeInfo instances ***
+#define TD_PREFIX "llvm.ldc.typeinfo."
+
+/// The fields in the metadata node for a TypeInfo instance.
+/// (Its name will be TD_PREFIX ~ <Name of TypeInfo global>)
+enum TypeDataFields {
+    TD_Confirm,     /// The TypeInfo this node is for
+    TD_Type,        /// A value of the LLVM type corresponding to this D type
+    
+    // Must be kept last:
+    TD_NumFields    /// The number of fields in TypeInfo metadata
+};
+
 #endif
 
 #endif
--- a/gen/passes/GarbageCollect2Stack.cpp	Sat May 02 14:00:57 2009 +0200
+++ b/gen/passes/GarbageCollect2Stack.cpp	Sat May 02 20:42:58 2009 +0200
@@ -197,7 +197,7 @@
           DOUT << ">> Value: " << *ti_global << "\n";
           DOUT << ">> Name: " << ti_global->getNameStr() << "\n");
     
-    std::string metaname = "llvm.ldc.typeinfo.";
+    std::string metaname = TD_PREFIX;
     metaname.append(ti_global->getNameStart(), ti_global->getNameEnd());
     
     DEBUG(DOUT << ">> Looking for global named " << metaname << "\n");
@@ -215,13 +215,13 @@
     
     DEBUG(DOUT << ">> Found metadata node\n");
     
-    if (node->getNumOperands() != 2 ||
-            node->getOperand(0)->stripPointerCasts() != ti_global)
+    if (node->getNumOperands() != TD_NumFields ||
+            node->getOperand(TD_Confirm)->stripPointerCasts() != ti_global)
         return NULL;
     
     DEBUG(DOUT << ">> Validated metadata node\n");
     
-    return node->getOperand(1)->getType();
+    return node->getOperand(TD_Type)->getType();
 }
 
 
--- a/gen/typinf.cpp	Sat May 02 14:00:57 2009 +0200
+++ b/gen/typinf.cpp	Sat May 02 20:42:58 2009 +0200
@@ -288,18 +288,18 @@
 
 #ifdef USE_METADATA
     // Add some metadata for use by optimization passes.
-    static std::string prefix = "llvm.ldc.typeinfo.";
-    std::string metaname = prefix + mangle;
+    std::string metaname = std::string(TD_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]));
+        // Construct the fields
+        LLConstant* mdVals[TD_NumFields];
+        mdVals[TD_Confirm] = llvm::cast<LLConstant>(irg->value);
+        mdVals[TD_Type] = llvm::UndefValue::get(DtoType(tid->tinfo));
+        // Construct the metadata
+        llvm::MDNode* metadata = llvm::MDNode::get(mdVals, TD_NumFields);
+        // Insert it into the module
         new llvm::GlobalVariable(metadata->getType(), true,
             METADATA_LINKAGE_TYPE, metadata, metaname, gIR->module);
     }