| # This test verifies that if a DW_TAG_compile_unit has DW_AT_ranges that |
| # overlap, that it doesn't end up producing invalid errors claiming a child |
| # DW_TAG_subprogram DIE is not in the parant (CU) ranges. Prior to the commit |
| # that fixed this, a loop was iterating over all DW_AT_ranges for a DIE and |
| # stopping the loop if any intersecting ranges were found. This would cause |
| # the DW_TAG_subprogram DIEs, like "stripped2" and "main", to improperly report |
| # that they were not contained in the parent's address ranges |
| # |
| # The DWARF looks like: |
| # 0x0000000b: DW_TAG_compile_unit |
| # DW_AT_name ("/tmp/main.c") |
| # DW_AT_language (DW_LANG_C) |
| # DW_AT_low_pc (0x0000000000000000) |
| # DW_AT_ranges (0x00000000 |
| # [0x0000000000002000, 0x0000000000003000) |
| # [0x0000000000000000, 0x0000000000000020) |
| # [0x0000000000000000, 0x0000000000000030) |
| # [0x0000000000001000, 0x0000000000002000)) |
| # |
| # 0x0000001e: DW_TAG_subprogram |
| # DW_AT_name ("stripped1") |
| # DW_AT_low_pc (0x0000000000000000) |
| # DW_AT_high_pc (0x0000000000000020) |
| # |
| # 0x0000002f: DW_TAG_subprogram |
| # DW_AT_name ("stripped2") |
| # DW_AT_low_pc (0x0000000000000000) |
| # DW_AT_high_pc (0x0000000000000030) |
| # |
| # 0x00000044: DW_TAG_subprogram |
| # DW_AT_name ("main") |
| # DW_AT_low_pc (0x0000000000001000) |
| # DW_AT_high_pc (0x0000000000002000) |
| # |
| # 0x00000055: DW_TAG_subprogram |
| # DW_AT_name ("foo") |
| # DW_AT_low_pc (0x0000000000002000) |
| # DW_AT_high_pc (0x0000000000003000) |
| # |
| # 0x00000066: NULL |
| |
| # RUN: yaml2obj %s | not llvm-dwarfdump --verify - | FileCheck %s --implicit-check-not=error: |
| |
| # CHECK: error: DIE has overlapping ranges in DW_AT_ranges attribute: [0x0000000000000000, 0x0000000000000020) and [0x0000000000000000, 0x0000000000000030) |
| |
| # CHECK: 0x0000000b: DW_TAG_compile_unit |
| # CHECK-NEXT: DW_AT_name ("/tmp/main.c") |
| # CHECK-NEXT: DW_AT_language (DW_LANG_C) |
| # CHECK-NEXT: DW_AT_low_pc (0x0000000000000000) |
| # CHECK-NEXT: DW_AT_ranges (0x00000000 |
| # CHECK-NEXT: [0x0000000000002000, 0x0000000000003000) |
| # CHECK-NEXT: [0x0000000000000000, 0x0000000000000020) |
| # CHECK-NEXT: [0x0000000000000000, 0x0000000000000030) |
| # CHECK-NEXT: [0x0000000000001000, 0x0000000000002000)) |
| |
| # CHECK: error: DIEs have overlapping address ranges: |
| # CHECK: 0x0000002f: DW_TAG_subprogram |
| # CHECK-NEXT: DW_AT_name ("stripped2") |
| # CHECK-NEXT: DW_AT_low_pc (0x0000000000000000) |
| # CHECK-NEXT: DW_AT_high_pc (0x0000000000000030) |
| |
| # CHECK: 0x0000001e: DW_TAG_subprogram |
| # CHECK-NEXT: DW_AT_name ("stripped1") |
| # CHECK-NEXT: DW_AT_low_pc (0x0000000000000000) |
| # CHECK-NEXT: DW_AT_high_pc (0x0000000000000020) |
| |
| # CHECK: Verifying .debug_info references... |
| |
| --- !mach-o |
| FileHeader: |
| magic: 0xFEEDFACF |
| cputype: 0x01000007 |
| cpusubtype: 0x00000003 |
| filetype: 0x00000001 |
| ncmds: 4 |
| sizeofcmds: 464 |
| flags: 0x00002000 |
| reserved: 0x00000000 |
| LoadCommands: |
| - cmd: LC_SEGMENT_64 |
| cmdsize: 392 |
| segname: '' |
| vmaddr: 0 |
| vmsize: 261 |
| fileoff: 528 |
| filesize: 261 |
| maxprot: 7 |
| initprot: 7 |
| nsects: 4 |
| flags: 0 |
| Sections: |
| - sectname: __debug_abbrev |
| segname: __DWARF |
| addr: 0x0000000000000000 |
| size: 36 |
| offset: 0x00000210 |
| align: 0 |
| reloff: 0x00000000 |
| nreloc: 0 |
| flags: 0x00000000 |
| reserved1: 0x00000000 |
| reserved2: 0x00000000 |
| reserved3: 0x00000000 |
| - sectname: __debug_info |
| segname: __DWARF |
| addr: 0x0000000000000024 |
| size: 103 |
| offset: 0x00000234 |
| align: 0 |
| reloff: 0x00000000 |
| nreloc: 0 |
| flags: 0x00000000 |
| reserved1: 0x00000000 |
| reserved2: 0x00000000 |
| reserved3: 0x00000000 |
| - sectname: __debug_ranges |
| segname: __DWARF |
| addr: 0x000000000000008B |
| size: 80 |
| offset: 0x0000029B |
| align: 0 |
| reloff: 0x00000000 |
| nreloc: 0 |
| flags: 0x00000000 |
| reserved1: 0x00000000 |
| reserved2: 0x00000000 |
| reserved3: 0x00000000 |
| - sectname: __debug_str |
| segname: __DWARF |
| addr: 0x00000000000000DB |
| size: 42 |
| offset: 0x000002EB |
| align: 0 |
| reloff: 0x00000000 |
| nreloc: 0 |
| flags: 0x00000000 |
| reserved1: 0x00000000 |
| reserved2: 0x00000000 |
| reserved3: 0x00000000 |
| - cmd: LC_SYMTAB |
| cmdsize: 24 |
| symoff: 0 |
| nsyms: 0 |
| stroff: 792 |
| strsize: 8 |
| - cmd: LC_BUILD_VERSION |
| cmdsize: 32 |
| platform: 1 |
| minos: 658944 |
| sdk: 658944 |
| ntools: 1 |
| Tools: |
| - tool: 3 |
| version: 34734080 |
| - cmd: LC_DATA_IN_CODE |
| cmdsize: 16 |
| dataoff: 792 |
| datasize: 0 |
| LinkEditData: |
| StringTable: |
| - ' ' |
| - '' |
| - '' |
| - '' |
| - '' |
| - '' |
| - '' |
| DWARF: |
| debug_str: |
| - '' |
| - '/tmp/main.c' |
| - stripped1 |
| - stripped2 |
| - main |
| - foo |
| debug_abbrev: |
| - Table: |
| - Code: 0x00000001 |
| Tag: DW_TAG_compile_unit |
| Children: DW_CHILDREN_yes |
| Attributes: |
| - Attribute: DW_AT_name |
| Form: DW_FORM_strp |
| - Attribute: DW_AT_language |
| Form: DW_FORM_data2 |
| - Attribute: DW_AT_low_pc |
| Form: DW_FORM_addr |
| - Attribute: DW_AT_ranges |
| Form: DW_FORM_sec_offset |
| - Code: 0x00000002 |
| Tag: DW_TAG_subprogram |
| Children: DW_CHILDREN_no |
| Attributes: |
| - Attribute: DW_AT_name |
| Form: DW_FORM_strp |
| - Attribute: DW_AT_low_pc |
| Form: DW_FORM_addr |
| - Attribute: DW_AT_high_pc |
| Form: DW_FORM_data4 |
| - Code: 0x00000003 |
| Tag: DW_TAG_subprogram |
| Children: DW_CHILDREN_no |
| Attributes: |
| - Attribute: DW_AT_name |
| Form: DW_FORM_strp |
| - Attribute: DW_AT_low_pc |
| Form: DW_FORM_addr |
| - Attribute: DW_AT_high_pc |
| Form: DW_FORM_addr |
| debug_ranges: |
| - Offset: 0x00000000 |
| AddrSize: 0x08 |
| Entries: |
| - LowOffset: 0x0000000000002000 |
| HighOffset: 0x0000000000003000 |
| - LowOffset: 0x0000000000000000 |
| HighOffset: 0x0000000000000020 |
| - LowOffset: 0x0000000000000000 |
| HighOffset: 0x0000000000000030 |
| - LowOffset: 0x0000000000001000 |
| HighOffset: 0x0000000000002000 |
| debug_info: |
| - Version: 4 |
| AddrSize: 8 |
| Entries: |
| - AbbrCode: 0x00000001 |
| Values: |
| - Value: 0x0000000000000001 |
| - Value: 0x0000000000000002 |
| - Value: 0x0000000000000000 |
| - Value: 0x0000000000000000 |
| - AbbrCode: 0x00000002 |
| Values: |
| - Value: 0x000000000000000D |
| - Value: 0x0000000000000000 |
| - Value: 0x0000000000000020 |
| - AbbrCode: 0x00000003 |
| Values: |
| - Value: 0x0000000000000017 |
| - Value: 0x0000000000000000 |
| - Value: 0x0000000000000030 |
| - AbbrCode: 0x00000002 |
| Values: |
| - Value: 0x0000000000000021 |
| - Value: 0x0000000000001000 |
| - Value: 0x0000000000001000 |
| - AbbrCode: 0x00000002 |
| Values: |
| - Value: 0x0000000000000026 |
| - Value: 0x0000000000002000 |
| - Value: 0x0000000000001000 |
| - AbbrCode: 0x00000000 |
| ... |