зеркало из https://github.com/microsoft/clang.git
Simplify the debug info code, handle lvalue references and template specializations.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86277 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
30509a30a9
Коммит
a031b35ba4
|
@ -242,32 +242,37 @@ llvm::DIType CGDebugInfo::CreateQualifiedType(QualType Ty, llvm::DICompileUnit U
|
|||
|
||||
llvm::DIType CGDebugInfo::CreateType(const ObjCObjectPointerType *Ty,
|
||||
llvm::DICompileUnit Unit) {
|
||||
llvm::DIType EltTy = getOrCreateType(Ty->getPointeeType(), Unit);
|
||||
|
||||
// Bit size, align and offset of the type.
|
||||
uint64_t Size = M->getContext().getTypeSize(Ty);
|
||||
uint64_t Align = M->getContext().getTypeAlign(Ty);
|
||||
|
||||
llvm::DIType DbgTy =
|
||||
DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type, Unit,
|
||||
"", llvm::DICompileUnit(),
|
||||
0, Size, Align, 0, 0, EltTy);
|
||||
CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty,
|
||||
Ty->getPointeeType(), Unit);
|
||||
TypeCache[QualType(Ty, 0).getAsOpaquePtr()] = DbgTy.getNode();
|
||||
return DbgTy;
|
||||
}
|
||||
|
||||
llvm::DIType CGDebugInfo::CreateType(const PointerType *Ty,
|
||||
llvm::DICompileUnit Unit) {
|
||||
llvm::DIType EltTy = getOrCreateType(Ty->getPointeeType(), Unit);
|
||||
return CreatePointerLikeType(llvm::dwarf::DW_TAG_pointer_type, Ty,
|
||||
Ty->getPointeeType(), Unit);
|
||||
}
|
||||
|
||||
llvm::DIType CGDebugInfo::CreatePointerLikeType(unsigned Tag,
|
||||
const Type *Ty,
|
||||
QualType PointeeTy,
|
||||
llvm::DICompileUnit Unit) {
|
||||
llvm::DIType EltTy = getOrCreateType(PointeeTy, Unit);
|
||||
|
||||
// Bit size, align and offset of the type.
|
||||
uint64_t Size = M->getContext().getTypeSize(Ty);
|
||||
|
||||
// Size is always the size of a pointer. We can't use getTypeSize here
|
||||
// because that does not return the correct value for references.
|
||||
uint64_t Size =
|
||||
M->getContext().Target.getPointerWidth(PointeeTy.getAddressSpace());
|
||||
uint64_t Align = M->getContext().getTypeAlign(Ty);
|
||||
|
||||
return
|
||||
DebugFactory.CreateDerivedType(llvm::dwarf::DW_TAG_pointer_type, Unit,
|
||||
"", llvm::DICompileUnit(),
|
||||
DebugFactory.CreateDerivedType(Tag, Unit, "", llvm::DICompileUnit(),
|
||||
0, Size, Align, 0, 0, EltTy);
|
||||
|
||||
}
|
||||
|
||||
llvm::DIType CGDebugInfo::CreateType(const BlockPointerType *Ty,
|
||||
|
@ -802,6 +807,11 @@ llvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty,
|
|||
return DbgTy;
|
||||
}
|
||||
|
||||
llvm::DIType CGDebugInfo::CreateType(const LValueReferenceType *Ty,
|
||||
llvm::DICompileUnit Unit) {
|
||||
return CreatePointerLikeType(llvm::dwarf::DW_TAG_reference_type,
|
||||
Ty, Ty->getPointeeType(), Unit);
|
||||
}
|
||||
|
||||
/// getOrCreateType - Get the type from the cache or create a new
|
||||
/// one if necessary.
|
||||
|
@ -890,6 +900,14 @@ llvm::DIType CGDebugInfo::CreateTypeNode(QualType Ty,
|
|||
return CreateTypeNode(T->getReplacementType(), Unit);
|
||||
}
|
||||
|
||||
case Type::TemplateSpecialization: {
|
||||
const TemplateSpecializationType *T = cast<TemplateSpecializationType>(Ty);
|
||||
return CreateTypeNode(T->desugar(), Unit);
|
||||
}
|
||||
|
||||
case Type::LValueReference:
|
||||
return CreateType(cast<LValueReferenceType>(Ty), Unit);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -73,7 +73,11 @@ class CGDebugInfo {
|
|||
llvm::DIType CreateType(const ObjCInterfaceType *Ty, llvm::DICompileUnit U);
|
||||
llvm::DIType CreateType(const EnumType *Ty, llvm::DICompileUnit U);
|
||||
llvm::DIType CreateType(const ArrayType *Ty, llvm::DICompileUnit U);
|
||||
llvm::DIType CreateType(const LValueReferenceType *Ty, llvm::DICompileUnit U);
|
||||
|
||||
llvm::DIType CreatePointerLikeType(unsigned Tag,
|
||||
const Type *Ty, QualType PointeeTy,
|
||||
llvm::DICompileUnit U);
|
||||
public:
|
||||
CGDebugInfo(CodeGenModule *m);
|
||||
~CGDebugInfo();
|
||||
|
|
|
@ -4,3 +4,5 @@ template<typename T> struct Identity {
|
|||
};
|
||||
|
||||
void f(Identity<int>::Type a) {}
|
||||
void f(Identity<int> a) {}
|
||||
void f(int& a) { }
|
||||
|
|
Загрузка…
Ссылка в новой задаче