type-unique-odr-a.ll 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. ; REQUIRES: object-emission
  2. ;
  3. ; RUN: llvm-link %s %p/type-unique-odr-b.ll -S -o - | %llc_dwarf -filetype=obj -O0 | llvm-dwarfdump -debug-dump=info - | FileCheck %s
  4. ;
  5. ; Test ODR-based type uniquing for C++ class members.
  6. ; rdar://problem/15851313.
  7. ;
  8. ; $ cat -n type-unique-odr-a.cpp
  9. ; 1 class A {
  10. ; 2 int data;
  11. ; 3 protected:
  12. ; 4 void getFoo();
  13. ; 5 };
  14. ; 6
  15. ; 7 static void bar() {
  16. ; 8 A a;
  17. ; 9 }
  18. ; 10
  19. ; 11 void baz() { bar(); }
  20. ;; #include "ab.h"
  21. ; foo_t bar() {
  22. ; return A().getFoo();
  23. ; }
  24. ;
  25. ; CHECK: DW_TAG_class_type
  26. ; CHECK-NEXT: DW_AT_name {{.*}} "A"
  27. ; CHECK-NOT: DW_TAG
  28. ; CHECK: DW_TAG_member
  29. ; CHECK-NEXT: DW_AT_name {{.*}} "data"
  30. ; CHECK-NOT: DW_TAG
  31. ; CHECK: DW_TAG_subprogram
  32. ; CHECK-NOT: DW_TAG
  33. ; CHECK: DW_AT_linkage_name {{.*}} "_ZN1A6getFooEv"
  34. ; CHECK-NOT: DW_TAG
  35. ; CHECK: DW_AT_name {{.*}} "getFoo"
  36. ; CHECK: DW_TAG_subprogram
  37. ; CHECK-NOT: DW_TAG
  38. ; CHECK: DW_AT_linkage_name {{.*}} "_Z3bazv"
  39. ; CHECK: DW_TAG_subprogram
  40. ; CHECK-NOT: DW_TAG
  41. ; CHECK: DW_AT_linkage_name {{.*}} "_ZL3barv"
  42. ; getFoo and A may only appear once.
  43. ; CHECK-NOT: AT_name{{.*(getFoo)|("A")}}
  44. ; ModuleID = 'type-unique-odr-a.cpp'
  45. %class.A = type { i32 }
  46. ; Function Attrs: nounwind
  47. define void @_Z3bazv() #0 {
  48. entry:
  49. call void @_ZL3barv(), !dbg !23
  50. ret void, !dbg !23
  51. }
  52. ; Function Attrs: nounwind
  53. define internal void @_ZL3barv() #0 {
  54. entry:
  55. %a = alloca %class.A, align 4
  56. call void @llvm.dbg.declare(metadata %class.A* %a, metadata !24, metadata !DIExpression()), !dbg !25
  57. ret void, !dbg !26
  58. }
  59. ; Function Attrs: nounwind readnone
  60. declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
  61. attributes #0 = { nounwind }
  62. attributes #1 = { nounwind readnone }
  63. !llvm.dbg.cu = !{!0}
  64. !llvm.module.flags = !{!20, !21}
  65. !llvm.ident = !{!22}
  66. !0 = !DICompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5.0 ", isOptimized: false, emissionKind: 1, file: !1, enums: !2, retainedTypes: !3, subprograms: !14, globals: !2, imports: !2)
  67. !1 = !DIFile(filename: "<unknown>", directory: "")
  68. !2 = !{}
  69. !3 = !{!4}
  70. !4 = !DICompositeType(tag: DW_TAG_class_type, name: "A", line: 1, size: 32, align: 32, file: !5, elements: !6, identifier: "_ZTS1A")
  71. !5 = !DIFile(filename: "type-unique-odr-a.cpp", directory: "")
  72. !6 = !{!7, !9}
  73. !7 = !DIDerivedType(tag: DW_TAG_member, name: "data", line: 2, size: 32, align: 32, flags: DIFlagPrivate, file: !5, scope: !"_ZTS1A", baseType: !8)
  74. !8 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
  75. !9 = !DISubprogram(name: "getFoo", linkageName: "_ZN1A6getFooEv", line: 4, isLocal: false, isDefinition: false, virtualIndex: 6, flags: DIFlagProtected | DIFlagPrototyped, isOptimized: false, scopeLine: 4, file: !5, scope: !"_ZTS1A", type: !10)
  76. !10 = !DISubroutineType(types: !11)
  77. !11 = !{null, !12}
  78. !12 = !DIDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, flags: DIFlagArtificial | DIFlagObjectPointer, baseType: !"_ZTS1A")
  79. !14 = !{!15, !19}
  80. !15 = !DISubprogram(name: "baz", linkageName: "_Z3bazv", line: 11, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 11, file: !5, scope: !16, type: !17, function: void ()* @_Z3bazv, variables: !2)
  81. !16 = !DIFile(filename: "type-unique-odr-a.cpp", directory: "")
  82. !17 = !DISubroutineType(types: !18)
  83. !18 = !{null}
  84. !19 = !DISubprogram(name: "bar", linkageName: "_ZL3barv", line: 7, isLocal: true, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, scopeLine: 7, file: !5, scope: !16, type: !17, function: void ()* @_ZL3barv, variables: !2)
  85. !20 = !{i32 2, !"Dwarf Version", i32 4}
  86. !21 = !{i32 1, !"Debug Info Version", i32 3}
  87. !22 = !{!"clang version 3.5.0 "}
  88. !23 = !DILocation(line: 11, scope: !15)
  89. !24 = !DILocalVariable(tag: DW_TAG_auto_variable, name: "a", line: 8, scope: !19, file: !16, type: !"_ZTS1A")
  90. !25 = !DILocation(line: 8, scope: !19)
  91. !26 = !DILocation(line: 9, scope: !19)