Changes in / [fd344aa:9236060]


Ignore:
Files:
19 added
7 deleted
232 edited

Legend:

Unmodified
Added
Removed
  • .gitignore

    rfd344aa r9236060  
    2424lib
    2525include
     26share
    2627
    2728# src executables, for lib and bin
  • Makefile.am

    rfd344aa r9236060  
    2121
    2222MAINTAINERCLEANFILES = lib/* bin/* src/examples/.deps/* src/tests/.deps/* src/tests/.out/*
     23
     24man1_MANS = doc/man/cfa.1
  • Makefile.in

    rfd344aa r9236060  
    131131    *) (install-info --version) >/dev/null 2>&1;; \
    132132  esac
     133am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
     134am__vpath_adj = case $$p in \
     135    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     136    *) f=$$p;; \
     137  esac;
     138am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
     139am__install_max = 40
     140am__nobase_strip_setup = \
     141  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
     142am__nobase_strip = \
     143  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
     144am__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] }'
     151am__base_list = \
     152  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
     153  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
     154am__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  }
     160man1dir = $(mandir)/man1
     161am__installdirs = "$(DESTDIR)$(man1dir)"
     162NROFF = nroff
     163MANS = $(man1_MANS)
    133164RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
    134165  distclean-recursive maintainer-clean-recursive
     
    335366EXTRA_DIST = Docs                       # non-source files
    336367MAINTAINERCLEANFILES = lib/* bin/* src/examples/.deps/* src/tests/.deps/* src/tests/.out/*
     368man1_MANS = doc/man/cfa.1
    337369all: config.h
    338370        $(MAKE) $(AM_MAKEFLAGS) all-recursive
     
    387419distclean-hdr:
    388420        -rm -f config.h stamp-h1
     421install-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
     455uninstall-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)
    389462
    390463# This directory's subdirectories are mostly independent; you can cd
     
    684757check-am: all-am
    685758check: check-recursive
    686 all-am: Makefile config.h
     759all-am: Makefile $(MANS) config.h
    687760installdirs: installdirs-recursive
    688761installdirs-am:
     762        for dir in "$(DESTDIR)$(man1dir)"; do \
     763          test -z "$$dir" || $(MKDIR_P) "$$dir"; \
     764        done
    689765install: install-recursive
    690766install-exec: install-exec-recursive
     
    739815info-am:
    740816
    741 install-data-am:
     817install-data-am: install-man
    742818
    743819install-dvi: install-dvi-recursive
     
    755831install-info-am:
    756832
    757 install-man:
     833install-man: install-man1
    758834
    759835install-pdf: install-pdf-recursive
     
    785861ps-am:
    786862
    787 uninstall-am:
     863uninstall-am: uninstall-man
     864
     865uninstall-man: uninstall-man1
    788866
    789867.MAKE: $(am__recursive_targets) all install-am install-strip
     
    798876        install-data install-data-am install-dvi install-dvi-am \
    799877        install-exec install-exec-am install-html install-html-am \
    800         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
     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-man1
    806884
    807885.PRECIOUS: Makefile
  • automake/compile

    rfd344aa r9236060  
    22# Wrapper for compilers which do not understand '-c -o'.
    33
    4 scriptversion=2012-01-04.17; # UTC
    5 
    6 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free
    7 # Software Foundation, Inc.
     4scriptversion=2012-10-14.11; # UTC
     5
     6# Copyright (C) 1999-2014 Free Software Foundation, Inc.
    87# Written by Tom Tromey <tromey@cygnus.com>.
    98#
     
    7877      ;;
    7978  esac
     79}
     80
     81# func_cl_dashL linkdir
     82# Make cl look for libraries in LINKDIR
     83func_cl_dashL ()
     84{
     85  func_file_conv "$1"
     86  if test -z "$lib_path"; then
     87    lib_path=$file
     88  else
     89    lib_path="$lib_path;$file"
     90  fi
     91  linker_opts="$linker_opts -LIBPATH:$file"
     92}
     93
     94# func_cl_dashl library
     95# Do a library search-path lookup for cl
     96func_cl_dashl ()
     97{
     98  lib=$1
     99  found=no
     100  save_IFS=$IFS
     101  IFS=';'
     102  for dir in $lib_path $LIB
     103  do
     104    IFS=$save_IFS
     105    if $shared && test -f "$dir/$lib.dll.lib"; then
     106      found=yes
     107      lib=$dir/$lib.dll.lib
     108      break
     109    fi
     110    if test -f "$dir/$lib.lib"; then
     111      found=yes
     112      lib=$dir/$lib.lib
     113      break
     114    fi
     115    if test -f "$dir/lib$lib.a"; then
     116      found=yes
     117      lib=$dir/lib$lib.a
     118      break
     119    fi
     120  done
     121  IFS=$save_IFS
     122
     123  if test "$found" != yes; then
     124    lib=$lib.lib
     125  fi
    80126}
    81127
     
    110156          esac
    111157          ;;
     158        -I)
     159          eat=1
     160          func_file_conv "$2" mingw
     161          set x "$@" -I"$file"
     162          shift
     163          ;;
    112164        -I*)
    113165          func_file_conv "${1#-I}" mingw
     
    115167          shift
    116168          ;;
     169        -l)
     170          eat=1
     171          func_cl_dashl "$2"
     172          set x "$@" "$lib"
     173          shift
     174          ;;
    117175        -l*)
    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
     176          func_cl_dashl "${1#-l}"
     177          set x "$@" "$lib"
     178          shift
     179          ;;
     180        -L)
     181          eat=1
     182          func_cl_dashL "$2"
    140183          ;;
    141184        -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"
     185          func_cl_dashL "${1#-L}"
    149186          ;;
    150187        -static)
  • automake/config.guess

    • Property mode changed from 120000 to 100755
    rfd344aa r9236060  
    1 /usr/share/automake-1.15/config.guess
     1#! /bin/sh
     2# Attempt to guess a canonical system name.
     3#   Copyright 1992-2015 Free Software Foundation, Inc.
     4
     5timestamp='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
     35me=`echo "$0" | sed -e 's,.*/,,'`
     36
     37usage="\
     38Usage: $0 [OPTION]
     39
     40Output the configuration name of the system \`$me' is run on.
     41
     42Operation 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
     47Report bugs and patches to <config-patches@gnu.org>."
     48
     49version="\
     50GNU config.guess ($timestamp)
     51
     52Originally written by Per Bothner.
     53Copyright 1992-2015 Free Software Foundation, Inc.
     54
     55This is free software; see the source for copying conditions.  There is NO
     56warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
     57
     58help="
     59Try \`$me --help' for more information."
     60
     61# Parse command line
     62while 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
     80done
     81
     82if test $# != 0; then
     83  echo "$me: too many arguments$help" >&2
     84  exit 1
     85fi
     86
     87trap '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
     99set_cc_for_build='
     100trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
     101trap "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 ; } ;
     107dummy=$tmp/dummy ;
     108tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
     109case $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 ;;
     122esac ; 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)
     126if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
     127        PATH=$PATH:/.attbin ; export PATH
     128fi
     129
     130UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
     131UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
     132UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
     133UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
     134
     135case "${UNAME_SYSTEM}" in
     136Linux|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        ;;
     154esac
     155
     156# Note: order is significant - the case branches are not exclusive.
     157
     158case "${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        }
     492EOF
     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                        }
     579EOF
     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                }
     682EOF
     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        }
     740EOF
     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
     989EOF
     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 ;;
     1393esac
     1394
     1395cat >&2 <<EOF
     1396$0: unable to guess system type
     1397
     1398This script, last modified $timestamp, has failed to recognize
     1399the operating system you are using. It is advised that you
     1400download 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
     1403and
     1404  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
     1405
     1406If the version you run ($0) is already up to date, please
     1407send the following data and any information you think might be
     1408pertinent to <config-patches@gnu.org> in order to provide the needed
     1409information to handle your system.
     1410
     1411config.guess timestamp = $timestamp
     1412
     1413uname -m = `(uname -m) 2>/dev/null || echo unknown`
     1414uname -r = `(uname -r) 2>/dev/null || echo unknown`
     1415uname -s = `(uname -s) 2>/dev/null || echo unknown`
     1416uname -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
     1421hostinfo               = `(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
     1428UNAME_MACHINE = ${UNAME_MACHINE}
     1429UNAME_RELEASE = ${UNAME_RELEASE}
     1430UNAME_SYSTEM  = ${UNAME_SYSTEM}
     1431UNAME_VERSION = ${UNAME_VERSION}
     1432EOF
     1433
     1434exit 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:
  • automake/config.sub

    • Property mode changed from 120000 to 100755
    rfd344aa r9236060  
    1 /usr/share/automake-1.15/config.sub
     1#! /bin/sh
     2# Configuration validation subroutine script.
     3#   Copyright 1992-2015 Free Software Foundation, Inc.
     4
     5timestamp='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
     53me=`echo "$0" | sed -e 's,.*/,,'`
     54
     55usage="\
     56Usage: $0 [OPTION] CPU-MFR-OPSYS
     57       $0 [OPTION] ALIAS
     58
     59Canonicalize a configuration name.
     60
     61Operation 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
     66Report bugs and patches to <config-patches@gnu.org>."
     67
     68version="\
     69GNU config.sub ($timestamp)
     70
     71Copyright 1992-2015 Free Software Foundation, Inc.
     72
     73This is free software; see the source for copying conditions.  There is NO
     74warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
     75
     76help="
     77Try \`$me --help' for more information."
     78
     79# Parse command line
     80while 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
     104done
     105
     106case $# 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;;
     112esac
     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.
     116maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
     117case $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    ;;
     136esac
     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.
     142case $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                ;;
     243esac
     244
     245# Decode aliases for certain CPU-COMPANY combinations.
     246case $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                ;;
     1333esac
     1334
     1335# Here we canonicalize certain aliases for manufacturers.
     1336case $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                ;;
     1345esac
     1346
     1347# Decode manufacturer-specific aliases for certain operating systems.
     1348
     1349if [ x"$os" != x"" ]
     1350then
     1351case $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                ;;
     1542esac
     1543else
     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
     1555case $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                ;;
     1728esac
     1729fi
     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.
     1733vendor=unknown
     1734case $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                ;;
     1803esac
     1804
     1805echo $basic_machine$os
     1806exit
     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:
  • automake/depcomp

    rfd344aa r9236060  
    22# depcomp - compile a program generating dependencies as side-effects
    33
    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.
     4scriptversion=2013-05-30.07; # UTC
     5
     6# Copyright (C) 1999-2014 Free Software Foundation, Inc.
    87
    98# This program is free software; you can redistribute it and/or modify
     
    2928case $1 in
    3029  '')
    31      echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
    32      exit 1;
    33      ;;
     30    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
     31    exit 1;
     32    ;;
    3433  -h | --h*)
    3534    cat <<\EOF
     
    4140Environment variables:
    4241  depmode     Dependency tracking mode.
    43   source      Source file read by `PROGRAMS ARGS'.
    44   object      Object file output by `PROGRAMS ARGS'.
     42  source      Source file read by 'PROGRAMS ARGS'.
     43  object      Object file output by 'PROGRAMS ARGS'.
    4544  DEPDIR      directory where to store dependencies.
    4645  depfile     Dependency file to output.
     
    5857esac
    5958
     59# Get the directory component of the given path, and save it in the
     60# global variables '$dir'.  Note that this directory component will
     61# be either empty or ending with a '/' character.  This is deliberate.
     62set_dir_from ()
     63{
     64  case $1 in
     65    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
     66      *) dir=;;
     67  esac
     68}
     69
     70# Get the suffix-stripped basename of the given path, and save it the
     71# global variable '$base'.
     72set_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 the
     79# Makefile "include basename.Plo" scheme.
     80make_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.
     87aix_post_process_depfile ()
     88{
     89  # If the compiler actually managed to produce a dependency file,
     90  # post-process it.
     91  if test -f "$tmpdepfile"; then
     92    # Each line is of the form 'foo.o: dependency.h'.
     93    # Do two passes, one to just change these to
     94    #   $object: dependency.h
     95    # and one to simply output
     96    #   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  else
     103    make_dummy_depfile
     104  fi
     105}
     106
     107# A tabulation character.
     108tab='   '
     109# A newline character.
     110nl='
     111'
     112# Character ranges might be problematic outside the C locale.
     113# These definitions help.
     114upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
     115lower=abcdefghijklmnopqrstuvwxyz
     116digits=0123456789
     117alpha=${upper}${lower}
     118
    60119if test -z "$depmode" || test -z "$source" || test -z "$object"; then
    61120  echo "depcomp: Variables source, object and depmode must be set" 1>&2
     
    69128
    70129rm -f "$tmpdepfile"
     130
     131# Avoid interferences from the environment.
     132gccflag= dashmflag=
    71133
    72134# Some modes work just like other modes, but use different flags.  We
     
    81143
    82144if test "$depmode" = dashXmstdout; then
    83    # This is just like dashmstdout with a different argument.
    84    dashmflag=-xM
    85    depmode=dashmstdout
     145  # This is just like dashmstdout with a different argument.
     146  dashmflag=-xM
     147  depmode=dashmstdout
    86148fi
    87149
    88150cygpath_u="cygpath -u -f -"
    89151if test "$depmode" = msvcmsys; then
    90    # 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
     152  # This is just like msvisualcpp but w/o cygpath translation.
     153  # Just convert the backslash-escaped backslashes to single forward
     154  # slashes to satisfy depend.m4
     155  cygpath_u='sed s,\\\\,/,g'
     156  depmode=msvisualcpp
    95157fi
    96158
    97159if test "$depmode" = msvc7msys; then
    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
     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
     165fi
     166
     167if 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
    103171fi
    104172
     
    123191  "$@"
    124192  stat=$?
    125   if test $stat -eq 0; then :
    126   else
     193  if test $stat -ne 0; then
    127194    rm -f "$tmpdepfile"
    128195    exit $stat
     
    132199
    133200gcc)
     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).
    134204## There are various ways to get dependency output from gcc.  Here's
    135205## why we pick this rather obscure method:
     
    138208##   (We might end up doing this anyway to support other compilers.)
    139209## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
    140 ##   -MM, not -M (despite what the docs say).
     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.
    141212## - Using -M directly means running the compiler twice (even worse
    142213##   than renaming).
     
    146217  "$@" -Wp,"$gccflag$tmpdepfile"
    147218  stat=$?
    148   if test $stat -eq 0; then :
    149   else
     219  if test $stat -ne 0; then
    150220    rm -f "$tmpdepfile"
    151221    exit $stat
     
    153223  rm -f "$depfile"
    154224  echo "$object : \\" > "$depfile"
    155   alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
    156 ## The second -e expression handles DOS-style file names with drive letters.
     225  # The second -e expression handles DOS-style file names with drive
     226  # letters.
    157227  sed -e 's/^[^:]*: / /' \
    158228      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
    159 ## This next piece of magic avoids the `deleted header file' problem.
     229## This next piece of magic avoids the "deleted header file" problem.
    160230## The problem is that when a header file which appears in a .P file
    161231## is deleted, the dependency causes make to die (because there is
     
    163233## dummy dependencies for each header file.  Too bad gcc doesn't do
    164234## this for us directly.
    165   tr ' ' '
    166 ' < "$tmpdepfile" |
    167 ## Some versions of gcc put a space before the `:'.  On the theory
     235## Some versions of gcc put a space before the ':'.  On the theory
    168236## that the space means something, we add a space to the output as
    169237## well.  hp depmode also adds that space, but also prefixes the VPATH
     
    171239## Some versions of the HPUX 10.20 sed can't process this invocation
    172240## correctly.  Breaking it into two sed invocations is a workaround.
    173     sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
    174       | sed -e 's/$/ :/' >> "$depfile"
     241  tr ' ' "$nl" < "$tmpdepfile" \
     242    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
     243    | sed -e 's/$/ :/' >> "$depfile"
    175244  rm -f "$tmpdepfile"
    176245  ;;
     
    190259  fi
    191260  stat=$?
    192   if test $stat -eq 0; then :
    193   else
     261  if test $stat -ne 0; then
    194262    rm -f "$tmpdepfile"
    195263    exit $stat
     
    199267  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
    200268    echo "$object : \\" > "$depfile"
    201 
    202269    # Clip off the initial element (the dependent).  Don't try to be
    203270    # clever and replace this with sed code, as IRIX sed won't handle
    204271    # lines with more than a fixed number of characters (4096 in
    205272    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
    206     # the IRIX cc adds comments like `#:fec' to the end of the
     273    # the IRIX cc adds comments like '#:fec' to the end of the
    207274    # dependency line.
    208     tr ' ' '
    209 ' < "$tmpdepfile" \
    210     | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
    211     tr '
    212 ' ' ' >> "$depfile"
     275    tr ' ' "$nl" < "$tmpdepfile" \
     276      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
     277      | tr "$nl" ' ' >> "$depfile"
    213278    echo >> "$depfile"
    214 
    215279    # The second pass generates a dummy entry for each header file.
    216     tr ' ' '
    217 ' < "$tmpdepfile" \
    218    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
    219    >> "$depfile"
     280    tr ' ' "$nl" < "$tmpdepfile" \
     281      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
     282      >> "$depfile"
    220283  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"
     284    make_dummy_depfile
    225285  fi
    226286  rm -f "$tmpdepfile"
     287  ;;
     288
     289xlc)
     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
    227294  ;;
    228295
     
    230297  # The C for AIX Compiler uses -M and outputs the dependencies
    231298  # in a .u file.  In older versions, this file always lives in the
    232   # current directory.  Also, the AIX compiler puts `$object:' at the
     299  # current directory.  Also, the AIX compiler puts '$object:' at the
    233300  # start of each line; $object doesn't have directory information.
    234301  # Version 6 uses the directory in both cases.
    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$//'`
     302  set_dir_from "$object"
     303  set_base_from "$object"
    238304  if test "$libtool" = yes; then
    239305    tmpdepfile1=$dir$base.u
     
    248314  fi
    249315  stat=$?
    250 
    251   if test $stat -eq 0; then :
    252   else
     316  if test $stat -ne 0; then
    253317    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
    254318    exit $stat
     
    259323    test -f "$tmpdepfile" && break
    260324  done
    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
     325  aix_post_process_depfile
     326  ;;
     327
     328tcc)
     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"
    274356  rm -f "$tmpdepfile"
    275357  ;;
    276358
    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
     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.
     363pgcc)
     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
    289369  #    foo.o: sub/foo.c sub/foo.h
    290   # and will wrap long lines using \ :
     370  # and will wrap long lines using '\' :
    291371  #    foo.o: sub/foo.c ... \
    292372  #     sub/foo.h ... \
    293373  #     ...
    294 
    295   "$@" -MD -MF "$tmpdepfile"
    296   stat=$?
    297   if test $stat -eq 0; then :
    298   else
     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
    299419    rm -f "$tmpdepfile"
    300420    exit $stat
     
    308428  # Some versions of the HPUX 10.20 sed can't process this invocation
    309429  # correctly.  Breaking it into two sed invocations is a workaround.
    310   sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
    311     sed -e 's/$/ :/' >> "$depfile"
     430  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
     431    | sed -e 's/$/ :/' >> "$depfile"
    312432  rm -f "$tmpdepfile"
    313433  ;;
     
    320440  # happens to be.
    321441  # Much of this is similar to the tru64 case; see comments there.
    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$//'`
     442  set_dir_from  "$object"
     443  set_base_from "$object"
    325444  if test "$libtool" = yes; then
    326445    tmpdepfile1=$dir$base.d
     
    333452  fi
    334453  stat=$?
    335   if test $stat -eq 0; then :
    336   else
     454  if test $stat -ne 0; then
    337455     rm -f "$tmpdepfile1" "$tmpdepfile2"
    338456     exit $stat
     
    344462  done
    345463  if test -f "$tmpdepfile"; then
    346     sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
    347     # Add `dependent.h:' lines.
     464    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
     465    # Add 'dependent.h:' lines.
    348466    sed -ne '2,${
    349                s/^ *//
    350                s/ \\*$//
    351                s/$/:/
    352                p
    353              }' "$tmpdepfile" >> "$depfile"
     467               s/^ *//
     468               s/ \\*$//
     469               s/$/:/
     470               p
     471             }' "$tmpdepfile" >> "$depfile"
    354472  else
    355     echo "#dummy" > "$depfile"
     473    make_dummy_depfile
    356474  fi
    357475  rm -f "$tmpdepfile" "$tmpdepfile2"
     
    359477
    360478tru64)
    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    ;;
     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  ;;
    417519
    418520msvc7)
     
    425527  stat=$?
    426528  grep -v '^Note: including file: ' "$tmpdepfile"
    427   if test "$stat" = 0; then :
    428   else
     529  if test $stat -ne 0; then
    429530    rm -f "$tmpdepfile"
    430531    exit $stat
     
    444545}' | $cygpath_u | sort -u | sed -n '
    445546s/ /\\ /g
    446 s/\(.*\)/       \1 \\/p
     547s/\(.*\)/'"$tab"'\1 \\/p
    447548s/.\(.*\) \\/\1:/
    448549H
    449550$ {
    450   s/.*/ /
     551  s/.*/'"$tab"'/
    451552  G
    452553  p
    453554}' >> "$depfile"
     555  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
    454556  rm -f "$tmpdepfile"
    455557  ;;
     
    479581  fi
    480582
    481   # Remove `-o $object'.
     583  # Remove '-o $object'.
    482584  IFS=" "
    483585  for arg
     
    499601
    500602  test -z "$dashmflag" && dashmflag=-M
    501   # Require at least two characters before searching for `:'
     603  # Require at least two characters before searching for ':'
    502604  # in the target name.  This is to cope with DOS-style filenames:
    503   # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
     605  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
    504606  "$@" $dashmflag |
    505     sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
     607    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
    506608  rm -f "$depfile"
    507609  cat < "$tmpdepfile" > "$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"
     610  # Some versions of the HPUX 10.20 sed can't process this sed invocation
     611  # 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"
    513615  rm -f "$tmpdepfile"
    514616  ;;
     
    563665  # No need to regex-escape $object, excess matching of '.' is harmless.
    564666  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$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"
     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"
    570673  rm -f "$tmpdepfile" "$tmpdepfile".bak
    571674  ;;
     
    584687  fi
    585688
    586   # Remove `-o $object'.
     689  # Remove '-o $object'.
    587690  IFS=" "
    588691  for arg
     
    603706  done
    604707
    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"
     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"
    609712  rm -f "$depfile"
    610713  echo "$object : \\" > "$depfile"
     
    638741      ;;
    639742    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
    640         set fnord "$@"
    641         shift
    642         shift
    643         ;;
     743        set fnord "$@"
     744        shift
     745        shift
     746        ;;
    644747    *)
    645         set fnord "$@" "$arg"
    646         shift
    647         shift
    648         ;;
     748        set fnord "$@" "$arg"
     749        shift
     750        shift
     751        ;;
    649752    esac
    650753  done
     
    653756  rm -f "$depfile"
    654757  echo "$object : \\" > "$depfile"
    655   sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::      \1 \\:p' >> "$depfile"
    656   echo "        " >> "$depfile"
     758  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
     759  echo "$tab" >> "$depfile"
    657760  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
    658761  rm -f "$tmpdepfile"
  • automake/install-sh

    rfd344aa r9236060  
    22# install - install a program, script, or datafile
    33
    4 scriptversion=2011-01-19.21; # UTC
     4scriptversion=2014-09-12.12; # UTC
    55
    66# This originates from X11R5 (mit/util/scripts/install.sh), which was
     
    3636#
    3737# Calling this script install-sh is preferred over install.sh, to prevent
    38 # `make' implicit rules from creating a file called install from it
     38# 'make' implicit rules from creating a file called install from it
    3939# when there is no Makefile.
    4040#
     
    4242# from scratch.
    4343
     44tab='   '
    4445nl='
    4546'
    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.
     47IFS=" $tab$nl"
     48
     49# Set DOITPROG to "echo" to test this script.
     50
    5151doit=${DOITPROG-}
    52 if test -z "$doit"; then
    53   doit_exec=exec
    54 else
    55   doit_exec=$doit
    56 fi
     52doit_exec=${doit:-exec}
    5753
    5854# Put in absolute file names if you don't have them in your path;
     
    6965stripprog=${STRIPPROG-strip}
    7066
    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 
    8267posix_mkdir=
    8368
     
    9883
    9984copy_on_change=false
    100 no_target_directory=
     85is_target_a_directory=possibly
    10186
    10287usage="\
     
    138123
    139124    -g) chgrpcmd="$chgrpprog $2"
    140         shift;;
     125        shift;;
    141126
    142127    --help) echo "$usage"; exit $?;;
    143128
    144129    -m) mode=$2
    145         case $mode in
    146           *' '* | *'    '* | *'
    147 '*        | *'*'* | *'?'* | *'['*)
    148             echo "$0: invalid mode: $mode" >&2
    149             exit 1;;
    150         esac
    151         shift;;
     130        case $mode in
     131          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
     132            echo "$0: invalid mode: $mode" >&2
     133            exit 1;;
     134        esac
     135        shift;;
    152136
    153137    -o) chowncmd="$chownprog $2"
    154         shift;;
     138        shift;;
    155139
    156140    -s) stripcmd=$stripprog;;
    157141
    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;;
     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;;
    166152
    167153    --version) echo "$0 $scriptversion"; exit $?;;
    168154
    169     --) shift
    170         break;;
    171 
    172     -*) echo "$0: invalid option: $1" >&2
    173         exit 1;;
     155    --) shift
     156        break;;
     157
     158    -*) echo "$0: invalid option: $1" >&2
     159        exit 1;;
    174160
    175161    *)  break;;
     
    177163  shift
    178164done
     165
     166# We allow the use of options -d and -T together, by making -d
     167# take the precedence; this is for compatibility with GNU install.
     168
     169if test -n "$dir_arg"; then
     170  if test -n "$dst_arg"; then
     171    echo "$0: target directory not allowed when installing a directory." >&2
     172    exit 1
     173  fi
     174fi
    179175
    180176if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
     
    191187    shift # arg
    192188    dst_arg=$arg
    193     # Protect names problematic for `test' and other utilities.
     189    # Protect names problematic for 'test' and other utilities.
    194190    case $dst_arg in
    195191      -* | [=\(\)!]) dst_arg=./$dst_arg;;
     
    203199    exit 1
    204200  fi
    205   # It's OK to call `install-sh -d' without argument.
     201  # It's OK to call 'install-sh -d' without argument.
    206202  # This can happen when creating conditional directories.
    207203  exit 0
     204fi
     205
     206if test -z "$dir_arg"; then
     207  if test $# -gt 1 || test "$is_target_a_directory" = always; then
     208    if test ! -d "$dst_arg"; then
     209      echo "$0: $dst_arg: Is not a directory." >&2
     210      exit 1
     211    fi
     212  fi
    208213fi
    209214
     
    224229    *[0-7])
    225230      if test -z "$stripcmd"; then
    226         u_plus_rw=
     231        u_plus_rw=
    227232      else
    228         u_plus_rw='% 200'
     233        u_plus_rw='% 200'
    229234      fi
    230235      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
    231236    *)
    232237      if test -z "$stripcmd"; then
    233         u_plus_rw=
     238        u_plus_rw=
    234239      else
    235         u_plus_rw=,u+rw
     240        u_plus_rw=,u+rw
    236241      fi
    237242      cp_umask=$mode$u_plus_rw;;
     
    241246for src
    242247do
    243   # Protect names problematic for `test' and other utilities.
     248  # Protect names problematic for 'test' and other utilities.
    244249  case $src in
    245250    -* | [=\(\)!]) src=./$src;;
     
    270275    # if double slashes aren't ignored.
    271276    if test -d "$dst"; then
    272       if test -n "$no_target_directory"; then
    273         echo "$0: $dst_arg: Is a directory" >&2
    274         exit 1
     277      if test "$is_target_a_directory" = never; then
     278        echo "$0: $dst_arg: Is a directory" >&2
     279        exit 1
    275280      fi
    276281      dstdir=$dst
     
    278283      dstdir_status=0
    279284    else
    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 
     285      dstdir=`dirname "$dst"`
    307286      test -d "$dstdir"
    308287      dstdir_status=$?
     
    315294    case $posix_mkdir in
    316295      '')
    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;;
     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;;
    379365    esac
    380366
    381367    if
    382368      $posix_mkdir && (
    383         umask $mkdir_umask &&
    384         $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
     369        umask $mkdir_umask &&
     370        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
    385371      )
    386372    then :
     
    392378
    393379      case $dstdir in
    394         /*) prefix='/';;
    395         [-=\(\)!]*) prefix='./';;
    396         *)  prefix='';;
     380        /*) prefix='/';;
     381        [-=\(\)!]*) prefix='./';;
     382        *)  prefix='';;
    397383      esac
    398 
    399       eval "$initialize_posix_glob"
    400384
    401385      oIFS=$IFS
    402386      IFS=/
    403       $posix_glob set -f
     387      set -f
    404388      set fnord $dstdir
    405389      shift
    406       $posix_glob set +f
     390      set +f
    407391      IFS=$oIFS
    408392
     
    411395      for d
    412396      do
    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/
     397        test X"$d" = X && continue
     398
     399        prefix=$prefix$d
     400        if test -d "$prefix"; then
     401          prefixes=
     402        else
     403          if $posix_mkdir; then
     404            (umask=$mkdir_umask &&
     405             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
     406            # Don't fail if two instances are running concurrently.
     407            test -d "$prefix" || exit 1
     408          else
     409            case $prefix in
     410              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
     411              *) qprefix=$prefix;;
     412            esac
     413            prefixes="$prefixes '$qprefix'"
     414          fi
     415        fi
     416        prefix=$prefix/
    433417      done
    434418
    435419      if test -n "$prefixes"; then
    436         # 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
     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 1
     424        obsolete_mkdir_used=true
    441425      fi
    442426    fi
     
    473457    # If -C, don't bother to copy if it wouldn't change the file.
    474458    if $copy_on_change &&
    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 &&
     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 &&
    480462       set X $old && old=:$2:$4:$5:$6 &&
    481463       set X $new && new=:$2:$4:$5:$6 &&
    482        $posix_glob set +f &&
    483 
     464       set +f &&
    484465       test "$old" = "$new" &&
    485466       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
     
    494475      # support -f.
    495476      {
    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"
     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 some
     479        # systems and the destination file might be busy for other
     480        # reasons.  In this case, the final cleanup might fail but the new
     481        # 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" >&2
     489            (exit 1); exit 1
     490          }
     491        } &&
     492
     493        # Now rename the file to the real destination.
     494        $doit $mvcmd "$dsttmp" "$dst"
    514495      }
    515496    fi || exit 1
  • automake/test-driver

    • Property mode changed from 120000 to 100755
    rfd344aa r9236060  
    1 /usr/share/automake-1.15/test-driver
     1#! /bin/sh
     2# test-driver - basic testsuite driver script.
     3
     4scriptversion=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.
     32set -u
     33
     34usage_error ()
     35{
     36  echo "$0: $*" >&2
     37  print_usage >&2
     38  exit 2
     39}
     40
     41print_usage ()
     42{
     43  cat <<END
     44Usage:
     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]
     49The '--test-name', '--log-file' and '--trs-file' options are mandatory.
     50END
     51}
     52
     53test_name= # Used for reporting.
     54log_file=  # Where to save the output of the test script.
     55trs_file=  # Where to save the metadata of the test run.
     56expect_failure=no
     57color_tests=no
     58enable_hard_errors=yes
     59while 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
     74done
     75
     76missing_opts=
     77test x"$test_name" = x && missing_opts="$missing_opts --test-name"
     78test x"$log_file"  = x && missing_opts="$missing_opts --log-file"
     79test x"$trs_file"  = x && missing_opts="$missing_opts --trs-file"
     80if test x"$missing_opts" != x; then
     81  usage_error "the following mandatory options are missing:$missing_opts"
     82fi
     83
     84if test $# -eq 0; then
     85  usage_error "missing argument"
     86fi
     87
     88if 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.
     96else
     97  red= grn= lgn= blu= mgn= std=
     98fi
     99
     100do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
     101trap "st=129; $do_exit" 1
     102trap "st=130; $do_exit" 2
     103trap "st=141; $do_exit" 13
     104trap "st=143; $do_exit" 15
     105
     106# Test script is run here.
     107"$@" >$log_file 2>&1
     108estatus=$?
     109
     110if test $enable_hard_errors = no && test $estatus -eq 99; then
     111  tweaked_estatus=1
     112else
     113  tweaked_estatus=$estatus
     114fi
     115
     116case $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;;
     123esac
     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).
     129echo "$res $test_name (exit status: $estatus)" >>$log_file
     130
     131# Report outcome to console.
     132echo "${col}${res}${std}: $test_name"
     133
     134# Register the test result, and other relevant metadata.
     135echo ":test-result: $res" > $trs_file
     136echo ":global-test-result: $res" >> $trs_file
     137echo ":recheck: $recheck" >> $trs_file
     138echo ":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:
  • automake/ylwrap

    rfd344aa r9236060  
    22# ylwrap - wrapper for lex/yacc invocations.
    33
    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.
     4scriptversion=2013-01-12.17; # UTC
     5
     6# Copyright (C) 1996-2014 Free Software Foundation, Inc.
    87#
    98# Written by Tom Tromey <tromey@cygnus.com>.
     
    3130# <automake-patches@gnu.org>.
    3231
     32get_dirname ()
     33{
     34  case $1 in
     35    */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';;
     36    # Otherwise,  we want the empty string (not ".").
     37  esac
     38}
     39
     40# guard FILE
     41# ----------
     42# The CPP macro used to guard inclusion of FILE.
     43guard ()
     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.
     55quote_for_sed ()
     56{
     57  case $# in
     58    0) cat;;
     59    1) printf '%s\n' "$1";;
     60  esac \
     61    | sed -e 's|[][\\.*]|\\&|g'
     62}
     63
    3364case "$1" in
    3465  '')
    35     echo "$0: No files given.  Try \`$0 --help' for more information." 1>&2
     66    echo "$0: No files given.  Try '$0 --help' for more information." 1>&2
    3667    exit 1
    3768    ;;
     
    6697
    6798# The input.
    68 input="$1"
     99input=$1
    69100shift
    70 case "$input" in
     101# We'll later need for a correct munging of "#line" directives.
     102input_sub_rx=`get_dirname "$input" | quote_for_sed`
     103case $input in
    71104  [\\/]* | ?:[\\/]*)
    72105    # Absolute path; do nothing.
     
    74107  *)
    75108    # Relative path.  Make it absolute.
    76     input="`pwd`/$input"
    77     ;;
    78 esac
    79 
    80 pairlist=
    81 while test "$#" -ne 0; do
    82   if test "$1" = "--"; then
     109    input=`pwd`/$input
     110    ;;
     111esac
     112input_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.
     117y_tab_nodot=false
     118if test -f y_tab.c || test -f y_tab.h; then
     119  y_tab_nodot=true
     120fi
     121
     122# The parser itself, the first file, is the destination of the .y.c
     123# rule in the Makefile.
     124parser=$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.
     129sed_fix_filenames=
     130
     131# Also rename header guards, as Bison 2.7 for instance uses its header
     132# guard in its implementation file.
     133sed_fix_header_guards=
     134
     135while test $# -ne 0; do
     136  if test x"$1" = x"--"; then
    83137    shift
    84138    break
    85139  fi
    86   pairlist="$pairlist $1"
     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
    87148  shift
     149  to=$1
     150  shift
     151  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;"
    88153done
    89154
    90155# The program to run.
    91 prog="$1"
     156prog=$1
    92157shift
    93158# Make any relative path in $prog absolute.
    94 case "$prog" in
     159case $prog in
    95160  [\\/]* | ?:[\\/]*) ;;
    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.
     161  *[\\/]*) prog=`pwd`/$prog ;;
     162esac
     163
    101164dirname=ylwrap$$
    102165do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (exit $ret); exit $ret'
     
    116179
    117180if test $ret -eq 0; then
    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
     181  for from in *
     182  do
     183    to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"`
    147184    if test -f "$from"; then
    148185      # If $2 is an absolute path name, then just use that,
    149       # otherwise prepend `../'.
    150       case "$2" in
    151         [\\/]* | ?:[\\/]*) target="$2";;
    152         *) target="../$2";;
     186      # otherwise prepend '../'.
     187      case $to in
     188        [\\/]* | ?:[\\/]*) target=$to;;
     189        *) target=../$to;;
    153190      esac
    154191
    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`"
     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'`
    164200      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
     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
    187214        if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then
    188           echo "$2" is unchanged
     215          echo "$to is unchanged"
    189216          rm -f "$target"
    190217        else
    191           echo updating "$2"
     218          echo "updating $to"
    192219          mv -f "$target" "$realtarget"
    193220        fi
    194221      fi
    195222    else
    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
     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
    201227        ret=1
    202228      fi
    203229    fi
    204     shift
    205     shift
    206     first=no
    207230  done
    208 else
    209   ret=$?
    210231fi
    211232
  • configure

    rfd344aa r9236060  
    34713471        case $host_cpu in
    34723472                i386)
    3473                         CFLAGS+="-m32"
    3474                         CXXFLAGS+="-m32"
    3475                         CFAFLAGS+="-m32"
    3476                         LDFLAGS+="-m32"
     3473                        CFLAGS+=" -m32 "
     3474                        CXXFLAGS+=" -m32 "
     3475                        CFAFLAGS+=" -m32 "
     3476                        LDFLAGS+=" -m32 "
    34773477                        ;;
    34783478                i686)
    3479                         CFLAGS+="-m32"
    3480                         CXXFLAGS+="-m32"
    3481                         CFAFLAGS+="-m32"
    3482                         LDFLAGS+="-m32"
     3479                        CFLAGS+=" -m32 "
     3480                  CXXFLAGS+=" -m32 "
     3481                  CFAFLAGS+=" -m32 "
     3482                  LDFLAGS+=" -m32 "
    34833483                        ;;
    34843484                x86_64)
    3485                         CFLAGS+="-m64"
    3486                         CXXFLAGS+="-m64"
    3487                         CFAFLAGS+="-m64"
    3488                         LDFLAGS+="-m64"
     3485                        CFLAGS+=" -m64 "
     3486                        CXXFLAGS+=" -m64 "
     3487                        CFAFLAGS+=" -m64 "
     3488                        LDFLAGS+=" -m64 "
    34893489                        ;;
    34903490        esac
  • configure.ac

    rfd344aa r9236060  
    167167AC_SUBST([MACHINE_TYPE],[$host_cpu])
    168168
    169 if ! test "$host_cpu" = "$build_cpu"; then 
     169if ! test "$host_cpu" = "$build_cpu"; then
    170170        case $host_cpu in
    171171                i386)
    172                         CFLAGS+="-m32"
    173                         CXXFLAGS+="-m32"
    174                         CFAFLAGS+="-m32"
    175                         LDFLAGS+="-m32"
     172                        CFLAGS+=" -m32 "
     173                        CXXFLAGS+=" -m32 "
     174                        CFAFLAGS+=" -m32 "
     175                        LDFLAGS+=" -m32 "
    176176                        ;;
    177177                i686)
    178                         CFLAGS+="-m32"
    179                         CXXFLAGS+="-m32"
    180                         CFAFLAGS+="-m32"
    181                         LDFLAGS+="-m32"
     178                        CFLAGS+=" -m32 "
     179                  CXXFLAGS+=" -m32 "
     180                  CFAFLAGS+=" -m32 "
     181                  LDFLAGS+=" -m32 "
    182182                        ;;
    183183                x86_64)
    184                         CFLAGS+="-m64"
    185                         CXXFLAGS+="-m64"
    186                         CFAFLAGS+="-m64"
    187                         LDFLAGS+="-m64"
     184                        CFLAGS+=" -m64 "
     185                        CXXFLAGS+=" -m64 "
     186                        CFAFLAGS+=" -m64 "
     187                        LDFLAGS+=" -m64 "
    188188                        ;;
    189189        esac
  • doc/LaTeXmacros/common.tex

    rfd344aa r9236060  
    1111%% Created On       : Sat Apr  9 10:06:17 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Thu Jul 13 11:44:59 2017
    14 %% Update Count     : 335
     13%% Last Modified On : Mon Jul 24 21:02:14 2017
     14%% Update Count     : 352
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    134134
    135135% inline text and code index (cannot use ©)
    136 \newcommand{\Indexc}[1]{\lstinline$#1$\index{#1@\lstinline$#1$}}
     136\newcommand{\Indexc}[2][\@empty]{\lstinline[#1]$#2$\index{#2@\lstinline[#1]$#2$}}
    137137% code index (cannot use ©)
    138 \newcommand{\indexc}[1]{\index{#1@\lstinline$#1$}}
     138\newcommand{\indexc}[2][\@empty]{\index{#2@\lstinline[#1]$#2$}}
    139139
    140140% Denote newterms in particular font and index them without particular font and in lowercase, e.g., \newterm{abc}.
     
    234234basicstyle=\linespread{0.9}\sf,                                                 % reduce line spacing and use sanserif font
    235235stringstyle=\tt,                                                                                % use typewriter font
    236 tabsize=6,                                                                                              % N space tabbing
     236tabsize=5,                                                                                              % N space tabbing
    237237xleftmargin=\parindentlnth,                                                             % indent code to paragraph indentation
    238238extendedchars=true,                                                                             % allow ASCII characters in the range 128-255
  • doc/LaTeXmacros/lstlang.sty

    rfd344aa r9236060  
    88%% Created On       : Sat May 13 16:34:42 2017
    99%% Last Modified By : Peter A. Buhr
    10 %% Last Modified On : Wed Jul 12 22:42:09 2017
    11 %% Update Count     : 12
     10%% Last Modified On : Mon Jul 24 20:40:37 2017
     11%% Update Count     : 13
    1212%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1313
     
    112112                finally, forall, ftype, _Generic, _Imaginary, inline, __label__, lvalue, _Noreturn, one_t,
    113113                otype, restrict, _Static_assert, throw, throwResume, trait, try, ttype, typeof, __typeof,
    114                 __typeof__, with, zero_t},
     114                __typeof__, virtual, with, zero_t},
    115115        morekeywords=[2]{
    116116                _Atomic, coroutine, is_coroutine, is_monitor, is_thread, monitor, mutex, nomutex,
  • doc/generic_types/generic_types.tex

    rfd344aa r9236060  
    4949
    5050% Useful macros
    51 \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
     51\newcommand{\CFAIcon}{\textsf{C}\raisebox{\depth}{\rotatebox{180}{\textsf{A}}}\xspace} % Cforall symbolic name
     52\newcommand{\CFA}{\protect\CFAIcon} % safe for section/caption
     53\newcommand{\CC}{\textrm{C}\kern-.1em\hbox{+\kern-.25em+}\xspace} % C++ symbolic name
     54\newcommand{\CCeleven}{\textrm{C}\kern-.1em\hbox{+\kern-.25em+}11\xspace} % C++11 symbolic name
     55\newcommand{\CCfourteen}{\textrm{C}\kern-.1em\hbox{+\kern-.25em+}14\xspace} % C++14 symbolic name
     56\newcommand{\CCseventeen}{\textrm{C}\kern-.1em\hbox{+\kern-.25em+}17\xspace} % C++17 symbolic name
     57\newcommand{\CCtwenty}{\textrm{C}\kern-.1em\hbox{+\kern-.25em+}20\xspace} % C++20 symbolic name
    5858\newcommand{\CCV}{\rm C\kern-.1em\hbox{+\kern-.25em+}obj\xspace} % C++ virtual symbolic name
    5959\newcommand{\Csharp}{C\raisebox{-0.7ex}{\Large$^\sharp$}\xspace} % C# symbolic name
     
    443443This function could acquire the layout for @set(T)@ by calling its layout function with the layout of @T@ implicitly passed into the function.
    444444
    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.
     445Whether a type is concrete, dtype-static, or dynamic is decided solely on the @forall@'s type parameters.
     446This 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.
     447If 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.
    448448
    449449
     
    855855}
    856856\end{lstlisting}
     857\begin{sloppypar}
    857858Tuple 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}
    858860
    859861\begin{comment}
  • doc/proposals/concurrency/text/concurrency.tex

    rfd344aa r9236060  
    44% ======================================================================
    55% ======================================================================
    6 Several tool can be used to solve concurrency challenges. Since many of these challenges appear with the use of mutable shared-state, some languages and libraries simply disallow mutable shared-state (Erlang~\cite{Erlang}, Haskell~\cite{Haskell}, Akka (Scala)~\cite{Akka}). In these paradigms, interaction among concurrent objects relies on message passing~\cite{Thoth,Harmony,V-Kernel} or other paradigms that closely relate to networking concepts (channels\cit for example). However, in languages that use routine calls as their core abstraction-mechanism, these approaches force a clear distinction between concurrent and non-concurrent paradigms (i.e., message passing versus routine call). This distinction in turn means that, in order to be effective, programmers need to learn two sets of designs patterns. While this distinction can be hidden away in library code, effective use of the librairy still has to take both paradigms into account. 
    7 
    8 Approaches based on shared memory are more closely related to non-concurrent paradigms since they often rely on basic constructs like routine calls and shared objects. At the lowest level, concurrent paradigms are implemented as atomic operations and locks. Many such mechanisms have been proposed, including semaphores~\cite{Dijkstra68b} and path expressions~\cite{Campbell74}. However, for productivity reasons it is desireable to have a higher-level construct be the core concurrency paradigm~\cite{HPP:Study}. 
    9 
    10 An approach that is worth mentionning because it is gaining in popularity is transactionnal memory~\cite{Dice10}[Check citation]. While this approach is even pursued by system languages like \CC\cit, the performance and feature set is currently too restrictive to be the main concurrency paradigm for general purpose language, which is why it was rejected as the core paradigm for concurrency in \CFA. 
     6Several tool can be used to solve concurrency challenges. Since many of these challenges appear with the use of mutable shared-state, some languages and libraries simply disallow mutable shared-state (Erlang~\cite{Erlang}, Haskell~\cite{Haskell}, Akka (Scala)~\cite{Akka}). In these paradigms, interaction among concurrent objects relies on message passing~\cite{Thoth,Harmony,V-Kernel} or other paradigms that closely relate to networking concepts (channels\cit for example). However, in languages that use routine calls as their core abstraction-mechanism, these approaches force a clear distinction between concurrent and non-concurrent paradigms (i.e., message passing versus routine call). This distinction in turn means that, in order to be effective, programmers need to learn two sets of designs patterns. While this distinction can be hidden away in library code, effective use of the librairy still has to take both paradigms into account.
     7
     8Approaches based on shared memory are more closely related to non-concurrent paradigms since they often rely on basic constructs like routine calls and shared objects. At the lowest level, concurrent paradigms are implemented as atomic operations and locks. Many such mechanisms have been proposed, including semaphores~\cite{Dijkstra68b} and path expressions~\cite{Campbell74}. However, for productivity reasons it is desireable to have a higher-level construct be the core concurrency paradigm~\cite{HPP:Study}.
     9
     10An approach that is worth mentionning because it is gaining in popularity is transactionnal memory~\cite{Dice10}[Check citation]. While this approach is even pursued by system languages like \CC\cit, the performance and feature set is currently too restrictive to be the main concurrency paradigm for general purpose language, which is why it was rejected as the core paradigm for concurrency in \CFA.
    1111
    1212One of the most natural, elegant, and efficient mechanisms for synchronization and communication, especially for shared memory systems, is the \emph{monitor}. Monitors were first proposed by Brinch Hansen~\cite{Hansen73} and later described and extended by C.A.R.~Hoare~\cite{Hoare74}. Many programming languages---e.g., Concurrent Pascal~\cite{ConcurrentPascal}, Mesa~\cite{Mesa}, Modula~\cite{Modula-2}, Turing~\cite{Turing:old}, Modula-3~\cite{Modula-3}, NeWS~\cite{NeWS}, Emerald~\cite{Emerald}, \uC~\cite{Buhr92a} and Java~\cite{Java}---provide monitors as explicit language constructs. In addition, operating-system kernels and device drivers have a monitor-like structure, although they often use lower-level primitives such as semaphores or locks to simulate monitors. For these reasons, this project proposes monitors as the core concurrency-construct.
     
    101101        }
    102102\end{cfacode}
    103 The multi-acquisition monitor lock allows a monitor lock to be acquired by both \code{bar} or \code{baz} and acquired again in \code{foo}. In the calls to \code{bar} and \code{baz} the monitors are acquired in opposite order. 
     103The multi-acquisition monitor lock allows a monitor lock to be acquired by both \code{bar} or \code{baz} and acquired again in \code{foo}. In the calls to \code{bar} and \code{baz} the monitors are acquired in opposite order.
    104104
    105105However, such use leads the lock acquiring order problem. In the example above, the user uses implicit ordering in the case of function \code{foo} but explicit ordering in the case of \code{bar} and \code{baz}. This subtle mistake means that calling these routines concurrently may lead to deadlock and is therefore undefined behavior. As shown on several occasion\cit, solving this problem requires:
     
    169169\end{tabular}
    170170\end{center}
    171 Notice how the counter is used without any explicit synchronisation and yet supports thread-safe semantics for both reading and writting. 
     171Notice how the counter is used without any explicit synchronisation and yet supports thread-safe semantics for both reading and writting.
    172172
    173173% ======================================================================
     
    178178Depending on the choice of semantics for when monitor locks are acquired, interaction between monitors and \CFA's concept of polymorphism can be complex to support. However, it is shown that entry-point locking solves most of the issues.
    179179
    180 First of all, interaction between \code{otype} polymorphism and monitors is impossible since monitors do not support copying. Therefore, the main question is how to support \code{dtype} polymorphism. Since a monitor's main purpose is to ensure mutual exclusion when accessing shared data, this implies that mutual exclusion is only required for routines that do in fact access shared data. However, since \code{dtype} polymorphism always handles incomplete types (by definition), no \code{dtype} polymorphic routine can access shared data since the data requires knowledge about the type. Therefore, the only concern when combining \code{dtype} polymorphism and monitors is to protect access to routines. 
    181 
    182 Before looking into complex control flow, it is important to present the difference between the two acquiring options : \gls{callsite-locking} and \gls{entry-point-locking}, i.e. acquiring the monitors before making a mutex routine call or as the first instruction of the mutex routine call. For example:
     180First of all, interaction between \code{otype} polymorphism and monitors is impossible since monitors do not support copying. Therefore, the main question is how to support \code{dtype} polymorphism. Since a monitor's main purpose is to ensure mutual exclusion when accessing shared data, this implies that mutual exclusion is only required for routines that do in fact access shared data. However, since \code{dtype} polymorphism always handles incomplete types (by definition), no \code{dtype} polymorphic routine can access shared data since the data requires knowledge about the type. Therefore, the only concern when combining \code{dtype} polymorphism and monitors is to protect access to routines.
     181
     182Before looking into complex control-flow, it is important to present the difference between the two acquiring options : callsite and entry-point locking, i.e. acquiring the monitors before making a mutex routine call or as the first operation of the mutex routine-call. For example:
    183183\begin{center}
    184184\setlength\tabcolsep{1.5pt}
     
    245245\end{center}
    246246
    247 \Gls{callsite-locking} is inefficient, since any \code{dtype} routine may have to obtain some lock before calling a routine, depending on whether or not the type passed is a monitor. However, with \gls{entry-point-locking} calling a monitor routine becomes exactly the same as calling it from anywhere else. Note that the \code{mutex} keyword relies on the resolver rather than another form of language, which mean that in cases where a generic monitor routine is actually desired, writing a mutex routine is possible with the proper trait. This is possible because monitors are designed in terms a trait. For example:
     247\Gls{callsite-locking} is inefficient, since any \code{dtype} routine may have to obtain some lock before calling a routine, depending on whether or not the type passed is a monitor. However, with \gls{entry-point-locking} calling a monitor routine becomes exactly the same as calling it from anywhere else.
     248
     249Note the \code{mutex} keyword relies on the resolver, which means that in cases where a generic monitor routine is actually desired, writing a mutex routine is possible with the proper trait. This is possible because monitors are designed in terms a trait. For example:
    248250\begin{cfacode}
    249251//Incorrect
    250252//T is not a monitor
    251253forall(dtype T)
    252 void foo(T * mutex t); 
     254void foo(T * mutex t);
    253255
    254256//Correct
    255 //this function only works on monitors 
     257//this function only works on monitors
    256258//(any monitor)
    257259forall(dtype T | is_monitor(T))
    258 void bar(T * mutex t)); 
     260void bar(T * mutex t));
    259261\end{cfacode}
    260262
     
    267269In addition to mutual exclusion, the monitors at the core of \CFA's concurrency can also be used to achieve synchronisation. With monitors, this is generally achieved with internal or external scheduling as in\cit. Since internal scheduling of single monitors is mostly a solved problem, this proposal concentraits on extending internal scheduling to multiple monitors at once. Indeed, like the \gls{group-acquire} semantics, internal scheduling extends to multiple monitors at once in a way that is natural to the user but requires additional complexity on the implementation side.
    268270
    269 First, Here is a simple example of such a technique:
     271First, here is a simple example of such a technique:
    270272
    271273\begin{cfacode}
     
    289291\end{cfacode}
    290292
    291 There are two details to note here. First, there \code{signal} is a delayed operation, it only unblocks the waiting thread when it reaches the end of the critical section. This is needed to respect mutual-exclusion. Second, in \CFA, \code{condition} have no particular need to be stored inside a monitor, beyond any software engineering reasons. Here routine \code{foo} waits for the \code{signal} from \code{bar} before making further progress, effectively ensuring a basic ordering. 
     293There are two details to note here. First, there \code{signal} is a delayed operation, it only unblocks the waiting thread when it reaches the end of the critical section. This is needed to respect mutual-exclusion. Second, in \CFA, \code{condition} have no particular need to be stored inside a monitor, beyond any software engineering reasons. Here routine \code{foo} waits for the \code{signal} from \code{bar} before making further progress, effectively ensuring a basic ordering.
    292294
    293295An important aspect to take into account here is that \CFA does not allow barging, which means that once function \code{bar} releases the monitor, foo is guaranteed to resume immediately after (unless some other thread waited on the same condition). This guarantees offers the benefit of not having to loop arount waits in order to guarantee that a condition is still met. The main reason \CFA offers this guarantee is that users can easily introduce barging if it becomes a necessity but adding barging prevention or barging avoidance is more involved without language support. Supporting barging prevention as well as extending internal scheduling to multiple monitors is the main source of complexity in the design of \CFA concurrency.
     
    317319\end{pseudo}
    318320\end{multicols}
    319 
    320 The previous example shows the simple case of having two threads (one for each column) and a single monitor A. One thread acquires before waiting (atomically blocking and releasing A) and the other acquires before signalling. There is an important thing to note here, both \code{wait} and \code{signal} must be called with the proper monitor(s) already acquired. This restriction is hidden on the user side in \uC, as it is a logical requirement for barging prevention.
     321The example shows the simple case of having two threads (one for each column) and a single monitor A. One thread acquires before waiting (atomically blocking and releasing A) and the other acquires before signalling. There is an important thing to note here, both \code{wait} and \code{signal} must be called with the proper monitor(s) already acquired. This restriction is hidden on the user side in \uC, as it is a logical requirement for barging prevention.
    321322
    322323A direct extension of the previous example is the \gls{group-acquire} version:
     
    337338\end{pseudo}
    338339\end{multicols}
    339 
    340340This version uses \gls{group-acquire} (denoted using the \& symbol), but the presence of multiple monitors does not add a particularly new meaning. Synchronization happens between the two threads in exactly the same way and order. The only difference is that mutual exclusion covers more monitors. On the implementation side, handling multiple monitors does add a degree of complexity as the next few examples demonstrate.
    341341
     
    397397\end{center}
    398398
    399 It is particularly important to pay attention to code sections 8 and 3, which are where the existing semantics of internal scheduling need to be extended for multiple monitors. The root of the problem is that \gls{group-acquire} is used in a context where one of the monitors is already acquired and is why it is important to define the behaviour of the previous pseudo-code. When the signaller thread reaches the location where it should "release A \& B" (line 17), it must actually transfer ownership of monitor B to the waiting thread. This ownership trasnfer is required in order to prevent barging. Since the signalling thread still needs the monitor A, simply waking up the waiting thread is not an option because it would violate mutual exclusion. We are therefore left with three options:
     399It is particularly important to pay attention to code sections 8 and 3, which are where the existing semantics of internal scheduling need to be extended for multiple monitors. The root of the problem is that \gls{group-acquire} is used in a context where one of the monitors is already acquired and is why it is important to define the behaviour of the previous pseudo-code. When the signaller thread reaches the location where it should "release A \& B" (line 16), it must actually transfer ownership of monitor B to the waiting thread. This ownership trasnfer is required in order to prevent barging. Since the signalling thread still needs the monitor A, simply waking up the waiting thread is not an option because it would violate mutual exclusion. There are three options:
    400400
    401401\subsubsection{Delaying signals}
    402 The first more obvious solution to solve the problem of multi-monitor scheduling is to keep ownership of all locks until the last lock is ready to be transferred. It can be argued that that moment is the correct time to transfer ownership when the last lock is no longer needed is what fits most closely to the behaviour of single monitor scheduling. This solution has the main benefit of transferring ownership of groups of monitors, which simplifies the semantics from mutiple objects to a single groupd of object. Effectively making the existing single monitor semantic viable by simply changing monitors to monitor collections.
     402The first more obvious solution to solve the problem of multi-monitor scheduling is to keep ownership of all locks until the last lock is ready to be transferred. It can be argued that that moment is the correct time to transfer ownership when the last lock is no longer needed because this semantics fits most closely to the behaviour of single monitor scheduling. This solution has the main benefit of transferring ownership of groups of monitors, which simplifies the semantics from mutiple objects to a single group of object, effectively making the existing single monitor semantic viable by simply changing monitors to monitor collections.
    403403\begin{multicols}{2}
    404404Waiter
     
    424424\end{pseudo}
    425425\end{multicols}
    426 However, this solution can become much more complicated depending on what is executed while secretly holding B. Indeed, nothing prevents a user from signalling monitor A on a different condition variable:
     426However, this solution can become much more complicated depending on what is executed while secretly holding B (at line 10). Indeed, nothing prevents a user from signalling monitor A on a different condition variable:
    427427\newpage
    428428\begin{multicols}{2}
     
    459459\end{multicols}
    460460
    461 The goal in this solution is to avoid the need to transfer ownership of a subset of the condition monitors. However, this goal is unreacheable in the previous example. Depending on the order of signals (line 12 and 15) two cases can happen. Note that ordering is not determined by a race condition but by whether signalled threads are enqueued in FIFO or FILO order. However, regardless of the answer, users can move line 15 before line 11 and get the reverse effect.
    462 
    463 \paragraph{Case 1: thread 1 will go first.} In this case, the problem is that monitor A needs to be passed to thread 2 when thread 1 is done with it.
    464 \paragraph{Case 2: thread 2 will go first.} In this case, the problem is that monitor B needs to be passed to thread 1. This can be done directly or using thread 2 as an intermediate.
     461The goal in this solution is to avoid the need to transfer ownership of a subset of the condition monitors. However, this goal is unreacheable in the previous example. Depending on the order of signals (line 12 and 15) two cases can happen.
     462
     463\paragraph{Case 1: thread 1 goes first.} In this case, the problem is that monitor A needs to be passed to thread 2 when thread 1 is done with it.
     464\paragraph{Case 2: thread 2 goes first.} In this case, the problem is that monitor B needs to be passed to thread 1, which can be done directly or using thread 2 as an intermediate.
    465465\\
    466466
     467Note that ordering is not determined by a race condition but by whether signalled threads are enqueued in FIFO or FILO order. However, regardless of the answer, users can move line 15 before line 11 and get the reverse effect.
     468
    467469In both cases however, the threads need to be able to distinguish on a per monitor basis which ones need to be released and which ones need to be transferred. Which means monitors cannot be handled as a single homogenous group.
    468470
    469471\subsubsection{Dependency graphs}
    470 In the Listing 1 pseudo-code, there is a solution which would statisfy both barging prevention and mutual exclusion. If ownership of both monitors is transferred to the waiter when the signaller releases A and then the waiter transfers back ownership of A when it releases it then the problem is solved. Dynamically finding the correct order is therefore the second possible solution. The problem it encounters is that it effectively boils down to resolving a dependency graph of ownership requirements. Here even the simplest of code snippets requires two transfers and it seems to increase in a manner closer to polynomial. For example the following code which is just a direct extension to three monitors requires at least three ownership transfer and has multiple solutions:
     472In the Listing 1 pseudo-code, there is a solution which statisfies both barging prevention and mutual exclusion. If ownership of both monitors is transferred to the waiter when the signaller releases A and then the waiter transfers back ownership of A when it releases it then the problem is solved. Dynamically finding the correct order is therefore the second possible solution. The problem it encounters is that it effectively boils down to resolving a dependency graph of ownership requirements. Here even the simplest of code snippets requires two transfers and it seems to increase in a manner closer to polynomial. For example, the following code, which is just a direct extension to three monitors, requires at least three ownership transfer and has multiple solutions:
    471473
    472474\begin{multicols}{2}
     
    496498
    497499\subsubsection{Partial signalling}
    498 Finally, the solution that was chosen for \CFA is to use partial signalling. Consider the following case:
     500Finally, the solution that is chosen for \CFA is to use partial signalling. Consider the following case:
    499501
    500502\begin{multicols}{2}
     
    518520\end{pseudo}
    519521\end{multicols}
    520 
    521 The partial signalling solution transfers ownership of monitor B at lines 10 but does not wake the waiting thread since it is still using monitor A. Only when it reaches line 11 does it actually wakeup the waiting thread. This solution has the benefit that complexity is encapsulated in to only two actions, passing monitors to the next owner when they should be release and conditionnaly waking threads if all conditions are met. Contrary to the other solutions, this solution quickly hits an upper bound on complexity of implementation.
     522The partial signalling solution transfers ownership of monitor B at lines 10 but does not wake the waiting thread since it is still using monitor A. Only when it reaches line 11 does it actually wakeup the waiting thread. This solution has the benefit that complexity is encapsulated into only two actions, passing monitors to the next owner when they should be release and conditionnaly waking threads if all conditions are met. Contrary to the other solutions, this solution quickly hits an upper bound on complexity of implementation.
    522523
    523524% ======================================================================
     
    526527% ======================================================================
    527528% ======================================================================
    528 An important note is that, until now, signalling a monitor was a delayed operation. The ownership of the monitor is transferred only when the monitor would have otherwise been released, not at the point of the \code{signal} statement. However, in some cases, it may be more convenient for users to immediately transfer ownership to the thread that is waiting for cooperation. This is achieved using the \code{signal_block} routine\footnote{name to be discussed}.
     529An important note is that, until now, signalling a monitor was a delayed operation. The ownership of the monitor is transferred only when the monitor would have otherwise been released, not at the point of the \code{signal} statement. However, in some cases, it may be more convenient for users to immediately transfer ownership to the thread that is waiting for cooperation, which is achieved using the \code{signal_block} routine\footnote{name to be discussed}.
    529530
    530531For example here is an example highlighting the difference in behaviour:
     
    625626        bool inUse;
    626627public:
    627         void P() { 
    628                 if(inUse) wait(c); 
     628        void P() {
     629                if(inUse) wait(c);
    629630                inUse = true;
    630631        }
    631         void V() { 
    632                 inUse = false;         
    633                 signal(c); 
     632        void V() {
     633                inUse = false;
     634                signal(c);
    634635        }
    635636}
     
    639640        bool inUse;
    640641public:
    641         void P() { 
    642                 if(inUse) _Accept(V); 
     642        void P() {
     643                if(inUse) _Accept(V);
    643644                inUse = true;
    644645        }
    645         void g() { 
     646        void g() {
    646647                inUse = false;
    647648
  • doc/proposals/concurrency/version

    rfd344aa r9236060  
    1 0.9.119
     10.9.122
  • doc/proposals/virtual.txt

    rfd344aa r9236060  
    11Proposal for virtual functionality
     2
     3There are two types of virtual inheritance in this proposal, relaxed
     4(implicit) and strict (explicit). Relaxed is the simpler case that uses the
     5existing trait system with the addition of trait references and vtables.
     6Strict adds some constraints and requires some additional notation but allows
     7for down-casting.
     8
     9Relaxed Virtual Inheritance:
    210
    311Imagine the following code :
     
    2028void draw(line*);
    2129
    22 While all the members of this simple UI support drawing creating a UI that easily
    23 supports both these UI requires some tedious boiler-plate code :
     30While all the members of this simple UI support drawing, creating a UI that
     31easily supports both these UI requires some tedious boiler-plate code:
    2432
    2533enum type_t { text, line };
     
    4149}
    4250
    43 While this code will work as indented, adding any new widgets or any new widget behaviors
    44 requires changing existing code to add the desired functionality. To ease this maintenance
    45 effort required CFA introduces the concept of dynamic types, in a manner similar to C++.
    46 
    47 A simple usage of dynamic type with the previous example would look like :
    48 
    49 drawable* objects[10];
     51While this code will work as implemented, adding any new widgets or any new
     52widget behaviors requires changing existing code to add the desired
     53functionality. To ease this maintenance effort required CFA introduces the
     54concept of trait references.
     55
     56Using trait references to implement the above gives the following :
     57
     58trait drawable objects[10];
    5059fill_objects(objects);
    5160
    5261while(running) {
    53       for(drawable* object : objects) {
     62      for(drawable object : objects) {
    5463            draw(object);
    5564      }
    5665}
    5766
    58 However, this is not currently do-able in the current CFA and furthermore is not
    59 possible to implement statically. Therefore we need to add a new feature to handle
    60 having dynamic types like this (That is types that are found dynamically not types
    61 that change dynamically).
    62 
    63 C++ uses inheritance and virtual functions to find the
    64 desired type dynamically. CFA takes inspiration from this solution.
    65 
    66 What we really want to do is express the fact that calling draw() on a object
    67 should find the dynamic type of the parameter before calling the routine, much like the
    68 hand written example given above. We can express this by adding the virtual keyword on
    69 the parameter of the constraints on our trait:
     67The keyword trait is optional (by the same rules as the struct keyword). This
     68is not currently supported in CFA and the lookup is not possible to implement
     69statically. Therefore we need to add a new feature to handle having dynamic
     70lookups like this.
     71
     72What we really want to do is express the fact that calling draw() on a trait
     73reference should find the underlying type of the given parameter and find how
     74it implements the routine, as in the example with the enumeration and union.
     75
     76For instance specifying that the drawable trait reference looks up the type
     77of the first argument to find the implementation would be :
    7078
    7179trait drawable(otype T) {
     
    7381};
    7482
    75 This expresses the idea that drawable is similar to an abstract base class in C++ and
    76 also gives meaning to trying to take a pointer of drawable. That is anything that can
    77 be cast to a drawable pointer has the necessary information to call the draw routine on
    78 that type. Before that drawable was only a abstract type while now it also points to a
    79 piece of storage which specify which behavior the object will have at run time.
    80 
    81 This storage needs to be allocate somewhere. C++ just adds an invisible pointer at
    82 the beginning of the struct but we can do something more explicit for users, actually
    83 have a visible special field :
    84 
    85 struct text {
    86       char* text;
    87       vtable drawable;
    88 };
    89 
    90 struct line{
    91       vtable drawable;
    92       vec2 start;
    93       vec2 end;
    94 };
    95 
    96 With these semantics, adding a "vtable drawable" means that text pointers and line pointers are now
    97 convertible to drawable pointers. This conversion will not necessarily be a type only change however, indeed,
    98 the drawable pointer will point to the field "vtable drawable" not the head of the struct. However, since all
    99 the types are known at compile time, converting pointers becomes a simple offset operations.
    100 
    101 The vtable field contains a pointer to a vtable which contains all the information needed for the caller
    102 to find the function pointer of the desired behavior.
    103 
    104 One of the limitations of this design is that it does not support double dispatching, which
    105 concretely means traits cannot have routines with more than one virtual parameter. This design
    106 would have many ambiguities if it did support multiple virtual parameter. A futher limitation is
    107 that traits over more than one type cannot have vtables meaningfully defined for them, as the
    108 particular vtable to use would be a function of the other type(s) the trait is defined over.
    109 
    110 It is worth noting that the function pointers in these vtables are bound at object construction, rather than
    111 function call-site, as in Cforall's existing polymorphic functions. As such, it is possible that two objects
    112 with the same static type would have a different vtable (consider what happens if draw(line*) is overridden
    113 between the definitions of two line objects). Given that the virtual drawable* erases static types though,
    114 this should not be confusing in practice. A more distressing possibility is that of creating an object that
    115 outlives the scope of one of the functions in its vtable. This is certainly a possible bug, but it is of a
    116 type that C programmers are familiar with, and should be able to avoid by the usual methods.
    117 
    118 Extensibility.
    119 
    120 One of the obvious critics of this implementation is that it lacks extensibility for classes
    121 that cannot be modified (ex: Linux C headers). However this solution can be extended to
    122 allow more extensibility by adding "Fat pointers".
    123 
    124 Indeed, users could already "solve" this issue by writing their own fat pointers as such:
    125 
    126 trait MyContext(otype T) {
    127       void* get_stack(virtual T*)
    128 };
    129 
    130 void* get_stack(ucontext_t *context);
    131 
    132 struct fat_ucontext_t {
    133       vtable MyContext;
    134       ucontext_t *context;
    135 }
    136 
    137 //Tedious forwarding routine
    138 void* get_stack(fat_ucontext_t *ptr) {
    139       return get_stack(ptr->context);
    140 }
    141 
    142 However, users would have to write all the virtual methods they want to override and make
    143 them all simply forward to the existing method that takes the corresponding POCO(Plain Old C Object).
    144 
    145 The alternative we propose is to use language level fat pointers :
    146 
    147 trait MyContext(otype T) {
    148       void* get_stack(virtual T*)
    149 };
    150 
    151 void* get_stack(ucontext_t *context);
    152 
    153 //The type vptr(ucontext_t) all
    154 vptr(ucontext_t) context;
    155 
    156 These behave exactly as the previous example but all the forwarding routines are automatically generated.
    157 
    158 Bikeshedding.
    159 
    160 It may be desirable to add fewer new keywords than discussed in this proposal; it is possible that "virtual"
    161 could replace both "vtable" and "vptr" above with unambiguous contextual meaning. However, for purposes of
    162 clarity in the design discussion it is beneficial to keep the keywords for separate concepts distinct.
    163 
     83This could be implied in simple cases like this one (single parameter on the
     84trait and single generic parameter on the function). In more complex cases it
     85would have to be explicitly given, or a strong convention would have to be
     86enforced (e.g. implementation of trait functions is always drawn from the
     87first polymorphic parameter).
     88
     89Once a function in a trait has been marked as virtual it defines a new
     90function that takes in that trait's reference and then dynamically calls the
     91underlying type implementation. Hence a trait reference becomes a kind of
     92abstract type, cannot be directly instantiated but can still be used.
     93
     94One of the limitations of this design is that it does not support double
     95dispatching, which concretely means traits cannot have routines with more than
     96one virtual parameter. The program must have a single table to look up the
     97function on. Using trait references with traits with more than one parameter
     98is also restricted, initially forbidden, see extension.
     99
     100Extension: Multi-parameter Virtual Traits:
     101
     102This implementation can be extended to traits with multiple parameters if
     103one is called out as being the virtual trait. For example :
     104
     105trait iterator(otype T, dtype Item) {
     106        Maybe(Item) next(virtual T *);
     107}
     108
     109iterator(int) generators[10];
     110
     111Which creates a collection of iterators that produce integers, regardless of
     112how those iterators are implemented. This may require a note that this trait
     113is virtual on T and not Item, but noting it on the functions may be enough.
     114
     115
     116Strict Virtual Inheritance:
     117
     118One powerful feature relaxed virtual does not support is the idea of down
     119casting. Once something has been converted into a trait reference there is
     120very little we can do to recover and of the type information, only the trait's
     121required function implementations are kept.
     122
     123To allow down casting strict virtual requires that all traits and structures
     124involved be organized into a tree. Each trait or struct must have a unique
     125position on this tree (no multiple inheritance).
     126
     127This is declared as follows :
     128
     129trait error(otype T) virtual {
     130        const char * msg(T *);
     131}
     132
     133trait io_error(otype T) virtual error {
     134        FILE * src(T *);
     135}
     136
     137struct eof_error virtual io_error {
     138        FILE * fd;
     139};
     140
     141So the trait error is the head of a new tree and io_error is a child of it.
     142
     143Also the parent trait is implicitly part of the assertions of the children,
     144so all children implement the same operations as the parent. By the unique
     145path down the tree, we can also uniquely order them so that a prefix of a
     146child's vtable has the same format as its parent's.
     147
     148This gives us an important extra feature, runtime checking of the parent-child
     149relationship with a C++ dynamic_cast like operation. Allowing checked
     150conversions from trait references to more particular references, which works
     151if the underlying type is, or is a child of, the new trait type.
     152
     153Extension: Multiple Parents
     154
     155Although each trait/struct must have a unique position on each tree, it could
     156have positions on multiple trees. All this requires is the ability to give
     157multiple parents, as here :
     158
     159trait region(otype T) virtual drawable, collider;
     160
     161The restriction being, the parents must come from different trees. This
     162object (and all of its children) can be cast to either tree. This is handled
     163by generating a separate vtable for each tree the structure is in.
     164
     165Extension: Multi-parameter Strict Virtual
     166
     167If a trait has multiple parameters then one must be called out to be the one
     168we generate separate vtables for, as in :
     169
     170trait example(otype T, otype U) virtual(T) ...
     171
     172This can generate a separate vtable for each U for which all the T+U
     173implementations are provided. These are then separate nodes in the tree (or
     174the root of different trees) as if each was created individually. Providing a
     175single unique instance of these nodes would be the most difficult aspect of
     176this extension, possibly intractable, though with sufficient hoisting and
     177link-once duplication it may be possible.
     178
     179Example:
     180
     181trait argument(otype T) virtual {
     182        char short_name(virtual T *);
     183        bool is_set(virtual T *);
     184};
     185
     186trait value_argument(otype T, otype U) virtual(T) argument {
     187        U get_value(virtual T *);
     188};
     189
     190Extension: Structural Inheritance
     191
     192Currently traits must be the internal nodes and structs the leaf nodes.
     193Structs could be made internal nodes as well, in which case the child structs
     194would likely structurally inherit the fields of their parents.
     195
     196
     197Storing the Virtual Lookup Table (vtable):
     198
     199We have so far been silent on how the vtable is created, stored and accessed.
     200
     201Creation happens at compile time. Function pointers are found by using the
     202same best match rules as elsewhere (additional rules for defaults from the
     203parent may or may not be required). For strict virtual this must happen at the
     204global scope and forbidding static functions, to ensure that a single unique
     205vtable is created. Similarly, there may have to be stricter matching rules
     206for the functions that go into the vtable, possibly requiring an exact match.
     207Relaxed virtual could relax both restrictions, if we allow different vtable
     208at different conversion (struct to trait reference) sites. If it is allowed
     209local functions being bound to a vtable could cause issues when they go out
     210of scope, however this should follow the lifetime rules most C programs
     211already follow implicitly.
     212
     213Most vtables should be stored statically, the only exception being some of
     214the relaxed vtables that could have local function pointers. These may be able
     215to be stack allocated. All vtables should be immutable and require no manual
     216cleanup.
     217
     218Access has two main options:
     219
     220The first is through the use of fat pointers, or a tuple of pointers. When the
     221object is converted to a trait reference, the pointers to its vtables are
     222stored along side it.
     223
     224This allows for compatibility with existing structures (such as those imported
     225from C) and is the default storage method unless a different one is given.
     226
     227The other is by inlining the vtable pointer as "intrusive vtables". This adds
     228a field to the structure to the vtable. The trait reference then has a single
     229pointer to this field, the vtable includes an offset to find the beginning of
     230the structure again.
     231
     232This is used if you specify a vtable field in the structure. If given in the
     233trait the vtable pointer in the trait reference can then become a single
     234pointer to the vtable field and use that to recover the original object
     235pointer as well as retrieve all operations.
     236
     237trait drawable(otype T) {
     238        vtable drawable;
     239};
     240
     241struct line {
     242        vtable drawable;
     243        vec2 start;
     244        vec2 end;
     245};
     246
     247This inline code allows trait references to be converted to plain pointers
     248(although they still must be called specially). The vtable field may just be
     249an opaque block of memory or it may allow user access to the vtable. If so
     250then there should be some way to retrieve the type of the vtable, which will be
     251autogenerated and often unique.
     252
     253
     254Keyword Usage:
     255
     256It may be desirable to add fewer new keywords than discussed in this proposal.
     257It is possible that "virtual" could replace both "vtable" above with
     258unambiguous contextual meaning. However, for purposes of clarity in the design
     259discussion it is beneficial to keep the keywords for separate concepts distinct.
     260
     261
     262Trait References and Operations:
     263
     264sizeof(drawable) will return the size of the trait object itself. However :
     265
     266line a_line;
     267drawable widget = a_line;
     268sizeof(widget);
     269
     270Will instead return the sizeof the underlying object, although the trait must
     271require that its implementation is sized for there to be a meaningful value
     272to return. You may also get the size of the trait reference with
     273
     274sizeof(&widget);
     275
     276Calling free on a trait reference will free the memory for the object. It will
     277leave the vtables alone, as those are (always?) statically allocated.
  • doc/refrat/Makefile

    rfd344aa r9236060  
    99SOURCES = ${addsuffix .tex, \
    1010refrat \
     11keywords \
     12operidents \
    1113}
    1214
  • doc/refrat/refrat.tex

    rfd344aa r9236060  
    1111%% Created On       : Wed Apr  6 14:52:25 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Fri Jun  2 10:43:14 2017
    14 %% Update Count     : 83
     13%% Last Modified On : Sun Aug  6 10:25:31 2017
     14%% Update Count     : 105
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
    1717% requires tex packages: texlive-base texlive-latex-base tex-common texlive-humanities texlive-latex-extra texlive-fonts-recommended
    1818
    19 \documentclass[openright,twoside]{report}
     19\documentclass[openright,twoside,11pt]{report}
    2020
    2121%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    3737\usepackage{mathptmx}                                   % better math font with "times"
    3838\usepackage[usenames]{color}
    39 \usepackage[pagewise]{lineno}
    40 \renewcommand{\linenumberfont}{\scriptsize\sffamily}
    41 \input{common}                                          % bespoke macros used in the document
     39\input{common}                                          % common CFA document macros
    4240\usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref}
    4341\usepackage{breakurl}
    4442\renewcommand{\UrlFont}{\small\sf}
    4543
     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 underscore
     50% removes it as a variable-name character so keywords in variables are highlighted. MUST APPEAR
     51% AFTER HYPERREF.
     52\renewcommand{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}}
     53
    4654\setlength{\topmargin}{-0.45in}                                                 % move running title into header
    4755\setlength{\headsep}{0.25in}
     
    5058
    5159\CFAStyle                                                                                               % use default CFA format-style
     60\lstnewenvironment{C++}[1][]                            % use C++ style
     61{\lstset{language=C++,moredelim=**[is][\protect\color{red}]{®}{®}#1}}
     62{}
    5263
    5364% inline code ©...© (copyright symbol) emacs: C-q M-)
     
    8798
    8899\date{
    89 DRAFT \\ \today
     100\today
    90101}% date
    91102
     
    112123
    113124\clearpage
     125\thispagestyle{plain}
    114126\pdfbookmark[1]{Contents}{section}
    115127\tableofcontents
    116128
    117129\clearpage
     130\thispagestyle{plain}
    118131\pagenumbering{arabic}
    119132
     
    417430
    418431\begin{syntax}
    419 \oldlhs{keyword}
    420 \rhs ©forall©
    421 \rhs ©lvalue©
    422 \rhs ©trait©
    423 \rhs ©dtype©
    424 \rhs ©ftype©
    425 \rhs ©otype©
     432\lhs{keyword} one of
     433\rhs \dots
     434\rhs \input{keywords}
    426435\end{syntax}
    427436
     
    469478
    470479\begin{table}[hbt]
    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
     480\centering
     481\input{operidents}
    520482\caption{Operator Identifiers}
    521483\label{opids}
  • doc/rob_thesis/Makefile

    rfd344aa r9236060  
    1 ## Define the appropriate configuration variables.
    2 
    3 TeXLIB = .:../LaTeXmacros:../LaTeXmacros/listings:../LaTeXmacros/enumitem:../bibliography/:
     1TeXLIB = .:../LaTeXmacros:../bibliography/:
    42LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && pdflatex -halt-on-error
    53BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex
    64
    7 ## Define the text source files.
     5all : thesis.pdf
    86
    9 # SOURCES = ${addsuffix .tex, \
    10 # thesis \
    11 # }
     7thesis.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
    1213
    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:
     14clean :
    8415        rm -f *.aux *.bbl *.blg *.lof *.log *.lot *.out *.toc
    8516
    86 splotless: clean
    87         rm -f thesis.pdf
     17spotless : clean
     18        rm -f thesis.pdf thesis.ps
  • doc/rob_thesis/thesis.tex

    rfd344aa r9236060  
    135135    pdfpagelabels=true,     % adds page number as label in Acrobat's page count
    136136    bookmarks=true,         % show bookmarks bar?
    137     unicode=false,          % non-Latin characters in Acrobats bookmarks
    138     pdftoolbar=true,        % show Acrobats toolbar?
    139     pdfmenubar=true,        % show Acrobats 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?
    140140    pdffitwindow=false,     % window fit to page when opened
    141141    pdfstartview={FitH},    % fits the width of the page to the window
  • doc/user/EHMHierarchy.fig

    rfd344aa r9236060  
    1 #FIG 3.2  Produced by xfig version 3.2.5b
     1#FIG 3.2  Produced by xfig version 3.2.5c
    22Landscape
    33Center
     
    19192 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
    2020        1 1 1.00 60.00 90.00
    21          1950 1425 3000 1200
     21         1950 1425 2925 1200
    22222 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
    2323        1 1 1.00 60.00 90.00
     
    2929        1 1 1.00 60.00 90.00
    3030         4950 1950 4950 1725
    31 4 1 0 100 0 0 12 0.0000 0 135 195 1950 1650 IO\001
    32 4 1 0 100 0 0 12 0.0000 0 135 870 4950 1650 Arithmetic\001
    33 4 1 0 100 0 0 12 0.0000 0 135 315 1350 2100 File\001
    34 4 1 0 100 0 0 12 0.0000 0 135 690 2550 2100 Network\001
    35 4 1 0 100 0 0 12 0.0000 0 180 1170 3750 2100 DivideByZero\001
    36 4 1 0 100 0 0 12 0.0000 0 135 750 4950 2100 Overflow\001
    37 4 1 0 100 0 0 12 0.0000 0 135 855 6000 2100 Underflow\001
    38 4 1 0 100 0 0 12 0.0000 0 180 840 3450 1200 Exception\001
     314 1 0 50 -1 0 13 0.0000 2 135 225 1950 1650 IO\001
     324 1 0 50 -1 0 13 0.0000 2 135 915 4950 1650 Arithmetic\001
     334 1 0 50 -1 0 13 0.0000 2 150 330 1350 2100 File\001
     344 1 0 50 -1 0 13 0.0000 2 135 735 2550 2100 Network\001
     354 1 0 50 -1 0 13 0.0000 2 180 1215 3750 2100 DivideByZero\001
     364 1 0 50 -1 0 13 0.0000 2 150 810 4950 2100 Overflow\001
     374 1 0 50 -1 0 13 0.0000 2 150 915 6000 2100 Underflow\001
     384 1 0 50 -1 0 13 0.0000 2 180 855 3450 1200 Exception\001
  • doc/user/Makefile

    rfd344aa r9236060  
    99SOURCES = ${addsuffix .tex, \
    1010user \
     11../refrat/keywords \
     12../refrat/operidents \
    1113}
    1214
  • doc/user/user.tex

    rfd344aa r9236060  
    1111%% Created On       : Wed Apr  6 14:53:29 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Thu Jul 13 11:44:57 2017
    14 %% Update Count     : 2690
     13%% Last Modified On : Sun Aug  6 10:24:21 2017
     14%% Update Count     : 3036
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    3737\usepackage{mathptmx}                                   % better math font with "times"
    3838\usepackage[usenames]{color}
    39 \usepackage[pagewise]{lineno}
    40 \renewcommand{\linenumberfont}{\scriptsize\sffamily}
    4139\input{common}                                          % common CFA document macros
    4240\usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref}
     
    4442\renewcommand{\UrlFont}{\small\sf}
    4543
     44\usepackage[pagewise]{lineno}
     45\renewcommand{\linenumberfont}{\scriptsize\sffamily}
     46\usepackage[firstpage]{draftwatermark}
     47\SetWatermarkLightness{0.9}
     48
    4649% Default underscore is too low and wide. Cannot use lstlisting "literate" as replacing underscore
    4750% removes it as a variable-name character so keywords in variables are highlighted. MUST APPEAR
    4851% AFTER HYPERREF.
    49 \renewcommand{\_}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}}
    5052\renewcommand{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}}
    5153
     
    5658
    5759\CFAStyle                                                                                               % use default CFA format-style
    58 
    59 \lstnewenvironment{C++}[1][]
     60\lstnewenvironment{C++}[1][]                            % use C++ style
    6061{\lstset{language=C++,moredelim=**[is][\protect\color{red}]{®}{®}#1}}
    6162{}
     
    7879\newcommand{\B}[1]{{\Textbf[blue]{#1}}}
    7980\newcommand{\G}[1]{{\Textbf[OliveGreen]{#1}}}
     81\newcommand{\KWC}{K-W C\xspace}
    8082
    8183\newsavebox{\LstBox}
     
    105107
    106108\date{
    107 DRAFT \\ \today
     109\today
    108110}% date
    109111
     
    197199This document is a programmer reference-manual for the \CFA programming language.
    198200The manual covers the core features of the language and runtime-system, with simple examples illustrating syntax and semantics of each feature.
    199 The manual does not teach programming, i.e., how to combine the new constructs to build complex programs.
     201The manual does not teach programming, \ie how to combine the new constructs to build complex programs.
    200202A 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.
    201203Implementers should refer to the \CFA Programming Language Specification for details about the language syntax and semantics.
     
    247249\section{History}
    248250
    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.
     251The \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.
    250252(See~\cite{Werther96} for similar work in \Index*[C++]{\CC{}}.)
    251 The first \CFA implementation of these extensions was by Esteves~\cite{Esteves04}.
    252 
    253 The signature feature of \CFA is \Index{overload}able \Index{parametric-polymorphic} functions~\cite{forceone:impl,Cormack90,Duggan96} with functions generalized using a ©forall© clause (giving the language its name):
     253The first \CFA implementation of these extensions was by \Index*{Rodolfo Esteves}\index{Esteves, Rodolfo}~\cite{Esteves04}.
     254
     255The 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):
    254256\begin{lstlisting}
    255257®forall( otype T )® T identity( T val ) { return val; }
     
    257259\end{lstlisting}
    258260% extending the C type system with parametric polymorphism and overloading, as opposed to the \Index*[C++]{\CC{}} approach of object-oriented extensions.
    259 \CFA{}\hspace{1pt}'s polymorphism was originally formalized by Ditchfiled~\cite{Ditchfield92}, and first implemented by Bilson~\cite{Bilson03}.
     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}.
    260262However, at that time, there was little interesting in extending C, so work did not continue.
    261263As 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.
     
    270272Language developers often state that adequate \Index{library support} takes more work than designing and implementing the language itself.
    271273Fortunately, \CFA, like \Index*[C++]{\CC{}}, starts with immediate access to all exiting C libraries, and in many cases, can easily wrap library routines with simpler and safer interfaces, at very low cost.
    272 Hence, \CFA begins by leveraging the large repository of C libraries at little cost.
     274Hence, \CFA begins by leveraging the large repository of C libraries, and than allows programmers to incrementally augment their C programs with modern \Index{backward-compatible} features.
    273275
    274276\begin{comment}
     
    318320\begin{cfa}
    319321char abs( char );
    320 ®extern "C" {®
    321 int abs( int );                                                 §\C{// use default C routine for int}§
    322 ®}® // extern "C"
     322®extern "C" {® int abs( int ); ®}®              §\C{// use default C routine for int}§
    323323long int abs( long int );
    324324long long int abs( long long int );
     
    335335Hence, there is the same need as in \CC, to know if a name is a C or \CFA name, so it can be correctly formed.
    336336There is no way around this problem, other than C's approach of creating unique names for each pairing of operation and type.
     337
    337338This example strongly illustrates a core idea in \CFA: \emph{the \Index{power of a name}}.
    338339The name ``©abs©'' evokes the notion of absolute value, and many mathematical types provide the notion of absolute value.
     
    343344\section[Compiling a CFA Program]{Compiling a \CFA Program}
    344345
    345 The command ©cfa© is used to compile \CFA program(s), and is based on the GNU \Indexc{gcc} command, \eg:
    346 \begin{cfa}
    347 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA{}§-files [ assembler/loader-files ]
     346The command ©cfa© is used to compile a \CFA program and is based on the \Index{GNU} \Indexc{gcc} command, \eg:
     347\begin{cfa}
     348cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] [ C/§\CFA{}§ source-files ] [ assembler/loader files ]
    348349\end{cfa}
    349350\CFA programs having the following ©gcc© flags turned on:
     
    353354The 1999 C standard plus GNU extensions.
    354355\item
    355 {\lstset{deletekeywords={inline}}
    356 \Indexc{-fgnu89-inline}\index{compilation option!-fgnu89-inline@{©-fgnu89-inline©}}
     356\Indexc[deletekeywords=inline]{-fgnu89-inline}\index{compilation option!-fgnu89-inline@{\lstinline[deletekeywords=inline]$-fgnu89-inline$}}
    357357Use the traditional GNU semantics for inline routines in C99 mode, which allows inline routines in header files.
    358 }%
    359358\end{description}
    360359The following new \CFA options are available:
     
    363362\Indexc{-CFA}\index{compilation option!-CFA@©-CFA©}
    364363Only the C preprocessor and the \CFA translator steps are performed and the transformed program is written to standard output, which makes it possible to examine the code generated by the \CFA translator.
    365 The generated code started with the standard \CFA prelude.
     364The generated code starts with the standard \CFA \Index{prelude}.
    366365
    367366\item
     
    375374\Indexc{-nodebug}\index{compilation option!-nodebug@©-nodebug©}
    376375The program is linked with the non-debugging version of the runtime system, so the execution of the program is faster.
    377 \Emph{However, no runtime checks or ©assert©s are performed so errors usually result in abnormal program termination.}
     376\Emph{However, no runtime checks or ©assert©s are performed so errors usually result in abnormal program behaviour or termination.}
    378377
    379378\item
     
    395394\textbf{This option is the default.}
    396395
     396\begin{comment}
    397397\item
    398398\Indexc{-no-include-stdhdr}\index{compilation option!-no-include-stdhdr@©-no-include-stdhdr©}
    399399Do not supply ©extern "C"© wrappers for \Celeven standard include files (see~\VRef{s:StandardHeaders}).
    400400\textbf{This option is \emph{not} the default.}
     401\end{comment}
    401402\end{description}
    402403
     
    419420\item
    420421\Indexc{__CFA__}\index{preprocessor variables!__CFA__@©__CFA__©},
    421 \Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©} and
     422\Indexc{__CFORALL__}\index{preprocessor variables!__CFORALL__@©__CFORALL__©}, and
    422423\Indexc{__cforall}\index{preprocessor variables!__cforall@©__cforall©}
    423424are always available during preprocessing and have no value.
     
    472473\label{s:BackquoteIdentifiers}
    473474
    474 \CFA introduces in new keywords (see \VRef{s:CFAKeywords}) that can clash with existing C variable-names in legacy code.
     475\CFA introduces several new keywords (see \VRef{s:CFAKeywords}) that can clash with existing C variable-names in legacy code.
    475476Keyword clashes are accommodated by syntactic transformations using the \CFA backquote escape-mechanism:
    476477\begin{cfa}
     
    478479double ®`®forall®`® = 3.5;
    479480\end{cfa}
     481
    480482Existing C programs with keyword clashes can be converted by enclosing keyword identifiers in backquotes, and eventually the identifier name can be changed to a non-keyword name.
    481 \VRef[Figure]{f:InterpositionHeaderFile} shows how clashes in C header files (see~\VRef{s:StandardHeaders}) can be handled using preprocessor \newterm{interposition}: ©#include_next© and ©-I filename©:
     483\VRef[Figure]{f:HeaderFileInterposition} shows how clashes in existing C header-files (see~\VRef{s:StandardHeaders}) can be handled using preprocessor \newterm{interposition}: ©#include_next© and ©-I filename©.
     484Several common C header-files with keyword clashes are fixed in the standard \CFA header-library, so there is a seamless programming-experience.
    482485
    483486\begin{figure}
    484487\begin{cfa}
    485 // include file uses the CFA keyword "otype".
    486 #if ! defined( otype )                  §\C{// nesting ?}§
    487 #define otype ®`®otype®`®               §\C{// make keyword an identifier}§
     488// include file uses the CFA keyword "with".
     489#if ! defined( with )                   §\C{// nesting ?}§
     490#define with ®`®with®`®                 §\C{// make keyword an identifier}§
    488491#define __CFA_BFD_H__
    489 #endif // ! otype
    490 
    491 #®include_next® <bfd.h>                 §\C{// must have internal check for multiple expansion}§
    492 
    493 #if defined( otype ) && defined( __CFA_BFD_H__ )        §\C{// reset only if set}§
    494 #undef otype
     492#endif
     493
     494®#include_next <bfdlink.h>              §\C{// must have internal check for multiple expansion}§
     495®
     496#if defined( with ) && defined( __CFA_BFD_H__ ) §\C{// reset only if set}§
     497#undef with
    495498#undef __CFA_BFD_H__
    496 #endif // otype && __CFA_BFD_H__
    497 \end{cfa}
    498 \caption{Interposition of Header File}
    499 \label{f:InterpositionHeaderFile}
     499#endif
     500\end{cfa}
     501\caption{Header-File Interposition}
     502\label{f:HeaderFileInterposition}
    500503\end{figure}
    501504
     
    505508While C provides ©continue© and ©break© statements for altering control flow, both are restricted to one level of nesting for a particular control structure.
    506509Unfortunately, this restriction forces programmers to use \Indexc{goto} to achieve the equivalent control-flow for more than one level of nesting.
    507 To prevent having to switch to the ©goto©, \CFA extends the \Indexc{continue}\index{continue@\lstinline $continue$!labelled}\index{labelled!continue@©continue©} and \Indexc{break}\index{break@\lstinline $break$!labelled}\index{labelled!break@©break©} with a target label to support static multi-level exit\index{multi-level exit}\index{static multi-level exit}~\cite{Buhr85}.
     510To prevent having to switch to the ©goto©, \CFA extends the \Indexc{continue}\index{continue@\lstinline $continue$!labelled}\index{labelled!continue@©continue©} and \Indexc{break}\index{break@\lstinline $break$!labelled}\index{labelled!break@©break©} with a target label to support static multi-level exit\index{multi-level exit}\index{static multi-level exit}~\cite{Buhr85}, as in Java.
    508511For both ©continue© and ©break©, the target label must be directly associated with a ©for©, ©while© or ©do© statement;
    509512for ©break©, the target label can also be associated with a ©switch©, ©if© or compound (©{}©) statement.
    510 \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©.
    511 The innermost loop has 7 exit points, which cause resumption or termination of one or more of the 7 \Index{nested control-structure}s.
    512 Java supports both labelled ©continue© and ©break© statements.
     513\VRef[Figure]{f:MultiLevelExit} shows ©continue© and ©break© indicating the specific control structure, and the corresponding C program using only ©goto© and labels.
     514The innermost loop has 7 exit points, which cause continuation or termination of one or more of the 7 \Index{nested control-structure}s.
    513515
    514516\begin{figure}
    515 \begin{tabular}{@{\hspace{\parindentlnth}}l@{\hspace{1.5em}}l@{}}
    516 \multicolumn{1}{c@{\hspace{1.5em}}}{\textbf{\CFA}}      & \multicolumn{1}{c}{\textbf{C}}        \\
     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}}      \\
    517519\begin{cfa}
    518520®LC:® {
     
    523525                        ®LF:® for ( ... ) {
    524526                                ®LW:® while ( ... ) {
    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
     527                                        ... break ®LC®; ...
     528                                        ... break ®LS®; ...
     529                                        ... break ®LIF®; ...
     530                                        ... continue ®LF;® ...
     531                                        ... break ®LF®; ...
     532                                        ... continue ®LW®; ...
     533                                        ... break ®LW®; ...
    532534                                } // while
    533535                        } // for
    534536                } else {
    535                         ... break ®LIF®; ...                                     // terminate if
     537                        ... break ®LIF®; ...
    536538                } // if
    537539        } // switch
     
    562564} ®LC:® ;
    563565\end{cfa}
     566&
     567\begin{cfa}
     568
     569
     570
     571
     572
     573
     574
     575// terminate compound
     576// terminate switch
     577// terminate if
     578// continue loop
     579// terminate loop
     580// continue loop
     581// terminate loop
     582
     583
     584
     585// terminate if
     586
     587
     588
     589\end{cfa}
    564590\end{tabular}
    565 \caption{Multi-level Resume/Termination}
    566 \label{f:MultiLevelResumeTermination}
     591\caption{Multi-level Exit}
     592\label{f:MultiLevelExit}
    567593\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 
    618594
    619595Both labelled ©continue© and ©break© are a ©goto©\index{goto@\lstinline $goto$!restricted} restricted in the following ways:
     
    624600\item
    625601They cannot branch into a control structure.
    626 This restriction prevents missing initialization at the start of a control structure resulting in undefined behaviour.
     602This restriction prevents missing declarations and/or initializations at the start of a control structure resulting in undefined behaviour.
    627603\end{itemize}
    628604The advantage of the labelled ©continue©/©break© is allowing static multi-level exits without having to use the ©goto© statement, and tying control flow to the target control structure rather than an arbitrary point in a program.
    629 Furthermore, the location of the label at the \emph{beginning} of the target control structure informs the reader that complex control-flow is occurring in the body of the control structure.
     605Furthermore, the location of the label at the \emph{beginning} of the target control structure informs the reader (\Index{eye candy}) that complex control-flow is occurring in the body of the control structure.
    630606With ©goto©, the label is at the end of the control structure, which fails to convey this important clue early enough to the reader.
    631607Finally, using an explicit target for the transfer instead of an implicit target allows new constructs to be added or removed without affecting existing constructs.
     
    719695The problem with this usage is branching into control structures, which is known to cause both comprehension and technical difficulties.
    720696The comprehension problem occurs from the inability to determine how control reaches a particular point due to the number of branches leading to it.
    721 The technical problem results from the inability to ensure allocation and initialization of variables when blocks are not entered at the beginning.
    722 Often transferring into a block can bypass variable declaration and/or its initialization, which results in subsequent errors.
    723 There are virtually no positive arguments for this kind of control flow, and therefore, there is a strong impetus to eliminate it.
     697The technical problem results from the inability to ensure declaration and initialization of variables when blocks are not entered at the beginning.
     698There are no positive arguments for this kind of control flow, and therefore, there is a strong impetus to eliminate it.
    724699Nevertheless, C does have an idiom where this capability is used, known as ``\Index*{Duff's device}''~\cite{Duff83}:
    725700\begin{cfa}
     
    921896class C {
    922897        int i, j;
    923         int mem() {              ®// implicit "this" parameter
    924                 i = 1;          ®// this->i
    925 ®               j = 3;          ®// this->j
    926 ®       }
     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        }
    927902}
    928903\end{C++}
    929904Since CFA is non-object-oriented, the equivalent object-oriented program looks like:
    930905\begin{cfa}
    931 struct C {
    932         int i, j;
    933 };
    934 int mem( C &this ) {    // explicit "this" parameter
    935         ®this.®i = 1;                     // "this" is not elided
     906struct S { int i, j; };
     907int mem( S &®this® ) {                  §\C{// explicit "this" parameter}§
     908        ®this.®i = 1;                           §\C{// "this" is not elided}§
    936909        ®this.®j = 2;
    937910}
    938911\end{cfa}
    939912but it is cumbersome having to write "©this.©" many times in a member.
    940 \CFA provides a ©with© clause/statement to elided the "©this.©".
    941 \begin{cfa}
    942 int mem( C &this ) ®with this® {
    943         i = 1;                  ®// this.i
    944 ®       j = 2;                  ®// this.j
    945 ®}
     913
     914\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\begin{cfa}
     916int 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}
    946920\end{cfa}
    947921which extends to multiple routine parameters:
    948922\begin{cfa}
    949 struct D {
    950         double m, n;
    951 };
    952 int mem2( C &this1, D &this2 ) ®with this1, this2® {
     923struct T { double m, n; };
     924int mem2( S &this1, T &this2 ) ®with this1, this2® {
    953925        i = 1; j = 2;
    954926        m = 1.0; n = 2.0;
    955927}
    956928\end{cfa}
    957 The ©with© clause/statement comes from Pascal~\cite[\S~4.F]{Pascal}.
    958929
    959930The statement form is used within a block:
     
    962933        struct S1 { ... } s1;
    963934        struct S2 { ... } s2;
    964         ®with s1® {
     935        ®with s1® {                     // with statement
    965936                // access fields of s1 without qualification
    966937                ®with s2® {  // nesting
    967                         // access fields of s2 without qualification
     938                        // access fields of s1 and s2 without qualification
    968939                }
    969940        }
     
    974945\end{cfa}
    975946
    976 Names clashes when opening multiple structures are ambiguous.
    977 \begin{cfa}
    978 struct A { int i; int j; } a, c;
    979 struct B { int i; int k; } b, c;
     947When opening multiple structures, fields with the same name and type are ambiguous and must be fully qualified.
     948For fields with the same name but different type, context/cast can be used to disambiguate.
     949\begin{cfa}
     950struct S { int i; int j; double m; } a, c;
     951struct T { int i; int k; int m } b, c;
    980952®with a, b® {
    981         j + k;                                          §\C{// unambiguous}§
    982         i;                                                      §\C{// ambiguous}§
    983         a.i + b.i;                                      §\C{// unambiguous}§
    984 }
    985 ®with c® {                                              §\C{// ambiguous}§
    986         // ...
    987 }
     953        j + k;                                          §\C{// unambiguous, unique names define unique types}§
     954        i;                                                      §\C{// ambiguous, same name and type}§
     955        a.i + b.i;                                      §\C{// unambiguous, qualification defines unique names}§
     956        m;                                                      §\C{// ambiguous, same name and no context to define unique type}§
     957        m = 5.0;                                        §\C{// unambiguous, same name and context defines unique type}§
     958        m = 1;                                          §\C{// unambiguous, same name and context defines unique type}§
     959}
     960®with c® { ... }                                §\C{// ambiguous, same name and no context}§
     961®with (S)c® { ... }                             §\C{// unambiguous, same name and cast defines unique type}§
    988962\end{cfa}
    989963
    990964
    991965\section{Exception Handling}
     966\label{s:ExceptionHandling}
    992967
    993968Exception handling provides two mechanism: change of control flow from a raise to a handler, and communication from the raise to the handler.
    994 \begin{cfa}
    995 exception void h( int i );
    996 exception int h( int i, double d );
    997 
     969Transfer of control can be local, within a routine, or non-local, among routines.
     970Non-local transfer can cause stack unwinding, \ie non-local routine termination, depending on the kind of raise.
     971\begin{cfa}
     972exception_t E {};                               §\C{// exception type}§
    998973void f(...) {
    999         ... throw h( 3 );
    1000         ... i = resume h( 3, 5.1 );
    1001 }
    1002 
     974        ... throw E{}; ...                      §\C{// termination}§
     975        ... throwResume E{}; ...        §\C{// resumption}§
     976}
    1003977try {
    1004978        f(...);
    1005 } catch h( int w ) {
    1006         // reset
    1007 } resume h( int p, double x ) {
    1008         return 17;  // recover
     979} catch( E e : §boolean-predicate§ ) {                  §\C[8cm]{// termination handler}§
     980        // recover and continue
     981} catchResume( E e : §boolean-predicate§ ) {    §\C{// resumption handler}\CRT§
     982        // repair and return
    1009983} finally {
    1010 }
    1011 \end{cfa}
    1012 So the type raised would be the mangled name of the exception prototype and that name would be matched at the handler clauses by comparing the strings.
    1013 The arguments for the call would have to be packed in a message and unpacked at handler clause and then a call made to the handler.
     984        // always executed
     985}
     986\end{cfa}
     987The kind of raise and handler match: ©throw© with ©catch© and ©throwResume© with ©catchResume©.
     988Then the exception type must match along with any additonal predicate must be true.
     989The ©catch© and ©catchResume© handlers may appear in any oder.
     990However, the ©finally© clause must appear at the end of the ©try© statement.
    1014991
    1015992
     
    12221199
    12231200
     1201\section{Exponentiation Operator}
     1202
     1203C, \CC, and Java (and many other programming languages) have no exponentiation operator\index{exponentiation!operator}\index{operator!exponentiation}, \ie $x^y$, and instead use a routine, like \Indexc{pow}, to perform the exponentiation operation.
     1204\CFA extends the basic operators with the exponentiation operator ©?\?©\index{?\\?@\lstinline$?\?$} and ©?\=?©\index{?\\=?@\lstinline$?\=?$}, as in, ©x \ y© and ©x \= y©, which means $x^y$ and $x \leftarrow x^y$.
     1205The priority of the exponentiation operator is between the cast and multiplicative operators, so that ©w * (int)x \ (int)y * z© is parenthesized as ©((w * (((int)x) \ ((int)y))) * z)©.
     1206
     1207As for \Index{division}, there are exponentiation operators for integral and floating-point types, including the builtin \Index{complex} types.
     1208Unsigned 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).
     1209Signed 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$.
     1210Hence, 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.
     1211Floating-point exponentiation\index{exponentiation!floating point} is performed using \Index{logarithm}s\index{exponentiation!logarithm}, so the base cannot be negative.
     1212\begin{cfa}
     1213sout | 2 ®\® 8u | 4 ®\® 3u | -4 ®\® 3u | 4 ®\® -3 | -4 ®\® -3 | 4.0 ®\® 2.1 | (1.0f+2.0fi) ®\® (3.0f+2.0fi) | endl;
     1214256 64 -64 0.015625 -0.015625 18.3791736799526 0.264715-1.1922i
     1215\end{cfa}
     1216Parenthesis are necessary for the complex constants or the expresion is parsed as ©1.0f+(2.0fi \ 3.0f)+2.0fi©.
     1217The exponentiation operator is available for all the basic types, but for user-defined types, only the integral-computation versions are available.
     1218For returning an integral value, the user type ©T© must define multiplication, ©*©, and one, ©1©;
     1219for returning a floating-point value, an additional divide of type ©T© into a ©double© returning a ©double© (©double ?/?( double, T )©) is necessary for negative exponents.
     1220
     1221
    12241222\section{Pointer / Reference}
    12251223
     
    12301228An integer constant expression with the value 0, or such an expression cast to type ©void *©, is called a \newterm{null-pointer constant}.\footnote{
    12311229One way to conceptualize the null pointer is that no variable is placed at this address, so the null-pointer address can be used to denote an uninitialized pointer/reference object;
    1232 \ie the null pointer is guaranteed to compare unequal to a pointer to any object or routine.}
     1230\ie the null pointer is guaranteed to compare unequal to a pointer to any object or routine.
     1231In general, a value with special meaning among a set of values is called a \emph{\Index{sentinel value}}, \eg ©-1© as a return code value.}
    12331232An address is \newterm{sound}, if it points to a valid memory location in scope, \ie within the program's execution-environment and has not been freed.
    12341233Dereferencing an \newterm{unsound} address, including the null pointer, is \Index{undefined}, often resulting in a \Index{memory fault}.
     
    12651264\hline
    12661265\begin{cfa}
    1267 lda             r1,100                  // load address of x
    1268 ld               r2,(r1)                  // load value of x
    1269 lda             r3,104                  // load address of y
    1270 st               r2,(r3)                  // store x into y
     1266lda             r1,100  // load address of x
     1267ld               r2,(r1)          // load value of x
     1268lda             r3,104  // load address of y
     1269st               r2,(r3)          // store x into y
    12711270\end{cfa}
    12721271&
    12731272\begin{cfa}
    12741273
    1275 ld              r2,(100)                // load value of x
    1276 
    1277 st              r2,(104)                // store x into y
     1274ld              r2,(100)        // load value of x
     1275
     1276st              r2,(104)        // store x into y
    12781277\end{cfa}
    12791278\end{tabular}
     
    14231422int w, x, y, z, & ar[3] = { x, y, z }; §\C{// initialize array of references}§
    14241423&ar[1] = &w;                                            §\C{// change reference array element}§
    1425 typeof( ar[1] ) p;                                      §\C{// (gcc) is int, i.e., the type of referenced object}§
    1426 typeof( &ar[1] ) q;                                     §\C{// (gcc) is int \&, i.e., the type of reference}§
    1427 sizeof( ar[1] ) == sizeof( int );       §\C{// is true, i.e., the size of referenced object}§
    1428 sizeof( &ar[1] ) == sizeof( int *)      §\C{// is true, i.e., the size of a reference}§
     1424typeof( ar[1] ) p;                                      §\C{// (gcc) is int, \ie the type of referenced object}§
     1425typeof( &ar[1] ) q;                                     §\C{// (gcc) is int \&, \ie the type of reference}§
     1426sizeof( ar[1] ) == sizeof( int );       §\C{// is true, \ie the size of referenced object}§
     1427sizeof( &ar[1] ) == sizeof( int *)      §\C{// is true, \ie the size of a reference}§
    14291428\end{cfa}
    14301429
     
    15711570
    15721571\item
    1573 lvalue to reference conversion: \lstinline[deletekeywords={lvalue}]@lvalue-type cv1 T@ converts to ©cv2 T &©, which allows implicitly converting variables to references.
     1572lvalue to reference conversion: \lstinline[deletekeywords=lvalue]$lvalue-type cv1 T$ converts to ©cv2 T &©, which allows implicitly converting variables to references.
    15741573\begin{cfa}
    15751574int x, &r = ®x®, f( int & p ); // lvalue variable (int) convert to reference (int &)
     
    17651764
    17661765In 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{
    1767 \Index*{Michael Tiemann}, with help from \Index*{Doug Lea}, provided named return values in g++, circa 1989.}
     1766\Index*{Michael Tiemann}\index{Tiemann, Michael}, with help from \Index*{Doug Lea}\index{Lea, Doug}, provided named return values in g++, circa 1989.}
    17681767The value of each local return variable is automatically returned at routine termination.
    17691768Declaration qualifiers can only appear at the start of a routine definition, \eg:
     
    22242223
    22252224
     2225\section{Tuple}
     2226
     2227In C and \CFA, lists of elements appear in several contexts, such as the parameter list of a routine call.
     2228\begin{cfa}
     2229f( ®2, x, 3 + i® );                             §\C{// element list}§
     2230\end{cfa}
     2231A 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
     2237In standard C, functions can return at most one value.
     2238To emulate functions with multiple return values, \emph{\Index{aggregation}} and/or \emph{\Index{aliasing}} is used.
     2239In the former situation, the function designer creates a record type that combines all of the return values into a single type.
     2240For example, consider a function returning the most frequently occurring letter in a string, and its frequency.
     2241This 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}
     2243struct mf_ret {
     2244        int freq;
     2245        char ch;
     2246};
     2247
     2248struct 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 letters
     2253                        int ch = tolower(str[i]);   // convert to lower case
     2254                        int idx = ch-'a';
     2255                        if (++freqs[idx] > ret.freq) {  // update on new max
     2256                          ret.freq = freqs[idx];
     2257                          ret.ch = ch;
     2258                        }
     2259                }
     2260        }
     2261        return ret;
     2262}
     2263
     2264const char * str = "hello world";
     2265struct mf_ret ret = most_frequent(str);
     2266printf("%s -- %d %c\n", str, ret.freq, ret.ch);
     2267\end{cfa}
     2268Of note, the designer must come up with a name for the return type and for each of its fields.
     2269Unnecessary naming is a common programming language issue, introducing verbosity and a complication of the user's mental model.
     2270That 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.
     2271As 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
     2273In the latter approach, the designer simulates multiple return values by passing the additional return values as pointer parameters.
     2274The pointer parameters are assigned inside of the routine body to emulate a return.
     2275Using the same example,
     2276\begin{cfa}
     2277int 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 letters
     2282                        int ch = tolower(str[i]);   // convert to lower case
     2283                        int idx = ch-'a';
     2284                        if (++freqs[idx] > ret_freq) {  // update on new max
     2285                          ret_freq = freqs[idx];
     2286                          *ret_ch = ch;   // assign to out parameter
     2287                        }
     2288                }
     2289        }
     2290        return ret_freq;  // only one value returned directly
     2291}
     2292
     2293const char * str = "hello world";
     2294char ch;                            // pre-allocate return value
     2295int freq = most_frequent(str, &ch); // pass return value as out parameter
     2296printf("%s -- %d %c\n", str, freq, ch);
     2297\end{cfa}
     2298Notably, 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.
     2299Also, 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.
     2300Furthermore, 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.
     2301On 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.
     2302Interestingly, 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.
     2303In 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.
     2304Still, 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.
     2305As with the previous approach, this technique can simulate multiple return values, but in practice it is verbose and error prone.
     2306
     2307In \CFA, functions can be declared to return multiple values with an extension to the function declaration syntax.
     2308Multiple 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.
     2309The ability to return multiple values from a function requires a new syntax for the return statement.
     2310For consistency, the return statement in \CFA accepts a comma-separated list of expressions in square brackets.
     2311The 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.
     2312A multiple-returning function with return type ©T© can return any expression that is implicitly convertible to ©T©.
     2313Using 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 results
     2319        for (int i = 0; str[i] != '\0'; ++i) {
     2320                if (isalpha(str[i])) {        // only count letters
     2321                        int ch = tolower(str[i]);   // convert to lower case
     2322                        int idx = ch-'a';
     2323                        if (++freqs[idx] > ret_freq) {  // update on new max
     2324                          ret_freq = freqs[idx];
     2325                          ret_ch = ch;
     2326                        }
     2327                }
     2328        }
     2329        return [ret_freq, ret_ch];
     2330}
     2331\end{cfa}
     2332This 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
     2334The addition of multiple-return-value functions necessitates a syntax for accepting multiple values at the call-site.
     2335The simplest mechanism for retaining a return value in C is variable assignment.
     2336By assigning the return value into a variable, its value can be retrieved later at any point in the program.
     2337As 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}
     2339const char * str = "hello world";
     2340int freq;
     2341char ch;
     2342[freq, ch] = most_frequent(str);  // assign into multiple variables
     2343printf("%s -- %d %c\n", str, freq, ch);
     2344\end{cfa}
     2345It 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.
     2347When 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}.
     2348For example,
     2349\begin{cfa}
     2350void process(int);       // (1)
     2351void process(char);      // (2)
     2352void process(int, char); // (3)
     2353void process(char, int); // (4)
     2354
     2355process(most_frequent("hello world"));  // selects (3)
     2356\end{cfa}
     2357In this case, there is only one option for a function named ©most_frequent© that takes a string as input.
     2358This function returns two values, one ©int© and one ©char©.
     2359There 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.
     2360This 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}
     2363Multiple-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.
     2364These notions can be generalized to provide \CFA with \emph{tuple expressions} and \emph{tuple types}.
     2365A tuple expression is an expression producing a fixed-size, ordered list of values of heterogeneous types.
     2366The type of a tuple expression is the tuple of the subexpression types, or a \emph{tuple type}.
     2367In \CFA, a tuple expression is denoted by a comma-separated list of expressions enclosed in square brackets.
     2368For example, the expression ©[5, 'x', 10.5]© has type ©[int, char, double]©.
     2369The previous expression has 3 \emph{components}.
     2370Each component in a tuple expression can be any \CFA expression, including another tuple expression.
     2371The order of evaluation of the components in a tuple expression is unspecified, to allow a compiler the greatest flexibility for program optimization.
     2372It is, however, guaranteed that each component of a tuple expression is evaluated for side-effects, even if the result is not used.
     2373Multiple-return-value functions can equivalently be called \emph{tuple-returning functions}.
     2374
     2375\subsection{Tuple Variables}
     2376The 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.
     2377In \CFA, it is possible to overcome this restriction by declaring a \emph{tuple variable}.
     2378\begin{cfa}[emph=ret, emphstyle=\color{red}]
     2379const char * str = "hello world";
     2380[int, char] ret = most_frequent(str);  // initialize tuple variable
     2381printf("%s -- %d %c\n", str, ret);
     2382\end{cfa}
     2383It 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.
     2384These variables can be used in any of the contexts where a tuple expression is allowed, such as in the ©printf© function call.
     2385As in the ©process© example, the components of the tuple value are passed as separate parameters to ©printf©, allowing very simple printing of tuple expressions.
     2386One way to access the individual components is with a simple assignment, as in previous examples.
     2387\begin{cfa}
     2388int freq;
     2389char ch;
     2390[freq, ch] = ret;
     2391\end{cfa}
     2392
     2393\begin{sloppypar}
     2394In addition to variables of tuple type, it is also possible to have pointers to tuples, and arrays of tuples.
     2395Tuple 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] * pdi
     2399[double, int] adi[10];
     2400\end{cfa}
     2401This 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
     2406At times, it is desirable to access a single component of a tuple-valued expression without creating unnecessary temporary variables to assign to.
     2407Given 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©.
     2408For example,
     2409\begin{cfa}
     2410[int, double] x;
     2411[char *, int] f();
     2412void g(double, int);
     2413[int, double] * p;
     2414
     2415int y = x.0;                                                    §\C{// access int component of x}§
     2416y = f().1;                                                              §\C{// access int component of f}§
     2417p->0 = 5;                                                               §\C{// access int component of tuple pointed-to by p}§
     2418g( x.1, x.0 );                                                  §\C{// rearrange x to pass to g}§
     2419double z = [x, f()].0.1;                                §\C{// access second component of first component of tuple expression}§
     2420\end{cfa}
     2421As 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.
     2422This feature was proposed for \KWC but never implemented \cite[p.~45]{Till89}.
     2423
     2424\subsection{Flattening and Structuring}
     2425As evident in previous examples, tuples in \CFA do not have a rigid structure.
     2426In function call contexts, tuples support implicit flattening and restructuring conversions.
     2427Tuple flattening recursively expands a tuple into the list of its basic components.
     2428Tuple structuring packages a list of expressions into a value of tuple type.
     2429\begin{cfa}
     2430int f(int, int);
     2431int g([int, int]);
     2432int h(int, [int, int]);
     2433[int, int] x;
     2434int y;
     2435
     2436f(x);      // flatten
     2437g(y, 10);  // structure
     2438h(x, y);   // flatten & structure
     2439\end{cfa}
     2440In \CFA, each of these calls is valid.
     2441In the call to ©f©, ©x© is implicitly flattened so that the components of ©x© are passed as the two arguments to ©f©.
     2442For 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©.
     2443Finally, 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]©.
     2444The 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
     2446In \KWC \cite{Buhr94a,Till89}, there were 4 tuple coercions: opening, closing, flattening, and structuring.
     2447Opening coerces a tuple value into a tuple of values, while closing converts a tuple of values into a single tuple value.
     2448Flattening 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.
     2449Structuring moves in the opposite direction, \ie it takes a flat tuple value and provides structure by introducing nested tuple components.
     2450
     2451In \CFA, the design has been simplified to require only the two conversions previously described, which trigger only in function call and return situations.
     2452This simplification is a primary contribution of this thesis to the design of tuples in \CFA.
     2453Specifically, the expression resolution algorithm examines all of the possible alternatives for an expression to determine the best match.
     2454In resolving a function call expression, each combination of function value and list of argument alternatives is examined.
     2455Given a particular argument list and function value, the list of argument alternatives is flattened to produce a list of non-tuple valued expressions.
     2456Then the flattened list of expressions is compared with each value in the function's parameter list.
     2457If 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.
     2458If 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.
     2459Assuming 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.
     2460For example, in
     2461\begin{cfa}
     2462int f(int, [double, int]);
     2463f([5, 10.2], 4);
     2464\end{cfa}
     2465There is only a single definition of ©f©, and 3 arguments with only single interpretations.
     2466First, the argument alternative list ©[5, 10.2], 4© is flattened to produce the argument list ©5, 10.2, 4©.
     2467Next, the parameter matching algorithm begins, with $P = $©int© and $A = $©int©, which unifies exactly.
     2468Moving to the next parameter and argument, $P = $©[double, int]© and $A = $©double©.
     2469This time, the parameter is a tuple type, so the algorithm applies recursively with $P' = $©double© and $A = $©double©, which unifies exactly.
     2470Then $P' = $©int© and $A = $©double©, which again unifies exactly.
     2471At this point, the end of $P'$ has been reached, so the arguments ©10.2, 4© are structured into the tuple expression ©[10.2, 4]©.
     2472Finally, 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}
     2476An assignment where the left side of the assignment operator has a tuple type is called tuple assignment.
     2477There 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}
     2479int x;
     2480double y;
     2481[int, double] z;
     2482[y, x] = 3.14;  // mass assignment
     2483[x, y] = z;     // multiple assignment
     2484z = 10;         // mass assignment
     2485z = [x, y];     // multiple assignment
     2486\end{cfa}
     2487Let $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
     2489For a multiple assignment to be valid, both tuples must have the same number of elements when flattened.
     2490For 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 != 2
     2494\end{cfa}
     2495Multiple assignment assigns $R_i$ to $L_i$ for each $i$.
     2496That is, ©?=?(&$L_i$, $R_i$)© must be a well-typed expression.
     2497In 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
     2499A mass assignment assigns the value $R$ to each $L_i$.
     2500For a mass assignment to be valid, ©?=?(&$L_i$, $R$)© must be a well-typed expression.
     2501These 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.
     2502For 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©.
     2503On 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
     2505Both 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.
     2506As 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}
     2508int x = 10, y = 20;
     2509[x, y] = [y, x];
     2510\end{cfa}
     2511After executing this code, ©x© has the value ©20© and ©y© has the value ©10©.
     2512
     2513In \CFA, tuple assignment is an expression where the result type is the type of the left side of the assignment, as in normal assignment.
     2514That is, a tuple assignment produces the value of the left-hand side after assignment.
     2515These semantics allow cascading tuple assignment to work out naturally in any context where a tuple is permitted.
     2516These 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.
     2517Restricting 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.
     2518While 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.
     2519Furthermore, 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.
     2520In 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.
     2521In addition, \KWC permits the compiler to optimize tuple assignment as a block copy, since it does not support user-defined assignment operators.
     2522This optimization could be implemented in \CFA, but it requires the compiler to verify that the selected assignment operator is trivial.
     2523
     2524The following example shows multiple, mass, and cascading assignment used in one expression
     2525\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 list
     2530\end{cfa}
     2531The 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.
     2532That 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]©.
     2533Finally, the tuple ©[1, 1]© is used as an expression in the call to ©f©.
     2534
     2535\subsection{Tuple Construction}
     2536Tuple 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.
     2537As 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}
     2539struct S;
     2540void ?{}(S *);         // (1)
     2541void ?{}(S *, int);    // (2)
     2542void ?{}(S * double);  // (3)
     2543void ?{}(S *, S);      // (4)
     2544
     2545[S, S] x = [3, 6.28];  // uses (2), (3), specialized constructors
     2546[S, S] y;              // uses (1), (1), default constructor
     2547[S, S] z = x.0;        // uses (4), (4), copy constructor
     2548\end{cfa}
     2549In 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)©.
     2551Finally, ©x©, ©y©, and ©z© are destructed, \ie the calls ©^?{}(&x.0)©, ©^?{}(&x.1)©, ©^?{}(&y.0)©, ©^?{}(&y.1)©, ©^?{}(&z.0)©, and ©^?{}(&z.1)©.
     2552
     2553It 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.
     2554For 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}
     2556struct S { int x; double y; };
     2557void ?{}([int, double] * this, S s) {
     2558        this->0 = s.x;
     2559        this->1 = s.y;
     2560}
     2561\end{cfa}
     2562Due 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.
     2563For example,
     2564\begin{cfa}
     2565struct S { int x; double y; int z };
     2566[int, double] t;
     2567S s = t;
     2568\end{cfa}
     2569The 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}
     2573It is possible to access multiple fields from a single expression using a \emph{Member-Access Tuple Expression}.
     2574The result is a single tuple-valued expression whose type is the tuple of the types of the members.
     2575For example,
     2576\begin{cfa}
     2577struct S { int x; double y; char * z; } s;
     2578s.[x, y, z];
     2579\end{cfa}
     2580Here, the type of ©s.[x, y, z]© is ©[int, double, char *]©.
     2581A 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.
     2582Then the type of ©a.[x, y, z]© is ©[T_x, T_y, T_z]©.
     2583
     2584Since 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;
     2587void f(double, long);
     2588
     2589f(x.[0, 3]);          // f(x.0, x.3)
     2590x.[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
     2594It is possible for a member tuple expression to contain other member access expressions.
     2595For example,
     2596\begin{cfa}
     2597struct A { double i; int j; };
     2598struct B { int * k; short l; };
     2599struct C { int x; A y; B z; } v;
     2600v.[x, y.[i, j], z.k];
     2601\end{cfa}
     2602This expression is equivalent to ©[v.x, [v.y.i, v.y.j], v.z.k]©.
     2603That is, the aggregate expression is effectively distributed across the tuple, which allows simple and easy access to multiple components in an aggregate, without repetition.
     2604It is guaranteed that the aggregate expression to the left of the ©.© in a member tuple expression is evaluated exactly once.
     2605As 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
     2611In \KWC, member tuple expressions are known as \emph{record field tuples} \cite{Till89}.
     2612Since \CFA permits these tuple-access expressions using structures, unions, and tuples, \emph{member tuple expression} or \emph{field tuple expression} is more appropriate.
     2613
     2614It is possible to extend member-access expressions further.
     2615Currently, 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.
     2616In the interest of orthogonal design, \CFA could apply some meaning to the remaining combinations as well.
     2617For example,
     2618\begin{cfa}
     2619struct S { int x, y; } s;
     2620[S, S] z;
     2621
     2622s.x;  // access member
     2623z.0;  // access component
     2624
     2625s.1;  // ???
     2626z.y;  // ???
     2627\end{cfa}
     2628One possibility is for ©s.1© to select the second member of ©s©.
     2629Under this interpretation, it becomes possible to not only access members of a struct by name, but also by position.
     2630Likewise, it seems natural to open this mechanism to enumerations as well, wherein the left side would be a type, rather than an expression.
     2631One benefit of this interpretation is familiarity, since it is extremely reminiscent of tuple-index expressions.
     2632On 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.
     2633This 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
     2635As for ©z.y©, one interpretation is to extend the meaning of member tuple expressions.
     2636That is, currently the tuple must occur as the member, \ie to the right of the dot.
     2637Allowing 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.
     2638In 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©.
     2639It 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.
     2640Perhaps 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.
     2641The 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
     2643Supposing 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}
     2645struct { int x, y; };
     2646[S, S] z;
     2647z.[x, y];  // ???
     2648// => [z.0, z.1].[x, y]
     2649// => [z.0.x, z.0.y, z.1.x, z.1.y]
     2650// or
     2651// => [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}
     2655Depending on exactly how the two tuples are combined, different results can be achieved.
     2656As such, a specific ordering would need to be imposed to make this feature useful.
     2657Furthermore, 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
     2659A second possibility is for \CFA to have named tuples, as they exist in Swift and D.
     2660\begin{cfa}
     2661typedef [int x, int y] Point2D;
     2662Point2D p1, p2;
     2663p1.x + p1.y + p2.x + p2.y;
     2664p1.0 + p1.1 + p2.0 + p2.1;  // equivalent
     2665\end{cfa}
     2666In this simpler interpretation, a tuple type carries with it a list of possibly empty identifiers.
     2667This approach fits naturally with the named return-value feature, and would likely go a long way towards implementing it.
     2668
     2669Ultimately, the first two extensions introduce complexity into the model, with relatively little perceived benefit, and so were dropped from consideration.
     2670Named tuples are a potentially useful addition to the language, provided they can be parsed with a reasonable syntax.
     2671
     2672
     2673\section{Casting}
     2674In C, the cast operator is used to explicitly convert between types.
     2675In \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.
     2676That 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}
     2678int f();     // (1)
     2679double f();  // (2)
     2680
     2681f();       // ambiguous - (1),(2) both equally viable
     2682(int)f();  // choose (2)
     2683\end{cfa}
     2684Since casting is a fundamental operation in \CFA, casts need to be given a meaningful interpretation in the context of tuples.
     2685Taking a look at standard C provides some guidance with respect to the way casts should work with tuples.
     2686\begin{cfa}[numbers=left]
     2687int f();
     2688void g();
     2689
     2690(void)f();  // valid, ignore results
     2691(int)g();   // invalid, void cannot be converted to int
     2692
     2693struct A { int x; };
     2694(struct A)f();  // invalid, int cannot be converted to A
     2695\end{cfa}
     2696In C, line 4 is a valid cast, which calls ©f© and discards its result.
     2697On the other hand, line 5 is invalid, because ©g© does not produce a result, so requesting an ©int© to materialize from nothing is nonsensical.
     2698Finally, line 8 is also invalid, because in C casts only provide conversion between scalar types \cite[p.~91]{C11}.
     2699For 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
     2701Formally, 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$.
     2702Excess 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.
     2703This discarding naturally follows the way that a cast to void works in C.
     2704
     2705For example,
     2706\begin{cfa}
     2707        [int, int, int] f();
     2708        [int, [int, int], int] g();
     2709
     2710        ([int, double])f();           // (1) valid
     2711        ([int, int, int])g();         // (2) valid
     2712        ([void, [int, int]])g();      // (3) valid
     2713        ([int, int, int, int])g();    // (4) invalid
     2714        ([int, [int, int, int]])g();  // (5) invalid
     2715\end{cfa}
     2716
     2717(1) discards the last element of the return value and converts the second element to type double.
     2718Since ©int© is effectively a 1-element tuple, (2) discards the second component of the second element of the return value of ©g©.
     2719If ©g© is free of side effects, this is equivalent to ©[(int)(g().0), (int)(g().1.0), (int)(g().2)]©.
     2720Since ©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).
     2722Note that a cast is not a function call in \CFA, so flattening and structuring conversions do not occur for cast expressions.
     2723As such, (4) is invalid because the cast target type contains 4 components, while the source type contains only 3.
     2724Similarly, (5) is invalid because the cast ©([int, int, int])(g().1)© is invalid.
     2725That is, it is invalid to cast ©[int, int]© to ©[int, int, int]©.
     2726
     2727\section{Polymorphism}
     2728Due to the implicit flattening and structuring conversions involved in argument passing, ©otype© and ©dtype© parameters are restricted to matching only with non-tuple types.
     2729The 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}
     2731forall(otype T, dtype U)
     2732void f(T x, U * y);
     2733
     2734f([5, "hello"]);
     2735\end{cfa}
     2736In this example, ©[5, "hello"]© is flattened, so that the argument list appears as ©5, "hello"©.
     2737The argument matching algorithm binds ©T© to ©int© and ©U© to ©const char©, and calls the function as normal.
     2738
     2739Tuples can contain otype and dtype components.
     2740For example, a plus operator can be written to add two triples of a type together.
     2741\begin{cfa}
     2742forall(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;
     2747int i1, i2, i3;
     2748[i1, i2, i3] = x + ([10, 20, 30]);
     2749\end{cfa}
     2750Note that due to the implicit tuple conversions, this function is not restricted to the addition of two triples.
     2751A 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©.
     2752For 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])
     2755x.0 + ([x.1, x.2, 10, 20, 30]);      // x + ([10, 20, 30])
     2756\end{cfa}
     2757This presents a potential problem if structure is important, as these three expressions look like they should have different meanings.
     2758Furthermore, these calls can be made ambiguous by introducing seemingly different functions.
     2759\begin{cfa}
     2760forall(otype T | { T ?+?(T, T); })
     2761[T, T, T] ?+?([T, T] x, [T, T, T, T]);
     2762forall(otype T | { T ?+?(T, T); })
     2763[T, T, T] ?+?(T x, [T, T, T, T, T]);
     2764\end{cfa}
     2765It 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.
     2766Still, these semantics are a deficiency of the current argument matching algorithm, and depending on the function, differing return values may not always be appropriate.
     2767These 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.
     2768Care would be needed in this case to ensure that exact matches do not incur such a cost.
     2769\begin{cfa}
     2770void f([int, int], int, int);
     2771
     2772f([0, 0], 0, 0);    // no cost
     2773f(0, 0, 0, 0);      // cost for structuring
     2774f([0, 0,], [0, 0]); // cost for flattening
     2775f([0, 0, 0], 0);    // cost for flattening and structuring
     2776\end{cfa}
     2777
     2778Until 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).
     2779This decision presents a conflict with the flexibility of tuples.
     2780\subsection{Assertion Inference}
     2781\begin{cfa}
     2782int f([int, double], double);
     2783forall(otype T, otype U | { T f(T, U, U); })
     2784void g(T, U);
     2785g(5, 10.21);
     2786\end{cfa}
     2787If 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.
     2788Since tuples are fluid, this requirement reduces the usability of tuples in polymorphic code.
     2789To 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
     2791This relaxation is made possible by extending the existing thunk generation scheme, as described by Bilson \cite{Bilson03}.
     2792Now, 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}
     2794int _thunk(int _p0, double _p1, double _p2) {
     2795        return f([_p0, _p1], _p2);
     2796}
     2797\end{cfa}
     2798Essentially, this provides flattening and structuring conversions to inferred functions, improving the compatibility of tuples and polymorphism.
     2799
     2800
    22262801\section{Tuples}
    22272802
     
    26803255\begin{cfa}[belowskip=0pt]
    26813256char store[®sepSize®];                                          §\C{// sepSize is the maximum separator size}§
    2682 strcpy( store, sepGet( sout ) );
    2683 sepSet( sout, "_" );
     3257strcpy( store, sepGet( sout ) );                          §\C{// copy current separator}§
     3258sepSet( sout, "_" );                                            §\C{// change separator to underscore}§
    26843259sout | 1 | 2 | 3 | endl;
    26853260\end{cfa}
     
    26883263\end{cfa}
    26893264\begin{cfa}[belowskip=0pt]
    2690 sepSet( sout, store );
     3265sepSet( sout, store );                                          §\C{// change separator back to original}§
    26913266sout | 1 | 2 | 3 | endl;
    26923267\end{cfa}
     
    31133688
    31143689\begin{table}[hbt]
    3115 \hfil
    3116 \begin{tabular}[t]{ll}
    3117 %identifier & operation \\ \hline
    3118 ©?[?]© & subscripting \impl{?[?]}\\
    3119 ©?()© & function call \impl{?()}\\
    3120 ©?++© & postfix increment \impl{?++}\\
    3121 ©?--© & postfix decrement \impl{?--}\\
    3122 ©++?© & prefix increment \impl{++?}\\
    3123 ©--?© & prefix decrement \impl{--?}\\
    3124 ©*?© & dereference \impl{*?}\\
    3125 ©+?© & unary plus \impl{+?}\\
    3126 ©-?© & arithmetic negation \impl{-?}\\
    3127 ©~?© & bitwise negation \impl{~?}\\
    3128 ©!?© & logical complement \impl{"!?}\\
    3129 ©?*?© & multiplication \impl{?*?}\\
    3130 ©?/?© & division \impl{?/?}\\
    3131 \end{tabular}\hfil
    3132 \begin{tabular}[t]{ll}
    3133 %identifier & operation \\ \hline
    3134 ©?%?© & remainder \impl{?%?}\\
    3135 ©?+?© & addition \impl{?+?}\\
    3136 ©?-?© & subtraction \impl{?-?}\\
    3137 ©?<<?© & left shift \impl{?<<?}\\
    3138 ©?>>?© & right shift \impl{?>>?}\\
    3139 ©?<?© & less than \impl{?<?}\\
    3140 ©?<=?© & less than or equal \impl{?<=?}\\
    3141 ©?>=?© & greater than or equal \impl{?>=?}\\
    3142 ©?>?© & greater than \impl{?>?}\\
    3143 ©?==?© & equality \impl{?==?}\\
    3144 ©?!=?© & inequality \impl{?"!=?}\\
    3145 ©?&?© & bitwise AND \impl{?&?}\\
    3146 \end{tabular}\hfil
    3147 \begin{tabular}[t]{ll}
    3148 %identifier & operation \\ \hline
    3149 ©?^?© & exclusive OR \impl{?^?}\\
    3150 ©?|?© & inclusive OR \impl{?"|?}\\
    3151 ©?=?© & simple assignment \impl{?=?}\\
    3152 ©?*=?© & multiplication assignment \impl{?*=?}\\
    3153 ©?/=?© & division assignment \impl{?/=?}\\
    3154 ©?%=?© & remainder assignment \impl{?%=?}\\
    3155 ©?+=?© & addition assignment \impl{?+=?}\\
    3156 ©?-=?© & subtraction assignment \impl{?-=?}\\
    3157 ©?<<=?© & left-shift assignment \impl{?<<=?}\\
    3158 ©?>>=?© & right-shift assignment \impl{?>>=?}\\
    3159 ©?&=?© & bitwise AND assignment \impl{?&=?}\\
    3160 ©?^=?© & exclusive OR assignment \impl{?^=?}\\
    3161 ©?|=?© & inclusive OR assignment \impl{?"|=?}\\
    3162 \end{tabular}
    3163 \hfil
     3690\centering
     3691\input{../refrat/operidents}
    31643692\caption{Operator Identifiers}
    31653693\label{opids}
     
    32083736\section{Auto Type-Inferencing}
    32093737
    3210 Auto type-inferencing occurs in a declaration where a variable's type is inferred from its initialization expression type.
     3738Auto type-inferencing occurs in a declaration where a variable's type is inferred from its initialization ex\-pression type.
    32113739\begin{quote2}
    32123740\begin{tabular}{@{}l@{\hspace{3em}}ll@{}}
     
    32373765\begin{itemize}
    32383766\item
    3239 preventing having to determine or write out long generic types,
     3767preventing having to determine or write long generic types,
    32403768\item
    32413769ensure secondary variables, related to a primary variable, always have the same type.
     
    32453773\Indexc{gcc} provides ©typeof© to declare a secondary variable from a primary variable.
    32463774\CFA also relies heavily on the specification of the left-hand side of assignment for type inferencing, so in many cases it is crucial to specify the type of the left-hand side to select the correct type of the right-hand expression.
    3247 Only for overloaded routines with the same return type is variable type-inferencing possible.
     3775Only for overloaded routines \emph{with the same return type} is variable type-inferencing possible.
    32483776Finally, ©auto© presents the programming problem of tracking down a type when the type is actually needed.
    32493777For example, given
     
    32613789There is also the conundrum in type inferencing of when to \emph{\Index{brand}} a type.
    32623790That is, when is the type of the variable more important than the type of its initialization expression.
    3263 For example, if a change is made in an initialization expression, it can cause hundreds or thousands of cascading type changes and/or errors.
    3264 At some point, a programmer wants the type of the variable to remain constant and the expression to be in error when it changes.
     3791For example, if a change is made in an initialization expression, it can cause significant cascading type changes and/or errors.
     3792At some point, a variable type needs to remain constant and the expression to be in error when it changes.
    32653793
    32663794Given ©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.
     
    34754003        }
    34764004\end{cfa}
    3477 \end{comment}
    3478 
    3479 
    3480 \subsection{Memory Management}
    3481 
    3482 
    3483 \subsubsection{Manual Memory Management}
    3484 
    3485 Using malloc and free to dynamically allocate memory exposes several potential, and common, errors.
    3486 First, malloc breaks type safety because it returns a pointer to void.
    3487 There is no relationship between the type that the returned pointer is cast to, and the amount of memory allocated.
    3488 This problem is solved with a type-safe malloc.
    3489 Do.s type-safe malloc does not take any arguments for size.
    3490 Instead, it infers the type based on the return value, and then allocates space for the inferred type.
    3491 
    3492 \begin{cfa}
    3493 float *f = malloc(); // allocates the size of a float
    3494 
    3495 struct S {
    3496         int i, j, k;
    3497 };
    3498 
    3499 struct S *s = malloc(); // allocates the size of a struct S
    3500 \end{cfa}
    3501 
    3502 In addition to the improved malloc, \CFA also provides a technique for combining allocation and initialization into one step, using the new function.
    3503 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.
    3504 
    3505 \begin{cfa}
    3506 type Complex = struct {
    3507         float real;
    3508         float imag;
    3509 };
    3510 
    3511 // default constructor
    3512 
    3513 void ?{}(Complex &c) {
    3514         c.real = 0.0;
    3515         c.imag = 0.0;
    3516 }
    3517 
    3518 
    3519 
    3520 // 2 parameter constructor
    3521 
    3522 void ?{}(Complex &c, float real, float imag) {
    3523         c.real = real;
    3524         c.imag = imag;
    3525 }
    3526 
    3527 
    3528 int main() {
    3529         Complex c1; // No constructor is called
    3530         Complex c2{}; // Default constructor called
    3531         Complex c3{1.0, -1.0}; // 2 parameter constructor is called
    3532 
    3533         Complex *p1 = malloc(); // allocate
    3534         Complex *p2 = new(); // allocate + default constructor
    3535         Complex *p3 = new(0.5, 1.0); // allocate + 2 param constructor
    3536 }
    3537 \end{cfa}
    3538 
    3539 
    3540 \subsubsection{Automatic Memory Management}
    3541 
    3542 \CFA may also support automatic memory management to further improve safety.
    3543 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.
    3544 This feature requires further investigation.
    3545 \CFA will not have a garbage collector, but might use some kind of region-based memory management.
    3546 
    3547 
    3548 \begin{comment}
    3549 \subsection{Unsafe C Constructs}
    3550 
    3551 C programmers are able to access all of the low-level tricks that are sometimes needed for close-to-the-hardware programming.
    3552 Some of these practices however are often error-prone and difficult to read and maintain.
    3553 Since \CFA is designed to be safer than C, such constructs are disallowed in \CFA code.
    3554 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.
    3555 This block means that the user is telling the tools, .I know this is unsafe, but I.m going to do it anyway..
    3556 
    3557 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.
    3558 Once the full set is decided, the rules will be listed here.
    35594005\end{comment}
    35604006
     
    37804226\label{f:SimpleTasks}
    37814227\end{figure}
    3782 
    3783 
    3784 \begin{comment}
    3785 \begin{cfa}
    3786 type Adder = task {
    3787         int *row;
    3788         int size;
    3789         int &subtotal;
    3790 }
    3791 \end{cfa}
    3792 
    3793 A task may define a constructor, which will be called upon allocation and run on the caller.s thread.
    3794 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).
    3795 After a task is allocated and initialized, its thread is spawned implicitly and begins executing in its function call method.
    3796 All tasks must define this function call method, with a void return value and no additional parameters, or the compiler will report an error.
    3797 Below are example functions for the above Adder task, and its usage to sum up a matrix on multiple threads.
    3798 (Note that this example is designed to display the syntax and functionality, not the best method to solve this problem)
    3799 \begin{cfa}
    3800 void ?{}(Adder &a, int r[], int s, int &st) { // constructor
    3801         a.row = r;
    3802         a.size = s;
    3803         a.subtotal = st;
    3804 }
    3805 
    3806 // implicitly spawn thread and begin execution here
    3807 
    3808 void ?()(Adder &a) {
    3809         int c;
    3810         subtotal = 0;
    3811         for (c=0; c<a.size; ++c) {
    3812         subtotal += row[c];
    3813         }
    3814 }
    3815 
    3816 int main() {
    3817         const int rows = 100, cols = 1000000;
    3818         int matrix[rows][cols];
    3819         int subtotals[rows];
    3820         int total = 0;
    3821         int r;
    3822 
    3823         { // create a new scope here for our adders
    3824         Adder adders[rows];
    3825         // read in the matrix
    3826         ...
    3827         for (r=0; r<rows; ++r) {
    3828         // tasks are initialized on this thread
    3829         Adders[r] = {matrix[r], cols, subtotals[r]};
    3830         Adders[r](); // spawn thread and begin execution
    3831         }
    3832         } // adders go out of scope; block here until they all finish
    3833         total += subtotals[r];
    3834         printf(.total is %d\n., total);
    3835 }
    3836 \end{cfa}
    3837 
    3838 \subsection{Cooperative Scheduling}
    3839 
    3840 Tasks in \CFA are cooperatively scheduled, meaning that a task will not be interrupted by another task, except at specific yield points.
    3841 In Listing 31, there are no yield points, so each task runs to completion with no interruptions.
    3842 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.
    3843 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.
    3844 For example, the code below defines a monitor that maintains a generic list.
    3845 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.
    3846 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.
    3847 
    3848 \begin{cfa}
    3849 // type T is used as a generic type for all definitions inside
    3850 // the curly brackets
    3851 
    3852 generic(type T) {
    3853         type Channel = monitor {
    3854         List(T) list; // list is a simple generic list type
    3855         };
    3856 
    3857         T pop(mutex &Channel(T) ch) {
    3858         if (ch.list.empty()) {
    3859         // yield until push is called for this channel
    3860         yield(push);
    3861         }
    3862         return ch.list.pop();
    3863         }
    3864 
    3865         void push(mutex &Channel(T)ch, T val) {
    3866         if (ch.list.full()) {
    3867         // yield until pop is called for this channel
    3868         yield(pop);
    3869         }
    3870         ch.list.push(val);
    3871         }
    3872 }
    3873 \end{cfa}
    3874 
    3875 A task can also yield indefinitely by calling yield with no arguments.
    3876 This will tell the scheduler to yield this task until it is resumed by some other task.
    3877 A task can resume another task by using its functional call operator.
    3878 The code below shows a simple ping-pong example, where two tasks yield back and forth to each other using these methods.
    3879 
    3880 \begin{cfa}
    3881 type Ping = task {
    3882         Pong *partner;
    3883 };
    3884 
    3885 void ?{}(Ping &p, Pong *partner = 0) {
    3886         p.partner = partner;
    3887 }
    3888 
    3889 void ?()(Ping &p) {
    3890         for(;;) { // loop forever
    3891         printf(.ping\n.);
    3892         partner(); // resumes the partner task
    3893         yield(); // yields this task
    3894         }
    3895 }
    3896 
    3897 type Pong = task {
    3898         Ping *partner;
    3899 };
    3900 
    3901 void ?{}(Pong &p, Ping *partner = 0) {
    3902         p.partner = partner;
    3903 }
    3904 
    3905 void ?()(Pong &p) {
    3906         for(;;) { // loop forever
    3907         yield(); // yields this task
    3908         printf(.pong/n.);
    3909         partner(); // resumes the partner task
    3910         }
    3911 }
    3912 
    3913 void main() {
    3914         Ping ping; // allocate ping
    3915         Pong pong{ping}; // allocate, initialize, and start pong
    3916         Ping{pong}; // initialize and start ping
    3917 }
    3918 \end{cfa}
    3919 
    3920 The same functionality can be accomplished by providing functions to be called by the partner task.
    3921 \begin{cfa}
    3922 type Pingpong = task {
    3923         String msg;
    3924         Pingpong *partner;
    3925 };
    3926 
    3927 void ?{}(Pingpong &p, String msg, Pingpong *partner = 0) {
    3928         p.msg = msg;
    3929         p.partner = partner;
    3930 }
    3931 
    3932 void ?()(Pingpong &p) {
    3933         for(;;) {
    3934         yield(go);
    3935         }
    3936 }
    3937 
    3938 void go(Pingpong &p) {
    3939         print(.%(p.msg)\n.);
    3940         go(p.partner);
    3941 }
    3942 
    3943 void main() {
    3944         Pingpong ping = {.ping.};
    3945         Pingpong pong = {.pong., ping};
    3946         ping.partner = pong;
    3947         go(ping);
    3948 }
    3949 \end{cfa}
    3950 \end{comment}
    39514228
    39524229
     
    46094886
    46104887
    4611 \section{Comparison with Other Languages}
     4888\section{Language Comparisons}
    46124889
    46134890\CFA is one of many languages that attempts to improve upon C.
     
    53445621
    53455622
    5346 \section{\texorpdfstring{\CFA Keywords}{Cforall Keywords}}
    5347 \label{s:CFAKeywords}
    5348 
    5349 \CFA introduces the following new keywords.
    5350 
    5351 \begin{quote2}
    5352 \begin{tabular}{lllll}
    5353 \begin{tabular}{@{}l@{}}
    5354 ©_At©                   \\
    5355 ©catch©                 \\
    5356 ©catchResume©   \\
    5357 ©choose©                \\
    5358 ©coroutine©             \\
    5359 \end{tabular}
    5360 &
    5361 \begin{tabular}{@{}l@{}}
    5362 ©disable©               \\
    5363 ©dtype©                 \\
    5364 ©enable©                \\
    5365 ©fallthrough©   \\
    5366 ©fallthru©              \\
    5367 \end{tabular}
    5368 &
    5369 \begin{tabular}{@{}l@{}}
    5370 ©finally©               \\
    5371 ©forall©                \\
    5372 ©ftype©                 \\
    5373 ©lvalue©                \\
    5374 ©monitor©               \\
    5375 \end{tabular}
    5376 &
    5377 \begin{tabular}{@{}l@{}}
    5378 ©mutex©                 \\
    5379 ©one_t©                 \\
    5380 ©otype©                 \\
    5381 ©throw©                 \\
    5382 ©throwResume©   \\
    5383 \end{tabular}
    5384 &
    5385 \begin{tabular}{@{}l@{}}
    5386 ©trait©                 \\
    5387 ©try©                   \\
    5388 ©ttype©                 \\
    5389 ©zero_t©                \\
    5390                                 \\
    5391 \end{tabular}
    5392 \end{tabular}
    5393 \end{quote2}
    5394 
    5395 
    5396 \section{Incompatible}
     5623\section{C Incompatibles}
    53975624
    53985625The following incompatibles exist between \CFA and C, and are similar to Annex C for \CC~\cite{C++14}.
     
    54225649g( p1, p2 ) int p1, p2;                 §\C{// int g( int p1, int p2 );}§
    54235650\end{cfa}
    5424 \CFA supports K\&R routine definitions:
     5651\CFA continues to support K\&R routine definitions:
    54255652\begin{cfa}
    54265653f( a, b, c )                                    §\C{// default int return}§
     
    54955722struct X { int i; struct X *next; };
    54965723static struct X a;                              §\C{// forward definition}§
    5497 static struct X b = { 0, ®&a® };        §\C{// forward reference, valid in C, invalid in \CFA}§
     5724static struct X b = { 0, ®&a® };§\C{// forward reference, valid in C, invalid in \CFA}§
    54985725static struct X a = { 1, &b };  §\C{// definition}§
    54995726\end{cfa}
     
    55105737enum ®Colour® { R, G, B, Y, C, M };
    55115738struct Person {
    5512         enum ®Colour® { R, G, B };      §\C{// nested type}§
     5739        enum ®Colour® { R, G, B };      §\C[7cm]{// nested type}§
    55135740        struct Face {                           §\C{// nested type}§
    55145741                ®Colour® Eyes, Hair;    §\C{// type defined outside (1 level)}§
     
    55195746};
    55205747®Colour® c = R;                                 §\C{// type/enum defined same level}§
    5521 Person®.Colour® pc = Person®.®R;        §\C{// type/enum defined inside}§
    5522 Person®.®Face pretty;                   §\C{// type defined inside}§
     5748Person®.Colour® pc = Person®.®R;§\C{// type/enum defined inside}§
     5749Person®.®Face pretty;                   §\C{// type defined inside}\CRT§
    55235750\end{cfa}
    55245751In 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.
     
    55495776\item
    55505777\begin{description}
     5778\item[Change:] remove implicit conversion of ©void *© to or from any ©T *© pointer:
     5779\begin{cfa}
     5780void 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 safety
     5786\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.
     5793Some C translators already give a warning if the cast is not used.
     5794\end{description}
     5795
     5796\item
     5797\begin{description}
     5798\item[Change:] Types must be declared in declarations, not in expressions
     5799In C, a sizeof expression or cast expression may create a new type. For example,
     5800\begin{cfa}
     5801p = (void*)(struct x {int i;} *)0;
     5802\end{cfa}
     5803declares 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\item
     5811\begin{description}
    55515812\item[Change:] comma expression is disallowed as subscript
    55525813\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.
    55535814\item[Effect on original feature:] change to semantics of well-defined feature.
    55545815\item[Difficulty of converting:] semantic transformation of ©x[i,j]© to ©x[(i,j)]©
    5555 \item[How widely used:] seldom.
     5816\item[How widely used:] Seldom.
    55565817\end{description}
    55575818\end{enumerate}
    55585819
    55595820
     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
    55605831\section{Standard Headers}
    55615832\label{s:StandardHeaders}
     
    55635834\Celeven prescribes the following standard header-files~\cite[\S~7.1.2]{C11} and \CFA adds to this list:
    55645835\begin{quote2}
    5565 \lstset{deletekeywords={float}}
    5566 \begin{tabular}{@{}llll|l@{}}
    5567 \multicolumn{4}{c|}{C11} & \multicolumn{1}{c}{\CFA}             \\
     5836\begin{tabular}{@{}llllll|l@{}}
     5837\multicolumn{6}{c|}{C11} & \multicolumn{1}{c}{\CFA}             \\
    55685838\hline
    55695839\begin{tabular}{@{}l@{}}
     
    55735843\Indexc{errno.h}                \\
    55745844\Indexc{fenv.h}                 \\
    5575 \Indexc{float.h}                \\
    5576 \Indexc{inttypes.h}             \\
    5577 \Indexc{iso646.h}               \\
    55785845\end{tabular}
    55795846&
    55805847\begin{tabular}{@{}l@{}}
     5848\Indexc[deletekeywords=float]{float.h} \\
     5849\Indexc{inttypes.h}             \\
     5850\Indexc{iso646.h}               \\
    55815851\Indexc{limits.h}               \\
    55825852\Indexc{locale.h}               \\
     5853\end{tabular}
     5854&
     5855\begin{tabular}{@{}l@{}}
    55835856\Indexc{math.h}                 \\
    55845857\Indexc{setjmp.h}               \\
     
    55865859\Indexc{stdalign.h}             \\
    55875860\Indexc{stdarg.h}               \\
    5588 \Indexc{stdatomic.h}    \\
    55895861\end{tabular}
    55905862&
    55915863\begin{tabular}{@{}l@{}}
     5864\Indexc{stdatomic.h}    \\
    55925865\Indexc{stdbool.h}              \\
    55935866\Indexc{stddef.h}               \\
    55945867\Indexc{stdint.h}               \\
    55955868\Indexc{stdio.h}                \\
     5869\end{tabular}
     5870&
     5871\begin{tabular}{@{}l@{}}
    55965872\Indexc{stdlib.h}               \\
    55975873\Indexc{stdnoreturn.h}  \\
    55985874\Indexc{string.h}               \\
    55995875\Indexc{tgmath.h}               \\
     5876\Indexc{threads.h}              \\
    56005877\end{tabular}
    56015878&
    56025879\begin{tabular}{@{}l@{}}
    5603 \Indexc{threads.h}              \\
    56045880\Indexc{time.h}                 \\
    56055881\Indexc{uchar.h}                \\
     
    56075883\Indexc{wctype.h}               \\
    56085884                                                \\
    5609                                                 \\
    5610                                                 \\
    56115885\end{tabular}
    56125886&
    56135887\begin{tabular}{@{}l@{}}
     5888\Indexc{gmp.h}                  \\
     5889\Indexc{malloc.h}               \\
    56145890\Indexc{unistd.h}               \\
    5615 \Indexc{gmp.h}                  \\
    5616                                                 \\
    5617                                                 \\
    5618                                                 \\
    5619                                                 \\
    56205891                                                \\
    56215892                                                \\
     
    56265897hence, names in these include files are not mangled\index{mangling!name} (see~\VRef{s:Interoperability}).
    56275898All other C header files must be explicitly wrapped in ©extern "C"© to prevent name mangling.
    5628 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.
     5899For \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.
    56295900
    56305901
     
    56365907
    56375908\subsection{Storage Management}
     5909\label{s:StorageManagement}
    56385910
    56395911The 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.
     
    56555927The table shows allocation routines supporting different combinations of storage-management capabilities:
    56565928\begin{center}
    5657 \begin{tabular}{@{}lr|l|l|l|l@{}}
    5658                 &                                       & \multicolumn{1}{c|}{fill}     & resize        & alignment     & array \\
     5929\begin{tabular}{@{}r|r|l|l|l|l@{}}
     5930\multicolumn{1}{c}{}&           & \multicolumn{1}{c|}{fill}     & resize        & alignment     & array \\
    56595931\hline
    56605932C               & ©malloc©                      & no                    & no            & no            & no    \\
     
    56635935                & ©memalign©            & no                    & no            & yes           & no    \\
    56645936                & ©posix_memalign©      & no                    & no            & yes           & no    \\
     5937\hline
    56655938C11             & ©aligned_alloc©       & no                    & no            & yes           & no    \\
     5939\hline
    56665940\CFA    & ©alloc©                       & no/copy/yes   & no/yes        & no            & yes   \\
    56675941                & ©align_alloc©         & no/yes                & no            & yes           & yes   \\
     
    58476121long double remainder( long double, long double );
    58486122
    5849 [ int, float ] remquo( float, float );§\indexc{remquo}§
    5850 float remquo( float, float, int * );
     6123float remquo( float, float, int * );§\indexc{remquo}§
     6124double remquo( double, double, int * );
     6125long double remquo( long double, long double, int * );
     6126[ int, float ] remquo( float, float );
    58516127[ int, double ] remquo( double, double );
    5852 double remquo( double, double, int * );
    58536128[ int, long double ] remquo( long double, long double );
    5854 long double remquo( long double, long double, int * );
    5855 
    5856 [ int, float ] div( float, float );                                             // alternative name for remquo
    5857 float div( float, float, int * );§\indexc{div}§
     6129
     6130float div( float, float, int * );§\indexc{div}§ §\C{// alternative name for remquo}§
     6131double div( double, double, int * );
     6132long double div( long double, long double, int * );
     6133[ int, float ] div( float, float );
    58586134[ int, double ] div( double, double );
    5859 double div( double, double, int * );
    58606135[ int, long double ] div( long double, long double );
    5861 long double div( long double, long double, int * );
    58626136
    58636137float fma( float, float, float );§\indexc{fma}§
     
    58896163double exp2( double );
    58906164long double exp2( long double );
    5891 float _Complex exp2( float _Complex );
    5892 double _Complex exp2( double _Complex );
    5893 long double _Complex exp2( long double _Complex );
     6165// float _Complex exp2( float _Complex );
     6166// double _Complex exp2( double _Complex );
     6167// long double _Complex exp2( long double _Complex );
    58946168
    58956169float expm1( float );§\indexc{expm1}§
     
    58976171long double expm1( long double );
    58986172
     6173float pow( float, float );§\indexc{pow}§
     6174double pow( double, double );
     6175long double pow( long double, long double );
     6176float _Complex pow( float _Complex, float _Complex );
     6177double _Complex pow( double _Complex, double _Complex );
     6178long double _Complex pow( long double _Complex, long double _Complex );
     6179\end{cfa}
     6180
     6181
     6182\subsection{Logarithm}
     6183
     6184\leavevmode
     6185\begin{cfa}[aboveskip=0pt,belowskip=0pt]
    58996186float log( float );§\indexc{log}§
    59006187double log( double );
     
    59076194double log2( double );
    59086195long double log2( long double );
    5909 float _Complex log2( float _Complex );
    5910 double _Complex log2( double _Complex );
    5911 long double _Complex log2( long double _Complex );
     6196// float _Complex log2( float _Complex );
     6197// double _Complex log2( double _Complex );
     6198// long double _Complex log2( long double _Complex );
    59126199
    59136200float log10( float );§\indexc{log10}§
    59146201double log10( double );
    59156202long double log10( long double );
    5916 float _Complex log10( float _Complex );
    5917 double _Complex log10( double _Complex );
    5918 long double _Complex log10( long double _Complex );
     6203// float _Complex log10( float _Complex );
     6204// double _Complex log10( double _Complex );
     6205// long double _Complex log10( long double _Complex );
    59196206
    59206207float log1p( float );§\indexc{log1p}§
     
    59296216double logb( double );
    59306217long double logb( long double );
    5931 \end{cfa}
    5932 
    5933 
    5934 \subsection{Power}
    5935 
    5936 \leavevmode
    5937 \begin{cfa}[aboveskip=0pt,belowskip=0pt]
     6218
    59386219float sqrt( float );§\indexc{sqrt}§
    59396220double sqrt( double );
     
    59506231double hypot( double, double );
    59516232long double hypot( long double, long double );
    5952 
    5953 float pow( float, float );§\indexc{pow}§
    5954 double pow( double, double );
    5955 long double pow( long double, long double );
    5956 float _Complex pow( float _Complex, float _Complex );
    5957 double _Complex pow( double _Complex, double _Complex );
    5958 long double _Complex pow( long double _Complex, long double _Complex );
    59596233\end{cfa}
    59606234
     
    60106284long double atan2( long double, long double );
    60116285
    6012 float atan( float, float );                                                             // alternative name for atan2
     6286float atan( float, float );                                     §\C{// alternative name for atan2}§
    60136287double atan( double, double );§\indexc{atan}§
    60146288long double atan( long double, long double );
     
    61986472
    61996473\begin{cfa}
    6200 void ?{}( Int * this );                                 §\C{// constructor
     6474void ?{}( Int * this );                                 §\C{// constructor/destructor
    62016475void ?{}( Int * this, Int init );
    62026476void ?{}( Int * this, zero_t );
     
    64536727// implementation
    64546728struct Rational {§\indexc{Rational}§
    6455         long int numerator, denominator;                                        // invariant: denominator > 0
     6729        long int numerator, denominator;        §\C{// invariant: denominator > 0}§
    64566730}; // Rational
    64576731
  • doc/working/resolver_design.md

    rfd344aa r9236060  
    9191## Conversion Costs ##
    9292Each possible resolution of an expression has a _cost_ tuple consisting of
    93 the following components: _unsafe_ conversion cost, _polymorphic_
    94 specialization cost, _safe_ conversion cost, a count of _explicit_
    95 conversions, and _qualifier_ conversion cost.
     93the following components:
     941. _unsafe_ conversion cost: summed degree of unsafe conversions; unlike CFA03, this is not a simple count of conversions (for symmetry with the safe conversions)
     952. _polymorphic unifications_: count of parameters and return values bound to some polymorphic type for boxing
     963. _type variables_: number of polymorphic type variables bound
     974. negated _type specializations_: Each type assertion specializes the polymorphism, thus decreasing the cost; nested polymorphic types (e.g. `T*`) are also counted as specializations
     985. _safe_ conversions: summed degree of safe conversions
     996. _qualifier_ conversions: summed degree of qualifier and reference conversions
    96100These components are lexically-ordered and can be summed element-wise;
    97101summation starts at `(0, 0, 0, 0, 0)`.
     102
     103**TODO** update below for consistency with this
    98104
    99105### Lvalue and Qualifier Conversions ###
  • src/CodeGen/CodeGenerator.cc

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Thu Jun  8 16:00:00 2017
    13 // Update Count     : 485
     12// Last Modified On : Tus Jul 25 15:29:00 2017
     13// Update Count     : 486
    1414//
     15#include "CodeGenerator.h"
    1516
    1617#include <cassert>                   // for assert, assertf
    1718#include <list>                      // for _List_iterator, list, list<>::it...
    1819
    19 #include "CodeGenerator.h"
    2020#include "Common/SemanticError.h"    // for SemanticError
    2121#include "Common/UniqueName.h"       // for UniqueName
     
    556556                        // never an lvalue in C
    557557                } // if
     558                castExpr->get_arg()->accept( *this );
     559                output << ")";
     560        }
     561
     562        void CodeGenerator::visit( VirtualCastExpr * castExpr ) {
     563                assertf( ! genC, "VirtualCastExpr should not reach code generation." );
     564                extension( castExpr );
     565                output << "(virtual ";
    558566                castExpr->get_arg()->accept( *this );
    559567                output << ")";
  • src/CodeGen/CodeGenerator.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Thu Jun  8 15:48:00 2017
    13 // Update Count     : 52
     12// Last Modified On : Tus Jul 25 25:30:00 2017
     13// Update Count     : 54
    1414//
    1515
    16 #ifndef CODEGENV_H
    17 #define CODEGENV_H
     16#pragma once
    1817
    1918#include <list>                   // for list
     
    2625#include "SynTree/Visitor.h"      // for Visitor
    2726#include "SynTree/SynTree.h"      // for Visitor Nodes
     27
     28#include "Common/Indenter.h"      // for Indenter
    2829
    2930namespace CodeGen {
     
    6263                virtual void visit( AddressExpr *addressExpr );
    6364                virtual void visit( CastExpr *castExpr );
     65                virtual void visit( VirtualCastExpr *castExpr );
    6466                virtual void visit( UntypedMemberExpr *memberExpr );
    6567                virtual void visit( MemberExpr *memberExpr );
     
    161163} // namespace CodeGen
    162164
    163 #endif // CODEGENV_H
    164 
    165165// Local Variables: //
    166166// tab-width: 4 //
  • src/CodeGen/FixMain.h

    rfd344aa r9236060  
    99// Author           : Thierry Delisle
    1010// Created On       : Thr Jan 12 14:11:09 2017
    11 // Last Modified By :
    12 // Last Modified On :
    13 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:16:59 2017
     13// Update Count     : 1
    1414//
    1515
    16 #ifndef FIXMAIN_H
    17 #define FIXMAIN_H
     16#pragma once
    1817
    1918#include <iosfwd>
     
    4443        };
    4544};
    46 
    47 #endif //FIXMAIN_H
  • src/CodeGen/FixNames.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon May 18 23:37:32 2015
    13 // Update Count     : 2
     12// Last Modified On : Fri Jul 21 22:17:33 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef FIXNAMES_H
    17 #define FIXNAMES_H
     16#pragma once
    1817
    1918#include <list>  // for list
     
    2625} // namespace CodeGen
    2726
    28 #endif // FIXNAMES_H
    29 
    3027// Local Variables: //
    3128// tab-width: 4 //
  • src/CodeGen/GenType.cc

    rfd344aa r9236060  
    1313// Update Count     : 22
    1414//
     15#include "GenType.h"
    1516
    1617#include <cassert>                // for assert, assertf
     
    1920
    2021#include "CodeGenerator.h"        // for CodeGenerator
    21 #include "GenType.h"
    2222#include "SynTree/Declaration.h"  // for DeclarationWithType
    2323#include "SynTree/Expression.h"   // for Expression
  • src/CodeGen/GenType.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon May 18 23:38:53 2015
    13 // Update Count     : 1
     12// Last Modified On : Fri Jul 21 22:17:23 2017
     13// Update Count     : 2
    1414//
    1515
    16 #ifndef _GENTYPE_H
    17 #define _GENTYPE_H
     16#pragma once
    1817
    1918#include <string>  // for string
     
    2625} // namespace CodeGen
    2726
    28 #endif // _GENTYPE_H
    29 
    3027// Local Variables: //
    3128// tab-width: 4 //
  • src/CodeGen/Generate.cc

    rfd344aa r9236060  
    1313// Update Count     : 6
    1414//
     15#include "Generate.h"
    1516
    1617#include <iostream>                  // for ostream, endl, operator<<
     
    2021#include "CodeGenerator.h"           // for CodeGenerator, doSemicolon, oper...
    2122#include "GenType.h"                 // for genPrettyType
    22 #include "Generate.h"
    2323#include "Parser/LinkageSpec.h"      // for isBuiltin, isGeneratable
    2424#include "SynTree/BaseSyntaxNode.h"  // for BaseSyntaxNode
  • src/CodeGen/Generate.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon May 18 23:39:51 2015
    13 // Update Count     : 1
     12// Last Modified On : Fri Jul 21 22:16:35 2017
     13// Update Count     : 2
    1414//
    1515
    16 #ifndef GENERATE_H
    17 #define GENERATE_H
     16#pragma once
    1817
    1918#include <iostream>  // for ostream
     
    3130} // namespace CodeGen
    3231
    33 #endif // GENERATE_H
    34 
    3532// Local Variables: //
    3633// tab-width: 4 //
  • src/CodeGen/OperatorTable.cc

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Dec 13 14:33:05 2016
    13 // Update Count     : 10
     12// Last Modified On : Sat Jul 15 17:12:22 2017
     13// Update Count     : 15
    1414//
    1515
     
    3636                        {       "++?",          "++",   "_operator_preincr",                    OT_PREFIXASSIGN         },
    3737                        {       "--?",          "--",   "_operator_predecr",                    OT_PREFIXASSIGN         },
     38                        {       "?\\?",         "\\",   "_operator_exponential",                OT_INFIX                        },
    3839                        {       "?*?",          "*",    "_operator_multiply",                   OT_INFIX                        },
    3940                        {       "?/?",          "/",    "_operator_divide",                             OT_INFIX                        },
     
    5354                        {       "?|?",          "|",    "_operator_bitor",                              OT_INFIX                        },
    5455                        {       "?=?",          "=",    "_operator_assign",                             OT_INFIXASSIGN          },
     56                        {       "?\\=?",        "\\=",  "_operator_expassign",                  OT_INFIXASSIGN          },
    5557                        {       "?*=?",         "*=",   "_operator_multassign",                 OT_INFIXASSIGN          },
    5658                        {       "?/=?",         "/=",   "_operator_divassign",                  OT_INFIXASSIGN          },
  • src/CodeGen/OperatorTable.h

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Jun 24 16:17:57 2015
    13 // Update Count     : 5
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:17:11 2017
     13// Update Count     : 6
    1414//
    1515
    16 #ifndef _OPERATORTABLE_H
    17 #define _OPERATORTABLE_H
     16#pragma once
    1817
    1918#include <string>
     
    5150} // namespace CodeGen
    5251
    53 #endif // _OPERATORTABLE_H
    54 
    5552// Local Variables: //
    5653// tab-width: 4 //
  • src/CodeTools/DeclStats.h

    rfd344aa r9236060  
    99// Author           : Aaron Moss
    1010// Created On       : Wed Jan 31 16:40:00 2016
    11 // Last Modified By : Aaron Moss
    12 // Last Modified On : Wed Jan 31 16:40:00 2016
    13 // Update Count     : 1
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:17:56 2017
     13// Update Count     : 2
    1414//
    1515
    16 #ifndef DECLSTATS_H
    17 #define DECLSTATS_H
     16#pragma once
    1817
    1918#include <list>  // for list
     
    2827}  // namespace CodeTools
    2928
    30 #endif // DECLSTATS_H
    31 
    3229// Local Variables: //
    3330// tab-width: 4 //
  • src/CodeTools/TrackLoc.cc

    rfd344aa r9236060  
    1616#include "TrackLoc.h"
    1717
    18 #include <cstdlib>                    // for size_t, exit, EXIT_FAILURE
    19 #include <iostream>                   // for operator<<, ostream, basic_ostream
    20 #include <iterator>                   // for back_inserter, inserter
    21 #include <stack>                      // for stack
    22 #include <string>                     // for operator<<, string
    23 #include <typeindex>                  // for type_index
     18#include <cstdlib>                   // for exit, EXIT_FAILURE
     19#include <iostream>                  // for operator<<, ostream, basic_ostream
     20#include <stack>                     // for stack
     21#include <string>                    // for operator<<, string
     22#include <typeindex>                 // for type_index
    2423
    25 #include "Common/PassVisitor.h"       // for PassVisitor
    26 #include "Common/PassVisitor.impl.h"  // for acceptAll
    27 #include "Common/SemanticError.h"     // for SemanticError
    28 #include "Common/utility.h"           // for CodeLocation
    29 #include "SynTree/BaseSyntaxNode.h"   // for BaseSyntaxNode
    30 #include "SynTree/Mutator.h"          // for mutateAll
    31 #include "SynTree/Visitor.h"          // for acceptAll
     24#include "Common/PassVisitor.h"      // for PassVisitor
     25#include "Common/utility.h"          // for CodeLocation
     26#include "SynTree/BaseSyntaxNode.h"  // for BaseSyntaxNode
    3227
    3328class Declaration;
     
    4641                std::stack< CodeLocation * > parents;
    4742        public:
    48                 LocationPrinter(size_t printLevel) : 
     43                LocationPrinter(size_t printLevel) :
    4944                        printLevel(printLevel), lastNode(nullptr)
    5045                {}
     
    6560                                if ( !parents.empty() ) {
    6661                                        node->location = *parents.top();
    67                                 } 
     62                                }
    6863                                else if (nullptr != lastNode) {
    6964                                        node->location = *lastNode;
    70                                 } 
     65                                }
    7166                                else {
    7267                                        std::cerr << "Top level node has no CodeLocation " << name << std::endl;
  • src/CodeTools/TrackLoc.h

    rfd344aa r9236060  
    99// Author           : Andrew Beach
    1010// Created On       : Tues May 2 15:40:00 2017
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Wed May 3 14:42:00 2017
    13 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:17:44 2017
     13// Update Count     : 1
    1414//
    1515
    16 #ifndef TRACKLOC_H
    17 #define TRACKLOC_H
     16#pragma once
    1817
    1918#include <cstddef>   // for size_t
     
    3130}  // namespace CodeTools
    3231
    33 #endif // TRACKLOC_H
    34 
    3532// Local Variables: //
    3633// tab-width: 4 //
  • src/Common/CompilerError.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Aug 18 23:41:30 2016
    13 // Update Count     : 3
     12// Last Modified On : Fri Jul 21 22:18:07 2017
     13// Update Count     : 4
    1414//
    1515
    16 #ifndef COMPILER_ERROR_H
    17 #define COMPILER_ERROR_H
     16#pragma once
    1817
    1918#include <string>
     
    3130};
    3231
    33 #endif // COMPILER_ERROR_H
    34 
    3532// Local Variables: //
    3633// tab-width: 4 //
  • src/Common/PassVisitor.h

    rfd344aa r9236060  
    8181        virtual void visit( NameExpr *nameExpr ) override final;
    8282        virtual void visit( CastExpr *castExpr ) override final;
     83        virtual void visit( VirtualCastExpr *castExpr ) override final;
    8384        virtual void visit( AddressExpr *addressExpr ) override final;
    8485        virtual void visit( LabelAddressExpr *labAddressExpr ) override final;
     
    169170        virtual Expression* mutate( LabelAddressExpr *labAddressExpr ) override final;
    170171        virtual Expression* mutate( CastExpr *castExpr ) override final;
     172        virtual Expression* mutate( VirtualCastExpr *castExpr ) override final;
    171173        virtual Expression* mutate( UntypedMemberExpr *memberExpr ) override final;
    172174        virtual Expression* mutate( MemberExpr *memberExpr ) override final;
  • src/Common/PassVisitor.impl.h

    rfd344aa r9236060  
    11#pragma once
     2// IWYU pragma: private, include "PassVisitor.h"
    23
    34#define VISIT_START( node )                     \
     
    606607
    607608template< typename pass_type >
     609void PassVisitor< pass_type >::visit( VirtualCastExpr * node ) {
     610        VISIT_BODY( node );
     611}
     612
     613template< typename pass_type >
    608614void PassVisitor< pass_type >::visit( AddressExpr * node ) {
    609615        VISIT_BODY( node );
     
    983989
    984990template< typename pass_type >
     991Expression * PassVisitor< pass_type >::mutate( VirtualCastExpr * node ) {
     992        MUTATE_BODY( Expression, node );
     993}
     994
     995template< typename pass_type >
    985996Expression * PassVisitor< pass_type >::mutate( UntypedMemberExpr * node ) {
    986997        MUTATE_BODY( Expression, node );
  • src/Common/PassVisitor.proto.h

    rfd344aa r9236060  
    11#pragma once
     2// IWYU pragma: private, include "PassVisitor.h"
    23
    34template<typename pass_type>
  • src/Common/ScopedMap.h

    rfd344aa r9236060  
    99// Author           : Aaron B. Moss
    1010// Created On       : Wed Dec 2 11:37:00 2015
    11 // Last Modified By : Aaron B. Moss
    12 // Last Modified On : Wed Dec 2 11:37:00 2015
    13 // Update Count     : 1
    14 //
    15 
    16 #ifndef _SCOPEDMAP_H
    17 #define _SCOPEDMAP_H
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:18:24 2017
     13// Update Count     : 2
     14//
     15
     16#pragma once
    1817
    1918#include <cassert>
     
    305304};
    306305
    307 #endif // _SCOPEDMAP_H
    308 
    309306// Local Variables: //
    310307// tab-width: 4 //
  • src/Common/SemanticError.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Sep 24 15:13:42 2016
    13 // Update Count     : 5
     12// Last Modified On : Fri Jul 21 22:18:59 2017
     13// Update Count     : 6
    1414//
    1515
    16 #ifndef SEMANTICERROR_H
    17 #define SEMANTICERROR_H
     16#pragma once
    1817
    1918#include <exception>  // for exception
     
    6261}
    6362
    64 #endif // SEMANTICERROR_H
    65 
    6663// Local Variables: //
    6764// tab-width: 4 //
  • src/Common/UnimplementedError.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 19 07:23:08 2015
    13 // Update Count     : 1
     12// Last Modified On : Fri Jul 21 22:18:35 2017
     13// Update Count     : 2
    1414//
    1515
    16 #ifndef _UNIMPLEMENTEDERROR_H
    17 #define _UNIMPLEMENTEDERROR_H
     16#pragma once
    1817
    1918#include <string>
     
    3130};
    3231
    33 #endif // _UNIMPLEMENTEDERROR_H
    34 
    3532// Local Variables: //
    3633// tab-width: 4 //
  • src/Common/UniqueName.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 19 07:24:20 2015
    13 // Update Count     : 1
     12// Last Modified On : Fri Jul 21 22:18:45 2017
     13// Update Count     : 2
    1414//
    1515
    16 #ifndef UNIQUENAME_H
    17 #define UNIQUENAME_H
     16#pragma once
    1817
    1918#include <string>
     
    2827};
    2928
    30 #endif // UNIQUENAME_H
    31 
    3229// Local Variables: //
    3330// tab-width: 4 //
  • src/Common/VectorMap.h

    rfd344aa r9236060  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // ScopedMap.h --
     7// VectorMap.h --
    88//
    99// Author           : Aaron B. Moss
    1010// Created On       : Wed Feb  1 16:55:00 2017
    11 // Last Modified By : Aaron B. Moss
    12 // Last Modified On : Wed Feb  1 16:55:00 2017
    13 // Update Count     : 1
    14 //
    15 
    16 #ifndef _VECTORMAP_H
    17 #define _VECTORMAP_H
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:19:29 2017
     13// Update Count     : 2
     14//
     15
     16#pragma once
    1817
    1918#include <iterator>
     
    245244}
    246245
    247 #endif // _VECTORMAP_H
    248 
    249246// Local Variables: //
    250247// tab-width: 4 //
  • src/Common/utility.h

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Fri May 5 11:03:00 2017
    13 // Update Count     : 32
    14 //
    15 
    16 #ifndef _UTILITY_H
    17 #define _UTILITY_H
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:19:13 2017
     13// Update Count     : 33
     14//
     15
     16#pragma once
    1817
    1918#include <cctype>
     
    386385}
    387386
    388 #endif // _UTILITY_H
    389 
    390387// Local Variables: //
    391388// tab-width: 4 //
  • src/Concurrency/Keywords.cc

    rfd344aa r9236060  
    1 //                              -*- Mode: CPP -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    1211// Last Modified By :
    1312// Last Modified On :
    14 // Update Count     : 3
     13// Update Count     : 5
    1514//
    1615
     
    549548        }
    550549};
     550
     551// Local Variables: //
     552// mode: c //
     553// tab-width: 4 //
     554// End: //
  • src/Concurrency/Keywords.h

    rfd344aa r9236060  
    1 //                              -*- Mode: CPP -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    1211// Last Modified By :
    1312// Last Modified On :
    14 // Update Count     : 0
     13// Update Count     : 1
    1514//
    1615
    17 #ifndef KEYWORDS_H
    18 #define KEYWORDS_H
     16#pragma once
    1917
    2018#include <list>  // for list
     
    2826};
    2927
    30 #endif //KEYWORDS_H
     28// Local Variables: //
     29// tab-width: 4 //
     30// mode: c++ //
     31// compile-command: "make install" //
     32// End: //
  • src/ControlStruct/ExceptTranslate.cc

    rfd344aa r9236060  
    1010// Created On       : Wed Jun 14 16:49:00 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Jul 12 15:07:00 2017
    13 // Update Count     : 3
     12// Last Modified On : Tus Aug  8 16:54:00 2017
     13// Update Count     : 7
    1414//
    1515
     
    2121#include "SynTree/Type.h"
    2222#include "SynTree/Attribute.h"
     23#include "SynTree/VarExprReplacer.h"
    2324
    2425namespace 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( emptyQualifiers, 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                                 emptyQualifiers,
    62                                 new BasicType( emptyQualifiers, 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(emptyQualifiers, BasicType::Bool),
    72                         /*init*/ NULL
    73                         );
    74                 ObjectDecl voidptr_obj(
    75                         "__hook",
    76                         Type::StorageClasses(),
    77                         LinkageSpec::Cforall,
    78                         NULL,
    79                         new PointerType(
    80                                 emptyQualifiers,
    81                                 new VoidType(
    82                                         emptyQualifiers
    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         }
    9926
    10027        // Buricratic Helpers (Not having to do with the paritular operation.)
     
    11542        }
    11643
    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 
    12644        void appendDeclStmt( CompoundStmt * block, Declaration * item ) {
    12745                block->push_back(new DeclStmt(noLabels, item));
     
    13250        }
    13351
    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",
     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                        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",
    142158                        Type::StorageClasses(),
    143159                        LinkageSpec::Cforall,
    144160                        NULL,
    145                         new BasicType( emptyQualifiers, BasicType::SignedInt ),
    146                         new SingleInit( throwStmt->get_expr() )
    147                         );
    148                 appendDeclStmt( result, local );
     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` );
    149185                UntypedExpr * call = new UntypedExpr( new NameExpr( throwFunc ) );
    150                 call->get_args().push_back( new AddressExpr( nameOf( local ) ) );
    151                 result->push_back( new ExprStmt( throwStmt->get_labels(), call ) );
     186                call->get_args().push_back( throwStmt->get_expr() );
    152187                throwStmt->set_expr( nullptr );
    153188                delete throwStmt;
    154                 return result;
    155         }
    156 
    157         Statement * create_terminate_throw( ThrowStmt *throwStmt ) {
    158                 // { int NAME = EXPR; __throw_terminate( &NAME ); }
     189                return new ExprStmt( noLabels, call );
     190        }
     191
     192        Statement * ExceptionMutatorCore::create_terminate_throw(
     193                        ThrowStmt *throwStmt ) {
     194                // __throw_terminate( `throwStmt->get_name()` ); }
    159195                return create_given_throw( "__cfaehm__throw_terminate", throwStmt );
    160196        }
    161         Statement * create_terminate_rethrow( ThrowStmt *throwStmt ) {
    162                 // __rethrow_terminate();
     197
     198        Statement * ExceptionMutatorCore::create_terminate_rethrow(
     199                        ThrowStmt *throwStmt ) {
     200                // { `handler_except_decl` = NULL; __rethrow_terminate(); }
    163201                assert( nullptr == throwStmt->get_expr() );
    164                 Statement * result = new ExprStmt(
    165                         throwStmt->get_labels(),
     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,
    166216                        new UntypedExpr( new NameExpr( "__cfaehm__rethrow_terminate" ) )
    167                         );
     217                        ) );
    168218                delete throwStmt;
    169219                return result;
    170220        }
    171         Statement * create_resume_throw( ThrowStmt *throwStmt ) {
    172                 // __throw_resume( EXPR );
     221
     222        Statement * ExceptionMutatorCore::create_resume_throw(
     223                        ThrowStmt *throwStmt ) {
     224                // __throw_resume( `throwStmt->get_name` );
    173225                return create_given_throw( "__cfaehm__throw_resume", throwStmt );
    174226        }
    175         Statement * create_resume_rethrow( ThrowStmt *throwStmt ) {
     227
     228        Statement * ExceptionMutatorCore::create_resume_rethrow(
     229                        ThrowStmt *throwStmt ) {
    176230                // return false;
    177231                Statement * result = new ReturnStmt(
     
    185239        // TryStmt Mutation Helpers
    186240
    187         CompoundStmt * take_try_block( TryStmt *tryStmt ) {
     241        CompoundStmt * ExceptionMutatorCore::take_try_block( TryStmt *tryStmt ) {
    188242                CompoundStmt * block = tryStmt->get_block();
    189243                tryStmt->set_block( nullptr );
    190244                return block;
    191245        }
    192         FunctionDecl * create_try_wrapper( CompoundStmt *body ) {
     246
     247        FunctionDecl * ExceptionMutatorCore::create_try_wrapper(
     248                        CompoundStmt *body ) {
    193249
    194250                return new FunctionDecl( "try", Type::StorageClasses(),
     
    196252        }
    197253
    198         FunctionDecl * create_terminate_catch( CatchList &handlers ) {
     254        FunctionDecl * ExceptionMutatorCore::create_terminate_catch(
     255                        CatchList &handlers ) {
    199256                std::list<CaseStmt *> handler_wrappers;
    200257
    201258                FunctionType *func_type = catch_func_t.clone();
    202259                DeclarationWithType * index_obj = func_type->get_parameters().front();
    203         //      DeclarationWithType * except_obj = func_type->get_parameters().back();
     260                DeclarationWithType * except_obj = func_type->get_parameters().back();
    204261
    205262                // Index 1..{number of handlers}
     
    210267                        CatchStmt * handler = *it;
    211268
    212                         // INTEGERconstant Version
    213269                        // case `index`:
    214270                        // {
    215                         //     `handler.body`
     271                        //     `handler.decl` = { (virtual `decl.type`)`except` };
     272                        //     `handler.body`;
    216273                        // }
    217274                        // return;
    218                         std::list<Statement *> caseBody;
    219                         caseBody.push_back( handler->get_body() );
     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() );
    220305                        handler->set_body( nullptr );
    221                         caseBody.push_back( new ReturnStmt( noLabels, nullptr ) );
    222 
     306
     307                        std::list<Statement *> caseBody
     308                                        { block, new ReturnStmt( noLabels, nullptr ) };
    223309                        handler_wrappers.push_back( new CaseStmt(
    224310                                noLabels,
     
    249335        // Create a single check from a moddified handler.
    250336        // except_obj is referenced, modded_handler will be freed.
    251         CompoundStmt *create_single_matcher(
     337        CompoundStmt * ExceptionMutatorCore::create_single_matcher(
    252338                        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
    253347                CompoundStmt * block = new CompoundStmt( noLabels );
    254348
    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 
     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.
    276361                if ( modded_handler->get_cond() ) {
    277362                        cond = new LogicalExpr( cond, modded_handler->get_cond() );
    278363                }
     364                // Construct the match condition.
    279365                block->push_back( new IfStmt( noLabels,
    280366                        cond, modded_handler->get_body(), nullptr ) );
     
    287373        }
    288374
    289         FunctionDecl * create_terminate_match( CatchList &handlers ) {
     375        FunctionDecl * ExceptionMutatorCore::create_terminate_match(
     376                        CatchList &handlers ) {
     377                // int match(exception * except) {
     378                //     HANDLER WRAPPERS { return `index`; }
     379                // }
     380
    290381                CompoundStmt * body = new CompoundStmt( noLabels );
    291382
     
    319410        }
    320411
    321         CompoundStmt * create_terminate_caller(
     412        CompoundStmt * ExceptionMutatorCore::create_terminate_caller(
    322413                        FunctionDecl * try_wrapper,
    323414                        FunctionDecl * terminate_catch,
    324                         FunctionDecl * terminate_match) {
     415                        FunctionDecl * terminate_match ) {
     416                // { __cfaehm__try_terminate(`try`, `catch`, `match`); }
    325417
    326418                UntypedExpr * caller = new UntypedExpr( new NameExpr(
     
    336428        }
    337429
    338         FunctionDecl * create_resume_handler( CatchList &handlers ) {
     430        FunctionDecl * ExceptionMutatorCore::create_resume_handler(
     431                        CatchList &handlers ) {
     432                // bool handle(exception * except) {
     433                //     HANDLER WRAPPERS { `hander->body`; return true; }
     434                // }
    339435                CompoundStmt * body = new CompoundStmt( noLabels );
    340436
     
    369465        }
    370466
    371         CompoundStmt * create_resume_wrapper(
    372                         StructDecl * node_decl,
     467        CompoundStmt * ExceptionMutatorCore::create_resume_wrapper(
    373468                        Statement * wraps,
    374469                        FunctionDecl * resume_handler ) {
     
    414509        }
    415510
    416         FunctionDecl * create_finally_wrapper( TryStmt * tryStmt ) {
     511        FunctionDecl * ExceptionMutatorCore::create_finally_wrapper(
     512                        TryStmt * tryStmt ) {
     513                // void finally() { <finally code> }
    417514                FinallyStmt * finally = tryStmt->get_finally();
    418515                CompoundStmt * body = finally->get_block();
     
    425522        }
    426523
    427         ObjectDecl * create_finally_hook(
    428                         StructDecl * hook_decl, FunctionDecl * finally_wrapper ) {
     524        ObjectDecl * ExceptionMutatorCore::create_finally_hook(
     525                        FunctionDecl * finally_wrapper ) {
    429526                // struct __cfaehm__cleanup_hook __finally_hook
    430527                //      __attribute__((cleanup( finally_wrapper )));
     
    444541                        nullptr,
    445542                        new StructInstType(
    446                                 emptyQualifiers,
     543                                noQualifiers,
    447544                                hook_decl
    448545                                ),
     
    452549        }
    453550
    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         };
     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        }
    483593
    484594        Statement * ExceptionMutatorCore::postmutate( ThrowStmt *throwStmt ) {
     595                assert( except_decl );
     596
    485597                // Ignoring throwStmt->get_target() for now.
    486598                if ( ThrowStmt::Terminate == throwStmt->get_kind() ) {
     
    510622
    511623        Statement * ExceptionMutatorCore::postmutate( TryStmt *tryStmt ) {
     624                assert( except_decl );
    512625                assert( node_decl );
    513626                assert( hook_decl );
     
    524637                        appendDeclStmt( block, finally_block );
    525638                        // Create and add the finally cleanup hook.
    526                         appendDeclStmt( block,
    527                                 create_finally_hook( hook_decl, finally_block ) );
     639                        appendDeclStmt( block, create_finally_hook( finally_block ) );
    528640                }
    529641
     
    539651                        appendDeclStmt( block, resume_handler );
    540652                        // Prepare hooks
    541                         inner = create_resume_wrapper( node_decl, inner, resume_handler );
     653                        inner = create_resume_wrapper( inner, resume_handler );
    542654                }
    543655
     
    560672                block->push_back( inner );
    561673
    562                 //free_all( termination_handlers );
    563                 //free_all( resumption_handlers );
    564 
    565674                return block;
    566675        }
    567676
    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 
    591677        void translateEHM( std::list< Declaration *> & translationUnit ) {
    592                 init_func_types();
    593 
    594678                PassVisitor<ExceptionMutatorCore> translator;
    595679                mutateAll( translationUnit, translator );
  • src/ControlStruct/ExceptTranslate.h

    rfd344aa r9236060  
    99// Author           : Andrew Beach
    1010// Created On       : Tus Jun 06 10:13:00 2017
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Jun 30 10:20:00 2017
    13 // Update Count     : 2
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:19:23 2017
     13// Update Count     : 4
    1414//
    1515
    16 #ifndef EXCEPT_TRANSLATE_H
    17 #define EXCEPT_TRANSLATE_H
     16#pragma once
    1817
    1918#include <list>
     
    2221namespace ControlStruct {
    2322        void translateEHM( std::list< Declaration *> & translationUnit );
    24         /* Converts exception handling structures into their underlying C code.
    25          * Translation does use the exception handling header, make sure it is
    26          * visible wherever translation occurs.
    27          */
     23        // Converts exception handling structures into their underlying C code.  Translation does use the exception
     24        // handling header, make sure it is visible wherever translation occurs.
    2825}
    2926
    30 #endif // EXCEPT_TRANSLATE_H
     27// Local Variables: //
     28// tab-width: 4 //
     29// mode: c++ //
     30// compile-command: "make install" //
     31// End: //
  • src/ControlStruct/ForExprMutator.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Jan 25 21:22:13 2016
    13 // Update Count     : 3
     12// Last Modified On : Sat Jul 22 09:17:08 2017
     13// Update Count     : 4
    1414//
    1515
    16 #ifndef FOR_MUTATOR_H
    17 #define FOR_MUTATOR_H
     16#pragma once
    1817
    1918#include "SynTree/Mutator.h"
     
    2726} // namespace ControlStruct
    2827
    29 #endif // CHOOSE_MUTATOR_H
    30 
    3128// Local Variables: //
    3229// tab-width: 4 //
  • src/ControlStruct/LabelFixer.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Jul 12 17:36:16 2016
    13 // Update Count     : 33
     12// Last Modified On : Sat Jul 22 09:17:24 2017
     13// Update Count     : 34
    1414//
    1515
    16 #ifndef LABEL_FIXER_H
    17 #define LABEL_FIXER_H
     16#pragma once
    1817
    1918#include "Common/utility.h"
     
    8382} // namespace ControlStruct
    8483
    85 #endif // LABEL_FIXER_H
    86 
    8784// Local Variables: //
    8885// tab-width: 4 //
  • src/ControlStruct/LabelGenerator.h

    rfd344aa r9236060  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Jun 03 14:16:26 2015
    13 // Update Count     : 5
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:20:14 2017
     13// Update Count     : 6
    1414//
    1515
    16 #ifndef LABEL_GENERATOR_H
    17 #define LABEL_GENERATOR_H
     16#pragma once
    1817
    1918#include "SynTree/SynTree.h"
     
    3534} // namespace ControlStruct
    3635
    37 #endif // LABEL_GENERATOR_H
    38 
    3936// Local Variables: //
    4037// tab-width: 4 //
  • src/ControlStruct/MLEMutator.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Jul 12 17:37:01 2016
    13 // Update Count     : 34
     12// Last Modified On : Sat Jul 22 09:19:59 2017
     13// Update Count     : 35
    1414//
    1515
    16 #ifndef MLE_MUTATOR_H
    17 #define MLE_MUTATOR_H
     16#pragma once
    1817
    1918#include <map>
     
    8988} // namespace ControlStruct
    9089
    91 #endif // MLE_MUTATOR_H
    92 
    9390// Local Variables: //
    9491// tab-width: 4 //
  • src/ControlStruct/Mutate.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 19 15:31:20 2015
    13 // Update Count     : 2
     12// Last Modified On : Sat Jul 22 09:17:59 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef CTRLS_MUTATE_H
    17 #define CTRLS_MUTATE_H
     16#pragma once
    1817
    1918#include <list>
     
    2726} // namespace ControlStruct
    2827
    29 #endif // CTRLS_MUTATE_H
    30 
    3128// Local Variables: //
    3229// tab-width: 4 //
  • src/GenPoly/Box.cc

    rfd344aa r9236060  
    2727#include "Box.h"
    2828#include "DeclMutator.h"
     29#include "Lvalue.h"
     30#include "FindFunction.h"
    2931#include "PolyMutator.h"
    30 #include "FindFunction.h"
    3132#include "ScopedSet.h"
    3233#include "ScrubTyVars.h"
     
    204205                };
    205206
    206                 /// Replaces initialization of polymorphic values with alloca, declaration of dtype/ftype with appropriate void expression, and sizeof expressions of polymorphic types with the proper variable
     207                /// Replaces initialization of polymorphic values with alloca, declaration of dtype/ftype with appropriate void expression, sizeof expressions of polymorphic types with the proper variable, and strips fields from generic struct declarations.
    207208                class Pass3 final : public PolyMutator {
    208209                  public:
     
    212213                        using PolyMutator::mutate;
    213214                        virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override;
     215                        virtual Declaration *mutate( StructDecl *structDecl ) override;
     216                        virtual Declaration *mutate( UnionDecl *unionDecl ) override;
    214217                        virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) override;
    215218                        virtual TypedefDecl *mutate( TypedefDecl *objectDecl ) override;
     
    757760                        assertf( arg->has_result(), "arg does not have result: %s", toString( arg ).c_str() );
    758761                        if ( isPolyType( param, exprTyVars ) ) {
    759                                 if ( isPolyType( arg->get_result() ) ) {
     762                                Type * newType = arg->get_result()->clone();
     763                                if ( env ) env->apply( newType );
     764                                std::auto_ptr<Type> manager( newType );
     765                                if ( isPolyType( newType ) ) {
    760766                                        // if the argument's type is polymorphic, we don't need to box again!
    761767                                        return;
    762                                 } else if ( arg->get_result()->get_lvalue() ) {  // xxx - is this still right??
    763                                 // xxx - dynamic_cast<ReferenceType *>( arg->get_result() )??
    764                                         // VariableExpr and MemberExpr are lvalues; need to check this isn't coming from the second arg of a comma expression though (not an lvalue)
    765                                         // xxx - need to test that this code is still reachable
    766                                         if ( CommaExpr *commaArg = dynamic_cast< CommaExpr* >( arg ) ) {
    767                                                 commaArg->set_arg2( new AddressExpr( commaArg->get_arg2() ) );
    768                                         } else {
    769                                                 arg = new AddressExpr( arg );
    770                                         }
     768                                } else if ( arg->get_result()->get_lvalue() ) {
     769                                        // argument expression may be CFA lvalue, but not C lvalue -- apply generalizedLvalue transformations.
     770                                        arg =  generalizedLvalue( new AddressExpr( arg ) );
    771771                                        if ( ! ResolvExpr::typesCompatible( param, arg->get_result(), SymTab::Indexer() ) ) {
    772772                                                // silence warnings by casting boxed parameters when the actual type does not match up with the formal type.
     
    17601760
    17611761                Expression *PolyGenericCalculator::mutate( SizeofExpr *sizeofExpr ) {
    1762                         Type *ty = sizeofExpr->get_type();
     1762                        Type *ty = sizeofExpr->get_isType() ? sizeofExpr->get_type() : sizeofExpr->get_expr()->get_result();
    17631763                        if ( findGeneric( ty ) ) {
    17641764                                Expression *ret = new NameExpr( sizeofName( mangleType( ty ) ) );
     
    17701770
    17711771                Expression *PolyGenericCalculator::mutate( AlignofExpr *alignofExpr ) {
    1772                         Type *ty = alignofExpr->get_type();
     1772                        Type *ty = alignofExpr->get_isType() ? alignofExpr->get_type() : alignofExpr->get_expr()->get_result();
    17731773                        if ( findGeneric( ty ) ) {
    17741774                                Expression *ret = new NameExpr( alignofName( mangleType( ty ) ) );
     
    18801880                }
    18811881
     1882                /// Strips the members from a generic aggregate
     1883                void stripGenericMembers(AggregateDecl* decl) {
     1884                        if ( ! decl->get_parameters().empty() ) decl->get_members().clear();
     1885                }
     1886
     1887                Declaration *Pass3::mutate( StructDecl *structDecl ) {
     1888                        stripGenericMembers( structDecl );
     1889                        return structDecl;
     1890                }
     1891
     1892                Declaration *Pass3::mutate( UnionDecl *unionDecl ) {
     1893                        stripGenericMembers( unionDecl );
     1894                        return unionDecl;
     1895                }
     1896
    18821897                TypeDecl * Pass3::mutate( TypeDecl *typeDecl ) {
    18831898//   Initializer *init = 0;
  • src/GenPoly/Box.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Nov 19 17:24:01 2015
    13 // Update Count     : 5
     12// Last Modified On : Sat Jul 22 09:23:52 2017
     13// Update Count     : 6
    1414//
    1515
    16 #ifndef _BOX_H
    17 #define _BOX_H
     16#pragma once
    1817
    1918#include <list>
     
    2524} // namespace GenPoly
    2625
    27 #endif // _BOX_H
    28 
    2926// Local Variables: //
    3027// tab-width: 4 //
  • src/GenPoly/CopyParams.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 19 07:34:25 2015
    13 // Update Count     : 1
     12// Last Modified On : Sat Jul 22 09:23:09 2017
     13// Update Count     : 2
    1414//
    1515
    16 #ifndef _COPYPARAMS_H
    17 #define _COPYPARAMS_H
     16#pragma once
    1817
    1918#include "SynTree/SynTree.h"
     
    2423} // namespace GenPoly
    2524
    26 #endif // _COPYPARAMS_H
    27 
    2825// Local Variables: //
    2926// tab-width: 4 //
  • src/GenPoly/DeclMutator.h

    rfd344aa r9236060  
    1010// Created On       : Fri Nov 27 14:44:00 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Jul 12 17:39:01 2016
    13 // Update Count     : 2
     12// Last Modified On : Sat Jul 22 09:21:12 2017
     13// Update Count     : 4
    1414//
    1515
    16 #ifndef _DECLMUTATOR_H
    17 #define _DECLMUTATOR_H
     16#pragma once
    1817
    1918#include <list>
     
    2726        /// Mutates a list of declarations, providing a means of adding new declarations into the list
    2827        class DeclMutator : public Mutator {
    29         public:
     28          public:
    3029                typedef Mutator Parent;
    3130
     
    5049                /// Called on exit from a scope; overriders should call this as a super-class call
    5150                virtual void doEndScope();
    52         protected:
     51          protected:
    5352                /// Mutate a statement that forms its own scope
    5453                Statement* mutateStatement( Statement *stmt );
     
    5958                /// Add a declaration to the list to be added after the current position
    6059                void addDeclarationAfter( Declaration* decl );
    61         private:
     60          private:
    6261                /// A stack of declarations to add before the current declaration or statement
    6362                std::vector< std::list< Declaration* > > declsToAdd;
     
    6766} // namespace
    6867
    69 #endif // _DECLMUTATOR_H
    70 
    7168// Local Variables: //
    7269// tab-width: 4 //
  • src/GenPoly/ErasableScopedMap.h

    rfd344aa r9236060  
    99// Author           : Aaron B. Moss
    1010// Created On       : Wed Dec 2 11:37:00 2015
    11 // Last Modified By : Aaron B. Moss
    12 // Last Modified On : Wed Dec 2 11:37:00 2015
    13 // Update Count     : 1
    14 //
    15 
    16 #ifndef _ERASABLESCOPEDMAP_H
    17 #define _ERASABLESCOPEDMAP_H
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:23:24 2017
     13// Update Count     : 2
     14//
     15
     16#pragma once
    1817
    1918#include <cassert>
     
    278277} // namespace GenPoly
    279278
    280 #endif // _ERASABLESCOPEDMAP_H
    281 
    282279// Local Variables: //
    283280// tab-width: 4 //
  • src/GenPoly/FindFunction.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 19 07:36:35 2015
    13 // Update Count     : 1
     12// Last Modified On : Sat Jul 22 09:23:36 2017
     13// Update Count     : 2
    1414//
    1515
    16 #ifndef FINDFUNCTION_H
    17 #define FINDFUNCTION_H
     16#pragma once
    1817
    1918#include "SynTree/SynTree.h"
     
    2928} // namespace GenPoly
    3029
    31 #endif // FINDFUNCTION_H
    32 
    3330// Local Variables: //
    3431// tab-width: 4 //
  • src/GenPoly/GenPoly.h

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Tue Nov 24 15:24:38 2015
    13 // Update Count     : 6
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:22:57 2017
     13// Update Count     : 7
    1414//
    1515
    16 #ifndef GENPOLY_H
    17 #define GENPOLY_H
     16#pragma once
    1817
    1918#include <string>
     
    111110} // namespace GenPoly
    112111
    113 #endif // GENPOLY_H
    114 
    115112// Local Variables: //
    116113// tab-width: 4 //
  • src/GenPoly/InstantiateGeneric.h

    rfd344aa r9236060  
    99// Author           : Aaron B. Moss
    1010// Created On       : Thu Aug 04 18:33:00 2016
    11 // Last Modified By : Aaron B. Moss
    12 // Last Modified On : Thu Aug 04 18:33:00 2016
    13 // Update Count     : 1
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:22:42 2017
     13// Update Count     : 2
    1414//
    1515
    16 #ifndef _INSTANTIATEGENERIC_H
    17 #define _INSTANTIATEGENERIC_H
     16#pragma once
    1817
    1918#include "SynTree/SynTree.h"
     
    2625} // namespace GenPoly
    2726
    28 #endif // _INSTANTIATEGENERIC_H
    29 
    3027// Local Variables: //
    3128// tab-width: 4 //
  • src/GenPoly/Lvalue.cc

    rfd344aa r9236060  
    3030
    3131#include "ResolvExpr/Resolver.h"
     32#include "ResolvExpr/TypeEnvironment.h"
    3233#include "ResolvExpr/typeops.h"
     34#include "ResolvExpr/Unify.h"
    3335
    3436#include "Common/UniqueName.h"
     
    6466
    6567                struct ReferenceConversions final {
    66                         void premutate( AddressExpr * addrExpr );
    67 
    6868                        Expression * postmutate( CastExpr * castExpr );
    6969                        Expression * postmutate( AddressExpr * addrExpr );
     
    8989                struct GeneralizedLvalue final : public WithVisitorRef<GeneralizedLvalue> {
    9090                        Expression * postmutate( AddressExpr * addressExpr );
     91                        Expression * postmutate( MemberExpr * memExpr );
     92
     93                        template<typename Func>
     94                        Expression * applyTransformation( Expression * expr, Expression * arg, Func mkExpr );
    9195                };
    9296
     
    133137                // from this point forward, no other pass should create reference types.
    134138                referencesEliminated = true;
     139        }
     140
     141        Expression * generalizedLvalue( Expression * expr ) {
     142                PassVisitor<GeneralizedLvalue> genLval;
     143                return expr->acceptMutator( genLval );
    135144        }
    136145
     
    359368                }
    360369
    361                 Expression * GeneralizedLvalue::postmutate( AddressExpr * addrExpr ) {
    362                         if ( CommaExpr * commaExpr = dynamic_cast< CommaExpr * >( addrExpr->get_arg() ) ) {
     370                template<typename Func>
     371                Expression * GeneralizedLvalue::applyTransformation( Expression * expr, Expression * arg, Func mkExpr ) {
     372                        if ( CommaExpr * commaExpr = dynamic_cast< CommaExpr * >( arg ) ) {
    363373                                Expression * arg1 = commaExpr->get_arg1()->clone();
    364374                                Expression * arg2 = commaExpr->get_arg2()->clone();
    365                                 Expression * ret = new CommaExpr( arg1, (new AddressExpr( arg2 ))->acceptMutator( *visitor ) );
    366                                 ret->set_env( addrExpr->get_env() );
    367                                 addrExpr->set_env( nullptr );
    368                                 delete addrExpr;
    369                                 return ret;
    370                         } else if ( ConditionalExpr * condExpr = dynamic_cast< ConditionalExpr * >( addrExpr->get_arg() ) ) {
     375                                Expression * ret = new CommaExpr( arg1, mkExpr( arg2 )->acceptMutator( *visitor ) );
     376                                ret->set_env( expr->get_env() );
     377                                expr->set_env( nullptr );
     378                                delete expr;
     379                                return ret;
     380                        } else if ( ConditionalExpr * condExpr = dynamic_cast< ConditionalExpr * >( arg ) ) {
    371381                                Expression * arg1 = condExpr->get_arg1()->clone();
    372382                                Expression * arg2 = condExpr->get_arg2()->clone();
    373383                                Expression * arg3 = condExpr->get_arg3()->clone();
    374                                 Expression * ret = new ConditionalExpr( arg1, (new AddressExpr( arg2 ))->acceptMutator( *visitor ), (new AddressExpr( arg3 ))->acceptMutator( *visitor ) );
    375                                 ret->set_env( addrExpr->get_env() );
    376                                 addrExpr->set_env( nullptr );
    377                                 delete addrExpr;
    378                                 return ret;
    379                         }
    380                         return addrExpr;
     384                                ConditionalExpr * ret = new ConditionalExpr( arg1, mkExpr( arg2 )->acceptMutator( *visitor ), mkExpr( arg3 )->acceptMutator( *visitor ) );
     385                                ret->set_env( expr->get_env() );
     386                                expr->set_env( nullptr );
     387                                delete expr;
     388
     389                                // conditional expr type may not be either of the argument types, need to unify
     390                                using namespace ResolvExpr;
     391                                Type* commonType = nullptr;
     392                                TypeEnvironment newEnv;
     393                                AssertionSet needAssertions, haveAssertions;
     394                                OpenVarSet openVars;
     395                                unify( ret->get_arg2()->get_result(), ret->get_arg3()->get_result(), newEnv, needAssertions, haveAssertions, openVars, SymTab::Indexer(), commonType );
     396                                ret->set_result( commonType ? commonType : ret->get_arg2()->get_result()->clone() );
     397                                return ret;
     398                        }
     399                        return expr;
     400                }
     401
     402                Expression * GeneralizedLvalue::postmutate( MemberExpr * memExpr ) {
     403                        return applyTransformation( memExpr, memExpr->get_aggregate(), [=]( Expression * aggr ) { return new MemberExpr( memExpr->get_member(), aggr ); } );
     404                }
     405
     406                Expression * GeneralizedLvalue::postmutate( AddressExpr * addrExpr ) {
     407                        return applyTransformation( addrExpr, addrExpr->get_arg(), []( Expression * arg ) { return new AddressExpr( arg ); } );
    381408                }
    382409
  • src/GenPoly/Lvalue.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 19 07:42:09 2015
    13 // Update Count     : 1
     12// Last Modified On : Sat Jul 22 09:21:59 2017
     13// Update Count     : 2
    1414//
    1515
    16 #ifndef _LVALUE_H
    17 #define _LVALUE_H
     16#pragma once
    1817
    1918#include <list>
     
    2726        /// true after reference types have been eliminated from the source code. After this point, reference types should not be added to the AST.
    2827        bool referencesPermissable();
     28
     29        /// applies transformations that allow GCC to accept more complicated lvalue expressions, e.g. &(a, b)
     30        Expression * generalizedLvalue( Expression * expr );
    2931} // namespace GenPoly
    30 
    31 #endif // _LVALUE_H
    3232
    3333// Local Variables: //
  • src/GenPoly/PolyMutator.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Jul 12 17:39:41 2016
    13 // Update Count     : 6
     12// Last Modified On : Sat Jul 22 09:20:31 2017
     13// Update Count     : 7
    1414//
    1515
    16 #ifndef _POLYMUTATOR_H
    17 #define _POLYMUTATOR_H
     16#pragma once
    1817
    1918#include <map>
     
    6665} // namespace
    6766
    68 #endif // _POLYMUTATOR_H
    69 
    7067// Local Variables: //
    7168// tab-width: 4 //
  • src/GenPoly/ScopedSet.h

    rfd344aa r9236060  
    99// Author           : Aaron B. Moss
    1010// Created On       : Thu Dec 3 11:51:00 2015
    11 // Last Modified By : Aaron B. Moss
    12 // Last Modified On : Thu Dec 3 11:51:00 2015
    13 // Update Count     : 1
    14 //
    15 
    16 #ifndef _SCOPEDSET_H
    17 #define _SCOPEDSET_H
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:22:17 2017
     13// Update Count     : 2
     14//
     15
     16#pragma once
    1817
    1918#include <iterator>
     
    247246} // namespace GenPoly
    248247
    249 #endif // _SCOPEDSET_H
    250 
    251248// Local Variables: //
    252249// tab-width: 4 //
  • src/GenPoly/ScrubTyVars.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 19 07:48:14 2015
    13 // Update Count     : 1
     12// Last Modified On : Sat Jul 22 09:21:47 2017
     13// Update Count     : 2
    1414//
    1515
    16 #ifndef _SCRUBTYVARS_H
    17 #define _SCRUBTYVARS_H
     16#pragma once
    1817
    1918#include <string>
     
    9594} // namespace GenPoly
    9695
    97 #endif // _SCRUBTYVARS_H
    98 
    9996// Local Variables: //
    10097// tab-width: 4 //
  • src/GenPoly/Specialize.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 19 07:53:58 2015
    13 // Update Count     : 1
     12// Last Modified On : Sat Jul 22 09:22:31 2017
     13// Update Count     : 2
    1414//
    1515
    16 #ifndef _SPECIALIZE_H
    17 #define _SPECIALIZE_H
     16#pragma once
    1817
    1918#include <list>
     
    2625} // namespace GenPoly
    2726
    28 #endif // _SPECIALIZE_H
    29 
    3027// Local Variables: //
    3128// tab-width: 4 //
  • src/InitTweak/FixGlobalInit.h

    rfd344aa r9236060  
    99// Author           : Rob Schluntz
    1010// Created On       : Mon May 04 15:14:56 2016
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Fri May 06 16:07:47 2016
    13 // Update Count     : 2
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:30:54 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef FIX_GLOBAL_INIT_H
    17 #define FIX_GLOBAL_INIT_H
     16#pragma once
    1817
    1918#include <string>
     
    3433} // namespace
    3534
    36 #endif // GENPOLY_POLYMUTATOR_H
    37 
    3835// Local Variables: //
    3936// tab-width: 4 //
  • src/InitTweak/FixInit.h

    rfd344aa r9236060  
    99// Author           : Rob Schluntz
    1010// Created On       : Wed Jan 13 16:29:30 2016
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Fri May 13 11:27:52 2016
    13 // Update Count     : 5
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:31:06 2017
     13// Update Count     : 6
    1414//
    1515
    16 #ifndef FIX_INIT_H
    17 #define FIX_INIT_H
     16#pragma once
    1817
    1918#include <string>
     
    3029} // namespace
    3130
    32 #endif // GENPOLY_POLYMUTATOR_H
    33 
    3431// Local Variables: //
    3532// tab-width: 4 //
  • src/InitTweak/GenInit.h

    rfd344aa r9236060  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Fri May 13 11:27:19 2016
    13 // Update Count     : 3
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:31:19 2017
     13// Update Count     : 4
    1414//
    1515
    16 #ifndef GEN_INIT_H
    17 #define GEN_INIT_H
     16#pragma once
    1817
    1918#include <string>
     
    3534} // namespace
    3635
    37 #endif // INITTWEAK_GENINIT_H
    38 
    3936// Local Variables: //
    4037// tab-width: 4 //
  • src/InitTweak/InitTweak.h

    rfd344aa r9236060  
    99// Author           : Rob Schluntz
    1010// Created On       : Fri May 13 11:26:36 2016
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Fri May 13 11:35:36 2016
    13 // Update Count     : 3
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:30:33 2017
     13// Update Count     : 4
    1414//
    1515
    16 #ifndef INIT_TWEAK_H
    17 #define INIT_TWEAK_H
     16#pragma once
    1817
    1918#include <string>
     
    110109} // namespace
    111110
    112 #endif // INITTWEAK_GENINIT_H
    113 
    114111// Local Variables: //
    115112// tab-width: 4 //
  • src/MakeLibCfa.h

    rfd344aa r9236060  
    1010// Created On       : Sat May 16 10:42:14 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat May 16 10:43:29 2015
    13 // Update Count     : 1
     12// Last Modified On : Sat Jul 22 09:31:35 2017
     13// Update Count     : 2
    1414//
    1515
    16 #ifndef LIBCFA_MAKELIBCFA_H
    17 #define LIBCFA_MAKELIBCFA_H
     16#pragma once
    1817
    1918#include <list>  // for list
     
    2524} // namespace LibCfa
    2625
    27 #endif // LIBCFA_MAKELIBCFA_H
    28 
    2926// Local Variables: //
    3027// tab-width: 4 //
  • src/Makefile.am

    rfd344aa r9236060  
    1010## Author           : Peter A. Buhr
    1111## Created On       : Sun May 31 08:51:46 2015
    12 ## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Thu Oct 27 20:41:25 2016
    14 ## Update Count     : 75
     12## Last Modified By : Andrew Beach
     13## Last Modified On : Tus Jul 25 10:34:00 2017
     14## Update Count     : 76
    1515###############################################################################
    1616
     
    3737include SynTree/module.mk
    3838include Tuples/module.mk
     39include Virtual/module.mk
    3940
    4041# put into lib for now
     
    4243cfa_cpplib_PROGRAMS = driver/cfa-cpp
    4344driver_cfa_cpp_SOURCES = ${SRC}
    44 driver_cfa_cpp_LDADD = ${LEXLIB} -ldl                   # yywrap
     45driver_cfa_cpp_LDADD = -ldl                     # yywrap
    4546driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -Wextra -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14
    4647driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic
  • src/Makefile.in

    rfd344aa r9236060  
    2323#SRC +=  ArgTweak/Rewriter.cc \
    2424#       ArgTweak/Mutate.cc
     25
     26######################### -*- Mode: Makefile-Gmake -*- ########################
     27###############################################################################
    2528
    2629######################### -*- Mode: Makefile-Gmake -*- ########################
     
    255258        Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT) \
    256259        Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT) \
    257         Tuples/driver_cfa_cpp-Explode.$(OBJEXT)
     260        Tuples/driver_cfa_cpp-Explode.$(OBJEXT) \
     261        Virtual/driver_cfa_cpp-ExpandCasts.$(OBJEXT)
    258262am_driver_cfa_cpp_OBJECTS = $(am__objects_1)
    259263driver_cfa_cpp_OBJECTS = $(am_driver_cfa_cpp_OBJECTS)
    260 am__DEPENDENCIES_1 =
    261 driver_cfa_cpp_DEPENDENCIES = $(am__DEPENDENCIES_1)
     264driver_cfa_cpp_DEPENDENCIES =
    262265driver_cfa_cpp_LINK = $(CXXLD) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) \
    263266        $(driver_cfa_cpp_LDFLAGS) $(LDFLAGS) -o $@
     
    355358        $(srcdir)/Parser/module.mk $(srcdir)/ResolvExpr/module.mk \
    356359        $(srcdir)/SymTab/module.mk $(srcdir)/SynTree/module.mk \
    357         $(srcdir)/Tuples/module.mk $(top_srcdir)/automake/depcomp \
    358         $(top_srcdir)/automake/ylwrap Parser/lex.cc Parser/parser.cc \
    359         Parser/parser.hh
     360        $(srcdir)/Tuples/module.mk $(srcdir)/Virtual/module.mk \
     361        $(top_srcdir)/automake/depcomp $(top_srcdir)/automake/ylwrap \
     362        Parser/lex.cc Parser/parser.cc Parser/parser.hh
    360363DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
    361364ACLOCAL = @ACLOCAL@
     
    534537        SynTree/Attribute.cc SynTree/VarExprReplacer.cc \
    535538        Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc \
    536         Tuples/Explode.cc
     539        Tuples/Explode.cc Virtual/ExpandCasts.cc
    537540MAINTAINERCLEANFILES = Parser/parser.output ${libdir}/${notdir \
    538541        ${cfa_cpplib_PROGRAMS}}
     
    545548cfa_cpplibdir = ${CFA_LIBDIR}
    546549driver_cfa_cpp_SOURCES = ${SRC}
    547 driver_cfa_cpp_LDADD = ${LEXLIB} -ldl                   # yywrap
     550driver_cfa_cpp_LDADD = -ldl                     # yywrap
    548551driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -Wextra -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14
    549552driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic
     
    553556.SUFFIXES:
    554557.SUFFIXES: .cc .ll .o .obj .yy
    555 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/CodeGen/module.mk $(srcdir)/CodeTools/module.mk $(srcdir)/Concurrency/module.mk $(srcdir)/Common/module.mk $(srcdir)/ControlStruct/module.mk $(srcdir)/GenPoly/module.mk $(srcdir)/InitTweak/module.mk $(srcdir)/Parser/module.mk $(srcdir)/ResolvExpr/module.mk $(srcdir)/SymTab/module.mk $(srcdir)/SynTree/module.mk $(srcdir)/Tuples/module.mk $(am__configure_deps)
     558$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/CodeGen/module.mk $(srcdir)/CodeTools/module.mk $(srcdir)/Concurrency/module.mk $(srcdir)/Common/module.mk $(srcdir)/ControlStruct/module.mk $(srcdir)/GenPoly/module.mk $(srcdir)/InitTweak/module.mk $(srcdir)/Parser/module.mk $(srcdir)/ResolvExpr/module.mk $(srcdir)/SymTab/module.mk $(srcdir)/SynTree/module.mk $(srcdir)/Tuples/module.mk $(srcdir)/Virtual/module.mk $(am__configure_deps)
    556559        @for dep in $?; do \
    557560          case '$(am__configure_deps)' in \
     
    573576            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
    574577        esac;
    575 $(srcdir)/CodeGen/module.mk $(srcdir)/CodeTools/module.mk $(srcdir)/Concurrency/module.mk $(srcdir)/Common/module.mk $(srcdir)/ControlStruct/module.mk $(srcdir)/GenPoly/module.mk $(srcdir)/InitTweak/module.mk $(srcdir)/Parser/module.mk $(srcdir)/ResolvExpr/module.mk $(srcdir)/SymTab/module.mk $(srcdir)/SynTree/module.mk $(srcdir)/Tuples/module.mk $(am__empty):
     578$(srcdir)/CodeGen/module.mk $(srcdir)/CodeTools/module.mk $(srcdir)/Concurrency/module.mk $(srcdir)/Common/module.mk $(srcdir)/ControlStruct/module.mk $(srcdir)/GenPoly/module.mk $(srcdir)/InitTweak/module.mk $(srcdir)/Parser/module.mk $(srcdir)/ResolvExpr/module.mk $(srcdir)/SymTab/module.mk $(srcdir)/SynTree/module.mk $(srcdir)/Tuples/module.mk $(srcdir)/Virtual/module.mk $(am__empty):
    576579
    577580$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
     
    942945Tuples/driver_cfa_cpp-Explode.$(OBJEXT): Tuples/$(am__dirstamp) \
    943946        Tuples/$(DEPDIR)/$(am__dirstamp)
     947Virtual/$(am__dirstamp):
     948        @$(MKDIR_P) Virtual
     949        @: > Virtual/$(am__dirstamp)
     950Virtual/$(DEPDIR)/$(am__dirstamp):
     951        @$(MKDIR_P) Virtual/$(DEPDIR)
     952        @: > Virtual/$(DEPDIR)/$(am__dirstamp)
     953Virtual/driver_cfa_cpp-ExpandCasts.$(OBJEXT): Virtual/$(am__dirstamp) \
     954        Virtual/$(DEPDIR)/$(am__dirstamp)
    944955driver/$(am__dirstamp):
    945956        @$(MKDIR_P) driver
     
    964975        -rm -f SynTree/*.$(OBJEXT)
    965976        -rm -f Tuples/*.$(OBJEXT)
     977        -rm -f Virtual/*.$(OBJEXT)
    966978
    967979distclean-compile:
     
    10791091@AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleAssignment.Po@am__quote@
    10801092@AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po@am__quote@
     1093@AMDEP_TRUE@@am__include@ @am__quote@Virtual/$(DEPDIR)/driver_cfa_cpp-ExpandCasts.Po@am__quote@
    10811094
    10821095.cc.o:
     
    26492662@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    26502663@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Tuples/driver_cfa_cpp-Explode.obj `if test -f 'Tuples/Explode.cc'; then $(CYGPATH_W) 'Tuples/Explode.cc'; else $(CYGPATH_W) '$(srcdir)/Tuples/Explode.cc'; fi`
     2664
     2665Virtual/driver_cfa_cpp-ExpandCasts.o: Virtual/ExpandCasts.cc
     2666@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Virtual/driver_cfa_cpp-ExpandCasts.o -MD -MP -MF Virtual/$(DEPDIR)/driver_cfa_cpp-ExpandCasts.Tpo -c -o Virtual/driver_cfa_cpp-ExpandCasts.o `test -f 'Virtual/ExpandCasts.cc' || echo '$(srcdir)/'`Virtual/ExpandCasts.cc
     2667@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Virtual/$(DEPDIR)/driver_cfa_cpp-ExpandCasts.Tpo Virtual/$(DEPDIR)/driver_cfa_cpp-ExpandCasts.Po
     2668@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Virtual/ExpandCasts.cc' object='Virtual/driver_cfa_cpp-ExpandCasts.o' libtool=no @AMDEPBACKSLASH@
     2669@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     2670@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Virtual/driver_cfa_cpp-ExpandCasts.o `test -f 'Virtual/ExpandCasts.cc' || echo '$(srcdir)/'`Virtual/ExpandCasts.cc
     2671
     2672Virtual/driver_cfa_cpp-ExpandCasts.obj: Virtual/ExpandCasts.cc
     2673@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Virtual/driver_cfa_cpp-ExpandCasts.obj -MD -MP -MF Virtual/$(DEPDIR)/driver_cfa_cpp-ExpandCasts.Tpo -c -o Virtual/driver_cfa_cpp-ExpandCasts.obj `if test -f 'Virtual/ExpandCasts.cc'; then $(CYGPATH_W) 'Virtual/ExpandCasts.cc'; else $(CYGPATH_W) '$(srcdir)/Virtual/ExpandCasts.cc'; fi`
     2674@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Virtual/$(DEPDIR)/driver_cfa_cpp-ExpandCasts.Tpo Virtual/$(DEPDIR)/driver_cfa_cpp-ExpandCasts.Po
     2675@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Virtual/ExpandCasts.cc' object='Virtual/driver_cfa_cpp-ExpandCasts.obj' libtool=no @AMDEPBACKSLASH@
     2676@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     2677@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Virtual/driver_cfa_cpp-ExpandCasts.obj `if test -f 'Virtual/ExpandCasts.cc'; then $(CYGPATH_W) 'Virtual/ExpandCasts.cc'; else $(CYGPATH_W) '$(srcdir)/Virtual/ExpandCasts.cc'; fi`
    26512678
    26522679.ll.cc:
     
    27972824        -rm -f Tuples/$(DEPDIR)/$(am__dirstamp)
    27982825        -rm -f Tuples/$(am__dirstamp)
     2826        -rm -f Virtual/$(DEPDIR)/$(am__dirstamp)
     2827        -rm -f Virtual/$(am__dirstamp)
    27992828        -rm -f driver/$(am__dirstamp)
    28002829
     
    28122841
    28132842distclean: distclean-am
    2814         -rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR)
     2843        -rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR) Virtual/$(DEPDIR)
    28152844        -rm -f Makefile
    28162845distclean-am: clean-am distclean-compile distclean-generic \
     
    28582887
    28592888maintainer-clean: maintainer-clean-am
    2860         -rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR)
     2889        -rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR) Virtual/$(DEPDIR)
    28612890        -rm -f Makefile
    28622891maintainer-clean-am: distclean-am maintainer-clean-generic
  • src/Parser/DeclarationNode.cc

    rfd344aa r9236060  
    1010// Created On       : Sat May 16 12:34:05 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Jun 28 15:27:00 2017
    13 // Update Count     : 1019
     12// Last Modified On : Fri Jul 14 16:55:00 2017
     13// Update Count     : 1020
    1414//
    1515
     
    253253        newnode->type->aggregate.fields = fields;
    254254        newnode->type->aggregate.body = body;
     255        newnode->type->aggregate.tagged = false;
     256        newnode->type->aggregate.parent = nullptr;
    255257        return newnode;
    256258} // DeclarationNode::newAggregate
     
    273275        return newnode;
    274276} // DeclarationNode::newEnumConstant
     277
     278DeclarationNode * DeclarationNode::newTreeStruct( Aggregate kind, const string * name, const string * parent, ExpressionNode * actuals, DeclarationNode * fields, bool body ) {
     279        assert( name );
     280        DeclarationNode * newnode = new DeclarationNode;
     281        newnode->type = new TypeData( TypeData::Aggregate );
     282        newnode->type->aggregate.kind = kind;
     283        newnode->type->aggregate.name = name;
     284        newnode->type->aggregate.actuals = actuals;
     285        newnode->type->aggregate.fields = fields;
     286        newnode->type->aggregate.body = body;
     287        newnode->type->aggregate.tagged = true;
     288        newnode->type->aggregate.parent = parent;
     289        return newnode;
     290} // DeclarationNode::newTreeStruct
    275291
    276292DeclarationNode * DeclarationNode::newName( string * name ) {
  • src/Parser/ExpressionNode.cc

    rfd344aa r9236060  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 13:17:07 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jun 28 21:08:15 2017
    13 // Update Count     : 542
    14 //
    15 
    16 #include <cassert>
    17 #include <cctype>
    18 #include <climits>
    19 #include <cstdio>
    20 #include <algorithm>
     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
    2117#include <sstream>
    2218
     
    2622#include "SynTree/Expression.h"
    2723#include "SynTree/Declaration.h"
    28 #include "Common/UnimplementedError.h"
    2924#include "parserutility.h"
    30 #include "Common/utility.h"
    3125
    3226using namespace std;
     
    4640// type.
    4741
    48 Type::Qualifiers emptyQualifiers;                               // no qualifiers on constants
     42extern const Type::Qualifiers noQualifiers;             // no qualifiers on constants
    4943
    5044static inline bool checkU( char c ) { return c == 'u' || c == 'U'; }
     
    5549static inline bool checkX( char c ) { return c == 'x' || c == 'X'; }
    5650
    57 Expression *build_constantInteger( const std::string & str ) {
     51Expression * build_constantInteger( const std::string & str ) {
    5852        static const BasicType::Kind kind[2][3] = {
    5953                { BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt },
     
    6256        bool dec = true, Unsigned = false;                                      // decimal, unsigned constant
    6357        int size;                                                                                       // 0 => int, 1 => long, 2 => long long
    64         unsigned long long int v;                                                               // converted integral value
     58        unsigned long long int v;                                                       // converted integral value
    6559        size_t last = str.length() - 1;                                         // last character of constant
    66 
     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       
    6772        if ( str[0] == '0' ) {                                                          // octal/hex constant ?
    6873                dec = false;
     
    118123        } // if
    119124
    120         Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[Unsigned][size] ), str, v ) );
     125        ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[Unsigned][size] ), str, v ) );
     126  CLEANUP:
    121127        delete &str;                                                                            // created by lex
    122128        return ret;
    123129} // build_constantInteger
    124130
    125 Expression *build_constantFloat( const std::string & str ) {
     131Expression * build_constantFloat( const std::string & str ) {
    126132        static const BasicType::Kind kind[2][3] = {
    127133                { BasicType::Float, BasicType::Double, BasicType::LongDouble },
     
    153159        } // if
    154160
    155         Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[complx][size] ), str, v ) );
     161        Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[complx][size] ), str, v ) );
    156162        delete &str;                                                                            // created by lex
    157163        return ret;
    158164} // build_constantFloat
    159165
    160 Expression *build_constantChar( const std::string & str ) {
    161         Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::Char ), str, (unsigned long long int)(unsigned char)str[1] ) );
     166Expression * build_constantChar( const std::string & str ) {
     167        Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, BasicType::Char ), str, (unsigned long long int)(unsigned char)str[1] ) );
    162168        delete &str;                                                                            // created by lex
    163169        return ret;
    164170} // build_constantChar
    165171
    166 ConstantExpr *build_constantStr( const std::string & str ) {
     172ConstantExpr * build_constantStr( const std::string & str ) {
    167173        // string should probably be a primitive type
    168         ArrayType *at = new ArrayType( emptyQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ),
    169                                                                    new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ),  // +1 for '\0' and -2 for '"'
     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 '"'
    170176                                                                   false, false );
    171         // constant 0 is ignored for pure string value
    172         ConstantExpr * ret = new ConstantExpr( Constant( at, str, (unsigned long long int)0 ) );
     177        ConstantExpr * ret = new ConstantExpr( Constant( at, str, (unsigned long long int)0 ) ); // constant 0 is ignored for pure string value
    173178        delete &str;                                                                            // created by lex
    174179        return ret;
    175180} // build_constantStr
    176 
    177 Expression *build_constantZeroOne( const std::string & str ) {
    178         Expression * ret = new ConstantExpr( Constant( str == "0" ? (Type *)new ZeroType( emptyQualifiers ) : (Type*)new OneType( emptyQualifiers ), 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
    183181
    184182Expression * build_field_name_FLOATINGconstant( const std::string & str ) {
     
    209207} // build_field_name_fraction_constants
    210208
    211 
    212 
    213209Expression * build_field_name_REALFRACTIONconstant( const std::string & str ) {
    214210        if ( str.find_first_not_of( "0123456789", 1 ) != string::npos ) throw SemanticError( "invalid tuple index " + str );
     
    225221} // build_field_name_REALDECIMALconstant
    226222
    227 NameExpr * build_varref( const string *name ) {
    228         NameExpr *expr = new NameExpr( *name, nullptr );
     223NameExpr * build_varref( const string * name ) {
     224        NameExpr * expr = new NameExpr( *name, nullptr );
    229225        delete name;
    230226        return expr;
    231 }
    232 
    233 static const char *OperName[] = {
     227} // build_varref
     228
     229
     230static const char * OperName[] = {                                              // must harmonize with OperKinds
    234231        // diadic
    235         "SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "?*?", "?/?", "?%?", "||", "&&",
     232        "SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "?\\?", "?*?", "?/?", "?%?", "||", "&&",
    236233        "?|?", "?&?", "?^?", "Cast", "?<<?", "?>>?", "?<?", "?>?", "?<=?", "?>=?", "?==?", "?!=?",
    237         "?=?", "?@=?", "?*=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?",
     234        "?=?", "?@=?", "?\\=?", "?*=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?",
    238235        "?[?]", "...",
    239236        // monadic
    240237        "+?", "-?", "AddressOf", "*?", "!?", "~?", "++?", "?++", "--?", "?--", "&&"
    241 };
    242 
    243 Expression *build_cast( DeclarationNode *decl_node, ExpressionNode *expr_node ) {
    244         Type *targetType = maybeMoveBuildType( decl_node );
     238}; // OperName
     239
     240Expression * build_cast( DeclarationNode * decl_node, ExpressionNode * expr_node ) {
     241        Type * targetType = maybeMoveBuildType( decl_node );
    245242        if ( dynamic_cast< VoidType * >( targetType ) ) {
    246243                delete targetType;
     
    249246                return new CastExpr( maybeMoveBuild< Expression >(expr_node), targetType );
    250247        } // if
    251 }
    252 
    253 Expression *build_fieldSel( ExpressionNode *expr_node, Expression *member ) {
    254         UntypedMemberExpr *ret = new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) );
    255         return ret;
    256 }
    257 
    258 Expression *build_pfieldSel( ExpressionNode *expr_node, Expression *member ) {
    259         UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) );
     248} // build_cast
     249
     250Expression * build_virtual_cast( DeclarationNode * decl_node, ExpressionNode * expr_node ) {
     251        Type * targetType = maybeMoveBuildType( decl_node );
     252        Expression * castArg = maybeMoveBuild< Expression >( expr_node );
     253        return new VirtualCastExpr( castArg, targetType );
     254} // build_virtual_cast
     255
     256Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member ) {
     257        UntypedMemberExpr * ret = new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) );
     258        return ret;
     259} // build_fieldSel
     260
     261Expression * build_pfieldSel( ExpressionNode * expr_node, Expression * member ) {
     262        UntypedExpr * deref = new UntypedExpr( new NameExpr( "*?" ) );
    260263        deref->location = expr_node->location;
    261264        deref->get_args().push_back( maybeMoveBuild< Expression >(expr_node) );
    262         UntypedMemberExpr *ret = new UntypedMemberExpr( member, deref );
    263         return ret;
    264 }
    265 
    266 Expression *build_addressOf( ExpressionNode *expr_node ) {
     265        UntypedMemberExpr * ret = new UntypedMemberExpr( member, deref );
     266        return ret;
     267} // build_pfieldSel
     268
     269Expression * build_addressOf( ExpressionNode * expr_node ) {
    267270                return new AddressExpr( maybeMoveBuild< Expression >(expr_node) );
    268 }
    269 Expression *build_sizeOfexpr( ExpressionNode *expr_node ) {
     271} // build_addressOf
     272
     273Expression * build_sizeOfexpr( ExpressionNode * expr_node ) {
    270274        return new SizeofExpr( maybeMoveBuild< Expression >(expr_node) );
    271 }
    272 Expression *build_sizeOftype( DeclarationNode *decl_node ) {
     275} // build_sizeOfexpr
     276
     277Expression * build_sizeOftype( DeclarationNode * decl_node ) {
    273278        return new SizeofExpr( maybeMoveBuildType( decl_node ) );
    274 }
    275 Expression *build_alignOfexpr( ExpressionNode *expr_node ) {
     279} // build_sizeOftype
     280
     281Expression * build_alignOfexpr( ExpressionNode * expr_node ) {
    276282        return new AlignofExpr( maybeMoveBuild< Expression >(expr_node) );
    277 }
    278 Expression *build_alignOftype( DeclarationNode *decl_node ) {
     283} // build_alignOfexpr
     284
     285Expression * build_alignOftype( DeclarationNode * decl_node ) {
    279286        return new AlignofExpr( maybeMoveBuildType( decl_node) );
    280 }
    281 Expression *build_offsetOf( DeclarationNode *decl_node, NameExpr *member ) {
     287} // build_alignOftype
     288
     289Expression * build_offsetOf( DeclarationNode * decl_node, NameExpr * member ) {
    282290        Expression * ret = new UntypedOffsetofExpr( maybeMoveBuildType( decl_node ), member->get_name() );
    283291        delete member;
    284292        return ret;
    285 }
    286 
    287 Expression *build_and_or( ExpressionNode *expr_node1, ExpressionNode *expr_node2, bool kind ) {
     293} // build_offsetOf
     294
     295Expression * build_and_or( ExpressionNode * expr_node1, ExpressionNode * expr_node2, bool kind ) {
    288296        return new LogicalExpr( notZeroExpr( maybeMoveBuild< Expression >(expr_node1) ), notZeroExpr( maybeMoveBuild< Expression >(expr_node2) ), kind );
    289 }
    290 
    291 Expression *build_unary_val( OperKinds op, ExpressionNode *expr_node ) {
     297} // build_and_or
     298
     299Expression * build_unary_val( OperKinds op, ExpressionNode * expr_node ) {
    292300        std::list< Expression * > args;
    293301        args.push_back( maybeMoveBuild< Expression >(expr_node) );
    294302        return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
    295 }
    296 Expression *build_unary_ptr( OperKinds op, ExpressionNode *expr_node ) {
     303} // build_unary_val
     304
     305Expression * build_unary_ptr( OperKinds op, ExpressionNode * expr_node ) {
    297306        std::list< Expression * > args;
    298307        args.push_back(  maybeMoveBuild< Expression >(expr_node) ); // xxx
    299308        return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
    300 }
    301 Expression *build_binary_val( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {
     309} // build_unary_ptr
     310
     311Expression * build_binary_val( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) {
    302312        std::list< Expression * > args;
    303313        args.push_back( maybeMoveBuild< Expression >(expr_node1) );
    304314        args.push_back( maybeMoveBuild< Expression >(expr_node2) );
    305315        return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
    306 }
    307 Expression *build_binary_ptr( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {
     316} // build_binary_val
     317
     318Expression * build_binary_ptr( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) {
    308319        std::list< Expression * > args;
    309320        args.push_back( maybeMoveBuild< Expression >(expr_node1) );
    310321        args.push_back( maybeMoveBuild< Expression >(expr_node2) );
    311322        return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
    312 }
    313 
    314 Expression *build_cond( ExpressionNode *expr_node1, ExpressionNode *expr_node2, ExpressionNode *expr_node3 ) {
     323} // build_binary_ptr
     324
     325Expression * build_cond( ExpressionNode * expr_node1, ExpressionNode * expr_node2, ExpressionNode * expr_node3 ) {
    315326        return new ConditionalExpr( notZeroExpr( maybeMoveBuild< Expression >(expr_node1) ), maybeMoveBuild< Expression >(expr_node2), maybeMoveBuild< Expression >(expr_node3) );
    316 }
    317 
    318 Expression *build_comma( ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {
     327} // build_cond
     328
     329Expression * build_comma( ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) {
    319330        return new CommaExpr( maybeMoveBuild< Expression >(expr_node1), maybeMoveBuild< Expression >(expr_node2) );
    320 }
    321 
    322 Expression *build_attrexpr( NameExpr *var, ExpressionNode * expr_node ) {
     331} // build_comma
     332
     333Expression * build_attrexpr( NameExpr * var, ExpressionNode * expr_node ) {
    323334        return new AttrExpr( var, maybeMoveBuild< Expression >(expr_node) );
    324 }
    325 Expression *build_attrtype( NameExpr *var, DeclarationNode * decl_node ) {
     335} // build_attrexpr
     336
     337Expression * build_attrtype( NameExpr * var, DeclarationNode * decl_node ) {
    326338        return new AttrExpr( var, maybeMoveBuildType( decl_node ) );
    327 }
    328 
    329 Expression *build_tuple( ExpressionNode * expr_node ) {
     339} // build_attrtype
     340
     341Expression * build_tuple( ExpressionNode * expr_node ) {
    330342        std::list< Expression * > exprs;
    331343        buildMoveList( expr_node, exprs );
    332344        return new UntypedTupleExpr( exprs );;
    333 }
    334 
    335 Expression *build_func( ExpressionNode * function, ExpressionNode * expr_node ) {
     345} // build_tuple
     346
     347Expression * build_func( ExpressionNode * function, ExpressionNode * expr_node ) {
    336348        std::list< Expression * > args;
    337349        buildMoveList( expr_node, args );
    338350        return new UntypedExpr( maybeMoveBuild< Expression >(function), args, nullptr );
    339 }
    340 
    341 Expression *build_range( ExpressionNode * low, ExpressionNode *high ) {
     351} // build_func
     352
     353Expression * build_range( ExpressionNode * low, ExpressionNode * high ) {
    342354        return new RangeExpr( maybeMoveBuild< Expression >( low ), maybeMoveBuild< Expression >( high ) );
    343 }
    344 
    345 Expression *build_asmexpr( ExpressionNode *inout, ConstantExpr *constraint, ExpressionNode *operand ) {
     355} // build_range
     356
     357Expression * build_asmexpr( ExpressionNode * inout, ConstantExpr * constraint, ExpressionNode * operand ) {
    346358        return new AsmExpr( maybeMoveBuild< Expression >( inout ), constraint, maybeMoveBuild< Expression >(operand) );
    347 }
    348 
    349 Expression *build_valexpr( StatementNode *s ) {
     359} // build_asmexpr
     360
     361Expression * build_valexpr( StatementNode * s ) {
    350362        return new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >(s) ) );
    351 }
    352 Expression *build_typevalue( DeclarationNode *decl ) {
     363} // build_valexpr
     364
     365Expression * build_typevalue( DeclarationNode * decl ) {
    353366        return new TypeExpr( maybeMoveBuildType( decl ) );
    354 }
    355 
    356 Expression *build_compoundLiteral( DeclarationNode *decl_node, InitializerNode *kids ) {
     367} // build_typevalue
     368
     369Expression * build_compoundLiteral( DeclarationNode * decl_node, InitializerNode * kids ) {
    357370        Declaration * newDecl = maybeBuild< Declaration >(decl_node); // compound literal type
    358371        if ( DeclarationWithType * newDeclWithType = dynamic_cast< DeclarationWithType * >( newDecl ) ) { // non-sue compound-literal type
     
    380393                assert( false );
    381394        } // if
    382 }
     395} // build_compoundLiteral
    383396
    384397// Local Variables: //
  • src/Parser/InitializerNode.cc

    rfd344aa r9236060  
    1010// Created On       : Sat May 16 13:20:24 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Oct  1 23:09:51 2016
    13 // Update Count     : 21
     12// Last Modified On : Fri Jul 28 23:27:20 2017
     13// Update Count     : 26
    1414//
    1515
     
    2222#include "SynTree/Initializer.h"
    2323
    24 InitializerNode::InitializerNode( ExpressionNode *_expr, bool aggrp, ExpressionNode *des )
    25                 : expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ), maybeConstructed( true ) {
     24InitializerNode::InitializerNode( ExpressionNode * _expr, bool aggrp, ExpressionNode * des )
     25                : expr( _expr ), aggregate( aggrp ), designator( des ), kids( nullptr ), maybeConstructed( true ) {
    2626        if ( aggrp )
    2727                kids = dynamic_cast< InitializerNode * >( get_next() );
    2828
    29         if ( kids != 0 )
    30                 set_last( 0 );
    31 }
     29        if ( kids )
     30                set_last( nullptr );
     31} // InitializerNode::InitializerNode
    3232
    33 InitializerNode::InitializerNode( InitializerNode *init, bool aggrp, ExpressionNode *des )
    34                 : expr( 0 ), aggregate( aggrp ), designator( des ), kids( 0 ), maybeConstructed( true ) {
    35         if ( init != 0 )
     33InitializerNode::InitializerNode( InitializerNode * init, bool aggrp, ExpressionNode * des )
     34                : expr( nullptr ), aggregate( aggrp ), designator( des ), kids( nullptr ), maybeConstructed( true ) {
     35        if ( init )
    3636                set_last( init );
    3737
     
    3939                kids = dynamic_cast< InitializerNode * >( get_next() );
    4040
    41         if ( kids != 0 )
    42                 set_next( 0 );
    43 }
     41        if ( kids )
     42                set_next( nullptr );
     43} // InitializerNode::InitializerNode
    4444
    4545InitializerNode::~InitializerNode() {
     
    4747        delete designator;
    4848        delete kids;
    49 }
     49} // InitializerNode::~InitializerNode
    5050
    5151void InitializerNode::print( std::ostream &os, int indent ) const {
    5252        os << std::string( indent, ' ' ) << "Initializer expression" << std::endl;
    53 }
     53} // InitializerNode::print
    5454
    5555void InitializerNode::printOneLine( std::ostream &os ) const {
    5656        if ( ! aggregate ) {
    57                 if ( designator != 0 ) {
     57                if ( designator ) {
    5858                        os << "designated by: (";
    5959                        ExpressionNode *curdes = designator;
    60                         while ( curdes != 0) {
     60                        while ( curdes != nullptr) {
    6161                                curdes->printOneLine(os);
    6262                                curdes = (ExpressionNode *)(curdes->get_next());
     
    6565                        os << ")";
    6666                } // if
    67                 if ( expr ) expr->printOneLine(os);
     67                if ( expr ) expr->printOneLine( os );
    6868        } else {  // It's an aggregate
    6969                os << "[--";
    70                 if ( next_init() != 0 )
    71                         next_init()->printOneLine(os);
     70                if ( next_init() != nullptr )
     71                        next_init()->printOneLine( os );
    7272                if (aggregate) os << "--]";
    7373        } // if
     
    7676        if ( (moreInit = dynamic_cast< InitializerNode * >( get_next() ) ) ) {
    7777                moreInit->printOneLine( os );
    78         }
    79 }
     78        } // if
     79} // InitializerNode::printOneLine
    8080
    81 Initializer *InitializerNode::build() const {
     81Initializer * InitializerNode::build() const {
    8282        if ( aggregate ) {
    8383                // steal designators from children
     
    9393                return new ListInit( initlist, designlist, maybeConstructed );
    9494        } else {
    95                 if ( get_expression() != 0) {
     95                if ( get_expression() ) {
    9696                        return new SingleInit( maybeBuild< Expression >( get_expression() ), maybeConstructed );
    97                 }
     97                } // if
    9898        } // if
    99         return 0;
    100 }
     99        return nullptr;
     100} // InitializerNode::build
    101101
    102102// Local Variables: //
  • src/Parser/LinkageSpec.h

    rfd344aa r9236060  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 13:24:28 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Jul  7 11:03:00 2017
    13 // Update Count     : 13
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:32:16 2017
     13// Update Count     : 14
    1414//
    1515
    16 #ifndef LINKAGESPEC_H
    17 #define LINKAGESPEC_H
     16#pragma once
    1817
    1918#include <string>
     
    7877};
    7978
    80 #endif // LINKAGESPEC_H
    81 
    8279// Local Variables: //
    8380// tab-width: 4 //
  • src/Parser/ParseNode.h

    rfd344aa r9236060  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 13:28:16 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Mon Jun 12 13:00:00 2017
    13 // Update Count     : 779
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu Jul 27 12:08:08 2017
     13// Update Count     : 788
    1414//
    1515
    16 #ifndef PARSENODE_H
    17 #define PARSENODE_H
     16#pragma once
    1817
    1918#include <string>
     
    141140};
    142141
     142// Must harmonize with OperName.
    143143enum class OperKinds {
    144144        // diadic
    145         SizeOf, AlignOf, OffsetOf, Plus, Minus, Mul, Div, Mod, Or, And,
     145        SizeOf, AlignOf, OffsetOf, Plus, Minus, Exp, Mul, Div, Mod, Or, And,
    146146        BitOr, BitAnd, Xor, Cast, LShift, RShift, LThan, GThan, LEThan, GEThan, Eq, Neq,
    147         Assign, AtAssn, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn,
     147        Assign, AtAssn, ExpAssn, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn,
    148148        Index, Range,
    149149        // monadic
     
    159159Expression * build_constantFloat( const std::string &str );
    160160Expression * build_constantChar( const std::string &str );
    161 Expression * build_constantZeroOne( const std::string &str );
    162161ConstantExpr * build_constantStr( const std::string &str );
    163162Expression * build_field_name_FLOATINGconstant( const std::string & str );
     
    170169
    171170Expression * build_cast( DeclarationNode * decl_node, ExpressionNode * expr_node );
     171Expression * build_virtual_cast( DeclarationNode * decl_node, ExpressionNode * expr_node );
    172172Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member );
    173173Expression * build_pfieldSel( ExpressionNode * expr_node, Expression * member );
     
    248248        static DeclarationNode * newAsmStmt( StatementNode * stmt ); // gcc external asm statement
    249249
     250        // Perhaps this would best fold into newAggragate.
     251        static DeclarationNode * newTreeStruct( Aggregate kind, const std::string * name, const std::string * parent, ExpressionNode * actuals, DeclarationNode * fields, bool body );
     252
    250253        DeclarationNode();
    251254        ~DeclarationNode();
     
    332335
    333336        static UniqueName anonymous;
     337
     338        // Temp to test TreeStruct
     339        const std::string * parent_name;
    334340}; // DeclarationNode
    335341
     
    443449std::ostream & operator<<( std::ostream & out, const ParseNode * node );
    444450
    445 #endif // PARSENODE_H
    446 
    447451// Local Variables: //
    448452// tab-width: 4 //
  • src/Parser/ParserTypes.h

    rfd344aa r9236060  
    1010// Created On       : Sat Sep 22 08:58:10 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jun 28 22:10:17 2017
    13 // Update Count     : 349
     12// Last Modified On : Sat Jul 22 09:33:28 2017
     13// Update Count     : 350
    1414//
    1515
    16 #ifndef PARSER_HH
    17 #define PARSER_HH
     16#pragma once
    1817
    1918int yylex();
     
    4241}; // Token
    4342
    44 #endif // PARSER_HH
    45 
    4643// Local Variables: //
    4744// tab-width: 4 //
  • src/Parser/TypeData.cc

    rfd344aa r9236060  
    1010// Created On       : Sat May 16 15:12:51 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Jun 28 15:28:00 2017
    13 // Update Count     : 564
     12// Last Modified On : Wed Aug  9 13:50:00 2017
     13// Update Count     : 567
    1414//
    1515
     
    6464                aggregate.fields = nullptr;
    6565                aggregate.body = false;
     66                aggregate.tagged = false;
     67                aggregate.parent = nullptr;
    6668                break;
    6769          case AggregateInst:
     
    123125                delete aggregate.actuals;
    124126                delete aggregate.fields;
     127                delete aggregate.parent;
    125128                // delete aggregate;
    126129                break;
     
    195198                newtype->aggregate.kind = aggregate.kind;
    196199                newtype->aggregate.body = aggregate.body;
     200                newtype->aggregate.tagged = aggregate.tagged;
     201                newtype->aggregate.parent = aggregate.parent ? new string( *aggregate.parent ) : nullptr;
    197202                break;
    198203          case AggregateInst:
     
    454459          case TypeData::Builtin:
    455460                if(td->builtintype == DeclarationNode::Zero) {
    456                         return new ZeroType( emptyQualifiers );
     461                        return new ZeroType( noQualifiers );
    457462                }
    458463                else if(td->builtintype == DeclarationNode::One) {
    459                         return new OneType( emptyQualifiers );
     464                        return new OneType( noQualifiers );
    460465                }
    461466                else {
     
    635640        switch ( td->aggregate.kind ) {
    636641          case DeclarationNode::Struct:
     642                if ( td->aggregate.tagged ) {
     643                        at = new StructDecl( *td->aggregate.name, td->aggregate.parent, attributes, linkage );
     644                        buildForall( td->aggregate.params, at->get_parameters() );
     645                        break;
     646                }
    637647          case DeclarationNode::Coroutine:
    638648          case DeclarationNode::Monitor:
     
    754764} // buildAggInst
    755765
    756 NamedTypeDecl * buildSymbolic( const TypeData * td, const string & name, Type::StorageClasses scs ) {
     766NamedTypeDecl * buildSymbolic( const TypeData * td, const string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage ) {
    757767        assert( td->kind == TypeData::Symbolic );
    758768        NamedTypeDecl * ret;
    759769        assert( td->base );
    760770        if ( td->symbolic.isTypedef ) {
    761                 ret = new TypedefDecl( name, scs, typebuild( td->base ) );
     771                ret = new TypedefDecl( name, scs, typebuild( td->base ), linkage );
    762772        } else {
    763773                ret = new TypeDecl( name, scs, typebuild( td->base ), TypeDecl::Any );
     
    823833                return buildEnum( td, attributes );
    824834        } else if ( td->kind == TypeData::Symbolic ) {
    825                 return buildSymbolic( td, name, scs );
     835                return buildSymbolic( td, name, scs, linkage );
    826836        } else {
    827837                return (new ObjectDecl( name, scs, linkage, bitfieldWidth, typebuild( td ), init, attributes ))->set_asmName( asmName );
  • src/Parser/TypeData.h

    rfd344aa r9236060  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 15:18:36 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Jun 28 15:29:00 2017
    13 // Update Count     : 186
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:32:47 2017
     13// Update Count     : 188
    1414//
    1515
    16 #ifndef TYPEDATA_H
    17 #define TYPEDATA_H
     16#pragma once
    1817
    1918#include "ParseNode.h"
     
    3130                DeclarationNode * fields;
    3231                bool body;
     32
     33                bool tagged;
     34                const std::string * parent;
    3335        };
    3436
     
    114116void buildKRFunction( const TypeData::Function_t & function );
    115117
    116 #endif // TYPEDATA_H
    117 
    118118// Local Variables: //
    119119// tab-width: 4 //
  • src/Parser/TypedefTable.h

    rfd344aa r9236060  
    1010// Created On       : Sat May 16 15:24:36 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jun 28 21:56:34 2017
    13 // Update Count     : 33
     12// Last Modified On : Sat Jul 22 09:33:14 2017
     13// Update Count     : 34
    1414//
    1515
    16 #ifndef TYPEDEFTABLE_H
    17 #define TYPEDEFTABLE_H
     16#pragma once
    1817
    1918#include <map>
     
    9190};
    9291
    93 #endif // TYPEDEFTABLE_H
    94 
    9592// Local Variables: //
    9693// tab-width: 4 //
  • src/Parser/lex.ll

    rfd344aa r9236060  
    1010 * Created On       : Sat Sep 22 08:58:10 2001
    1111 * Last Modified By : Peter A. Buhr
    12  * Last Modified On : Wed Jul 12 18:04:44 2017
    13  * Update Count     : 535
     12 * Last Modified On : Thu Jul 27 21:46:06 2017
     13 * Update Count     : 550
    1414 */
    1515
    1616%option yylineno
     17%option noyywrap
    1718%option nounput
    1819
     
    125126op_unary {op_unary_only}|{op_unary_binary}|{op_unary_pre_post}
    126127
    127 op_binary_only "/"|"%"|"^"|"&"|"|"|"<"|">"|"="|"=="|"!="|"<<"|">>"|"<="|">="|"+="|"-="|"*="|"/="|"%="|"&="|"|="|"^="|"<<="|">>="
     128op_binary_only "/"|"%"|"\\"|"^"|"&"|"|"|"<"|">"|"="|"=="|"!="|"<<"|">>"|"<="|">="|"+="|"-="|"*="|"/="|"%="|"\\="|"&="|"|="|"^="|"<<="|">>="
    128129op_binary_over {op_unary_binary}|{op_binary_only}
    129130                                // op_binary_not_over "?"|"->"|"."|"&&"|"||"|"@="
     
    136137
    137138%%
    138                                    /* line directives */
     139                                /* line directives */
    139140^{h_white}*"#"{h_white}*[0-9]+{h_white}*["][^"\n]+["].*"\n" {
    140141        /* " stop highlighting */
     
    232233int                             { KEYWORD_RETURN(INT); }
    233234__int128                { KEYWORD_RETURN(INT); }                                // GCC
     235__int128_t              { KEYWORD_RETURN(INT); }                                // GCC
    234236__label__               { KEYWORD_RETURN(LABEL); }                              // GCC
    235237long                    { KEYWORD_RETURN(LONG); }
     
    265267__typeof                { KEYWORD_RETURN(TYPEOF); }                             // GCC
    266268__typeof__              { KEYWORD_RETURN(TYPEOF); }                             // GCC
     269__uint128_t             { KEYWORD_RETURN(INT); }                                // GCC
    267270union                   { KEYWORD_RETURN(UNION); }
    268271unsigned                { KEYWORD_RETURN(UNSIGNED); }
    269272__builtin_va_list { KEYWORD_RETURN(VALIST); }                   // GCC
     273virtual                 { KEYWORD_RETURN(VIRTUAL); }                    // CFA
    270274void                    { KEYWORD_RETURN(VOID); }
    271275volatile                { KEYWORD_RETURN(VOLATILE); }
     
    284288
    285289                                /* numeric constants */
    286 "0"                             { NUMERIC_RETURN(ZERO); }                               // CFA
    287 "1"                             { NUMERIC_RETURN(ONE); }                                // CFA
    288290{decimal_constant} { NUMERIC_RETURN(INTEGERconstant); }
    289291{octal_constant} { NUMERIC_RETURN(INTEGERconstant); }
     
    336338"-"                             { ASCIIOP_RETURN(); }
    337339"*"                             { ASCIIOP_RETURN(); }
     340"\\"                    { ASCIIOP_RETURN(); }                                   // CFA, exponentiation
    338341"/"                             { ASCIIOP_RETURN(); }
    339342"%"                             { ASCIIOP_RETURN(); }
     
    360363"+="                    { NAMEDOP_RETURN(PLUSassign); }
    361364"-="                    { NAMEDOP_RETURN(MINUSassign); }
     365"\\="                   { NAMEDOP_RETURN(EXPassign); }                  // CFA, exponentiation
    362366"*="                    { NAMEDOP_RETURN(MULTassign); }
    363367"/="                    { NAMEDOP_RETURN(DIVassign); }
     
    414418
    415419                                /* unknown characters */
    416 .                       { printf("unknown character(s):\"%s\" on line %d\n", yytext, yylineno); }
     420.                               { printf("unknown character(s):\"%s\" on line %d\n", yytext, yylineno); }
    417421
    418422%%
  • src/Parser/parser.yy

    rfd344aa r9236060  
    99// Author           : Peter A. Buhr
    1010// Created On       : Sat Sep  1 20:22:55 2001
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jul 12 18:23:36 2017
    13 // Update Count     : 2426
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Aug  4 13:33:00 2017
     13// Update Count     : 2475
    1414//
    1515
     
    118118%token RESTRICT                                                                                 // C99
    119119%token ATOMIC                                                                                   // C11
    120 %token FORALL MUTEX                                                             // CFA
    121 %token VOID CHAR SHORT INT LONG FLOAT DOUBLE SIGNED UNSIGNED ZERO_T ONE_T
     120%token FORALL MUTEX VIRTUAL                                             // CFA
     121%token VOID CHAR SHORT INT LONG FLOAT DOUBLE SIGNED UNSIGNED
     122%token BOOL COMPLEX IMAGINARY                                                   // C99
     123%token ZERO_T ONE_T                                                                             // CFA
    122124%token VALIST                                                                                   // GCC
    123 %token BOOL COMPLEX IMAGINARY                                                   // C99
    124125%token TYPEOF LABEL                                                                             // GCC
    125126%token ENUM STRUCT UNION
     
    141142// converted into the tuple index (.)(1). e.g., 3.x
    142143%token<tok>     REALDECIMALconstant     REALFRACTIONconstant    FLOATINGconstant
    143 %token<tok> ZERO                                ONE                                             // CFA
    144144
    145145// multi-character operators
     
    151151%token ELLIPSIS                                                                                 // ...
    152152
    153 %token MULTassign       DIVassign       MODassign                               // *=   /=      %=/
     153%token EXPassign        MULTassign      DIVassign       MODassign       // \=   *=      /=      %=
    154154%token PLUSassign       MINUSassign                                                     // +=   -=
    155155%token LSassign         RSassign                                                        // <<=  >>=
     
    158158%token ATassign                                                                                 // @=
    159159
    160 %type<tok> identifier  no_attr_identifier  zero_one
     160%type<tok> identifier  no_attr_identifier
    161161%type<tok> identifier_or_type_name  no_attr_identifier_or_type_name  attr_name
    162162%type<constant> string_literal
     
    168168%type<op> ptrref_operator                               unary_operator                          assignment_operator
    169169%type<en> primary_expression                    postfix_expression                      unary_expression
    170 %type<en> cast_expression                               multiplicative_expression       additive_expression                     shift_expression
    171 %type<en> relational_expression                 equality_expression                     AND_expression                          exclusive_OR_expression
    172 %type<en> inclusive_OR_expression               logical_AND_expression          logical_OR_expression           conditional_expression
    173 %type<en> constant_expression                   assignment_expression           assignment_expression_opt
     170%type<en> cast_expression                               exponential_expression          multiplicative_expression       additive_expression
     171%type<en> shift_expression                              relational_expression           equality_expression
     172%type<en> AND_expression                                exclusive_OR_expression         inclusive_OR_expression
     173%type<en> logical_AND_expression                logical_OR_expression
     174%type<en> conditional_expression                constant_expression                     assignment_expression           assignment_expression_opt
    174175%type<en> comma_expression                              comma_expression_opt
    175 %type<en> argument_expression_list              argument_expression                     assignment_opt
     176%type<en> argument_expression_list              argument_expression                     default_initialize_opt
    176177%type<fctl> for_control_expression
    177178%type<en> subrange
     
    181182%type<en> asm_clobbers_list_opt
    182183%type<flag> asm_volatile_opt
     184%type<en> handler_predicate_opt
    183185
    184186// statements
     
    358360        ;
    359361
    360 zero_one:                                                                                               // CFA
    361         ZERO
    362         | ONE
    363         ;
    364 
    365362string_literal:
    366363        string_literal_list                                                     { $$ = build_constantStr( *$1 ); }
     
    382379        IDENTIFIER                                                                                      // typedef name cannot be used as a variable name
    383380                { $$ = new ExpressionNode( build_varref( $1 ) ); }
    384         | zero_one
    385                 { $$ = new ExpressionNode( build_constantZeroOne( *$1 ) ); }
    386381        | tuple
    387382        | '(' comma_expression ')'
     
    483478                        $$ = new ExpressionNode( build_field_name_fraction_constants( build_varref( $1 ), $2 ) );
    484479                }
    485         | zero_one fraction_constants
    486                 {
    487                         $$ = new ExpressionNode( build_field_name_fraction_constants( build_constantZeroOne( *$1 ), $2 ) );
    488                 }
    489480        ;
    490481
     
    537528        | ALIGNOF unary_expression                                                      // GCC, variable alignment
    538529                { $$ = new ExpressionNode( build_alignOfexpr( $2 ) ); }
    539         | ALIGNOF '(' type_no_function ')'                              // GCC, type alignment
     530        | ALIGNOF '(' type_no_function ')'                                      // GCC, type alignment
    540531                { $$ = new ExpressionNode( build_alignOftype( $3 ) ); }
    541532        | OFFSETOF '(' type_no_function ',' no_attr_identifier ')'
     
    569560        | '(' type_no_function ')' cast_expression
    570561                { $$ = new ExpressionNode( build_cast( $2, $4 ) ); }
     562                // VIRTUAL cannot be opt because of look ahead issues
     563        | '(' VIRTUAL ')' cast_expression
     564                { $$ = new ExpressionNode( build_virtual_cast( nullptr, $4 ) ); }
     565        | '(' VIRTUAL type_no_function ')' cast_expression
     566                { $$ = new ExpressionNode( build_virtual_cast( $3, $5 ) ); }
    571567//      | '(' type_no_function ')' tuple
    572568//              { $$ = new ExpressionNode( build_cast( $2, $4 ) ); }
    573569        ;
    574570
     571exponential_expression:
     572        cast_expression
     573        | exponential_expression '\\' cast_expression
     574                { $$ = new ExpressionNode( build_binary_val( OperKinds::Exp, $1, $3 ) ); }
     575        ;
     576
    575577multiplicative_expression:
    576         cast_expression
    577         | multiplicative_expression '*' cast_expression
     578        exponential_expression
     579        | multiplicative_expression '*' exponential_expression
    578580                { $$ = new ExpressionNode( build_binary_val( OperKinds::Mul, $1, $3 ) ); }
    579         | multiplicative_expression '/' cast_expression
     581        | multiplicative_expression '/' exponential_expression
    580582                { $$ = new ExpressionNode( build_binary_val( OperKinds::Div, $1, $3 ) ); }
    581         | multiplicative_expression '%' cast_expression
     583        | multiplicative_expression '%' exponential_expression
    582584                { $$ = new ExpressionNode( build_binary_val( OperKinds::Mod, $1, $3 ) ); }
    583585        ;
     
    678680        '='                                                                                     { $$ = OperKinds::Assign; }
    679681        | ATassign                                                                      { $$ = OperKinds::AtAssn; }
     682        | EXPassign                                                                     { $$ = OperKinds::ExpAssn; }
    680683        | MULTassign                                                            { $$ = OperKinds::MulAssn; }
    681684        | DIVassign                                                                     { $$ = OperKinds::DivAssn; }
     
    939942
    940943with_statement:
    941         WITH identifier_list compound_statement
     944        WITH '(' tuple_expression_list ')' compound_statement
    942945                { $$ = (StatementNode *)0; }                                    // FIX ME
    943946        ;
     
    966969
    967970handler_clause:
    968         // TEMPORARY, TEST EXCEPTIONS
    969         handler_key '(' push push INTEGERconstant pop ')' compound_statement pop
    970                 { $$ = new StatementNode( build_catch( $1, nullptr, new ExpressionNode( build_constantInteger( *$5 ) ), $8 ) ); }
    971         | handler_clause handler_key '(' push push INTEGERconstant pop ')' compound_statement pop
    972                 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, nullptr, new ExpressionNode( build_constantInteger( *$6 ) ), $9 ) ) ); }
    973 
    974         | handler_key '(' push push exception_declaration pop ')' compound_statement pop
    975                 { $$ = new StatementNode( build_catch( $1, $5, nullptr, $8 ) ); }
    976         | handler_clause handler_key '(' push push exception_declaration pop ')' compound_statement pop
    977                 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, $6, nullptr, $9 ) ) ); }
     971        handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop
     972                { $$ = new StatementNode( build_catch( $1, $5, $7, $9 ) ); }
     973        | 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 ) ) ); }
     975        ;
     976
     977handler_predicate_opt:
     978        //empty
     979                { $$ = nullptr; }
     980        | ';' conditional_expression
     981                { $$ = $2; }
    978982        ;
    979983
     
    15001504        | IMAGINARY                                                                                     // C99
    15011505                { $$ = DeclarationNode::newComplexType( DeclarationNode::Imaginary ); }
    1502         | VALIST                                                                                        // GCC, __builtin_va_list
    1503                 { $$ = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); }
    15041506        | ZERO_T
    15051507                { $$ = DeclarationNode::newBuiltinType( DeclarationNode::Zero ); }
    15061508        | ONE_T
    15071509                { $$ = DeclarationNode::newBuiltinType( DeclarationNode::One ); }
     1510        | VALIST                                                                                        // GCC, __builtin_va_list
     1511                { $$ = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); }
    15081512        ;
    15091513
     
    18431847cfa_parameter_declaration:                                                              // CFA, new & old style parameter declaration
    18441848        parameter_declaration
    1845         | cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name assignment_opt
     1849        | cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name default_initialize_opt
    18461850                { $$ = $1->addName( $2 ); }
    1847         | cfa_abstract_tuple identifier_or_type_name assignment_opt
     1851        | cfa_abstract_tuple identifier_or_type_name default_initialize_opt
    18481852                // To obtain LR(1), these rules must be duplicated here (see cfa_abstract_declarator).
    18491853                { $$ = $1->addName( $2 ); }
    1850         | type_qualifier_list cfa_abstract_tuple identifier_or_type_name assignment_opt
     1854        | type_qualifier_list cfa_abstract_tuple identifier_or_type_name default_initialize_opt
    18511855                { $$ = $2->addName( $3 )->addQualifiers( $1 ); }
    18521856        | cfa_function_specifier
     
    18651869parameter_declaration:
    18661870                // No SUE declaration in parameter list.
    1867         declaration_specifier_nobody identifier_parameter_declarator assignment_opt
     1871        declaration_specifier_nobody identifier_parameter_declarator default_initialize_opt
    18681872                {
    18691873                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    18701874                        $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr );
    18711875                }
    1872         | declaration_specifier_nobody type_parameter_redeclarator assignment_opt
     1876        | declaration_specifier_nobody type_parameter_redeclarator default_initialize_opt
    18731877                {
    18741878                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    18781882
    18791883abstract_parameter_declaration:
    1880         declaration_specifier_nobody assignment_opt
     1884        declaration_specifier_nobody default_initialize_opt
    18811885                { $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); }
    1882         | declaration_specifier_nobody abstract_parameter_declarator assignment_opt
     1886        | declaration_specifier_nobody abstract_parameter_declarator default_initialize_opt
    18831887                { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
    18841888        ;
     
    19241928        | '=' initializer
    19251929                { $$ = $2; }
     1930        | '=' VOID
     1931                { $$ = nullptr; }
    19261932        | ATassign initializer
    19271933                { $$ = $2->set_maybeConstructed( false ); }
     
    22202226        // empty
    22212227                { $$ = (StatementNode *)0; }                                    // FIX ME
    2222         | WITH identifier_list
     2228        | WITH '(' tuple_expression_list ')'
    22232229                { $$ = (StatementNode *)0; }                                    // FIX ME
    22242230        ;
     
    30433049        ;
    30443050
    3045 assignment_opt:
     3051default_initialize_opt:
    30463052        // empty
    30473053                { $$ = nullptr; }
  • src/Parser/parserutility.cc

    rfd344aa r9236060  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 15:30:39 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jun 28 22:11:32 2017
    13 // Update Count     : 7
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tus Jul 18 10:12:00 2017
     13// Update Count     : 8
    1414//
    1515
     
    2626        UntypedExpr *comparison = new UntypedExpr( new NameExpr( "?!=?" ) );
    2727        comparison->get_args().push_back( orig );
    28         comparison->get_args().push_back( new ConstantExpr( Constant( new ZeroType( emptyQualifiers ), "0", (unsigned long long int)0 ) ) );
     28        comparison->get_args().push_back( new ConstantExpr( Constant( new ZeroType( noQualifiers ), "0", (unsigned long long int)0 ) ) );
    2929        return new CastExpr( comparison, new BasicType( Type::Qualifiers(), BasicType::SignedInt ) );
    3030}
  • src/Parser/parserutility.h

    rfd344aa r9236060  
    1010// Created On       : Sat May 16 15:31:46 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jun 28 22:11:40 2017
    13 // Update Count     : 3
     12// Last Modified On : Sat Jul 22 09:32:58 2017
     13// Update Count     : 4
    1414//
    1515
    16 #ifndef PARSEUTILITY_H
    17 #define PARSEUTILITY_H
     16#pragma once
    1817
    1918#include "SynTree/SynTree.h"
    2019
    2120Expression *notZeroExpr( Expression *orig );
    22 
    23 #endif // PARSEUTILITY_H
    2421
    2522// Local Variables: //
  • src/ResolvExpr/Alternative.h

    rfd344aa r9236060  
    1010// Created On       : Sat May 16 23:45:43 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat May 16 23:54:39 2015
    13 // Update Count     : 2
     12// Last Modified On : Sat Jul 22 09:36:36 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef ALTERNATIVE_H
    17 #define ALTERNATIVE_H
     16#pragma once
    1817
    1918#include <list>
     
    4544} // namespace ResolvExpr
    4645
    47 #endif // ALTERNATIVE_H
    48 
    4946// Local Variables: //
    5047// tab-width: 4 //
  • src/ResolvExpr/AlternativeFinder.cc

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sat May 16 23:52:08 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 17 09:14:17 2017
    13 // Update Count     : 30
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Jul 26 11:33:00 2017
     13// Update Count     : 31
    1414//
    1515
     
    901901        }
    902902
     903        void AlternativeFinder::visit( VirtualCastExpr * castExpr ) {
     904                assertf( castExpr->get_result(), "Implicate virtual cast targets not yet supported." );
     905                AlternativeFinder finder( indexer, env );
     906                // don't prune here, since it's guaranteed all alternatives will have the same type
     907                // (giving the alternatives different types is half of the point of ConstructorExpr nodes)
     908                finder.findWithAdjustment( castExpr->get_arg(), false );
     909                for ( Alternative & alt : finder.alternatives ) {
     910                        alternatives.push_back( Alternative(
     911                                new VirtualCastExpr( alt.expr->clone(), castExpr->get_result()->clone() ),
     912                                alt.env, alt.cost ) );
     913                }
     914        }
     915
    903916        void AlternativeFinder::visit( UntypedMemberExpr *memberExpr ) {
    904917                AlternativeFinder funcFinder( indexer, env );
  • src/ResolvExpr/AlternativeFinder.h

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sat May 16 23:56:12 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Tue Apr 19 11:44:53 2016
    13 // Update Count     : 2
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Jul 26 11:24:00 2017
     13// Update Count     : 4
    1414//
    1515
    16 #ifndef ALTERNATIVEFINDER_H
    17 #define ALTERNATIVEFINDER_H
     16#pragma once
    1817
    1918#include <set>
     
    5049                virtual void visit( AddressExpr *addressExpr );
    5150                virtual void visit( CastExpr *castExpr );
     51                virtual void visit( VirtualCastExpr *castExpr );
    5252                virtual void visit( UntypedMemberExpr *memberExpr );
    5353                virtual void visit( MemberExpr *memberExpr );
     
    132132} // namespace ResolvExpr
    133133
    134 #endif // ALTERNATIVEFINDER_H
    135 
    136134// Local Variables: //
    137135// tab-width: 4 //
  • src/ResolvExpr/AlternativePrinter.h

    rfd344aa r9236060  
    1010// Created On       : Sun May 17 06:55:43 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun May 17 06:57:12 2015
    13 // Update Count     : 3
     12// Last Modified On : Sat Jul 22 09:37:09 2017
     13// Update Count     : 4
    1414//
    1515
    16 #ifndef ALTERNATIVEPRINTER_H
    17 #define ALTERNATIVEPRINTER_H
     16#pragma once
    1817
    1918#include <iostream>
     
    3433} // namespace ResolvExpr
    3534
    36 #endif // ALTERNATIVEPRINTER_H
    37 
    3835// Local Variables: //
    3936// tab-width: 4 //
  • src/ResolvExpr/ConversionCost.h

    rfd344aa r9236060  
    1010// Created On       : Sun May 17 09:37:28 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar  2 17:35:56 2016
    13 // Update Count     : 3
     12// Last Modified On : Sat Jul 22 09:38:24 2017
     13// Update Count     : 4
    1414//
    1515
    16 #ifndef CONVERSIONCOST_H
    17 #define CONVERSIONCOST_H
     16#pragma once
    1817
    1918#include "SynTree/Visitor.h"
     
    5453} // namespace ResolvExpr
    5554
    56 #endif // CONVERSIONCOST_H */
    57 
    5855// Local Variables: //
    5956// tab-width: 4 //
  • src/ResolvExpr/Cost.h

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 09:39:50 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Jul 22 16:43:10 2015
    13 // Update Count     : 4
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:35:55 2017
     13// Update Count     : 5
    1414//
    1515
    16 #ifndef COST_H
    17 #define COST_H
     16#pragma once
    1817
    1918#include <iostream>
     
    145144} // namespace ResolvExpr
    146145
    147 #endif // COST_H
    148 
    149146// Local Variables: //
    150147// tab-width: 4 //
  • src/ResolvExpr/CurrentObject.cc

    rfd344aa r9236060  
    3838                                return constExpr->get_constant()->get_ival();
    3939                        } else {
    40                                 assertf( false, "Non-integer constant expression in getConstValue", toString( constExpr ).c_str() ); // xxx - might be semantic error
     40                                assertf( false, "Non-integer constant expression in getConstValue %s", toString( constExpr ).c_str() ); // xxx - might be semantic error
    4141                        }
    4242                } else if ( dynamic_cast< OneType * >( constExpr->get_result() ) ) {
     
    163163                                setPosition( castExpr->get_arg() );
    164164                        } else if ( VariableExpr * varExpr = dynamic_cast< VariableExpr * >( expr ) ) {
    165                                 assertf( dynamic_cast<EnumInstType *> ( varExpr->get_result() ), "ArrayIterator given variable that isn't an enum constant", toString( expr ).c_str() );
     165                                assertf( dynamic_cast<EnumInstType *> ( varExpr->get_result() ), "ArrayIterator given variable that isn't an enum constant : %s", toString( expr ).c_str() );
    166166                                index = 0; // xxx - get actual value of enum constant
    167167                        } else if ( dynamic_cast< SizeofExpr * >( expr ) || dynamic_cast< AlignofExpr * >( expr ) ) {
     
    505505                        curTypes = newTypes;
    506506                        newTypes.clear();
    507                         assertf( desigAlts.size() == curTypes.size(), "Designator alternatives (%d) and current types (%d) out of sync", desigAlts.size(), curTypes.size() );
     507                        assertf( desigAlts.size() == curTypes.size(), "Designator alternatives (%zu) and current types (%zu) out of sync", desigAlts.size(), curTypes.size() );
    508508                } // for
    509509                if ( desigAlts.size() > 1 ) {
  • src/ResolvExpr/CurrentObject.h

    rfd344aa r9236060  
    99// Author           : Rob Schluntz
    1010// Created On       : Thu Jun  8 11:07:25 2017
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Thu Jun  8 11:07:41 2017
    13 // Update Count     : 2
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:36:48 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef CURRENT_OBJECT_H
    17 #define CURRENT_OBJECT_H
     16#pragma once
    1817
    1918#include <stack>
     
    5150} // namespace ResolvExpr
    5251
    53 #endif // CURRENT_OBJECT_H
    54 
    5552// Local Variables: //
    5653// tab-width: 4 //
  • src/ResolvExpr/FindOpenVars.h

    rfd344aa r9236060  
    1010// Created On       : Sun May 17 09:46:04 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun May 17 09:47:20 2015
    13 // Update Count     : 2
     12// Last Modified On : Sat Jul 22 09:35:18 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef FINDOPENVARS_H
    17 #define FINDOPENVARS_H
     16#pragma once
    1817
    1918#include "Unify.h"
     
    2524} // namespace ResolvExpr
    2625
    27 #endif // FINDOPENVARS_H
    28 
    2926// Local Variables: //
    3027// tab-width: 4 //
  • src/ResolvExpr/RenameVars.h

    rfd344aa r9236060  
    1010// Created On       : Sun May 17 12:10:28 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar  2 17:36:39 2016
    13 // Update Count     : 3
     12// Last Modified On : Sat Jul 22 09:33:54 2017
     13// Update Count     : 4
    1414//
    1515
    16 #ifndef RESOLVEXPR_RENAMEVARS_H
    17 #define RESOLVEXPR_RENAMEVARS_H
     16#pragma once
    1817
    1918#include <list>
     
    5655} // namespace ResolvExpr
    5756
    58 #endif // RENAMEVARS_H
    59 
    6057// Local Variables: //
    6158// tab-width: 4 //
  • src/ResolvExpr/ResolveTypeof.h

    rfd344aa r9236060  
    1010// Created On       : Sun May 17 12:14:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun May 17 12:16:29 2015
    13 // Update Count     : 2
     12// Last Modified On : Sat Jul 22 09:38:35 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef RESOLVETYPEOF_H
    17 #define RESOLVETYPEOF_H
     16#pragma once
    1817
    1918#include "SynTree/SynTree.h"
     
    2423} // namespace ResolvExpr
    2524
    26 #endif // RESOLVETYPEOF_H
    27 
    2825// Local Variables: //
    2926// tab-width: 4 //
  • src/ResolvExpr/Resolver.cc

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 12:17:01 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 23 17:23:14 2017
    13 // Update Count     : 211
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tus Aug  8 16:06:00 2017
     13// Update Count     : 212
    1414//
    1515
     
    7171                virtual void visit( ReturnStmt *returnStmt ) override;
    7272                virtual void visit( ThrowStmt *throwStmt ) override;
     73                virtual void visit( CatchStmt *catchStmt ) override;
    7374
    7475                virtual void visit( SingleInit *singleInit ) override;
     
    368369
    369370        void Resolver::visit( ThrowStmt *throwStmt ) {
     371                // TODO: Replace *exception type with &exception type.
    370372                if ( throwStmt->get_expr() ) {
    371                         Expression * wrapped = new CastExpr( throwStmt->get_expr(), new BasicType( Type::Qualifiers(), BasicType::SignedInt ) );
     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                                );
    372386                        Expression * newExpr = findSingleExpression( wrapped, *this );
    373387                        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 ) );
    374398                }
    375399        }
  • src/ResolvExpr/Resolver.h

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 12:18:34 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Thu Apr 14 15:06:53 2016
    13 // Update Count     : 2
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:36:57 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef RESOLVER_H
    17 #define RESOLVER_H
     16#pragma once
    1817
    1918#include "SynTree/SynTree.h"
     
    2928} // namespace ResolvExpr
    3029
    31 #endif // RESOLVER_H
    32 
    3330// Local Variables: //
    3431// tab-width: 4 //
  • src/ResolvExpr/TypeEnvironment.h

    rfd344aa r9236060  
    1010// Created On       : Sun May 17 12:24:58 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun May 17 12:26:52 2015
    13 // Update Count     : 2
     12// Last Modified On : Sat Jul 22 09:35:45 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef TYPEENVIRONMENT_H
    17 #define TYPEENVIRONMENT_H
     16#pragma once
    1817
    1918#include <string>
     
    9998} // namespace ResolvExpr
    10099
    101 #endif // TYPEENVIRONMENT_H */
    102 
    103100// Local Variables: //
    104101// tab-width: 4 //
  • src/ResolvExpr/TypeMap.h

    rfd344aa r9236060  
    99// Author           : Aaron B. Moss
    1010// Created On       : Fri Feb 19 13:55:00 2016
    11 // Last Modified By : Aaron B. Moss
    12 // Last Modified On : Fri Feb 19 13:55:00 2016
    13 // Update Count     : 1
    14 //
    15 
    16 #ifndef _TYPEMAP_H
    17 #define _TYPEMAP_H
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:37:19 2017
     13// Update Count     : 2
     14//
     15
     16#pragma once
    1817
    1918#include <map>
     
    204203}  // namespace ResolvExpr
    205204
    206 #endif // _TYPEMAP_H
    207 
    208205// Local Variables: //
    209206// tab-width: 4 //
  • src/ResolvExpr/Unify.h

    rfd344aa r9236060  
    1010// Created On       : Sun May 17 13:09:04 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun May 17 13:10:34 2015
    13 // Update Count     : 2
     12// Last Modified On : Fri Jul 21 23:09:34 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef UNIFY_H
    17 #define UNIFY_H
     16#pragma once
    1817
    1918#include <map>
     
    7271} // namespace ResolvExpr
    7372
    74 #endif // UNIFY_H
    75 
    7673// Local Variables: //
    7774// tab-width: 4 //
  • src/ResolvExpr/typeops.h

    rfd344aa r9236060  
    1010// Created On       : Sun May 17 07:28:22 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun May 17 07:33:11 2015
    13 // Update Count     : 2
     12// Last Modified On : Sat Jul 22 09:36:18 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef TYPEOPS_H
    17 #define TYPEOPS_H
     16#pragma once
    1817
    1918#include "SynTree/SynTree.h"
     
    116115} // namespace ResolvExpr
    117116
    118 #endif // TYPEOPS_H
    119 
    120117// Local Variables: //
    121118// tab-width: 4 //
  • src/SymTab/AddVisit.h

    rfd344aa r9236060  
    1414//
    1515
     16#include "SynTree/Statement.h"
     17
    1618namespace SymTab {
    1719        void addDecls( std::list< Declaration* > &declsToAdd, std::list< Statement* > &statements, std::list< Statement* >::iterator i );
     
    2830
    2931                        if ( stmt == stmts.end() ) break;
    30                        
     32
    3133                        // run mutator on statement
    3234                        maybeAccept( *stmt, visitor );
     
    5961
    6062                        if ( decl == translationUnit.end() ) break;
    61                        
     63
    6264                        // run mutator on declaration
    6365                        maybeAccept( *decl, visitor );
  • src/SymTab/Autogen.cc

    rfd344aa r9236060  
    1010// Created On       : Thu Mar 03 15:45:56 2016
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Jun 28 15:30:00 2017
    13 // Update Count     : 61
     12// Last Modified On : Fri Jul 14 16:41:00 2017
     13// Update Count     : 62
    1414//
    1515
    16 #include <list>
    17 #include <iterator>
    18 #include "SynTree/Visitor.h"
    19 #include "SynTree/Attribute.h"
    20 #include "SynTree/Type.h"
    21 #include "SynTree/Statement.h"
    22 #include "SynTree/TypeSubstitution.h"
    23 #include "Common/utility.h"
    24 #include "CodeGen/OperatorTable.h"
    25 #include "AddVisit.h"
    26 #include "MakeLibCfa.h"
    2716#include "Autogen.h"
    28 #include "GenPoly/ScopedSet.h"
    29 #include "Common/ScopedMap.h"
    30 #include "SymTab/Mangler.h"
    31 #include "GenPoly/DeclMutator.h"
     17
     18#include <algorithm>               // for count_if
     19#include <cassert>                 // for safe_dynamic_cast, assert, assertf
     20#include <iterator>                // for back_insert_iterator, back_inserter
     21#include <list>                    // for list, _List_iterator, list<>::iter...
     22#include <set>                     // for set, _Rb_tree_const_iterator
     23#include <vector>                  // for vector
     24
     25#include "AddVisit.h"              // for addVisit
     26#include "CodeGen/OperatorTable.h" // for isCtorDtor, isCtorDtorAssign
     27#include "Common/ScopedMap.h"      // for ScopedMap<>::const_iterator, Scope...
     28#include "Common/utility.h"        // for cloneAll, operator+
     29#include "GenPoly/DeclMutator.h"   // for DeclMutator
     30#include "GenPoly/ScopedSet.h"     // for ScopedSet, ScopedSet<>::iterator
     31#include "SymTab/Mangler.h"        // for Mangler
     32#include "SynTree/Attribute.h"     // For Attribute
     33#include "SynTree/Mutator.h"       // for maybeMutate
     34#include "SynTree/Statement.h"     // for CompoundStmt, ReturnStmt, ExprStmt
     35#include "SynTree/Type.h"          // for FunctionType, Type, TypeInstType
     36#include "SynTree/Visitor.h"       // for maybeAccept, Visitor, acceptAll
     37
     38class Attribute;
    3239
    3340namespace SymTab {
     
    396403        void makeStructFunctions( StructDecl *aggregateDecl, StructInstType *refType, unsigned int functionNesting, std::list< Declaration * > & declsToAdd, const std::vector< FuncData > & data ) {
    397404                // Builtins do not use autogeneration.
    398                 if ( aggregateDecl->get_linkage() == LinkageSpec::Builtin ||
     405                if ( aggregateDecl->get_linkage() == LinkageSpec::BuiltinCFA ||
    399406                         aggregateDecl->get_linkage() == LinkageSpec::BuiltinC ) {
    400407                        return;
  • src/SymTab/Autogen.h

    rfd344aa r9236060  
    1010// Created On       : Sun May 17 21:53:34 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jun 21 17:25:26 2017
    13 // Update Count     : 14
     12// Last Modified On : Sat Jul 22 09:50:25 2017
     13// Update Count     : 15
    1414//
    1515
    16 #ifndef AUTOGEN_H
    17 #define AUTOGEN_H
     16#pragma once
    1817
    19 #include <string>
    20 #include "SynTree/Statement.h"
    21 #include "SynTree/Expression.h"
    22 #include "SynTree/Declaration.h"
    23 #include "SynTree/Initializer.h"
    24 #include "InitTweak/InitTweak.h"
     18#include <cassert>                // for assert
     19#include <iterator>               // for back_insert_iterator, back_inserter
     20#include <list>                   // for list
     21#include <string>                 // for string, operator==
     22
     23#include "Common/UniqueName.h"    // for UniqueName
     24#include "InitTweak/InitTweak.h"  // for InitExpander
     25#include "Parser/LinkageSpec.h"   // for C
     26#include "SynTree/Constant.h"     // for Constant
     27#include "SynTree/Declaration.h"  // for ObjectDecl, Declaration (ptr only)
     28#include "SynTree/Expression.h"   // for UntypedExpr, NameExpr, VariableExpr
     29#include "SynTree/Initializer.h"  // for SingleInit
     30#include "SynTree/Label.h"        // for Label, noLabels
     31#include "SynTree/Statement.h"    // for Statement (ptr only), CompoundStmt
     32#include "SynTree/Type.h"         // for Type, ArrayType, Type::Qualifiers
    2533
    2634namespace SymTab {
     
    160168                if ( isUnnamedBitfield( obj ) ) return;
    161169
    162                 bool addCast = (fname == "?{}" || fname == "^?{}") && ( !obj || ( obj && obj->get_bitfieldWidth() == NULL ) );
     170                bool addCast = (fname == "?{}" || fname == "^?{}") && ( !obj || ( obj && ! obj->get_bitfieldWidth() ) );
    163171                std::list< Statement * > stmts;
    164172                genCall( srcParam, dstParam, fname, back_inserter( stmts ), obj->get_type(), addCast, forward );
     
    179187        }
    180188} // namespace SymTab
    181 #endif // AUTOGEN_H
     189
     190// Local Variables: //
     191// tab-width: 4 //
     192// mode: c++ //
     193// compile-command: "make install" //
     194// End: //
     195
  • src/SymTab/FixFunction.cc

    rfd344aa r9236060  
    1515
    1616#include "FixFunction.h"
    17 #include "SynTree/Declaration.h"
    18 #include "SynTree/Type.h"
    19 #include "SynTree/Expression.h"
    20 #include "Common/utility.h"
     17
     18#include <list>                   // for list
     19
     20#include "Common/utility.h"       // for maybeClone
     21#include "SynTree/Declaration.h"  // for FunctionDecl, ObjectDecl, Declarati...
     22#include "SynTree/Type.h"         // for ArrayType, PointerType, Type, Basic...
    2123
    2224namespace SymTab {
  • src/SymTab/FixFunction.h

    rfd344aa r9236060  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // FixFunction.h -- 
     7// FixFunction.h --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 17:02:08 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar  2 17:34:06 2016
    13 // Update Count     : 3
     12// Last Modified On : Sat Jul 22 09:45:55 2017
     13// Update Count     : 4
    1414//
    1515
    16 #ifndef FIXFUNCTION_H
    17 #define FIXFUNCTION_H
     16#pragma once
    1817
    19 #include "SynTree/Mutator.h"
     18#include "SynTree/Mutator.h"  // for Mutator
     19#include "SynTree/SynTree.h"  // for Types
    2020
    2121namespace SymTab {
     
    4444                virtual Type* mutate(ZeroType *zeroType);
    4545                virtual Type* mutate(OneType *oneType);
    46  
     46
    4747                bool isVoid;
    4848        };
    4949} // namespace SymTab
    50 
    51 #endif // FIXFUNCTION_H
    5250
    5351// Local Variables: //
  • src/SymTab/ImplementationType.cc

    rfd344aa r9236060  
    1515
    1616#include "ImplementationType.h"
    17 #include "SynTree/Type.h"
    18 #include "SynTree/Declaration.h"
    19 #include "SynTree/Visitor.h"
    20 #include "SymTab/Indexer.h"
    21 #include "Common/utility.h"
     17
     18#include <list>                   // for list, _List_iterator, list<>::iterator
     19
     20#include "SymTab/Indexer.h"       // for Indexer
     21#include "SynTree/Declaration.h"  // for NamedTypeDecl
     22#include "SynTree/Type.h"         // for TupleType, Type, ArrayType, Pointer...
     23#include "SynTree/Visitor.h"      // for Visitor
    2224
    2325
  • src/SymTab/ImplementationType.h

    rfd344aa r9236060  
    1010// Created On       : Sun May 17 21:35:41 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun May 17 21:37:15 2015
    13 // Update Count     : 2
     12// Last Modified On : Sat Jul 22 09:46:19 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef IMPLEMENTATIONTYPE_H
    17 #define IMPLEMENTATIONTYPE_H
     16#pragma once
    1817
    19 #include "SynTree/SynTree.h"
    20 #include "SymTab/Indexer.h"
     18class Type;
    2119
    2220namespace SymTab {
     21class Indexer;
     22
    2323        Type *implementationType( Type *, const SymTab::Indexer &indexer );
    2424
     
    3131} // namespace SymTab
    3232
    33 #endif // IMPLEMENTATIONTYPE_H
    34 
    3533// Local Variables: //
    3634// tab-width: 4 //
  • src/SymTab/Indexer.cc

    rfd344aa r9236060  
    1616#include "Indexer.h"
    1717
    18 #include <string>
    19 #include <typeinfo>
    20 #include <unordered_map>
    21 #include <unordered_set>
    22 #include <utility>
    23 #include <algorithm>
    24 
    25 #include "Mangler.h"
    26 
    27 #include "Common/utility.h"
    28 
    29 #include "CodeGen/OperatorTable.h"
    30 
    31 #include "ResolvExpr/typeops.h"
    32 
    33 #include "SynTree/Declaration.h"
    34 #include "SynTree/Type.h"
    35 #include "SynTree/Expression.h"
    36 #include "SynTree/Initializer.h"
    37 #include "SynTree/Statement.h"
    38 
    39 #include "InitTweak/InitTweak.h"
     18#include <cassert>                 // for assert, safe_dynamic_cast
     19#include <iostream>                // for operator<<, basic_ostream, ostream
     20#include <string>                  // for string, operator<<, operator!=
     21#include <unordered_map>           // for operator!=, unordered_map<>::const...
     22#include <unordered_set>           // for unordered_set
     23#include <utility>                 // for pair, make_pair, move
     24
     25#include "CodeGen/OperatorTable.h" // for isCtorDtor, isCtorDtorAssign
     26#include "Common/SemanticError.h"  // for SemanticError
     27#include "Common/utility.h"        // for cloneAll
     28#include "InitTweak/InitTweak.h"   // for isConstructor, isCopyFunction, isC...
     29#include "Mangler.h"               // for Mangler
     30#include "Parser/LinkageSpec.h"    // for isMangled, isOverridable, Spec
     31#include "ResolvExpr/typeops.h"    // for typesCompatible
     32#include "SynTree/Constant.h"      // for Constant
     33#include "SynTree/Declaration.h"   // for DeclarationWithType, FunctionDecl
     34#include "SynTree/Expression.h"    // for Expression, ImplicitCopyCtorExpr
     35#include "SynTree/Initializer.h"   // for Initializer
     36#include "SynTree/Statement.h"     // for CompoundStmt, Statement, ForStmt (...
     37#include "SynTree/Type.h"          // for Type, StructInstType, UnionInstType
    4038
    4139#define debugPrint(x) if ( doDebug ) { std::cout << x; }
  • src/SymTab/Indexer.h

    rfd344aa r9236060  
    1010// Created On       : Sun May 17 21:38:55 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar  2 17:34:14 2016
    13 // Update Count     : 6
     12// Last Modified On : Sat Jul 22 09:46:34 2017
     13// Update Count     : 7
    1414//
    1515
    16 #ifndef INDEXER_H
    17 #define INDEXER_H
     16#pragma once
    1817
    19 #include <list>
    20 #include <string>
     18#include <iosfwd>             // for ostream
     19#include <list>               // for list
     20#include <string>             // for string
    2121
    22 #include "SynTree/Visitor.h"
     22#include "SynTree/Visitor.h"  // for Visitor
     23#include "SynTree/SynTree.h"  // for AST nodes
    2324
    2425namespace SymTab {
     
    126127
    127128                struct Impl;
     129
    128130                Impl *tables;         ///< Copy-on-write instance of table data structure
    129131                unsigned long scope;  ///< Scope index of this pointer
     
    145147} // namespace SymTab
    146148
    147 #endif // INDEXER_H
    148 
    149149// Local Variables: //
    150150// tab-width: 4 //
  • src/SymTab/Mangler.cc

    rfd344aa r9236060  
    1313// Update Count     : 21
    1414//
    15 
    16 #include <cassert>
    17 #include <string>
    18 #include <algorithm>
    19 #include <iterator>
    20 #include <functional>
    21 #include <set>
    22 
    23 #include "SynTree/Declaration.h"
    24 #include "SynTree/Type.h"
    25 #include "SynTree/Expression.h"
    26 #include "SynTree/Initializer.h"
    27 #include "SynTree/Statement.h"
    2815#include "Mangler.h"
    29 #include "CodeGen/OperatorTable.h"
     16
     17#include <algorithm>                // for copy, transform
     18#include <cassert>                  // for assert, assertf
     19#include <functional>               // for const_mem_fun_t, mem_fun
     20#include <iterator>                 // for ostream_iterator, back_insert_ite...
     21#include <list>                     // for _List_iterator, list, _List_const...
     22#include <string>                   // for string, operator<<, basic_string
     23
     24#include "CodeGen/OperatorTable.h"  // for OperatorInfo, operatorLookup
     25#include "Common/utility.h"         // for toString
     26#include "Parser/LinkageSpec.h"     // for Spec, isOverridable, AutoGen, Int...
     27#include "SynTree/Declaration.h"    // for TypeDecl, DeclarationWithType
     28#include "SynTree/Expression.h"     // for TypeExpr, Expression, operator<<
     29#include "SynTree/Type.h"           // for Type, ReferenceToType, Type::Fora...
    3030
    3131namespace SymTab {
  • src/SymTab/Mangler.h

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 21:44:03 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Aug 19 15:48:46 2015
    13 // Update Count     : 14
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:45:30 2017
     13// Update Count     : 15
    1414//
    1515
    16 #ifndef MANGLER_H
    17 #define MANGLER_H
     16#pragma once
    1817
    19 #include <sstream>
    20 #include "SynTree/SynTree.h"
    21 #include "SynTree/Visitor.h"
     18#include <map>                // for map, map<>::value_compare
     19#include <sstream>            // for ostringstream
     20#include <string>             // for string
     21#include <utility>            // for pair
     22
     23#include "SynTree/SynTree.h"  // for Types
     24#include "SynTree/Visitor.h"  // for Visitor, maybeAccept
    2225
    2326namespace SymTab {
     
    7881} // SymTab
    7982
    80 #endif // MANGLER_H
    81 
    8283// Local Variables: //
    8384// tab-width: 4 //
  • src/SymTab/TypeEquality.cc

    rfd344aa r9236060  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // TypeEquality.cc -- 
     7// TypeEquality.cc --
    88//
    99// Author           : Rob Schluntz
     
    1313// Update Count     : 37
    1414//
    15 
    16 #include <list>
    17 #include <iterator>
    18 #include "Validate.h"
    19 #include "SynTree/Visitor.h"
    20 #include "SynTree/Type.h"
    21 #include "SynTree/Statement.h"
    22 #include "SynTree/TypeSubstitution.h"
    23 #include "Indexer.h"
    2415#include "TypeEquality.h"
     16
     17#include <cassert>                // for assert
     18#include <list>                   // for list, list<>::iterator, _List_iterator
     19#include <string>                 // for operator==, string, basic_string
     20
     21#include "SynTree/Constant.h"     // for Constant
     22#include "SynTree/Declaration.h"  // for DeclarationWithType
     23#include "SynTree/Expression.h"   // for ConstantExpr, Expression
     24#include "SynTree/Type.h"         // for Type, ArrayType, FunctionType, Enum...
     25#include "SynTree/Visitor.h"      // for Visitor
    2526
    2627namespace SymTab {
    2728        class TypeEquality : public Visitor {
    2829  public:
    29                 TypeEquality( Type * other, bool vlaErr ) : result( true ), other( other ), 
     30                TypeEquality( Type * other, bool vlaErr ) : result( true ), other( other ),
    3031                        vlaErr( vlaErr ) {}
    3132                bool result;
     
    7172                handleQualifiers( basicType );
    7273                if ( BasicType * bt = dynamic_cast< BasicType * >( other ) ) {
    73                         result = result && basicType->get_kind() == bt->get_kind(); 
     74                        result = result && basicType->get_kind() == bt->get_kind();
    7475                } else {
    7576                        result = false;
     
    9899
    99100                        if ( vlaErr ) {
    100                                 // useful for comparing typedef types - in this case, we 
     101                                // useful for comparing typedef types - in this case, we
    101102                                // want types to appear distinct if either is a VLA type
    102103                                if ( arrayType->get_isVarLen() || at->get_isVarLen() ) {
     
    146147
    147148                        // parameter types must be equivalent
    148                         it1 = funcType->get_parameters().begin(); 
     149                        it1 = funcType->get_parameters().begin();
    149150                        it2 = ft->get_parameters().begin();
    150151                        for ( ; it1 != funcType->get_parameters().end(); ++it1, ++it2 ) {
  • src/SymTab/TypeEquality.h

    rfd344aa r9236060  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // TypeEquality.h -- 
     7// TypeEquality.h --
    88//
    99// Author           : Rob Schluntz
     
    1414//
    1515
     16class Type;
     17
    1618namespace SymTab {
    1719  // compare types t1 and t2 for equality
    18   // if vlaErr is true, then if at least one of the types is a 
    19   // variable-length array type, then the result will be false 
     20  // if vlaErr is true, then if at least one of the types is a
     21  // variable-length array type, then the result will be false
    2022  bool typeEquals( Type * t1, Type * t2, bool vlaErr = false );
    2123} // namespace SymTab
  • src/SymTab/Validate.cc

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 21:50:04 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 30 16:50:13 2017
    13 // Update Count     : 357
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tus Aug  8 13:27:00 2017
     13// Update Count     : 358
    1414//
    1515
     
    3838//   definition occurs later in the input.
    3939
    40 #include <algorithm>
    41 #include <iterator>
    42 #include <list>
    43 
    44 #include "CodeGen/CodeGenerator.h"
    45 #include "CodeGen/OperatorTable.h"
    46 
    47 #include "Common/PassVisitor.h"
    48 #include "Common/ScopedMap.h"
    49 #include "Common/UniqueName.h"
    50 #include "Common/utility.h"
    51 
    52 #include "Concurrency/Keywords.h"
    53 
    54 #include "GenPoly/DeclMutator.h"
    55 
    56 #include "AddVisit.h"
    57 #include "Autogen.h"
    58 #include "FixFunction.h"
    59 // #include "ImplementationType.h"
    60 #include "Indexer.h"
    61 #include "MakeLibCfa.h"
    62 #include "TypeEquality.h"
    6340#include "Validate.h"
    6441
    65 #include "ResolvExpr/typeops.h"
    66 
    67 #include "SynTree/Attribute.h"
    68 #include "SynTree/Expression.h"
    69 #include "SynTree/Mutator.h"
    70 #include "SynTree/Statement.h"
    71 #include "SynTree/Type.h"
    72 #include "SynTree/TypeSubstitution.h"
    73 #include "SynTree/Visitor.h"
     42#include <cstddef>                     // for size_t
     43#include <algorithm>                   // for move, transform
     44#include <cassert>                     // for safe_dynamic_cast, assertf
     45#include <iterator>                    // for back_inserter, inserter, back_...
     46#include <list>                        // for list, _List_iterator, list<>::...
     47#include <map>                         // for _Rb_tree_iterator, map, map<>:...
     48#include <memory>                      // for unique_ptr, allocator
     49#include <string>                      // for string, operator+, operator==
     50#include <tuple>                       // for get
     51#include <utility>                     // for pair, make_pair
     52
     53#include "AddVisit.h"                  // for addVisit
     54#include "Autogen.h"                   // for SizeType, autogenerateRoutines
     55#include "CodeGen/CodeGenerator.h"     // for genName
     56#include "CodeGen/OperatorTable.h"     // for isCtorDtor, isCtorDtorAssign
     57#include "Common/PassVisitor.h"        // for PassVisitor, WithDeclsToAdd
     58#include "Common/ScopedMap.h"          // for ScopedMap<>::const_iterator
     59#include "Common/SemanticError.h"      // for SemanticError
     60#include "Common/UniqueName.h"         // for UniqueName
     61#include "Common/utility.h"            // for operator+, cloneAll, deleteAll
     62#include "Concurrency/Keywords.h"      // for applyKeywords, implementMutexF...
     63#include "FixFunction.h"               // for FixFunction
     64#include "Indexer.h"                   // for Indexer
     65#include "InitTweak/InitTweak.h"       // for isCtorDtor, isCtorDtorAssign
     66#include "Parser/LinkageSpec.h"        // for C, Cforall
     67#include "ResolvExpr/typeops.h"        // for extractResultType, typesCompat...
     68#include "SynTree/Attribute.h"         // for Attribute
     69#include "SynTree/Constant.h"          // for Constant
     70#include "SynTree/Declaration.h"       // for EnumDecl, StructDecl, UnionDecl
     71#include "SynTree/Expression.h"        // for TypeExpr, CompoundLiteralExpr
     72#include "SynTree/Initializer.h"       // for ListInit, Initializer, noDesig...
     73#include "SynTree/Mutator.h"           // for mutateAll, Mutator
     74#include "SynTree/Statement.h"         // for CompoundStmt, DeclStmt, Return...
     75#include "SynTree/Type.h"              // for Type, TypeInstType, TraitInstType
     76#include "SynTree/TypeSubstitution.h"  // for TypeSubstitution, applySubstit...
     77#include "SynTree/Visitor.h"           // for acceptAll, Visitor
    7478
    7579#define debugPrint( x ) if ( doDebug ) { std::cout << x; }
     
    612616                // a return statement in a void-returning function in C. The expression is treated as if it
    613617                // were cast to void.
    614                 if ( returnStmt->get_expr() == NULL && returnVals.size() != 0 ) {
     618                if ( ! returnStmt->get_expr() && returnVals.size() != 0 ) {
    615619                        throw SemanticError( "Non-void function returns no values: " , returnStmt );
    616620                }
     
    691695                Type *designatorType = tyDecl->get_base()->stripDeclarator();
    692696                if ( StructInstType *aggDecl = dynamic_cast< StructInstType * >( designatorType ) ) {
    693                         return new StructDecl( aggDecl->get_name() );
     697                        return new StructDecl( aggDecl->get_name(), DeclarationNode::Struct, noAttributes, tyDecl->get_linkage() );
    694698                } else if ( UnionInstType *aggDecl = dynamic_cast< UnionInstType * >( designatorType ) ) {
    695                         return new UnionDecl( aggDecl->get_name() );
     699                        return new UnionDecl( aggDecl->get_name(), noAttributes, tyDecl->get_linkage() );
    696700                } else if ( EnumInstType *enumDecl = dynamic_cast< EnumInstType * >( designatorType ) ) {
    697                         return new EnumDecl( enumDecl->get_name() );
     701                        return new EnumDecl( enumDecl->get_name(), noAttributes, tyDecl->get_linkage() );
    698702                } else {
    699703                        return ret->clone();
     
    788792                                type = new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() );
    789793                        } // if
    790                         TypedefDeclPtr tyDecl( new TypedefDecl( aggDecl->get_name(), Type::StorageClasses(), type ) );
     794                        TypedefDeclPtr tyDecl( new TypedefDecl( aggDecl->get_name(), Type::StorageClasses(), type, aggDecl->get_linkage() ) );
    791795                        typedefNames[ aggDecl->get_name() ] = std::make_pair( std::move( tyDecl ), scopeLevel );
    792796                } // if
     
    843847        void validateGeneric( Aggr * inst ) {
    844848                std::list< TypeDecl * > * params = inst->get_baseParameters();
    845                 if ( params != NULL ) {
     849                if ( params ) {
    846850                        std::list< Expression * > & args = inst->get_parameters();
    847851
     
    908912                FunctionType * ftype = functionDecl->get_functionType();
    909913                std::list< DeclarationWithType * > & retVals = ftype->get_returnVals();
    910                 assertf( retVals.size() == 0 || retVals.size() == 1, "Function %s has too many return values: %d", functionDecl->get_name().c_str(), retVals.size() );
     914                assertf( retVals.size() == 0 || retVals.size() == 1, "Function %s has too many return values: %zu", functionDecl->get_name().c_str(), retVals.size() );
    911915                if ( retVals.size() == 1 ) {
    912916                        // 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).
     
    944948        void ArrayLength::previsit( ObjectDecl * objDecl ) {
    945949                if ( ArrayType * at = dynamic_cast< ArrayType * >( objDecl->get_type() ) ) {
    946                         if ( at->get_dimension() != nullptr ) return;
     950                        if ( at->get_dimension() ) return;
    947951                        if ( ListInit * init = dynamic_cast< ListInit * >( objDecl->get_init() ) ) {
    948952                                at->set_dimension( new ConstantExpr( Constant::from_ulong( init->get_initializers().size() ) ) );
  • src/SymTab/Validate.h

    rfd344aa r9236060  
    1111// Created On       : Sun May 17 21:53:34 2015
    1212// Last Modified By : Peter A. Buhr
    13 // Last Modified On : Tue May 19 16:49:43 2015
    14 // Update Count     : 3
     13// Last Modified On : Sat Jul 22 09:46:07 2017
     14// Update Count     : 4
    1515//
    1616
    17 #ifndef VALIDATE_H
    18 #define VALIDATE_H
     17#pragma once
    1918
    20 #include "SynTree/SynTree.h"
     19#include <list>  // for list
     20
     21class Declaration;
     22class Type;
    2123
    2224namespace SymTab {
     
    2830} // namespace SymTab
    2931
    30 #endif // VALIDATE_H
    31 
    3232// Local Variables: //
    3333// tab-width: 4 //
  • src/SymTab/module.mk

    rfd344aa r9236060  
    1010## Author           : Richard C. Bilson
    1111## Created On       : Mon Jun  1 17:49:17 2015
    12 ## Last Modified By : Rob Schluntz
    13 ## Last Modified On : Tue Jul 07 16:22:23 2015
    14 ## Update Count     : 2
     12## Last Modified By : Andrew Beach
     13## Last Modified On : Thr Aug 10 16:08:00 2017
     14## Update Count     : 4
    1515###############################################################################
    1616
  • src/SynTree/AddStmtVisitor.h

    rfd344aa r9236060  
    1010// Created On       : Wed Jun 22 12:05:48 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Jul 12 17:50:32 2016
    13 // Update Count     : 8
     12// Last Modified On : Sat Jul 22 09:51:08 2017
     13// Update Count     : 9
    1414//
    1515
    16 #ifndef ADD_STATEMENT_VISITOR_H
    17 #define ADD_STATEMENT_VISITOR_H
     16#pragma once
    1817
    1918#include <list>
     
    4241};
    4342
    44 #endif // ADD_STATEMENT_VISITOR_H
     43// Local Variables: //
     44// tab-width: 4 //
     45// mode: c++ //
     46// compile-command: "make install" //
     47// End: //
  • src/SynTree/AggregateDecl.cc

    rfd344aa r9236060  
    1010// Created On       : Sun May 17 23:56:39 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Tus Jun 27 15:30:00 2017
    13 // Update Count     : 21
     12// Last Modified On : Fri Aug  4 14:22:00 2017
     13// Update Count     : 22
    1414//
    1515
     
    4040        using std::endl;
    4141
    42         os << typeString() << " " << get_name();
    43         os << string( indent+2, ' ' ) << "with body " << has_body() << endl;
     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;
    4447
    4548        if ( ! parameters.empty() ) {
  • src/SynTree/Attribute.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jan 18 16:27:11 2017
    13 // Update Count     : 38
     12// Last Modified On : Sat Jul 22 09:54:14 2017
     13// Update Count     : 39
    1414//
    1515
    16 #ifndef GCC_ATTRIBUTE_H
    17 #define GCC_ATTRIBUTE_H
     16#pragma once
    1817
    1918#include "SynTree.h"
     
    4241const std::list< Attribute * > noAttributes;
    4342
    44 #endif
    45 
    4643// Local Variables: //
    4744// tab-width: 4 //
  • src/SynTree/BaseSyntaxNode.h

    rfd344aa r9236060  
    1414//
    1515
    16 #ifndef BASE_SYNTAX_NODE_H
    17 #define BASE_SYNTAX_NODE_H
     16#pragma once
    1817
    1918#include "Common/utility.h"
     
    2928};
    3029
    31 #endif // BASE_SYNTAX_NODE_H
    32 
    3330// Local Variables: //
    3431// tab-width: 4 //
  • src/SynTree/Constant.cc

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Thr Jun 22 10:11:00 2017
    13 // Update Count     : 28
     12// Last Modified On : Fri Jul 14 14:50:00 2017
     13// Update Count     : 29
    1414//
    1515
     
    4646}
    4747
     48Constant Constant::null( Type * ptrtype ) {
     49        if ( nullptr == ptrtype ) {
     50                ptrtype = new PointerType(
     51                        Type::Qualifiers(),
     52                        new VoidType( Type::Qualifiers() )
     53                        );
     54        }
     55
     56        return Constant( ptrtype, "0", (unsigned long long int)0 );
     57}
     58
    4859unsigned long long Constant::get_ival() const {
    4960        assertf( safe_dynamic_cast<BasicType*>(type)->isInteger(), "Attempt to retrieve ival from non-integer constant." );
  • src/SynTree/Constant.h

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Thr Jun 22 10:13:00 2017
    13 // Update Count     : 15
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:54:46 2017
     13// Update Count     : 17
    1414//
    1515
    16 #ifndef CONSTANT_H
    17 #define CONSTANT_H
     16#pragma once
    1817
    1918#include "SynTree.h"
     
    4443        static Constant from_double( double d );
    4544
     45        /// generates a null pointer value for the given type. void * if omitted.
     46        static Constant null( Type * ptrtype = nullptr );
     47
    4648        virtual void accept( Visitor & v ) { v.visit( this ); }
    4749        virtual Constant * acceptMutator( Mutator & m ) { return m.mutate( this ); }
     
    5860};
    5961
    60 #endif // CONSTANT_H
    61 
    6262// Local Variables: //
    6363// tab-width: 4 //
  • src/SynTree/Declaration.cc

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 16 07:49:18 2017
    13 // Update Count     : 24
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Aug  9 14:38:00 2017
     13// Update Count     : 25
    1414//
    1515
     
    2828
    2929Declaration::Declaration( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage )
    30                 : name( name ), storageClasses( scs ), linkage( linkage ), uniqueId( 0 ) {
     30                : name( name ), linkage( linkage ), storageClasses( scs ), uniqueId( 0 ) {
    3131}
    3232
    3333Declaration::Declaration( const Declaration &other )
    34         : BaseSyntaxNode( other ), name( other.name ), storageClasses( other.storageClasses ), linkage( other.linkage ), uniqueId( other.uniqueId ) {
     34        : BaseSyntaxNode( other ), name( other.name ), linkage( other.linkage ), extension( other.extension ), storageClasses( other.storageClasses ), uniqueId( other.uniqueId ) {
    3535}
    3636
  • src/SynTree/Declaration.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Tus Jun 27 15:31:00 2017
    13 // Update Count     : 122
    14 //
    15 
    16 #ifndef DECLARATION_H
    17 #define DECLARATION_H
     12// Last Modified On : Wed Aug  9 14:45:00 2017
     13// Update Count     : 126
     14//
     15
     16#pragma once
    1817
    1918#include <string>
     
    2827class Declaration : public BaseSyntaxNode {
    2928  public:
     29        std::string name;
     30        LinkageSpec::Spec linkage;
     31        bool extension = false;
     32
    3033        Declaration( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage );
    3134        Declaration( const Declaration &other );
     
    5457        static void dumpIds( std::ostream &os );
    5558        static Declaration *declFromId( UniqueId id );
    56   private:
    57         std::string name;
     59
     60  private:
    5861        Type::StorageClasses storageClasses;
    59         LinkageSpec::Spec linkage;
    6062        UniqueId uniqueId;
    61         bool extension = false;
    6263};
    6364
    6465class DeclarationWithType : public Declaration {
    6566  public:
    66         DeclarationWithType( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes, Type::FuncSpecifiers fs );
    67         DeclarationWithType( const DeclarationWithType &other );
    68         virtual ~DeclarationWithType();
    69 
    70         std::string get_mangleName() const { return mangleName; }
    71         DeclarationWithType * set_mangleName( std::string newValue ) { mangleName = newValue; return this; }
    72 
    73         std::string get_scopedMangleName() const { return mangleName + "_" + std::to_string(scopeLevel); }
    74 
    75         int get_scopeLevel() const { return scopeLevel; }
    76         DeclarationWithType * set_scopeLevel( int newValue ) { scopeLevel = newValue; return this; }
    77 
    78         ConstantExpr *get_asmName() const { return asmName; }
    79         DeclarationWithType * set_asmName( ConstantExpr *newValue ) { asmName = newValue; return this; }
    80 
    81         std::list< Attribute * >& get_attributes() { return attributes; }
    82         const std::list< Attribute * >& get_attributes() const { return attributes; }
    83 
    84         Type::FuncSpecifiers get_funcSpec() const { return fs; }
    85         //void set_functionSpecifiers( Type::FuncSpecifiers newValue ) { fs = newValue; }
    86 
    87         virtual DeclarationWithType *clone() const = 0;
    88         virtual DeclarationWithType *acceptMutator( Mutator &m ) = 0;
    89 
    90         virtual Type *get_type() const = 0;
    91         virtual void set_type(Type *) = 0;
    92   private:
    9367        // this represents the type with all types and typedefs expanded it is generated by SymTab::Validate::Pass2
    9468        std::string mangleName;
     
    9872        ConstantExpr *asmName;
    9973        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:
    100103        Type::FuncSpecifiers fs;
    101104};
     
    104107        typedef DeclarationWithType Parent;
    105108  public:
     109        Type *type;
     110        Initializer *init;
     111        Expression *bitfieldWidth;
     112
    106113        ObjectDecl( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, Expression *bitfieldWidth, Type *type, Initializer *init,
    107114                                const std::list< Attribute * > attributes = std::list< Attribute * >(), Type::FuncSpecifiers fs = Type::FuncSpecifiers() );
     
    123130        virtual void print( std::ostream &os, int indent = 0 ) const;
    124131        virtual void printShort( std::ostream &os, int indent = 0 ) const;
    125   private:
    126         Type *type;
    127         Initializer *init;
    128         Expression *bitfieldWidth;
    129132};
    130133
     
    132135        typedef DeclarationWithType Parent;
    133136  public:
     137        FunctionType *type;
     138        CompoundStmt *statements;
     139
    134140        FunctionDecl( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, FunctionType *type, CompoundStmt *statements,
    135141                                  const std::list< Attribute * > attributes = std::list< Attribute * >(), Type::FuncSpecifiers fs = Type::FuncSpecifiers() );
     
    150156        virtual void print( std::ostream &os, int indent = 0 ) const;
    151157        virtual void printShort( std::ostream &os, int indent = 0 ) const;
    152   private:
    153         FunctionType *type;
    154         CompoundStmt *statements;
    155158};
    156159
     
    158161        typedef Declaration Parent;
    159162  public:
     163        Type *base;
     164        std::list< TypeDecl* > parameters;
     165        std::list< DeclarationWithType* > assertions;
     166
    160167        NamedTypeDecl( const std::string &name, Type::StorageClasses scs, Type *type );
    161168        NamedTypeDecl( const NamedTypeDecl &other );
     
    172179        virtual void print( std::ostream &os, int indent = 0 ) const;
    173180        virtual void printShort( std::ostream &os, int indent = 0 ) const;
    174   protected:
    175   private:
    176         Type *base;
    177         std::list< TypeDecl* > parameters;
    178         std::list< DeclarationWithType* > assertions;
    179181};
    180182
     
    183185  public:
    184186        enum Kind { Any, Dtype, Ftype, Ttype };
     187
     188        Type * init;
     189        bool sized;
     190
    185191        /// Data extracted from a type decl
    186192        struct Data {
     
    217223  private:
    218224        Kind kind;
    219         Type * init;
    220         bool sized;
    221225};
    222226
     
    224228        typedef NamedTypeDecl Parent;
    225229  public:
    226         TypedefDecl( const std::string &name, Type::StorageClasses scs, Type *type ) : Parent( name, scs, type ) {}
     230        TypedefDecl( const std::string &name, Type::StorageClasses scs, Type *type, LinkageSpec::Spec spec = LinkageSpec::Cforall ) : Parent( name, scs, type ) { set_linkage( spec ); }
    227231        TypedefDecl( const TypedefDecl &other ) : Parent( other ) {}
    228232
     
    238242        typedef Declaration Parent;
    239243  public:
    240         AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall );
    241         AggregateDecl( const AggregateDecl &other );
    242         virtual ~AggregateDecl();
    243 
    244         std::list<Declaration*>& get_members() { return members; }
    245         std::list<TypeDecl*>& get_parameters() { return parameters; }
    246 
    247         std::list< Attribute * >& get_attributes() { return attributes; }
    248         const std::list< Attribute * >& get_attributes() const { return attributes; }
    249 
    250         bool has_body() const { return body; }
    251         AggregateDecl * set_body( bool body ) { AggregateDecl::body = body; return this; }
    252 
    253         virtual void print( std::ostream &os, int indent = 0 ) const;
    254         virtual void printShort( std::ostream &os, int indent = 0 ) const;
    255   protected:
    256         virtual std::string typeString() const = 0;
    257 
    258   private:
    259244        std::list<Declaration*> members;
    260245        std::list<TypeDecl*> parameters;
    261246        bool body;
    262247        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;
    263266};
    264267
     
    266269        typedef AggregateDecl Parent;
    267270  public:
    268         StructDecl( const std::string &name, DeclarationNode::Aggregate kind = DeclarationNode::Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( kind ) {}
     271        StructDecl( const std::string &name, DeclarationNode::Aggregate kind = DeclarationNode::Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( kind ), tagged( false ), parent_name( "" ) {}
     272        StructDecl( const std::string &name, const std::string *parent, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( DeclarationNode::Struct ), tagged( true ), parent_name( parent ? *parent : "" ) {}
    269273        StructDecl( const StructDecl &other ) : Parent( other ) {}
    270274
     
    273277        bool is_thread() { return kind == DeclarationNode::Thread; }
    274278
     279        // Tagged/Tree Structure Excetion
     280        bool get_tagged() { return tagged; }
     281        void set_tagged( bool newValue ) { tagged = newValue; }
     282        bool has_parent() { return parent_name != ""; }
     283        std::string get_parentName() { return parent_name; }
     284
    275285        virtual StructDecl *clone() const { return new StructDecl( *this ); }
    276286        virtual void accept( Visitor &v ) { v.visit( this ); }
     
    279289        DeclarationNode::Aggregate kind;
    280290        virtual std::string typeString() const;
     291
     292        bool tagged;
     293        std::string parent_name;
    281294};
    282295
     
    324337class AsmDecl : public Declaration {
    325338  public:
     339        AsmStmt *stmt;
     340
    326341        AsmDecl( AsmStmt *stmt );
    327342        AsmDecl( const AsmDecl &other );
     
    336351        virtual void print( std::ostream &os, int indent = 0 ) const;
    337352        virtual void printShort( std::ostream &os, int indent = 0 ) const;
    338   private:
    339         AsmStmt *stmt;
    340353};
    341354
    342355std::ostream & operator<<( std::ostream & out, const Declaration * decl );
    343356std::ostream & operator<<( std::ostream & os, const TypeDecl::Data & data );
    344 
    345 #endif // DECLARATION_H
    346357
    347358// Local Variables: //
  • src/SynTree/Expression.cc

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 30 16:41:13 2017
    13 // Update Count     : 52
     12// Last Modified On : Tue Jul 25 14:15:47 2017
     13// Update Count     : 54
    1414//
    1515
     
    305305        if ( result->isVoid() ) {
    306306                os << "nothing";
     307        } else {
     308                result->print( os, indent+2 );
     309        } // if
     310        os << std::endl;
     311        Expression::print( os, indent );
     312}
     313
     314VirtualCastExpr::VirtualCastExpr( Expression *arg_, Type *toType ) : Expression(), arg(arg_) {
     315        set_result(toType);
     316}
     317
     318VirtualCastExpr::VirtualCastExpr( const VirtualCastExpr &other ) : Expression( other ), arg( maybeClone( other.arg ) ) {
     319}
     320
     321VirtualCastExpr::~VirtualCastExpr() {
     322        delete arg;
     323}
     324
     325void VirtualCastExpr::print( std::ostream &os, int indent ) const {
     326        os << "Virtual Cast of:" << std::endl << std::string( indent+2, ' ' );
     327        arg->print(os, indent+2);
     328        os << std::endl << std::string( indent, ' ' ) << "to:" << std::endl;
     329        os << std::string( indent+2, ' ' );
     330        if ( ! result ) {
     331                os << "unknown";
    307332        } else {
    308333                result->print( os, indent+2 );
  • src/SynTree/Expression.h

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 30 16:44:00 2017
    13 // Update Count     : 41
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Aug  8 11:54:00 2017
     13// Update Count     : 44
    1414//
    1515
    16 #ifndef EXPRESSION_H
    17 #define EXPRESSION_H
     16#pragma once
    1817
    1918#include <map>
     
    3029class Expression : public BaseSyntaxNode{
    3130  public:
     31        Type * result;
     32        TypeSubstitution * env;
     33        Expression * argName; // if expression is used as an argument, it can be "designated" by this name
     34        bool extension = false;
     35
    3236        Expression( Expression * _aname = nullptr );
    3337        Expression( const Expression & other );
     
    5054        virtual Expression * acceptMutator( Mutator & m ) = 0;
    5155        virtual void print( std::ostream & os, int indent = 0 ) const;
    52   protected:
    53         Type * result;
    54         TypeSubstitution * env;
    55         Expression * argName; // if expression is used as an argument, it can be "designated" by this name
    56         bool extension = false;
    5756};
    5857
     
    8079class ApplicationExpr : public Expression {
    8180  public:
    82         ApplicationExpr( Expression * function, const std::list<Expression *> & args = std::list<Expression *>() );
     81        Expression * function;
     82
     83        ApplicationExpr( Expression * function, const std::list<Expression *> & args = std::list< Expression * >() );
    8384        ApplicationExpr( const ApplicationExpr & other );
    8485        virtual ~ApplicationExpr();
     
    9394        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    9495        virtual void print( std::ostream & os, int indent = 0 ) const;
     96
    9597  private:
    96         Expression * function;
    9798        std::list<Expression *> args;
    9899        InferredParams inferParams;
     
    104105class UntypedExpr : public Expression {
    105106  public:
     107        Expression * function;
     108        std::list<Expression*> args;
     109
    106110        UntypedExpr( Expression * function, const std::list<Expression *> & args = std::list< Expression * >(), Expression *_aname = nullptr );
    107111        UntypedExpr( const UntypedExpr & other );
     
    124128        virtual void print( std::ostream & os, int indent = 0 ) const;
    125129        virtual void printArgs(std::ostream & os, int indent = 0) const;
    126   private:
    127         Expression * function;
    128         std::list<Expression*> args;
    129130};
    130131
     
    132133class NameExpr : public Expression {
    133134  public:
     135        std::string name;
     136
    134137        NameExpr( std::string name, Expression *_aname = nullptr );
    135138        NameExpr( const NameExpr & other );
     
    143146        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    144147        virtual void print( std::ostream & os, int indent = 0 ) const;
    145   private:
    146         std::string name;
    147148};
    148149
     
    153154class AddressExpr : public Expression {
    154155  public:
     156        Expression * arg;
     157
    155158        AddressExpr( Expression * arg, Expression *_aname = nullptr );
    156159        AddressExpr( const AddressExpr & other );
     
    164167        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    165168        virtual void print( std::ostream & os, int indent = 0 ) const;
    166   private:
    167         Expression * arg;
    168169};
    169170
     
    171172class LabelAddressExpr : public Expression {
    172173  public:
     174        Expression * arg;
     175
    173176        LabelAddressExpr( Expression * arg );
    174177        LabelAddressExpr( const LabelAddressExpr & other );
     
    182185        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    183186        virtual void print( std::ostream & os, int indent = 0 ) const;
    184   private:
    185         Expression * arg;
    186187};
    187188
     
    189190class CastExpr : public Expression {
    190191  public:
     192        Expression * arg;
     193
    191194        CastExpr( Expression * arg, Expression *_aname = nullptr );
    192195        CastExpr( Expression * arg, Type * toType, Expression *_aname = nullptr );
     
    195198
    196199        Expression * get_arg() const { return arg; }
    197         void set_arg(Expression * newValue ) { arg = newValue; }
     200        void set_arg( Expression * newValue ) { arg = newValue; }
    198201
    199202        virtual CastExpr * clone() const { return new CastExpr( * this ); }
     
    201204        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    202205        virtual void print( std::ostream & os, int indent = 0 ) const;
    203   private:
     206};
     207
     208/// VirtualCastExpr repersents a virtual dynamic cast, e.g. (virtual exception)e
     209class VirtualCastExpr : public Expression {
     210  public:
    204211        Expression * arg;
     212
     213        VirtualCastExpr( Expression * arg, Type * toType );
     214        VirtualCastExpr( const VirtualCastExpr & other );
     215        virtual ~VirtualCastExpr();
     216
     217        Expression * get_arg() const { return arg; }
     218        void set_arg( Expression * newValue ) { arg = newValue; }
     219
     220        virtual VirtualCastExpr * clone() const { return new VirtualCastExpr( * this ); }
     221        virtual void accept( Visitor & v ) { v.visit( this ); }
     222        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
     223        virtual void print( std::ostream & os, int indent = 0 ) const;
    205224};
    206225
     
    208227class UntypedMemberExpr : public Expression {
    209228  public:
     229        Expression * member;
     230        Expression * aggregate;
     231
    210232        UntypedMemberExpr( Expression * member, Expression * aggregate, Expression *_aname = nullptr );
    211233        UntypedMemberExpr( const UntypedMemberExpr & other );
     
    221243        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    222244        virtual void print( std::ostream & os, int indent = 0 ) const;
    223   private:
    224         Expression * member;
    225         Expression * aggregate;
    226245};
    227246
     
    230249class MemberExpr : public Expression {
    231250  public:
     251        DeclarationWithType * member;
     252        Expression * aggregate;
     253
    232254        MemberExpr( DeclarationWithType * member, Expression * aggregate, Expression *_aname = nullptr );
    233255        MemberExpr( const MemberExpr & other );
     
    243265        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    244266        virtual void print( std::ostream & os, int indent = 0 ) const;
    245   private:
    246         DeclarationWithType * member;
    247         Expression * aggregate;
    248267};
    249268
     
    252271class VariableExpr : public Expression {
    253272  public:
     273        DeclarationWithType * var;
     274
    254275        VariableExpr( DeclarationWithType * var, Expression *_aname = nullptr );
    255276        VariableExpr( const VariableExpr & other );
     
    265286        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    266287        virtual void print( std::ostream & os, int indent = 0 ) const;
    267   private:
    268         DeclarationWithType * var;
    269288};
    270289
     
    272291class ConstantExpr : public Expression {
    273292  public:
     293        Constant constant;
     294
    274295        ConstantExpr( Constant constant, Expression *_aname = nullptr );
    275296        ConstantExpr( const ConstantExpr & other );
     
    283304        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    284305        virtual void print( std::ostream & os, int indent = 0 ) const;
    285   private:
    286         Constant constant;
    287306};
    288307
     
    290309class SizeofExpr : public Expression {
    291310  public:
     311        Expression * expr;
     312        Type * type;
     313        bool isType;
     314
    292315        SizeofExpr( Expression * expr, Expression *_aname = nullptr );
    293316        SizeofExpr( const SizeofExpr & other );
     
    306329        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    307330        virtual void print( std::ostream & os, int indent = 0 ) const;
    308   private:
     331};
     332
     333/// AlignofExpr represents an alignof expression
     334class AlignofExpr : public Expression {
     335  public:
    309336        Expression * expr;
    310337        Type * type;
    311338        bool isType;
    312 };
    313 
    314 /// AlignofExpr represents an alignof expression
    315 class AlignofExpr : public Expression {
    316   public:
     339
    317340        AlignofExpr( Expression * expr, Expression *_aname = nullptr );
    318341        AlignofExpr( const AlignofExpr & other );
     
    331354        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    332355        virtual void print( std::ostream & os, int indent = 0 ) const;
    333   private:
    334         Expression * expr;
    335         Type * type;
    336         bool isType;
    337356};
    338357
     
    340359class UntypedOffsetofExpr : public Expression {
    341360  public:
     361        Type * type;
     362        std::string member;
     363
    342364        UntypedOffsetofExpr( Type * type, const std::string & member, Expression *_aname = nullptr );
    343365        UntypedOffsetofExpr( const UntypedOffsetofExpr & other );
     
    353375        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    354376        virtual void print( std::ostream & os, int indent = 0 ) const;
    355   private:
    356         Type * type;
    357         std::string member;
    358377};
    359378
     
    361380class OffsetofExpr : public Expression {
    362381  public:
     382        Type * type;
     383        DeclarationWithType * member;
     384
    363385        OffsetofExpr( Type * type, DeclarationWithType * member, Expression *_aname = nullptr );
    364386        OffsetofExpr( const OffsetofExpr & other );
     
    374396        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    375397        virtual void print( std::ostream & os, int indent = 0 ) const;
    376   private:
    377         Type * type;
    378         DeclarationWithType * member;
    379398};
    380399
     
    382401class OffsetPackExpr : public Expression {
    383402public:
     403        StructInstType * type;
     404
    384405        OffsetPackExpr( StructInstType * type_, Expression * aname_ = 0 );
    385406        OffsetPackExpr( const OffsetPackExpr & other );
     
    392413        virtual void accept( Visitor & v ) { v.visit( this ); }
    393414        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    394 
    395         virtual void print( std::ostream & os, int indent = 0 ) const;
    396 
    397 private:
    398         StructInstType * type;
     415        virtual void print( std::ostream & os, int indent = 0 ) const;
    399416};
    400417
     
    402419class AttrExpr : public Expression {
    403420  public:
     421        Expression * attr;
     422        Expression * expr;
     423        Type * type;
     424        bool isType;
     425
    404426        AttrExpr(Expression * attr, Expression * expr, Expression *_aname = nullptr );
    405427        AttrExpr( const AttrExpr & other );
     
    420442        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    421443        virtual void print( std::ostream & os, int indent = 0 ) const;
    422   private:
    423         Expression * attr;
    424         Expression * expr;
    425         Type * type;
    426         bool isType;
    427444};
    428445
     
    430447class LogicalExpr : public Expression {
    431448  public:
     449        Expression * arg1;
     450        Expression * arg2;
     451
    432452        LogicalExpr( Expression * arg1, Expression * arg2, bool andp = true, Expression *_aname = nullptr );
    433453        LogicalExpr( const LogicalExpr & other );
     
    444464        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    445465        virtual void print( std::ostream & os, int indent = 0 ) const;
     466
    446467  private:
     468        bool isAnd;
     469};
     470
     471/// ConditionalExpr represents the three-argument conditional ( p ? a : b )
     472class ConditionalExpr : public Expression {
     473  public:
    447474        Expression * arg1;
    448475        Expression * arg2;
    449         bool isAnd;
    450 };
    451 
    452 /// ConditionalExpr represents the three-argument conditional ( p ? a : b )
    453 class ConditionalExpr : public Expression {
    454   public:
     476        Expression * arg3;
     477
    455478        ConditionalExpr( Expression * arg1, Expression * arg2, Expression * arg3, Expression *_aname = nullptr );
    456479        ConditionalExpr( const ConditionalExpr & other );
     
    468491        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    469492        virtual void print( std::ostream & os, int indent = 0 ) const;
    470   private:
     493};
     494
     495/// CommaExpr represents the sequence operator ( a, b )
     496class CommaExpr : public Expression {
     497  public:
    471498        Expression * arg1;
    472499        Expression * arg2;
    473         Expression * arg3;
    474 };
    475 
    476 /// CommaExpr represents the sequence operator ( a, b )
    477 class CommaExpr : public Expression {
    478   public:
     500
    479501        CommaExpr( Expression * arg1, Expression * arg2, Expression *_aname = nullptr );
    480502        CommaExpr( const CommaExpr & other );
     
    490512        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    491513        virtual void print( std::ostream & os, int indent = 0 ) const;
    492   private:
    493         Expression * arg1;
    494         Expression * arg2;
    495514};
    496515
     
    498517class TypeExpr : public Expression {
    499518  public:
     519        Type * type;
     520
    500521        TypeExpr( Type * type );
    501522        TypeExpr( const TypeExpr & other );
     
    509530        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    510531        virtual void print( std::ostream & os, int indent = 0 ) const;
    511   private:
    512         Type * type;
    513532};
    514533
     
    516535class AsmExpr : public Expression {
    517536  public:
     537        Expression * inout;
     538        ConstantExpr * constraint;
     539        Expression * operand;
     540
    518541        AsmExpr( Expression * inout, ConstantExpr * constraint, Expression * operand ) : inout( inout ), constraint( constraint ), operand( operand ) {}
    519542        AsmExpr( const AsmExpr & other );
     
    533556        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    534557        virtual void print( std::ostream & os, int indent = 0 ) const;
    535   private:
     558
    536559        // https://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Machine-Constraints.html#Machine-Constraints
    537         Expression * inout;
    538         ConstantExpr * constraint;
    539         Expression * operand;
    540560};
    541561
     
    544564class ImplicitCopyCtorExpr : public Expression {
    545565public:
    546         ImplicitCopyCtorExpr( ApplicationExpr * callExpr );
    547         ImplicitCopyCtorExpr( const ImplicitCopyCtorExpr & other );
    548         virtual ~ImplicitCopyCtorExpr();
    549 
    550         ApplicationExpr * get_callExpr() const { return callExpr; }
    551         void set_callExpr( ApplicationExpr * newValue ) { callExpr = newValue; }
    552 
    553         std::list< ObjectDecl * > & get_tempDecls() { return tempDecls; }
    554         std::list< ObjectDecl * > & get_returnDecls() { return returnDecls; }
    555         std::list< Expression * > & get_dtors() { return dtors; }
    556 
    557         virtual ImplicitCopyCtorExpr * clone() const { return new ImplicitCopyCtorExpr( * this ); }
    558         virtual void accept( Visitor & v ) { v.visit( this ); }
    559         virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    560         virtual void print( std::ostream & os, int indent = 0 ) const;
    561   private:
    562566        ApplicationExpr * callExpr;
    563567        std::list< ObjectDecl * > tempDecls;
    564568        std::list< ObjectDecl * > returnDecls;
    565569        std::list< Expression * > dtors;
     570
     571        ImplicitCopyCtorExpr( ApplicationExpr * callExpr );
     572        ImplicitCopyCtorExpr( const ImplicitCopyCtorExpr & other );
     573        virtual ~ImplicitCopyCtorExpr();
     574
     575        ApplicationExpr * get_callExpr() const { return callExpr; }
     576        void set_callExpr( ApplicationExpr * newValue ) { callExpr = newValue; }
     577
     578        std::list< ObjectDecl * > & get_tempDecls() { return tempDecls; }
     579        std::list< ObjectDecl * > & get_returnDecls() { return returnDecls; }
     580        std::list< Expression * > & get_dtors() { return dtors; }
     581
     582        virtual ImplicitCopyCtorExpr * clone() const { return new ImplicitCopyCtorExpr( * this ); }
     583        virtual void accept( Visitor & v ) { v.visit( this ); }
     584        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
     585        virtual void print( std::ostream & os, int indent = 0 ) const;
    566586};
    567587
     
    569589class ConstructorExpr : public Expression {
    570590public:
     591        Expression * callExpr;
     592
    571593        ConstructorExpr( Expression * callExpr );
    572594        ConstructorExpr( const ConstructorExpr & other );
     
    580602        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    581603        virtual void print( std::ostream & os, int indent = 0 ) const;
    582 private:
    583         Expression * callExpr;
    584604};
    585605
     
    587607class CompoundLiteralExpr : public Expression {
    588608  public:
     609        Initializer * initializer;
     610
    589611        CompoundLiteralExpr( Type * type, Initializer * initializer );
    590612        CompoundLiteralExpr( const CompoundLiteralExpr & other );
     
    598620        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    599621        virtual void print( std::ostream & os, int indent = 0 ) const;
    600   private:
    601         Initializer * initializer;
    602622};
    603623
     
    605625class RangeExpr : public Expression {
    606626  public:
     627        Expression * low, * high;
     628
    607629        RangeExpr( Expression * low, Expression * high );
    608630        RangeExpr( const RangeExpr & other );
     
    617639        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    618640        virtual void print( std::ostream & os, int indent = 0 ) const;
    619   private:
    620         Expression * low, * high;
    621641};
    622642
     
    624644class UntypedTupleExpr : public Expression {
    625645  public:
     646        std::list<Expression*> exprs;
     647
    626648        UntypedTupleExpr( const std::list< Expression * > & exprs, Expression *_aname = nullptr );
    627649        UntypedTupleExpr( const UntypedTupleExpr & other );
     
    634656        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    635657        virtual void print( std::ostream & os, int indent = 0 ) const;
    636   private:
    637         std::list<Expression*> exprs;
    638658};
    639659
     
    641661class TupleExpr : public Expression {
    642662  public:
     663        std::list<Expression*> exprs;
     664
    643665        TupleExpr( const std::list< Expression * > & exprs, Expression *_aname = nullptr );
    644666        TupleExpr( const TupleExpr & other );
     
    651673        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    652674        virtual void print( std::ostream & os, int indent = 0 ) const;
    653   private:
    654         std::list<Expression*> exprs;
    655675};
    656676
     
    658678class TupleIndexExpr : public Expression {
    659679  public:
     680        Expression * tuple;
     681        unsigned int index;
     682
    660683        TupleIndexExpr( Expression * tuple, unsigned int index );
    661684        TupleIndexExpr( const TupleIndexExpr & other );
     
    671694        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    672695        virtual void print( std::ostream & os, int indent = 0 ) const;
    673   private:
    674         Expression * tuple;
    675         unsigned int index;
    676696};
    677697
     
    679699class TupleAssignExpr : public Expression {
    680700  public:
     701        StmtExpr * stmtExpr = nullptr;
     702
    681703        TupleAssignExpr( const std::list< Expression * > & assigns, const std::list< ObjectDecl * > & tempDecls, Expression * _aname = nullptr );
    682704        TupleAssignExpr( const TupleAssignExpr & other );
     
    690712        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    691713        virtual void print( std::ostream & os, int indent = 0 ) const;
    692   private:
    693         StmtExpr * stmtExpr = nullptr;
    694714};
    695715
     
    697717class StmtExpr : public Expression {
    698718public:
     719        CompoundStmt * statements;
     720        std::list< ObjectDecl * > returnDecls; // return variable(s) for stmt expression
     721        std::list< Expression * > dtors; // destructor(s) for return variable(s)
     722
    699723        StmtExpr( CompoundStmt * statements );
    700724        StmtExpr( const StmtExpr & other );
     
    711735        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    712736        virtual void print( std::ostream & os, int indent = 0 ) const;
    713 private:
    714         CompoundStmt * statements;
    715         std::list< ObjectDecl * > returnDecls; // return variable(s) for stmt expression
    716         std::list< Expression * > dtors; // destructor(s) for return variable(s)
    717737};
    718738
    719739class UniqueExpr : public Expression {
    720740public:
     741        Expression * expr;
     742        ObjectDecl * object;
     743        VariableExpr * var;
     744
    721745        UniqueExpr( Expression * expr, long long idVal = -1 );
    722746        UniqueExpr( const UniqueExpr & other );
     
    738762        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    739763        virtual void print( std::ostream & os, int indent = 0 ) const;
     764
    740765private:
    741         Expression * expr;
    742         ObjectDecl * object;
    743         VariableExpr * var;
    744766        int id;
    745767        static long long count;
     
    758780class UntypedInitExpr : public Expression {
    759781public:
     782        Expression * expr;
     783        std::list<InitAlternative> initAlts;
     784
    760785        UntypedInitExpr( Expression * expr, const std::list<InitAlternative> & initAlts );
    761786        UntypedInitExpr( const UntypedInitExpr & other );
     
    771796        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    772797        virtual void print( std::ostream & os, int indent = 0 ) const;
    773 private:
    774         Expression * expr;
    775         std::list<InitAlternative> initAlts;
    776798};
    777799
    778800class InitExpr : public Expression {
    779801public:
     802        Expression * expr;
     803        Designation * designation;
     804
    780805        InitExpr( Expression * expr, Designation * designation );
    781806        InitExpr( const InitExpr & other );
     
    792817        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
    793818        virtual void print( std::ostream & os, int indent = 0 ) const;
    794 private:
    795         Expression * expr;
    796         Designation * designation;
    797819};
    798820
    799821
    800822std::ostream & operator<<( std::ostream & out, const Expression * expr );
    801 
    802 #endif // EXPRESSION_H
    803823
    804824// Local Variables: //
  • src/SynTree/Initializer.cc

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Fri May 13 13:23:03 2016
    13 // Update Count     : 28
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thr Aug  3 11:33:00 2016
     13// Update Count     : 29
    1414//
    1515
     
    7474                        }
    7575                }
    76                 assertf( initializers.size() == designations.size(), "Created ListInit with mismatching initializers (%d) and designations (%d)", initializers.size(), designations.size() );
     76                assertf( initializers.size() == designations.size(), "Created ListInit with mismatching initializers (%lu) and designations (%lu)", initializers.size(), designations.size() );
    7777}
    7878
  • src/SynTree/Initializer.h

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 23 16:12:42 2017
    13 // Update Count     : 20
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Aug  9 10:19:00 2017
     13// Update Count     : 22
    1414//
    1515
    16 #ifndef INITIALIZER_H
    17 #define INITIALIZER_H
     16#pragma once
    1817
    1918#include <cassert>
     
    2827class Designation : public BaseSyntaxNode {
    2928public:
     29        std::list< Expression * > designators;
     30
    3031        Designation( const std::list< Expression * > & designators );
    3132        Designation( const Designation & other );
     
    3839        virtual Designation * acceptMutator( Mutator &m ) { return m.mutate( this ); }
    3940        virtual void print( std::ostream &os, int indent = 0 ) const;
    40 private:
    41         std::list< Expression * > designators;
    4241};
    4342
     
    6463class SingleInit : public Initializer {
    6564  public:
     65        //Constant *value;
     66        Expression *value;      // has to be a compile-time constant
     67
    6668        SingleInit( Expression *value, bool maybeConstructed = false );
    6769        SingleInit( const SingleInit &other );
     
    7577        virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    7678        virtual void print( std::ostream &os, int indent = 0 ) const;
    77   private:
    78         //Constant *value;
    79         Expression *value;      // has to be a compile-time constant
    8079};
    8180
     
    8483class ListInit : public Initializer {
    8584  public:
     85        std::list<Initializer *> initializers;  // order *is* important
     86        std::list<Designation *> designations;  // order/length is consistent with initializers
     87
    8688        ListInit( const std::list<Initializer*> &initializers,
    8789                          const std::list<Designation *> &designators = {}, bool maybeConstructed = false );
     
    103105        virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    104106        virtual void print( std::ostream &os, int indent = 0 ) const;
    105   private:
    106         std::list<Initializer *> initializers;  // order *is* important
    107         std::list<Designation *> designations;  // order/length is consistent with initializers
    108107};
    109108
     
    114113class ConstructorInit : public Initializer {
    115114  public:
     115        Statement * ctor;
     116        Statement * dtor;
     117
    116118        ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init );
    117119        ConstructorInit( const ConstructorInit &other );
     
    131133
    132134  private:
    133         Statement * ctor;
    134         Statement * dtor;
    135135        // C-style initializer made up of SingleInit and ListInit nodes to use as a fallback
    136136        // if an appropriate constructor definition is not found by the resolver
     
    141141std::ostream & operator<<( std::ostream & out, const Designation * des );
    142142
    143 #endif // INITIALIZER_H
    144 
    145143// Local Variables: //
    146144// tab-width: 4 //
  • src/SynTree/Label.h

    rfd344aa r9236060  
    1010// Created On       : Wed Jun 8 12:53:12 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Aug  7 14:44:29 2016
    13 // Update Count     : 2
     12// Last Modified On : Sat Jul 22 09:52:44 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef LABEL_H
    17 #define LABEL_H
     16#pragma once
    1817
    1918#include <string>
     
    5150static const std::list< Label > noLabels;
    5251
    53 #endif // LABEL_H
    54 
    5552// Local Variables: //
    5653// tab-width: 4 //
  • src/SynTree/Mutator.cc

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Thu Jun 22 13:43:00 2017
    13 // Update Count     : 24
     12// Last Modified On : Mon Jul 24 16:32:00 2017
     13// Update Count     : 25
    1414//
    1515
     
    235235}
    236236
     237Expression *Mutator::mutate( VirtualCastExpr *castExpr ) {
     238        castExpr->set_env( maybeMutate( castExpr->get_env(), *this ) );
     239        castExpr->set_result( maybeMutate( castExpr->get_result(), *this ) );
     240        castExpr->set_arg( maybeMutate( castExpr->get_arg(), *this ) );
     241        return castExpr;
     242}
     243
    237244Expression *Mutator::mutate( UntypedMemberExpr *memberExpr ) {
    238245        memberExpr->set_env( maybeMutate( memberExpr->get_env(), *this ) );
  • src/SynTree/Mutator.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Thu Jun  8 15:45:00 2017
    13 // Update Count     : 14
     12// Last Modified On : Mon Jul 24 16:31:00 2017
     13// Update Count     : 16
    1414//
    1515#include <cassert>
     
    1818#include "Common/SemanticError.h"
    1919
    20 #ifndef MUTATOR_H
    21 #define MUTATOR_H
     20#pragma once
    2221
    2322class Mutator {
     
    6059        virtual Expression* mutate( LabelAddressExpr *labAddressExpr );
    6160        virtual Expression* mutate( CastExpr *castExpr );
     61        virtual Expression* mutate( VirtualCastExpr *castExpr );
    6262        virtual Expression* mutate( UntypedMemberExpr *memberExpr );
    6363        virtual Expression* mutate( MemberExpr *memberExpr );
     
    151151}
    152152
    153 #endif // MUTATOR_H
    154 
    155153// Local Variables: //
    156154// tab-width: 4 //
  • src/SynTree/NamedTypeDecl.cc

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 16 07:49:44 2017
    13 // Update Count     : 13
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Aug  9 13:28:00 2017
     13// Update Count     : 14
    1414//
    1515
     
    3838        if ( get_name() != "" ) {
    3939                os << get_name() << ": ";
     40        } // if
     41        if ( get_linkage() != LinkageSpec::Cforall ) {
     42                os << LinkageSpec::linkageName( get_linkage() ) << " ";
    4043        } // if
    4144        get_storageClasses().print( os );
  • src/SynTree/Statement.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Mon Jun 12 13:35:00 2017
    13 // Update Count     : 67
     12// Last Modified On : Thr Aug  3 14:08:00 2017
     13// Update Count     : 69
    1414//
    1515
    16 #ifndef STATEMENT_H
    17 #define STATEMENT_H
     16#pragma once
    1817
    1918#include "BaseSyntaxNode.h"
     
    2726class Statement : public BaseSyntaxNode {
    2827  public:
     28        std::list<Label> labels;
     29
    2930        Statement( std::list<Label> labels );
    3031        virtual ~Statement();
     
    3738        virtual Statement *acceptMutator( Mutator &m ) = 0;
    3839        virtual void print( std::ostream &os, int indent = 0 ) const;
    39   protected:
    40         std::list<Label> labels;
    4140};
    4241
    4342class CompoundStmt : public Statement {
    4443  public:
     44        std::list<Statement*> kids;
     45
    4546        CompoundStmt( std::list<Label> labels );
    4647        CompoundStmt( const CompoundStmt &other );
     
    5556        virtual CompoundStmt *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    5657        virtual void print( std::ostream &os, int indent = 0 ) const;
    57   private:
    58         std::list<Statement*> kids;
    5958};
    6059
     
    6867        virtual NullStmt *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    6968        virtual void print( std::ostream &os, int indent = 0 ) const;
    70 
    71   private:
    7269};
    7370
    7471class ExprStmt : public Statement {
    7572  public:
     73        Expression *expr;
     74
    7675        ExprStmt( std::list<Label> labels, Expression *expr );
    7776        ExprStmt( const ExprStmt &other );
     
    8584        virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    8685        virtual void print( std::ostream &os, int indent = 0 ) const;
    87   private:
    88         Expression *expr;
    8986};
    9087
    9188class AsmStmt : public Statement {
    9289  public:
     90        bool voltile;
     91        ConstantExpr *instruction;
     92        std::list<Expression *> output, input;
     93        std::list<ConstantExpr *> clobber;
     94        std::list<Label> gotolabels;
     95
    9396        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 );
    9497        AsmStmt( const AsmStmt &other );
     
    112115        virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    113116        virtual void print( std::ostream &os, int indent = 0 ) const;
    114   private:
    115         bool voltile;
    116         ConstantExpr *instruction;
    117         std::list<Expression *> output, input;
    118         std::list<ConstantExpr *> clobber;
    119         std::list<Label> gotolabels;
    120117};
    121118
    122119class IfStmt : public Statement {
    123120  public:
     121        Expression *condition;
     122        Statement *thenPart;
     123        Statement *elsePart;
     124
    124125        IfStmt( std::list<Label> labels, Expression *condition, Statement *thenPart, Statement *elsePart );
    125126        IfStmt( const IfStmt &other );
     
    137138        virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    138139        virtual void print( std::ostream &os, int indent = 0 ) const;
    139   private:
    140         Expression *condition;
    141         Statement *thenPart;
    142         Statement *elsePart;
    143140};
    144141
    145142class SwitchStmt : public Statement {
    146143  public:
     144        Expression * condition;
     145
    147146        SwitchStmt( std::list<Label> labels, Expression *condition, std::list<Statement *> &statements );
    148147        SwitchStmt( const SwitchStmt &other );
     
    160159        virtual void print( std::ostream &os, int indent = 0 ) const;
    161160  private:
     161        std::list<Statement *> statements;
     162};
     163
     164class CaseStmt : public Statement {
     165  public:
    162166        Expression * condition;
    163         std::list<Statement *> statements;
    164 };
    165 
    166 class CaseStmt : public Statement {
    167   public:
     167        std::list<Statement *> stmts;
     168
    168169        CaseStmt( std::list<Label> labels, Expression *conditions, std::list<Statement *> &stmts, bool isdef = false ) throw(SemanticError);
    169170        CaseStmt( const CaseStmt &other );
     
    187188        virtual void print( std::ostream &os, int indent = 0 ) const;
    188189  private:
    189         Expression * condition;
    190         std::list<Statement *> stmts;
    191190        bool _isDefault;
    192191};
     
    194193class WhileStmt : public Statement {
    195194  public:
     195        Expression *condition;
     196        Statement *body;
     197        bool isDoWhile;
     198
    196199        WhileStmt( std::list<Label> labels, Expression *condition,
    197200               Statement *body, bool isDoWhile = false );
     
    210213        virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    211214        virtual void print( std::ostream &os, int indent = 0 ) const;
    212   private:
     215};
     216
     217class ForStmt : public Statement {
     218  public:
     219        std::list<Statement *> initialization;
    213220        Expression *condition;
     221        Expression *increment;
    214222        Statement *body;
    215         bool isDoWhile;
    216 };
    217 
    218 class ForStmt : public Statement {
    219   public:
     223
    220224        ForStmt( std::list<Label> labels, std::list<Statement *> initialization,
    221225             Expression *condition = 0, Expression *increment = 0, Statement *body = 0 );
     
    236240        virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    237241        virtual void print( std::ostream &os, int indent = 0 ) const;
    238   private:
    239         std::list<Statement *> initialization;
    240         Expression *condition;
    241         Expression *increment;
    242         Statement *body;
    243242};
    244243
     
    246245  public:
    247246        enum Type { Goto = 0, Break, Continue };
     247
     248        // originalTarget kept for error messages.
     249        const Label originalTarget;
     250        Label target;
     251        Expression *computedTarget;
     252        Type type;
    248253
    249254        BranchStmt( std::list<Label> labels, Label target, Type ) throw (SemanticError);
     
    266271  private:
    267272        static const char *brType[];
    268         Label originalTarget;  // can give better error messages if we remember the label name that the user entered
    269         Label target;
    270         Expression *computedTarget;
    271         Type type;
    272273};
    273274
    274275class ReturnStmt : public Statement {
    275276  public:
     277        Expression *expr;
     278
    276279        ReturnStmt( std::list<Label> labels, Expression *expr );
    277280        ReturnStmt( const ReturnStmt &other );
     
    285288        virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    286289        virtual void print( std::ostream &os, int indent = 0 ) const;
    287   private:
    288         Expression *expr;
    289290};
    290291
     
    292293  public:
    293294        enum Kind { Terminate, Resume };
     295
     296        const Kind kind;
     297        Expression * expr;
     298        Expression * target;
    294299
    295300        ThrowStmt( std::list<Label> labels, Kind kind, Expression * expr, Expression * target = nullptr );
     
    307312        virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    308313        virtual void print( std::ostream &os, int indent = 0 ) const;
    309   private:
    310         Kind kind;
    311         Expression * expr;
    312         Expression * target;
    313314};
    314315
    315316class TryStmt : public Statement {
    316317  public:
     318        CompoundStmt *block;
     319        std::list<CatchStmt *> handlers;
     320        FinallyStmt *finallyBlock;
     321
    317322        TryStmt( std::list<Label> labels, CompoundStmt *tryBlock, std::list<CatchStmt *> &handlers, FinallyStmt *finallyBlock = 0 );
    318323        TryStmt( const TryStmt &other );
     
    330335        virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    331336        virtual void print( std::ostream &os, int indent = 0 ) const;
    332 
    333   private:
    334         CompoundStmt *block;
    335         std::list<CatchStmt *> handlers;
    336         FinallyStmt *finallyBlock;
    337337};
    338338
     
    340340  public:
    341341        enum Kind { Terminate, Resume };
     342
     343        const Kind kind;
     344        Declaration *decl;
     345        Expression *cond;
     346        Statement *body;
    342347
    343348        CatchStmt( std::list<Label> labels, Kind kind, Declaration *decl,
     
    358363        virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    359364        virtual void print( std::ostream &os, int indent = 0 ) const;
    360 
    361   private:
    362         Kind kind;
    363         Declaration *decl;
    364         Expression *cond;
    365         Statement *body;
    366365};
    367366
    368367class FinallyStmt : public Statement {
    369368  public:
     369        CompoundStmt *block;
     370
    370371        FinallyStmt( std::list<Label> labels, CompoundStmt *block );
    371372        FinallyStmt( const FinallyStmt &other );
     
    379380        virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    380381        virtual void print( std::ostream &os, int indent = 0 ) const;
    381   private:
    382         CompoundStmt *block;
    383382};
    384383
     
    387386class DeclStmt : public Statement {
    388387  public:
     388        Declaration *decl;
     389
    389390        DeclStmt( std::list<Label> labels, Declaration *decl );
    390391        DeclStmt( const DeclStmt &other );
     
    398399        virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    399400        virtual void print( std::ostream &os, int indent = 0 ) const;
    400   private:
    401         Declaration *decl;
    402401};
    403402
     
    408407class ImplicitCtorDtorStmt : public Statement {
    409408  public:
     409        // Non-owned pointer to the constructor/destructor statement
     410        Statement * callStmt;
     411
    410412        ImplicitCtorDtorStmt( Statement * callStmt );
    411413        ImplicitCtorDtorStmt( const ImplicitCtorDtorStmt & other );
     
    419421        virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    420422        virtual void print( std::ostream &os, int indent = 0 ) const;
    421 
    422   private:
    423         // Non-owned pointer to the constructor/destructor statement
    424         Statement * callStmt;
    425423};
    426424
    427425
    428426std::ostream & operator<<( std::ostream & out, const Statement * statement );
    429 
    430 #endif // STATEMENT_H
    431427
    432428// Local Variables: //
  • src/SynTree/SynTree.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Thu Jun  8 17:00:00 2017
    13 // Update Count     : 9
     12// Last Modified On : Mon Jul 24 16:54:00 2017
     13// Update Count     : 11
    1414//
    1515
    16 #ifndef SYNTREE_H
    17 #define SYNTREE_H
     16#pragma once
    1817
    1918#include <string>
     
    6766class LabelAddressExpr;
    6867class CastExpr;
     68class VirtualCastExpr;
    6969class MemberExpr;
    7070class UntypedMemberExpr;
     
    136136class Attribute;
    137137
    138 #endif // SYNTREE_H
    139 
    140138// Local Variables: //
    141139// tab-width: 4 //
  • src/SynTree/Type.cc

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 17 08:42:47 2017
    13 // Update Count     : 28
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Aug  2 11:11:00 2017
     13// Update Count     : 29
    1414//
    1515
     
    9898}
    9999
     100// Empty Variable declarations:
     101const Type::FuncSpecifiers noFuncSpecifiers;
     102const Type::StorageClasses noStorageClasses;
     103const Type::Qualifiers noQualifiers;
     104
    100105std::ostream & operator<<( std::ostream & out, const Type * type ) {
    101106        if ( type ) {
  • src/SynTree/Type.h

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 23 16:16:36 2017
    13 // Update Count     : 149
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Aug  9 14:25:00 2017
     13// Update Count     : 152
    1414//
    1515
    16 #ifndef TYPE_H
    17 #define TYPE_H
     16#pragma once
    1817
    1918#include "BaseSyntaxNode.h"
     
    128127        }; // Qualifiers
    129128
     129        typedef std::list<TypeDecl *> ForallList;
     130
     131        Qualifiers tq;
     132        ForallList forall;
     133        std::list< Attribute * > attributes;
     134
    130135        Type( const Qualifiers & tq, const std::list< Attribute * > & attributes );
    131136        Type( const Type & other );
     
    146151        void set_atomic( bool newValue ) { tq.is_atomic = newValue; }
    147152
    148         typedef std::list<TypeDecl *> ForallList;
    149153        ForallList& get_forall() { return forall; }
    150154
     
    172176        virtual Type *acceptMutator( Mutator & m ) = 0;
    173177        virtual void print( std::ostream & os, int indent = 0 ) const;
    174   private:
    175         Qualifiers tq;
    176         ForallList forall;
    177         std::list< Attribute * > attributes;
    178 };
    179 
    180 extern Type::Qualifiers emptyQualifiers;                                // no qualifiers on constants
     178};
     179
     180extern const Type::FuncSpecifiers noFuncSpecifiers;
     181extern const Type::StorageClasses noStorageClasses;
     182extern const Type::Qualifiers noQualifiers;                     // no qualifiers on constants
    181183
    182184class VoidType : public Type {
     
    218220                LongDoubleImaginary,
    219221                NUMBER_OF_BASIC_TYPES
    220         };
     222        } kind;
    221223
    222224        static const char *typeNames[];                                         // string names for basic types, MUST MATCH with Kind
     
    233235
    234236        bool isInteger() const;
    235   private:
    236         Kind kind;
    237237};
    238238
    239239class PointerType : public Type {
    240240  public:
     241        Type *base;
     242
     243        // In C99, pointer types can be qualified in many ways e.g., int f( int a[ static 3 ] )
     244        Expression *dimension;
     245        bool isVarLen;
     246        bool isStatic;
     247
    241248        PointerType( const Type::Qualifiers & tq, Type *base, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
    242249        PointerType( const Type::Qualifiers & tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
     
    261268        virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }
    262269        virtual void print( std::ostream & os, int indent = 0 ) const;
    263   private:
     270};
     271
     272class ArrayType : public Type {
     273  public:
    264274        Type *base;
    265 
    266         // In C99, pointer types can be qualified in many ways e.g., int f( int a[ static 3 ] )
    267275        Expression *dimension;
    268276        bool isVarLen;
    269277        bool isStatic;
    270 };
    271 
    272 class ArrayType : public Type {
    273   public:
     278
    274279        ArrayType( const Type::Qualifiers & tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
    275280        ArrayType( const ArrayType& );
     
    291296        virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }
    292297        virtual void print( std::ostream & os, int indent = 0 ) const;
    293   private:
    294         Type *base;
    295         Expression *dimension;
    296         bool isVarLen;
    297         bool isStatic;
    298298};
    299299
    300300class ReferenceType : public Type {
    301301public:
     302        Type *base;
     303
    302304        ReferenceType( const Type::Qualifiers & tq, Type *base, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
    303305        ReferenceType( const ReferenceType & );
     
    313315        virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }
    314316        virtual void print( std::ostream & os, int indent = 0 ) const;
    315 private:
    316         Type *base;
    317317};
    318318
    319319class FunctionType : public Type {
    320320  public:
     321        std::list<DeclarationWithType*> returnVals;
     322        std::list<DeclarationWithType*> parameters;
     323
     324        // Does the function accept a variable number of arguments following the arguments specified in the parameters list.
     325        // This could be because of
     326        // - an ellipsis in a prototype declaration
     327        // - an unprototyped declaration
     328        bool isVarArgs;
     329
    321330        FunctionType( const Type::Qualifiers & tq, bool isVarArgs, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
    322331        FunctionType( const FunctionType& );
     
    333342        virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }
    334343        virtual void print( std::ostream & os, int indent = 0 ) const;
    335   private:
    336         std::list<DeclarationWithType*> returnVals;
    337         std::list<DeclarationWithType*> parameters;
    338 
    339         // Does the function accept a variable number of arguments following the arguments specified in the parameters list.
    340         // This could be because of
    341         // - an ellipsis in a prototype declaration
    342         // - an unprototyped declaration
    343         bool isVarArgs;
    344344};
    345345
    346346class ReferenceToType : public Type {
    347347  public:
     348        std::list< Expression* > parameters;
     349        std::string name;
     350        bool hoistType;
     351
    348352        ReferenceToType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes );
    349353        ReferenceToType( const ReferenceToType & other );
     
    364368  protected:
    365369        virtual std::string typeString() const = 0;
    366         std::list< Expression* > parameters;
    367         std::string name;
    368   private:
    369         bool hoistType;
    370370};
    371371
     
    373373        typedef ReferenceToType Parent;
    374374  public:
     375        // this decl is not "owned" by the struct inst; it is merely a pointer to elsewhere in the tree,
     376        // where the structure used in this type is actually defined
     377        StructDecl *baseStruct;
     378
    375379        StructInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ), baseStruct( 0 ) {}
    376380        StructInstType( const Type::Qualifiers & tq, StructDecl * baseStruct, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
     
    396400  private:
    397401        virtual std::string typeString() const;
    398 
    399         // this decl is not "owned" by the struct inst; it is merely a pointer to elsewhere in the tree,
    400         // where the structure used in this type is actually defined
    401         StructDecl *baseStruct;
    402402};
    403403
     
    405405        typedef ReferenceToType Parent;
    406406  public:
     407        // this decl is not "owned" by the union inst; it is merely a pointer to elsewhere in the tree,
     408        // where the union used in this type is actually defined
     409        UnionDecl *baseUnion;
     410
    407411        UnionInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ), baseUnion( 0 ) {}
    408412        UnionInstType( const Type::Qualifiers & tq, UnionDecl * baseUnion, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
     
    428432  private:
    429433        virtual std::string typeString() const;
    430 
     434};
     435
     436class EnumInstType : public ReferenceToType {
     437        typedef ReferenceToType Parent;
     438  public:
    431439        // this decl is not "owned" by the union inst; it is merely a pointer to elsewhere in the tree,
    432440        // where the union used in this type is actually defined
    433         UnionDecl *baseUnion;
    434 };
    435 
    436 class EnumInstType : public ReferenceToType {
    437         typedef ReferenceToType Parent;
    438   public:
     441        EnumDecl *baseEnum = nullptr;
     442
    439443        EnumInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ) {}
    440444        EnumInstType( const Type::Qualifiers & tq, EnumDecl * baseEnum, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
     
    451455  private:
    452456        virtual std::string typeString() const;
    453 
    454         // this decl is not "owned" by the union inst; it is merely a pointer to elsewhere in the tree,
    455         // where the union used in this type is actually defined
    456         EnumDecl *baseEnum = nullptr;
    457457};
    458458
     
    460460        typedef ReferenceToType Parent;
    461461  public:
     462        // this member is filled in by the validate pass, which instantiates the members of the correponding
     463        // aggregate with the actual type parameters specified for this use of the context
     464        std::list< Declaration* > members;
     465
    462466        TraitInstType( const Type::Qualifiers & tq, const std::string & name, const std::list< Attribute * > & attributes = std::list< Attribute * >()  ) : Parent( tq, name, attributes ) {}
    463467        TraitInstType( const TraitInstType & other );
     
    473477  private:
    474478        virtual std::string typeString() const;
    475 
    476         // this member is filled in by the validate pass, which instantiates the members of the correponding
    477         // aggregate with the actual type parameters specified for this use of the context
    478         std::list< Declaration* > members;
    479479};
    480480
     
    482482        typedef ReferenceToType Parent;
    483483  public:
     484        // this decl is not "owned" by the type inst; it is merely a pointer to elsewhere in the tree,
     485        // where the type used here is actually defined
     486        TypeDecl *baseType;
     487        bool isFtype;
     488
    484489        TypeInstType( const Type::Qualifiers & tq, const std::string & name, TypeDecl *baseType, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
    485490        TypeInstType( const Type::Qualifiers & tq, const std::string & name, bool isFtype, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
     
    500505  private:
    501506        virtual std::string typeString() const;
    502         // this decl is not "owned" by the type inst; it is merely a pointer to elsewhere in the tree,
    503         // where the type used here is actually defined
    504         TypeDecl *baseType;
    505         bool isFtype;
    506507};
    507508
    508509class TupleType : public Type {
    509510  public:
     511        std::list<Type *> types;
     512        std::list<Declaration *> members;
     513
    510514        TupleType( const Type::Qualifiers & tq, const std::list< Type * > & types, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
    511515        TupleType( const TupleType& );
     
    536540        virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }
    537541        virtual void print( std::ostream & os, int indent = 0 ) const;
    538   private:
    539         std::list<Type *> types;
    540         std::list<Declaration *> members;
    541542};
    542543
    543544class TypeofType : public Type {
    544545  public:
     546        Expression *expr;
     547
    545548        TypeofType( const Type::Qualifiers & tq, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
    546549        TypeofType( const TypeofType& );
     
    556559        virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }
    557560        virtual void print( std::ostream & os, int indent = 0 ) const;
    558   private:
     561};
     562
     563class AttrType : public Type {
     564  public:
     565        std::string name;
    559566        Expression *expr;
    560 };
    561 
    562 class AttrType : public Type {
    563   public:
     567        Type *type;
     568        bool isType;
     569
    564570        AttrType( const Type::Qualifiers & tq, const std::string & name, Expression *expr, const std::list< Attribute * > & attributes = std::list< Attribute * >() );
    565571        AttrType( const Type::Qualifiers & tq, const std::string & name, Type *type, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
     
    582588        virtual Type *acceptMutator( Mutator & m ) { return m.mutate( this ); }
    583589        virtual void print( std::ostream & os, int indent = 0 ) const;
    584   private:
    585         std::string name;
    586         Expression *expr;
    587         Type *type;
    588         bool isType;
    589590};
    590591
     
    628629
    629630std::ostream & operator<<( std::ostream & out, const Type * type );
    630 
    631 #endif // TYPE_H
    632631
    633632// Local Variables: //
  • src/SynTree/TypeDecl.cc

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 16 07:49:58 2017
    13 // Update Count     : 5
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Aug  9 14:35:00 2017
     13// Update Count     : 6
    1414//
    1515
     
    1818#include "Common/utility.h"
    1919
    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 ) {
     20TypeDecl::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 ) {
    2121}
    2222
    23 TypeDecl::TypeDecl( const TypeDecl &other ) : Parent( other ), kind( other.kind ), init( maybeClone( other.init ) ), sized( other.sized ) {
     23TypeDecl::TypeDecl( const TypeDecl &other ) : Parent( other ), init( maybeClone( other.init ) ), sized( other.sized ), kind( other.kind ) {
    2424}
    2525
  • src/SynTree/TypeSubstitution.h

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Fri Apr 29 15:00:20 2016
    13 // Update Count     : 2
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:52:24 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef TYPESUBSTITUTION_H
    17 #define TYPESUBSTITUTION_H
     16#pragma once
    1817
    1918#include <map>
     
    180179std::ostream & operator<<( std::ostream & out, const TypeSubstitution & sub );
    181180
    182 #endif // TYPESUBSTITUTION_H
    183 
    184181// Local Variables: //
    185182// tab-width: 4 //
  • src/SynTree/VarExprReplacer.h

    rfd344aa r9236060  
    99// Author           : Rob Schluntz
    1010// Created On       : Wed Jan 13 16:29:30 2016
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Fri May 13 11:27:52 2016
    13 // Update Count     : 5
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:53:41 2017
     13// Update Count     : 6
    1414//
    1515
    16 #ifndef VAR_EXPR_REPLACER_H
    17 #define VAR_EXPR_REPLACER_H
     16#pragma once
    1817
    1918#include <map>
     
    3534};
    3635
    37 #endif // VAR_EXPR_REPLACER_H
    38 
    3936// Local Variables: //
    4037// tab-width: 4 //
  • src/SynTree/Visitor.cc

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Thu Jun 22 13:41:00 2017
    13 // Update Count     : 26
     12// Last Modified On : Mon Jul 24 16:30:00 2017
     13// Update Count     : 27
    1414//
    1515
     
    192192}
    193193
     194void Visitor::visit( VirtualCastExpr *castExpr ) {
     195        maybeAccept( castExpr->get_result(), *this );
     196        maybeAccept( castExpr->get_arg(), *this );
     197}
     198
    194199void Visitor::visit( UntypedMemberExpr *memberExpr ) {
    195200        maybeAccept( memberExpr->get_result(), *this );
  • src/SynTree/Visitor.h

    rfd344aa r9236060  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Thr Jun 08 15:45:00 2017
    13 // Update Count     : 11
     12// Last Modified On : Mon Jul 24 16:28:00 2017
     13// Update Count     : 13
    1414//
    1515
    16 #ifndef VISITOR_H
    17 #define VISITOR_H
     16#pragma once
    1817
    1918#include "SynTree.h"
     
    6160        virtual void visit( NameExpr *nameExpr );
    6261        virtual void visit( CastExpr *castExpr );
     62        virtual void visit( VirtualCastExpr *castExpr );
    6363        virtual void visit( AddressExpr *addressExpr );
    6464        virtual void visit( LabelAddressExpr *labAddressExpr );
     
    175175}
    176176
    177 #endif // VISITOR_H
    178 
    179177// Local Variables: //
    180178// tab-width: 4 //
  • src/Tuples/Explode.h

    rfd344aa r9236060  
    99// Author           : Rob Schluntz
    1010// Created On       : Wed Nov 9 13:12:24 2016
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Nov 9 13:20:24 2016
    13 // Update Count     : 2
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:55:16 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef _EXPLODE_H_
    17 #define _EXPLODE_H_
     16#pragma once
    1817
    1918#include "ResolvExpr/AlternativeFinder.h"
     
    8382} // namespace Tuples
    8483
    85 #endif // _TUPLE_ASSIGNMENT_H_
    86 
    8784// Local Variables: //
    8885// tab-width: 4 //
  • src/Tuples/TupleExpansion.cc

    rfd344aa r9236060  
    6666                };
    6767
    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;
     68                struct TupleTypeReplacer : public WithDeclsToAdd, public WithGuards, public WithTypeSubstitution {
     69                        Type * postmutate( TupleType * tupleType );
     70
     71                        void premutate( CompoundStmt * ) {
     72                                GuardScope( typeMap );
    8073                        }
    8174                  private:
     
    111104                mutateAll( translationUnit, assnExpander );
    112105
    113                 TupleTypeReplacer replacer;
    114                 replacer.mutateDeclarationList( translationUnit );
     106                PassVisitor<TupleTypeReplacer> replacer;
     107                mutateAll( translationUnit, replacer );
    115108
    116109                PassVisitor<TupleIndexExpander> idxExpander;
     
    218211        }
    219212
    220         Type * TupleTypeReplacer::mutate( TupleType * tupleType ) {
    221                 tupleType = safe_dynamic_cast< TupleType * > ( Parent::mutate( tupleType ) );
     213        Type * TupleTypeReplacer::postmutate( TupleType * tupleType ) {
    222214                unsigned tupleSize = tupleType->size();
    223215                if ( ! typeMap.count( tupleSize ) ) {
     
    226218                        decl->set_body( true );
    227219                        for ( size_t i = 0; i < tupleSize; ++i ) {
    228                                 TypeDecl * tyParam = new TypeDecl( toString( "tuple_param_", i ), Type::StorageClasses(), nullptr, TypeDecl::Any );
     220                                TypeDecl * tyParam = new TypeDecl( toString( "tuple_param_", tupleSize, "_", i ), Type::StorageClasses(), nullptr, TypeDecl::Any );
    229221                                decl->get_members().push_back( new ObjectDecl( toString("field_", i ), Type::StorageClasses(), LinkageSpec::C, nullptr, new TypeInstType( Type::Qualifiers(), tyParam->get_name(), tyParam ), nullptr ) );
    230222                                decl->get_parameters().push_back( tyParam );
     
    235227                        }
    236228                        typeMap[tupleSize] = decl;
    237                         addDeclaration( decl );
     229                        declsToAddBefore.push_back( decl );
    238230                }
    239231                Type::Qualifiers qualifiers = tupleType->get_qualifiers();
     
    241233                StructDecl * decl = typeMap[tupleSize];
    242234                StructInstType * newType = new StructInstType( qualifiers, decl );
    243                 for ( Type * t : *tupleType ) {
     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);
    244238                        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                        }
    245244                }
    246245                delete tupleType;
  • src/Tuples/Tuples.h

    rfd344aa r9236060  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Nov 9 13:17:58 2016
    13 // Update Count     : 15
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:55:00 2017
     13// Update Count     : 16
    1414//
    1515
    16 #ifndef _TUPLES_H_
    17 #define _TUPLES_H_
     16#pragma once
    1817
    1918#include <string>
     
    4948} // namespace Tuples
    5049
    51 #endif // _TUPLE_ASSIGNMENT_H_
    52 
    5350// Local Variables: //
    5451// tab-width: 4 //
  • src/benchmark/create_pthrd.c

    rfd344aa r9236060  
    1414                n = atoi(argv[1]);
    1515        }
    16         printf("%lu\n", n);
     16        printf("create %lu pthreads ... ", n);
    1717
    1818        for (size_t i = 0; i < n; i++) {
    1919                pthread_t thread;
    2020                if (pthread_create(&thread, NULL, foo, NULL) < 0) {
     21                        perror( "failure" );
    2122                        return 1;
    2223                }
    2324
    2425                if (pthread_join( thread, NULL) < 0) {
     26                        perror( "failure" );
    2527                        return 1;
    2628                }
    2729        }
    28         pthread_exit(NULL);
    29         return 0;
     30        printf("finish\n");
    3031}
  • src/libcfa/Makefile.am

    rfd344aa r9236060  
    1111## Created On       : Sun May 31 08:54:01 2015
    1212## Last Modified By : Andrew Beach
    13 ## Last Modified On : Wed Jun 28 15:36:00 2017
    14 ## Update Count     : 215
     13## Last Modified On : Wed Jul 26 14:15:00 2017
     14## Update Count     : 221
    1515###############################################################################
    1616
     
    3939
    4040AM_CCASFLAGS = @CFA_FLAGS@
    41 CFLAGS = -quiet -no-include-stdhdr -XCFA -t -B${abs_top_srcdir}/src/driver ${EXTRA_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
     45CFLAGS = -quiet -no-include-stdhdr -I${abs_top_srcdir}/src/libcfa/stdhdr -XCFA -t -B${abs_top_srcdir}/src/driver ${EXTRA_FLAGS}
    4246CC = ${abs_top_srcdir}/src/driver/cfa
    4347
    44 headers = assert fstream iostream iterator limits math rational stdlib \
     48headers = fstream iostream iterator limits rational stdlib \
    4549          containers/maybe containers/pair containers/result containers/vector
    4650
     
    5155
    5256libobjs = ${headers:=.o}
    53 libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c} exception.c
     57libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c} \
     58         assert.c exception.c virtual.c
    5459
    5560# not all platforms support concurrency, add option do disable it
     
    6873        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
    6974
     75libcfa_a-virtual.o : virtual.c
     76        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
     77
    7078concurrency/libcfa_d_a-invoke.o : concurrency/invoke.c
    7179        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
    7280
    7381libcfa_d_a-exception.o : exception.c
     82        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
     83
     84libcfa_d_a-virtual.o : virtual.c
    7485        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
    7586
     
    8495
    8596cfa_includedir = $(CFA_INCDIR)
    86 nobase_cfa_include_HEADERS = ${headers} ${stdhdr} gmp concurrency/invoke.h
     97nobase_cfa_include_HEADERS = ${headers} ${stdhdr} math gmp concurrency/invoke.h
    8798
    8899CLEANFILES = libcfa-prelude.c
  • src/libcfa/Makefile.in

    rfd344aa r9236060  
    149149libcfa_d_a_LIBADD =
    150150am__libcfa_d_a_SOURCES_DIST = libcfa-prelude.c interpose.c \
    151         libhdr/libdebug.c assert.c fstream.c iostream.c iterator.c \
    152         limits.c math.c rational.c stdlib.c containers/maybe.c \
    153         containers/pair.c containers/result.c containers/vector.c \
     151        libhdr/libdebug.c fstream.c iostream.c iterator.c limits.c \
     152        rational.c stdlib.c containers/maybe.c containers/pair.c \
     153        containers/result.c containers/vector.c \
    154154        concurrency/coroutine.c concurrency/thread.c \
    155         concurrency/kernel.c concurrency/monitor.c exception.c \
    156         concurrency/CtxSwitch-@MACHINE_TYPE@.S concurrency/alarm.c \
    157         concurrency/invoke.c concurrency/preemption.c
     155        concurrency/kernel.c concurrency/monitor.c assert.c \
     156        exception.c virtual.c concurrency/CtxSwitch-@MACHINE_TYPE@.S \
     157        concurrency/alarm.c concurrency/invoke.c \
     158        concurrency/preemption.c
    158159am__dirstamp = $(am__leading_dot)dirstamp
    159160@BUILD_CONCURRENCY_TRUE@am__objects_1 = concurrency/libcfa_d_a-coroutine.$(OBJEXT) \
     
    161162@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_d_a-kernel.$(OBJEXT) \
    162163@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_d_a-monitor.$(OBJEXT)
    163 am__objects_2 = libcfa_d_a-assert.$(OBJEXT) \
    164         libcfa_d_a-fstream.$(OBJEXT) libcfa_d_a-iostream.$(OBJEXT) \
    165         libcfa_d_a-iterator.$(OBJEXT) libcfa_d_a-limits.$(OBJEXT) \
    166         libcfa_d_a-math.$(OBJEXT) libcfa_d_a-rational.$(OBJEXT) \
     164am__objects_2 = libcfa_d_a-fstream.$(OBJEXT) \
     165        libcfa_d_a-iostream.$(OBJEXT) libcfa_d_a-iterator.$(OBJEXT) \
     166        libcfa_d_a-limits.$(OBJEXT) libcfa_d_a-rational.$(OBJEXT) \
    167167        libcfa_d_a-stdlib.$(OBJEXT) \
    168168        containers/libcfa_d_a-maybe.$(OBJEXT) \
     
    177177        libcfa_d_a-interpose.$(OBJEXT) \
    178178        libhdr/libcfa_d_a-libdebug.$(OBJEXT) $(am__objects_2) \
    179         libcfa_d_a-exception.$(OBJEXT) $(am__objects_3)
     179        libcfa_d_a-assert.$(OBJEXT) libcfa_d_a-exception.$(OBJEXT) \
     180        libcfa_d_a-virtual.$(OBJEXT) $(am__objects_3)
    180181am_libcfa_d_a_OBJECTS = $(am__objects_4)
    181182libcfa_d_a_OBJECTS = $(am_libcfa_d_a_OBJECTS)
     
    183184libcfa_a_LIBADD =
    184185am__libcfa_a_SOURCES_DIST = libcfa-prelude.c interpose.c \
    185         libhdr/libdebug.c assert.c fstream.c iostream.c iterator.c \
    186         limits.c math.c rational.c stdlib.c containers/maybe.c \
    187         containers/pair.c containers/result.c containers/vector.c \
     186        libhdr/libdebug.c fstream.c iostream.c iterator.c limits.c \
     187        rational.c stdlib.c containers/maybe.c containers/pair.c \
     188        containers/result.c containers/vector.c \
    188189        concurrency/coroutine.c concurrency/thread.c \
    189         concurrency/kernel.c concurrency/monitor.c exception.c \
    190         concurrency/CtxSwitch-@MACHINE_TYPE@.S concurrency/alarm.c \
    191         concurrency/invoke.c concurrency/preemption.c
     190        concurrency/kernel.c concurrency/monitor.c assert.c \
     191        exception.c virtual.c concurrency/CtxSwitch-@MACHINE_TYPE@.S \
     192        concurrency/alarm.c concurrency/invoke.c \
     193        concurrency/preemption.c
    192194@BUILD_CONCURRENCY_TRUE@am__objects_5 = concurrency/libcfa_a-coroutine.$(OBJEXT) \
    193195@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_a-thread.$(OBJEXT) \
    194196@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_a-kernel.$(OBJEXT) \
    195197@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_a-monitor.$(OBJEXT)
    196 am__objects_6 = libcfa_a-assert.$(OBJEXT) libcfa_a-fstream.$(OBJEXT) \
    197         libcfa_a-iostream.$(OBJEXT) libcfa_a-iterator.$(OBJEXT) \
    198         libcfa_a-limits.$(OBJEXT) libcfa_a-math.$(OBJEXT) \
     198am__objects_6 = libcfa_a-fstream.$(OBJEXT) libcfa_a-iostream.$(OBJEXT) \
     199        libcfa_a-iterator.$(OBJEXT) libcfa_a-limits.$(OBJEXT) \
    199200        libcfa_a-rational.$(OBJEXT) libcfa_a-stdlib.$(OBJEXT) \
    200201        containers/libcfa_a-maybe.$(OBJEXT) \
     
    209210        libcfa_a-interpose.$(OBJEXT) \
    210211        libhdr/libcfa_a-libdebug.$(OBJEXT) $(am__objects_6) \
    211         libcfa_a-exception.$(OBJEXT) $(am__objects_7)
     212        libcfa_a-assert.$(OBJEXT) libcfa_a-exception.$(OBJEXT) \
     213        libcfa_a-virtual.$(OBJEXT) $(am__objects_7)
    212214am_libcfa_a_OBJECTS = $(am__objects_8)
    213215libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS)
     
    258260    *) (install-info --version) >/dev/null 2>&1;; \
    259261  esac
    260 am__nobase_cfa_include_HEADERS_DIST = assert fstream iostream iterator \
    261         limits math rational stdlib containers/maybe containers/pair \
     262am__nobase_cfa_include_HEADERS_DIST = fstream iostream iterator limits \
     263        rational stdlib containers/maybe containers/pair \
    262264        containers/result containers/vector concurrency/coroutine \
    263265        concurrency/thread concurrency/kernel concurrency/monitor \
    264         ${shell echo stdhdr/*} gmp concurrency/invoke.h
     266        ${shell echo stdhdr/*} math gmp concurrency/invoke.h
    265267HEADERS = $(nobase_cfa_include_HEADERS)
    266268am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
     
    306308CFA_NAME = @CFA_NAME@
    307309CFA_PREFIX = @CFA_PREFIX@
    308 CFLAGS = -quiet -no-include-stdhdr -XCFA -t -B${abs_top_srcdir}/src/driver ${EXTRA_FLAGS}
     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
     314CFLAGS = -quiet -no-include-stdhdr -I${abs_top_srcdir}/src/libcfa/stdhdr -XCFA -t -B${abs_top_srcdir}/src/driver ${EXTRA_FLAGS}
    309315CPP = @CPP@
    310316CPPFLAGS = @CPPFLAGS@
     
    412418EXTRA_FLAGS = -g -Wall -Werror -Wno-unused-function -I${abs_top_srcdir}/src/libcfa/libhdr -imacros libcfa-prelude.c @CFA_FLAGS@
    413419AM_CCASFLAGS = @CFA_FLAGS@
    414 headers = assert fstream iostream iterator limits math rational stdlib \
     420headers = fstream iostream iterator limits rational stdlib \
    415421        containers/maybe containers/pair containers/result \
    416422        containers/vector $(am__append_3)
    417423libobjs = ${headers:=.o}
    418424libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c} \
    419         exception.c $(am__append_4)
     425        assert.c exception.c virtual.c $(am__append_4)
    420426libcfa_a_SOURCES = ${libsrc}
    421427libcfa_a_CFLAGS = -nodebug -O2
     
    424430stdhdr = ${shell echo stdhdr/*}
    425431cfa_includedir = $(CFA_INCDIR)
    426 nobase_cfa_include_HEADERS = ${headers} ${stdhdr} gmp concurrency/invoke.h
     432nobase_cfa_include_HEADERS = ${headers} ${stdhdr} math gmp concurrency/invoke.h
    427433CLEANFILES = libcfa-prelude.c
    428434all: all-am
     
    590596@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-libcfa-prelude.Po@am__quote@
    591597@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-limits.Po@am__quote@
    592 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-math.Po@am__quote@
    593598@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-rational.Po@am__quote@
    594599@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-stdlib.Po@am__quote@
     600@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-virtual.Po@am__quote@
    595601@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-assert.Po@am__quote@
    596602@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-exception.Po@am__quote@
     
    601607@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-libcfa-prelude.Po@am__quote@
    602608@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-limits.Po@am__quote@
    603 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-math.Po@am__quote@
    604609@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-rational.Po@am__quote@
    605610@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-stdlib.Po@am__quote@
     611@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-virtual.Po@am__quote@
    606612@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/CtxSwitch-@MACHINE_TYPE@.Po@am__quote@
    607613@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-alarm.Po@am__quote@
     
    697703@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libhdr/libcfa_d_a-libdebug.obj `if test -f 'libhdr/libdebug.c'; then $(CYGPATH_W) 'libhdr/libdebug.c'; else $(CYGPATH_W) '$(srcdir)/libhdr/libdebug.c'; fi`
    698704
     705libcfa_d_a-fstream.o: fstream.c
     706@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-fstream.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-fstream.Tpo -c -o libcfa_d_a-fstream.o `test -f 'fstream.c' || echo '$(srcdir)/'`fstream.c
     707@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-fstream.Tpo $(DEPDIR)/libcfa_d_a-fstream.Po
     708@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='fstream.c' object='libcfa_d_a-fstream.o' libtool=no @AMDEPBACKSLASH@
     709@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     710@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-fstream.o `test -f 'fstream.c' || echo '$(srcdir)/'`fstream.c
     711
     712libcfa_d_a-fstream.obj: fstream.c
     713@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-fstream.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-fstream.Tpo -c -o libcfa_d_a-fstream.obj `if test -f 'fstream.c'; then $(CYGPATH_W) 'fstream.c'; else $(CYGPATH_W) '$(srcdir)/fstream.c'; fi`
     714@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-fstream.Tpo $(DEPDIR)/libcfa_d_a-fstream.Po
     715@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='fstream.c' object='libcfa_d_a-fstream.obj' libtool=no @AMDEPBACKSLASH@
     716@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     717@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-fstream.obj `if test -f 'fstream.c'; then $(CYGPATH_W) 'fstream.c'; else $(CYGPATH_W) '$(srcdir)/fstream.c'; fi`
     718
     719libcfa_d_a-iostream.o: iostream.c
     720@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-iostream.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-iostream.Tpo -c -o libcfa_d_a-iostream.o `test -f 'iostream.c' || echo '$(srcdir)/'`iostream.c
     721@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-iostream.Tpo $(DEPDIR)/libcfa_d_a-iostream.Po
     722@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iostream.c' object='libcfa_d_a-iostream.o' libtool=no @AMDEPBACKSLASH@
     723@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     724@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-iostream.o `test -f 'iostream.c' || echo '$(srcdir)/'`iostream.c
     725
     726libcfa_d_a-iostream.obj: iostream.c
     727@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-iostream.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-iostream.Tpo -c -o libcfa_d_a-iostream.obj `if test -f 'iostream.c'; then $(CYGPATH_W) 'iostream.c'; else $(CYGPATH_W) '$(srcdir)/iostream.c'; fi`
     728@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-iostream.Tpo $(DEPDIR)/libcfa_d_a-iostream.Po
     729@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iostream.c' object='libcfa_d_a-iostream.obj' libtool=no @AMDEPBACKSLASH@
     730@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     731@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-iostream.obj `if test -f 'iostream.c'; then $(CYGPATH_W) 'iostream.c'; else $(CYGPATH_W) '$(srcdir)/iostream.c'; fi`
     732
     733libcfa_d_a-iterator.o: iterator.c
     734@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-iterator.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-iterator.Tpo -c -o libcfa_d_a-iterator.o `test -f 'iterator.c' || echo '$(srcdir)/'`iterator.c
     735@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-iterator.Tpo $(DEPDIR)/libcfa_d_a-iterator.Po
     736@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iterator.c' object='libcfa_d_a-iterator.o' libtool=no @AMDEPBACKSLASH@
     737@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     738@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-iterator.o `test -f 'iterator.c' || echo '$(srcdir)/'`iterator.c
     739
     740libcfa_d_a-iterator.obj: iterator.c
     741@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-iterator.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-iterator.Tpo -c -o libcfa_d_a-iterator.obj `if test -f 'iterator.c'; then $(CYGPATH_W) 'iterator.c'; else $(CYGPATH_W) '$(srcdir)/iterator.c'; fi`
     742@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-iterator.Tpo $(DEPDIR)/libcfa_d_a-iterator.Po
     743@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iterator.c' object='libcfa_d_a-iterator.obj' libtool=no @AMDEPBACKSLASH@
     744@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     745@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-iterator.obj `if test -f 'iterator.c'; then $(CYGPATH_W) 'iterator.c'; else $(CYGPATH_W) '$(srcdir)/iterator.c'; fi`
     746
     747libcfa_d_a-limits.o: limits.c
     748@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-limits.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-limits.Tpo -c -o libcfa_d_a-limits.o `test -f 'limits.c' || echo '$(srcdir)/'`limits.c
     749@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-limits.Tpo $(DEPDIR)/libcfa_d_a-limits.Po
     750@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='limits.c' object='libcfa_d_a-limits.o' libtool=no @AMDEPBACKSLASH@
     751@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     752@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-limits.o `test -f 'limits.c' || echo '$(srcdir)/'`limits.c
     753
     754libcfa_d_a-limits.obj: limits.c
     755@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-limits.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-limits.Tpo -c -o libcfa_d_a-limits.obj `if test -f 'limits.c'; then $(CYGPATH_W) 'limits.c'; else $(CYGPATH_W) '$(srcdir)/limits.c'; fi`
     756@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-limits.Tpo $(DEPDIR)/libcfa_d_a-limits.Po
     757@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='limits.c' object='libcfa_d_a-limits.obj' libtool=no @AMDEPBACKSLASH@
     758@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     759@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-limits.obj `if test -f 'limits.c'; then $(CYGPATH_W) 'limits.c'; else $(CYGPATH_W) '$(srcdir)/limits.c'; fi`
     760
     761libcfa_d_a-rational.o: rational.c
     762@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-rational.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-rational.Tpo -c -o libcfa_d_a-rational.o `test -f 'rational.c' || echo '$(srcdir)/'`rational.c
     763@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-rational.Tpo $(DEPDIR)/libcfa_d_a-rational.Po
     764@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='rational.c' object='libcfa_d_a-rational.o' libtool=no @AMDEPBACKSLASH@
     765@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     766@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-rational.o `test -f 'rational.c' || echo '$(srcdir)/'`rational.c
     767
     768libcfa_d_a-rational.obj: rational.c
     769@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-rational.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-rational.Tpo -c -o libcfa_d_a-rational.obj `if test -f 'rational.c'; then $(CYGPATH_W) 'rational.c'; else $(CYGPATH_W) '$(srcdir)/rational.c'; fi`
     770@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-rational.Tpo $(DEPDIR)/libcfa_d_a-rational.Po
     771@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='rational.c' object='libcfa_d_a-rational.obj' libtool=no @AMDEPBACKSLASH@
     772@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     773@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-rational.obj `if test -f 'rational.c'; then $(CYGPATH_W) 'rational.c'; else $(CYGPATH_W) '$(srcdir)/rational.c'; fi`
     774
     775libcfa_d_a-stdlib.o: stdlib.c
     776@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-stdlib.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-stdlib.Tpo -c -o libcfa_d_a-stdlib.o `test -f 'stdlib.c' || echo '$(srcdir)/'`stdlib.c
     777@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-stdlib.Tpo $(DEPDIR)/libcfa_d_a-stdlib.Po
     778@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='stdlib.c' object='libcfa_d_a-stdlib.o' libtool=no @AMDEPBACKSLASH@
     779@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     780@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-stdlib.o `test -f 'stdlib.c' || echo '$(srcdir)/'`stdlib.c
     781
     782libcfa_d_a-stdlib.obj: stdlib.c
     783@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-stdlib.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-stdlib.Tpo -c -o libcfa_d_a-stdlib.obj `if test -f 'stdlib.c'; then $(CYGPATH_W) 'stdlib.c'; else $(CYGPATH_W) '$(srcdir)/stdlib.c'; fi`
     784@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-stdlib.Tpo $(DEPDIR)/libcfa_d_a-stdlib.Po
     785@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='stdlib.c' object='libcfa_d_a-stdlib.obj' libtool=no @AMDEPBACKSLASH@
     786@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     787@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-stdlib.obj `if test -f 'stdlib.c'; then $(CYGPATH_W) 'stdlib.c'; else $(CYGPATH_W) '$(srcdir)/stdlib.c'; fi`
     788
     789containers/libcfa_d_a-maybe.o: containers/maybe.c
     790@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-maybe.o -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-maybe.Tpo -c -o containers/libcfa_d_a-maybe.o `test -f 'containers/maybe.c' || echo '$(srcdir)/'`containers/maybe.c
     791@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-maybe.Tpo containers/$(DEPDIR)/libcfa_d_a-maybe.Po
     792@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/maybe.c' object='containers/libcfa_d_a-maybe.o' libtool=no @AMDEPBACKSLASH@
     793@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     794@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-maybe.o `test -f 'containers/maybe.c' || echo '$(srcdir)/'`containers/maybe.c
     795
     796containers/libcfa_d_a-maybe.obj: containers/maybe.c
     797@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-maybe.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-maybe.Tpo -c -o containers/libcfa_d_a-maybe.obj `if test -f 'containers/maybe.c'; then $(CYGPATH_W) 'containers/maybe.c'; else $(CYGPATH_W) '$(srcdir)/containers/maybe.c'; fi`
     798@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-maybe.Tpo containers/$(DEPDIR)/libcfa_d_a-maybe.Po
     799@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/maybe.c' object='containers/libcfa_d_a-maybe.obj' libtool=no @AMDEPBACKSLASH@
     800@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     801@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-maybe.obj `if test -f 'containers/maybe.c'; then $(CYGPATH_W) 'containers/maybe.c'; else $(CYGPATH_W) '$(srcdir)/containers/maybe.c'; fi`
     802
     803containers/libcfa_d_a-pair.o: containers/pair.c
     804@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-pair.o -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-pair.Tpo -c -o containers/libcfa_d_a-pair.o `test -f 'containers/pair.c' || echo '$(srcdir)/'`containers/pair.c
     805@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-pair.Tpo containers/$(DEPDIR)/libcfa_d_a-pair.Po
     806@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/pair.c' object='containers/libcfa_d_a-pair.o' libtool=no @AMDEPBACKSLASH@
     807@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     808@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-pair.o `test -f 'containers/pair.c' || echo '$(srcdir)/'`containers/pair.c
     809
     810containers/libcfa_d_a-pair.obj: containers/pair.c
     811@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-pair.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-pair.Tpo -c -o containers/libcfa_d_a-pair.obj `if test -f 'containers/pair.c'; then $(CYGPATH_W) 'containers/pair.c'; else $(CYGPATH_W) '$(srcdir)/containers/pair.c'; fi`
     812@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-pair.Tpo containers/$(DEPDIR)/libcfa_d_a-pair.Po
     813@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/pair.c' object='containers/libcfa_d_a-pair.obj' libtool=no @AMDEPBACKSLASH@
     814@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     815@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-pair.obj `if test -f 'containers/pair.c'; then $(CYGPATH_W) 'containers/pair.c'; else $(CYGPATH_W) '$(srcdir)/containers/pair.c'; fi`
     816
     817containers/libcfa_d_a-result.o: containers/result.c
     818@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-result.o -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-result.Tpo -c -o containers/libcfa_d_a-result.o `test -f 'containers/result.c' || echo '$(srcdir)/'`containers/result.c
     819@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-result.Tpo containers/$(DEPDIR)/libcfa_d_a-result.Po
     820@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/result.c' object='containers/libcfa_d_a-result.o' libtool=no @AMDEPBACKSLASH@
     821@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     822@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-result.o `test -f 'containers/result.c' || echo '$(srcdir)/'`containers/result.c
     823
     824containers/libcfa_d_a-result.obj: containers/result.c
     825@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-result.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-result.Tpo -c -o containers/libcfa_d_a-result.obj `if test -f 'containers/result.c'; then $(CYGPATH_W) 'containers/result.c'; else $(CYGPATH_W) '$(srcdir)/containers/result.c'; fi`
     826@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-result.Tpo containers/$(DEPDIR)/libcfa_d_a-result.Po
     827@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/result.c' object='containers/libcfa_d_a-result.obj' libtool=no @AMDEPBACKSLASH@
     828@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     829@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-result.obj `if test -f 'containers/result.c'; then $(CYGPATH_W) 'containers/result.c'; else $(CYGPATH_W) '$(srcdir)/containers/result.c'; fi`
     830
     831containers/libcfa_d_a-vector.o: containers/vector.c
     832@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-vector.o -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-vector.Tpo -c -o containers/libcfa_d_a-vector.o `test -f 'containers/vector.c' || echo '$(srcdir)/'`containers/vector.c
     833@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-vector.Tpo containers/$(DEPDIR)/libcfa_d_a-vector.Po
     834@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/vector.c' object='containers/libcfa_d_a-vector.o' libtool=no @AMDEPBACKSLASH@
     835@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     836@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-vector.o `test -f 'containers/vector.c' || echo '$(srcdir)/'`containers/vector.c
     837
     838containers/libcfa_d_a-vector.obj: containers/vector.c
     839@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-vector.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-vector.Tpo -c -o containers/libcfa_d_a-vector.obj `if test -f 'containers/vector.c'; then $(CYGPATH_W) 'containers/vector.c'; else $(CYGPATH_W) '$(srcdir)/containers/vector.c'; fi`
     840@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-vector.Tpo containers/$(DEPDIR)/libcfa_d_a-vector.Po
     841@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/vector.c' object='containers/libcfa_d_a-vector.obj' libtool=no @AMDEPBACKSLASH@
     842@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     843@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-vector.obj `if test -f 'containers/vector.c'; then $(CYGPATH_W) 'containers/vector.c'; else $(CYGPATH_W) '$(srcdir)/containers/vector.c'; fi`
     844
     845concurrency/libcfa_d_a-coroutine.o: concurrency/coroutine.c
     846@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-coroutine.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Tpo -c -o concurrency/libcfa_d_a-coroutine.o `test -f 'concurrency/coroutine.c' || echo '$(srcdir)/'`concurrency/coroutine.c
     847@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Tpo concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Po
     848@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/coroutine.c' object='concurrency/libcfa_d_a-coroutine.o' libtool=no @AMDEPBACKSLASH@
     849@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     850@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-coroutine.o `test -f 'concurrency/coroutine.c' || echo '$(srcdir)/'`concurrency/coroutine.c
     851
     852concurrency/libcfa_d_a-coroutine.obj: concurrency/coroutine.c
     853@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-coroutine.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Tpo -c -o concurrency/libcfa_d_a-coroutine.obj `if test -f 'concurrency/coroutine.c'; then $(CYGPATH_W) 'concurrency/coroutine.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutine.c'; fi`
     854@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Tpo concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Po
     855@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/coroutine.c' object='concurrency/libcfa_d_a-coroutine.obj' libtool=no @AMDEPBACKSLASH@
     856@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     857@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-coroutine.obj `if test -f 'concurrency/coroutine.c'; then $(CYGPATH_W) 'concurrency/coroutine.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutine.c'; fi`
     858
     859concurrency/libcfa_d_a-thread.o: concurrency/thread.c
     860@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-thread.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-thread.Tpo -c -o concurrency/libcfa_d_a-thread.o `test -f 'concurrency/thread.c' || echo '$(srcdir)/'`concurrency/thread.c
     861@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-thread.Tpo concurrency/$(DEPDIR)/libcfa_d_a-thread.Po
     862@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/thread.c' object='concurrency/libcfa_d_a-thread.o' libtool=no @AMDEPBACKSLASH@
     863@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     864@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-thread.o `test -f 'concurrency/thread.c' || echo '$(srcdir)/'`concurrency/thread.c
     865
     866concurrency/libcfa_d_a-thread.obj: concurrency/thread.c
     867@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-thread.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-thread.Tpo -c -o concurrency/libcfa_d_a-thread.obj `if test -f 'concurrency/thread.c'; then $(CYGPATH_W) 'concurrency/thread.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/thread.c'; fi`
     868@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-thread.Tpo concurrency/$(DEPDIR)/libcfa_d_a-thread.Po
     869@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/thread.c' object='concurrency/libcfa_d_a-thread.obj' libtool=no @AMDEPBACKSLASH@
     870@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     871@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-thread.obj `if test -f 'concurrency/thread.c'; then $(CYGPATH_W) 'concurrency/thread.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/thread.c'; fi`
     872
     873concurrency/libcfa_d_a-kernel.o: concurrency/kernel.c
     874@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-kernel.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-kernel.Tpo -c -o concurrency/libcfa_d_a-kernel.o `test -f 'concurrency/kernel.c' || echo '$(srcdir)/'`concurrency/kernel.c
     875@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-kernel.Tpo concurrency/$(DEPDIR)/libcfa_d_a-kernel.Po
     876@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/kernel.c' object='concurrency/libcfa_d_a-kernel.o' libtool=no @AMDEPBACKSLASH@
     877@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     878@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-kernel.o `test -f 'concurrency/kernel.c' || echo '$(srcdir)/'`concurrency/kernel.c
     879
     880concurrency/libcfa_d_a-kernel.obj: concurrency/kernel.c
     881@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-kernel.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-kernel.Tpo -c -o concurrency/libcfa_d_a-kernel.obj `if test -f 'concurrency/kernel.c'; then $(CYGPATH_W) 'concurrency/kernel.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/kernel.c'; fi`
     882@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-kernel.Tpo concurrency/$(DEPDIR)/libcfa_d_a-kernel.Po
     883@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/kernel.c' object='concurrency/libcfa_d_a-kernel.obj' libtool=no @AMDEPBACKSLASH@
     884@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     885@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-kernel.obj `if test -f 'concurrency/kernel.c'; then $(CYGPATH_W) 'concurrency/kernel.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/kernel.c'; fi`
     886
     887concurrency/libcfa_d_a-monitor.o: concurrency/monitor.c
     888@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-monitor.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-monitor.Tpo -c -o concurrency/libcfa_d_a-monitor.o `test -f 'concurrency/monitor.c' || echo '$(srcdir)/'`concurrency/monitor.c
     889@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-monitor.Tpo concurrency/$(DEPDIR)/libcfa_d_a-monitor.Po
     890@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/monitor.c' object='concurrency/libcfa_d_a-monitor.o' libtool=no @AMDEPBACKSLASH@
     891@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     892@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-monitor.o `test -f 'concurrency/monitor.c' || echo '$(srcdir)/'`concurrency/monitor.c
     893
     894concurrency/libcfa_d_a-monitor.obj: concurrency/monitor.c
     895@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-monitor.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-monitor.Tpo -c -o concurrency/libcfa_d_a-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi`
     896@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-monitor.Tpo concurrency/$(DEPDIR)/libcfa_d_a-monitor.Po
     897@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/monitor.c' object='concurrency/libcfa_d_a-monitor.obj' libtool=no @AMDEPBACKSLASH@
     898@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     899@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi`
     900
    699901libcfa_d_a-assert.o: assert.c
    700902@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-assert.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-assert.Tpo -c -o libcfa_d_a-assert.o `test -f 'assert.c' || echo '$(srcdir)/'`assert.c
     
    711913@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-assert.obj `if test -f 'assert.c'; then $(CYGPATH_W) 'assert.c'; else $(CYGPATH_W) '$(srcdir)/assert.c'; fi`
    712914
    713 libcfa_d_a-fstream.o: fstream.c
    714 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-fstream.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-fstream.Tpo -c -o libcfa_d_a-fstream.o `test -f 'fstream.c' || echo '$(srcdir)/'`fstream.c
    715 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-fstream.Tpo $(DEPDIR)/libcfa_d_a-fstream.Po
    716 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='fstream.c' object='libcfa_d_a-fstream.o' libtool=no @AMDEPBACKSLASH@
    717 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    718 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-fstream.o `test -f 'fstream.c' || echo '$(srcdir)/'`fstream.c
    719 
    720 libcfa_d_a-fstream.obj: fstream.c
    721 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-fstream.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-fstream.Tpo -c -o libcfa_d_a-fstream.obj `if test -f 'fstream.c'; then $(CYGPATH_W) 'fstream.c'; else $(CYGPATH_W) '$(srcdir)/fstream.c'; fi`
    722 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-fstream.Tpo $(DEPDIR)/libcfa_d_a-fstream.Po
    723 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='fstream.c' object='libcfa_d_a-fstream.obj' libtool=no @AMDEPBACKSLASH@
    724 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    725 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-fstream.obj `if test -f 'fstream.c'; then $(CYGPATH_W) 'fstream.c'; else $(CYGPATH_W) '$(srcdir)/fstream.c'; fi`
    726 
    727 libcfa_d_a-iostream.o: iostream.c
    728 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-iostream.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-iostream.Tpo -c -o libcfa_d_a-iostream.o `test -f 'iostream.c' || echo '$(srcdir)/'`iostream.c
    729 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-iostream.Tpo $(DEPDIR)/libcfa_d_a-iostream.Po
    730 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iostream.c' object='libcfa_d_a-iostream.o' libtool=no @AMDEPBACKSLASH@
    731 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    732 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-iostream.o `test -f 'iostream.c' || echo '$(srcdir)/'`iostream.c
    733 
    734 libcfa_d_a-iostream.obj: iostream.c
    735 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-iostream.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-iostream.Tpo -c -o libcfa_d_a-iostream.obj `if test -f 'iostream.c'; then $(CYGPATH_W) 'iostream.c'; else $(CYGPATH_W) '$(srcdir)/iostream.c'; fi`
    736 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-iostream.Tpo $(DEPDIR)/libcfa_d_a-iostream.Po
    737 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iostream.c' object='libcfa_d_a-iostream.obj' libtool=no @AMDEPBACKSLASH@
    738 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    739 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-iostream.obj `if test -f 'iostream.c'; then $(CYGPATH_W) 'iostream.c'; else $(CYGPATH_W) '$(srcdir)/iostream.c'; fi`
    740 
    741 libcfa_d_a-iterator.o: iterator.c
    742 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-iterator.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-iterator.Tpo -c -o libcfa_d_a-iterator.o `test -f 'iterator.c' || echo '$(srcdir)/'`iterator.c
    743 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-iterator.Tpo $(DEPDIR)/libcfa_d_a-iterator.Po
    744 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iterator.c' object='libcfa_d_a-iterator.o' libtool=no @AMDEPBACKSLASH@
    745 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    746 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-iterator.o `test -f 'iterator.c' || echo '$(srcdir)/'`iterator.c
    747 
    748 libcfa_d_a-iterator.obj: iterator.c
    749 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-iterator.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-iterator.Tpo -c -o libcfa_d_a-iterator.obj `if test -f 'iterator.c'; then $(CYGPATH_W) 'iterator.c'; else $(CYGPATH_W) '$(srcdir)/iterator.c'; fi`
    750 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-iterator.Tpo $(DEPDIR)/libcfa_d_a-iterator.Po
    751 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iterator.c' object='libcfa_d_a-iterator.obj' libtool=no @AMDEPBACKSLASH@
    752 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    753 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-iterator.obj `if test -f 'iterator.c'; then $(CYGPATH_W) 'iterator.c'; else $(CYGPATH_W) '$(srcdir)/iterator.c'; fi`
    754 
    755 libcfa_d_a-limits.o: limits.c
    756 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-limits.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-limits.Tpo -c -o libcfa_d_a-limits.o `test -f 'limits.c' || echo '$(srcdir)/'`limits.c
    757 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-limits.Tpo $(DEPDIR)/libcfa_d_a-limits.Po
    758 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='limits.c' object='libcfa_d_a-limits.o' libtool=no @AMDEPBACKSLASH@
    759 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    760 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-limits.o `test -f 'limits.c' || echo '$(srcdir)/'`limits.c
    761 
    762 libcfa_d_a-limits.obj: limits.c
    763 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-limits.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-limits.Tpo -c -o libcfa_d_a-limits.obj `if test -f 'limits.c'; then $(CYGPATH_W) 'limits.c'; else $(CYGPATH_W) '$(srcdir)/limits.c'; fi`
    764 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-limits.Tpo $(DEPDIR)/libcfa_d_a-limits.Po
    765 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='limits.c' object='libcfa_d_a-limits.obj' libtool=no @AMDEPBACKSLASH@
    766 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    767 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-limits.obj `if test -f 'limits.c'; then $(CYGPATH_W) 'limits.c'; else $(CYGPATH_W) '$(srcdir)/limits.c'; fi`
    768 
    769 libcfa_d_a-math.o: math.c
    770 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-math.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-math.Tpo -c -o libcfa_d_a-math.o `test -f 'math.c' || echo '$(srcdir)/'`math.c
    771 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-math.Tpo $(DEPDIR)/libcfa_d_a-math.Po
    772 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='math.c' object='libcfa_d_a-math.o' libtool=no @AMDEPBACKSLASH@
    773 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    774 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-math.o `test -f 'math.c' || echo '$(srcdir)/'`math.c
    775 
    776 libcfa_d_a-math.obj: math.c
    777 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-math.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-math.Tpo -c -o libcfa_d_a-math.obj `if test -f 'math.c'; then $(CYGPATH_W) 'math.c'; else $(CYGPATH_W) '$(srcdir)/math.c'; fi`
    778 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-math.Tpo $(DEPDIR)/libcfa_d_a-math.Po
    779 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='math.c' object='libcfa_d_a-math.obj' libtool=no @AMDEPBACKSLASH@
    780 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    781 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-math.obj `if test -f 'math.c'; then $(CYGPATH_W) 'math.c'; else $(CYGPATH_W) '$(srcdir)/math.c'; fi`
    782 
    783 libcfa_d_a-rational.o: rational.c
    784 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-rational.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-rational.Tpo -c -o libcfa_d_a-rational.o `test -f 'rational.c' || echo '$(srcdir)/'`rational.c
    785 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-rational.Tpo $(DEPDIR)/libcfa_d_a-rational.Po
    786 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='rational.c' object='libcfa_d_a-rational.o' libtool=no @AMDEPBACKSLASH@
    787 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    788 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-rational.o `test -f 'rational.c' || echo '$(srcdir)/'`rational.c
    789 
    790 libcfa_d_a-rational.obj: rational.c
    791 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-rational.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-rational.Tpo -c -o libcfa_d_a-rational.obj `if test -f 'rational.c'; then $(CYGPATH_W) 'rational.c'; else $(CYGPATH_W) '$(srcdir)/rational.c'; fi`
    792 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-rational.Tpo $(DEPDIR)/libcfa_d_a-rational.Po
    793 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='rational.c' object='libcfa_d_a-rational.obj' libtool=no @AMDEPBACKSLASH@
    794 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    795 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-rational.obj `if test -f 'rational.c'; then $(CYGPATH_W) 'rational.c'; else $(CYGPATH_W) '$(srcdir)/rational.c'; fi`
    796 
    797 libcfa_d_a-stdlib.o: stdlib.c
    798 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-stdlib.o -MD -MP -MF $(DEPDIR)/libcfa_d_a-stdlib.Tpo -c -o libcfa_d_a-stdlib.o `test -f 'stdlib.c' || echo '$(srcdir)/'`stdlib.c
    799 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-stdlib.Tpo $(DEPDIR)/libcfa_d_a-stdlib.Po
    800 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='stdlib.c' object='libcfa_d_a-stdlib.o' libtool=no @AMDEPBACKSLASH@
    801 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    802 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-stdlib.o `test -f 'stdlib.c' || echo '$(srcdir)/'`stdlib.c
    803 
    804 libcfa_d_a-stdlib.obj: stdlib.c
    805 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-stdlib.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-stdlib.Tpo -c -o libcfa_d_a-stdlib.obj `if test -f 'stdlib.c'; then $(CYGPATH_W) 'stdlib.c'; else $(CYGPATH_W) '$(srcdir)/stdlib.c'; fi`
    806 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-stdlib.Tpo $(DEPDIR)/libcfa_d_a-stdlib.Po
    807 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='stdlib.c' object='libcfa_d_a-stdlib.obj' libtool=no @AMDEPBACKSLASH@
    808 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    809 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-stdlib.obj `if test -f 'stdlib.c'; then $(CYGPATH_W) 'stdlib.c'; else $(CYGPATH_W) '$(srcdir)/stdlib.c'; fi`
    810 
    811 containers/libcfa_d_a-maybe.o: containers/maybe.c
    812 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-maybe.o -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-maybe.Tpo -c -o containers/libcfa_d_a-maybe.o `test -f 'containers/maybe.c' || echo '$(srcdir)/'`containers/maybe.c
    813 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-maybe.Tpo containers/$(DEPDIR)/libcfa_d_a-maybe.Po
    814 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/maybe.c' object='containers/libcfa_d_a-maybe.o' libtool=no @AMDEPBACKSLASH@
    815 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    816 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-maybe.o `test -f 'containers/maybe.c' || echo '$(srcdir)/'`containers/maybe.c
    817 
    818 containers/libcfa_d_a-maybe.obj: containers/maybe.c
    819 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-maybe.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-maybe.Tpo -c -o containers/libcfa_d_a-maybe.obj `if test -f 'containers/maybe.c'; then $(CYGPATH_W) 'containers/maybe.c'; else $(CYGPATH_W) '$(srcdir)/containers/maybe.c'; fi`
    820 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-maybe.Tpo containers/$(DEPDIR)/libcfa_d_a-maybe.Po
    821 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/maybe.c' object='containers/libcfa_d_a-maybe.obj' libtool=no @AMDEPBACKSLASH@
    822 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    823 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-maybe.obj `if test -f 'containers/maybe.c'; then $(CYGPATH_W) 'containers/maybe.c'; else $(CYGPATH_W) '$(srcdir)/containers/maybe.c'; fi`
    824 
    825 containers/libcfa_d_a-pair.o: containers/pair.c
    826 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-pair.o -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-pair.Tpo -c -o containers/libcfa_d_a-pair.o `test -f 'containers/pair.c' || echo '$(srcdir)/'`containers/pair.c
    827 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-pair.Tpo containers/$(DEPDIR)/libcfa_d_a-pair.Po
    828 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/pair.c' object='containers/libcfa_d_a-pair.o' libtool=no @AMDEPBACKSLASH@
    829 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    830 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-pair.o `test -f 'containers/pair.c' || echo '$(srcdir)/'`containers/pair.c
    831 
    832 containers/libcfa_d_a-pair.obj: containers/pair.c
    833 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-pair.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-pair.Tpo -c -o containers/libcfa_d_a-pair.obj `if test -f 'containers/pair.c'; then $(CYGPATH_W) 'containers/pair.c'; else $(CYGPATH_W) '$(srcdir)/containers/pair.c'; fi`
    834 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-pair.Tpo containers/$(DEPDIR)/libcfa_d_a-pair.Po
    835 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/pair.c' object='containers/libcfa_d_a-pair.obj' libtool=no @AMDEPBACKSLASH@
    836 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    837 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-pair.obj `if test -f 'containers/pair.c'; then $(CYGPATH_W) 'containers/pair.c'; else $(CYGPATH_W) '$(srcdir)/containers/pair.c'; fi`
    838 
    839 containers/libcfa_d_a-result.o: containers/result.c
    840 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-result.o -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-result.Tpo -c -o containers/libcfa_d_a-result.o `test -f 'containers/result.c' || echo '$(srcdir)/'`containers/result.c
    841 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-result.Tpo containers/$(DEPDIR)/libcfa_d_a-result.Po
    842 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/result.c' object='containers/libcfa_d_a-result.o' libtool=no @AMDEPBACKSLASH@
    843 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    844 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-result.o `test -f 'containers/result.c' || echo '$(srcdir)/'`containers/result.c
    845 
    846 containers/libcfa_d_a-result.obj: containers/result.c
    847 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-result.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-result.Tpo -c -o containers/libcfa_d_a-result.obj `if test -f 'containers/result.c'; then $(CYGPATH_W) 'containers/result.c'; else $(CYGPATH_W) '$(srcdir)/containers/result.c'; fi`
    848 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-result.Tpo containers/$(DEPDIR)/libcfa_d_a-result.Po
    849 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/result.c' object='containers/libcfa_d_a-result.obj' libtool=no @AMDEPBACKSLASH@
    850 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    851 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-result.obj `if test -f 'containers/result.c'; then $(CYGPATH_W) 'containers/result.c'; else $(CYGPATH_W) '$(srcdir)/containers/result.c'; fi`
    852 
    853 containers/libcfa_d_a-vector.o: containers/vector.c
    854 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-vector.o -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-vector.Tpo -c -o containers/libcfa_d_a-vector.o `test -f 'containers/vector.c' || echo '$(srcdir)/'`containers/vector.c
    855 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-vector.Tpo containers/$(DEPDIR)/libcfa_d_a-vector.Po
    856 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/vector.c' object='containers/libcfa_d_a-vector.o' libtool=no @AMDEPBACKSLASH@
    857 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    858 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-vector.o `test -f 'containers/vector.c' || echo '$(srcdir)/'`containers/vector.c
    859 
    860 containers/libcfa_d_a-vector.obj: containers/vector.c
    861 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_d_a-vector.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_d_a-vector.Tpo -c -o containers/libcfa_d_a-vector.obj `if test -f 'containers/vector.c'; then $(CYGPATH_W) 'containers/vector.c'; else $(CYGPATH_W) '$(srcdir)/containers/vector.c'; fi`
    862 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_d_a-vector.Tpo containers/$(DEPDIR)/libcfa_d_a-vector.Po
    863 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/vector.c' object='containers/libcfa_d_a-vector.obj' libtool=no @AMDEPBACKSLASH@
    864 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    865 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_d_a-vector.obj `if test -f 'containers/vector.c'; then $(CYGPATH_W) 'containers/vector.c'; else $(CYGPATH_W) '$(srcdir)/containers/vector.c'; fi`
    866 
    867 concurrency/libcfa_d_a-coroutine.o: concurrency/coroutine.c
    868 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-coroutine.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Tpo -c -o concurrency/libcfa_d_a-coroutine.o `test -f 'concurrency/coroutine.c' || echo '$(srcdir)/'`concurrency/coroutine.c
    869 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Tpo concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Po
    870 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/coroutine.c' object='concurrency/libcfa_d_a-coroutine.o' libtool=no @AMDEPBACKSLASH@
    871 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    872 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-coroutine.o `test -f 'concurrency/coroutine.c' || echo '$(srcdir)/'`concurrency/coroutine.c
    873 
    874 concurrency/libcfa_d_a-coroutine.obj: concurrency/coroutine.c
    875 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-coroutine.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Tpo -c -o concurrency/libcfa_d_a-coroutine.obj `if test -f 'concurrency/coroutine.c'; then $(CYGPATH_W) 'concurrency/coroutine.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutine.c'; fi`
    876 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Tpo concurrency/$(DEPDIR)/libcfa_d_a-coroutine.Po
    877 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/coroutine.c' object='concurrency/libcfa_d_a-coroutine.obj' libtool=no @AMDEPBACKSLASH@
    878 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    879 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-coroutine.obj `if test -f 'concurrency/coroutine.c'; then $(CYGPATH_W) 'concurrency/coroutine.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutine.c'; fi`
    880 
    881 concurrency/libcfa_d_a-thread.o: concurrency/thread.c
    882 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-thread.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-thread.Tpo -c -o concurrency/libcfa_d_a-thread.o `test -f 'concurrency/thread.c' || echo '$(srcdir)/'`concurrency/thread.c
    883 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-thread.Tpo concurrency/$(DEPDIR)/libcfa_d_a-thread.Po
    884 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/thread.c' object='concurrency/libcfa_d_a-thread.o' libtool=no @AMDEPBACKSLASH@
    885 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    886 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-thread.o `test -f 'concurrency/thread.c' || echo '$(srcdir)/'`concurrency/thread.c
    887 
    888 concurrency/libcfa_d_a-thread.obj: concurrency/thread.c
    889 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-thread.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-thread.Tpo -c -o concurrency/libcfa_d_a-thread.obj `if test -f 'concurrency/thread.c'; then $(CYGPATH_W) 'concurrency/thread.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/thread.c'; fi`
    890 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-thread.Tpo concurrency/$(DEPDIR)/libcfa_d_a-thread.Po
    891 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/thread.c' object='concurrency/libcfa_d_a-thread.obj' libtool=no @AMDEPBACKSLASH@
    892 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    893 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-thread.obj `if test -f 'concurrency/thread.c'; then $(CYGPATH_W) 'concurrency/thread.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/thread.c'; fi`
    894 
    895 concurrency/libcfa_d_a-kernel.o: concurrency/kernel.c
    896 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-kernel.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-kernel.Tpo -c -o concurrency/libcfa_d_a-kernel.o `test -f 'concurrency/kernel.c' || echo '$(srcdir)/'`concurrency/kernel.c
    897 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-kernel.Tpo concurrency/$(DEPDIR)/libcfa_d_a-kernel.Po
    898 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/kernel.c' object='concurrency/libcfa_d_a-kernel.o' libtool=no @AMDEPBACKSLASH@
    899 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    900 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-kernel.o `test -f 'concurrency/kernel.c' || echo '$(srcdir)/'`concurrency/kernel.c
    901 
    902 concurrency/libcfa_d_a-kernel.obj: concurrency/kernel.c
    903 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-kernel.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-kernel.Tpo -c -o concurrency/libcfa_d_a-kernel.obj `if test -f 'concurrency/kernel.c'; then $(CYGPATH_W) 'concurrency/kernel.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/kernel.c'; fi`
    904 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-kernel.Tpo concurrency/$(DEPDIR)/libcfa_d_a-kernel.Po
    905 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/kernel.c' object='concurrency/libcfa_d_a-kernel.obj' libtool=no @AMDEPBACKSLASH@
    906 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    907 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-kernel.obj `if test -f 'concurrency/kernel.c'; then $(CYGPATH_W) 'concurrency/kernel.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/kernel.c'; fi`
    908 
    909 concurrency/libcfa_d_a-monitor.o: concurrency/monitor.c
    910 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-monitor.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-monitor.Tpo -c -o concurrency/libcfa_d_a-monitor.o `test -f 'concurrency/monitor.c' || echo '$(srcdir)/'`concurrency/monitor.c
    911 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-monitor.Tpo concurrency/$(DEPDIR)/libcfa_d_a-monitor.Po
    912 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/monitor.c' object='concurrency/libcfa_d_a-monitor.o' libtool=no @AMDEPBACKSLASH@
    913 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    914 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-monitor.o `test -f 'concurrency/monitor.c' || echo '$(srcdir)/'`concurrency/monitor.c
    915 
    916 concurrency/libcfa_d_a-monitor.obj: concurrency/monitor.c
    917 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-monitor.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-monitor.Tpo -c -o concurrency/libcfa_d_a-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi`
    918 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_d_a-monitor.Tpo concurrency/$(DEPDIR)/libcfa_d_a-monitor.Po
    919 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/monitor.c' object='concurrency/libcfa_d_a-monitor.obj' libtool=no @AMDEPBACKSLASH@
    920 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    921 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_d_a-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi`
    922 
    923915libcfa_d_a-exception.obj: exception.c
    924916@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-exception.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-exception.Tpo -c -o libcfa_d_a-exception.obj `if test -f 'exception.c'; then $(CYGPATH_W) 'exception.c'; else $(CYGPATH_W) '$(srcdir)/exception.c'; fi`
     
    928920@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-exception.obj `if test -f 'exception.c'; then $(CYGPATH_W) 'exception.c'; else $(CYGPATH_W) '$(srcdir)/exception.c'; fi`
    929921
     922libcfa_d_a-virtual.obj: virtual.c
     923@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-virtual.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-virtual.Tpo -c -o libcfa_d_a-virtual.obj `if test -f 'virtual.c'; then $(CYGPATH_W) 'virtual.c'; else $(CYGPATH_W) '$(srcdir)/virtual.c'; fi`
     924@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-virtual.Tpo $(DEPDIR)/libcfa_d_a-virtual.Po
     925@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='virtual.c' object='libcfa_d_a-virtual.obj' libtool=no @AMDEPBACKSLASH@
     926@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     927@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -c -o libcfa_d_a-virtual.obj `if test -f 'virtual.c'; then $(CYGPATH_W) 'virtual.c'; else $(CYGPATH_W) '$(srcdir)/virtual.c'; fi`
     928
    930929concurrency/libcfa_d_a-alarm.o: concurrency/alarm.c
    931930@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_d_a-alarm.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_d_a-alarm.Tpo -c -o concurrency/libcfa_d_a-alarm.o `test -f 'concurrency/alarm.c' || echo '$(srcdir)/'`concurrency/alarm.c
     
    998997@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libhdr/libcfa_a-libdebug.obj `if test -f 'libhdr/libdebug.c'; then $(CYGPATH_W) 'libhdr/libdebug.c'; else $(CYGPATH_W) '$(srcdir)/libhdr/libdebug.c'; fi`
    999998
     999libcfa_a-fstream.o: fstream.c
     1000@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-fstream.o -MD -MP -MF $(DEPDIR)/libcfa_a-fstream.Tpo -c -o libcfa_a-fstream.o `test -f 'fstream.c' || echo '$(srcdir)/'`fstream.c
     1001@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-fstream.Tpo $(DEPDIR)/libcfa_a-fstream.Po
     1002@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='fstream.c' object='libcfa_a-fstream.o' libtool=no @AMDEPBACKSLASH@
     1003@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1004@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-fstream.o `test -f 'fstream.c' || echo '$(srcdir)/'`fstream.c
     1005
     1006libcfa_a-fstream.obj: fstream.c
     1007@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-fstream.obj -MD -MP -MF $(DEPDIR)/libcfa_a-fstream.Tpo -c -o libcfa_a-fstream.obj `if test -f 'fstream.c'; then $(CYGPATH_W) 'fstream.c'; else $(CYGPATH_W) '$(srcdir)/fstream.c'; fi`
     1008@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-fstream.Tpo $(DEPDIR)/libcfa_a-fstream.Po
     1009@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='fstream.c' object='libcfa_a-fstream.obj' libtool=no @AMDEPBACKSLASH@
     1010@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1011@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-fstream.obj `if test -f 'fstream.c'; then $(CYGPATH_W) 'fstream.c'; else $(CYGPATH_W) '$(srcdir)/fstream.c'; fi`
     1012
     1013libcfa_a-iostream.o: iostream.c
     1014@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-iostream.o -MD -MP -MF $(DEPDIR)/libcfa_a-iostream.Tpo -c -o libcfa_a-iostream.o `test -f 'iostream.c' || echo '$(srcdir)/'`iostream.c
     1015@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-iostream.Tpo $(DEPDIR)/libcfa_a-iostream.Po
     1016@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iostream.c' object='libcfa_a-iostream.o' libtool=no @AMDEPBACKSLASH@
     1017@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1018@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-iostream.o `test -f 'iostream.c' || echo '$(srcdir)/'`iostream.c
     1019
     1020libcfa_a-iostream.obj: iostream.c
     1021@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-iostream.obj -MD -MP -MF $(DEPDIR)/libcfa_a-iostream.Tpo -c -o libcfa_a-iostream.obj `if test -f 'iostream.c'; then $(CYGPATH_W) 'iostream.c'; else $(CYGPATH_W) '$(srcdir)/iostream.c'; fi`
     1022@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-iostream.Tpo $(DEPDIR)/libcfa_a-iostream.Po
     1023@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iostream.c' object='libcfa_a-iostream.obj' libtool=no @AMDEPBACKSLASH@
     1024@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1025@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-iostream.obj `if test -f 'iostream.c'; then $(CYGPATH_W) 'iostream.c'; else $(CYGPATH_W) '$(srcdir)/iostream.c'; fi`
     1026
     1027libcfa_a-iterator.o: iterator.c
     1028@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-iterator.o -MD -MP -MF $(DEPDIR)/libcfa_a-iterator.Tpo -c -o libcfa_a-iterator.o `test -f 'iterator.c' || echo '$(srcdir)/'`iterator.c
     1029@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-iterator.Tpo $(DEPDIR)/libcfa_a-iterator.Po
     1030@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iterator.c' object='libcfa_a-iterator.o' libtool=no @AMDEPBACKSLASH@
     1031@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1032@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-iterator.o `test -f 'iterator.c' || echo '$(srcdir)/'`iterator.c
     1033
     1034libcfa_a-iterator.obj: iterator.c
     1035@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-iterator.obj -MD -MP -MF $(DEPDIR)/libcfa_a-iterator.Tpo -c -o libcfa_a-iterator.obj `if test -f 'iterator.c'; then $(CYGPATH_W) 'iterator.c'; else $(CYGPATH_W) '$(srcdir)/iterator.c'; fi`
     1036@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-iterator.Tpo $(DEPDIR)/libcfa_a-iterator.Po
     1037@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iterator.c' object='libcfa_a-iterator.obj' libtool=no @AMDEPBACKSLASH@
     1038@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1039@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-iterator.obj `if test -f 'iterator.c'; then $(CYGPATH_W) 'iterator.c'; else $(CYGPATH_W) '$(srcdir)/iterator.c'; fi`
     1040
     1041libcfa_a-limits.o: limits.c
     1042@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-limits.o -MD -MP -MF $(DEPDIR)/libcfa_a-limits.Tpo -c -o libcfa_a-limits.o `test -f 'limits.c' || echo '$(srcdir)/'`limits.c
     1043@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-limits.Tpo $(DEPDIR)/libcfa_a-limits.Po
     1044@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='limits.c' object='libcfa_a-limits.o' libtool=no @AMDEPBACKSLASH@
     1045@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1046@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-limits.o `test -f 'limits.c' || echo '$(srcdir)/'`limits.c
     1047
     1048libcfa_a-limits.obj: limits.c
     1049@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-limits.obj -MD -MP -MF $(DEPDIR)/libcfa_a-limits.Tpo -c -o libcfa_a-limits.obj `if test -f 'limits.c'; then $(CYGPATH_W) 'limits.c'; else $(CYGPATH_W) '$(srcdir)/limits.c'; fi`
     1050@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-limits.Tpo $(DEPDIR)/libcfa_a-limits.Po
     1051@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='limits.c' object='libcfa_a-limits.obj' libtool=no @AMDEPBACKSLASH@
     1052@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1053@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-limits.obj `if test -f 'limits.c'; then $(CYGPATH_W) 'limits.c'; else $(CYGPATH_W) '$(srcdir)/limits.c'; fi`
     1054
     1055libcfa_a-rational.o: rational.c
     1056@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-rational.o -MD -MP -MF $(DEPDIR)/libcfa_a-rational.Tpo -c -o libcfa_a-rational.o `test -f 'rational.c' || echo '$(srcdir)/'`rational.c
     1057@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-rational.Tpo $(DEPDIR)/libcfa_a-rational.Po
     1058@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='rational.c' object='libcfa_a-rational.o' libtool=no @AMDEPBACKSLASH@
     1059@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1060@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-rational.o `test -f 'rational.c' || echo '$(srcdir)/'`rational.c
     1061
     1062libcfa_a-rational.obj: rational.c
     1063@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-rational.obj -MD -MP -MF $(DEPDIR)/libcfa_a-rational.Tpo -c -o libcfa_a-rational.obj `if test -f 'rational.c'; then $(CYGPATH_W) 'rational.c'; else $(CYGPATH_W) '$(srcdir)/rational.c'; fi`
     1064@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-rational.Tpo $(DEPDIR)/libcfa_a-rational.Po
     1065@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='rational.c' object='libcfa_a-rational.obj' libtool=no @AMDEPBACKSLASH@
     1066@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1067@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-rational.obj `if test -f 'rational.c'; then $(CYGPATH_W) 'rational.c'; else $(CYGPATH_W) '$(srcdir)/rational.c'; fi`
     1068
     1069libcfa_a-stdlib.o: stdlib.c
     1070@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-stdlib.o -MD -MP -MF $(DEPDIR)/libcfa_a-stdlib.Tpo -c -o libcfa_a-stdlib.o `test -f 'stdlib.c' || echo '$(srcdir)/'`stdlib.c
     1071@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-stdlib.Tpo $(DEPDIR)/libcfa_a-stdlib.Po
     1072@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='stdlib.c' object='libcfa_a-stdlib.o' libtool=no @AMDEPBACKSLASH@
     1073@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1074@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-stdlib.o `test -f 'stdlib.c' || echo '$(srcdir)/'`stdlib.c
     1075
     1076libcfa_a-stdlib.obj: stdlib.c
     1077@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-stdlib.obj -MD -MP -MF $(DEPDIR)/libcfa_a-stdlib.Tpo -c -o libcfa_a-stdlib.obj `if test -f 'stdlib.c'; then $(CYGPATH_W) 'stdlib.c'; else $(CYGPATH_W) '$(srcdir)/stdlib.c'; fi`
     1078@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-stdlib.Tpo $(DEPDIR)/libcfa_a-stdlib.Po
     1079@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='stdlib.c' object='libcfa_a-stdlib.obj' libtool=no @AMDEPBACKSLASH@
     1080@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1081@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-stdlib.obj `if test -f 'stdlib.c'; then $(CYGPATH_W) 'stdlib.c'; else $(CYGPATH_W) '$(srcdir)/stdlib.c'; fi`
     1082
     1083containers/libcfa_a-maybe.o: containers/maybe.c
     1084@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-maybe.o -MD -MP -MF containers/$(DEPDIR)/libcfa_a-maybe.Tpo -c -o containers/libcfa_a-maybe.o `test -f 'containers/maybe.c' || echo '$(srcdir)/'`containers/maybe.c
     1085@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-maybe.Tpo containers/$(DEPDIR)/libcfa_a-maybe.Po
     1086@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/maybe.c' object='containers/libcfa_a-maybe.o' libtool=no @AMDEPBACKSLASH@
     1087@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1088@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-maybe.o `test -f 'containers/maybe.c' || echo '$(srcdir)/'`containers/maybe.c
     1089
     1090containers/libcfa_a-maybe.obj: containers/maybe.c
     1091@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-maybe.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_a-maybe.Tpo -c -o containers/libcfa_a-maybe.obj `if test -f 'containers/maybe.c'; then $(CYGPATH_W) 'containers/maybe.c'; else $(CYGPATH_W) '$(srcdir)/containers/maybe.c'; fi`
     1092@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-maybe.Tpo containers/$(DEPDIR)/libcfa_a-maybe.Po
     1093@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/maybe.c' object='containers/libcfa_a-maybe.obj' libtool=no @AMDEPBACKSLASH@
     1094@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1095@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-maybe.obj `if test -f 'containers/maybe.c'; then $(CYGPATH_W) 'containers/maybe.c'; else $(CYGPATH_W) '$(srcdir)/containers/maybe.c'; fi`
     1096
     1097containers/libcfa_a-pair.o: containers/pair.c
     1098@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-pair.o -MD -MP -MF containers/$(DEPDIR)/libcfa_a-pair.Tpo -c -o containers/libcfa_a-pair.o `test -f 'containers/pair.c' || echo '$(srcdir)/'`containers/pair.c
     1099@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-pair.Tpo containers/$(DEPDIR)/libcfa_a-pair.Po
     1100@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/pair.c' object='containers/libcfa_a-pair.o' libtool=no @AMDEPBACKSLASH@
     1101@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1102@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-pair.o `test -f 'containers/pair.c' || echo '$(srcdir)/'`containers/pair.c
     1103
     1104containers/libcfa_a-pair.obj: containers/pair.c
     1105@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-pair.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_a-pair.Tpo -c -o containers/libcfa_a-pair.obj `if test -f 'containers/pair.c'; then $(CYGPATH_W) 'containers/pair.c'; else $(CYGPATH_W) '$(srcdir)/containers/pair.c'; fi`
     1106@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-pair.Tpo containers/$(DEPDIR)/libcfa_a-pair.Po
     1107@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/pair.c' object='containers/libcfa_a-pair.obj' libtool=no @AMDEPBACKSLASH@
     1108@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1109@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-pair.obj `if test -f 'containers/pair.c'; then $(CYGPATH_W) 'containers/pair.c'; else $(CYGPATH_W) '$(srcdir)/containers/pair.c'; fi`
     1110
     1111containers/libcfa_a-result.o: containers/result.c
     1112@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-result.o -MD -MP -MF containers/$(DEPDIR)/libcfa_a-result.Tpo -c -o containers/libcfa_a-result.o `test -f 'containers/result.c' || echo '$(srcdir)/'`containers/result.c
     1113@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-result.Tpo containers/$(DEPDIR)/libcfa_a-result.Po
     1114@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/result.c' object='containers/libcfa_a-result.o' libtool=no @AMDEPBACKSLASH@
     1115@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1116@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-result.o `test -f 'containers/result.c' || echo '$(srcdir)/'`containers/result.c
     1117
     1118containers/libcfa_a-result.obj: containers/result.c
     1119@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-result.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_a-result.Tpo -c -o containers/libcfa_a-result.obj `if test -f 'containers/result.c'; then $(CYGPATH_W) 'containers/result.c'; else $(CYGPATH_W) '$(srcdir)/containers/result.c'; fi`
     1120@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-result.Tpo containers/$(DEPDIR)/libcfa_a-result.Po
     1121@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/result.c' object='containers/libcfa_a-result.obj' libtool=no @AMDEPBACKSLASH@
     1122@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1123@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-result.obj `if test -f 'containers/result.c'; then $(CYGPATH_W) 'containers/result.c'; else $(CYGPATH_W) '$(srcdir)/containers/result.c'; fi`
     1124
     1125containers/libcfa_a-vector.o: containers/vector.c
     1126@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-vector.o -MD -MP -MF containers/$(DEPDIR)/libcfa_a-vector.Tpo -c -o containers/libcfa_a-vector.o `test -f 'containers/vector.c' || echo '$(srcdir)/'`containers/vector.c
     1127@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-vector.Tpo containers/$(DEPDIR)/libcfa_a-vector.Po
     1128@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/vector.c' object='containers/libcfa_a-vector.o' libtool=no @AMDEPBACKSLASH@
     1129@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1130@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-vector.o `test -f 'containers/vector.c' || echo '$(srcdir)/'`containers/vector.c
     1131
     1132containers/libcfa_a-vector.obj: containers/vector.c
     1133@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-vector.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_a-vector.Tpo -c -o containers/libcfa_a-vector.obj `if test -f 'containers/vector.c'; then $(CYGPATH_W) 'containers/vector.c'; else $(CYGPATH_W) '$(srcdir)/containers/vector.c'; fi`
     1134@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-vector.Tpo containers/$(DEPDIR)/libcfa_a-vector.Po
     1135@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/vector.c' object='containers/libcfa_a-vector.obj' libtool=no @AMDEPBACKSLASH@
     1136@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1137@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-vector.obj `if test -f 'containers/vector.c'; then $(CYGPATH_W) 'containers/vector.c'; else $(CYGPATH_W) '$(srcdir)/containers/vector.c'; fi`
     1138
     1139concurrency/libcfa_a-coroutine.o: concurrency/coroutine.c
     1140@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-coroutine.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-coroutine.Tpo -c -o concurrency/libcfa_a-coroutine.o `test -f 'concurrency/coroutine.c' || echo '$(srcdir)/'`concurrency/coroutine.c
     1141@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-coroutine.Tpo concurrency/$(DEPDIR)/libcfa_a-coroutine.Po
     1142@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/coroutine.c' object='concurrency/libcfa_a-coroutine.o' libtool=no @AMDEPBACKSLASH@
     1143@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1144@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-coroutine.o `test -f 'concurrency/coroutine.c' || echo '$(srcdir)/'`concurrency/coroutine.c
     1145
     1146concurrency/libcfa_a-coroutine.obj: concurrency/coroutine.c
     1147@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-coroutine.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-coroutine.Tpo -c -o concurrency/libcfa_a-coroutine.obj `if test -f 'concurrency/coroutine.c'; then $(CYGPATH_W) 'concurrency/coroutine.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutine.c'; fi`
     1148@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-coroutine.Tpo concurrency/$(DEPDIR)/libcfa_a-coroutine.Po
     1149@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/coroutine.c' object='concurrency/libcfa_a-coroutine.obj' libtool=no @AMDEPBACKSLASH@
     1150@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1151@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-coroutine.obj `if test -f 'concurrency/coroutine.c'; then $(CYGPATH_W) 'concurrency/coroutine.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutine.c'; fi`
     1152
     1153concurrency/libcfa_a-thread.o: concurrency/thread.c
     1154@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-thread.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-thread.Tpo -c -o concurrency/libcfa_a-thread.o `test -f 'concurrency/thread.c' || echo '$(srcdir)/'`concurrency/thread.c
     1155@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-thread.Tpo concurrency/$(DEPDIR)/libcfa_a-thread.Po
     1156@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/thread.c' object='concurrency/libcfa_a-thread.o' libtool=no @AMDEPBACKSLASH@
     1157@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1158@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-thread.o `test -f 'concurrency/thread.c' || echo '$(srcdir)/'`concurrency/thread.c
     1159
     1160concurrency/libcfa_a-thread.obj: concurrency/thread.c
     1161@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-thread.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-thread.Tpo -c -o concurrency/libcfa_a-thread.obj `if test -f 'concurrency/thread.c'; then $(CYGPATH_W) 'concurrency/thread.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/thread.c'; fi`
     1162@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-thread.Tpo concurrency/$(DEPDIR)/libcfa_a-thread.Po
     1163@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/thread.c' object='concurrency/libcfa_a-thread.obj' libtool=no @AMDEPBACKSLASH@
     1164@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1165@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-thread.obj `if test -f 'concurrency/thread.c'; then $(CYGPATH_W) 'concurrency/thread.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/thread.c'; fi`
     1166
     1167concurrency/libcfa_a-kernel.o: concurrency/kernel.c
     1168@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-kernel.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-kernel.Tpo -c -o concurrency/libcfa_a-kernel.o `test -f 'concurrency/kernel.c' || echo '$(srcdir)/'`concurrency/kernel.c
     1169@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-kernel.Tpo concurrency/$(DEPDIR)/libcfa_a-kernel.Po
     1170@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/kernel.c' object='concurrency/libcfa_a-kernel.o' libtool=no @AMDEPBACKSLASH@
     1171@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1172@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-kernel.o `test -f 'concurrency/kernel.c' || echo '$(srcdir)/'`concurrency/kernel.c
     1173
     1174concurrency/libcfa_a-kernel.obj: concurrency/kernel.c
     1175@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-kernel.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-kernel.Tpo -c -o concurrency/libcfa_a-kernel.obj `if test -f 'concurrency/kernel.c'; then $(CYGPATH_W) 'concurrency/kernel.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/kernel.c'; fi`
     1176@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-kernel.Tpo concurrency/$(DEPDIR)/libcfa_a-kernel.Po
     1177@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/kernel.c' object='concurrency/libcfa_a-kernel.obj' libtool=no @AMDEPBACKSLASH@
     1178@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1179@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-kernel.obj `if test -f 'concurrency/kernel.c'; then $(CYGPATH_W) 'concurrency/kernel.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/kernel.c'; fi`
     1180
     1181concurrency/libcfa_a-monitor.o: concurrency/monitor.c
     1182@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-monitor.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-monitor.Tpo -c -o concurrency/libcfa_a-monitor.o `test -f 'concurrency/monitor.c' || echo '$(srcdir)/'`concurrency/monitor.c
     1183@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-monitor.Tpo concurrency/$(DEPDIR)/libcfa_a-monitor.Po
     1184@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/monitor.c' object='concurrency/libcfa_a-monitor.o' libtool=no @AMDEPBACKSLASH@
     1185@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1186@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-monitor.o `test -f 'concurrency/monitor.c' || echo '$(srcdir)/'`concurrency/monitor.c
     1187
     1188concurrency/libcfa_a-monitor.obj: concurrency/monitor.c
     1189@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-monitor.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-monitor.Tpo -c -o concurrency/libcfa_a-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi`
     1190@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-monitor.Tpo concurrency/$(DEPDIR)/libcfa_a-monitor.Po
     1191@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/monitor.c' object='concurrency/libcfa_a-monitor.obj' libtool=no @AMDEPBACKSLASH@
     1192@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1193@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi`
     1194
    10001195libcfa_a-assert.o: assert.c
    10011196@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-assert.o -MD -MP -MF $(DEPDIR)/libcfa_a-assert.Tpo -c -o libcfa_a-assert.o `test -f 'assert.c' || echo '$(srcdir)/'`assert.c
     
    10121207@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-assert.obj `if test -f 'assert.c'; then $(CYGPATH_W) 'assert.c'; else $(CYGPATH_W) '$(srcdir)/assert.c'; fi`
    10131208
    1014 libcfa_a-fstream.o: fstream.c
    1015 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-fstream.o -MD -MP -MF $(DEPDIR)/libcfa_a-fstream.Tpo -c -o libcfa_a-fstream.o `test -f 'fstream.c' || echo '$(srcdir)/'`fstream.c
    1016 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-fstream.Tpo $(DEPDIR)/libcfa_a-fstream.Po
    1017 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='fstream.c' object='libcfa_a-fstream.o' libtool=no @AMDEPBACKSLASH@
    1018 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1019 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-fstream.o `test -f 'fstream.c' || echo '$(srcdir)/'`fstream.c
    1020 
    1021 libcfa_a-fstream.obj: fstream.c
    1022 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-fstream.obj -MD -MP -MF $(DEPDIR)/libcfa_a-fstream.Tpo -c -o libcfa_a-fstream.obj `if test -f 'fstream.c'; then $(CYGPATH_W) 'fstream.c'; else $(CYGPATH_W) '$(srcdir)/fstream.c'; fi`
    1023 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-fstream.Tpo $(DEPDIR)/libcfa_a-fstream.Po
    1024 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='fstream.c' object='libcfa_a-fstream.obj' libtool=no @AMDEPBACKSLASH@
    1025 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1026 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-fstream.obj `if test -f 'fstream.c'; then $(CYGPATH_W) 'fstream.c'; else $(CYGPATH_W) '$(srcdir)/fstream.c'; fi`
    1027 
    1028 libcfa_a-iostream.o: iostream.c
    1029 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-iostream.o -MD -MP -MF $(DEPDIR)/libcfa_a-iostream.Tpo -c -o libcfa_a-iostream.o `test -f 'iostream.c' || echo '$(srcdir)/'`iostream.c
    1030 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-iostream.Tpo $(DEPDIR)/libcfa_a-iostream.Po
    1031 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iostream.c' object='libcfa_a-iostream.o' libtool=no @AMDEPBACKSLASH@
    1032 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1033 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-iostream.o `test -f 'iostream.c' || echo '$(srcdir)/'`iostream.c
    1034 
    1035 libcfa_a-iostream.obj: iostream.c
    1036 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-iostream.obj -MD -MP -MF $(DEPDIR)/libcfa_a-iostream.Tpo -c -o libcfa_a-iostream.obj `if test -f 'iostream.c'; then $(CYGPATH_W) 'iostream.c'; else $(CYGPATH_W) '$(srcdir)/iostream.c'; fi`
    1037 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-iostream.Tpo $(DEPDIR)/libcfa_a-iostream.Po
    1038 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iostream.c' object='libcfa_a-iostream.obj' libtool=no @AMDEPBACKSLASH@
    1039 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1040 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-iostream.obj `if test -f 'iostream.c'; then $(CYGPATH_W) 'iostream.c'; else $(CYGPATH_W) '$(srcdir)/iostream.c'; fi`
    1041 
    1042 libcfa_a-iterator.o: iterator.c
    1043 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-iterator.o -MD -MP -MF $(DEPDIR)/libcfa_a-iterator.Tpo -c -o libcfa_a-iterator.o `test -f 'iterator.c' || echo '$(srcdir)/'`iterator.c
    1044 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-iterator.Tpo $(DEPDIR)/libcfa_a-iterator.Po
    1045 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iterator.c' object='libcfa_a-iterator.o' libtool=no @AMDEPBACKSLASH@
    1046 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1047 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-iterator.o `test -f 'iterator.c' || echo '$(srcdir)/'`iterator.c
    1048 
    1049 libcfa_a-iterator.obj: iterator.c
    1050 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-iterator.obj -MD -MP -MF $(DEPDIR)/libcfa_a-iterator.Tpo -c -o libcfa_a-iterator.obj `if test -f 'iterator.c'; then $(CYGPATH_W) 'iterator.c'; else $(CYGPATH_W) '$(srcdir)/iterator.c'; fi`
    1051 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-iterator.Tpo $(DEPDIR)/libcfa_a-iterator.Po
    1052 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='iterator.c' object='libcfa_a-iterator.obj' libtool=no @AMDEPBACKSLASH@
    1053 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1054 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-iterator.obj `if test -f 'iterator.c'; then $(CYGPATH_W) 'iterator.c'; else $(CYGPATH_W) '$(srcdir)/iterator.c'; fi`
    1055 
    1056 libcfa_a-limits.o: limits.c
    1057 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-limits.o -MD -MP -MF $(DEPDIR)/libcfa_a-limits.Tpo -c -o libcfa_a-limits.o `test -f 'limits.c' || echo '$(srcdir)/'`limits.c
    1058 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-limits.Tpo $(DEPDIR)/libcfa_a-limits.Po
    1059 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='limits.c' object='libcfa_a-limits.o' libtool=no @AMDEPBACKSLASH@
    1060 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1061 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-limits.o `test -f 'limits.c' || echo '$(srcdir)/'`limits.c
    1062 
    1063 libcfa_a-limits.obj: limits.c
    1064 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-limits.obj -MD -MP -MF $(DEPDIR)/libcfa_a-limits.Tpo -c -o libcfa_a-limits.obj `if test -f 'limits.c'; then $(CYGPATH_W) 'limits.c'; else $(CYGPATH_W) '$(srcdir)/limits.c'; fi`
    1065 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-limits.Tpo $(DEPDIR)/libcfa_a-limits.Po
    1066 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='limits.c' object='libcfa_a-limits.obj' libtool=no @AMDEPBACKSLASH@
    1067 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1068 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-limits.obj `if test -f 'limits.c'; then $(CYGPATH_W) 'limits.c'; else $(CYGPATH_W) '$(srcdir)/limits.c'; fi`
    1069 
    1070 libcfa_a-math.o: math.c
    1071 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-math.o -MD -MP -MF $(DEPDIR)/libcfa_a-math.Tpo -c -o libcfa_a-math.o `test -f 'math.c' || echo '$(srcdir)/'`math.c
    1072 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-math.Tpo $(DEPDIR)/libcfa_a-math.Po
    1073 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='math.c' object='libcfa_a-math.o' libtool=no @AMDEPBACKSLASH@
    1074 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1075 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-math.o `test -f 'math.c' || echo '$(srcdir)/'`math.c
    1076 
    1077 libcfa_a-math.obj: math.c
    1078 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-math.obj -MD -MP -MF $(DEPDIR)/libcfa_a-math.Tpo -c -o libcfa_a-math.obj `if test -f 'math.c'; then $(CYGPATH_W) 'math.c'; else $(CYGPATH_W) '$(srcdir)/math.c'; fi`
    1079 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-math.Tpo $(DEPDIR)/libcfa_a-math.Po
    1080 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='math.c' object='libcfa_a-math.obj' libtool=no @AMDEPBACKSLASH@
    1081 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1082 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-math.obj `if test -f 'math.c'; then $(CYGPATH_W) 'math.c'; else $(CYGPATH_W) '$(srcdir)/math.c'; fi`
    1083 
    1084 libcfa_a-rational.o: rational.c
    1085 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-rational.o -MD -MP -MF $(DEPDIR)/libcfa_a-rational.Tpo -c -o libcfa_a-rational.o `test -f 'rational.c' || echo '$(srcdir)/'`rational.c
    1086 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-rational.Tpo $(DEPDIR)/libcfa_a-rational.Po
    1087 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='rational.c' object='libcfa_a-rational.o' libtool=no @AMDEPBACKSLASH@
    1088 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1089 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-rational.o `test -f 'rational.c' || echo '$(srcdir)/'`rational.c
    1090 
    1091 libcfa_a-rational.obj: rational.c
    1092 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-rational.obj -MD -MP -MF $(DEPDIR)/libcfa_a-rational.Tpo -c -o libcfa_a-rational.obj `if test -f 'rational.c'; then $(CYGPATH_W) 'rational.c'; else $(CYGPATH_W) '$(srcdir)/rational.c'; fi`
    1093 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-rational.Tpo $(DEPDIR)/libcfa_a-rational.Po
    1094 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='rational.c' object='libcfa_a-rational.obj' libtool=no @AMDEPBACKSLASH@
    1095 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1096 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-rational.obj `if test -f 'rational.c'; then $(CYGPATH_W) 'rational.c'; else $(CYGPATH_W) '$(srcdir)/rational.c'; fi`
    1097 
    1098 libcfa_a-stdlib.o: stdlib.c
    1099 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-stdlib.o -MD -MP -MF $(DEPDIR)/libcfa_a-stdlib.Tpo -c -o libcfa_a-stdlib.o `test -f 'stdlib.c' || echo '$(srcdir)/'`stdlib.c
    1100 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-stdlib.Tpo $(DEPDIR)/libcfa_a-stdlib.Po
    1101 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='stdlib.c' object='libcfa_a-stdlib.o' libtool=no @AMDEPBACKSLASH@
    1102 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1103 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-stdlib.o `test -f 'stdlib.c' || echo '$(srcdir)/'`stdlib.c
    1104 
    1105 libcfa_a-stdlib.obj: stdlib.c
    1106 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-stdlib.obj -MD -MP -MF $(DEPDIR)/libcfa_a-stdlib.Tpo -c -o libcfa_a-stdlib.obj `if test -f 'stdlib.c'; then $(CYGPATH_W) 'stdlib.c'; else $(CYGPATH_W) '$(srcdir)/stdlib.c'; fi`
    1107 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-stdlib.Tpo $(DEPDIR)/libcfa_a-stdlib.Po
    1108 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='stdlib.c' object='libcfa_a-stdlib.obj' libtool=no @AMDEPBACKSLASH@
    1109 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1110 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-stdlib.obj `if test -f 'stdlib.c'; then $(CYGPATH_W) 'stdlib.c'; else $(CYGPATH_W) '$(srcdir)/stdlib.c'; fi`
    1111 
    1112 containers/libcfa_a-maybe.o: containers/maybe.c
    1113 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-maybe.o -MD -MP -MF containers/$(DEPDIR)/libcfa_a-maybe.Tpo -c -o containers/libcfa_a-maybe.o `test -f 'containers/maybe.c' || echo '$(srcdir)/'`containers/maybe.c
    1114 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-maybe.Tpo containers/$(DEPDIR)/libcfa_a-maybe.Po
    1115 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/maybe.c' object='containers/libcfa_a-maybe.o' libtool=no @AMDEPBACKSLASH@
    1116 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1117 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-maybe.o `test -f 'containers/maybe.c' || echo '$(srcdir)/'`containers/maybe.c
    1118 
    1119 containers/libcfa_a-maybe.obj: containers/maybe.c
    1120 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-maybe.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_a-maybe.Tpo -c -o containers/libcfa_a-maybe.obj `if test -f 'containers/maybe.c'; then $(CYGPATH_W) 'containers/maybe.c'; else $(CYGPATH_W) '$(srcdir)/containers/maybe.c'; fi`
    1121 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-maybe.Tpo containers/$(DEPDIR)/libcfa_a-maybe.Po
    1122 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/maybe.c' object='containers/libcfa_a-maybe.obj' libtool=no @AMDEPBACKSLASH@
    1123 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1124 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-maybe.obj `if test -f 'containers/maybe.c'; then $(CYGPATH_W) 'containers/maybe.c'; else $(CYGPATH_W) '$(srcdir)/containers/maybe.c'; fi`
    1125 
    1126 containers/libcfa_a-pair.o: containers/pair.c
    1127 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-pair.o -MD -MP -MF containers/$(DEPDIR)/libcfa_a-pair.Tpo -c -o containers/libcfa_a-pair.o `test -f 'containers/pair.c' || echo '$(srcdir)/'`containers/pair.c
    1128 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-pair.Tpo containers/$(DEPDIR)/libcfa_a-pair.Po
    1129 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/pair.c' object='containers/libcfa_a-pair.o' libtool=no @AMDEPBACKSLASH@
    1130 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1131 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-pair.o `test -f 'containers/pair.c' || echo '$(srcdir)/'`containers/pair.c
    1132 
    1133 containers/libcfa_a-pair.obj: containers/pair.c
    1134 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-pair.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_a-pair.Tpo -c -o containers/libcfa_a-pair.obj `if test -f 'containers/pair.c'; then $(CYGPATH_W) 'containers/pair.c'; else $(CYGPATH_W) '$(srcdir)/containers/pair.c'; fi`
    1135 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-pair.Tpo containers/$(DEPDIR)/libcfa_a-pair.Po
    1136 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/pair.c' object='containers/libcfa_a-pair.obj' libtool=no @AMDEPBACKSLASH@
    1137 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1138 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-pair.obj `if test -f 'containers/pair.c'; then $(CYGPATH_W) 'containers/pair.c'; else $(CYGPATH_W) '$(srcdir)/containers/pair.c'; fi`
    1139 
    1140 containers/libcfa_a-result.o: containers/result.c
    1141 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-result.o -MD -MP -MF containers/$(DEPDIR)/libcfa_a-result.Tpo -c -o containers/libcfa_a-result.o `test -f 'containers/result.c' || echo '$(srcdir)/'`containers/result.c
    1142 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-result.Tpo containers/$(DEPDIR)/libcfa_a-result.Po
    1143 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/result.c' object='containers/libcfa_a-result.o' libtool=no @AMDEPBACKSLASH@
    1144 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1145 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-result.o `test -f 'containers/result.c' || echo '$(srcdir)/'`containers/result.c
    1146 
    1147 containers/libcfa_a-result.obj: containers/result.c
    1148 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-result.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_a-result.Tpo -c -o containers/libcfa_a-result.obj `if test -f 'containers/result.c'; then $(CYGPATH_W) 'containers/result.c'; else $(CYGPATH_W) '$(srcdir)/containers/result.c'; fi`
    1149 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-result.Tpo containers/$(DEPDIR)/libcfa_a-result.Po
    1150 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/result.c' object='containers/libcfa_a-result.obj' libtool=no @AMDEPBACKSLASH@
    1151 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1152 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-result.obj `if test -f 'containers/result.c'; then $(CYGPATH_W) 'containers/result.c'; else $(CYGPATH_W) '$(srcdir)/containers/result.c'; fi`
    1153 
    1154 containers/libcfa_a-vector.o: containers/vector.c
    1155 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-vector.o -MD -MP -MF containers/$(DEPDIR)/libcfa_a-vector.Tpo -c -o containers/libcfa_a-vector.o `test -f 'containers/vector.c' || echo '$(srcdir)/'`containers/vector.c
    1156 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-vector.Tpo containers/$(DEPDIR)/libcfa_a-vector.Po
    1157 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/vector.c' object='containers/libcfa_a-vector.o' libtool=no @AMDEPBACKSLASH@
    1158 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1159 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-vector.o `test -f 'containers/vector.c' || echo '$(srcdir)/'`containers/vector.c
    1160 
    1161 containers/libcfa_a-vector.obj: containers/vector.c
    1162 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT containers/libcfa_a-vector.obj -MD -MP -MF containers/$(DEPDIR)/libcfa_a-vector.Tpo -c -o containers/libcfa_a-vector.obj `if test -f 'containers/vector.c'; then $(CYGPATH_W) 'containers/vector.c'; else $(CYGPATH_W) '$(srcdir)/containers/vector.c'; fi`
    1163 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) containers/$(DEPDIR)/libcfa_a-vector.Tpo containers/$(DEPDIR)/libcfa_a-vector.Po
    1164 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='containers/vector.c' object='containers/libcfa_a-vector.obj' libtool=no @AMDEPBACKSLASH@
    1165 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1166 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o containers/libcfa_a-vector.obj `if test -f 'containers/vector.c'; then $(CYGPATH_W) 'containers/vector.c'; else $(CYGPATH_W) '$(srcdir)/containers/vector.c'; fi`
    1167 
    1168 concurrency/libcfa_a-coroutine.o: concurrency/coroutine.c
    1169 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-coroutine.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-coroutine.Tpo -c -o concurrency/libcfa_a-coroutine.o `test -f 'concurrency/coroutine.c' || echo '$(srcdir)/'`concurrency/coroutine.c
    1170 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-coroutine.Tpo concurrency/$(DEPDIR)/libcfa_a-coroutine.Po
    1171 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/coroutine.c' object='concurrency/libcfa_a-coroutine.o' libtool=no @AMDEPBACKSLASH@
    1172 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1173 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-coroutine.o `test -f 'concurrency/coroutine.c' || echo '$(srcdir)/'`concurrency/coroutine.c
    1174 
    1175 concurrency/libcfa_a-coroutine.obj: concurrency/coroutine.c
    1176 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-coroutine.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-coroutine.Tpo -c -o concurrency/libcfa_a-coroutine.obj `if test -f 'concurrency/coroutine.c'; then $(CYGPATH_W) 'concurrency/coroutine.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutine.c'; fi`
    1177 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-coroutine.Tpo concurrency/$(DEPDIR)/libcfa_a-coroutine.Po
    1178 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/coroutine.c' object='concurrency/libcfa_a-coroutine.obj' libtool=no @AMDEPBACKSLASH@
    1179 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1180 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-coroutine.obj `if test -f 'concurrency/coroutine.c'; then $(CYGPATH_W) 'concurrency/coroutine.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/coroutine.c'; fi`
    1181 
    1182 concurrency/libcfa_a-thread.o: concurrency/thread.c
    1183 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-thread.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-thread.Tpo -c -o concurrency/libcfa_a-thread.o `test -f 'concurrency/thread.c' || echo '$(srcdir)/'`concurrency/thread.c
    1184 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-thread.Tpo concurrency/$(DEPDIR)/libcfa_a-thread.Po
    1185 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/thread.c' object='concurrency/libcfa_a-thread.o' libtool=no @AMDEPBACKSLASH@
    1186 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1187 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-thread.o `test -f 'concurrency/thread.c' || echo '$(srcdir)/'`concurrency/thread.c
    1188 
    1189 concurrency/libcfa_a-thread.obj: concurrency/thread.c
    1190 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-thread.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-thread.Tpo -c -o concurrency/libcfa_a-thread.obj `if test -f 'concurrency/thread.c'; then $(CYGPATH_W) 'concurrency/thread.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/thread.c'; fi`
    1191 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-thread.Tpo concurrency/$(DEPDIR)/libcfa_a-thread.Po
    1192 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/thread.c' object='concurrency/libcfa_a-thread.obj' libtool=no @AMDEPBACKSLASH@
    1193 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1194 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-thread.obj `if test -f 'concurrency/thread.c'; then $(CYGPATH_W) 'concurrency/thread.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/thread.c'; fi`
    1195 
    1196 concurrency/libcfa_a-kernel.o: concurrency/kernel.c
    1197 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-kernel.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-kernel.Tpo -c -o concurrency/libcfa_a-kernel.o `test -f 'concurrency/kernel.c' || echo '$(srcdir)/'`concurrency/kernel.c
    1198 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-kernel.Tpo concurrency/$(DEPDIR)/libcfa_a-kernel.Po
    1199 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/kernel.c' object='concurrency/libcfa_a-kernel.o' libtool=no @AMDEPBACKSLASH@
    1200 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1201 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-kernel.o `test -f 'concurrency/kernel.c' || echo '$(srcdir)/'`concurrency/kernel.c
    1202 
    1203 concurrency/libcfa_a-kernel.obj: concurrency/kernel.c
    1204 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-kernel.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-kernel.Tpo -c -o concurrency/libcfa_a-kernel.obj `if test -f 'concurrency/kernel.c'; then $(CYGPATH_W) 'concurrency/kernel.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/kernel.c'; fi`
    1205 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-kernel.Tpo concurrency/$(DEPDIR)/libcfa_a-kernel.Po
    1206 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/kernel.c' object='concurrency/libcfa_a-kernel.obj' libtool=no @AMDEPBACKSLASH@
    1207 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1208 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-kernel.obj `if test -f 'concurrency/kernel.c'; then $(CYGPATH_W) 'concurrency/kernel.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/kernel.c'; fi`
    1209 
    1210 concurrency/libcfa_a-monitor.o: concurrency/monitor.c
    1211 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-monitor.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-monitor.Tpo -c -o concurrency/libcfa_a-monitor.o `test -f 'concurrency/monitor.c' || echo '$(srcdir)/'`concurrency/monitor.c
    1212 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-monitor.Tpo concurrency/$(DEPDIR)/libcfa_a-monitor.Po
    1213 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/monitor.c' object='concurrency/libcfa_a-monitor.o' libtool=no @AMDEPBACKSLASH@
    1214 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1215 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-monitor.o `test -f 'concurrency/monitor.c' || echo '$(srcdir)/'`concurrency/monitor.c
    1216 
    1217 concurrency/libcfa_a-monitor.obj: concurrency/monitor.c
    1218 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-monitor.obj -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-monitor.Tpo -c -o concurrency/libcfa_a-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi`
    1219 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) concurrency/$(DEPDIR)/libcfa_a-monitor.Tpo concurrency/$(DEPDIR)/libcfa_a-monitor.Po
    1220 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='concurrency/monitor.c' object='concurrency/libcfa_a-monitor.obj' libtool=no @AMDEPBACKSLASH@
    1221 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1222 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o concurrency/libcfa_a-monitor.obj `if test -f 'concurrency/monitor.c'; then $(CYGPATH_W) 'concurrency/monitor.c'; else $(CYGPATH_W) '$(srcdir)/concurrency/monitor.c'; fi`
    1223 
    12241209libcfa_a-exception.obj: exception.c
    12251210@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-exception.obj -MD -MP -MF $(DEPDIR)/libcfa_a-exception.Tpo -c -o libcfa_a-exception.obj `if test -f 'exception.c'; then $(CYGPATH_W) 'exception.c'; else $(CYGPATH_W) '$(srcdir)/exception.c'; fi`
     
    12281213@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    12291214@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-exception.obj `if test -f 'exception.c'; then $(CYGPATH_W) 'exception.c'; else $(CYGPATH_W) '$(srcdir)/exception.c'; fi`
     1215
     1216libcfa_a-virtual.obj: virtual.c
     1217@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-virtual.obj -MD -MP -MF $(DEPDIR)/libcfa_a-virtual.Tpo -c -o libcfa_a-virtual.obj `if test -f 'virtual.c'; then $(CYGPATH_W) 'virtual.c'; else $(CYGPATH_W) '$(srcdir)/virtual.c'; fi`
     1218@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-virtual.Tpo $(DEPDIR)/libcfa_a-virtual.Po
     1219@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='virtual.c' object='libcfa_a-virtual.obj' libtool=no @AMDEPBACKSLASH@
     1220@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1221@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-virtual.obj `if test -f 'virtual.c'; then $(CYGPATH_W) 'virtual.c'; else $(CYGPATH_W) '$(srcdir)/virtual.c'; fi`
    12301222
    12311223concurrency/libcfa_a-alarm.o: concurrency/alarm.c
     
    15211513        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
    15221514
     1515libcfa_a-virtual.o : virtual.c
     1516        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
     1517
    15231518concurrency/libcfa_d_a-invoke.o : concurrency/invoke.c
    15241519        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
    15251520
    15261521libcfa_d_a-exception.o : exception.c
     1522        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
     1523
     1524libcfa_d_a-virtual.o : virtual.c
    15271525        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
    15281526
  • src/libcfa/assert.c

    rfd344aa r9236060  
    99// Author           : Thierry Delisle
    1010// Created On       : Mon Nov 28 12:27:26 2016
    11 // Last Modified By : Thierry Delisle
    12 // Last Modified On : Mon Nov 28 12:27:26 2016
    13 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu Jul 20 15:10:26 2017
     13// Update Count     : 2
    1414//
    1515
    16 #include "assert"
    17 #include "stdlib"                                                                               // abort
    18 
     16#include <assert.h>
     17#include <stdarg.h>                                                             // varargs
     18#include <stdio.h>                                                              // fprintf
    1919#include "libhdr/libdebug.h"
    2020
    2121extern "C" {
    22         #include <stdarg.h>                                                             // varargs
    23         #include <stdio.h>                                                              // fprintf
    24 
    2522        extern const char * __progname;                                         // global name of running executable (argv[0])
    2623
     
    4744                abort();
    4845        }
    49 
    5046}
    5147
  • src/libcfa/concurrency/CtxSwitch-i386.S

    rfd344aa r9236060  
    1 //                               -*- Mode: Asm -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Tue Dec 6 12:27:26 2016
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : Tue Dec 6 12:27:26 2016
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:29:25 2017
     13// Update Count     : 1
    1514//
    1615// This  library is free  software; you  can redistribute  it and/or  modify it
     
    9998
    10099// Local Variables: //
    101 // compile-command: "make install" //
     100// mode: c //
     101// tab-width: 4 //
    102102// End: //
  • src/libcfa/concurrency/CtxSwitch-x86_64.S

    rfd344aa r9236060  
    1 //                               -*- Mode: Asm -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Mon Nov 28 12:27:26 2016
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : Mon Nov 28 12:27:26 2016
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:28:11 2017
     13// Update Count     : 1
    1514//
    1615// This  library is free  software; you  can redistribute  it and/or  modify it
  • src/libcfa/concurrency/alarm.c

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Fri Jun 2 11:31:25 2017
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : --
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:35:18 2017
     13// Update Count     : 1
    1514//
    1615
     
    3130
    3231//=============================================================================================
     32// time type
     33//=============================================================================================
     34
     35#define one_second         1_000_000_000ul
     36#define one_milisecond         1_000_000ul
     37#define one_microsecond            1_000ul
     38#define one_nanosecond                 1ul
     39
     40__cfa_time_t zero_time = { 0 };
     41
     42void ?{}( __cfa_time_t & this ) { this.val = 0; }
     43void ?{}( __cfa_time_t & this, zero_t zero ) { this.val = 0; }
     44
     45void ?{}( itimerval & this, __cfa_time_t * alarm ) {
     46        this.it_value.tv_sec = alarm->val / one_second;                 // seconds
     47        this.it_value.tv_usec = max( (alarm->val % one_second) / one_microsecond, 1000 ); // microseconds
     48        this.it_interval.tv_sec = 0;
     49        this.it_interval.tv_usec = 0;
     50}
     51
     52
     53void ?{}( __cfa_time_t & this, timespec * curr ) {
     54        uint64_t secs  = curr->tv_sec;
     55        uint64_t nsecs = curr->tv_nsec;
     56        this.val = (secs * one_second) + nsecs;
     57}
     58
     59__cfa_time_t ?=?( __cfa_time_t & this, zero_t rhs ) {
     60        this.val = 0;
     61        return this;
     62}
     63
     64__cfa_time_t from_s ( uint64_t val ) { __cfa_time_t ret; ret.val = val * 1_000_000_000ul; return ret; }
     65__cfa_time_t from_ms( uint64_t val ) { __cfa_time_t ret; ret.val = val *     1_000_000ul; return ret; }
     66__cfa_time_t from_us( uint64_t val ) { __cfa_time_t ret; ret.val = val *         1_000ul; return ret; }
     67__cfa_time_t from_ns( uint64_t val ) { __cfa_time_t ret; ret.val = val *             1ul; return ret; }
     68
     69//=============================================================================================
    3370// Clock logic
    3471//=============================================================================================
     
    3774        timespec curr;
    3875        clock_gettime( CLOCK_REALTIME, &curr );
    39         __cfa_time_t curr_time = ((__cfa_time_t)curr.tv_sec * TIMEGRAN) + curr.tv_nsec;
    40         // LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Kernel : current time is %lu\n", curr_time );
    41         return curr_time;
     76        return (__cfa_time_t){ &curr };
    4277}
    4378
    4479void __kernel_set_timer( __cfa_time_t alarm ) {
    45         LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Kernel : set timer to %lu\n", (__cfa_time_t)alarm );
    46         itimerval val;
    47         val.it_value.tv_sec = alarm / TIMEGRAN;                 // seconds
    48         val.it_value.tv_usec = (alarm % TIMEGRAN) / ( TIMEGRAN / 1_000_000L ); // microseconds
    49         val.it_interval.tv_sec = 0;
    50         val.it_interval.tv_usec = 0;
     80        itimerval val = { &alarm };
    5181        setitimer( ITIMER_REAL, &val, NULL );
    5282}
     
    5686//=============================================================================================
    5787
    58 void ?{}( alarm_node_t & this, thread_desc * thrd, __cfa_time_t alarm = 0, __cfa_time_t period = 0 ) {
     88void ?{}( alarm_node_t & this, thread_desc * thrd, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time ) {
    5989        this.thrd = thrd;
    6090        this.alarm = alarm;
     
    6595}
    6696
    67 void ?{}( alarm_node_t & this, processor   * proc, __cfa_time_t alarm = 0, __cfa_time_t period = 0 ) {
     97void ?{}( alarm_node_t & this, processor   * proc, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time ) {
    6898        this.proc = proc;
    6999        this.alarm = alarm;
     
    153183
    154184void register_self( alarm_node_t * this ) {
     185        alarm_list_t * alarms = &event_kernel->alarms;
     186
    155187        disable_interrupts();
    156         verify( !systemProcessor->pending_alarm );
    157         lock( &systemProcessor->alarm_lock DEBUG_CTX2 );
     188        lock( &event_kernel->lock DEBUG_CTX2 );
    158189        {
    159                 verify( validate( &systemProcessor->alarms ) );
    160                 bool first = !systemProcessor->alarms.head;
    161 
    162                 insert( &systemProcessor->alarms, this );
    163                 if( systemProcessor->pending_alarm ) {
    164                         tick_preemption();
     190                verify( validate( alarms ) );
     191                bool first = !alarms->head;
     192
     193                insert( alarms, this );
     194                if( first ) {
     195                        __kernel_set_timer( alarms->head->alarm - __kernel_get_time() );
    165196                }
    166                 if( first ) {
    167                         __kernel_set_timer( systemProcessor->alarms.head->alarm - __kernel_get_time() );
    168                 }
    169         }
    170         unlock( &systemProcessor->alarm_lock );
     197        }
     198        unlock( &event_kernel->lock );
    171199        this->set = true;
    172200        enable_interrupts( DEBUG_CTX );
     
    174202
    175203void unregister_self( alarm_node_t * this ) {
    176         // LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Kernel : unregister %p start\n", this );
    177204        disable_interrupts();
    178         lock( &systemProcessor->alarm_lock DEBUG_CTX2 );
     205        lock( &event_kernel->lock DEBUG_CTX2 );
    179206        {
    180                 verify( validate( &systemProcessor->alarms ) );
    181                 remove( &systemProcessor->alarms, this );
    182         }
    183         unlock( &systemProcessor->alarm_lock );
     207                verify( validate( &event_kernel->alarms ) );
     208                remove( &event_kernel->alarms, this );
     209        }
     210        unlock( &event_kernel->lock );
    184211        enable_interrupts( DEBUG_CTX );
    185212        this->set = false;
    186         // LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Kernel : unregister %p end\n", this );
    187 }
     213}
     214
     215// Local Variables: //
     216// mode: c //
     217// tab-width: 4 //
     218// End: //
  • src/libcfa/concurrency/alarm.h

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Fri Jun 2 11:31:25 2017
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : --
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:59:27 2017
     13// Update Count     : 3
    1514//
    1615
    17 #ifndef ALARM_H
    18 #define ALARM_H
     16#pragma once
    1917
    2018#include <stdbool.h>
     19#include <stdint.h>
    2120
    22 #include "assert"
    23 
    24 typedef unsigned long int __cfa_time_t;
     21#include <assert.h>
    2522
    2623struct thread_desc;
    2724struct processor;
    2825
     26struct timespec;
     27struct itimerval;
     28
     29//=============================================================================================
     30// time type
     31//=============================================================================================
     32
     33struct __cfa_time_t {
     34        uint64_t val;
     35};
     36
     37// ctors
     38void ?{}( __cfa_time_t & this );
     39void ?{}( __cfa_time_t & this, zero_t zero );
     40void ?{}( __cfa_time_t & this, timespec * curr );
     41void ?{}( itimerval & this, __cfa_time_t * alarm );
     42
     43__cfa_time_t ?=?( __cfa_time_t & this, zero_t rhs );
     44
     45// logical ops
     46static inline bool ?==?( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val == rhs.val; }
     47static inline bool ?!=?( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val != rhs.val; }
     48static inline bool ?>? ( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val >  rhs.val; }
     49static inline bool ?<? ( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val <  rhs.val; }
     50static inline bool ?>=?( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val >= rhs.val; }
     51static inline bool ?<=?( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val <= rhs.val; }
     52
     53static inline bool ?==?( __cfa_time_t lhs, zero_t rhs ) { return lhs.val == rhs; }
     54static inline bool ?!=?( __cfa_time_t lhs, zero_t rhs ) { return lhs.val != rhs; }
     55static inline bool ?>? ( __cfa_time_t lhs, zero_t rhs ) { return lhs.val >  rhs; }
     56static inline bool ?<? ( __cfa_time_t lhs, zero_t rhs ) { return lhs.val <  rhs; }
     57static inline bool ?>=?( __cfa_time_t lhs, zero_t rhs ) { return lhs.val >= rhs; }
     58static inline bool ?<=?( __cfa_time_t lhs, zero_t rhs ) { return lhs.val <= rhs; }
     59
     60// addition/substract
     61static inline __cfa_time_t ?+?( __cfa_time_t lhs, __cfa_time_t rhs ) {
     62        __cfa_time_t ret;
     63        ret.val = lhs.val + rhs.val;
     64        return ret;
     65}
     66
     67static inline __cfa_time_t ?-?( __cfa_time_t lhs, __cfa_time_t rhs ) {
     68        __cfa_time_t ret;
     69        ret.val = lhs.val - rhs.val;
     70        return ret;
     71}
     72
     73__cfa_time_t from_s ( uint64_t );
     74__cfa_time_t from_ms( uint64_t );
     75__cfa_time_t from_us( uint64_t );
     76__cfa_time_t from_ns( uint64_t );
     77
     78extern __cfa_time_t zero_time;
     79
    2980//=============================================================================================
    3081// Clock logic
    3182//=============================================================================================
    32 
    33 #define TIMEGRAN 1_000_000_000L                         // nanosecond granularity, except for timeval
    3483
    3584__cfa_time_t __kernel_get_time();
     
    56105typedef alarm_node_t ** __alarm_it_t;
    57106
    58 void ?{}( alarm_node_t & this, thread_desc * thrd, __cfa_time_t alarm = 0, __cfa_time_t period = 0 );
    59 void ?{}( alarm_node_t & this, processor   * proc, __cfa_time_t alarm = 0, __cfa_time_t period = 0 );
     107void ?{}( alarm_node_t & this, thread_desc * thrd, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time );
     108void ?{}( alarm_node_t & this, processor   * proc, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time );
    60109void ^?{}( alarm_node_t & this );
    61110
     
    76125void unregister_self( alarm_node_t * this );
    77126
    78 #endif
    79 
    80127// Local Variables: //
    81 // mode: CFA //
     128// mode: c //
    82129// tab-width: 6 //
    83130// End: //
  • src/libcfa/concurrency/coroutine

    rfd344aa r9236060  
    1010// Author           : Thierry Delisle
    1111// Created On       : Mon Nov 28 12:27:26 2016
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : Mon Nov 28 12:27:26 2016
    14 // Update Count     : 0
     12// Last Modified By : Peter A. Buhr
     13// Last Modified On : Sat Jul 22 09:57:17 2017
     14// Update Count     : 2
    1515//
    1616
    17 #ifndef COROUTINES_H
    18 #define COROUTINES_H
     17#pragma once
    1918
    20 #include "assert"
     19#include <assert.h>
    2120#include "invoke.h"
    2221
     
    6362
    6463// Get current coroutine
    65 extern volatile thread_local coroutine_desc * this_coroutine;
     64extern thread_local coroutine_desc * volatile this_coroutine;
    6665
    6766// Private wrappers for context switch and stack creation
     
    129128}
    130129
    131 #endif //COROUTINES_H
    132 
    133130// Local Variables: //
    134131// mode: c //
  • src/libcfa/concurrency/coroutine.c

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Mon Nov 28 12:27:26 2016
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : Mon Nov 28 12:27:26 2016
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:34:57 2017
     13// Update Count     : 1
    1514//
    1615
     
    2625}
    2726
    28 #include "kernel"
    29 #include "libhdr.h"
     27#include "kernel_private.h"
    3028
    3129#define __CFA_INVOKE_PRIVATE__
    3230#include "invoke.h"
    3331
    34 extern volatile thread_local processor * this_processor;
    3532
    3633//-----------------------------------------------------------------------------
  • src/libcfa/concurrency/invoke.c

    rfd344aa r9236060  
    1 //                              -*- Mode: C -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Tue Jan 17 12:27:26 2016
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : --
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:28:33 2017
     13// Update Count     : 1
    1514//
    1615
     
    142141#endif
    143142}
     143
     144// Local Variables: //
     145// mode: c //
     146// tab-width: 4 //
     147// End: //
  • src/libcfa/concurrency/invoke.h

    rfd344aa r9236060  
    1 //                              -*- Mode: C -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Tue Jan 17 12:27:26 2016
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : --
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:28:56 2017
     13// Update Count     : 1
    1514//
    1615
     
    130129}
    131130#endif
     131
     132// Local Variables: //
     133// mode: c //
     134// tab-width: 4 //
     135// End: //
  • src/libcfa/concurrency/kernel

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Tue Jan 17 12:27:26 2017
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : --
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:58:39 2017
     13// Update Count     : 2
    1514//
    1615
    17 #ifndef KERNEL_H
    18 #define KERNEL_H
     16#pragma once
    1917
    2018#include <stdbool.h>
     
    2826//-----------------------------------------------------------------------------
    2927// Locks
    30 bool try_lock  ( spinlock * DEBUG_CTX_PARAM2 );
    31 void lock      ( spinlock * DEBUG_CTX_PARAM2 );
    32 void lock_yield( spinlock * DEBUG_CTX_PARAM2 );
    33 void unlock    ( spinlock * );
     28void lock      ( spinlock * DEBUG_CTX_PARAM2 );       // Lock the spinlock, spin if already acquired
     29void lock_yield( spinlock * DEBUG_CTX_PARAM2 );       // Lock the spinlock, yield repeatedly if already acquired
     30bool try_lock  ( spinlock * DEBUG_CTX_PARAM2 );       // Lock the spinlock, return false if already acquired
     31void unlock    ( spinlock * );                        // Unlock the spinlock
    3432
    3533struct semaphore {
     
    4846// Cluster
    4947struct cluster {
    50         __thread_queue_t ready_queue;
    51         spinlock lock;
     48        spinlock ready_queue_lock;                      // Ready queue locks
     49        __thread_queue_t ready_queue;                   // Ready queue for threads
     50        unsigned long long int preemption;              // Preemption rate on this cluster
    5251};
    5352
     
    7675static inline void ^?{}(FinishAction & this) {}
    7776
     77// Processor
     78// Wrapper around kernel threads
    7879struct processor {
    79         struct processorCtx_t * runner;
    80         cluster * cltr;
    81         pthread_t kernel_thread;
     80        // Main state
     81        struct processorCtx_t * runner;                 // Coroutine ctx who does keeps the state of the processor
     82        cluster * cltr;                                 // Cluster from which to get threads
     83        pthread_t kernel_thread;                        // Handle to pthreads
    8284
    83         semaphore terminated;
    84         volatile bool is_terminated;
     85        // Termination
     86        volatile bool do_terminate;                     // Set to true to notify the processor should terminate
     87        semaphore terminated;                           // Termination synchronisation
    8588
    86         struct FinishAction finish;
     89        // RunThread data
     90        struct FinishAction finish;                     // Action to do after a thread is ran
    8791
    88         struct alarm_node_t * preemption_alarm;
    89         unsigned int preemption;
     92        // Preemption data
     93        struct alarm_node_t * preemption_alarm;         // Node which is added in the discrete event simulaiton
     94        bool pending_preemption;                        // If true, a preemption was triggered in an unsafe region, the processor must preempt as soon as possible
    9095
    91         bool pending_preemption;
    92 
    93         char * last_enable;
     96#ifdef __CFA_DEBUG__
     97        char * last_enable;                             // Last function to enable preemption on this processor
     98#endif
    9499};
    95100
     
    98103void ^?{}(processor & this);
    99104
    100 #endif //KERNEL_H
    101 
    102105// Local Variables: //
    103 // mode: CFA //
    104 // tab-width: 6 //
     106// mode: c //
     107// tab-width: 4 //
    105108// End: //
  • src/libcfa/concurrency/kernel.c

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Tue Jan 17 12:27:26 2017
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : --
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:33:18 2017
     13// Update Count     : 2
    1514//
    1615
     
    4241//-----------------------------------------------------------------------------
    4342// Kernel storage
    44 #define KERNEL_STORAGE(T,X) static char X##Storage[sizeof(T)]
    45 
    46 KERNEL_STORAGE(processorCtx_t, systemProcessorCtx);
    47 KERNEL_STORAGE(cluster, systemCluster);
    48 KERNEL_STORAGE(system_proc_t, systemProcessor);
    49 KERNEL_STORAGE(thread_desc, mainThread);
     43KERNEL_STORAGE(cluster,           mainCluster);
     44KERNEL_STORAGE(processor,         mainProcessor);
     45KERNEL_STORAGE(processorCtx_t,    mainProcessorCtx);
     46KERNEL_STORAGE(thread_desc,       mainThread);
    5047KERNEL_STORAGE(machine_context_t, mainThreadCtx);
    5148
    52 cluster * systemCluster;
    53 system_proc_t * systemProcessor;
     49cluster *     mainCluster;
     50processor *   mainProcessor;
    5451thread_desc * mainThread;
    5552
     
    5754// Global state
    5855
    59 volatile thread_local processor * this_processor;
    60 volatile thread_local coroutine_desc * this_coroutine;
    61 volatile thread_local thread_desc * this_thread;
     56thread_local coroutine_desc * volatile this_coroutine;
     57thread_local thread_desc *    volatile this_thread;
     58thread_local processor *      volatile this_processor;
     59
    6260volatile thread_local bool preemption_in_progress = 0;
    6361volatile thread_local unsigned short disable_preempt_count = 1;
     
    8583
    8684        this.limit = (void *)(((intptr_t)this.base) - this.size);
    87         this.context = &mainThreadCtxStorage;
     85        this.context = &storage_mainThreadCtx;
    8886        this.top = this.base;
    8987}
     
    125123
    126124void ?{}(processor & this) {
    127         this{ systemCluster };
     125        this{ mainCluster };
    128126}
    129127
     
    131129        this.cltr = cltr;
    132130        (this.terminated){ 0 };
    133         this.is_terminated = false;
     131        this.do_terminate = false;
    134132        this.preemption_alarm = NULL;
    135         this.preemption = default_preemption();
    136133        this.pending_preemption = false;
    137134
     
    142139        this.cltr = cltr;
    143140        (this.terminated){ 0 };
    144         this.is_terminated = false;
     141        this.do_terminate = false;
    145142        this.preemption_alarm = NULL;
    146         this.preemption = default_preemption();
    147143        this.pending_preemption = false;
    148144        this.kernel_thread = pthread_self();
    149145
    150146        this.runner = &runner;
    151         LIB_DEBUG_PRINT_SAFE("Kernel : constructing system processor context %p\n", &runner);
     147        LIB_DEBUG_PRINT_SAFE("Kernel : constructing main processor context %p\n", &runner);
    152148        runner{ &this };
    153149}
    154150
    155 LIB_DEBUG_DO( bool validate( alarm_list_t * this ); )
    156 
    157 void ?{}(system_proc_t & this, cluster * cltr, processorCtx_t & runner) {
    158         (this.alarms){};
    159         (this.alarm_lock){};
    160         this.pending_alarm = false;
    161 
    162         (this.proc){ cltr, runner };
    163 
    164         verify( validate( &this.alarms ) );
    165 }
    166 
    167151void ^?{}(processor & this) {
    168         if( ! this.is_terminated ) {
     152        if( ! this.do_terminate ) {
    169153                LIB_DEBUG_PRINT_SAFE("Kernel : core %p signaling termination\n", &this);
    170                 this.is_terminated = true;
     154                this.do_terminate = true;
    171155                P( &this.terminated );
    172156                pthread_join( this.kernel_thread, NULL );
     
    176160void ?{}(cluster & this) {
    177161        ( this.ready_queue ){};
    178         ( this.lock ){};
     162        ( this.ready_queue_lock ){};
     163
     164        this.preemption = default_preemption();
    179165}
    180166
     
    199185
    200186                thread_desc * readyThread = NULL;
    201                 for( unsigned int spin_count = 0; ! this->is_terminated; spin_count++ )
     187                for( unsigned int spin_count = 0; ! this->do_terminate; spin_count++ )
    202188                {
    203189                        readyThread = nextThread( this->cltr );
     
    343329        verifyf( thrd->next == NULL, "Expected null got %p", thrd->next );
    344330
    345         lock( &systemProcessor->proc.cltr->lock DEBUG_CTX2 );
    346         append( &systemProcessor->proc.cltr->ready_queue, thrd );
    347         unlock( &systemProcessor->proc.cltr->lock );
     331        lock(   &this_processor->cltr->ready_queue_lock DEBUG_CTX2 );
     332        append( &this_processor->cltr->ready_queue, thrd );
     333        unlock( &this_processor->cltr->ready_queue_lock );
    348334
    349335        verify( disable_preempt_count > 0 );
     
    352338thread_desc * nextThread(cluster * this) {
    353339        verify( disable_preempt_count > 0 );
    354         lock( &this->lock DEBUG_CTX2 );
     340        lock( &this->ready_queue_lock DEBUG_CTX2 );
    355341        thread_desc * head = pop_head( &this->ready_queue );
    356         unlock( &this->lock );
     342        unlock( &this->ready_queue_lock );
    357343        verify( disable_preempt_count > 0 );
    358344        return head;
     
    452438        // Start by initializing the main thread
    453439        // SKULLDUGGERY: the mainThread steals the process main thread
    454         // which will then be scheduled by the systemProcessor normally
    455         mainThread = (thread_desc *)&mainThreadStorage;
     440        // which will then be scheduled by the mainProcessor normally
     441        mainThread = (thread_desc *)&storage_mainThread;
    456442        current_stack_info_t info;
    457443        (*mainThread){ &info };
     
    459445        LIB_DEBUG_PRINT_SAFE("Kernel : Main thread ready\n");
    460446
    461         // Initialize the system cluster
    462         systemCluster = (cluster *)&systemClusterStorage;
    463         (*systemCluster){};
    464 
    465         LIB_DEBUG_PRINT_SAFE("Kernel : System cluster ready\n");
    466 
    467         // Initialize the system processor and the system processor ctx
     447        // Initialize the main cluster
     448        mainCluster = (cluster *)&storage_mainCluster;
     449        (*mainCluster){};
     450
     451        LIB_DEBUG_PRINT_SAFE("Kernel : main cluster ready\n");
     452
     453        // Initialize the main processor and the main processor ctx
    468454        // (the coroutine that contains the processing control flow)
    469         systemProcessor = (system_proc_t *)&systemProcessorStorage;
    470         (*systemProcessor){ systemCluster, *(processorCtx_t *)&systemProcessorCtxStorage };
    471 
    472         // Add the main thread to the ready queue
    473         // once resume is called on systemProcessor->runner the mainThread needs to be scheduled like any normal thread
    474         ScheduleThread(mainThread);
     455        mainProcessor = (processor *)&storage_mainProcessor;
     456        (*mainProcessor){ mainCluster, *(processorCtx_t *)&storage_mainProcessorCtx };
    475457
    476458        //initialize the global state variables
    477         this_processor = &systemProcessor->proc;
     459        this_processor = mainProcessor;
    478460        this_thread = mainThread;
    479461        this_coroutine = &mainThread->cor;
    480         disable_preempt_count = 1;
    481462
    482463        // Enable preemption
    483464        kernel_start_preemption();
    484465
    485         // SKULLDUGGERY: Force a context switch to the system processor to set the main thread's context to the current UNIX
     466        // Add the main thread to the ready queue
     467        // once resume is called on mainProcessor->runner the mainThread needs to be scheduled like any normal thread
     468        ScheduleThread(mainThread);
     469
     470        // SKULLDUGGERY: Force a context switch to the main processor to set the main thread's context to the current UNIX
    486471        // context. Hence, the main thread does not begin through CtxInvokeThread, like all other threads. The trick here is that
    487472        // mainThread is on the ready queue when this call is made.
    488         resume( *systemProcessor->proc.runner );
     473        resume( *mainProcessor->runner );
    489474
    490475
     
    501486        disable_interrupts();
    502487
    503         // SKULLDUGGERY: Notify the systemProcessor it needs to terminates.
     488        // SKULLDUGGERY: Notify the mainProcessor it needs to terminates.
    504489        // When its coroutine terminates, it return control to the mainThread
    505490        // which is currently here
    506         systemProcessor->proc.is_terminated = true;
     491        mainProcessor->do_terminate = true;
    507492        suspend();
    508493
     
    512497        kernel_stop_preemption();
    513498
    514         // Destroy the system processor and its context in reverse order of construction
     499        // Destroy the main processor and its context in reverse order of construction
    515500        // These were manually constructed so we need manually destroy them
    516         ^(*systemProcessor->proc.runner){};
    517         ^(systemProcessor){};
     501        ^(*mainProcessor->runner){};
     502        ^(mainProcessor){};
    518503
    519504        // Final step, destroy the main thread since it is no longer needed
     
    699684        return top;
    700685}
     686
    701687// Local Variables: //
    702688// mode: c //
  • src/libcfa/concurrency/kernel_private.h

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Mon Feb 13 12:27:26 2017
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : --
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:58:09 2017
     13// Update Count     : 2
    1514//
    1615
    17 #ifndef KERNEL_PRIVATE_H
    18 #define KERNEL_PRIVATE_H
     16#pragma once
    1917
    2018#include "libhdr.h"
     
    3129extern "C" {
    3230        void disable_interrupts();
    33         void enable_interrupts_noRF();
     31        void enable_interrupts_noPoll();
    3432        void enable_interrupts( DEBUG_CTX_PARAM );
    3533}
     
    4543thread_desc * nextThread(cluster * this);
    4644
     45//Block current thread and release/wake-up the following resources
    4746void BlockInternal(void);
    4847void BlockInternal(spinlock * lock);
     
    6564void spin(processor * this, unsigned int * spin_count);
    6665
    67 struct system_proc_t {
    68         processor proc;
    69 
     66struct event_kernel_t {
    7067        alarm_list_t alarms;
    71         spinlock alarm_lock;
    72 
    73         bool pending_alarm;
     68        spinlock lock;
    7469};
    7570
    76 extern cluster * systemCluster;
    77 extern system_proc_t * systemProcessor;
    78 extern volatile thread_local processor * this_processor;
    79 extern volatile thread_local coroutine_desc * this_coroutine;
    80 extern volatile thread_local thread_desc * this_thread;
     71extern event_kernel_t * event_kernel;
     72
     73extern thread_local coroutine_desc * volatile this_coroutine;
     74extern thread_local thread_desc *    volatile this_thread;
     75extern thread_local processor *      volatile this_processor;
     76
    8177extern volatile thread_local bool preemption_in_progress;
    8278extern volatile thread_local unsigned short disable_preempt_count;
     
    9187extern void ThreadCtxSwitch(coroutine_desc * src, coroutine_desc * dst);
    9288
    93 #endif //KERNEL_PRIVATE_H
     89//-----------------------------------------------------------------------------
     90// Utils
     91#define KERNEL_STORAGE(T,X) static char storage_##X[sizeof(T)]
    9492
    9593// Local Variables: //
  • src/libcfa/concurrency/monitor

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Thd Feb 23 12:27:26 2017
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : --
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:59:01 2017
     13// Update Count     : 3
    1514//
    1615
    17 #ifndef MONITOR_H
    18 #define MONITOR_H
     16#pragma once
    1917
    2018#include <stddef.h>
    2119
    22 #include "assert"
     20#include <assert.h>
    2321#include "invoke.h"
    2422#include "stdlib"
     
    9997void __accept_internal( unsigned short count, __acceptable_t * acceptables, void (*func)(void) );
    10098
    101 #endif //MONITOR_H
     99// Local Variables: //
     100// mode: c //
     101// tab-width: 4 //
     102// End: //
  • src/libcfa/concurrency/monitor.c

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Thd Feb 23 12:27:26 2017
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : --
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Mon Jul 31 14:59:05 2017
     13// Update Count     : 3
    1514//
    1615
     
    485484        if( !this->monitors ) {
    486485                // LIB_DEBUG_PRINT_SAFE("Branding\n");
    487                 assertf( thrd->current_monitors != NULL, "No current monitor to brand condition", thrd->current_monitors );
     486                assertf( thrd->current_monitors != NULL, "No current monitor to brand condition %p", thrd->current_monitors );
    488487                this->monitor_count = thrd->current_monitor_count;
    489488
     
    528527        return head;
    529528}
     529
     530// Local Variables: //
     531// mode: c //
     532// tab-width: 4 //
     533// End: //
  • src/libcfa/concurrency/preemption.c

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Mon Jun 5 14:20:42 2017
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : --
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:36:05 2017
     13// Update Count     : 2
    1514//
    1615
     
    3433#endif
    3534
     35//TODO move to defaults
    3636#define __CFA_DEFAULT_PREEMPTION__ 10000
    3737
     38//TODO move to defaults
    3839__attribute__((weak)) unsigned int default_preemption() {
    3940        return __CFA_DEFAULT_PREEMPTION__;
    4041}
    4142
     43// Short hands for signal context information
    4244#define __CFA_SIGCXT__ ucontext_t *
    4345#define __CFA_SIGPARMS__ __attribute__((unused)) int sig, __attribute__((unused)) siginfo_t *sfp, __attribute__((unused)) __CFA_SIGCXT__ cxt
    4446
     47// FwdDeclarations : timeout handlers
    4548static void preempt( processor   * this );
    4649static void timeout( thread_desc * this );
    4750
     51// FwdDeclarations : Signal handlers
    4852void sigHandler_ctxSwitch( __CFA_SIGPARMS__ );
    49 void sigHandler_alarm    ( __CFA_SIGPARMS__ );
    5053void sigHandler_segv     ( __CFA_SIGPARMS__ );
    5154void sigHandler_abort    ( __CFA_SIGPARMS__ );
    5255
     56// FwdDeclarations : sigaction wrapper
    5357static void __kernel_sigaction( int sig, void (*handler)(__CFA_SIGPARMS__), int flags );
    54 LIB_DEBUG_DO( bool validate( alarm_list_t * this ); )
    55 
     58
     59// FwdDeclarations : alarm thread main
     60void * alarm_loop( __attribute__((unused)) void * args );
     61
     62// Machine specific register name
    5663#ifdef __x86_64__
    5764#define CFA_REG_IP REG_RIP
     
    6067#endif
    6168
     69KERNEL_STORAGE(event_kernel_t, event_kernel);         // private storage for event kernel
     70event_kernel_t * event_kernel;                        // kernel public handle to even kernel
     71static pthread_t alarm_thread;                        // pthread handle to alarm thread
     72
     73void ?{}(event_kernel_t & this) {
     74        (this.alarms){};
     75        (this.lock){};
     76}
    6277
    6378//=============================================================================================
     
    6580//=============================================================================================
    6681
     82// Get next expired node
     83static inline alarm_node_t * get_expired( alarm_list_t * alarms, __cfa_time_t currtime ) {
     84        if( !alarms->head ) return NULL;                          // If no alarms return null
     85        if( alarms->head->alarm >= currtime ) return NULL;        // If alarms head not expired return null
     86        return pop(alarms);                                       // Otherwise just pop head
     87}
     88
     89// Tick one frame of the Discrete Event Simulation for alarms
    6790void tick_preemption() {
    68         // LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Ticking preemption\n" );
    69 
    70         alarm_list_t * alarms = &systemProcessor->alarms;
    71         __cfa_time_t currtime = __kernel_get_time();
    72         while( alarms->head && alarms->head->alarm < currtime ) {
    73                 alarm_node_t * node = pop(alarms);
    74                 // LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Ticking %p\n", node );
    75 
     91        alarm_node_t * node = NULL;                     // Used in the while loop but cannot be declared in the while condition
     92        alarm_list_t * alarms = &event_kernel->alarms;  // Local copy for ease of reading
     93        __cfa_time_t currtime = __kernel_get_time();    // Check current time once so we everything "happens at once"
     94
     95        //Loop throught every thing expired
     96        while( node = get_expired( alarms, currtime ) ) {
     97
     98                // Check if this is a kernel
    7699                if( node->kernel_alarm ) {
    77100                        preempt( node->proc );
     
    81104                }
    82105
    83                 verify( validate( alarms ) );
    84 
    85                 if( node->period > 0 ) {
    86                         node->alarm = currtime + node->period;
    87                         insert( alarms, node );
     106                // Check if this is a periodic alarm
     107                __cfa_time_t period = node->period;
     108                if( period > 0 ) {
     109                        node->alarm = currtime + period;    // Alarm is periodic, add currtime to it (used cached current time)
     110                        insert( alarms, node );             // Reinsert the node for the next time it triggers
    88111                }
    89112                else {
    90                         node->set = false;
    91                 }
    92         }
    93 
    94         if( alarms->head ) {
    95                 __kernel_set_timer( alarms->head->alarm - currtime );
    96         }
    97 
    98         verify( validate( alarms ) );
    99         // LIB_DEBUG_PRINT_BUFFER_LOCAL( STDERR_FILENO, "Ticking preemption done\n" );
    100 }
    101 
     113                        node->set = false;                  // Node is one-shot, just mark it as not pending
     114                }
     115        }
     116
     117        // If there are still alarms pending, reset the timer
     118        if( alarms->head ) { __kernel_set_timer( alarms->head->alarm - currtime ); }
     119}
     120
     121// Update the preemption of a processor and notify interested parties
    102122void update_preemption( processor * this, __cfa_time_t duration ) {
    103         LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO, "Processor : %p updating preemption to %lu\n", this, duration );
    104 
    105123        alarm_node_t * alarm = this->preemption_alarm;
    106         duration *= 1000;
    107124
    108125        // Alarms need to be enabled
     
    134151
    135152extern "C" {
     153        // Disable interrupts by incrementing the counter
    136154        void disable_interrupts() {
    137155                __attribute__((unused)) unsigned short new_val = __atomic_add_fetch_2( &disable_preempt_count, 1, __ATOMIC_SEQ_CST );
    138                 verify( new_val < (unsigned short)65_000 );
    139                 verify( new_val != (unsigned short) 0 );
    140         }
    141 
    142         void enable_interrupts_noRF() {
    143                 __attribute__((unused)) unsigned short prev = __atomic_fetch_add_2( &disable_preempt_count, -1, __ATOMIC_SEQ_CST );
    144                 verify( prev != (unsigned short) 0 );
    145         }
    146 
     156                verify( new_val < 65_000u );              // If this triggers someone is disabling interrupts without enabling them
     157        }
     158
     159        // Enable interrupts by decrementing the counter
     160        // If counter reaches 0, execute any pending CtxSwitch
    147161        void enable_interrupts( DEBUG_CTX_PARAM ) {
    148                 processor * proc   = this_processor;
    149                 thread_desc * thrd = this_thread;
     162                processor * proc   = this_processor;      // Cache the processor now since interrupts can start happening after the atomic add
     163                thread_desc * thrd = this_thread;         // Cache the thread now since interrupts can start happening after the atomic add
     164
    150165                unsigned short prev = __atomic_fetch_add_2( &disable_preempt_count, -1, __ATOMIC_SEQ_CST );
    151                 verify( prev != (unsigned short) 0 );
     166                verify( prev != 0u );                     // If this triggers someone is enabled already enabled interruptsverify( prev != 0u );
     167
     168                // Check if we need to prempt the thread because an interrupt was missed
    152169                if( prev == 1 && proc->pending_preemption ) {
    153170                        proc->pending_preemption = false;
     
    155172                }
    156173
     174                // For debugging purposes : keep track of the last person to enable the interrupts
    157175                LIB_DEBUG_DO( proc->last_enable = caller; )
    158176        }
    159 }
    160 
     177
     178        // Disable interrupts by incrementint the counter
     179        // Don't execute any pending CtxSwitch even if counter reaches 0
     180        void enable_interrupts_noPoll() {
     181                __attribute__((unused)) unsigned short prev = __atomic_fetch_add_2( &disable_preempt_count, -1, __ATOMIC_SEQ_CST );
     182                verify( prev != 0u );                     // If this triggers someone is enabled already enabled interrupts
     183        }
     184}
     185
     186// sigprocmask wrapper : unblock a single signal
    161187static inline void signal_unblock( int sig ) {
    162188        sigset_t mask;
     
    169195}
    170196
     197// sigprocmask wrapper : block a single signal
    171198static inline void signal_block( int sig ) {
    172199        sigset_t mask;
     
    179206}
    180207
    181 static inline bool preemption_ready() {
    182         return disable_preempt_count == 0 && !preemption_in_progress;
    183 }
    184 
    185 static inline void defer_ctxSwitch() {
    186         this_processor->pending_preemption = true;
    187 }
    188 
    189 static inline void defer_alarm() {
    190         systemProcessor->pending_alarm = true;
    191 }
    192 
     208// kill wrapper : signal a processor
    193209static void preempt( processor * this ) {
    194210        pthread_kill( this->kernel_thread, SIGUSR1 );
    195211}
    196212
     213// reserved for future use
    197214static void timeout( thread_desc * this ) {
    198215        //TODO : implement waking threads
    199216}
    200217
     218
     219// Check if a CtxSwitch signal handler shoud defer
     220// If true  : preemption is safe
     221// If false : preemption is unsafe and marked as pending
     222static inline bool preemption_ready() {
     223        bool ready = disable_preempt_count == 0 && !preemption_in_progress; // Check if preemption is safe
     224        this_processor->pending_preemption = !ready;                        // Adjust the pending flag accordingly
     225        return ready;
     226}
     227
    201228//=============================================================================================
    202229// Kernel Signal Startup/Shutdown logic
    203230//=============================================================================================
    204231
    205 static pthread_t alarm_thread;
    206 void * alarm_loop( __attribute__((unused)) void * args );
    207 
     232// Startup routine to activate preemption
     233// Called from kernel_startup
    208234void kernel_start_preemption() {
    209235        LIB_DEBUG_PRINT_SAFE("Kernel : Starting preemption\n");
    210         __kernel_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO );
    211         // __kernel_sigaction( SIGSEGV, sigHandler_segv     , SA_SIGINFO );
    212         // __kernel_sigaction( SIGBUS , sigHandler_segv     , SA_SIGINFO );
     236
     237        // Start with preemption disabled until ready
     238        disable_preempt_count = 1;
     239
     240        // Initialize the event kernel
     241        event_kernel = (event_kernel_t *)&storage_event_kernel;
     242        (*event_kernel){};
     243
     244        // Setup proper signal handlers
     245        __kernel_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO );         // CtxSwitch handler
     246        // __kernel_sigaction( SIGSEGV, sigHandler_segv     , SA_SIGINFO );      // Failure handler
     247        // __kernel_sigaction( SIGBUS , sigHandler_segv     , SA_SIGINFO );      // Failure handler
    213248
    214249        signal_block( SIGALRM );
     
    217252}
    218253
     254// Shutdown routine to deactivate preemption
     255// Called from kernel_shutdown
    219256void kernel_stop_preemption() {
    220257        LIB_DEBUG_PRINT_SAFE("Kernel : Preemption stopping\n");
    221258
     259        // Block all signals since we are already shutting down
    222260        sigset_t mask;
    223261        sigfillset( &mask );
    224262        sigprocmask( SIG_BLOCK, &mask, NULL );
    225263
     264        // Notify the alarm thread of the shutdown
    226265        sigval val = { 1 };
    227266        pthread_sigqueue( alarm_thread, SIGALRM, val );
     267
     268        // Wait for the preemption thread to finish
    228269        pthread_join( alarm_thread, NULL );
     270
     271        // Preemption is now fully stopped
     272
    229273        LIB_DEBUG_PRINT_SAFE("Kernel : Preemption stopped\n");
    230274}
    231275
     276// Raii ctor/dtor for the preemption_scope
     277// Used by thread to control when they want to receive preemption signals
    232278void ?{}( preemption_scope & this, processor * proc ) {
    233         (this.alarm){ proc };
     279        (this.alarm){ proc, zero_time, zero_time };
    234280        this.proc = proc;
    235281        this.proc->preemption_alarm = &this.alarm;
    236         update_preemption( this.proc, this.proc->preemption );
     282
     283        update_preemption( this.proc, from_us(this.proc->cltr->preemption) );
    237284}
    238285
     
    240287        disable_interrupts();
    241288
    242         update_preemption( this.proc, 0 );
     289        update_preemption( this.proc, zero_time );
    243290}
    244291
     
    247294//=============================================================================================
    248295
     296// Context switch signal handler
     297// Receives SIGUSR1 signal and causes the current thread to yield
    249298void sigHandler_ctxSwitch( __CFA_SIGPARMS__ ) {
    250299        LIB_DEBUG_DO( last_interrupt = (void *)(cxt->uc_mcontext.gregs[CFA_REG_IP]); )
    251         if( preemption_ready() ) {
    252                 preemption_in_progress = true;
    253                 signal_unblock( SIGUSR1 );
    254                 this_processor->pending_preemption = false;
    255                 preemption_in_progress = false;
    256                 BlockInternal( (thread_desc*)this_thread );
    257         }
    258         else {
    259                 defer_ctxSwitch();
    260         }
    261 }
    262 
     300
     301        // Check if it is safe to preempt here
     302        if( !preemption_ready() ) { return; }
     303
     304        preemption_in_progress = true;                      // Sync flag : prevent recursive calls to the signal handler
     305        signal_unblock( SIGUSR1 );                          // We are about to CtxSwitch out of the signal handler, let other handlers in
     306        preemption_in_progress = false;                     // Clear the in progress flag
     307
     308        // Preemption can occur here
     309
     310        BlockInternal( (thread_desc*)this_thread );         // Do the actual CtxSwitch
     311}
     312
     313// Main of the alarm thread
     314// Waits on SIGALRM and send SIGUSR1 to whom ever needs it
    263315void * alarm_loop( __attribute__((unused)) void * args ) {
     316        // Block sigalrms to control when they arrive
    264317        sigset_t mask;
    265318        sigemptyset( &mask );
     
    270323        }
    271324
     325        // Main loop
    272326        while( true ) {
     327                // Wait for a sigalrm
    273328                siginfo_t info;
    274329                int sig = sigwaitinfo( &mask, &info );
    275                 if( sig < 0 ) {
    276                         abortf( "internal error, sigwait" );
    277                 }
    278                 else if( sig == SIGALRM )
     330
     331                // If another signal arrived something went wrong
     332                assertf(sig == SIGALRM, "Kernel Internal Error, sigwait: Unexpected signal %d (%d : %d)\n", sig, info.si_code, info.si_value.sival_int);
     333
     334                LIB_DEBUG_PRINT_SAFE("Kernel : Caught alarm from %d with %d\n", info.si_code, info.si_value.sival_int );
     335                // Switch on the code (a.k.a. the sender) to
     336                switch( info.si_code )
    279337                {
    280                         LIB_DEBUG_PRINT_SAFE("Kernel : Caught signal %d (%d)\n", sig, info.si_value.sival_int );
    281                         if( info.si_value.sival_int == 0 )
    282                         {
    283                                 LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread tick\n");
    284                                 lock( &systemProcessor->alarm_lock DEBUG_CTX2 );
    285                                 tick_preemption();
    286                                 unlock( &systemProcessor->alarm_lock );
    287                         }
    288                         else if( info.si_value.sival_int == 1 )
    289                         {
    290                                 break;
    291                         }
    292                 }
    293                 else
    294                 {
    295                         LIB_DEBUG_PRINT_SAFE("Kernel : Unexpected signal %d (%d)\n", sig, info.si_value.sival_int);
    296                 }
    297         }
    298 
     338                // Timers can apparently be marked as sent for the kernel
     339                // In either case, tick preemption
     340                case SI_TIMER:
     341                case SI_KERNEL:
     342                        LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread tick\n");
     343                        lock( &event_kernel->lock DEBUG_CTX2 );
     344                        tick_preemption();
     345                        unlock( &event_kernel->lock );
     346                        break;
     347                // Signal was not sent by the kernel but by an other thread
     348                case SI_QUEUE:
     349                        // For now, other thread only signal the alarm thread to shut it down
     350                        // If this needs to change use info.si_value and handle the case here
     351                        goto EXIT;
     352                }
     353        }
     354
     355EXIT:
    299356        LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread stopping\n");
    300357        return NULL;
    301358}
    302359
     360// Sigaction wrapper : register an signal handler
    303361static void __kernel_sigaction( int sig, void (*handler)(__CFA_SIGPARMS__), int flags ) {
    304362        struct sigaction act;
     
    316374}
    317375
    318 typedef void (*sa_handler_t)(int);
    319 
     376// Sigaction wrapper : restore default handler
    320377static void __kernel_sigdefault( int sig ) {
    321378        struct sigaction act;
    322379
    323         // act.sa_handler = SIG_DFL;
     380        act.sa_handler = SIG_DFL;
    324381        act.sa_flags = 0;
    325382        sigemptyset( &act.sa_mask );
     
    429486//      raise( SIGABRT );
    430487// }
     488
     489// Local Variables: //
     490// mode: c //
     491// tab-width: 4 //
     492// End: //
  • src/libcfa/concurrency/preemption.h

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Mon Jun 5 14:20:42 2017
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : --
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:34:25 2017
     13// Update Count     : 1
    1514//
    1615
    17 #ifndef PREEMPTION_H
    18 #define PREEMPTION_H
     16#pragma once
    1917
    2018#include "alarm.h"
     
    3533void ^?{}( preemption_scope & this );
    3634
    37 #endif //PREEMPTION_H
     35// Local Variables: //
     36// mode: c //
     37// tab-width: 4 //
     38// End: //
  • src/libcfa/concurrency/thread

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Tue Jan 17 12:27:26 2017
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : --
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:59:40 2017
     13// Update Count     : 3
    1514//
    1615
    17 #ifndef THREADS_H
    18 #define THREADS_H
     16#pragma once
    1917
    20 #include "assert"
     18#include <assert.h>
    2119#include "invoke.h"
    2220
     
    5452}
    5553
    56 extern volatile thread_local thread_desc * this_thread;
     54extern thread_local thread_desc * volatile this_thread;
    5755
    5856forall( dtype T | is_thread(T) )
     
    8482void yield( unsigned times );
    8583
    86 #endif //THREADS_H
    87 
    8884// Local Variables: //
    8985// mode: c //
  • src/libcfa/concurrency/thread.c

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Tue Jan 17 12:27:26 2017
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : --
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:34:46 2017
     13// Update Count     : 1
    1514//
    1615
     
    8786
    8887void yield( void ) {
    89         BlockInternal( (thread_desc *)this_thread );
     88        BlockInternal( this_thread );
    9089}
    9190
  • src/libcfa/containers/maybe

    rfd344aa r9236060  
    99// Author           : Andrew Beach
    1010// Created On       : Wed May 24 14:43:00 2017
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Jun 16 15:42:00 2017
    13 // Update Count     : 2
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 10:00:52 2017
     13// Update Count     : 4
    1414//
    1515
    16 
    17 #ifndef MAYBE_H
    18 #define MAYBE_H
     16#pragma once
    1917
    2018#include <stdbool.h>
     
    6664void set_none(maybe(T) * this);
    6765
    68 #endif // MAYBE_H
     66// Local Variables: //
     67// mode: c //
     68// tab-width: 4 //
     69// End: //
  • src/libcfa/containers/maybe.c

    rfd344aa r9236060  
    99// Author           : Andrew Beach
    1010// Created On       : Wed May 24 15:40:00 2017
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Thr May 25 15:24:00 2017
    13 // Update Count     : 1
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu Jul 20 15:23:50 2017
     13// Update Count     : 2
    1414//
    1515
    1616#include <containers/maybe>
    17 #include <assert>
     17#include <assert.h>
    1818
    1919
  • src/libcfa/containers/pair

    rfd344aa r9236060  
    99// Author           : Aaron Moss
    1010// Created On       : Wed Apr 12 15:32:00 2017
    11 // Last Modified By : Aaron Moss
    12 // Last Modified On : Wed Apr 12 15:32:00 2017
    13 // Update Count     : 1
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:59:53 2017
     13// Update Count     : 2
    1414//
    1515
    16 #ifndef PAIR_H
    17 #define PAIR_H
     16#pragma once
    1817
    1918forall(otype R, otype S) struct pair {
     
    4443int ?>=?(pair(R, S) p, pair(R, S) q);
    4544
    46 #endif // PAIR_H
    47 
    4845// Local Variables: //
    4946// mode: c //
  • src/libcfa/containers/result

    rfd344aa r9236060  
    99// Author           : Andrew Beach
    1010// Created On       : Wed May 24 14:45:00 2017
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Jun 16 15:41:00 2017
    13 // Update Count     : 2
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 10:00:44 2017
     13// Update Count     : 3
    1414//
    1515
    16 
    17 #ifndef RESULT_H
    18 #define RESULT_H
     16#pragma once
    1917
    2018#include <stdbool.h>
     
    7876void set_error(result(T, E) * this, E error);
    7977
    80 #endif // RESULT_H
     78// Local Variables: //
     79// mode: c //
     80// tab-width: 4 //
     81// End: //
  • src/libcfa/containers/result.c

    rfd344aa r9236060  
    99// Author           : Andrew Beach
    1010// Created On       : Wed May 24 15:40:00 2017
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Thr May 25 15:27:00 2017
    13 // Update Count     : 1
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu Jul 20 15:23:58 2017
     13// Update Count     : 2
    1414//
    1515
    1616#include <containers/result>
    17 #include <assert>
     17#include <assert.h>
    1818
    1919
  • src/libcfa/containers/vector

    rfd344aa r9236060  
    1010// Created On       : Tue Jul  5 18:00:07 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Jul  5 18:01:35 2016
    13 // Update Count     : 2
     12// Last Modified On : Sat Jul 22 10:01:18 2017
     13// Update Count     : 3
    1414//
    1515
    16 #ifndef VECTOR_H
    17 #define VECTOR_H
     16#pragma once
    1817
    1918extern "C" {
     
    166165// }
    167166
    168 #endif // VECTOR_H
    169 
    170167// Local Variables: //
    171168// mode: c //
  • src/libcfa/exception.c

    rfd344aa r9236060  
    1010// Created On       : Mon Jun 26 15:13:00 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Tus Jul 11 16:36:00 2017
    13 // Update Count     : 1
     12// Last Modified On : Fri Aug  4 15:20:00 2017
     13// Update Count     : 6
    1414//
     15
     16#include <stddef.h> // for size_t
    1517
    1618#include "exception.h"
     
    2224#include <unwind.h>
    2325
     26// FIX ME: temporary hack to keep ARM build working
     27#ifndef _URC_FATAL_PHASE1_ERROR
     28#define _URC_FATAL_PHASE1_ERROR 2
     29#endif // ! _URC_FATAL_PHASE1_ERROR
     30#ifndef _URC_FATAL_PHASE2_ERROR
     31#define _URC_FATAL_PHASE2_ERROR 2
     32#endif // ! _URC_FATAL_PHASE2_ERROR
     33
    2434#include "lsda.h"
    2535
     36
     37// Base exception vtable is abstract, you should not have base exceptions.
     38struct __cfaehm__base_exception_t_vtable
     39                ___cfaehm__base_exception_t_vtable_instance = {
     40        .parent = NULL,
     41        .size = 0,
     42        .copy = NULL,
     43        .free = NULL,
     44        .msg = NULL
     45};
     46
     47
    2648// Temperary global exception context. Does not work with concurency.
    27 struct shared_stack_t {
     49struct exception_context_t {
    2850    struct __cfaehm__try_resume_node * top_resume;
    2951    struct __cfaehm__try_resume_node * current_resume;
    3052
    31     exception current_exception;
     53    exception * current_exception;
    3254    int current_handler_index;
    3355} shared_stack = {NULL, NULL, 0, 0};
    3456
    35 
    36 
    37 // This macro should be the only thing that needs to change across machines.
    38 // Used in the personality function, way down in termination.
     57// Get the current exception context.
     58// There can be a single global until multithreading occurs, then each stack
     59// needs its own. It will have to be updated to handle that.
     60struct 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
     69
     70// This macro should be the only thing that needs to change across machines.  Used in the personality function, way down
     71// in termination.
    3972// struct _Unwind_Context * -> _Unwind_Reason_Code(*)(exception *)
    4073#define MATCHER_FROM_CONTEXT(ptr_to_context) \
     
    4780
    4881        // DEBUG
    49         printf("Throwing resumption exception %d\n", *except);
     82        printf("Throwing resumption exception\n");
    5083
    5184        struct __cfaehm__try_resume_node * original_head = shared_stack.current_resume;
     
    6194        }
    6295
    63         printf("Unhandled exception %d\n", *except);
     96        printf("Unhandled exception\n");
    6497        shared_stack.current_resume = original_head;
    6598
     
    69102}
    70103
    71 /* Do we control where exceptions get thrown even with concurency?
    72  * If not these are not quite thread safe, the cleanup hook has to be added
    73  * after the node is built but before it is made the top node.
    74  */
     104// Do we control where exceptions get thrown even with concurency?  If not these are not quite thread safe, the cleanup
     105// hook has to be added after the node is built but before it is made the top node.
     106
    75107void __cfaehm__try_resume_setup(struct __cfaehm__try_resume_node * node,
    76108                        int (*handler)(exception * except)) {
     
    87119// TERMINATION ===============================================================
    88120
    89 // Requires -fexceptions to work.
    90 
    91 // Global which defines the current exception
    92 // Currently an int just to make matching easier
    93 //int this_exception; (became shared_stack.current_exception)
     121// MEMORY MANAGEMENT (still for integers)
     122// May have to move to cfa for constructors and destructors (references).
     123
     124struct __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.
     132static 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.
     153static 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.
     181void __cfaehm__cleanup_terminate( void * except ) {
     182        if ( *(void**)except ) __cfaehm__delete_exception( *(exception**)except );
     183}
     184
    94185
    95186// We need a piece of storage to raise the exception
     
    111202}
    112203
    113 void __cfaehm__throw_terminate( exception * val ) {
    114         // Store the current exception
    115         shared_stack.current_exception = *val;
    116 
    117         // DEBUG
    118         printf("Throwing termination exception %d\n", *val);
     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
    119211
    120212        // Call stdlibc to raise the exception
    121213        _Unwind_Reason_Code ret = _Unwind_RaiseException( &this_exception_storage );
    122214
    123         // If we reach here it means something happened
    124         // For resumption to work we need to find a way to return back to here
    125         // Most of them will probably boil down to setting a global flag and making the phase 1 either stop or fail.
    126         // Causing an error on purpose may help avoiding unnecessary work but it might have some weird side effects.
    127         // If we just pretend no handler was found that would work but may be expensive for no reason since we will always
    128         // search the whole stack
     215        // If we reach here it means something happened.  For resumption to work we need to find a way to return back to
     216        // here.  Most of them will probably boil down to setting a global flag and making the phase 1 either stop or
     217        // fail.  Causing an error on purpose may help avoiding unnecessary work but it might have some weird side
     218        // effects.  If we just pretend no handler was found that would work but may be expensive for no reason since we
     219        // will always search the whole stack.
    129220
    130221        if( ret == _URC_END_OF_STACK ) {
    131                 // No proper handler was found
    132                 // This can be handled in several way
    133                 // C++ calls std::terminate
    134                 // Here we force unwind the stack, basically raising a cancellation
     222                // No proper handler was found.  This can be handled in several way.  C++ calls std::terminate Here we
     223                // force unwind the stack, basically raising a cancellation.
    135224                printf("Uncaught exception %p\n", &this_exception_storage);
    136225
     
    140229        }
    141230
    142         // We did not simply reach the end of the stack without finding a handler,
    143         // Something wen't wrong
     231        // We did not simply reach the end of the stack without finding a handler.  Something wen't wrong
    144232        printf("UNWIND ERROR %d after raise exception\n", ret);
    145233        abort();
    146234}
    147235
    148 // Nesting this the other way would probably be faster.
     236void __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
    149244void __cfaehm__rethrow_terminate(void) {
    150245        // DEBUG
    151246        printf("Rethrowing termination exception\n");
    152247
    153         __cfaehm__throw_terminate(&shared_stack.current_exception);
    154 }
    155 
    156 // This is our personality routine
    157 // For every stack frame anotated with ".cfi_personality 0x3,__gcfa_personality_v0"
    158 // This function will be called twice when unwinding
    159 // Once in the search phased and once in the cleanup phase
     248        __cfaehm__begin_unwind();
     249}
     250
     251// This is our personality routine.  For every stack frame anotated with ".cfi_personality 0x3,__gcfa_personality_v0".
     252// This function will be called twice when unwinding.  Once in the search phased and once in the cleanup phase.
    160253_Unwind_Reason_Code __gcfa_personality_v0 (
    161254                int version, _Unwind_Action actions, unsigned long long exceptionClass,
     
    263356                                        _Unwind_Reason_Code (*matcher)(exception *) =
    264357                                                MATCHER_FROM_CONTEXT(context);
    265                                         int index = matcher(&shared_stack.current_exception);
     358                                        int index = matcher(shared_stack.current_exception);
    266359                                        _Unwind_Reason_Code ret = (0 == index)
    267360                                                ? _URC_CONTINUE_UNWIND : _URC_HANDLER_FOUND;
     
    293386                                // I assume this sets the instruction pointer to the adress of the landing pad
    294387                                // It doesn't actually set it, it only state the value that needs to be set once we return _URC_INSTALL_CONTEXT
    295                                 _Unwind_SetIP( context, lsd_info.LPStart + callsite_landing_pad );
     388                                _Unwind_SetIP( context, ((lsd_info.LPStart) + (callsite_landing_pad)) );
    296389
    297390                                // DEBUG
     
    317410}
    318411
    319 // Try statements are hoisted out see comments for details
    320 // With this could probably be unique and simply linked from
    321 // libcfa but there is one problem left, see the exception table
    322 // for details
     412// Try statements are hoisted out see comments for details.  With this could probably be unique and simply linked from
     413// libcfa but there is one problem left, see the exception table for details
    323414__attribute__((noinline))
    324415void __cfaehm__try_terminate(void (*try_block)(),
     
    328419        //! printf("%p %p %p %p\n", &try_block, &catch_block, &match_block, &xy);
    329420
    330         // Setup statments
    331         // These 2 statments won't actually result in any code,
    332         // they only setup global tables.
    333         // However, they clobber gcc cancellation support from gcc.
    334         // We can replace the personality routine but replacing the exception
    335         // table gcc generates is not really doable, it generates labels based
    336         // on how the assembly works.
     421        // Setup statments: These 2 statments won't actually result in any code, they only setup global tables.
     422        // However, they clobber gcc cancellation support from gcc.  We can replace the personality routine but
     423        // replacing the exception table gcc generates is not really doable, it generates labels based on how the
     424        // assembly works.
     425
    337426        // Setup the personality routine
    338427        asm volatile (".cfi_personality 0x3,__gcfa_personality_v0");
     
    340429        asm volatile (".cfi_lsda 0x3, .LLSDACFA2");
    341430
    342         // Label which defines the start of the area for which the handler is setup
     431        // Label which defines the start of the area for which the handler is setup.
    343432        asm volatile (".TRYSTART:");
    344433
     
    354443        // Exceptionnal path
    355444        CATCH : __attribute__(( unused ));
    356         // Label which defines the end of the area for which the handler is setup
     445        // Label which defines the end of the area for which the handler is setup.
    357446        asm volatile (".TRYEND:");
    358         // Label which defines the start of the exception landing pad
    359         // basically what will be called when the exception is caught
    360         // Note, if multiple handlers are given, the multiplexing should be done
    361         // by the generated code, not the exception runtime
     447        // Label which defines the start of the exception landing pad.  Basically what is called when the exception is
     448        // caught.  Note, if multiple handlers are given, the multiplexing should be done by the generated code, not the
     449        // exception runtime.
    362450        asm volatile (".CATCH:");
    363451
    364452        // Exception handler
    365         catch_block(shared_stack.current_handler_index,
    366                     &shared_stack.current_exception);
    367 }
    368 
    369 // Exception table data we need to generate
    370 // While this is almost generic, the custom data refers to
    371 // foo_try_match try match, which is no way generic
    372 // Some more works need to be done if we want to have a single
    373 // call to the try routine
     453        catch_block( shared_stack.current_handler_index,
     454                     shared_stack.current_exception );
     455}
     456
     457// Exception table data we need to generate.  While this is almost generic, the custom data refers to foo_try_match try
     458// match, which is no way generic.  Some more works need to be done if we want to have a single call to the try routine.
     459
     460#if defined( __x86_64__ ) || defined( __i386__ )
    374461asm (
    375462        //HEADER
     
    394481//      "       .section        .note.GNU-stack,\"x\",@progbits\n"
    395482);
     483#endif // __x86_64__ || __i386__
  • src/libcfa/exception.h

    rfd344aa r9236060  
    1010// Created On       : Mon Jun 26 15:11:00 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Tus Jul 11 16:31:00 2017
    13 // Update Count     : 2
     12// Last Modified On : Fri Aug  4 15:20:00 2017
     13// Update Count     : 5
    1414//
    1515
    16 #ifndef EXCEPTION_H
    17 #define EXCEPTION_H
     16#pragma once
    1817
    19 
    20 // Later to be a special structure type.
    21 typedef int exception;
    2218
    2319#ifdef __CFORALL__
    2420extern "C" {
    2521#endif
     22
     23struct __cfaehm__base_exception_t;
     24typedef struct __cfaehm__base_exception_t exception;
     25struct __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};
     33struct __cfaehm__base_exception_t {
     34        struct __cfaehm__base_exception_t_vtable const * virtual_table;
     35};
     36extern struct __cfaehm__base_exception_t_vtable
     37        ___cfaehm__base_exception_t_vtable_instance;
     38
    2639
    2740// Used in throw statement translation.
     
    3649    int (*match_block)(exception * except));
    3750
     51// Clean-up the exception in catch blocks.
     52void __cfaehm__cleanup_terminate(void * except);
     53
    3854// Data structure creates a list of resume handlers.
    3955struct __cfaehm__try_resume_node {
     
    4258};
    4359
     60// These act as constructor and destructor for the resume node.
    4461void __cfaehm__try_resume_setup(
    4562    struct __cfaehm__try_resume_node * node,
     
    4966
    5067// Check for a standard way to call fake deconstructors.
    51 struct __cfaehm__cleanup_hook {
    52 };
     68struct __cfaehm__cleanup_hook {};
    5369
    5470#ifdef __CFORALL__
    5571}
    5672#endif
    57 
    58 #endif //EXCEPTION_H
  • src/libcfa/fstream.c

    rfd344aa r9236060  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul  6 18:38:25 2017
    13 // Update Count     : 251
     12// Last Modified On : Thu Jul 20 15:20:49 2017
     13// Update Count     : 252
    1414//
    1515
    1616#include "fstream"
    1717
    18 extern "C" {
    1918#include <stdio.h>                                                                              // vfprintf, vfscanf
    2019#include <stdlib.h>                                                                             // exit
     
    2423#include <float.h>                                                                              // DBL_DIG, LDBL_DIG
    2524#include <complex.h>                                                                    // creal, cimag
    26 }
    27 #include "assert"
     25#include <assert.h>
    2826
    2927#define IO_MSG "I/O error: "
  • src/libcfa/interpose.c

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Wed Mar 29 16:10:31 2017
    12 // Last Modified By :
    13 // Last Modified On :
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:27:33 2017
     13// Update Count     : 1
    1514//
    1615
     
    141140        }
    142141}
     142
     143// Local Variables: //
     144// mode: c //
     145// tab-width: 4 //
     146// End: //
  • src/libcfa/interpose.h

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Wed Mar 29 15:56:41 2017
    12 // Last Modified By :
    13 // Last Modified On :
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 22:33:02 2017
     13// Update Count     : 2
    1514//
    1615
    17 #ifndef INTERPOSE_H
    18 #define INTERPOSE_H
     16#pragma once
    1917
    2018void * interpose_symbol( const char* symbol, , const char *version );
     
    2321extern __typeof__( exit ) libc_abort __attribute__(( noreturn ));
    2422
    25 #endif //INTERPOSE_H
     23// Local Variables: //
     24// mode: c //
     25// tab-width: 4 //
     26// End: //
  • src/libcfa/iostream

    rfd344aa r9236060  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul  7 08:35:59 2017
    13 // Update Count     : 118
     12// Last Modified On : Wed Aug  9 16:42:47 2017
     13// Update Count     : 131
    1414//
    1515
     
    4646}; // ostream
    4747
    48 trait writeable( otype T ) {
    49         forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, T );
     48// trait writeable( otype T ) {
     49//      forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, T );
     50// }; // writeable
     51
     52trait writeable( otype T, dtype ostype | ostream( ostype ) ) {
     53        ostype * ?|?( ostype *, T );
    5054}; // writeable
    5155
     
    7781
    7882// tuples
    79 forall( dtype ostype, otype T, ttype Params | ostream( ostype ) | writeable( T ) | { ostype * ?|?( ostype *, Params ); } ) ostype * ?|?( ostype * os, T arg, Params rest );
     83forall( dtype ostype, otype T, ttype Params | writeable( T, ostype ) | { ostype * ?|?( ostype *, Params ); } )
     84ostype * ?|?( ostype * os, T arg, Params rest );
    8085
    8186// manipulators
     
    9095
    9196// writes the range [begin, end) to the given stream
    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 );
     97forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) )
     98void write( iterator_type begin, iterator_type end, ostype * os );
    9499
    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 );
     100forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) )
     101void write_reverse( iterator_type begin, iterator_type end, ostype * os );
    97102
    98103//---------------------------------------
  • src/libcfa/iostream.c

    rfd344aa r9236060  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jul  6 18:14:17 2017
    13 // Update Count     : 396
     12// Last Modified On : Wed Aug  9 16:46:51 2017
     13// Update Count     : 401
    1414//
    1515
     
    125125forall( dtype ostype | ostream( ostype ) )
    126126ostype * ?|?( ostype * os, float _Complex fc ) {
    127         os | crealf( fc );
    128         _Bool temp = sepDisable( os );                                          // disable separators within complex value
    129         if ( cimagf( fc ) >= 0 ) os | '+';                                      // negative value prints '-'
    130         os | cimagf( fc ) | 'i';
    131         sepReset( os, temp );                                                           // reset separator
     127        if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
     128        fmt( os, "%g%+gi", crealf( fc ), cimagf( fc ) );
    132129        return os;
    133130} // ?|?
     
    135132forall( dtype ostype | ostream( ostype ) )
    136133ostype * ?|?( ostype * os, double _Complex dc ) {
    137         os | creal( dc );
    138         _Bool temp = sepDisable( os );                                          // disable separators within complex value
    139         if ( cimag( dc ) >= 0 ) os | '+';                                       // negative value prints '-'
    140         os | cimag( dc ) | 'i';
    141         sepReset( os, temp );                                                           // reset separator
     134        if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
     135        fmt( os, "%.*lg%+.*lgi", DBL_DIG, creal( dc ), DBL_DIG, cimag( dc ) );
    142136        return os;
    143137} // ?|?
     
    145139forall( dtype ostype | ostream( ostype ) )
    146140ostype * ?|?( ostype * os, long double _Complex ldc ) {
    147         os | creall( ldc );
    148         _Bool temp = sepDisable( os );                                          // disable separators within complex value
    149         if ( cimagl( ldc ) >= 0 ) os | '+';                                     // negative value prints '-'
    150         os | cimagl( ldc ) | 'i';
    151         sepReset( os, temp );                                                           // reset separator
     141        if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
     142        fmt( os, "%.*Lg%+.*Lgi", LDBL_DIG, creall( ldc ), LDBL_DIG, cimagl( ldc ) );
    152143        return os;
    153144} // ?|?
     
    202193
    203194// tuples
    204 forall( dtype ostype, otype T, ttype Params | ostream( ostype ) | writeable( T ) | { ostype * ?|?( ostype *, Params ); } )
     195forall( dtype ostype, otype T, ttype Params | writeable( T, ostype ) | { ostype * ?|?( ostype *, Params ); } )
    205196ostype * ?|?( ostype * os, T arg, Params rest ) {
    206197        os | arg;                                                                                       // print first argument
     
    265256//---------------------------------------
    266257
    267 forall( otype elttype | writeable( elttype ), otype iteratortype | iterator( iteratortype, elttype ), dtype ostype | ostream( ostype ) )
    268 void write( iteratortype begin, iteratortype end, ostype * os ) {
    269         void print( elttype i ) { os | i; }
     258forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) )
     259void write( iterator_type begin, iterator_type end, ostype * os ) {
     260        void print( elt_type i ) { os | i; }
    270261        for_each( begin, end, print );
    271262} // ?|?
    272263
    273 forall( otype elttype | writeable( elttype ), otype iteratortype | iterator( iteratortype, elttype ), dtype ostype | ostream( ostype ) )
    274 void write_reverse( iteratortype begin, iteratortype end, ostype * os ) {
    275         void print( elttype i ) { os | i; }
     264forall( dtype ostype, otype elt_type | writeable( elt_type, ostype ), otype iterator_type | iterator( iterator_type, elt_type ) )
     265void write_reverse( iterator_type begin, iterator_type end, ostype * os ) {
     266        void print( elt_type i ) { os | i; }
    276267        for_each_reverse( begin, end, print );
    277268} // ?|?
  • src/libcfa/libhdr.h

    rfd344aa r9236060  
    99// Author           : Thierry Delisle
    1010// Created On       : Mon Nov 28 12:27:26 2016
    11 // Last Modified By : Thierry Delisle
    12 // Last Modified On : Mon Nov 28 12:27:26 2016
    13 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 09:56:32 2017
     13// Update Count     : 1
    1414//
    1515
    16 #ifndef __LIB_HDR_H__
    17 #define __LIB_HDR_H__
     16#pragma once
    1817
    1918#include "libalign.h"
     
    2120#include "libtools.h"
    2221
    23 #endif //__LIB_HDR_H__
    24 
    2522// Local Variables: //
    2623// mode: c //
  • src/libcfa/libhdr/libalign.h

    rfd344aa r9236060  
    1 //                              -*- Mode: C++ -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Mon Nov 28 12:27:26 2016
    12 // Last Modified By : Thierry Delisle
    13 // Last Modified On : Mon Nov 28 12:27:26 2016
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul 21 23:05:35 2017
     13// Update Count     : 2
    1514//
    1615// This  library is free  software; you  can redistribute  it and/or  modify it
     
    2827//
    2928
     29#pragma once
    3030
    31 #ifndef __LIB_ALIGN_H__
    32 #define __LIB_ALIGN_H__
    33 
    34 #include "assert"
     31#include <assert.h>
    3532#include <stdbool.h>
    3633
     
    6158} // uCeiling
    6259
    63 
    64 #endif // __LIB_ALIGN_H__
    65 
    66 
    6760// Local Variables: //
    6861// compile-command: "make install" //
  • src/libcfa/libhdr/libdebug.h

    rfd344aa r9236060  
    99// Author           : Thierry Delisle
    1010// Created On       : Mon Nov 28 12:27:26 2016
    11 // Last Modified By : Thierry Delisle
    12 // Last Modified On : Mon Nov 28 12:27:26 2016
    13 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 10:02:24 2017
     13// Update Count     : 1
    1414//
    1515
    16 #ifndef __LIB_DEBUG_H__
    17 #define __LIB_DEBUG_H__
     16#pragma once
    1817
    1918#ifdef __CFA_DEBUG__
     
    7877#endif
    7978
    80 #endif //__LIB_DEBUG_H__
    81 
    8279// Local Variables: //
    8380// mode: c //
  • src/libcfa/libhdr/libtools.h

    rfd344aa r9236060  
    99// Author           : Thierry Delisle
    1010// Created On       : Mon Nov 28 12:27:26 2016
    11 // Last Modified By : Thierry Delisle
    12 // Last Modified On : Mon Nov 28 12:27:26 2016
    13 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 10:02:10 2017
     13// Update Count     : 1
    1414//
    1515
    16 #ifndef __LIB_TOOLS_H__
    17 #define __LIB_TOOLS_H__
     16#pragma once
    1817
    1918// void abortf( const char *fmt, ... ) {
     
    3029#endif
    3130
    32 #endif //__LIB_TOOLS_H__
    33 
    3431// Local Variables: //
    3532// mode: c //
  • src/libcfa/math

    rfd344aa r9236060  
    1010// Created On       : Mon Apr 18 23:37:04 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul  7 09:34:15 2017
    13 // Update Count     : 61
     12// Last Modified On : Mon Aug  7 07:51:15 2017
     13// Update Count     : 108
    1414//
    1515
    1616#pragma once
    1717
    18 extern "C" {
    19 #include <math.h>                                                                               // fpclassify, isfinite, isnormal, isnan, isinf
    20 } // extern "C"
    21 
    22 float ?%?( float, float );
    23 float fmod( float, float );
    24 double ?%?( double, double );
     18#include <math.h>
     19#include <complex.h>
     20
     21//---------------------- General ----------------------
     22
     23static inline float ?%?( float x, float y ) { return fmodf( x, y ); }
     24static inline float fmod( float x, float y ) { return fmodf( x, y ); }
     25static inline double ?%?( double x, double y ) { return fmod( x, y ); }
    2526// extern "C" { double fmod( double, double ); }
    26 long double ?%?( long double, long double );
    27 long double fmod( long double, long double );
    28 
    29 float remainder( float, float );
     27static inline long double ?%?( long double x, long double y ) { return fmodl( x, y ); }
     28static inline long double fmod( long double x, long double y ) { return fmodl( x, y ); }
     29
     30static inline float remainder( float x, float y ) { return remainderf( x, y ); }
    3031// extern "C" { double remainder( double, double ); }
    31 long double remainder( long double, long double );
    32 
    33 [ int, float ] remquo( float, float );
    34 float remquo( float, float, int * );
    35 [ int, double ] remquo( double, double );
    36 // extern "C" { double remquo( double, double, int * ); }
    37 [ int, long double ] remquo( long double, long double );
    38 long double remquo( long double, long double, int * );
    39 
    40 [ int, float ] div( float, float );                                             // alternative name for remquo
    41 float div( float, float, int * );
    42 [ int, double ] div( double, double );
    43 // extern "C" { double div( double, double, int * ); }
    44 [ int, long double ] div( long double, long double );
    45 long double div( long double, long double, int * );
    46 
    47 float fma( float, float, float );
     32static inline long double remainder( long double x, long double y ) { return remainderl( x, y ); }
     33
     34static inline float remquo( float x, float y, int * quo ) { return remquof( x, y, quo ); }
     35// extern "C" { double remquo( double x, double y, int * quo ); }
     36static inline long double remquo( long double x, long double y, int * quo ) { return remquol( x, y, quo ); }
     37static inline [ int, float ] remquo( float x, float y ) { int quo; x = remquof( x, y, &quo ); return [ quo, x ]; }
     38static inline [ int, double ] remquo( double x, double y ) { int quo; x = remquo( x, y, &quo ); return [ quo, x ]; }
     39static inline [ int, long double ] remquo( long double x, long double y ) { int quo; x = remquol( x, y, &quo ); return [ quo, x ]; }
     40
     41static inline [ float, float ] div( float x, float y ) { y = modff( x / y, &x ); return [ x, y ]; }
     42static inline [ double, double ] div( double x, double y ) { y = modf( x / y, &x ); return [ x, y ]; }
     43static inline [ long double, long double ] div( long double x, long double y ) { y = modfl( x / y, &x ); return [ x, y ]; }
     44
     45static inline float fma( float x, float y, float z ) { return fmaf( x, y, z ); }
    4846// extern "C" { double fma( double, double, double ); }
    49 long double fma( long double, long double, long double );
    50 
    51 float fdim( float, float );
     47static inline long double fma( long double x, long double y, long double z ) { return fmal( x, y, z ); }
     48
     49static inline float fdim( float x, float y ) { return fdimf( x, y ); }
    5250// extern "C" { double fdim( double, double ); }
    53 long double fdim( long double, long double );
    54 
    55 float nan( const char * );
     51static inline long double fdim( long double x, long double y ) { return fdiml( x, y ); }
     52
     53static inline float nan( const char * tag ) { return nanf( tag ); }
    5654// extern "C" { double nan( const char * ); }
    57 long double nan( const char * );
     55static inline long double nan( const char * tag ) { return nanl( tag ); }
    5856
    5957//---------------------- Exponential ----------------------
    6058
    61 float exp( float );
     59static inline float exp( float x ) { return expf( x ); }
    6260// extern "C" { double exp( double ); }
    63 long double exp( long double );
    64 float _Complex exp( float _Complex );
    65 double _Complex exp( double _Complex );
    66 long double _Complex exp( long double _Complex );
    67 
    68 float exp2( float );
     61static inline long double exp( long double x ) { return expl( x ); }
     62static inline float _Complex exp( float _Complex x ) { return cexpf( x ); }
     63static inline double _Complex exp( double _Complex x ) { return cexp( x ); }
     64static inline long double _Complex exp( long double _Complex x ) { return cexpl( x ); }
     65
     66static inline float exp2( float x ) { return exp2f( x ); }
    6967// extern "C" { double exp2( double ); }
    70 long double exp2( long double );
    71 // float _Complex exp2( float _Complex );
    72 // double _Complex exp2( double _Complex );
    73 // long double _Complex exp2( long double _Complex );
    74 
    75 float expm1( float );
     68static inline long double exp2( long double x ) { return exp2l( x ); }
     69//static inline float _Complex exp2( float _Complex x ) { return cexp2f( x ); }
     70//static inline double _Complex exp2( double _Complex x ) { return cexp2( x ); }
     71//static inline long double _Complex exp2( long double _Complex x ) { return cexp2l( x ); }
     72
     73static inline float expm1( float x ) { return expm1f( x ); }
    7674// extern "C" { double expm1( double ); }
    77 long double expm1( long double );
    78 
    79 float log( float );
     75static inline long double expm1( long double x ) { return expm1l( x ); }
     76
     77static inline float pow( float x, float y ) { return powf( x, y ); }
     78// extern "C" { double pow( double, double ); }
     79static inline long double pow( long double x, long double y ) { return powl( x, y ); }
     80static inline float _Complex pow( float _Complex x, float _Complex y ) { return cpowf( x, y ); }
     81static inline double _Complex pow( double _Complex x, double _Complex y ) { return cpow( x, y ); }
     82static inline long double _Complex pow( long double _Complex x, long double _Complex y ) { return cpowl( x, y ); }
     83
     84//---------------------- Logarithm ----------------------
     85
     86static inline float log( float x ) { return logf( x ); }
    8087// extern "C" { double log( double ); }
    81 long double log( long double );
    82 float _Complex log( float _Complex );
    83 double _Complex log( double _Complex );
    84 long double _Complex log( long double _Complex );
    85 
    86 float log2( float );
     88static inline long double log( long double x ) { return logl( x ); }
     89static inline float _Complex log( float _Complex x ) { return clogf( x ); }
     90static inline double _Complex log( double _Complex x ) { return clog( x ); }
     91static inline long double _Complex log( long double _Complex x ) { return clogl( x ); }
     92
     93static inline float log2( float x ) { return log2f( x ); }
    8794// extern "C" { double log2( double ); }
    88 long double log2( long double );
    89 // float _Complex log2( float _Complex );
    90 // double _Complex log2( double _Complex );
    91 // long double _Complex log2( long double _Complex );
    92 
    93 float log10( float );
     95static inline long double log2( long double x ) { return log2l( x ); }
     96// static inline float _Complex log2( float _Complex x ) { return clog2f( x ); }
     97// static inline double _Complex log2( double _Complex x ) { return clog2( x ); }
     98// static inline long double _Complex log2( long double _Complex x ) { return clog2l( x ); }
     99
     100static inline float log10( float x ) { return log10f( x ); }
    94101// extern "C" { double log10( double ); }
    95 long double log10( long double );
    96 // float _Complex log10( float _Complex );
    97 // double _Complex log10( double _Complex );
    98 // long double _Complex log10( long double _Complex );
    99 
    100 float log1p( float );
     102static inline long double log10( long double x ) { return log10l( x ); }
     103// static inline float _Complex log10( float _Complex x ) { return clog10f( x ); }
     104// static inline double _Complex log10( double _Complex x ) { return clog10( x ); }
     105// static inline long double _Complex log10( long double _Complex x ) { return clog10l( x ); }
     106
     107static inline float log1p( float x ) { return log1pf( x ); }
    101108// extern "C" { double log1p( double ); }
    102 long double log1p( long double );
    103 
    104 int ilogb( float );
     109static inline long double log1p( long double x ) { return log1pl( x ); }
     110
     111static inline int ilogb( float x ) { return ilogbf( x ); }
    105112// extern "C" { int ilogb( double ); }
    106 int ilogb( long double );
    107 
    108 float logb( float );
     113static inline int ilogb( long double x ) { return ilogbl( x ); }
     114
     115static inline float logb( float x ) { return logbf( x ); }
    109116// extern "C" { double logb( double ); }
    110 long double logb( long double );
    111 
    112 //---------------------- Power ----------------------
    113 
    114 float sqrt( float );
     117static inline long double logb( long double x ) { return logbl( x ); }
     118
     119static inline float sqrt( float x ) { return sqrtf( x ); }
    115120// extern "C" { double sqrt( double ); }
    116 long double sqrt( long double );
    117 float _Complex sqrt( float _Complex );
    118 double _Complex sqrt( double _Complex );
    119 long double _Complex sqrt( long double _Complex );
    120 
    121 float cbrt( float );
     121static inline long double sqrt( long double x ) { return sqrtl( x ); }
     122static inline float _Complex sqrt( float _Complex x ) { return csqrtf( x ); }
     123static inline double _Complex sqrt( double _Complex x ) { return csqrt( x ); }
     124static inline long double _Complex sqrt( long double _Complex x ) { return csqrtl( x ); }
     125
     126static inline float cbrt( float x ) { return cbrtf( x ); }
    122127// extern "C" { double cbrt( double ); }
    123 long double cbrt( long double );
    124 
    125 float hypot( float, float );
     128static inline long double cbrt( long double x ) { return cbrtl( x ); }
     129
     130static inline float hypot( float x, float y ) { return hypotf( x, y ); }
    126131// extern "C" { double hypot( double, double ); }
    127 long double hypot( long double, long double );
    128 
    129 float pow( float, float );
    130 // extern "C" { double pow( double, double ); }
    131 long double pow( long double, long double );
    132 float _Complex pow( float _Complex, float _Complex );
    133 double _Complex pow( double _Complex, double _Complex );
    134 long double _Complex pow( long double _Complex, long double _Complex );
     132static inline long double hypot( long double x, long double y ) { return hypotl( x, y ); }
    135133
    136134//---------------------- Trigonometric ----------------------
    137135
    138 float sin( float );
     136static inline float sin( float x ) { return sinf( x ); }
    139137// extern "C" { double sin( double ); }
    140 long double sin( long double );
    141 float _Complex sin( float _Complex );
    142 double _Complex sin( double _Complex );
    143 long double _Complex sin( long double _Complex );
    144 
    145 float cos( float );
     138static inline long double sin( long double x ) { return sinl( x ); }
     139static inline float _Complex sin( float _Complex x ) { return csinf( x ); }
     140static inline double _Complex sin( double _Complex x ) { return csin( x ); }
     141static inline long double _Complex sin( long double _Complex x ) { return csinl( x ); }
     142
     143static inline float cos( float x ) { return cosf( x ); }
    146144// extern "C" { double cos( double ); }
    147 long double cos( long double );
    148 float _Complex cos( float _Complex );
    149 double _Complex cos( double _Complex );
    150 long double _Complex cos( long double _Complex );
    151 
    152 float tan( float );
     145static inline long double cos( long double x ) { return cosl( x ); }
     146static inline float _Complex cos( float _Complex x ) { return ccosf( x ); }
     147static inline double _Complex cos( double _Complex x ) { return ccos( x ); }
     148static inline long double _Complex cos( long double _Complex x ) { return ccosl( x ); }
     149
     150static inline float tan( float x ) { return tanf( x ); }
    153151// extern "C" { double tan( double ); }
    154 long double tan( long double );
    155 float _Complex tan( float _Complex );
    156 double _Complex tan( double _Complex );
    157 long double _Complex tan( long double _Complex );
    158 
    159 float asin( float );
     152static inline long double tan( long double x ) { return tanl( x ); }
     153static inline float _Complex tan( float _Complex x ) { return ctanf( x ); }
     154static inline double _Complex tan( double _Complex x ) { return ctan( x ); }
     155static inline long double _Complex tan( long double _Complex x ) { return ctanl( x ); }
     156
     157static inline float asin( float x ) { return asinf( x ); }
    160158// extern "C" { double asin( double ); }
    161 long double asin( long double );
    162 float _Complex asin( float _Complex );
    163 double _Complex asin( double _Complex );
    164 long double _Complex asin( long double _Complex );
    165 
    166 float acos( float );
     159static inline long double asin( long double x ) { return asinl( x ); }
     160static inline float _Complex asin( float _Complex x ) { return casinf( x ); }
     161static inline double _Complex asin( double _Complex x ) { return casin( x ); }
     162static inline long double _Complex asin( long double _Complex x ) { return casinl( x ); }
     163
     164static inline float acos( float x ) { return acosf( x ); }
    167165// extern "C" { double acos( double ); }
    168 long double acos( long double );
    169 float _Complex acos( float _Complex );
    170 double _Complex acos( double _Complex );
    171 long double _Complex acos( long double _Complex );
    172 
    173 float atan( float );
     166static inline long double acos( long double x ) { return acosl( x ); }
     167static inline float _Complex acos( float _Complex x ) { return cacosf( x ); }
     168static inline double _Complex acos( double _Complex x ) { return cacos( x ); }
     169static inline long double _Complex acos( long double _Complex x ) { return cacosl( x ); }
     170
     171static inline float atan( float x ) { return atanf( x ); }
    174172// extern "C" { double atan( double ); }
    175 long double atan( long double );
    176 float _Complex atan( float _Complex );
    177 double _Complex atan( double _Complex );
    178 long double _Complex atan( long double _Complex );
    179 
    180 float atan2( float, float );
     173static inline long double atan( long double x ) { return atanl( x ); }
     174static inline float _Complex atan( float _Complex x ) { return catanf( x ); }
     175static inline double _Complex atan( double _Complex x ) { return catan( x ); }
     176static inline long double _Complex atan( long double _Complex x ) { return catanl( x ); }
     177
     178static inline float atan2( float x, float y ) { return atan2f( x, y ); }
    181179// extern "C" { double atan2( double, double ); }
    182 long double atan2( long double, long double );
    183 
    184 float atan( float, float );                                                             // alternative name for atan2
    185 double atan( double, double );
    186 long double atan( long double, long double );
     180static inline long double atan2( long double x, long double y ) { return atan2l( x, y ); }
     181
     182// alternative name for atan2
     183static inline float atan( float x, float y ) { return atan2f( x, y ); }
     184static inline double atan( double x, double y ) { return atan2( x, y ); }
     185static inline long double atan( long double x, long double y ) { return atan2l( x, y ); }
    187186
    188187//---------------------- Hyperbolic ----------------------
    189188
    190 float sinh( float );
     189static inline float sinh( float x ) { return sinhf( x ); }
    191190// extern "C" { double sinh( double ); }
    192 long double sinh( long double );
    193 float _Complex sinh( float _Complex );
    194 double _Complex sinh( double _Complex );
    195 long double _Complex sinh( long double _Complex );
    196 
    197 float cosh( float );
     191static inline long double sinh( long double x ) { return sinhl( x ); }
     192static inline float _Complex sinh( float _Complex x ) { return csinhf( x ); }
     193static inline double _Complex sinh( double _Complex x ) { return csinh( x ); }
     194static inline long double _Complex sinh( long double _Complex x ) { return csinhl( x ); }
     195
     196static inline float cosh( float x ) { return coshf( x ); }
    198197// extern "C" { double cosh( double ); }
    199 long double cosh( long double );
    200 float _Complex cosh( float _Complex );
    201 double _Complex cosh( double _Complex );
    202 long double _Complex cosh( long double _Complex );
    203 
    204 float tanh( float );
     198static inline long double cosh( long double x ) { return coshl( x ); }
     199static inline float _Complex cosh( float _Complex x ) { return ccoshf( x ); }
     200static inline double _Complex cosh( double _Complex x ) { return ccosh( x ); }
     201static inline long double _Complex cosh( long double _Complex x ) { return ccoshl( x ); }
     202
     203static inline float tanh( float x ) { return tanhf( x ); }
    205204// extern "C" { double tanh( double ); }
    206 long double tanh( long double );
    207 float _Complex tanh( float _Complex );
    208 double _Complex tanh( double _Complex );
    209 long double _Complex tanh( long double _Complex );
    210 
    211 float asinh( float );
     205static inline long double tanh( long double x ) { return tanhl( x ); }
     206static inline float _Complex tanh( float _Complex x ) { return ctanhf( x ); }
     207static inline double _Complex tanh( double _Complex x ) { return ctanh( x ); }
     208static inline long double _Complex tanh( long double _Complex x ) { return ctanhl( x ); }
     209
     210static inline float asinh( float x ) { return asinhf( x ); }
    212211// extern "C" { double asinh( double ); }
    213 long double asinh( long double );
    214 float _Complex asinh( float _Complex );
    215 double _Complex asinh( double _Complex );
    216 long double _Complex asinh( long double _Complex );
    217 
    218 float acosh( float );
     212static inline long double asinh( long double x ) { return asinhl( x ); }
     213static inline float _Complex asinh( float _Complex x ) { return casinhf( x ); }
     214static inline double _Complex asinh( double _Complex x ) { return casinh( x ); }
     215static inline long double _Complex asinh( long double _Complex x ) { return casinhl( x ); }
     216
     217static inline float acosh( float x ) { return acoshf( x ); }
    219218// extern "C" { double acosh( double ); }
    220 long double acosh( long double );
    221 float _Complex acosh( float _Complex );
    222 double _Complex acosh( double _Complex );
    223 long double _Complex acosh( long double _Complex );
    224 
    225 float atanh( float );
     219static inline long double acosh( long double x ) { return acoshl( x ); }
     220static inline float _Complex acosh( float _Complex x ) { return cacoshf( x ); }
     221static inline double _Complex acosh( double _Complex x ) { return cacosh( x ); }
     222static inline long double _Complex acosh( long double _Complex x ) { return cacoshl( x ); }
     223
     224static inline float atanh( float x ) { return atanhf( x ); }
    226225// extern "C" { double atanh( double ); }
    227 long double atanh( long double );
    228 float _Complex atanh( float _Complex );
    229 double _Complex atanh( double _Complex );
    230 long double _Complex atanh( long double _Complex );
     226static inline long double atanh( long double x ) { return atanhl( x ); }
     227static inline float _Complex atanh( float _Complex x ) { return catanhf( x ); }
     228static inline double _Complex atanh( double _Complex x ) { return catanh( x ); }
     229static inline long double _Complex atanh( long double _Complex x ) { return catanhl( x ); }
    231230
    232231//---------------------- Error / Gamma ----------------------
    233232
    234 float erf( float );
     233static inline float erf( float x ) { return erff( x ); }
    235234// extern "C" { double erf( double ); }
    236 long double erf( long double );
     235static inline long double erf( long double x ) { return erfl( x ); }
    237236// float _Complex erf( float _Complex );
    238237// double _Complex erf( double _Complex );
    239238// long double _Complex erf( long double _Complex );
    240239
    241 float erfc( float );
     240static inline float erfc( float x ) { return erfcf( x ); }
    242241// extern "C" { double erfc( double ); }
    243 long double erfc( long double );
     242static inline long double erfc( long double x ) { return erfcl( x ); }
    244243// float _Complex erfc( float _Complex );
    245244// double _Complex erfc( double _Complex );
    246245// long double _Complex erfc( long double _Complex );
    247246
    248 float lgamma( float );
     247static inline float lgamma( float x ) { return lgammaf( x ); }
    249248// extern "C" { double lgamma( double ); }
    250 long double lgamma( long double );
    251 float lgamma( float, int * );
    252 double lgamma( double, int * );
    253 long double lgamma( long double, int * );
    254 
    255 float tgamma( float );
     249static inline long double lgamma( long double x ) { return lgammal( x ); }
     250static inline float lgamma( float x, int * sign ) { return lgammaf_r( x, sign ); }
     251static inline double lgamma( double x, int * sign ) { return lgamma_r( x, sign ); }
     252static inline long double lgamma( long double x, int * sign ) { return lgammal_r( x, sign ); }
     253
     254static inline float tgamma( float x ) { return tgammaf( x ); }
    256255// extern "C" { double tgamma( double ); }
    257 long double tgamma( long double );
     256static inline long double tgamma( long double x ) { return tgammal( x ); }
    258257
    259258//---------------------- Nearest Integer ----------------------
    260259
    261 float floor( float );
     260static inline float floor( float x ) { return floorf( x ); }
    262261// extern "C" { double floor( double ); }
    263 long double floor( long double );
    264 
    265 float ceil( float );
     262static inline long double floor( long double x ) { return floorl( x ); }
     263
     264static inline float ceil( float x ) { return ceilf( x ); }
    266265// extern "C" { double ceil( double ); }
    267 long double ceil( long double );
    268 
    269 float trunc( float );
     266static inline long double ceil( long double x ) { return ceill( x ); }
     267
     268static inline float trunc( float x ) { return truncf( x ); }
    270269// extern "C" { double trunc( double ); }
    271 long double trunc( long double );
    272 
    273 float rint( float );
    274 long double rint( long double );
    275 long int rint( float );
    276 long int rint( double );
    277 long int rint( long double );
    278 long long int rint( float );
    279 long long int rint( double );
    280 long long int rint( long double );
    281 
    282 long int lrint( float );
     270static inline long double trunc( long double x ) { return truncl( x ); }
     271
     272static inline float rint( float x ) { return rintf( x ); }
     273// extern "C" { double rint( double x ); }
     274static inline long double rint( long double x ) { return rintl( x ); }
     275static inline long int rint( float x ) { return lrintf( x ); }
     276static inline long int rint( double x ) { return lrint( x ); }
     277static inline long int rint( long double x ) { return lrintl( x ); }
     278static inline long long int rint( float x ) { return llrintf( x ); }
     279static inline long long int rint( double x ) { return llrint( x ); }
     280static inline long long int rint( long double x ) { return llrintl( x ); }
     281
     282static inline long int lrint( float x ) { return lrintf( x ); }
    283283// extern "C" { long int lrint( double ); }
    284 long int lrint( long double );
    285 long long int llrint( float );
     284static inline long int lrint( long double x ) { return lrintl( x ); }
     285static inline long long int llrint( float x ) { return llrintf( x ); }
    286286// extern "C" { long long int llrint( double ); }
    287 long long int llrint( long double );
    288 
    289 float nearbyint( float );
     287static inline long long int llrint( long double x ) { return llrintl( x ); }
     288
     289static inline float nearbyint( float x ) { return nearbyintf( x ); }
    290290// extern "C" { double nearbyint( double ); }
    291 long double nearbyint( long double );
    292 
    293 float round( float );
    294 long double round( long double );
    295 long int round( float );
    296 long int round( double );
    297 long int round( long double );
    298 long long int round( float );
    299 long long int round( double );
    300 long long int round( long double );
    301 
    302 long int lround( float );
     291static inline long double nearbyint( long double x ) { return nearbyintl( x ); }
     292
     293static inline float round( float x ) { return roundf( x ); }
     294// extern "C" { double round( double x ); }
     295static inline long double round( long double x ) { return roundl( x ); }
     296static inline long int round( float x ) { return lroundf( x ); }
     297static inline long int round( double x ) { return lround( x ); }
     298static inline long int round( long double x ) { return lroundl( x ); }
     299static inline long long int round( float x ) { return llroundf( x ); }
     300static inline long long int round( double x ) { return llround( x ); }
     301static inline long long int round( long double x ) { return llroundl( x ); }
     302
     303static inline long int lround( float x ) { return lroundf( x ); }
    303304// extern "C" { long int lround( double ); }
    304 long int lround( long double );
    305 long long int llround( float );
     305static inline long int lround( long double x ) { return lroundl( x ); }
     306static inline long long int llround( float x ) { return llroundf( x ); }
    306307// extern "C" { long long int llround( double ); }
    307 long long int llround( long double );
     308static inline long long int llround( long double x ) { return llroundl( x ); }
    308309
    309310//---------------------- Manipulation ----------------------
    310311
    311 float copysign( float, float );
     312static inline float copysign( float x, float y ) { return copysignf( x, y ); }
    312313// extern "C" { double copysign( double, double ); }
    313 long double copysign( long double, long double );
    314 
    315 float frexp( float, int * );
     314static inline long double copysign( long double x, long double y ) { return copysignl( x, y ); }
     315
     316static inline float frexp( float x, int * ip ) { return frexpf( x, ip ); }
    316317// extern "C" { double frexp( double, int * ); }
    317 long double frexp( long double, int * );
    318 
    319 float ldexp( float, int );
     318static inline long double frexp( long double x, int * ip ) { return frexpl( x, ip ); }
     319
     320static inline float ldexp( float x, int exp2 ) { return ldexpf( x, exp2 ); }
    320321// extern "C" { double ldexp( double, int ); }
    321 long double ldexp( long double, int );
    322 
    323 [ float, float ] modf( float );
    324 float modf( float, float * );
    325 [ double, double ] modf( double );
     322static inline long double ldexp( long double x, int exp2 ) { return ldexpl( x, exp2 ); }
     323
     324static inline [ float, float ] modf( float x ) { float i; x = modff( x, &i ); return [ i, x ]; }
     325static inline float modf( float x, float * i ) { return modff( x, i ); }
     326static inline [ double, double ] modf( double x ) { double i; x = modf( x, &i ); return [ i, x ]; }
    326327// extern "C" { double modf( double, double * ); }
    327 [ long double, long double ] modf( long double );
    328 long double modf( long double, long double * );
    329 
    330 float nextafter( float, float );
     328static inline [ long double, long double ] modf( long double x ) { long double i; x = modfl( x, &i ); return [ i, x ]; }
     329static inline long double modf( long double x, long double * i ) { return modfl( x, i ); }
     330
     331static inline float nextafter( float x, float y ) { return nextafterf( x, y ); }
    331332// extern "C" { double nextafter( double, double ); }
    332 long double nextafter( long double, long double );
    333 
    334 float nexttoward( float, long double );
     333static inline long double nextafter( long double x, long double y ) { return nextafterl( x, y ); }
     334
     335static inline float nexttoward( float x, long double y ) { return nexttowardf( x, y ); }
    335336// extern "C" { double nexttoward( double, long double ); }
    336 long double nexttoward( long double, long double );
    337 
    338 float scalbn( float, int );
     337static inline long double nexttoward( long double x, long double y ) { return nexttowardl( x, y ); }
     338
     339static inline float scalbn( float x, int exp ) { return scalbnf( x, exp ); }
    339340// extern "C" { double scalbn( double, int ); }
    340 long double scalbn( long double, int );
    341 
    342 float scalbln( float, long int );
     341static inline long double scalbn( long double x, int exp ) { return scalbnl( x, exp ); }
     342static inline float scalbn( float x, long int exp ) { return scalblnf( x, exp ); }
     343static inline double scalbn( double x, long int exp ) { return scalbln( x, exp ); }
     344static inline long double scalbn( long double x, long int exp ) { return scalblnl( x, exp ); }
     345
     346static inline float scalbln( float x, long int exp ) { return scalblnf( x, exp ); }
    343347// extern "C" { double scalbln( double, long int ); }
    344 long double scalbln( long double, long int );
     348static inline long double scalbln( long double x, long int exp ) { return scalblnl( x, exp ); }
    345349
    346350// Local Variables: //
  • src/libcfa/startup.h

    rfd344aa r9236060  
    1 //                              -*- Mode: CFA -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    109// Author           : Thierry Delisle
    1110// Created On       : Wed Mar 29 15:56:41 2017
    12 // Last Modified By :
    13 // Last Modified On :
    14 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu Jul 20 21:37:11 2017
     13// Update Count     : 2
    1514//
    1615
    17 #ifndef STARTUP_H
    18 #define STARTUP_H
     16#pragma once
    1917
    2018#if GCC_VERSION > 50000
     
    3432#endif
    3533
    36 #endif //STARTUP_H
     34// Local Variables: //
     35// mode: c //
     36// tab-width: 4 //
     37// End: //
  • src/libcfa/stdhdr/assert.h

    rfd344aa r9236060  
    1010// Created On       : Mon Jul  4 23:25:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Jul  5 20:34:23 2016
    13 // Update Count     : 8
     12// Last Modified On : Mon Jul 31 23:09:32 2017
     13// Update Count     : 13
    1414//
    1515
     
    1818#endif //__CFORALL__
    1919
    20 // has internal check for multiple expansion
    2120#include_next <assert.h>
     21
     22#ifdef NDEBUG
     23        #define assertf( expr, fmt, ... ) ((void)0)
     24#else
     25        #define __STRINGIFY__(str) #str
     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) ));
     30#endif
    2231
    2332#ifdef __CFORALL__
  • src/libcfa/stdhdr/gmp.h

    rfd344aa r9236060  
    1 //                               -*- Mode: C -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    1110// Created On       : Sun May 14 23:46:01 2017
    1211// Last Modified By : Peter A. Buhr
    13 // Last Modified On : Sun May 14 23:46:34 2017
    14 // Update Count     : 1
     12// Last Modified On : Thu Jul 20 18:10:52 2017
     13// Update Count     : 4
    1514//
    1615
  • src/libcfa/stdlib

    rfd344aa r9236060  
    1010// Created On       : Thu Jan 28 17:12:35 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul  7 09:34:49 2017
    13 // Update Count     : 219
     12// Last Modified On : Mon Aug  7 11:19:07 2017
     13// Update Count     : 223
    1414//
    1515
     
    1818//---------------------------------------
    1919
    20 extern "C" {
    2120#ifndef EXIT_FAILURE
    2221#define EXIT_FAILURE    1                                                               // failing exit status
    2322#define EXIT_SUCCESS    0                                                               // successful exit status
    2423#endif // ! EXIT_FAILURE
    25 } // extern "C"
    2624
    2725//---------------------------------------
     
    185183//---------------------------------------
    186184
     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 );
    187188forall( otype T | { T ?/?( T, T ); T ?%?( T, T ); } )
    188 [ T, T ] div( T t1, T t2 );
     189[ T, T ] div( T num, T demon );
    189190
    190191//---------------------------------------
  • src/libcfa/stdlib.c

    rfd344aa r9236060  
    1010// Created On       : Thu Jan 28 17:10:29 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jun  1 21:52:57 2017
    13 // Update Count     : 280
     12// Last Modified On : Tue Aug  8 17:31:13 2017
     13// Update Count     : 291
    1414//
    1515
     
    1818//---------------------------------------
    1919
    20 extern "C" {
    2120#define _XOPEN_SOURCE 600                                                               // posix_memalign, *rand48
    2221#include <stdlib.h>                                                                             // malloc, free, calloc, realloc, memalign, posix_memalign, bsearch
     
    2524#include <math.h>                                                                               // fabsf, fabs, fabsl
    2625#include <complex.h>                                                                    // _Complex_I
    27 } // extern "C"
    2826
    2927// resize, non-array types
     
    257255//---------------------------------------
    258256
     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 ]; }
    259260forall( otype T | { T ?/?( T, T ); T ?%?( T, T ); } )
    260 [ T, T ] div( T t1, T t2 ) { return [ t1 / t2, t1 % t2 ]; }
     261[ T, T ] div( T num, T denom ) { return [ num / denom, num % denom ]; }
    261262
    262263//---------------------------------------
  • src/main.cc

    rfd344aa r9236060  
    1111// Created On       : Fri May 15 23:12:02 2015
    1212// Last Modified By : Andrew Beach
    13 // Last Modified On : Fri Jul  7 11:13:00 2017
    14 // Update Count     : 442
     13// Last Modified On : Wed Jul 26 14:38:00 2017
     14// Update Count     : 443
    1515//
    1616
     
    5858#include "SynTree/Visitor.h"                // for acceptAll
    5959#include "Tuples/Tuples.h"                  // for expandMemberTuples, expan...
     60#include "Virtual/ExpandCasts.h"            // for expandCasts
    6061
    6162using namespace std;
     
    313314                }
    314315
     316                OPTPRINT( "virtual expandCasts" ) // Must come after translateEHM
     317                Virtual::expandCasts( translationUnit );
     318
    315319                OPTPRINT("instantiateGenerics")
    316320                GenPoly::instantiateGeneric( translationUnit );
  • src/prelude/builtins.c

    rfd344aa r9236060  
     1//
     2// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     3//
     4// The contents of this file are covered under the licence agreement in the
     5// file "LICENCE" distributed with Cforall.
     6//
     7// builtins.c --
     8//
     9// Author           : Peter A. Buhr
     10// Created On       : Fri Jul 21 16:21:03 2017
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tus Jul 25 15:33:00 2017
     13// Update Count     : 14
     14//
     15
     16// exception implementation
     17
    118typedef unsigned long long __cfaabi_exception_type_t;
    219
     20#include "../libcfa/virtual.h"
    321#include "../libcfa/exception.h"
     22
     23// exponentiation operator implementation
     24
     25extern "C" {
     26        float powf( float x, float y );
     27        double pow( double x, double y );
     28        long double powl( long double x, long double y );
     29        float _Complex cpowf( float _Complex x, _Complex float z );
     30        double _Complex cpow( double _Complex x, _Complex double z );
     31        long double _Complex cpowl( long double _Complex x, _Complex long double z );
     32} // extern "C"
     33
     34static inline float ?\?( float x, float y ) { return powf( x, y ); }
     35static inline double ?\?( double x, double y ) { return pow( x, y ); }
     36static inline long double ?\?( long double x, long double y ) { return powl( x, y ); }
     37static inline float _Complex ?\?( float _Complex x, _Complex float y ) { return cpowf(x, y ); }
     38static inline double _Complex ?\?( double _Complex x, _Complex double y ) { return cpow( x, y ); }
     39static inline long double _Complex ?\?( long double _Complex x, _Complex long double y ) { return cpowl( x, y ); }
     40
     41static inline long int ?\?( long int ep, unsigned long int y ) { // disallow negative exponent
     42        if ( y == 0 ) return 1;                                                         // base case
     43    if ( ep == 2 ) return ep << (y - 1);                                // special case, positive shifting only
     44    typeof( ep ) op = 1;                                                                // accumulate odd product
     45    for ( ; y > 1; y >>= 1 ) {                                                  // squaring exponentiation, O(log2 y)
     46                if ( (y & 1) == 1 ) op *= ep;                                   // odd ?
     47                ep *= ep;
     48        } // for
     49    return ep * op;
     50} // ?\?
     51
     52// FIX ME, cannot resolve the "T op = 1".
     53
     54// static inline forall( otype T | { void ?{}( T * this, one_t ); T ?*?( T, T ); } )
     55// T ?\?( T ep, unsigned long int y ) {
     56//     if ( y == 0 ) return 1;
     57//     T op = 1;
     58//     for ( ; y > 1; y >>= 1 ) {                                                       // squaring exponentiation, O(log2 y)
     59//              if ( (y & 1) == 1 ) op = op * ep;                               // odd ?
     60//              ep = ep * ep;
     61//     } // for
     62//     return ep * op;
     63// } // ?\?
     64
     65// unsigned computation may be faster and larger
     66static inline unsigned long int ?\?( unsigned long int ep, unsigned long int y ) { // disallow negative exponent
     67        if ( y == 0 ) return 1;                                                         // base case
     68    if ( ep == 2 ) return ep << (y - 1);                                // special case, positive shifting only
     69    typeof( ep ) op = 1;                                                                // accumulate odd product
     70    for ( ; y > 1; y >>= 1 ) {                                                  // squaring exponentiation, O(log2 y)
     71                if ( (y & 1) == 1 ) op *= ep;                                   // odd ?
     72                ep *= ep;
     73        } // for
     74    return ep * op;
     75} // ?\?
     76
     77static inline double ?\?( long int x, signed long int y ) {     // allow negative exponent
     78    if ( y >=  0 ) return (double)(x \ (unsigned long int)y);
     79    else return 1.0 / x \ (unsigned int)(-y);
     80} // ?\?
     81
     82static inline forall( otype T | { void ?{}( T & this, one_t ); T ?*?( T, T ); double ?/?( double, T ); } )
     83double ?\?( T x, signed long int y ) {
     84    if ( y >=  0 ) return (double)(x \ (unsigned long int)y);
     85    else return 1.0 / x \ (unsigned long int)(-y);
     86} // ?\?
     87
     88static inline long int ?\=?( long int * x, unsigned long int y ) { *x = *x \ y; return *x; }
     89static inline unsigned long int ?\=?( unsigned long int * x, unsigned long int y ) { *x = *x \ y; return *x; }
     90static inline int ?\=?( int * x, unsigned long int y ) { *x = *x \ y; return *x; }
     91static inline unsigned int ?\=?( unsigned int * x, unsigned long int y ) { *x = *x \ y; return *x; }
     92
     93// Local Variables: //
     94// mode: c //
     95// tab-width: 4 //
     96// End: //
  • src/tests/.expect/32/math.txt

    rfd344aa r9236060  
    22remainder:-1 -1 -1
    33remquo:7 0.0999999 7 0.1 7 0.0999999999999999999
    4 div:7 0.0999999 7 0.1 7 0.0999999999999999999
     4div:7, 0.2 7, 0.2 7, 0.2
    55fma:-2 -2 -2
    66fdim:2 2 2
     
    99exp2:2 2 2
    1010expm1:1.71828 1.71828182845905 1.71828182845904524
     11pow:1 1 1 0.273957+0.583701i 0.273957253830121+0.583700758758615i 0.273957253830121071+0.583700758758614628i
     1216 256
     13912673 256 64 -64 0.015625 -0.015625 18.3791736799526 0.264715-1.1922i
    1114log:0 0 0 0.346574+0.785398i 0.346573590279973+0.785398163397448i 0.346573590279972655+0.78539816339744831i
    1215log2:3 3 3
     
    1821cbrt:3 3 3
    1922hypot:1.41421 1.4142135623731 1.41421356237309505
    20 pow:1 1 1 0.273957+0.583701i 0.273957253830121+0.583700758758615i 0.273957253830121071+0.583700758758614628i
    2123sin:0.841471 0.841470984807897 0.841470984807896507 1.29846+0.634964i 1.29845758141598+0.634963914784736i 1.29845758141597729+0.634963914784736108i
    2224cos:0.540302 0.54030230586814 0.540302305868139717 0.83373-0.988898i 0.833730025131149-0.988897705762865i 0.833730025131149049-0.988897705762865096i
     
    5355frexp:0.5 3 0.5 3 0.5 3
    5456ldexp:8 8 8
    55 modf:2 0.3 2 0.3 2 0.3 nextafter:2 2 2
     57modf:2 0.3 2 0.3 2 0.3
     58modf:2, 0.3 2, 0.3 2, 0.3
     59nextafter:2 2 2
    5660nexttoward:2 2 2
    5761scalbn:16 16 16
  • src/tests/.expect/64/math.txt

    rfd344aa r9236060  
    22remainder:-1 -1 -1
    33remquo:7 0.0999999 7 0.1 7 0.0999999999999999999
    4 div:7 0.0999999 7 0.1 7 0.0999999999999999999
     4div:7, 0.2 7, 0.2 7, 0.2
    55fma:-2 -2 -2
    66fdim:2 2 2
     
    99exp2:2 2 2
    1010expm1:1.71828 1.71828182845905 1.71828182845904524
     11pow:1 1 1 0.273957+0.583701i 0.273957253830121+0.583700758758615i 0.273957253830121071+0.583700758758614627i
     1216 256
     13912673 256 64 -64 0.015625 -0.015625 18.3791736799526 0.264715-1.1922i
    1114log:0 0 0 0.346574+0.785398i 0.346573590279973+0.785398163397448i 0.346573590279972655+0.78539816339744831i
    1215log2:3 3 3
     
    1821cbrt:3 3 3
    1922hypot:1.41421 1.4142135623731 1.41421356237309505
    20 pow:1 1 1 0.273957+0.583701i 0.273957253830121+0.583700758758615i 0.273957253830121071+0.583700758758614628i
    2123sin:0.841471 0.841470984807897 0.841470984807896507 1.29846+0.634964i 1.29845758141598+0.634963914784736i 1.29845758141597729+0.634963914784736108i
    2224cos:0.540302 0.54030230586814 0.540302305868139717 0.83373-0.988898i 0.833730025131149-0.988897705762865i 0.833730025131149049-0.988897705762865096i
     
    5355frexp:0.5 3 0.5 3 0.5 3
    5456ldexp:8 8 8
    55 modf:2 0.3 2 0.3 2 0.3 nextafter:2 2 2
     57modf:2 0.3 2 0.3 2 0.3
     58modf:2, 0.3 2, 0.3 2, 0.3
     59nextafter:2 2 2
    5660nexttoward:2 2 2
    5761scalbn:16 16 16
  • src/tests/alloc.c

    rfd344aa r9236060  
    1010// Created On       : Wed Feb  3 07:56:22 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jun  2 15:13:03 2017
    13 // Update Count     : 316
    14 //
    15 
    16 #include <assert>
    17 extern "C" {
    18 #include <malloc.h>                                     // malloc_usable_size
    19 #include <stdint.h>                                     // uintptr_t
    20 #include <stdlib.h>                                     // posix_memalign
    21 } // extern
     12// Last Modified On : Thu Jul 20 16:01:10 2017
     13// Update Count     : 318
     14//
     15
     16#include <assert.h>
     17#include <malloc.h>                                                                             // malloc_usable_size
     18#include <stdint.h>                                                                             // uintptr_t
     19#include <stdlib.h>                                                                             // posix_memalign
    2220#include <fstream>
    23 #include <stdlib>                                       // access C malloc, realloc
     21#include <stdlib>                                                                                       // access C malloc, realloc
    2422
    2523int * foo( int * p, int c ) { return p; }
  • src/tests/attributes.c

    rfd344aa r9236060  
    1 //                               -*- Mode: C -*-
    21//
    32// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
     
    1110// Created On       : Mon Feb  6 16:07:02 2017
    1211// Last Modified By : Peter A. Buhr
    13 // Last Modified On : Mon Feb  6 16:08:21 2017
    14 // Update Count     : 2
     12// Last Modified On : Fri Jul 21 23:05:52 2017
     13// Update Count     : 3
    1514//
    1615
  • src/tests/avltree/avl-private.h

    rfd344aa r9236060  
    1 #ifndef AVL_PRIVATE_H
     1#pragma once
    22#include "avl.h"
    33
     
    1414forall(otype K | Comparable(K), otype V)
    1515int height(tree(K, V) * t);
    16 
    17 #endif
  • src/tests/avltree/avl.h

    rfd344aa r9236060  
    1 #ifndef AVL_TREE_H
    2 #define AVL_TREE_H
     1#pragma once
    32
    43extern "C" {
     
    104103//     printTree(t, 0);
    105104// }
    106 
    107 
    108 #endif
  • src/tests/designations.c

    rfd344aa r9236060  
    99// Author           : Rob Schluntz
    1010// Created On       : Thu Jun 29 15:26:36 2017
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Thu Jun 29 15:27:05 2017
    13 // Update Count     : 2
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu Jul 27 11:46:35 2017
     13// Update Count     : 3
    1414//
    1515
     
    8989};
    9090
     91struct 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};
     101struct Fred s1 @= { .m.j : 3 };
     102struct Fred s2 @= { .i : { [2] : 2 } };
     103
    91104int main() {
    92105        // simple designation case - starting from beginning of structure, leaves ptr default-initialized (zero)
     
    199212        };
    200213#endif
    201 
     214        // array designation
     215        int i[2] = { [1] : 3 };
    202216        // allowed to have 'too many' initialized lists - essentially they are ignored.
    203217        int i1 = { 3 };
     
    240254        const char * str0 = "hello";
    241255        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'} };
    242259}
    243260
  • src/tests/except-0.c

    rfd344aa r9236060  
    66#include <stdbool.h>
    77
     8// Local type to mark exits from scopes. (see ERROR)
    89struct signal_exit {
    910        const char * area;
     
    1920}
    2021
    21 void terminate(int except_value) {
     22
     23// Local Exception Types and manual vtable types.
     24//#define TRIVIAL_EXCEPTION(name) //TRIVAL_EXCEPTION(yin)
     25struct yin;
     26struct 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};
     33struct yin {
     34        struct yin_vtable const * parent;
     35};
     36void yin_msg(yin) {
     37        return "in";
     38}
     39yin_vtable _yin_vtable_instance = {
     40        &_exception_t_vtable_instance, sizeof(yin), ?{}, ^?{}, yin_msg
     41}
     42
     43
     44void terminate(exception * except_value) {
    2245        signal_exit a = {"terminate function"};
    2346        throw except_value;
     
    2548}
    2649
    27 void resume(int except_value) {
     50void resume(exception * except_value) {
    2851        signal_exit a = {"resume function"};
    2952        throwResume except_value;
  • src/tests/gmp.c

    rfd344aa r9236060  
    1010// Created On       : Tue Apr 19 08:55:51 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed May 24 22:05:38 2017
    13 // Update Count     : 540
     12// Last Modified On : Thu Jul 13 16:35:01 2017
     13// Update Count     : 541
    1414//
    1515
     
    9595// Local Variables: //
    9696// tab-width: 4 //
    97 // compile-command: "cfa gmp.c -l gmp" //
     97// compile-command: "cfa gmp.c -lgmp" //
    9898// End: //
  • src/tests/math.c

    rfd344aa r9236060  
    1010// Created On       : Fri Apr 22 14:59:21 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed May 24 13:04:33 2017
    13 // Update Count     : 71
     12// Last Modified On : Wed Aug  9 07:20:49 2017
     13// Update Count     : 77
    1414//
    1515
     
    3131        l = remquo( 3.6L, 0.5L, &quot );
    3232        sout | quot | l | endl;
    33         f = div( 3.6F, 0.5F, &quot );
    34         sout | "div:" | quot | f;
    35         d = div( 3.6D, 0.5F, &quot );
    36         sout | quot | d;
    37         l = div( 3.6L, 0.5L, &quot );
    38         sout | quot | l | endl;
     33        sout | "div:" | div( 3.6F, 0.5F ) | div( 3.6D, 0.5D ) | div( 3.6L, 0.5L ) | endl;
    3934        sout | "fma:" | fma( 3.0F, -1.0F, 1.0F ) | fma( 3.0D, -1.0D, 1.0D ) | fma( 3.0L, -1.0L, , 1.0L ) | endl;
    4035        sout | "fdim:" | fdim( 1.0F, -1.0F ) | fdim( 1.0D, -1.0D ) | fdim( 1.0L, -1.0L ) | endl;
     
    4641        sout | "exp2:" | exp2( 1.0F ) | exp2( 1.0D ) | exp2( 1.0L ) | endl;
    4742        sout | "expm1:" | expm1( 1.0F ) | expm1( 1.0D ) | expm1( 1.0L ) | endl;
     43        sout | "pow:" | pow( 1.0F, 1.0F ) | pow( 1.0D, 1.0D ) | pow( 1.0L, 1.0L ) | pow( 1.0F+1.0FI, 1.0F+1.0FI ) | pow( 1.0D+1.0DI, 1.0D+1.0DI ) | pow( 1.0DL+1.0LI, 1.0DL+1.0LI ) | endl;
     44
     45        int b = 4;
     46        unsigned int e = 2;
     47    b \= e;
     48    sout | b | b \ e | endl;
     49    sout | 'a' \ 3u | 2 \ 8u | 4 \ 3u | -4 \ 3u | 4 \ -3 | -4 \ -3 | 4.0 \ 2.1 | (1.0f+2.0fi) \ (3.0f+2.0fi) | endl;
     50
     51        //---------------------- Logarithm ----------------------
     52
    4853        sout | "log:" | log( 1.0F ) | log( 1.0D ) | log( 1.0L ) | log( 1.0F+1.0FI ) | log( 1.0D+1.0DI ) | log( 1.0DL+1.0LI ) | endl;
    4954        sout | "log2:" | log2( 8.0F ) | log2( 8.0D ) | log2( 8.0L ) | endl;
     
    5358        sout | "logb:" | logb( 8.0F ) | logb( 8.0D ) | logb( 8.0L ) | endl;
    5459
    55         //---------------------- Power ----------------------
    56 
    5760        sout | "sqrt:" | sqrt( 1.0F ) | sqrt( 1.0D ) | sqrt( 1.0L ) | sqrt( 1.0F+1.0FI ) | sqrt( 1.0D+1.0DI ) | sqrt( 1.0DL+1.0LI ) | endl;
    5861        sout | "cbrt:" | cbrt( 27.0F ) | cbrt( 27.0D ) | cbrt( 27.0L ) | endl;
    5962        sout | "hypot:" | hypot( 1.0F, -1.0F ) | hypot( 1.0D, -1.0D ) | hypot( 1.0L, -1.0L ) | endl;
    60         sout | "pow:" | pow( 1.0F, 1.0F ) | pow( 1.0D, 1.0D ) | pow( 1.0L, 1.0L ) | pow( 1.0F+1.0FI, 1.0F+1.0FI ) | pow( 1.0D+1.0DI, 1.0D+1.0DI ) | pow( 1.0DL+1.0LI, 1.0DL+1.0LI ) | endl;
    6163
    6264        //---------------------- Trigonometric ----------------------
     
    130132        sout | di | d;
    131133        l = modf( 2.3L, &ldi );
    132         sout | ldi | l;
     134        sout | ldi | l | endl;
     135        sout | "modf:" | modf( 2.3F ) | modf( 2.3D ) | modf( 2.3L ) | endl;
    133136        sout | "nextafter:" | nextafter( 2.0F, 3.0F ) | nextafter( 2.0D, 3.0D ) | nextafter( 2.0L, 3.0L ) | endl;
    134137        sout | "nexttoward:" | nexttoward( 2.0F, 3.0F ) | nexttoward( 2.0D, 3.0D ) | nexttoward( 2.0L, 3.0L ) | endl;
  • src/tests/maybe.c

    rfd344aa r9236060  
    99// Author           : Andrew Beach
    1010// Created On       : Thr May 25 16:02:00 2017
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Fri May 16 15:43:00 2017
    13 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu Jul 20 15:24:07 2017
     13// Update Count     : 1
    1414//
    1515
    16 #include <assert>
     16#include <assert.h>
    1717#include <containers/maybe>
    1818
  • src/tests/preempt_longrun/Makefile.am

    rfd344aa r9236060  
    2525CC = @CFA_BINDIR@/@CFA_NAME@
    2626
    27 TESTS = barge block create disjoint enter enter3 processor stack wait yield
     27TESTS = block create disjoint enter enter3 processor stack wait yield
    2828
    2929.INTERMEDIATE: ${TESTS}
    3030
    3131all-local: ${TESTS:=.run}
     32
     33clean-local:
     34        rm -f ${TESTS}
    3235
    3336% : %.c ${CC}
  • src/tests/preempt_longrun/Makefile.in

    rfd344aa r9236060  
    453453REPEAT = ${abs_top_srcdir}/tools/repeat -s
    454454BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -DPREEMPTION_RATE=${preempt}
    455 TESTS = barge block create disjoint enter enter3 processor stack wait yield
     455TESTS = block create disjoint enter enter3 processor stack wait yield
    456456all: all-am
    457457
     
    635635                TEST_LOGS="$$log_list"; \
    636636        exit $$?
    637 barge.log: barge
    638         @p='barge'; \
    639         b='barge'; \
    640         $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
    641         --log-file $$b.log --trs-file $$b.trs \
    642         $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
    643         "$$tst" $(AM_TESTS_FD_REDIRECT)
    644637block.log: block
    645638        @p='block'; \
     
    790783clean: clean-am
    791784
    792 clean-am: clean-generic mostlyclean-am
     785clean-am: clean-generic clean-local mostlyclean-am
    793786
    794787distclean: distclean-am
     
    857850
    858851.PHONY: all all-am all-local check check-TESTS check-am clean \
    859         clean-generic cscopelist-am ctags-am distclean \
     852        clean-generic clean-local cscopelist-am ctags-am distclean \
    860853        distclean-generic distdir dvi dvi-am html html-am info info-am \
    861854        install install-am install-data install-data-am install-dvi \
     
    875868all-local: ${TESTS:=.run}
    876869
     870clean-local:
     871        rm -f ${TESTS}
     872
    877873% : %.c ${CC}
    878874        ${AM_V_GEN}${CC} ${CFLAGS} ${<} -o ${@}
  • src/tests/preempt_longrun/create.c

    rfd344aa r9236060  
    11#include <kernel>
    22#include <thread>
     3
     4static const unsigned long N = 2_000ul;
    35
    46#ifndef PREEMPTION_RATE
     
    1618int main(int argc, char* argv[]) {
    1719        processor p;
    18         for(int i = 0; i < 10_000ul; i++) {
     20        for(int i = 0; i < N; i++) {
    1921                worker_t w[7];
    2022        }
  • src/tests/preempt_longrun/enter.c

    rfd344aa r9236060  
    33#include <thread>
    44
    5 #undef N
    65static const unsigned long N  = 70_000ul;
    76
  • src/tests/preempt_longrun/enter3.c

    rfd344aa r9236060  
    33#include <thread>
    44
    5 #undef N
    65static const unsigned long N  = 50_000ul;
    76
  • src/tests/preempt_longrun/processor.c

    rfd344aa r9236060  
    11#include <kernel>
    22#include <thread>
     3
     4static const unsigned long N = 5_000ul;
    35
    46#ifndef PREEMPTION_RATE
     
    1517
    1618int main(int argc, char* argv[]) {
    17         for(int i = 0; i < 10_000ul; i++) {
     19        for(int i = 0; i < N; i++) {
    1820                processor p;
    1921        }
  • src/tests/preempt_longrun/yield.c

    rfd344aa r9236060  
    11#include <kernel>
    22#include <thread>
     3
     4static const unsigned long N = 325_000ul;
    35
    46#ifndef PREEMPTION_RATE
     
    1315
    1416void main(worker_t * this) {
    15         for(int i = 0; i < 325_000ul; i++) {
     17        for(int i = 0; i < N; i++) {
    1618                yield();
    1719        }
  • src/tests/result.c

    rfd344aa r9236060  
    99// Author           : Andrew Beach
    1010// Created On       : Thr May 25 16:50:00 2017
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Jun 16 15:42:00 2017
    13 // Update Count     : 0
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu Jul 20 15:24:12 2017
     13// Update Count     : 1
    1414//
    1515
    16 #include <assert>
     16#include <assert.h>
    1717#include <containers/result>
    1818
  • src/tests/sched-int-barge.c

    rfd344aa r9236060  
    55#include <thread>
    66
     7static const unsigned long N = 50_000ul;
     8
     9#ifndef PREEMPTION_RATE
     10#define PREEMPTION_RATE 10_000ul
     11#endif
     12
     13unsigned int default_preemption() {
     14        return 0;
     15}
    716enum state_t { WAIT, SIGNAL, BARGE };
    817
     
    1019
    1120monitor global_data_t {
    12         bool done;
     21        volatile bool done;
    1322        int counter;
    1423        state_t state;
     
    5160                c.do_wait2 = ((unsigned)rand48()) % (c.do_signal);
    5261
    53                 // if(c.do_wait1 == c.do_wait2) sout | "Same" | endl;
     62                if(c.do_wait1 == c.do_wait2) sout | "Same" | endl;
    5463        }
    5564
     
    7382        }
    7483
    75         if( c.counter >= 100_000 ) c.done = true;
     84        if( c.counter >= N ) c.done = true;
    7685        return !c.done;
    7786}
     
    8998}
    9099
     100static thread_desc * volatile the_threads;
     101
    91102int main(int argc, char* argv[]) {
    92103        rand48seed(0);
     
    94105        {
    95106                Threads t[17];
     107                the_threads = (thread_desc*)t;
    96108        }
    97109}
  • src/tests/sched-int-block.c

    rfd344aa r9236060  
    55#include <thread>
    66
    7 #ifndef N
    8 #define N 10_000
     7#include <time.h>
     8
     9static const unsigned long N = 5_000ul;
     10
     11#ifndef PREEMPTION_RATE
     12#define PREEMPTION_RATE 10_000ul
    913#endif
     14
     15unsigned int default_preemption() {
     16        return PREEMPTION_RATE;
     17}
    1018
    1119enum state_t { WAITED, SIGNAL, BARGE };
     
    102110
    103111int main(int argc, char* argv[]) {
    104         rand48seed(0);
     112        rand48seed( time( NULL ) );
    105113        done = false;
    106114        processor p;
  • src/tests/sched-int-disjoint.c

    rfd344aa r9236060  
    44#include <thread>
    55
    6 #ifndef N
    7 #define N 10_000
     6static const unsigned long N = 10_000ul;
     7
     8#ifndef PREEMPTION_RATE
     9#define PREEMPTION_RATE 10_000ul
    810#endif
     11
     12unsigned int default_preemption() {
     13        return PREEMPTION_RATE;
     14}
    915
    1016enum state_t { WAIT, SIGNAL, BARGE };
  • src/tests/sched-int-wait.c

    rfd344aa r9236060  
    55#include <thread>
    66
    7 #ifndef N
    8 #define N 10_000
     7static const unsigned long N = 10_000ul;
     8
     9#ifndef PREEMPTION_RATE
     10#define PREEMPTION_RATE 10_000ul
    911#endif
     12
     13unsigned int default_preemption() {
     14        return PREEMPTION_RATE;
     15}
    1016
    1117monitor global_t {};
     
    114120int main(int argc, char* argv[]) {
    115121        waiter_left = 4;
    116         processor p;
     122        processor p[2];
    117123        sout | "Starting" | endl;
    118124        {
  • src/tests/test.py

    rfd344aa r9236060  
    221221                if   retcode == TestResult.SUCCESS:     result_txt = "Done"
    222222                elif retcode == TestResult.TIMEOUT:     result_txt = "TIMEOUT"
    223                 else :                                          result_txt = "ERROR"
     223                else :                                          result_txt = "ERROR code %d" % retcode
    224224        else :
    225225                if   retcode == TestResult.SUCCESS:     result_txt = "PASSED"
    226226                elif retcode == TestResult.TIMEOUT:     result_txt = "TIMEOUT"
    227                 else :                                          result_txt = "FAILED"
     227                else :                                          result_txt = "FAILED with code %d" % retcode
    228228
    229229        #print result with error if needed
  • src/tests/vector/array.h

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Wed May 27 17:56:53 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Apr 27 17:26:04 2016
    13 // Update Count     : 5
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 10:04:20 2017
     13// Update Count     : 6
    1414//
    1515
    16 #ifndef ARRAY_H
    17 #define ARRAY_H
     16#pragma once
    1817
    1918//#include <iterator>
     
    4544elt_type * end( array_type * array );
    4645
    47 #endif // ARRAY_H
    48 
    4946// Local Variables: //
    5047// tab-width: 4 //
  • src/tests/vector/vector_int.h

    rfd344aa r9236060  
    99// Author           : Richard C. Bilson
    1010// Created On       : Wed May 27 17:56:53 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Wed Apr 27 17:26:59 2016
    13 // Update Count     : 2
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sat Jul 22 10:04:02 2017
     13// Update Count     : 4
    1414//
    1515
    16 #ifndef VECTOR_INT_H
    17 #define VECTOR_INT_H
     16#pragma once
    1817
    1918// A flexible array, similar to a C++ vector, that holds integers and can be resized dynamically
     
    2726void ?{}( vector_int & );                                                               // allocate vector with default capacity
    2827void ?{}( vector_int &, int reserve );                                  // allocate vector with specified capacity
    29 void ?{}( vector_int & vec, vector_int other );                 // copy constructor
    30 void ^?{}( vector_int & );                                                              // deallocate vector's storage
     28void ?{}( vector_int & vec, vector_int other );     // copy constructor
     29void ^?{}( vector_int & );                // deallocate vector's storage
    3130
    3231void reserve( vector_int *vec, int reserve );                   // reserve more capacity
     
    3635
    3736int & ?[?]( vector_int * vec, int index );                              // access to arbitrary element (does not resize)
    38 int last( vector_int * vec );                                                   // return last element
    39 
    40 #endif // VECTOR_INT_H
     37int last( vector_int * vec );             // return last element
    4138
    4239// Local Variables: //
  • tools/cfa.nanorc

    rfd344aa r9236060  
    88
    99# Types
    10 color green "\<(forall|otype|dtype|ftype|trait|mutex|_Bool|volatile)\>"
     10color green "\<(forall|trait|(o|d|f|t)type|mutex|_Bool|volatile|virtual)\>"
    1111color green "\<(float|double|bool|char|int|short|long|sizeof|enum|void|auto)\>"
    1212color green "\<(static|const|struct|union|typedef|extern|(un)?signed|inline)\>"
     
    1414
    1515# Declarations
    16 color brightgreen "\<(struct|union|typedef|trait|coroutine|monitor)\>"
     16color brightgreen "\<(struct|union|typedef|trait|coroutine|monitor|thread)\>"
     17color brightgreen "\<(with)\>"
    1718
    1819# Control Flow Structures
  • tools/prettyprinter/ParserTypes.h

    rfd344aa r9236060  
    1313// Created On       : Sun Dec 16 15:00:49 2001
    1414// Last Modified By : Peter A. Buhr
    15 // Last Modified On : Wed Jun 28 22:59:27 2017
    16 // Update Count     : 174
     15// Last Modified On : Sat Jul 22 10:13:09 2017
     16// Update Count     : 175
    1717//
    1818
    19 #ifndef __PARSER_HH__
    20 #define __PARSER_HH__
     19#pragma once
    2120
    2221int yylex();
     
    2625#include "token.h"
    2726
    28 #endif // __PARSER_HH__
    29 
    3027// Local Variables: //
    3128// mode: c++ //
  • tools/prettyprinter/filter.h

    rfd344aa r9236060  
    1010// Created On       : Tue Apr  9 22:31:18 2002
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jun 29 08:28:32 2017
    13 // Update Count     : 10
     12// Last Modified On : Sat Jul 22 10:12:55 2017
     13// Update Count     : 11
    1414//
    1515
    16 #ifndef __FILTER_H__
    17 #define __FILTER_H__
     16#pragma once
    1817
    1918#include "ParserTypes.h"
     
    2827void HTML( Token * tree );
    2928
    30 #endif // __FILTER_H__
    31 
    3229// Local Variables: //
    3330// mode: c++ //
  • tools/prettyprinter/lex.ll

    rfd344aa r9236060  
    1 /*                               -*- Mode: C -*-
    2  *
     1/*
    32 * Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
    43 *
     
    1110 * Created On       : Sat Dec 15 11:45:59 2001
    1211 * Last Modified By : Peter A. Buhr
    13  * Last Modified On : Wed Jun 28 22:57:17 2017
    14  * Update Count     : 253
     12 * Last Modified On : Fri Jul 21 23:06:16 2017
     13 * Update Count     : 254
    1514 */
    1615
  • tools/prettyprinter/test.y

    rfd344aa r9236060  
    1515        ;
    1616
    17 rules1  : /* empty */
     17rules1  :
     18        /* empty */
     19        {}
    1820        | xxx
    1921          /* fred */ yyy
  • tools/prettyprinter/token.cc

    rfd344aa r9236060  
    1 //                              -*- Mode: C++ -*-
    21//
    3 // Copyright (C) Peter A. Buhr 2017
     2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
     3//
     4// The contents of this file are covered under the licence agreement in the
     5// file "LICENCE" distributed with Cforall.
    46//
    57// Pretty Printer, Copyright (C) Richard C. Bilson and Rodolfo G. Esteves 2001
     
    1012// Created On       : Wed Jun 28 22:46:23 2017
    1113// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jun 29 09:33:49 2017
    13 // Update Count     : 9
     14// Last Modified On : Fri Jul 21 23:07:04 2017
     15// Update Count     : 10
    1416//
    1517
  • tools/prettyprinter/token.h

    rfd344aa r9236060  
    1010// Created On       : Wed Jun 28 22:47:58 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jun 28 23:02:06 2017
    13 // Update Count     : 5
     12// Last Modified On : Sat Jul 22 10:12:42 2017
     13// Update Count     : 6
    1414//
    1515
    16 #ifndef __TOKEN_H__
    17 #define __TOKEN_H__
     16#pragma once
    1817
    1918struct Token {
     
    3534};
    3635
    37 #endif // __TOKEN_H__
    38 
    3936// Local Variables: //
    4037// tab-width: 4 //
Note: See TracChangeset for help on using the changeset viewer.