Home | History | Annotate | Download | only in X86
      1 ; RUN: llc %s -o %t -filetype=obj -O0 -mtriple=x86_64-unknown-linux-gnu -dwarf-version=4
      2 ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=PRESENT
      3 ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=ABSENT
      4 ; RUN: llc %s -o %t -filetype=obj -O0 -mtriple=x86_64-apple-darwin -dwarf-version=4
      5 ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DARWINP
      6 ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DARWINA
      7 ; Verify that attributes we do want are PRESENT;
      8 ; verify that attributes we don't want are ABSENT.
      9 ; It's a lot easier to do this in two passes than in one.
     10 ; PR14471
     11 
     12 ; LLVM IR generated using: clang -emit-llvm -S -g
     13 ; (with the Clang part of this patch applied).
     14 ;
     15 ; class C
     16 ; {
     17 ;   static int a;
     18 ;   const static bool const_a = true;
     19 ; protected:
     20 ;   static int b;
     21 ;   const static float const_b = 3.14;
     22 ; public:
     23 ;   static int c;
     24 ;   const static int const_c = 18;
     25 ;   int d;
     26 ; };
     27 ; 
     28 ; int C::a = 4;
     29 ; int C::b = 2;
     30 ; int C::c = 1;
     31 ; 
     32 ; int main()
     33 ; {
     34 ;         C instance_C;
     35 ;         instance_C.d = 8;
     36 ;         return C::c;
     37 ; }
     38 
     39 %class.C = type { i32 }
     40 
     41 @_ZN1C1aE = global i32 4, align 4
     42 @_ZN1C1bE = global i32 2, align 4
     43 @_ZN1C1cE = global i32 1, align 4
     44 
     45 define i32 @main() nounwind uwtable {
     46 entry:
     47   %retval = alloca i32, align 4
     48   %instance_C = alloca %class.C, align 4
     49   store i32 0, i32* %retval
     50   call void @llvm.dbg.declare(metadata !{%class.C* %instance_C}, metadata !29), !dbg !30
     51   %d = getelementptr inbounds %class.C* %instance_C, i32 0, i32 0, !dbg !31
     52   store i32 8, i32* %d, align 4, !dbg !31
     53   %0 = load i32* @_ZN1C1cE, align 4, !dbg !32
     54   ret i32 %0, !dbg !32
     55 }
     56 
     57 declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
     58 
     59 !llvm.dbg.cu = !{!0}
     60 !llvm.module.flags = !{!34}
     61 
     62 !0 = metadata !{i32 786449, metadata !33, i32 4, metadata !"clang version 3.3 (trunk 171914)", i1 false, metadata !"", i32 0, metadata !1, metadata !1, metadata !3, metadata !10,  metadata !1, metadata !""} ; [ DW_TAG_compile_unit ] [/home/probinson/projects/upstream/static-member/test/debug-info-static-member.cpp] [DW_LANG_C_plus_plus]
     63 !1 = metadata !{}
     64 !3 = metadata !{metadata !5}
     65 !5 = metadata !{i32 786478, metadata !33, metadata !6, metadata !"main", metadata !"main", metadata !"", i32 18, metadata !7, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main, null, null, metadata !1, i32 23} ; [ DW_TAG_subprogram ] [line 18] [def] [scope 23] [main]
     66 !6 = metadata !{i32 786473, metadata !33} ; [ DW_TAG_file_type ]
     67 !7 = metadata !{i32 786453, i32 0, null, i32 0, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !8, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
     68 !8 = metadata !{metadata !9}
     69 !9 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed]
     70 !10 = metadata !{metadata !12, metadata !27, metadata !28}
     71 !12 = metadata !{i32 786484, i32 0, metadata !13, metadata !"a", metadata !"a", metadata !"_ZN1C1aE", metadata !6, i32 14, metadata !9, i32 0, i32 1, i32* @_ZN1C1aE, metadata !15} ; [ DW_TAG_variable ] [a] [line 14] [def]
     72 !13 = metadata !{i32 786434, metadata !33, null, metadata !"C", i32 1, i64 32, i64 32, i32 0, i32 0, null, metadata !14, i32 0, null, null, null} ; [ DW_TAG_class_type ] [C] [line 1, size 32, align 32, offset 0] [def] [from ]
     73 !14 = metadata !{metadata !15, metadata !16, metadata !19, metadata !20, metadata !23, metadata !24, metadata !26}
     74 !15 = metadata !{i32 786445, metadata !33, metadata !13, metadata !"a", i32 3, i64 0, i64 0, i64 0, i32 4097, metadata !9, null} ; [ DW_TAG_member ] [a] [line 3, size 0, align 0, offset 0] [private] [static] [from int]
     75 !16 = metadata !{i32 786445, metadata !33, metadata !13, metadata !"const_a", i32 4, i64 0, i64 0, i64 0, i32 4097, metadata !17, i1 true} ; [ DW_TAG_member ] [const_a] [line 4, size 0, align 0, offset 0] [private] [static] [from ]
     76 !17 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !18} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from bool]
     77 !18 = metadata !{i32 786468, null, null, metadata !"bool", i32 0, i64 8, i64 8, i64 0, i32 0, i32 2} ; [ DW_TAG_base_type ] [bool] [line 0, size 8, align 8, offset 0, enc DW_ATE_boolean]
     78 !19 = metadata !{i32 786445, metadata !33, metadata !13, metadata !"b", i32 6, i64 0, i64 0, i64 0, i32 4098, metadata !9, null} ; [ DW_TAG_member ] [b] [line 6, size 0, align 0, offset 0] [protected] [static] [from int]
     79 !20 = metadata !{i32 786445, metadata !33, metadata !13, metadata !"const_b", i32 7, i64 0, i64 0, i64 0, i32 4098, metadata !21, float 0x40091EB860000000} ; [ DW_TAG_member ] [const_b] [line 7, size 0, align 0, offset 0] [protected] [static] [from ]
     80 !21 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !22} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from float]
     81 !22 = metadata !{i32 786468, null, null, metadata !"float", i32 0, i64 32, i64 32, i64 0, i32 0, i32 4} ; [ DW_TAG_base_type ] [float] [line 0, size 32, align 32, offset 0, enc DW_ATE_float]
     82 !23 = metadata !{i32 786445, metadata !33, metadata !13, metadata !"c", i32 9, i64 0, i64 0, i64 0, i32 4096, metadata !9, null} ; [ DW_TAG_member ] [c] [line 9, size 0, align 0, offset 0] [static] [from int]
     83 !24 = metadata !{i32 786445, metadata !33, metadata !13, metadata !"const_c", i32 10, i64 0, i64 0, i64 0, i32 4096, metadata !25, i32 18} ; [ DW_TAG_member ] [const_c] [line 10, size 0, align 0, offset 0] [static] [from ]
     84 !25 = metadata !{i32 786470, null, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, metadata !9} ; [ DW_TAG_const_type ] [line 0, size 0, align 0, offset 0] [from int]
     85 !26 = metadata !{i32 786445, metadata !33, metadata !13, metadata !"d", i32 11, i64 32, i64 32, i64 0, i32 0, metadata !9} ; [ DW_TAG_member ] [d] [line 11, size 32, align 32, offset 0] [from int]
     86 !27 = metadata !{i32 786484, i32 0, metadata !13, metadata !"b", metadata !"b", metadata !"_ZN1C1bE", metadata !6, i32 15, metadata !9, i32 0, i32 1, i32* @_ZN1C1bE, metadata !19} ; [ DW_TAG_variable ] [b] [line 15] [def]
     87 !28 = metadata !{i32 786484, i32 0, metadata !13, metadata !"c", metadata !"c", metadata !"_ZN1C1cE", metadata !6, i32 16, metadata !9, i32 0, i32 1, i32* @_ZN1C1cE, metadata !23} ; [ DW_TAG_variable ] [c] [line 16] [def]
     88 !29 = metadata !{i32 786688, metadata !5, metadata !"instance_C", metadata !6, i32 20, metadata !13, i32 0, i32 0} ; [ DW_TAG_auto_variable ] [instance_C] [line 20]
     89 !30 = metadata !{i32 20, i32 0, metadata !5, null}
     90 !31 = metadata !{i32 21, i32 0, metadata !5, null}
     91 !32 = metadata !{i32 22, i32 0, metadata !5, null}
     92 !33 = metadata !{metadata !"/usr/local/google/home/blaikie/Development/llvm/src/tools/clang/test/CodeGenCXX/debug-info-static-member.cpp", metadata !"/home/blaikie/local/Development/llvm/build/clang/x86-64/Debug/llvm"}
     93 ; PRESENT verifies that static member declarations have these attributes:
     94 ; external, declaration, accessibility, and either DW_AT_MIPS_linkage_name
     95 ; (for variables) or DW_AT_const_value (for constants).
     96 ;
     97 ; PRESENT:      .debug_info contents:
     98 ; PRESENT:      DW_TAG_class_type
     99 ; PRESENT-NEXT: DW_AT_name {{.*}} "C"
    100 ; PRESENT:      0x[[DECL_A:[0-9a-f]+]]: DW_TAG_member
    101 ; PRESENT-NEXT: DW_AT_name {{.*}} "a"
    102 ; PRESENT:      DW_AT_external
    103 ; PRESENT:      DW_AT_declaration
    104 ; PRESENT:      DW_AT_accessibility [DW_FORM_data1]   (0x03)
    105 ; PRESENT:      DW_TAG_member
    106 ; PRESENT-NEXT: DW_AT_name {{.*}} "const_a"
    107 ; PRESENT:      DW_AT_external
    108 ; PRESENT:      DW_AT_declaration
    109 ; PRESENT:      DW_AT_accessibility [DW_FORM_data1]   (0x03)
    110 ; PRESENT:      DW_AT_const_value {{.*}} (1)
    111 ; PRESENT:      0x[[DECL_B:[0-9a-f]+]]: DW_TAG_member
    112 ; PRESENT-NEXT: DW_AT_name {{.*}} "b"
    113 ; PRESENT:      DW_AT_accessibility [DW_FORM_data1]   (0x02)
    114 ; PRESENT:      DW_TAG_member
    115 ; PRESENT-NEXT: DW_AT_name {{.*}} "const_b"
    116 ; PRESENT:      DW_AT_accessibility [DW_FORM_data1]   (0x02)
    117 ; PRESENT:      DW_AT_const_value [DW_FORM_udata] (1078523331)
    118 ; PRESENT:      0x[[DECL_C:[0-9a-f]+]]: DW_TAG_member
    119 ; PRESENT-NEXT: DW_AT_name {{.*}} "c"
    120 ; PRESENT:      DW_AT_accessibility [DW_FORM_data1]   (0x01)
    121 ; PRESENT:      DW_TAG_member
    122 ; PRESENT-NEXT: DW_AT_name {{.*}} "const_c"
    123 ; PRESENT:      DW_AT_accessibility [DW_FORM_data1]   (0x01)
    124 ; PRESENT:      DW_AT_const_value {{.*}} (18)
    125 ; While we're here, a normal member has data_member_location and
    126 ; accessibility attributes.
    127 ; PRESENT:      DW_TAG_member
    128 ; PRESENT-NEXT: DW_AT_name {{.*}} "d"
    129 ; PRESENT:      DW_AT_data_member_location
    130 ; PRESENT:      DW_AT_accessibility [DW_FORM_data1]   (0x01)
    131 ; PRESENT:      NULL
    132 ; Definitions point back to their declarations, and have a location.
    133 ; PRESENT:      DW_TAG_variable
    134 ; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_A]]}
    135 ; PRESENT-NEXT: DW_AT_location
    136 ; PRESENT-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1aE"
    137 ; PRESENT:      DW_TAG_variable
    138 ; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_B]]}
    139 ; PRESENT-NEXT: DW_AT_location
    140 ; PRESENT-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1bE"
    141 ; PRESENT:      DW_TAG_variable
    142 ; PRESENT-NEXT: DW_AT_specification {{.*}} {0x[[DECL_C]]}
    143 ; PRESENT-NEXT: DW_AT_location
    144 ; PRESENT-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1cE"
    145 
    146 ; For Darwin gdb:
    147 ; DARWINP:      .debug_info contents:
    148 ; DARWINP:      DW_TAG_class_type
    149 ; DARWINP-NEXT: DW_AT_name {{.*}} "C"
    150 ; DARWINP:      0x[[DECL_A:[0-9a-f]+]]: DW_TAG_member
    151 ; DARWINP-NEXT: DW_AT_name {{.*}} "a"
    152 ; DARWINP:      DW_AT_external
    153 ; DARWINP:      DW_AT_declaration
    154 ; DARWINP:      DW_AT_accessibility [DW_FORM_data1]   (0x03)
    155 ; DARWINP:      DW_TAG_member
    156 ; DARWINP-NEXT: DW_AT_name {{.*}} "const_a"
    157 ; DARWINP:      DW_AT_external
    158 ; DARWINP:      DW_AT_declaration
    159 ; DARWINP:      DW_AT_accessibility [DW_FORM_data1]   (0x03)
    160 ; DARWINP:      DW_AT_const_value {{.*}} (1)
    161 ; DARWINP:      0x[[DECL_B:[0-9a-f]+]]: DW_TAG_member
    162 ; DARWINP-NEXT: DW_AT_name {{.*}} "b"
    163 ; DARWINP:      DW_AT_accessibility [DW_FORM_data1]   (0x02)
    164 ; DARWINP:      DW_TAG_member
    165 ; DARWINP-NEXT: DW_AT_name {{.*}} "const_b"
    166 ; DARWINP:      DW_AT_accessibility [DW_FORM_data1]   (0x02)
    167 ; DARWINP:      DW_AT_const_value [DW_FORM_udata] (1078523331)
    168 ; DARWINP:      0x[[DECL_C:[0-9a-f]+]]: DW_TAG_member
    169 ; DARWINP-NEXT: DW_AT_name {{.*}} "c"
    170 ; DARWINP:      DW_AT_accessibility [DW_FORM_data1]   (0x01)
    171 ; DARWINP:      DW_TAG_member
    172 ; DARWINP-NEXT: DW_AT_name {{.*}} "const_c"
    173 ; DARWINP:      DW_AT_accessibility [DW_FORM_data1]   (0x01)
    174 ; DARWINP:      DW_AT_const_value {{.*}} (18)
    175 ; While we're here, a normal member has data_member_location and
    176 ; accessibility attributes.
    177 ; DARWINP:      DW_TAG_member
    178 ; DARWINP-NEXT: DW_AT_name {{.*}} "d"
    179 ; DARWINP:      DW_AT_data_member_location
    180 ; DARWINP:      DW_AT_accessibility [DW_FORM_data1]   (0x01)
    181 ; DARWINP:      NULL
    182 ; Definitions point back to their declarations, and have a location.
    183 ; DARWINP:      DW_TAG_variable
    184 ; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_A]]}
    185 ; DARWINP-NEXT: DW_AT_location
    186 ; DARWINP-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1aE"
    187 ; DARWINP:      DW_TAG_variable
    188 ; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_B]]}
    189 ; DARWINP-NEXT: DW_AT_location
    190 ; DARWINP-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1bE"
    191 ; DARWINP:      DW_TAG_variable
    192 ; DARWINP-NEXT: DW_AT_specification {{.*}} {0x[[DECL_C]]}
    193 ; DARWINP-NEXT: DW_AT_location
    194 ; DARWINP-NEXT: DW_AT_linkage_name {{.*}} "_ZN1C1cE"
    195 
    196 ; ABSENT verifies that static member declarations do not have either
    197 ; DW_AT_location or DW_AT_data_member_location; also, variables do not
    198 ; have DW_AT_const_value and constants do not have DW_AT_linkage_name.
    199 ;
    200 ; ABSENT:      .debug_info contents:
    201 ; ABSENT:      DW_TAG_member
    202 ; ABSENT:      DW_AT_name {{.*}} "a"
    203 ; ABSENT-NOT:  DW_AT_const_value
    204 ; ABSENT-NOT:  location
    205 ; ABSENT:      DW_AT_name {{.*}} "const_a"
    206 ; ABSENT-NOT:  DW_AT_linkage_name
    207 ; ABSENT-NOT:  location
    208 ; ABSENT:      DW_AT_name {{.*}} "b"
    209 ; ABSENT-NOT:  DW_AT_const_value
    210 ; ABSENT-NOT:  location
    211 ; ABSENT:      DW_AT_name {{.*}} "const_b"
    212 ; ABSENT-NOT:  DW_AT_linkage_name
    213 ; ABSENT-NOT:  location
    214 ; ABSENT:      DW_AT_name {{.*}} "c"
    215 ; ABSENT-NOT:  DW_AT_const_value
    216 ; ABSENT-NOT:  location
    217 ; ABSENT:      DW_AT_name {{.*}} "const_c"
    218 ; ABSENT-NOT:  DW_AT_linkage_name
    219 ; ABSENT-NOT:  location
    220 ; While we're here, a normal member does not have a linkage name, constant
    221 ; value, or DW_AT_location.
    222 ; ABSENT:      DW_AT_name {{.*}} "d"
    223 ; ABSENT-NOT:  DW_AT_linkage_name
    224 ; ABSENT-NOT:  DW_AT_const_value
    225 ; ABSENT-NOT:  DW_AT_location
    226 ; ABSENT:      NULL
    227 
    228 ; For Darwin gdb:
    229 ; DARWINA:      .debug_info contents:
    230 ; DARWINA:      DW_TAG_member
    231 ; DARWINA:      DW_AT_name {{.*}} "a"
    232 ; DARWINA-NOT:  DW_AT_const_value
    233 ; DARWINA-NOT:  location
    234 ; DARWINA:      DW_AT_name {{.*}} "const_a"
    235 ; DARWINA-NOT:  DW_AT_linkage_name
    236 ; DARWINA-NOT:  location
    237 ; DARWINA:      DW_AT_name {{.*}} "b"
    238 ; DARWINA-NOT:  DW_AT_const_value
    239 ; DARWINA-NOT:  location
    240 ; DARWINA:      DW_AT_name {{.*}} "const_b"
    241 ; DARWINA-NOT:  DW_AT_linkage_name
    242 ; DARWINA-NOT:  location
    243 ; DARWINA:      DW_AT_name {{.*}} "c"
    244 ; DARWINA-NOT:  DW_AT_const_value
    245 ; DARWINA-NOT:  location
    246 ; DARWINA:      DW_AT_name {{.*}} "const_c"
    247 ; DARWINA-NOT:  DW_AT_linkage_name
    248 ; DARWINA-NOT:  location
    249 ; While we're here, a normal member does not have a linkage name, constant
    250 ; value, or DW_AT_location.
    251 ; DARWINA:      DW_AT_name {{.*}} "d"
    252 ; DARWINA-NOT:  DW_AT_linkage_name
    253 ; DARWINA-NOT:  DW_AT_const_value
    254 ; DARWINA-NOT:  DW_AT_location
    255 ; DARWINA:      NULL
    256 !34 = metadata !{i32 1, metadata !"Debug Info Version", i32 1}
    257