forked from OSchip/llvm-project
Add some caching here for the builtin types.
rdar://12117935 llvm-svn: 162066
This commit is contained in:
parent
c34d391ca2
commit
476e5a3c9e
|
@ -349,42 +349,54 @@ llvm::DIType CGDebugInfo::CreateType(const BuiltinType *BT) {
|
||||||
case BuiltinType::Void:
|
case BuiltinType::Void:
|
||||||
return llvm::DIType();
|
return llvm::DIType();
|
||||||
case BuiltinType::ObjCClass:
|
case BuiltinType::ObjCClass:
|
||||||
return DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
|
if (ClassTy.Verify())
|
||||||
"objc_class", TheCU,
|
return ClassTy;
|
||||||
getOrCreateMainFile(), 0);
|
ClassTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
|
||||||
|
"objc_class", TheCU,
|
||||||
|
getOrCreateMainFile(), 0);
|
||||||
|
return ClassTy;
|
||||||
case BuiltinType::ObjCId: {
|
case BuiltinType::ObjCId: {
|
||||||
// typedef struct objc_class *Class;
|
// typedef struct objc_class *Class;
|
||||||
// typedef struct objc_object {
|
// typedef struct objc_object {
|
||||||
// Class isa;
|
// Class isa;
|
||||||
// } *id;
|
// } *id;
|
||||||
|
|
||||||
// TODO: Cache these two types to avoid duplicates.
|
if (ObjTy.Verify())
|
||||||
llvm::DIType OCTy =
|
return ObjTy;
|
||||||
DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
|
|
||||||
"objc_class", TheCU, getOrCreateMainFile(), 0);
|
if (!ClassTy.Verify())
|
||||||
|
ClassTy = DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
|
||||||
|
"objc_class", TheCU,
|
||||||
|
getOrCreateMainFile(), 0);
|
||||||
|
|
||||||
unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
|
unsigned Size = CGM.getContext().getTypeSize(CGM.getContext().VoidPtrTy);
|
||||||
|
|
||||||
llvm::DIType ISATy = DBuilder.createPointerType(OCTy, Size);
|
llvm::DIType ISATy = DBuilder.createPointerType(ClassTy, Size);
|
||||||
|
|
||||||
llvm::MDNode *ObjTy = DBuilder.createStructType(TheCU, "objc_object",
|
llvm::MDNode *ObjNode = DBuilder.createStructType(TheCU, "objc_object",
|
||||||
getOrCreateMainFile(),
|
getOrCreateMainFile(),
|
||||||
0, 0, 0, 0, llvm::DIArray());
|
0, 0, 0, 0,
|
||||||
|
llvm::DIArray());
|
||||||
SmallVector<llvm::Value *, 1> EltTys;
|
SmallVector<llvm::Value *, 1> EltTys;
|
||||||
llvm::DIType FieldTy =
|
llvm::DIType FieldTy =
|
||||||
DBuilder.createMemberType(llvm::DIDescriptor(ObjTy), "isa",
|
DBuilder.createMemberType(llvm::DIDescriptor(ObjNode), "isa",
|
||||||
getOrCreateMainFile(), 0, Size,
|
getOrCreateMainFile(), 0, Size,
|
||||||
0, 0, 0, ISATy);
|
0, 0, 0, ISATy);
|
||||||
EltTys.push_back(FieldTy);
|
EltTys.push_back(FieldTy);
|
||||||
llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys);
|
llvm::DIArray Elements = DBuilder.getOrCreateArray(EltTys);
|
||||||
|
|
||||||
ObjTy->replaceOperandWith(10, Elements);
|
ObjNode->replaceOperandWith(10, Elements);
|
||||||
return llvm::DIType(ObjTy);
|
ObjTy = llvm::DIType(ObjTy);
|
||||||
|
return ObjTy;
|
||||||
}
|
}
|
||||||
case BuiltinType::ObjCSel: {
|
case BuiltinType::ObjCSel: {
|
||||||
return
|
if (SelTy.Verify())
|
||||||
|
return SelTy;
|
||||||
|
SelTy =
|
||||||
DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
|
DBuilder.createForwardDecl(llvm::dwarf::DW_TAG_structure_type,
|
||||||
"objc_selector", TheCU, getOrCreateMainFile(),
|
"objc_selector", TheCU, getOrCreateMainFile(),
|
||||||
0);
|
0);
|
||||||
|
return SelTy;
|
||||||
}
|
}
|
||||||
case BuiltinType::UChar:
|
case BuiltinType::UChar:
|
||||||
case BuiltinType::Char_U: Encoding = llvm::dwarf::DW_ATE_unsigned_char; break;
|
case BuiltinType::Char_U: Encoding = llvm::dwarf::DW_ATE_unsigned_char; break;
|
||||||
|
|
|
@ -50,6 +50,9 @@ class CGDebugInfo {
|
||||||
llvm::DICompileUnit TheCU;
|
llvm::DICompileUnit TheCU;
|
||||||
SourceLocation CurLoc, PrevLoc;
|
SourceLocation CurLoc, PrevLoc;
|
||||||
llvm::DIType VTablePtrType;
|
llvm::DIType VTablePtrType;
|
||||||
|
llvm::DIType ClassTy;
|
||||||
|
llvm::DIType ObjTy;
|
||||||
|
llvm::DIType SelTy;
|
||||||
|
|
||||||
/// TypeCache - Cache of previously constructed Types.
|
/// TypeCache - Cache of previously constructed Types.
|
||||||
llvm::DenseMap<void *, llvm::WeakVH> TypeCache;
|
llvm::DenseMap<void *, llvm::WeakVH> TypeCache;
|
||||||
|
|
Loading…
Reference in New Issue