@@ -242,32 +242,37 @@ llvm::DIType CGDebugInfo::CreateQualifiedType(QualType Ty, llvm::DICompileUnit U
242
242
243
243
llvm::DIType CGDebugInfo::CreateType (const ObjCObjectPointerType *Ty,
244
244
llvm::DICompileUnit Unit) {
245
- llvm::DIType EltTy = getOrCreateType (Ty->getPointeeType (), Unit);
246
-
247
- // Bit size, align and offset of the type.
248
- uint64_t Size = M->getContext ().getTypeSize (Ty);
249
- uint64_t Align = M->getContext ().getTypeAlign (Ty);
250
-
251
245
llvm::DIType DbgTy =
252
- DebugFactory.CreateDerivedType (llvm::dwarf::DW_TAG_pointer_type, Unit,
253
- " " , llvm::DICompileUnit (),
254
- 0 , Size, Align, 0 , 0 , EltTy);
246
+ CreatePointerLikeType (llvm::dwarf::DW_TAG_pointer_type, Ty,
247
+ Ty->getPointeeType (), Unit);
255
248
TypeCache[QualType (Ty, 0 ).getAsOpaquePtr ()] = DbgTy.getNode ();
256
249
return DbgTy;
257
250
}
258
251
259
252
llvm::DIType CGDebugInfo::CreateType (const PointerType *Ty,
260
253
llvm::DICompileUnit Unit) {
261
- llvm::DIType EltTy = getOrCreateType (Ty->getPointeeType (), Unit);
254
+ return CreatePointerLikeType (llvm::dwarf::DW_TAG_pointer_type, Ty,
255
+ Ty->getPointeeType (), Unit);
256
+ }
257
+
258
+ llvm::DIType CGDebugInfo::CreatePointerLikeType (unsigned Tag,
259
+ const Type *Ty,
260
+ QualType PointeeTy,
261
+ llvm::DICompileUnit Unit) {
262
+ llvm::DIType EltTy = getOrCreateType (PointeeTy, Unit);
262
263
263
264
// Bit size, align and offset of the type.
264
- uint64_t Size = M->getContext ().getTypeSize (Ty);
265
+
266
+ // Size is always the size of a pointer. We can't use getTypeSize here
267
+ // because that does not return the correct value for references.
268
+ uint64_t Size =
269
+ M->getContext ().Target .getPointerWidth (PointeeTy.getAddressSpace ());
265
270
uint64_t Align = M->getContext ().getTypeAlign (Ty);
266
271
267
272
return
268
- DebugFactory.CreateDerivedType (llvm::dwarf::DW_TAG_pointer_type, Unit,
269
- " " , llvm::DICompileUnit (),
273
+ DebugFactory.CreateDerivedType (Tag, Unit, " " , llvm::DICompileUnit (),
270
274
0 , Size, Align, 0 , 0 , EltTy);
275
+
271
276
}
272
277
273
278
llvm::DIType CGDebugInfo::CreateType (const BlockPointerType *Ty,
@@ -802,6 +807,11 @@ llvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty,
802
807
return DbgTy;
803
808
}
804
809
810
+ llvm::DIType CGDebugInfo::CreateType (const LValueReferenceType *Ty,
811
+ llvm::DICompileUnit Unit) {
812
+ return CreatePointerLikeType (llvm::dwarf::DW_TAG_reference_type,
813
+ Ty, Ty->getPointeeType (), Unit);
814
+ }
805
815
806
816
// / getOrCreateType - Get the type from the cache or create a new
807
817
// / one if necessary.
@@ -890,6 +900,14 @@ llvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty,
890
900
return CreateTypeNode (T->getReplacementType (), Unit);
891
901
}
892
902
903
+ case Type::TemplateSpecialization: {
904
+ const TemplateSpecializationType *T = cast<TemplateSpecializationType>(Ty);
905
+ return CreateTypeNode (T->desugar (), Unit);
906
+ }
907
+
908
+ case Type::LValueReference:
909
+ return CreateType (cast<LValueReferenceType>(Ty), Unit);
910
+
893
911
}
894
912
}
895
913
0 commit comments