diff options
author | Reid Kleckner <rnk@google.com> | 2017-09-15 00:59:07 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2017-09-15 00:59:07 +0000 |
commit | 87288b98b66db3e13b998fa3d2befe9ed3e2922b (patch) | |
tree | 9be18e12ebda39fae597e369396601f67ba4c8b4 | |
parent | 7f9c0ce1bb5e9e58b9e1bbafe182edd0ee760b39 (diff) | |
download | bcm5719-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.cpp | 2 | ||||
-rw-r--r-- | llvm/test/DebugInfo/COFF/static-methods.ll | 42 |
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: } |