[llvm] r273358 - [codeview] Improve names of types in scopes and member function ids
Reid Kleckner via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 21 18:32:57 PDT 2016
Author: rnk
Date: Tue Jun 21 20:32:56 2016
New Revision: 273358
URL: http://llvm.org/viewvc/llvm-project?rev=273358&view=rev
Log:
[codeview] Improve names of types in scopes and member function ids
We now include namespace scope info in LF_FUNC_ID records and we emit
LF_MFUNC_ID records for member functions as we should.
Class names are now fully qualified, which is what MSVC does.
Add a little bit of scaffolding to handle ThisAdjustment when it arrives
in DISubprogram.
Added:
llvm/trunk/test/DebugInfo/COFF/scopes.ll
Modified:
llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h
llvm/trunk/test/DebugInfo/COFF/types-calling-conv.ll
llvm/trunk/test/DebugInfo/COFF/types-data-members.ll
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp?rev=273358&r1=273357&r2=273358&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp Tue Jun 21 20:32:56 2016
@@ -123,6 +123,57 @@ CodeViewDebug::getInlineSite(const DILoc
return *Site;
}
+static const DISubprogram *getQualifiedNameComponents(
+ const DIScope *Scope, SmallVectorImpl<StringRef> &QualifiedNameComponents) {
+ const DISubprogram *ClosestSubprogram = nullptr;
+ while (Scope != nullptr) {
+ if (ClosestSubprogram == nullptr)
+ ClosestSubprogram = dyn_cast<DISubprogram>(Scope);
+ StringRef ScopeName = Scope->getName();
+ if (!ScopeName.empty())
+ QualifiedNameComponents.push_back(ScopeName);
+ Scope = Scope->getScope().resolve();
+ }
+ return ClosestSubprogram;
+}
+
+static std::string getQualifiedName(ArrayRef<StringRef> QualifiedNameComponents,
+ StringRef TypeName) {
+ std::string FullyQualifiedName;
+ for (StringRef QualifiedNameComponent : reverse(QualifiedNameComponents)) {
+ FullyQualifiedName.append(QualifiedNameComponent);
+ FullyQualifiedName.append("::");
+ }
+ FullyQualifiedName.append(TypeName);
+ return FullyQualifiedName;
+}
+
+static std::string getFullyQualifiedName(const DIScope *Scope, StringRef Name) {
+ SmallVector<StringRef, 5> QualifiedNameComponents;
+ getQualifiedNameComponents(Scope, QualifiedNameComponents);
+ return getQualifiedName(QualifiedNameComponents, Name);
+}
+
+TypeIndex CodeViewDebug::getScopeIndex(const DIScope *Scope) {
+ // No scope means global scope and that uses the zero index.
+ if (!Scope || isa<DIFile>(Scope))
+ return TypeIndex();
+
+ assert(!isa<DIType>(Scope) && "shouldn't make a namespace scope for a type");
+
+ // Check if we've already translated this scope.
+ auto I = TypeIndices.find({Scope, nullptr});
+ if (I != TypeIndices.end())
+ return I->second;
+
+ // Build the fully qualified name of the scope.
+ std::string ScopeName =
+ getFullyQualifiedName(Scope->getScope().resolve(), Scope->getName());
+ TypeIndex TI =
+ TypeTable.writeStringId(StringIdRecord(TypeIndex(), ScopeName));
+ return recordTypeIndexForDINode(Scope, TI);
+}
+
TypeIndex CodeViewDebug::getFuncIdForSubprogram(const DISubprogram *SP) {
// It's possible to ask for the FuncId of a function which doesn't have a
// subprogram: inlining a function with debug info into a function with none.
@@ -134,22 +185,51 @@ TypeIndex CodeViewDebug::getFuncIdForSub
if (I != TypeIndices.end())
return I->second;
- TypeIndex ParentScope = TypeIndex(0);
// The display name includes function template arguments. Drop them to match
// MSVC.
StringRef DisplayName = SP->getDisplayName().split('<').first;
- FuncIdRecord FuncId(ParentScope, lowerSubprogramType(SP), DisplayName);
- TypeIndex TI = TypeTable.writeFuncId(FuncId);
- recordTypeIndexForDINode(SP, TI);
- return TI;
+ const DIScope *Scope = SP->getScope().resolve();
+ TypeIndex TI;
+ if (const auto *Class = dyn_cast_or_null<DICompositeType>(Scope)) {
+ // If the scope is a DICompositeType, then this must be a method. Member
+ // function types take some special handling, and require access to the
+ // subprogram.
+ TypeIndex ClassType = getTypeIndex(Class);
+ MemberFuncIdRecord MFuncId(ClassType, getMemberFunctionType(SP, Class),
+ DisplayName);
+ TI = TypeTable.writeMemberFuncId(MFuncId);
+ } else {
+ // Otherwise, this must be a free function.
+ TypeIndex ParentScope = getScopeIndex(Scope);
+ FuncIdRecord FuncId(ParentScope, getTypeIndex(SP->getType()), DisplayName);
+ TI = TypeTable.writeFuncId(FuncId);
+ }
+
+ return recordTypeIndexForDINode(SP, TI);
+}
+
+TypeIndex CodeViewDebug::getMemberFunctionType(const DISubprogram *SP,
+ const DICompositeType *Class) {
+ // Key the MemberFunctionRecord into the map as {SP, Class}. It won't collide
+ // with the MemberFuncIdRecord, which is keyed in as {SP, nullptr}.
+ auto I = TypeIndices.find({SP, nullptr});
+ if (I != TypeIndices.end())
+ return I->second;
+
+ // FIXME: Get the ThisAdjustment off of SP when it is available.
+ TypeIndex TI =
+ lowerTypeMemberFunction(SP->getType(), Class, /*ThisAdjustment=*/0);
+
+ return recordTypeIndexForDINode(SP, TI, Class);
}
-void CodeViewDebug::recordTypeIndexForDINode(const DINode *Node, TypeIndex TI,
+TypeIndex CodeViewDebug::recordTypeIndexForDINode(const DINode *Node, TypeIndex TI,
const DIType *ClassTy) {
auto InsertResult = TypeIndices.insert({{Node, ClassTy}, TI});
(void)InsertResult;
assert(InsertResult.second && "DINode was already assigned a type index");
+ return TI;
}
unsigned CodeViewDebug::getPointerSizeInBytes() {
@@ -458,31 +538,6 @@ void CodeViewDebug::switchToDebugSection
emitCodeViewMagicVersion();
}
-static const DISubprogram *getQualifiedNameComponents(
- const DIScope *Scope, SmallVectorImpl<StringRef> &QualifiedNameComponents) {
- const DISubprogram *ClosestSubprogram = nullptr;
- while (Scope != nullptr) {
- if (ClosestSubprogram == nullptr)
- ClosestSubprogram = dyn_cast<DISubprogram>(Scope);
- StringRef ScopeName = Scope->getName();
- if (!ScopeName.empty())
- QualifiedNameComponents.push_back(ScopeName);
- Scope = Scope->getScope().resolve();
- }
- return ClosestSubprogram;
-}
-
-static std::string getQualifiedName(ArrayRef<StringRef> QualifiedNameComponents,
- StringRef TypeName) {
- std::string FullyQualifiedName;
- for (StringRef QualifiedNameComponent : reverse(QualifiedNameComponents)) {
- FullyQualifiedName.append(QualifiedNameComponent);
- FullyQualifiedName.append("::");
- }
- FullyQualifiedName.append(TypeName);
- return FullyQualifiedName;
-}
-
void CodeViewDebug::emitDebugInfoForFunction(const Function *GV,
FunctionInfo &FI) {
// For each function there is a separate subsection
@@ -499,12 +554,9 @@ void CodeViewDebug::emitDebugInfoForFunc
// If we have a display name, build the fully qualified name by walking the
// chain of scopes.
- if (SP != nullptr && !SP->getDisplayName().empty()) {
- SmallVector<StringRef, 5> QualifiedNameComponents;
- getQualifiedNameComponents(SP->getScope().resolve(),
- QualifiedNameComponents);
- FuncName = getQualifiedName(QualifiedNameComponents, SP->getDisplayName());
- }
+ if (SP != nullptr && !SP->getDisplayName().empty())
+ FuncName =
+ getFullyQualifiedName(SP->getScope().resolve(), SP->getDisplayName());
// If our DISubprogram name is empty, use the mangled name.
if (FuncName.empty())
@@ -792,8 +844,12 @@ TypeIndex CodeViewDebug::lowerType(const
case dwarf::DW_TAG_volatile_type:
return lowerTypeModifier(cast<DIDerivedType>(Ty));
case dwarf::DW_TAG_subroutine_type:
- if (ClassTy)
- return lowerTypeMemberFunction(cast<DISubroutineType>(Ty), ClassTy);
+ if (ClassTy) {
+ // The member function type of a member function pointer has no
+ // ThisAdjustment.
+ return lowerTypeMemberFunction(cast<DISubroutineType>(Ty), ClassTy,
+ /*ThisAdjustment=*/0);
+ }
return lowerTypeFunction(cast<DISubroutineType>(Ty));
case dwarf::DW_TAG_enumeration_type:
return lowerTypeEnum(cast<DICompositeType>(Ty));
@@ -1113,7 +1169,8 @@ TypeIndex CodeViewDebug::lowerTypeFuncti
}
TypeIndex CodeViewDebug::lowerTypeMemberFunction(const DISubroutineType *Ty,
- const DIType *ClassTy) {
+ const DIType *ClassTy,
+ int ThisAdjustment) {
// Lower the containing class type.
TypeIndex ClassType = getTypeIndex(ClassTy);
@@ -1150,14 +1207,7 @@ TypeIndex CodeViewDebug::lowerTypeMember
// ThisPointerAdjustment.
TypeIndex TI = TypeTable.writeMemberFunction(MemberFunctionRecord(
ReturnTypeIndex, ClassType, ThisTypeIndex, CC, FunctionOptions::None,
- ArgTypeIndices.size(), ArgListIndex, 0));
-
- return TI;
-}
-
-TypeIndex CodeViewDebug::lowerSubprogramType(const DISubprogram *SP) {
- auto ClassType = dyn_cast_or_null<DIType>(SP->getScope().resolve());
- TypeIndex TI = getTypeIndex(SP->getType(), ClassType);
+ ArgTypeIndices.size(), ArgListIndex, ThisAdjustment));
return TI;
}
@@ -1243,7 +1293,10 @@ TypeIndex CodeViewDebug::lowerTypeEnum(c
FTI = TypeTable.writeFieldList(Fields);
}
- return TypeTable.writeEnum(EnumRecord(EnumeratorCount, CO, FTI, Ty->getName(),
+ std::string FullName =
+ getFullyQualifiedName(Ty->getScope().resolve(), Ty->getName());
+
+ return TypeTable.writeEnum(EnumRecord(EnumeratorCount, CO, FTI, FullName,
Ty->getIdentifier(),
getTypeIndex(Ty->getBaseType())));
}
@@ -1353,9 +1406,11 @@ TypeIndex CodeViewDebug::lowerTypeClass(
TypeRecordKind Kind = getRecordKind(Ty);
ClassOptions CO =
ClassOptions::ForwardReference | getRecordUniqueNameOption(Ty);
+ std::string FullName =
+ getFullyQualifiedName(Ty->getScope().resolve(), Ty->getName());
TypeIndex FwdDeclTI = TypeTable.writeClass(ClassRecord(
Kind, 0, CO, HfaKind::None, WindowsRTClassKind::None, TypeIndex(),
- TypeIndex(), TypeIndex(), 0, Ty->getName(), Ty->getIdentifier()));
+ TypeIndex(), TypeIndex(), 0, FullName, Ty->getIdentifier()));
return FwdDeclTI;
}
@@ -1369,19 +1424,24 @@ TypeIndex CodeViewDebug::lowerCompleteTy
unsigned FieldCount;
std::tie(FieldTI, VShapeTI, FieldCount) = lowerRecordFieldList(Ty);
+ std::string FullName =
+ getFullyQualifiedName(Ty->getScope().resolve(), Ty->getName());
+
uint64_t SizeInBytes = Ty->getSizeInBits() / 8;
return TypeTable.writeClass(ClassRecord(
Kind, FieldCount, CO, HfaKind::None, WindowsRTClassKind::None, FieldTI,
- TypeIndex(), VShapeTI, SizeInBytes, Ty->getName(), Ty->getIdentifier()));
+ TypeIndex(), VShapeTI, SizeInBytes, FullName, Ty->getIdentifier()));
// FIXME: Make an LF_UDT_SRC_LINE record.
}
TypeIndex CodeViewDebug::lowerTypeUnion(const DICompositeType *Ty) {
ClassOptions CO =
ClassOptions::ForwardReference | getRecordUniqueNameOption(Ty);
+ std::string FullName =
+ getFullyQualifiedName(Ty->getScope().resolve(), Ty->getName());
TypeIndex FwdDeclTI =
TypeTable.writeUnion(UnionRecord(0, CO, HfaKind::None, TypeIndex(), 0,
- Ty->getName(), Ty->getIdentifier()));
+ FullName, Ty->getIdentifier()));
return FwdDeclTI;
}
@@ -1391,8 +1451,10 @@ TypeIndex CodeViewDebug::lowerCompleteTy
unsigned FieldCount;
std::tie(FieldTI, std::ignore, FieldCount) = lowerRecordFieldList(Ty);
uint64_t SizeInBytes = Ty->getSizeInBits() / 8;
+ std::string FullName =
+ getFullyQualifiedName(Ty->getScope().resolve(), Ty->getName());
return TypeTable.writeUnion(UnionRecord(FieldCount, CO, HfaKind::None,
- FieldTI, SizeInBytes, Ty->getName(),
+ FieldTI, SizeInBytes, FullName,
Ty->getIdentifier()));
// FIXME: Make an LF_UDT_SRC_LINE record.
}
@@ -1484,8 +1546,7 @@ TypeIndex CodeViewDebug::getTypeIndex(DI
TypeIndex TI = lowerType(Ty, ClassTy);
- recordTypeIndexForDINode(Ty, TI, ClassTy);
- return TI;
+ return recordTypeIndexForDINode(Ty, TI, ClassTy);
}
TypeIndex CodeViewDebug::getCompleteTypeIndex(DITypeRef TypeRef) {
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h?rev=273358&r1=273357&r2=273358&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h Tue Jun 21 20:32:56 2016
@@ -218,6 +218,11 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDe
codeview::TypeIndex getTypeIndex(DITypeRef TypeRef,
DITypeRef ClassTyRef = DITypeRef());
+ codeview::TypeIndex getMemberFunctionType(const DISubprogram *SP,
+ const DICompositeType *Class);
+
+ codeview::TypeIndex getScopeIndex(const DIScope *Scope);
+
codeview::TypeIndex lowerType(const DIType *Ty, const DIType *ClassTy);
codeview::TypeIndex lowerTypeAlias(const DIDerivedType *Ty);
codeview::TypeIndex lowerTypeArray(const DICompositeType *Ty);
@@ -227,7 +232,8 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDe
codeview::TypeIndex lowerTypeModifier(const DIDerivedType *Ty);
codeview::TypeIndex lowerTypeFunction(const DISubroutineType *Ty);
codeview::TypeIndex lowerTypeMemberFunction(const DISubroutineType *Ty,
- const DIType *ClassTy);
+ const DIType *ClassTy,
+ int ThisAdjustment);
codeview::TypeIndex lowerTypeEnum(const DICompositeType *Ty);
codeview::TypeIndex lowerTypeClass(const DICompositeType *Ty);
codeview::TypeIndex lowerTypeUnion(const DICompositeType *Ty);
@@ -242,8 +248,6 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDe
codeview::TypeIndex lowerCompleteTypeClass(const DICompositeType *Ty);
codeview::TypeIndex lowerCompleteTypeUnion(const DICompositeType *Ty);
- codeview::TypeIndex lowerSubprogramType(const DISubprogram *SP);
-
void collectMemberInfo(ClassInfo &Info, const DIDerivedType *DDTy);
ClassInfo &collectClassInfo(const DICompositeType *Ty);
@@ -254,8 +258,9 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDe
lowerRecordFieldList(const DICompositeType *Ty);
/// Inserts {{Node, ClassTy}, TI} into TypeIndices and checks for duplicates.
- void recordTypeIndexForDINode(const DINode *Node, codeview::TypeIndex TI,
- const DIType *ClassTy = nullptr);
+ codeview::TypeIndex recordTypeIndexForDINode(const DINode *Node,
+ codeview::TypeIndex TI,
+ const DIType *ClassTy = nullptr);
unsigned getPointerSizeInBytes();
Added: llvm/trunk/test/DebugInfo/COFF/scopes.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/scopes.ll?rev=273358&view=auto
==============================================================================
--- llvm/trunk/test/DebugInfo/COFF/scopes.ll (added)
+++ llvm/trunk/test/DebugInfo/COFF/scopes.ll Tue Jun 21 20:32:56 2016
@@ -0,0 +1,143 @@
+; RUN: llc < %s -filetype=obj | llvm-readobj - -codeview | FileCheck %s
+
+; Check that we keep namespace scopes around the same way MSVC does.
+; We do function scopes slightly differently, but everything should be alright.
+
+; C++ source to regenerate:
+; namespace foo {
+; namespace bar {
+; void baz() {
+; struct LocalRecord {
+; int x;
+; } l;
+; };
+; struct GlobalRecord {
+; int x;
+; void method();
+; } g;
+; void GlobalRecord::method() {}
+; }
+; }
+
+; CHECK-LABEL: FuncId ({{.*}}) {
+; CHECK-NEXT: TypeLeafKind: LF_FUNC_ID (0x1601)
+; CHECK-NEXT: ParentScope: foo::bar ({{.*}})
+; CHECK-NEXT: FunctionType: void () ({{.*}})
+; CHECK-NEXT: Name: baz
+; CHECK-NEXT: }
+
+; CHECK: Struct ({{.*}}) {
+; CHECK: TypeLeafKind: LF_STRUCTURE (0x1505)
+; CHECK: MemberCount: 0
+; CHECK: Properties [ (0x80)
+; CHECK: ForwardReference (0x80)
+; CHECK: ]
+; CHECK: FieldList: 0x0
+; CHECK: DerivedFrom: 0x0
+; CHECK: VShape: 0x0
+; CHECK: SizeOf: 0
+; CHECK: Name: foo::bar::baz::LocalRecord
+; CHECK: }
+
+; CHECK: Struct ({{.*}}) {
+; CHECK: TypeLeafKind: LF_STRUCTURE (0x1505)
+; CHECK: MemberCount: 1
+; CHECK: Properties [ (0x0)
+; CHECK: ]
+; CHECK: Name: foo::bar::baz::LocalRecord
+; CHECK: }
+
+; CHECK: Struct ({{.*}}) {
+; CHECK: TypeLeafKind: LF_STRUCTURE (0x1505)
+; CHECK: MemberCount: 0
+; CHECK: Properties [ (0x280)
+; CHECK: ForwardReference (0x80)
+; CHECK: HasUniqueName (0x200)
+; CHECK: ]
+; CHECK: FieldList: 0x0
+; CHECK: DerivedFrom: 0x0
+; CHECK: VShape: 0x0
+; CHECK: SizeOf: 0
+; CHECK: Name: foo::bar::GlobalRecord
+; CHECK: }
+
+; CHECK-LABEL: MemberFuncId ({{.*}}) {
+; CHECK-NEXT: TypeLeafKind: LF_MFUNC_ID (0x1602)
+; CHECK-NEXT: ClassType: foo::bar::GlobalRecord ({{.*}})
+; CHECK-NEXT: FunctionType: void foo::bar::GlobalRecord::() ({{.*}})
+; CHECK-NEXT: Name: method
+; CHECK-NEXT: }
+
+
+; ModuleID = 't.cpp'
+source_filename = "t.cpp"
+target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-windows-msvc19.0.23918"
+
+%"struct.foo::bar::GlobalRecord" = type { i32 }
+%struct.LocalRecord = type { i32 }
+
+@"\01?g at bar@foo@@3UGlobalRecord at 12@A" = global %"struct.foo::bar::GlobalRecord" zeroinitializer, align 4
+
+; Function Attrs: nounwind uwtable
+define void @"\01?baz at bar@foo@@YAXXZ"() #0 !dbg !19 {
+entry:
+ %l = alloca %struct.LocalRecord, align 4
+ call void @llvm.dbg.declare(metadata %struct.LocalRecord* %l, metadata !22, metadata !26), !dbg !27
+ ret void, !dbg !28
+}
+
+; Function Attrs: nounwind readnone
+declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
+
+; Function Attrs: nounwind uwtable
+define void @"\01?method at GlobalRecord@bar at foo@@QEAAXXZ"(%"struct.foo::bar::GlobalRecord"* %this) #0 align 2 !dbg !29 {
+entry:
+ %this.addr = alloca %"struct.foo::bar::GlobalRecord"*, align 8
+ store %"struct.foo::bar::GlobalRecord"* %this, %"struct.foo::bar::GlobalRecord"** %this.addr, align 8
+ call void @llvm.dbg.declare(metadata %"struct.foo::bar::GlobalRecord"** %this.addr, metadata !30, metadata !26), !dbg !32
+ %this1 = load %"struct.foo::bar::GlobalRecord"*, %"struct.foo::bar::GlobalRecord"** %this.addr, align 8
+ ret void, !dbg !33
+}
+
+attributes #0 = { nounwind uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
+attributes #1 = { nounwind readnone }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!15, !16, !17}
+!llvm.ident = !{!18}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.9.0 ", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !3)
+!1 = !DIFile(filename: "t.cpp", directory: "D:\5Csrc\5Cllvm\5Cbuild")
+!2 = !{}
+!3 = !{!4}
+!4 = distinct !DIGlobalVariable(name: "g", linkageName: "\01?g at bar@foo@@3UGlobalRecord at 12@A", scope: !5, file: !1, line: 12, type: !7, isLocal: false, isDefinition: true, variable: %"struct.foo::bar::GlobalRecord"* @"\01?g at bar@foo@@3UGlobalRecord at 12@A")
+!5 = !DINamespace(name: "bar", scope: !6, file: !1, line: 2)
+!6 = !DINamespace(name: "foo", scope: null, file: !1, line: 1)
+!7 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "GlobalRecord", scope: !5, file: !1, line: 9, size: 32, align: 32, elements: !8, identifier: ".?AUGlobalRecord at bar@foo@@")
+!8 = !{!9, !11}
+!9 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !7, file: !1, line: 10, baseType: !10, size: 32, align: 32)
+!10 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
+!11 = !DISubprogram(name: "method", linkageName: "\01?method at GlobalRecord@bar at foo@@QEAAXXZ", scope: !7, file: !1, line: 11, type: !12, isLocal: false, isDefinition: false, scopeLine: 11, flags: DIFlagPrototyped, isOptimized: false)
+!12 = !DISubroutineType(types: !13)
+!13 = !{null, !14}
+!14 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !7, size: 64, align: 64, flags: DIFlagArtificial | DIFlagObjectPointer)
+!15 = !{i32 2, !"CodeView", i32 1}
+!16 = !{i32 2, !"Debug Info Version", i32 3}
+!17 = !{i32 1, !"PIC Level", i32 2}
+!18 = !{!"clang version 3.9.0 "}
+!19 = distinct !DISubprogram(name: "baz", linkageName: "\01?baz at bar@foo@@YAXXZ", scope: !5, file: !1, line: 3, type: !20, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
+!20 = !DISubroutineType(types: !21)
+!21 = !{null}
+!22 = !DILocalVariable(name: "l", scope: !19, file: !1, line: 6, type: !23)
+!23 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "LocalRecord", scope: !19, file: !1, line: 4, size: 32, align: 32, elements: !24)
+!24 = !{!25}
+!25 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !23, file: !1, line: 5, baseType: !10, size: 32, align: 32)
+!26 = !DIExpression()
+!27 = !DILocation(line: 6, column: 5, scope: !19)
+!28 = !DILocation(line: 7, column: 1, scope: !19)
+!29 = distinct !DISubprogram(name: "method", linkageName: "\01?method at GlobalRecord@bar at foo@@QEAAXXZ", scope: !7, file: !1, line: 13, type: !12, isLocal: false, isDefinition: true, scopeLine: 13, flags: DIFlagPrototyped, isOptimized: false, unit: !0, declaration: !11, variables: !2)
+!30 = !DILocalVariable(name: "this", arg: 1, scope: !29, type: !31, flags: DIFlagArtificial | DIFlagObjectPointer)
+!31 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !7, size: 64, align: 64)
+!32 = !DILocation(line: 0, scope: !29)
+!33 = !DILocation(line: 13, column: 30, scope: !29)
Modified: llvm/trunk/test/DebugInfo/COFF/types-calling-conv.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/types-calling-conv.ll?rev=273358&r1=273357&r2=273358&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/COFF/types-calling-conv.ll (original)
+++ llvm/trunk/test/DebugInfo/COFF/types-calling-conv.ll Tue Jun 21 20:32:56 2016
@@ -56,8 +56,8 @@
; CHECK: ArgListType: () (0x1002)
; CHECK: }
; CHECK: FuncId (0x1004) {
-; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601)
-; CHECK: ParentScope: 0x0
+; CHECK: TypeLeafKind: LF_MFUNC_ID (0x1602)
+; CHECK: ClassType: A (0x1000)
; CHECK: FunctionType: void A::() (0x1003)
; CHECK: Name: A::thiscallcc
; CHECK: }
Modified: llvm/trunk/test/DebugInfo/COFF/types-data-members.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/types-data-members.ll?rev=273358&r1=273357&r2=273358&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/COFF/types-data-members.ll (original)
+++ llvm/trunk/test/DebugInfo/COFF/types-data-members.ll Tue Jun 21 20:32:56 2016
@@ -288,7 +288,7 @@
; CHECK: DerivedFrom: 0x0
; CHECK: VShape: 0x0
; CHECK: SizeOf: 0
-; CHECK: Name: Nested
+; CHECK: Name: Class::Nested
; CHECK: LinkageName: .?AUNested at Class@@
; CHECK: }
; CHECK: FieldList (0x1014) {
@@ -310,7 +310,7 @@
; CHECK: DerivedFrom: 0x0
; CHECK: VShape: 0x0
; CHECK: SizeOf: 4
-; CHECK: Name: Nested
+; CHECK: Name: Class::Nested
; CHECK: LinkageName: .?AUNested at Class@@
; CHECK: }
; CHECK: Pointer (0x1016) {
@@ -337,8 +337,8 @@
; CHECK: ThisAdjustment: 0
; CHECK: }
; CHECK: FuncId (0x1018) {
-; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601)
-; CHECK: ParentScope: 0x0
+; CHECK: TypeLeafKind: LF_MFUNC_ID (0x1602)
+; CHECK: ClassType: DerivedClass (0x100D)
; CHECK: FunctionType: void DerivedClass::() (0x1017)
; CHECK: Name: DerivedClass::DerivedClass
; CHECK: }
More information about the llvm-commits
mailing list