https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106718
Bug ID: 106718 Summary: Behavior does not follow the standard for DW_AT_ranges and DW_FORM_sec_offset Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: debug Assignee: unassigned at gcc dot gnu.org Reporter: navidr at gcc dot gnu.org Target Milestone: --- gcc-trunk sort.c -O3 -gdwarf-5 -gsplit-dwarf -g3 -o sort . . . 36> DW_TAG_inlined_subroutine DW_AT_abstract_origin DW_FORM_ref4 DW_AT_entry_pc DW_FORM_addrx DW_FORM_data1 DW_AT_ranges DW_FORM_rnglistx . . . DWARF5 standard explicitly mentions that you should not use "DW_FORM_rnglistx" form when your header does have offset_entry_count=0. "If the offset_entry_count is zero, then DW_FORM_rnglistx cannot be used to access a range list; DW_FORM_sec_offset must be used instead. If the offset_entry_count is non-zero, then DW_FORM_rnglistx may be used to access a range list; this is necessary in split units and may be more compact than using DW_FORM_sec_offsetin non-split units. (Page 242, DWARF5 Specification document)." I didn't try to bisect to find exact commit, but I didn't have this problem 1 year ago. #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #define ARRAY_LEN 50000 static struct timeval tm1; static inline void start() { gettimeofday(&tm1, NULL); } static inline void stop() { struct timeval tm2; gettimeofday(&tm2, NULL); unsigned long long t = 1000 * (tm2.tv_sec - tm1.tv_sec) +\ (tm2.tv_usec - tm1.tv_usec) / 1000; printf("%llu ms\n", t); } void bubble_sort (int *a, int n) { int i, t, s = 1; while (s) { s = 0; for (i = 1; i < n; i++) { if (a[i] < a[i - 1]) { t = a[i]; a[i] = a[i - 1]; a[i - 1] = t; s = 1; } } } } void sort_array() { printf("Bubble sorting array of %d elements\n", ARRAY_LEN); int data[ARRAY_LEN], i; for(i=0; i<ARRAY_LEN; ++i){ data[i] = rand(); } bubble_sort(data, ARRAY_LEN); } int main(){ start(); sort_array(); stop(); return 0; }