mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-21 23:33:13 +01:00
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:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user