From c831367b2465dc4fc644af68a238d920daf53e99 Mon Sep 17 00:00:00 2001 From: Frits van Bommel Date: Sat, 2 May 2009 20:42:58 +0200 Subject: [PATCH] Factor out some constants into the header so producers and consumers of metadata stay in sync (and are more readable). --- gen/metadata.h | 20 ++++++++++++++++++-- gen/passes/GarbageCollect2Stack.cpp | 8 ++++---- gen/typinf.cpp | 16 ++++++++-------- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/gen/metadata.h b/gen/metadata.h index ece5b75f..2e9363e1 100644 --- a/gen/metadata.h +++ b/gen/metadata.h @@ -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 ~ ) +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 diff --git a/gen/passes/GarbageCollect2Stack.cpp b/gen/passes/GarbageCollect2Stack.cpp index 7e1c550e..9bd59e6a 100644 --- a/gen/passes/GarbageCollect2Stack.cpp +++ b/gen/passes/GarbageCollect2Stack.cpp @@ -197,7 +197,7 @@ const Type* GarbageCollect2Stack::getTypeFor(Value* typeinfo) { 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 @@ const Type* GarbageCollect2Stack::getTypeFor(Value* typeinfo) { 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(); } diff --git a/gen/typinf.cpp b/gen/typinf.cpp index de7a35ad..a240ada5 100644 --- a/gen/typinf.cpp +++ b/gen/typinf.cpp @@ -288,18 +288,18 @@ void DtoResolveTypeInfo(TypeInfoDeclaration* tid) #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(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(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); }