summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2017-09-15 00:59:07 +0000
committerReid Kleckner <rnk@google.com>2017-09-15 00:59:07 +0000
commit87288b98b66db3e13b998fa3d2befe9ed3e2922b (patch)
tree9be18e12ebda39fae597e369396601f67ba4c8b4
parent7f9c0ce1bb5e9e58b9e1bbafe182edd0ee760b39 (diff)
downloadbcm5719-llvm-87288b98b66db3e13b998fa3d2befe9ed3e2922b.tar.gz
bcm5719-llvm-87288b98b66db3e13b998fa3d2befe9ed3e2922b.zip
[codeview] Use a type index of zero for static method "this" types
Otherwise VS won't show anything in the autos or watch window of static methods. llvm-svn: 313329
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp2
-rw-r--r--llvm/test/DebugInfo/COFF/static-methods.ll42
2 files changed, 40 insertions, 4 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
index 7e778c542c0..87aeb1f03dd 100644
--- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
@@ -1561,7 +1561,7 @@ TypeIndex CodeViewDebug::lowerTypeMemberFunction(const DISubroutineType *Ty,
ReturnTypeIndex = ReturnAndArgTypesRef.front();
ArgTypeIndices = ReturnAndArgTypesRef.drop_front();
}
- TypeIndex ThisTypeIndex = TypeIndex::Void();
+ TypeIndex ThisTypeIndex;
if (!IsStaticMethod && !ArgTypeIndices.empty()) {
ThisTypeIndex = ArgTypeIndices.front();
ArgTypeIndices = ArgTypeIndices.drop_front();
diff --git a/llvm/test/DebugInfo/COFF/static-methods.ll b/llvm/test/DebugInfo/COFF/static-methods.ll
index e5e26fe05ca..77ff031b221 100644
--- a/llvm/test/DebugInfo/COFF/static-methods.ll
+++ b/llvm/test/DebugInfo/COFF/static-methods.ll
@@ -12,24 +12,60 @@
; A *p = new A;
; $ clang t.cpp -S -emit-llvm -g -gcodeview -o t.ll
+; CHECK: MemberFunction ([[STATIC_VOID:0x.*]]) {
+; CHECK-NEXT: TypeLeafKind: LF_MFUNCTION (0x1009)
+; CHECK-NEXT: ReturnType: void (0x3)
+; CHECK-NEXT: ClassType: A ({{.*}})
+; CHECK-NEXT: ThisType: 0x0
+; CHECK-NEXT: CallingConvention: NearC (0x0)
+; CHECK-NEXT: FunctionOptions [ (0x0)
+; CHECK-NEXT: ]
+; CHECK-NEXT: NumParameters: 0
+; CHECK-NEXT: ArgListType: () ({{.*}})
+; CHECK-NEXT: ThisAdjustment: 0
+; CHECK-NEXT: }
+; CHECK: MemberFunction ([[INSTANCE_VOID:0x.*]]) {
+; CHECK-NEXT: TypeLeafKind: LF_MFUNCTION (0x1009)
+; CHECK-NEXT: ReturnType: void (0x3)
+; CHECK-NEXT: ClassType: A ({{.*}})
+; CHECK-NEXT: ThisType: A* ({{.*}})
+; CHECK-NEXT: CallingConvention: ThisCall (0xB)
+; CHECK-NEXT: FunctionOptions [ (0x0)
+; CHECK-NEXT: ]
+; CHECK-NEXT: NumParameters: 0
+; CHECK-NEXT: ArgListType: () ({{.*}})
+; CHECK-NEXT: ThisAdjustment: 0
+; CHECK-NEXT: }
+; CHECK: MemberFunction ([[STATIC_TWO:0x.*]]) {
+; CHECK-NEXT: TypeLeafKind: LF_MFUNCTION (0x1009)
+; CHECK-NEXT: ReturnType: void (0x3)
+; CHECK-NEXT: ClassType: A ({{.*}})
+; CHECK-NEXT: ThisType: 0x0
+; CHECK-NEXT: CallingConvention: NearC (0x0)
+; CHECK-NEXT: FunctionOptions [ (0x0)
+; CHECK-NEXT: ]
+; CHECK-NEXT: NumParameters: 2
+; CHECK-NEXT: ArgListType: (int, int) ({{.*}}
+; CHECK-NEXT: ThisAdjustment: 0
+; CHECK-NEXT: }
; CHECK: OneMethod {
; CHECK-NEXT: TypeLeafKind: LF_ONEMETHOD (0x1511)
; CHECK-NEXT: AccessSpecifier: Public (0x3)
; CHECK-NEXT: MethodKind: Static (0x2)
-; CHECK-NEXT: Type: void A::() ({{.*}})
+; CHECK-NEXT: Type: void A::() ([[STATIC_VOID]])
; CHECK-NEXT: Name: f
; CHECK-NEXT: }
; CHECK-NEXT: OneMethod {
; CHECK-NEXT: TypeLeafKind: LF_ONEMETHOD (0x1511)
; CHECK-NEXT: AccessSpecifier: Public (0x3)
-; CHECK-NEXT: Type: void A::() ({{.*}})
+; CHECK-NEXT: Type: void A::() ([[INSTANCE_VOID]])
; CHECK-NEXT: Name: g
; CHECK-NEXT: }
; CHECK-NEXT: OneMethod {
; CHECK-NEXT: TypeLeafKind: LF_ONEMETHOD (0x1511)
; CHECK-NEXT: AccessSpecifier: Public (0x3)
; CHECK-NEXT: MethodKind: Static (0x2)
-; CHECK-NEXT: Type: void A::(int, int) ({{.*}})
+; CHECK-NEXT: Type: void A::(int, int) ([[STATIC_TWO]])
; CHECK-NEXT: Name: h
; CHECK-NEXT: }
OpenPOWER on IntegriCloud