Factor out some constants into the header so producers and consumers of

metadata stay in sync (and are more readable).
This commit is contained in:
Frits van Bommel
2009-05-02 20:42:58 +02:00
parent 2b18460169
commit c831367b24
3 changed files with 30 additions and 14 deletions

View File

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