[cfe-dev] StructTypes to Metadata
Михаил
neonomaly.x at gmail.com
Wed May 2 10:08:38 PDT 2012
Hi.
I've tried to export inheritance of CXX classes into Metadata:
!ISPDIL_INH_<class or struct name> = {!0}
!0 = {!metadata <one of parent>, !metadata <another parent>}
For achieving this I've changed ConvertRecordDeclType in CodeGenTypes.cpp:
llvm::StructType *CodeGenTypes::ConvertRecordDeclType(const RecordDecl *RD) {
// TagDecl's are not necessarily unique, instead use the (clang)
// type connected to the decl.
const Type *Key = Context.getTagDeclType(RD).getTypePtr();
llvm::StructType *&Entry = RecordDeclTypes[Key];
// If we don't have a StructType at all yet, create the forward declaration.
if (Entry == 0) {
Entry = llvm::StructType::create(getLLVMContext());
addRecordTypeName(RD, Entry, "");
}
llvm::StructType *Ty = Entry;
// If this is still a forward declaration, or the LLVM type is already
// complete, there's nothing more to do.
RD = RD->getDefinition();
if (RD == 0 || !RD->isCompleteDefinition() || !Ty->isOpaque())
return Ty;
// If converting this type would cause us to infinitely loop, don't do it!
if (!isSafeToConvert(RD, *this)) {
DeferredRecords.push_back(RD);
return Ty;
}
// Okay, this is a definition of a type. Compile the implementation now.
bool InsertResult = RecordsBeingLaidOut.insert(Key); (void)InsertResult;
assert(InsertResult && "Recursively compiling a struct?");
// Force conversion of non-virtual base classes recursively.
if (const CXXRecordDecl *CRD = dyn_cast<CXXRecordDecl>(RD)) {
std::vector<llvm::StructType *> parentsForISPDIL;
for (CXXRecordDecl::base_class_const_iterator i = CRD->bases_begin(), e = CRD->bases_end(); i != e; ++i) {
if (i->isVirtual()) continue;
parentsForISPDIL.push_back(ConvertRecordDeclType(i->getType()->getAs<RecordType>()->getDecl()));
}
// ISPDIL inheritance import
std::vector<llvm::Value*> parents;
for (std::vector<llvm::StructType*>::iterator p = parentsForISPDIL.begin(); p!=parentsForISPDIL.end(); p++) {
parents.push_back(llvm::MDString::get(Ty->getContext(), (*p)->getName()));
}
llvm::MDNode* Node = llvm::MDNode::get(Ty->getContext(), parents);
llvm::NamedMDNode* NMD = TheModule.getOrInsertNamedMetadata(std::string("ISPDIL_INH_").append(Ty->getName()));
NMD->addOperand(Node);
}
// Layout fields.
CGRecordLayout *Layout = ComputeRecordLayout(RD, Ty);
CGRecordLayouts[Key] = Layout;
// We're done laying out this struct.
bool EraseResult = RecordsBeingLaidOut.erase(Key); (void)EraseResult;
assert(EraseResult && "struct not in RecordsBeingLaidOut set?");
// If this struct blocked a FunctionType conversion, then recompute whatever
// was derived from that.
// FIXME: This is hugely overconservative.
if (SkippedLayout)
TypeCache.clear();
// If we're done converting the outer-most record, then convert any deferred
// structs as well.
if (RecordsBeingLaidOut.empty())
while (!DeferredRecords.empty())
ConvertRecordDeclType(DeferredRecords.pop_back_val());
return Ty;
}
But with that patch I haven't some classes from Module in my Metadata in one cases and I have some names in my metadata but module haven't StructTypes according this names.
How can I solve my problem correctly? Thanks!
Yours sincerely,
Kadysev Mikhail
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20120502/7c8ac828/attachment.html>
More information about the cfe-dev
mailing list