Changes in / [cd7ef0b:275f4b4]
- Files:
-
- 2 added
- 9 deleted
- 65 edited
-
.gitignore (modified) (1 diff)
-
Makefile.am (modified) (1 diff)
-
Makefile.in (modified) (9 diffs)
-
automake/compile (modified) (4 diffs)
-
automake/config.guess (modified) (1 diff, 1 prop)
-
automake/config.sub (modified) (1 diff, 1 prop)
-
automake/depcomp (modified) (32 diffs)
-
automake/install-sh (modified) (18 diffs)
-
automake/test-driver (modified) (1 diff, 1 prop)
-
automake/ylwrap (modified) (5 diffs)
-
doc/LaTeXmacros/common.tex (modified) (2 diffs)
-
doc/LaTeXmacros/lstlang.sty (modified) (2 diffs)
-
doc/generic_types/generic_types.bib (added)
-
doc/generic_types/generic_types.tex (modified) (3 diffs)
-
doc/man/README (deleted)
-
doc/man/cfa.1 (deleted)
-
doc/refrat/Makefile (modified) (1 diff)
-
doc/refrat/keywords.tex (deleted)
-
doc/refrat/operidents.tex (deleted)
-
doc/refrat/refrat.tex (modified) (7 diffs)
-
doc/rob_thesis/Makefile (modified) (1 diff)
-
doc/rob_thesis/thesis.tex (modified) (1 diff)
-
doc/user/Makefile (modified) (1 diff)
-
doc/user/user.tex (modified) (45 diffs)
-
src/ControlStruct/ExceptTranslate.cc (modified) (19 diffs)
-
src/GenPoly/Box.cc (modified) (3 diffs)
-
src/GenPoly/Lvalue.cc (modified) (4 diffs)
-
src/GenPoly/Lvalue.h (modified) (2 diffs)
-
src/Makefile.am (modified) (1 diff)
-
src/Makefile.in (modified) (2 diffs)
-
src/Parser/ExpressionNode.cc (modified) (13 diffs)
-
src/Parser/InitializerNode.cc (modified) (7 diffs)
-
src/Parser/ParseNode.h (modified) (2 diffs)
-
src/Parser/TypeData.cc (modified) (3 diffs)
-
src/Parser/lex.ll (modified) (3 diffs)
-
src/Parser/parser.yy (modified) (11 diffs)
-
src/ResolvExpr/CurrentObject.cc (modified) (3 diffs)
-
src/ResolvExpr/Resolver.cc (modified) (3 diffs)
-
src/SymTab/Validate.cc (modified) (4 diffs)
-
src/SynTree/AggregateDecl.cc (modified) (2 diffs)
-
src/SynTree/Declaration.cc (modified) (2 diffs)
-
src/SynTree/Declaration.h (modified) (16 diffs)
-
src/SynTree/Expression.h (modified) (64 diffs)
-
src/SynTree/Initializer.cc (modified) (2 diffs)
-
src/SynTree/Initializer.h (modified) (9 diffs)
-
src/SynTree/NamedTypeDecl.cc (modified) (2 diffs)
-
src/SynTree/Statement.h (modified) (25 diffs)
-
src/SynTree/Type.cc (modified) (2 diffs)
-
src/SynTree/Type.h (modified) (18 diffs)
-
src/SynTree/TypeDecl.cc (modified) (2 diffs)
-
src/SynTree/TypeExpr.cc (modified) (1 diff)
-
src/Tuples/TupleExpansion.cc (modified) (6 diffs)
-
src/Virtual/ExpandCasts.cc (modified) (4 diffs)
-
src/driver/cfa.cc (modified) (4 diffs)
-
src/include/assert.h (added)
-
src/include/cassert (deleted)
-
src/libcfa/Makefile.am (modified) (1 diff)
-
src/libcfa/Makefile.in (modified) (1 diff)
-
src/libcfa/concurrency/monitor.c (modified) (2 diffs)
-
src/libcfa/exception.c (modified) (9 diffs)
-
src/libcfa/exception.h (modified) (4 diffs)
-
src/libcfa/iostream (modified) (4 diffs)
-
src/libcfa/iostream.c (modified) (3 diffs)
-
src/libcfa/math (modified) (3 diffs)
-
src/libcfa/stdhdr/assert.h (modified) (2 diffs)
-
src/libcfa/stdlib (modified) (2 diffs)
-
src/libcfa/stdlib.c (modified) (2 diffs)
-
src/tests/.expect/32/math.txt (modified) (2 diffs)
-
src/tests/.expect/64/math.txt (modified) (2 diffs)
-
src/tests/.expect/div.txt (deleted)
-
src/tests/designations.c (modified) (4 diffs)
-
src/tests/div.c (deleted)
-
src/tests/except-0.c (modified) (3 diffs)
-
src/tests/except-1.c (deleted)
-
src/tests/except-2.c (deleted)
-
src/tests/math.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
.gitignore
rcd7ef0b r275f4b4 24 24 lib 25 25 include 26 share27 26 28 27 # src executables, for lib and bin -
Makefile.am
rcd7ef0b r275f4b4 21 21 22 22 MAINTAINERCLEANFILES = lib/* bin/* src/examples/.deps/* src/tests/.deps/* src/tests/.out/* 23 24 man1_MANS = doc/man/cfa.1 -
Makefile.in
rcd7ef0b r275f4b4 131 131 *) (install-info --version) >/dev/null 2>&1;; \ 132 132 esac 133 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;134 am__vpath_adj = case $$p in \135 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \136 *) f=$$p;; \137 esac;138 am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;139 am__install_max = 40140 am__nobase_strip_setup = \141 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`142 am__nobase_strip = \143 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"144 am__nobase_list = $(am__nobase_strip_setup); \145 for p in $$list; do echo "$$p $$p"; done | \146 sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \147 $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \148 if (++n[$$2] == $(am__install_max)) \149 { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \150 END { for (dir in files) print dir, files[dir] }'151 am__base_list = \152 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \153 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'154 am__uninstall_files_from_dir = { \155 test -z "$$files" \156 || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \157 || { echo " ( cd '$$dir' && rm -f" $$files ")"; \158 $(am__cd) "$$dir" && rm -f $$files; }; \159 }160 man1dir = $(mandir)/man1161 am__installdirs = "$(DESTDIR)$(man1dir)"162 NROFF = nroff163 MANS = $(man1_MANS)164 133 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ 165 134 distclean-recursive maintainer-clean-recursive … … 198 167 $(top_srcdir)/automake/install-sh \ 199 168 $(top_srcdir)/automake/missing INSTALL README automake/compile \ 200 automake/config.guess automake/config.sub automake/ install-sh\201 automake/ missing169 automake/config.guess automake/config.sub automake/depcomp \ 170 automake/install-sh automake/missing automake/ylwrap 202 171 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 203 172 distdir = $(PACKAGE)-$(VERSION) … … 366 335 EXTRA_DIST = Docs # non-source files 367 336 MAINTAINERCLEANFILES = lib/* bin/* src/examples/.deps/* src/tests/.deps/* src/tests/.out/* 368 man1_MANS = doc/man/cfa.1369 337 all: config.h 370 338 $(MAKE) $(AM_MAKEFLAGS) all-recursive … … 419 387 distclean-hdr: 420 388 -rm -f config.h stamp-h1 421 install-man1: $(man1_MANS)422 @$(NORMAL_INSTALL)423 @list1='$(man1_MANS)'; \424 list2=''; \425 test -n "$(man1dir)" \426 && test -n "`echo $$list1$$list2`" \427 || exit 0; \428 echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \429 $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \430 { for i in $$list1; do echo "$$i"; done; \431 if test -n "$$list2"; then \432 for i in $$list2; do echo "$$i"; done \433 | sed -n '/\.1[a-z]*$$/p'; \434 fi; \435 } | while read p; do \436 if test -f $$p; then d=; else d="$(srcdir)/"; fi; \437 echo "$$d$$p"; echo "$$p"; \438 done | \439 sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \440 -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \441 sed 'N;N;s,\n, ,g' | { \442 list=; while read file base inst; do \443 if test "$$base" = "$$inst"; then list="$$list $$file"; else \444 echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \445 $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \446 fi; \447 done; \448 for i in $$list; do echo "$$i"; done | $(am__base_list) | \449 while read files; do \450 test -z "$$files" || { \451 echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \452 $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \453 done; }454 455 uninstall-man1:456 @$(NORMAL_UNINSTALL)457 @list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \458 files=`{ for i in $$list; do echo "$$i"; done; \459 } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \460 -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \461 dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)462 389 463 390 # This directory's subdirectories are mostly independent; you can cd … … 757 684 check-am: all-am 758 685 check: check-recursive 759 all-am: Makefile $(MANS)config.h686 all-am: Makefile config.h 760 687 installdirs: installdirs-recursive 761 688 installdirs-am: 762 for dir in "$(DESTDIR)$(man1dir)"; do \763 test -z "$$dir" || $(MKDIR_P) "$$dir"; \764 done765 689 install: install-recursive 766 690 install-exec: install-exec-recursive … … 815 739 info-am: 816 740 817 install-data-am: install-man741 install-data-am: 818 742 819 743 install-dvi: install-dvi-recursive … … 831 755 install-info-am: 832 756 833 install-man: install-man1757 install-man: 834 758 835 759 install-pdf: install-pdf-recursive … … 861 785 ps-am: 862 786 863 uninstall-am: uninstall-man 864 865 uninstall-man: uninstall-man1 787 uninstall-am: 866 788 867 789 .MAKE: $(am__recursive_targets) all install-am install-strip … … 876 798 install-data install-data-am install-dvi install-dvi-am \ 877 799 install-exec install-exec-am install-html install-html-am \ 878 install-info install-info-am install-man install- man1\879 install-pdf install-pdf-am install-ps install-ps-am\880 install -strip installcheck installcheck-am installdirs\881 installdirs-am maintainer-clean maintainer-clean-generic\882 mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags\883 tags-am uninstall uninstall-am uninstall-man uninstall-man1800 install-info install-info-am install-man install-pdf \ 801 install-pdf-am install-ps install-ps-am install-strip \ 802 installcheck installcheck-am installdirs installdirs-am \ 803 maintainer-clean maintainer-clean-generic mostlyclean \ 804 mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ 805 uninstall-am 884 806 885 807 .PRECIOUS: Makefile -
automake/compile
rcd7ef0b r275f4b4 2 2 # Wrapper for compilers which do not understand '-c -o'. 3 3 4 scriptversion=2012-10-14.11; # UTC 5 6 # Copyright (C) 1999-2014 Free Software Foundation, Inc. 4 scriptversion=2012-01-04.17; # UTC 5 6 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free 7 # Software Foundation, Inc. 7 8 # Written by Tom Tromey <tromey@cygnus.com>. 8 9 # … … 77 78 ;; 78 79 esac 79 }80 81 # func_cl_dashL linkdir82 # Make cl look for libraries in LINKDIR83 func_cl_dashL ()84 {85 func_file_conv "$1"86 if test -z "$lib_path"; then87 lib_path=$file88 else89 lib_path="$lib_path;$file"90 fi91 linker_opts="$linker_opts -LIBPATH:$file"92 }93 94 # func_cl_dashl library95 # Do a library search-path lookup for cl96 func_cl_dashl ()97 {98 lib=$199 found=no100 save_IFS=$IFS101 IFS=';'102 for dir in $lib_path $LIB103 do104 IFS=$save_IFS105 if $shared && test -f "$dir/$lib.dll.lib"; then106 found=yes107 lib=$dir/$lib.dll.lib108 break109 fi110 if test -f "$dir/$lib.lib"; then111 found=yes112 lib=$dir/$lib.lib113 break114 fi115 if test -f "$dir/lib$lib.a"; then116 found=yes117 lib=$dir/lib$lib.a118 break119 fi120 done121 IFS=$save_IFS122 123 if test "$found" != yes; then124 lib=$lib.lib125 fi126 80 } 127 81 … … 156 110 esac 157 111 ;; 158 -I)159 eat=1160 func_file_conv "$2" mingw161 set x "$@" -I"$file"162 shift163 ;;164 112 -I*) 165 113 func_file_conv "${1#-I}" mingw … … 167 115 shift 168 116 ;; 169 -l)170 eat=1171 func_cl_dashl "$2"172 set x "$@" "$lib"173 shift174 ;;175 117 -l*) 176 func_cl_dashl "${1#-l}" 177 set x "$@" "$lib" 178 shift 179 ;; 180 -L) 181 eat=1 182 func_cl_dashL "$2" 118 lib=${1#-l} 119 found=no 120 save_IFS=$IFS 121 IFS=';' 122 for dir in $lib_path $LIB 123 do 124 IFS=$save_IFS 125 if $shared && test -f "$dir/$lib.dll.lib"; then 126 found=yes 127 set x "$@" "$dir/$lib.dll.lib" 128 break 129 fi 130 if test -f "$dir/$lib.lib"; then 131 found=yes 132 set x "$@" "$dir/$lib.lib" 133 break 134 fi 135 done 136 IFS=$save_IFS 137 138 test "$found" != yes && set x "$@" "$lib.lib" 139 shift 183 140 ;; 184 141 -L*) 185 func_cl_dashL "${1#-L}" 142 func_file_conv "${1#-L}" 143 if test -z "$lib_path"; then 144 lib_path=$file 145 else 146 lib_path="$lib_path;$file" 147 fi 148 linker_opts="$linker_opts -LIBPATH:$file" 186 149 ;; 187 150 -static) -
automake/config.guess
-
Property mode
changed from
100755to120000
rcd7ef0b r275f4b4 1 #! /bin/sh 2 # Attempt to guess a canonical system name. 3 # Copyright 1992-2015 Free Software Foundation, Inc. 4 5 timestamp='2015-08-20' 6 7 # This file is free software; you can redistribute it and/or modify it 8 # under the terms of the GNU General Public License as published by 9 # the Free Software Foundation; either version 3 of the License, or 10 # (at your option) any later version. 11 # 12 # This program is distributed in the hope that it will be useful, but 13 # WITHOUT ANY WARRANTY; without even the implied warranty of 14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 # General Public License for more details. 16 # 17 # You should have received a copy of the GNU General Public License 18 # along with this program; if not, see <http://www.gnu.org/licenses/>. 19 # 20 # As a special exception to the GNU General Public License, if you 21 # distribute this file as part of a program that contains a 22 # configuration script generated by Autoconf, you may include it under 23 # the same distribution terms that you use for the rest of that 24 # program. This Exception is an additional permission under section 7 25 # of the GNU General Public License, version 3 ("GPLv3"). 26 # 27 # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. 28 # 29 # You can get the latest version of this script from: 30 # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD 31 # 32 # Please send patches to <config-patches@gnu.org>. 33 34 35 me=`echo "$0" | sed -e 's,.*/,,'` 36 37 usage="\ 38 Usage: $0 [OPTION] 39 40 Output the configuration name of the system \`$me' is run on. 41 42 Operation modes: 43 -h, --help print this help, then exit 44 -t, --time-stamp print date of last modification, then exit 45 -v, --version print version number, then exit 46 47 Report bugs and patches to <config-patches@gnu.org>." 48 49 version="\ 50 GNU config.guess ($timestamp) 51 52 Originally written by Per Bothner. 53 Copyright 1992-2015 Free Software Foundation, Inc. 54 55 This is free software; see the source for copying conditions. There is NO 56 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." 57 58 help=" 59 Try \`$me --help' for more information." 60 61 # Parse command line 62 while test $# -gt 0 ; do 63 case $1 in 64 --time-stamp | --time* | -t ) 65 echo "$timestamp" ; exit ;; 66 --version | -v ) 67 echo "$version" ; exit ;; 68 --help | --h* | -h ) 69 echo "$usage"; exit ;; 70 -- ) # Stop option processing 71 shift; break ;; 72 - ) # Use stdin as input. 73 break ;; 74 -* ) 75 echo "$me: invalid option $1$help" >&2 76 exit 1 ;; 77 * ) 78 break ;; 79 esac 80 done 81 82 if test $# != 0; then 83 echo "$me: too many arguments$help" >&2 84 exit 1 85 fi 86 87 trap 'exit 1' 1 2 15 88 89 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a 90 # compiler to aid in system detection is discouraged as it requires 91 # temporary files to be created and, as you can see below, it is a 92 # headache to deal with in a portable fashion. 93 94 # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still 95 # use `HOST_CC' if defined, but it is deprecated. 96 97 # Portable tmp directory creation inspired by the Autoconf team. 98 99 set_cc_for_build=' 100 trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; 101 trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; 102 : ${TMPDIR=/tmp} ; 103 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || 104 { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || 105 { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || 106 { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; 107 dummy=$tmp/dummy ; 108 tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; 109 case $CC_FOR_BUILD,$HOST_CC,$CC in 110 ,,) echo "int x;" > $dummy.c ; 111 for c in cc gcc c89 c99 ; do 112 if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then 113 CC_FOR_BUILD="$c"; break ; 114 fi ; 115 done ; 116 if test x"$CC_FOR_BUILD" = x ; then 117 CC_FOR_BUILD=no_compiler_found ; 118 fi 119 ;; 120 ,,*) CC_FOR_BUILD=$CC ;; 121 ,*,*) CC_FOR_BUILD=$HOST_CC ;; 122 esac ; set_cc_for_build= ;' 123 124 # This is needed to find uname on a Pyramid OSx when run in the BSD universe. 125 # (ghazi@noc.rutgers.edu 1994-08-24) 126 if (test -f /.attbin/uname) >/dev/null 2>&1 ; then 127 PATH=$PATH:/.attbin ; export PATH 128 fi 129 130 UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown 131 UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown 132 UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown 133 UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown 134 135 case "${UNAME_SYSTEM}" in 136 Linux|GNU|GNU/*) 137 # If the system lacks a compiler, then just pick glibc. 138 # We could probably try harder. 139 LIBC=gnu 140 141 eval $set_cc_for_build 142 cat <<-EOF > $dummy.c 143 #include <features.h> 144 #if defined(__UCLIBC__) 145 LIBC=uclibc 146 #elif defined(__dietlibc__) 147 LIBC=dietlibc 148 #else 149 LIBC=gnu 150 #endif 151 EOF 152 eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` 153 ;; 154 esac 155 156 # Note: order is significant - the case branches are not exclusive. 157 158 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in 159 *:NetBSD:*:*) 160 # NetBSD (nbsd) targets should (where applicable) match one or 161 # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, 162 # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently 163 # switched to ELF, *-*-netbsd* would select the old 164 # object file format. This provides both forward 165 # compatibility and a consistent mechanism for selecting the 166 # object file format. 167 # 168 # Note: NetBSD doesn't particularly care about the vendor 169 # portion of the name. We always set it to "unknown". 170 sysctl="sysctl -n hw.machine_arch" 171 UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ 172 /sbin/$sysctl 2>/dev/null || \ 173 /usr/sbin/$sysctl 2>/dev/null || \ 174 echo unknown)` 175 case "${UNAME_MACHINE_ARCH}" in 176 armeb) machine=armeb-unknown ;; 177 arm*) machine=arm-unknown ;; 178 sh3el) machine=shl-unknown ;; 179 sh3eb) machine=sh-unknown ;; 180 sh5el) machine=sh5le-unknown ;; 181 earmv*) 182 arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` 183 endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` 184 machine=${arch}${endian}-unknown 185 ;; 186 *) machine=${UNAME_MACHINE_ARCH}-unknown ;; 187 esac 188 # The Operating System including object format, if it has switched 189 # to ELF recently, or will in the future. 190 case "${UNAME_MACHINE_ARCH}" in 191 arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax) 192 eval $set_cc_for_build 193 if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ 194 | grep -q __ELF__ 195 then 196 # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). 197 # Return netbsd for either. FIX? 198 os=netbsd 199 else 200 os=netbsdelf 201 fi 202 ;; 203 *) 204 os=netbsd 205 ;; 206 esac 207 # Determine ABI tags. 208 case "${UNAME_MACHINE_ARCH}" in 209 earm*) 210 expr='s/^earmv[0-9]/-eabi/;s/eb$//' 211 abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` 212 ;; 213 esac 214 # The OS release 215 # Debian GNU/NetBSD machines have a different userland, and 216 # thus, need a distinct triplet. However, they do not need 217 # kernel version information, so it can be replaced with a 218 # suitable tag, in the style of linux-gnu. 219 case "${UNAME_VERSION}" in 220 Debian*) 221 release='-gnu' 222 ;; 223 *) 224 release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` 225 ;; 226 esac 227 # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: 228 # contains redundant information, the shorter form: 229 # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. 230 echo "${machine}-${os}${release}${abi}" 231 exit ;; 232 *:Bitrig:*:*) 233 UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` 234 echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} 235 exit ;; 236 *:OpenBSD:*:*) 237 UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` 238 echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} 239 exit ;; 240 *:ekkoBSD:*:*) 241 echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} 242 exit ;; 243 *:SolidBSD:*:*) 244 echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} 245 exit ;; 246 macppc:MirBSD:*:*) 247 echo powerpc-unknown-mirbsd${UNAME_RELEASE} 248 exit ;; 249 *:MirBSD:*:*) 250 echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} 251 exit ;; 252 *:Sortix:*:*) 253 echo ${UNAME_MACHINE}-unknown-sortix 254 exit ;; 255 alpha:OSF1:*:*) 256 case $UNAME_RELEASE in 257 *4.0) 258 UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` 259 ;; 260 *5.*) 261 UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` 262 ;; 263 esac 264 # According to Compaq, /usr/sbin/psrinfo has been available on 265 # OSF/1 and Tru64 systems produced since 1995. I hope that 266 # covers most systems running today. This code pipes the CPU 267 # types through head -n 1, so we only detect the type of CPU 0. 268 ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` 269 case "$ALPHA_CPU_TYPE" in 270 "EV4 (21064)") 271 UNAME_MACHINE="alpha" ;; 272 "EV4.5 (21064)") 273 UNAME_MACHINE="alpha" ;; 274 "LCA4 (21066/21068)") 275 UNAME_MACHINE="alpha" ;; 276 "EV5 (21164)") 277 UNAME_MACHINE="alphaev5" ;; 278 "EV5.6 (21164A)") 279 UNAME_MACHINE="alphaev56" ;; 280 "EV5.6 (21164PC)") 281 UNAME_MACHINE="alphapca56" ;; 282 "EV5.7 (21164PC)") 283 UNAME_MACHINE="alphapca57" ;; 284 "EV6 (21264)") 285 UNAME_MACHINE="alphaev6" ;; 286 "EV6.7 (21264A)") 287 UNAME_MACHINE="alphaev67" ;; 288 "EV6.8CB (21264C)") 289 UNAME_MACHINE="alphaev68" ;; 290 "EV6.8AL (21264B)") 291 UNAME_MACHINE="alphaev68" ;; 292 "EV6.8CX (21264D)") 293 UNAME_MACHINE="alphaev68" ;; 294 "EV6.9A (21264/EV69A)") 295 UNAME_MACHINE="alphaev69" ;; 296 "EV7 (21364)") 297 UNAME_MACHINE="alphaev7" ;; 298 "EV7.9 (21364A)") 299 UNAME_MACHINE="alphaev79" ;; 300 esac 301 # A Pn.n version is a patched version. 302 # A Vn.n version is a released version. 303 # A Tn.n version is a released field test version. 304 # A Xn.n version is an unreleased experimental baselevel. 305 # 1.2 uses "1.2" for uname -r. 306 echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` 307 # Reset EXIT trap before exiting to avoid spurious non-zero exit code. 308 exitcode=$? 309 trap '' 0 310 exit $exitcode ;; 311 Alpha\ *:Windows_NT*:*) 312 # How do we know it's Interix rather than the generic POSIX subsystem? 313 # Should we change UNAME_MACHINE based on the output of uname instead 314 # of the specific Alpha model? 315 echo alpha-pc-interix 316 exit ;; 317 21064:Windows_NT:50:3) 318 echo alpha-dec-winnt3.5 319 exit ;; 320 Amiga*:UNIX_System_V:4.0:*) 321 echo m68k-unknown-sysv4 322 exit ;; 323 *:[Aa]miga[Oo][Ss]:*:*) 324 echo ${UNAME_MACHINE}-unknown-amigaos 325 exit ;; 326 *:[Mm]orph[Oo][Ss]:*:*) 327 echo ${UNAME_MACHINE}-unknown-morphos 328 exit ;; 329 *:OS/390:*:*) 330 echo i370-ibm-openedition 331 exit ;; 332 *:z/VM:*:*) 333 echo s390-ibm-zvmoe 334 exit ;; 335 *:OS400:*:*) 336 echo powerpc-ibm-os400 337 exit ;; 338 arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) 339 echo arm-acorn-riscix${UNAME_RELEASE} 340 exit ;; 341 arm*:riscos:*:*|arm*:RISCOS:*:*) 342 echo arm-unknown-riscos 343 exit ;; 344 SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) 345 echo hppa1.1-hitachi-hiuxmpp 346 exit ;; 347 Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) 348 # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. 349 if test "`(/bin/universe) 2>/dev/null`" = att ; then 350 echo pyramid-pyramid-sysv3 351 else 352 echo pyramid-pyramid-bsd 353 fi 354 exit ;; 355 NILE*:*:*:dcosx) 356 echo pyramid-pyramid-svr4 357 exit ;; 358 DRS?6000:unix:4.0:6*) 359 echo sparc-icl-nx6 360 exit ;; 361 DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) 362 case `/usr/bin/uname -p` in 363 sparc) echo sparc-icl-nx7; exit ;; 364 esac ;; 365 s390x:SunOS:*:*) 366 echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` 367 exit ;; 368 sun4H:SunOS:5.*:*) 369 echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` 370 exit ;; 371 sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) 372 echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` 373 exit ;; 374 i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) 375 echo i386-pc-auroraux${UNAME_RELEASE} 376 exit ;; 377 i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) 378 eval $set_cc_for_build 379 SUN_ARCH="i386" 380 # If there is a compiler, see if it is configured for 64-bit objects. 381 # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. 382 # This test works for both compilers. 383 if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then 384 if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ 385 (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ 386 grep IS_64BIT_ARCH >/dev/null 387 then 388 SUN_ARCH="x86_64" 389 fi 390 fi 391 echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` 392 exit ;; 393 sun4*:SunOS:6*:*) 394 # According to config.sub, this is the proper way to canonicalize 395 # SunOS6. Hard to guess exactly what SunOS6 will be like, but 396 # it's likely to be more like Solaris than SunOS4. 397 echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` 398 exit ;; 399 sun4*:SunOS:*:*) 400 case "`/usr/bin/arch -k`" in 401 Series*|S4*) 402 UNAME_RELEASE=`uname -v` 403 ;; 404 esac 405 # Japanese Language versions have a version number like `4.1.3-JL'. 406 echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` 407 exit ;; 408 sun3*:SunOS:*:*) 409 echo m68k-sun-sunos${UNAME_RELEASE} 410 exit ;; 411 sun*:*:4.2BSD:*) 412 UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` 413 test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 414 case "`/bin/arch`" in 415 sun3) 416 echo m68k-sun-sunos${UNAME_RELEASE} 417 ;; 418 sun4) 419 echo sparc-sun-sunos${UNAME_RELEASE} 420 ;; 421 esac 422 exit ;; 423 aushp:SunOS:*:*) 424 echo sparc-auspex-sunos${UNAME_RELEASE} 425 exit ;; 426 # The situation for MiNT is a little confusing. The machine name 427 # can be virtually everything (everything which is not 428 # "atarist" or "atariste" at least should have a processor 429 # > m68000). The system name ranges from "MiNT" over "FreeMiNT" 430 # to the lowercase version "mint" (or "freemint"). Finally 431 # the system name "TOS" denotes a system which is actually not 432 # MiNT. But MiNT is downward compatible to TOS, so this should 433 # be no problem. 434 atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) 435 echo m68k-atari-mint${UNAME_RELEASE} 436 exit ;; 437 atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) 438 echo m68k-atari-mint${UNAME_RELEASE} 439 exit ;; 440 *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) 441 echo m68k-atari-mint${UNAME_RELEASE} 442 exit ;; 443 milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) 444 echo m68k-milan-mint${UNAME_RELEASE} 445 exit ;; 446 hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) 447 echo m68k-hades-mint${UNAME_RELEASE} 448 exit ;; 449 *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) 450 echo m68k-unknown-mint${UNAME_RELEASE} 451 exit ;; 452 m68k:machten:*:*) 453 echo m68k-apple-machten${UNAME_RELEASE} 454 exit ;; 455 powerpc:machten:*:*) 456 echo powerpc-apple-machten${UNAME_RELEASE} 457 exit ;; 458 RISC*:Mach:*:*) 459 echo mips-dec-mach_bsd4.3 460 exit ;; 461 RISC*:ULTRIX:*:*) 462 echo mips-dec-ultrix${UNAME_RELEASE} 463 exit ;; 464 VAX*:ULTRIX*:*:*) 465 echo vax-dec-ultrix${UNAME_RELEASE} 466 exit ;; 467 2020:CLIX:*:* | 2430:CLIX:*:*) 468 echo clipper-intergraph-clix${UNAME_RELEASE} 469 exit ;; 470 mips:*:*:UMIPS | mips:*:*:RISCos) 471 eval $set_cc_for_build 472 sed 's/^ //' << EOF >$dummy.c 473 #ifdef __cplusplus 474 #include <stdio.h> /* for printf() prototype */ 475 int main (int argc, char *argv[]) { 476 #else 477 int main (argc, argv) int argc; char *argv[]; { 478 #endif 479 #if defined (host_mips) && defined (MIPSEB) 480 #if defined (SYSTYPE_SYSV) 481 printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); 482 #endif 483 #if defined (SYSTYPE_SVR4) 484 printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); 485 #endif 486 #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) 487 printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); 488 #endif 489 #endif 490 exit (-1); 491 } 492 EOF 493 $CC_FOR_BUILD -o $dummy $dummy.c && 494 dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && 495 SYSTEM_NAME=`$dummy $dummyarg` && 496 { echo "$SYSTEM_NAME"; exit; } 497 echo mips-mips-riscos${UNAME_RELEASE} 498 exit ;; 499 Motorola:PowerMAX_OS:*:*) 500 echo powerpc-motorola-powermax 501 exit ;; 502 Motorola:*:4.3:PL8-*) 503 echo powerpc-harris-powermax 504 exit ;; 505 Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) 506 echo powerpc-harris-powermax 507 exit ;; 508 Night_Hawk:Power_UNIX:*:*) 509 echo powerpc-harris-powerunix 510 exit ;; 511 m88k:CX/UX:7*:*) 512 echo m88k-harris-cxux7 513 exit ;; 514 m88k:*:4*:R4*) 515 echo m88k-motorola-sysv4 516 exit ;; 517 m88k:*:3*:R3*) 518 echo m88k-motorola-sysv3 519 exit ;; 520 AViiON:dgux:*:*) 521 # DG/UX returns AViiON for all architectures 522 UNAME_PROCESSOR=`/usr/bin/uname -p` 523 if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] 524 then 525 if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ 526 [ ${TARGET_BINARY_INTERFACE}x = x ] 527 then 528 echo m88k-dg-dgux${UNAME_RELEASE} 529 else 530 echo m88k-dg-dguxbcs${UNAME_RELEASE} 531 fi 532 else 533 echo i586-dg-dgux${UNAME_RELEASE} 534 fi 535 exit ;; 536 M88*:DolphinOS:*:*) # DolphinOS (SVR3) 537 echo m88k-dolphin-sysv3 538 exit ;; 539 M88*:*:R3*:*) 540 # Delta 88k system running SVR3 541 echo m88k-motorola-sysv3 542 exit ;; 543 XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) 544 echo m88k-tektronix-sysv3 545 exit ;; 546 Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) 547 echo m68k-tektronix-bsd 548 exit ;; 549 *:IRIX*:*:*) 550 echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` 551 exit ;; 552 ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. 553 echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id 554 exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' 555 i*86:AIX:*:*) 556 echo i386-ibm-aix 557 exit ;; 558 ia64:AIX:*:*) 559 if [ -x /usr/bin/oslevel ] ; then 560 IBM_REV=`/usr/bin/oslevel` 561 else 562 IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} 563 fi 564 echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} 565 exit ;; 566 *:AIX:2:3) 567 if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then 568 eval $set_cc_for_build 569 sed 's/^ //' << EOF >$dummy.c 570 #include <sys/systemcfg.h> 571 572 main() 573 { 574 if (!__power_pc()) 575 exit(1); 576 puts("powerpc-ibm-aix3.2.5"); 577 exit(0); 578 } 579 EOF 580 if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` 581 then 582 echo "$SYSTEM_NAME" 583 else 584 echo rs6000-ibm-aix3.2.5 585 fi 586 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then 587 echo rs6000-ibm-aix3.2.4 588 else 589 echo rs6000-ibm-aix3.2 590 fi 591 exit ;; 592 *:AIX:*:[4567]) 593 IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` 594 if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then 595 IBM_ARCH=rs6000 596 else 597 IBM_ARCH=powerpc 598 fi 599 if [ -x /usr/bin/lslpp ] ; then 600 IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | 601 awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` 602 else 603 IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} 604 fi 605 echo ${IBM_ARCH}-ibm-aix${IBM_REV} 606 exit ;; 607 *:AIX:*:*) 608 echo rs6000-ibm-aix 609 exit ;; 610 ibmrt:4.4BSD:*|romp-ibm:BSD:*) 611 echo romp-ibm-bsd4.4 612 exit ;; 613 ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and 614 echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to 615 exit ;; # report: romp-ibm BSD 4.3 616 *:BOSX:*:*) 617 echo rs6000-bull-bosx 618 exit ;; 619 DPX/2?00:B.O.S.:*:*) 620 echo m68k-bull-sysv3 621 exit ;; 622 9000/[34]??:4.3bsd:1.*:*) 623 echo m68k-hp-bsd 624 exit ;; 625 hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) 626 echo m68k-hp-bsd4.4 627 exit ;; 628 9000/[34678]??:HP-UX:*:*) 629 HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` 630 case "${UNAME_MACHINE}" in 631 9000/31? ) HP_ARCH=m68000 ;; 632 9000/[34]?? ) HP_ARCH=m68k ;; 633 9000/[678][0-9][0-9]) 634 if [ -x /usr/bin/getconf ]; then 635 sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` 636 sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` 637 case "${sc_cpu_version}" in 638 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 639 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 640 532) # CPU_PA_RISC2_0 641 case "${sc_kernel_bits}" in 642 32) HP_ARCH="hppa2.0n" ;; 643 64) HP_ARCH="hppa2.0w" ;; 644 '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 645 esac ;; 646 esac 647 fi 648 if [ "${HP_ARCH}" = "" ]; then 649 eval $set_cc_for_build 650 sed 's/^ //' << EOF >$dummy.c 651 652 #define _HPUX_SOURCE 653 #include <stdlib.h> 654 #include <unistd.h> 655 656 int main () 657 { 658 #if defined(_SC_KERNEL_BITS) 659 long bits = sysconf(_SC_KERNEL_BITS); 660 #endif 661 long cpu = sysconf (_SC_CPU_VERSION); 662 663 switch (cpu) 664 { 665 case CPU_PA_RISC1_0: puts ("hppa1.0"); break; 666 case CPU_PA_RISC1_1: puts ("hppa1.1"); break; 667 case CPU_PA_RISC2_0: 668 #if defined(_SC_KERNEL_BITS) 669 switch (bits) 670 { 671 case 64: puts ("hppa2.0w"); break; 672 case 32: puts ("hppa2.0n"); break; 673 default: puts ("hppa2.0"); break; 674 } break; 675 #else /* !defined(_SC_KERNEL_BITS) */ 676 puts ("hppa2.0"); break; 677 #endif 678 default: puts ("hppa1.0"); break; 679 } 680 exit (0); 681 } 682 EOF 683 (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` 684 test -z "$HP_ARCH" && HP_ARCH=hppa 685 fi ;; 686 esac 687 if [ ${HP_ARCH} = "hppa2.0w" ] 688 then 689 eval $set_cc_for_build 690 691 # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating 692 # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler 693 # generating 64-bit code. GNU and HP use different nomenclature: 694 # 695 # $ CC_FOR_BUILD=cc ./config.guess 696 # => hppa2.0w-hp-hpux11.23 697 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess 698 # => hppa64-hp-hpux11.23 699 700 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | 701 grep -q __LP64__ 702 then 703 HP_ARCH="hppa2.0w" 704 else 705 HP_ARCH="hppa64" 706 fi 707 fi 708 echo ${HP_ARCH}-hp-hpux${HPUX_REV} 709 exit ;; 710 ia64:HP-UX:*:*) 711 HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` 712 echo ia64-hp-hpux${HPUX_REV} 713 exit ;; 714 3050*:HI-UX:*:*) 715 eval $set_cc_for_build 716 sed 's/^ //' << EOF >$dummy.c 717 #include <unistd.h> 718 int 719 main () 720 { 721 long cpu = sysconf (_SC_CPU_VERSION); 722 /* The order matters, because CPU_IS_HP_MC68K erroneously returns 723 true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct 724 results, however. */ 725 if (CPU_IS_PA_RISC (cpu)) 726 { 727 switch (cpu) 728 { 729 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; 730 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; 731 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; 732 default: puts ("hppa-hitachi-hiuxwe2"); break; 733 } 734 } 735 else if (CPU_IS_HP_MC68K (cpu)) 736 puts ("m68k-hitachi-hiuxwe2"); 737 else puts ("unknown-hitachi-hiuxwe2"); 738 exit (0); 739 } 740 EOF 741 $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && 742 { echo "$SYSTEM_NAME"; exit; } 743 echo unknown-hitachi-hiuxwe2 744 exit ;; 745 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) 746 echo hppa1.1-hp-bsd 747 exit ;; 748 9000/8??:4.3bsd:*:*) 749 echo hppa1.0-hp-bsd 750 exit ;; 751 *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) 752 echo hppa1.0-hp-mpeix 753 exit ;; 754 hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) 755 echo hppa1.1-hp-osf 756 exit ;; 757 hp8??:OSF1:*:*) 758 echo hppa1.0-hp-osf 759 exit ;; 760 i*86:OSF1:*:*) 761 if [ -x /usr/sbin/sysversion ] ; then 762 echo ${UNAME_MACHINE}-unknown-osf1mk 763 else 764 echo ${UNAME_MACHINE}-unknown-osf1 765 fi 766 exit ;; 767 parisc*:Lites*:*:*) 768 echo hppa1.1-hp-lites 769 exit ;; 770 C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) 771 echo c1-convex-bsd 772 exit ;; 773 C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) 774 if getsysinfo -f scalar_acc 775 then echo c32-convex-bsd 776 else echo c2-convex-bsd 777 fi 778 exit ;; 779 C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) 780 echo c34-convex-bsd 781 exit ;; 782 C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) 783 echo c38-convex-bsd 784 exit ;; 785 C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) 786 echo c4-convex-bsd 787 exit ;; 788 CRAY*Y-MP:*:*:*) 789 echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' 790 exit ;; 791 CRAY*[A-Z]90:*:*:*) 792 echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ 793 | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ 794 -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ 795 -e 's/\.[^.]*$/.X/' 796 exit ;; 797 CRAY*TS:*:*:*) 798 echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' 799 exit ;; 800 CRAY*T3E:*:*:*) 801 echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' 802 exit ;; 803 CRAY*SV1:*:*:*) 804 echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' 805 exit ;; 806 *:UNICOS/mp:*:*) 807 echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' 808 exit ;; 809 F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) 810 FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` 811 FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` 812 FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` 813 echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" 814 exit ;; 815 5000:UNIX_System_V:4.*:*) 816 FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` 817 FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` 818 echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" 819 exit ;; 820 i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) 821 echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} 822 exit ;; 823 sparc*:BSD/OS:*:*) 824 echo sparc-unknown-bsdi${UNAME_RELEASE} 825 exit ;; 826 *:BSD/OS:*:*) 827 echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} 828 exit ;; 829 *:FreeBSD:*:*) 830 UNAME_PROCESSOR=`/usr/bin/uname -p` 831 case ${UNAME_PROCESSOR} in 832 amd64) 833 echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; 834 *) 835 echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; 836 esac 837 exit ;; 838 i*:CYGWIN*:*) 839 echo ${UNAME_MACHINE}-pc-cygwin 840 exit ;; 841 *:MINGW64*:*) 842 echo ${UNAME_MACHINE}-pc-mingw64 843 exit ;; 844 *:MINGW*:*) 845 echo ${UNAME_MACHINE}-pc-mingw32 846 exit ;; 847 *:MSYS*:*) 848 echo ${UNAME_MACHINE}-pc-msys 849 exit ;; 850 i*:windows32*:*) 851 # uname -m includes "-pc" on this system. 852 echo ${UNAME_MACHINE}-mingw32 853 exit ;; 854 i*:PW*:*) 855 echo ${UNAME_MACHINE}-pc-pw32 856 exit ;; 857 *:Interix*:*) 858 case ${UNAME_MACHINE} in 859 x86) 860 echo i586-pc-interix${UNAME_RELEASE} 861 exit ;; 862 authenticamd | genuineintel | EM64T) 863 echo x86_64-unknown-interix${UNAME_RELEASE} 864 exit ;; 865 IA64) 866 echo ia64-unknown-interix${UNAME_RELEASE} 867 exit ;; 868 esac ;; 869 [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) 870 echo i${UNAME_MACHINE}-pc-mks 871 exit ;; 872 8664:Windows_NT:*) 873 echo x86_64-pc-mks 874 exit ;; 875 i*:Windows_NT*:* | Pentium*:Windows_NT*:*) 876 # How do we know it's Interix rather than the generic POSIX subsystem? 877 # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we 878 # UNAME_MACHINE based on the output of uname instead of i386? 879 echo i586-pc-interix 880 exit ;; 881 i*:UWIN*:*) 882 echo ${UNAME_MACHINE}-pc-uwin 883 exit ;; 884 amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) 885 echo x86_64-unknown-cygwin 886 exit ;; 887 p*:CYGWIN*:*) 888 echo powerpcle-unknown-cygwin 889 exit ;; 890 prep*:SunOS:5.*:*) 891 echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` 892 exit ;; 893 *:GNU:*:*) 894 # the GNU system 895 echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` 896 exit ;; 897 *:GNU/*:*:*) 898 # other systems with GNU libc and userland 899 echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} 900 exit ;; 901 i*86:Minix:*:*) 902 echo ${UNAME_MACHINE}-pc-minix 903 exit ;; 904 aarch64:Linux:*:*) 905 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 906 exit ;; 907 aarch64_be:Linux:*:*) 908 UNAME_MACHINE=aarch64_be 909 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 910 exit ;; 911 alpha:Linux:*:*) 912 case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in 913 EV5) UNAME_MACHINE=alphaev5 ;; 914 EV56) UNAME_MACHINE=alphaev56 ;; 915 PCA56) UNAME_MACHINE=alphapca56 ;; 916 PCA57) UNAME_MACHINE=alphapca56 ;; 917 EV6) UNAME_MACHINE=alphaev6 ;; 918 EV67) UNAME_MACHINE=alphaev67 ;; 919 EV68*) UNAME_MACHINE=alphaev68 ;; 920 esac 921 objdump --private-headers /bin/sh | grep -q ld.so.1 922 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi 923 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 924 exit ;; 925 arc:Linux:*:* | arceb:Linux:*:*) 926 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 927 exit ;; 928 arm*:Linux:*:*) 929 eval $set_cc_for_build 930 if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ 931 | grep -q __ARM_EABI__ 932 then 933 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 934 else 935 if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ 936 | grep -q __ARM_PCS_VFP 937 then 938 echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi 939 else 940 echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf 941 fi 942 fi 943 exit ;; 944 avr32*:Linux:*:*) 945 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 946 exit ;; 947 cris:Linux:*:*) 948 echo ${UNAME_MACHINE}-axis-linux-${LIBC} 949 exit ;; 950 crisv32:Linux:*:*) 951 echo ${UNAME_MACHINE}-axis-linux-${LIBC} 952 exit ;; 953 e2k:Linux:*:*) 954 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 955 exit ;; 956 frv:Linux:*:*) 957 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 958 exit ;; 959 hexagon:Linux:*:*) 960 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 961 exit ;; 962 i*86:Linux:*:*) 963 echo ${UNAME_MACHINE}-pc-linux-${LIBC} 964 exit ;; 965 ia64:Linux:*:*) 966 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 967 exit ;; 968 m32r*:Linux:*:*) 969 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 970 exit ;; 971 m68*:Linux:*:*) 972 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 973 exit ;; 974 mips:Linux:*:* | mips64:Linux:*:*) 975 eval $set_cc_for_build 976 sed 's/^ //' << EOF >$dummy.c 977 #undef CPU 978 #undef ${UNAME_MACHINE} 979 #undef ${UNAME_MACHINE}el 980 #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) 981 CPU=${UNAME_MACHINE}el 982 #else 983 #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) 984 CPU=${UNAME_MACHINE} 985 #else 986 CPU= 987 #endif 988 #endif 989 EOF 990 eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` 991 test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } 992 ;; 993 openrisc*:Linux:*:*) 994 echo or1k-unknown-linux-${LIBC} 995 exit ;; 996 or32:Linux:*:* | or1k*:Linux:*:*) 997 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 998 exit ;; 999 padre:Linux:*:*) 1000 echo sparc-unknown-linux-${LIBC} 1001 exit ;; 1002 parisc64:Linux:*:* | hppa64:Linux:*:*) 1003 echo hppa64-unknown-linux-${LIBC} 1004 exit ;; 1005 parisc:Linux:*:* | hppa:Linux:*:*) 1006 # Look for CPU level 1007 case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in 1008 PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; 1009 PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; 1010 *) echo hppa-unknown-linux-${LIBC} ;; 1011 esac 1012 exit ;; 1013 ppc64:Linux:*:*) 1014 echo powerpc64-unknown-linux-${LIBC} 1015 exit ;; 1016 ppc:Linux:*:*) 1017 echo powerpc-unknown-linux-${LIBC} 1018 exit ;; 1019 ppc64le:Linux:*:*) 1020 echo powerpc64le-unknown-linux-${LIBC} 1021 exit ;; 1022 ppcle:Linux:*:*) 1023 echo powerpcle-unknown-linux-${LIBC} 1024 exit ;; 1025 s390:Linux:*:* | s390x:Linux:*:*) 1026 echo ${UNAME_MACHINE}-ibm-linux-${LIBC} 1027 exit ;; 1028 sh64*:Linux:*:*) 1029 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 1030 exit ;; 1031 sh*:Linux:*:*) 1032 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 1033 exit ;; 1034 sparc:Linux:*:* | sparc64:Linux:*:*) 1035 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 1036 exit ;; 1037 tile*:Linux:*:*) 1038 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 1039 exit ;; 1040 vax:Linux:*:*) 1041 echo ${UNAME_MACHINE}-dec-linux-${LIBC} 1042 exit ;; 1043 x86_64:Linux:*:*) 1044 echo ${UNAME_MACHINE}-pc-linux-${LIBC} 1045 exit ;; 1046 xtensa*:Linux:*:*) 1047 echo ${UNAME_MACHINE}-unknown-linux-${LIBC} 1048 exit ;; 1049 i*86:DYNIX/ptx:4*:*) 1050 # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. 1051 # earlier versions are messed up and put the nodename in both 1052 # sysname and nodename. 1053 echo i386-sequent-sysv4 1054 exit ;; 1055 i*86:UNIX_SV:4.2MP:2.*) 1056 # Unixware is an offshoot of SVR4, but it has its own version 1057 # number series starting with 2... 1058 # I am not positive that other SVR4 systems won't match this, 1059 # I just have to hope. -- rms. 1060 # Use sysv4.2uw... so that sysv4* matches it. 1061 echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} 1062 exit ;; 1063 i*86:OS/2:*:*) 1064 # If we were able to find `uname', then EMX Unix compatibility 1065 # is probably installed. 1066 echo ${UNAME_MACHINE}-pc-os2-emx 1067 exit ;; 1068 i*86:XTS-300:*:STOP) 1069 echo ${UNAME_MACHINE}-unknown-stop 1070 exit ;; 1071 i*86:atheos:*:*) 1072 echo ${UNAME_MACHINE}-unknown-atheos 1073 exit ;; 1074 i*86:syllable:*:*) 1075 echo ${UNAME_MACHINE}-pc-syllable 1076 exit ;; 1077 i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) 1078 echo i386-unknown-lynxos${UNAME_RELEASE} 1079 exit ;; 1080 i*86:*DOS:*:*) 1081 echo ${UNAME_MACHINE}-pc-msdosdjgpp 1082 exit ;; 1083 i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) 1084 UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` 1085 if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then 1086 echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} 1087 else 1088 echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} 1089 fi 1090 exit ;; 1091 i*86:*:5:[678]*) 1092 # UnixWare 7.x, OpenUNIX and OpenServer 6. 1093 case `/bin/uname -X | grep "^Machine"` in 1094 *486*) UNAME_MACHINE=i486 ;; 1095 *Pentium) UNAME_MACHINE=i586 ;; 1096 *Pent*|*Celeron) UNAME_MACHINE=i686 ;; 1097 esac 1098 echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} 1099 exit ;; 1100 i*86:*:3.2:*) 1101 if test -f /usr/options/cb.name; then 1102 UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name` 1103 echo ${UNAME_MACHINE}-pc-isc$UNAME_REL 1104 elif /bin/uname -X 2>/dev/null >/dev/null ; then 1105 UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` 1106 (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 1107 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ 1108 && UNAME_MACHINE=i586 1109 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ 1110 && UNAME_MACHINE=i686 1111 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ 1112 && UNAME_MACHINE=i686 1113 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL 1114 else 1115 echo ${UNAME_MACHINE}-pc-sysv32 1116 fi 1117 exit ;; 1118 pc:*:*:*) 1119 # Left here for compatibility: 1120 # uname -m prints for DJGPP always 'pc', but it prints nothing about 1121 # the processor, so we play safe by assuming i586. 1122 # Note: whatever this is, it MUST be the same as what config.sub 1123 # prints for the "djgpp" host, or else GDB configury will decide that 1124 # this is a cross-build. 1125 echo i586-pc-msdosdjgpp 1126 exit ;; 1127 Intel:Mach:3*:*) 1128 echo i386-pc-mach3 1129 exit ;; 1130 paragon:*:*:*) 1131 echo i860-intel-osf1 1132 exit ;; 1133 i860:*:4.*:*) # i860-SVR4 1134 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then 1135 echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 1136 else # Add other i860-SVR4 vendors below as they are discovered. 1137 echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 1138 fi 1139 exit ;; 1140 mini*:CTIX:SYS*5:*) 1141 # "miniframe" 1142 echo m68010-convergent-sysv 1143 exit ;; 1144 mc68k:UNIX:SYSTEM5:3.51m) 1145 echo m68k-convergent-sysv 1146 exit ;; 1147 M680?0:D-NIX:5.3:*) 1148 echo m68k-diab-dnix 1149 exit ;; 1150 M68*:*:R3V[5678]*:*) 1151 test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 1152 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) 1153 OS_REL='' 1154 test -r /etc/.relid \ 1155 && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` 1156 /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ 1157 && { echo i486-ncr-sysv4.3${OS_REL}; exit; } 1158 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ 1159 && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 1160 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) 1161 /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ 1162 && { echo i486-ncr-sysv4; exit; } ;; 1163 NCR*:*:4.2:* | MPRAS*:*:4.2:*) 1164 OS_REL='.3' 1165 test -r /etc/.relid \ 1166 && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` 1167 /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ 1168 && { echo i486-ncr-sysv4.3${OS_REL}; exit; } 1169 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ 1170 && { echo i586-ncr-sysv4.3${OS_REL}; exit; } 1171 /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ 1172 && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 1173 m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) 1174 echo m68k-unknown-lynxos${UNAME_RELEASE} 1175 exit ;; 1176 mc68030:UNIX_System_V:4.*:*) 1177 echo m68k-atari-sysv4 1178 exit ;; 1179 TSUNAMI:LynxOS:2.*:*) 1180 echo sparc-unknown-lynxos${UNAME_RELEASE} 1181 exit ;; 1182 rs6000:LynxOS:2.*:*) 1183 echo rs6000-unknown-lynxos${UNAME_RELEASE} 1184 exit ;; 1185 PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) 1186 echo powerpc-unknown-lynxos${UNAME_RELEASE} 1187 exit ;; 1188 SM[BE]S:UNIX_SV:*:*) 1189 echo mips-dde-sysv${UNAME_RELEASE} 1190 exit ;; 1191 RM*:ReliantUNIX-*:*:*) 1192 echo mips-sni-sysv4 1193 exit ;; 1194 RM*:SINIX-*:*:*) 1195 echo mips-sni-sysv4 1196 exit ;; 1197 *:SINIX-*:*:*) 1198 if uname -p 2>/dev/null >/dev/null ; then 1199 UNAME_MACHINE=`(uname -p) 2>/dev/null` 1200 echo ${UNAME_MACHINE}-sni-sysv4 1201 else 1202 echo ns32k-sni-sysv 1203 fi 1204 exit ;; 1205 PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort 1206 # says <Richard.M.Bartel@ccMail.Census.GOV> 1207 echo i586-unisys-sysv4 1208 exit ;; 1209 *:UNIX_System_V:4*:FTX*) 1210 # From Gerald Hewes <hewes@openmarket.com>. 1211 # How about differentiating between stratus architectures? -djm 1212 echo hppa1.1-stratus-sysv4 1213 exit ;; 1214 *:*:*:FTX*) 1215 # From seanf@swdc.stratus.com. 1216 echo i860-stratus-sysv4 1217 exit ;; 1218 i*86:VOS:*:*) 1219 # From Paul.Green@stratus.com. 1220 echo ${UNAME_MACHINE}-stratus-vos 1221 exit ;; 1222 *:VOS:*:*) 1223 # From Paul.Green@stratus.com. 1224 echo hppa1.1-stratus-vos 1225 exit ;; 1226 mc68*:A/UX:*:*) 1227 echo m68k-apple-aux${UNAME_RELEASE} 1228 exit ;; 1229 news*:NEWS-OS:6*:*) 1230 echo mips-sony-newsos6 1231 exit ;; 1232 R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) 1233 if [ -d /usr/nec ]; then 1234 echo mips-nec-sysv${UNAME_RELEASE} 1235 else 1236 echo mips-unknown-sysv${UNAME_RELEASE} 1237 fi 1238 exit ;; 1239 BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. 1240 echo powerpc-be-beos 1241 exit ;; 1242 BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. 1243 echo powerpc-apple-beos 1244 exit ;; 1245 BePC:BeOS:*:*) # BeOS running on Intel PC compatible. 1246 echo i586-pc-beos 1247 exit ;; 1248 BePC:Haiku:*:*) # Haiku running on Intel PC compatible. 1249 echo i586-pc-haiku 1250 exit ;; 1251 x86_64:Haiku:*:*) 1252 echo x86_64-unknown-haiku 1253 exit ;; 1254 SX-4:SUPER-UX:*:*) 1255 echo sx4-nec-superux${UNAME_RELEASE} 1256 exit ;; 1257 SX-5:SUPER-UX:*:*) 1258 echo sx5-nec-superux${UNAME_RELEASE} 1259 exit ;; 1260 SX-6:SUPER-UX:*:*) 1261 echo sx6-nec-superux${UNAME_RELEASE} 1262 exit ;; 1263 SX-7:SUPER-UX:*:*) 1264 echo sx7-nec-superux${UNAME_RELEASE} 1265 exit ;; 1266 SX-8:SUPER-UX:*:*) 1267 echo sx8-nec-superux${UNAME_RELEASE} 1268 exit ;; 1269 SX-8R:SUPER-UX:*:*) 1270 echo sx8r-nec-superux${UNAME_RELEASE} 1271 exit ;; 1272 Power*:Rhapsody:*:*) 1273 echo powerpc-apple-rhapsody${UNAME_RELEASE} 1274 exit ;; 1275 *:Rhapsody:*:*) 1276 echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} 1277 exit ;; 1278 *:Darwin:*:*) 1279 UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown 1280 eval $set_cc_for_build 1281 if test "$UNAME_PROCESSOR" = unknown ; then 1282 UNAME_PROCESSOR=powerpc 1283 fi 1284 if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then 1285 if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then 1286 if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ 1287 (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ 1288 grep IS_64BIT_ARCH >/dev/null 1289 then 1290 case $UNAME_PROCESSOR in 1291 i386) UNAME_PROCESSOR=x86_64 ;; 1292 powerpc) UNAME_PROCESSOR=powerpc64 ;; 1293 esac 1294 fi 1295 fi 1296 elif test "$UNAME_PROCESSOR" = i386 ; then 1297 # Avoid executing cc on OS X 10.9, as it ships with a stub 1298 # that puts up a graphical alert prompting to install 1299 # developer tools. Any system running Mac OS X 10.7 or 1300 # later (Darwin 11 and later) is required to have a 64-bit 1301 # processor. This is not true of the ARM version of Darwin 1302 # that Apple uses in portable devices. 1303 UNAME_PROCESSOR=x86_64 1304 fi 1305 echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} 1306 exit ;; 1307 *:procnto*:*:* | *:QNX:[0123456789]*:*) 1308 UNAME_PROCESSOR=`uname -p` 1309 if test "$UNAME_PROCESSOR" = "x86"; then 1310 UNAME_PROCESSOR=i386 1311 UNAME_MACHINE=pc 1312 fi 1313 echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} 1314 exit ;; 1315 *:QNX:*:4*) 1316 echo i386-pc-qnx 1317 exit ;; 1318 NEO-?:NONSTOP_KERNEL:*:*) 1319 echo neo-tandem-nsk${UNAME_RELEASE} 1320 exit ;; 1321 NSE-*:NONSTOP_KERNEL:*:*) 1322 echo nse-tandem-nsk${UNAME_RELEASE} 1323 exit ;; 1324 NSR-?:NONSTOP_KERNEL:*:*) 1325 echo nsr-tandem-nsk${UNAME_RELEASE} 1326 exit ;; 1327 *:NonStop-UX:*:*) 1328 echo mips-compaq-nonstopux 1329 exit ;; 1330 BS2000:POSIX*:*:*) 1331 echo bs2000-siemens-sysv 1332 exit ;; 1333 DS/*:UNIX_System_V:*:*) 1334 echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} 1335 exit ;; 1336 *:Plan9:*:*) 1337 # "uname -m" is not consistent, so use $cputype instead. 386 1338 # is converted to i386 for consistency with other x86 1339 # operating systems. 1340 if test "$cputype" = "386"; then 1341 UNAME_MACHINE=i386 1342 else 1343 UNAME_MACHINE="$cputype" 1344 fi 1345 echo ${UNAME_MACHINE}-unknown-plan9 1346 exit ;; 1347 *:TOPS-10:*:*) 1348 echo pdp10-unknown-tops10 1349 exit ;; 1350 *:TENEX:*:*) 1351 echo pdp10-unknown-tenex 1352 exit ;; 1353 KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) 1354 echo pdp10-dec-tops20 1355 exit ;; 1356 XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) 1357 echo pdp10-xkl-tops20 1358 exit ;; 1359 *:TOPS-20:*:*) 1360 echo pdp10-unknown-tops20 1361 exit ;; 1362 *:ITS:*:*) 1363 echo pdp10-unknown-its 1364 exit ;; 1365 SEI:*:*:SEIUX) 1366 echo mips-sei-seiux${UNAME_RELEASE} 1367 exit ;; 1368 *:DragonFly:*:*) 1369 echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` 1370 exit ;; 1371 *:*VMS:*:*) 1372 UNAME_MACHINE=`(uname -p) 2>/dev/null` 1373 case "${UNAME_MACHINE}" in 1374 A*) echo alpha-dec-vms ; exit ;; 1375 I*) echo ia64-dec-vms ; exit ;; 1376 V*) echo vax-dec-vms ; exit ;; 1377 esac ;; 1378 *:XENIX:*:SysV) 1379 echo i386-pc-xenix 1380 exit ;; 1381 i*86:skyos:*:*) 1382 echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' 1383 exit ;; 1384 i*86:rdos:*:*) 1385 echo ${UNAME_MACHINE}-pc-rdos 1386 exit ;; 1387 i*86:AROS:*:*) 1388 echo ${UNAME_MACHINE}-pc-aros 1389 exit ;; 1390 x86_64:VMkernel:*:*) 1391 echo ${UNAME_MACHINE}-unknown-esx 1392 exit ;; 1393 esac 1394 1395 cat >&2 <<EOF 1396 $0: unable to guess system type 1397 1398 This script, last modified $timestamp, has failed to recognize 1399 the operating system you are using. It is advised that you 1400 download the most up to date version of the config scripts from 1401 1402 http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD 1403 and 1404 http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD 1405 1406 If the version you run ($0) is already up to date, please 1407 send the following data and any information you think might be 1408 pertinent to <config-patches@gnu.org> in order to provide the needed 1409 information to handle your system. 1410 1411 config.guess timestamp = $timestamp 1412 1413 uname -m = `(uname -m) 2>/dev/null || echo unknown` 1414 uname -r = `(uname -r) 2>/dev/null || echo unknown` 1415 uname -s = `(uname -s) 2>/dev/null || echo unknown` 1416 uname -v = `(uname -v) 2>/dev/null || echo unknown` 1417 1418 /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` 1419 /bin/uname -X = `(/bin/uname -X) 2>/dev/null` 1420 1421 hostinfo = `(hostinfo) 2>/dev/null` 1422 /bin/universe = `(/bin/universe) 2>/dev/null` 1423 /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` 1424 /bin/arch = `(/bin/arch) 2>/dev/null` 1425 /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` 1426 /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` 1427 1428 UNAME_MACHINE = ${UNAME_MACHINE} 1429 UNAME_RELEASE = ${UNAME_RELEASE} 1430 UNAME_SYSTEM = ${UNAME_SYSTEM} 1431 UNAME_VERSION = ${UNAME_VERSION} 1432 EOF 1433 1434 exit 1 1435 1436 # Local variables: 1437 # eval: (add-hook 'write-file-hooks 'time-stamp) 1438 # time-stamp-start: "timestamp='" 1439 # time-stamp-format: "%:y-%02m-%02d" 1440 # time-stamp-end: "'" 1441 # End: 1 /usr/share/automake-1.15/config.guess -
Property mode
changed from
-
automake/config.sub
-
Property mode
changed from
100755to120000
rcd7ef0b r275f4b4 1 #! /bin/sh 2 # Configuration validation subroutine script. 3 # Copyright 1992-2015 Free Software Foundation, Inc. 4 5 timestamp='2015-08-20' 6 7 # This file is free software; you can redistribute it and/or modify it 8 # under the terms of the GNU General Public License as published by 9 # the Free Software Foundation; either version 3 of the License, or 10 # (at your option) any later version. 11 # 12 # This program is distributed in the hope that it will be useful, but 13 # WITHOUT ANY WARRANTY; without even the implied warranty of 14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 # General Public License for more details. 16 # 17 # You should have received a copy of the GNU General Public License 18 # along with this program; if not, see <http://www.gnu.org/licenses/>. 19 # 20 # As a special exception to the GNU General Public License, if you 21 # distribute this file as part of a program that contains a 22 # configuration script generated by Autoconf, you may include it under 23 # the same distribution terms that you use for the rest of that 24 # program. This Exception is an additional permission under section 7 25 # of the GNU General Public License, version 3 ("GPLv3"). 26 27 28 # Please send patches to <config-patches@gnu.org>. 29 # 30 # Configuration subroutine to validate and canonicalize a configuration type. 31 # Supply the specified configuration type as an argument. 32 # If it is invalid, we print an error message on stderr and exit with code 1. 33 # Otherwise, we print the canonical config type on stdout and succeed. 34 35 # You can get the latest version of this script from: 36 # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD 37 38 # This file is supposed to be the same for all GNU packages 39 # and recognize all the CPU types, system types and aliases 40 # that are meaningful with *any* GNU software. 41 # Each package is responsible for reporting which valid configurations 42 # it does not support. The user should be able to distinguish 43 # a failure to support a valid configuration from a meaningless 44 # configuration. 45 46 # The goal of this file is to map all the various variations of a given 47 # machine specification into a single specification in the form: 48 # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM 49 # or in some cases, the newer four-part form: 50 # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM 51 # It is wrong to echo any other type of specification. 52 53 me=`echo "$0" | sed -e 's,.*/,,'` 54 55 usage="\ 56 Usage: $0 [OPTION] CPU-MFR-OPSYS 57 $0 [OPTION] ALIAS 58 59 Canonicalize a configuration name. 60 61 Operation modes: 62 -h, --help print this help, then exit 63 -t, --time-stamp print date of last modification, then exit 64 -v, --version print version number, then exit 65 66 Report bugs and patches to <config-patches@gnu.org>." 67 68 version="\ 69 GNU config.sub ($timestamp) 70 71 Copyright 1992-2015 Free Software Foundation, Inc. 72 73 This is free software; see the source for copying conditions. There is NO 74 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." 75 76 help=" 77 Try \`$me --help' for more information." 78 79 # Parse command line 80 while test $# -gt 0 ; do 81 case $1 in 82 --time-stamp | --time* | -t ) 83 echo "$timestamp" ; exit ;; 84 --version | -v ) 85 echo "$version" ; exit ;; 86 --help | --h* | -h ) 87 echo "$usage"; exit ;; 88 -- ) # Stop option processing 89 shift; break ;; 90 - ) # Use stdin as input. 91 break ;; 92 -* ) 93 echo "$me: invalid option $1$help" 94 exit 1 ;; 95 96 *local*) 97 # First pass through any local machine types. 98 echo $1 99 exit ;; 100 101 * ) 102 break ;; 103 esac 104 done 105 106 case $# in 107 0) echo "$me: missing argument$help" >&2 108 exit 1;; 109 1) ;; 110 *) echo "$me: too many arguments$help" >&2 111 exit 1;; 112 esac 113 114 # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). 115 # Here we must recognize all the valid KERNEL-OS combinations. 116 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` 117 case $maybe_os in 118 nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ 119 linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ 120 knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ 121 kopensolaris*-gnu* | \ 122 storm-chaos* | os2-emx* | rtmk-nova*) 123 os=-$maybe_os 124 basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` 125 ;; 126 android-linux) 127 os=-linux-android 128 basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown 129 ;; 130 *) 131 basic_machine=`echo $1 | sed 's/-[^-]*$//'` 132 if [ $basic_machine != $1 ] 133 then os=`echo $1 | sed 's/.*-/-/'` 134 else os=; fi 135 ;; 136 esac 137 138 ### Let's recognize common machines as not being operating systems so 139 ### that things like config.sub decstation-3100 work. We also 140 ### recognize some manufacturers as not being operating systems, so we 141 ### can provide default operating systems below. 142 case $os in 143 -sun*os*) 144 # Prevent following clause from handling this invalid input. 145 ;; 146 -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ 147 -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ 148 -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ 149 -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ 150 -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ 151 -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ 152 -apple | -axis | -knuth | -cray | -microblaze*) 153 os= 154 basic_machine=$1 155 ;; 156 -bluegene*) 157 os=-cnk 158 ;; 159 -sim | -cisco | -oki | -wec | -winbond) 160 os= 161 basic_machine=$1 162 ;; 163 -scout) 164 ;; 165 -wrs) 166 os=-vxworks 167 basic_machine=$1 168 ;; 169 -chorusos*) 170 os=-chorusos 171 basic_machine=$1 172 ;; 173 -chorusrdb) 174 os=-chorusrdb 175 basic_machine=$1 176 ;; 177 -hiux*) 178 os=-hiuxwe2 179 ;; 180 -sco6) 181 os=-sco5v6 182 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 183 ;; 184 -sco5) 185 os=-sco3.2v5 186 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 187 ;; 188 -sco4) 189 os=-sco3.2v4 190 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 191 ;; 192 -sco3.2.[4-9]*) 193 os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` 194 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 195 ;; 196 -sco3.2v[4-9]*) 197 # Don't forget version if it is 3.2v4 or newer. 198 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 199 ;; 200 -sco5v6*) 201 # Don't forget version if it is 3.2v4 or newer. 202 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 203 ;; 204 -sco*) 205 os=-sco3.2v2 206 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 207 ;; 208 -udk*) 209 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 210 ;; 211 -isc) 212 os=-isc2.2 213 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 214 ;; 215 -clix*) 216 basic_machine=clipper-intergraph 217 ;; 218 -isc*) 219 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` 220 ;; 221 -lynx*178) 222 os=-lynxos178 223 ;; 224 -lynx*5) 225 os=-lynxos5 226 ;; 227 -lynx*) 228 os=-lynxos 229 ;; 230 -ptx*) 231 basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` 232 ;; 233 -windowsnt*) 234 os=`echo $os | sed -e 's/windowsnt/winnt/'` 235 ;; 236 -psos*) 237 os=-psos 238 ;; 239 -mint | -mint[0-9]*) 240 basic_machine=m68k-atari 241 os=-mint 242 ;; 243 esac 244 245 # Decode aliases for certain CPU-COMPANY combinations. 246 case $basic_machine in 247 # Recognize the basic CPU types without company name. 248 # Some are omitted here because they have special meanings below. 249 1750a | 580 \ 250 | a29k \ 251 | aarch64 | aarch64_be \ 252 | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ 253 | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ 254 | am33_2.0 \ 255 | arc | arceb \ 256 | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ 257 | avr | avr32 \ 258 | ba \ 259 | be32 | be64 \ 260 | bfin \ 261 | c4x | c8051 | clipper \ 262 | d10v | d30v | dlx | dsp16xx \ 263 | e2k | epiphany \ 264 | fido | fr30 | frv | ft32 \ 265 | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ 266 | hexagon \ 267 | i370 | i860 | i960 | ia64 \ 268 | ip2k | iq2000 \ 269 | k1om \ 270 | le32 | le64 \ 271 | lm32 \ 272 | m32c | m32r | m32rle | m68000 | m68k | m88k \ 273 | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ 274 | mips | mipsbe | mipseb | mipsel | mipsle \ 275 | mips16 \ 276 | mips64 | mips64el \ 277 | mips64octeon | mips64octeonel \ 278 | mips64orion | mips64orionel \ 279 | mips64r5900 | mips64r5900el \ 280 | mips64vr | mips64vrel \ 281 | mips64vr4100 | mips64vr4100el \ 282 | mips64vr4300 | mips64vr4300el \ 283 | mips64vr5000 | mips64vr5000el \ 284 | mips64vr5900 | mips64vr5900el \ 285 | mipsisa32 | mipsisa32el \ 286 | mipsisa32r2 | mipsisa32r2el \ 287 | mipsisa32r6 | mipsisa32r6el \ 288 | mipsisa64 | mipsisa64el \ 289 | mipsisa64r2 | mipsisa64r2el \ 290 | mipsisa64r6 | mipsisa64r6el \ 291 | mipsisa64sb1 | mipsisa64sb1el \ 292 | mipsisa64sr71k | mipsisa64sr71kel \ 293 | mipsr5900 | mipsr5900el \ 294 | mipstx39 | mipstx39el \ 295 | mn10200 | mn10300 \ 296 | moxie \ 297 | mt \ 298 | msp430 \ 299 | nds32 | nds32le | nds32be \ 300 | nios | nios2 | nios2eb | nios2el \ 301 | ns16k | ns32k \ 302 | open8 | or1k | or1knd | or32 \ 303 | pdp10 | pdp11 | pj | pjl \ 304 | powerpc | powerpc64 | powerpc64le | powerpcle \ 305 | pyramid \ 306 | riscv32 | riscv64 \ 307 | rl78 | rx \ 308 | score \ 309 | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ 310 | sh64 | sh64le \ 311 | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ 312 | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ 313 | spu \ 314 | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ 315 | ubicom32 \ 316 | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ 317 | visium \ 318 | we32k \ 319 | x86 | xc16x | xstormy16 | xtensa \ 320 | z8k | z80) 321 basic_machine=$basic_machine-unknown 322 ;; 323 c54x) 324 basic_machine=tic54x-unknown 325 ;; 326 c55x) 327 basic_machine=tic55x-unknown 328 ;; 329 c6x) 330 basic_machine=tic6x-unknown 331 ;; 332 leon|leon[3-9]) 333 basic_machine=sparc-$basic_machine 334 ;; 335 m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) 336 basic_machine=$basic_machine-unknown 337 os=-none 338 ;; 339 m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) 340 ;; 341 ms1) 342 basic_machine=mt-unknown 343 ;; 344 345 strongarm | thumb | xscale) 346 basic_machine=arm-unknown 347 ;; 348 xgate) 349 basic_machine=$basic_machine-unknown 350 os=-none 351 ;; 352 xscaleeb) 353 basic_machine=armeb-unknown 354 ;; 355 356 xscaleel) 357 basic_machine=armel-unknown 358 ;; 359 360 # We use `pc' rather than `unknown' 361 # because (1) that's what they normally are, and 362 # (2) the word "unknown" tends to confuse beginning users. 363 i*86 | x86_64) 364 basic_machine=$basic_machine-pc 365 ;; 366 # Object if more than one company name word. 367 *-*-*) 368 echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 369 exit 1 370 ;; 371 # Recognize the basic CPU types with company name. 372 580-* \ 373 | a29k-* \ 374 | aarch64-* | aarch64_be-* \ 375 | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ 376 | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ 377 | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ 378 | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ 379 | avr-* | avr32-* \ 380 | ba-* \ 381 | be32-* | be64-* \ 382 | bfin-* | bs2000-* \ 383 | c[123]* | c30-* | [cjt]90-* | c4x-* \ 384 | c8051-* | clipper-* | craynv-* | cydra-* \ 385 | d10v-* | d30v-* | dlx-* \ 386 | e2k-* | elxsi-* \ 387 | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ 388 | h8300-* | h8500-* \ 389 | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ 390 | hexagon-* \ 391 | i*86-* | i860-* | i960-* | ia64-* \ 392 | ip2k-* | iq2000-* \ 393 | k1om-* \ 394 | le32-* | le64-* \ 395 | lm32-* \ 396 | m32c-* | m32r-* | m32rle-* \ 397 | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ 398 | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ 399 | microblaze-* | microblazeel-* \ 400 | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ 401 | mips16-* \ 402 | mips64-* | mips64el-* \ 403 | mips64octeon-* | mips64octeonel-* \ 404 | mips64orion-* | mips64orionel-* \ 405 | mips64r5900-* | mips64r5900el-* \ 406 | mips64vr-* | mips64vrel-* \ 407 | mips64vr4100-* | mips64vr4100el-* \ 408 | mips64vr4300-* | mips64vr4300el-* \ 409 | mips64vr5000-* | mips64vr5000el-* \ 410 | mips64vr5900-* | mips64vr5900el-* \ 411 | mipsisa32-* | mipsisa32el-* \ 412 | mipsisa32r2-* | mipsisa32r2el-* \ 413 | mipsisa32r6-* | mipsisa32r6el-* \ 414 | mipsisa64-* | mipsisa64el-* \ 415 | mipsisa64r2-* | mipsisa64r2el-* \ 416 | mipsisa64r6-* | mipsisa64r6el-* \ 417 | mipsisa64sb1-* | mipsisa64sb1el-* \ 418 | mipsisa64sr71k-* | mipsisa64sr71kel-* \ 419 | mipsr5900-* | mipsr5900el-* \ 420 | mipstx39-* | mipstx39el-* \ 421 | mmix-* \ 422 | mt-* \ 423 | msp430-* \ 424 | nds32-* | nds32le-* | nds32be-* \ 425 | nios-* | nios2-* | nios2eb-* | nios2el-* \ 426 | none-* | np1-* | ns16k-* | ns32k-* \ 427 | open8-* \ 428 | or1k*-* \ 429 | orion-* \ 430 | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ 431 | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ 432 | pyramid-* \ 433 | riscv32-* | riscv64-* \ 434 | rl78-* | romp-* | rs6000-* | rx-* \ 435 | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ 436 | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ 437 | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ 438 | sparclite-* \ 439 | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ 440 | tahoe-* \ 441 | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ 442 | tile*-* \ 443 | tron-* \ 444 | ubicom32-* \ 445 | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ 446 | vax-* \ 447 | visium-* \ 448 | we32k-* \ 449 | x86-* | x86_64-* | xc16x-* | xps100-* \ 450 | xstormy16-* | xtensa*-* \ 451 | ymp-* \ 452 | z8k-* | z80-*) 453 ;; 454 # Recognize the basic CPU types without company name, with glob match. 455 xtensa*) 456 basic_machine=$basic_machine-unknown 457 ;; 458 # Recognize the various machine names and aliases which stand 459 # for a CPU type and a company and sometimes even an OS. 460 386bsd) 461 basic_machine=i386-unknown 462 os=-bsd 463 ;; 464 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) 465 basic_machine=m68000-att 466 ;; 467 3b*) 468 basic_machine=we32k-att 469 ;; 470 a29khif) 471 basic_machine=a29k-amd 472 os=-udi 473 ;; 474 abacus) 475 basic_machine=abacus-unknown 476 ;; 477 adobe68k) 478 basic_machine=m68010-adobe 479 os=-scout 480 ;; 481 alliant | fx80) 482 basic_machine=fx80-alliant 483 ;; 484 altos | altos3068) 485 basic_machine=m68k-altos 486 ;; 487 am29k) 488 basic_machine=a29k-none 489 os=-bsd 490 ;; 491 amd64) 492 basic_machine=x86_64-pc 493 ;; 494 amd64-*) 495 basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` 496 ;; 497 amdahl) 498 basic_machine=580-amdahl 499 os=-sysv 500 ;; 501 amiga | amiga-*) 502 basic_machine=m68k-unknown 503 ;; 504 amigaos | amigados) 505 basic_machine=m68k-unknown 506 os=-amigaos 507 ;; 508 amigaunix | amix) 509 basic_machine=m68k-unknown 510 os=-sysv4 511 ;; 512 apollo68) 513 basic_machine=m68k-apollo 514 os=-sysv 515 ;; 516 apollo68bsd) 517 basic_machine=m68k-apollo 518 os=-bsd 519 ;; 520 aros) 521 basic_machine=i386-pc 522 os=-aros 523 ;; 524 asmjs) 525 basic_machine=asmjs-unknown 526 ;; 527 aux) 528 basic_machine=m68k-apple 529 os=-aux 530 ;; 531 balance) 532 basic_machine=ns32k-sequent 533 os=-dynix 534 ;; 535 blackfin) 536 basic_machine=bfin-unknown 537 os=-linux 538 ;; 539 blackfin-*) 540 basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` 541 os=-linux 542 ;; 543 bluegene*) 544 basic_machine=powerpc-ibm 545 os=-cnk 546 ;; 547 c54x-*) 548 basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` 549 ;; 550 c55x-*) 551 basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` 552 ;; 553 c6x-*) 554 basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` 555 ;; 556 c90) 557 basic_machine=c90-cray 558 os=-unicos 559 ;; 560 cegcc) 561 basic_machine=arm-unknown 562 os=-cegcc 563 ;; 564 convex-c1) 565 basic_machine=c1-convex 566 os=-bsd 567 ;; 568 convex-c2) 569 basic_machine=c2-convex 570 os=-bsd 571 ;; 572 convex-c32) 573 basic_machine=c32-convex 574 os=-bsd 575 ;; 576 convex-c34) 577 basic_machine=c34-convex 578 os=-bsd 579 ;; 580 convex-c38) 581 basic_machine=c38-convex 582 os=-bsd 583 ;; 584 cray | j90) 585 basic_machine=j90-cray 586 os=-unicos 587 ;; 588 craynv) 589 basic_machine=craynv-cray 590 os=-unicosmp 591 ;; 592 cr16 | cr16-*) 593 basic_machine=cr16-unknown 594 os=-elf 595 ;; 596 crds | unos) 597 basic_machine=m68k-crds 598 ;; 599 crisv32 | crisv32-* | etraxfs*) 600 basic_machine=crisv32-axis 601 ;; 602 cris | cris-* | etrax*) 603 basic_machine=cris-axis 604 ;; 605 crx) 606 basic_machine=crx-unknown 607 os=-elf 608 ;; 609 da30 | da30-*) 610 basic_machine=m68k-da30 611 ;; 612 decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) 613 basic_machine=mips-dec 614 ;; 615 decsystem10* | dec10*) 616 basic_machine=pdp10-dec 617 os=-tops10 618 ;; 619 decsystem20* | dec20*) 620 basic_machine=pdp10-dec 621 os=-tops20 622 ;; 623 delta | 3300 | motorola-3300 | motorola-delta \ 624 | 3300-motorola | delta-motorola) 625 basic_machine=m68k-motorola 626 ;; 627 delta88) 628 basic_machine=m88k-motorola 629 os=-sysv3 630 ;; 631 dicos) 632 basic_machine=i686-pc 633 os=-dicos 634 ;; 635 djgpp) 636 basic_machine=i586-pc 637 os=-msdosdjgpp 638 ;; 639 dpx20 | dpx20-*) 640 basic_machine=rs6000-bull 641 os=-bosx 642 ;; 643 dpx2* | dpx2*-bull) 644 basic_machine=m68k-bull 645 os=-sysv3 646 ;; 647 ebmon29k) 648 basic_machine=a29k-amd 649 os=-ebmon 650 ;; 651 elxsi) 652 basic_machine=elxsi-elxsi 653 os=-bsd 654 ;; 655 encore | umax | mmax) 656 basic_machine=ns32k-encore 657 ;; 658 es1800 | OSE68k | ose68k | ose | OSE) 659 basic_machine=m68k-ericsson 660 os=-ose 661 ;; 662 fx2800) 663 basic_machine=i860-alliant 664 ;; 665 genix) 666 basic_machine=ns32k-ns 667 ;; 668 gmicro) 669 basic_machine=tron-gmicro 670 os=-sysv 671 ;; 672 go32) 673 basic_machine=i386-pc 674 os=-go32 675 ;; 676 h3050r* | hiux*) 677 basic_machine=hppa1.1-hitachi 678 os=-hiuxwe2 679 ;; 680 h8300hms) 681 basic_machine=h8300-hitachi 682 os=-hms 683 ;; 684 h8300xray) 685 basic_machine=h8300-hitachi 686 os=-xray 687 ;; 688 h8500hms) 689 basic_machine=h8500-hitachi 690 os=-hms 691 ;; 692 harris) 693 basic_machine=m88k-harris 694 os=-sysv3 695 ;; 696 hp300-*) 697 basic_machine=m68k-hp 698 ;; 699 hp300bsd) 700 basic_machine=m68k-hp 701 os=-bsd 702 ;; 703 hp300hpux) 704 basic_machine=m68k-hp 705 os=-hpux 706 ;; 707 hp3k9[0-9][0-9] | hp9[0-9][0-9]) 708 basic_machine=hppa1.0-hp 709 ;; 710 hp9k2[0-9][0-9] | hp9k31[0-9]) 711 basic_machine=m68000-hp 712 ;; 713 hp9k3[2-9][0-9]) 714 basic_machine=m68k-hp 715 ;; 716 hp9k6[0-9][0-9] | hp6[0-9][0-9]) 717 basic_machine=hppa1.0-hp 718 ;; 719 hp9k7[0-79][0-9] | hp7[0-79][0-9]) 720 basic_machine=hppa1.1-hp 721 ;; 722 hp9k78[0-9] | hp78[0-9]) 723 # FIXME: really hppa2.0-hp 724 basic_machine=hppa1.1-hp 725 ;; 726 hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) 727 # FIXME: really hppa2.0-hp 728 basic_machine=hppa1.1-hp 729 ;; 730 hp9k8[0-9][13679] | hp8[0-9][13679]) 731 basic_machine=hppa1.1-hp 732 ;; 733 hp9k8[0-9][0-9] | hp8[0-9][0-9]) 734 basic_machine=hppa1.0-hp 735 ;; 736 hppa-next) 737 os=-nextstep3 738 ;; 739 hppaosf) 740 basic_machine=hppa1.1-hp 741 os=-osf 742 ;; 743 hppro) 744 basic_machine=hppa1.1-hp 745 os=-proelf 746 ;; 747 i370-ibm* | ibm*) 748 basic_machine=i370-ibm 749 ;; 750 i*86v32) 751 basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` 752 os=-sysv32 753 ;; 754 i*86v4*) 755 basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` 756 os=-sysv4 757 ;; 758 i*86v) 759 basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` 760 os=-sysv 761 ;; 762 i*86sol2) 763 basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` 764 os=-solaris2 765 ;; 766 i386mach) 767 basic_machine=i386-mach 768 os=-mach 769 ;; 770 i386-vsta | vsta) 771 basic_machine=i386-unknown 772 os=-vsta 773 ;; 774 iris | iris4d) 775 basic_machine=mips-sgi 776 case $os in 777 -irix*) 778 ;; 779 *) 780 os=-irix4 781 ;; 782 esac 783 ;; 784 isi68 | isi) 785 basic_machine=m68k-isi 786 os=-sysv 787 ;; 788 leon-*|leon[3-9]-*) 789 basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` 790 ;; 791 m68knommu) 792 basic_machine=m68k-unknown 793 os=-linux 794 ;; 795 m68knommu-*) 796 basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` 797 os=-linux 798 ;; 799 m88k-omron*) 800 basic_machine=m88k-omron 801 ;; 802 magnum | m3230) 803 basic_machine=mips-mips 804 os=-sysv 805 ;; 806 merlin) 807 basic_machine=ns32k-utek 808 os=-sysv 809 ;; 810 microblaze*) 811 basic_machine=microblaze-xilinx 812 ;; 813 mingw64) 814 basic_machine=x86_64-pc 815 os=-mingw64 816 ;; 817 mingw32) 818 basic_machine=i686-pc 819 os=-mingw32 820 ;; 821 mingw32ce) 822 basic_machine=arm-unknown 823 os=-mingw32ce 824 ;; 825 miniframe) 826 basic_machine=m68000-convergent 827 ;; 828 *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) 829 basic_machine=m68k-atari 830 os=-mint 831 ;; 832 mips3*-*) 833 basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` 834 ;; 835 mips3*) 836 basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown 837 ;; 838 monitor) 839 basic_machine=m68k-rom68k 840 os=-coff 841 ;; 842 morphos) 843 basic_machine=powerpc-unknown 844 os=-morphos 845 ;; 846 moxiebox) 847 basic_machine=moxie-unknown 848 os=-moxiebox 849 ;; 850 msdos) 851 basic_machine=i386-pc 852 os=-msdos 853 ;; 854 ms1-*) 855 basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` 856 ;; 857 msys) 858 basic_machine=i686-pc 859 os=-msys 860 ;; 861 mvs) 862 basic_machine=i370-ibm 863 os=-mvs 864 ;; 865 nacl) 866 basic_machine=le32-unknown 867 os=-nacl 868 ;; 869 ncr3000) 870 basic_machine=i486-ncr 871 os=-sysv4 872 ;; 873 netbsd386) 874 basic_machine=i386-unknown 875 os=-netbsd 876 ;; 877 netwinder) 878 basic_machine=armv4l-rebel 879 os=-linux 880 ;; 881 news | news700 | news800 | news900) 882 basic_machine=m68k-sony 883 os=-newsos 884 ;; 885 news1000) 886 basic_machine=m68030-sony 887 os=-newsos 888 ;; 889 news-3600 | risc-news) 890 basic_machine=mips-sony 891 os=-newsos 892 ;; 893 necv70) 894 basic_machine=v70-nec 895 os=-sysv 896 ;; 897 next | m*-next ) 898 basic_machine=m68k-next 899 case $os in 900 -nextstep* ) 901 ;; 902 -ns2*) 903 os=-nextstep2 904 ;; 905 *) 906 os=-nextstep3 907 ;; 908 esac 909 ;; 910 nh3000) 911 basic_machine=m68k-harris 912 os=-cxux 913 ;; 914 nh[45]000) 915 basic_machine=m88k-harris 916 os=-cxux 917 ;; 918 nindy960) 919 basic_machine=i960-intel 920 os=-nindy 921 ;; 922 mon960) 923 basic_machine=i960-intel 924 os=-mon960 925 ;; 926 nonstopux) 927 basic_machine=mips-compaq 928 os=-nonstopux 929 ;; 930 np1) 931 basic_machine=np1-gould 932 ;; 933 neo-tandem) 934 basic_machine=neo-tandem 935 ;; 936 nse-tandem) 937 basic_machine=nse-tandem 938 ;; 939 nsr-tandem) 940 basic_machine=nsr-tandem 941 ;; 942 op50n-* | op60c-*) 943 basic_machine=hppa1.1-oki 944 os=-proelf 945 ;; 946 openrisc | openrisc-*) 947 basic_machine=or32-unknown 948 ;; 949 os400) 950 basic_machine=powerpc-ibm 951 os=-os400 952 ;; 953 OSE68000 | ose68000) 954 basic_machine=m68000-ericsson 955 os=-ose 956 ;; 957 os68k) 958 basic_machine=m68k-none 959 os=-os68k 960 ;; 961 pa-hitachi) 962 basic_machine=hppa1.1-hitachi 963 os=-hiuxwe2 964 ;; 965 paragon) 966 basic_machine=i860-intel 967 os=-osf 968 ;; 969 parisc) 970 basic_machine=hppa-unknown 971 os=-linux 972 ;; 973 parisc-*) 974 basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` 975 os=-linux 976 ;; 977 pbd) 978 basic_machine=sparc-tti 979 ;; 980 pbb) 981 basic_machine=m68k-tti 982 ;; 983 pc532 | pc532-*) 984 basic_machine=ns32k-pc532 985 ;; 986 pc98) 987 basic_machine=i386-pc 988 ;; 989 pc98-*) 990 basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` 991 ;; 992 pentium | p5 | k5 | k6 | nexgen | viac3) 993 basic_machine=i586-pc 994 ;; 995 pentiumpro | p6 | 6x86 | athlon | athlon_*) 996 basic_machine=i686-pc 997 ;; 998 pentiumii | pentium2 | pentiumiii | pentium3) 999 basic_machine=i686-pc 1000 ;; 1001 pentium4) 1002 basic_machine=i786-pc 1003 ;; 1004 pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) 1005 basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` 1006 ;; 1007 pentiumpro-* | p6-* | 6x86-* | athlon-*) 1008 basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` 1009 ;; 1010 pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) 1011 basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` 1012 ;; 1013 pentium4-*) 1014 basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` 1015 ;; 1016 pn) 1017 basic_machine=pn-gould 1018 ;; 1019 power) basic_machine=power-ibm 1020 ;; 1021 ppc | ppcbe) basic_machine=powerpc-unknown 1022 ;; 1023 ppc-* | ppcbe-*) 1024 basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` 1025 ;; 1026 ppcle | powerpclittle | ppc-le | powerpc-little) 1027 basic_machine=powerpcle-unknown 1028 ;; 1029 ppcle-* | powerpclittle-*) 1030 basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` 1031 ;; 1032 ppc64) basic_machine=powerpc64-unknown 1033 ;; 1034 ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` 1035 ;; 1036 ppc64le | powerpc64little | ppc64-le | powerpc64-little) 1037 basic_machine=powerpc64le-unknown 1038 ;; 1039 ppc64le-* | powerpc64little-*) 1040 basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` 1041 ;; 1042 ps2) 1043 basic_machine=i386-ibm 1044 ;; 1045 pw32) 1046 basic_machine=i586-unknown 1047 os=-pw32 1048 ;; 1049 rdos | rdos64) 1050 basic_machine=x86_64-pc 1051 os=-rdos 1052 ;; 1053 rdos32) 1054 basic_machine=i386-pc 1055 os=-rdos 1056 ;; 1057 rom68k) 1058 basic_machine=m68k-rom68k 1059 os=-coff 1060 ;; 1061 rm[46]00) 1062 basic_machine=mips-siemens 1063 ;; 1064 rtpc | rtpc-*) 1065 basic_machine=romp-ibm 1066 ;; 1067 s390 | s390-*) 1068 basic_machine=s390-ibm 1069 ;; 1070 s390x | s390x-*) 1071 basic_machine=s390x-ibm 1072 ;; 1073 sa29200) 1074 basic_machine=a29k-amd 1075 os=-udi 1076 ;; 1077 sb1) 1078 basic_machine=mipsisa64sb1-unknown 1079 ;; 1080 sb1el) 1081 basic_machine=mipsisa64sb1el-unknown 1082 ;; 1083 sde) 1084 basic_machine=mipsisa32-sde 1085 os=-elf 1086 ;; 1087 sei) 1088 basic_machine=mips-sei 1089 os=-seiux 1090 ;; 1091 sequent) 1092 basic_machine=i386-sequent 1093 ;; 1094 sh) 1095 basic_machine=sh-hitachi 1096 os=-hms 1097 ;; 1098 sh5el) 1099 basic_machine=sh5le-unknown 1100 ;; 1101 sh64) 1102 basic_machine=sh64-unknown 1103 ;; 1104 sparclite-wrs | simso-wrs) 1105 basic_machine=sparclite-wrs 1106 os=-vxworks 1107 ;; 1108 sps7) 1109 basic_machine=m68k-bull 1110 os=-sysv2 1111 ;; 1112 spur) 1113 basic_machine=spur-unknown 1114 ;; 1115 st2000) 1116 basic_machine=m68k-tandem 1117 ;; 1118 stratus) 1119 basic_machine=i860-stratus 1120 os=-sysv4 1121 ;; 1122 strongarm-* | thumb-*) 1123 basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` 1124 ;; 1125 sun2) 1126 basic_machine=m68000-sun 1127 ;; 1128 sun2os3) 1129 basic_machine=m68000-sun 1130 os=-sunos3 1131 ;; 1132 sun2os4) 1133 basic_machine=m68000-sun 1134 os=-sunos4 1135 ;; 1136 sun3os3) 1137 basic_machine=m68k-sun 1138 os=-sunos3 1139 ;; 1140 sun3os4) 1141 basic_machine=m68k-sun 1142 os=-sunos4 1143 ;; 1144 sun4os3) 1145 basic_machine=sparc-sun 1146 os=-sunos3 1147 ;; 1148 sun4os4) 1149 basic_machine=sparc-sun 1150 os=-sunos4 1151 ;; 1152 sun4sol2) 1153 basic_machine=sparc-sun 1154 os=-solaris2 1155 ;; 1156 sun3 | sun3-*) 1157 basic_machine=m68k-sun 1158 ;; 1159 sun4) 1160 basic_machine=sparc-sun 1161 ;; 1162 sun386 | sun386i | roadrunner) 1163 basic_machine=i386-sun 1164 ;; 1165 sv1) 1166 basic_machine=sv1-cray 1167 os=-unicos 1168 ;; 1169 symmetry) 1170 basic_machine=i386-sequent 1171 os=-dynix 1172 ;; 1173 t3e) 1174 basic_machine=alphaev5-cray 1175 os=-unicos 1176 ;; 1177 t90) 1178 basic_machine=t90-cray 1179 os=-unicos 1180 ;; 1181 tile*) 1182 basic_machine=$basic_machine-unknown 1183 os=-linux-gnu 1184 ;; 1185 tx39) 1186 basic_machine=mipstx39-unknown 1187 ;; 1188 tx39el) 1189 basic_machine=mipstx39el-unknown 1190 ;; 1191 toad1) 1192 basic_machine=pdp10-xkl 1193 os=-tops20 1194 ;; 1195 tower | tower-32) 1196 basic_machine=m68k-ncr 1197 ;; 1198 tpf) 1199 basic_machine=s390x-ibm 1200 os=-tpf 1201 ;; 1202 udi29k) 1203 basic_machine=a29k-amd 1204 os=-udi 1205 ;; 1206 ultra3) 1207 basic_machine=a29k-nyu 1208 os=-sym1 1209 ;; 1210 v810 | necv810) 1211 basic_machine=v810-nec 1212 os=-none 1213 ;; 1214 vaxv) 1215 basic_machine=vax-dec 1216 os=-sysv 1217 ;; 1218 vms) 1219 basic_machine=vax-dec 1220 os=-vms 1221 ;; 1222 vpp*|vx|vx-*) 1223 basic_machine=f301-fujitsu 1224 ;; 1225 vxworks960) 1226 basic_machine=i960-wrs 1227 os=-vxworks 1228 ;; 1229 vxworks68) 1230 basic_machine=m68k-wrs 1231 os=-vxworks 1232 ;; 1233 vxworks29k) 1234 basic_machine=a29k-wrs 1235 os=-vxworks 1236 ;; 1237 w65*) 1238 basic_machine=w65-wdc 1239 os=-none 1240 ;; 1241 w89k-*) 1242 basic_machine=hppa1.1-winbond 1243 os=-proelf 1244 ;; 1245 xbox) 1246 basic_machine=i686-pc 1247 os=-mingw32 1248 ;; 1249 xps | xps100) 1250 basic_machine=xps100-honeywell 1251 ;; 1252 xscale-* | xscalee[bl]-*) 1253 basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` 1254 ;; 1255 ymp) 1256 basic_machine=ymp-cray 1257 os=-unicos 1258 ;; 1259 z8k-*-coff) 1260 basic_machine=z8k-unknown 1261 os=-sim 1262 ;; 1263 z80-*-coff) 1264 basic_machine=z80-unknown 1265 os=-sim 1266 ;; 1267 none) 1268 basic_machine=none-none 1269 os=-none 1270 ;; 1271 1272 # Here we handle the default manufacturer of certain CPU types. It is in 1273 # some cases the only manufacturer, in others, it is the most popular. 1274 w89k) 1275 basic_machine=hppa1.1-winbond 1276 ;; 1277 op50n) 1278 basic_machine=hppa1.1-oki 1279 ;; 1280 op60c) 1281 basic_machine=hppa1.1-oki 1282 ;; 1283 romp) 1284 basic_machine=romp-ibm 1285 ;; 1286 mmix) 1287 basic_machine=mmix-knuth 1288 ;; 1289 rs6000) 1290 basic_machine=rs6000-ibm 1291 ;; 1292 vax) 1293 basic_machine=vax-dec 1294 ;; 1295 pdp10) 1296 # there are many clones, so DEC is not a safe bet 1297 basic_machine=pdp10-unknown 1298 ;; 1299 pdp11) 1300 basic_machine=pdp11-dec 1301 ;; 1302 we32k) 1303 basic_machine=we32k-att 1304 ;; 1305 sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) 1306 basic_machine=sh-unknown 1307 ;; 1308 sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) 1309 basic_machine=sparc-sun 1310 ;; 1311 cydra) 1312 basic_machine=cydra-cydrome 1313 ;; 1314 orion) 1315 basic_machine=orion-highlevel 1316 ;; 1317 orion105) 1318 basic_machine=clipper-highlevel 1319 ;; 1320 mac | mpw | mac-mpw) 1321 basic_machine=m68k-apple 1322 ;; 1323 pmac | pmac-mpw) 1324 basic_machine=powerpc-apple 1325 ;; 1326 *-unknown) 1327 # Make sure to match an already-canonicalized machine name. 1328 ;; 1329 *) 1330 echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 1331 exit 1 1332 ;; 1333 esac 1334 1335 # Here we canonicalize certain aliases for manufacturers. 1336 case $basic_machine in 1337 *-digital*) 1338 basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` 1339 ;; 1340 *-commodore*) 1341 basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` 1342 ;; 1343 *) 1344 ;; 1345 esac 1346 1347 # Decode manufacturer-specific aliases for certain operating systems. 1348 1349 if [ x"$os" != x"" ] 1350 then 1351 case $os in 1352 # First match some system type aliases 1353 # that might get confused with valid system types. 1354 # -solaris* is a basic system type, with this one exception. 1355 -auroraux) 1356 os=-auroraux 1357 ;; 1358 -solaris1 | -solaris1.*) 1359 os=`echo $os | sed -e 's|solaris1|sunos4|'` 1360 ;; 1361 -solaris) 1362 os=-solaris2 1363 ;; 1364 -svr4*) 1365 os=-sysv4 1366 ;; 1367 -unixware*) 1368 os=-sysv4.2uw 1369 ;; 1370 -gnu/linux*) 1371 os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` 1372 ;; 1373 # First accept the basic system types. 1374 # The portable systems comes first. 1375 # Each alternative MUST END IN A *, to match a version number. 1376 # -sysv* is not here because it comes later, after sysvr4. 1377 -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ 1378 | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ 1379 | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ 1380 | -sym* | -kopensolaris* | -plan9* \ 1381 | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ 1382 | -aos* | -aros* | -cloudabi* | -sortix* \ 1383 | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ 1384 | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ 1385 | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ 1386 | -bitrig* | -openbsd* | -solidbsd* \ 1387 | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ 1388 | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ 1389 | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ 1390 | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ 1391 | -chorusos* | -chorusrdb* | -cegcc* \ 1392 | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ 1393 | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ 1394 | -linux-newlib* | -linux-musl* | -linux-uclibc* \ 1395 | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ 1396 | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ 1397 | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ 1398 | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ 1399 | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ 1400 | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ 1401 | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ 1402 | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) 1403 # Remember, each alternative MUST END IN *, to match a version number. 1404 ;; 1405 -qnx*) 1406 case $basic_machine in 1407 x86-* | i*86-*) 1408 ;; 1409 *) 1410 os=-nto$os 1411 ;; 1412 esac 1413 ;; 1414 -nto-qnx*) 1415 ;; 1416 -nto*) 1417 os=`echo $os | sed -e 's|nto|nto-qnx|'` 1418 ;; 1419 -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ 1420 | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ 1421 | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) 1422 ;; 1423 -mac*) 1424 os=`echo $os | sed -e 's|mac|macos|'` 1425 ;; 1426 -linux-dietlibc) 1427 os=-linux-dietlibc 1428 ;; 1429 -linux*) 1430 os=`echo $os | sed -e 's|linux|linux-gnu|'` 1431 ;; 1432 -sunos5*) 1433 os=`echo $os | sed -e 's|sunos5|solaris2|'` 1434 ;; 1435 -sunos6*) 1436 os=`echo $os | sed -e 's|sunos6|solaris3|'` 1437 ;; 1438 -opened*) 1439 os=-openedition 1440 ;; 1441 -os400*) 1442 os=-os400 1443 ;; 1444 -wince*) 1445 os=-wince 1446 ;; 1447 -osfrose*) 1448 os=-osfrose 1449 ;; 1450 -osf*) 1451 os=-osf 1452 ;; 1453 -utek*) 1454 os=-bsd 1455 ;; 1456 -dynix*) 1457 os=-bsd 1458 ;; 1459 -acis*) 1460 os=-aos 1461 ;; 1462 -atheos*) 1463 os=-atheos 1464 ;; 1465 -syllable*) 1466 os=-syllable 1467 ;; 1468 -386bsd) 1469 os=-bsd 1470 ;; 1471 -ctix* | -uts*) 1472 os=-sysv 1473 ;; 1474 -nova*) 1475 os=-rtmk-nova 1476 ;; 1477 -ns2 ) 1478 os=-nextstep2 1479 ;; 1480 -nsk*) 1481 os=-nsk 1482 ;; 1483 # Preserve the version number of sinix5. 1484 -sinix5.*) 1485 os=`echo $os | sed -e 's|sinix|sysv|'` 1486 ;; 1487 -sinix*) 1488 os=-sysv4 1489 ;; 1490 -tpf*) 1491 os=-tpf 1492 ;; 1493 -triton*) 1494 os=-sysv3 1495 ;; 1496 -oss*) 1497 os=-sysv3 1498 ;; 1499 -svr4) 1500 os=-sysv4 1501 ;; 1502 -svr3) 1503 os=-sysv3 1504 ;; 1505 -sysvr4) 1506 os=-sysv4 1507 ;; 1508 # This must come after -sysvr4. 1509 -sysv*) 1510 ;; 1511 -ose*) 1512 os=-ose 1513 ;; 1514 -es1800*) 1515 os=-ose 1516 ;; 1517 -xenix) 1518 os=-xenix 1519 ;; 1520 -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) 1521 os=-mint 1522 ;; 1523 -aros*) 1524 os=-aros 1525 ;; 1526 -zvmoe) 1527 os=-zvmoe 1528 ;; 1529 -dicos*) 1530 os=-dicos 1531 ;; 1532 -nacl*) 1533 ;; 1534 -none) 1535 ;; 1536 *) 1537 # Get rid of the `-' at the beginning of $os. 1538 os=`echo $os | sed 's/[^-]*-//'` 1539 echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 1540 exit 1 1541 ;; 1542 esac 1543 else 1544 1545 # Here we handle the default operating systems that come with various machines. 1546 # The value should be what the vendor currently ships out the door with their 1547 # machine or put another way, the most popular os provided with the machine. 1548 1549 # Note that if you're going to try to match "-MANUFACTURER" here (say, 1550 # "-sun"), then you have to tell the case statement up towards the top 1551 # that MANUFACTURER isn't an operating system. Otherwise, code above 1552 # will signal an error saying that MANUFACTURER isn't an operating 1553 # system, and we'll never get to this point. 1554 1555 case $basic_machine in 1556 score-*) 1557 os=-elf 1558 ;; 1559 spu-*) 1560 os=-elf 1561 ;; 1562 *-acorn) 1563 os=-riscix1.2 1564 ;; 1565 arm*-rebel) 1566 os=-linux 1567 ;; 1568 arm*-semi) 1569 os=-aout 1570 ;; 1571 c4x-* | tic4x-*) 1572 os=-coff 1573 ;; 1574 c8051-*) 1575 os=-elf 1576 ;; 1577 hexagon-*) 1578 os=-elf 1579 ;; 1580 tic54x-*) 1581 os=-coff 1582 ;; 1583 tic55x-*) 1584 os=-coff 1585 ;; 1586 tic6x-*) 1587 os=-coff 1588 ;; 1589 # This must come before the *-dec entry. 1590 pdp10-*) 1591 os=-tops20 1592 ;; 1593 pdp11-*) 1594 os=-none 1595 ;; 1596 *-dec | vax-*) 1597 os=-ultrix4.2 1598 ;; 1599 m68*-apollo) 1600 os=-domain 1601 ;; 1602 i386-sun) 1603 os=-sunos4.0.2 1604 ;; 1605 m68000-sun) 1606 os=-sunos3 1607 ;; 1608 m68*-cisco) 1609 os=-aout 1610 ;; 1611 mep-*) 1612 os=-elf 1613 ;; 1614 mips*-cisco) 1615 os=-elf 1616 ;; 1617 mips*-*) 1618 os=-elf 1619 ;; 1620 or32-*) 1621 os=-coff 1622 ;; 1623 *-tti) # must be before sparc entry or we get the wrong os. 1624 os=-sysv3 1625 ;; 1626 sparc-* | *-sun) 1627 os=-sunos4.1.1 1628 ;; 1629 *-be) 1630 os=-beos 1631 ;; 1632 *-haiku) 1633 os=-haiku 1634 ;; 1635 *-ibm) 1636 os=-aix 1637 ;; 1638 *-knuth) 1639 os=-mmixware 1640 ;; 1641 *-wec) 1642 os=-proelf 1643 ;; 1644 *-winbond) 1645 os=-proelf 1646 ;; 1647 *-oki) 1648 os=-proelf 1649 ;; 1650 *-hp) 1651 os=-hpux 1652 ;; 1653 *-hitachi) 1654 os=-hiux 1655 ;; 1656 i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) 1657 os=-sysv 1658 ;; 1659 *-cbm) 1660 os=-amigaos 1661 ;; 1662 *-dg) 1663 os=-dgux 1664 ;; 1665 *-dolphin) 1666 os=-sysv3 1667 ;; 1668 m68k-ccur) 1669 os=-rtu 1670 ;; 1671 m88k-omron*) 1672 os=-luna 1673 ;; 1674 *-next ) 1675 os=-nextstep 1676 ;; 1677 *-sequent) 1678 os=-ptx 1679 ;; 1680 *-crds) 1681 os=-unos 1682 ;; 1683 *-ns) 1684 os=-genix 1685 ;; 1686 i370-*) 1687 os=-mvs 1688 ;; 1689 *-next) 1690 os=-nextstep3 1691 ;; 1692 *-gould) 1693 os=-sysv 1694 ;; 1695 *-highlevel) 1696 os=-bsd 1697 ;; 1698 *-encore) 1699 os=-bsd 1700 ;; 1701 *-sgi) 1702 os=-irix 1703 ;; 1704 *-siemens) 1705 os=-sysv4 1706 ;; 1707 *-masscomp) 1708 os=-rtu 1709 ;; 1710 f30[01]-fujitsu | f700-fujitsu) 1711 os=-uxpv 1712 ;; 1713 *-rom68k) 1714 os=-coff 1715 ;; 1716 *-*bug) 1717 os=-coff 1718 ;; 1719 *-apple) 1720 os=-macos 1721 ;; 1722 *-atari*) 1723 os=-mint 1724 ;; 1725 *) 1726 os=-none 1727 ;; 1728 esac 1729 fi 1730 1731 # Here we handle the case where we know the os, and the CPU type, but not the 1732 # manufacturer. We pick the logical manufacturer. 1733 vendor=unknown 1734 case $basic_machine in 1735 *-unknown) 1736 case $os in 1737 -riscix*) 1738 vendor=acorn 1739 ;; 1740 -sunos*) 1741 vendor=sun 1742 ;; 1743 -cnk*|-aix*) 1744 vendor=ibm 1745 ;; 1746 -beos*) 1747 vendor=be 1748 ;; 1749 -hpux*) 1750 vendor=hp 1751 ;; 1752 -mpeix*) 1753 vendor=hp 1754 ;; 1755 -hiux*) 1756 vendor=hitachi 1757 ;; 1758 -unos*) 1759 vendor=crds 1760 ;; 1761 -dgux*) 1762 vendor=dg 1763 ;; 1764 -luna*) 1765 vendor=omron 1766 ;; 1767 -genix*) 1768 vendor=ns 1769 ;; 1770 -mvs* | -opened*) 1771 vendor=ibm 1772 ;; 1773 -os400*) 1774 vendor=ibm 1775 ;; 1776 -ptx*) 1777 vendor=sequent 1778 ;; 1779 -tpf*) 1780 vendor=ibm 1781 ;; 1782 -vxsim* | -vxworks* | -windiss*) 1783 vendor=wrs 1784 ;; 1785 -aux*) 1786 vendor=apple 1787 ;; 1788 -hms*) 1789 vendor=hitachi 1790 ;; 1791 -mpw* | -macos*) 1792 vendor=apple 1793 ;; 1794 -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) 1795 vendor=atari 1796 ;; 1797 -vos*) 1798 vendor=stratus 1799 ;; 1800 esac 1801 basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` 1802 ;; 1803 esac 1804 1805 echo $basic_machine$os 1806 exit 1807 1808 # Local variables: 1809 # eval: (add-hook 'write-file-hooks 'time-stamp) 1810 # time-stamp-start: "timestamp='" 1811 # time-stamp-format: "%:y-%02m-%02d" 1812 # time-stamp-end: "'" 1813 # End: 1 /usr/share/automake-1.15/config.sub -
Property mode
changed from
-
automake/depcomp
rcd7ef0b r275f4b4 2 2 # depcomp - compile a program generating dependencies as side-effects 3 3 4 scriptversion=2013-05-30.07; # UTC 5 6 # Copyright (C) 1999-2014 Free Software Foundation, Inc. 4 scriptversion=2011-12-04.11; # UTC 5 6 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 7 # 2011 Free Software Foundation, Inc. 7 8 8 9 # This program is free software; you can redistribute it and/or modify … … 28 29 case $1 in 29 30 '') 30 echo "$0: No command. Try '$0 --help' for more information." 1>&231 exit 1;32 ;;31 echo "$0: No command. Try \`$0 --help' for more information." 1>&2 32 exit 1; 33 ;; 33 34 -h | --h*) 34 35 cat <<\EOF … … 40 41 Environment variables: 41 42 depmode Dependency tracking mode. 42 source Source file read by 'PROGRAMS ARGS'.43 object Object file output by 'PROGRAMS ARGS'.43 source Source file read by `PROGRAMS ARGS'. 44 object Object file output by `PROGRAMS ARGS'. 44 45 DEPDIR directory where to store dependencies. 45 46 depfile Dependency file to output. … … 57 58 esac 58 59 59 # Get the directory component of the given path, and save it in the60 # global variables '$dir'. Note that this directory component will61 # be either empty or ending with a '/' character. This is deliberate.62 set_dir_from ()63 {64 case $1 in65 */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;66 *) dir=;;67 esac68 }69 70 # Get the suffix-stripped basename of the given path, and save it the71 # global variable '$base'.72 set_base_from ()73 {74 base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`75 }76 77 # If no dependency file was actually created by the compiler invocation,78 # we still have to create a dummy depfile, to avoid errors with the79 # Makefile "include basename.Plo" scheme.80 make_dummy_depfile ()81 {82 echo "#dummy" > "$depfile"83 }84 85 # Factor out some common post-processing of the generated depfile.86 # Requires the auxiliary global variable '$tmpdepfile' to be set.87 aix_post_process_depfile ()88 {89 # If the compiler actually managed to produce a dependency file,90 # post-process it.91 if test -f "$tmpdepfile"; then92 # Each line is of the form 'foo.o: dependency.h'.93 # Do two passes, one to just change these to94 # $object: dependency.h95 # and one to simply output96 # dependency.h:97 # which is needed to avoid the deleted-header problem.98 { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"99 sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"100 } > "$depfile"101 rm -f "$tmpdepfile"102 else103 make_dummy_depfile104 fi105 }106 107 # A tabulation character.108 tab=' '109 # A newline character.110 nl='111 '112 # Character ranges might be problematic outside the C locale.113 # These definitions help.114 upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ115 lower=abcdefghijklmnopqrstuvwxyz116 digits=0123456789117 alpha=${upper}${lower}118 119 60 if test -z "$depmode" || test -z "$source" || test -z "$object"; then 120 61 echo "depcomp: Variables source, object and depmode must be set" 1>&2 … … 128 69 129 70 rm -f "$tmpdepfile" 130 131 # Avoid interferences from the environment.132 gccflag= dashmflag=133 71 134 72 # Some modes work just like other modes, but use different flags. We … … 143 81 144 82 if test "$depmode" = dashXmstdout; then 145 # This is just like dashmstdout with a different argument.146 dashmflag=-xM147 depmode=dashmstdout83 # This is just like dashmstdout with a different argument. 84 dashmflag=-xM 85 depmode=dashmstdout 148 86 fi 149 87 150 88 cygpath_u="cygpath -u -f -" 151 89 if test "$depmode" = msvcmsys; then 152 # This is just like msvisualcpp but w/o cygpath translation.153 # Just convert the backslash-escaped backslashes to single forward154 # slashes to satisfy depend.m4155 cygpath_u='sed s,\\\\,/,g'156 depmode=msvisualcpp90 # This is just like msvisualcpp but w/o cygpath translation. 91 # Just convert the backslash-escaped backslashes to single forward 92 # slashes to satisfy depend.m4 93 cygpath_u='sed s,\\\\,/,g' 94 depmode=msvisualcpp 157 95 fi 158 96 159 97 if test "$depmode" = msvc7msys; then 160 # This is just like msvc7 but w/o cygpath translation. 161 # Just convert the backslash-escaped backslashes to single forward 162 # slashes to satisfy depend.m4 163 cygpath_u='sed s,\\\\,/,g' 164 depmode=msvc7 165 fi 166 167 if test "$depmode" = xlc; then 168 # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. 169 gccflag=-qmakedep=gcc,-MF 170 depmode=gcc 98 # This is just like msvc7 but w/o cygpath translation. 99 # Just convert the backslash-escaped backslashes to single forward 100 # slashes to satisfy depend.m4 101 cygpath_u='sed s,\\\\,/,g' 102 depmode=msvc7 171 103 fi 172 104 … … 191 123 "$@" 192 124 stat=$? 193 if test $stat -ne 0; then 125 if test $stat -eq 0; then : 126 else 194 127 rm -f "$tmpdepfile" 195 128 exit $stat … … 199 132 200 133 gcc) 201 ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.202 ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.203 ## (see the conditional assignment to $gccflag above).204 134 ## There are various ways to get dependency output from gcc. Here's 205 135 ## why we pick this rather obscure method: … … 208 138 ## (We might end up doing this anyway to support other compilers.) 209 139 ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like 210 ## -MM, not -M (despite what the docs say). Also, it might not be 211 ## supported by the other compilers which use the 'gcc' depmode. 140 ## -MM, not -M (despite what the docs say). 212 141 ## - Using -M directly means running the compiler twice (even worse 213 142 ## than renaming). … … 217 146 "$@" -Wp,"$gccflag$tmpdepfile" 218 147 stat=$? 219 if test $stat -ne 0; then 148 if test $stat -eq 0; then : 149 else 220 150 rm -f "$tmpdepfile" 221 151 exit $stat … … 223 153 rm -f "$depfile" 224 154 echo "$object : \\" > "$depfile" 225 # The second -e expression handles DOS-style file names with drive226 #letters.155 alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 156 ## The second -e expression handles DOS-style file names with drive letters. 227 157 sed -e 's/^[^:]*: / /' \ 228 158 -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" 229 ## This next piece of magic avoids the "deleted header file"problem.159 ## This next piece of magic avoids the `deleted header file' problem. 230 160 ## The problem is that when a header file which appears in a .P file 231 161 ## is deleted, the dependency causes make to die (because there is … … 233 163 ## dummy dependencies for each header file. Too bad gcc doesn't do 234 164 ## this for us directly. 235 ## Some versions of gcc put a space before the ':'. On the theory 165 tr ' ' ' 166 ' < "$tmpdepfile" | 167 ## Some versions of gcc put a space before the `:'. On the theory 236 168 ## that the space means something, we add a space to the output as 237 169 ## well. hp depmode also adds that space, but also prefixes the VPATH … … 239 171 ## Some versions of the HPUX 10.20 sed can't process this invocation 240 172 ## correctly. Breaking it into two sed invocations is a workaround. 241 tr ' ' "$nl" < "$tmpdepfile" \ 242 | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 243 | sed -e 's/$/ :/' >> "$depfile" 173 sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ 174 | sed -e 's/$/ :/' >> "$depfile" 244 175 rm -f "$tmpdepfile" 245 176 ;; … … 259 190 fi 260 191 stat=$? 261 if test $stat -ne 0; then 192 if test $stat -eq 0; then : 193 else 262 194 rm -f "$tmpdepfile" 263 195 exit $stat … … 267 199 if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files 268 200 echo "$object : \\" > "$depfile" 201 269 202 # Clip off the initial element (the dependent). Don't try to be 270 203 # clever and replace this with sed code, as IRIX sed won't handle 271 204 # lines with more than a fixed number of characters (4096 in 272 205 # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; 273 # the IRIX cc adds comments like '#:fec' to the end of the206 # the IRIX cc adds comments like `#:fec' to the end of the 274 207 # dependency line. 275 tr ' ' "$nl" < "$tmpdepfile" \ 276 | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ 277 | tr "$nl" ' ' >> "$depfile" 208 tr ' ' ' 209 ' < "$tmpdepfile" \ 210 | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ 211 tr ' 212 ' ' ' >> "$depfile" 278 213 echo >> "$depfile" 214 279 215 # The second pass generates a dummy entry for each header file. 280 tr ' ' "$nl" < "$tmpdepfile" \ 281 | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 282 >> "$depfile" 283 else 284 make_dummy_depfile 285 fi 286 rm -f "$tmpdepfile" 287 ;; 288 289 xlc) 290 # This case exists only to let depend.m4 do its work. It works by 291 # looking at the text of this script. This case will never be run, 292 # since it is checked for above. 293 exit 1 216 tr ' ' ' 217 ' < "$tmpdepfile" \ 218 | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ 219 >> "$depfile" 220 else 221 # The sourcefile does not contain any dependencies, so just 222 # store a dummy comment line, to avoid errors with the Makefile 223 # "include basename.Plo" scheme. 224 echo "#dummy" > "$depfile" 225 fi 226 rm -f "$tmpdepfile" 294 227 ;; 295 228 … … 297 230 # The C for AIX Compiler uses -M and outputs the dependencies 298 231 # in a .u file. In older versions, this file always lives in the 299 # current directory. Also, the AIX compiler puts '$object:' at the232 # current directory. Also, the AIX compiler puts `$object:' at the 300 233 # start of each line; $object doesn't have directory information. 301 234 # Version 6 uses the directory in both cases. 302 set_dir_from "$object" 303 set_base_from "$object" 235 dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` 236 test "x$dir" = "x$object" && dir= 237 base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` 304 238 if test "$libtool" = yes; then 305 239 tmpdepfile1=$dir$base.u … … 314 248 fi 315 249 stat=$? 316 if test $stat -ne 0; then 250 251 if test $stat -eq 0; then : 252 else 317 253 rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 318 254 exit $stat … … 323 259 test -f "$tmpdepfile" && break 324 260 done 325 aix_post_process_depfile 326 ;; 327 328 tcc) 329 # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 330 # FIXME: That version still under development at the moment of writing. 331 # Make that this statement remains true also for stable, released 332 # versions. 333 # It will wrap lines (doesn't matter whether long or short) with a 334 # trailing '\', as in: 335 # 336 # foo.o : \ 337 # foo.c \ 338 # foo.h \ 339 # 340 # It will put a trailing '\' even on the last line, and will use leading 341 # spaces rather than leading tabs (at least since its commit 0394caf7 342 # "Emit spaces for -MD"). 343 "$@" -MD -MF "$tmpdepfile" 344 stat=$? 345 if test $stat -ne 0; then 346 rm -f "$tmpdepfile" 347 exit $stat 348 fi 349 rm -f "$depfile" 350 # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. 351 # We have to change lines of the first kind to '$object: \'. 352 sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" 353 # And for each line of the second kind, we have to emit a 'dep.h:' 354 # dummy dependency, to avoid the deleted-header problem. 355 sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" 356 rm -f "$tmpdepfile" 357 ;; 358 359 ## The order of this option in the case statement is important, since the 360 ## shell code in configure will try each of these formats in the order 361 ## listed in this file. A plain '-MD' option would be understood by many 362 ## compilers, so we must ensure this comes after the gcc and icc options. 363 pgcc) 364 # Portland's C compiler understands '-MD'. 365 # Will always output deps to 'file.d' where file is the root name of the 366 # source file under compilation, even if file resides in a subdirectory. 367 # The object file name does not affect the name of the '.d' file. 368 # pgcc 10.2 will output 261 if test -f "$tmpdepfile"; then 262 # Each line is of the form `foo.o: dependent.h'. 263 # Do two passes, one to just change these to 264 # `$object: dependent.h' and one to simply `dependent.h:'. 265 sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" 266 # That's a tab and a space in the []. 267 sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" 268 else 269 # The sourcefile does not contain any dependencies, so just 270 # store a dummy comment line, to avoid errors with the Makefile 271 # "include basename.Plo" scheme. 272 echo "#dummy" > "$depfile" 273 fi 274 rm -f "$tmpdepfile" 275 ;; 276 277 icc) 278 # Intel's C compiler understands `-MD -MF file'. However on 279 # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c 280 # ICC 7.0 will fill foo.d with something like 281 # foo.o: sub/foo.c 282 # foo.o: sub/foo.h 283 # which is wrong. We want: 284 # sub/foo.o: sub/foo.c 285 # sub/foo.o: sub/foo.h 286 # sub/foo.c: 287 # sub/foo.h: 288 # ICC 7.1 will output 369 289 # foo.o: sub/foo.c sub/foo.h 370 # and will wrap long lines using '\':290 # and will wrap long lines using \ : 371 291 # foo.o: sub/foo.c ... \ 372 292 # sub/foo.h ... \ 373 293 # ... 374 set_dir_from "$object" 375 # Use the source, not the object, to determine the base name, since 376 # that's sadly what pgcc will do too. 377 set_base_from "$source" 378 tmpdepfile=$base.d 379 380 # For projects that build the same source file twice into different object 381 # files, the pgcc approach of using the *source* file root name can cause 382 # problems in parallel builds. Use a locking strategy to avoid stomping on 383 # the same $tmpdepfile. 384 lockdir=$base.d-lock 385 trap " 386 echo '$0: caught signal, cleaning up...' >&2 387 rmdir '$lockdir' 388 exit 1 389 " 1 2 13 15 390 numtries=100 391 i=$numtries 392 while test $i -gt 0; do 393 # mkdir is a portable test-and-set. 394 if mkdir "$lockdir" 2>/dev/null; then 395 # This process acquired the lock. 396 "$@" -MD 397 stat=$? 398 # Release the lock. 399 rmdir "$lockdir" 400 break 401 else 402 # If the lock is being held by a different process, wait 403 # until the winning process is done or we timeout. 404 while test -d "$lockdir" && test $i -gt 0; do 405 sleep 1 406 i=`expr $i - 1` 407 done 408 fi 409 i=`expr $i - 1` 410 done 411 trap - 1 2 13 15 412 if test $i -le 0; then 413 echo "$0: failed to acquire lock after $numtries attempts" >&2 414 echo "$0: check lockdir '$lockdir'" >&2 415 exit 1 416 fi 417 418 if test $stat -ne 0; then 294 295 "$@" -MD -MF "$tmpdepfile" 296 stat=$? 297 if test $stat -eq 0; then : 298 else 419 299 rm -f "$tmpdepfile" 420 300 exit $stat … … 428 308 # Some versions of the HPUX 10.20 sed can't process this invocation 429 309 # correctly. Breaking it into two sed invocations is a workaround. 430 sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \431 |sed -e 's/$/ :/' >> "$depfile"310 sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | 311 sed -e 's/$/ :/' >> "$depfile" 432 312 rm -f "$tmpdepfile" 433 313 ;; … … 440 320 # happens to be. 441 321 # Much of this is similar to the tru64 case; see comments there. 442 set_dir_from "$object" 443 set_base_from "$object" 322 dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` 323 test "x$dir" = "x$object" && dir= 324 base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` 444 325 if test "$libtool" = yes; then 445 326 tmpdepfile1=$dir$base.d … … 452 333 fi 453 334 stat=$? 454 if test $stat -ne 0; then 335 if test $stat -eq 0; then : 336 else 455 337 rm -f "$tmpdepfile1" "$tmpdepfile2" 456 338 exit $stat … … 462 344 done 463 345 if test -f "$tmpdepfile"; then 464 sed -e "s,^.*\.[ $lower]*:,$object:," "$tmpdepfile" > "$depfile"465 # Add 'dependent.h:' lines.346 sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" 347 # Add `dependent.h:' lines. 466 348 sed -ne '2,${ 467 s/^ *//468 s/ \\*$//469 s/$/:/470 p471 }' "$tmpdepfile" >> "$depfile"472 else 473 make_dummy_depfile349 s/^ *// 350 s/ \\*$// 351 s/$/:/ 352 p 353 }' "$tmpdepfile" >> "$depfile" 354 else 355 echo "#dummy" > "$depfile" 474 356 fi 475 357 rm -f "$tmpdepfile" "$tmpdepfile2" … … 477 359 478 360 tru64) 479 # The Tru64 compiler uses -MD to generate dependencies as a side 480 # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. 481 # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 482 # dependencies in 'foo.d' instead, so we check for that too. 483 # Subdirectories are respected. 484 set_dir_from "$object" 485 set_base_from "$object" 486 487 if test "$libtool" = yes; then 488 # Libtool generates 2 separate objects for the 2 libraries. These 489 # two compilations output dependencies in $dir.libs/$base.o.d and 490 # in $dir$base.o.d. We have to check for both files, because 491 # one of the two compilations can be disabled. We should prefer 492 # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 493 # automatically cleaned when .libs/ is deleted, while ignoring 494 # the former would cause a distcleancheck panic. 495 tmpdepfile1=$dir$base.o.d # libtool 1.5 496 tmpdepfile2=$dir.libs/$base.o.d # Likewise. 497 tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 498 "$@" -Wc,-MD 499 else 500 tmpdepfile1=$dir$base.d 501 tmpdepfile2=$dir$base.d 502 tmpdepfile3=$dir$base.d 503 "$@" -MD 504 fi 505 506 stat=$? 507 if test $stat -ne 0; then 508 rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 509 exit $stat 510 fi 511 512 for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" 513 do 514 test -f "$tmpdepfile" && break 515 done 516 # Same post-processing that is required for AIX mode. 517 aix_post_process_depfile 518 ;; 361 # The Tru64 compiler uses -MD to generate dependencies as a side 362 # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. 363 # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put 364 # dependencies in `foo.d' instead, so we check for that too. 365 # Subdirectories are respected. 366 dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` 367 test "x$dir" = "x$object" && dir= 368 base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` 369 370 if test "$libtool" = yes; then 371 # With Tru64 cc, shared objects can also be used to make a 372 # static library. This mechanism is used in libtool 1.4 series to 373 # handle both shared and static libraries in a single compilation. 374 # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. 375 # 376 # With libtool 1.5 this exception was removed, and libtool now 377 # generates 2 separate objects for the 2 libraries. These two 378 # compilations output dependencies in $dir.libs/$base.o.d and 379 # in $dir$base.o.d. We have to check for both files, because 380 # one of the two compilations can be disabled. We should prefer 381 # $dir$base.o.d over $dir.libs/$base.o.d because the latter is 382 # automatically cleaned when .libs/ is deleted, while ignoring 383 # the former would cause a distcleancheck panic. 384 tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 385 tmpdepfile2=$dir$base.o.d # libtool 1.5 386 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 387 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 388 "$@" -Wc,-MD 389 else 390 tmpdepfile1=$dir$base.o.d 391 tmpdepfile2=$dir$base.d 392 tmpdepfile3=$dir$base.d 393 tmpdepfile4=$dir$base.d 394 "$@" -MD 395 fi 396 397 stat=$? 398 if test $stat -eq 0; then : 399 else 400 rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" 401 exit $stat 402 fi 403 404 for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" 405 do 406 test -f "$tmpdepfile" && break 407 done 408 if test -f "$tmpdepfile"; then 409 sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" 410 # That's a tab and a space in the []. 411 sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" 412 else 413 echo "#dummy" > "$depfile" 414 fi 415 rm -f "$tmpdepfile" 416 ;; 519 417 520 418 msvc7) … … 527 425 stat=$? 528 426 grep -v '^Note: including file: ' "$tmpdepfile" 529 if test $stat -ne 0; then 427 if test "$stat" = 0; then : 428 else 530 429 rm -f "$tmpdepfile" 531 430 exit $stat … … 545 444 }' | $cygpath_u | sort -u | sed -n ' 546 445 s/ /\\ /g 547 s/\(.*\)/ '"$tab"'\1 \\/p446 s/\(.*\)/ \1 \\/p 548 447 s/.\(.*\) \\/\1:/ 549 448 H 550 449 $ { 551 s/.*/ '"$tab"'/450 s/.*/ / 552 451 G 553 452 p 554 453 }' >> "$depfile" 555 echo >> "$depfile" # make sure the fragment doesn't end with a backslash556 454 rm -f "$tmpdepfile" 557 455 ;; … … 581 479 fi 582 480 583 # Remove '-o $object'.481 # Remove `-o $object'. 584 482 IFS=" " 585 483 for arg … … 601 499 602 500 test -z "$dashmflag" && dashmflag=-M 603 # Require at least two characters before searching for ':'501 # Require at least two characters before searching for `:' 604 502 # in the target name. This is to cope with DOS-style filenames: 605 # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.503 # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. 606 504 "$@" $dashmflag | 607 sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |"> "$tmpdepfile"505 sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" 608 506 rm -f "$depfile" 609 507 cat < "$tmpdepfile" > "$depfile" 610 # Some versions of the HPUX 10.20 sed can't process this sed invocation611 # correctly. Breaking it into two sed invocations is a workaround. 612 tr ' ' "$nl" < "$tmpdepfile" \ 613 | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 614 | sed -e 's/$/ :/' >> "$depfile"508 tr ' ' ' 509 ' < "$tmpdepfile" | \ 510 ## Some versions of the HPUX 10.20 sed can't process this invocation 511 ## correctly. Breaking it into two sed invocations is a workaround. 512 sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" 615 513 rm -f "$tmpdepfile" 616 514 ;; … … 665 563 # No need to regex-escape $object, excess matching of '.' is harmless. 666 564 sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" 667 # Some versions of the HPUX 10.20 sed can't process the last invocation 668 # correctly. Breaking it into two sed invocations is a workaround. 669 sed '1,2d' "$tmpdepfile" \ 670 | tr ' ' "$nl" \ 671 | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ 672 | sed -e 's/$/ :/' >> "$depfile" 565 sed '1,2d' "$tmpdepfile" | tr ' ' ' 566 ' | \ 567 ## Some versions of the HPUX 10.20 sed can't process this invocation 568 ## correctly. Breaking it into two sed invocations is a workaround. 569 sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" 673 570 rm -f "$tmpdepfile" "$tmpdepfile".bak 674 571 ;; … … 687 584 fi 688 585 689 # Remove '-o $object'.586 # Remove `-o $object'. 690 587 IFS=" " 691 588 for arg … … 706 603 done 707 604 708 "$@" -E \709 |sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \710 -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \711 |sed '$ s: \\$::' > "$tmpdepfile"605 "$@" -E | 606 sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ 607 -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | 608 sed '$ s: \\$::' > "$tmpdepfile" 712 609 rm -f "$depfile" 713 610 echo "$object : \\" > "$depfile" … … 741 638 ;; 742 639 "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") 743 set fnord "$@"744 shift745 shift746 ;;640 set fnord "$@" 641 shift 642 shift 643 ;; 747 644 *) 748 set fnord "$@" "$arg"749 shift750 shift751 ;;645 set fnord "$@" "$arg" 646 shift 647 shift 648 ;; 752 649 esac 753 650 done … … 756 653 rm -f "$depfile" 757 654 echo "$object : \\" > "$depfile" 758 sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: '"$tab"'\1 \\:p' >> "$depfile"759 echo " $tab" >> "$depfile"655 sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" 656 echo " " >> "$depfile" 760 657 sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" 761 658 rm -f "$tmpdepfile" -
automake/install-sh
rcd7ef0b r275f4b4 2 2 # install - install a program, script, or datafile 3 3 4 scriptversion=201 4-09-12.12; # UTC4 scriptversion=2011-01-19.21; # UTC 5 5 6 6 # This originates from X11R5 (mit/util/scripts/install.sh), which was … … 36 36 # 37 37 # Calling this script install-sh is preferred over install.sh, to prevent 38 # 'make' implicit rules from creating a file called install from it38 # `make' implicit rules from creating a file called install from it 39 39 # when there is no Makefile. 40 40 # … … 42 42 # from scratch. 43 43 44 tab=' '45 44 nl=' 46 45 ' 47 IFS=" $tab$nl" 48 49 # Set DOITPROG to "echo" to test this script. 50 46 IFS=" "" $nl" 47 48 # set DOITPROG to echo to test this script 49 50 # Don't use :- since 4.3BSD and earlier shells don't like it. 51 51 doit=${DOITPROG-} 52 doit_exec=${doit:-exec} 52 if test -z "$doit"; then 53 doit_exec=exec 54 else 55 doit_exec=$doit 56 fi 53 57 54 58 # Put in absolute file names if you don't have them in your path; … … 65 69 stripprog=${STRIPPROG-strip} 66 70 71 posix_glob='?' 72 initialize_posix_glob=' 73 test "$posix_glob" != "?" || { 74 if (set -f) 2>/dev/null; then 75 posix_glob= 76 else 77 posix_glob=: 78 fi 79 } 80 ' 81 67 82 posix_mkdir= 68 83 … … 83 98 84 99 copy_on_change=false 85 is_target_a_directory=possibly 100 no_target_directory= 86 101 87 102 usage="\ … … 123 138 124 139 -g) chgrpcmd="$chgrpprog $2" 125 shift;;140 shift;; 126 141 127 142 --help) echo "$usage"; exit $?;; 128 143 129 144 -m) mode=$2 130 case $mode in 131 *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) 132 echo "$0: invalid mode: $mode" >&2 133 exit 1;; 134 esac 135 shift;; 145 case $mode in 146 *' '* | *' '* | *' 147 '* | *'*'* | *'?'* | *'['*) 148 echo "$0: invalid mode: $mode" >&2 149 exit 1;; 150 esac 151 shift;; 136 152 137 153 -o) chowncmd="$chownprog $2" 138 shift;;154 shift;; 139 155 140 156 -s) stripcmd=$stripprog;; 141 157 142 -t) 143 is_target_a_directory=always 144 dst_arg=$2 145 # Protect names problematic for 'test' and other utilities. 146 case $dst_arg in 147 -* | [=\(\)!]) dst_arg=./$dst_arg;; 148 esac 149 shift;; 150 151 -T) is_target_a_directory=never;; 158 -t) dst_arg=$2 159 # Protect names problematic for `test' and other utilities. 160 case $dst_arg in 161 -* | [=\(\)!]) dst_arg=./$dst_arg;; 162 esac 163 shift;; 164 165 -T) no_target_directory=true;; 152 166 153 167 --version) echo "$0 $scriptversion"; exit $?;; 154 168 155 --) shift156 break;;157 158 -*) echo "$0: invalid option: $1" >&2159 exit 1;;169 --) shift 170 break;; 171 172 -*) echo "$0: invalid option: $1" >&2 173 exit 1;; 160 174 161 175 *) break;; … … 163 177 shift 164 178 done 165 166 # We allow the use of options -d and -T together, by making -d167 # take the precedence; this is for compatibility with GNU install.168 169 if test -n "$dir_arg"; then170 if test -n "$dst_arg"; then171 echo "$0: target directory not allowed when installing a directory." >&2172 exit 1173 fi174 fi175 179 176 180 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then … … 187 191 shift # arg 188 192 dst_arg=$arg 189 # Protect names problematic for 'test' and other utilities.193 # Protect names problematic for `test' and other utilities. 190 194 case $dst_arg in 191 195 -* | [=\(\)!]) dst_arg=./$dst_arg;; … … 199 203 exit 1 200 204 fi 201 # It's OK to call 'install-sh -d' without argument.205 # It's OK to call `install-sh -d' without argument. 202 206 # This can happen when creating conditional directories. 203 207 exit 0 204 fi205 206 if test -z "$dir_arg"; then207 if test $# -gt 1 || test "$is_target_a_directory" = always; then208 if test ! -d "$dst_arg"; then209 echo "$0: $dst_arg: Is not a directory." >&2210 exit 1211 fi212 fi213 208 fi 214 209 … … 229 224 *[0-7]) 230 225 if test -z "$stripcmd"; then 231 u_plus_rw=226 u_plus_rw= 232 227 else 233 u_plus_rw='% 200'228 u_plus_rw='% 200' 234 229 fi 235 230 cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; 236 231 *) 237 232 if test -z "$stripcmd"; then 238 u_plus_rw=233 u_plus_rw= 239 234 else 240 u_plus_rw=,u+rw235 u_plus_rw=,u+rw 241 236 fi 242 237 cp_umask=$mode$u_plus_rw;; … … 246 241 for src 247 242 do 248 # Protect names problematic for 'test' and other utilities.243 # Protect names problematic for `test' and other utilities. 249 244 case $src in 250 245 -* | [=\(\)!]) src=./$src;; … … 275 270 # if double slashes aren't ignored. 276 271 if test -d "$dst"; then 277 if test "$is_target_a_directory" = never; then278 echo "$0: $dst_arg: Is a directory" >&2279 exit 1272 if test -n "$no_target_directory"; then 273 echo "$0: $dst_arg: Is a directory" >&2 274 exit 1 280 275 fi 281 276 dstdir=$dst … … 283 278 dstdir_status=0 284 279 else 285 dstdir=`dirname "$dst"` 280 # Prefer dirname, but fall back on a substitute if dirname fails. 281 dstdir=` 282 (dirname "$dst") 2>/dev/null || 283 expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ 284 X"$dst" : 'X\(//\)[^/]' \| \ 285 X"$dst" : 'X\(//\)$' \| \ 286 X"$dst" : 'X\(/\)' \| . 2>/dev/null || 287 echo X"$dst" | 288 sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ 289 s//\1/ 290 q 291 } 292 /^X\(\/\/\)[^/].*/{ 293 s//\1/ 294 q 295 } 296 /^X\(\/\/\)$/{ 297 s//\1/ 298 q 299 } 300 /^X\(\/\).*/{ 301 s//\1/ 302 q 303 } 304 s/.*/./; q' 305 ` 306 286 307 test -d "$dstdir" 287 308 dstdir_status=$? … … 294 315 case $posix_mkdir in 295 316 '') 296 # Create intermediate dirs using mode 755 as modified by the umask. 297 # This is like FreeBSD 'install' as of 1997-10-28. 298 umask=`umask` 299 case $stripcmd.$umask in 300 # Optimize common cases. 301 *[2367][2367]) mkdir_umask=$umask;; 302 .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 303 304 *[0-7]) 305 mkdir_umask=`expr $umask + 22 \ 306 - $umask % 100 % 40 + $umask % 20 \ 307 - $umask % 10 % 4 + $umask % 2 308 `;; 309 *) mkdir_umask=$umask,go-w;; 310 esac 311 312 # With -d, create the new directory with the user-specified mode. 313 # Otherwise, rely on $mkdir_umask. 314 if test -n "$dir_arg"; then 315 mkdir_mode=-m$mode 316 else 317 mkdir_mode= 318 fi 319 320 posix_mkdir=false 321 case $umask in 322 *[123567][0-7][0-7]) 323 # POSIX mkdir -p sets u+wx bits regardless of umask, which 324 # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 325 ;; 326 *) 327 # $RANDOM is not portable (e.g. dash); use it when possible to 328 # lower collision chance 329 tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 330 trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 331 332 # As "mkdir -p" follows symlinks and we work in /tmp possibly; so 333 # create the $tmpdir first (and fail if unsuccessful) to make sure 334 # that nobody tries to guess the $tmpdir name. 335 if (umask $mkdir_umask && 336 $mkdirprog $mkdir_mode "$tmpdir" && 337 exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 338 then 339 if test -z "$dir_arg" || { 340 # Check for POSIX incompatibilities with -m. 341 # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 342 # other-writable bit of parent directory when it shouldn't. 343 # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 344 test_tmpdir="$tmpdir/a" 345 ls_ld_tmpdir=`ls -ld "$test_tmpdir"` 346 case $ls_ld_tmpdir in 347 d????-?r-*) different_mode=700;; 348 d????-?--*) different_mode=755;; 349 *) false;; 350 esac && 351 $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { 352 ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` 353 test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 354 } 355 } 356 then posix_mkdir=: 357 fi 358 rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 359 else 360 # Remove any dirs left behind by ancient mkdir implementations. 361 rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null 362 fi 363 trap '' 0;; 364 esac;; 317 # Create intermediate dirs using mode 755 as modified by the umask. 318 # This is like FreeBSD 'install' as of 1997-10-28. 319 umask=`umask` 320 case $stripcmd.$umask in 321 # Optimize common cases. 322 *[2367][2367]) mkdir_umask=$umask;; 323 .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; 324 325 *[0-7]) 326 mkdir_umask=`expr $umask + 22 \ 327 - $umask % 100 % 40 + $umask % 20 \ 328 - $umask % 10 % 4 + $umask % 2 329 `;; 330 *) mkdir_umask=$umask,go-w;; 331 esac 332 333 # With -d, create the new directory with the user-specified mode. 334 # Otherwise, rely on $mkdir_umask. 335 if test -n "$dir_arg"; then 336 mkdir_mode=-m$mode 337 else 338 mkdir_mode= 339 fi 340 341 posix_mkdir=false 342 case $umask in 343 *[123567][0-7][0-7]) 344 # POSIX mkdir -p sets u+wx bits regardless of umask, which 345 # is incompatible with FreeBSD 'install' when (umask & 300) != 0. 346 ;; 347 *) 348 tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ 349 trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 350 351 if (umask $mkdir_umask && 352 exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 353 then 354 if test -z "$dir_arg" || { 355 # Check for POSIX incompatibilities with -m. 356 # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or 357 # other-writeable bit of parent directory when it shouldn't. 358 # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. 359 ls_ld_tmpdir=`ls -ld "$tmpdir"` 360 case $ls_ld_tmpdir in 361 d????-?r-*) different_mode=700;; 362 d????-?--*) different_mode=755;; 363 *) false;; 364 esac && 365 $mkdirprog -m$different_mode -p -- "$tmpdir" && { 366 ls_ld_tmpdir_1=`ls -ld "$tmpdir"` 367 test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" 368 } 369 } 370 then posix_mkdir=: 371 fi 372 rmdir "$tmpdir/d" "$tmpdir" 373 else 374 # Remove any dirs left behind by ancient mkdir implementations. 375 rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null 376 fi 377 trap '' 0;; 378 esac;; 365 379 esac 366 380 367 381 if 368 382 $posix_mkdir && ( 369 umask $mkdir_umask &&370 $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"383 umask $mkdir_umask && 384 $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" 371 385 ) 372 386 then : … … 378 392 379 393 case $dstdir in 380 /*) prefix='/';;381 [-=\(\)!]*) prefix='./';;382 *) prefix='';;394 /*) prefix='/';; 395 [-=\(\)!]*) prefix='./';; 396 *) prefix='';; 383 397 esac 398 399 eval "$initialize_posix_glob" 384 400 385 401 oIFS=$IFS 386 402 IFS=/ 387 set -f403 $posix_glob set -f 388 404 set fnord $dstdir 389 405 shift 390 set +f406 $posix_glob set +f 391 407 IFS=$oIFS 392 408 … … 395 411 for d 396 412 do 397 test X"$d" = X && continue398 399 prefix=$prefix$d400 if test -d "$prefix"; then401 prefixes=402 else403 if $posix_mkdir; then404 (umask=$mkdir_umask &&405 $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break406 # Don't fail if two instances are running concurrently.407 test -d "$prefix" || exit 1408 else409 case $prefix in410 *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;411 *) qprefix=$prefix;;412 esac413 prefixes="$prefixes '$qprefix'"414 fi415 fi416 prefix=$prefix/413 test X"$d" = X && continue 414 415 prefix=$prefix$d 416 if test -d "$prefix"; then 417 prefixes= 418 else 419 if $posix_mkdir; then 420 (umask=$mkdir_umask && 421 $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break 422 # Don't fail if two instances are running concurrently. 423 test -d "$prefix" || exit 1 424 else 425 case $prefix in 426 *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; 427 *) qprefix=$prefix;; 428 esac 429 prefixes="$prefixes '$qprefix'" 430 fi 431 fi 432 prefix=$prefix/ 417 433 done 418 434 419 435 if test -n "$prefixes"; then 420 # Don't fail if two instances are running concurrently.421 (umask $mkdir_umask &&422 eval "\$doit_exec \$mkdirprog $prefixes") ||423 test -d "$dstdir" || exit 1424 obsolete_mkdir_used=true436 # Don't fail if two instances are running concurrently. 437 (umask $mkdir_umask && 438 eval "\$doit_exec \$mkdirprog $prefixes") || 439 test -d "$dstdir" || exit 1 440 obsolete_mkdir_used=true 425 441 fi 426 442 fi … … 457 473 # If -C, don't bother to copy if it wouldn't change the file. 458 474 if $copy_on_change && 459 old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 460 new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 461 set -f && 475 old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && 476 new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && 477 478 eval "$initialize_posix_glob" && 479 $posix_glob set -f && 462 480 set X $old && old=:$2:$4:$5:$6 && 463 481 set X $new && new=:$2:$4:$5:$6 && 464 set +f && 482 $posix_glob set +f && 483 465 484 test "$old" = "$new" && 466 485 $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 … … 475 494 # support -f. 476 495 { 477 # Now remove or move aside any old file at destination location.478 # We try this two ways since rm can't unlink itself on some479 # systems and the destination file might be busy for other480 # reasons. In this case, the final cleanup might fail but the new481 # file should still install successfully.482 {483 test ! -f "$dst" ||484 $doit $rmcmd -f "$dst" 2>/dev/null ||485 { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&486 { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }487 } ||488 { echo "$0: cannot unlink or rename $dst" >&2489 (exit 1); exit 1490 }491 } &&492 493 # Now rename the file to the real destination.494 $doit $mvcmd "$dsttmp" "$dst"496 # Now remove or move aside any old file at destination location. 497 # We try this two ways since rm can't unlink itself on some 498 # systems and the destination file might be busy for other 499 # reasons. In this case, the final cleanup might fail but the new 500 # file should still install successfully. 501 { 502 test ! -f "$dst" || 503 $doit $rmcmd -f "$dst" 2>/dev/null || 504 { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && 505 { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } 506 } || 507 { echo "$0: cannot unlink or rename $dst" >&2 508 (exit 1); exit 1 509 } 510 } && 511 512 # Now rename the file to the real destination. 513 $doit $mvcmd "$dsttmp" "$dst" 495 514 } 496 515 fi || exit 1 -
automake/test-driver
-
Property mode
changed from
100755to120000
rcd7ef0b r275f4b4 1 #! /bin/sh 2 # test-driver - basic testsuite driver script. 3 4 scriptversion=2013-07-13.22; # UTC 5 6 # Copyright (C) 2011-2014 Free Software Foundation, Inc. 7 # 8 # This program is free software; you can redistribute it and/or modify 9 # it under the terms of the GNU General Public License as published by 10 # the Free Software Foundation; either version 2, or (at your option) 11 # any later version. 12 # 13 # This program is distributed in the hope that it will be useful, 14 # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 # GNU General Public License for more details. 17 # 18 # You should have received a copy of the GNU General Public License 19 # along with this program. If not, see <http://www.gnu.org/licenses/>. 20 21 # As a special exception to the GNU General Public License, if you 22 # distribute this file as part of a program that contains a 23 # configuration script generated by Autoconf, you may include it under 24 # the same distribution terms that you use for the rest of that program. 25 26 # This file is maintained in Automake, please report 27 # bugs to <bug-automake@gnu.org> or send patches to 28 # <automake-patches@gnu.org>. 29 30 # Make unconditional expansion of undefined variables an error. This 31 # helps a lot in preventing typo-related bugs. 32 set -u 33 34 usage_error () 35 { 36 echo "$0: $*" >&2 37 print_usage >&2 38 exit 2 39 } 40 41 print_usage () 42 { 43 cat <<END 44 Usage: 45 test-driver --test-name=NAME --log-file=PATH --trs-file=PATH 46 [--expect-failure={yes|no}] [--color-tests={yes|no}] 47 [--enable-hard-errors={yes|no}] [--] 48 TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS] 49 The '--test-name', '--log-file' and '--trs-file' options are mandatory. 50 END 51 } 52 53 test_name= # Used for reporting. 54 log_file= # Where to save the output of the test script. 55 trs_file= # Where to save the metadata of the test run. 56 expect_failure=no 57 color_tests=no 58 enable_hard_errors=yes 59 while test $# -gt 0; do 60 case $1 in 61 --help) print_usage; exit $?;; 62 --version) echo "test-driver $scriptversion"; exit $?;; 63 --test-name) test_name=$2; shift;; 64 --log-file) log_file=$2; shift;; 65 --trs-file) trs_file=$2; shift;; 66 --color-tests) color_tests=$2; shift;; 67 --expect-failure) expect_failure=$2; shift;; 68 --enable-hard-errors) enable_hard_errors=$2; shift;; 69 --) shift; break;; 70 -*) usage_error "invalid option: '$1'";; 71 *) break;; 72 esac 73 shift 74 done 75 76 missing_opts= 77 test x"$test_name" = x && missing_opts="$missing_opts --test-name" 78 test x"$log_file" = x && missing_opts="$missing_opts --log-file" 79 test x"$trs_file" = x && missing_opts="$missing_opts --trs-file" 80 if test x"$missing_opts" != x; then 81 usage_error "the following mandatory options are missing:$missing_opts" 82 fi 83 84 if test $# -eq 0; then 85 usage_error "missing argument" 86 fi 87 88 if test $color_tests = yes; then 89 # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'. 90 red='[0;31m' # Red. 91 grn='[0;32m' # Green. 92 lgn='[1;32m' # Light green. 93 blu='[1;34m' # Blue. 94 mgn='[0;35m' # Magenta. 95 std='[m' # No color. 96 else 97 red= grn= lgn= blu= mgn= std= 98 fi 99 100 do_exit='rm -f $log_file $trs_file; (exit $st); exit $st' 101 trap "st=129; $do_exit" 1 102 trap "st=130; $do_exit" 2 103 trap "st=141; $do_exit" 13 104 trap "st=143; $do_exit" 15 105 106 # Test script is run here. 107 "$@" >$log_file 2>&1 108 estatus=$? 109 110 if test $enable_hard_errors = no && test $estatus -eq 99; then 111 tweaked_estatus=1 112 else 113 tweaked_estatus=$estatus 114 fi 115 116 case $tweaked_estatus:$expect_failure in 117 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 118 0:*) col=$grn res=PASS recheck=no gcopy=no;; 119 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 120 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; 121 *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; 122 *:*) col=$red res=FAIL recheck=yes gcopy=yes;; 123 esac 124 125 # Report the test outcome and exit status in the logs, so that one can 126 # know whether the test passed or failed simply by looking at the '.log' 127 # file, without the need of also peaking into the corresponding '.trs' 128 # file (automake bug#11814). 129 echo "$res $test_name (exit status: $estatus)" >>$log_file 130 131 # Report outcome to console. 132 echo "${col}${res}${std}: $test_name" 133 134 # Register the test result, and other relevant metadata. 135 echo ":test-result: $res" > $trs_file 136 echo ":global-test-result: $res" >> $trs_file 137 echo ":recheck: $recheck" >> $trs_file 138 echo ":copy-in-global-log: $gcopy" >> $trs_file 139 140 # Local Variables: 141 # mode: shell-script 142 # sh-indentation: 2 143 # eval: (add-hook 'write-file-hooks 'time-stamp) 144 # time-stamp-start: "scriptversion=" 145 # time-stamp-format: "%:y-%02m-%02d.%02H" 146 # time-stamp-time-zone: "UTC" 147 # time-stamp-end: "; # UTC" 148 # End: 1 /usr/share/automake-1.15/test-driver -
Property mode
changed from
-
automake/ylwrap
rcd7ef0b r275f4b4 2 2 # ylwrap - wrapper for lex/yacc invocations. 3 3 4 scriptversion=2013-01-12.17; # UTC 5 6 # Copyright (C) 1996-2014 Free Software Foundation, Inc. 4 scriptversion=2011-08-25.18; # UTC 5 6 # Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, 7 # 2007, 2009, 2010, 2011 Free Software Foundation, Inc. 7 8 # 8 9 # Written by Tom Tromey <tromey@cygnus.com>. … … 30 31 # <automake-patches@gnu.org>. 31 32 32 get_dirname ()33 {34 case $1 in35 */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';;36 # Otherwise, we want the empty string (not ".").37 esac38 }39 40 # guard FILE41 # ----------42 # The CPP macro used to guard inclusion of FILE.43 guard ()44 {45 printf '%s\n' "$1" \46 | sed \47 -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \48 -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \49 -e 's/__*/_/g'50 }51 52 # quote_for_sed [STRING]53 # ----------------------54 # Return STRING (or stdin) quoted to be used as a sed pattern.55 quote_for_sed ()56 {57 case $# in58 0) cat;;59 1) printf '%s\n' "$1";;60 esac \61 | sed -e 's|[][\\.*]|\\&|g'62 }63 64 33 case "$1" in 65 34 '') 66 echo "$0: No files given. Try '$0 --help' for more information." 1>&235 echo "$0: No files given. Try \`$0 --help' for more information." 1>&2 67 36 exit 1 68 37 ;; … … 97 66 98 67 # The input. 99 input= $168 input="$1" 100 69 shift 101 # We'll later need for a correct munging of "#line" directives. 102 input_sub_rx=`get_dirname "$input" | quote_for_sed` 103 case $input in 70 case "$input" in 104 71 [\\/]* | ?:[\\/]*) 105 72 # Absolute path; do nothing. … … 107 74 *) 108 75 # Relative path. Make it absolute. 109 input=`pwd`/$input 110 ;; 111 esac 112 input_rx=`get_dirname "$input" | quote_for_sed` 113 114 # Since DOS filename conventions don't allow two dots, 115 # the DOS version of Bison writes out y_tab.c instead of y.tab.c 116 # and y_tab.h instead of y.tab.h. Test to see if this is the case. 117 y_tab_nodot=false 118 if test -f y_tab.c || test -f y_tab.h; then 119 y_tab_nodot=true 120 fi 121 122 # The parser itself, the first file, is the destination of the .y.c 123 # rule in the Makefile. 124 parser=$1 125 126 # A sed program to s/FROM/TO/g for all the FROM/TO so that, for 127 # instance, we rename #include "y.tab.h" into #include "parse.h" 128 # during the conversion from y.tab.c to parse.c. 129 sed_fix_filenames= 130 131 # Also rename header guards, as Bison 2.7 for instance uses its header 132 # guard in its implementation file. 133 sed_fix_header_guards= 134 135 while test $# -ne 0; do 136 if test x"$1" = x"--"; then 76 input="`pwd`/$input" 77 ;; 78 esac 79 80 pairlist= 81 while test "$#" -ne 0; do 82 if test "$1" = "--"; then 137 83 shift 138 84 break 139 85 fi 140 from=$1 141 # Handle y_tab.c and y_tab.h output by DOS 142 if $y_tab_nodot; then 143 case $from in 144 "y.tab.c") from=y_tab.c;; 145 "y.tab.h") from=y_tab.h;; 146 esac 147 fi 86 pairlist="$pairlist $1" 148 87 shift 149 to=$1150 shift151 sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;"152 sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;"153 88 done 154 89 155 90 # The program to run. 156 prog= $191 prog="$1" 157 92 shift 158 93 # Make any relative path in $prog absolute. 159 case $progin94 case "$prog" in 160 95 [\\/]* | ?:[\\/]*) ;; 161 *[\\/]*) prog=`pwd`/$prog ;; 162 esac 163 96 *[\\/]*) prog="`pwd`/$prog" ;; 97 esac 98 99 # FIXME: add hostname here for parallel makes that run commands on 100 # other machines. But that might take us over the 14-char limit. 164 101 dirname=ylwrap$$ 165 102 do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret' … … 179 116 180 117 if test $ret -eq 0; then 181 for from in * 182 do 183 to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"` 118 set X $pairlist 119 shift 120 first=yes 121 # Since DOS filename conventions don't allow two dots, 122 # the DOS version of Bison writes out y_tab.c instead of y.tab.c 123 # and y_tab.h instead of y.tab.h. Test to see if this is the case. 124 y_tab_nodot="no" 125 if test -f y_tab.c || test -f y_tab.h; then 126 y_tab_nodot="yes" 127 fi 128 129 # The directory holding the input. 130 input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'` 131 # Quote $INPUT_DIR so we can use it in a regexp. 132 # FIXME: really we should care about more than `.' and `\'. 133 input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'` 134 135 while test "$#" -ne 0; do 136 from="$1" 137 # Handle y_tab.c and y_tab.h output by DOS 138 if test $y_tab_nodot = "yes"; then 139 if test $from = "y.tab.c"; then 140 from="y_tab.c" 141 else 142 if test $from = "y.tab.h"; then 143 from="y_tab.h" 144 fi 145 fi 146 fi 184 147 if test -f "$from"; then 185 148 # If $2 is an absolute path name, then just use that, 186 # otherwise prepend '../'.187 case $toin188 [\\/]* | ?:[\\/]*) target= $to;;189 *) target= ../$to;;149 # otherwise prepend `../'. 150 case "$2" in 151 [\\/]* | ?:[\\/]*) target="$2";; 152 *) target="../$2";; 190 153 esac 191 154 192 # Do not overwrite unchanged header files to avoid useless 193 # recompilations. Always update the parser itself: it is the 194 # destination of the .y.c rule in the Makefile. Divert the 195 # output of all other files to a temporary file so we can 196 # compare them to existing versions. 197 if test $from != $parser; then 198 realtarget=$target 199 target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'` 200 fi 201 202 # Munge "#line" or "#" directives. Don't let the resulting 203 # debug information point at an absolute srcdir. Use the real 204 # output file name, not yy.lex.c for instance. Adjust the 205 # include guards too. 206 sed -e "/^#/!b" \ 207 -e "s|$input_rx|$input_sub_rx|" \ 208 -e "$sed_fix_filenames" \ 209 -e "$sed_fix_header_guards" \ 210 "$from" >"$target" || ret=$? 211 212 # Check whether files must be updated. 213 if test "$from" != "$parser"; then 155 # We do not want to overwrite a header file if it hasn't 156 # changed. This avoid useless recompilations. However the 157 # parser itself (the first file) should always be updated, 158 # because it is the destination of the .y.c rule in the 159 # Makefile. Divert the output of all other files to a temporary 160 # file so we can compare them to existing versions. 161 if test $first = no; then 162 realtarget="$target" 163 target="tmp-`echo $target | sed s/.*[\\/]//g`" 164 fi 165 # Edit out `#line' or `#' directives. 166 # 167 # We don't want the resulting debug information to point at 168 # an absolute srcdir; it is better for it to just mention the 169 # .y file with no path. 170 # 171 # We want to use the real output file name, not yy.lex.c for 172 # instance. 173 # 174 # We want the include guards to be adjusted too. 175 FROM=`echo "$from" | sed \ 176 -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ 177 -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` 178 TARGET=`echo "$2" | sed \ 179 -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ 180 -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` 181 182 sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \ 183 -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$? 184 185 # Check whether header files must be updated. 186 if test $first = no; then 214 187 if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then 215 echo "$ to is unchanged"188 echo "$2" is unchanged 216 189 rm -f "$target" 217 190 else 218 echo "updating $to"191 echo updating "$2" 219 192 mv -f "$target" "$realtarget" 220 193 fi 221 194 fi 222 195 else 223 # A missing file is only an error for the parser. This is a 224 # blatant hack to let us support using "yacc -d". If -d is not 225 # specified, don't fail when the header file is "missing". 226 if test "$from" = "$parser"; then 196 # A missing file is only an error for the first file. This 197 # is a blatant hack to let us support using "yacc -d". If -d 198 # is not specified, we don't want an error when the header 199 # file is "missing". 200 if test $first = yes; then 227 201 ret=1 228 202 fi 229 203 fi 204 shift 205 shift 206 first=no 230 207 done 208 else 209 ret=$? 231 210 fi 232 211 -
doc/LaTeXmacros/common.tex
rcd7ef0b r275f4b4 11 11 %% Created On : Sat Apr 9 10:06:17 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Mon Jul 24 21:02:14201714 %% Update Count : 3 5213 %% Last Modified On : Mon Jul 17 10:21:17 2017 14 %% Update Count : 348 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 234 234 basicstyle=\linespread{0.9}\sf, % reduce line spacing and use sanserif font 235 235 stringstyle=\tt, % use typewriter font 236 tabsize= 5, % N space tabbing236 tabsize=6, % N space tabbing 237 237 xleftmargin=\parindentlnth, % indent code to paragraph indentation 238 238 extendedchars=true, % allow ASCII characters in the range 128-255 -
doc/LaTeXmacros/lstlang.sty
rcd7ef0b r275f4b4 8 8 %% Created On : Sat May 13 16:34:42 2017 9 9 %% Last Modified By : Peter A. Buhr 10 %% Last Modified On : Mon Jul 24 20:40:37201711 %% Update Count : 1 310 %% Last Modified On : Wed Jul 12 22:42:09 2017 11 %% Update Count : 12 12 12 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13 13 … … 112 112 finally, forall, ftype, _Generic, _Imaginary, inline, __label__, lvalue, _Noreturn, one_t, 113 113 otype, restrict, _Static_assert, throw, throwResume, trait, try, ttype, typeof, __typeof, 114 __typeof__, virtual,with, zero_t},114 __typeof__, with, zero_t}, 115 115 morekeywords=[2]{ 116 116 _Atomic, coroutine, is_coroutine, is_monitor, is_thread, monitor, mutex, nomutex, -
doc/generic_types/generic_types.tex
rcd7ef0b r275f4b4 49 49 50 50 % Useful macros 51 \newcommand{\CFA Icon}{\textsf{C}\raisebox{\depth}{\rotatebox{180}{\textsf{A}}}\xspace} % Cforall symbolic name52 \newcommand{\CFA}{\protect\CFAIcon} % safe for section/caption 53 \newcommand{\CC}{\ textrm{C}\kern-.1em\hbox{+\kern-.25em+}\xspace} % C++ symbolic name54 \newcommand{\CCeleven}{\ textrm{C}\kern-.1em\hbox{+\kern-.25em+}11\xspace} % C++11 symbolic name55 \newcommand{\CCfourteen}{\ textrm{C}\kern-.1em\hbox{+\kern-.25em+}14\xspace} % C++14 symbolic name56 \newcommand{\CCseventeen}{\ textrm{C}\kern-.1em\hbox{+\kern-.25em+}17\xspace} % C++17 symbolic name57 \newcommand{\CCtwenty}{\ textrm{C}\kern-.1em\hbox{+\kern-.25em+}20\xspace} % C++20 symbolic name51 \newcommand{\CFA}{C\raisebox{\depth}{\rotatebox{180}{\textsf{A}}}\hspace{-1pt}\xspace} % Cforall symbolic name 52 %\newcommand{\CFA}{C$\mathbf\forall$\xspace} % Cforall symbolic name 53 \newcommand{\CC}{\rm C\kern-.1em\hbox{+\kern-.25em+}\xspace} % C++ symbolic name 54 \newcommand{\CCeleven}{\rm C\kern-.1em\hbox{+\kern-.25em+}11\xspace} % C++11 symbolic name 55 \newcommand{\CCfourteen}{\rm C\kern-.1em\hbox{+\kern-.25em+}14\xspace} % C++14 symbolic name 56 \newcommand{\CCseventeen}{\rm C\kern-.1em\hbox{+\kern-.25em+}17\xspace} % C++17 symbolic name 57 \newcommand{\CCtwenty}{\rm C\kern-.1em\hbox{+\kern-.25em+}20\xspace} % C++20 symbolic name 58 58 \newcommand{\CCV}{\rm C\kern-.1em\hbox{+\kern-.25em+}obj\xspace} % C++ virtual symbolic name 59 59 \newcommand{\Csharp}{C\raisebox{-0.7ex}{\Large$^\sharp$}\xspace} % C# symbolic name … … 443 443 This function could acquire the layout for @set(T)@ by calling its layout function with the layout of @T@ implicitly passed into the function. 444 444 445 Whether a type is concrete, dtype-static, or dynamic is decided solely on the @forall@'s type parameters.446 This design allows opaque forward declarations of generic types, \eg @forall(otype T) @ @struct Box@ -- like in C, all uses of @Box(T)@ can be separately compiled, and callers from other translation units know the proper calling conventions to use.447 If the definition of a structure type is included in deciding whether a generic type is dynamic or concrete, some further types may be recognized as dtype-static (\eg @forall(otype T) @ @struct unique_ptr { T * p }@ does not depend on @T@ for its layout, but the existence of an @otype@ parameter means that it \emph{could}.), but preserving separate compilation (and the associated C compatibility) in the existing design is judged to be an appropriate trade-off.445 Whether a type is concrete, dtype-static, or dynamic is decided solely on the type parameters and @forall@ clause on a declaration. 446 This design allows opaque forward declarations of generic types, \eg @forall(otype T) struct Box@ -- like in C, all uses of @Box(T)@ can be separately compiled, and callers from other translation units know the proper calling conventions to use. 447 If the definition of a structure type is included in deciding whether a generic type is dynamic or concrete, some further types may be recognized as dtype-static (\eg @forall(otype T) struct unique_ptr { T * p }@ does not depend on @T@ for its layout, but the existence of an @otype@ parameter means that it \emph{could}.), but preserving separate compilation (and the associated C compatibility) in the existing design is judged to be an appropriate trade-off. 448 448 449 449 … … 855 855 } 856 856 \end{lstlisting} 857 \begin{sloppypar}858 857 Tuple expressions are then simply converted directly into compound literals, \eg @[5, 'x', 1.24]@ becomes @(_tuple3(int, char, double)){ 5, 'x', 1.24 }@. 859 \end{sloppypar}860 858 861 859 \begin{comment} -
doc/refrat/Makefile
rcd7ef0b r275f4b4 9 9 SOURCES = ${addsuffix .tex, \ 10 10 refrat \ 11 keywords \12 operidents \13 11 } 14 12 -
doc/refrat/refrat.tex
rcd7ef0b r275f4b4 11 11 %% Created On : Wed Apr 6 14:52:25 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Sun Aug 6 10:25:31201714 %% Update Count : 10513 %% Last Modified On : Fri Jun 2 10:43:14 2017 14 %% Update Count : 83 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 17 17 % requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended 18 18 19 \documentclass[openright,twoside ,11pt]{report}19 \documentclass[openright,twoside]{report} 20 20 21 21 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% … … 37 37 \usepackage{mathptmx} % better math font with "times" 38 38 \usepackage[usenames]{color} 39 \input{common} % common CFA document macros 39 \usepackage[pagewise]{lineno} 40 \renewcommand{\linenumberfont}{\scriptsize\sffamily} 41 \input{common} % bespoke macros used in the document 40 42 \usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref} 41 43 \usepackage{breakurl} 42 44 \renewcommand{\UrlFont}{\small\sf} 43 45 44 \usepackage[pagewise]{lineno}45 \renewcommand{\linenumberfont}{\scriptsize\sffamily}46 \usepackage[firstpage]{draftwatermark}47 \SetWatermarkLightness{0.9}48 49 % Default underscore is too low and wide. Cannot use lstlisting "literate" as replacing underscore50 % removes it as a variable-name character so keywords in variables are highlighted. MUST APPEAR51 % AFTER HYPERREF.52 \renewcommand{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}}53 54 46 \setlength{\topmargin}{-0.45in} % move running title into header 55 47 \setlength{\headsep}{0.25in} … … 58 50 59 51 \CFAStyle % use default CFA format-style 60 \lstnewenvironment{C++}[1][] % use C++ style61 {\lstset{language=C++,moredelim=**[is][\protect\color{red}]{®}{®}#1}}62 {}63 52 64 53 % inline code ©...© (copyright symbol) emacs: C-q M-) … … 98 87 99 88 \date{ 100 \today89 DRAFT \\ \today 101 90 }% date 102 91 … … 123 112 124 113 \clearpage 125 \thispagestyle{plain}126 114 \pdfbookmark[1]{Contents}{section} 127 115 \tableofcontents 128 116 129 117 \clearpage 130 \thispagestyle{plain}131 118 \pagenumbering{arabic} 132 119 … … 430 417 431 418 \begin{syntax} 432 \lhs{keyword} one of 433 \rhs \dots 434 \rhs \input{keywords} 419 \oldlhs{keyword} 420 \rhs ©forall© 421 \rhs ©lvalue© 422 \rhs ©trait© 423 \rhs ©dtype© 424 \rhs ©ftype© 425 \rhs ©otype© 435 426 \end{syntax} 436 427 … … 478 469 479 470 \begin{table}[hbt] 480 \centering 481 \input{operidents} 471 \hfil 472 \begin{tabular}[t]{ll} 473 %identifier & operation \\ \hline 474 ©?[?]© & subscripting \impl{?[?]}\\ 475 ©?()© & function call \impl{?()}\\ 476 ©?++© & postfix increment \impl{?++}\\ 477 ©?--© & postfix decrement \impl{?--}\\ 478 ©++?© & prefix increment \impl{++?}\\ 479 ©--?© & prefix decrement \impl{--?}\\ 480 ©*?© & dereference \impl{*?}\\ 481 ©+?© & unary plus \impl{+?}\\ 482 ©-?© & arithmetic negation \impl{-?}\\ 483 ©~?© & bitwise negation \impl{~?}\\ 484 ©!?© & logical complement \impl{"!?}\\ 485 ©?*?© & multiplication \impl{?*?}\\ 486 ©?/?© & division \impl{?/?}\\ 487 \end{tabular}\hfil 488 \begin{tabular}[t]{ll} 489 %identifier & operation \\ \hline 490 ©?%?© & remainder \impl{?%?}\\ 491 ©?+?© & addition \impl{?+?}\\ 492 ©?-?© & subtraction \impl{?-?}\\ 493 ©?<<?© & left shift \impl{?<<?}\\ 494 ©?>>?© & right shift \impl{?>>?}\\ 495 ©?<?© & less than \impl{?<?}\\ 496 ©?<=?© & less than or equal \impl{?<=?}\\ 497 ©?>=?© & greater than or equal \impl{?>=?}\\ 498 ©?>?© & greater than \impl{?>?}\\ 499 ©?==?© & equality \impl{?==?}\\ 500 ©?!=?© & inequality \impl{?"!=?}\\ 501 ©?&?© & bitwise AND \impl{?&?}\\ 502 \end{tabular}\hfil 503 \begin{tabular}[t]{ll} 504 %identifier & operation \\ \hline 505 ©?^?© & exclusive OR \impl{?^?}\\ 506 ©?|?© & inclusive OR \impl{?"|?}\\ 507 ©?=?© & simple assignment \impl{?=?}\\ 508 ©?*=?© & multiplication assignment \impl{?*=?}\\ 509 ©?/=?© & division assignment \impl{?/=?}\\ 510 ©?%=?© & remainder assignment \impl{?%=?}\\ 511 ©?+=?© & addition assignment \impl{?+=?}\\ 512 ©?-=?© & subtraction assignment \impl{?-=?}\\ 513 ©?<<=?© & left-shift assignment \impl{?<<=?}\\ 514 ©?>>=?© & right-shift assignment \impl{?>>=?}\\ 515 ©?&=?© & bitwise AND assignment \impl{?&=?}\\ 516 ©?^=?© & exclusive OR assignment \impl{?^=?}\\ 517 ©?|=?© & inclusive OR assignment \impl{?"|=?}\\ 518 \end{tabular} 519 \hfil 482 520 \caption{Operator Identifiers} 483 521 \label{opids} -
doc/rob_thesis/Makefile
rcd7ef0b r275f4b4 1 TeXLIB = .:../LaTeXmacros:../bibliography/: 1 ## Define the appropriate configuration variables. 2 3 TeXLIB = .:../LaTeXmacros:../LaTeXmacros/listings:../LaTeXmacros/enumitem:../bibliography/: 2 4 LaTeX = TEXINPUTS=${TeXLIB} && export TEXINPUTS && pdflatex -halt-on-error 3 5 BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex 4 6 5 all : thesis.pdf 7 ## Define the text source files. 6 8 7 thesis.pdf : Makefile ../LaTeXmacros/common.tex cfa-format.tex thesis.tex intro.tex ctordtor.tex tuples.tex variadic.tex conclusions.tex 8 ${LaTeX} thesis 9 ${BibTeX} thesis 10 ${LaTeX} thesis 11 ${LaTeX} thesis 12 pdf2ps thesis.pdf thesis.ps 9 # SOURCES = ${addsuffix .tex, \ 10 # thesis \ 11 # } 13 12 14 clean : 13 # FIGURES = ${addsuffix .tex, \ 14 # } 15 16 # PICTURES = ${addsuffix .pstex, \ 17 # } 18 19 # PROGRAMS = ${addsuffix .tex, \ 20 # } 21 22 # GRAPHS = ${addsuffix .tex, \ 23 # } 24 25 # ## Define the documents that need to be made. 26 27 # DOCUMENT = thesis.pdf 28 29 # Directives # 30 31 # all : ${DOCUMENT} 32 33 # clean : 34 # rm -f *.bbl *.aux *.dvi *.idx *.ilg *.ind *.brf *.out *.log *.toc *.blg *.pstex_t *.cf \ 35 # ${FIGURES} ${PICTURES} ${PROGRAMS} ${GRAPHS} ${basename ${DOCUMENT}}.ps ${DOCUMENT} 36 37 # File Dependencies # 38 39 # ${DOCUMENT} : ${basename ${DOCUMENT}}.ps 40 # ps2pdf $< 41 42 # ${basename ${DOCUMENT}}.ps : ${basename ${DOCUMENT}}.dvi 43 # dvips $< -o $@ 44 45 # ${basename ${DOCUMENT}}.dvi : Makefile ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} ${basename ${DOCUMENT}}.tex \ 46 # ../LaTeXmacros/common.tex ../LaTeXmacros/indexstyle ../bibliography/cfa.bib 47 # # Conditionally create an empty *.ind (index) file for inclusion until makeindex is run. 48 # if [ ! -r ${basename $@}.ind ] ; then touch ${basename $@}.ind ; fi 49 # # Must have *.aux file containing citations for bibtex 50 # if [ ! -r ${basename $@}.aux ] ; then ${LaTeX} ${basename $@}.tex ; fi 51 # -${BibTeX} ${basename $@} 52 # # Some citations reference others so run steps again to resolve these citations 53 # ${LaTeX} ${basename $@}.tex 54 # -${BibTeX} ${basename $@} 55 # # Make index from *.aux entries and input index at end of document 56 # makeindex -s ../LaTeXmacros/indexstyle ${basename $@}.idx 57 # ${LaTeX} ${basename $@}.tex 58 # # Run again to get index title into table of contents 59 # ${LaTeX} ${basename $@}.tex 60 61 # predefined : 62 # sed -f predefined.sed ${basename ${DOCUMENT}}.tex > ${basename $@}.cf 63 64 # ## Define the default recipes. 65 66 # %.tex : %.fig 67 # fig2dev -L eepic $< > $@ 68 69 # %.ps : %.fig 70 # fig2dev -L ps $< > $@ 71 72 # %.pstex : %.fig 73 # fig2dev -L pstex $< > $@ 74 # fig2dev -L pstex_t -p $@ $< > $@_t 75 76 77 all: 78 $(LaTeX) thesis 79 $(BibTeX) thesis 80 $(LaTeX) thesis 81 $(LaTeX) thesis 82 83 clean: 15 84 rm -f *.aux *.bbl *.blg *.lof *.log *.lot *.out *.toc 16 85 17 sp otless: clean18 rm -f thesis.pdf thesis.ps86 splotless: clean 87 rm -f thesis.pdf -
doc/rob_thesis/thesis.tex
rcd7ef0b r275f4b4 135 135 pdfpagelabels=true, % adds page number as label in Acrobat's page count 136 136 bookmarks=true, % show bookmarks bar? 137 unicode=false, % non-Latin characters in Acrobat 's bookmarks138 pdftoolbar=true, % show Acrobat 's toolbar?139 pdfmenubar=true, % show Acrobat 's menu?137 unicode=false, % non-Latin characters in Acrobat’s bookmarks 138 pdftoolbar=true, % show Acrobat’s toolbar? 139 pdfmenubar=true, % show Acrobat’s menu? 140 140 pdffitwindow=false, % window fit to page when opened 141 141 pdfstartview={FitH}, % fits the width of the page to the window -
doc/user/Makefile
rcd7ef0b r275f4b4 9 9 SOURCES = ${addsuffix .tex, \ 10 10 user \ 11 ../refrat/keywords \12 ../refrat/operidents \13 11 } 14 12 -
doc/user/user.tex
rcd7ef0b r275f4b4 11 11 %% Created On : Wed Apr 6 14:53:29 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : S un Aug 6 10:24:21201714 %% Update Count : 303613 %% Last Modified On : Sat Jul 22 11:01:19 2017 14 %% Update Count : 2878 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 37 37 \usepackage{mathptmx} % better math font with "times" 38 38 \usepackage[usenames]{color} 39 \usepackage[pagewise]{lineno} 40 \renewcommand{\linenumberfont}{\scriptsize\sffamily} 39 41 \input{common} % common CFA document macros 40 42 \usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref} … … 42 44 \renewcommand{\UrlFont}{\small\sf} 43 45 44 \usepackage[pagewise]{lineno}45 \renewcommand{\linenumberfont}{\scriptsize\sffamily}46 \usepackage[firstpage]{draftwatermark}47 \SetWatermarkLightness{0.9}48 49 46 % Default underscore is too low and wide. Cannot use lstlisting "literate" as replacing underscore 50 47 % removes it as a variable-name character so keywords in variables are highlighted. MUST APPEAR 51 48 % AFTER HYPERREF. 49 \renewcommand{\_}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}} 52 50 \renewcommand{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}} 53 51 … … 58 56 59 57 \CFAStyle % use default CFA format-style 60 \lstnewenvironment{C++}[1][] % use C++ style 58 59 \lstnewenvironment{C++}[1][] 61 60 {\lstset{language=C++,moredelim=**[is][\protect\color{red}]{®}{®}#1}} 62 61 {} … … 79 78 \newcommand{\B}[1]{{\Textbf[blue]{#1}}} 80 79 \newcommand{\G}[1]{{\Textbf[OliveGreen]{#1}}} 81 \newcommand{\KWC}{K-W C\xspace}82 80 83 81 \newsavebox{\LstBox} … … 107 105 108 106 \date{ 109 \today107 DRAFT \\ \today 110 108 }% date 111 109 … … 199 197 This document is a programmer reference-manual for the \CFA programming language. 200 198 The manual covers the core features of the language and runtime-system, with simple examples illustrating syntax and semantics of each feature. 201 The manual does not teach programming, \iehow to combine the new constructs to build complex programs.199 The manual does not teach programming, i.e., how to combine the new constructs to build complex programs. 202 200 A reader should already have an intermediate knowledge of control flow, data structures, and concurrency issues to understand the ideas presented, as well as some experience programming in C/\CC. 203 201 Implementers should refer to the \CFA Programming Language Specification for details about the language syntax and semantics. … … 249 247 \section{History} 250 248 251 The \CFA project started with \Index*{ Dave Till}\index{Till, Dave}'s \Index*{K-W C}~\cite{Buhr94a,Till89}, which extended C with new declaration syntax, multiple return values from routines, and advanced assignment capabilities using the notion of tuples.249 The \CFA project started with \Index*{K-W C}~\cite{Buhr94a,Till89}, which extended C with new declaration syntax, multiple return values from routines, and advanced assignment capabilities using the notion of tuples. 252 250 (See~\cite{Werther96} for similar work in \Index*[C++]{\CC{}}.) 253 The first \CFA implementation of these extensions was by \Index*{Rodolfo Esteves}\index{Esteves, Rodolfo}~\cite{Esteves04}.251 The first \CFA implementation of these extensions was by Esteves~\cite{Esteves04}. 254 252 255 253 The signature feature of \CFA is \emph{\Index{overload}able} \Index{parametric-polymorphic} functions~\cite{forceone:impl,Cormack90,Duggan96} with functions generalized using a ©forall© clause (giving the language its name): … … 259 257 \end{lstlisting} 260 258 % extending the C type system with parametric polymorphism and overloading, as opposed to the \Index*[C++]{\CC{}} approach of object-oriented extensions. 261 \CFA{}\hspace{1pt}'s polymorphism was originally formalized by \Index*{Glen Ditchfield}\index{Ditchfield, Glen}~\cite{Ditchfield92}, and first implemented by \Index*{Richard Bilson}\index{Bilson, Richard}~\cite{Bilson03}.259 \CFA{}\hspace{1pt}'s polymorphism was originally formalized by Ditchfield~\cite{Ditchfield92}, and first implemented by Bilson~\cite{Bilson03}. 262 260 However, at that time, there was little interesting in extending C, so work did not continue. 263 261 As the saying goes, ``\Index*{What goes around, comes around.}'', and there is now renewed interest in the C programming language because of legacy code-bases, so the \CFA project has been restarted. … … 346 344 The command ©cfa© is used to compile a \CFA program and is based on the \Index{GNU} \Indexc{gcc} command, \eg: 347 345 \begin{cfa} 348 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] [ C/§\CFA{}§ source-files ] [ assembler/loaderfiles ]346 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA{}§-files [ assembler/loader-files ] 349 347 \end{cfa} 350 348 \CFA programs having the following ©gcc© flags turned on: … … 511 509 For both ©continue© and ©break©, the target label must be directly associated with a ©for©, ©while© or ©do© statement; 512 510 for ©break©, the target label can also be associated with a ©switch©, ©if© or compound (©{}©) statement. 513 \VRef[Figure]{f:MultiLevel Exit} shows ©continue© and ©break© indicating the specific control structure, and the corresponding C program using only ©goto© and labels.514 The innermost loop has 7 exit points, which cause continuation or termination of one or more of the 7 \Index{nested control-structure}s.511 \VRef[Figure]{f:MultiLevelResumeTermination} shows the labelled ©continue© and ©break©, specifying which control structure is the target for exit, and the corresponding C program using only ©goto©. 512 The innermost loop has 7 exit points, which cause resumption or termination of one or more of the 7 \Index{nested control-structure}s. 515 513 516 514 \begin{figure} 517 \begin{tabular}{@{\hspace{\parindentlnth}}l@{\hspace{ \parindentlnth}}l@{\hspace{\parindentlnth}}l@{}}518 \multicolumn{1}{ @{\hspace{\parindentlnth}}c@{\hspace{\parindentlnth}}}{\textbf{\CFA}} & \multicolumn{1}{@{\hspace{\parindentlnth}}c}{\textbf{C}} \\515 \begin{tabular}{@{\hspace{\parindentlnth}}l@{\hspace{1.5em}}l@{}} 516 \multicolumn{1}{c@{\hspace{1.5em}}}{\textbf{\CFA}} & \multicolumn{1}{c}{\textbf{C}} \\ 519 517 \begin{cfa} 520 518 ®LC:® { … … 525 523 ®LF:® for ( ... ) { 526 524 ®LW:® while ( ... ) { 527 ... break ®LC®; ... 528 ... break ®LS®; ... 529 ... break ®LIF®; ... 530 ... continue ®LF;® ... 531 ... break ®LF®; ... 532 ... continue ®LW®; ... 533 ... break ®LW®; ... 525 ... break ®LC®; ... // terminate compound 526 ... break ®LS®; ... // terminate switch 527 ... break ®LIF®; ... // terminate if 528 ... continue ®LF;® ... // resume loop 529 ... break ®LF®; ... // terminate loop 530 ... continue ®LW®; ... // resume loop 531 ... break ®LW®; ... // terminate loop 534 532 } // while 535 533 } // for 536 534 } else { 537 ... break ®LIF®; ... 535 ... break ®LIF®; ... // terminate if 538 536 } // if 539 537 } // switch … … 564 562 } ®LC:® ; 565 563 \end{cfa} 566 &567 \begin{cfa}568 569 570 571 572 573 574 575 // terminate compound576 // terminate switch577 // terminate if578 // continue loop579 // terminate loop580 // continue loop581 // terminate loop582 583 584 585 // terminate if586 587 588 589 \end{cfa}590 564 \end{tabular} 591 \caption{Multi-level Exit}592 \label{f:MultiLevel Exit}565 \caption{Multi-level Resume/Termination} 566 \label{f:MultiLevelResumeTermination} 593 567 \end{figure} 568 569 \begin{comment} 570 int main() { 571 LC: { 572 LS: switch ( 1 ) { 573 case 3: 574 LIF: if ( 1 ) { 575 LF: for ( ;; ) { 576 LW: while ( 1 ) { 577 break LC; // terminate compound 578 break LS; // terminate switch 579 break LIF; // terminate if 580 continue LF; // resume loop 581 break LF; // terminate loop 582 continue LW; // resume loop 583 break LW; // terminate loop 584 } // while 585 } // for 586 } else { 587 break LIF; // terminate if 588 } // if 589 } // switch 590 } // compound 591 { 592 switch ( 1 ) { 593 case 3: 594 if ( 1 ) { 595 for ( ;; ) { 596 while ( 1 ) { 597 goto LCx; 598 goto LSx; 599 goto LIF; 600 goto LFC; 601 goto LFB; 602 goto LWC; 603 goto LWB; 604 LWC: ; } LWB: ; 605 LFC: ; } LFB: ; 606 } else { 607 goto LIF; 608 } L3: ; 609 } LSx: ; 610 } LCx: ; 611 } 612 613 // Local Variables: // 614 // tab-width: 4 // 615 // End: // 616 \end{comment} 617 594 618 595 619 Both labelled ©continue© and ©break© are a ©goto©\index{goto@\lstinline $goto$!restricted} restricted in the following ways: … … 896 920 class C { 897 921 int i, j; 898 int mem() { §\C{\color{red}// implicit "this" parameter}§899 i = 1; §\C{\color{red}// this->i}§ 900 j = 2; §\C{\color{red}// this->j}§ 901 }922 int mem() { ®// implicit "this" parameter 923 ® i = 1; ®// this->i 924 ® j = 3; ®// this->j 925 ® } 902 926 } 903 927 \end{C++} … … 905 929 \begin{cfa} 906 930 struct S { int i, j; }; 907 int mem( S & ®this® ) { §\C{// explicit "this" parameter}§908 ®this.®i = 1; §\C{// "this" is not elided}§931 int mem( S &this ) { // explicit "this" parameter 932 ®this.®i = 1; // "this" is not elided 909 933 ®this.®j = 2; 910 934 } … … 914 938 \CFA provides a ©with© clause/statement (see Pascal~\cite[\S~4.F]{Pascal}) to elided the "©this.©" by opening a scope containing field identifiers, changing the qualified fields into variables and giving an opportunity for optimizing qualified references. 915 939 \begin{cfa} 916 int mem( S &this ) ®with this® { §\C{// with clause}§917 i = 1; §\C{\color{red}// this->i}§918 j = 2; §\C{\color{red}// this->j}§ 919 }940 int mem( S &this ) ®with this® { // with clause 941 i = 1; ®// this.i 942 ® j = 2; ®// this.j 943 ®} 920 944 \end{cfa} 921 945 which extends to multiple routine parameters: … … 968 992 Exception handling provides two mechanism: change of control flow from a raise to a handler, and communication from the raise to the handler. 969 993 Transfer of control can be local, within a routine, or non-local, among routines. 970 Non-local transfer can cause stack unwinding, \ienon-local routine termination, depending on the kind of raise.994 Non-local transfer can cause stack unwinding, i.e., non-local routine termination, depending on the kind of raise. 971 995 \begin{cfa} 972 996 exception_t E {}; §\C{// exception type}§ … … 977 1001 try { 978 1002 f(...); 979 } catch( E e : §boolean-predicate§ ) { §\C [8cm]{// termination handler}§1003 } catch( E e : §boolean-predicate§ ) { §\C{// termination handler}§ 980 1004 // recover and continue 981 } catchResume( E e : §boolean-predicate§ ) { §\C{// resumption handler} \CRT§1005 } catchResume( E e : §boolean-predicate§ ) { §\C{// resumption handler}§ 982 1006 // repair and return 983 1007 } finally { … … 1206 1230 1207 1231 As for \Index{division}, there are exponentiation operators for integral and floating-point types, including the builtin \Index{complex} types. 1208 Unsigned integral exponentiation\index{exponentiation!unsigned integral} is performed with repeated multiplication \footnote{The multiplication computation is optimized to $O(\log y)$.}(or shifting if the base is 2).1209 Signed integral exponentiation\index{exponentiation!signed integral} is performed with repeated multiplication (or shifting if the base is 2), but yields a floating-point result because $ x^{-y}=1/x^y$.1232 Unsigned integral exponentiation\index{exponentiation!unsigned integral} is performed with repeated multiplication (or shifting if the base is 2). 1233 Signed integral exponentiation\index{exponentiation!signed integral} is performed with repeated multiplication (or shifting if the base is 2), but yields a floating-point result because $b^{-e}=1/b^e$. 1210 1234 Hence, it is important to designate exponent integral-constants as unsigned or signed: ©3 \ 3u© return an integral result, while ©3 \ 3© returns a floating-point result. 1211 1235 Floating-point exponentiation\index{exponentiation!floating point} is performed using \Index{logarithm}s\index{exponentiation!logarithm}, so the base cannot be negative. … … 1422 1446 int w, x, y, z, & ar[3] = { x, y, z }; §\C{// initialize array of references}§ 1423 1447 &ar[1] = &w; §\C{// change reference array element}§ 1424 typeof( ar[1] ) p; §\C{// (gcc) is int, \iethe type of referenced object}§1425 typeof( &ar[1] ) q; §\C{// (gcc) is int \&, \iethe type of reference}§1426 sizeof( ar[1] ) == sizeof( int ); §\C{// is true, \iethe size of referenced object}§1427 sizeof( &ar[1] ) == sizeof( int *) §\C{// is true, \iethe size of a reference}§1448 typeof( ar[1] ) p; §\C{// (gcc) is int, i.e., the type of referenced object}§ 1449 typeof( &ar[1] ) q; §\C{// (gcc) is int \&, i.e., the type of reference}§ 1450 sizeof( ar[1] ) == sizeof( int ); §\C{// is true, i.e., the size of referenced object}§ 1451 sizeof( &ar[1] ) == sizeof( int *) §\C{// is true, i.e., the size of a reference}§ 1428 1452 \end{cfa} 1429 1453 … … 1764 1788 1765 1789 In detail, the brackets, ©[]©, enclose the result type, where each return value is named and that name is a local variable of the particular return type.\footnote{ 1766 \Index*{Michael Tiemann} \index{Tiemann, Michael}, with help from \Index*{Doug Lea}\index{Lea, Doug}, provided named return values in g++, circa 1989.}1790 \Index*{Michael Tiemann}, with help from \Index*{Doug Lea}, provided named return values in g++, circa 1989.} 1767 1791 The value of each local return variable is automatically returned at routine termination. 1768 1792 Declaration qualifiers can only appear at the start of a routine definition, \eg: … … 2221 2245 2222 2246 Currently, there are no \Index{lambda} expressions, \ie unnamed routines because routine names are very important to properly select the correct routine. 2223 2224 2225 \section{Tuple}2226 2227 In C and \CFA, lists of elements appear in several contexts, such as the parameter list of a routine call.2228 \begin{cfa}2229 f( ®2, x, 3 + i® ); §\C{// element list}§2230 \end{cfa}2231 A list of elements is called a \newterm{tuple}, and is different from a \Index{comma expression}.2232 2233 2234 \subsection{Multiple-Return-Value Functions}2235 \label{s:MRV_Functions}2236 2237 In standard C, functions can return at most one value.2238 To emulate functions with multiple return values, \emph{\Index{aggregation}} and/or \emph{\Index{aliasing}} is used.2239 In the former situation, the function designer creates a record type that combines all of the return values into a single type.2240 For example, consider a function returning the most frequently occurring letter in a string, and its frequency.2241 This example is complex enough to illustrate that an array is insufficient, since arrays are homogeneous, and demonstrates a potential pitfall that exists with aliasing.2242 \begin{cfa}2243 struct mf_ret {2244 int freq;2245 char ch;2246 };2247 2248 struct mf_ret most_frequent(const char * str) {2249 char freqs [26] = { 0 };2250 struct mf_ret ret = { 0, 'a' };2251 for (int i = 0; str[i] != '\0'; ++i) {2252 if (isalpha(str[i])) { // only count letters2253 int ch = tolower(str[i]); // convert to lower case2254 int idx = ch-'a';2255 if (++freqs[idx] > ret.freq) { // update on new max2256 ret.freq = freqs[idx];2257 ret.ch = ch;2258 }2259 }2260 }2261 return ret;2262 }2263 2264 const char * str = "hello world";2265 struct mf_ret ret = most_frequent(str);2266 printf("%s -- %d %c\n", str, ret.freq, ret.ch);2267 \end{cfa}2268 Of note, the designer must come up with a name for the return type and for each of its fields.2269 Unnecessary naming is a common programming language issue, introducing verbosity and a complication of the user's mental model.2270 That is, adding another named type creates another association in the programmer's mind that needs to be kept track of when reading and writing code.2271 As such, this technique is effective when used sparingly, but can quickly get out of hand if many functions need to return different combinations of types.2272 2273 In the latter approach, the designer simulates multiple return values by passing the additional return values as pointer parameters.2274 The pointer parameters are assigned inside of the routine body to emulate a return.2275 Using the same example,2276 \begin{cfa}2277 int most_frequent(const char * str, char * ret_ch) {2278 char freqs [26] = { 0 };2279 int ret_freq = 0;2280 for (int i = 0; str[i] != '\0'; ++i) {2281 if (isalpha(str[i])) { // only count letters2282 int ch = tolower(str[i]); // convert to lower case2283 int idx = ch-'a';2284 if (++freqs[idx] > ret_freq) { // update on new max2285 ret_freq = freqs[idx];2286 *ret_ch = ch; // assign to out parameter2287 }2288 }2289 }2290 return ret_freq; // only one value returned directly2291 }2292 2293 const char * str = "hello world";2294 char ch; // pre-allocate return value2295 int freq = most_frequent(str, &ch); // pass return value as out parameter2296 printf("%s -- %d %c\n", str, freq, ch);2297 \end{cfa}2298 Notably, using this approach, the caller is directly responsible for allocating storage for the additional temporary return values, which complicates the call site with a sequence of variable declarations leading up to the call.2299 Also, while a disciplined use of ©const© can give clues about whether a pointer parameter is going to be used as an out parameter, it is not immediately obvious from only the routine signature whether the callee expects such a parameter to be initialized before the call.2300 Furthermore, while many C routines that accept pointers are designed so that it is safe to pass ©NULL© as a parameter, there are many C routines that are not null-safe.2301 On a related note, C does not provide a standard mechanism to state that a parameter is going to be used as an additional return value, which makes the job of ensuring that a value is returned more difficult for the compiler.2302 Interestingly, there is a subtle bug in the previous example, in that ©ret_ch© is never assigned for a string that does not contain any letters, which can lead to undefined behaviour.2303 In this particular case, it turns out that the frequency return value also doubles as an error code, where a frequency of 0 means the character return value should be ignored.2304 Still, not every routine with multiple return values should be required to return an error code, and error codes are easily ignored, so this is not a satisfying solution.2305 As with the previous approach, this technique can simulate multiple return values, but in practice it is verbose and error prone.2306 2307 In \CFA, functions can be declared to return multiple values with an extension to the function declaration syntax.2308 Multiple return values are declared as a comma-separated list of types in square brackets in the same location that the return type appears in standard C function declarations.2309 The ability to return multiple values from a function requires a new syntax for the return statement.2310 For consistency, the return statement in \CFA accepts a comma-separated list of expressions in square brackets.2311 The expression resolution phase of the \CFA translator ensures that the correct form is used depending on the values being returned and the return type of the current function.2312 A multiple-returning function with return type ©T© can return any expression that is implicitly convertible to ©T©.2313 Using the running example, the ©most_frequent© function can be written using multiple return values as such,2314 \begin{cfa}2315 [int, char] most_frequent(const char * str) {2316 char freqs [26] = { 0 };2317 int ret_freq = 0;2318 char ret_ch = 'a'; // arbitrary default value for consistent results2319 for (int i = 0; str[i] != '\0'; ++i) {2320 if (isalpha(str[i])) { // only count letters2321 int ch = tolower(str[i]); // convert to lower case2322 int idx = ch-'a';2323 if (++freqs[idx] > ret_freq) { // update on new max2324 ret_freq = freqs[idx];2325 ret_ch = ch;2326 }2327 }2328 }2329 return [ret_freq, ret_ch];2330 }2331 \end{cfa}2332 This approach provides the benefits of compile-time checking for appropriate return statements as in aggregation, but without the required verbosity of declaring a new named type, which precludes the bug seen with out-parameters.2333 2334 The addition of multiple-return-value functions necessitates a syntax for accepting multiple values at the call-site.2335 The simplest mechanism for retaining a return value in C is variable assignment.2336 By assigning the return value into a variable, its value can be retrieved later at any point in the program.2337 As such, \CFA allows assigning multiple values from a function into multiple variables, using a square-bracketed list of lvalue expressions on the left side.2338 \begin{cfa}2339 const char * str = "hello world";2340 int freq;2341 char ch;2342 [freq, ch] = most_frequent(str); // assign into multiple variables2343 printf("%s -- %d %c\n", str, freq, ch);2344 \end{cfa}2345 It is also common to use a function's output as the input to another function.2346 \CFA also allows this case, without any new syntax.2347 When a function call is passed as an argument to another call, the expression resolver attempts to find the best match of actual arguments to formal parameters given all of the possible expression interpretations in the current scope \cite{Bilson03}.2348 For example,2349 \begin{cfa}2350 void process(int); // (1)2351 void process(char); // (2)2352 void process(int, char); // (3)2353 void process(char, int); // (4)2354 2355 process(most_frequent("hello world")); // selects (3)2356 \end{cfa}2357 In this case, there is only one option for a function named ©most_frequent© that takes a string as input.2358 This function returns two values, one ©int© and one ©char©.2359 There are four options for a function named ©process©, but only two that accept two arguments, and of those the best match is (3), which is also an exact match.2360 This expression first calls ©most_frequent("hello world")©, which produces the values ©3© and ©'l'©, which are fed directly to the first and second parameters of (3), respectively.2361 2362 \section{Tuple Expressions}2363 Multiple-return-value functions provide \CFA with a new syntax for expressing a combination of expressions in the return statement and a combination of types in a function signature.2364 These notions can be generalized to provide \CFA with \emph{tuple expressions} and \emph{tuple types}.2365 A tuple expression is an expression producing a fixed-size, ordered list of values of heterogeneous types.2366 The type of a tuple expression is the tuple of the subexpression types, or a \emph{tuple type}.2367 In \CFA, a tuple expression is denoted by a comma-separated list of expressions enclosed in square brackets.2368 For example, the expression ©[5, 'x', 10.5]© has type ©[int, char, double]©.2369 The previous expression has 3 \emph{components}.2370 Each component in a tuple expression can be any \CFA expression, including another tuple expression.2371 The order of evaluation of the components in a tuple expression is unspecified, to allow a compiler the greatest flexibility for program optimization.2372 It is, however, guaranteed that each component of a tuple expression is evaluated for side-effects, even if the result is not used.2373 Multiple-return-value functions can equivalently be called \emph{tuple-returning functions}.2374 2375 \subsection{Tuple Variables}2376 The call-site of the ©most_frequent© routine has a notable blemish, in that it required the preallocation of return variables in a manner similar to the aliasing example, since it is impossible to declare multiple variables of different types in the same declaration in standard C.2377 In \CFA, it is possible to overcome this restriction by declaring a \emph{tuple variable}.2378 \begin{cfa}[emph=ret, emphstyle=\color{red}]2379 const char * str = "hello world";2380 [int, char] ret = most_frequent(str); // initialize tuple variable2381 printf("%s -- %d %c\n", str, ret);2382 \end{cfa}2383 It is now possible to accept multiple values into a single piece of storage, in much the same way that it was previously possible to pass multiple values from one function call to another.2384 These variables can be used in any of the contexts where a tuple expression is allowed, such as in the ©printf© function call.2385 As in the ©process© example, the components of the tuple value are passed as separate parameters to ©printf©, allowing very simple printing of tuple expressions.2386 One way to access the individual components is with a simple assignment, as in previous examples.2387 \begin{cfa}2388 int freq;2389 char ch;2390 [freq, ch] = ret;2391 \end{cfa}2392 2393 \begin{sloppypar}2394 In addition to variables of tuple type, it is also possible to have pointers to tuples, and arrays of tuples.2395 Tuple types can be composed of any types, except for array types, since array assignment is disallowed, which makes tuple assignment difficult when a tuple contains an array.2396 \begin{cfa}2397 [double, int] di;2398 [double, int] * pdi2399 [double, int] adi[10];2400 \end{cfa}2401 This examples declares a variable of type ©[double, int]©, a variable of type pointer to ©[double, int]©, and an array of ten ©[double, int]©.2402 \end{sloppypar}2403 2404 \subsection{Tuple Indexing}2405 2406 At times, it is desirable to access a single component of a tuple-valued expression without creating unnecessary temporary variables to assign to.2407 Given a tuple-valued expression ©e© and a compile-time constant integer $i$ where $0 \leq i < n$, where $n$ is the number of components in ©e©, ©e.i© accesses the $i$\textsuperscript{th} component of ©e©.2408 For example,2409 \begin{cfa}2410 [int, double] x;2411 [char *, int] f();2412 void g(double, int);2413 [int, double] * p;2414 2415 int y = x.0; §\C{// access int component of x}§2416 y = f().1; §\C{// access int component of f}§2417 p->0 = 5; §\C{// access int component of tuple pointed-to by p}§2418 g( x.1, x.0 ); §\C{// rearrange x to pass to g}§2419 double z = [x, f()].0.1; §\C{// access second component of first component of tuple expression}§2420 \end{cfa}2421 As seen above, tuple-index expressions can occur on any tuple-typed expression, including tuple-returning functions, square-bracketed tuple expressions, and other tuple-index expressions, provided the retrieved component is also a tuple.2422 This feature was proposed for \KWC but never implemented \cite[p.~45]{Till89}.2423 2424 \subsection{Flattening and Structuring}2425 As evident in previous examples, tuples in \CFA do not have a rigid structure.2426 In function call contexts, tuples support implicit flattening and restructuring conversions.2427 Tuple flattening recursively expands a tuple into the list of its basic components.2428 Tuple structuring packages a list of expressions into a value of tuple type.2429 \begin{cfa}2430 int f(int, int);2431 int g([int, int]);2432 int h(int, [int, int]);2433 [int, int] x;2434 int y;2435 2436 f(x); // flatten2437 g(y, 10); // structure2438 h(x, y); // flatten & structure2439 \end{cfa}2440 In \CFA, each of these calls is valid.2441 In the call to ©f©, ©x© is implicitly flattened so that the components of ©x© are passed as the two arguments to ©f©.2442 For the call to ©g©, the values ©y© and ©10© are structured into a single argument of type ©[int, int]© to match the type of the parameter of ©g©.2443 Finally, in the call to ©h©, ©x© is flattened to yield an argument list of length 3, of which the first component of ©x© is passed as the first parameter of ©h©, and the second component of ©x© and ©y© are structured into the second argument of type ©[int, int]©.2444 The flexible structure of tuples permits a simple and expressive function-call syntax to work seamlessly with both single- and multiple-return-value functions, and with any number of arguments of arbitrarily complex structure.2445 2446 In \KWC \cite{Buhr94a,Till89}, there were 4 tuple coercions: opening, closing, flattening, and structuring.2447 Opening coerces a tuple value into a tuple of values, while closing converts a tuple of values into a single tuple value.2448 Flattening coerces a nested tuple into a flat tuple, \ie it takes a tuple with tuple components and expands it into a tuple with only non-tuple components.2449 Structuring moves in the opposite direction, \ie it takes a flat tuple value and provides structure by introducing nested tuple components.2450 2451 In \CFA, the design has been simplified to require only the two conversions previously described, which trigger only in function call and return situations.2452 This simplification is a primary contribution of this thesis to the design of tuples in \CFA.2453 Specifically, the expression resolution algorithm examines all of the possible alternatives for an expression to determine the best match.2454 In resolving a function call expression, each combination of function value and list of argument alternatives is examined.2455 Given a particular argument list and function value, the list of argument alternatives is flattened to produce a list of non-tuple valued expressions.2456 Then the flattened list of expressions is compared with each value in the function's parameter list.2457 If the parameter's type is not a tuple type, then the current argument value is unified with the parameter type, and on success the next argument and parameter are examined.2458 If the parameter's type is a tuple type, then the structuring conversion takes effect, recursively applying the parameter matching algorithm using the tuple's component types as the parameter list types.2459 Assuming a successful unification, eventually the algorithm gets to the end of the tuple type, which causes all of the matching expressions to be consumed and structured into a tuple expression.2460 For example, in2461 \begin{cfa}2462 int f(int, [double, int]);2463 f([5, 10.2], 4);2464 \end{cfa}2465 There is only a single definition of ©f©, and 3 arguments with only single interpretations.2466 First, the argument alternative list ©[5, 10.2], 4© is flattened to produce the argument list ©5, 10.2, 4©.2467 Next, the parameter matching algorithm begins, with $P = $©int© and $A = $©int©, which unifies exactly.2468 Moving to the next parameter and argument, $P = $©[double, int]© and $A = $©double©.2469 This time, the parameter is a tuple type, so the algorithm applies recursively with $P' = $©double© and $A = $©double©, which unifies exactly.2470 Then $P' = $©int© and $A = $©double©, which again unifies exactly.2471 At this point, the end of $P'$ has been reached, so the arguments ©10.2, 4© are structured into the tuple expression ©[10.2, 4]©.2472 Finally, the end of the parameter list $P$ has also been reached, so the final expression is ©f(5, [10.2, 4])©.2473 2474 \section{Tuple Assignment}2475 \label{s:TupleAssignment}2476 An assignment where the left side of the assignment operator has a tuple type is called tuple assignment.2477 There are two kinds of tuple assignment depending on whether the right side of the assignment operator has a tuple type or a non-tuple type, called \emph{Multiple} and \emph{Mass} Assignment, respectively.2478 \begin{cfa}2479 int x;2480 double y;2481 [int, double] z;2482 [y, x] = 3.14; // mass assignment2483 [x, y] = z; // multiple assignment2484 z = 10; // mass assignment2485 z = [x, y]; // multiple assignment2486 \end{cfa}2487 Let $L_i$ for $i$ in $[0, n)$ represent each component of the flattened left side, $R_i$ represent each component of the flattened right side of a multiple assignment, and $R$ represent the right side of a mass assignment.2488 2489 For a multiple assignment to be valid, both tuples must have the same number of elements when flattened.2490 For example, the following is invalid because the number of components on the left does not match the number of components on the right.2491 \begin{cfa}2492 [int, int] x, y, z;2493 [x, y] = z; // multiple assignment, invalid 4 != 22494 \end{cfa}2495 Multiple assignment assigns $R_i$ to $L_i$ for each $i$.2496 That is, ©?=?(&$L_i$, $R_i$)© must be a well-typed expression.2497 In the previous example, ©[x, y] = z©, ©z© is flattened into ©z.0, z.1©, and the assignments ©x = z.0© and ©y = z.1© happen.2498 2499 A mass assignment assigns the value $R$ to each $L_i$.2500 For a mass assignment to be valid, ©?=?(&$L_i$, $R$)© must be a well-typed expression.2501 These semantics differ from C cascading assignment (\eg ©a=b=c©) in that conversions are applied to $R$ in each individual assignment, which prevents data loss from the chain of conversions that can happen during a cascading assignment.2502 For example, ©[y, x] = 3.14© performs the assignments ©y = 3.14© and ©x = 3.14©, which results in the value ©3.14© in ©y© and the value ©3© in ©x©.2503 On the other hand, the C cascading assignment ©y = x = 3.14© performs the assignments ©x = 3.14© and ©y = x©, which results in the value ©3© in ©x©, and as a result the value ©3© in ©y© as well.2504 2505 Both kinds of tuple assignment have parallel semantics, such that each value on the left side and right side is evaluated \emph{before} any assignments occur.2506 As a result, it is possible to swap the values in two variables without explicitly creating any temporary variables or calling a function.2507 \begin{cfa}2508 int x = 10, y = 20;2509 [x, y] = [y, x];2510 \end{cfa}2511 After executing this code, ©x© has the value ©20© and ©y© has the value ©10©.2512 2513 In \CFA, tuple assignment is an expression where the result type is the type of the left side of the assignment, as in normal assignment.2514 That is, a tuple assignment produces the value of the left-hand side after assignment.2515 These semantics allow cascading tuple assignment to work out naturally in any context where a tuple is permitted.2516 These semantics are a change from the original tuple design in \KWC \cite{Till89}, wherein tuple assignment was a statement that allows cascading assignments as a special case.2517 Restricting tuple assignment to statements was an attempt to to fix what was seen as a problem with side-effects, wherein assignment can be used in many different locations, such as in function-call argument position.2518 While permitting assignment as an expression does introduce the potential for subtle complexities, it is impossible to remove assignment expressions from \CFA without affecting backwards compatibility.2519 Furthermore, there are situations where permitting assignment as an expression improves readability by keeping code succinct and reducing repetition, and complicating the definition of tuple assignment puts a greater cognitive burden on the user.2520 In another language, tuple assignment as a statement could be reasonable, but it would be inconsistent for tuple assignment to be the only kind of assignment that is not an expression.2521 In addition, \KWC permits the compiler to optimize tuple assignment as a block copy, since it does not support user-defined assignment operators.2522 This optimization could be implemented in \CFA, but it requires the compiler to verify that the selected assignment operator is trivial.2523 2524 The following example shows multiple, mass, and cascading assignment used in one expression2525 \begin{cfa}2526 int a, b;2527 double c, d;2528 [void] f([int, int]);2529 f([c, a] = [b, d] = 1.5); // assignments in parameter list2530 \end{cfa}2531 The tuple expression begins with a mass assignment of ©1.5© into ©[b, d]©, which assigns ©1.5© into ©b©, which is truncated to ©1©, and ©1.5© into ©d©, producing the tuple ©[1, 1.5]© as a result.2532 That tuple is used as the right side of the multiple assignment (\ie, ©[c, a] = [1, 1.5]©) that assigns ©1© into ©c© and ©1.5© into ©a©, which is truncated to ©1©, producing the result ©[1, 1]©.2533 Finally, the tuple ©[1, 1]© is used as an expression in the call to ©f©.2534 2535 \subsection{Tuple Construction}2536 Tuple construction and destruction follow the same rules and semantics as tuple assignment, except that in the case where there is no right side, the default constructor or destructor is called on each component of the tuple.2537 As constructors and destructors did not exist in previous versions of \CFA or in \KWC, this is a primary contribution of this thesis to the design of tuples.2538 \begin{cfa}2539 struct S;2540 void ?{}(S *); // (1)2541 void ?{}(S *, int); // (2)2542 void ?{}(S * double); // (3)2543 void ?{}(S *, S); // (4)2544 2545 [S, S] x = [3, 6.28]; // uses (2), (3), specialized constructors2546 [S, S] y; // uses (1), (1), default constructor2547 [S, S] z = x.0; // uses (4), (4), copy constructor2548 \end{cfa}2549 In this example, ©x© is initialized by the multiple constructor calls ©?{}(&x.0, 3)© and ©?{}(&x.1, 6.28)©, while ©y© is initialized by two default constructor calls ©?{}(&y.0)© and ©?{}(&y.1)©.2550 ©z© is initialized by mass copy constructor calls ©?{}(&z.0, x.0)© and ©?{}(&z.1, x.0)©.2551 Finally, ©x©, ©y©, and ©z© are destructed, \ie the calls ©^?{}(&x.0)©, ©^?{}(&x.1)©, ©^?{}(&y.0)©, ©^?{}(&y.1)©, ©^?{}(&z.0)©, and ©^?{}(&z.1)©.2552 2553 It is possible to define constructors and assignment functions for tuple types that provide new semantics, if the existing semantics do not fit the needs of an application.2554 For example, the function ©void ?{}([T, U] *, S);© can be defined to allow a tuple variable to be constructed from a value of type ©S©.2555 \begin{cfa}2556 struct S { int x; double y; };2557 void ?{}([int, double] * this, S s) {2558 this->0 = s.x;2559 this->1 = s.y;2560 }2561 \end{cfa}2562 Due to the structure of generated constructors, it is possible to pass a tuple to a generated constructor for a type with a member prefix that matches the type of the tuple.2563 For example,2564 \begin{cfa}2565 struct S { int x; double y; int z };2566 [int, double] t;2567 S s = t;2568 \end{cfa}2569 The initialization of ©s© with ©t© works by default because ©t© is flattened into its components, which satisfies the generated field constructor ©?{}(S *, int, double)© to initialize the first two values.2570 2571 \section{Member-Access Tuple Expression}2572 \label{s:MemberAccessTuple}2573 It is possible to access multiple fields from a single expression using a \emph{Member-Access Tuple Expression}.2574 The result is a single tuple-valued expression whose type is the tuple of the types of the members.2575 For example,2576 \begin{cfa}2577 struct S { int x; double y; char * z; } s;2578 s.[x, y, z];2579 \end{cfa}2580 Here, the type of ©s.[x, y, z]© is ©[int, double, char *]©.2581 A member tuple expression has the form ©a.[x, y, z];© where ©a© is an expression with type ©T©, where ©T© supports member access expressions, and ©x, y, z© are all members of ©T© with types ©T$_x$©, ©T$_y$©, and ©T$_z$© respectively.2582 Then the type of ©a.[x, y, z]© is ©[T_x, T_y, T_z]©.2583 2584 Since tuple index expressions are a form of member-access expression, it is possible to use tuple-index expressions in conjunction with member tuple expressions to manually restructure a tuple (\eg, rearrange components, drop components, duplicate components, etc.).2585 \begin{cfa}2586 [int, int, long, double] x;2587 void f(double, long);2588 2589 f(x.[0, 3]); // f(x.0, x.3)2590 x.[0, 1] = x.[1, 0]; // [x.0, x.1] = [x.1, x.0]2591 [long, int, long] y = x.[2, 0, 2];2592 \end{cfa}2593 2594 It is possible for a member tuple expression to contain other member access expressions.2595 For example,2596 \begin{cfa}2597 struct A { double i; int j; };2598 struct B { int * k; short l; };2599 struct C { int x; A y; B z; } v;2600 v.[x, y.[i, j], z.k];2601 \end{cfa}2602 This expression is equivalent to ©[v.x, [v.y.i, v.y.j], v.z.k]©.2603 That is, the aggregate expression is effectively distributed across the tuple, which allows simple and easy access to multiple components in an aggregate, without repetition.2604 It is guaranteed that the aggregate expression to the left of the ©.© in a member tuple expression is evaluated exactly once.2605 As such, it is safe to use member tuple expressions on the result of a side-effecting function.2606 \begin{cfa}2607 [int, float, double] f();2608 [double, float] x = f().[2, 1];2609 \end{cfa}2610 2611 In \KWC, member tuple expressions are known as \emph{record field tuples} \cite{Till89}.2612 Since \CFA permits these tuple-access expressions using structures, unions, and tuples, \emph{member tuple expression} or \emph{field tuple expression} is more appropriate.2613 2614 It is possible to extend member-access expressions further.2615 Currently, a member-access expression whose member is a name requires that the aggregate is a structure or union, while a constant integer member requires the aggregate to be a tuple.2616 In the interest of orthogonal design, \CFA could apply some meaning to the remaining combinations as well.2617 For example,2618 \begin{cfa}2619 struct S { int x, y; } s;2620 [S, S] z;2621 2622 s.x; // access member2623 z.0; // access component2624 2625 s.1; // ???2626 z.y; // ???2627 \end{cfa}2628 One possibility is for ©s.1© to select the second member of ©s©.2629 Under this interpretation, it becomes possible to not only access members of a struct by name, but also by position.2630 Likewise, it seems natural to open this mechanism to enumerations as well, wherein the left side would be a type, rather than an expression.2631 One benefit of this interpretation is familiarity, since it is extremely reminiscent of tuple-index expressions.2632 On the other hand, it could be argued that this interpretation is brittle in that changing the order of members or adding new members to a structure becomes a brittle operation.2633 This problem is less of a concern with tuples, since modifying a tuple affects only the code that directly uses the tuple, whereas modifying a structure has far reaching consequences for every instance of the structure.2634 2635 As for ©z.y©, one interpretation is to extend the meaning of member tuple expressions.2636 That is, currently the tuple must occur as the member, \ie to the right of the dot.2637 Allowing tuples to the left of the dot could distribute the member across the elements of the tuple, in much the same way that member tuple expressions distribute the aggregate across the member tuple.2638 In this example, ©z.y© expands to ©[z.0.y, z.1.y]©, allowing what is effectively a very limited compile-time field-sections map operation, where the argument must be a tuple containing only aggregates having a member named ©y©.2639 It is questionable how useful this would actually be in practice, since structures often do not have names in common with other structures, and further this could cause maintainability issues in that it encourages programmers to adopt very simple naming conventions to maximize the amount of overlap between different types.2640 Perhaps more useful would be to allow arrays on the left side of the dot, which would likewise allow mapping a field access across the entire array, producing an array of the contained fields.2641 The immediate problem with this idea is that C arrays do not carry around their size, which would make it impossible to use this extension for anything other than a simple stack allocated array.2642 2643 Supposing this feature works as described, it would be necessary to specify an ordering for the expansion of member-access expressions versus member-tuple expressions.2644 \begin{cfa}2645 struct { int x, y; };2646 [S, S] z;2647 z.[x, y]; // ???2648 // => [z.0, z.1].[x, y]2649 // => [z.0.x, z.0.y, z.1.x, z.1.y]2650 // or2651 // => [z.x, z.y]2652 // => [[z.0, z.1].x, [z.0, z.1].y]2653 // => [z.0.x, z.1.x, z.0.y, z.1.y]2654 \end{cfa}2655 Depending on exactly how the two tuples are combined, different results can be achieved.2656 As such, a specific ordering would need to be imposed to make this feature useful.2657 Furthermore, this addition moves a member-tuple expression's meaning from being clear statically to needing resolver support, since the member name needs to be distributed appropriately over each member of the tuple, which could itself be a tuple.2658 2659 A second possibility is for \CFA to have named tuples, as they exist in Swift and D.2660 \begin{cfa}2661 typedef [int x, int y] Point2D;2662 Point2D p1, p2;2663 p1.x + p1.y + p2.x + p2.y;2664 p1.0 + p1.1 + p2.0 + p2.1; // equivalent2665 \end{cfa}2666 In this simpler interpretation, a tuple type carries with it a list of possibly empty identifiers.2667 This approach fits naturally with the named return-value feature, and would likely go a long way towards implementing it.2668 2669 Ultimately, the first two extensions introduce complexity into the model, with relatively little perceived benefit, and so were dropped from consideration.2670 Named tuples are a potentially useful addition to the language, provided they can be parsed with a reasonable syntax.2671 2672 2673 \section{Casting}2674 In C, the cast operator is used to explicitly convert between types.2675 In \CFA, the cast operator has a secondary use, which is type ascription, since it forces the expression resolution algorithm to choose the lowest cost conversion to the target type.2676 That is, a cast can be used to select the type of an expression when it is ambiguous, as in the call to an overloaded function.2677 \begin{cfa}2678 int f(); // (1)2679 double f(); // (2)2680 2681 f(); // ambiguous - (1),(2) both equally viable2682 (int)f(); // choose (2)2683 \end{cfa}2684 Since casting is a fundamental operation in \CFA, casts need to be given a meaningful interpretation in the context of tuples.2685 Taking a look at standard C provides some guidance with respect to the way casts should work with tuples.2686 \begin{cfa}[numbers=left]2687 int f();2688 void g();2689 2690 (void)f(); // valid, ignore results2691 (int)g(); // invalid, void cannot be converted to int2692 2693 struct A { int x; };2694 (struct A)f(); // invalid, int cannot be converted to A2695 \end{cfa}2696 In C, line 4 is a valid cast, which calls ©f© and discards its result.2697 On the other hand, line 5 is invalid, because ©g© does not produce a result, so requesting an ©int© to materialize from nothing is nonsensical.2698 Finally, line 8 is also invalid, because in C casts only provide conversion between scalar types \cite[p.~91]{C11}.2699 For consistency, this implies that any case wherein the number of components increases as a result of the cast is invalid, while casts that have the same or fewer number of components may be valid.2700 2701 Formally, a cast to tuple type is valid when $T_n \leq S_m$, where $T_n$ is the number of components in the target type and $S_m$ is the number of components in the source type, and for each $i$ in $[0, n)$, $S_i$ can be cast to $T_i$.2702 Excess elements ($S_j$ for all $j$ in $[n, m)$) are evaluated, but their values are discarded so that they are not included in the result expression.2703 This discarding naturally follows the way that a cast to void works in C.2704 2705 For example,2706 \begin{cfa}2707 [int, int, int] f();2708 [int, [int, int], int] g();2709 2710 ([int, double])f(); // (1) valid2711 ([int, int, int])g(); // (2) valid2712 ([void, [int, int]])g(); // (3) valid2713 ([int, int, int, int])g(); // (4) invalid2714 ([int, [int, int, int]])g(); // (5) invalid2715 \end{cfa}2716 2717 (1) discards the last element of the return value and converts the second element to type double.2718 Since ©int© is effectively a 1-element tuple, (2) discards the second component of the second element of the return value of ©g©.2719 If ©g© is free of side effects, this is equivalent to ©[(int)(g().0), (int)(g().1.0), (int)(g().2)]©.2720 Since ©void© is effectively a 0-element tuple, (3) discards the first and third return values, which is effectively equivalent to ©[(int)(g().1.0), (int)(g().1.1)]©).2721 % will this always hold true? probably, as constructors should give all of the conversion power we need. if casts become function calls, what would they look like? would need a way to specify the target type, which seems awkward. Also, C++ basically only has this because classes are closed to extension, while we don't have that problem (can have floating constructors for any type).2722 Note that a cast is not a function call in \CFA, so flattening and structuring conversions do not occur for cast expressions.2723 As such, (4) is invalid because the cast target type contains 4 components, while the source type contains only 3.2724 Similarly, (5) is invalid because the cast ©([int, int, int])(g().1)© is invalid.2725 That is, it is invalid to cast ©[int, int]© to ©[int, int, int]©.2726 2727 \section{Polymorphism}2728 Due to the implicit flattening and structuring conversions involved in argument passing, ©otype© and ©dtype© parameters are restricted to matching only with non-tuple types.2729 The integration of polymorphism, type assertions, and monomorphic specialization of tuple-assertions are a primary contribution of this thesis to the design of tuples.2730 \begin{cfa}2731 forall(otype T, dtype U)2732 void f(T x, U * y);2733 2734 f([5, "hello"]);2735 \end{cfa}2736 In this example, ©[5, "hello"]© is flattened, so that the argument list appears as ©5, "hello"©.2737 The argument matching algorithm binds ©T© to ©int© and ©U© to ©const char©, and calls the function as normal.2738 2739 Tuples can contain otype and dtype components.2740 For example, a plus operator can be written to add two triples of a type together.2741 \begin{cfa}2742 forall(otype T | { T ?+?(T, T); })2743 [T, T, T] ?+?([T, T, T] x, [T, T, T] y) {2744 return [x.0+y.0, x.1+y.1, x.2+y.2];2745 }2746 [int, int, int] x;2747 int i1, i2, i3;2748 [i1, i2, i3] = x + ([10, 20, 30]);2749 \end{cfa}2750 Note that due to the implicit tuple conversions, this function is not restricted to the addition of two triples.2751 A call to this plus operator type checks as long as a total of 6 non-tuple arguments are passed after flattening, and all of the arguments have a common type that can bind to ©T©, with a pairwise ©?+?© over ©T©.2752 For example, these expressions also succeed and produce the same value.2753 \begin{cfa}2754 ([x.0, x.1]) + ([x.2, 10, 20, 30]); // x + ([10, 20, 30])2755 x.0 + ([x.1, x.2, 10, 20, 30]); // x + ([10, 20, 30])2756 \end{cfa}2757 This presents a potential problem if structure is important, as these three expressions look like they should have different meanings.2758 Furthermore, these calls can be made ambiguous by introducing seemingly different functions.2759 \begin{cfa}2760 forall(otype T | { T ?+?(T, T); })2761 [T, T, T] ?+?([T, T] x, [T, T, T, T]);2762 forall(otype T | { T ?+?(T, T); })2763 [T, T, T] ?+?(T x, [T, T, T, T, T]);2764 \end{cfa}2765 It is also important to note that these calls could be disambiguated if the function return types were different, as they likely would be for a reasonable implementation of ©?+?©, since the return type is used in overload resolution.2766 Still, these semantics are a deficiency of the current argument matching algorithm, and depending on the function, differing return values may not always be appropriate.2767 These issues could be rectified by applying an appropriate conversion cost to the structuring and flattening conversions, which are currently 0-cost conversions in the expression resolver.2768 Care would be needed in this case to ensure that exact matches do not incur such a cost.2769 \begin{cfa}2770 void f([int, int], int, int);2771 2772 f([0, 0], 0, 0); // no cost2773 f(0, 0, 0, 0); // cost for structuring2774 f([0, 0,], [0, 0]); // cost for flattening2775 f([0, 0, 0], 0); // cost for flattening and structuring2776 \end{cfa}2777 2778 Until this point, it has been assumed that assertion arguments must match the parameter type exactly, modulo polymorphic specialization (\ie, no implicit conversions are applied to assertion arguments).2779 This decision presents a conflict with the flexibility of tuples.2780 \subsection{Assertion Inference}2781 \begin{cfa}2782 int f([int, double], double);2783 forall(otype T, otype U | { T f(T, U, U); })2784 void g(T, U);2785 g(5, 10.21);2786 \end{cfa}2787 If assertion arguments must match exactly, then the call to ©g© cannot be resolved, since the expected type of ©f© is flat, while the only ©f© in scope requires a tuple type.2788 Since tuples are fluid, this requirement reduces the usability of tuples in polymorphic code.2789 To ease this pain point, function parameter and return lists are flattened for the purposes of type unification, which allows the previous example to pass expression resolution.2790 2791 This relaxation is made possible by extending the existing thunk generation scheme, as described by Bilson \cite{Bilson03}.2792 Now, whenever a candidate's parameter structure does not exactly match the formal parameter's structure, a thunk is generated to specialize calls to the actual function.2793 \begin{cfa}2794 int _thunk(int _p0, double _p1, double _p2) {2795 return f([_p0, _p1], _p2);2796 }2797 \end{cfa}2798 Essentially, this provides flattening and structuring conversions to inferred functions, improving the compatibility of tuples and polymorphism.2799 2247 2800 2248 … … 3688 3136 3689 3137 \begin{table}[hbt] 3690 \centering 3691 \input{../refrat/operidents} 3138 \hfil 3139 \begin{tabular}[t]{ll} 3140 %identifier & operation \\ \hline 3141 ©?[?]© & subscripting \impl{?[?]}\\ 3142 ©?()© & function call \impl{?()}\\ 3143 ©?++© & postfix increment \impl{?++}\\ 3144 ©?--© & postfix decrement \impl{?--}\\ 3145 ©++?© & prefix increment \impl{++?}\\ 3146 ©--?© & prefix decrement \impl{--?}\\ 3147 ©*?© & dereference \impl{*?}\\ 3148 ©+?© & unary plus \impl{+?}\\ 3149 ©-?© & arithmetic negation \impl{-?}\\ 3150 ©~?© & bitwise negation \impl{~?}\\ 3151 ©!?© & logical complement \impl{"!?}\\ 3152 ©?*?© & multiplication \impl{?*?}\\ 3153 ©?/?© & division \impl{?/?}\\ 3154 \end{tabular}\hfil 3155 \begin{tabular}[t]{ll} 3156 %identifier & operation \\ \hline 3157 ©?%?© & remainder \impl{?%?}\\ 3158 ©?+?© & addition \impl{?+?}\\ 3159 ©?-?© & subtraction \impl{?-?}\\ 3160 ©?<<?© & left shift \impl{?<<?}\\ 3161 ©?>>?© & right shift \impl{?>>?}\\ 3162 ©?<?© & less than \impl{?<?}\\ 3163 ©?<=?© & less than or equal \impl{?<=?}\\ 3164 ©?>=?© & greater than or equal \impl{?>=?}\\ 3165 ©?>?© & greater than \impl{?>?}\\ 3166 ©?==?© & equality \impl{?==?}\\ 3167 ©?!=?© & inequality \impl{?"!=?}\\ 3168 ©?&?© & bitwise AND \impl{?&?}\\ 3169 \end{tabular}\hfil 3170 \begin{tabular}[t]{ll} 3171 %identifier & operation \\ \hline 3172 ©?^?© & exclusive OR \impl{?^?}\\ 3173 ©?|?© & inclusive OR \impl{?"|?}\\ 3174 ©?=?© & simple assignment \impl{?=?}\\ 3175 ©?*=?© & multiplication assignment \impl{?*=?}\\ 3176 ©?/=?© & division assignment \impl{?/=?}\\ 3177 ©?%=?© & remainder assignment \impl{?%=?}\\ 3178 ©?+=?© & addition assignment \impl{?+=?}\\ 3179 ©?-=?© & subtraction assignment \impl{?-=?}\\ 3180 ©?<<=?© & left-shift assignment \impl{?<<=?}\\ 3181 ©?>>=?© & right-shift assignment \impl{?>>=?}\\ 3182 ©?&=?© & bitwise AND assignment \impl{?&=?}\\ 3183 ©?^=?© & exclusive OR assignment \impl{?^=?}\\ 3184 ©?|=?© & inclusive OR assignment \impl{?"|=?}\\ 3185 \end{tabular} 3186 \hfil 3692 3187 \caption{Operator Identifiers} 3693 3188 \label{opids} … … 3736 3231 \section{Auto Type-Inferencing} 3737 3232 3738 Auto type-inferencing occurs in a declaration where a variable's type is inferred from its initialization ex \-pression type.3233 Auto type-inferencing occurs in a declaration where a variable's type is inferred from its initialization expression type. 3739 3234 \begin{quote2} 3740 3235 \begin{tabular}{@{}l@{\hspace{3em}}ll@{}} … … 3765 3260 \begin{itemize} 3766 3261 \item 3767 preventing having to determine or write long generic types,3262 preventing having to determine or write out long generic types, 3768 3263 \item 3769 3264 ensure secondary variables, related to a primary variable, always have the same type. … … 3789 3284 There is also the conundrum in type inferencing of when to \emph{\Index{brand}} a type. 3790 3285 That is, when is the type of the variable more important than the type of its initialization expression. 3791 For example, if a change is made in an initialization expression, it can cause significantcascading type changes and/or errors.3792 At some point, a variable type needsto remain constant and the expression to be in error when it changes.3286 For example, if a change is made in an initialization expression, it can cause hundreds or thousands of cascading type changes and/or errors. 3287 At some point, a programmer wants the type of the variable to remain constant and the expression to be in error when it changes. 3793 3288 3794 3289 Given ©typedef© and ©typeof© in \CFA, and the strong need to use the type of left-hand side in inferencing, auto type-inferencing is not supported at this time. … … 4003 3498 } 4004 3499 \end{cfa} 3500 \end{comment} 3501 3502 3503 \subsection{Memory Management} 3504 3505 3506 \subsubsection{Manual Memory Management} 3507 3508 Using malloc and free to dynamically allocate memory exposes several potential, and common, errors. 3509 First, malloc breaks type safety because it returns a pointer to void. 3510 There is no relationship between the type that the returned pointer is cast to, and the amount of memory allocated. 3511 This problem is solved with a type-safe malloc. 3512 Do.s type-safe malloc does not take any arguments for size. 3513 Instead, it infers the type based on the return value, and then allocates space for the inferred type. 3514 3515 \begin{cfa} 3516 float *f = malloc(); // allocates the size of a float 3517 3518 struct S { 3519 int i, j, k; 3520 }; 3521 3522 struct S *s = malloc(); // allocates the size of a struct S 3523 \end{cfa} 3524 3525 In addition to the improved malloc, \CFA also provides a technique for combining allocation and initialization into one step, using the new function. 3526 For all constructors defined for a given type (see Operator Overloading), a corresponding call to new can be used to allocate and construct that type. 3527 3528 \begin{cfa} 3529 type Complex = struct { 3530 float real; 3531 float imag; 3532 }; 3533 3534 // default constructor 3535 3536 void ?{}(Complex &c) { 3537 c.real = 0.0; 3538 c.imag = 0.0; 3539 } 3540 3541 3542 3543 // 2 parameter constructor 3544 3545 void ?{}(Complex &c, float real, float imag) { 3546 c.real = real; 3547 c.imag = imag; 3548 } 3549 3550 3551 int main() { 3552 Complex c1; // No constructor is called 3553 Complex c2{}; // Default constructor called 3554 Complex c3{1.0, -1.0}; // 2 parameter constructor is called 3555 3556 Complex *p1 = malloc(); // allocate 3557 Complex *p2 = new(); // allocate + default constructor 3558 Complex *p3 = new(0.5, 1.0); // allocate + 2 param constructor 3559 } 3560 \end{cfa} 3561 3562 3563 \subsubsection{Automatic Memory Management} 3564 3565 \CFA may also support automatic memory management to further improve safety. 3566 If the compiler can insert all of the code needed to manage dynamically allocated memory (automatic reference counting), then developers can avoid problems with dangling pointers, double frees, memory leaks, etc. 3567 This feature requires further investigation. 3568 \CFA will not have a garbage collector, but might use some kind of region-based memory management. 3569 3570 3571 \begin{comment} 3572 \subsection{Unsafe C Constructs} 3573 3574 C programmers are able to access all of the low-level tricks that are sometimes needed for close-to-the-hardware programming. 3575 Some of these practices however are often error-prone and difficult to read and maintain. 3576 Since \CFA is designed to be safer than C, such constructs are disallowed in \CFA code. 3577 If a programmer wants to use one of these unsafe C constructs, the unsafe code must be contained in a C linkage block (see Interoperability), which will be compiled like C code. 3578 This block means that the user is telling the tools, .I know this is unsafe, but I.m going to do it anyway.. 3579 3580 The exact set of unsafe C constructs that will be disallowed in \CFA has not yet been decided, but is sure to include pointer arithmetic, pointer casting, etc. 3581 Once the full set is decided, the rules will be listed here. 4005 3582 \end{comment} 4006 3583 … … 4226 3803 \label{f:SimpleTasks} 4227 3804 \end{figure} 3805 3806 3807 \begin{comment} 3808 \begin{cfa} 3809 type Adder = task { 3810 int *row; 3811 int size; 3812 int &subtotal; 3813 } 3814 \end{cfa} 3815 3816 A task may define a constructor, which will be called upon allocation and run on the caller.s thread. 3817 A destructor may also be defined, which is called at deallocation (when a dynamic object is deleted or when a local object goes out of scope). 3818 After a task is allocated and initialized, its thread is spawned implicitly and begins executing in its function call method. 3819 All tasks must define this function call method, with a void return value and no additional parameters, or the compiler will report an error. 3820 Below are example functions for the above Adder task, and its usage to sum up a matrix on multiple threads. 3821 (Note that this example is designed to display the syntax and functionality, not the best method to solve this problem) 3822 \begin{cfa} 3823 void ?{}(Adder &a, int r[], int s, int &st) { // constructor 3824 a.row = r; 3825 a.size = s; 3826 a.subtotal = st; 3827 } 3828 3829 // implicitly spawn thread and begin execution here 3830 3831 void ?()(Adder &a) { 3832 int c; 3833 subtotal = 0; 3834 for (c=0; c<a.size; ++c) { 3835 subtotal += row[c]; 3836 } 3837 } 3838 3839 int main() { 3840 const int rows = 100, cols = 1000000; 3841 int matrix[rows][cols]; 3842 int subtotals[rows]; 3843 int total = 0; 3844 int r; 3845 3846 { // create a new scope here for our adders 3847 Adder adders[rows]; 3848 // read in the matrix 3849 ... 3850 for (r=0; r<rows; ++r) { 3851 // tasks are initialized on this thread 3852 Adders[r] = {matrix[r], cols, subtotals[r]}; 3853 Adders[r](); // spawn thread and begin execution 3854 } 3855 } // adders go out of scope; block here until they all finish 3856 total += subtotals[r]; 3857 printf(.total is %d\n., total); 3858 } 3859 \end{cfa} 3860 3861 \subsection{Cooperative Scheduling} 3862 3863 Tasks in \CFA are cooperatively scheduled, meaning that a task will not be interrupted by another task, except at specific yield points. 3864 In Listing 31, there are no yield points, so each task runs to completion with no interruptions. 3865 Places where a task could yield include waiting for a lock (explicitly or implicitly), waiting for I/O, or waiting for a specific function (or one of a set of functions) to be called. 3866 This last option is introduced with the yield function. yield is used to indicate that this task should yield its thread until the specified function is called. 3867 For example, the code below defines a monitor that maintains a generic list. 3868 When a task tries to pop from the list, but it is empty, the task should yield until another task puts something into the list, with the push function. 3869 Similarly, when a task tries to push something onto the list, but it is full, it will yield until another task frees some space with the pop function. 3870 3871 \begin{cfa} 3872 // type T is used as a generic type for all definitions inside 3873 // the curly brackets 3874 3875 generic(type T) { 3876 type Channel = monitor { 3877 List(T) list; // list is a simple generic list type 3878 }; 3879 3880 T pop(mutex &Channel(T) ch) { 3881 if (ch.list.empty()) { 3882 // yield until push is called for this channel 3883 yield(push); 3884 } 3885 return ch.list.pop(); 3886 } 3887 3888 void push(mutex &Channel(T)ch, T val) { 3889 if (ch.list.full()) { 3890 // yield until pop is called for this channel 3891 yield(pop); 3892 } 3893 ch.list.push(val); 3894 } 3895 } 3896 \end{cfa} 3897 3898 A task can also yield indefinitely by calling yield with no arguments. 3899 This will tell the scheduler to yield this task until it is resumed by some other task. 3900 A task can resume another task by using its functional call operator. 3901 The code below shows a simple ping-pong example, where two tasks yield back and forth to each other using these methods. 3902 3903 \begin{cfa} 3904 type Ping = task { 3905 Pong *partner; 3906 }; 3907 3908 void ?{}(Ping &p, Pong *partner = 0) { 3909 p.partner = partner; 3910 } 3911 3912 void ?()(Ping &p) { 3913 for(;;) { // loop forever 3914 printf(.ping\n.); 3915 partner(); // resumes the partner task 3916 yield(); // yields this task 3917 } 3918 } 3919 3920 type Pong = task { 3921 Ping *partner; 3922 }; 3923 3924 void ?{}(Pong &p, Ping *partner = 0) { 3925 p.partner = partner; 3926 } 3927 3928 void ?()(Pong &p) { 3929 for(;;) { // loop forever 3930 yield(); // yields this task 3931 printf(.pong/n.); 3932 partner(); // resumes the partner task 3933 } 3934 } 3935 3936 void main() { 3937 Ping ping; // allocate ping 3938 Pong pong{ping}; // allocate, initialize, and start pong 3939 Ping{pong}; // initialize and start ping 3940 } 3941 \end{cfa} 3942 3943 The same functionality can be accomplished by providing functions to be called by the partner task. 3944 \begin{cfa} 3945 type Pingpong = task { 3946 String msg; 3947 Pingpong *partner; 3948 }; 3949 3950 void ?{}(Pingpong &p, String msg, Pingpong *partner = 0) { 3951 p.msg = msg; 3952 p.partner = partner; 3953 } 3954 3955 void ?()(Pingpong &p) { 3956 for(;;) { 3957 yield(go); 3958 } 3959 } 3960 3961 void go(Pingpong &p) { 3962 print(.%(p.msg)\n.); 3963 go(p.partner); 3964 } 3965 3966 void main() { 3967 Pingpong ping = {.ping.}; 3968 Pingpong pong = {.pong., ping}; 3969 ping.partner = pong; 3970 go(ping); 3971 } 3972 \end{cfa} 3973 \end{comment} 4228 3974 4229 3975 … … 4886 4632 4887 4633 4888 \section{ Language Comparisons}4634 \section{Comparison with Other Languages} 4889 4635 4890 4636 \CFA is one of many languages that attempts to improve upon C. … … 5621 5367 5622 5368 5623 \section{C Incompatibles} 5369 \section{\texorpdfstring{\CFA Keywords}{Cforall Keywords}} 5370 \label{s:CFAKeywords} 5371 5372 \CFA introduces the following new keywords. 5373 5374 \begin{quote2} 5375 \begin{tabular}{lllll} 5376 \begin{tabular}{@{}l@{}} 5377 ©_At© \\ 5378 ©catch© \\ 5379 ©catchResume© \\ 5380 ©choose© \\ 5381 ©coroutine© \\ 5382 \end{tabular} 5383 & 5384 \begin{tabular}{@{}l@{}} 5385 ©disable© \\ 5386 ©dtype© \\ 5387 ©enable© \\ 5388 ©fallthrough© \\ 5389 ©fallthru© \\ 5390 \end{tabular} 5391 & 5392 \begin{tabular}{@{}l@{}} 5393 ©finally© \\ 5394 ©forall© \\ 5395 ©ftype© \\ 5396 ©lvalue© \\ 5397 ©monitor© \\ 5398 \end{tabular} 5399 & 5400 \begin{tabular}{@{}l@{}} 5401 ©mutex© \\ 5402 ©one_t© \\ 5403 ©otype© \\ 5404 ©throw© \\ 5405 ©throwResume© \\ 5406 \end{tabular} 5407 & 5408 \begin{tabular}{@{}l@{}} 5409 ©trait© \\ 5410 ©try© \\ 5411 ©ttype© \\ 5412 ©with© \\ 5413 ©zero_t© \\ 5414 \end{tabular} 5415 \end{tabular} 5416 \end{quote2} 5417 5418 5419 \section{Incompatible} 5624 5420 5625 5421 The following incompatibles exist between \CFA and C, and are similar to Annex C for \CC~\cite{C++14}. … … 5722 5518 struct X { int i; struct X *next; }; 5723 5519 static struct X a; §\C{// forward definition}§ 5724 static struct X b = { 0, ®&a® }; §\C{// forward reference, valid in C, invalid in \CFA}§5520 static struct X b = { 0, ®&a® }; §\C{// forward reference, valid in C, invalid in \CFA}§ 5725 5521 static struct X a = { 1, &b }; §\C{// definition}§ 5726 5522 \end{cfa} … … 5737 5533 enum ®Colour® { R, G, B, Y, C, M }; 5738 5534 struct Person { 5739 enum ®Colour® { R, G, B }; §\C [7cm]{// nested type}§5535 enum ®Colour® { R, G, B }; §\C{// nested type}§ 5740 5536 struct Face { §\C{// nested type}§ 5741 5537 ®Colour® Eyes, Hair; §\C{// type defined outside (1 level)}§ … … 5746 5542 }; 5747 5543 ®Colour® c = R; §\C{// type/enum defined same level}§ 5748 Person®.Colour® pc = Person®.®R; §\C{// type/enum defined inside}§5749 Person®.®Face pretty; §\C{// type defined inside} \CRT§5544 Person®.Colour® pc = Person®.®R; §\C{// type/enum defined inside}§ 5545 Person®.®Face pretty; §\C{// type defined inside}§ 5750 5546 \end{cfa} 5751 5547 In C, the name of the nested types belongs to the same scope as the name of the outermost enclosing structure, \ie the nested types are hoisted to the scope of the outer-most type, which is not useful and confusing. … … 5776 5572 \item 5777 5573 \begin{description} 5778 \item[Change:] remove implicit conversion of ©void *© to or from any ©T *© pointer:5779 \begin{cfa}5780 void foo() {5781 int * b = malloc( sizeof(int) ); §\C{// implicitly convert void * to int *}§5782 char * c = b; §\C{// implicitly convert int * to void *, and then void * to char *}§5783 }5784 \end{cfa}5785 \item[Rationale:] increase type safety5786 \item[Effect on original feature:] deletion of semantically well-defined feature.5787 \item[Difficulty of converting:] requires adding a cast (see \VRef{s:StorageManagement} for better alternatives):5788 \begin{cfa}5789 int * b = (int *)malloc( sizeof(int) );5790 char * c = (char *)b;5791 \end{cfa}5792 \item[How widely used:] Significant.5793 Some C translators already give a warning if the cast is not used.5794 \end{description}5795 5796 \item5797 \begin{description}5798 \item[Change:] Types must be declared in declarations, not in expressions5799 In C, a sizeof expression or cast expression may create a new type. For example,5800 \begin{cfa}5801 p = (void*)(struct x {int i;} *)0;5802 \end{cfa}5803 declares a new type, struct x .5804 \item[Rationale:] This prohibition helps to clarify the location of declarations in the source code.5805 \item[Effect on original feature:] Deletion of a semantically welldefined feature.5806 \item[Difficulty of converting:] Syntactic transformation.5807 \item[How widely used:] Seldom.5808 \end{description}5809 5810 \item5811 \begin{description}5812 5574 \item[Change:] comma expression is disallowed as subscript 5813 5575 \item[Rationale:] safety issue to prevent subscripting error for multidimensional arrays: ©x[i,j]© instead of ©x[i][j]©, and this syntactic form then taken by \CFA for new style arrays. 5814 5576 \item[Effect on original feature:] change to semantics of well-defined feature. 5815 5577 \item[Difficulty of converting:] semantic transformation of ©x[i,j]© to ©x[(i,j)]© 5816 \item[How widely used:] Seldom.5578 \item[How widely used:] seldom. 5817 5579 \end{description} 5818 5580 \end{enumerate} 5819 5581 5820 5582 5821 \section{\texorpdfstring{\CFA Keywords}{Cforall Keywords}}5822 \label{s:CFAKeywords}5823 5824 \CFA introduces the following new keywords.5825 5826 \begin{quote2}5827 \input{../refrat/keywords}5828 \end{quote2}5829 5830 5831 5583 \section{Standard Headers} 5832 5584 \label{s:StandardHeaders} … … 5834 5586 \Celeven prescribes the following standard header-files~\cite[\S~7.1.2]{C11} and \CFA adds to this list: 5835 5587 \begin{quote2} 5836 \begin{tabular}{@{}lllll l|l@{}}5837 \multicolumn{ 6}{c|}{C11} & \multicolumn{1}{c}{\CFA} \\5588 \begin{tabular}{@{}lllll|l@{}} 5589 \multicolumn{5}{c|}{C11} & \multicolumn{1}{c}{\CFA} \\ 5838 5590 \hline 5839 5591 \begin{tabular}{@{}l@{}} … … 5843 5595 \Indexc{errno.h} \\ 5844 5596 \Indexc{fenv.h} \\ 5597 \Indexc[deletekeywords=float]{float.h} \\ 5845 5598 \end{tabular} 5846 5599 & 5847 5600 \begin{tabular}{@{}l@{}} 5848 \Indexc[deletekeywords=float]{float.h} \\5849 5601 \Indexc{inttypes.h} \\ 5850 5602 \Indexc{iso646.h} \\ 5851 5603 \Indexc{limits.h} \\ 5852 5604 \Indexc{locale.h} \\ 5605 \Indexc{math.h} \\ 5606 \Indexc{setjmp.h} \\ 5853 5607 \end{tabular} 5854 5608 & 5855 5609 \begin{tabular}{@{}l@{}} 5856 \Indexc{math.h} \\5857 \Indexc{setjmp.h} \\5858 5610 \Indexc{signal.h} \\ 5859 5611 \Indexc{stdalign.h} \\ 5860 5612 \Indexc{stdarg.h} \\ 5613 \Indexc{stdatomic.h} \\ 5614 \Indexc{stdbool.h} \\ 5615 \Indexc{stddef.h} \\ 5861 5616 \end{tabular} 5862 5617 & 5863 5618 \begin{tabular}{@{}l@{}} 5864 \Indexc{stdatomic.h} \\5865 \Indexc{stdbool.h} \\5866 \Indexc{stddef.h} \\5867 5619 \Indexc{stdint.h} \\ 5868 5620 \Indexc{stdio.h} \\ 5869 \end{tabular}5870 &5871 \begin{tabular}{@{}l@{}}5872 5621 \Indexc{stdlib.h} \\ 5873 5622 \Indexc{stdnoreturn.h} \\ 5874 5623 \Indexc{string.h} \\ 5875 5624 \Indexc{tgmath.h} \\ 5876 \Indexc{threads.h} \\5877 5625 \end{tabular} 5878 5626 & 5879 5627 \begin{tabular}{@{}l@{}} 5628 \Indexc{threads.h} \\ 5880 5629 \Indexc{time.h} \\ 5881 5630 \Indexc{uchar.h} \\ … … 5886 5635 & 5887 5636 \begin{tabular}{@{}l@{}} 5637 \Indexc{unistd.h} \\ 5888 5638 \Indexc{gmp.h} \\ 5889 \Indexc{malloc.h}\\5890 \Indexc{unistd.h}\\5639 \\ 5640 \\ 5891 5641 \\ 5892 5642 \\ … … 5897 5647 hence, names in these include files are not mangled\index{mangling!name} (see~\VRef{s:Interoperability}). 5898 5648 All other C header files must be explicitly wrapped in ©extern "C"© to prevent name mangling. 5899 For \Index*[C++]{\CC{}}, the name-mangling issue is often handled internally in many C header-files through checks for preprocessor variable ©__cplusplus©, which adds appropriate ©extern "C"© qualifiers.5649 For \Index*[C++]{\CC{}}, the name-mangling issue is handled implicitly because most C header-files are augmented with checks for preprocessor variable ©__cplusplus©, which adds appropriate ©extern "C"© qualifiers. 5900 5650 5901 5651 … … 5907 5657 5908 5658 \subsection{Storage Management} 5909 \label{s:StorageManagement}5910 5659 5911 5660 The storage-management routines extend their C equivalents by overloading, alternate names, providing shallow type-safety, and removing the need to specify the allocation size for non-array types. … … 6121 5870 long double remainder( long double, long double ); 6122 5871 6123 float remquo( float, float, int * );§\indexc{remquo}§ 5872 [ int, float ] remquo( float, float );§\indexc{remquo}§ 5873 float remquo( float, float, int * ); 5874 [ int, double ] remquo( double, double ); 6124 5875 double remquo( double, double, int * ); 5876 [ int, long double ] remquo( long double, long double ); 6125 5877 long double remquo( long double, long double, int * ); 6126 [ int, float ] remquo( float, float ); 6127 [ int, double ] remquo( double, double ); 6128 [ int, long double ] remquo( long double, long double ); 6129 6130 float div( float, float, int * );§\indexc{div}§ §\C{// alternative name for remquo}§ 5878 5879 [ int, float ] div( float, float ); // alternative name for remquo 5880 float div( float, float, int * );§\indexc{div}§ 5881 [ int, double ] div( double, double ); 6131 5882 double div( double, double, int * ); 5883 [ int, long double ] div( long double, long double ); 6132 5884 long double div( long double, long double, int * ); 6133 [ int, float ] div( float, float );6134 [ int, double ] div( double, double );6135 [ int, long double ] div( long double, long double );6136 5885 6137 5886 float fma( float, float, float );§\indexc{fma}§ … … 6163 5912 double exp2( double ); 6164 5913 long double exp2( long double ); 6165 //float _Complex exp2( float _Complex );6166 //double _Complex exp2( double _Complex );6167 //long double _Complex exp2( long double _Complex );5914 float _Complex exp2( float _Complex ); 5915 double _Complex exp2( double _Complex ); 5916 long double _Complex exp2( long double _Complex ); 6168 5917 6169 5918 float expm1( float );§\indexc{expm1}§ 6170 5919 double expm1( double ); 6171 5920 long double expm1( long double ); 5921 5922 float log( float );§\indexc{log}§ 5923 double log( double ); 5924 long double log( long double ); 5925 float _Complex log( float _Complex ); 5926 double _Complex log( double _Complex ); 5927 long double _Complex log( long double _Complex ); 5928 5929 float log2( float );§\indexc{log2}§ 5930 double log2( double ); 5931 long double log2( long double ); 5932 float _Complex log2( float _Complex ); 5933 double _Complex log2( double _Complex ); 5934 long double _Complex log2( long double _Complex ); 5935 5936 float log10( float );§\indexc{log10}§ 5937 double log10( double ); 5938 long double log10( long double ); 5939 float _Complex log10( float _Complex ); 5940 double _Complex log10( double _Complex ); 5941 long double _Complex log10( long double _Complex ); 5942 5943 float log1p( float );§\indexc{log1p}§ 5944 double log1p( double ); 5945 long double log1p( long double ); 5946 5947 int ilogb( float );§\indexc{ilogb}§ 5948 int ilogb( double ); 5949 int ilogb( long double ); 5950 5951 float logb( float );§\indexc{logb}§ 5952 double logb( double ); 5953 long double logb( long double ); 5954 \end{cfa} 5955 5956 5957 \subsection{Power} 5958 5959 \leavevmode 5960 \begin{cfa}[aboveskip=0pt,belowskip=0pt] 5961 float sqrt( float );§\indexc{sqrt}§ 5962 double sqrt( double ); 5963 long double sqrt( long double ); 5964 float _Complex sqrt( float _Complex ); 5965 double _Complex sqrt( double _Complex ); 5966 long double _Complex sqrt( long double _Complex ); 5967 5968 float cbrt( float );§\indexc{cbrt}§ 5969 double cbrt( double ); 5970 long double cbrt( long double ); 5971 5972 float hypot( float, float );§\indexc{hypot}§ 5973 double hypot( double, double ); 5974 long double hypot( long double, long double ); 6172 5975 6173 5976 float pow( float, float );§\indexc{pow}§ … … 6177 5980 double _Complex pow( double _Complex, double _Complex ); 6178 5981 long double _Complex pow( long double _Complex, long double _Complex ); 6179 \end{cfa}6180 6181 6182 \subsection{Logarithm}6183 6184 \leavevmode6185 \begin{cfa}[aboveskip=0pt,belowskip=0pt]6186 float log( float );§\indexc{log}§6187 double log( double );6188 long double log( long double );6189 float _Complex log( float _Complex );6190 double _Complex log( double _Complex );6191 long double _Complex log( long double _Complex );6192 6193 float log2( float );§\indexc{log2}§6194 double log2( double );6195 long double log2( long double );6196 // float _Complex log2( float _Complex );6197 // double _Complex log2( double _Complex );6198 // long double _Complex log2( long double _Complex );6199 6200 float log10( float );§\indexc{log10}§6201 double log10( double );6202 long double log10( long double );6203 // float _Complex log10( float _Complex );6204 // double _Complex log10( double _Complex );6205 // long double _Complex log10( long double _Complex );6206 6207 float log1p( float );§\indexc{log1p}§6208 double log1p( double );6209 long double log1p( long double );6210 6211 int ilogb( float );§\indexc{ilogb}§6212 int ilogb( double );6213 int ilogb( long double );6214 6215 float logb( float );§\indexc{logb}§6216 double logb( double );6217 long double logb( long double );6218 6219 float sqrt( float );§\indexc{sqrt}§6220 double sqrt( double );6221 long double sqrt( long double );6222 float _Complex sqrt( float _Complex );6223 double _Complex sqrt( double _Complex );6224 long double _Complex sqrt( long double _Complex );6225 6226 float cbrt( float );§\indexc{cbrt}§6227 double cbrt( double );6228 long double cbrt( long double );6229 6230 float hypot( float, float );§\indexc{hypot}§6231 double hypot( double, double );6232 long double hypot( long double, long double );6233 5982 \end{cfa} 6234 5983 … … 6284 6033 long double atan2( long double, long double ); 6285 6034 6286 float atan( float, float ); §\C{// alternative name for atan2}§6035 float atan( float, float ); // alternative name for atan2 6287 6036 double atan( double, double );§\indexc{atan}§ 6288 6037 long double atan( long double, long double ); … … 6472 6221 6473 6222 \begin{cfa} 6474 void ?{}( Int * this ); §\C{// constructor /destructor}§6223 void ?{}( Int * this ); §\C{// constructor}§ 6475 6224 void ?{}( Int * this, Int init ); 6476 6225 void ?{}( Int * this, zero_t ); … … 6727 6476 // implementation 6728 6477 struct Rational {§\indexc{Rational}§ 6729 long int numerator, denominator; §\C{// invariant: denominator > 0}§6478 long int numerator, denominator; // invariant: denominator > 0 6730 6479 }; // Rational 6731 6480 -
src/ControlStruct/ExceptTranslate.cc
rcd7ef0b r275f4b4 10 10 // Created On : Wed Jun 14 16:49:00 2017 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Tus Aug 8 16:54:00 201713 // Update Count : 712 // Last Modified On : Tus Jul 18 10:09:00 2017 13 // Update Count : 4 14 14 // 15 15 … … 21 21 #include "SynTree/Type.h" 22 22 #include "SynTree/Attribute.h" 23 #include "SynTree/VarExprReplacer.h"24 23 25 24 namespace ControlStruct { 25 26 // This (large) section could probably be moved out of the class 27 // and be static helpers instead. 28 29 // Type(Qualifiers &, false, std::list<Attribute *> &) 30 31 // void (*function)(); 32 static FunctionType try_func_t(Type::Qualifiers(), false); 33 // void (*function)(int, exception); 34 static FunctionType catch_func_t(Type::Qualifiers(), false); 35 // int (*function)(exception); 36 static FunctionType match_func_t(Type::Qualifiers(), false); 37 // bool (*function)(exception); 38 static FunctionType handle_func_t(Type::Qualifiers(), false); 39 // void (*function)(__attribute__((unused)) void *); 40 static FunctionType finally_func_t(Type::Qualifiers(), false); 41 42 static void init_func_types() { 43 static bool init_complete = false; 44 if (init_complete) { 45 return; 46 } 47 ObjectDecl index_obj( 48 "__handler_index", 49 Type::StorageClasses(), 50 LinkageSpec::Cforall, 51 /*bitfieldWidth*/ NULL, 52 new BasicType( noQualifiers, BasicType::SignedInt ), 53 /*init*/ NULL 54 ); 55 ObjectDecl exception_obj( 56 "__exception_inst", 57 Type::StorageClasses(), 58 LinkageSpec::Cforall, 59 /*bitfieldWidth*/ NULL, 60 new PointerType( 61 noQualifiers, 62 new BasicType( noQualifiers, BasicType::SignedInt ) 63 ), 64 /*init*/ NULL 65 ); 66 ObjectDecl bool_obj( 67 "__ret_bool", 68 Type::StorageClasses(), 69 LinkageSpec::Cforall, 70 /*bitfieldWidth*/ NULL, 71 new BasicType(noQualifiers, BasicType::Bool), 72 /*init*/ NULL 73 ); 74 ObjectDecl voidptr_obj( 75 "__hook", 76 Type::StorageClasses(), 77 LinkageSpec::Cforall, 78 NULL, 79 new PointerType( 80 noQualifiers, 81 new VoidType( 82 noQualifiers 83 ), 84 std::list<Attribute *>{new Attribute("unused")} 85 ), 86 NULL 87 ); 88 89 catch_func_t.get_parameters().push_back( index_obj.clone() ); 90 catch_func_t.get_parameters().push_back( exception_obj.clone() ); 91 match_func_t.get_returnVals().push_back( index_obj.clone() ); 92 match_func_t.get_parameters().push_back( exception_obj.clone() ); 93 handle_func_t.get_returnVals().push_back( bool_obj.clone() ); 94 handle_func_t.get_parameters().push_back( exception_obj.clone() ); 95 finally_func_t.get_parameters().push_back( voidptr_obj.clone() ); 96 97 init_complete = true; 98 } 26 99 27 100 // Buricratic Helpers (Not having to do with the paritular operation.) … … 42 115 } 43 116 117 template<typename T> 118 void free_all( std::list<T *> &list ) { 119 typename std::list<T *>::iterator it; 120 for ( it = list.begin() ; it != list.end() ; ++it ) { 121 delete *it; 122 } 123 list.clear(); 124 } 125 44 126 void appendDeclStmt( CompoundStmt * block, Declaration * item ) { 45 127 block->push_back(new DeclStmt(noLabels, item)); … … 50 132 } 51 133 52 class ExceptionMutatorCore : public WithGuards { 53 enum Context { NoHandler, TerHandler, ResHandler }; 54 55 // Also need to handle goto, break & continue. 56 // They need to be cut off in a ResHandler, until we enter another 57 // loop, switch or the goto stays within the function. 58 59 Context cur_context; 60 61 // The current (innermost) termination handler exception declaration. 62 ObjectDecl * handler_except_decl; 63 64 // The built in types used in translation. 65 StructDecl * except_decl; 66 StructDecl * node_decl; 67 StructDecl * hook_decl; 68 69 // The many helper functions for code/syntree generation. 70 Statement * create_given_throw( 71 const char * throwFunc, ThrowStmt * throwStmt ); 72 Statement * create_terminate_throw( ThrowStmt * throwStmt ); 73 Statement * create_terminate_rethrow( ThrowStmt * throwStmt ); 74 Statement * create_resume_throw( ThrowStmt * throwStmt ); 75 Statement * create_resume_rethrow( ThrowStmt * throwStmt ); 76 CompoundStmt * take_try_block( TryStmt * tryStmt ); 77 FunctionDecl * create_try_wrapper( CompoundStmt * body ); 78 FunctionDecl * create_terminate_catch( CatchList &handlers ); 79 CompoundStmt * create_single_matcher( 80 DeclarationWithType * except_obj, CatchStmt * modded_handler ); 81 FunctionDecl * create_terminate_match( CatchList &handlers ); 82 CompoundStmt * create_terminate_caller( FunctionDecl * try_wrapper, 83 FunctionDecl * terminate_catch, FunctionDecl * terminate_match ); 84 FunctionDecl * create_resume_handler( CatchList &handlers ); 85 CompoundStmt * create_resume_wrapper( 86 Statement * wraps, FunctionDecl * resume_handler ); 87 FunctionDecl * create_finally_wrapper( TryStmt * tryStmt ); 88 ObjectDecl * create_finally_hook( FunctionDecl * finally_wrapper ); 89 90 // Types used in translation, make sure to use clone. 91 // void (*function)(); 92 FunctionType try_func_t; 93 // void (*function)(int, exception); 94 FunctionType catch_func_t; 95 // int (*function)(exception); 96 FunctionType match_func_t; 97 // bool (*function)(exception); 98 FunctionType handle_func_t; 99 // void (*function)(__attribute__((unused)) void *); 100 FunctionType finally_func_t; 101 102 StructInstType * create_except_type() { 103 assert( except_decl ); 104 return new StructInstType( noQualifiers, except_decl ); 105 } 106 void init_func_types(); 107 108 public: 109 ExceptionMutatorCore() : 110 cur_context( NoHandler ), 111 handler_except_decl( nullptr ), 112 except_decl( nullptr ), node_decl( nullptr ), hook_decl( nullptr ), 113 try_func_t( noQualifiers, false ), 114 catch_func_t( noQualifiers, false ), 115 match_func_t( noQualifiers, false ), 116 handle_func_t( noQualifiers, false ), 117 finally_func_t( noQualifiers, false ) 118 {} 119 120 void premutate( CatchStmt *catchStmt ); 121 void premutate( StructDecl *structDecl ); 122 Statement * postmutate( ThrowStmt *throwStmt ); 123 Statement * postmutate( TryStmt *tryStmt ); 124 }; 125 126 void ExceptionMutatorCore::init_func_types() { 127 assert( except_decl ); 128 129 ObjectDecl index_obj( 130 "__handler_index", 131 Type::StorageClasses(), 132 LinkageSpec::Cforall, 133 /*bitfieldWidth*/ NULL, 134 // ThrowStmt Mutation Helpers 135 136 Statement * create_given_throw( 137 const char * throwFunc, ThrowStmt * throwStmt ) { 138 // { int NAME = EXPR; throwFunc( &NAME ); } 139 CompoundStmt * result = new CompoundStmt( noLabels ); 140 ObjectDecl * local = new ObjectDecl( 141 "__local_exception_copy", 142 Type::StorageClasses(), 143 LinkageSpec::Cforall, 144 NULL, 134 145 new BasicType( noQualifiers, BasicType::SignedInt ), 135 /*init*/ NULL 136 ); 137 ObjectDecl exception_obj( 138 "__exception_inst", 139 Type::StorageClasses(), 140 LinkageSpec::Cforall, 141 /*bitfieldWidth*/ NULL, 142 new PointerType( 143 noQualifiers, 144 new StructInstType( noQualifiers, except_decl ) 145 ), 146 /*init*/ NULL 147 ); 148 ObjectDecl bool_obj( 149 "__ret_bool", 150 Type::StorageClasses(), 151 LinkageSpec::Cforall, 152 /*bitfieldWidth*/ NULL, 153 new BasicType( noQualifiers, BasicType::Bool ), 154 /*init*/ NULL 155 ); 156 ObjectDecl voidptr_obj( 157 "__hook", 158 Type::StorageClasses(), 159 LinkageSpec::Cforall, 160 NULL, 161 new PointerType( 162 noQualifiers, 163 new VoidType( 164 noQualifiers 165 ), 166 std::list<Attribute *>{ new Attribute( "unused" ) } 167 ), 168 NULL 169 ); 170 171 catch_func_t.get_parameters().push_back( index_obj.clone() ); 172 catch_func_t.get_parameters().push_back( exception_obj.clone() ); 173 match_func_t.get_returnVals().push_back( index_obj.clone() ); 174 match_func_t.get_parameters().push_back( exception_obj.clone() ); 175 handle_func_t.get_returnVals().push_back( bool_obj.clone() ); 176 handle_func_t.get_parameters().push_back( exception_obj.clone() ); 177 finally_func_t.get_parameters().push_back( voidptr_obj.clone() ); 178 } 179 180 // ThrowStmt Mutation Helpers 181 182 Statement * ExceptionMutatorCore::create_given_throw( 183 const char * throwFunc, ThrowStmt * throwStmt ) { 184 // `throwFunc`( `throwStmt->get_name` ); 146 new SingleInit( throwStmt->get_expr() ) 147 ); 148 appendDeclStmt( result, local ); 185 149 UntypedExpr * call = new UntypedExpr( new NameExpr( throwFunc ) ); 186 call->get_args().push_back( throwStmt->get_expr() ); 150 call->get_args().push_back( new AddressExpr( nameOf( local ) ) ); 151 result->push_back( new ExprStmt( throwStmt->get_labels(), call ) ); 187 152 throwStmt->set_expr( nullptr ); 188 153 delete throwStmt; 189 return new ExprStmt( noLabels, call ); 190 } 191 192 Statement * ExceptionMutatorCore::create_terminate_throw( 193 ThrowStmt *throwStmt ) { 194 // __throw_terminate( `throwStmt->get_name()` ); } 154 return result; 155 } 156 157 Statement * create_terminate_throw( ThrowStmt *throwStmt ) { 158 // { int NAME = EXPR; __throw_terminate( &NAME ); } 195 159 return create_given_throw( "__cfaehm__throw_terminate", throwStmt ); 196 160 } 197 198 Statement * ExceptionMutatorCore::create_terminate_rethrow( 199 ThrowStmt *throwStmt ) { 200 // { `handler_except_decl` = NULL; __rethrow_terminate(); } 161 Statement * create_terminate_rethrow( ThrowStmt *throwStmt ) { 162 // __rethrow_terminate(); 201 163 assert( nullptr == throwStmt->get_expr() ); 202 assert( handler_except_decl ); 203 204 CompoundStmt * result = new CompoundStmt( throwStmt->get_labels() ); 205 result->push_back( new ExprStmt( noLabels, UntypedExpr::createAssign( 206 nameOf( handler_except_decl ), 207 new ConstantExpr( Constant::null( 208 new PointerType( 209 noQualifiers, 210 handler_except_decl->get_type()->clone() 211 ) 212 ) ) 213 ) ) ); 214 result->push_back( new ExprStmt( 215 noLabels, 164 Statement * result = new ExprStmt( 165 throwStmt->get_labels(), 216 166 new UntypedExpr( new NameExpr( "__cfaehm__rethrow_terminate" ) ) 217 ) );167 ); 218 168 delete throwStmt; 219 169 return result; 220 170 } 221 222 Statement * ExceptionMutatorCore::create_resume_throw( 223 ThrowStmt *throwStmt ) { 224 // __throw_resume( `throwStmt->get_name` ); 171 Statement * create_resume_throw( ThrowStmt *throwStmt ) { 172 // __throw_resume( EXPR ); 225 173 return create_given_throw( "__cfaehm__throw_resume", throwStmt ); 226 174 } 227 228 Statement * ExceptionMutatorCore::create_resume_rethrow( 229 ThrowStmt *throwStmt ) { 175 Statement * create_resume_rethrow( ThrowStmt *throwStmt ) { 230 176 // return false; 231 177 Statement * result = new ReturnStmt( … … 239 185 // TryStmt Mutation Helpers 240 186 241 CompoundStmt * ExceptionMutatorCore::take_try_block( TryStmt *tryStmt ) {187 CompoundStmt * take_try_block( TryStmt *tryStmt ) { 242 188 CompoundStmt * block = tryStmt->get_block(); 243 189 tryStmt->set_block( nullptr ); 244 190 return block; 245 191 } 246 247 FunctionDecl * ExceptionMutatorCore::create_try_wrapper( 248 CompoundStmt *body ) { 192 FunctionDecl * create_try_wrapper( CompoundStmt *body ) { 249 193 250 194 return new FunctionDecl( "try", Type::StorageClasses(), … … 252 196 } 253 197 254 FunctionDecl * ExceptionMutatorCore::create_terminate_catch( 255 CatchList &handlers ) { 198 FunctionDecl * create_terminate_catch( CatchList &handlers ) { 256 199 std::list<CaseStmt *> handler_wrappers; 257 200 258 201 FunctionType *func_type = catch_func_t.clone(); 259 202 DeclarationWithType * index_obj = func_type->get_parameters().front(); 260 DeclarationWithType * except_obj = func_type->get_parameters().back();203 // DeclarationWithType * except_obj = func_type->get_parameters().back(); 261 204 262 205 // Index 1..{number of handlers} … … 267 210 CatchStmt * handler = *it; 268 211 212 // INTEGERconstant Version 269 213 // case `index`: 270 214 // { 271 // `handler.decl` = { (virtual `decl.type`)`except` }; 272 // `handler.body`; 215 // `handler.body` 273 216 // } 274 217 // return; 275 CompoundStmt * block = new CompoundStmt( noLabels ); 276 277 // Just copy the exception value. (Post Validation) 278 ObjectDecl * handler_decl = 279 static_cast<ObjectDecl *>( handler->get_decl() ); 280 ObjectDecl * local_except = handler_decl->clone(); 281 local_except->set_init( 282 new ListInit({ new SingleInit( 283 new VirtualCastExpr( nameOf( except_obj ), 284 local_except->get_type() 285 ) 286 ) }) 287 ); 288 block->push_back( new DeclStmt( noLabels, local_except ) ); 289 290 // Add the cleanup attribute. 291 local_except->get_attributes().push_back( new Attribute( 292 "cleanup", 293 { new NameExpr( "__cfaehm__cleanup_terminate" ) } 294 ) ); 295 296 // Update variables in the body to point to this local copy. 297 { 298 VarExprReplacer::DeclMap mapping; 299 mapping[ handler_decl ] = local_except; 300 VarExprReplacer mapper( mapping ); 301 handler->get_body()->accept( mapper ); 302 } 303 304 block->push_back( handler->get_body() ); 218 std::list<Statement *> caseBody; 219 caseBody.push_back( handler->get_body() ); 305 220 handler->set_body( nullptr ); 306 307 std::list<Statement *> caseBody 308 { block, new ReturnStmt( noLabels, nullptr ) }; 221 caseBody.push_back( new ReturnStmt( noLabels, nullptr ) ); 222 309 223 handler_wrappers.push_back( new CaseStmt( 310 224 noLabels, … … 335 249 // Create a single check from a moddified handler. 336 250 // except_obj is referenced, modded_handler will be freed. 337 CompoundStmt * ExceptionMutatorCore::create_single_matcher(251 CompoundStmt *create_single_matcher( 338 252 DeclarationWithType * except_obj, CatchStmt * modded_handler ) { 339 // {340 // `modded_handler.decl`341 // if ( `decl.name = (virtual `decl.type`)`except`342 // [&& `modded_handler.cond`] ) {343 // `modded_handler.body`344 // }345 // }346 347 253 CompoundStmt * block = new CompoundStmt( noLabels ); 348 254 349 // Local Declaration 350 ObjectDecl * local_except = 351 dynamic_cast<ObjectDecl *>( modded_handler->get_decl() ); 352 assert( local_except ); 353 block->push_back( new DeclStmt( noLabels, local_except ) ); 354 355 // Check for type match. 356 Expression * cond = UntypedExpr::createAssign( nameOf( local_except ), 357 new VirtualCastExpr( nameOf( except_obj ), 358 local_except->get_type()->clone() ) ); 359 360 // Add the check on the conditional if it is provided. 255 // INTEGERconstant Version 256 assert( nullptr == modded_handler->get_decl() ); 257 ConstantExpr * number = 258 dynamic_cast<ConstantExpr*>( modded_handler->get_cond() ); 259 assert( number ); 260 modded_handler->set_cond( nullptr ); 261 262 Expression * cond; 263 { 264 std::list<Expression *> args; 265 args.push_back( number ); 266 267 std::list<Expression *> rhs_args; 268 rhs_args.push_back( nameOf( except_obj ) ); 269 Expression * rhs = new UntypedExpr( 270 new NameExpr( "*?" ), rhs_args ); 271 args.push_back( rhs ); 272 273 cond = new UntypedExpr( new NameExpr( "?==?" /*???*/), args ); 274 } 275 361 276 if ( modded_handler->get_cond() ) { 362 277 cond = new LogicalExpr( cond, modded_handler->get_cond() ); 363 278 } 364 // Construct the match condition.365 279 block->push_back( new IfStmt( noLabels, 366 280 cond, modded_handler->get_body(), nullptr ) ); … … 373 287 } 374 288 375 FunctionDecl * ExceptionMutatorCore::create_terminate_match( 376 CatchList &handlers ) { 377 // int match(exception * except) { 378 // HANDLER WRAPPERS { return `index`; } 379 // } 380 289 FunctionDecl * create_terminate_match( CatchList &handlers ) { 381 290 CompoundStmt * body = new CompoundStmt( noLabels ); 382 291 … … 410 319 } 411 320 412 CompoundStmt * ExceptionMutatorCore::create_terminate_caller(321 CompoundStmt * create_terminate_caller( 413 322 FunctionDecl * try_wrapper, 414 323 FunctionDecl * terminate_catch, 415 FunctionDecl * terminate_match ) { 416 // { __cfaehm__try_terminate(`try`, `catch`, `match`); } 324 FunctionDecl * terminate_match) { 417 325 418 326 UntypedExpr * caller = new UntypedExpr( new NameExpr( … … 428 336 } 429 337 430 FunctionDecl * ExceptionMutatorCore::create_resume_handler( 431 CatchList &handlers ) { 432 // bool handle(exception * except) { 433 // HANDLER WRAPPERS { `hander->body`; return true; } 434 // } 338 FunctionDecl * create_resume_handler( CatchList &handlers ) { 435 339 CompoundStmt * body = new CompoundStmt( noLabels ); 436 340 … … 465 369 } 466 370 467 CompoundStmt * ExceptionMutatorCore::create_resume_wrapper( 371 CompoundStmt * create_resume_wrapper( 372 StructDecl * node_decl, 468 373 Statement * wraps, 469 374 FunctionDecl * resume_handler ) { … … 509 414 } 510 415 511 FunctionDecl * ExceptionMutatorCore::create_finally_wrapper( 512 TryStmt * tryStmt ) { 513 // void finally() { <finally code> } 416 FunctionDecl * create_finally_wrapper( TryStmt * tryStmt ) { 514 417 FinallyStmt * finally = tryStmt->get_finally(); 515 418 CompoundStmt * body = finally->get_block(); … … 522 425 } 523 426 524 ObjectDecl * ExceptionMutatorCore::create_finally_hook(525 FunctionDecl * finally_wrapper ) {427 ObjectDecl * create_finally_hook( 428 StructDecl * hook_decl, FunctionDecl * finally_wrapper ) { 526 429 // struct __cfaehm__cleanup_hook __finally_hook 527 430 // __attribute__((cleanup( finally_wrapper ))); … … 549 452 } 550 453 551 // Visiting/Mutating Functions 552 void ExceptionMutatorCore::premutate( CatchStmt *catchStmt ) { 553 // Validate the Statement's form. 554 ObjectDecl * decl = 555 dynamic_cast<ObjectDecl *>( catchStmt->get_decl() ); 556 if ( decl && true /* check decl->get_type() */ ) { 557 // Pass. 558 } else if ( CatchStmt::Terminate == catchStmt->get_kind() ) { 559 throw SemanticError("catch must have exception type"); 560 } else { 561 throw SemanticError("catchResume must have exception type"); 562 } 563 564 // Track the handler context. 565 GuardValue( cur_context ); 566 if ( CatchStmt::Terminate == catchStmt->get_kind() ) { 567 cur_context = TerHandler; 568 569 GuardValue( handler_except_decl ); 570 handler_except_decl = decl; 571 } else { 572 cur_context = ResHandler; 573 } 574 } 575 576 void ExceptionMutatorCore::premutate( StructDecl *structDecl ) { 577 if ( !structDecl->has_body() ) { 578 // Skip children? 579 return; 580 } else if ( structDecl->get_name() == "__cfaehm__base_exception_t" ) { 581 assert( nullptr == except_decl ); 582 except_decl = structDecl; 583 init_func_types(); 584 } else if ( structDecl->get_name() == "__cfaehm__try_resume_node" ) { 585 assert( nullptr == node_decl ); 586 node_decl = structDecl; 587 } else if ( structDecl->get_name() == "__cfaehm__cleanup_hook" ) { 588 assert( nullptr == hook_decl ); 589 hook_decl = structDecl; 590 } 591 // Later we might get the exception type as well. 592 } 454 455 class ExceptionMutatorCore : public WithGuards { 456 enum Context { NoHandler, TerHandler, ResHandler }; 457 458 // Also need to handle goto, break & continue. 459 // They need to be cut off in a ResHandler, until we enter another 460 // loop, switch or the goto stays within the function. 461 462 Context cur_context; 463 464 // We might not need this, but a unique base for each try block's 465 // generated functions might be nice. 466 //std::string curFunctionName; 467 //unsigned int try_count = 0; 468 469 StructDecl *node_decl; 470 StructDecl *hook_decl; 471 472 public: 473 ExceptionMutatorCore() : 474 cur_context(NoHandler), 475 node_decl(nullptr), hook_decl(nullptr) 476 {} 477 478 void premutate( CatchStmt *catchStmt ); 479 void premutate( StructDecl *structDecl ); 480 Statement * postmutate( ThrowStmt *throwStmt ); 481 Statement * postmutate( TryStmt *tryStmt ); 482 }; 593 483 594 484 Statement * ExceptionMutatorCore::postmutate( ThrowStmt *throwStmt ) { 595 assert( except_decl );596 597 485 // Ignoring throwStmt->get_target() for now. 598 486 if ( ThrowStmt::Terminate == throwStmt->get_kind() ) { … … 622 510 623 511 Statement * ExceptionMutatorCore::postmutate( TryStmt *tryStmt ) { 624 assert( except_decl );625 512 assert( node_decl ); 626 513 assert( hook_decl ); … … 637 524 appendDeclStmt( block, finally_block ); 638 525 // Create and add the finally cleanup hook. 639 appendDeclStmt( block, create_finally_hook( finally_block ) ); 526 appendDeclStmt( block, 527 create_finally_hook( hook_decl, finally_block ) ); 640 528 } 641 529 … … 651 539 appendDeclStmt( block, resume_handler ); 652 540 // Prepare hooks 653 inner = create_resume_wrapper( inner, resume_handler );541 inner = create_resume_wrapper( node_decl, inner, resume_handler ); 654 542 } 655 543 … … 672 560 block->push_back( inner ); 673 561 562 //free_all( termination_handlers ); 563 //free_all( resumption_handlers ); 564 674 565 return block; 675 566 } 676 567 568 void ExceptionMutatorCore::premutate( CatchStmt *catchStmt ) { 569 GuardValue( cur_context ); 570 if ( CatchStmt::Terminate == catchStmt->get_kind() ) { 571 cur_context = TerHandler; 572 } else { 573 cur_context = ResHandler; 574 } 575 } 576 577 void ExceptionMutatorCore::premutate( StructDecl *structDecl ) { 578 if ( !structDecl->has_body() ) { 579 // Skip children? 580 return; 581 } else if ( structDecl->get_name() == "__cfaehm__try_resume_node" ) { 582 assert( nullptr == node_decl ); 583 node_decl = structDecl; 584 } else if ( structDecl->get_name() == "__cfaehm__cleanup_hook" ) { 585 assert( nullptr == hook_decl ); 586 hook_decl = structDecl; 587 } 588 // Later we might get the exception type as well. 589 } 590 677 591 void translateEHM( std::list< Declaration *> & translationUnit ) { 592 init_func_types(); 593 678 594 PassVisitor<ExceptionMutatorCore> translator; 679 595 mutateAll( translationUnit, translator ); -
src/GenPoly/Box.cc
rcd7ef0b r275f4b4 27 27 #include "Box.h" 28 28 #include "DeclMutator.h" 29 #include " Lvalue.h"29 #include "PolyMutator.h" 30 30 #include "FindFunction.h" 31 #include "PolyMutator.h"32 31 #include "ScopedSet.h" 33 32 #include "ScrubTyVars.h" … … 756 755 757 756 void Pass1::boxParam( Type *param, Expression *&arg, const TyVarMap &exprTyVars ) { 758 assert f( arg->has_result(), "arg does not have result: %s", toString( arg ).c_str() );757 assert( arg->has_result() ); 759 758 if ( isPolyType( param, exprTyVars ) ) { 760 Type * newType = arg->get_result()->clone(); 761 if ( env ) env->apply( newType ); 762 std::auto_ptr<Type> manager( newType ); 763 if ( isPolyType( newType ) ) { 759 if ( isPolyType( arg->get_result() ) ) { 764 760 // if the argument's type is polymorphic, we don't need to box again! 765 761 return; 766 762 } else if ( arg->get_result()->get_lvalue() ) { 767 // argument expression may be CFA lvalue, but not C lvalue -- apply generalizedLvalue transformations. 768 arg = generalizedLvalue( new AddressExpr( arg ) ); 763 // VariableExpr and MemberExpr are lvalues; need to check this isn't coming from the second arg of a comma expression though (not an lvalue) 764 // xxx - need to test that this code is still reachable 765 if ( CommaExpr *commaArg = dynamic_cast< CommaExpr* >( arg ) ) { 766 commaArg->set_arg2( new AddressExpr( commaArg->get_arg2() ) ); 767 } else { 768 arg = new AddressExpr( arg ); 769 } 769 770 if ( ! ResolvExpr::typesCompatible( param, arg->get_result(), SymTab::Indexer() ) ) { 770 771 // silence warnings by casting boxed parameters when the actual type does not match up with the formal type. … … 1878 1879 return structDecl; 1879 1880 } 1880 1881 1881 1882 Declaration *Pass3::mutate( UnionDecl *unionDecl ) { 1882 1883 stripGenericMembers( unionDecl ); -
src/GenPoly/Lvalue.cc
rcd7ef0b r275f4b4 27 27 #include "SynTree/Mutator.h" 28 28 #include "SymTab/Indexer.h" 29 30 29 #include "ResolvExpr/Resolver.h" 31 #include "ResolvExpr/TypeEnvironment.h"32 30 #include "ResolvExpr/typeops.h" 33 #include "ResolvExpr/Unify.h"34 31 35 32 #include "Common/UniqueName.h" … … 63 60 typedef Mutator Parent; 64 61 65 virtual Expression * mutate( MemberExpr * memExpr );66 62 virtual Expression * mutate( AddressExpr * addressExpr ); 67 68 template<typename Func>69 Expression * applyTransformation( Expression * expr, Expression * arg, Func mkExpr );70 63 }; 71 64 } // namespace … … 78 71 acceptAll( translationUnit, p2 ); 79 72 mutateAll( translationUnit, genLval ); 80 }81 82 Expression * generalizedLvalue( Expression * expr ) {83 GeneralizedLvalue genLval;84 return expr->acceptMutator( genLval );85 73 } 86 74 … … 175 163 } 176 164 177 template<typename Func>178 Expression * GeneralizedLvalue::applyTransformation( Expression * expr, Expression * arg, Func mkExpr ) {179 if ( CommaExpr * commaExpr = dynamic_cast< CommaExpr * >( a rg) ) {165 Expression * GeneralizedLvalue::mutate( AddressExpr * addrExpr ) { 166 addrExpr = safe_dynamic_cast< AddressExpr * >( Parent::mutate( addrExpr ) ); 167 if ( CommaExpr * commaExpr = dynamic_cast< CommaExpr * >( addrExpr->get_arg() ) ) { 180 168 Expression * arg1 = commaExpr->get_arg1()->clone(); 181 169 Expression * arg2 = commaExpr->get_arg2()->clone(); 182 Expression * ret = new CommaExpr( arg1, mkExpr( arg2 ) ); 183 ret->set_env( expr->get_env() ); 184 expr->set_env( nullptr ); 185 delete expr; 186 return ret->acceptMutator( *this ); 187 } else if ( ConditionalExpr * condExpr = dynamic_cast< ConditionalExpr * >( arg ) ) { 170 delete addrExpr; 171 return new CommaExpr( arg1, new AddressExpr( arg2 ) ); 172 } else if ( ConditionalExpr * condExpr = dynamic_cast< ConditionalExpr * >( addrExpr->get_arg() ) ) { 188 173 Expression * arg1 = condExpr->get_arg1()->clone(); 189 174 Expression * arg2 = condExpr->get_arg2()->clone(); 190 175 Expression * arg3 = condExpr->get_arg3()->clone(); 191 ConditionalExpr * ret = new ConditionalExpr( arg1, mkExpr( arg2 ), mkExpr( arg3 ) ); 192 ret->set_env( expr->get_env() ); 193 expr->set_env( nullptr ); 194 delete expr; 195 196 // conditional expr type may not be either of the argument types, need to unify 197 using namespace ResolvExpr; 198 Type* commonType = nullptr; 199 TypeEnvironment newEnv; 200 AssertionSet needAssertions, haveAssertions; 201 OpenVarSet openVars; 202 unify( ret->get_arg2()->get_result(), ret->get_arg3()->get_result(), newEnv, needAssertions, haveAssertions, openVars, SymTab::Indexer(), commonType ); 203 ret->set_result( commonType ? commonType : ret->get_arg2()->get_result()->clone() ); 204 return ret->acceptMutator( *this ); 176 delete addrExpr; 177 return new ConditionalExpr( arg1, new AddressExpr( arg2 ), new AddressExpr( arg3 ) ); 205 178 } 206 return expr; 207 } 208 209 Expression * GeneralizedLvalue::mutate( MemberExpr * memExpr ) { 210 Parent::mutate( memExpr ); 211 return applyTransformation( memExpr, memExpr->get_aggregate(), [=]( Expression * aggr ) { return new MemberExpr( memExpr->get_member(), aggr ); } ); 212 } 213 214 Expression * GeneralizedLvalue::mutate( AddressExpr * addrExpr ) { 215 addrExpr = safe_dynamic_cast< AddressExpr * >( Parent::mutate( addrExpr ) ); 216 return applyTransformation( addrExpr, addrExpr->get_arg(), []( Expression * arg ) { return new AddressExpr( arg ); } ); 179 return addrExpr; 217 180 } 218 181 } // namespace -
src/GenPoly/Lvalue.h
rcd7ef0b r275f4b4 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Lvalue.h -- 7 // Lvalue.h -- 8 8 // 9 9 // Author : Richard C. Bilson … … 23 23 /// replaces return type of `lvalue T` with `T*`, along with appropriate address-of and dereference operators 24 24 void convertLvalue( std::list< Declaration* >& translationUnit ); 25 26 /// applies transformations that allow GCC to accept more complicated lvalue expressions, e.g. &(a, b)27 Expression * generalizedLvalue( Expression * expr );28 25 } // namespace GenPoly 29 26 -
src/Makefile.am
rcd7ef0b r275f4b4 43 43 cfa_cpplib_PROGRAMS = driver/cfa-cpp 44 44 driver_cfa_cpp_SOURCES = ${SRC} 45 driver_cfa_cpp_LDADD = -ldl # yywrap45 driver_cfa_cpp_LDADD = ${LEXLIB} -ldl # yywrap 46 46 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -Wextra -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14 47 47 driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic -
src/Makefile.in
rcd7ef0b r275f4b4 262 262 am_driver_cfa_cpp_OBJECTS = $(am__objects_1) 263 263 driver_cfa_cpp_OBJECTS = $(am_driver_cfa_cpp_OBJECTS) 264 driver_cfa_cpp_DEPENDENCIES = 264 am__DEPENDENCIES_1 = 265 driver_cfa_cpp_DEPENDENCIES = $(am__DEPENDENCIES_1) 265 266 driver_cfa_cpp_LINK = $(CXXLD) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) \ 266 267 $(driver_cfa_cpp_LDFLAGS) $(LDFLAGS) -o $@ … … 547 548 cfa_cpplibdir = ${CFA_LIBDIR} 548 549 driver_cfa_cpp_SOURCES = ${SRC} 549 driver_cfa_cpp_LDADD = -ldl # yywrap550 driver_cfa_cpp_LDADD = ${LEXLIB} -ldl # yywrap 550 551 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -Wextra -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14 551 552 driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic -
src/Parser/ExpressionNode.cc
rcd7ef0b r275f4b4 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed Aug 2 11:12:00 2017 13 // Update Count : 568 14 // 15 16 #include <climits> // access INT_MAX, UINT_MAX, LONG_MAX, ULONG_MAX, LLONG_MAX 12 // Last Modified On : Tus Jul 25 10:11:00 2017 13 // Update Count : 551 14 // 15 16 #include <cassert> 17 #include <cctype> 18 #include <climits> 19 #include <cstdio> 20 #include <algorithm> 17 21 #include <sstream> 18 22 … … 22 26 #include "SynTree/Expression.h" 23 27 #include "SynTree/Declaration.h" 28 #include "Common/UnimplementedError.h" 24 29 #include "parserutility.h" 30 #include "Common/utility.h" 25 31 26 32 using namespace std; … … 40 46 // type. 41 47 42 extern const Type::Qualifiers noQualifiers;// no qualifiers on constants48 Type::Qualifiers noQualifiers; // no qualifiers on constants 43 49 44 50 static inline bool checkU( char c ) { return c == 'u' || c == 'U'; } … … 49 55 static inline bool checkX( char c ) { return c == 'x' || c == 'X'; } 50 56 51 Expression * build_constantInteger( const std::string & str ) {57 Expression *build_constantInteger( const std::string & str ) { 52 58 static const BasicType::Kind kind[2][3] = { 53 59 { BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt }, … … 56 62 bool dec = true, Unsigned = false; // decimal, unsigned constant 57 63 int size; // 0 => int, 1 => long, 2 => long long 58 unsigned long long int v; // converted integral value64 unsigned long long int v; // converted integral value 59 65 size_t last = str.length() - 1; // last character of constant 60 Expression * ret; 61 62 // special constants 63 if ( str == "0" ) { 64 ret = new ConstantExpr( Constant( (Type *)new ZeroType( noQualifiers ), str, (unsigned long long int)0 ) ); 65 goto CLEANUP; 66 } // if 67 if ( str == "1" ) { 68 ret = new ConstantExpr( Constant( (Type *)new OneType( noQualifiers ), str, (unsigned long long int)1 ) ); 69 goto CLEANUP; 70 } // if 71 66 72 67 if ( str[0] == '0' ) { // octal/hex constant ? 73 68 dec = false; … … 123 118 } // if 124 119 125 ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[Unsigned][size] ), str, v ) ); 126 CLEANUP: 120 Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[Unsigned][size] ), str, v ) ); 127 121 delete &str; // created by lex 128 122 return ret; 129 123 } // build_constantInteger 130 124 131 Expression * build_constantFloat( const std::string & str ) {125 Expression *build_constantFloat( const std::string & str ) { 132 126 static const BasicType::Kind kind[2][3] = { 133 127 { BasicType::Float, BasicType::Double, BasicType::LongDouble }, … … 164 158 } // build_constantFloat 165 159 166 Expression * build_constantChar( const std::string & str ) {160 Expression *build_constantChar( const std::string & str ) { 167 161 Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, BasicType::Char ), str, (unsigned long long int)(unsigned char)str[1] ) ); 168 162 delete &str; // created by lex … … 170 164 } // build_constantChar 171 165 172 ConstantExpr * build_constantStr( const std::string & str ) {166 ConstantExpr *build_constantStr( const std::string & str ) { 173 167 // string should probably be a primitive type 174 ArrayType * at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ),175 new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ), // +1 for '\0' and -2 for '"'168 ArrayType *at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ), 169 new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ), // +1 for '\0' and -2 for '"' 176 170 false, false ); 177 ConstantExpr * ret = new ConstantExpr( Constant( at, str, (unsigned long long int)0 ) ); // constant 0 is ignored for pure string value 171 // constant 0 is ignored for pure string value 172 ConstantExpr * ret = new ConstantExpr( Constant( at, str, (unsigned long long int)0 ) ); 178 173 delete &str; // created by lex 179 174 return ret; 180 175 } // build_constantStr 176 177 Expression *build_constantZeroOne( const std::string & str ) { 178 Expression * ret = new ConstantExpr( Constant( str == "0" ? (Type *)new ZeroType( noQualifiers ) : (Type*)new OneType( noQualifiers ), str, 179 str == "0" ? (unsigned long long int)0 : (unsigned long long int)1 ) ); 180 delete &str; // created by lex 181 return ret; 182 } // build_constantChar 181 183 182 184 Expression * build_field_name_FLOATINGconstant( const std::string & str ) { … … 207 209 } // build_field_name_fraction_constants 208 210 211 212 209 213 Expression * build_field_name_REALFRACTIONconstant( const std::string & str ) { 210 214 if ( str.find_first_not_of( "0123456789", 1 ) != string::npos ) throw SemanticError( "invalid tuple index " + str ); … … 221 225 } // build_field_name_REALDECIMALconstant 222 226 223 NameExpr * build_varref( const string * name ) {224 NameExpr * expr = new NameExpr( *name, nullptr );227 NameExpr * build_varref( const string *name ) { 228 NameExpr *expr = new NameExpr( *name, nullptr ); 225 229 delete name; 226 230 return expr; 227 } // build_varref228 229 230 static const char * OperName[] = { // must harmonize with OperKinds231 } 232 233 // Must harmonize with OperKinds. 234 static const char *OperName[] = { 231 235 // diadic 232 236 "SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "?\\?", "?*?", "?/?", "?%?", "||", "&&", … … 236 240 // monadic 237 241 "+?", "-?", "AddressOf", "*?", "!?", "~?", "++?", "?++", "--?", "?--", "&&" 238 }; // OperName239 240 Expression * build_cast( DeclarationNode * decl_node, ExpressionNode *expr_node ) {241 Type * targetType = maybeMoveBuildType( decl_node );242 }; 243 244 Expression *build_cast( DeclarationNode *decl_node, ExpressionNode *expr_node ) { 245 Type *targetType = maybeMoveBuildType( decl_node ); 242 246 if ( dynamic_cast< VoidType * >( targetType ) ) { 243 247 delete targetType; … … 246 250 return new CastExpr( maybeMoveBuild< Expression >(expr_node), targetType ); 247 251 } // if 248 } // build_cast 249 250 Expression * build_virtual_cast( DeclarationNode * decl_node, ExpressionNode * expr_node ) { 251 Type * targetType = maybeMoveBuildType( decl_node ); 252 Expression * castArg = maybeMoveBuild< Expression >( expr_node ); 252 } 253 254 255 Expression *build_virtual_cast( DeclarationNode *decl_node, ExpressionNode *expr_node ) { 256 Type *targetType = maybeMoveBuildType( decl_node ); 257 Expression *castArg = maybeMoveBuild< Expression >( expr_node ); 253 258 return new VirtualCastExpr( castArg, targetType ); 254 } // build_virtual_cast255 256 Expression * build_fieldSel( ExpressionNode * expr_node, Expression *member ) {257 UntypedMemberExpr * ret = new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) );258 return ret; 259 } // build_fieldSel260 261 Expression * build_pfieldSel( ExpressionNode * expr_node, Expression *member ) {262 UntypedExpr * deref = new UntypedExpr( new NameExpr( "*?" ) );259 } 260 261 Expression *build_fieldSel( ExpressionNode *expr_node, Expression *member ) { 262 UntypedMemberExpr *ret = new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) ); 263 return ret; 264 } 265 266 Expression *build_pfieldSel( ExpressionNode *expr_node, Expression *member ) { 267 UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 263 268 deref->location = expr_node->location; 264 269 deref->get_args().push_back( maybeMoveBuild< Expression >(expr_node) ); 265 UntypedMemberExpr * ret = new UntypedMemberExpr( member, deref );266 return ret; 267 } // build_pfieldSel268 269 Expression * build_addressOf( ExpressionNode *expr_node ) {270 UntypedMemberExpr *ret = new UntypedMemberExpr( member, deref ); 271 return ret; 272 } 273 274 Expression *build_addressOf( ExpressionNode *expr_node ) { 270 275 return new AddressExpr( maybeMoveBuild< Expression >(expr_node) ); 271 } // build_addressOf 272 273 Expression * build_sizeOfexpr( ExpressionNode * expr_node ) { 276 } 277 Expression *build_sizeOfexpr( ExpressionNode *expr_node ) { 274 278 return new SizeofExpr( maybeMoveBuild< Expression >(expr_node) ); 275 } // build_sizeOfexpr 276 277 Expression * build_sizeOftype( DeclarationNode * decl_node ) { 279 } 280 Expression *build_sizeOftype( DeclarationNode *decl_node ) { 278 281 return new SizeofExpr( maybeMoveBuildType( decl_node ) ); 279 } // build_sizeOftype 280 281 Expression * build_alignOfexpr( ExpressionNode * expr_node ) { 282 } 283 Expression *build_alignOfexpr( ExpressionNode *expr_node ) { 282 284 return new AlignofExpr( maybeMoveBuild< Expression >(expr_node) ); 283 } // build_alignOfexpr 284 285 Expression * build_alignOftype( DeclarationNode * decl_node ) { 285 } 286 Expression *build_alignOftype( DeclarationNode *decl_node ) { 286 287 return new AlignofExpr( maybeMoveBuildType( decl_node) ); 287 } // build_alignOftype 288 289 Expression * build_offsetOf( DeclarationNode * decl_node, NameExpr * member ) { 288 } 289 Expression *build_offsetOf( DeclarationNode *decl_node, NameExpr *member ) { 290 290 Expression * ret = new UntypedOffsetofExpr( maybeMoveBuildType( decl_node ), member->get_name() ); 291 291 delete member; 292 292 return ret; 293 } // build_offsetOf294 295 Expression * build_and_or( ExpressionNode * expr_node1, ExpressionNode *expr_node2, bool kind ) {293 } 294 295 Expression *build_and_or( ExpressionNode *expr_node1, ExpressionNode *expr_node2, bool kind ) { 296 296 return new LogicalExpr( notZeroExpr( maybeMoveBuild< Expression >(expr_node1) ), notZeroExpr( maybeMoveBuild< Expression >(expr_node2) ), kind ); 297 } // build_and_or298 299 Expression * build_unary_val( OperKinds op, ExpressionNode *expr_node ) {297 } 298 299 Expression *build_unary_val( OperKinds op, ExpressionNode *expr_node ) { 300 300 std::list< Expression * > args; 301 301 args.push_back( maybeMoveBuild< Expression >(expr_node) ); 302 302 return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args ); 303 } // build_unary_val 304 305 Expression * build_unary_ptr( OperKinds op, ExpressionNode * expr_node ) { 303 } 304 Expression *build_unary_ptr( OperKinds op, ExpressionNode *expr_node ) { 306 305 std::list< Expression * > args; 307 306 args.push_back( new AddressExpr( maybeMoveBuild< Expression >(expr_node) ) ); 308 307 return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args ); 309 } // build_unary_ptr 310 311 Expression * build_binary_val( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) { 308 } 309 Expression *build_binary_val( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) { 312 310 std::list< Expression * > args; 313 311 args.push_back( maybeMoveBuild< Expression >(expr_node1) ); 314 312 args.push_back( maybeMoveBuild< Expression >(expr_node2) ); 315 313 return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args ); 316 } // build_binary_val 317 318 Expression * build_binary_ptr( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) { 314 } 315 Expression *build_binary_ptr( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) { 319 316 std::list< Expression * > args; 320 317 args.push_back( new AddressExpr( maybeMoveBuild< Expression >(expr_node1) ) ); 321 318 args.push_back( maybeMoveBuild< Expression >(expr_node2) ); 322 319 return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args ); 323 } // build_binary_ptr324 325 Expression * build_cond( ExpressionNode * expr_node1, ExpressionNode * expr_node2, ExpressionNode *expr_node3 ) {320 } 321 322 Expression *build_cond( ExpressionNode *expr_node1, ExpressionNode *expr_node2, ExpressionNode *expr_node3 ) { 326 323 return new ConditionalExpr( notZeroExpr( maybeMoveBuild< Expression >(expr_node1) ), maybeMoveBuild< Expression >(expr_node2), maybeMoveBuild< Expression >(expr_node3) ); 327 } // build_cond328 329 Expression * build_comma( ExpressionNode * expr_node1, ExpressionNode *expr_node2 ) {324 } 325 326 Expression *build_comma( ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) { 330 327 return new CommaExpr( maybeMoveBuild< Expression >(expr_node1), maybeMoveBuild< Expression >(expr_node2) ); 331 } // build_comma332 333 Expression * build_attrexpr( NameExpr *var, ExpressionNode * expr_node ) {328 } 329 330 Expression *build_attrexpr( NameExpr *var, ExpressionNode * expr_node ) { 334 331 return new AttrExpr( var, maybeMoveBuild< Expression >(expr_node) ); 335 } // build_attrexpr 336 337 Expression * build_attrtype( NameExpr * var, DeclarationNode * decl_node ) { 332 } 333 Expression *build_attrtype( NameExpr *var, DeclarationNode * decl_node ) { 338 334 return new AttrExpr( var, maybeMoveBuildType( decl_node ) ); 339 } // build_attrtype340 341 Expression * build_tuple( ExpressionNode * expr_node ) {335 } 336 337 Expression *build_tuple( ExpressionNode * expr_node ) { 342 338 std::list< Expression * > exprs; 343 339 buildMoveList( expr_node, exprs ); 344 340 return new UntypedTupleExpr( exprs );; 345 } // build_tuple346 347 Expression * build_func( ExpressionNode * function, ExpressionNode * expr_node ) {341 } 342 343 Expression *build_func( ExpressionNode * function, ExpressionNode * expr_node ) { 348 344 std::list< Expression * > args; 349 345 buildMoveList( expr_node, args ); 350 346 return new UntypedExpr( maybeMoveBuild< Expression >(function), args, nullptr ); 351 } // build_func352 353 Expression * build_range( ExpressionNode * low, ExpressionNode *high ) {347 } 348 349 Expression *build_range( ExpressionNode * low, ExpressionNode *high ) { 354 350 return new RangeExpr( maybeMoveBuild< Expression >( low ), maybeMoveBuild< Expression >( high ) ); 355 } // build_range356 357 Expression * build_asmexpr( ExpressionNode * inout, ConstantExpr * constraint, ExpressionNode *operand ) {351 } 352 353 Expression *build_asmexpr( ExpressionNode *inout, ConstantExpr *constraint, ExpressionNode *operand ) { 358 354 return new AsmExpr( maybeMoveBuild< Expression >( inout ), constraint, maybeMoveBuild< Expression >(operand) ); 359 } // build_asmexpr360 361 Expression * build_valexpr( StatementNode *s ) {355 } 356 357 Expression *build_valexpr( StatementNode *s ) { 362 358 return new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >(s) ) ); 363 } // build_valexpr 364 365 Expression * build_typevalue( DeclarationNode * decl ) { 359 } 360 Expression *build_typevalue( DeclarationNode *decl ) { 366 361 return new TypeExpr( maybeMoveBuildType( decl ) ); 367 } // build_typevalue368 369 Expression * build_compoundLiteral( DeclarationNode * decl_node, InitializerNode *kids ) {362 } 363 364 Expression *build_compoundLiteral( DeclarationNode *decl_node, InitializerNode *kids ) { 370 365 Declaration * newDecl = maybeBuild< Declaration >(decl_node); // compound literal type 371 366 if ( DeclarationWithType * newDeclWithType = dynamic_cast< DeclarationWithType * >( newDecl ) ) { // non-sue compound-literal type … … 393 388 assert( false ); 394 389 } // if 395 } // build_compoundLiteral390 } 396 391 397 392 // Local Variables: // -
src/Parser/InitializerNode.cc
rcd7ef0b r275f4b4 10 10 // Created On : Sat May 16 13:20:24 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jul 28 23:27:20 201713 // Update Count : 2 612 // Last Modified On : Sat Oct 1 23:09:51 2016 13 // Update Count : 21 14 14 // 15 15 … … 22 22 #include "SynTree/Initializer.h" 23 23 24 InitializerNode::InitializerNode( ExpressionNode * _expr, bool aggrp, ExpressionNode *des )25 : expr( _expr ), aggregate( aggrp ), designator( des ), kids( nullptr), maybeConstructed( true ) {24 InitializerNode::InitializerNode( ExpressionNode *_expr, bool aggrp, ExpressionNode *des ) 25 : expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ), maybeConstructed( true ) { 26 26 if ( aggrp ) 27 27 kids = dynamic_cast< InitializerNode * >( get_next() ); 28 28 29 if ( kids )30 set_last( nullptr);31 } // InitializerNode::InitializerNode29 if ( kids != 0 ) 30 set_last( 0 ); 31 } 32 32 33 InitializerNode::InitializerNode( InitializerNode * init, bool aggrp, ExpressionNode *des )34 : expr( nullptr ), aggregate( aggrp ), designator( des ), kids( nullptr), maybeConstructed( true ) {35 if ( init )33 InitializerNode::InitializerNode( InitializerNode *init, bool aggrp, ExpressionNode *des ) 34 : expr( 0 ), aggregate( aggrp ), designator( des ), kids( 0 ), maybeConstructed( true ) { 35 if ( init != 0 ) 36 36 set_last( init ); 37 37 … … 39 39 kids = dynamic_cast< InitializerNode * >( get_next() ); 40 40 41 if ( kids )42 set_next( nullptr);43 } // InitializerNode::InitializerNode41 if ( kids != 0 ) 42 set_next( 0 ); 43 } 44 44 45 45 InitializerNode::~InitializerNode() { … … 47 47 delete designator; 48 48 delete kids; 49 } // InitializerNode::~InitializerNode49 } 50 50 51 51 void InitializerNode::print( std::ostream &os, int indent ) const { 52 52 os << std::string( indent, ' ' ) << "Initializer expression" << std::endl; 53 } // InitializerNode::print53 } 54 54 55 55 void InitializerNode::printOneLine( std::ostream &os ) const { 56 56 if ( ! aggregate ) { 57 if ( designator ) {57 if ( designator != 0 ) { 58 58 os << "designated by: ("; 59 59 ExpressionNode *curdes = designator; 60 while ( curdes != nullptr) {60 while ( curdes != 0) { 61 61 curdes->printOneLine(os); 62 62 curdes = (ExpressionNode *)(curdes->get_next()); … … 65 65 os << ")"; 66 66 } // if 67 if ( expr ) expr->printOneLine( os);67 if ( expr ) expr->printOneLine(os); 68 68 } else { // It's an aggregate 69 69 os << "[--"; 70 if ( next_init() != nullptr)71 next_init()->printOneLine( os);70 if ( next_init() != 0 ) 71 next_init()->printOneLine(os); 72 72 if (aggregate) os << "--]"; 73 73 } // if … … 76 76 if ( (moreInit = dynamic_cast< InitializerNode * >( get_next() ) ) ) { 77 77 moreInit->printOneLine( os ); 78 } // if79 } // InitializerNode::printOneLine78 } 79 } 80 80 81 Initializer * InitializerNode::build() const {81 Initializer *InitializerNode::build() const { 82 82 if ( aggregate ) { 83 83 // steal designators from children … … 93 93 return new ListInit( initlist, designlist, maybeConstructed ); 94 94 } else { 95 if ( get_expression() ) {95 if ( get_expression() != 0) { 96 96 return new SingleInit( maybeBuild< Expression >( get_expression() ), maybeConstructed ); 97 } // if97 } 98 98 } // if 99 return nullptr;100 } // InitializerNode::build99 return 0; 100 } 101 101 102 102 // Local Variables: // -
src/Parser/ParseNode.h
rcd7ef0b r275f4b4 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:28:16 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T hu Jul 27 12:08:08201713 // Update Count : 78 811 // Last Modified By : Andrew Beach 12 // Last Modified On : Tus Jul 25 10:09:00 2017 13 // Update Count : 787 14 14 // 15 15 … … 159 159 Expression * build_constantFloat( const std::string &str ); 160 160 Expression * build_constantChar( const std::string &str ); 161 Expression * build_constantZeroOne( const std::string &str ); 161 162 ConstantExpr * build_constantStr( const std::string &str ); 162 163 Expression * build_field_name_FLOATINGconstant( const std::string & str ); -
src/Parser/TypeData.cc
rcd7ef0b r275f4b4 10 10 // Created On : Sat May 16 15:12:51 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed Aug 9 13:50:00 201713 // Update Count : 56 712 // Last Modified On : Tus Jul 18 10:10:00 2017 13 // Update Count : 566 14 14 // 15 15 … … 748 748 } // buildAggInst 749 749 750 NamedTypeDecl * buildSymbolic( const TypeData * td, const string & name, Type::StorageClasses scs , LinkageSpec::Spec linkage) {750 NamedTypeDecl * buildSymbolic( const TypeData * td, const string & name, Type::StorageClasses scs ) { 751 751 assert( td->kind == TypeData::Symbolic ); 752 752 NamedTypeDecl * ret; 753 753 assert( td->base ); 754 754 if ( td->symbolic.isTypedef ) { 755 ret = new TypedefDecl( name, scs, typebuild( td->base ) , linkage);755 ret = new TypedefDecl( name, scs, typebuild( td->base ) ); 756 756 } else { 757 757 ret = new TypeDecl( name, scs, typebuild( td->base ), TypeDecl::Any ); … … 817 817 return buildEnum( td, attributes ); 818 818 } else if ( td->kind == TypeData::Symbolic ) { 819 return buildSymbolic( td, name, scs , linkage);819 return buildSymbolic( td, name, scs ); 820 820 } else { 821 821 return (new ObjectDecl( name, scs, linkage, bitfieldWidth, typebuild( td ), init, attributes ))->set_asmName( asmName ); -
src/Parser/lex.ll
rcd7ef0b r275f4b4 10 10 * Created On : Sat Sep 22 08:58:10 2001 11 11 * Last Modified By : Peter A. Buhr 12 * Last Modified On : Thu Jul 27 21:46:06201713 * Update Count : 5 5012 * Last Modified On : Mon Jul 24 08:27:23 2017 13 * Update Count : 545 14 14 */ 15 15 16 16 %option yylineno 17 %option noyywrap18 17 %option nounput 19 18 … … 289 288 290 289 /* numeric constants */ 290 "0" { NUMERIC_RETURN(ZERO); } // CFA 291 "1" { NUMERIC_RETURN(ONE); } // CFA 291 292 {decimal_constant} { NUMERIC_RETURN(INTEGERconstant); } 292 293 {octal_constant} { NUMERIC_RETURN(INTEGERconstant); } … … 419 420 420 421 /* unknown characters */ 421 . { printf("unknown character(s):\"%s\" on line %d\n", yytext, yylineno); }422 . { printf("unknown character(s):\"%s\" on line %d\n", yytext, yylineno); } 422 423 423 424 %% -
src/Parser/parser.yy
rcd7ef0b r275f4b4 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed Aug 4 13:33:00 201713 // Update Count : 24 7512 // Last Modified On : Tus Jul 25 10:07:00 2017 13 // Update Count : 2464 14 14 // 15 15 … … 142 142 // converted into the tuple index (.)(1). e.g., 3.x 143 143 %token<tok> REALDECIMALconstant REALFRACTIONconstant FLOATINGconstant 144 %token<tok> ZERO ONE // CFA 144 145 145 146 // multi-character operators … … 158 159 %token ATassign // @= 159 160 160 %type<tok> identifier no_attr_identifier 161 %type<tok> identifier no_attr_identifier zero_one 161 162 %type<tok> identifier_or_type_name no_attr_identifier_or_type_name attr_name 162 163 %type<constant> string_literal … … 182 183 %type<en> asm_clobbers_list_opt 183 184 %type<flag> asm_volatile_opt 184 %type<en> handler_predicate_opt185 185 186 186 // statements … … 360 360 ; 361 361 362 zero_one: // CFA 363 ZERO 364 | ONE 365 ; 366 362 367 string_literal: 363 368 string_literal_list { $$ = build_constantStr( *$1 ); } … … 379 384 IDENTIFIER // typedef name cannot be used as a variable name 380 385 { $$ = new ExpressionNode( build_varref( $1 ) ); } 386 | zero_one 387 { $$ = new ExpressionNode( build_constantZeroOne( *$1 ) ); } 381 388 | tuple 382 389 | '(' comma_expression ')' … … 478 485 $$ = new ExpressionNode( build_field_name_fraction_constants( build_varref( $1 ), $2 ) ); 479 486 } 487 | zero_one fraction_constants 488 { 489 $$ = new ExpressionNode( build_field_name_fraction_constants( build_constantZeroOne( *$1 ), $2 ) ); 490 } 480 491 ; 481 492 … … 528 539 | ALIGNOF unary_expression // GCC, variable alignment 529 540 { $$ = new ExpressionNode( build_alignOfexpr( $2 ) ); } 530 | ALIGNOF '(' type_no_function ')' // GCC, type alignment541 | ALIGNOF '(' type_no_function ')' // GCC, type alignment 531 542 { $$ = new ExpressionNode( build_alignOftype( $3 ) ); } 532 543 | OFFSETOF '(' type_no_function ',' no_attr_identifier ')' … … 969 980 970 981 handler_clause: 971 handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop 972 { $$ = new StatementNode( build_catch( $1, $5, $7, $9 ) ); } 982 // TEMPORARY, TEST EXCEPTIONS 983 handler_key '(' push push INTEGERconstant pop ')' compound_statement pop 984 { $$ = new StatementNode( build_catch( $1, nullptr, new ExpressionNode( build_constantInteger( *$5 ) ), $8 ) ); } 985 | handler_clause handler_key '(' push push INTEGERconstant pop ')' compound_statement pop 986 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, nullptr, new ExpressionNode( build_constantInteger( *$6 ) ), $9 ) ) ); } 987 988 | handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop 989 { $$ = new StatementNode( build_catch( $1, $5, nullptr, $9 ) ); } 973 990 | handler_clause handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop 974 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, $6, $8, $10 ) ) ); }991 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, $6, nullptr, $10 ) ) ); } 975 992 ; 976 993 977 994 handler_predicate_opt: 978 995 //empty 979 { $$ = nullptr; }980 996 | ';' conditional_expression 981 { $$ = $2; }982 997 ; 983 998 … … 1671 1686 | aggregate_key attribute_list_opt typegen_name // CFA 1672 1687 { $$ = $3->addQualifiers( $2 ); } 1688 1689 // Temp, testing TreeStruct 1690 | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name 1691 { 1692 typedefTable.makeTypedef( *$4 ); // create typedef 1693 if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $ 1694 forall = false; // reset 1695 } 1696 '{' field_declaration_list '}' 1697 { 1698 $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct, 1699 $4, nullptr, nullptr, $7, true )->addQualifiers( $3 ); 1700 } 1701 | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name TYPEDEFname 1702 { 1703 typedefTable.makeTypedef( *$4 ); // create typedef 1704 if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $ 1705 forall = false; // reset 1706 } 1707 '{' field_declaration_list '}' 1708 { 1709 $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct, 1710 $4, $5, nullptr, $8, true )->addQualifiers( $3 ); 1711 } 1673 1712 ; 1674 1713 … … 1930 1969 | '=' initializer 1931 1970 { $$ = $2; } 1932 | '=' VOID1933 { $$ = nullptr; }1934 1971 | ATassign initializer 1935 1972 { $$ = $2->set_maybeConstructed( false ); } -
src/ResolvExpr/CurrentObject.cc
rcd7ef0b r275f4b4 36 36 return constExpr->get_constant()->get_ival(); 37 37 } else { 38 assertf( false, "Non-integer constant expression in getConstValue %s", toString( constExpr ).c_str() ); // xxx - might be semantic error38 assertf( false, "Non-integer constant expression in getConstValue", toString( constExpr ).c_str() ); // xxx - might be semantic error 39 39 } 40 40 } else if ( dynamic_cast< OneType * >( constExpr->get_result() ) ) { … … 176 176 setPosition( castExpr->get_arg() ); 177 177 } else if ( VariableExpr * varExpr = dynamic_cast< VariableExpr * >( expr ) ) { 178 assertf( dynamic_cast<EnumInstType *> ( varExpr->get_result() ), "ArrayIterator given variable that isn't an enum constant : %s", toString( expr ).c_str() );178 assertf( dynamic_cast<EnumInstType *> ( varExpr->get_result() ), "ArrayIterator given variable that isn't an enum constant", toString( expr ).c_str() ); 179 179 index = 0; // xxx - get actual value of enum constant 180 180 } else if ( dynamic_cast< SizeofExpr * >( expr ) || dynamic_cast< AlignofExpr * >( expr ) ) { … … 518 518 curTypes = newTypes; 519 519 newTypes.clear(); 520 assertf( desigAlts.size() == curTypes.size(), "Designator alternatives (% zu) and current types (%zu) out of sync", desigAlts.size(), curTypes.size() );520 assertf( desigAlts.size() == curTypes.size(), "Designator alternatives (%d) and current types (%d) out of sync", desigAlts.size(), curTypes.size() ); 521 521 } // for 522 522 if ( desigAlts.size() > 1 ) { -
src/ResolvExpr/Resolver.cc
rcd7ef0b r275f4b4 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 12:17:01 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : T us Aug 8 16:06:00201713 // Update Count : 21 211 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 23 17:23:14 2017 13 // Update Count : 211 14 14 // 15 15 … … 71 71 virtual void visit( ReturnStmt *returnStmt ) override; 72 72 virtual void visit( ThrowStmt *throwStmt ) override; 73 virtual void visit( CatchStmt *catchStmt ) override;74 73 75 74 virtual void visit( SingleInit *singleInit ) override; … … 369 368 370 369 void Resolver::visit( ThrowStmt *throwStmt ) { 371 // TODO: Replace *exception type with &exception type.372 370 if ( throwStmt->get_expr() ) { 373 StructDecl * exception_decl = 374 lookupStruct( "__cfaehm__base_exception_t" ); 375 assert( exception_decl ); 376 Expression * wrapped = new CastExpr( 377 throwStmt->get_expr(), 378 new PointerType( 379 noQualifiers, 380 new StructInstType( 381 noQualifiers, 382 exception_decl 383 ) 384 ) 385 ); 371 Expression * wrapped = new CastExpr( throwStmt->get_expr(), new BasicType( Type::Qualifiers(), BasicType::SignedInt ) ); 386 372 Expression * newExpr = findSingleExpression( wrapped, *this ); 387 373 throwStmt->set_expr( newExpr ); 388 }389 }390 391 void Resolver::visit( CatchStmt *catchStmt ) {392 if ( catchStmt->get_cond() ) {393 Expression * wrapped = new CastExpr(394 catchStmt->get_cond(),395 new BasicType( noQualifiers, BasicType::Bool )396 );397 catchStmt->set_cond( findSingleExpression( wrapped, *this ) );398 374 } 399 375 } -
src/SymTab/Validate.cc
rcd7ef0b r275f4b4 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:50:04 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : T us Aug 8 13:27:00201713 // Update Count : 35 811 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 30 16:50:13 2017 13 // Update Count : 357 14 14 // 15 15 … … 686 686 Type *designatorType = tyDecl->get_base()->stripDeclarator(); 687 687 if ( StructInstType *aggDecl = dynamic_cast< StructInstType * >( designatorType ) ) { 688 return new StructDecl( aggDecl->get_name() , DeclarationNode::Struct, noAttributes, tyDecl->get_linkage());688 return new StructDecl( aggDecl->get_name() ); 689 689 } else if ( UnionInstType *aggDecl = dynamic_cast< UnionInstType * >( designatorType ) ) { 690 return new UnionDecl( aggDecl->get_name() , noAttributes, tyDecl->get_linkage());690 return new UnionDecl( aggDecl->get_name() ); 691 691 } else if ( EnumInstType *enumDecl = dynamic_cast< EnumInstType * >( designatorType ) ) { 692 return new EnumDecl( enumDecl->get_name() , noAttributes, tyDecl->get_linkage());692 return new EnumDecl( enumDecl->get_name() ); 693 693 } else { 694 694 return ret->clone(); … … 783 783 type = new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ); 784 784 } // if 785 TypedefDeclPtr tyDecl( new TypedefDecl( aggDecl->get_name(), Type::StorageClasses(), type , aggDecl->get_linkage()) );785 TypedefDeclPtr tyDecl( new TypedefDecl( aggDecl->get_name(), Type::StorageClasses(), type ) ); 786 786 typedefNames[ aggDecl->get_name() ] = std::make_pair( std::move( tyDecl ), scopeLevel ); 787 787 } // if … … 903 903 FunctionType * ftype = functionDecl->get_functionType(); 904 904 std::list< DeclarationWithType * > & retVals = ftype->get_returnVals(); 905 assertf( retVals.size() == 0 || retVals.size() == 1, "Function %s has too many return values: % zu", functionDecl->get_name().c_str(), retVals.size() );905 assertf( retVals.size() == 0 || retVals.size() == 1, "Function %s has too many return values: %d", functionDecl->get_name().c_str(), retVals.size() ); 906 906 if ( retVals.size() == 1 ) { 907 907 // ensure all function return values have a name - use the name of the function to disambiguate (this also provides a nice bit of help for debugging). -
src/SynTree/AggregateDecl.cc
rcd7ef0b r275f4b4 10 10 // Created On : Sun May 17 23:56:39 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Aug 4 14:22:00 201713 // Update Count : 2 212 // Last Modified On : Tus Jun 27 15:30:00 2017 13 // Update Count : 21 14 14 // 15 15 … … 40 40 using std::endl; 41 41 42 os << typeString() << " " << get_name() << ":"; 43 if ( get_linkage() != LinkageSpec::Cforall ) { 44 os << " " << LinkageSpec::linkageName( get_linkage() ); 45 } // if 46 os << " with body " << has_body() << endl; 42 os << typeString() << " " << get_name(); 43 os << string( indent+2, ' ' ) << "with body " << has_body() << endl; 47 44 48 45 if ( ! parameters.empty() ) { -
src/SynTree/Declaration.cc
rcd7ef0b r275f4b4 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Wed Aug 9 14:38:00201713 // Update Count : 2 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 16 07:49:18 2017 13 // Update Count : 24 14 14 // 15 15 … … 28 28 29 29 Declaration::Declaration( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage ) 30 : name( name ), linkage( linkage ), storageClasses( scs), uniqueId( 0 ) {30 : name( name ), storageClasses( scs ), linkage( linkage ), uniqueId( 0 ) { 31 31 } 32 32 33 33 Declaration::Declaration( const Declaration &other ) 34 : BaseSyntaxNode( other ), name( other.name ), linkage( other.linkage ), extension( other.extension ), storageClasses( other.storageClasses), uniqueId( other.uniqueId ) {34 : BaseSyntaxNode( other ), name( other.name ), storageClasses( other.storageClasses ), linkage( other.linkage ), uniqueId( other.uniqueId ) { 35 35 } 36 36 -
src/SynTree/Declaration.h
rcd7ef0b r275f4b4 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Wed Aug 9 14:45:00201713 // Update Count : 12 611 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:52:59 2017 13 // Update Count : 124 14 14 // 15 15 … … 27 27 class Declaration : public BaseSyntaxNode { 28 28 public: 29 std::string name;30 LinkageSpec::Spec linkage;31 bool extension = false;32 33 29 Declaration( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage ); 34 30 Declaration( const Declaration &other ); … … 57 53 static void dumpIds( std::ostream &os ); 58 54 static Declaration *declFromId( UniqueId id ); 59 60 private: 55 private: 56 std::string name; 61 57 Type::StorageClasses storageClasses; 58 LinkageSpec::Spec linkage; 62 59 UniqueId uniqueId; 60 bool extension = false; 63 61 }; 64 62 65 63 class DeclarationWithType : public Declaration { 66 64 public: 65 DeclarationWithType( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes, Type::FuncSpecifiers fs ); 66 DeclarationWithType( const DeclarationWithType &other ); 67 virtual ~DeclarationWithType(); 68 69 std::string get_mangleName() const { return mangleName; } 70 DeclarationWithType * set_mangleName( std::string newValue ) { mangleName = newValue; return this; } 71 72 std::string get_scopedMangleName() const { return mangleName + "_" + std::to_string(scopeLevel); } 73 74 int get_scopeLevel() const { return scopeLevel; } 75 DeclarationWithType * set_scopeLevel( int newValue ) { scopeLevel = newValue; return this; } 76 77 ConstantExpr *get_asmName() const { return asmName; } 78 DeclarationWithType * set_asmName( ConstantExpr *newValue ) { asmName = newValue; return this; } 79 80 std::list< Attribute * >& get_attributes() { return attributes; } 81 const std::list< Attribute * >& get_attributes() const { return attributes; } 82 83 Type::FuncSpecifiers get_funcSpec() const { return fs; } 84 //void set_functionSpecifiers( Type::FuncSpecifiers newValue ) { fs = newValue; } 85 86 virtual DeclarationWithType *clone() const = 0; 87 virtual DeclarationWithType *acceptMutator( Mutator &m ) = 0; 88 89 virtual Type *get_type() const = 0; 90 virtual void set_type(Type *) = 0; 91 private: 67 92 // this represents the type with all types and typedefs expanded it is generated by SymTab::Validate::Pass2 68 93 std::string mangleName; … … 72 97 ConstantExpr *asmName; 73 98 std::list< Attribute * > attributes; 74 75 DeclarationWithType( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes, Type::FuncSpecifiers fs );76 DeclarationWithType( const DeclarationWithType &other );77 virtual ~DeclarationWithType();78 79 std::string get_mangleName() const { return mangleName; }80 DeclarationWithType * set_mangleName( std::string newValue ) { mangleName = newValue; return this; }81 82 std::string get_scopedMangleName() const { return mangleName + "_" + std::to_string(scopeLevel); }83 84 int get_scopeLevel() const { return scopeLevel; }85 DeclarationWithType * set_scopeLevel( int newValue ) { scopeLevel = newValue; return this; }86 87 ConstantExpr *get_asmName() const { return asmName; }88 DeclarationWithType * set_asmName( ConstantExpr *newValue ) { asmName = newValue; return this; }89 90 std::list< Attribute * >& get_attributes() { return attributes; }91 const std::list< Attribute * >& get_attributes() const { return attributes; }92 93 Type::FuncSpecifiers get_funcSpec() const { return fs; }94 //void set_functionSpecifiers( Type::FuncSpecifiers newValue ) { fs = newValue; }95 96 virtual DeclarationWithType *clone() const = 0;97 virtual DeclarationWithType *acceptMutator( Mutator &m ) = 0;98 99 virtual Type *get_type() const = 0;100 virtual void set_type(Type *) = 0;101 102 private:103 99 Type::FuncSpecifiers fs; 104 100 }; … … 107 103 typedef DeclarationWithType Parent; 108 104 public: 109 Type *type;110 Initializer *init;111 Expression *bitfieldWidth;112 113 105 ObjectDecl( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, Expression *bitfieldWidth, Type *type, Initializer *init, 114 106 const std::list< Attribute * > attributes = std::list< Attribute * >(), Type::FuncSpecifiers fs = Type::FuncSpecifiers() ); … … 130 122 virtual void print( std::ostream &os, int indent = 0 ) const; 131 123 virtual void printShort( std::ostream &os, int indent = 0 ) const; 124 private: 125 Type *type; 126 Initializer *init; 127 Expression *bitfieldWidth; 132 128 }; 133 129 … … 135 131 typedef DeclarationWithType Parent; 136 132 public: 137 FunctionType *type;138 CompoundStmt *statements;139 140 133 FunctionDecl( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, FunctionType *type, CompoundStmt *statements, 141 134 const std::list< Attribute * > attributes = std::list< Attribute * >(), Type::FuncSpecifiers fs = Type::FuncSpecifiers() ); … … 156 149 virtual void print( std::ostream &os, int indent = 0 ) const; 157 150 virtual void printShort( std::ostream &os, int indent = 0 ) const; 151 private: 152 FunctionType *type; 153 CompoundStmt *statements; 158 154 }; 159 155 … … 161 157 typedef Declaration Parent; 162 158 public: 163 Type *base;164 std::list< TypeDecl* > parameters;165 std::list< DeclarationWithType* > assertions;166 167 159 NamedTypeDecl( const std::string &name, Type::StorageClasses scs, Type *type ); 168 160 NamedTypeDecl( const NamedTypeDecl &other ); … … 179 171 virtual void print( std::ostream &os, int indent = 0 ) const; 180 172 virtual void printShort( std::ostream &os, int indent = 0 ) const; 173 protected: 174 private: 175 Type *base; 176 std::list< TypeDecl* > parameters; 177 std::list< DeclarationWithType* > assertions; 181 178 }; 182 179 … … 185 182 public: 186 183 enum Kind { Any, Dtype, Ftype, Ttype }; 187 188 Type * init;189 bool sized;190 191 184 /// Data extracted from a type decl 192 185 struct Data { … … 223 216 private: 224 217 Kind kind; 218 Type * init; 219 bool sized; 225 220 }; 226 221 … … 228 223 typedef NamedTypeDecl Parent; 229 224 public: 230 TypedefDecl( const std::string &name, Type::StorageClasses scs, Type *type , LinkageSpec::Spec spec = LinkageSpec::Cforall ) : Parent( name, scs, type ) { set_linkage( spec );}225 TypedefDecl( const std::string &name, Type::StorageClasses scs, Type *type ) : Parent( name, scs, type ) {} 231 226 TypedefDecl( const TypedefDecl &other ) : Parent( other ) {} 232 227 … … 242 237 typedef Declaration Parent; 243 238 public: 239 AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ); 240 AggregateDecl( const AggregateDecl &other ); 241 virtual ~AggregateDecl(); 242 243 std::list<Declaration*>& get_members() { return members; } 244 std::list<TypeDecl*>& get_parameters() { return parameters; } 245 246 std::list< Attribute * >& get_attributes() { return attributes; } 247 const std::list< Attribute * >& get_attributes() const { return attributes; } 248 249 bool has_body() const { return body; } 250 AggregateDecl * set_body( bool body ) { AggregateDecl::body = body; return this; } 251 252 virtual void print( std::ostream &os, int indent = 0 ) const; 253 virtual void printShort( std::ostream &os, int indent = 0 ) const; 254 protected: 255 virtual std::string typeString() const = 0; 256 257 private: 244 258 std::list<Declaration*> members; 245 259 std::list<TypeDecl*> parameters; 246 260 bool body; 247 261 std::list< Attribute * > attributes; 248 249 AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall );250 AggregateDecl( const AggregateDecl &other );251 virtual ~AggregateDecl();252 253 std::list<Declaration*>& get_members() { return members; }254 std::list<TypeDecl*>& get_parameters() { return parameters; }255 256 std::list< Attribute * >& get_attributes() { return attributes; }257 const std::list< Attribute * >& get_attributes() const { return attributes; }258 259 bool has_body() const { return body; }260 AggregateDecl * set_body( bool body ) { AggregateDecl::body = body; return this; }261 262 virtual void print( std::ostream &os, int indent = 0 ) const;263 virtual void printShort( std::ostream &os, int indent = 0 ) const;264 protected:265 virtual std::string typeString() const = 0;266 262 }; 267 263 … … 337 333 class AsmDecl : public Declaration { 338 334 public: 339 AsmStmt *stmt;340 341 335 AsmDecl( AsmStmt *stmt ); 342 336 AsmDecl( const AsmDecl &other ); … … 351 345 virtual void print( std::ostream &os, int indent = 0 ) const; 352 346 virtual void printShort( std::ostream &os, int indent = 0 ) const; 347 private: 348 AsmStmt *stmt; 353 349 }; 354 350 -
src/SynTree/Expression.h
rcd7ef0b r275f4b4 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Aug 8 11:54:00 201713 // Update Count : 4 412 // Last Modified On : Mon Jul 24 16:27:00 2017 13 // Update Count : 43 14 14 // 15 15 … … 29 29 class Expression : public BaseSyntaxNode{ 30 30 public: 31 Type * result;32 TypeSubstitution * env;33 Expression * argName; // if expression is used as an argument, it can be "designated" by this name34 bool extension = false;35 36 31 Expression( Expression * _aname = nullptr ); 37 32 Expression( const Expression & other ); … … 54 49 virtual Expression * acceptMutator( Mutator & m ) = 0; 55 50 virtual void print( std::ostream & os, int indent = 0 ) const; 51 protected: 52 Type * result; 53 TypeSubstitution * env; 54 Expression * argName; // if expression is used as an argument, it can be "designated" by this name 55 bool extension = false; 56 56 }; 57 57 … … 79 79 class ApplicationExpr : public Expression { 80 80 public: 81 Expression * function;82 83 81 ApplicationExpr( Expression * function, const std::list<Expression *> & args = std::list< Expression * >() ); 84 82 ApplicationExpr( const ApplicationExpr & other ); … … 94 92 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 95 93 virtual void print( std::ostream & os, int indent = 0 ) const; 96 97 private: 94 private: 95 Expression * function; 98 96 std::list<Expression *> args; 99 97 InferredParams inferParams; … … 105 103 class UntypedExpr : public Expression { 106 104 public: 107 Expression * function;108 std::list<Expression*> args;109 110 105 UntypedExpr( Expression * function, const std::list<Expression *> & args = std::list< Expression * >(), Expression *_aname = nullptr ); 111 106 UntypedExpr( const UntypedExpr & other ); … … 128 123 virtual void print( std::ostream & os, int indent = 0 ) const; 129 124 virtual void printArgs(std::ostream & os, int indent = 0) const; 125 private: 126 Expression * function; 127 std::list<Expression*> args; 130 128 }; 131 129 … … 133 131 class NameExpr : public Expression { 134 132 public: 135 std::string name;136 137 133 NameExpr( std::string name, Expression *_aname = nullptr ); 138 134 NameExpr( const NameExpr & other ); … … 146 142 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 147 143 virtual void print( std::ostream & os, int indent = 0 ) const; 144 private: 145 std::string name; 148 146 }; 149 147 … … 154 152 class AddressExpr : public Expression { 155 153 public: 156 Expression * arg;157 158 154 AddressExpr( Expression * arg, Expression *_aname = nullptr ); 159 155 AddressExpr( const AddressExpr & other ); … … 167 163 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 168 164 virtual void print( std::ostream & os, int indent = 0 ) const; 165 private: 166 Expression * arg; 169 167 }; 170 168 … … 172 170 class LabelAddressExpr : public Expression { 173 171 public: 174 Expression * arg;175 176 172 LabelAddressExpr( Expression * arg ); 177 173 LabelAddressExpr( const LabelAddressExpr & other ); … … 185 181 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 186 182 virtual void print( std::ostream & os, int indent = 0 ) const; 183 private: 184 Expression * arg; 187 185 }; 188 186 … … 190 188 class CastExpr : public Expression { 191 189 public: 192 Expression * arg;193 194 190 CastExpr( Expression * arg, Expression *_aname = nullptr ); 195 191 CastExpr( Expression * arg, Type * toType, Expression *_aname = nullptr ); … … 204 200 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 205 201 virtual void print( std::ostream & os, int indent = 0 ) const; 202 private: 203 Expression * arg; 206 204 }; 207 205 … … 209 207 class VirtualCastExpr : public Expression { 210 208 public: 211 Expression * arg;212 213 209 VirtualCastExpr( Expression * arg, Type * toType ); 214 210 VirtualCastExpr( const VirtualCastExpr & other ); … … 222 218 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 223 219 virtual void print( std::ostream & os, int indent = 0 ) const; 220 private: 221 Expression * arg; 224 222 }; 225 223 … … 227 225 class UntypedMemberExpr : public Expression { 228 226 public: 229 Expression * member;230 Expression * aggregate;231 232 227 UntypedMemberExpr( Expression * member, Expression * aggregate, Expression *_aname = nullptr ); 233 228 UntypedMemberExpr( const UntypedMemberExpr & other ); … … 243 238 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 244 239 virtual void print( std::ostream & os, int indent = 0 ) const; 240 private: 241 Expression * member; 242 Expression * aggregate; 245 243 }; 246 244 … … 249 247 class MemberExpr : public Expression { 250 248 public: 251 DeclarationWithType * member;252 Expression * aggregate;253 254 249 MemberExpr( DeclarationWithType * member, Expression * aggregate, Expression *_aname = nullptr ); 255 250 MemberExpr( const MemberExpr & other ); … … 265 260 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 266 261 virtual void print( std::ostream & os, int indent = 0 ) const; 262 private: 263 DeclarationWithType * member; 264 Expression * aggregate; 267 265 }; 268 266 … … 271 269 class VariableExpr : public Expression { 272 270 public: 273 DeclarationWithType * var;274 275 271 VariableExpr( DeclarationWithType * var, Expression *_aname = nullptr ); 276 272 VariableExpr( const VariableExpr & other ); … … 284 280 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 285 281 virtual void print( std::ostream & os, int indent = 0 ) const; 282 private: 283 DeclarationWithType * var; 286 284 }; 287 285 … … 289 287 class ConstantExpr : public Expression { 290 288 public: 291 Constant constant;292 293 289 ConstantExpr( Constant constant, Expression *_aname = nullptr ); 294 290 ConstantExpr( const ConstantExpr & other ); … … 302 298 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 303 299 virtual void print( std::ostream & os, int indent = 0 ) const; 300 private: 301 Constant constant; 304 302 }; 305 303 … … 307 305 class SizeofExpr : public Expression { 308 306 public: 309 Expression * expr;310 Type * type;311 bool isType;312 313 307 SizeofExpr( Expression * expr, Expression *_aname = nullptr ); 314 308 SizeofExpr( const SizeofExpr & other ); … … 327 321 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 328 322 virtual void print( std::ostream & os, int indent = 0 ) const; 329 }; 330 331 /// AlignofExpr represents an alignof expression 332 class AlignofExpr : public Expression { 333 public: 323 private: 334 324 Expression * expr; 335 325 Type * type; 336 326 bool isType; 337 327 }; 328 329 /// AlignofExpr represents an alignof expression 330 class AlignofExpr : public Expression { 331 public: 338 332 AlignofExpr( Expression * expr, Expression *_aname = nullptr ); 339 333 AlignofExpr( const AlignofExpr & other ); … … 352 346 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 353 347 virtual void print( std::ostream & os, int indent = 0 ) const; 348 private: 349 Expression * expr; 350 Type * type; 351 bool isType; 354 352 }; 355 353 … … 357 355 class UntypedOffsetofExpr : public Expression { 358 356 public: 359 Type * type;360 std::string member;361 362 357 UntypedOffsetofExpr( Type * type, const std::string & member, Expression *_aname = nullptr ); 363 358 UntypedOffsetofExpr( const UntypedOffsetofExpr & other ); … … 373 368 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 374 369 virtual void print( std::ostream & os, int indent = 0 ) const; 370 private: 371 Type * type; 372 std::string member; 375 373 }; 376 374 … … 378 376 class OffsetofExpr : public Expression { 379 377 public: 380 Type * type;381 DeclarationWithType * member;382 383 378 OffsetofExpr( Type * type, DeclarationWithType * member, Expression *_aname = nullptr ); 384 379 OffsetofExpr( const OffsetofExpr & other ); … … 394 389 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 395 390 virtual void print( std::ostream & os, int indent = 0 ) const; 391 private: 392 Type * type; 393 DeclarationWithType * member; 396 394 }; 397 395 … … 399 397 class OffsetPackExpr : public Expression { 400 398 public: 401 StructInstType * type;402 403 399 OffsetPackExpr( StructInstType * type_, Expression * aname_ = 0 ); 404 400 OffsetPackExpr( const OffsetPackExpr & other ); … … 411 407 virtual void accept( Visitor & v ) { v.visit( this ); } 412 408 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 413 virtual void print( std::ostream & os, int indent = 0 ) const; 409 410 virtual void print( std::ostream & os, int indent = 0 ) const; 411 412 private: 413 StructInstType * type; 414 414 }; 415 415 … … 417 417 class AttrExpr : public Expression { 418 418 public: 419 Expression * attr;420 Expression * expr;421 Type * type;422 bool isType;423 424 419 AttrExpr(Expression * attr, Expression * expr, Expression *_aname = nullptr ); 425 420 AttrExpr( const AttrExpr & other ); … … 440 435 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 441 436 virtual void print( std::ostream & os, int indent = 0 ) const; 437 private: 438 Expression * attr; 439 Expression * expr; 440 Type * type; 441 bool isType; 442 442 }; 443 443 … … 445 445 class LogicalExpr : public Expression { 446 446 public: 447 Expression * arg1;448 Expression * arg2;449 450 447 LogicalExpr( Expression * arg1, Expression * arg2, bool andp = true, Expression *_aname = nullptr ); 451 448 LogicalExpr( const LogicalExpr & other ); … … 462 459 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 463 460 virtual void print( std::ostream & os, int indent = 0 ) const; 464 465 private: 461 private: 462 Expression * arg1; 463 Expression * arg2; 466 464 bool isAnd; 467 465 }; … … 470 468 class ConditionalExpr : public Expression { 471 469 public: 472 Expression * arg1;473 Expression * arg2;474 Expression * arg3;475 476 470 ConditionalExpr( Expression * arg1, Expression * arg2, Expression * arg3, Expression *_aname = nullptr ); 477 471 ConditionalExpr( const ConditionalExpr & other ); … … 489 483 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 490 484 virtual void print( std::ostream & os, int indent = 0 ) const; 485 private: 486 Expression * arg1; 487 Expression * arg2; 488 Expression * arg3; 491 489 }; 492 490 … … 494 492 class CommaExpr : public Expression { 495 493 public: 496 Expression * arg1;497 Expression * arg2;498 499 494 CommaExpr( Expression * arg1, Expression * arg2, Expression *_aname = nullptr ); 500 495 CommaExpr( const CommaExpr & other ); … … 510 505 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 511 506 virtual void print( std::ostream & os, int indent = 0 ) const; 507 private: 508 Expression * arg1; 509 Expression * arg2; 512 510 }; 513 511 … … 515 513 class TypeExpr : public Expression { 516 514 public: 517 Type * type;518 519 515 TypeExpr( Type * type ); 520 516 TypeExpr( const TypeExpr & other ); … … 528 524 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 529 525 virtual void print( std::ostream & os, int indent = 0 ) const; 526 private: 527 Type * type; 530 528 }; 531 529 … … 533 531 class AsmExpr : public Expression { 534 532 public: 533 AsmExpr( Expression * inout, ConstantExpr * constraint, Expression * operand ) : inout( inout ), constraint( constraint ), operand( operand ) {} 534 AsmExpr( const AsmExpr & other ); 535 virtual ~AsmExpr() { delete inout; delete constraint; delete operand; }; 536 537 Expression * get_inout() const { return inout; } 538 void set_inout( Expression * newValue ) { inout = newValue; } 539 540 ConstantExpr * get_constraint() const { return constraint; } 541 void set_constraint( ConstantExpr * newValue ) { constraint = newValue; } 542 543 Expression * get_operand() const { return operand; } 544 void set_operand( Expression * newValue ) { operand = newValue; } 545 546 virtual AsmExpr * clone() const { return new AsmExpr( * this ); } 547 virtual void accept( Visitor & v ) { v.visit( this ); } 548 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 549 virtual void print( std::ostream & os, int indent = 0 ) const; 550 private: 551 // https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Machine-Constraints.html#Machine-Constraints 535 552 Expression * inout; 536 553 ConstantExpr * constraint; 537 554 Expression * operand; 538 539 AsmExpr( Expression * inout, ConstantExpr * constraint, Expression * operand ) : inout( inout ), constraint( constraint ), operand( operand ) {}540 AsmExpr( const AsmExpr & other );541 virtual ~AsmExpr() { delete inout; delete constraint; delete operand; };542 543 Expression * get_inout() const { return inout; }544 void set_inout( Expression * newValue ) { inout = newValue; }545 546 ConstantExpr * get_constraint() const { return constraint; }547 void set_constraint( ConstantExpr * newValue ) { constraint = newValue; }548 549 Expression * get_operand() const { return operand; }550 void set_operand( Expression * newValue ) { operand = newValue; }551 552 virtual AsmExpr * clone() const { return new AsmExpr( * this ); }553 virtual void accept( Visitor & v ) { v.visit( this ); }554 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }555 virtual void print( std::ostream & os, int indent = 0 ) const;556 557 // https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Machine-Constraints.html#Machine-Constraints558 555 }; 559 556 … … 562 559 class ImplicitCopyCtorExpr : public Expression { 563 560 public: 561 ImplicitCopyCtorExpr( ApplicationExpr * callExpr ); 562 ImplicitCopyCtorExpr( const ImplicitCopyCtorExpr & other ); 563 virtual ~ImplicitCopyCtorExpr(); 564 565 ApplicationExpr * get_callExpr() const { return callExpr; } 566 void set_callExpr( ApplicationExpr * newValue ) { callExpr = newValue; } 567 568 std::list< ObjectDecl * > & get_tempDecls() { return tempDecls; } 569 std::list< ObjectDecl * > & get_returnDecls() { return returnDecls; } 570 std::list< Expression * > & get_dtors() { return dtors; } 571 572 virtual ImplicitCopyCtorExpr * clone() const { return new ImplicitCopyCtorExpr( * this ); } 573 virtual void accept( Visitor & v ) { v.visit( this ); } 574 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 575 virtual void print( std::ostream & os, int indent = 0 ) const; 576 private: 564 577 ApplicationExpr * callExpr; 565 578 std::list< ObjectDecl * > tempDecls; 566 579 std::list< ObjectDecl * > returnDecls; 567 580 std::list< Expression * > dtors; 568 569 ImplicitCopyCtorExpr( ApplicationExpr * callExpr );570 ImplicitCopyCtorExpr( const ImplicitCopyCtorExpr & other );571 virtual ~ImplicitCopyCtorExpr();572 573 ApplicationExpr * get_callExpr() const { return callExpr; }574 void set_callExpr( ApplicationExpr * newValue ) { callExpr = newValue; }575 576 std::list< ObjectDecl * > & get_tempDecls() { return tempDecls; }577 std::list< ObjectDecl * > & get_returnDecls() { return returnDecls; }578 std::list< Expression * > & get_dtors() { return dtors; }579 580 virtual ImplicitCopyCtorExpr * clone() const { return new ImplicitCopyCtorExpr( * this ); }581 virtual void accept( Visitor & v ) { v.visit( this ); }582 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }583 virtual void print( std::ostream & os, int indent = 0 ) const;584 581 }; 585 582 … … 587 584 class ConstructorExpr : public Expression { 588 585 public: 589 Expression * callExpr;590 591 586 ConstructorExpr( Expression * callExpr ); 592 587 ConstructorExpr( const ConstructorExpr & other ); … … 600 595 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 601 596 virtual void print( std::ostream & os, int indent = 0 ) const; 597 private: 598 Expression * callExpr; 602 599 }; 603 600 … … 605 602 class CompoundLiteralExpr : public Expression { 606 603 public: 607 Initializer * initializer;608 609 604 CompoundLiteralExpr( Type * type, Initializer * initializer ); 610 605 CompoundLiteralExpr( const CompoundLiteralExpr & other ); … … 618 613 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 619 614 virtual void print( std::ostream & os, int indent = 0 ) const; 615 private: 616 Initializer * initializer; 620 617 }; 621 618 … … 623 620 class RangeExpr : public Expression { 624 621 public: 625 Expression * low, * high;626 627 622 RangeExpr( Expression * low, Expression * high ); 628 623 RangeExpr( const RangeExpr & other ); … … 637 632 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 638 633 virtual void print( std::ostream & os, int indent = 0 ) const; 634 private: 635 Expression * low, * high; 639 636 }; 640 637 … … 642 639 class UntypedTupleExpr : public Expression { 643 640 public: 644 std::list<Expression*> exprs;645 646 641 UntypedTupleExpr( const std::list< Expression * > & exprs, Expression *_aname = nullptr ); 647 642 UntypedTupleExpr( const UntypedTupleExpr & other ); … … 654 649 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 655 650 virtual void print( std::ostream & os, int indent = 0 ) const; 651 private: 652 std::list<Expression*> exprs; 656 653 }; 657 654 … … 659 656 class TupleExpr : public Expression { 660 657 public: 661 std::list<Expression*> exprs;662 663 658 TupleExpr( const std::list< Expression * > & exprs, Expression *_aname = nullptr ); 664 659 TupleExpr( const TupleExpr & other ); … … 671 666 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 672 667 virtual void print( std::ostream & os, int indent = 0 ) const; 668 private: 669 std::list<Expression*> exprs; 673 670 }; 674 671 … … 676 673 class TupleIndexExpr : public Expression { 677 674 public: 678 Expression * tuple;679 unsigned int index;680 681 675 TupleIndexExpr( Expression * tuple, unsigned int index ); 682 676 TupleIndexExpr( const TupleIndexExpr & other ); … … 692 686 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 693 687 virtual void print( std::ostream & os, int indent = 0 ) const; 688 private: 689 Expression * tuple; 690 unsigned int index; 694 691 }; 695 692 … … 697 694 class TupleAssignExpr : public Expression { 698 695 public: 699 StmtExpr * stmtExpr = nullptr;700 701 696 TupleAssignExpr( const std::list< Expression * > & assigns, const std::list< ObjectDecl * > & tempDecls, Expression * _aname = nullptr ); 702 697 TupleAssignExpr( const TupleAssignExpr & other ); … … 710 705 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 711 706 virtual void print( std::ostream & os, int indent = 0 ) const; 707 private: 708 StmtExpr * stmtExpr = nullptr; 712 709 }; 713 710 … … 715 712 class StmtExpr : public Expression { 716 713 public: 714 StmtExpr( CompoundStmt * statements ); 715 StmtExpr( const StmtExpr & other ); 716 virtual ~StmtExpr(); 717 718 CompoundStmt * get_statements() const { return statements; } 719 StmtExpr * set_statements( CompoundStmt * newValue ) { statements = newValue; return this; } 720 721 std::list< ObjectDecl * > & get_returnDecls() { return returnDecls; } 722 std::list< Expression * > & get_dtors() { return dtors; } 723 724 virtual StmtExpr * clone() const { return new StmtExpr( * this ); } 725 virtual void accept( Visitor & v ) { v.visit( this ); } 726 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 727 virtual void print( std::ostream & os, int indent = 0 ) const; 728 private: 717 729 CompoundStmt * statements; 718 730 std::list< ObjectDecl * > returnDecls; // return variable(s) for stmt expression 719 731 std::list< Expression * > dtors; // destructor(s) for return variable(s) 720 721 StmtExpr( CompoundStmt * statements );722 StmtExpr( const StmtExpr & other );723 virtual ~StmtExpr();724 725 CompoundStmt * get_statements() const { return statements; }726 StmtExpr * set_statements( CompoundStmt * newValue ) { statements = newValue; return this; }727 728 std::list< ObjectDecl * > & get_returnDecls() { return returnDecls; }729 std::list< Expression * > & get_dtors() { return dtors; }730 731 virtual StmtExpr * clone() const { return new StmtExpr( * this ); }732 virtual void accept( Visitor & v ) { v.visit( this ); }733 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }734 virtual void print( std::ostream & os, int indent = 0 ) const;735 732 }; 736 733 737 734 class UniqueExpr : public Expression { 738 735 public: 736 UniqueExpr( Expression * expr, long long idVal = -1 ); 737 UniqueExpr( const UniqueExpr & other ); 738 ~UniqueExpr(); 739 740 Expression * get_expr() const { return expr; } 741 UniqueExpr * set_expr( Expression * newValue ) { expr = newValue; return this; } 742 743 ObjectDecl * get_object() const { return object; } 744 UniqueExpr * set_object( ObjectDecl * newValue ) { object = newValue; return this; } 745 746 VariableExpr * get_var() const { return var; } 747 UniqueExpr * set_var( VariableExpr * newValue ) { var = newValue; return this; } 748 749 int get_id() const { return id; } 750 751 virtual UniqueExpr * clone() const { return new UniqueExpr( * this ); } 752 virtual void accept( Visitor & v ) { v.visit( this ); } 753 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 754 virtual void print( std::ostream & os, int indent = 0 ) const; 755 private: 739 756 Expression * expr; 740 757 ObjectDecl * object; 741 758 VariableExpr * var; 742 743 UniqueExpr( Expression * expr, long long idVal = -1 );744 UniqueExpr( const UniqueExpr & other );745 ~UniqueExpr();746 747 Expression * get_expr() const { return expr; }748 UniqueExpr * set_expr( Expression * newValue ) { expr = newValue; return this; }749 750 ObjectDecl * get_object() const { return object; }751 UniqueExpr * set_object( ObjectDecl * newValue ) { object = newValue; return this; }752 753 VariableExpr * get_var() const { return var; }754 UniqueExpr * set_var( VariableExpr * newValue ) { var = newValue; return this; }755 756 int get_id() const { return id; }757 758 virtual UniqueExpr * clone() const { return new UniqueExpr( * this ); }759 virtual void accept( Visitor & v ) { v.visit( this ); }760 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }761 virtual void print( std::ostream & os, int indent = 0 ) const;762 763 private:764 759 int id; 765 760 static long long count; … … 778 773 class UntypedInitExpr : public Expression { 779 774 public: 780 Expression * expr;781 std::list<InitAlternative> initAlts;782 783 775 UntypedInitExpr( Expression * expr, const std::list<InitAlternative> & initAlts ); 784 776 UntypedInitExpr( const UntypedInitExpr & other ); … … 794 786 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 795 787 virtual void print( std::ostream & os, int indent = 0 ) const; 788 private: 789 Expression * expr; 790 std::list<InitAlternative> initAlts; 796 791 }; 797 792 798 793 class InitExpr : public Expression { 799 794 public: 800 Expression * expr;801 Designation * designation;802 803 795 InitExpr( Expression * expr, Designation * designation ); 804 796 InitExpr( const InitExpr & other ); … … 815 807 virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); } 816 808 virtual void print( std::ostream & os, int indent = 0 ) const; 809 private: 810 Expression * expr; 811 Designation * designation; 817 812 }; 818 813 -
src/SynTree/Initializer.cc
rcd7ef0b r275f4b4 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Thr Aug 3 11:33:00201613 // Update Count : 2 911 // Last Modified By : Rob Schluntz 12 // Last Modified On : Fri May 13 13:23:03 2016 13 // Update Count : 28 14 14 // 15 15 … … 74 74 } 75 75 } 76 assertf( initializers.size() == designations.size(), "Created ListInit with mismatching initializers (% lu) and designations (%lu)", initializers.size(), designations.size() );76 assertf( initializers.size() == designations.size(), "Created ListInit with mismatching initializers (%d) and designations (%d)", initializers.size(), designations.size() ); 77 77 } 78 78 -
src/SynTree/Initializer.h
rcd7ef0b r275f4b4 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Wed Aug 9 10:19:00201713 // Update Count : 2 211 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:52:02 2017 13 // Update Count : 21 14 14 // 15 15 … … 27 27 class Designation : public BaseSyntaxNode { 28 28 public: 29 std::list< Expression * > designators;30 31 29 Designation( const std::list< Expression * > & designators ); 32 30 Designation( const Designation & other ); … … 39 37 virtual Designation * acceptMutator( Mutator &m ) { return m.mutate( this ); } 40 38 virtual void print( std::ostream &os, int indent = 0 ) const; 39 private: 40 std::list< Expression * > designators; 41 41 }; 42 42 … … 63 63 class SingleInit : public Initializer { 64 64 public: 65 //Constant *value;66 Expression *value; // has to be a compile-time constant67 68 65 SingleInit( Expression *value, bool maybeConstructed = false ); 69 66 SingleInit( const SingleInit &other ); … … 77 74 virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); } 78 75 virtual void print( std::ostream &os, int indent = 0 ) const; 76 private: 77 //Constant *value; 78 Expression *value; // has to be a compile-time constant 79 79 }; 80 80 … … 83 83 class ListInit : public Initializer { 84 84 public: 85 std::list<Initializer *> initializers; // order *is* important86 std::list<Designation *> designations; // order/length is consistent with initializers87 88 85 ListInit( const std::list<Initializer*> &initializers, 89 86 const std::list<Designation *> &designators = {}, bool maybeConstructed = false ); … … 105 102 virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); } 106 103 virtual void print( std::ostream &os, int indent = 0 ) const; 104 private: 105 std::list<Initializer *> initializers; // order *is* important 106 std::list<Designation *> designations; // order/length is consistent with initializers 107 107 }; 108 108 … … 113 113 class ConstructorInit : public Initializer { 114 114 public: 115 Statement * ctor;116 Statement * dtor;117 118 115 ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init ); 119 116 ConstructorInit( const ConstructorInit &other ); … … 133 130 134 131 private: 132 Statement * ctor; 133 Statement * dtor; 135 134 // C-style initializer made up of SingleInit and ListInit nodes to use as a fallback 136 135 // if an appropriate constructor definition is not found by the resolver -
src/SynTree/NamedTypeDecl.cc
rcd7ef0b r275f4b4 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Wed Aug 9 13:28:00201713 // Update Count : 1 411 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 16 07:49:44 2017 13 // Update Count : 13 14 14 // 15 15 … … 38 38 if ( get_name() != "" ) { 39 39 os << get_name() << ": "; 40 } // if41 if ( get_linkage() != LinkageSpec::Cforall ) {42 os << LinkageSpec::linkageName( get_linkage() ) << " ";43 40 } // if 44 41 get_storageClasses().print( os ); -
src/SynTree/Statement.h
rcd7ef0b r275f4b4 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Thr Aug 3 14:08:00201713 // Update Count : 6 911 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:54:32 2017 13 // Update Count : 68 14 14 // 15 15 … … 26 26 class Statement : public BaseSyntaxNode { 27 27 public: 28 std::list<Label> labels;29 30 28 Statement( std::list<Label> labels ); 31 29 virtual ~Statement(); … … 38 36 virtual Statement *acceptMutator( Mutator &m ) = 0; 39 37 virtual void print( std::ostream &os, int indent = 0 ) const; 38 protected: 39 std::list<Label> labels; 40 40 }; 41 41 42 42 class CompoundStmt : public Statement { 43 43 public: 44 std::list<Statement*> kids;45 46 44 CompoundStmt( std::list<Label> labels ); 47 45 CompoundStmt( const CompoundStmt &other ); … … 56 54 virtual CompoundStmt *acceptMutator( Mutator &m ) { return m.mutate( this ); } 57 55 virtual void print( std::ostream &os, int indent = 0 ) const; 56 private: 57 std::list<Statement*> kids; 58 58 }; 59 59 … … 67 67 virtual NullStmt *acceptMutator( Mutator &m ) { return m.mutate( this ); } 68 68 virtual void print( std::ostream &os, int indent = 0 ) const; 69 70 private: 69 71 }; 70 72 71 73 class ExprStmt : public Statement { 72 74 public: 73 Expression *expr;74 75 75 ExprStmt( std::list<Label> labels, Expression *expr ); 76 76 ExprStmt( const ExprStmt &other ); … … 84 84 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); } 85 85 virtual void print( std::ostream &os, int indent = 0 ) const; 86 private: 87 Expression *expr; 86 88 }; 87 89 88 90 class AsmStmt : public Statement { 89 91 public: 90 bool voltile;91 ConstantExpr *instruction;92 std::list<Expression *> output, input;93 std::list<ConstantExpr *> clobber;94 std::list<Label> gotolabels;95 96 92 AsmStmt( std::list<Label> labels, bool voltile, ConstantExpr *instruction, std::list<Expression *> input, std::list<Expression *> output, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels ); 97 93 AsmStmt( const AsmStmt &other ); … … 115 111 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); } 116 112 virtual void print( std::ostream &os, int indent = 0 ) const; 113 private: 114 bool voltile; 115 ConstantExpr *instruction; 116 std::list<Expression *> output, input; 117 std::list<ConstantExpr *> clobber; 118 std::list<Label> gotolabels; 117 119 }; 118 120 119 121 class IfStmt : public Statement { 120 122 public: 121 Expression *condition;122 Statement *thenPart;123 Statement *elsePart;124 125 123 IfStmt( std::list<Label> labels, Expression *condition, Statement *thenPart, Statement *elsePart ); 126 124 IfStmt( const IfStmt &other ); … … 138 136 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); } 139 137 virtual void print( std::ostream &os, int indent = 0 ) const; 138 private: 139 Expression *condition; 140 Statement *thenPart; 141 Statement *elsePart; 140 142 }; 141 143 142 144 class SwitchStmt : public Statement { 143 145 public: 144 Expression * condition;145 146 146 SwitchStmt( std::list<Label> labels, Expression *condition, std::list<Statement *> &statements ); 147 147 SwitchStmt( const SwitchStmt &other ); … … 159 159 virtual void print( std::ostream &os, int indent = 0 ) const; 160 160 private: 161 Expression * condition; 161 162 std::list<Statement *> statements; 162 163 }; … … 164 165 class CaseStmt : public Statement { 165 166 public: 166 Expression * condition;167 std::list<Statement *> stmts;168 169 167 CaseStmt( std::list<Label> labels, Expression *conditions, std::list<Statement *> &stmts, bool isdef = false ) throw(SemanticError); 170 168 CaseStmt( const CaseStmt &other ); … … 188 186 virtual void print( std::ostream &os, int indent = 0 ) const; 189 187 private: 188 Expression * condition; 189 std::list<Statement *> stmts; 190 190 bool _isDefault; 191 191 }; … … 193 193 class WhileStmt : public Statement { 194 194 public: 195 Expression *condition;196 Statement *body;197 bool isDoWhile;198 199 195 WhileStmt( std::list<Label> labels, Expression *condition, 200 196 Statement *body, bool isDoWhile = false ); … … 213 209 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); } 214 210 virtual void print( std::ostream &os, int indent = 0 ) const; 211 private: 212 Expression *condition; 213 Statement *body; 214 bool isDoWhile; 215 215 }; 216 216 217 217 class ForStmt : public Statement { 218 218 public: 219 std::list<Statement *> initialization;220 Expression *condition;221 Expression *increment;222 Statement *body;223 224 219 ForStmt( std::list<Label> labels, std::list<Statement *> initialization, 225 220 Expression *condition = 0, Expression *increment = 0, Statement *body = 0 ); … … 240 235 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); } 241 236 virtual void print( std::ostream &os, int indent = 0 ) const; 237 private: 238 std::list<Statement *> initialization; 239 Expression *condition; 240 Expression *increment; 241 Statement *body; 242 242 }; 243 243 … … 246 246 enum Type { Goto = 0, Break, Continue }; 247 247 248 // originalTarget kept for error messages. 249 const Label originalTarget; 248 BranchStmt( std::list<Label> labels, Label target, Type ) throw (SemanticError); 249 BranchStmt( std::list<Label> labels, Expression *computedTarget, Type ) throw (SemanticError); 250 251 Label get_originalTarget() { return originalTarget; } 252 Label get_target() { return target; } 253 void set_target( Label newValue ) { target = newValue; } 254 255 Expression *get_computedTarget() { return computedTarget; } 256 void set_target( Expression * newValue ) { computedTarget = newValue; } 257 258 Type get_type() { return type; } 259 const char *get_typename() { return brType[ type ]; } 260 261 virtual BranchStmt *clone() const { return new BranchStmt( *this ); } 262 virtual void accept( Visitor &v ) { v.visit( this ); } 263 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); } 264 virtual void print( std::ostream &os, int indent = 0 ) const; 265 private: 266 static const char *brType[]; 267 Label originalTarget; // can give better error messages if we remember the label name that the user entered 250 268 Label target; 251 269 Expression *computedTarget; 252 270 Type type; 253 254 BranchStmt( std::list<Label> labels, Label target, Type ) throw (SemanticError);255 BranchStmt( std::list<Label> labels, Expression *computedTarget, Type ) throw (SemanticError);256 257 Label get_originalTarget() { return originalTarget; }258 Label get_target() { return target; }259 void set_target( Label newValue ) { target = newValue; }260 261 Expression *get_computedTarget() { return computedTarget; }262 void set_target( Expression * newValue ) { computedTarget = newValue; }263 264 Type get_type() { return type; }265 const char *get_typename() { return brType[ type ]; }266 267 virtual BranchStmt *clone() const { return new BranchStmt( *this ); }268 virtual void accept( Visitor &v ) { v.visit( this ); }269 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }270 virtual void print( std::ostream &os, int indent = 0 ) const;271 private:272 static const char *brType[];273 271 }; 274 272 275 273 class ReturnStmt : public Statement { 276 274 public: 277 Expression *expr;278 279 275 ReturnStmt( std::list<Label> labels, Expression *expr ); 280 276 ReturnStmt( const ReturnStmt &other ); … … 288 284 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); } 289 285 virtual void print( std::ostream &os, int indent = 0 ) const; 286 private: 287 Expression *expr; 290 288 }; 291 289 … … 293 291 public: 294 292 enum Kind { Terminate, Resume }; 295 296 const Kind kind;297 Expression * expr;298 Expression * target;299 293 300 294 ThrowStmt( std::list<Label> labels, Kind kind, Expression * expr, Expression * target = nullptr ); … … 312 306 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); } 313 307 virtual void print( std::ostream &os, int indent = 0 ) const; 308 private: 309 Kind kind; 310 Expression * expr; 311 Expression * target; 314 312 }; 315 313 316 314 class TryStmt : public Statement { 317 315 public: 316 TryStmt( std::list<Label> labels, CompoundStmt *tryBlock, std::list<CatchStmt *> &handlers, FinallyStmt *finallyBlock = 0 ); 317 TryStmt( const TryStmt &other ); 318 virtual ~TryStmt(); 319 320 CompoundStmt *get_block() const { return block; } 321 void set_block( CompoundStmt *newValue ) { block = newValue; } 322 std::list<CatchStmt *>& get_catchers() { return handlers; } 323 324 FinallyStmt *get_finally() const { return finallyBlock; } 325 void set_finally( FinallyStmt *newValue ) { finallyBlock = newValue; } 326 327 virtual TryStmt *clone() const { return new TryStmt( *this ); } 328 virtual void accept( Visitor &v ) { v.visit( this ); } 329 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); } 330 virtual void print( std::ostream &os, int indent = 0 ) const; 331 332 private: 318 333 CompoundStmt *block; 319 334 std::list<CatchStmt *> handlers; 320 335 FinallyStmt *finallyBlock; 321 322 TryStmt( std::list<Label> labels, CompoundStmt *tryBlock, std::list<CatchStmt *> &handlers, FinallyStmt *finallyBlock = 0 );323 TryStmt( const TryStmt &other );324 virtual ~TryStmt();325 326 CompoundStmt *get_block() const { return block; }327 void set_block( CompoundStmt *newValue ) { block = newValue; }328 std::list<CatchStmt *>& get_catchers() { return handlers; }329 330 FinallyStmt *get_finally() const { return finallyBlock; }331 void set_finally( FinallyStmt *newValue ) { finallyBlock = newValue; }332 333 virtual TryStmt *clone() const { return new TryStmt( *this ); }334 virtual void accept( Visitor &v ) { v.visit( this ); }335 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }336 virtual void print( std::ostream &os, int indent = 0 ) const;337 336 }; 338 337 … … 340 339 public: 341 340 enum Kind { Terminate, Resume }; 342 343 const Kind kind;344 Declaration *decl;345 Expression *cond;346 Statement *body;347 341 348 342 CatchStmt( std::list<Label> labels, Kind kind, Declaration *decl, … … 363 357 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); } 364 358 virtual void print( std::ostream &os, int indent = 0 ) const; 359 360 private: 361 Kind kind; 362 Declaration *decl; 363 Expression *cond; 364 Statement *body; 365 365 }; 366 366 367 367 class FinallyStmt : public Statement { 368 368 public: 369 CompoundStmt *block;370 371 369 FinallyStmt( std::list<Label> labels, CompoundStmt *block ); 372 370 FinallyStmt( const FinallyStmt &other ); … … 380 378 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); } 381 379 virtual void print( std::ostream &os, int indent = 0 ) const; 380 private: 381 CompoundStmt *block; 382 382 }; 383 383 … … 386 386 class DeclStmt : public Statement { 387 387 public: 388 Declaration *decl;389 390 388 DeclStmt( std::list<Label> labels, Declaration *decl ); 391 389 DeclStmt( const DeclStmt &other ); … … 399 397 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); } 400 398 virtual void print( std::ostream &os, int indent = 0 ) const; 399 private: 400 Declaration *decl; 401 401 }; 402 402 … … 407 407 class ImplicitCtorDtorStmt : public Statement { 408 408 public: 409 // Non-owned pointer to the constructor/destructor statement410 Statement * callStmt;411 412 409 ImplicitCtorDtorStmt( Statement * callStmt ); 413 410 ImplicitCtorDtorStmt( const ImplicitCtorDtorStmt & other ); … … 421 418 virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); } 422 419 virtual void print( std::ostream &os, int indent = 0 ) const; 420 421 private: 422 // Non-owned pointer to the constructor/destructor statement 423 Statement * callStmt; 423 424 }; 424 425 -
src/SynTree/Type.cc
rcd7ef0b r275f4b4 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Wed Aug 2 11:11:00201713 // Update Count : 2 911 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Mar 17 08:42:47 2017 13 // Update Count : 28 14 14 // 15 15 … … 88 88 } 89 89 90 // Empty Variable declarations:91 const Type::FuncSpecifiers noFuncSpecifiers;92 const Type::StorageClasses noStorageClasses;93 const Type::Qualifiers noQualifiers;94 95 90 std::ostream & operator<<( std::ostream & out, const Type * type ) { 96 91 if ( type ) { -
src/SynTree/Type.h
rcd7ef0b r275f4b4 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Wed Aug 9 14:25:00201713 // Update Count : 15 211 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:53:29 2017 13 // Update Count : 151 14 14 // 15 15 … … 127 127 }; // Qualifiers 128 128 129 typedef std::list<TypeDecl *> ForallList;130 131 Qualifiers tq;132 ForallList forall;133 std::list< Attribute * > attributes;134 135 129 Type( const Qualifiers & tq, const std::list< Attribute * > & attributes ); 136 130 Type( const Type & other ); … … 151 145 void set_atomic( bool newValue ) { tq.is_atomic = newValue; } 152 146 147 typedef std::list<TypeDecl *> ForallList; 153 148 ForallList& get_forall() { return forall; } 154 149 … … 170 165 virtual Type *acceptMutator( Mutator & m ) = 0; 171 166 virtual void print( std::ostream & os, int indent = 0 ) const; 172 }; 173 174 extern const Type::FuncSpecifiers noFuncSpecifiers; 175 extern const Type::StorageClasses noStorageClasses; 176 extern const Type::Qualifiers noQualifiers; // no qualifiers on constants 167 private: 168 Qualifiers tq; 169 ForallList forall; 170 std::list< Attribute * > attributes; 171 }; 172 173 extern Type::Qualifiers noQualifiers; // no qualifiers on constants 177 174 178 175 class VoidType : public Type { … … 214 211 LongDoubleImaginary, 215 212 NUMBER_OF_BASIC_TYPES 216 } kind;213 }; 217 214 218 215 static const char *typeNames[]; // string names for basic types, MUST MATCH with Kind … … 229 226 230 227 bool isInteger() const; 228 private: 229 Kind kind; 231 230 }; 232 231 233 232 class PointerType : public Type { 234 233 public: 235 Type *base;236 237 // In C99, pointer types can be qualified in many ways e.g., int f( int a[ static 3 ] )238 Expression *dimension;239 bool isVarLen;240 bool isStatic;241 242 234 PointerType( const Type::Qualifiers & tq, Type *base, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 243 235 PointerType( const Type::Qualifiers & tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); … … 260 252 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 261 253 virtual void print( std::ostream & os, int indent = 0 ) const; 262 }; 263 264 class ArrayType : public Type { 265 public: 254 private: 266 255 Type *base; 256 257 // In C99, pointer types can be qualified in many ways e.g., int f( int a[ static 3 ] ) 267 258 Expression *dimension; 268 259 bool isVarLen; 269 260 bool isStatic; 270 261 }; 262 263 class ArrayType : public Type { 264 public: 271 265 ArrayType( const Type::Qualifiers & tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 272 266 ArrayType( const ArrayType& ); … … 288 282 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 289 283 virtual void print( std::ostream & os, int indent = 0 ) const; 284 private: 285 Type *base; 286 Expression *dimension; 287 bool isVarLen; 288 bool isStatic; 290 289 }; 291 290 292 291 class FunctionType : public Type { 293 292 public: 293 FunctionType( const Type::Qualifiers & tq, bool isVarArgs, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 294 FunctionType( const FunctionType& ); 295 virtual ~FunctionType(); 296 297 std::list<DeclarationWithType*> & get_returnVals() { return returnVals; } 298 std::list<DeclarationWithType*> & get_parameters() { return parameters; } 299 bool get_isVarArgs() const { return isVarArgs; } 300 void set_isVarArgs( bool newValue ) { isVarArgs = newValue; } 301 bool isTtype() const; 302 303 virtual FunctionType *clone() const { return new FunctionType( *this ); } 304 virtual void accept( Visitor & v ) { v.visit( this ); } 305 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 306 virtual void print( std::ostream & os, int indent = 0 ) const; 307 private: 294 308 std::list<DeclarationWithType*> returnVals; 295 309 std::list<DeclarationWithType*> parameters; … … 300 314 // - an unprototyped declaration 301 315 bool isVarArgs; 302 303 FunctionType( const Type::Qualifiers & tq, bool isVarArgs, const std::list< Attribute * > & attributes = std::list< Attribute * >() );304 FunctionType( const FunctionType& );305 virtual ~FunctionType();306 307 std::list<DeclarationWithType*> & get_returnVals() { return returnVals; }308 std::list<DeclarationWithType*> & get_parameters() { return parameters; }309 bool get_isVarArgs() const { return isVarArgs; }310 void set_isVarArgs( bool newValue ) { isVarArgs = newValue; }311 bool isTtype() const;312 313 virtual FunctionType *clone() const { return new FunctionType( *this ); }314 virtual void accept( Visitor & v ) { v.visit( this ); }315 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }316 virtual void print( std::ostream & os, int indent = 0 ) const;317 316 }; 318 317 319 318 class ReferenceToType : public Type { 320 319 public: 321 std::list< Expression* > parameters;322 std::string name;323 bool hoistType;324 325 320 ReferenceToType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes ); 326 321 ReferenceToType( const ReferenceToType & other ); … … 341 336 protected: 342 337 virtual std::string typeString() const = 0; 338 std::list< Expression* > parameters; 339 std::string name; 340 private: 341 bool hoistType; 343 342 }; 344 343 … … 346 345 typedef ReferenceToType Parent; 347 346 public: 347 StructInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ), baseStruct( 0 ) {} 348 StructInstType( const Type::Qualifiers & tq, StructDecl * baseStruct, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 349 StructInstType( const StructInstType & other ) : Parent( other ), baseStruct( other.baseStruct ) {} 350 351 StructDecl *get_baseStruct() const { return baseStruct; } 352 void set_baseStruct( StructDecl *newValue ) { baseStruct = newValue; } 353 354 /// Accesses generic parameters of base struct (NULL if none such) 355 std::list<TypeDecl*> * get_baseParameters(); 356 357 virtual bool isComplete() const; 358 359 /// Looks up the members of this struct named "name" and places them into "foundDecls". 360 /// Clones declarations into "foundDecls", caller responsible for freeing 361 void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const; 362 363 virtual StructInstType *clone() const { return new StructInstType( *this ); } 364 virtual void accept( Visitor & v ) { v.visit( this ); } 365 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 366 367 virtual void print( std::ostream & os, int indent = 0 ) const; 368 private: 369 virtual std::string typeString() const; 370 348 371 // this decl is not "owned" by the struct inst; it is merely a pointer to elsewhere in the tree, 349 372 // where the structure used in this type is actually defined 350 373 StructDecl *baseStruct; 351 352 StructInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ), baseStruct( 0 ) {} 353 StructInstType( const Type::Qualifiers & tq, StructDecl * baseStruct, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 354 StructInstType( const StructInstType & other ) : Parent( other ), baseStruct( other.baseStruct ) {} 355 356 StructDecl *get_baseStruct() const { return baseStruct; } 357 void set_baseStruct( StructDecl *newValue ) { baseStruct = newValue; } 358 359 /// Accesses generic parameters of base struct (NULL if none such) 360 std::list<TypeDecl*> * get_baseParameters(); 374 }; 375 376 class UnionInstType : public ReferenceToType { 377 typedef ReferenceToType Parent; 378 public: 379 UnionInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ), baseUnion( 0 ) {} 380 UnionInstType( const Type::Qualifiers & tq, UnionDecl * baseUnion, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 381 UnionInstType( const UnionInstType & other ) : Parent( other ), baseUnion( other.baseUnion ) {} 382 383 UnionDecl *get_baseUnion() const { return baseUnion; } 384 void set_baseUnion( UnionDecl * newValue ) { baseUnion = newValue; } 385 386 /// Accesses generic parameters of base union (NULL if none such) 387 std::list< TypeDecl * > * get_baseParameters(); 361 388 362 389 virtual bool isComplete() const; 363 390 364 /// Looks up the members of this struct named "name" and places them into "foundDecls".391 /// looks up the members of this union named "name" and places them into "foundDecls" 365 392 /// Clones declarations into "foundDecls", caller responsible for freeing 366 393 void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const; 367 394 368 virtual StructInstType *clone() const { return new StructInstType( *this ); }395 virtual UnionInstType *clone() const { return new UnionInstType( *this ); } 369 396 virtual void accept( Visitor & v ) { v.visit( this ); } 370 397 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } … … 373 400 private: 374 401 virtual std::string typeString() const; 375 }; 376 377 class UnionInstType : public ReferenceToType { 378 typedef ReferenceToType Parent; 379 public: 402 380 403 // this decl is not "owned" by the union inst; it is merely a pointer to elsewhere in the tree, 381 404 // where the union used in this type is actually defined 382 405 UnionDecl *baseUnion; 383 384 UnionInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ), baseUnion( 0 ) {}385 UnionInstType( const Type::Qualifiers & tq, UnionDecl * baseUnion, const std::list< Attribute * > & attributes = std::list< Attribute * >() );386 UnionInstType( const UnionInstType & other ) : Parent( other ), baseUnion( other.baseUnion ) {}387 388 UnionDecl *get_baseUnion() const { return baseUnion; }389 void set_baseUnion( UnionDecl * newValue ) { baseUnion = newValue; }390 391 /// Accesses generic parameters of base union (NULL if none such)392 std::list< TypeDecl * > * get_baseParameters();393 394 virtual bool isComplete() const;395 396 /// looks up the members of this union named "name" and places them into "foundDecls"397 /// Clones declarations into "foundDecls", caller responsible for freeing398 void lookup( const std::string & name, std::list< Declaration* > & foundDecls ) const;399 400 virtual UnionInstType *clone() const { return new UnionInstType( *this ); }401 virtual void accept( Visitor & v ) { v.visit( this ); }402 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }403 404 virtual void print( std::ostream & os, int indent = 0 ) const;405 private:406 virtual std::string typeString() const;407 406 }; 408 407 … … 410 409 typedef ReferenceToType Parent; 411 410 public: 411 EnumInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ) {} 412 EnumInstType( const Type::Qualifiers & tq, EnumDecl * baseEnum, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 413 EnumInstType( const EnumInstType & other ) : Parent( other ), baseEnum( other.baseEnum ) {} 414 415 EnumDecl *get_baseEnum() const { return baseEnum; } 416 void set_baseEnum( EnumDecl *newValue ) { baseEnum = newValue; } 417 418 virtual bool isComplete() const; 419 420 virtual EnumInstType *clone() const { return new EnumInstType( *this ); } 421 virtual void accept( Visitor & v ) { v.visit( this ); } 422 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 423 private: 424 virtual std::string typeString() const; 425 412 426 // this decl is not "owned" by the union inst; it is merely a pointer to elsewhere in the tree, 413 427 // where the union used in this type is actually defined 414 428 EnumDecl *baseEnum = nullptr; 415 416 EnumInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ) {}417 EnumInstType( const Type::Qualifiers & tq, EnumDecl * baseEnum, const std::list< Attribute * > & attributes = std::list< Attribute * >() );418 EnumInstType( const EnumInstType & other ) : Parent( other ), baseEnum( other.baseEnum ) {}419 420 EnumDecl *get_baseEnum() const { return baseEnum; }421 void set_baseEnum( EnumDecl *newValue ) { baseEnum = newValue; }422 423 virtual bool isComplete() const;424 425 virtual EnumInstType *clone() const { return new EnumInstType( *this ); }426 virtual void accept( Visitor & v ) { v.visit( this ); }427 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }428 private:429 virtual std::string typeString() const;430 429 }; 431 430 … … 433 432 typedef ReferenceToType Parent; 434 433 public: 434 TraitInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ) {} 435 TraitInstType( const TraitInstType & other ); 436 ~TraitInstType(); 437 438 std::list< Declaration* >& get_members() { return members; } 439 440 virtual bool isComplete() const; 441 442 virtual TraitInstType *clone() const { return new TraitInstType( *this ); } 443 virtual void accept( Visitor & v ) { v.visit( this ); } 444 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 445 private: 446 virtual std::string typeString() const; 447 435 448 // this member is filled in by the validate pass, which instantiates the members of the correponding 436 449 // aggregate with the actual type parameters specified for this use of the context 437 450 std::list< Declaration* > members; 438 439 TraitInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >() ) : Parent( tq, name, attributes ) {}440 TraitInstType( const TraitInstType & other );441 ~TraitInstType();442 443 std::list< Declaration* >& get_members() { return members; }444 445 virtual bool isComplete() const;446 447 virtual TraitInstType *clone() const { return new TraitInstType( *this ); }448 virtual void accept( Visitor & v ) { v.visit( this ); }449 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }450 private:451 virtual std::string typeString() const;452 451 }; 453 452 … … 455 454 typedef ReferenceToType Parent; 456 455 public: 456 TypeInstType( const Type::Qualifiers & tq, const std::string & name, TypeDecl *baseType, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 457 TypeInstType( const Type::Qualifiers & tq, const std::string & name, bool isFtype, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 458 TypeInstType( const TypeInstType & other ); 459 ~TypeInstType(); 460 461 TypeDecl *get_baseType() const { return baseType; } 462 void set_baseType( TypeDecl *newValue ); 463 bool get_isFtype() const { return isFtype; } 464 void set_isFtype( bool newValue ) { isFtype = newValue; } 465 466 virtual bool isComplete() const; 467 468 virtual TypeInstType *clone() const { return new TypeInstType( *this ); } 469 virtual void accept( Visitor & v ) { v.visit( this ); } 470 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 471 virtual void print( std::ostream & os, int indent = 0 ) const; 472 private: 473 virtual std::string typeString() const; 457 474 // this decl is not "owned" by the type inst; it is merely a pointer to elsewhere in the tree, 458 475 // where the type used here is actually defined 459 476 TypeDecl *baseType; 460 477 bool isFtype; 461 462 TypeInstType( const Type::Qualifiers & tq, const std::string & name, TypeDecl *baseType, const std::list< Attribute * > & attributes = std::list< Attribute * >() );463 TypeInstType( const Type::Qualifiers & tq, const std::string & name, bool isFtype, const std::list< Attribute * > & attributes = std::list< Attribute * >() );464 TypeInstType( const TypeInstType & other );465 ~TypeInstType();466 467 TypeDecl *get_baseType() const { return baseType; }468 void set_baseType( TypeDecl *newValue );469 bool get_isFtype() const { return isFtype; }470 void set_isFtype( bool newValue ) { isFtype = newValue; }471 472 virtual bool isComplete() const;473 474 virtual TypeInstType *clone() const { return new TypeInstType( *this ); }475 virtual void accept( Visitor & v ) { v.visit( this ); }476 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }477 virtual void print( std::ostream & os, int indent = 0 ) const;478 private:479 virtual std::string typeString() const;480 478 }; 481 479 482 480 class TupleType : public Type { 483 481 public: 484 std::list<Type *> types;485 std::list<Declaration *> members;486 487 482 TupleType( const Type::Qualifiers & tq, const std::list< Type * > & types, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 488 483 TupleType( const TupleType& ); … … 513 508 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 514 509 virtual void print( std::ostream & os, int indent = 0 ) const; 510 private: 511 std::list<Type *> types; 512 std::list<Declaration *> members; 515 513 }; 516 514 517 515 class TypeofType : public Type { 518 516 public: 519 Expression *expr;520 521 517 TypeofType( const Type::Qualifiers & tq, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 522 518 TypeofType( const TypeofType& ); … … 532 528 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 533 529 virtual void print( std::ostream & os, int indent = 0 ) const; 530 private: 531 Expression *expr; 534 532 }; 535 533 536 534 class AttrType : public Type { 537 535 public: 538 std::string name;539 Expression *expr;540 Type *type;541 bool isType;542 543 536 AttrType( const Type::Qualifiers & tq, const std::string & name, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); 544 537 AttrType( const Type::Qualifiers & tq, const std::string & name, Type *type, const std::list< Attribute * > & attributes = std::list< Attribute * >() ); … … 561 554 virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); } 562 555 virtual void print( std::ostream & os, int indent = 0 ) const; 556 private: 557 std::string name; 558 Expression *expr; 559 Type *type; 560 bool isType; 563 561 }; 564 562 -
src/SynTree/TypeDecl.cc
rcd7ef0b r275f4b4 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Wed Aug 9 14:35:00201713 // Update Count : 611 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 16 07:49:58 2017 13 // Update Count : 5 14 14 // 15 15 … … 18 18 #include "Common/utility.h" 19 19 20 TypeDecl::TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind, Type * init ) : Parent( name, scs, type ), init( init ), sized( kind == Any || kind == Ttype ), kind( kind) {20 TypeDecl::TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind, Type * init ) : Parent( name, scs, type ), kind( kind ), init( init ), sized( kind == Any || kind == Ttype ) { 21 21 } 22 22 23 TypeDecl::TypeDecl( const TypeDecl &other ) : Parent( other ), init( maybeClone( other.init ) ), sized( other.sized ), kind( other.kind ) {23 TypeDecl::TypeDecl( const TypeDecl &other ) : Parent( other ), kind( other.kind ), init( maybeClone( other.init ) ), sized( other.sized ) { 24 24 } 25 25 -
src/SynTree/TypeExpr.cc
rcd7ef0b r275f4b4 21 21 } 22 22 23 TypeExpr::TypeExpr( const TypeExpr &other ) : Expression( other ),type( maybeClone( other.type ) ) {23 TypeExpr::TypeExpr( const TypeExpr &other ) : type( maybeClone( other.type ) ) { 24 24 } 25 25 -
src/Tuples/TupleExpansion.cc
rcd7ef0b r275f4b4 66 66 }; 67 67 68 struct TupleTypeReplacer : public WithDeclsToAdd, public WithGuards, public WithTypeSubstitution { 69 Type * postmutate( TupleType * tupleType ); 70 71 void premutate( CompoundStmt * ) { 72 GuardScope( typeMap ); 68 class TupleTypeReplacer : public GenPoly::DeclMutator { 69 public: 70 typedef GenPoly::DeclMutator Parent; 71 using Parent::mutate; 72 73 virtual Type * mutate( TupleType * tupleType ) override; 74 75 virtual CompoundStmt * mutate( CompoundStmt * stmt ) override { 76 typeMap.beginScope(); 77 stmt = Parent::mutate( stmt ); 78 typeMap.endScope(); 79 return stmt; 73 80 } 74 81 private: … … 104 111 mutateAll( translationUnit, assnExpander ); 105 112 106 PassVisitor<TupleTypeReplacer>replacer;107 mutateAll( translationUnit, replacer);113 TupleTypeReplacer replacer; 114 replacer.mutateDeclarationList( translationUnit ); 108 115 109 116 PassVisitor<TupleIndexExpander> idxExpander; … … 211 218 } 212 219 213 Type * TupleTypeReplacer::postmutate( TupleType * tupleType ) { 220 Type * TupleTypeReplacer::mutate( TupleType * tupleType ) { 221 tupleType = safe_dynamic_cast< TupleType * > ( Parent::mutate( tupleType ) ); 214 222 unsigned tupleSize = tupleType->size(); 215 223 if ( ! typeMap.count( tupleSize ) ) { … … 218 226 decl->set_body( true ); 219 227 for ( size_t i = 0; i < tupleSize; ++i ) { 220 TypeDecl * tyParam = new TypeDecl( toString( "tuple_param_", tupleSize, "_",i ), Type::StorageClasses(), nullptr, TypeDecl::Any );228 TypeDecl * tyParam = new TypeDecl( toString( "tuple_param_", i ), Type::StorageClasses(), nullptr, TypeDecl::Any ); 221 229 decl->get_members().push_back( new ObjectDecl( toString("field_", i ), Type::StorageClasses(), LinkageSpec::C, nullptr, new TypeInstType( Type::Qualifiers(), tyParam->get_name(), tyParam ), nullptr ) ); 222 230 decl->get_parameters().push_back( tyParam ); … … 227 235 } 228 236 typeMap[tupleSize] = decl; 229 declsToAddBefore.push_back( decl );237 addDeclaration( decl ); 230 238 } 231 239 Type::Qualifiers qualifiers = tupleType->get_qualifiers(); … … 233 241 StructDecl * decl = typeMap[tupleSize]; 234 242 StructInstType * newType = new StructInstType( qualifiers, decl ); 235 for ( auto p : group_iterate( tupleType->get_types(), decl->get_parameters() ) ) { 236 Type * t = std::get<0>(p); 237 TypeDecl * td = std::get<1>(p); 243 for ( Type * t : *tupleType ) { 238 244 newType->get_parameters().push_back( new TypeExpr( t->clone() ) ); 239 if ( env ) {240 // add bindings to the type environment.241 // xxx - This may not be sufficient, it may be necessary to rename type variables on StructInstType?242 env->add( td->get_name(), t->clone() );243 }244 245 } 245 246 delete tupleType; -
src/Virtual/ExpandCasts.cc
rcd7ef0b r275f4b4 10 10 // Created On : Mon Jul 24 13:59:00 2017 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Tus Aug 2 14:59:00 201713 // Update Count : 112 // Last Modified On : Wed Jul 26 14:16:00 2017 13 // Update Count : 0 14 14 // 15 15 … … 78 78 79 79 void VirtualCastCore::premutate( FunctionDecl * functionDecl ) { 80 if ( (! vcast_decl) && 80 if ( (! vcast_decl) && functionDecl->get_statements() && 81 81 functionDecl->get_name() == "__cfa__virtual_cast" ) { 82 82 vcast_decl = functionDecl; … … 101 101 assertf( castExpr->get_result(), "Virtual Cast target not found before expansion." ); 102 102 103 assert( vcast_decl );103 //assert( vcast_decl ); 104 104 assert( pvt_decl ); 105 105 106 106 // May only cast to a pointer or reference type. 107 107 // A earlier validation should give a syntax error, this is 108 // just to make sure errors don't creep during translation. 109 // Move to helper with more detailed error messages. 108 // just to make sure errors don't creep in. 110 109 PointerType * target_type = 111 110 dynamic_cast<PointerType *>( castExpr->get_result() ); 112 assert( target_type );111 assert( target_type ); 113 112 114 113 StructInstType * target_struct = 115 114 dynamic_cast<StructInstType *>( target_type->get_base() ); 116 assert( target_struct );117 118 115 StructDecl * target_decl = target_struct->get_baseStruct(); 119 116 … … 127 124 128 125 Expression * result = new CastExpr( 129 //new ApplicationExpr( 130 //new AddressExpr( new VariableExpr( vcast_decl ) ), 131 //new CastExpr( new VariableExpr( vcast_decl ), 132 // new PointerType( noQualifiers, 133 // vcast_decl->get_type()->clone() 134 // ) 135 // ), 126 //new ApplicationExpr( new VariableExpr( vcast_decl ), { 136 127 new UntypedExpr( new NameExpr( "__cfa__virtual_cast" ), { 137 new CastExpr(138 new AddressExpr( new VariableExpr( table ) ),139 pointer_to_pvt(1)140 ),141 new CastExpr(142 castExpr->get_arg(),143 pointer_to_pvt(2)144 )145 }),146 castExpr->get_result() ->clone()128 new CastExpr( 129 new AddressExpr( new VariableExpr( table ) ), 130 pointer_to_pvt(1) 131 ), 132 new CastExpr( 133 castExpr->get_arg(), 134 pointer_to_pvt(2) 135 ) } 136 ), 137 castExpr->get_result() 147 138 ); 148 139 -
src/driver/cfa.cc
rcd7ef0b r275f4b4 10 10 // Created On : Tue Aug 20 13:44:49 2002 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jan 20 14:38:45 201713 // Update Count : 15 512 // Last Modified On : Thu Jul 20 15:54:45 2017 13 // Update Count : 156 14 14 // 15 15 … … 76 76 bool cpp_flag = false; // -E or -M flag, preprocessor only 77 77 bool std_flag = false; // -std= flag 78 bool noincstd_flag = false; // -no-include-stdhdr= flag79 78 bool debugging __attribute(( unused )) = false; // -g flag 80 79 … … 134 133 } else if ( arg == "-nohelp" ) { 135 134 help = false; // strip the nohelp flag 136 } else if ( arg == "-no-include-stdhdr" ) {137 noincstd_flag = true; // strip the no-include-stdhdr flag138 135 } else if ( arg == "-compiler" ) { 139 136 // use the user specified compiler … … 234 231 args[nargs] = "-I" CFA_INCDIR; 235 232 nargs += 1; 236 if ( ! noincstd_flag ) { // do not use during build 237 args[nargs] = "-I" CFA_INCDIR "/stdhdr"; 238 nargs += 1; 239 } // if 233 args[nargs] = "-I" CFA_INCDIR "/stdhdr"; 234 nargs += 1; 240 235 args[nargs] = "-I" CFA_INCDIR "/concurrency"; 241 236 nargs += 1; -
src/libcfa/Makefile.am
rcd7ef0b r275f4b4 39 39 40 40 AM_CCASFLAGS = @CFA_FLAGS@ 41 42 #CFLAGS for most libcfa src 43 #use -no-include-stdhdr to prevent rebuild cycles 44 #The built sources must not depend on the installed headers 45 CFLAGS = -quiet -no-include-stdhdr -I${abs_top_srcdir}/src/libcfa/stdhdr -XCFA -t -B${abs_top_srcdir}/src/driver ${EXTRA_FLAGS} 41 CFLAGS = -quiet -I${abs_top_srcdir}/src/libcfa/stdhdr -XCFA -t -B${abs_top_srcdir}/src/driver ${EXTRA_FLAGS} 46 42 CC = ${abs_top_srcdir}/src/driver/cfa 47 43 -
src/libcfa/Makefile.in
rcd7ef0b r275f4b4 308 308 CFA_NAME = @CFA_NAME@ 309 309 CFA_PREFIX = @CFA_PREFIX@ 310 311 #CFLAGS for most libcfa src 312 #use -no-include-stdhdr to prevent rebuild cycles 313 #The built sources must not depend on the installed headers 314 CFLAGS = -quiet -no-include-stdhdr -I${abs_top_srcdir}/src/libcfa/stdhdr -XCFA -t -B${abs_top_srcdir}/src/driver ${EXTRA_FLAGS} 310 CFLAGS = -quiet -I${abs_top_srcdir}/src/libcfa/stdhdr -XCFA -t -B${abs_top_srcdir}/src/driver ${EXTRA_FLAGS} 315 311 CPP = @CPP@ 316 312 CPPFLAGS = @CPPFLAGS@ -
src/libcfa/concurrency/monitor.c
rcd7ef0b r275f4b4 10 10 // Created On : Thd Feb 23 12:27:26 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jul 31 14:59:05201713 // Update Count : 312 // Last Modified On : Fri Jul 21 22:37:11 2017 13 // Update Count : 1 14 14 // 15 15 … … 484 484 if( !this->monitors ) { 485 485 // LIB_DEBUG_PRINT_SAFE("Branding\n"); 486 assertf( thrd->current_monitors != NULL, "No current monitor to brand condition %p", thrd->current_monitors );486 assertf( thrd->current_monitors != NULL, "No current monitor to brand condition", thrd->current_monitors ); 487 487 this->monitor_count = thrd->current_monitor_count; 488 488 -
src/libcfa/exception.c
rcd7ef0b r275f4b4 9 9 // Author : Andrew Beach 10 10 // Created On : Mon Jun 26 15:13:00 2017 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Aug 4 15:20:00 2017 13 // Update Count : 6 14 // 15 16 #include <stddef.h> // for size_t 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jul 26 10:37:51 2017 13 // Update Count : 2 14 // 17 15 18 16 #include "exception.h" … … 34 32 #include "lsda.h" 35 33 36 37 // Base exception vtable is abstract, you should not have base exceptions.38 struct __cfaehm__base_exception_t_vtable39 ___cfaehm__base_exception_t_vtable_instance = {40 .parent = NULL,41 .size = 0,42 .copy = NULL,43 .free = NULL,44 .msg = NULL45 };46 47 48 34 // Temperary global exception context. Does not work with concurency. 49 struct exception_context_t {35 struct shared_stack_t { 50 36 struct __cfaehm__try_resume_node * top_resume; 51 37 struct __cfaehm__try_resume_node * current_resume; 52 38 53 exception *current_exception;39 exception current_exception; 54 40 int current_handler_index; 55 41 } shared_stack = {NULL, NULL, 0, 0}; 56 42 57 // Get the current exception context.58 // There can be a single global until multithreading occurs, then each stack59 // needs its own. It will have to be updated to handle that.60 struct exception_context_t * this_exception_context() {61 return &shared_stack;62 }63 //#define SAVE_EXCEPTION_CONTEXT(to_name)64 //struct exception_context_t * to_name = this_exception_context();65 //exception * this_exception() {66 // return this_exception_context()->current_exception;67 //}68 43 69 44 … … 80 55 81 56 // DEBUG 82 printf("Throwing resumption exception \n");57 printf("Throwing resumption exception %d\n", *except); 83 58 84 59 struct __cfaehm__try_resume_node * original_head = shared_stack.current_resume; … … 94 69 } 95 70 96 printf("Unhandled exception \n");71 printf("Unhandled exception %d\n", *except); 97 72 shared_stack.current_resume = original_head; 98 73 … … 119 94 // TERMINATION =============================================================== 120 95 121 // MEMORY MANAGEMENT (still for integers) 122 // May have to move to cfa for constructors and destructors (references). 123 124 struct __cfaehm__node { 125 struct __cfaehm__node * next; 126 }; 127 128 #define NODE_TO_EXCEPT(node) ((exception *)(1 + (node))) 129 #define EXCEPT_TO_NODE(except) ((struct __cfaehm__node *)(except) - 1) 130 131 // Creates a copy of the indicated exception and sets current_exception to it. 132 static void __cfaehm__allocate_exception( exception * except ) { 133 struct exception_context_t * context = this_exception_context(); 134 135 // Allocate memory for the exception. 136 struct __cfaehm__node * store = malloc( 137 sizeof( struct __cfaehm__node ) + except->virtual_table->size ); 138 139 if ( ! store ) { 140 // Failure: cannot allocate exception. Terminate thread. 141 abort(); // <- Although I think it might be the process. 142 } 143 144 // Add the node to the list: 145 store->next = EXCEPT_TO_NODE(context->current_exception); 146 context->current_exception = NODE_TO_EXCEPT(store); 147 148 // Copy the exception to storage. 149 except->virtual_table->copy( context->current_exception, except ); 150 } 151 152 // Delete the provided exception, unsetting current_exception if relivant. 153 static void __cfaehm__delete_exception( exception * except ) { 154 struct exception_context_t * context = this_exception_context(); 155 156 // DEBUG 157 printf( "Deleting Exception\n"); 158 159 // Remove the exception from the list. 160 struct __cfaehm__node * to_free = EXCEPT_TO_NODE(except); 161 struct __cfaehm__node * node; 162 163 if ( context->current_exception == except ) { 164 node = to_free->next; 165 context->current_exception = (node) ? NODE_TO_EXCEPT(node) : 0; 166 } else { 167 node = EXCEPT_TO_NODE(context->current_exception); 168 // It may always be in the first or second position. 169 while( to_free != node->next ) { 170 node = node->next; 171 } 172 node->next = to_free->next; 173 } 174 175 // Free the old exception node. 176 except->virtual_table->free( except ); 177 free( to_free ); 178 } 179 180 // If this isn't a rethrow (*except==0), delete the provided exception. 181 void __cfaehm__cleanup_terminate( void * except ) { 182 if ( *(void**)except ) __cfaehm__delete_exception( *(exception**)except ); 183 } 184 96 // Requires -fexceptions to work. 97 98 // Global which defines the current exception. Currently an int just to make matching easier. 99 //int this_exception; (became shared_stack.current_exception) 185 100 186 101 // We need a piece of storage to raise the exception … … 202 117 } 203 118 204 // The exception that is being thrown must already be stored. 205 __attribute__((noreturn)) void __cfaehm__begin_unwind(void) { 206 if ( ! this_exception_context()->current_exception ) { 207 printf("UNWIND ERROR missing exception in begin unwind\n"); 208 abort(); 209 } 210 119 void __cfaehm__throw_terminate( exception * val ) { 120 // Store the current exception 121 shared_stack.current_exception = *val; 122 123 // DEBUG 124 printf("Throwing termination exception %d\n", *val); 211 125 212 126 // Call stdlibc to raise the exception … … 234 148 } 235 149 236 void __cfaehm__throw_terminate( exception * val ) { 237 // DEBUG 238 printf("Throwing termination exception\n"); 239 240 __cfaehm__allocate_exception( val ); 241 __cfaehm__begin_unwind(); 242 } 243 150 // Nesting this the other way would probably be faster. 244 151 void __cfaehm__rethrow_terminate(void) { 245 152 // DEBUG 246 153 printf("Rethrowing termination exception\n"); 247 154 248 __cfaehm__ begin_unwind();155 __cfaehm__throw_terminate(&shared_stack.current_exception); 249 156 } 250 157 … … 356 263 _Unwind_Reason_Code (*matcher)(exception *) = 357 264 MATCHER_FROM_CONTEXT(context); 358 int index = matcher( shared_stack.current_exception);265 int index = matcher(&shared_stack.current_exception); 359 266 _Unwind_Reason_Code ret = (0 == index) 360 267 ? _URC_CONTINUE_UNWIND : _URC_HANDLER_FOUND; … … 452 359 // Exception handler 453 360 catch_block( shared_stack.current_handler_index, 454 shared_stack.current_exception );361 &shared_stack.current_exception ); 455 362 } 456 363 -
src/libcfa/exception.h
rcd7ef0b r275f4b4 9 9 // Author : Andrew Beach 10 10 // Created On : Mon Jun 26 15:11:00 2017 11 // Last Modified By : Andrew Beach12 // Last Modified On : Fri Aug 4 15:20:00201713 // Update Count : 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:57:02 2017 13 // Update Count : 3 14 14 // 15 15 16 16 #pragma once 17 17 18 // Later to be a special structure type. 19 typedef int exception; 18 20 19 21 #ifdef __CFORALL__ 20 22 extern "C" { 21 23 #endif 22 23 struct __cfaehm__base_exception_t;24 typedef struct __cfaehm__base_exception_t exception;25 struct __cfaehm__base_exception_t_vtable {26 const struct __cfaehm__base_exception_t_vtable * parent;27 size_t size;28 void (*copy)(struct __cfaehm__base_exception_t *this,29 struct __cfaehm__base_exception_t * other);30 void (*free)(struct __cfaehm__base_exception_t *this);31 const char (*msg)(struct __cfaehm__base_exception_t *this);32 };33 struct __cfaehm__base_exception_t {34 struct __cfaehm__base_exception_t_vtable const * virtual_table;35 };36 extern struct __cfaehm__base_exception_t_vtable37 ___cfaehm__base_exception_t_vtable_instance;38 39 24 40 25 // Used in throw statement translation. … … 49 34 int (*match_block)(exception * except)); 50 35 51 // Clean-up the exception in catch blocks.52 void __cfaehm__cleanup_terminate(void * except);53 54 36 // Data structure creates a list of resume handlers. 55 37 struct __cfaehm__try_resume_node { … … 58 40 }; 59 41 60 // These act as constructor and destructor for the resume node.61 42 void __cfaehm__try_resume_setup( 62 43 struct __cfaehm__try_resume_node * node, … … 66 47 67 48 // Check for a standard way to call fake deconstructors. 68 struct __cfaehm__cleanup_hook {}; 49 struct __cfaehm__cleanup_hook { 50 }; 69 51 70 52 #ifdef __CFORALL__ -
src/libcfa/iostream
rcd7ef0b r275f4b4 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Aug 9 16:42:47201713 // Update Count : 1 3112 // Last Modified On : Fri Jul 7 08:35:59 2017 13 // Update Count : 118 14 14 // 15 15 … … 46 46 }; // ostream 47 47 48 // trait writeable( otype T ) { 49 // forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, T ); 50 // }; // writeable 51 52 trait writeable( otype T, dtype ostype | ostream( ostype ) ) { 53 ostype * ?|?( ostype *, T ); 48 trait writeable( otype T ) { 49 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, T ); 54 50 }; // writeable 55 51 … … 81 77 82 78 // tuples 83 forall( dtype ostype, otype T, ttype Params | writeable( T, ostype ) | { ostype * ?|?( ostype *, Params ); } ) 84 ostype * ?|?( ostype * os, T arg, Params rest ); 79 forall( dtype ostype, otype T, ttype Params | ostream( ostype ) | writeable( T ) | { ostype * ?|?( ostype *, Params ); } ) ostype * ?|?( ostype * os, T arg, Params rest ); 85 80 86 81 // manipulators … … 95 90 96 91 // writes the range [begin, end) to the given stream 97 forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) )98 void write( iterator_type begin, iterator_type end, os type *os );92 forall( otype elt_type | writeable( elt_type ), otype iterator_type | iterator( iterator_type, elt_type ), dtype os_type | ostream( os_type ) ) 93 void write( iterator_type begin, iterator_type end, os_type *os ); 99 94 100 forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) )101 void write_reverse( iterator_type begin, iterator_type end, os type *os );95 forall( otype elt_type | writeable( elt_type ), otype iterator_type | iterator( iterator_type, elt_type ), dtype os_type | ostream( os_type ) ) 96 void write_reverse( iterator_type begin, iterator_type end, os_type *os ); 102 97 103 98 //--------------------------------------- -
src/libcfa/iostream.c
rcd7ef0b r275f4b4 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Aug 9 16:46:51201713 // Update Count : 40112 // Last Modified On : Sun Jul 16 21:12:03 2017 13 // Update Count : 398 14 14 // 15 15 … … 193 193 194 194 // tuples 195 forall( dtype ostype, otype T, ttype Params | writeable( T, ostype) | { ostype * ?|?( ostype *, Params ); } )195 forall( dtype ostype, otype T, ttype Params | ostream( ostype ) | writeable( T ) | { ostype * ?|?( ostype *, Params ); } ) 196 196 ostype * ?|?( ostype * os, T arg, Params rest ) { 197 197 os | arg; // print first argument … … 256 256 //--------------------------------------- 257 257 258 forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) )259 void write( iterator _type begin, iterator_type end, ostype * os ) {260 void print( elt _type i ) { os | i; }258 forall( otype elttype | writeable( elttype ), otype iteratortype | iterator( iteratortype, elttype ), dtype ostype | ostream( ostype ) ) 259 void write( iteratortype begin, iteratortype end, ostype * os ) { 260 void print( elttype i ) { os | i; } 261 261 for_each( begin, end, print ); 262 262 } // ?|? 263 263 264 forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) )265 void write_reverse( iterator _type begin, iterator_type end, ostype * os ) {266 void print( elt _type i ) { os | i; }264 forall( otype elttype | writeable( elttype ), otype iteratortype | iterator( iteratortype, elttype ), dtype ostype | ostream( ostype ) ) 265 void write_reverse( iteratortype begin, iteratortype end, ostype * os ) { 266 void print( elttype i ) { os | i; } 267 267 for_each_reverse( begin, end, print ); 268 268 } // ?|? -
src/libcfa/math
rcd7ef0b r275f4b4 10 10 // Created On : Mon Apr 18 23:37:04 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Aug 7 07:51:15201713 // Update Count : 10 812 // Last Modified On : Fri Jul 21 17:03:13 2017 13 // Update Count : 101 14 14 // 15 15 … … 18 18 #include <math.h> 19 19 #include <complex.h> 20 21 //---------------------- General ----------------------22 20 23 21 static inline float ?%?( float x, float y ) { return fmodf( x, y ); } … … 39 37 static inline [ int, long double ] remquo( long double x, long double y ) { int quo; x = remquol( x, y, &quo ); return [ quo, x ]; } 40 38 41 static inline [ float, float ] div( float x, float y ) { y = modff( x / y, &x ); return [ x, y ]; } 42 static inline [ double, double ] div( double x, double y ) { y = modf( x / y, &x ); return [ x, y ]; } 43 static inline [ long double, long double ] div( long double x, long double y ) { y = modfl( x / y, &x ); return [ x, y ]; } 39 // alternative name for remquo 40 static inline float div( float x, float y, int * quo ) { return remquof( x, y, quo ); } 41 static inline double div( double x, double y, int * quo ) { return remquo( x, y, quo ); } 42 static inline long double div( long double x, long double y, int * quo ) { return remquol( x, y, quo ); } 43 static inline [ int, float ] div( float x, float y ) { int quo; x = remquof( x, y, &quo ); return [ quo, x ]; } 44 static inline [ int, double ] div( double x, double y ) { int quo; x = remquo( x, y, &quo ); return [ quo, x ]; } 45 static inline [ int, long double ] div( long double x, long double y ) { int quo; x = remquol( x, y, &quo ); return [ quo, x ]; } 44 46 45 47 static inline float fma( float x, float y, float z ) { return fmaf( x, y, z ); } -
src/libcfa/stdhdr/assert.h
rcd7ef0b r275f4b4 10 10 // Created On : Mon Jul 4 23:25:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jul 31 23:09:32201713 // Update Count : 1 312 // Last Modified On : Thu Jul 20 21:06:48 2017 13 // Update Count : 11 14 14 // 15 15 … … 25 25 #define __STRINGIFY__(str) #str 26 26 #define __VSTRINGIFY__(str) __STRINGIFY__(str) 27 #define assertf( expr, fmt, ... ) ((expr) ? ((void)0) : __assert_fail_f(__VSTRINGIFY__(expr), __FILE__, __LINE__, __PRETTY_FUNCTION__, fmt, ## __VA_ARGS__ )) 28 29 void __assert_fail_f( const char *assertion, const char *file, unsigned int line, const char *function, const char *fmt, ... ) __attribute__((noreturn, format( printf, 5, 6) )); 27 #define assertf(expr, fmt, ...) ((expr) ? ((void)0) : __assert_fail_f(__VSTRINGIFY__(expr), __FILE__, __LINE__, __PRETTY_FUNCTION__, fmt, ## __VA_ARGS__ )) 28 void __assert_fail_f( const char *assertion, const char *file, unsigned int line, const char *function, const char *fmt, ... ) __attribute__((noreturn)); 30 29 #endif 31 30 -
src/libcfa/stdlib
rcd7ef0b r275f4b4 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Aug 7 11:19:07 201713 // Update Count : 22 312 // Last Modified On : Thu Jul 20 14:32:37 2017 13 // Update Count : 220 14 14 // 15 15 … … 183 183 //--------------------------------------- 184 184 185 [ int, int ] div( int num, int denom );186 [ long int, long int ] div( long int num, long int denom );187 [ long long int, long long int ] div( long long int num, long long int denom );188 185 forall( otype T | { T ?/?( T, T ); T ?%?( T, T ); } ) 189 [ T, T ] div( T num, T demon);186 [ T, T ] div( T t1, T t2 ); 190 187 191 188 //--------------------------------------- -
src/libcfa/stdlib.c
rcd7ef0b r275f4b4 10 10 // Created On : Thu Jan 28 17:10:29 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue Aug 8 17:31:13201713 // Update Count : 2 9112 // Last Modified On : Thu Jul 20 16:01:40 2017 13 // Update Count : 282 14 14 // 15 15 … … 255 255 //--------------------------------------- 256 256 257 [ int, int ] div( int num, int denom ) { div_t qr = div( num, denom ); return [ qr.quot, qr.rem ]; }258 [ long int, long int ] div( long int num, long int denom ) { ldiv_t qr = ldiv( num, denom ); return [ qr.quot, qr.rem ]; }259 [ long long int, long long int ] div( long long int num, long long int denom ) { lldiv_t qr = lldiv( num, denom ); return [ qr.quot, qr.rem ]; }260 257 forall( otype T | { T ?/?( T, T ); T ?%?( T, T ); } ) 261 [ T, T ] div( T num, T denom ) { return [ num / denom, num % denom]; }258 [ T, T ] div( T t1, T t2 ) { return [ t1 / t2, t1 % t2 ]; } 262 259 263 260 //--------------------------------------- -
src/tests/.expect/32/math.txt
rcd7ef0b r275f4b4 2 2 remainder:-1 -1 -1 3 3 remquo:7 0.0999999 7 0.1 7 0.0999999999999999999 4 div:7 , 0.2 7, 0.2 7, 0.24 div:7 0.0999999 7 0.1 7 0.0999999999999999999 5 5 fma:-2 -2 -2 6 6 fdim:2 2 2 … … 55 55 frexp:0.5 3 0.5 3 0.5 3 56 56 ldexp:8 8 8 57 modf:2 0.3 2 0.3 2 0.3 58 modf:2, 0.3 2, 0.3 2, 0.3 59 nextafter:2 2 2 57 modf:2 0.3 2 0.3 2 0.3 nextafter:2 2 2 60 58 nexttoward:2 2 2 61 59 scalbn:16 16 16 -
src/tests/.expect/64/math.txt
rcd7ef0b r275f4b4 2 2 remainder:-1 -1 -1 3 3 remquo:7 0.0999999 7 0.1 7 0.0999999999999999999 4 div:7 , 0.2 7, 0.2 7, 0.24 div:7 0.0999999 7 0.1 7 0.0999999999999999999 5 5 fma:-2 -2 -2 6 6 fdim:2 2 2 … … 55 55 frexp:0.5 3 0.5 3 0.5 3 56 56 ldexp:8 8 8 57 modf:2 0.3 2 0.3 2 0.3 58 modf:2, 0.3 2, 0.3 2, 0.3 59 nextafter:2 2 2 57 modf:2 0.3 2 0.3 2 0.3 nextafter:2 2 2 60 58 nexttoward:2 2 2 61 59 scalbn:16 16 16 -
src/tests/designations.c
rcd7ef0b r275f4b4 9 9 // Author : Rob Schluntz 10 10 // Created On : Thu Jun 29 15:26:36 2017 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Thu Ju l 27 11:46:35 201713 // Update Count : 311 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Jun 29 15:27:05 2017 13 // Update Count : 2 14 14 // 15 15 … … 89 89 }; 90 90 91 struct Fred {92 double i[3];93 int j;94 struct Mary {95 struct Jane {96 double j;97 } j;98 double i;99 } m;100 };101 struct Fred s1 @= { .m.j : 3 };102 struct Fred s2 @= { .i : { [2] : 2 } };103 104 91 int main() { 105 92 // simple designation case - starting from beginning of structure, leaves ptr default-initialized (zero) … … 212 199 }; 213 200 #endif 214 // array designation 215 int i[2] = { [1] : 3 }; 201 216 202 // allowed to have 'too many' initialized lists - essentially they are ignored. 217 203 int i1 = { 3 }; … … 254 240 const char * str0 = "hello"; 255 241 char str1[] = "hello"; 256 const char c1[] = "abc";257 const char c2[] = { 'a', 'b', 'c' };258 const char c3[][2] = { { 'a', 'b' }, { 'c', 'd'}, { 'c', 'd'} };259 242 } 260 243 -
src/tests/except-0.c
rcd7ef0b r275f4b4 6 6 #include <stdbool.h> 7 7 8 // Local type to mark exits from scopes. (see ERROR)9 8 struct signal_exit { 10 9 const char * area; … … 20 19 } 21 20 22 23 // Local Exception Types and manual vtable types. 24 //#define TRIVIAL_EXCEPTION(name) //TRIVAL_EXCEPTION(yin) 25 struct yin; 26 struct yin_vtable { 27 struct exception_t_vtable const * parent; 28 size_t size; 29 void (*copy)(yin *this, yin * other); 30 void (*free)(yin *this); 31 const char (*msg)(yin *this); 32 }; 33 struct yin { 34 struct yin_vtable const * parent; 35 }; 36 void yin_msg(yin) { 37 return "in"; 38 } 39 yin_vtable _yin_vtable_instance = { 40 &_exception_t_vtable_instance, sizeof(yin), ?{}, ^?{}, yin_msg 41 } 42 43 44 void terminate(exception * except_value) { 21 void terminate(int except_value) { 45 22 signal_exit a = {"terminate function"}; 46 23 throw except_value; … … 48 25 } 49 26 50 void resume( exception *except_value) {27 void resume(int except_value) { 51 28 signal_exit a = {"resume function"}; 52 29 throwResume except_value; -
src/tests/math.c
rcd7ef0b r275f4b4 10 10 // Created On : Fri Apr 22 14:59:21 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Aug 9 07:20:49201713 // Update Count : 7 712 // Last Modified On : Fri Jul 21 10:32:04 2017 13 // Update Count : 73 14 14 // 15 15 … … 31 31 l = remquo( 3.6L, 0.5L, " ); 32 32 sout | quot | l | endl; 33 sout | "div:" | div( 3.6F, 0.5F ) | div( 3.6D, 0.5D ) | div( 3.6L, 0.5L ) | endl; 33 f = div( 3.6F, 0.5F, " ); 34 sout | "div:" | quot | f; 35 d = div( 3.6D, 0.5F, " ); 36 sout | quot | d; 37 l = div( 3.6L, 0.5L, " ); 38 sout | quot | l | endl; 34 39 sout | "fma:" | fma( 3.0F, -1.0F, 1.0F ) | fma( 3.0D, -1.0D, 1.0D ) | fma( 3.0L, -1.0L, , 1.0L ) | endl; 35 40 sout | "fdim:" | fdim( 1.0F, -1.0F ) | fdim( 1.0D, -1.0D ) | fdim( 1.0L, -1.0L ) | endl; … … 132 137 sout | di | d; 133 138 l = modf( 2.3L, &ldi ); 134 sout | ldi | l | endl; 135 sout | "modf:" | modf( 2.3F ) | modf( 2.3D ) | modf( 2.3L ) | endl; 139 sout | ldi | l; 136 140 sout | "nextafter:" | nextafter( 2.0F, 3.0F ) | nextafter( 2.0D, 3.0D ) | nextafter( 2.0L, 3.0L ) | endl; 137 141 sout | "nexttoward:" | nexttoward( 2.0F, 3.0F ) | nexttoward( 2.0D, 3.0D ) | nexttoward( 2.0L, 3.0L ) | endl;
Note:
See TracChangeset
for help on using the changeset viewer.