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;
}

Reply via email to