* [PATCH] Remove an invalid assert. [PR103619]
@ 2021-12-09 17:32 Hafiz Abid Qadeer
2021-12-10 21:18 ` Jeff Law
2021-12-14 16:53 ` Jakub Jelinek
0 siblings, 2 replies; 8+ messages in thread
From: Hafiz Abid Qadeer @ 2021-12-09 17:32 UTC (permalink / raw)
To: gcc-patches; +Cc: ams, jakub
Commit 13b6c7639cf assumed that registers in a span will be in a certain
order. But that assumption is not true at least for the big endian targets.
Currently amdgcn is probably only target where CFA is split into multiple
registers so build_span_loc is only gets called for it. However, the
dwf_cfa_reg function where this ICE was seen can be called for any
architecture from the comparison dwf_cfa_reg (src) == cur_cfa->reg in
dwarf2out_frame_debug_expr. So dwf_cfa_reg should not assume certain
order of registers.
I was tempted to modify the assert to handle big-endian cases but that will
still be error prone and may fail on some other targets.
gcc/ChangeLog:
PR debug/103619
* dwarf2cfi.c (dwf_cfa_reg): Remove gcc_assert.
---
gcc/dwarf2cfi.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c
index 9dd1dfe71b7..55ae172eda2 100644
--- a/gcc/dwarf2cfi.c
+++ b/gcc/dwarf2cfi.c
@@ -1136,7 +1136,6 @@ dwf_cfa_reg (rtx reg)
gcc_assert (GET_MODE_SIZE (GET_MODE (XVECEXP (span, 0, i)))
.to_constant () == result.span_width);
gcc_assert (REG_P (XVECEXP (span, 0, i)));
- gcc_assert (dwf_regno (XVECEXP (span, 0, i)) == result.reg + i);
}
}
}
--
2.25.1
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] Remove an invalid assert. [PR103619]
2021-12-09 17:32 [PATCH] Remove an invalid assert. [PR103619] Hafiz Abid Qadeer
@ 2021-12-10 21:18 ` Jeff Law
2021-12-14 16:53 ` Jakub Jelinek
1 sibling, 0 replies; 8+ messages in thread
From: Jeff Law @ 2021-12-10 21:18 UTC (permalink / raw)
To: Hafiz Abid Qadeer, gcc-patches; +Cc: jakub, ams
On 12/9/2021 10:32 AM, Hafiz Abid Qadeer wrote:
> Commit 13b6c7639cf assumed that registers in a span will be in a certain
> order. But that assumption is not true at least for the big endian targets.
> Currently amdgcn is probably only target where CFA is split into multiple
> registers so build_span_loc is only gets called for it. However, the
> dwf_cfa_reg function where this ICE was seen can be called for any
> architecture from the comparison dwf_cfa_reg (src) == cur_cfa->reg in
> dwarf2out_frame_debug_expr. So dwf_cfa_reg should not assume certain
> order of registers.
>
> I was tempted to modify the assert to handle big-endian cases but that will
> still be error prone and may fail on some other targets.
>
> gcc/ChangeLog:
>
> PR debug/103619
> * dwarf2cfi.c (dwf_cfa_reg): Remove gcc_assert.
FWIW, the bogus assert can be triggered on other platforms too. c6x-elf
for example with -mbig-endian.
I don't know enough about this code to review.
jeff
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] Remove an invalid assert. [PR103619]
2021-12-09 17:32 [PATCH] Remove an invalid assert. [PR103619] Hafiz Abid Qadeer
2021-12-10 21:18 ` Jeff Law
@ 2021-12-14 16:53 ` Jakub Jelinek
2021-12-14 17:32 ` Jeff Law
1 sibling, 1 reply; 8+ messages in thread
From: Jakub Jelinek @ 2021-12-14 16:53 UTC (permalink / raw)
To: Hafiz Abid Qadeer; +Cc: gcc-patches, ams
On Thu, Dec 09, 2021 at 05:32:02PM +0000, Hafiz Abid Qadeer wrote:
> Commit 13b6c7639cf assumed that registers in a span will be in a certain
> order. But that assumption is not true at least for the big endian targets.
> Currently amdgcn is probably only target where CFA is split into multiple
> registers so build_span_loc is only gets called for it. However, the
> dwf_cfa_reg function where this ICE was seen can be called for any
> architecture from the comparison dwf_cfa_reg (src) == cur_cfa->reg in
> dwarf2out_frame_debug_expr. So dwf_cfa_reg should not assume certain
> order of registers.
>
> I was tempted to modify the assert to handle big-endian cases but that will
> still be error prone and may fail on some other targets.
Do you have a preprocessed testcase on which the ICE triggers on ARM EB?
I think I'd like to see what we were emitting in debug info for it before
r12-5833 and what we emit with this assert removed after it.
I assumed it wouldn't affect anything but GCN during the review.
Seems the arm span hook for EB will swap pairs in the list:
for (i = 0; i < nregs; i += 2)
if (TARGET_BIG_END)
{
parts[i] = gen_rtx_REG (SImode, regno + i + 1);
parts[i + 1] = gen_rtx_REG (SImode, regno + i);
}
BTW, I wonder about those
dw_stack_pointer_regnum = dwf_cfa_reg (gen_rtx_REG (Pmode,
STACK_POINTER_REGNUM));
and
dw_frame_pointer_regnum
= dwf_cfa_reg (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM));
Can't those use
dw_stack_pointer_regnum = dwf_cfa_reg (stack_pointer_rtx);
and
dw_frame_pointer_regnum = dwf_cfa_reg (hard_frame_pointer_rtx);
?
> gcc/ChangeLog:
>
> PR debug/103619
> * dwarf2cfi.c (dwf_cfa_reg): Remove gcc_assert.
> ---
> gcc/dwarf2cfi.c | 1 -
> 1 file changed, 1 deletion(-)
>
> diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c
> index 9dd1dfe71b7..55ae172eda2 100644
> --- a/gcc/dwarf2cfi.c
> +++ b/gcc/dwarf2cfi.c
> @@ -1136,7 +1136,6 @@ dwf_cfa_reg (rtx reg)
> gcc_assert (GET_MODE_SIZE (GET_MODE (XVECEXP (span, 0, i)))
> .to_constant () == result.span_width);
> gcc_assert (REG_P (XVECEXP (span, 0, i)));
> - gcc_assert (dwf_regno (XVECEXP (span, 0, i)) == result.reg + i);
> }
> }
> }
Jakub
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] Remove an invalid assert. [PR103619]
2021-12-14 16:53 ` Jakub Jelinek
@ 2021-12-14 17:32 ` Jeff Law
2021-12-14 20:18 ` [PATCH] dwarf2cfi: Improve cfa_reg comparisons [PR103619] Jakub Jelinek
0 siblings, 1 reply; 8+ messages in thread
From: Jeff Law @ 2021-12-14 17:32 UTC (permalink / raw)
To: Jakub Jelinek, Hafiz Abid Qadeer; +Cc: ams, gcc-patches
[-- Attachment #1: Type: text/plain, Size: 1910 bytes --]
On 12/14/2021 9:53 AM, Jakub Jelinek via Gcc-patches wrote:
> On Thu, Dec 09, 2021 at 05:32:02PM +0000, Hafiz Abid Qadeer wrote:
>> Commit 13b6c7639cf assumed that registers in a span will be in a certain
>> order. But that assumption is not true at least for the big endian targets.
>> Currently amdgcn is probably only target where CFA is split into multiple
>> registers so build_span_loc is only gets called for it. However, the
>> dwf_cfa_reg function where this ICE was seen can be called for any
>> architecture from the comparison dwf_cfa_reg (src) == cur_cfa->reg in
>> dwarf2out_frame_debug_expr. So dwf_cfa_reg should not assume certain
>> order of registers.
>>
>> I was tempted to modify the assert to handle big-endian cases but that will
>> still be error prone and may fail on some other targets.
> Do you have a preprocessed testcase on which the ICE triggers on ARM EB?
> I think I'd like to see what we were emitting in debug info for it before
> r12-5833 and what we emit with this assert removed after it.
> I assumed it wouldn't affect anything but GCN during the review.
> Seems the arm span hook for EB will swap pairs in the list:
> for (i = 0; i < nregs; i += 2)
> if (TARGET_BIG_END)
> {
> parts[i] = gen_rtx_REG (SImode, regno + i + 1);
> parts[i + 1] = gen_rtx_REG (SImode, regno + i);
> }
>
> BTW, I wonder about those
> dw_stack_pointer_regnum = dwf_cfa_reg (gen_rtx_REG (Pmode,
> STACK_POINTER_REGNUM));
> and
> dw_frame_pointer_regnum
> = dwf_cfa_reg (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM));
> Can't those use
> dw_stack_pointer_regnum = dwf_cfa_reg (stack_pointer_rtx);
> and
> dw_frame_pointer_regnum = dwf_cfa_reg (hard_frame_pointer_rtx);
> ?
I think the attached testcase should trigger on c6x with -mbig-endian -O2 -g
Jeff
[-- Attachment #2: j.c --]
[-- Type: text/plain, Size: 35583 bytes --]
# 0 "../../../../../../..//newlib-cygwin/newlib/libc/argz/argz_append.c"
# 1 "//home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-obj/newlib/c6x-elf/be/newlib/libc/argz//"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "../../../../../../..//newlib-cygwin/newlib/libc/argz/argz_append.c"
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/argz.h" 1 3 4
# 10 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/argz.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/errno.h" 1 3 4
# 5 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/errno.h" 3 4
typedef int error_t;
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/errno.h" 1 3 4
# 11 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/errno.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/reent.h" 1 3 4
# 13 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/reent.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/_ansi.h" 1 3 4
# 10 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/_ansi.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-obj/newlib/c6x-elf/be/newlib/targ-include/newlib.h" 1 3 4
# 14 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-obj/newlib/c6x-elf/be/newlib/targ-include/newlib.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-obj/newlib/c6x-elf/be/newlib/targ-include/_newlib_version.h" 1 3 4
# 15 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-obj/newlib/c6x-elf/be/newlib/targ-include/newlib.h" 2 3 4
# 11 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/_ansi.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/config.h" 1 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/ieeefp.h" 1 3 4
# 5 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/config.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/features.h" 1 3 4
# 6 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/config.h" 2 3 4
# 12 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/_ansi.h" 2 3 4
# 14 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/reent.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-installed/lib/gcc/c6x-elf/12.0.0/include/stddef.h" 1 3 4
# 143 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-installed/lib/gcc/c6x-elf/12.0.0/include/stddef.h" 3 4
typedef int ptrdiff_t;
# 209 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-installed/lib/gcc/c6x-elf/12.0.0/include/stddef.h" 3 4
typedef unsigned int size_t;
# 321 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-installed/lib/gcc/c6x-elf/12.0.0/include/stddef.h" 3 4
typedef int wchar_t;
# 415 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-installed/lib/gcc/c6x-elf/12.0.0/include/stddef.h" 3 4
typedef struct {
long long __max_align_ll __attribute__((__aligned__(__alignof__(long long))));
long double __max_align_ld __attribute__((__aligned__(__alignof__(long double))));
# 426 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-installed/lib/gcc/c6x-elf/12.0.0/include/stddef.h" 3 4
} max_align_t;
# 15 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/reent.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_types.h" 1 3 4
# 24 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_types.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-installed/lib/gcc/c6x-elf/12.0.0/include/stddef.h" 1 3 4
# 350 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-installed/lib/gcc/c6x-elf/12.0.0/include/stddef.h" 3 4
typedef unsigned int wint_t;
# 25 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_types.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/_types.h" 1 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h" 1 3 4
# 41 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef signed char __int8_t;
typedef unsigned char __uint8_t;
# 55 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef short int __int16_t;
typedef short unsigned int __uint16_t;
# 77 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef long int __int32_t;
typedef long unsigned int __uint32_t;
# 103 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef long long int __int64_t;
typedef long long unsigned int __uint64_t;
# 134 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef signed char __int_least8_t;
typedef unsigned char __uint_least8_t;
# 160 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef short int __int_least16_t;
typedef short unsigned int __uint_least16_t;
# 182 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef long int __int_least32_t;
typedef long unsigned int __uint_least32_t;
# 200 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef long long int __int_least64_t;
typedef long long unsigned int __uint_least64_t;
# 214 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/_default_types.h" 3 4
typedef long long int __intmax_t;
typedef long long unsigned int __uintmax_t;
typedef int __intptr_t;
typedef unsigned int __uintptr_t;
# 8 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/_types.h" 2 3 4
# 28 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_types.h" 2 3 4
typedef long __blkcnt_t;
typedef long __blksize_t;
typedef __uint64_t __fsblkcnt_t;
typedef __uint32_t __fsfilcnt_t;
typedef long _off_t;
typedef int __pid_t;
typedef short __dev_t;
typedef unsigned short __uid_t;
typedef unsigned short __gid_t;
typedef __uint32_t __id_t;
typedef unsigned short __ino_t;
# 90 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_types.h" 3 4
typedef __uint32_t __mode_t;
__extension__ typedef long long _off64_t;
typedef _off_t __off_t;
typedef _off64_t __loff_t;
typedef long __key_t;
typedef long _fpos_t;
# 131 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_types.h" 3 4
typedef unsigned int __size_t;
# 147 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_types.h" 3 4
typedef signed int _ssize_t;
# 158 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_types.h" 3 4
typedef _ssize_t __ssize_t;
typedef struct
{
int __count;
union
{
wint_t __wch;
unsigned char __wchb[4];
} __value;
} _mbstate_t;
typedef void *_iconv_t;
typedef unsigned long __clock_t;
typedef __int_least64_t __time_t;
typedef unsigned long __clockid_t;
typedef unsigned long __timer_t;
typedef __uint8_t __sa_family_t;
typedef __uint32_t __socklen_t;
typedef int __nl_item;
typedef unsigned short __nlink_t;
typedef long __suseconds_t;
typedef unsigned long __useconds_t;
typedef __builtin_va_list __va_list;
# 16 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/reent.h" 2 3 4
typedef unsigned long __ULong;
# 34 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/reent.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/lock.h" 1 3 4
# 11 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/lock.h" 3 4
typedef int _LOCK_T;
typedef int _LOCK_RECURSIVE_T;
# 35 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/reent.h" 2 3 4
typedef _LOCK_RECURSIVE_T _flock_t;
struct _reent;
struct __locale_t;
struct _Bigint
{
struct _Bigint *_next;
int _k, _maxwds, _sign, _wds;
__ULong _x[1];
};
struct __tm
{
int __tm_sec;
int __tm_min;
int __tm_hour;
int __tm_mday;
int __tm_mon;
int __tm_year;
int __tm_wday;
int __tm_yday;
int __tm_isdst;
};
struct _on_exit_args {
void * _fnargs[32];
void * _dso_handle[32];
__ULong _fntypes;
__ULong _is_cxa;
};
# 98 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/reent.h" 3 4
struct _atexit {
struct _atexit *_next;
int _ind;
void (*_fns[32])(void);
struct _on_exit_args _on_exit_args;
};
# 122 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/reent.h" 3 4
struct __sbuf {
unsigned char *_base;
int _size;
};
# 186 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/reent.h" 3 4
struct __sFILE {
unsigned char *_p;
int _r;
int _w;
short _flags;
short _file;
struct __sbuf _bf;
int _lbfsize;
void * _cookie;
int (*_read) (struct _reent *, void *,
char *, int);
int (*_write) (struct _reent *, void *,
const char *,
int);
_fpos_t (*_seek) (struct _reent *, void *, _fpos_t, int);
int (*_close) (struct _reent *, void *);
struct __sbuf _ub;
unsigned char *_up;
int _ur;
unsigned char _ubuf[3];
unsigned char _nbuf[1];
struct __sbuf _lb;
int _blksize;
_off_t _offset;
struct _reent *_data;
_flock_t _lock;
_mbstate_t _mbstate;
int _flags2;
};
# 292 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/reent.h" 3 4
typedef struct __sFILE __FILE;
struct _glue
{
struct _glue *_next;
int _niobs;
__FILE *_iobs;
};
# 324 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/reent.h" 3 4
struct _rand48 {
unsigned short _seed[3];
unsigned short _mult[3];
unsigned short _add;
};
# 613 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/reent.h" 3 4
struct _reent
{
int _errno;
__FILE *_stdin, *_stdout, *_stderr;
int _inc;
char _emergency[25];
int _unspecified_locale_info;
struct __locale_t *_locale;
int __sdidinit;
void (*__cleanup) (struct _reent *);
struct _Bigint *_result;
int _result_k;
struct _Bigint *_p5s;
struct _Bigint **_freelist;
int _cvtlen;
char *_cvtbuf;
union
{
struct
{
unsigned int _unused_rand;
char * _strtok_last;
char _asctime_buf[26];
struct __tm _localtime_buf;
int _gamma_signgam;
__extension__ unsigned long long _rand_next;
struct _rand48 _r48;
_mbstate_t _mblen_state;
_mbstate_t _mbtowc_state;
_mbstate_t _wctomb_state;
char _l64a_buf[8];
char _signal_buf[24];
int _getdate_err;
_mbstate_t _mbrlen_state;
_mbstate_t _mbrtowc_state;
_mbstate_t _mbsrtowcs_state;
_mbstate_t _wcrtomb_state;
_mbstate_t _wcsrtombs_state;
int _h_errno;
} _reent;
struct
{
unsigned char * _nextf[30];
unsigned int _nmalloc[30];
} _unused;
} _new;
struct _atexit *_atexit;
struct _atexit _atexit0;
void (**_sig_func)(int);
struct _glue __sglue;
__FILE __sf[3];
};
# 819 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/reent.h" 3 4
extern struct _reent *_impure_ptr ;
extern struct _reent *const _global_impure_ptr ;
void _reclaim_reent (struct _reent *);
# 12 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/errno.h" 2 3 4
extern int *__errno (void);
extern const char * const _sys_errlist[];
extern int _sys_nerr;
# 10 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/errno.h" 2 3 4
# 11 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/argz.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/types.h" 1 3 4
# 21 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/types.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/cdefs.h" 1 3 4
# 47 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/cdefs.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-installed/lib/gcc/c6x-elf/12.0.0/include/stddef.h" 1 3 4
# 48 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/cdefs.h" 2 3 4
# 22 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/types.h" 2 3 4
typedef __uint8_t u_int8_t;
typedef __uint16_t u_int16_t;
typedef __uint32_t u_int32_t;
typedef __uint64_t u_int64_t;
typedef __intptr_t register_t;
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_stdint.h" 1 3 4
# 20 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_stdint.h" 3 4
typedef __int8_t int8_t ;
typedef __uint8_t uint8_t ;
typedef __int16_t int16_t ;
typedef __uint16_t uint16_t ;
typedef __int32_t int32_t ;
typedef __uint32_t uint32_t ;
typedef __int64_t int64_t ;
typedef __uint64_t uint64_t ;
typedef __intmax_t intmax_t;
typedef __uintmax_t uintmax_t;
typedef __intptr_t intptr_t;
typedef __uintptr_t uintptr_t;
# 47 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/types.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/endian.h" 1 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/_endian.h" 1 3 4
# 7 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/endian.h" 2 3 4
# 50 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/types.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/select.h" 1 3 4
# 14 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/select.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_sigset.h" 1 3 4
# 41 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_sigset.h" 3 4
typedef unsigned long __sigset_t;
# 15 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/select.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_timeval.h" 1 3 4
# 37 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_timeval.h" 3 4
typedef __suseconds_t suseconds_t;
typedef __int_least64_t time_t;
# 54 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_timeval.h" 3 4
struct timeval {
time_t tv_sec;
suseconds_t tv_usec;
};
# 16 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/select.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/timespec.h" 1 3 4
# 38 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/timespec.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_timespec.h" 1 3 4
# 47 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_timespec.h" 3 4
struct timespec {
time_t tv_sec;
long tv_nsec;
};
# 39 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/timespec.h" 2 3 4
# 58 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/timespec.h" 3 4
struct itimerspec {
struct timespec it_interval;
struct timespec it_value;
};
# 17 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/select.h" 2 3 4
typedef __sigset_t sigset_t;
# 34 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/select.h" 3 4
typedef unsigned long __fd_mask;
typedef __fd_mask fd_mask;
# 48 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/select.h" 3 4
typedef struct fd_set {
__fd_mask __fds_bits[(((64) + ((((int)sizeof(__fd_mask) * 8)) - 1)) / (((int)sizeof(__fd_mask) * 8)))];
} fd_set;
# 74 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/select.h" 3 4
int select (int __n, fd_set *__readfds, fd_set *__writefds, fd_set *__exceptfds, struct timeval *__timeout)
;
int pselect (int __n, fd_set *__readfds, fd_set *__writefds, fd_set *__exceptfds, const struct timespec *__timeout, const sigset_t *__set)
;
# 51 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/types.h" 2 3 4
typedef __uint32_t in_addr_t;
typedef __uint16_t in_port_t;
typedef __uintptr_t u_register_t;
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef __blkcnt_t blkcnt_t;
typedef __blksize_t blksize_t;
typedef unsigned long clock_t;
# 119 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/types.h" 3 4
typedef long daddr_t;
typedef char * caddr_t;
typedef __fsblkcnt_t fsblkcnt_t;
typedef __fsfilcnt_t fsfilcnt_t;
typedef __id_t id_t;
typedef __ino_t ino_t;
# 157 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/types.h" 3 4
typedef __off_t off_t;
typedef __dev_t dev_t;
typedef __uid_t uid_t;
typedef __gid_t gid_t;
typedef __pid_t pid_t;
typedef __key_t key_t;
typedef _ssize_t ssize_t;
typedef __mode_t mode_t;
typedef __nlink_t nlink_t;
typedef __clockid_t clockid_t;
typedef __timer_t timer_t;
typedef __useconds_t useconds_t;
# 220 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/types.h" 3 4
typedef __int64_t sbintime_t;
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_pthreadtypes.h" 1 3 4
# 23 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_pthreadtypes.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/sched.h" 1 3 4
# 48 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/sched.h" 3 4
struct sched_param {
int sched_priority;
# 61 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/sched.h" 3 4
};
# 24 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_pthreadtypes.h" 2 3 4
# 32 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_pthreadtypes.h" 3 4
typedef __uint32_t pthread_t;
# 61 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_pthreadtypes.h" 3 4
typedef struct {
int is_initialized;
void *stackaddr;
int stacksize;
int contentionscope;
int inheritsched;
int schedpolicy;
struct sched_param schedparam;
int detachstate;
} pthread_attr_t;
# 154 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_pthreadtypes.h" 3 4
typedef __uint32_t pthread_mutex_t;
typedef struct {
int is_initialized;
# 168 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_pthreadtypes.h" 3 4
int recursive;
} pthread_mutexattr_t;
typedef __uint32_t pthread_cond_t;
typedef struct {
int is_initialized;
clock_t clock;
} pthread_condattr_t;
typedef __uint32_t pthread_key_t;
typedef struct {
int is_initialized;
int init_executed;
} pthread_once_t;
# 224 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/types.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/types.h" 1 3 4
# 225 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/types.h" 2 3 4
# 12 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/argz.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/_ansi.h" 1 3 4
# 14 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/argz.h" 2 3 4
error_t argz_create (char *const argv[], char **argz, size_t *argz_len);
error_t argz_create_sep (const char *string, int sep, char **argz, size_t *argz_len);
size_t argz_count (const char *argz, size_t argz_len);
void argz_extract (char *argz, size_t argz_len, char **argv);
void argz_stringify (char *argz, size_t argz_len, int sep);
error_t argz_add (char **argz, size_t *argz_len, const char *str);
error_t argz_add_sep (char **argz, size_t *argz_len, const char *str, int sep);
error_t argz_append (char **argz, size_t *argz_len, const char *buf, size_t buf_len);
error_t argz_delete (char **argz, size_t *argz_len, char *entry);
error_t argz_insert (char **argz, size_t *argz_len, char *before, const char *entry);
char * argz_next (char *argz, size_t argz_len, const char *entry);
error_t argz_replace (char **argz, size_t *argz_len, const char *str, const char *with, unsigned *replace_count);
# 8 "../../../../../../..//newlib-cygwin/newlib/libc/argz/argz_append.c" 2
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/string.h" 1 3 4
# 17 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/string.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-installed/lib/gcc/c6x-elf/12.0.0/include/stddef.h" 1 3 4
# 18 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/string.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_locale.h" 1 3 4
# 9 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/_locale.h" 3 4
struct __locale_t;
typedef struct __locale_t *locale_t;
# 21 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/string.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/strings.h" 1 3 4
# 44 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/strings.h" 3 4
int bcmp(const void *, const void *, size_t) __attribute__((__pure__));
void bcopy(const void *, void *, size_t);
void bzero(void *, size_t);
void explicit_bzero(void *, size_t);
int ffs(int) __attribute__((__const__));
int ffsl(long) __attribute__((__const__));
int ffsll(long long) __attribute__((__const__));
int fls(int) __attribute__((__const__));
int flsl(long) __attribute__((__const__));
int flsll(long long) __attribute__((__const__));
char *index(const char *, int) __attribute__((__pure__));
char *rindex(const char *, int) __attribute__((__pure__));
int strcasecmp(const char *, const char *) __attribute__((__pure__));
int strncasecmp(const char *, const char *, size_t) __attribute__((__pure__));
int strcasecmp_l (const char *, const char *, locale_t);
int strncasecmp_l (const char *, const char *, size_t, locale_t);
# 25 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/string.h" 2 3 4
void * memchr (const void *, int, size_t);
int memcmp (const void *, const void *, size_t);
void * memcpy (void *restrict, const void *restrict, size_t);
void * memmove (void *, const void *, size_t);
void * memset (void *, int, size_t);
char *strcat (char *restrict, const char *restrict);
char *strchr (const char *, int);
int strcmp (const char *, const char *);
int strcoll (const char *, const char *);
char *strcpy (char *restrict, const char *restrict);
size_t strcspn (const char *, const char *);
char *strerror (int);
size_t strlen (const char *);
char *strncat (char *restrict, const char *restrict, size_t);
int strncmp (const char *, const char *, size_t);
char *strncpy (char *restrict, const char *restrict, size_t);
char *strpbrk (const char *, const char *);
char *strrchr (const char *, int);
size_t strspn (const char *, const char *);
char *strstr (const char *, const char *);
char *strtok (char *restrict, const char *restrict);
size_t strxfrm (char *restrict, const char *restrict, size_t);
int strcoll_l (const char *, const char *, locale_t);
char *strerror_l (int, locale_t);
size_t strxfrm_l (char *restrict, const char *restrict, size_t, locale_t);
char *strtok_r (char *restrict, const char *restrict, char **restrict);
int timingsafe_bcmp (const void *, const void *, size_t);
int timingsafe_memcmp (const void *, const void *, size_t);
void * memccpy (void *restrict, const void *restrict, int, size_t);
# 76 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/string.h" 3 4
char *stpcpy (char *restrict, const char *restrict);
char *stpncpy (char *restrict, const char *restrict, size_t);
char *strdup (const char *) __attribute__((__malloc__)) __attribute__((__warn_unused_result__));
char *_strdup_r (struct _reent *, const char *);
char *strndup (const char *, size_t) __attribute__((__malloc__)) __attribute__((__warn_unused_result__));
char *_strndup_r (struct _reent *, const char *, size_t);
# 100 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/string.h" 3 4
int strerror_r (int, char *, size_t)
__asm__ ("" "__xpg_strerror_r")
;
char * _strerror_r (struct _reent *, int, int, int *);
size_t strlcat (char *, const char *, size_t);
size_t strlcpy (char *, const char *, size_t);
size_t strnlen (const char *, size_t);
char *strsep (char **, const char *);
char *strnstr(const char *, const char *, size_t) __attribute__((__pure__));
char *strlwr (char *);
char *strupr (char *);
char *strsignal (int __signo);
# 175 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/string.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/sys/string.h" 1 3 4
# 176 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/string.h" 2 3 4
# 11 "../../../../../../..//newlib-cygwin/newlib/libc/argz/argz_append.c" 2
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/stdlib.h" 1 3 4
# 16 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/stdlib.h" 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/c6x-elf-installed/lib/gcc/c6x-elf/12.0.0/include/stddef.h" 1 3 4
# 17 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/stdlib.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/machine/stdlib.h" 1 3 4
# 21 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/stdlib.h" 2 3 4
# 1 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/alloca.h" 1 3 4
# 23 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/stdlib.h" 2 3 4
# 33 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/stdlib.h" 3 4
typedef struct
{
int quot;
int rem;
} div_t;
typedef struct
{
long quot;
long rem;
} ldiv_t;
typedef struct
{
long long int quot;
long long int rem;
} lldiv_t;
typedef int (*__compar_fn_t) (const void *, const void *);
int __locale_mb_cur_max (void);
void abort (void) __attribute__ ((__noreturn__));
int abs (int);
__uint32_t arc4random (void);
__uint32_t arc4random_uniform (__uint32_t);
void arc4random_buf (void *, size_t);
int atexit (void (*__func)(void));
double atof (const char *__nptr);
float atoff (const char *__nptr);
int atoi (const char *__nptr);
int _atoi_r (struct _reent *, const char *__nptr);
long atol (const char *__nptr);
long _atol_r (struct _reent *, const char *__nptr);
void * bsearch (const void *__key,
const void *__base,
size_t __nmemb,
size_t __size,
__compar_fn_t _compar);
void *calloc(size_t, size_t) __attribute__((__malloc__)) __attribute__((__warn_unused_result__))
__attribute__((__alloc_size__(1, 2))) ;
div_t div (int __numer, int __denom);
void exit (int __status) __attribute__ ((__noreturn__));
void free (void *) ;
char * getenv (const char *__string);
char * _getenv_r (struct _reent *, const char *__string);
char * _findenv (const char *, int *);
char * _findenv_r (struct _reent *, const char *, int *);
extern char *suboptarg;
int getsubopt (char **, char * const *, char **);
long labs (long);
ldiv_t ldiv (long __numer, long __denom);
void *malloc(size_t) __attribute__((__malloc__)) __attribute__((__warn_unused_result__)) __attribute__((__alloc_size__(1))) ;
int mblen (const char *, size_t);
int _mblen_r (struct _reent *, const char *, size_t, _mbstate_t *);
int mbtowc (wchar_t *restrict, const char *restrict, size_t);
int _mbtowc_r (struct _reent *, wchar_t *restrict, const char *restrict, size_t, _mbstate_t *);
int wctomb (char *, wchar_t);
int _wctomb_r (struct _reent *, char *, wchar_t, _mbstate_t *);
size_t mbstowcs (wchar_t *restrict, const char *restrict, size_t);
size_t _mbstowcs_r (struct _reent *, wchar_t *restrict, const char *restrict, size_t, _mbstate_t *);
size_t wcstombs (char *restrict, const wchar_t *restrict, size_t);
size_t _wcstombs_r (struct _reent *, char *restrict, const wchar_t *restrict, size_t, _mbstate_t *);
char * mkdtemp (char *);
int mkstemp (char *);
int mkstemps (char *, int);
char * mktemp (char *) __attribute__ ((__deprecated__("the use of `mktemp' is dangerous; use `mkstemp' instead")));
char * _mkdtemp_r (struct _reent *, char *);
int _mkostemp_r (struct _reent *, char *, int);
int _mkostemps_r (struct _reent *, char *, int, int);
int _mkstemp_r (struct _reent *, char *);
int _mkstemps_r (struct _reent *, char *, int);
char * _mktemp_r (struct _reent *, char *) __attribute__ ((__deprecated__("the use of `mktemp' is dangerous; use `mkstemp' instead")));
void qsort (void *__base, size_t __nmemb, size_t __size, __compar_fn_t _compar);
int rand (void);
void *realloc(void *, size_t) __attribute__((__warn_unused_result__)) __attribute__((__alloc_size__(2))) ;
void *reallocarray(void *, size_t, size_t) __attribute__((__warn_unused_result__)) __attribute__((__alloc_size__(2, 3)));
void *reallocf(void *, size_t) __attribute__((__warn_unused_result__)) __attribute__((__alloc_size__(2)));
char * realpath (const char *restrict path, char *restrict resolved_path);
int rpmatch (const char *response);
void srand (unsigned __seed);
double strtod (const char *restrict __n, char **restrict __end_PTR);
double _strtod_r (struct _reent *,const char *restrict __n, char **restrict __end_PTR);
float strtof (const char *restrict __n, char **restrict __end_PTR);
long strtol (const char *restrict __n, char **restrict __end_PTR, int __base);
long _strtol_r (struct _reent *,const char *restrict __n, char **restrict __end_PTR, int __base);
unsigned long strtoul (const char *restrict __n, char **restrict __end_PTR, int __base);
unsigned long _strtoul_r (struct _reent *,const char *restrict __n, char **restrict __end_PTR, int __base);
# 191 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/stdlib.h" 3 4
int system (const char *__string);
long a64l (const char *__input);
char * l64a (long __input);
char * _l64a_r (struct _reent *,long __input);
int on_exit (void (*__func)(int, void *),void *__arg);
void _Exit (int __status) __attribute__ ((__noreturn__));
int putenv (char *__string);
int _putenv_r (struct _reent *, char *__string);
void * _reallocf_r (struct _reent *, void *, size_t);
int setenv (const char *__string, const char *__value, int __overwrite);
int _setenv_r (struct _reent *, const char *__string, const char *__value, int __overwrite);
# 224 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/stdlib.h" 3 4
char * __itoa (int, char *, int);
char * __utoa (unsigned, char *, int);
char * itoa (int, char *, int);
char * utoa (unsigned, char *, int);
int rand_r (unsigned *__seed);
double drand48 (void);
double _drand48_r (struct _reent *);
double erand48 (unsigned short [3]);
double _erand48_r (struct _reent *, unsigned short [3]);
long jrand48 (unsigned short [3]);
long _jrand48_r (struct _reent *, unsigned short [3]);
void lcong48 (unsigned short [7]);
void _lcong48_r (struct _reent *, unsigned short [7]);
long lrand48 (void);
long _lrand48_r (struct _reent *);
long mrand48 (void);
long _mrand48_r (struct _reent *);
long nrand48 (unsigned short [3]);
long _nrand48_r (struct _reent *, unsigned short [3]);
unsigned short *
seed48 (unsigned short [3]);
unsigned short *
_seed48_r (struct _reent *, unsigned short [3]);
void srand48 (long);
void _srand48_r (struct _reent *, long);
char * initstate (unsigned, char *, size_t);
long random (void);
char * setstate (char *);
void srandom (unsigned);
long long atoll (const char *__nptr);
long long _atoll_r (struct _reent *, const char *__nptr);
long long llabs (long long);
lldiv_t lldiv (long long __numer, long long __denom);
long long strtoll (const char *restrict __n, char **restrict __end_PTR, int __base);
long long _strtoll_r (struct _reent *, const char *restrict __n, char **restrict __end_PTR, int __base);
unsigned long long strtoull (const char *restrict __n, char **restrict __end_PTR, int __base);
unsigned long long _strtoull_r (struct _reent *, const char *restrict __n, char **restrict __end_PTR, int __base);
void cfree (void *);
int unsetenv (const char *__string);
int _unsetenv_r (struct _reent *, const char *__string);
int posix_memalign (void **, size_t, size_t) __attribute__((__nonnull__ (1)))
__attribute__((__warn_unused_result__));
char * _dtoa_r (struct _reent *, double, int, int, int *, int*, char**);
void * _malloc_r (struct _reent *, size_t) ;
void * _calloc_r (struct _reent *, size_t, size_t) ;
void _free_r (struct _reent *, void *) ;
void * _realloc_r (struct _reent *, void *, size_t) ;
void _mstats_r (struct _reent *, char *);
int _system_r (struct _reent *, const char *);
void __eprintf (const char *, const char *, unsigned int, const char *);
# 312 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/stdlib.h" 3 4
void qsort_r (void *__base, size_t __nmemb, size_t __size, void *__thunk, int (*_compar)(void *, const void *, const void *))
__asm__ ("" "__bsd_qsort_r");
# 322 "/home/jlaw/jenkins/workspace/c6x-elf/newlib-cygwin/newlib/libc/include/stdlib.h" 3 4
extern long double _strtold_r (struct _reent *, const char *restrict, char **restrict);
extern long double strtold (const char *restrict, char **restrict);
void * aligned_alloc(size_t, size_t) __attribute__((__malloc__)) __attribute__((__alloc_align__(1)))
__attribute__((__alloc_size__(2))) __attribute__((__warn_unused_result__));
int at_quick_exit(void (*)(void));
_Noreturn void
quick_exit(int);
# 12 "../../../../../../..//newlib-cygwin/newlib/libc/argz/argz_append.c" 2
# 13 "../../../../../../..//newlib-cygwin/newlib/libc/argz/argz_append.c"
error_t
argz_append (char **argz,
size_t *argz_len,
const char *buf,
size_t buf_len)
{
if (buf_len)
{
size_t last = *argz_len;
*argz_len += buf_len;
if(!(*argz = (char *)realloc(*argz, *argz_len)))
return
# 26 "../../../../../../..//newlib-cygwin/newlib/libc/argz/argz_append.c" 3 4
12
# 26 "../../../../../../..//newlib-cygwin/newlib/libc/argz/argz_append.c"
;
memcpy(*argz + last, buf, buf_len);
}
return 0;
}
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH] dwarf2cfi: Improve cfa_reg comparisons [PR103619]
2021-12-14 17:32 ` Jeff Law
@ 2021-12-14 20:18 ` Jakub Jelinek
2021-12-14 22:05 ` Jeff Law
0 siblings, 1 reply; 8+ messages in thread
From: Jakub Jelinek @ 2021-12-14 20:18 UTC (permalink / raw)
To: Jeff Law; +Cc: Hafiz Abid Qadeer, ams, gcc-patches
On Tue, Dec 14, 2021 at 10:32:21AM -0700, Jeff Law wrote:
> I think the attached testcase should trigger on c6x with -mbig-endian -O2 -g
Thanks. Finally I see what's going on. c6x doesn't really need the CFA
with span > 1 (and I bet neither does armbe), the only reason why
dwf_cfa_reg is called is that the code in 13 cases just tries to compare
the CFA against dwf_cfa_reg (some_reg). And that dwf_cfa_reg on some reg
that usually isn't a CFA reg results in targetm.dwarf_register_span hook
call, which on targets like c6x or armeb and others for some registers
creates a PARALLEL with various REGs in it, then the loop with the assertion
and finally operator== which just notes that the reg is different and fails.
This seems compile time memory and time inefficient.
The following so far untested patch instead adds an extra operator== and !=
for comparison of cfa_reg with rtx, which has the most common case where it
is a different register number done early without actually invoking
dwf_cfa_reg. This means the assertion in dwf_cfa_reg can stay as is (at
least until some big endian target needs to have hard frame pointer or stack
pointer with span > 1 as well).
I've removed a different assertion there because it is redundant - dwf_regno
already has exactly that assertion in it too.
And I've included those 2 tweaks to avoid creating a REG in GC memory when
we can use {stack,hard_frame}_pointer_rtx which is already initialized to
the same REG we need by init_emit_regs.
Ok for trunk if it passes bootstrap/regtest?
2021-12-14 Jakub Jelinek <jakub@redhat.com>
PR debug/103619
* dwarf2cfi.c (dwf_cfa_reg): Remove gcc_assert.
(operator==, operator!=): New overloaded operators.
(dwarf2out_frame_debug_adjust_cfa, dwarf2out_frame_debug_cfa_offset,
dwarf2out_frame_debug_expr): Compare vars with cfa_reg type directly
with REG rtxes rather than with dwf_cfa_reg results on those REGs.
(create_cie_data): Use stack_pointer_rtx instead of
gen_rtx_REG (Pmode, STACK_POINTER_REGNUM).
(execute_dwarf2_frame): Use hard_frame_pointer_rtx instead of
gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM).
--- gcc/dwarf2cfi.c.jj 2021-12-14 19:00:49.067607884 +0100
+++ gcc/dwarf2cfi.c 2021-12-14 20:29:19.138677618 +0100
@@ -1113,8 +1113,6 @@ dwf_cfa_reg (rtx reg)
{
struct cfa_reg result;
- gcc_assert (REGNO (reg) < FIRST_PSEUDO_REGISTER);
-
result.reg = dwf_regno (reg);
result.span = 1;
result.span_width = 0;
@@ -1144,6 +1142,25 @@ dwf_cfa_reg (rtx reg)
return result;
}
+/* More efficient comparisons that don't call targetm.dwarf_register_span
+ unnecessarily. */
+
+static bool
+operator== (cfa_reg &cfa, rtx reg)
+{
+ unsigned int regno = dwf_regno (reg);
+ if (cfa.reg != regno)
+ return false;
+ struct cfa_reg other = dwf_cfa_reg (reg);
+ return cfa == other;
+}
+
+static inline bool
+operator!= (cfa_reg &cfa, rtx reg)
+{
+ return !(cfa == reg);
+}
+
/* Compare X and Y for equivalence. The inputs may be REGs or PC_RTX. */
static bool
@@ -1313,7 +1330,7 @@ dwarf2out_frame_debug_adjust_cfa (rtx pa
switch (GET_CODE (src))
{
case PLUS:
- gcc_assert (dwf_cfa_reg (XEXP (src, 0)) == cur_cfa->reg);
+ gcc_assert (cur_cfa->reg == XEXP (src, 0));
cur_cfa->offset -= rtx_to_poly_int64 (XEXP (src, 1));
break;
@@ -1346,11 +1363,11 @@ dwarf2out_frame_debug_cfa_offset (rtx se
switch (GET_CODE (addr))
{
case REG:
- gcc_assert (dwf_cfa_reg (addr) == cur_cfa->reg);
+ gcc_assert (cur_cfa->reg == addr);
offset = -cur_cfa->offset;
break;
case PLUS:
- gcc_assert (dwf_cfa_reg (XEXP (addr, 0)) == cur_cfa->reg);
+ gcc_assert (cur_cfa->reg == XEXP (addr, 0));
offset = rtx_to_poly_int64 (XEXP (addr, 1)) - cur_cfa->offset;
break;
default:
@@ -1797,7 +1814,7 @@ dwarf2out_frame_debug_expr (rtx expr)
{
/* Setting FP from SP. */
case REG:
- if (cur_cfa->reg == dwf_cfa_reg (src))
+ if (cur_cfa->reg == src)
{
/* Rule 1 */
/* Update the CFA rule wrt SP or FP. Make sure src is
@@ -1828,7 +1845,7 @@ dwarf2out_frame_debug_expr (rtx expr)
{
gcc_assert (REGNO (dest) == HARD_FRAME_POINTER_REGNUM
&& fde->drap_reg != INVALID_REGNUM
- && cur_cfa->reg != dwf_cfa_reg (src)
+ && cur_cfa->reg != src
&& fde->rule18);
fde->rule18 = 0;
/* The save of hard frame pointer has been deferred
@@ -1852,8 +1869,7 @@ dwarf2out_frame_debug_expr (rtx expr)
/* Adjusting SP. */
if (REG_P (XEXP (src, 1)))
{
- gcc_assert (dwf_cfa_reg (XEXP (src, 1))
- == cur_trace->cfa_temp.reg);
+ gcc_assert (cur_trace->cfa_temp.reg == XEXP (src, 1));
offset = cur_trace->cfa_temp.offset;
}
else if (!poly_int_rtx_p (XEXP (src, 1), &offset))
@@ -1886,7 +1902,7 @@ dwarf2out_frame_debug_expr (rtx expr)
gcc_assert (frame_pointer_needed);
gcc_assert (REG_P (XEXP (src, 0))
- && dwf_cfa_reg (XEXP (src, 0)) == cur_cfa->reg);
+ && cur_cfa->reg == XEXP (src, 0));
offset = rtx_to_poly_int64 (XEXP (src, 1));
if (GET_CODE (src) != MINUS)
offset = -offset;
@@ -1899,7 +1915,7 @@ dwarf2out_frame_debug_expr (rtx expr)
/* Rule 4 */
if (REG_P (XEXP (src, 0))
- && dwf_cfa_reg (XEXP (src, 0)) == cur_cfa->reg
+ && cur_cfa->reg == XEXP (src, 0)
&& poly_int_rtx_p (XEXP (src, 1), &offset))
{
/* Setting a temporary CFA register that will be copied
@@ -1914,7 +1930,7 @@ dwarf2out_frame_debug_expr (rtx expr)
/* Rule 5 */
else if (REG_P (XEXP (src, 0))
- && dwf_cfa_reg (XEXP (src, 0)) == cur_trace->cfa_temp.reg
+ && cur_trace->cfa_temp.reg == XEXP (src, 0)
&& XEXP (src, 1) == stack_pointer_rtx)
{
/* Setting a scratch register that we will use instead
@@ -1945,7 +1961,7 @@ dwarf2out_frame_debug_expr (rtx expr)
/* Rule 7 */
case IOR:
gcc_assert (REG_P (XEXP (src, 0))
- && dwf_cfa_reg (XEXP (src, 0)) == cur_trace->cfa_temp.reg
+ && cur_trace->cfa_temp.reg == XEXP (src, 0)
&& CONST_INT_P (XEXP (src, 1)));
cur_trace->cfa_temp.reg = dwf_cfa_reg (dest);
@@ -1981,7 +1997,7 @@ dwarf2out_frame_debug_expr (rtx expr)
dwarf2out_flush_queued_reg_saves ();
gcc_assert (cur_trace->cfa_store.reg
- == dwf_cfa_reg (XEXP (src, 0)));
+ == XEXP (src, 0));
fde->stack_realign = 1;
fde->stack_realignment = INTVAL (XEXP (src, 1));
cur_trace->cfa_store.offset = 0;
@@ -2109,8 +2125,7 @@ dwarf2out_frame_debug_expr (rtx expr)
/* Rule 14 */
case POST_INC:
- gcc_assert (cur_trace->cfa_temp.reg
- == dwf_cfa_reg (XEXP (XEXP (dest, 0), 0)));
+ gcc_assert (cur_trace->cfa_temp.reg == XEXP (XEXP (dest, 0), 0));
offset = -cur_trace->cfa_temp.offset;
cur_trace->cfa_temp.offset -= GET_MODE_SIZE (GET_MODE (dest));
break;
@@ -2128,7 +2143,7 @@ dwarf2out_frame_debug_expr (rtx expr)
if (REG_P (src)
&& REGNO (src) != STACK_POINTER_REGNUM
&& REGNO (src) != HARD_FRAME_POINTER_REGNUM
- && dwf_cfa_reg (src) == cur_cfa->reg)
+ && cur_cfa->reg == src)
{
/* We're storing the current CFA reg into the stack. */
@@ -3210,8 +3225,7 @@ create_cie_data (void)
dw_cfa_location loc;
dw_trace_info cie_trace;
- dw_stack_pointer_regnum = dwf_cfa_reg (gen_rtx_REG (Pmode,
- STACK_POINTER_REGNUM));
+ dw_stack_pointer_regnum = dwf_cfa_reg (stack_pointer_rtx);
memset (&cie_trace, 0, sizeof (cie_trace));
cur_trace = &cie_trace;
@@ -3270,8 +3284,7 @@ static unsigned int
execute_dwarf2_frame (void)
{
/* Different HARD_FRAME_POINTER_REGNUM might coexist in the same file. */
- dw_frame_pointer_regnum
- = dwf_cfa_reg (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM));
+ dw_frame_pointer_regnum = dwf_cfa_reg (hard_frame_pointer_rtx);
/* The first time we're called, compute the incoming frame state. */
if (cie_cfi_vec == NULL)
Jakub
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] dwarf2cfi: Improve cfa_reg comparisons [PR103619]
2021-12-14 20:18 ` [PATCH] dwarf2cfi: Improve cfa_reg comparisons [PR103619] Jakub Jelinek
@ 2021-12-14 22:05 ` Jeff Law
2021-12-14 22:27 ` Jakub Jelinek
0 siblings, 1 reply; 8+ messages in thread
From: Jeff Law @ 2021-12-14 22:05 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Hafiz Abid Qadeer, ams, gcc-patches
On 12/14/2021 1:18 PM, Jakub Jelinek wrote:
> On Tue, Dec 14, 2021 at 10:32:21AM -0700, Jeff Law wrote:
>> I think the attached testcase should trigger on c6x with -mbig-endian -O2 -g
> Thanks. Finally I see what's going on. c6x doesn't really need the CFA
> with span > 1 (and I bet neither does armbe), the only reason why
> dwf_cfa_reg is called is that the code in 13 cases just tries to compare
> the CFA against dwf_cfa_reg (some_reg). And that dwf_cfa_reg on some reg
> that usually isn't a CFA reg results in targetm.dwarf_register_span hook
> call, which on targets like c6x or armeb and others for some registers
> creates a PARALLEL with various REGs in it, then the loop with the assertion
> and finally operator== which just notes that the reg is different and fails.
>
> This seems compile time memory and time inefficient.
>
> The following so far untested patch instead adds an extra operator== and !=
> for comparison of cfa_reg with rtx, which has the most common case where it
> is a different register number done early without actually invoking
> dwf_cfa_reg. This means the assertion in dwf_cfa_reg can stay as is (at
> least until some big endian target needs to have hard frame pointer or stack
> pointer with span > 1 as well).
> I've removed a different assertion there because it is redundant - dwf_regno
> already has exactly that assertion in it too.
>
> And I've included those 2 tweaks to avoid creating a REG in GC memory when
> we can use {stack,hard_frame}_pointer_rtx which is already initialized to
> the same REG we need by init_emit_regs.
>
> Ok for trunk if it passes bootstrap/regtest?
>
> 2021-12-14 Jakub Jelinek <jakub@redhat.com>
>
> PR debug/103619
> * dwarf2cfi.c (dwf_cfa_reg): Remove gcc_assert.
> (operator==, operator!=): New overloaded operators.
> (dwarf2out_frame_debug_adjust_cfa, dwarf2out_frame_debug_cfa_offset,
> dwarf2out_frame_debug_expr): Compare vars with cfa_reg type directly
> with REG rtxes rather than with dwf_cfa_reg results on those REGs.
> (create_cie_data): Use stack_pointer_rtx instead of
> gen_rtx_REG (Pmode, STACK_POINTER_REGNUM).
> (execute_dwarf2_frame): Use hard_frame_pointer_rtx instead of
> gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM).
So if someone is unfamiliar with the underlying issues here and needs to
twiddle dwarf2cfi, how are they supposed to know if they should compare
directly or use dwf_cfa_reg?
I'm not saying the patch is wrong, just wondering if we're setting
ourselves up for a maintenance problem going forward.
jeff
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] dwarf2cfi: Improve cfa_reg comparisons [PR103619]
2021-12-14 22:05 ` Jeff Law
@ 2021-12-14 22:27 ` Jakub Jelinek
2021-12-14 23:36 ` Jeff Law
0 siblings, 1 reply; 8+ messages in thread
From: Jakub Jelinek @ 2021-12-14 22:27 UTC (permalink / raw)
To: Jeff Law; +Cc: Hafiz Abid Qadeer, ams, gcc-patches
On Tue, Dec 14, 2021 at 03:05:37PM -0700, Jeff Law wrote:
> > 2021-12-14 Jakub Jelinek <jakub@redhat.com>
> >
> > PR debug/103619
> > * dwarf2cfi.c (dwf_cfa_reg): Remove gcc_assert.
> > (operator==, operator!=): New overloaded operators.
> > (dwarf2out_frame_debug_adjust_cfa, dwarf2out_frame_debug_cfa_offset,
> > dwarf2out_frame_debug_expr): Compare vars with cfa_reg type directly
> > with REG rtxes rather than with dwf_cfa_reg results on those REGs.
> > (create_cie_data): Use stack_pointer_rtx instead of
> > gen_rtx_REG (Pmode, STACK_POINTER_REGNUM).
> > (execute_dwarf2_frame): Use hard_frame_pointer_rtx instead of
> > gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM).
> So if someone is unfamiliar with the underlying issues here and needs to
> twiddle dwarf2cfi, how are they supposed to know if they should compare
> directly or use dwf_cfa_reg?
Comparison without dwf_cfa_reg should be used whenever possible, because
for registers which are never CFA related that won't call
targetm.dwarf_register_span uselessly.
The only comparisons with dwf_cfa_reg I've kept are the:
regno = dwf_cfa_reg (XEXP (XEXP (dest, 0), 0));
if (cur_cfa->reg == regno)
offset -= cur_cfa->offset;
else if (cur_trace->cfa_store.reg == regno)
offset -= cur_trace->cfa_store.offset;
else
{
gcc_assert (cur_trace->cfa_temp.reg == regno);
offset -= cur_trace->cfa_temp.offset;
}
and
struct cfa_reg regno = dwf_cfa_reg (XEXP (dest, 0));
if (cur_cfa->reg == regno)
offset = -cur_cfa->offset;
else if (cur_trace->cfa_store.reg == regno)
offset = -cur_trace->cfa_store.offset;
else
{
gcc_assert (cur_trace->cfa_temp.reg == regno);
offset = -cur_trace->cfa_temp.offset;
}
and there are 2 reasons for it:
1) there is an assertion, which guarantees it must compare equal to one of
those 3 cfa related struct cfa_reg structs, so it must be some CFA related
register (so, right now, targetm.dwarf_register_span shouldn't return
non-NULL in those on anything but gcn)
2) it is compared 3 times in a row, so for the GCN case doing
if (cur_cfa->reg == XEXP (XEXP (dest, 0), 0))
offset -= cur_cfa->offset;
else if (cur_trace->cfa_store.reg == XEXP (XEXP (dest, 0), 0))
offset -= cur_trace->cfa_store.offset;
else
{
gcc_assert (cur_trace->cfa_temp.reg == XEXP (XEXP (dest, 0), 0));
offset -= cur_trace->cfa_temp.offset;
}
could actually create more GC allocated garbage than the way it is written
now. But doing it that way would work fine.
I think for most of the comparisons even comparing with dwf_cfa_reg would
work but be less compile time/memory efficient (e.g. those assertions that
it is equal to some CFA related cfa_reg or in any spots where only the CFA
related regs may appear in the frame related patterns).
I'm aware just of a single spot where comparison with dwf_cfa_reg doesn't
work (when the assert is in dwf_cfa_reg), that is the spot that was ICEing
on your testcase, where we save arbitrary call saved register:
if (REG_P (src)
&& REGNO (src) != STACK_POINTER_REGNUM
&& REGNO (src) != HARD_FRAME_POINTER_REGNUM
&& cur_cfa->reg == src)
Jakub
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] dwarf2cfi: Improve cfa_reg comparisons [PR103619]
2021-12-14 22:27 ` Jakub Jelinek
@ 2021-12-14 23:36 ` Jeff Law
0 siblings, 0 replies; 8+ messages in thread
From: Jeff Law @ 2021-12-14 23:36 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Hafiz Abid Qadeer, ams, gcc-patches
On 12/14/2021 3:27 PM, Jakub Jelinek wrote:
> On Tue, Dec 14, 2021 at 03:05:37PM -0700, Jeff Law wrote:
>>> 2021-12-14 Jakub Jelinek <jakub@redhat.com>
>>>
>>> PR debug/103619
>>> * dwarf2cfi.c (dwf_cfa_reg): Remove gcc_assert.
>>> (operator==, operator!=): New overloaded operators.
>>> (dwarf2out_frame_debug_adjust_cfa, dwarf2out_frame_debug_cfa_offset,
>>> dwarf2out_frame_debug_expr): Compare vars with cfa_reg type directly
>>> with REG rtxes rather than with dwf_cfa_reg results on those REGs.
>>> (create_cie_data): Use stack_pointer_rtx instead of
>>> gen_rtx_REG (Pmode, STACK_POINTER_REGNUM).
>>> (execute_dwarf2_frame): Use hard_frame_pointer_rtx instead of
>>> gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM).
>> So if someone is unfamiliar with the underlying issues here and needs to
>> twiddle dwarf2cfi, how are they supposed to know if they should compare
>> directly or use dwf_cfa_reg?
> Comparison without dwf_cfa_reg should be used whenever possible, because
> for registers which are never CFA related that won't call
> targetm.dwarf_register_span uselessly.
So it's easy enough to articulate. Is there anywhere you could put a
comment to that effect where it's likely to be seen in that file?
OK with that change.
Jeff
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2021-12-14 23:36 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-09 17:32 [PATCH] Remove an invalid assert. [PR103619] Hafiz Abid Qadeer
2021-12-10 21:18 ` Jeff Law
2021-12-14 16:53 ` Jakub Jelinek
2021-12-14 17:32 ` Jeff Law
2021-12-14 20:18 ` [PATCH] dwarf2cfi: Improve cfa_reg comparisons [PR103619] Jakub Jelinek
2021-12-14 22:05 ` Jeff Law
2021-12-14 22:27 ` Jakub Jelinek
2021-12-14 23:36 ` Jeff Law
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).