From: Georg-Johann Lay Date: Mon, 15 Jan 2024 12:25:59 +0000 (+0100) Subject: AVR: target/107201: Make -nodevicelib work for all devices. X-Git-Tag: releases/gcc-12.4.0~466 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ebdc3aae0a4705d0b72b69a37fdafa5613343d5d;p=thirdparty%2Fgcc.git AVR: target/107201: Make -nodevicelib work for all devices. driver-avr.cc contains a spec that discriminates between cores and devices by means of a mmcu=avr* spec pattern. This does not work for new devices like AVR128* which also start with mmcu=avr like all cores do. The patch uses a new spec function in order to tell apart cores from devices. gcc/ PR target/107201 * config/avr/avr.h (EXTRA_SPEC_FUNCTIONS): Add no-devlib, avr_no_devlib. * config/avr/driver-avr.cc (avr_no_devlib): New function. (avr_devicespecs_file): Use it to remove -nodevicelib from the options for cores only. * config/avr/avr-arch.h (avr_get_parch): New prototype. * config/avr/avr-devices.cc (avr_get_parch): New function. (cherry picked from commit 86fac7ee1688bdec245a43f6d2ab49fb238892e4) --- diff --git a/gcc/config/avr/avr-arch.h b/gcc/config/avr/avr-arch.h index 7b2535593882..26aa78da6dc8 100644 --- a/gcc/config/avr/avr-arch.h +++ b/gcc/config/avr/avr-arch.h @@ -195,6 +195,7 @@ typedef struct extern const avr_arch_t avr_arch_types[]; extern const avr_arch_t *avr_arch; +extern const avr_arch_t *avr_get_parch (const char *mcu); extern const avr_mcu_t avr_mcu_types[]; diff --git a/gcc/config/avr/avr-devices.cc b/gcc/config/avr/avr-devices.cc index aa284217f50c..9762ff86f7db 100644 --- a/gcc/config/avr/avr-devices.cc +++ b/gcc/config/avr/avr-devices.cc @@ -153,4 +153,20 @@ avr_inform_core_architectures (void) free (archs); } + +/* When MCU names a core arch like "avr5", then return a pointer to the + respective entry in avr_arch_types[]. Otherwise, return NULL. */ + +const avr_arch_t * +avr_get_parch (const char *mcu) +{ + for (size_t i = 0; i < ARRAY_SIZE (avr_arch_types); ++i) + { + if (strcmp (mcu, avr_arch_types[i].name) == 0) + return & avr_arch_types[i]; + } + + return NULL; +} + #endif // IN_GEN_AVR_MMCU_TEXI diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h index 1b948c6130cc..64aa3c347e76 100644 --- a/gcc/config/avr/avr.h +++ b/gcc/config/avr/avr.h @@ -500,9 +500,11 @@ typedef struct avr_args extern const char *avr_devicespecs_file (int, const char**); extern const char *avr_double_lib (int, const char**); +extern const char *avr_no_devlib (int, const char**); #define EXTRA_SPEC_FUNCTIONS \ { "double-lib", avr_double_lib }, \ + { "no-devlib", avr_no_devlib }, \ { "device-specs-file", avr_devicespecs_file }, /* Driver self specs has lmited functionality w.r.t. '%s' for dynamic specs. diff --git a/gcc/config/avr/driver-avr.cc b/gcc/config/avr/driver-avr.cc index 4de463f0cba5..59ddce3bf563 100644 --- a/gcc/config/avr/driver-avr.cc +++ b/gcc/config/avr/driver-avr.cc @@ -103,9 +103,14 @@ avr_devicespecs_file (int argc, const char **argv) } return concat ("%{!nodevicespecs:-specs=device-specs", dir_separator_str, - "specs-", mmcu, "%s} %