From patchwork Wed Jun 27 11:57:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jozef Lawrynowicz X-Patchwork-Id: 935440 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-480553-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=mittosystems.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="NBN4ghSQ"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=mittosystems.com header.i=@mittosystems.com header.b="T7k/rmpM"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41G1cf1nvsz9s1B for ; Wed, 27 Jun 2018 21:57:38 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :subject:to:cc:references:from:message-id:date:mime-version :in-reply-to:content-type; q=dns; s=default; b=ZFJ7ZdG47wyCdbsXI 3v9HpLD8sBGfuXF3c14ergGfWUBgOVS6pFhxbQ1C9jBSBvLjKU1hCh7RJ0X/SoWC KaC+bgFBw0kD3bfwftGFJipbVKFIx2nO73DBdvbT9l7mjwBBBL65QQXMxz1OSQct 2eckCspnyw3r7EHKwr/G2oZMtg= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :subject:to:cc:references:from:message-id:date:mime-version :in-reply-to:content-type; s=default; bh=FTJ6Sw/OpOcYeow96DRpm5P BT8I=; b=NBN4ghSQOmpMWz7WKRJyouhOWWfO9NJNxv67zF1MW1NTIDrwP8ibH4B VqKPMGLn4BIw74FAvpSH+d1VQMhc6zldtCpSfFMnzhqc8tKGY1ukeT6eZ/N/euw4 /P5UFwNiGSBFZHz/fCZjym0uAfFC3k+InGICAOgFmCqo5aYL+klo= Received: (qmail 125807 invoked by alias); 27 Jun 2018 11:57:30 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 124855 invoked by uid 89); 27 Jun 2018 11:57:29 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=locating X-HELO: mail-wr0-f182.google.com Received: from mail-wr0-f182.google.com (HELO mail-wr0-f182.google.com) (209.85.128.182) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 27 Jun 2018 11:57:26 +0000 Received: by mail-wr0-f182.google.com with SMTP id f16-v6so1758514wrm.3 for ; Wed, 27 Jun 2018 04:57:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mittosystems.com; s=google; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language; bh=iuPh5ObmjoPYfDkzbx8or+b1AYtG6jWUt9qvxY2rJEk=; b=T7k/rmpMs6YKLgkWTnvB6UGRhQDL15Y2cJbRFY8KlcQGlRG+CMHe7ACiPxeg0UlXtO lK431iQJP26D+iuAEl5RRHqk9GCg/TGwm2/1IiZ14U77nR4yJYZ3hZVEWGFcNIi0B2q8 WAP96H+Iw7lB7wBTftMNkXX0C9kNqsBTFco/QLApNN/e8k/zSuH4SGzVpxm5jhWQFWpG cno165Q+exbyTp4FqVuVx5DX9OTkotuUDeOp3B4sSAxd6NUtvF/rxFLWysaZ2Wnxk5wu 3KdRFjFpbJ4hBG608UrOc+fgwngvaDQivG5Bbl41h78DnnbL1e50LXehJodhrYyl1zHk O83g== Received: from [192.168.1.136] (host81-159-214-6.range81-159.btcentralplus.com. [81.159.214.6]) by smtp.gmail.com with ESMTPSA id q140-v6sm2187119wmb.35.2018.06.27.04.57.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 27 Jun 2018 04:57:23 -0700 (PDT) Subject: [PATCH 4/4] [MSP430] Search for MCU data file using environment variable and in a toolchain subdirectory To: gcc-patches@gcc.gnu.org Cc: DJ Delorie , Nick Clifton References: <1f624927-f6c6-dced-6169-a31175a21965@mittosystems.com> From: Jozef Lawrynowicz Message-ID: Date: Wed, 27 Jun 2018 12:57:22 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0 MIME-Version: 1.0 In-Reply-To: <1f624927-f6c6-dced-6169-a31175a21965@mittosystems.com> X-IsSubscribed: yes > The fourth and final patch adds functionality to search for > devices.csv in both > the path specified by the environment variable > "MSP430_GCC_INCLUDE_DIR", and > the directory "msp430-elf/include/devices" from the toolchain root. These > locations are searched if devices.csv is not found on an include path. > If devices.csv is found using one of these methods, the directory > containing > devices.csv is also registered as an include path and linker library > path. > From 43a9106e71a8b7545f894b4c1c495288b6144876 Mon Sep 17 00:00:00 2001 From: Jozef Lawrynowicz Date: Tue, 26 Jun 2018 15:02:58 +0100 Subject: [PATCH 4/4] MSP430 - Devices 3 - Add functionality to read devices.csv path from env var 2018-06-27 Jozef Lawrynowicz gcc/config/msp430/ * driver-msp430.c (msp430_select_hwmult_lib): Fix formatting. (msp430_get_linker_devices_include_path): New. * msp430-devices.c (msp430_dirname): New. (canonicalize_path_dirsep): New. (process_collect_gcc_into_devices_dir): New. (msp430_check_env_var_for_devices): New. (parse_devices_csv): Call msp430_check_env_var_for_devices after trying other methods. * msp430-devices.h (msp430_check_env_var_for_devices): New. (msp430_dirname): New. * msp430.c (msp430_register_pre_includes): New. * msp430.h (EXTRA_SPEC_FUNCTIONS): Add msp430_get_linker_devices_include_path. (LINK_SPEC): Likewise. Define TARGET_EXTRA_PRE_INCLUDES to msp430_register_pre_includes. gcc/doc/ * invoke.texi: Document that devices.csv is searched for using an environment variable and in a subdirectory of the toolchain installation. gcc/testsuite/gcc.target/msp430/ * devices/csv_using_env_var.c: New. * devices/csv_using_installed.c: New. * devices/csv_using_option.c: New. * msp430.exp (msp430_device_permutations_runtest): Prepare for csv_using_* tests as appropriate. (get_installed_device_data_path): New. (msp430_hide_installed_devices_data): New. (msp430_restore_installed_devices_data): New. (msp430_test_installed_device_data): New. --- gcc/config/msp430/driver-msp430.c | 13 +++- gcc/config/msp430/msp430-devices.c | 87 +++++++++++++++++++++- gcc/config/msp430/msp430-devices.h | 2 + gcc/config/msp430/msp430.c | 16 ++++ gcc/config/msp430/msp430.h | 12 ++- gcc/doc/invoke.texi | 28 ++++++- .../gcc.target/msp430/devices/csv_using_env_var.c | 10 +++ .../msp430/devices/csv_using_installed.c | 11 +++ .../gcc.target/msp430/devices/csv_using_option.c | 12 +++ gcc/testsuite/gcc.target/msp430/msp430.exp | 70 ++++++++++++++++- 10 files changed, 254 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.target/msp430/devices/csv_using_env_var.c create mode 100644 gcc/testsuite/gcc.target/msp430/devices/csv_using_installed.c create mode 100644 gcc/testsuite/gcc.target/msp430/devices/csv_using_option.c diff --git a/gcc/config/msp430/driver-msp430.c b/gcc/config/msp430/driver-msp430.c index 4242274..3facdc2 100644 --- a/gcc/config/msp430/driver-msp430.c +++ b/gcc/config/msp430/driver-msp430.c @@ -52,7 +52,8 @@ msp430_select_cpu (int argc, const char ** argv) /* Implement spec function `msp430_hwmult_libĀ“. */ const char * -msp430_select_hwmult_lib (int argc ATTRIBUTE_UNUSED, const char ** argv ATTRIBUTE_UNUSED) +msp430_select_hwmult_lib (int argc ATTRIBUTE_UNUSED, + const char ** argv ATTRIBUTE_UNUSED) { int i; @@ -116,3 +117,13 @@ msp430_select_hwmult_lib (int argc ATTRIBUTE_UNUSED, const char ** argv ATTRIBUT return "-lmul_none"; } + +const char * +msp430_get_linker_devices_include_path (int argc ATTRIBUTE_UNUSED, + const char **argv ATTRIBUTE_UNUSED) +{ + char *devices_csv_path; + if (msp430_check_env_var_for_devices (&devices_csv_path)) + return NULL; + return concat ("-L", msp430_dirname (devices_csv_path), NULL); +} diff --git a/gcc/config/msp430/msp430-devices.c b/gcc/config/msp430/msp430-devices.c index a87a439..597568c 100644 --- a/gcc/config/msp430/msp430-devices.c +++ b/gcc/config/msp430/msp430-devices.c @@ -23,6 +23,88 @@ char * derived_devices_csv_loc = NULL; /* Set to true by msp430_extract_mcu_data if called from the driver. */ bool surpress_devices_warn = false; +/* This modifies the string pointed to by path. */ +char * +msp430_dirname (char *path) +{ + int last_elem = strlen (path) - 1; + int i = last_elem - (IS_DIR_SEPARATOR (path[last_elem]) ? 1 : 0); + for (; i >= 0; i--) + { + if (IS_DIR_SEPARATOR (path[i])) + { + path[i] = '\0'; + return path; + } + } + return path; +} + +/* This is to canonicalize the path. On Windows we can have a mix of forward + and backslashes which leads to issues following paths. */ +static void +canonicalize_path_dirsep (char **path) +{ + char *t_path = *path; + unsigned int i; + for (i = 0; i < strlen (t_path); i++) + if (IS_DIR_SEPARATOR (t_path[i])) + t_path[i] = DIR_SEPARATOR; +} + +static void +process_collect_gcc_into_devices_dir (char **devices_loc) +{ + const char rest_of_devices_path[] = "/msp430-elf/include/devices/"; + char *t_devices_loc = *devices_loc; + /* Go up a directory to the toolchain root. */ + t_devices_loc = msp430_dirname (msp430_dirname (t_devices_loc)); + t_devices_loc = concat (t_devices_loc, rest_of_devices_path, NULL); + *devices_loc = t_devices_loc; +} + +int +msp430_check_env_var_for_devices (char **local_devices_csv_loc) +{ + const int num_vars = 2; + const char dirsep[2] = { DIR_SEPARATOR, 0 }; + /* Use the COLLECT_GCC environment variable to find toolchain root directory. + */ + const char *env_vars[num_vars] = { "MSP430_GCC_INCLUDE_DIR", "COLLECT_GCC" }; + FILE *devices_csv_file = NULL; + unsigned int i; + + for (i = 0; i < num_vars; i++) + { + char *t_devices_loc; + char *val = getenv (env_vars[i]); + if (val == NULL) + continue; + t_devices_loc = ASTRDUP (val); + + /* MSP430_GCC_INCLUDE_DIR. */ + if (i == 0) + { + if (!IS_DIR_SEPARATOR (t_devices_loc[strlen (t_devices_loc) - 1])) + t_devices_loc = concat (t_devices_loc, dirsep, NULL); + } + /* COLLECT_GCC. */ + else if (i == 1) + process_collect_gcc_into_devices_dir (&t_devices_loc); + + t_devices_loc = concat (t_devices_loc, "devices.csv", NULL); + devices_csv_file = fopen (t_devices_loc, "r"); + if (devices_csv_file != NULL) + { + fclose (devices_csv_file); + *local_devices_csv_loc = t_devices_loc; + canonicalize_path_dirsep (local_devices_csv_loc); + return 0; + } + } + return 1; +} + const char * msp430_check_path_for_devices (int argc, const char **argv) { @@ -206,7 +288,10 @@ parse_devices_csv (const char * mcu_name) /* Otherwise check if the path to devices.csv was found another way. */ else if (derived_devices_csv_loc != NULL) return parse_devices_csv_1 (derived_devices_csv_loc, mcu_name); - return 1; + /* Otherwise we need to use environment variables to try and find it. */ + else + return msp430_check_env_var_for_devices (&derived_devices_csv_loc) + || parse_devices_csv_1 (derived_devices_csv_loc, mcu_name); } /* This function only needs to be executed once, but it can be first called diff --git a/gcc/config/msp430/msp430-devices.h b/gcc/config/msp430/msp430-devices.h index 9500115..e92927a 100644 --- a/gcc/config/msp430/msp430-devices.h +++ b/gcc/config/msp430/msp430-devices.h @@ -9,3 +9,5 @@ struct t_msp430_mcu_data extern struct t_msp430_mcu_data extracted_mcu_data; void msp430_extract_mcu_data (const char * mcu_name, bool surpress_warn); +int msp430_check_env_var_for_devices (char **local_devices_csv_loc); +char * msp430_dirname (char *path); diff --git a/gcc/config/msp430/msp430.c b/gcc/config/msp430/msp430.c index 13b8c0d..1ea2ecc 100644 --- a/gcc/config/msp430/msp430.c +++ b/gcc/config/msp430/msp430.c @@ -46,6 +46,8 @@ #include "builtins.h" #include "intl.h" #include "msp430-devices.h" +#include "incpath.h" +#include "prefix.h" /* This file should be included last. */ #include "target-def.h" @@ -3252,6 +3254,20 @@ msp430_can_change_mode_class (machine_mode from, machine_mode to, reg_class_t) return false; return true; } + +void +msp430_register_pre_includes (const char *sysroot ATTRIBUTE_UNUSED, + const char *iprefix ATTRIBUTE_UNUSED, + int stdinc ATTRIBUTE_UNUSED) +{ + char *include_dir; + if (msp430_check_env_var_for_devices (&include_dir)) + return; + include_dir = msp430_dirname (include_dir); + + include_dir = update_path (include_dir, ""); + add_path (include_dir, INC_SYSTEM, false, false); +} struct gcc_target targetm = TARGET_INITIALIZER; diff --git a/gcc/config/msp430/msp430.h b/gcc/config/msp430/msp430.h index a8daf3f..ce94116 100644 --- a/gcc/config/msp430/msp430.h +++ b/gcc/config/msp430/msp430.h @@ -47,11 +47,14 @@ extern bool msp430x; extern const char * msp430_select_hwmult_lib (int, const char **); extern const char * msp430_select_cpu (int, const char **); extern const char * msp430_check_path_for_devices (int, const char **); +extern const char * msp430_get_linker_devices_include_path (int, const char **); # define EXTRA_SPEC_FUNCTIONS \ { "msp430_hwmult_lib", msp430_select_hwmult_lib }, \ { "msp430_select_cpu", msp430_select_cpu }, \ - { "msp430_check_path_for_devices", msp430_check_path_for_devices }, + { "msp430_check_path_for_devices", msp430_check_path_for_devices }, \ + { "msp430_get_linker_devices_include_path", \ + msp430_get_linker_devices_include_path }, #undef STARTFILE_SPEC #define STARTFILE_SPEC "%{pg:gcrt0.o%s}%{!pg:%{minrt:crt0-minrt.o%s}%{!minrt:crt0.o%s}} %{!minrt:crtbegin.o%s}" @@ -74,7 +77,8 @@ extern const char * msp430_check_path_for_devices (int, const char **); are creating a relocatable binary (gc does not work) or debugging is enabled (the GDB testsuite relies upon unused entities not being deleted). */ #define LINK_SPEC "%{mrelax:--relax} %{mlarge:%{!r:%{!g:--gc-sections}}} " \ - "%{mcode-region=*:--code-region=%*} %{mdata-region=*:--data-region=%*}" + "%{mcode-region=*:--code-region=%*} %{mdata-region=*:--data-region=%*} " \ + "%:msp430_get_linker_devices_include_path(%{L*:%*})" #define DRIVER_SELF_SPECS \ " %{I*:%:msp430_check_path_for_devices(%{I*:%*})}" \ @@ -424,5 +428,9 @@ typedef struct #undef USE_SELECT_SECTION_FOR_FUNCTIONS #define USE_SELECT_SECTION_FOR_FUNCTIONS 1 +void msp430_register_pre_includes (const char *sysroot, const char *iprefix, + int stdinc); +#define TARGET_EXTRA_PRE_INCLUDES msp430_register_pre_includes + #define ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN) \ msp430_output_aligned_decl_common ((FILE), (DECL), (NAME), (SIZE), (ALIGN)) diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index d0be9b5..b8e2286 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -21383,8 +21383,32 @@ The ISA and hardware multiply supported for the different MCUs is hard-coded into GCC. However, an external @samp{devices.csv} file can be used to extend device support beyond those that have been hard-coded. -GCC searches for the @samp{devices.csv} file on the include paths specified -with @code{-I}. +GCC searches for the @samp{devices.csv} file using the following methods in the +given precedence order, where the first method takes precendence over the +second which takes precedence over the third. + +@table @asis +@item Include path specified with @code{-I} +@samp{devices.csv} will be searched for in each of the directories specified by +include paths. +@item Path specified by the environment variable @samp{MSP430_GCC_INCLUDE_DIR} +Define the value of the global environment variable +@samp{MSP430_GCC_INCLUDE_DIR} +to the full path to the directory containing devices.csv, and GCC will search +this directory for devices.csv. If devices.csv is found, this directory will +also be registered as an include path, and linker library path. Header files +and linker scripts in this directory can therefore be used without manually +specifying @code{-I} and @code{-L} on the command line. +@item The @samp{msp430-elf/include/devices} directory +Finally, GCC will examine @samp{msp430-elf/include/devices} from the +toolchain root directory. This directory does not exist in a default +installation, but if the user has created it and copied @samp{devices.csv} +there, then the MCU data will be read. As above, this directory will +also be registered as an include path, and linker library path. + +@end table +If none of the above search methods find @samp{devices.csv}, then the +hard-coded MCU data is used. @item -mwarn-mcu @itemx -mno-warn-mcu diff --git a/gcc/testsuite/gcc.target/msp430/devices/csv_using_env_var.c b/gcc/testsuite/gcc.target/msp430/devices/csv_using_env_var.c new file mode 100644 index 0000000..506ae74 --- /dev/null +++ b/gcc/testsuite/gcc.target/msp430/devices/csv_using_env_var.c @@ -0,0 +1,10 @@ +/* { dg-do link } */ +/* { dg-msp-options "-mmcu=msp430_28" } */ +/* { dg-warning "supports 430X ISA but -mcpu option is set to 430" "" { target 430_selected } 0 } */ +/* { dg-warning "supports f5series hardware multiply" "" { target msp430_hwmul_not_f5 } 0 } */ + +/* This tests that the environment variable MSP430_GCC_INCLUDE_DIR can be used + to specify the path to the directory containing devices.csv. + The variable is set in msp430.exp. */ + +#include "../devices-main.c" diff --git a/gcc/testsuite/gcc.target/msp430/devices/csv_using_installed.c b/gcc/testsuite/gcc.target/msp430/devices/csv_using_installed.c new file mode 100644 index 0000000..f5d7806 --- /dev/null +++ b/gcc/testsuite/gcc.target/msp430/devices/csv_using_installed.c @@ -0,0 +1,11 @@ +/* { dg-do link } */ +/* { dg-msp-options "-mmcu=msp430_28" } */ +/* { dg-warning "supports 430X ISA but -mcpu option is set to 430" "" { target 430_selected } 0 } */ +/* { dg-warning "supports f5series hardware multiply" "" { target msp430_hwmul_not_f5 } 0 } */ + +/* This tests that the devices.csv can be installed into the + "$TOOLCHAIN_ROOT/msp430-elf/include/devices/" and used to read device data. + msp430.exp will mark this test unsupported if the above directory does not + exist. */ + +#include "../devices-main.c" diff --git a/gcc/testsuite/gcc.target/msp430/devices/csv_using_option.c b/gcc/testsuite/gcc.target/msp430/devices/csv_using_option.c new file mode 100644 index 0000000..c8d7f6d --- /dev/null +++ b/gcc/testsuite/gcc.target/msp430/devices/csv_using_option.c @@ -0,0 +1,12 @@ +/* { dg-do link } */ +/* { dg-msp-options "-mmcu=msp430_28" } */ +/* { dg-warning "supports 430X ISA but -mcpu option is set to 430" "" { target 430_selected } 0 } */ +/* { dg-warning "supports f5series hardware multiply" "" { target msp430_hwmul_not_f5 } 0 } */ + +/* This tests that the -mdevices-csv-loc option can be used to specify the path + to devices.csv. + The option is passed in msp430.exp, rather than in the dg-msp-options + directive above, as the full path to devices.csv is not known at this + point. */ + +#include "../devices-main.c" diff --git a/gcc/testsuite/gcc.target/msp430/msp430.exp b/gcc/testsuite/gcc.target/msp430/msp430.exp index 2cdf436..fe57469 100644 --- a/gcc/testsuite/gcc.target/msp430/msp430.exp +++ b/gcc/testsuite/gcc.target/msp430/msp430.exp @@ -215,6 +215,29 @@ proc msp430_device_permutations_runtest { tests default_cflags } { if { ![runtest_file_p $runtests $test_file] } { continue } + # Don't run torture style tests on every method of locating devices.csv + # The device name passed to -mmcu in the csv_using_* tests do not exist + # in the hard-coded data, so to ensure the test fails if method can't + # find the device data. + if { [file tail $test_file] eq "csv_using_installed.c" } { + msp430_test_installed_device_data $test_file $default_cflags + continue + # The path passed to -mdevices-csv-loc is not used to infer an + # include dir to find msp430.h, so define TESTING_HARD_DATA to prevent + # msp430.h being included. + } elseif { [file tail $test_file] eq "csv_using_option.c" } { + dg-runtest $test_file \ + "-mdevices-csv-loc=[file dirname $test_file]/devices.csv" \ + "-DTESTING_HARD_DATA $default_cflags" + continue + } elseif { [file tail $test_file] eq "csv_using_env_var.c" } { + setenv MSP430_GCC_INCLUDE_DIR [file dirname $test_file] + verbose -log "MSP430_GCC_INCLUDE_DIR=[file dirname $test_file]" + dg-runtest $test_file "" "$default_cflags" + setenv MSP430_GCC_INCLUDE_DIR "" + verbose -log "MSP430_GCC_INCLUDE_DIR=\"\"" + continue + } foreach { mcu_flags } [msp430_get_supported_opts $test_file] { if { [string match "csv_*" [file tail $test_file]] } { dg-runtest $test_file "$mcu_flags" "-I[file dirname $test_file] $default_cflags" @@ -228,6 +251,48 @@ proc msp430_device_permutations_runtest { tests default_cflags } { } } +# Return $TOOLCHAIN_ROOT/msp430-elf/include/devices/ +proc get_installed_device_data_path { } { + set compiler [lindex [regexp -all -inline {\S+} \ + [board_info [target_info name] compiler]] 0] + # $compiler is actually a file, but normalize will still get us the desired + # result. + return [file normalize \ + "$compiler/../../msp430-elf/include/devices/devices.csv"] +} + +# If the devices.csv is installed in +# $TOOLCHAIN_ROOT/msp430-elf/include/devices/, rename it so it doesn't +# interfere with the hard-coded device data tests. +proc msp430_hide_installed_devices_data { } { + set devices_path [get_installed_device_data_path] + if { [file exists $devices_path] } { + file rename $devices_path "$devices_path.bak" + } +} + +# Restore devices.csv if renamed by msp430_hide_installed_devices_data. +proc msp430_restore_installed_devices_data { } { + set devices_path [get_installed_device_data_path] + if { [file exists "$devices_path.bak"] } { + file rename "$devices_path.bak" $devices_path + } +} + +proc msp430_test_installed_device_data { name default_cflags } { + global subdir + msp430_restore_installed_devices_data + set devices_path [get_installed_device_data_path] + if { [file exists $devices_path] } { + dg-runtest $name "" "$default_cflags" + } else { + set shorter_name "$subdir/[file tail $name]" + verbose -log "$shorter_name not supported, $devices_path doesn't exist." + unsupported $shorter_name + } + msp430_hide_installed_devices_data +} + # Load support procs. load_lib gcc-dg.exp @@ -245,18 +310,21 @@ if [info exists DEFAULT_CFLAGS] then { # Initialize `dg'. dg-init -msp430_set_old_board_info_ldflags +msp430_hide_installed_devices_data # Main loop. dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] \ "" "$MSP430_DEFAULT_CFLAGS" +msp430_set_old_board_info_ldflags + msp430_device_permutations_runtest \ [lsort [glob -nocomplain $srcdir/$subdir/devices/*.\[cCS\]]] \ "$MSP430_DEFAULT_CFLAGS" # Reset any possibly changed ldflags by dg-msp-options msp430_reset_board_info_ldflags +msp430_restore_installed_devices_data # All done. dg-finish -- 2.7.4