From 2a504ef4ca1242899536c855b3a1d1dac1c3c657 Mon Sep 17 00:00:00 2001 From: borutr Date: Sun, 29 Apr 2007 15:02:49 +0000 Subject: [PATCH] * Fixed svn:eol-style and svn:keywords properties git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4778 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- device/lib/pic/libdev/p16c620a.c | 0 support/cpp2/c-incpath.c | 808 ++++++++++++------------- support/regression/tests/bug-1406131.c | 0 support/regression/tests/bug-1654060.c | 52 +- support/regression/tests/bug1273984.c | 86 +-- support/regression/tests/bug1399290.c | 32 +- support/regression/tests/bug1496419.c | 42 +- support/regression/tests/bug1503067.c | 12 +- support/regression/tests/bug1520966.c | 46 +- support/regression/tests/bug1546986.c | 40 +- support/regression/tests/bug1551947.c | 30 +- support/regression/tests/bug608752.c | 90 +-- support/regression/tests/shifts2.c | 184 +++--- support/regression/tests/while.c | 60 +- 14 files changed, 741 insertions(+), 741 deletions(-) delete mode 100644 device/lib/pic/libdev/p16c620a.c mode change 100755 => 100644 support/regression/tests/bug-1406131.c diff --git a/device/lib/pic/libdev/p16c620a.c b/device/lib/pic/libdev/p16c620a.c deleted file mode 100644 index e69de29b..00000000 diff --git a/support/cpp2/c-incpath.c b/support/cpp2/c-incpath.c index 8ae9e554..014f8def 100644 --- a/support/cpp2/c-incpath.c +++ b/support/cpp2/c-incpath.c @@ -1,404 +1,404 @@ -/* Set up combined include path chain for the preprocessor. - Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. - - Broken out of cppinit.c and cppfiles.c and rewritten Mar 2003. - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) any -later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ - -#include "config.h" -#include "system.h" -#include "cpplib.h" -#include "prefix.h" -#include "intl.h" -#include "c-incpath.h" -#include "cppdefault.h" - -/* Windows does not natively support inodes, and neither does MSDOS. - Cygwin's emulation can generate non-unique inodes, so don't use it. - VMS has non-numeric inodes. */ -#ifdef VMS -# define INO_T_EQ(A, B) (!memcmp (&(A), &(B), sizeof (A))) -# define INO_T_COPY(DEST, SRC) memcpy(&(DEST), &(SRC), sizeof (SRC)) -#else -# if (defined _WIN32 && !defined (_UWIN)) || defined __MSDOS__ -# define INO_T_EQ(A, B) 0 -# else -# define INO_T_EQ(A, B) ((A) == (B)) -# endif -# define INO_T_COPY(DEST, SRC) (DEST) = (SRC) -#endif - -static void add_env_var_paths (const char *, int); -static void add_standard_paths (const char *, const char *, int); -static void free_path (struct cpp_dir *, int); -static void merge_include_chains (cpp_reader *, int); -static struct cpp_dir *remove_duplicates (cpp_reader *, struct cpp_dir *, - struct cpp_dir *, - struct cpp_dir *, int); - -/* Include chains heads and tails. */ -static struct cpp_dir *heads[4]; -static struct cpp_dir *tails[4]; -static bool quote_ignores_source_dir; -enum { REASON_QUIET = 0, REASON_NOENT, REASON_DUP, REASON_DUP_SYS }; - -/* Free an element of the include chain, possibly giving a reason. */ -static void -free_path (struct cpp_dir *path, int reason) -{ - switch (reason) - { - case REASON_DUP: - case REASON_DUP_SYS: - fprintf (stderr, _("ignoring duplicate directory \"%s\"\n"), path->name); - if (reason == REASON_DUP_SYS) - fprintf (stderr, - _(" as it is a non-system directory that duplicates a system directory\n")); - break; - - case REASON_NOENT: - fprintf (stderr, _("ignoring nonexistent directory \"%s\"\n"), - path->name); - break; - - case REASON_QUIET: - default: - break; - } - - free (path->name); - free (path); -} - -/* Read ENV_VAR for a PATH_SEPARATOR-separated list of file names; and - append all the names to the search path CHAIN. */ -static void -add_env_var_paths (const char *env_var, int chain) -{ - char *p, *q, *path; - - GET_ENVIRONMENT (q, env_var); - - if (!q) - return; - - for (p = q; *q; p = q + 1) - { - q = p; - while (*q != 0 && *q != PATH_SEPARATOR) - q++; - - if (p == q) - path = xstrdup ("."); - else - { - path = xmalloc (q - p + 1); - memcpy (path, p, q - p); - path[q - p] = '\0'; - } - - add_path (path, chain, chain == SYSTEM, false); - } -} - -/* Append the standard include chain defined in cppdefault.c. */ -static void -add_standard_paths (const char *sysroot, const char *iprefix, int cxx_stdinc) -{ - const struct default_include *p; - size_t len; - - if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0) - { - /* Look for directories that start with the standard prefix. - "Translate" them, i.e. replace /usr/local/lib/gcc... with - IPREFIX and search them first. */ - for (p = cpp_include_defaults; p->fname; p++) - { - if (!p->cplusplus || cxx_stdinc) - { - /* Should we be translating sysrooted dirs too? Assume - that iprefix and sysroot are mutually exclusive, for - now. */ - if (sysroot && p->add_sysroot) - continue; - if (!strncmp (p->fname, cpp_GCC_INCLUDE_DIR, len)) - { - char *str = concat (iprefix, p->fname + len, NULL); - add_path (str, SYSTEM, p->cxx_aware, false); - } - } - } - } - - for (p = cpp_include_defaults; p->fname; p++) - { - if (!p->cplusplus || cxx_stdinc) - { - char *str; - - /* Should this directory start with the sysroot? */ - if (sysroot && p->add_sysroot) - str = concat (sysroot, p->fname, NULL); - else - str = update_path (p->fname, p->component); - - add_path (str, SYSTEM, p->cxx_aware, false); - } - } -} - -/* For each duplicate path in chain HEAD, keep just the first one. - Remove each path in chain HEAD that also exists in chain SYSTEM. - Set the NEXT pointer of the last path in the resulting chain to - JOIN, unless it duplicates JOIN in which case the last path is - removed. Return the head of the resulting chain. Any of HEAD, - JOIN and SYSTEM can be NULL. */ - -static struct cpp_dir * -remove_duplicates (cpp_reader *pfile, struct cpp_dir *head, - struct cpp_dir *system, struct cpp_dir *join, - int verbose) -{ - struct cpp_dir **pcur, *tmp, *cur; - struct stat st; - - for (pcur = &head; *pcur; ) - { - int reason = REASON_QUIET; - - cur = *pcur; - - if (stat (cur->name, &st)) - { - /* Dirs that don't exist are silently ignored, unless verbose. */ - if (errno != ENOENT) - cpp_errno (pfile, CPP_DL_ERROR, cur->name); - else - { - /* If -Wmissing-include-dirs is given, warn. */ - cpp_options *opts = cpp_get_options (pfile); - if (opts->warn_missing_include_dirs && cur->user_supplied_p) - cpp_errno (pfile, CPP_DL_WARNING, cur->name); - reason = REASON_NOENT; - } - } - else if (!S_ISDIR (st.st_mode)) - cpp_error_with_line (pfile, CPP_DL_ERROR, 0, 0, - "%s: not a directory", cur->name); - else - { - INO_T_COPY (cur->ino, st.st_ino); - cur->dev = st.st_dev; - - /* Remove this one if it is in the system chain. */ - reason = REASON_DUP_SYS; - for (tmp = system; tmp; tmp = tmp->next) - if (INO_T_EQ (tmp->ino, cur->ino) && tmp->dev == cur->dev - && cur->construct == tmp->construct) - break; - - if (!tmp) - { - /* Duplicate of something earlier in the same chain? */ - reason = REASON_DUP; - for (tmp = head; tmp != cur; tmp = tmp->next) - if (INO_T_EQ (cur->ino, tmp->ino) && cur->dev == tmp->dev - && cur->construct == tmp->construct) - break; - - if (tmp == cur - /* Last in the chain and duplicate of JOIN? */ - && !(cur->next == NULL && join - && INO_T_EQ (cur->ino, join->ino) - && cur->dev == join->dev - && cur->construct == join->construct)) - { - /* Unique, so keep this directory. */ - pcur = &cur->next; - continue; - } - } - } - - /* Remove this entry from the chain. */ - *pcur = cur->next; - free_path (cur, verbose ? reason: REASON_QUIET); - } - - *pcur = join; - return head; -} - -/* Merge the four include chains together in the order quote, bracket, - system, after. Remove duplicate dirs (as determined by - INO_T_EQ()). - - We can't just merge the lists and then uniquify them because then - we may lose directories from the <> search path that should be - there; consider -iquote foo -iquote bar -Ifoo -Iquux. It is - however safe to treat -iquote bar -iquote foo -Ifoo -Iquux as if - written -iquote bar -Ifoo -Iquux. */ - -static void -merge_include_chains (cpp_reader *pfile, int verbose) -{ - /* Join the SYSTEM and AFTER chains. Remove duplicates in the - resulting SYSTEM chain. */ - if (heads[SYSTEM]) - tails[SYSTEM]->next = heads[AFTER]; - else - heads[SYSTEM] = heads[AFTER]; - heads[SYSTEM] = remove_duplicates (pfile, heads[SYSTEM], 0, 0, verbose); - - /* Remove duplicates from BRACKET that are in itself or SYSTEM, and - join it to SYSTEM. */ - heads[BRACKET] = remove_duplicates (pfile, heads[BRACKET], heads[SYSTEM], - heads[SYSTEM], verbose); - - /* Remove duplicates from QUOTE that are in itself or SYSTEM, and - join it to BRACKET. */ - heads[QUOTE] = remove_duplicates (pfile, heads[QUOTE], heads[SYSTEM], - heads[BRACKET], verbose); - - /* If verbose, print the list of dirs to search. */ - if (verbose) - { - struct cpp_dir *p; - - fprintf (stderr, _("#include \"...\" search starts here:\n")); - for (p = heads[QUOTE];; p = p->next) - { - if (p == heads[BRACKET]) - fprintf (stderr, _("#include <...> search starts here:\n")); - if (!p) - break; - fprintf (stderr, " %s\n", p->name); - } - fprintf (stderr, _("End of search list.\n")); - } -} - -/* Use given -I paths for #include "..." but not #include <...>, and - don't search the directory of the present file for #include "...". - (Note that -I. -I- is not the same as the default setup; -I. uses - the compiler's working dir.) */ -void -split_quote_chain (void) -{ - heads[QUOTE] = heads[BRACKET]; - tails[QUOTE] = tails[BRACKET]; - heads[BRACKET] = NULL; - tails[BRACKET] = NULL; - /* This is NOT redundant. */ - quote_ignores_source_dir = true; -} - -/* Add P to the chain specified by CHAIN. */ - -void -add_cpp_dir_path (cpp_dir *p, int chain) -{ - if (tails[chain]) - tails[chain]->next = p; - else - heads[chain] = p; - tails[chain] = p; -} - -/* Add PATH to the include chain CHAIN. PATH must be malloc-ed and - NUL-terminated. */ -void -add_path (char *path, int chain, int cxx_aware, bool user_supplied_p) -{ - cpp_dir *p; - -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - /* Convert all backslashes to slashes. The native CRT stat() - function does not recognize a directory that ends in a backslash - (unless it is a drive root dir, such "c:\"). Forward slashes, - trailing or otherwise, cause no problems for stat(). */ - char* c; - for (c = path; *c; c++) - if (*c == '\\') *c = '/'; -#endif - - p = xmalloc (sizeof (cpp_dir)); - p->next = NULL; - p->name = path; - if (chain == SYSTEM || chain == AFTER) - p->sysp = 1 + !cxx_aware; - else - p->sysp = 0; - p->construct = 0; - p->user_supplied_p = user_supplied_p; - - add_cpp_dir_path (p, chain); -} - -/* Exported function to handle include chain merging, duplicate - removal, and registration with cpplib. */ -void -register_include_chains (cpp_reader *pfile, const char *sysroot, - const char *iprefix, int stdinc, int cxx_stdinc, - int verbose) -{ - static const char *const lang_env_vars[] = - { "C_INCLUDE_PATH", "CPLUS_INCLUDE_PATH", - "OBJC_INCLUDE_PATH", "OBJCPLUS_INCLUDE_PATH" }; - cpp_options *cpp_opts = cpp_get_options (pfile); - size_t idx = (cpp_opts->objc ? 2: 0); - - if (cpp_opts->cplusplus) - idx++; - else - cxx_stdinc = false; - - /* CPATH and language-dependent environment variables may add to the - include chain. */ - add_env_var_paths ("CPATH", BRACKET); - add_env_var_paths (lang_env_vars[idx], SYSTEM); - - target_c_incpath.extra_pre_includes (sysroot, iprefix, stdinc); - - /* Finally chain on the standard directories. */ - if (stdinc) - add_standard_paths (sysroot, iprefix, cxx_stdinc); - - target_c_incpath.extra_includes (sysroot, iprefix, stdinc); - - merge_include_chains (pfile, verbose); - - cpp_set_include_chains (pfile, heads[QUOTE], heads[BRACKET], - quote_ignores_source_dir); -} -#if !(defined TARGET_EXTRA_INCLUDES) || !(defined TARGET_EXTRA_PRE_INCLUDES) -static void hook_void_charptr_charptr_int (const char *sysroot ATTRIBUTE_UNUSED, - const char *iprefix ATTRIBUTE_UNUSED, - int stdinc ATTRIBUTE_UNUSED) -{ -} -#endif - -#ifndef TARGET_EXTRA_INCLUDES -#define TARGET_EXTRA_INCLUDES hook_void_charptr_charptr_int -#endif -#ifndef TARGET_EXTRA_PRE_INCLUDES -#define TARGET_EXTRA_PRE_INCLUDES hook_void_charptr_charptr_int -#endif - -struct target_c_incpath_s target_c_incpath = { TARGET_EXTRA_PRE_INCLUDES, TARGET_EXTRA_INCLUDES }; - +/* Set up combined include path chain for the preprocessor. + Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + + Broken out of cppinit.c and cppfiles.c and rewritten Mar 2003. + +This program is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) any +later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include "config.h" +#include "system.h" +#include "cpplib.h" +#include "prefix.h" +#include "intl.h" +#include "c-incpath.h" +#include "cppdefault.h" + +/* Windows does not natively support inodes, and neither does MSDOS. + Cygwin's emulation can generate non-unique inodes, so don't use it. + VMS has non-numeric inodes. */ +#ifdef VMS +# define INO_T_EQ(A, B) (!memcmp (&(A), &(B), sizeof (A))) +# define INO_T_COPY(DEST, SRC) memcpy(&(DEST), &(SRC), sizeof (SRC)) +#else +# if (defined _WIN32 && !defined (_UWIN)) || defined __MSDOS__ +# define INO_T_EQ(A, B) 0 +# else +# define INO_T_EQ(A, B) ((A) == (B)) +# endif +# define INO_T_COPY(DEST, SRC) (DEST) = (SRC) +#endif + +static void add_env_var_paths (const char *, int); +static void add_standard_paths (const char *, const char *, int); +static void free_path (struct cpp_dir *, int); +static void merge_include_chains (cpp_reader *, int); +static struct cpp_dir *remove_duplicates (cpp_reader *, struct cpp_dir *, + struct cpp_dir *, + struct cpp_dir *, int); + +/* Include chains heads and tails. */ +static struct cpp_dir *heads[4]; +static struct cpp_dir *tails[4]; +static bool quote_ignores_source_dir; +enum { REASON_QUIET = 0, REASON_NOENT, REASON_DUP, REASON_DUP_SYS }; + +/* Free an element of the include chain, possibly giving a reason. */ +static void +free_path (struct cpp_dir *path, int reason) +{ + switch (reason) + { + case REASON_DUP: + case REASON_DUP_SYS: + fprintf (stderr, _("ignoring duplicate directory \"%s\"\n"), path->name); + if (reason == REASON_DUP_SYS) + fprintf (stderr, + _(" as it is a non-system directory that duplicates a system directory\n")); + break; + + case REASON_NOENT: + fprintf (stderr, _("ignoring nonexistent directory \"%s\"\n"), + path->name); + break; + + case REASON_QUIET: + default: + break; + } + + free (path->name); + free (path); +} + +/* Read ENV_VAR for a PATH_SEPARATOR-separated list of file names; and + append all the names to the search path CHAIN. */ +static void +add_env_var_paths (const char *env_var, int chain) +{ + char *p, *q, *path; + + GET_ENVIRONMENT (q, env_var); + + if (!q) + return; + + for (p = q; *q; p = q + 1) + { + q = p; + while (*q != 0 && *q != PATH_SEPARATOR) + q++; + + if (p == q) + path = xstrdup ("."); + else + { + path = xmalloc (q - p + 1); + memcpy (path, p, q - p); + path[q - p] = '\0'; + } + + add_path (path, chain, chain == SYSTEM, false); + } +} + +/* Append the standard include chain defined in cppdefault.c. */ +static void +add_standard_paths (const char *sysroot, const char *iprefix, int cxx_stdinc) +{ + const struct default_include *p; + size_t len; + + if (iprefix && (len = cpp_GCC_INCLUDE_DIR_len) != 0) + { + /* Look for directories that start with the standard prefix. + "Translate" them, i.e. replace /usr/local/lib/gcc... with + IPREFIX and search them first. */ + for (p = cpp_include_defaults; p->fname; p++) + { + if (!p->cplusplus || cxx_stdinc) + { + /* Should we be translating sysrooted dirs too? Assume + that iprefix and sysroot are mutually exclusive, for + now. */ + if (sysroot && p->add_sysroot) + continue; + if (!strncmp (p->fname, cpp_GCC_INCLUDE_DIR, len)) + { + char *str = concat (iprefix, p->fname + len, NULL); + add_path (str, SYSTEM, p->cxx_aware, false); + } + } + } + } + + for (p = cpp_include_defaults; p->fname; p++) + { + if (!p->cplusplus || cxx_stdinc) + { + char *str; + + /* Should this directory start with the sysroot? */ + if (sysroot && p->add_sysroot) + str = concat (sysroot, p->fname, NULL); + else + str = update_path (p->fname, p->component); + + add_path (str, SYSTEM, p->cxx_aware, false); + } + } +} + +/* For each duplicate path in chain HEAD, keep just the first one. + Remove each path in chain HEAD that also exists in chain SYSTEM. + Set the NEXT pointer of the last path in the resulting chain to + JOIN, unless it duplicates JOIN in which case the last path is + removed. Return the head of the resulting chain. Any of HEAD, + JOIN and SYSTEM can be NULL. */ + +static struct cpp_dir * +remove_duplicates (cpp_reader *pfile, struct cpp_dir *head, + struct cpp_dir *system, struct cpp_dir *join, + int verbose) +{ + struct cpp_dir **pcur, *tmp, *cur; + struct stat st; + + for (pcur = &head; *pcur; ) + { + int reason = REASON_QUIET; + + cur = *pcur; + + if (stat (cur->name, &st)) + { + /* Dirs that don't exist are silently ignored, unless verbose. */ + if (errno != ENOENT) + cpp_errno (pfile, CPP_DL_ERROR, cur->name); + else + { + /* If -Wmissing-include-dirs is given, warn. */ + cpp_options *opts = cpp_get_options (pfile); + if (opts->warn_missing_include_dirs && cur->user_supplied_p) + cpp_errno (pfile, CPP_DL_WARNING, cur->name); + reason = REASON_NOENT; + } + } + else if (!S_ISDIR (st.st_mode)) + cpp_error_with_line (pfile, CPP_DL_ERROR, 0, 0, + "%s: not a directory", cur->name); + else + { + INO_T_COPY (cur->ino, st.st_ino); + cur->dev = st.st_dev; + + /* Remove this one if it is in the system chain. */ + reason = REASON_DUP_SYS; + for (tmp = system; tmp; tmp = tmp->next) + if (INO_T_EQ (tmp->ino, cur->ino) && tmp->dev == cur->dev + && cur->construct == tmp->construct) + break; + + if (!tmp) + { + /* Duplicate of something earlier in the same chain? */ + reason = REASON_DUP; + for (tmp = head; tmp != cur; tmp = tmp->next) + if (INO_T_EQ (cur->ino, tmp->ino) && cur->dev == tmp->dev + && cur->construct == tmp->construct) + break; + + if (tmp == cur + /* Last in the chain and duplicate of JOIN? */ + && !(cur->next == NULL && join + && INO_T_EQ (cur->ino, join->ino) + && cur->dev == join->dev + && cur->construct == join->construct)) + { + /* Unique, so keep this directory. */ + pcur = &cur->next; + continue; + } + } + } + + /* Remove this entry from the chain. */ + *pcur = cur->next; + free_path (cur, verbose ? reason: REASON_QUIET); + } + + *pcur = join; + return head; +} + +/* Merge the four include chains together in the order quote, bracket, + system, after. Remove duplicate dirs (as determined by + INO_T_EQ()). + + We can't just merge the lists and then uniquify them because then + we may lose directories from the <> search path that should be + there; consider -iquote foo -iquote bar -Ifoo -Iquux. It is + however safe to treat -iquote bar -iquote foo -Ifoo -Iquux as if + written -iquote bar -Ifoo -Iquux. */ + +static void +merge_include_chains (cpp_reader *pfile, int verbose) +{ + /* Join the SYSTEM and AFTER chains. Remove duplicates in the + resulting SYSTEM chain. */ + if (heads[SYSTEM]) + tails[SYSTEM]->next = heads[AFTER]; + else + heads[SYSTEM] = heads[AFTER]; + heads[SYSTEM] = remove_duplicates (pfile, heads[SYSTEM], 0, 0, verbose); + + /* Remove duplicates from BRACKET that are in itself or SYSTEM, and + join it to SYSTEM. */ + heads[BRACKET] = remove_duplicates (pfile, heads[BRACKET], heads[SYSTEM], + heads[SYSTEM], verbose); + + /* Remove duplicates from QUOTE that are in itself or SYSTEM, and + join it to BRACKET. */ + heads[QUOTE] = remove_duplicates (pfile, heads[QUOTE], heads[SYSTEM], + heads[BRACKET], verbose); + + /* If verbose, print the list of dirs to search. */ + if (verbose) + { + struct cpp_dir *p; + + fprintf (stderr, _("#include \"...\" search starts here:\n")); + for (p = heads[QUOTE];; p = p->next) + { + if (p == heads[BRACKET]) + fprintf (stderr, _("#include <...> search starts here:\n")); + if (!p) + break; + fprintf (stderr, " %s\n", p->name); + } + fprintf (stderr, _("End of search list.\n")); + } +} + +/* Use given -I paths for #include "..." but not #include <...>, and + don't search the directory of the present file for #include "...". + (Note that -I. -I- is not the same as the default setup; -I. uses + the compiler's working dir.) */ +void +split_quote_chain (void) +{ + heads[QUOTE] = heads[BRACKET]; + tails[QUOTE] = tails[BRACKET]; + heads[BRACKET] = NULL; + tails[BRACKET] = NULL; + /* This is NOT redundant. */ + quote_ignores_source_dir = true; +} + +/* Add P to the chain specified by CHAIN. */ + +void +add_cpp_dir_path (cpp_dir *p, int chain) +{ + if (tails[chain]) + tails[chain]->next = p; + else + heads[chain] = p; + tails[chain] = p; +} + +/* Add PATH to the include chain CHAIN. PATH must be malloc-ed and + NUL-terminated. */ +void +add_path (char *path, int chain, int cxx_aware, bool user_supplied_p) +{ + cpp_dir *p; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Convert all backslashes to slashes. The native CRT stat() + function does not recognize a directory that ends in a backslash + (unless it is a drive root dir, such "c:\"). Forward slashes, + trailing or otherwise, cause no problems for stat(). */ + char* c; + for (c = path; *c; c++) + if (*c == '\\') *c = '/'; +#endif + + p = xmalloc (sizeof (cpp_dir)); + p->next = NULL; + p->name = path; + if (chain == SYSTEM || chain == AFTER) + p->sysp = 1 + !cxx_aware; + else + p->sysp = 0; + p->construct = 0; + p->user_supplied_p = user_supplied_p; + + add_cpp_dir_path (p, chain); +} + +/* Exported function to handle include chain merging, duplicate + removal, and registration with cpplib. */ +void +register_include_chains (cpp_reader *pfile, const char *sysroot, + const char *iprefix, int stdinc, int cxx_stdinc, + int verbose) +{ + static const char *const lang_env_vars[] = + { "C_INCLUDE_PATH", "CPLUS_INCLUDE_PATH", + "OBJC_INCLUDE_PATH", "OBJCPLUS_INCLUDE_PATH" }; + cpp_options *cpp_opts = cpp_get_options (pfile); + size_t idx = (cpp_opts->objc ? 2: 0); + + if (cpp_opts->cplusplus) + idx++; + else + cxx_stdinc = false; + + /* CPATH and language-dependent environment variables may add to the + include chain. */ + add_env_var_paths ("CPATH", BRACKET); + add_env_var_paths (lang_env_vars[idx], SYSTEM); + + target_c_incpath.extra_pre_includes (sysroot, iprefix, stdinc); + + /* Finally chain on the standard directories. */ + if (stdinc) + add_standard_paths (sysroot, iprefix, cxx_stdinc); + + target_c_incpath.extra_includes (sysroot, iprefix, stdinc); + + merge_include_chains (pfile, verbose); + + cpp_set_include_chains (pfile, heads[QUOTE], heads[BRACKET], + quote_ignores_source_dir); +} +#if !(defined TARGET_EXTRA_INCLUDES) || !(defined TARGET_EXTRA_PRE_INCLUDES) +static void hook_void_charptr_charptr_int (const char *sysroot ATTRIBUTE_UNUSED, + const char *iprefix ATTRIBUTE_UNUSED, + int stdinc ATTRIBUTE_UNUSED) +{ +} +#endif + +#ifndef TARGET_EXTRA_INCLUDES +#define TARGET_EXTRA_INCLUDES hook_void_charptr_charptr_int +#endif +#ifndef TARGET_EXTRA_PRE_INCLUDES +#define TARGET_EXTRA_PRE_INCLUDES hook_void_charptr_charptr_int +#endif + +struct target_c_incpath_s target_c_incpath = { TARGET_EXTRA_PRE_INCLUDES, TARGET_EXTRA_INCLUDES }; + diff --git a/support/regression/tests/bug-1406131.c b/support/regression/tests/bug-1406131.c old mode 100755 new mode 100644 diff --git a/support/regression/tests/bug-1654060.c b/support/regression/tests/bug-1654060.c index aba52463..bc1bb09f 100644 --- a/support/regression/tests/bug-1654060.c +++ b/support/regression/tests/bug-1654060.c @@ -1,26 +1,26 @@ -/* - bug-1654060.c - - typedef within function causes syntax error -*/ - -#include -typedef char mytype1; -typedef int mytype2; - -mytype1 c1 = 'A'; -mytype2 i1 = 12345; - -void testTypedef(void) -{ - typedef int mytype1; - typedef char mytype2; - - mytype1 i2 = 21435; - mytype2 c2 = 'B'; - - ASSERT(c1 == 'A'); - ASSERT(i1 == 12345); - ASSERT(c1 == 'B'); - ASSERT(i1 == 21435); -} +/* + bug-1654060.c + + typedef within function causes syntax error +*/ + +#include +typedef char mytype1; +typedef int mytype2; + +mytype1 c1 = 'A'; +mytype2 i1 = 12345; + +void testTypedef(void) +{ + typedef int mytype1; + typedef char mytype2; + + mytype1 i2 = 21435; + mytype2 c2 = 'B'; + + ASSERT(c1 == 'A'); + ASSERT(i1 == 12345); + ASSERT(c1 == 'B'); + ASSERT(i1 == 21435); +} diff --git a/support/regression/tests/bug1273984.c b/support/regression/tests/bug1273984.c index 1006a307..d371d613 100644 --- a/support/regression/tests/bug1273984.c +++ b/support/regression/tests/bug1273984.c @@ -1,43 +1,43 @@ -/* An assignment inside a functioncall changed the type of the parameter. - See bug description 1273984 for details. - - Bug detected and fixed by Guenther Jehle - - sign: unsigned, - */ - -#include - -void foo({sign} int val) { - val; //make the compiler happy -} - -void fooInt({sign} int val) { - ASSERT(val==3); -} - -void fooChar({sign} char val) { - ASSERT(val==6); -} - -void -testAssignInFunctioncall(void) -{ - volatile {sign} char charVal=3; - volatile {sign} int intVal=0x4040; - - fooInt(intVal=charVal); // should cast charVal to int for function call. - // without patch #1645121, a char is put on the stack - // (or hold in registers) - foo(0xAAAA); - fooInt(intVal=charVal); - - intVal=6; - - fooChar(charVal=intVal); // without patch, a int is put on the stack - foo(0xAAAA); - fooChar(charVal=intVal); - -} - - +/* An assignment inside a functioncall changed the type of the parameter. + See bug description 1273984 for details. + + Bug detected and fixed by Guenther Jehle + + sign: unsigned, + */ + +#include + +void foo({sign} int val) { + val; //make the compiler happy +} + +void fooInt({sign} int val) { + ASSERT(val==3); +} + +void fooChar({sign} char val) { + ASSERT(val==6); +} + +void +testAssignInFunctioncall(void) +{ + volatile {sign} char charVal=3; + volatile {sign} int intVal=0x4040; + + fooInt(intVal=charVal); // should cast charVal to int for function call. + // without patch #1645121, a char is put on the stack + // (or hold in registers) + foo(0xAAAA); + fooInt(intVal=charVal); + + intVal=6; + + fooChar(charVal=intVal); // without patch, a int is put on the stack + foo(0xAAAA); + fooChar(charVal=intVal); + +} + + diff --git a/support/regression/tests/bug1399290.c b/support/regression/tests/bug1399290.c index 7024a271..d8847781 100644 --- a/support/regression/tests/bug1399290.c +++ b/support/regression/tests/bug1399290.c @@ -1,16 +1,16 @@ -/* bug1399290.c - */ -#include - -unsigned long Left = 0x12345678; - -void -testLongPlus(void) -{ - static unsigned long Result; - static unsigned long Rhs = 0x87654321; - static unsigned long *Lhs = &Left; - - Result = *Lhs + Rhs; - ASSERT (Result == 0x99999999); -} +/* bug1399290.c + */ +#include + +unsigned long Left = 0x12345678; + +void +testLongPlus(void) +{ + static unsigned long Result; + static unsigned long Rhs = 0x87654321; + static unsigned long *Lhs = &Left; + + Result = *Lhs + Rhs; + ASSERT (Result == 0x99999999); +} diff --git a/support/regression/tests/bug1496419.c b/support/regression/tests/bug1496419.c index 19268606..39c73834 100644 --- a/support/regression/tests/bug1496419.c +++ b/support/regression/tests/bug1496419.c @@ -1,21 +1,21 @@ -/* - bug1057979.c -*/ - -#include - -typedef struct _NODE -{ - const struct _NODE * enter; - const struct _NODE * down; -}NODE; - -const NODE node1 = {NULL, NULL}; - -//sdcc loops allocating space for new symbols node1 and -//zzz until there is no more memory, then segfaults -// -//The reference to zzz inside the declaration of zzz -//triggers a loop allocating space for symbols node1 -//and zzz -const NODE zzz = {&node1, &zzz}; +/* + bug1057979.c +*/ + +#include + +typedef struct _NODE +{ + const struct _NODE * enter; + const struct _NODE * down; +}NODE; + +const NODE node1 = {NULL, NULL}; + +//sdcc loops allocating space for new symbols node1 and +//zzz until there is no more memory, then segfaults +// +//The reference to zzz inside the declaration of zzz +//triggers a loop allocating space for symbols node1 +//and zzz +const NODE zzz = {&node1, &zzz}; diff --git a/support/regression/tests/bug1503067.c b/support/regression/tests/bug1503067.c index fc9cb1d9..cf578437 100644 --- a/support/regression/tests/bug1503067.c +++ b/support/regression/tests/bug1503067.c @@ -1,6 +1,6 @@ -/* bug1503067.c - */ -#include - -const int SPRITE = 0; -int sprite = 1; +/* bug1503067.c + */ +#include + +const int SPRITE = 0; +int sprite = 1; diff --git a/support/regression/tests/bug1520966.c b/support/regression/tests/bug1520966.c index ad125b92..0ccf322e 100644 --- a/support/regression/tests/bug1520966.c +++ b/support/regression/tests/bug1520966.c @@ -1,23 +1,23 @@ -/* bug1520966 "Floating-point bug with small numbers" - */ - -#include -#include - -void -testFloatOp(void) -{ - volatile float a,b; - float result; - - a = 2.04e-38; - b = 0.01; - result = a * b; - ASSERT( result < a ); - ASSERT( result >= 0.0 ); - - b = 100; - result = a / b; - ASSERT( result < a ); - ASSERT( result >= 0.0 ); -} +/* bug1520966 "Floating-point bug with small numbers" + */ + +#include +#include + +void +testFloatOp(void) +{ + volatile float a,b; + float result; + + a = 2.04e-38; + b = 0.01; + result = a * b; + ASSERT( result < a ); + ASSERT( result >= 0.0 ); + + b = 100; + result = a / b; + ASSERT( result < a ); + ASSERT( result >= 0.0 ); +} diff --git a/support/regression/tests/bug1546986.c b/support/regression/tests/bug1546986.c index dcd7a695..b22b67f8 100644 --- a/support/regression/tests/bug1546986.c +++ b/support/regression/tests/bug1546986.c @@ -1,20 +1,20 @@ -/* - bug1546986.c -*/ - -#include -#include - -static unsigned char pdata tst1 = 0x01; -static unsigned char pdata tst2 = 0x00; - -static bool test; - -void -testBug(void) -{ - test = (tst1 | tst2); - ASSERT( test ); - test = (tst2 | tst1); - ASSERT( test ); -} +/* + bug1546986.c +*/ + +#include +#include + +static unsigned char pdata tst1 = 0x01; +static unsigned char pdata tst2 = 0x00; + +static bool test; + +void +testBug(void) +{ + test = (tst1 | tst2); + ASSERT( test ); + test = (tst2 | tst1); + ASSERT( test ); +} diff --git a/support/regression/tests/bug1551947.c b/support/regression/tests/bug1551947.c index f3980cd4..95810627 100644 --- a/support/regression/tests/bug1551947.c +++ b/support/regression/tests/bug1551947.c @@ -1,15 +1,15 @@ -/* - bug1551947.c -*/ - -#include - -xdata float z; -xdata float x = 1.0; - -void -testBug(void) -{ - z = x * x; - ASSERT( z == 1.0 ); -} +/* + bug1551947.c +*/ + +#include + +xdata float z; +xdata float x = 1.0; + +void +testBug(void) +{ + z = x * x; + ASSERT( z == 1.0 ); +} diff --git a/support/regression/tests/bug608752.c b/support/regression/tests/bug608752.c index c3c541d5..820670a8 100644 --- a/support/regression/tests/bug608752.c +++ b/support/regression/tests/bug608752.c @@ -1,45 +1,45 @@ -/* OpAssign tests - */ -#include - -#ifdef SDCC -#include -#else -#define _STATMEM -#endif - -typedef struct -{ - char a; - char n; -} item_type; - -item_type t; - - -_STATMEM item_type* get_next_item(void) -{ - /* have a side effect */ - t.n++; - - /* keep things easy, not implementing a list. - Using a true list would break things - even more pointedly: - a) reading beyond end of the list and - b) intermixing list members */ - return &t; -} - - -void -testOpAssign(void) -{ - t.a = 0; - t.n = 0; - - /* get_next_item() should be called only once */ - get_next_item()->a |= 42; - - ASSERT (t.a == 42); - ASSERT (t.n == 1); -} +/* OpAssign tests + */ +#include + +#ifdef SDCC +#include +#else +#define _STATMEM +#endif + +typedef struct +{ + char a; + char n; +} item_type; + +item_type t; + + +_STATMEM item_type* get_next_item(void) +{ + /* have a side effect */ + t.n++; + + /* keep things easy, not implementing a list. + Using a true list would break things + even more pointedly: + a) reading beyond end of the list and + b) intermixing list members */ + return &t; +} + + +void +testOpAssign(void) +{ + t.a = 0; + t.n = 0; + + /* get_next_item() should be called only once */ + get_next_item()->a |= 42; + + ASSERT (t.a == 42); + ASSERT (t.n == 1); +} diff --git a/support/regression/tests/shifts2.c b/support/regression/tests/shifts2.c index 3708e575..8213de26 100644 --- a/support/regression/tests/shifts2.c +++ b/support/regression/tests/shifts2.c @@ -1,92 +1,92 @@ -/** extended tests for shift operations, added by - Frieder Ferlemann to check for bugs related to bug 1533966 - - size: 8,16,32 - right: 0,1 - vol: 0,1 - sign: u, -*/ -#include -#ifdef __sun__ -# include -#else -# include -#endif - -#define SIZE ({size}) -#define RIGHT ({right}) -#define VOL ({vol}) - -#if SIZE == 8 -# define TYPE {sign}int8_t -# define TEST_VECT 0xa4 -#endif - -#if SIZE == 16 -# define TYPE {sign}int16_t -# define TEST_VECT 0xa8ce -#endif - -#if SIZE == 32 -# define TYPE {sign}int32_t -# define TEST_VECT 0xa8b5c4d6 -#endif - -#if RIGHT == 0 -# define SHIFT(x,y) (TYPE)((TYPE)(x)<<(y)) -#else -# define SHIFT(x,y) (TYPE)((TYPE)(x)>>(y)) -#endif - -#if VOL == 0 - volatile TYPE s = TEST_VECT; - TYPE t; - #define TESTSHIFT(x) t=s; t = SHIFT (t,(x)); ASSERT( t == SHIFT (TEST_VECT, (x))); -#else - volatile TYPE t = TEST_VECT; - #define TESTSHIFT(x) t=TEST_VECT; t = SHIFT (t,(x)); ASSERT( t == SHIFT (TEST_VECT, (x))); -#endif - -static void -testShift(void) -{ - TESTSHIFT(0); - TESTSHIFT(1); - TESTSHIFT(2); - TESTSHIFT(3); - TESTSHIFT(4); - TESTSHIFT(5); - TESTSHIFT(6); - TESTSHIFT(7); - -#if SIZE >= 16 - TESTSHIFT(8); - TESTSHIFT(9); - TESTSHIFT(10); - TESTSHIFT(11); - TESTSHIFT(12); - TESTSHIFT(13); - TESTSHIFT(14); - TESTSHIFT(15); -#endif - -#if SIZE >= 32 - TESTSHIFT(16); - TESTSHIFT(17); - TESTSHIFT(18); - TESTSHIFT(19); - TESTSHIFT(20); - TESTSHIFT(21); - TESTSHIFT(22); - TESTSHIFT(23); - - TESTSHIFT(24); - TESTSHIFT(25); - TESTSHIFT(26); - TESTSHIFT(27); - TESTSHIFT(28); - TESTSHIFT(29); - TESTSHIFT(30); - TESTSHIFT(31); -#endif -} +/** extended tests for shift operations, added by + Frieder Ferlemann to check for bugs related to bug 1533966 + + size: 8,16,32 + right: 0,1 + vol: 0,1 + sign: u, +*/ +#include +#ifdef __sun__ +# include +#else +# include +#endif + +#define SIZE ({size}) +#define RIGHT ({right}) +#define VOL ({vol}) + +#if SIZE == 8 +# define TYPE {sign}int8_t +# define TEST_VECT 0xa4 +#endif + +#if SIZE == 16 +# define TYPE {sign}int16_t +# define TEST_VECT 0xa8ce +#endif + +#if SIZE == 32 +# define TYPE {sign}int32_t +# define TEST_VECT 0xa8b5c4d6 +#endif + +#if RIGHT == 0 +# define SHIFT(x,y) (TYPE)((TYPE)(x)<<(y)) +#else +# define SHIFT(x,y) (TYPE)((TYPE)(x)>>(y)) +#endif + +#if VOL == 0 + volatile TYPE s = TEST_VECT; + TYPE t; + #define TESTSHIFT(x) t=s; t = SHIFT (t,(x)); ASSERT( t == SHIFT (TEST_VECT, (x))); +#else + volatile TYPE t = TEST_VECT; + #define TESTSHIFT(x) t=TEST_VECT; t = SHIFT (t,(x)); ASSERT( t == SHIFT (TEST_VECT, (x))); +#endif + +static void +testShift(void) +{ + TESTSHIFT(0); + TESTSHIFT(1); + TESTSHIFT(2); + TESTSHIFT(3); + TESTSHIFT(4); + TESTSHIFT(5); + TESTSHIFT(6); + TESTSHIFT(7); + +#if SIZE >= 16 + TESTSHIFT(8); + TESTSHIFT(9); + TESTSHIFT(10); + TESTSHIFT(11); + TESTSHIFT(12); + TESTSHIFT(13); + TESTSHIFT(14); + TESTSHIFT(15); +#endif + +#if SIZE >= 32 + TESTSHIFT(16); + TESTSHIFT(17); + TESTSHIFT(18); + TESTSHIFT(19); + TESTSHIFT(20); + TESTSHIFT(21); + TESTSHIFT(22); + TESTSHIFT(23); + + TESTSHIFT(24); + TESTSHIFT(25); + TESTSHIFT(26); + TESTSHIFT(27); + TESTSHIFT(28); + TESTSHIFT(29); + TESTSHIFT(30); + TESTSHIFT(31); +#endif +} diff --git a/support/regression/tests/while.c b/support/regression/tests/while.c index f38ae9bf..217ea367 100644 --- a/support/regression/tests/while.c +++ b/support/regression/tests/while.c @@ -1,30 +1,30 @@ -/* - while.c -*/ - -#include - -char c1 = 0, c2 = 1; - -void -testEmptyWhile(void) -{ - /* loops forever if bug ist present */ - do {} while (c1 && c2); - - /* other cases: */ - do {} while ( c1 && c1); - do {} while ( c1 && !c2); - do {} while (!c1 && !c2); - do {} while ( c2 && c1); - do {} while (!c2 && c1); - do {} while (!c2 && !c1); - do {} while (!c2 && !c2); - - do {} while ( c1 || c1); - do {} while ( c1 || !c2); - do {} while (!c2 || c1); - do {} while (!c2 || !c2); - - ASSERT(1); -} +/* + while.c +*/ + +#include + +char c1 = 0, c2 = 1; + +void +testEmptyWhile(void) +{ + /* loops forever if bug ist present */ + do {} while (c1 && c2); + + /* other cases: */ + do {} while ( c1 && c1); + do {} while ( c1 && !c2); + do {} while (!c1 && !c2); + do {} while ( c2 && c1); + do {} while (!c2 && c1); + do {} while (!c2 && !c1); + do {} while (!c2 && !c2); + + do {} while ( c1 || c1); + do {} while ( c1 || !c2); + do {} while (!c2 || c1); + do {} while (!c2 || !c2); + + ASSERT(1); +} -- 2.30.2