summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2016-07-01 22:24:51 +0000
committerReid Kleckner <rnk@google.com>2016-07-01 22:24:51 +0000
commitad56ea31294fd06475b99d0531f94566a1988c90 (patch)
tree75ab8f90bad175f1011d523337b93b343ca16962 /llvm
parent0efaa349e4499f5d7046a1691b6daa9b5fc683bc (diff)
downloadbcm5719-llvm-ad56ea31294fd06475b99d0531f94566a1988c90.tar.gz
bcm5719-llvm-ad56ea31294fd06475b99d0531f94566a1988c90.zip
[codeview] Don't record UDTs for anonymous structs
MSVC makes up names for these anonymous structs, but we don't (yet). Eventually Clang should use getTypedefNameForAnonDecl() to put some name in the debug info, and we can update the test case when that happens. llvm-svn: 274391
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp4
-rw-r--r--llvm/test/DebugInfo/COFF/udts.ll121
2 files changed, 72 insertions, 53 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
index fa216a32f2f..d567d6a87cb 100644
--- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
@@ -873,6 +873,10 @@ void CodeViewDebug::beginFunction(const MachineFunction *MF) {
}
void CodeViewDebug::addToUDTs(const DIType *Ty, TypeIndex TI) {
+ // Don't record empty UDTs.
+ if (Ty->getName().empty())
+ return;
+
SmallVector<StringRef, 5> QualifiedNameComponents;
const DISubprogram *ClosestSubprogram = getQualifiedNameComponents(
Ty->getScope().resolve(), QualifiedNameComponents);
diff --git a/llvm/test/DebugInfo/COFF/udts.ll b/llvm/test/DebugInfo/COFF/udts.ll
index 803d0d674ab..b772e9c3641 100644
--- a/llvm/test/DebugInfo/COFF/udts.ll
+++ b/llvm/test/DebugInfo/COFF/udts.ll
@@ -15,6 +15,8 @@ target triple = "i686-pc-windows-msvc18.0.0"
; p.x = s->x;
; return p.f;
; }
+; typedef struct { int x; } U;
+; U u;
; CHECK: ProcStart {
; CHECK: DisplayName: f
@@ -43,82 +45,95 @@ target triple = "i686-pc-windows-msvc18.0.0"
; CHECK: UDT {
; CHECK-NEXT: Type: S (0x{{[0-9A-F]+}})
; CHECK-NEXT: UDTName: S
+; CHECK: UDT {
+; CHECK-NEXT: Type: 0x{{[0-9A-F]+}}
+; CHECK-NEXT: UDTName: U
+; CHECK-NOT: UDT {
+%struct.U = type { i32 }
%struct.S = type { i32 }
%union.pun = type { i32 }
+@"\01?u@@3UU@@A" = global %struct.U zeroinitializer, align 4
+
; Function Attrs: nounwind uwtable
-define void @"\01?f@@YAXXZ"() #0 !dbg !7 {
+define void @"\01?f@@YAXXZ"() #0 !dbg !14 {
entry:
%f = alloca i32, align 4
- call void @llvm.dbg.declare(metadata i32* %f, metadata !10, metadata !13), !dbg !14
- ret void, !dbg !15
+ call void @llvm.dbg.declare(metadata i32* %f, metadata !17, metadata !19), !dbg !20
+ ret void, !dbg !21
}
; Function Attrs: nounwind readnone
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
; Function Attrs: nounwind uwtable
-define float @"\01?g@@YAMPEAUS@@@Z"(%struct.S* %s) #0 !dbg !16 {
+define float @"\01?g@@YAMPEAUS@@@Z"(%struct.S* %s) #0 !dbg !22 {
entry:
%s.addr = alloca %struct.S*, align 8
%p = alloca %union.pun, align 4
store %struct.S* %s, %struct.S** %s.addr, align 8
- call void @llvm.dbg.declare(metadata %struct.S** %s.addr, metadata !24, metadata !13), !dbg !25
- call void @llvm.dbg.declare(metadata %union.pun* %p, metadata !26, metadata !13), !dbg !31
- %0 = load %struct.S*, %struct.S** %s.addr, align 8, !dbg !32
- %x = getelementptr inbounds %struct.S, %struct.S* %0, i32 0, i32 0, !dbg !33
- %1 = load i32, i32* %x, align 4, !dbg !33
- %x1 = bitcast %union.pun* %p to i32*, !dbg !34
- store i32 %1, i32* %x1, align 4, !dbg !35
- %f = bitcast %union.pun* %p to float*, !dbg !36
- %2 = load float, float* %f, align 4, !dbg !36
- ret float %2, !dbg !37
+ call void @llvm.dbg.declare(metadata %struct.S** %s.addr, metadata !30, metadata !19), !dbg !31
+ call void @llvm.dbg.declare(metadata %union.pun* %p, metadata !32, metadata !19), !dbg !37
+ %0 = load %struct.S*, %struct.S** %s.addr, align 8, !dbg !38
+ %x = getelementptr inbounds %struct.S, %struct.S* %0, i32 0, i32 0, !dbg !39
+ %1 = load i32, i32* %x, align 4, !dbg !39
+ %x1 = bitcast %union.pun* %p to i32*, !dbg !40
+ store i32 %1, i32* %x1, align 4, !dbg !41
+ %f = bitcast %union.pun* %p to float*, !dbg !42
+ %2 = load float, float* %f, align 4, !dbg !42
+ ret float %2, !dbg !43
}
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 = !{!3, !4, !5}
-!llvm.ident = !{!6}
+!llvm.module.flags = !{!10, !11, !12}
+!llvm.ident = !{!13}
-!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.9.0 (trunk 273566) (llvm/trunk 273570)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
-!1 = !DIFile(filename: "t.cpp", directory: "/usr/local/google/work/llvm/build.release")
+!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 = !{i32 2, !"CodeView", i32 1}
-!4 = !{i32 2, !"Debug Info Version", i32 3}
-!5 = !{i32 1, !"PIC Level", i32 2}
-!6 = !{!"clang version 3.9.0 (trunk 273566) (llvm/trunk 273570)"}
-!7 = distinct !DISubprogram(name: "f", linkageName: "\01?f@@YAXXZ", scope: !1, file: !1, line: 1, type: !8, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
-!8 = !DISubroutineType(types: !9)
-!9 = !{null}
-!10 = !DILocalVariable(name: "f", scope: !7, file: !1, line: 3, type: !11)
-!11 = !DIDerivedType(tag: DW_TAG_typedef, name: "FOO", scope: !7, file: !1, line: 2, baseType: !12)
-!12 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
-!13 = !DIExpression()
-!14 = !DILocation(line: 3, column: 7, scope: !7)
-!15 = !DILocation(line: 4, column: 1, scope: !7)
-!16 = distinct !DISubprogram(name: "g", linkageName: "\01?g@@YAMPEAUS@@@Z", scope: !1, file: !1, line: 7, type: !17, isLocal: false, isDefinition: true, scopeLine: 7, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
-!17 = !DISubroutineType(types: !18)
-!18 = !{!19, !20}
-!19 = !DIBasicType(name: "float", size: 32, align: 32, encoding: DW_ATE_float)
-!20 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !21, size: 64, align: 64)
-!21 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S", file: !1, line: 6, size: 32, align: 32, elements: !22, identifier: ".?AUS@@")
-!22 = !{!23}
-!23 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !21, file: !1, line: 6, baseType: !12, size: 32, align: 32)
-!24 = !DILocalVariable(name: "s", arg: 1, scope: !16, file: !1, line: 7, type: !20)
-!25 = !DILocation(line: 7, column: 12, scope: !16)
-!26 = !DILocalVariable(name: "p", scope: !16, file: !1, line: 8, type: !27)
-!27 = distinct !DICompositeType(tag: DW_TAG_union_type, name: "pun", scope: !16, file: !1, line: 8, size: 32, align: 32, elements: !28)
-!28 = !{!29, !30}
-!29 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !27, file: !1, line: 8, baseType: !12, size: 32, align: 32)
-!30 = !DIDerivedType(tag: DW_TAG_member, name: "f", scope: !27, file: !1, line: 8, baseType: !19, size: 32, align: 32)
-!31 = !DILocation(line: 8, column: 33, scope: !16)
-!32 = !DILocation(line: 9, column: 9, scope: !16)
-!33 = !DILocation(line: 9, column: 12, scope: !16)
-!34 = !DILocation(line: 9, column: 5, scope: !16)
-!35 = !DILocation(line: 9, column: 7, scope: !16)
-!36 = !DILocation(line: 10, column: 12, scope: !16)
-!37 = !DILocation(line: 10, column: 3, scope: !16)
+!3 = !{!4}
+!4 = distinct !DIGlobalVariable(name: "u", linkageName: "\01?u@@3UU@@A", scope: !0, file: !1, line: 13, type: !5, isLocal: false, isDefinition: true, variable: %struct.U* @"\01?u@@3UU@@A")
+!5 = !DIDerivedType(tag: DW_TAG_typedef, name: "U", file: !1, line: 12, baseType: !6)
+!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, file: !1, line: 12, size: 32, align: 32, elements: !7, identifier: ".?AUU@@")
+!7 = !{!8}
+!8 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !6, file: !1, line: 12, baseType: !9, size: 32, align: 32)
+!9 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
+!10 = !{i32 2, !"CodeView", i32 1}
+!11 = !{i32 2, !"Debug Info Version", i32 3}
+!12 = !{i32 1, !"PIC Level", i32 2}
+!13 = !{!"clang version 3.9.0 "}
+!14 = distinct !DISubprogram(name: "f", linkageName: "\01?f@@YAXXZ", scope: !1, file: !1, line: 1, type: !15, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
+!15 = !DISubroutineType(types: !16)
+!16 = !{null}
+!17 = !DILocalVariable(name: "f", scope: !14, file: !1, line: 3, type: !18)
+!18 = !DIDerivedType(tag: DW_TAG_typedef, name: "FOO", scope: !14, file: !1, line: 2, baseType: !9)
+!19 = !DIExpression()
+!20 = !DILocation(line: 3, column: 7, scope: !14)
+!21 = !DILocation(line: 4, column: 1, scope: !14)
+!22 = distinct !DISubprogram(name: "g", linkageName: "\01?g@@YAMPEAUS@@@Z", scope: !1, file: !1, line: 7, type: !23, isLocal: false, isDefinition: true, scopeLine: 7, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
+!23 = !DISubroutineType(types: !24)
+!24 = !{!25, !26}
+!25 = !DIBasicType(name: "float", size: 32, align: 32, encoding: DW_ATE_float)
+!26 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !27, size: 64, align: 64)
+!27 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S", file: !1, line: 6, size: 32, align: 32, elements: !28, identifier: ".?AUS@@")
+!28 = !{!29}
+!29 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !27, file: !1, line: 6, baseType: !9, size: 32, align: 32)
+!30 = !DILocalVariable(name: "s", arg: 1, scope: !22, file: !1, line: 7, type: !26)
+!31 = !DILocation(line: 7, column: 12, scope: !22)
+!32 = !DILocalVariable(name: "p", scope: !22, file: !1, line: 8, type: !33)
+!33 = distinct !DICompositeType(tag: DW_TAG_union_type, name: "pun", scope: !22, file: !1, line: 8, size: 32, align: 32, elements: !34)
+!34 = !{!35, !36}
+!35 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !33, file: !1, line: 8, baseType: !9, size: 32, align: 32)
+!36 = !DIDerivedType(tag: DW_TAG_member, name: "f", scope: !33, file: !1, line: 8, baseType: !25, size: 32, align: 32)
+!37 = !DILocation(line: 8, column: 33, scope: !22)
+!38 = !DILocation(line: 9, column: 9, scope: !22)
+!39 = !DILocation(line: 9, column: 12, scope: !22)
+!40 = !DILocation(line: 9, column: 5, scope: !22)
+!41 = !DILocation(line: 9, column: 7, scope: !22)
+!42 = !DILocation(line: 10, column: 12, scope: !22)
+!43 = !DILocation(line: 10, column: 3, scope: !22)
OpenPOWER on IntegriCloud