From e34f07505b11155b181a81f0a38b5c59dd2d5b27 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Thu, 30 Jul 2009 20:54:03 +0200 Subject: [PATCH] use the new NamedMDNode class this will need a LLVM >= r77619 --- gen/metadata.h | 2 +- gen/passes/GarbageCollect2Stack.cpp | 26 +++++++++++++------------- gen/typinf.cpp | 7 +++---- ir/irclass.cpp | 6 +++--- 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/gen/metadata.h b/gen/metadata.h index 3716a46c..aba4c65c 100644 --- a/gen/metadata.h +++ b/gen/metadata.h @@ -2,7 +2,7 @@ #define LDC_GEN_METADATA_H // MDNode was moved into its own header, and contains Value*s -#include "llvm/MDNode.h" +#include "llvm/Metadata.h" typedef llvm::Value MDNodeField; // Use getNumElements() and getElement() to access elements. diff --git a/gen/passes/GarbageCollect2Stack.cpp b/gen/passes/GarbageCollect2Stack.cpp index dbfaa09f..2cbe834a 100644 --- a/gen/passes/GarbageCollect2Stack.cpp +++ b/gen/passes/GarbageCollect2Stack.cpp @@ -201,18 +201,18 @@ namespace { GlobalVariable* ClassInfo = dyn_cast(arg); if (!ClassInfo) return false; - + std::string metaname = CD_PREFIX; metaname += ClassInfo->getName(); - - GlobalVariable* global = A.M.getGlobalVariable(metaname); - if (!global || !global->hasInitializer()) + + NamedMDNode* meta = A.M.getNamedMetadata(metaname); + if (!meta) return false; - - MDNode* node = dyn_cast(global->getInitializer()); + + MDNode* node = static_cast(meta->getElement(0)); if (!node || MD_GetNumElements(node) != CD_NumFields) return false; - + // Inserting destructor calls is not implemented yet, so classes // with destructors are ignored for now. Constant* hasDestructor = dyn_cast(MD_GetElement(node, CD_Finalize)); @@ -396,15 +396,15 @@ const Type* Analysis::getTypeFor(Value* typeinfo) const { std::string metaname = TD_PREFIX; metaname += ti_global->getName(); - - GlobalVariable* global = M.getGlobalVariable(metaname); - if (!global || !global->hasInitializer()) + + NamedMDNode* meta = M.getNamedMetadata(metaname); + if (!meta) return NULL; - - MDNode* node = dyn_cast(global->getInitializer()); + + MDNode* node = static_cast(meta->getElement(0)); if (!node) return NULL; - + if (MD_GetNumElements(node) != TD_NumFields) return NULL; if (TD_Confirm >= 0 && (!MD_GetElement(node, TD_Confirm) || diff --git a/gen/typinf.cpp b/gen/typinf.cpp index c0243c59..39ab6a85 100644 --- a/gen/typinf.cpp +++ b/gen/typinf.cpp @@ -304,7 +304,7 @@ void DtoResolveTypeInfo(TypeInfoDeclaration* tid) // Add some metadata for use by optimization passes. std::string metaname = std::string(TD_PREFIX) + mangle; - LLGlobalVariable* meta = gIR->module->getGlobalVariable(metaname); + llvm::NamedMDNode* meta = gIR->module->getNamedMetadata(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) { @@ -314,10 +314,9 @@ void DtoResolveTypeInfo(TypeInfoDeclaration* tid) mdVals[TD_Confirm] = llvm::cast(irg->value); mdVals[TD_Type] = llvm::UndefValue::get(DtoType(tid->tinfo)); // Construct the metadata - llvm::MDNode* metadata = gIR->context().getMDNode(mdVals, TD_NumFields); + llvm::MetadataBase* metadata = gIR->context().getMDNode(mdVals, TD_NumFields); // Insert it into the module - new llvm::GlobalVariable(*gIR->module, metadata->getType(), true, - METADATA_LINKAGE_TYPE, metadata, metaname); + llvm::NamedMDNode::Create(metaname, &metadata, 1, gIR->module); } DtoDeclareTypeInfo(tid); diff --git a/ir/irclass.cpp b/ir/irclass.cpp index b123a581..c310b18d 100644 --- a/ir/irclass.cpp +++ b/ir/irclass.cpp @@ -85,10 +85,10 @@ LLGlobalVariable * IrStruct::getClassInfoSymbol() mdVals[CD_Finalize] = LLConstantInt::get(LLType::Int1Ty, hasDestructor); mdVals[CD_CustomDelete] = LLConstantInt::get(LLType::Int1Ty, hasCustomDelete); // Construct the metadata - llvm::MDNode* metadata = gIR->context().getMDNode(mdVals, CD_NumFields); + llvm::MetadataBase* metadata = gIR->context().getMDNode(mdVals, CD_NumFields); // Insert it into the module - new llvm::GlobalVariable(*gIR->module, metadata->getType(), true, - METADATA_LINKAGE_TYPE, metadata, CD_PREFIX + initname); + std::string metaname = CD_PREFIX + initname; + llvm::NamedMDNode::Create(metaname, &metadata, 1, gIR->module); } return classInfo;