Changes in / [fea3faa:b826e6b]


Ignore:
Files:
39 added
29 deleted
160 edited

Legend:

Unmodified
Added
Removed
  • .gitignore

    rfea3faa rb826e6b  
    3737src/libcfa/libcfa-prelude.c
    3838
    39 # generated by bison and lex from cfa.yy and lex.ll, respectively
     39# generated by bison and lex from parser.yy and lex.ll
    4040src/Parser/parser.output
    4141src/Parser/lex.cc
    4242src/Parser/parser.cc
    4343src/Parser/parser.h
     44src/Parser/parser.hh
     45
     46tools/prettyprinter/parser.output
     47tools/prettyprinter/lex.cc
     48tools/prettyprinter/parser.cc
     49tools/prettyprinter/parser.h
     50tools/prettyprinter/parser.hh
     51tools/prettyprinter/pretty
     52tools/pretty
    4453
    4554# generated by xfig for user manual
     
    4756doc/user/pointer1.tex
    4857doc/user/pointer2.tex
     58doc/user/EHMHierarchy.tex
  • Makefile.in

    rfea3faa rb826e6b  
    1 # Makefile.in generated by automake 1.11.3 from Makefile.am.
     1# Makefile.in generated by automake 1.15 from Makefile.am.
    22# @configure_input@
    33
    4 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
    5 # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
    6 # Foundation, Inc.
     4# Copyright (C) 1994-2014 Free Software Foundation, Inc.
     5
    76# This Makefile.in is free software; the Free Software Foundation
    87# gives unlimited permission to copy and/or distribute it,
     
    1918###############################################################################
    2019VPATH = @srcdir@
     20am__is_gnu_make = { \
     21  if test -z '$(MAKELEVEL)'; then \
     22    false; \
     23  elif test -n '$(MAKE_HOST)'; then \
     24    true; \
     25  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
     26    true; \
     27  else \
     28    false; \
     29  fi; \
     30}
     31am__make_running_with_option = \
     32  case $${target_option-} in \
     33      ?) ;; \
     34      *) echo "am__make_running_with_option: internal error: invalid" \
     35              "target option '$${target_option-}' specified" >&2; \
     36         exit 1;; \
     37  esac; \
     38  has_opt=no; \
     39  sane_makeflags=$$MAKEFLAGS; \
     40  if $(am__is_gnu_make); then \
     41    sane_makeflags=$$MFLAGS; \
     42  else \
     43    case $$MAKEFLAGS in \
     44      *\\[\ \   ]*) \
     45        bs=\\; \
     46        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
     47          | sed "s/$$bs$$bs[$$bs $$bs   ]*//g"`;; \
     48    esac; \
     49  fi; \
     50  skip_next=no; \
     51  strip_trailopt () \
     52  { \
     53    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
     54  }; \
     55  for flg in $$sane_makeflags; do \
     56    test $$skip_next = yes && { skip_next=no; continue; }; \
     57    case $$flg in \
     58      *=*|--*) continue;; \
     59        -*I) strip_trailopt 'I'; skip_next=yes;; \
     60      -*I?*) strip_trailopt 'I';; \
     61        -*O) strip_trailopt 'O'; skip_next=yes;; \
     62      -*O?*) strip_trailopt 'O';; \
     63        -*l) strip_trailopt 'l'; skip_next=yes;; \
     64      -*l?*) strip_trailopt 'l';; \
     65      -[dEDm]) skip_next=yes;; \
     66      -[JT]) skip_next=yes;; \
     67    esac; \
     68    case $$flg in \
     69      *$$target_option*) has_opt=yes; break;; \
     70    esac; \
     71  done; \
     72  test $$has_opt = yes
     73am__make_dryrun = (target_option=n; $(am__make_running_with_option))
     74am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
    2175pkgdatadir = $(datadir)/@PACKAGE@
    2276pkgincludedir = $(includedir)/@PACKAGE@
     
    3892host_triplet = @host@
    3993subdir = .
    40 DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
    41         $(srcdir)/Makefile.in $(srcdir)/config.h.in \
    42         $(top_srcdir)/configure INSTALL automake/compile \
    43         automake/config.guess automake/config.sub automake/depcomp \
    44         automake/install-sh automake/missing automake/ylwrap
    4594ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
    4695am__aclocal_m4_deps = $(top_srcdir)/configure.ac
    4796am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
    4897        $(ACLOCAL_M4)
     98DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
     99        $(am__configure_deps) $(am__DIST_COMMON)
    49100am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
    50101 configure.lineno config.status.lineno
     
    53104CONFIG_CLEAN_FILES =
    54105CONFIG_CLEAN_VPATH_FILES =
     106AM_V_P = $(am__v_P_@AM_V@)
     107am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
     108am__v_P_0 = false
     109am__v_P_1 = :
    55110AM_V_GEN = $(am__v_GEN_@AM_V@)
    56111am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
    57 am__v_GEN_0 = @echo "  GEN   " $@;
     112am__v_GEN_0 = @echo "  GEN     " $@;
     113am__v_GEN_1 =
    58114AM_V_at = $(am__v_at_@AM_V@)
    59115am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
    60116am__v_at_0 = @
     117am__v_at_1 =
    61118SOURCES =
    62119DIST_SOURCES =
    63 RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
    64         html-recursive info-recursive install-data-recursive \
    65         install-dvi-recursive install-exec-recursive \
    66         install-html-recursive install-info-recursive \
    67         install-pdf-recursive install-ps-recursive install-recursive \
    68         installcheck-recursive installdirs-recursive pdf-recursive \
    69         ps-recursive uninstall-recursive
     120RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
     121        ctags-recursive dvi-recursive html-recursive info-recursive \
     122        install-data-recursive install-dvi-recursive \
     123        install-exec-recursive install-html-recursive \
     124        install-info-recursive install-pdf-recursive \
     125        install-ps-recursive install-recursive installcheck-recursive \
     126        installdirs-recursive pdf-recursive ps-recursive \
     127        tags-recursive uninstall-recursive
     128am__can_run_installinfo = \
     129  case $$AM_UPDATE_INFO_DIR in \
     130    n|no|NO) false;; \
     131    *) (install-info --version) >/dev/null 2>&1;; \
     132  esac
    70133RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
    71134  distclean-recursive maintainer-clean-recursive
    72 AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
    73         $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
    74         distdir dist dist-all distcheck
     135am__recursive_targets = \
     136  $(RECURSIVE_TARGETS) \
     137  $(RECURSIVE_CLEAN_TARGETS) \
     138  $(am__extra_recursive_targets)
     139AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
     140        cscope distdir dist dist-all distcheck
     141am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
     142        $(LISP)config.h.in
     143# Read a list of newline-separated strings from the standard input,
     144# and print each of them once, without duplicates.  Input order is
     145# *not* preserved.
     146am__uniquify_input = $(AWK) '\
     147  BEGIN { nonempty = 0; } \
     148  { items[$$0] = 1; nonempty = 1; } \
     149  END { if (nonempty) { for (i in items) print i; }; } \
     150'
     151# Make sure the list of sources is unique.  This is necessary because,
     152# e.g., the same source file might be shared among _SOURCES variables
     153# for different programs/libraries.
     154am__define_uniq_tagged_files = \
     155  list='$(am__tagged_files)'; \
     156  unique=`for i in $$list; do \
     157    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
     158  done | $(am__uniquify_input)`
    75159ETAGS = etags
    76160CTAGS = ctags
     161CSCOPE = cscope
    77162DIST_SUBDIRS = $(SUBDIRS)
     163am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
     164        $(top_srcdir)/automake/compile \
     165        $(top_srcdir)/automake/config.guess \
     166        $(top_srcdir)/automake/config.sub \
     167        $(top_srcdir)/automake/install-sh \
     168        $(top_srcdir)/automake/missing INSTALL README automake/compile \
     169        automake/config.guess automake/config.sub automake/depcomp \
     170        automake/install-sh automake/missing automake/ylwrap
    78171DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
    79172distdir = $(PACKAGE)-$(VERSION)
     
    85178      || { sleep 5 && rm -rf "$(distdir)"; }; \
    86179  else :; fi
     180am__post_remove_distdir = $(am__remove_distdir)
    87181am__relativize = \
    88182  dir0=`pwd`; \
     
    112206DIST_ARCHIVES = $(distdir).tar.gz
    113207GZIP_ENV = --best
     208DIST_TARGETS = dist-gzip
    114209distuninstallcheck_listfiles = find . -type f -print
    115210am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
     
    227322program_transform_name = @program_transform_name@
    228323psdir = @psdir@
     324runstatedir = @runstatedir@
    229325sbindir = @sbindir@
    230326sharedstatedir = @sharedstatedir@
     
    258354        $(am__cd) $(top_srcdir) && \
    259355          $(AUTOMAKE) --foreign Makefile
    260 .PRECIOUS: Makefile
    261356Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
    262357        @case '$?' in \
     
    279374
    280375config.h: stamp-h1
    281         @if test ! -f $@; then rm -f stamp-h1; else :; fi
    282         @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
     376        @test -f $@ || rm -f stamp-h1
     377        @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
    283378
    284379stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
     
    294389
    295390# This directory's subdirectories are mostly independent; you can cd
    296 # into them and run `make' without going through this Makefile.
    297 # To change the values of `make' variables: instead of editing Makefiles,
    298 # (1) if the variable is set in `config.status', edit `config.status'
    299 #     (which will cause the Makefiles to be regenerated when you run `make');
    300 # (2) otherwise, pass the desired values on the `make' command line.
    301 $(RECURSIVE_TARGETS):
    302         @fail= failcom='exit 1'; \
    303         for f in x $$MAKEFLAGS; do \
    304           case $$f in \
    305             *=* | --[!k]*);; \
    306             *k*) failcom='fail=yes';; \
    307           esac; \
    308         done; \
     391# into them and run 'make' without going through this Makefile.
     392# To change the values of 'make' variables: instead of editing Makefiles,
     393# (1) if the variable is set in 'config.status', edit 'config.status'
     394#     (which will cause the Makefiles to be regenerated when you run 'make');
     395# (2) otherwise, pass the desired values on the 'make' command line.
     396$(am__recursive_targets):
     397        @fail=; \
     398        if $(am__make_keepgoing); then \
     399          failcom='fail=yes'; \
     400        else \
     401          failcom='exit 1'; \
     402        fi; \
    309403        dot_seen=no; \
    310404        target=`echo $@ | sed s/-recursive//`; \
    311         list='$(SUBDIRS)'; for subdir in $$list; do \
     405        case "$@" in \
     406          distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
     407          *) list='$(SUBDIRS)' ;; \
     408        esac; \
     409        for subdir in $$list; do \
    312410          echo "Making $$target in $$subdir"; \
    313411          if test "$$subdir" = "."; then \
     
    324422        fi; test -z "$$fail"
    325423
    326 $(RECURSIVE_CLEAN_TARGETS):
    327         @fail= failcom='exit 1'; \
    328         for f in x $$MAKEFLAGS; do \
    329           case $$f in \
    330             *=* | --[!k]*);; \
    331             *k*) failcom='fail=yes';; \
    332           esac; \
    333         done; \
    334         dot_seen=no; \
    335         case "$@" in \
    336           distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
    337           *) list='$(SUBDIRS)' ;; \
    338         esac; \
    339         rev=''; for subdir in $$list; do \
    340           if test "$$subdir" = "."; then :; else \
    341             rev="$$subdir $$rev"; \
    342           fi; \
    343         done; \
    344         rev="$$rev ."; \
    345         target=`echo $@ | sed s/-recursive//`; \
    346         for subdir in $$rev; do \
    347           echo "Making $$target in $$subdir"; \
    348           if test "$$subdir" = "."; then \
    349             local_target="$$target-am"; \
    350           else \
    351             local_target="$$target"; \
    352           fi; \
    353           ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
    354           || eval $$failcom; \
    355         done && test -z "$$fail"
    356 tags-recursive:
    357         list='$(SUBDIRS)'; for subdir in $$list; do \
    358           test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
    359         done
    360 ctags-recursive:
    361         list='$(SUBDIRS)'; for subdir in $$list; do \
    362           test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
    363         done
    364 
    365 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
    366         list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
    367         unique=`for i in $$list; do \
    368             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    369           done | \
    370           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    371               END { if (nonempty) { for (i in files) print i; }; }'`; \
    372         mkid -fID $$unique
    373 tags: TAGS
    374 
    375 TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
    376                 $(TAGS_FILES) $(LISP)
     424ID: $(am__tagged_files)
     425        $(am__define_uniq_tagged_files); mkid -fID $$unique
     426tags: tags-recursive
     427TAGS: tags
     428
     429tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
    377430        set x; \
    378431        here=`pwd`; \
     
    390443          fi; \
    391444        done; \
    392         list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
    393         unique=`for i in $$list; do \
    394             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    395           done | \
    396           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    397               END { if (nonempty) { for (i in files) print i; }; }'`; \
     445        $(am__define_uniq_tagged_files); \
    398446        shift; \
    399447        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
     
    407455          fi; \
    408456        fi
    409 ctags: CTAGS
    410 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
    411                 $(TAGS_FILES) $(LISP)
    412         list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
    413         unique=`for i in $$list; do \
    414             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    415           done | \
    416           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    417               END { if (nonempty) { for (i in files) print i; }; }'`; \
     457ctags: ctags-recursive
     458
     459CTAGS: ctags
     460ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
     461        $(am__define_uniq_tagged_files); \
    418462        test -z "$(CTAGS_ARGS)$$unique" \
    419463          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
     
    424468          && $(am__cd) $(top_srcdir) \
    425469          && gtags -i $(GTAGS_ARGS) "$$here"
     470cscope: cscope.files
     471        test ! -s cscope.files \
     472          || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
     473clean-cscope:
     474        -rm -f cscope.files
     475cscope.files: clean-cscope cscopelist
     476cscopelist: cscopelist-recursive
     477
     478cscopelist-am: $(am__tagged_files)
     479        list='$(am__tagged_files)'; \
     480        case "$(srcdir)" in \
     481          [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
     482          *) sdir=$(subdir)/$(srcdir) ;; \
     483        esac; \
     484        for i in $$list; do \
     485          if test -f "$$i"; then \
     486            echo "$(subdir)/$$i"; \
     487          else \
     488            echo "$$sdir/$$i"; \
     489          fi; \
     490        done >> $(top_builddir)/cscope.files
    426491
    427492distclean-tags:
    428493        -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
     494        -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
    429495
    430496distdir: $(DISTFILES)
     
    462528        @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
    463529          if test "$$subdir" = .; then :; else \
    464             test -d "$(distdir)/$$subdir" \
    465             || $(MKDIR_P) "$(distdir)/$$subdir" \
    466             || exit 1; \
    467           fi; \
    468         done
    469         @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
    470           if test "$$subdir" = .; then :; else \
     530            $(am__make_dryrun) \
     531              || test -d "$(distdir)/$$subdir" \
     532              || $(MKDIR_P) "$(distdir)/$$subdir" \
     533              || exit 1; \
    471534            dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
    472535            $(am__relativize); \
     
    497560dist-gzip: distdir
    498561        tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
    499         $(am__remove_distdir)
     562        $(am__post_remove_distdir)
    500563
    501564dist-bzip2: distdir
    502565        tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
    503         $(am__remove_distdir)
     566        $(am__post_remove_distdir)
    504567
    505568dist-lzip: distdir
    506569        tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
    507         $(am__remove_distdir)
    508 
    509 dist-lzma: distdir
    510         tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
    511         $(am__remove_distdir)
     570        $(am__post_remove_distdir)
    512571
    513572dist-xz: distdir
    514573        tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
    515         $(am__remove_distdir)
     574        $(am__post_remove_distdir)
    516575
    517576dist-tarZ: distdir
     577        @echo WARNING: "Support for distribution archives compressed with" \
     578                       "legacy program 'compress' is deprecated." >&2
     579        @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
    518580        tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
    519         $(am__remove_distdir)
     581        $(am__post_remove_distdir)
    520582
    521583dist-shar: distdir
     584        @echo WARNING: "Support for shar distribution archives is" \
     585                       "deprecated." >&2
     586        @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
    522587        shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
    523         $(am__remove_distdir)
     588        $(am__post_remove_distdir)
    524589
    525590dist-zip: distdir
    526591        -rm -f $(distdir).zip
    527592        zip -rq $(distdir).zip $(distdir)
    528         $(am__remove_distdir)
    529 
    530 dist dist-all: distdir
    531         tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
    532         $(am__remove_distdir)
     593        $(am__post_remove_distdir)
     594
     595dist dist-all:
     596        $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
     597        $(am__post_remove_distdir)
    533598
    534599# This target untars the dist file and tries a VPATH configuration.  Then
     
    541606        *.tar.bz2*) \
    542607          bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
    543         *.tar.lzma*) \
    544           lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
    545608        *.tar.lz*) \
    546609          lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
     
    554617          unzip $(distdir).zip ;;\
    555618        esac
    556         chmod -R a-w $(distdir); chmod a+w $(distdir)
    557         mkdir $(distdir)/_build
    558         mkdir $(distdir)/_inst
     619        chmod -R a-w $(distdir)
     620        chmod u+w $(distdir)
     621        mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
    559622        chmod a-w $(distdir)
    560623        test -d $(distdir)/_build || exit 0; \
     
    562625          && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
    563626          && am__cwd=`pwd` \
    564           && $(am__cd) $(distdir)/_build \
    565           && ../configure --srcdir=.. --prefix="$$dc_install_base" \
     627          && $(am__cd) $(distdir)/_build/sub \
     628          && ../../configure \
    566629            $(AM_DISTCHECK_CONFIGURE_FLAGS) \
    567630            $(DISTCHECK_CONFIGURE_FLAGS) \
     631            --srcdir=../.. --prefix="$$dc_install_base" \
    568632          && $(MAKE) $(AM_MAKEFLAGS) \
    569633          && $(MAKE) $(AM_MAKEFLAGS) dvi \
     
    588652          && cd "$$am__cwd" \
    589653          || exit 1
    590         $(am__remove_distdir)
     654        $(am__post_remove_distdir)
    591655        @(echo "$(distdir) archives ready for distribution: "; \
    592656          list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
     
    723787uninstall-am:
    724788
    725 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
    726         ctags-recursive install-am install-strip tags-recursive
    727 
    728 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
    729         all all-am am--refresh check check-am clean clean-generic \
    730         ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
    731         dist-lzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \
     789.MAKE: $(am__recursive_targets) all install-am install-strip
     790
     791.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
     792        am--refresh check check-am clean clean-cscope clean-generic \
     793        cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
     794        dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
    732795        distcheck distclean distclean-generic distclean-hdr \
    733796        distclean-tags distcleancheck distdir distuninstallcheck dvi \
     
    739802        installcheck installcheck-am installdirs installdirs-am \
    740803        maintainer-clean maintainer-clean-generic mostlyclean \
    741         mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \
    742         uninstall uninstall-am
     804        mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
     805        uninstall-am
     806
     807.PRECIOUS: Makefile
    743808
    744809
  • aclocal.m4

    rfea3faa rb826e6b  
    1 # generated automatically by aclocal 1.11.3 -*- Autoconf -*-
    2 
    3 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
    4 # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
    5 # Inc.
     1# generated automatically by aclocal 1.15 -*- Autoconf -*-
     2
     3# Copyright (C) 1996-2014 Free Software Foundation, Inc.
     4
    65# This file is free software; the Free Software Foundation
    76# gives unlimited permission to copy and/or distribute it,
     
    1312# PARTICULAR PURPOSE.
    1413
     14m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
    1515m4_ifndef([AC_AUTOCONF_VERSION],
    1616  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
    17 m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
    18 [m4_warning([this file was generated for autoconf 2.68.
     17m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
     18[m4_warning([this file was generated for autoconf 2.69.
    1919You have another version of autoconf.  It may work, but is not guaranteed to.
    2020If you have problems, you may need to regenerate the build system entirely.
    21 To do so, use the procedure documented by the package, typically `autoreconf'.])])
    22 
    23 # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
    24 # Foundation, Inc.
    25 #
    26 # This file is free software; the Free Software Foundation
    27 # gives unlimited permission to copy and/or distribute it,
    28 # with or without modifications, as long as this notice is preserved.
    29 
    30 # serial 1
     21To do so, use the procedure documented by the package, typically 'autoreconf'.])])
     22
     23# Copyright (C) 2002-2014 Free Software Foundation, Inc.
     24#
     25# This file is free software; the Free Software Foundation
     26# gives unlimited permission to copy and/or distribute it,
     27# with or without modifications, as long as this notice is preserved.
    3128
    3229# AM_AUTOMAKE_VERSION(VERSION)
     
    3633# (This private macro should not be called outside this file.)
    3734AC_DEFUN([AM_AUTOMAKE_VERSION],
    38 [am__api_version='1.11'
     35[am__api_version='1.15'
    3936dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
    4037dnl require some minimum version.  Point them to the right macro.
    41 m4_if([$1], [1.11.3], [],
     38m4_if([$1], [1.15], [],
    4239      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
    4340])
     
    5552# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
    5653AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
    57 [AM_AUTOMAKE_VERSION([1.11.3])dnl
     54[AM_AUTOMAKE_VERSION([1.15])dnl
    5855m4_ifndef([AC_AUTOCONF_VERSION],
    5956  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
     
    6259# Figure out how to run the assembler.                      -*- Autoconf -*-
    6360
    64 # Copyright (C) 2001, 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
    65 #
    66 # This file is free software; the Free Software Foundation
    67 # gives unlimited permission to copy and/or distribute it,
    68 # with or without modifications, as long as this notice is preserved.
    69 
    70 # serial 5
     61# Copyright (C) 2001-2014 Free Software Foundation, Inc.
     62#
     63# This file is free software; the Free Software Foundation
     64# gives unlimited permission to copy and/or distribute it,
     65# with or without modifications, as long as this notice is preserved.
    7166
    7267# AM_PROG_AS
     
    8479# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
    8580
    86 # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
    87 #
    88 # This file is free software; the Free Software Foundation
    89 # gives unlimited permission to copy and/or distribute it,
    90 # with or without modifications, as long as this notice is preserved.
    91 
    92 # serial 1
     81# Copyright (C) 2001-2014 Free Software Foundation, Inc.
     82#
     83# This file is free software; the Free Software Foundation
     84# gives unlimited permission to copy and/or distribute it,
     85# with or without modifications, as long as this notice is preserved.
    9386
    9487# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
    95 # $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
    96 # `$srcdir', `$srcdir/..', or `$srcdir/../..'.
     88# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to
     89# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
    9790#
    9891# Of course, Automake must honor this variable whenever it calls a
     
    113106# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
    114107# are both prefixed by $srcdir.  In an in-source build this is usually
    115 # harmless because $srcdir is `.', but things will broke when you
     108# harmless because $srcdir is '.', but things will broke when you
    116109# start a VPATH build or use an absolute $srcdir.
    117110#
     
    131124
    132125AC_DEFUN([AM_AUX_DIR_EXPAND],
    133 [dnl Rely on autoconf to set up CDPATH properly.
    134 AC_PREREQ([2.50])dnl
    135 # expand $ac_aux_dir to an absolute path
    136 am_aux_dir=`cd $ac_aux_dir && pwd`
     126[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
     127# Expand $ac_aux_dir to an absolute path.
     128am_aux_dir=`cd "$ac_aux_dir" && pwd`
    137129])
    138130
    139131# AM_COND_IF                                            -*- Autoconf -*-
    140132
    141 # Copyright (C) 2008, 2010 Free Software Foundation, Inc.
    142 #
    143 # This file is free software; the Free Software Foundation
    144 # gives unlimited permission to copy and/or distribute it,
    145 # with or without modifications, as long as this notice is preserved.
    146 
    147 # serial 3
     133# Copyright (C) 2008-2014 Free Software Foundation, Inc.
     134#
     135# This file is free software; the Free Software Foundation
     136# gives unlimited permission to copy and/or distribute it,
     137# with or without modifications, as long as this notice is preserved.
    148138
    149139# _AM_COND_IF
     
    155145m4_define([_AM_COND_ELSE])
    156146m4_define([_AM_COND_ENDIF])
    157 
    158147
    159148# AM_COND_IF(COND, [IF-TRUE], [IF-FALSE])
     
    179168# AM_CONDITIONAL                                            -*- Autoconf -*-
    180169
    181 # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
    182 # Free Software Foundation, Inc.
    183 #
    184 # This file is free software; the Free Software Foundation
    185 # gives unlimited permission to copy and/or distribute it,
    186 # with or without modifications, as long as this notice is preserved.
    187 
    188 # serial 9
     170# Copyright (C) 1997-2014 Free Software Foundation, Inc.
     171#
     172# This file is free software; the Free Software Foundation
     173# gives unlimited permission to copy and/or distribute it,
     174# with or without modifications, as long as this notice is preserved.
    189175
    190176# AM_CONDITIONAL(NAME, SHELL-CONDITION)
     
    192178# Define a conditional.
    193179AC_DEFUN([AM_CONDITIONAL],
    194 [AC_PREREQ(2.52)dnl
    195  ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
    196         [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
     180[AC_PREREQ([2.52])dnl
     181 m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
     182       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
    197183AC_SUBST([$1_TRUE])dnl
    198184AC_SUBST([$1_FALSE])dnl
     
    213199fi])])
    214200
    215 # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
    216 # 2010, 2011 Free Software Foundation, Inc.
    217 #
    218 # This file is free software; the Free Software Foundation
    219 # gives unlimited permission to copy and/or distribute it,
    220 # with or without modifications, as long as this notice is preserved.
    221 
    222 # serial 12
    223 
    224 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
     201# Copyright (C) 1999-2014 Free Software Foundation, Inc.
     202#
     203# This file is free software; the Free Software Foundation
     204# gives unlimited permission to copy and/or distribute it,
     205# with or without modifications, as long as this notice is preserved.
     206
     207
     208# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
    225209# written in clear, in which case automake, when reading aclocal.m4,
    226210# will think it sees a *use*, and therefore will trigger all it's
     
    232216# ----------------------
    233217# See how the compiler implements dependency checking.
    234 # NAME is "CC", "CXX", "GCJ", or "OBJC".
     218# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
    235219# We try a few techniques and use that to set a single cache variable.
    236220#
     
    245229AC_REQUIRE([AM_DEP_TRACK])dnl
    246230
    247 ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
    248        [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
    249        [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
    250        [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
    251        [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
    252                    [depcc="$$1"   am_compiler_list=])
     231m4_if([$1], [CC],   [depcc="$CC"   am_compiler_list=],
     232      [$1], [CXX],  [depcc="$CXX"  am_compiler_list=],
     233      [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
     234      [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
     235      [$1], [UPC],  [depcc="$UPC"  am_compiler_list=],
     236      [$1], [GCJ],  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
     237                    [depcc="$$1"   am_compiler_list=])
    253238
    254239AC_CACHE_CHECK([dependency style of $depcc],
     
    258243  # making bogus files that we don't know about and never remove.  For
    259244  # instance it was reported that on HP-UX the gcc test will end up
    260   # making a dummy file named `D' -- because `-MD' means `put the output
    261   # in D'.
     245  # making a dummy file named 'D' -- because '-MD' means "put the output
     246  # in D".
    262247  rm -rf conftest.dir
    263248  mkdir conftest.dir
     
    299284    for i in 1 2 3 4 5 6; do
    300285      echo '#include "conftst'$i'.h"' >> sub/conftest.c
    301       # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
    302       # Solaris 8's {/usr,}/bin/sh.
    303       touch sub/conftst$i.h
     286      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
     287      # Solaris 10 /bin/sh.
     288      echo '/* dummy */' > sub/conftst$i.h
    304289    done
    305290    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
    306291
    307     # We check with `-c' and `-o' for the sake of the "dashmstdout"
     292    # We check with '-c' and '-o' for the sake of the "dashmstdout"
    308293    # mode.  It turns out that the SunPro C++ compiler does not properly
    309     # handle `-M -o', and we need to detect this.  Also, some Intel
    310     # versions had trouble with output in subdirs
     294    # handle '-M -o', and we need to detect this.  Also, some Intel
     295    # versions had trouble with output in subdirs.
    311296    am__obj=sub/conftest.${OBJEXT-o}
    312297    am__minus_obj="-o $am__obj"
     
    317302      ;;
    318303    nosideeffect)
    319       # after this tag, mechanisms are not by side-effect, so they'll
    320       # only be used when explicitly requested
     304      # After this tag, mechanisms are not by side-effect, so they'll
     305      # only be used when explicitly requested.
    321306      if test "x$enable_dependency_tracking" = xyes; then
    322307        continue
     
    326311      ;;
    327312    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
    328       # This compiler won't grok `-c -o', but also, the minuso test has
     313      # This compiler won't grok '-c -o', but also, the minuso test has
    329314      # not run yet.  These depmodes are late enough in the game, and
    330315      # so weak that their functioning should not be impacted.
     
    374359# -------------
    375360# Choose a directory name for dependency files.
    376 # This macro is AC_REQUIREd in _AM_DEPENDENCIES
     361# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
    377362AC_DEFUN([AM_SET_DEPDIR],
    378363[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
     
    384369# ------------
    385370AC_DEFUN([AM_DEP_TRACK],
    386 [AC_ARG_ENABLE(dependency-tracking,
    387 [  --disable-dependency-tracking  speeds up one-time build
    388   --enable-dependency-tracking   do not reject slow dependency extractors])
     371[AC_ARG_ENABLE([dependency-tracking], [dnl
     372AS_HELP_STRING(
     373  [--enable-dependency-tracking],
     374  [do not reject slow dependency extractors])
     375AS_HELP_STRING(
     376  [--disable-dependency-tracking],
     377  [speeds up one-time build])])
    389378if test "x$enable_dependency_tracking" != xno; then
    390379  am_depcomp="$ac_aux_dir/depcomp"
     
    401390# Generate code to set up dependency tracking.              -*- Autoconf -*-
    402391
    403 # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
    404 # Free Software Foundation, Inc.
    405 #
    406 # This file is free software; the Free Software Foundation
    407 # gives unlimited permission to copy and/or distribute it,
    408 # with or without modifications, as long as this notice is preserved.
    409 
    410 #serial 5
     392# Copyright (C) 1999-2014 Free Software Foundation, Inc.
     393#
     394# This file is free software; the Free Software Foundation
     395# gives unlimited permission to copy and/or distribute it,
     396# with or without modifications, as long as this notice is preserved.
     397
    411398
    412399# _AM_OUTPUT_DEPENDENCY_COMMANDS
     
    414401AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
    415402[{
    416   # Autoconf 2.62 quotes --file arguments for eval, but not when files
     403  # Older Autoconf quotes --file arguments for eval, but not when files
    417404  # are listed without --file.  Let's play safe and only enable the eval
    418405  # if we detect the quoting.
     
    427414    mf=`echo "$mf" | sed -e 's/:.*$//'`
    428415    # Check whether this is an Automake generated Makefile or not.
    429     # We used to match only the files named `Makefile.in', but
     416    # We used to match only the files named 'Makefile.in', but
    430417    # some people rename them; so instead we look at the file content.
    431418    # Grep'ing the first line is not enough: some people post-process
     
    439426    fi
    440427    # Extract the definition of DEPDIR, am__include, and am__quote
    441     # from the Makefile without running `make'.
     428    # from the Makefile without running 'make'.
    442429    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
    443430    test -z "$DEPDIR" && continue
    444431    am__include=`sed -n 's/^am__include = //p' < "$mf"`
    445     test -z "am__include" && continue
     432    test -z "$am__include" && continue
    446433    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
    447     # When using ansi2knr, U may be empty or an underscore; expand it
    448     U=`sed -n 's/^U = //p' < "$mf"`
    449434    # Find all dependency output files, they are included files with
    450435    # $(DEPDIR) in their names.  We invoke sed twice because it is the
     
    453438    for file in `sed -n "
    454439      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
    455          sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
     440         sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
    456441      # Make sure the directory exists.
    457442      test -f "$dirpart/$file" && continue
     
    471456#
    472457# This code is only required when automatic dependency tracking
    473 # is enabled.  FIXME.  This creates each `.P' file that we will
     458# is enabled.  FIXME.  This creates each '.P' file that we will
    474459# need in order to bootstrap the dependency handling code.
    475460AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
     
    481466# Do all the work for Automake.                             -*- Autoconf -*-
    482467
    483 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
    484 # 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
    485 #
    486 # This file is free software; the Free Software Foundation
    487 # gives unlimited permission to copy and/or distribute it,
    488 # with or without modifications, as long as this notice is preserved.
    489 
    490 # serial 16
     468# Copyright (C) 1996-2014 Free Software Foundation, Inc.
     469#
     470# This file is free software; the Free Software Foundation
     471# gives unlimited permission to copy and/or distribute it,
     472# with or without modifications, as long as this notice is preserved.
    491473
    492474# This macro actually does too much.  Some checks are only needed if
    493475# your package does certain things.  But this isn't really a big deal.
     476
     477dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
     478m4_define([AC_PROG_CC],
     479m4_defn([AC_PROG_CC])
     480[_AM_PROG_CC_C_O
     481])
    494482
    495483# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
     
    505493# release and drop the old call support.
    506494AC_DEFUN([AM_INIT_AUTOMAKE],
    507 [AC_PREREQ([2.62])dnl
     495[AC_PREREQ([2.65])dnl
    508496dnl Autoconf wants to disallow AM_ names.  We explicitly allow
    509497dnl the ones we care about.
     
    534522dnl Distinguish between old-style and new-style calls.
    535523m4_ifval([$2],
    536 [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
     524[AC_DIAGNOSE([obsolete],
     525             [$0: two- and three-arguments forms are deprecated.])
     526m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
    537527 AC_SUBST([PACKAGE], [$1])dnl
    538528 AC_SUBST([VERSION], [$2])],
    539529[_AM_SET_OPTIONS([$1])dnl
    540530dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
    541 m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
     531m4_if(
     532  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),
     533  [ok:ok],,
    542534  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
    543535 AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
     
    545537
    546538_AM_IF_OPTION([no-define],,
    547 [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
    548  AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
     539[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
     540 AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
    549541
    550542# Some tools Automake needs.
    551543AC_REQUIRE([AM_SANITY_CHECK])dnl
    552544AC_REQUIRE([AC_ARG_PROGRAM])dnl
    553 AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
    554 AM_MISSING_PROG(AUTOCONF, autoconf)
    555 AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
    556 AM_MISSING_PROG(AUTOHEADER, autoheader)
    557 AM_MISSING_PROG(MAKEINFO, makeinfo)
     545AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
     546AM_MISSING_PROG([AUTOCONF], [autoconf])
     547AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
     548AM_MISSING_PROG([AUTOHEADER], [autoheader])
     549AM_MISSING_PROG([MAKEINFO], [makeinfo])
    558550AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
    559551AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
    560 AC_REQUIRE([AM_PROG_MKDIR_P])dnl
    561 # We need awk for the "check" target.  The system "awk" is bad on
    562 # some platforms.
     552AC_REQUIRE([AC_PROG_MKDIR_P])dnl
     553# For better backward compatibility.  To be removed once Automake 1.9.x
     554# dies out for good.  For more background, see:
     555# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
     556# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
     557AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
     558# We need awk for the "check" target (and possibly the TAP driver).  The
     559# system "awk" is bad on some platforms.
    563560AC_REQUIRE([AC_PROG_AWK])dnl
    564561AC_REQUIRE([AC_PROG_MAKE_SET])dnl
     
    569566_AM_IF_OPTION([no-dependencies],,
    570567[AC_PROVIDE_IFELSE([AC_PROG_CC],
    571                   [_AM_DEPENDENCIES(CC)],
    572                   [define([AC_PROG_CC],
    573                           defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
     568                  [_AM_DEPENDENCIES([CC])],
     569                  [m4_define([AC_PROG_CC],
     570                             m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
    574571AC_PROVIDE_IFELSE([AC_PROG_CXX],
    575                   [_AM_DEPENDENCIES(CXX)],
    576                   [define([AC_PROG_CXX],
    577                           defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
     572                  [_AM_DEPENDENCIES([CXX])],
     573                  [m4_define([AC_PROG_CXX],
     574                             m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
    578575AC_PROVIDE_IFELSE([AC_PROG_OBJC],
    579                   [_AM_DEPENDENCIES(OBJC)],
    580                   [define([AC_PROG_OBJC],
    581                           defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
    582 ])
    583 _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
    584 dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
    585 dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
    586 dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
     576                  [_AM_DEPENDENCIES([OBJC])],
     577                  [m4_define([AC_PROG_OBJC],
     578                             m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
     579AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
     580                  [_AM_DEPENDENCIES([OBJCXX])],
     581                  [m4_define([AC_PROG_OBJCXX],
     582                             m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
     583])
     584AC_REQUIRE([AM_SILENT_RULES])dnl
     585dnl The testsuite driver may need to know about EXEEXT, so add the
     586dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This
     587dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
    587588AC_CONFIG_COMMANDS_PRE(dnl
    588589[m4_provide_if([_AM_COMPILER_EXEEXT],
    589590  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
    590 ])
    591 
    592 dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
     591
     592# POSIX will say in a future version that running "rm -f" with no argument
     593# is OK; and we want to be able to make that assumption in our Makefile
     594# recipes.  So use an aggressive probe to check that the usage we want is
     595# actually supported "in the wild" to an acceptable degree.
     596# See automake bug#10828.
     597# To make any issue more visible, cause the running configure to be aborted
     598# by default if the 'rm' program in use doesn't match our expectations; the
     599# user can still override this though.
     600if rm -f && rm -fr && rm -rf; then : OK; else
     601  cat >&2 <<'END'
     602Oops!
     603
     604Your 'rm' program seems unable to run without file operands specified
     605on the command line, even when the '-f' option is present.  This is contrary
     606to the behaviour of most rm programs out there, and not conforming with
     607the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
     608
     609Please tell bug-automake@gnu.org about your system, including the value
     610of your $PATH and any error possibly output before this message.  This
     611can help us improve future automake versions.
     612
     613END
     614  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
     615    echo 'Configuration will proceed anyway, since you have set the' >&2
     616    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
     617    echo >&2
     618  else
     619    cat >&2 <<'END'
     620Aborting the configuration process, to ensure you take notice of the issue.
     621
     622You can download and install GNU coreutils to get an 'rm' implementation
     623that behaves properly: <http://www.gnu.org/software/coreutils/>.
     624
     625If you want to complete the configuration process using your problematic
     626'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
     627to "yes", and re-run configure.
     628
     629END
     630    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
     631  fi
     632fi
     633dnl The trailing newline in this macro's definition is deliberate, for
     634dnl backward compatibility and to allow trailing 'dnl'-style comments
     635dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
     636])
     637
     638dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
    593639dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
    594640dnl mangled by Autoconf and run in a shell conditional statement.
    595641m4_define([_AC_COMPILER_EXEEXT],
    596642m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
    597 
    598643
    599644# When config.status generates a header, we must update the stamp-h file.
     
    618663echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
    619664
    620 # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
    621 # Inc.
    622 #
    623 # This file is free software; the Free Software Foundation
    624 # gives unlimited permission to copy and/or distribute it,
    625 # with or without modifications, as long as this notice is preserved.
    626 
    627 # serial 1
     665# Copyright (C) 2001-2014 Free Software Foundation, Inc.
     666#
     667# This file is free software; the Free Software Foundation
     668# gives unlimited permission to copy and/or distribute it,
     669# with or without modifications, as long as this notice is preserved.
    628670
    629671# AM_PROG_INSTALL_SH
     
    632674AC_DEFUN([AM_PROG_INSTALL_SH],
    633675[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
    634 if test x"${install_sh}" != xset; then
     676if test x"${install_sh+set}" != xset; then
    635677  case $am_aux_dir in
    636678  *\ * | *\     *)
     
    640682  esac
    641683fi
    642 AC_SUBST(install_sh)])
    643 
    644 # Copyright (C) 2003, 2005  Free Software Foundation, Inc.
    645 #
    646 # This file is free software; the Free Software Foundation
    647 # gives unlimited permission to copy and/or distribute it,
    648 # with or without modifications, as long as this notice is preserved.
    649 
    650 # serial 2
     684AC_SUBST([install_sh])])
     685
     686# Copyright (C) 2003-2014 Free Software Foundation, Inc.
     687#
     688# This file is free software; the Free Software Foundation
     689# gives unlimited permission to copy and/or distribute it,
     690# with or without modifications, as long as this notice is preserved.
    651691
    652692# Check whether the underlying file-system supports filenames
     
    666706# From Jim Meyering
    667707
    668 # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
    669 # 2011 Free Software Foundation, Inc.
    670 #
    671 # This file is free software; the Free Software Foundation
    672 # gives unlimited permission to copy and/or distribute it,
    673 # with or without modifications, as long as this notice is preserved.
    674 
    675 # serial 5
     708# Copyright (C) 1996-2014 Free Software Foundation, Inc.
     709#
     710# This file is free software; the Free Software Foundation
     711# gives unlimited permission to copy and/or distribute it,
     712# with or without modifications, as long as this notice is preserved.
    676713
    677714# AM_MAINTAINER_MODE([DEFAULT-MODE])
    678715# ----------------------------------
    679716# Control maintainer-specific portions of Makefiles.
    680 # Default is to disable them, unless `enable' is passed literally.
    681 # For symmetry, `disable' may be passed as well.  Anyway, the user
     717# Default is to disable them, unless 'enable' is passed literally.
     718# For symmetry, 'disable' may be passed as well.  Anyway, the user
    682719# can override the default with the --enable/--disable switch.
    683720AC_DEFUN([AM_MAINTAINER_MODE],
     
    690727  dnl maintainer-mode's default is 'disable' unless 'enable' is passed
    691728  AC_ARG_ENABLE([maintainer-mode],
    692 [  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
    693                           (and sometimes confusing) to the casual installer],
    694       [USE_MAINTAINER_MODE=$enableval],
    695       [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
     729    [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
     730      am_maintainer_other[ make rules and dependencies not useful
     731      (and sometimes confusing) to the casual installer])],
     732    [USE_MAINTAINER_MODE=$enableval],
     733    [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
    696734  AC_MSG_RESULT([$USE_MAINTAINER_MODE])
    697735  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
     
    701739)
    702740
    703 AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
    704 
    705741# Check to see how 'make' treats includes.                  -*- Autoconf -*-
    706742
    707 # Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
    708 #
    709 # This file is free software; the Free Software Foundation
    710 # gives unlimited permission to copy and/or distribute it,
    711 # with or without modifications, as long as this notice is preserved.
    712 
    713 # serial 4
     743# Copyright (C) 2001-2014 Free Software Foundation, Inc.
     744#
     745# This file is free software; the Free Software Foundation
     746# gives unlimited permission to copy and/or distribute it,
     747# with or without modifications, as long as this notice is preserved.
    714748
    715749# AM_MAKE_INCLUDE()
     
    730764# First try GNU make style include.
    731765echo "include confinc" > confmf
    732 # Ignore all kinds of additional output from `make'.
     766# Ignore all kinds of additional output from 'make'.
    733767case `$am_make -s -f confmf 2> /dev/null` in #(
    734768*the\ am__doit\ target*)
     
    755789])
    756790
    757 # Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008
    758 # Free Software Foundation, Inc.
    759 #
    760 # This file is free software; the Free Software Foundation
    761 # gives unlimited permission to copy and/or distribute it,
    762 # with or without modifications, as long as this notice is preserved.
    763 
    764 # serial 6
    765 
    766 # AM_PROG_CC_C_O
    767 # --------------
    768 # Like AC_PROG_CC_C_O, but changed for automake.
    769 AC_DEFUN([AM_PROG_CC_C_O],
    770 [AC_REQUIRE([AC_PROG_CC_C_O])dnl
    771 AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
    772 AC_REQUIRE_AUX_FILE([compile])dnl
    773 # FIXME: we rely on the cache variable name because
    774 # there is no other way.
    775 set dummy $CC
    776 am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
    777 eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
    778 if test "$am_t" != yes; then
    779    # Losing compiler, so override with the script.
    780    # FIXME: It is wrong to rewrite CC.
    781    # But if we don't then we get into trouble of one sort or another.
    782    # A longer-term fix would be to have automake use am__CC in this case,
    783    # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
    784    CC="$am_aux_dir/compile $CC"
    785 fi
    786 dnl Make sure AC_PROG_CC is never called again, or it will override our
    787 dnl setting of CC.
    788 m4_define([AC_PROG_CC],
    789           [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])
    790 ])
    791 
    792791# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
    793792
    794 # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
    795 # Free Software Foundation, Inc.
    796 #
    797 # This file is free software; the Free Software Foundation
    798 # gives unlimited permission to copy and/or distribute it,
    799 # with or without modifications, as long as this notice is preserved.
    800 
    801 # serial 6
     793# Copyright (C) 1997-2014 Free Software Foundation, Inc.
     794#
     795# This file is free software; the Free Software Foundation
     796# gives unlimited permission to copy and/or distribute it,
     797# with or without modifications, as long as this notice is preserved.
    802798
    803799# AM_MISSING_PROG(NAME, PROGRAM)
     
    808804AC_SUBST($1)])
    809805
    810 
    811806# AM_MISSING_HAS_RUN
    812807# ------------------
    813 # Define MISSING if not defined so far and test if it supports --run.
    814 # If it does, set am_missing_run to use it, otherwise, to nothing.
     808# Define MISSING if not defined so far and test if it is modern enough.
     809# If it is, set am_missing_run to use it, otherwise, to nothing.
    815810AC_DEFUN([AM_MISSING_HAS_RUN],
    816811[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
     
    825820fi
    826821# Use eval to expand $SHELL
    827 if eval "$MISSING --run true"; then
    828   am_missing_run="$MISSING --run "
     822if eval "$MISSING --is-lightweight"; then
     823  am_missing_run="$MISSING "
    829824else
    830825  am_missing_run=
    831   AC_MSG_WARN([`missing' script is too old or missing])
    832 fi
    833 ])
    834 
    835 # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
    836 # Inc.
    837 #
    838 # This file is free software; the Free Software Foundation
    839 # gives unlimited permission to copy and/or distribute it,
    840 # with or without modifications, as long as this notice is preserved.
    841 
    842 # serial 1
    843 
    844 # AM_PROG_MKDIR_P
    845 # ---------------
    846 # Check for `mkdir -p'.
    847 AC_DEFUN([AM_PROG_MKDIR_P],
    848 [AC_PREREQ([2.60])dnl
    849 AC_REQUIRE([AC_PROG_MKDIR_P])dnl
    850 dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
    851 dnl while keeping a definition of mkdir_p for backward compatibility.
    852 dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
    853 dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
    854 dnl Makefile.ins that do not define MKDIR_P, so we do our own
    855 dnl adjustment using top_builddir (which is defined more often than
    856 dnl MKDIR_P).
    857 AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
    858 case $mkdir_p in
    859   [[\\/$]]* | ?:[[\\/]]*) ;;
    860   */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
    861 esac
     826  AC_MSG_WARN(['missing' script is too old or missing])
     827fi
    862828])
    863829
    864830# Helper functions for option handling.                     -*- Autoconf -*-
    865831
    866 # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
    867 # Foundation, Inc.
    868 #
    869 # This file is free software; the Free Software Foundation
    870 # gives unlimited permission to copy and/or distribute it,
    871 # with or without modifications, as long as this notice is preserved.
    872 
    873 # serial 5
     832# Copyright (C) 2001-2014 Free Software Foundation, Inc.
     833#
     834# This file is free software; the Free Software Foundation
     835# gives unlimited permission to copy and/or distribute it,
     836# with or without modifications, as long as this notice is preserved.
    874837
    875838# _AM_MANGLE_OPTION(NAME)
     
    882845# Set option NAME.  Presently that only means defining a flag for this option.
    883846AC_DEFUN([_AM_SET_OPTION],
    884 [m4_define(_AM_MANGLE_OPTION([$1]), 1)])
     847[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
    885848
    886849# _AM_SET_OPTIONS(OPTIONS)
     
    896859[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
    897860
     861# Copyright (C) 1999-2014 Free Software Foundation, Inc.
     862#
     863# This file is free software; the Free Software Foundation
     864# gives unlimited permission to copy and/or distribute it,
     865# with or without modifications, as long as this notice is preserved.
     866
     867# _AM_PROG_CC_C_O
     868# ---------------
     869# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC
     870# to automatically call this.
     871AC_DEFUN([_AM_PROG_CC_C_O],
     872[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
     873AC_REQUIRE_AUX_FILE([compile])dnl
     874AC_LANG_PUSH([C])dnl
     875AC_CACHE_CHECK(
     876  [whether $CC understands -c and -o together],
     877  [am_cv_prog_cc_c_o],
     878  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
     879  # Make sure it works both with $CC and with simple cc.
     880  # Following AC_PROG_CC_C_O, we do the test twice because some
     881  # compilers refuse to overwrite an existing .o file with -o,
     882  # though they will create one.
     883  am_cv_prog_cc_c_o=yes
     884  for am_i in 1 2; do
     885    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
     886         && test -f conftest2.$ac_objext; then
     887      : OK
     888    else
     889      am_cv_prog_cc_c_o=no
     890      break
     891    fi
     892  done
     893  rm -f core conftest*
     894  unset am_i])
     895if test "$am_cv_prog_cc_c_o" != yes; then
     896   # Losing compiler, so override with the script.
     897   # FIXME: It is wrong to rewrite CC.
     898   # But if we don't then we get into trouble of one sort or another.
     899   # A longer-term fix would be to have automake use am__CC in this case,
     900   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
     901   CC="$am_aux_dir/compile $CC"
     902fi
     903AC_LANG_POP([C])])
     904
     905# For backward compatibility.
     906AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
     907
     908# Copyright (C) 2001-2014 Free Software Foundation, Inc.
     909#
     910# This file is free software; the Free Software Foundation
     911# gives unlimited permission to copy and/or distribute it,
     912# with or without modifications, as long as this notice is preserved.
     913
     914# AM_RUN_LOG(COMMAND)
     915# -------------------
     916# Run COMMAND, save the exit status in ac_status, and log it.
     917# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
     918AC_DEFUN([AM_RUN_LOG],
     919[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
     920   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
     921   ac_status=$?
     922   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
     923   (exit $ac_status); }])
     924
    898925# Check to make sure that the build environment is sane.    -*- Autoconf -*-
    899926
    900 # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
    901 # Free Software Foundation, Inc.
    902 #
    903 # This file is free software; the Free Software Foundation
    904 # gives unlimited permission to copy and/or distribute it,
    905 # with or without modifications, as long as this notice is preserved.
    906 
    907 # serial 5
     927# Copyright (C) 1996-2014 Free Software Foundation, Inc.
     928#
     929# This file is free software; the Free Software Foundation
     930# gives unlimited permission to copy and/or distribute it,
     931# with or without modifications, as long as this notice is preserved.
    908932
    909933# AM_SANITY_CHECK
     
    911935AC_DEFUN([AM_SANITY_CHECK],
    912936[AC_MSG_CHECKING([whether build environment is sane])
    913 # Just in case
    914 sleep 1
    915 echo timestamp > conftest.file
    916937# Reject unsafe characters in $srcdir or the absolute working directory
    917938# name.  Accept space and tab only in the latter.
     
    924945case $srcdir in
    925946  *[[\\\"\#\$\&\'\`$am_lf\ \    ]]*)
    926     AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
     947    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
    927948esac
    928949
    929 # Do `set' in a subshell so we don't clobber the current shell's
     950# Do 'set' in a subshell so we don't clobber the current shell's
    930951# arguments.  Must try -L first in case configure is actually a
    931952# symlink; some systems play weird games with the mod time of symlinks
     
    933954# directory).
    934955if (
    935    set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
    936    if test "$[*]" = "X"; then
    937       # -L didn't work.
    938       set X `ls -t "$srcdir/configure" conftest.file`
    939    fi
    940    rm -f conftest.file
    941    if test "$[*]" != "X $srcdir/configure conftest.file" \
    942       && test "$[*]" != "X conftest.file $srcdir/configure"; then
    943 
    944       # If neither matched, then we have a broken ls.  This can happen
    945       # if, for instance, CONFIG_SHELL is bash and it inherits a
    946       # broken ls alias from the environment.  This has actually
    947       # happened.  Such a system could not be considered "sane".
    948       AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
    949 alias in your environment])
    950    fi
    951 
     956   am_has_slept=no
     957   for am_try in 1 2; do
     958     echo "timestamp, slept: $am_has_slept" > conftest.file
     959     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
     960     if test "$[*]" = "X"; then
     961        # -L didn't work.
     962        set X `ls -t "$srcdir/configure" conftest.file`
     963     fi
     964     if test "$[*]" != "X $srcdir/configure conftest.file" \
     965        && test "$[*]" != "X conftest.file $srcdir/configure"; then
     966
     967        # If neither matched, then we have a broken ls.  This can happen
     968        # if, for instance, CONFIG_SHELL is bash and it inherits a
     969        # broken ls alias from the environment.  This has actually
     970        # happened.  Such a system could not be considered "sane".
     971        AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
     972  alias in your environment])
     973     fi
     974     if test "$[2]" = conftest.file || test $am_try -eq 2; then
     975       break
     976     fi
     977     # Just in case.
     978     sleep 1
     979     am_has_slept=yes
     980   done
    952981   test "$[2]" = conftest.file
    953982   )
     
    959988Check your system clock])
    960989fi
    961 AC_MSG_RESULT(yes)])
    962 
    963 # Copyright (C) 2009, 2011  Free Software Foundation, Inc.
    964 #
    965 # This file is free software; the Free Software Foundation
    966 # gives unlimited permission to copy and/or distribute it,
    967 # with or without modifications, as long as this notice is preserved.
    968 
    969 # serial 2
     990AC_MSG_RESULT([yes])
     991# If we didn't sleep, we still need to ensure time stamps of config.status and
     992# generated files are strictly newer.
     993am_sleep_pid=
     994if grep 'slept: no' conftest.file >/dev/null 2>&1; then
     995  ( sleep 1 ) &
     996  am_sleep_pid=$!
     997fi
     998AC_CONFIG_COMMANDS_PRE(
     999  [AC_MSG_CHECKING([that generated files are newer than configure])
     1000   if test -n "$am_sleep_pid"; then
     1001     # Hide warnings about reused PIDs.
     1002     wait $am_sleep_pid 2>/dev/null
     1003   fi
     1004   AC_MSG_RESULT([done])])
     1005rm -f conftest.file
     1006])
     1007
     1008# Copyright (C) 2009-2014 Free Software Foundation, Inc.
     1009#
     1010# This file is free software; the Free Software Foundation
     1011# gives unlimited permission to copy and/or distribute it,
     1012# with or without modifications, as long as this notice is preserved.
    9701013
    9711014# AM_SILENT_RULES([DEFAULT])
    9721015# --------------------------
    9731016# Enable less verbose build rules; with the default set to DEFAULT
    974 # (`yes' being less verbose, `no' or empty being verbose).
     1017# ("yes" being less verbose, "no" or empty being verbose).
    9751018AC_DEFUN([AM_SILENT_RULES],
    976 [AC_ARG_ENABLE([silent-rules],
    977 [  --enable-silent-rules          less verbose build output (undo: `make V=1')
    978   --disable-silent-rules         verbose build output (undo: `make V=0')])
    979 case $enable_silent_rules in
    980 yes) AM_DEFAULT_VERBOSITY=0;;
    981 no)  AM_DEFAULT_VERBOSITY=1;;
    982 *)   AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
     1019[AC_ARG_ENABLE([silent-rules], [dnl
     1020AS_HELP_STRING(
     1021  [--enable-silent-rules],
     1022  [less verbose build output (undo: "make V=1")])
     1023AS_HELP_STRING(
     1024  [--disable-silent-rules],
     1025  [verbose build output (undo: "make V=0")])dnl
     1026])
     1027case $enable_silent_rules in @%:@ (((
     1028  yes) AM_DEFAULT_VERBOSITY=0;;
     1029   no) AM_DEFAULT_VERBOSITY=1;;
     1030    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
    9831031esac
    9841032dnl
    985 dnl A few `make' implementations (e.g., NonStop OS and NextStep)
     1033dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
    9861034dnl do not support nested variable expansions.
    9871035dnl See automake bug#9928 and bug#10237.
     
    10011049fi])
    10021050if test $am_cv_make_support_nested_variables = yes; then
    1003   dnl Using `$V' instead of `$(V)' breaks IRIX make.
     1051  dnl Using '$V' instead of '$(V)' breaks IRIX make.
    10041052  AM_V='$(V)'
    10051053  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
     
    10181066])
    10191067
    1020 # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
    1021 #
    1022 # This file is free software; the Free Software Foundation
    1023 # gives unlimited permission to copy and/or distribute it,
    1024 # with or without modifications, as long as this notice is preserved.
    1025 
    1026 # serial 1
     1068# Copyright (C) 2001-2014 Free Software Foundation, Inc.
     1069#
     1070# This file is free software; the Free Software Foundation
     1071# gives unlimited permission to copy and/or distribute it,
     1072# with or without modifications, as long as this notice is preserved.
    10271073
    10281074# AM_PROG_INSTALL_STRIP
    10291075# ---------------------
    1030 # One issue with vendor `install' (even GNU) is that you can't
     1076# One issue with vendor 'install' (even GNU) is that you can't
    10311077# specify the program used to strip binaries.  This is especially
    10321078# annoying in cross-compiling environments, where the build's strip
    10331079# is unlikely to handle the host's binaries.
    10341080# Fortunately install-sh will honor a STRIPPROG variable, so we
    1035 # always use install-sh in `make install-strip', and initialize
     1081# always use install-sh in "make install-strip", and initialize
    10361082# STRIPPROG with the value of the STRIP variable (set by the user).
    10371083AC_DEFUN([AM_PROG_INSTALL_STRIP],
    10381084[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
    1039 # Installed binaries are usually stripped using `strip' when the user
    1040 # run `make install-strip'.  However `strip' might not be the right
     1085# Installed binaries are usually stripped using 'strip' when the user
     1086# run "make install-strip".  However 'strip' might not be the right
    10411087# tool to use in cross-compilation environments, therefore Automake
    1042 # will honor the `STRIP' environment variable to overrule this program.
    1043 dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
     1088# will honor the 'STRIP' environment variable to overrule this program.
     1089dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
    10441090if test "$cross_compiling" != no; then
    10451091  AC_CHECK_TOOL([STRIP], [strip], :)
     
    10481094AC_SUBST([INSTALL_STRIP_PROGRAM])])
    10491095
    1050 # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
    1051 #
    1052 # This file is free software; the Free Software Foundation
    1053 # gives unlimited permission to copy and/or distribute it,
    1054 # with or without modifications, as long as this notice is preserved.
    1055 
    1056 # serial 3
     1096# Copyright (C) 2006-2014 Free Software Foundation, Inc.
     1097#
     1098# This file is free software; the Free Software Foundation
     1099# gives unlimited permission to copy and/or distribute it,
     1100# with or without modifications, as long as this notice is preserved.
    10571101
    10581102# _AM_SUBST_NOTMAKE(VARIABLE)
     
    10691113# Check how to create a tarball.                            -*- Autoconf -*-
    10701114
    1071 # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
    1072 #
    1073 # This file is free software; the Free Software Foundation
    1074 # gives unlimited permission to copy and/or distribute it,
    1075 # with or without modifications, as long as this notice is preserved.
    1076 
    1077 # serial 2
     1115# Copyright (C) 2004-2014 Free Software Foundation, Inc.
     1116#
     1117# This file is free software; the Free Software Foundation
     1118# gives unlimited permission to copy and/or distribute it,
     1119# with or without modifications, as long as this notice is preserved.
    10781120
    10791121# _AM_PROG_TAR(FORMAT)
    10801122# --------------------
    10811123# Check how to create a tarball in format FORMAT.
    1082 # FORMAT should be one of `v7', `ustar', or `pax'.
     1124# FORMAT should be one of 'v7', 'ustar', or 'pax'.
    10831125#
    10841126# Substitute a variable $(am__tar) that is a command
     
    10901132# a tarball read from stdin.
    10911133#     $(am__untar) < result.tar
     1134#
    10921135AC_DEFUN([_AM_PROG_TAR],
    10931136[# Always define AMTAR for backward compatibility.  Yes, it's still used
    10941137# in the wild :-(  We should find a proper way to deprecate it ...
    10951138AC_SUBST([AMTAR], ['$${TAR-tar}'])
     1139
     1140# We'll loop over all known methods to create a tar archive until one works.
     1141_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
     1142
    10961143m4_if([$1], [v7],
    1097      [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
    1098      [m4_case([$1], [ustar],, [pax],,
    1099               [m4_fatal([Unknown tar format])])
    1100 AC_MSG_CHECKING([how to create a $1 tar archive])
    1101 # Loop over all known methods to create a tar archive until one works.
    1102 _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
    1103 _am_tools=${am_cv_prog_tar_$1-$_am_tools}
    1104 # Do not fold the above two line into one, because Tru64 sh and
    1105 # Solaris sh will not grok spaces in the rhs of `-'.
    1106 for _am_tool in $_am_tools
    1107 do
    1108   case $_am_tool in
    1109   gnutar)
    1110     for _am_tar in tar gnutar gtar;
    1111     do
    1112       AM_RUN_LOG([$_am_tar --version]) && break
    1113     done
    1114     am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
    1115     am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
    1116     am__untar="$_am_tar -xf -"
    1117     ;;
    1118   plaintar)
    1119     # Must skip GNU tar: if it does not support --format= it doesn't create
    1120     # ustar tarball either.
    1121     (tar --version) >/dev/null 2>&1 && continue
    1122     am__tar='tar chf - "$$tardir"'
    1123     am__tar_='tar chf - "$tardir"'
    1124     am__untar='tar xf -'
    1125     ;;
    1126   pax)
    1127     am__tar='pax -L -x $1 -w "$$tardir"'
    1128     am__tar_='pax -L -x $1 -w "$tardir"'
    1129     am__untar='pax -r'
    1130     ;;
    1131   cpio)
    1132     am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
    1133     am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
    1134     am__untar='cpio -i -H $1 -d'
    1135     ;;
    1136   none)
    1137     am__tar=false
    1138     am__tar_=false
    1139     am__untar=false
    1140     ;;
    1141   esac
    1142 
    1143   # If the value was cached, stop now.  We just wanted to have am__tar
    1144   # and am__untar set.
    1145   test -n "${am_cv_prog_tar_$1}" && break
    1146 
    1147   # tar/untar a dummy directory, and stop if the command works
     1144  [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
     1145
     1146  [m4_case([$1],
     1147    [ustar],
     1148     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
     1149      # There is notably a 21 bits limit for the UID and the GID.  In fact,
     1150      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
     1151      # and bug#13588).
     1152      am_max_uid=2097151 # 2^21 - 1
     1153      am_max_gid=$am_max_uid
     1154      # The $UID and $GID variables are not portable, so we need to resort
     1155      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
     1156      # below are definitely unexpected, so allow the users to see them
     1157      # (that is, avoid stderr redirection).
     1158      am_uid=`id -u || echo unknown`
     1159      am_gid=`id -g || echo unknown`
     1160      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
     1161      if test $am_uid -le $am_max_uid; then
     1162         AC_MSG_RESULT([yes])
     1163      else
     1164         AC_MSG_RESULT([no])
     1165         _am_tools=none
     1166      fi
     1167      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
     1168      if test $am_gid -le $am_max_gid; then
     1169         AC_MSG_RESULT([yes])
     1170      else
     1171        AC_MSG_RESULT([no])
     1172        _am_tools=none
     1173      fi],
     1174
     1175  [pax],
     1176    [],
     1177
     1178  [m4_fatal([Unknown tar format])])
     1179
     1180  AC_MSG_CHECKING([how to create a $1 tar archive])
     1181
     1182  # Go ahead even if we have the value already cached.  We do so because we
     1183  # need to set the values for the 'am__tar' and 'am__untar' variables.
     1184  _am_tools=${am_cv_prog_tar_$1-$_am_tools}
     1185
     1186  for _am_tool in $_am_tools; do
     1187    case $_am_tool in
     1188    gnutar)
     1189      for _am_tar in tar gnutar gtar; do
     1190        AM_RUN_LOG([$_am_tar --version]) && break
     1191      done
     1192      am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
     1193      am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
     1194      am__untar="$_am_tar -xf -"
     1195      ;;
     1196    plaintar)
     1197      # Must skip GNU tar: if it does not support --format= it doesn't create
     1198      # ustar tarball either.
     1199      (tar --version) >/dev/null 2>&1 && continue
     1200      am__tar='tar chf - "$$tardir"'
     1201      am__tar_='tar chf - "$tardir"'
     1202      am__untar='tar xf -'
     1203      ;;
     1204    pax)
     1205      am__tar='pax -L -x $1 -w "$$tardir"'
     1206      am__tar_='pax -L -x $1 -w "$tardir"'
     1207      am__untar='pax -r'
     1208      ;;
     1209    cpio)
     1210      am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
     1211      am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
     1212      am__untar='cpio -i -H $1 -d'
     1213      ;;
     1214    none)
     1215      am__tar=false
     1216      am__tar_=false
     1217      am__untar=false
     1218      ;;
     1219    esac
     1220
     1221    # If the value was cached, stop now.  We just wanted to have am__tar
     1222    # and am__untar set.
     1223    test -n "${am_cv_prog_tar_$1}" && break
     1224
     1225    # tar/untar a dummy directory, and stop if the command works.
     1226    rm -rf conftest.dir
     1227    mkdir conftest.dir
     1228    echo GrepMe > conftest.dir/file
     1229    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
     1230    rm -rf conftest.dir
     1231    if test -s conftest.tar; then
     1232      AM_RUN_LOG([$am__untar <conftest.tar])
     1233      AM_RUN_LOG([cat conftest.dir/file])
     1234      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
     1235    fi
     1236  done
    11481237  rm -rf conftest.dir
    1149   mkdir conftest.dir
    1150   echo GrepMe > conftest.dir/file
    1151   AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
    1152   rm -rf conftest.dir
    1153   if test -s conftest.tar; then
    1154     AM_RUN_LOG([$am__untar <conftest.tar])
    1155     grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
    1156   fi
    1157 done
    1158 rm -rf conftest.dir
    1159 
    1160 AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
    1161 AC_MSG_RESULT([$am_cv_prog_tar_$1])])
     1238
     1239  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
     1240  AC_MSG_RESULT([$am_cv_prog_tar_$1])])
     1241
    11621242AC_SUBST([am__tar])
    11631243AC_SUBST([am__untar])
  • automake/config.guess

    rfea3faa rb826e6b  
    1 /usr/share/automake-1.11/config.guess
     1/usr/share/automake-1.15/config.guess
  • automake/config.sub

    rfea3faa rb826e6b  
    1 /usr/share/automake-1.11/config.sub
     1/usr/share/automake-1.15/config.sub
  • automake/missing

    rfea3faa rb826e6b  
    11#! /bin/sh
    2 # Common stub for a few missing GNU programs while installing.
    3 
    4 scriptversion=2012-01-06.13; # UTC
    5 
    6 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
    7 # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
    8 # Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
     2# Common wrapper for a few potentially missing GNU programs.
     3
     4scriptversion=2013-10-28.13; # UTC
     5
     6# Copyright (C) 1996-2014 Free Software Foundation, Inc.
     7# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
    98
    109# This program is free software; you can redistribute it and/or modify
     
    2726
    2827if test $# -eq 0; then
    29   echo 1>&2 "Try \`$0 --help' for more information"
     28  echo 1>&2 "Try '$0 --help' for more information"
    3029  exit 1
    3130fi
    3231
    33 run=:
    34 sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
    35 sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
    36 
    37 # In the cases where this matters, `missing' is being run in the
    38 # srcdir already.
    39 if test -f configure.ac; then
    40   configure_ac=configure.ac
    41 else
    42   configure_ac=configure.in
    43 fi
    44 
    45 msg="missing on your system"
    46 
    4732case $1 in
    48 --run)
    49   # Try to run requested program, and just exit if it succeeds.
    50   run=
    51   shift
    52   "$@" && exit 0
    53   # Exit code 63 means version mismatch.  This often happens
    54   # when the user try to use an ancient version of a tool on
    55   # a file that requires a minimum version.  In this case we
    56   # we should proceed has if the program had been absent, or
    57   # if --run hadn't been passed.
    58   if test $? = 63; then
    59     run=:
    60     msg="probably too old"
    61   fi
    62   ;;
     33
     34  --is-lightweight)
     35    # Used by our autoconf macros to check whether the available missing
     36    # script is modern enough.
     37    exit 0
     38    ;;
     39
     40  --run)
     41    # Back-compat with the calling convention used by older automake.
     42    shift
     43    ;;
    6344
    6445  -h|--h|--he|--hel|--help)
     
    6647$0 [OPTION]... PROGRAM [ARGUMENT]...
    6748
    68 Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
    69 error status if there is no known handling for PROGRAM.
     49Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
     50to PROGRAM being missing or too old.
    7051
    7152Options:
    7253  -h, --help      display this help and exit
    7354  -v, --version   output version information and exit
    74   --run           try to run the given command, and emulate it if it fails
    7555
    7656Supported PROGRAM values:
    77   aclocal      touch file \`aclocal.m4'
    78   autoconf     touch file \`configure'
    79   autoheader   touch file \`config.h.in'
    80   autom4te     touch the output file, or create a stub one
    81   automake     touch all \`Makefile.in' files
    82   bison        create \`y.tab.[ch]', if possible, from existing .[ch]
    83   flex         create \`lex.yy.c', if possible, from existing .c
    84   help2man     touch the output file
    85   lex          create \`lex.yy.c', if possible, from existing .c
    86   makeinfo     touch the output file
    87   yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
    88 
    89 Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
    90 \`g' are ignored when checking the name.
     57  aclocal   autoconf  autoheader   autom4te  automake  makeinfo
     58  bison     yacc      flex         lex       help2man
     59
     60Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
     61'g' are ignored when checking the name.
    9162
    9263Send bug reports to <bug-automake@gnu.org>."
     
    10071
    10172  -*)
    102     echo 1>&2 "$0: Unknown \`$1' option"
    103     echo 1>&2 "Try \`$0 --help' for more information"
     73    echo 1>&2 "$0: unknown '$1' option"
     74    echo 1>&2 "Try '$0 --help' for more information"
    10475    exit 1
    10576    ;;
     
    10778esac
    10879
    109 # normalize program name to check for.
    110 program=`echo "$1" | sed '
    111   s/^gnu-//; t
    112   s/^gnu//; t
    113   s/^g//; t'`
    114 
    115 # Now exit if we have it, but it failed.  Also exit now if we
    116 # don't have it and --version was passed (most likely to detect
    117 # the program).  This is about non-GNU programs, so use $1 not
    118 # $program.
    119 case $1 in
    120   lex*|yacc*)
    121     # Not GNU programs, they don't have --version.
    122     ;;
    123 
    124   *)
    125     if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
    126        # We have it, but it failed.
    127        exit 1
    128     elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
    129        # Could not run --version or --help.  This is probably someone
    130        # running `$TOOL --version' or `$TOOL --help' to check whether
    131        # $TOOL exists and not knowing $TOOL uses missing.
    132        exit 1
    133     fi
    134     ;;
    135 esac
    136 
    137 # If it does not exist, or fails to run (possibly an outdated version),
    138 # try to emulate it.
    139 case $program in
    140   aclocal*)
    141     echo 1>&2 "\
    142 WARNING: \`$1' is $msg.  You should only need it if
    143          you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
    144          to install the \`Automake' and \`Perl' packages.  Grab them from
    145          any GNU archive site."
    146     touch aclocal.m4
    147     ;;
    148 
    149   autoconf*)
    150     echo 1>&2 "\
    151 WARNING: \`$1' is $msg.  You should only need it if
    152          you modified \`${configure_ac}'.  You might want to install the
    153          \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
    154          archive site."
    155     touch configure
    156     ;;
    157 
    158   autoheader*)
    159     echo 1>&2 "\
    160 WARNING: \`$1' is $msg.  You should only need it if
    161          you modified \`acconfig.h' or \`${configure_ac}'.  You might want
    162          to install the \`Autoconf' and \`GNU m4' packages.  Grab them
    163          from any GNU archive site."
    164     files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
    165     test -z "$files" && files="config.h"
    166     touch_files=
    167     for f in $files; do
    168       case $f in
    169       *:*) touch_files="$touch_files "`echo "$f" |
    170                                        sed -e 's/^[^:]*://' -e 's/:.*//'`;;
    171       *) touch_files="$touch_files $f.in";;
    172       esac
    173     done
    174     touch $touch_files
    175     ;;
    176 
    177   automake*)
    178     echo 1>&2 "\
    179 WARNING: \`$1' is $msg.  You should only need it if
    180          you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
    181          You might want to install the \`Automake' and \`Perl' packages.
    182          Grab them from any GNU archive site."
    183     find . -type f -name Makefile.am -print |
    184            sed 's/\.am$/.in/' |
    185            while read f; do touch "$f"; done
    186     ;;
    187 
    188   autom4te*)
    189     echo 1>&2 "\
    190 WARNING: \`$1' is needed, but is $msg.
    191          You might have modified some files without having the
    192          proper tools for further handling them.
    193          You can get \`$1' as part of \`Autoconf' from any GNU
    194          archive site."
    195 
    196     file=`echo "$*" | sed -n "$sed_output"`
    197     test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
    198     if test -f "$file"; then
    199         touch $file
    200     else
    201         test -z "$file" || exec >$file
    202         echo "#! /bin/sh"
    203         echo "# Created by GNU Automake missing as a replacement of"
    204         echo "#  $ $@"
    205         echo "exit 0"
    206         chmod +x $file
    207         exit 1
    208     fi
    209     ;;
    210 
    211   bison*|yacc*)
    212     echo 1>&2 "\
    213 WARNING: \`$1' $msg.  You should only need it if
    214          you modified a \`.y' file.  You may need the \`Bison' package
    215          in order for those modifications to take effect.  You can get
    216          \`Bison' from any GNU archive site."
    217     rm -f y.tab.c y.tab.h
    218     if test $# -ne 1; then
    219         eval LASTARG=\${$#}
    220         case $LASTARG in
    221         *.y)
    222             SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
    223             if test -f "$SRCFILE"; then
    224                  cp "$SRCFILE" y.tab.c
    225             fi
    226             SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
    227             if test -f "$SRCFILE"; then
    228                  cp "$SRCFILE" y.tab.h
    229             fi
    230           ;;
    231         esac
    232     fi
    233     if test ! -f y.tab.h; then
    234         echo >y.tab.h
    235     fi
    236     if test ! -f y.tab.c; then
    237         echo 'main() { return 0; }' >y.tab.c
    238     fi
    239     ;;
    240 
    241   lex*|flex*)
    242     echo 1>&2 "\
    243 WARNING: \`$1' is $msg.  You should only need it if
    244          you modified a \`.l' file.  You may need the \`Flex' package
    245          in order for those modifications to take effect.  You can get
    246          \`Flex' from any GNU archive site."
    247     rm -f lex.yy.c
    248     if test $# -ne 1; then
    249         eval LASTARG=\${$#}
    250         case $LASTARG in
    251         *.l)
    252             SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
    253             if test -f "$SRCFILE"; then
    254                  cp "$SRCFILE" lex.yy.c
    255             fi
    256           ;;
    257         esac
    258     fi
    259     if test ! -f lex.yy.c; then
    260         echo 'main() { return 0; }' >lex.yy.c
    261     fi
    262     ;;
    263 
    264   help2man*)
    265     echo 1>&2 "\
    266 WARNING: \`$1' is $msg.  You should only need it if
    267          you modified a dependency of a manual page.  You may need the
    268          \`Help2man' package in order for those modifications to take
    269          effect.  You can get \`Help2man' from any GNU archive site."
    270 
    271     file=`echo "$*" | sed -n "$sed_output"`
    272     test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
    273     if test -f "$file"; then
    274         touch $file
    275     else
    276         test -z "$file" || exec >$file
    277         echo ".ab help2man is required to generate this page"
    278         exit $?
    279     fi
    280     ;;
    281 
    282   makeinfo*)
    283     echo 1>&2 "\
    284 WARNING: \`$1' is $msg.  You should only need it if
    285          you modified a \`.texi' or \`.texinfo' file, or any other file
    286          indirectly affecting the aspect of the manual.  The spurious
    287          call might also be the consequence of using a buggy \`make' (AIX,
    288          DU, IRIX).  You might want to install the \`Texinfo' package or
    289          the \`GNU make' package.  Grab either from any GNU archive site."
    290     # The file to touch is that specified with -o ...
    291     file=`echo "$*" | sed -n "$sed_output"`
    292     test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
    293     if test -z "$file"; then
    294       # ... or it is the one specified with @setfilename ...
    295       infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
    296       file=`sed -n '
    297         /^@setfilename/{
    298           s/.* \([^ ]*\) *$/\1/
    299           p
    300           q
    301         }' $infile`
    302       # ... or it is derived from the source name (dir/f.texi becomes f.info)
    303       test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
    304     fi
    305     # If the file does not exist, the user really needs makeinfo;
    306     # let's fail without touching anything.
    307     test -f $file || exit 1
    308     touch $file
    309     ;;
    310 
    311   *)
    312     echo 1>&2 "\
    313 WARNING: \`$1' is needed, and is $msg.
    314          You might have modified some files without having the
    315          proper tools for further handling them.  Check the \`README' file,
    316          it often tells you about the needed prerequisites for installing
    317          this package.  You may also peek at any GNU archive site, in case
    318          some other package would contain this missing \`$1' program."
    319     exit 1
    320     ;;
    321 esac
    322 
    323 exit 0
     80# Run the given program, remember its exit status.
     81"$@"; st=$?
     82
     83# If it succeeded, we are done.
     84test $st -eq 0 && exit 0
     85
     86# Also exit now if we it failed (or wasn't found), and '--version' was
     87# passed; such an option is passed most likely to detect whether the
     88# program is present and works.
     89case $2 in --version|--help) exit $st;; esac
     90
     91# Exit code 63 means version mismatch.  This often happens when the user
     92# tries to use an ancient version of a tool on a file that requires a
     93# minimum version.
     94if test $st -eq 63; then
     95  msg="probably too old"
     96elif test $st -eq 127; then
     97  # Program was missing.
     98  msg="missing on your system"
     99else
     100  # Program was found and executed, but failed.  Give up.
     101  exit $st
     102fi
     103
     104perl_URL=http://www.perl.org/
     105flex_URL=http://flex.sourceforge.net/
     106gnu_software_URL=http://www.gnu.org/software
     107
     108program_details ()
     109{
     110  case $1 in
     111    aclocal|automake)
     112      echo "The '$1' program is part of the GNU Automake package:"
     113      echo "<$gnu_software_URL/automake>"
     114      echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
     115      echo "<$gnu_software_URL/autoconf>"
     116      echo "<$gnu_software_URL/m4/>"
     117      echo "<$perl_URL>"
     118      ;;
     119    autoconf|autom4te|autoheader)
     120      echo "The '$1' program is part of the GNU Autoconf package:"
     121      echo "<$gnu_software_URL/autoconf/>"
     122      echo "It also requires GNU m4 and Perl in order to run:"
     123      echo "<$gnu_software_URL/m4/>"
     124      echo "<$perl_URL>"
     125      ;;
     126  esac
     127}
     128
     129give_advice ()
     130{
     131  # Normalize program name to check for.
     132  normalized_program=`echo "$1" | sed '
     133    s/^gnu-//; t
     134    s/^gnu//; t
     135    s/^g//; t'`
     136
     137  printf '%s\n' "'$1' is $msg."
     138
     139  configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
     140  case $normalized_program in
     141    autoconf*)
     142      echo "You should only need it if you modified 'configure.ac',"
     143      echo "or m4 files included by it."
     144      program_details 'autoconf'
     145      ;;
     146    autoheader*)
     147      echo "You should only need it if you modified 'acconfig.h' or"
     148      echo "$configure_deps."
     149      program_details 'autoheader'
     150      ;;
     151    automake*)
     152      echo "You should only need it if you modified 'Makefile.am' or"
     153      echo "$configure_deps."
     154      program_details 'automake'
     155      ;;
     156    aclocal*)
     157      echo "You should only need it if you modified 'acinclude.m4' or"
     158      echo "$configure_deps."
     159      program_details 'aclocal'
     160      ;;
     161   autom4te*)
     162      echo "You might have modified some maintainer files that require"
     163      echo "the 'autom4te' program to be rebuilt."
     164      program_details 'autom4te'
     165      ;;
     166    bison*|yacc*)
     167      echo "You should only need it if you modified a '.y' file."
     168      echo "You may want to install the GNU Bison package:"
     169      echo "<$gnu_software_URL/bison/>"
     170      ;;
     171    lex*|flex*)
     172      echo "You should only need it if you modified a '.l' file."
     173      echo "You may want to install the Fast Lexical Analyzer package:"
     174      echo "<$flex_URL>"
     175      ;;
     176    help2man*)
     177      echo "You should only need it if you modified a dependency" \
     178           "of a man page."
     179      echo "You may want to install the GNU Help2man package:"
     180      echo "<$gnu_software_URL/help2man/>"
     181    ;;
     182    makeinfo*)
     183      echo "You should only need it if you modified a '.texi' file, or"
     184      echo "any other file indirectly affecting the aspect of the manual."
     185      echo "You might want to install the Texinfo package:"
     186      echo "<$gnu_software_URL/texinfo/>"
     187      echo "The spurious makeinfo call might also be the consequence of"
     188      echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
     189      echo "want to install GNU make:"
     190      echo "<$gnu_software_URL/make/>"
     191      ;;
     192    *)
     193      echo "You might have modified some files without having the proper"
     194      echo "tools for further handling them.  Check the 'README' file, it"
     195      echo "often tells you about the needed prerequisites for installing"
     196      echo "this package.  You may also peek at any GNU archive site, in"
     197      echo "case some other package contains this missing '$1' program."
     198      ;;
     199  esac
     200}
     201
     202give_advice "$1" | sed -e '1s/^/WARNING: /' \
     203                       -e '2,$s/^/         /' >&2
     204
     205# Propagate the correct exit status (expected to be 127 for a program
     206# not found, 63 for a program that failed due to version mismatch).
     207exit $st
    324208
    325209# Local variables:
  • config.h.in

    rfea3faa rb826e6b  
    120120/* Define to 1 if the system has the type `_Bool'. */
    121121#undef HAVE__BOOL
    122 
    123 /* Define to 1 if your C compiler doesn't accept -c and -o together. */
    124 #undef NO_MINUS_C_MINUS_O
    125122
    126123/* Name of package */
  • configure

    rfea3faa rb826e6b  
    11#! /bin/sh
    22# Guess values for system-dependent variables and create Makefiles.
    3 # Generated by GNU Autoconf 2.68 for cfa-cc 1.0.0.0.
     3# Generated by GNU Autoconf 2.69 for cfa-cc 1.0.0.0.
    44#
    55# Report bugs to <cforall@plg.uwaterloo.ca>.
    66#
    77#
    8 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
    9 # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
    10 # Foundation, Inc.
     8# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
    119#
    1210#
     
    137135(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
    138136
     137# Use a proper internal environment variable to ensure we don't fall
     138  # into an infinite loop, continuously re-executing ourselves.
     139  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
     140    _as_can_reexec=no; export _as_can_reexec;
     141    # We cannot yet assume a decent shell, so we have to provide a
     142# neutralization value for shells without unset; and this also
     143# works around shells that cannot unset nonexistent variables.
     144# Preserve -v and -x to the replacement shell.
     145BASH_ENV=/dev/null
     146ENV=/dev/null
     147(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
     148case $- in # ((((
     149  *v*x* | *x*v* ) as_opts=-vx ;;
     150  *v* ) as_opts=-v ;;
     151  *x* ) as_opts=-x ;;
     152  * ) as_opts= ;;
     153esac
     154exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
     155# Admittedly, this is quite paranoid, since all the known shells bail
     156# out after a failed `exec'.
     157$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
     158as_fn_exit 255
     159  fi
     160  # We don't want this to propagate to other subprocesses.
     161          { _as_can_reexec=; unset _as_can_reexec;}
    139162if test "x$CONFIG_SHELL" = x; then
    140163  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
     
    170193  exitcode=1; echo positional parameters were not saved.
    171194fi
    172 test x\$exitcode = x0 || exit 1"
     195test x\$exitcode = x0 || exit 1
     196test -x / || exit 1"
    173197  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
    174198  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
     
    215239
    216240      if test "x$CONFIG_SHELL" != x; then :
    217   # We cannot yet assume a decent shell, so we have to provide a
    218         # neutralization value for shells without unset; and this also
    219         # works around shells that cannot unset nonexistent variables.
    220         # Preserve -v and -x to the replacement shell.
    221         BASH_ENV=/dev/null
    222         ENV=/dev/null
    223         (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
    224         export CONFIG_SHELL
    225         case $- in # ((((
    226           *v*x* | *x*v* ) as_opts=-vx ;;
    227           *v* ) as_opts=-v ;;
    228           *x* ) as_opts=-x ;;
    229           * ) as_opts= ;;
    230         esac
    231         exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
     241  export CONFIG_SHELL
     242             # We cannot yet assume a decent shell, so we have to provide a
     243# neutralization value for shells without unset; and this also
     244# works around shells that cannot unset nonexistent variables.
     245# Preserve -v and -x to the replacement shell.
     246BASH_ENV=/dev/null
     247ENV=/dev/null
     248(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
     249case $- in # ((((
     250  *v*x* | *x*v* ) as_opts=-vx ;;
     251  *v* ) as_opts=-v ;;
     252  *x* ) as_opts=-x ;;
     253  * ) as_opts= ;;
     254esac
     255exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
     256# Admittedly, this is quite paranoid, since all the known shells bail
     257# out after a failed `exec'.
     258$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
     259exit 255
    232260fi
    233261
     
    332360
    333361} # as_fn_mkdir_p
     362
     363# as_fn_executable_p FILE
     364# -----------------------
     365# Test if FILE is an executable regular file.
     366as_fn_executable_p ()
     367{
     368  test -f "$1" && test -x "$1"
     369} # as_fn_executable_p
    334370# as_fn_append VAR VALUE
    335371# ----------------------
     
    453489    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
    454490
     491  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
     492  # already done that, so ensure we don't try to do so again and fall
     493  # in an infinite loop.  This has already happened in practice.
     494  _as_can_reexec=no; export _as_can_reexec
    455495  # Don't try to exec as it changes $[0], causing all sort of problems
    456496  # (the dirname of $[0] is not the place where we might find the
     
    487527    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
    488528    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
    489     # In both cases, we have to default to `cp -p'.
     529    # In both cases, we have to default to `cp -pR'.
    490530    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
    491       as_ln_s='cp -p'
     531      as_ln_s='cp -pR'
    492532  elif ln conf$$.file conf$$ 2>/dev/null; then
    493533    as_ln_s=ln
    494534  else
    495     as_ln_s='cp -p'
     535    as_ln_s='cp -pR'
    496536  fi
    497537else
    498   as_ln_s='cp -p'
     538  as_ln_s='cp -pR'
    499539fi
    500540rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
     
    508548fi
    509549
    510 if test -x / >/dev/null 2>&1; then
    511   as_test_x='test -x'
    512 else
    513   if ls -dL / >/dev/null 2>&1; then
    514     as_ls_L_option=L
    515   else
    516     as_ls_L_option=
    517   fi
    518   as_test_x='
    519     eval sh -c '\''
    520       if test -d "$1"; then
    521         test -d "$1/.";
    522       else
    523         case $1 in #(
    524         -*)set "./$1";;
    525         esac;
    526         case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
    527         ???[sx]*):;;*)false;;esac;fi
    528     '\'' sh
    529   '
    530 fi
    531 as_executable_p=$as_test_x
     550as_test_x='test -x'
     551as_executable_p=as_fn_executable_p
    532552
    533553# Sed expression to map a string onto a valid CPP name.
     
    718738oldincludedir
    719739includedir
     740runstatedir
    720741localstatedir
    721742sharedstatedir
     
    803824sharedstatedir='${prefix}/com'
    804825localstatedir='${prefix}/var'
     826runstatedir='${localstatedir}/run'
    805827includedir='${prefix}/include'
    806828oldincludedir='/usr/include'
     
    10551077    silent=yes ;;
    10561078
     1079  -runstatedir | --runstatedir | --runstatedi | --runstated \
     1080  | --runstate | --runstat | --runsta | --runst | --runs \
     1081  | --run | --ru | --r)
     1082    ac_prev=runstatedir ;;
     1083  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
     1084  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
     1085  | --run=* | --ru=* | --r=*)
     1086    runstatedir=$ac_optarg ;;
     1087
    10571088  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    10581089    ac_prev=sbindir ;;
     
    11921223                datadir sysconfdir sharedstatedir localstatedir includedir \
    11931224                oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
    1194                 libdir localedir mandir
     1225                libdir localedir mandir runstatedir
    11951226do
    11961227  eval ac_val=\$$ac_var
     
    12201251  if test "x$build_alias" = x; then
    12211252    cross_compiling=maybe
    1222     $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
    1223     If a cross compiler is detected then cross compile mode will be used" >&2
    12241253  elif test "x$build_alias" != "x$host_alias"; then
    12251254    cross_compiling=yes
     
    13471376  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
    13481377  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
     1378  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
    13491379  --libdir=DIR            object code libraries [EPREFIX/lib]
    13501380  --includedir=DIR        C header files [PREFIX/include]
     
    13851415  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
    13861416  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
    1387   --enable-silent-rules          less verbose build output (undo: `make V=1')
    1388   --disable-silent-rules         verbose build output (undo: `make V=0')
    1389   --disable-maintainer-mode  disable make rules and dependencies not useful
    1390                           (and sometimes confusing) to the casual installer
     1417  --enable-silent-rules   less verbose build output (undo: "make V=1")
     1418  --disable-silent-rules  verbose build output (undo: "make V=0")
     1419  --disable-maintainer-mode
     1420                          disable make rules and dependencies not useful (and
     1421                          sometimes confusing) to the casual installer
    13911422  --enable-target-release Build and install the release target
    13921423  --enable-target-debug   Build and install the debug target
    13931424  --enable-threading      Build and install libcfa with threading support
    13941425                          (Enabled by default)
    1395   --disable-dependency-tracking  speeds up one-time build
    1396   --enable-dependency-tracking   do not reject slow dependency extractors
     1426  --enable-dependency-tracking
     1427                          do not reject slow dependency extractors
     1428  --disable-dependency-tracking
     1429                          speeds up one-time build
    13971430
    13981431Optional Packages:
     
    14891522  cat <<\_ACEOF
    14901523cfa-cc configure 1.0.0.0
    1491 generated by GNU Autoconf 2.68
    1492 
    1493 Copyright (C) 2010 Free Software Foundation, Inc.
     1524generated by GNU Autoconf 2.69
     1525
     1526Copyright (C) 2012 Free Software Foundation, Inc.
    14941527This configure script is free software; the Free Software Foundation
    14951528gives unlimited permission to copy, distribute and modify it.
     
    16051638       } && test -s conftest$ac_exeext && {
    16061639         test "$cross_compiling" = yes ||
    1607          $as_test_x conftest$ac_exeext
     1640         test -x conftest$ac_exeext
    16081641       }; then :
    16091642  ac_retval=0
     
    19712004{
    19722005static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))];
    1973 test_array [0] = 0
     2006test_array [0] = 0;
     2007return test_array [0];
    19742008
    19752009  ;
     
    19872021static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1)
    19882022                 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))];
    1989 test_array [0] = 0
     2023test_array [0] = 0;
     2024return test_array [0];
    19902025
    19912026  ;
     
    20442079{
    20452080static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)];
    2046 test_array [0] = 0
     2081test_array [0] = 0;
     2082return test_array [0];
    20472083
    20482084  ;
     
    20772113
    20782114It was created by cfa-cc $as_me 1.0.0.0, which was
    2079 generated by GNU Autoconf 2.68.  Invocation command line was
     2115generated by GNU Autoconf 2.69.  Invocation command line was
    20802116
    20812117  $ $0 $@
     
    24612497fi
    24622498
    2463 case $enable_silent_rules in
    2464 yes) AM_DEFAULT_VERBOSITY=0;;
    2465 no) AM_DEFAULT_VERBOSITY=1;;
    2466 *)  AM_DEFAULT_VERBOSITY=1;;
     2499case $enable_silent_rules in # (((
     2500  yes) AM_DEFAULT_VERBOSITY=0;;
     2501   no) AM_DEFAULT_VERBOSITY=1;;
     2502    *) AM_DEFAULT_VERBOSITY=1;;
    24672503esac
    24682504am_make=${MAKE-make}
     
    24962532
    24972533
    2498 am__api_version='1.11'
     2534am__api_version='1.15'
    24992535
    25002536# Find a good install program.  We prefer a C program (faster),
     
    25352571    for ac_prog in ginstall scoinst install; do
    25362572      for ac_exec_ext in '' $ac_executable_extensions; do
    2537         if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
     2573        if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
    25382574          if test $ac_prog = install &&
    25392575            grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
     
    25932629{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
    25942630$as_echo_n "checking whether build environment is sane... " >&6; }
    2595 # Just in case
    2596 sleep 1
    2597 echo timestamp > conftest.file
    25982631# Reject unsafe characters in $srcdir or the absolute working directory
    25992632# name.  Accept space and tab only in the latter.
     
    26062639case $srcdir in
    26072640  *[\\\"\#\$\&\'\`$am_lf\ \     ]*)
    2608     as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
     2641    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
    26092642esac
    26102643
    2611 # Do `set' in a subshell so we don't clobber the current shell's
     2644# Do 'set' in a subshell so we don't clobber the current shell's
    26122645# arguments.  Must try -L first in case configure is actually a
    26132646# symlink; some systems play weird games with the mod time of symlinks
     
    26152648# directory).
    26162649if (
    2617    set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
    2618    if test "$*" = "X"; then
    2619       # -L didn't work.
    2620       set X `ls -t "$srcdir/configure" conftest.file`
    2621    fi
    2622    rm -f conftest.file
    2623    if test "$*" != "X $srcdir/configure conftest.file" \
    2624       && test "$*" != "X conftest.file $srcdir/configure"; then
    2625 
    2626       # If neither matched, then we have a broken ls.  This can happen
    2627       # if, for instance, CONFIG_SHELL is bash and it inherits a
    2628       # broken ls alias from the environment.  This has actually
    2629       # happened.  Such a system could not be considered "sane".
    2630       as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
    2631 alias in your environment" "$LINENO" 5
    2632    fi
    2633 
     2650   am_has_slept=no
     2651   for am_try in 1 2; do
     2652     echo "timestamp, slept: $am_has_slept" > conftest.file
     2653     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
     2654     if test "$*" = "X"; then
     2655        # -L didn't work.
     2656        set X `ls -t "$srcdir/configure" conftest.file`
     2657     fi
     2658     if test "$*" != "X $srcdir/configure conftest.file" \
     2659        && test "$*" != "X conftest.file $srcdir/configure"; then
     2660
     2661        # If neither matched, then we have a broken ls.  This can happen
     2662        # if, for instance, CONFIG_SHELL is bash and it inherits a
     2663        # broken ls alias from the environment.  This has actually
     2664        # happened.  Such a system could not be considered "sane".
     2665        as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
     2666  alias in your environment" "$LINENO" 5
     2667     fi
     2668     if test "$2" = conftest.file || test $am_try -eq 2; then
     2669       break
     2670     fi
     2671     # Just in case.
     2672     sleep 1
     2673     am_has_slept=yes
     2674   done
    26342675   test "$2" = conftest.file
    26352676   )
     
    26432684{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
    26442685$as_echo "yes" >&6; }
     2686# If we didn't sleep, we still need to ensure time stamps of config.status and
     2687# generated files are strictly newer.
     2688am_sleep_pid=
     2689if grep 'slept: no' conftest.file >/dev/null 2>&1; then
     2690  ( sleep 1 ) &
     2691  am_sleep_pid=$!
     2692fi
     2693
     2694rm -f conftest.file
     2695
    26452696test "$program_prefix" != NONE &&
    26462697  program_transform_name="s&^&$program_prefix&;$program_transform_name"
     
    26532704program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
    26542705
    2655 # expand $ac_aux_dir to an absolute path
    2656 am_aux_dir=`cd $ac_aux_dir && pwd`
     2706# Expand $ac_aux_dir to an absolute path.
     2707am_aux_dir=`cd "$ac_aux_dir" && pwd`
    26572708
    26582709if test x"${MISSING+set}" != xset; then
     
    26652716fi
    26662717# Use eval to expand $SHELL
    2667 if eval "$MISSING --run true"; then
    2668   am_missing_run="$MISSING --run "
     2718if eval "$MISSING --is-lightweight"; then
     2719  am_missing_run="$MISSING "
    26692720else
    26702721  am_missing_run=
    2671   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
    2672 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
    2673 fi
    2674 
    2675 if test x"${install_sh}" != xset; then
     2722  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
     2723$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
     2724fi
     2725
     2726if test x"${install_sh+set}" != xset; then
    26762727  case $am_aux_dir in
    26772728  *\ * | *\     *)
     
    26822733fi
    26832734
    2684 # Installed binaries are usually stripped using `strip' when the user
    2685 # run `make install-strip'.  However `strip' might not be the right
     2735# Installed binaries are usually stripped using 'strip' when the user
     2736# run "make install-strip".  However 'strip' might not be the right
    26862737# tool to use in cross-compilation environments, therefore Automake
    2687 # will honor the `STRIP' environment variable to overrule this program.
     2738# will honor the 'STRIP' environment variable to overrule this program.
    26882739if test "$cross_compiling" != no; then
    26892740  if test -n "$ac_tool_prefix"; then
     
    27042755  test -z "$as_dir" && as_dir=.
    27052756    for ac_exec_ext in '' $ac_executable_extensions; do
    2706   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     2757  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    27072758    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
    27082759    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    27442795  test -z "$as_dir" && as_dir=.
    27452796    for ac_exec_ext in '' $ac_executable_extensions; do
    2746   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     2797  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    27472798    ac_cv_prog_ac_ct_STRIP="strip"
    27482799    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    27952846    for ac_prog in mkdir gmkdir; do
    27962847         for ac_exec_ext in '' $ac_executable_extensions; do
    2797            { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
     2848           as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
    27982849           case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
    27992850             'mkdir (GNU coreutils) '* | \
     
    28242875$as_echo "$MKDIR_P" >&6; }
    28252876
    2826 mkdir_p="$MKDIR_P"
    2827 case $mkdir_p in
    2828   [\\/$]* | ?:[\\/]*) ;;
    2829   */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
    2830 esac
    2831 
    28322877for ac_prog in gawk mawk nawk awk
    28332878do
     
    28482893  test -z "$as_dir" && as_dir=.
    28492894    for ac_exec_ext in '' $ac_executable_extensions; do
    2850   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     2895  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    28512896    ac_cv_prog_AWK="$ac_prog"
    28522897    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    29623007MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
    29633008
    2964 # We need awk for the "check" target.  The system "awk" is bad on
    2965 # some platforms.
     3009# For better backward compatibility.  To be removed once Automake 1.9.x
     3010# dies out for good.  For more background, see:
     3011# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
     3012# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
     3013mkdir_p='$(MKDIR_P)'
     3014
     3015# We need awk for the "check" target (and possibly the TAP driver).  The
     3016# system "awk" is bad on some platforms.
    29663017# Always define AMTAR for backward compatibility.  Yes, it's still used
    29673018# in the wild :-(  We should find a proper way to deprecate it ...
    29683019AMTAR='$${TAR-tar}'
    29693020
     3021
     3022# We'll loop over all known methods to create a tar archive until one works.
     3023_am_tools='gnutar  pax cpio none'
     3024
    29703025am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
    29713026
     
    29733028
    29743029
     3030
     3031
     3032# POSIX will say in a future version that running "rm -f" with no argument
     3033# is OK; and we want to be able to make that assumption in our Makefile
     3034# recipes.  So use an aggressive probe to check that the usage we want is
     3035# actually supported "in the wild" to an acceptable degree.
     3036# See automake bug#10828.
     3037# To make any issue more visible, cause the running configure to be aborted
     3038# by default if the 'rm' program in use doesn't match our expectations; the
     3039# user can still override this though.
     3040if rm -f && rm -fr && rm -rf; then : OK; else
     3041  cat >&2 <<'END'
     3042Oops!
     3043
     3044Your 'rm' program seems unable to run without file operands specified
     3045on the command line, even when the '-f' option is present.  This is contrary
     3046to the behaviour of most rm programs out there, and not conforming with
     3047the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
     3048
     3049Please tell bug-automake@gnu.org about your system, including the value
     3050of your $PATH and any error possibly output before this message.  This
     3051can help us improve future automake versions.
     3052
     3053END
     3054  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
     3055    echo 'Configuration will proceed anyway, since you have set the' >&2
     3056    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
     3057    echo >&2
     3058  else
     3059    cat >&2 <<'END'
     3060Aborting the configuration process, to ensure you take notice of the issue.
     3061
     3062You can download and install GNU coreutils to get an 'rm' implementation
     3063that behaves properly: <http://www.gnu.org/software/coreutils/>.
     3064
     3065If you want to complete the configuration process using your problematic
     3066'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
     3067to "yes", and re-run configure.
     3068
     3069END
     3070    as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
     3071  fi
     3072fi
    29753073
    29763074
     
    31023200  test -z "$as_dir" && as_dir=.
    31033201    for ac_exec_ext in '' $ac_executable_extensions; do
    3104   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     3202  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    31053203    ac_cv_path_BACKEND_CC="$as_dir/$ac_word$ac_exec_ext"
    31063204    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    33733471        case $host_cpu in
    33743472                i386)
    3375                         CFLAGS+="-m32"
    3376                         CXXFLAGS+="-m32"
    3377                         CFAFLAGS+="-m32"
    3378                         LDFLAGS+="-m32"
     3473                        CFLAGS+=" -m32 "
     3474                        CXXFLAGS+=" -m32 "
     3475                        CFAFLAGS+=" -m32 "
     3476                        LDFLAGS+=" -m32 "
    33793477                        ;;
    33803478                i686)
    3381                         CFLAGS+="-m32"
    3382                         CXXFLAGS+="-m32"
    3383                         CFAFLAGS+="-m32"
    3384                         LDFLAGS+="-m32"
     3479                        CFLAGS+=" -m32 "
     3480                  CXXFLAGS+=" -m32 "
     3481                  CFAFLAGS+=" -m32 "
     3482                  LDFLAGS+=" -m32 "
    33853483                        ;;
    33863484                x86_64)
    3387                         CFLAGS+="-m64"
    3388                         CXXFLAGS+="-m64"
    3389                         CFAFLAGS+="-m64"
    3390                         LDFLAGS+="-m64"
     3485                        CFLAGS+=" -m64 "
     3486                        CXXFLAGS+=" -m64 "
     3487                        CFAFLAGS+=" -m64 "
     3488                        LDFLAGS+=" -m64 "
    33913489                        ;;
    33923490        esac
     
    34303528  test -z "$as_dir" && as_dir=.
    34313529    for ac_exec_ext in '' $ac_executable_extensions; do
    3432   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     3530  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    34333531    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
    34343532    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    34743572  test -z "$as_dir" && as_dir=.
    34753573    for ac_exec_ext in '' $ac_executable_extensions; do
    3476   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     3574  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    34773575    ac_cv_prog_ac_ct_CXX="$ac_prog"
    34783576    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    39274025# First try GNU make style include.
    39284026echo "include confinc" > confmf
    3929 # Ignore all kinds of additional output from `make'.
     4027# Ignore all kinds of additional output from 'make'.
    39304028case `$am_make -s -f confmf 2> /dev/null` in #(
    39314029*the\ am__doit\ target*)
     
    39834081  # making bogus files that we don't know about and never remove.  For
    39844082  # instance it was reported that on HP-UX the gcc test will end up
    3985   # making a dummy file named `D' -- because `-MD' means `put the output
    3986   # in D'.
     4083  # making a dummy file named 'D' -- because '-MD' means "put the output
     4084  # in D".
    39874085  rm -rf conftest.dir
    39884086  mkdir conftest.dir
     
    40194117    for i in 1 2 3 4 5 6; do
    40204118      echo '#include "conftst'$i'.h"' >> sub/conftest.c
    4021       # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
    4022       # Solaris 8's {/usr,}/bin/sh.
    4023       touch sub/conftst$i.h
     4119      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
     4120      # Solaris 10 /bin/sh.
     4121      echo '/* dummy */' > sub/conftst$i.h
    40244122    done
    40254123    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
    40264124
    4027     # We check with `-c' and `-o' for the sake of the "dashmstdout"
     4125    # We check with '-c' and '-o' for the sake of the "dashmstdout"
    40284126    # mode.  It turns out that the SunPro C++ compiler does not properly
    4029     # handle `-M -o', and we need to detect this.  Also, some Intel
    4030     # versions had trouble with output in subdirs
     4127    # handle '-M -o', and we need to detect this.  Also, some Intel
     4128    # versions had trouble with output in subdirs.
    40314129    am__obj=sub/conftest.${OBJEXT-o}
    40324130    am__minus_obj="-o $am__obj"
     
    40374135      ;;
    40384136    nosideeffect)
    4039       # after this tag, mechanisms are not by side-effect, so they'll
    4040       # only be used when explicitly requested
     4137      # After this tag, mechanisms are not by side-effect, so they'll
     4138      # only be used when explicitly requested.
    40414139      if test "x$enable_dependency_tracking" = xyes; then
    40424140        continue
     
    40464144      ;;
    40474145    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
    4048       # This compiler won't grok `-c -o', but also, the minuso test has
     4146      # This compiler won't grok '-c -o', but also, the minuso test has
    40494147      # not run yet.  These depmodes are late enough in the game, and
    40504148      # so weak that their functioning should not be impacted.
     
    41224220  test -z "$as_dir" && as_dir=.
    41234221    for ac_exec_ext in '' $ac_executable_extensions; do
    4124   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     4222  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    41254223    ac_cv_prog_CC="${ac_tool_prefix}gcc"
    41264224    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    41624260  test -z "$as_dir" && as_dir=.
    41634261    for ac_exec_ext in '' $ac_executable_extensions; do
    4164   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     4262  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    41654263    ac_cv_prog_ac_ct_CC="gcc"
    41664264    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    42154313  test -z "$as_dir" && as_dir=.
    42164314    for ac_exec_ext in '' $ac_executable_extensions; do
    4217   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     4315  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    42184316    ac_cv_prog_CC="${ac_tool_prefix}cc"
    42194317    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    42564354  test -z "$as_dir" && as_dir=.
    42574355    for ac_exec_ext in '' $ac_executable_extensions; do
    4258   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     4356  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    42594357    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
    42604358       ac_prog_rejected=yes
     
    43144412  test -z "$as_dir" && as_dir=.
    43154413    for ac_exec_ext in '' $ac_executable_extensions; do
    4316   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     4414  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    43174415    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
    43184416    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    43584456  test -z "$as_dir" && as_dir=.
    43594457    for ac_exec_ext in '' $ac_executable_extensions; do
    4360   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     4458  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    43614459    ac_cv_prog_ac_ct_CC="$ac_prog"
    43624460    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    45544652#include <stdarg.h>
    45554653#include <stdio.h>
    4556 #include <sys/types.h>
    4557 #include <sys/stat.h>
     4654struct stat;
    45584655/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
    45594656struct buf { int x; };
     
    46404737ac_compiler_gnu=$ac_cv_c_compiler_gnu
    46414738
     4739ac_ext=c
     4740ac_cpp='$CPP $CPPFLAGS'
     4741ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
     4742ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
     4743ac_compiler_gnu=$ac_cv_c_compiler_gnu
     4744{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
     4745$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
     4746if ${am_cv_prog_cc_c_o+:} false; then :
     4747  $as_echo_n "(cached) " >&6
     4748else
     4749  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
     4750/* end confdefs.h.  */
     4751
     4752int
     4753main ()
     4754{
     4755
     4756  ;
     4757  return 0;
     4758}
     4759_ACEOF
     4760  # Make sure it works both with $CC and with simple cc.
     4761  # Following AC_PROG_CC_C_O, we do the test twice because some
     4762  # compilers refuse to overwrite an existing .o file with -o,
     4763  # though they will create one.
     4764  am_cv_prog_cc_c_o=yes
     4765  for am_i in 1 2; do
     4766    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
     4767   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
     4768   ac_status=$?
     4769   echo "$as_me:$LINENO: \$? = $ac_status" >&5
     4770   (exit $ac_status); } \
     4771         && test -f conftest2.$ac_objext; then
     4772      : OK
     4773    else
     4774      am_cv_prog_cc_c_o=no
     4775      break
     4776    fi
     4777  done
     4778  rm -f core conftest*
     4779  unset am_i
     4780fi
     4781{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
     4782$as_echo "$am_cv_prog_cc_c_o" >&6; }
     4783if test "$am_cv_prog_cc_c_o" != yes; then
     4784   # Losing compiler, so override with the script.
     4785   # FIXME: It is wrong to rewrite CC.
     4786   # But if we don't then we get into trouble of one sort or another.
     4787   # A longer-term fix would be to have automake use am__CC in this case,
     4788   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
     4789   CC="$am_aux_dir/compile $CC"
     4790fi
     4791ac_ext=c
     4792ac_cpp='$CPP $CPPFLAGS'
     4793ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
     4794ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
     4795ac_compiler_gnu=$ac_cv_c_compiler_gnu
     4796
     4797
    46424798depcc="$CC"   am_compiler_list=
    46434799
     
    46514807  # making bogus files that we don't know about and never remove.  For
    46524808  # instance it was reported that on HP-UX the gcc test will end up
    4653   # making a dummy file named `D' -- because `-MD' means `put the output
    4654   # in D'.
     4809  # making a dummy file named 'D' -- because '-MD' means "put the output
     4810  # in D".
    46554811  rm -rf conftest.dir
    46564812  mkdir conftest.dir
     
    46874843    for i in 1 2 3 4 5 6; do
    46884844      echo '#include "conftst'$i'.h"' >> sub/conftest.c
    4689       # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
    4690       # Solaris 8's {/usr,}/bin/sh.
    4691       touch sub/conftst$i.h
     4845      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
     4846      # Solaris 10 /bin/sh.
     4847      echo '/* dummy */' > sub/conftst$i.h
    46924848    done
    46934849    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
    46944850
    4695     # We check with `-c' and `-o' for the sake of the "dashmstdout"
     4851    # We check with '-c' and '-o' for the sake of the "dashmstdout"
    46964852    # mode.  It turns out that the SunPro C++ compiler does not properly
    4697     # handle `-M -o', and we need to detect this.  Also, some Intel
    4698     # versions had trouble with output in subdirs
     4853    # handle '-M -o', and we need to detect this.  Also, some Intel
     4854    # versions had trouble with output in subdirs.
    46994855    am__obj=sub/conftest.${OBJEXT-o}
    47004856    am__minus_obj="-o $am__obj"
     
    47054861      ;;
    47064862    nosideeffect)
    4707       # after this tag, mechanisms are not by side-effect, so they'll
    4708       # only be used when explicitly requested
     4863      # After this tag, mechanisms are not by side-effect, so they'll
     4864      # only be used when explicitly requested.
    47094865      if test "x$enable_dependency_tracking" = xyes; then
    47104866        continue
     
    47144870      ;;
    47154871    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
    4716       # This compiler won't grok `-c -o', but also, the minuso test has
     4872      # This compiler won't grok '-c -o', but also, the minuso test has
    47174873      # not run yet.  These depmodes are late enough in the game, and
    47184874      # so weak that their functioning should not be impacted.
     
    47864942  # making bogus files that we don't know about and never remove.  For
    47874943  # instance it was reported that on HP-UX the gcc test will end up
    4788   # making a dummy file named `D' -- because `-MD' means `put the output
    4789   # in D'.
     4944  # making a dummy file named 'D' -- because '-MD' means "put the output
     4945  # in D".
    47904946  rm -rf conftest.dir
    47914947  mkdir conftest.dir
     
    48204976    for i in 1 2 3 4 5 6; do
    48214977      echo '#include "conftst'$i'.h"' >> sub/conftest.c
    4822       # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
    4823       # Solaris 8's {/usr,}/bin/sh.
    4824       touch sub/conftst$i.h
     4978      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
     4979      # Solaris 10 /bin/sh.
     4980      echo '/* dummy */' > sub/conftst$i.h
    48254981    done
    48264982    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
    48274983
    4828     # We check with `-c' and `-o' for the sake of the "dashmstdout"
     4984    # We check with '-c' and '-o' for the sake of the "dashmstdout"
    48294985    # mode.  It turns out that the SunPro C++ compiler does not properly
    4830     # handle `-M -o', and we need to detect this.  Also, some Intel
    4831     # versions had trouble with output in subdirs
     4986    # handle '-M -o', and we need to detect this.  Also, some Intel
     4987    # versions had trouble with output in subdirs.
    48324988    am__obj=sub/conftest.${OBJEXT-o}
    48334989    am__minus_obj="-o $am__obj"
     
    48384994      ;;
    48394995    nosideeffect)
    4840       # after this tag, mechanisms are not by side-effect, so they'll
    4841       # only be used when explicitly requested
     4996      # After this tag, mechanisms are not by side-effect, so they'll
     4997      # only be used when explicitly requested.
    48424998      if test "x$enable_dependency_tracking" = xyes; then
    48434999        continue
     
    48475003      ;;
    48485004    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
    4849       # This compiler won't grok `-c -o', but also, the minuso test has
     5005      # This compiler won't grok '-c -o', but also, the minuso test has
    48505006      # not run yet.  These depmodes are late enough in the game, and
    48515007      # so weak that their functioning should not be impacted.
     
    49015057
    49025058
    4903 if test "x$CC" != xcc; then
    4904   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5
    4905 $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; }
    4906 else
    4907   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5
    4908 $as_echo_n "checking whether cc understands -c and -o together... " >&6; }
    4909 fi
    4910 set dummy $CC; ac_cc=`$as_echo "$2" |
    4911                       sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
    4912 if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then :
    4913   $as_echo_n "(cached) " >&6
    4914 else
    4915   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
    4916 /* end confdefs.h.  */
    4917 
    4918 int
    4919 main ()
    4920 {
    4921 
    4922   ;
    4923   return 0;
    4924 }
    4925 _ACEOF
    4926 # Make sure it works both with $CC and with simple cc.
    4927 # We do the test twice because some compilers refuse to overwrite an
    4928 # existing .o file with -o, though they will create one.
    4929 ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
    4930 rm -f conftest2.*
    4931 if { { case "(($ac_try" in
    4932   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
    4933   *) ac_try_echo=$ac_try;;
    4934 esac
    4935 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
    4936 $as_echo "$ac_try_echo"; } >&5
    4937   (eval "$ac_try") 2>&5
    4938   ac_status=$?
    4939   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
    4940   test $ac_status = 0; } &&
    4941    test -f conftest2.$ac_objext && { { case "(($ac_try" in
    4942   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
    4943   *) ac_try_echo=$ac_try;;
    4944 esac
    4945 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
    4946 $as_echo "$ac_try_echo"; } >&5
    4947   (eval "$ac_try") 2>&5
    4948   ac_status=$?
    4949   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
    4950   test $ac_status = 0; };
    4951 then
    4952   eval ac_cv_prog_cc_${ac_cc}_c_o=yes
    4953   if test "x$CC" != xcc; then
    4954     # Test first that cc exists at all.
    4955     if { ac_try='cc -c conftest.$ac_ext >&5'
    4956   { { case "(($ac_try" in
    4957   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
    4958   *) ac_try_echo=$ac_try;;
    4959 esac
    4960 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
    4961 $as_echo "$ac_try_echo"; } >&5
    4962   (eval "$ac_try") 2>&5
    4963   ac_status=$?
    4964   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
    4965   test $ac_status = 0; }; }; then
    4966       ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
    4967       rm -f conftest2.*
    4968       if { { case "(($ac_try" in
    4969   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
    4970   *) ac_try_echo=$ac_try;;
    4971 esac
    4972 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
    4973 $as_echo "$ac_try_echo"; } >&5
    4974   (eval "$ac_try") 2>&5
    4975   ac_status=$?
    4976   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
    4977   test $ac_status = 0; } &&
    4978          test -f conftest2.$ac_objext && { { case "(($ac_try" in
    4979   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
    4980   *) ac_try_echo=$ac_try;;
    4981 esac
    4982 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
    4983 $as_echo "$ac_try_echo"; } >&5
    4984   (eval "$ac_try") 2>&5
    4985   ac_status=$?
    4986   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
    4987   test $ac_status = 0; };
    4988       then
    4989         # cc works too.
    4990         :
    4991       else
    4992         # cc exists but doesn't like -o.
    4993         eval ac_cv_prog_cc_${ac_cc}_c_o=no
    4994       fi
    4995     fi
    4996   fi
    4997 else
    4998   eval ac_cv_prog_cc_${ac_cc}_c_o=no
    4999 fi
    5000 rm -f core conftest*
    5001 
    5002 fi
    5003 if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then
    5004   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
    5005 $as_echo "yes" >&6; }
    5006 else
    5007   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
    5008 $as_echo "no" >&6; }
    5009 
    5010 $as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h
    5011 
    5012 fi
    5013 
    5014 # FIXME: we rely on the cache variable name because
    5015 # there is no other way.
    5016 set dummy $CC
    5017 am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
    5018 eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
    5019 if test "$am_t" != yes; then
    5020    # Losing compiler, so override with the script.
    5021    # FIXME: It is wrong to rewrite CC.
    5022    # But if we don't then we get into trouble of one sort or another.
    5023    # A longer-term fix would be to have automake use am__CC in this case,
    5024    # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
    5025    CC="$am_aux_dir/compile $CC"
    5026 fi
    5027 
    50285059        # deprecated
    50295060# These are often not installed and people miss seeing the "no", so stop the configure.
     
    50465077  test -z "$as_dir" && as_dir=.
    50475078    for ac_exec_ext in '' $ac_executable_extensions; do
    5048   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     5079  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    50495080    ac_cv_prog_YACC="$ac_prog"
    50505081    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    50915122  test -z "$as_dir" && as_dir=.
    50925123    for ac_exec_ext in '' $ac_executable_extensions; do
    5093   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     5124  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    50945125    ac_cv_prog_LEX="$ac_prog"
    50955126    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    51235154c { yymore (); }
    51245155d { yyless (1); }
    5125 e { yyless (input () != 0); }
     5156e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument.  */
     5157    yyless ((input () != 0)); }
    51265158f { unput (yytext[0]); }
    51275159. { BEGIN INITIAL; }
     
    52815313  test -z "$as_dir" && as_dir=.
    52825314    for ac_exec_ext in '' $ac_executable_extensions; do
    5283   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     5315  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    52845316    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
    52855317    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    53215353  test -z "$as_dir" && as_dir=.
    53225354    for ac_exec_ext in '' $ac_executable_extensions; do
    5323   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     5355  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    53245356    ac_cv_prog_ac_ct_RANLIB="ranlib"
    53255357    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     
    55145546    for ac_exec_ext in '' $ac_executable_extensions; do
    55155547      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
    5516       { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
     5548      as_fn_executable_p "$ac_path_GREP" || continue
    55175549# Check for GNU ac_path_GREP and select it if it is found.
    55185550  # Check for GNU $ac_path_GREP
     
    55805612    for ac_exec_ext in '' $ac_executable_extensions; do
    55815613      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
    5582       { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
     5614      as_fn_executable_p "$ac_path_EGREP" || continue
    55835615# Check for GNU ac_path_EGREP and select it if it is found.
    55845616  # Check for GNU $ac_path_EGREP
     
    59195951$ac_includes_default
    59205952int
    5921 find_stack_direction ()
     5953find_stack_direction (int *addr, int depth)
    59225954{
    5923   static char *addr = 0;
    5924   auto char dummy;
    5925   if (addr == 0)
    5926     {
    5927       addr = &dummy;
    5928       return find_stack_direction ();
    5929     }
    5930   else
    5931     return (&dummy > addr) ? 1 : -1;
     5955  int dir, dummy = 0;
     5956  if (! addr)
     5957    addr = &dummy;
     5958  *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1;
     5959  dir = depth ? find_stack_direction (addr, depth - 1) : 0;
     5960  return dir + dummy;
    59325961}
    59335962
    59345963int
    5935 main ()
     5964main (int argc, char **argv)
    59365965{
    5937   return find_stack_direction () < 0;
     5966  return find_stack_direction (0, argc + !argv + 20) < 0;
    59385967}
    59395968_ACEOF
     
    59806009/* end confdefs.h.  */
    59816010
    5982 #include <stdbool.h>
    5983 #ifndef bool
    5984  "error: bool is not defined"
    5985 #endif
    5986 #ifndef false
    5987  "error: false is not defined"
    5988 #endif
    5989 #if false
    5990  "error: false is not 0"
    5991 #endif
    5992 #ifndef true
    5993  "error: true is not defined"
    5994 #endif
    5995 #if true != 1
    5996  "error: true is not 1"
    5997 #endif
    5998 #ifndef __bool_true_false_are_defined
    5999  "error: __bool_true_false_are_defined is not defined"
    6000 #endif
    6001 
    6002         struct s { _Bool s: 1; _Bool t; } s;
    6003 
    6004         char a[true == 1 ? 1 : -1];
    6005         char b[false == 0 ? 1 : -1];
    6006         char c[__bool_true_false_are_defined == 1 ? 1 : -1];
    6007         char d[(bool) 0.5 == true ? 1 : -1];
    6008         /* See body of main program for 'e'.  */
    6009         char f[(_Bool) 0.0 == false ? 1 : -1];
    6010         char g[true];
    6011         char h[sizeof (_Bool)];
    6012         char i[sizeof s.t];
    6013         enum { j = false, k = true, l = false * true, m = true * 256 };
    6014         /* The following fails for
    6015            HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
    6016         _Bool n[m];
    6017         char o[sizeof n == m * sizeof n[0] ? 1 : -1];
    6018         char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
    6019         /* Catch a bug in an HP-UX C compiler.  See
    6020            http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
    6021            http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
    6022         */
    6023         _Bool q = true;
    6024         _Bool *pq = &q;
     6011             #include <stdbool.h>
     6012             #ifndef bool
     6013              "error: bool is not defined"
     6014             #endif
     6015             #ifndef false
     6016              "error: false is not defined"
     6017             #endif
     6018             #if false
     6019              "error: false is not 0"
     6020             #endif
     6021             #ifndef true
     6022              "error: true is not defined"
     6023             #endif
     6024             #if true != 1
     6025              "error: true is not 1"
     6026             #endif
     6027             #ifndef __bool_true_false_are_defined
     6028              "error: __bool_true_false_are_defined is not defined"
     6029             #endif
     6030
     6031             struct s { _Bool s: 1; _Bool t; } s;
     6032
     6033             char a[true == 1 ? 1 : -1];
     6034             char b[false == 0 ? 1 : -1];
     6035             char c[__bool_true_false_are_defined == 1 ? 1 : -1];
     6036             char d[(bool) 0.5 == true ? 1 : -1];
     6037             /* See body of main program for 'e'.  */
     6038             char f[(_Bool) 0.0 == false ? 1 : -1];
     6039             char g[true];
     6040             char h[sizeof (_Bool)];
     6041             char i[sizeof s.t];
     6042             enum { j = false, k = true, l = false * true, m = true * 256 };
     6043             /* The following fails for
     6044                HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
     6045             _Bool n[m];
     6046             char o[sizeof n == m * sizeof n[0] ? 1 : -1];
     6047             char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
     6048             /* Catch a bug in an HP-UX C compiler.  See
     6049                http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
     6050                http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
     6051              */
     6052             _Bool q = true;
     6053             _Bool *pq = &q;
    60256054
    60266055int
     
    60286057{
    60296058
    6030         bool e = &s;
    6031         *pq |= q;
    6032         *pq |= ! q;
    6033         /* Refer to every declared value, to avoid compiler optimizations.  */
    6034         return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
    6035                 + !m + !n + !o + !p + !q + !pq);
     6059             bool e = &s;
     6060             *pq |= q;
     6061             *pq |= ! q;
     6062             /* Refer to every declared value, to avoid compiler optimizations.  */
     6063             return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
     6064                     + !m + !n + !o + !p + !q + !pq);
    60366065
    60376066  ;
     
    60486077{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
    60496078$as_echo "$ac_cv_header_stdbool_h" >&6; }
    6050 ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
     6079   ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
    60516080if test "x$ac_cv_type__Bool" = xyes; then :
    60526081
     
    60576086
    60586087fi
     6088
    60596089
    60606090if test $ac_cv_header_stdbool_h = yes; then
     
    62516281
    62526282
    6253 ac_config_files="$ac_config_files Makefile src/driver/Makefile src/Makefile src/benchmark/Makefile src/examples/Makefile src/tests/Makefile src/tests/preempt_longrun/Makefile src/prelude/Makefile src/libcfa/Makefile"
     6283ac_config_files="$ac_config_files Makefile src/driver/Makefile src/Makefile src/benchmark/Makefile src/examples/Makefile src/tests/Makefile src/tests/preempt_longrun/Makefile src/prelude/Makefile src/libcfa/Makefile tools/prettyprinter/Makefile"
    62546284
    62556285
     
    63636393
    63646394
     6395{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
     6396$as_echo_n "checking that generated files are newer than configure... " >&6; }
     6397   if test -n "$am_sleep_pid"; then
     6398     # Hide warnings about reused PIDs.
     6399     wait $am_sleep_pid 2>/dev/null
     6400   fi
     6401   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
     6402$as_echo "done" >&6; }
    63656403 if test -n "$EXEEXT"; then
    63666404  am__EXEEXT_TRUE=
     
    67056743    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
    67066744    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
    6707     # In both cases, we have to default to `cp -p'.
     6745    # In both cases, we have to default to `cp -pR'.
    67086746    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
    6709       as_ln_s='cp -p'
     6747      as_ln_s='cp -pR'
    67106748  elif ln conf$$.file conf$$ 2>/dev/null; then
    67116749    as_ln_s=ln
    67126750  else
    6713     as_ln_s='cp -p'
     6751    as_ln_s='cp -pR'
    67146752  fi
    67156753else
    6716   as_ln_s='cp -p'
     6754  as_ln_s='cp -pR'
    67176755fi
    67186756rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
     
    67746812fi
    67756813
    6776 if test -x / >/dev/null 2>&1; then
    6777   as_test_x='test -x'
    6778 else
    6779   if ls -dL / >/dev/null 2>&1; then
    6780     as_ls_L_option=L
    6781   else
    6782     as_ls_L_option=
    6783   fi
    6784   as_test_x='
    6785     eval sh -c '\''
    6786       if test -d "$1"; then
    6787         test -d "$1/.";
    6788       else
    6789         case $1 in #(
    6790         -*)set "./$1";;
    6791         esac;
    6792         case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
    6793         ???[sx]*):;;*)false;;esac;fi
    6794     '\'' sh
    6795   '
    6796 fi
    6797 as_executable_p=$as_test_x
     6814
     6815# as_fn_executable_p FILE
     6816# -----------------------
     6817# Test if FILE is an executable regular file.
     6818as_fn_executable_p ()
     6819{
     6820  test -f "$1" && test -x "$1"
     6821} # as_fn_executable_p
     6822as_test_x='test -x'
     6823as_executable_p=as_fn_executable_p
    67986824
    67996825# Sed expression to map a string onto a valid CPP name.
     
    68176843ac_log="
    68186844This file was extended by cfa-cc $as_me 1.0.0.0, which was
    6819 generated by GNU Autoconf 2.68.  Invocation command line was
     6845generated by GNU Autoconf 2.69.  Invocation command line was
    68206846
    68216847  CONFIG_FILES    = $CONFIG_FILES
     
    68836909ac_cs_version="\\
    68846910cfa-cc config.status 1.0.0.0
    6885 configured by $0, generated by GNU Autoconf 2.68,
     6911configured by $0, generated by GNU Autoconf 2.69,
    68866912  with options \\"\$ac_cs_config\\"
    68876913
    6888 Copyright (C) 2010 Free Software Foundation, Inc.
     6914Copyright (C) 2012 Free Software Foundation, Inc.
    68896915This config.status script is free software; the Free Software Foundation
    68906916gives unlimited permission to copy, distribute and modify it."
     
    69777003cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
    69787004if \$ac_cs_recheck; then
    6979   set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
     7005  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
    69807006  shift
    69817007  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
     
    70227048    "src/prelude/Makefile") CONFIG_FILES="$CONFIG_FILES src/prelude/Makefile" ;;
    70237049    "src/libcfa/Makefile") CONFIG_FILES="$CONFIG_FILES src/libcfa/Makefile" ;;
     7050    "tools/prettyprinter/Makefile") CONFIG_FILES="$CONFIG_FILES tools/prettyprinter/Makefile" ;;
    70247051
    70257052  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
     
    76187645  case $ac_file$ac_mode in
    76197646    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
    7620   # Autoconf 2.62 quotes --file arguments for eval, but not when files
     7647  # Older Autoconf quotes --file arguments for eval, but not when files
    76217648  # are listed without --file.  Let's play safe and only enable the eval
    76227649  # if we detect the quoting.
     
    76317658    mf=`echo "$mf" | sed -e 's/:.*$//'`
    76327659    # Check whether this is an Automake generated Makefile or not.
    7633     # We used to match only the files named `Makefile.in', but
     7660    # We used to match only the files named 'Makefile.in', but
    76347661    # some people rename them; so instead we look at the file content.
    76357662    # Grep'ing the first line is not enough: some people post-process
     
    76657692    fi
    76667693    # Extract the definition of DEPDIR, am__include, and am__quote
    7667     # from the Makefile without running `make'.
     7694    # from the Makefile without running 'make'.
    76687695    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
    76697696    test -z "$DEPDIR" && continue
    76707697    am__include=`sed -n 's/^am__include = //p' < "$mf"`
    7671     test -z "am__include" && continue
     7698    test -z "$am__include" && continue
    76727699    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
    7673     # When using ansi2knr, U may be empty or an underscore; expand it
    7674     U=`sed -n 's/^U = //p' < "$mf"`
    76757700    # Find all dependency output files, they are included files with
    76767701    # $(DEPDIR) in their names.  We invoke sed twice because it is the
     
    76797704    for file in `sed -n "
    76807705      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
    7681          sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
     7706         sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
    76827707      # Make sure the directory exists.
    76837708      test -f "$dirpart/$file" && continue
  • configure.ac

    rfea3faa rb826e6b  
    99AM_SILENT_RULES([no])
    1010
    11 AM_INIT_AUTOMAKE
     11AM_INIT_AUTOMAKE([subdir-objects])
    1212AM_MAINTAINER_MODE(enable)                      # may require auto* software to be installed
    1313
     
    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
     
    238238        src/prelude/Makefile
    239239        src/libcfa/Makefile
     240        tools/prettyprinter/Makefile
    240241        ])
    241242
  • doc/LaTeXmacros/common.tex

    rfea3faa rb826e6b  
    1111%% Created On       : Sat Apr  9 10:06:17 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Sun Jun 18 20:32:32 2017
    14 %% Update Count     : 319
     13%% Last Modified On : Mon Jul 17 10:21:17 2017
     14%% Update Count     : 348
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    3636% Names used in the document.
    3737
    38 \newcommand{\CFAIcon}{\textrm{C}\raisebox{\depth}{\rotatebox{180}{\textsf{A}}}\xspace} % Cforall symbolic name
     38\newcommand{\CFAIcon}{\textsf{C}\raisebox{\depth}{\rotatebox{180}{\textsf{A}}}\xspace} % Cforall symbolic name
    3939\newcommand{\CFA}{\protect\CFAIcon} % safe for section/caption
    4040\newcommand{\CFL}{\textrm{Cforall}\xspace} % Cforall symbolic name
     
    5555\setlength{\parindentlnth}{\parindent}
    5656
     57\newcommand{\LstKeywordStyle}[1]{{\lst@basicstyle{\lst@keywordstyle{#1}}}}
     58\newcommand{\LstCommentStyle}[1]{{\lst@basicstyle{\lst@commentstyle{#1}}}}
     59
    5760\newlength{\gcolumnposn}                                % temporary hack because lstlisting does not handle tabs correctly
    5861\newlength{\columnposn}
    5962\setlength{\gcolumnposn}{2.5in}
    6063\setlength{\columnposn}{\gcolumnposn}
    61 \newcommand{\C}[2][\@empty]{\ifx#1\@empty\else\global\setlength{\columnposn}{#1}\global\columnposn=\columnposn\fi\hfill\makebox[\textwidth-\columnposn][l]{\lst@commentstyle{#2}}}
     64\newcommand{\C}[2][\@empty]{\ifx#1\@empty\else\global\setlength{\columnposn}{#1}\global\columnposn=\columnposn\fi\hfill\makebox[\textwidth-\columnposn][l]{\lst@basicstyle{\LstCommentStyle{#2}}}}
    6265\newcommand{\CRT}{\global\columnposn=\gcolumnposn}
    6366
     
    131134
    132135% inline text and code index (cannot use ©)
    133 \newcommand{\Indexc}[1]{\lstinline$#1$\index{#1@\lstinline$#1$}}
     136\newcommand{\Indexc}[2][\@empty]{\lstinline[#1]$#2$\index{#2@\lstinline[#1]$#2$}}
    134137% code index (cannot use ©)
    135 \newcommand{\indexc}[1]{\index{#1@\lstinline$#1$}}
     138\newcommand{\indexc}[2][\@empty]{\index{#2@\lstinline[#1]$#2$}}
    136139
    137140% Denote newterms in particular font and index them without particular font and in lowercase, e.g., \newterm{abc}.
     
    231234basicstyle=\linespread{0.9}\sf,                                                 % reduce line spacing and use sanserif font
    232235stringstyle=\tt,                                                                                % use typewriter font
    233 tabsize=4,                                                                                              % 4 space tabbing
     236tabsize=6,                                                                                              % N space tabbing
    234237xleftmargin=\parindentlnth,                                                             % indent code to paragraph indentation
    235238extendedchars=true,                                                                             % allow ASCII characters in the range 128-255
  • doc/LaTeXmacros/lstlang.sty

    rfea3faa rb826e6b  
    88%% Created On       : Sat May 13 16:34:42 2017
    99%% Last Modified By : Peter A. Buhr
    10 %% Last Modified On : Fri May 26 12:47:09 2017
    11 %% Update Count     : 8
     10%% Last Modified On : Wed Jul 12 22:42:09 2017
     11%% Update Count     : 12
    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__, zero_t},
     114                __typeof__, with, zero_t},
    115115        morekeywords=[2]{
    116116                _Atomic, coroutine, is_coroutine, is_monitor, is_thread, monitor, mutex, nomutex,
    117117                resume, suspend, thread, _Thread_local, yield},
     118        moredirectives={defined,include_next}%
    118119}
     120
     121% C++ programming language
     122\lstdefinelanguage{C++}[ANSI]{C++}{}
    119123
    120124% uC++ programming language, based on ANSI C++
  • doc/bibliography/cfa.bib

    rfea3faa rb826e6b  
    22732273@manual{JavaScript,
    22742274    keywords    = {JavaScript},
    2275     contributer = {pabuhr},
     2275    contributer = {pabuhr@plg},
    22762276    title       = {ECMAScript 2015 Language Specification {JavaScript}},
    22772277    organization= {ECAM International},
     
    24462446@manual{Erlang,
    24472447    keywords    = {Erlang},
    2448     contributer = {pabuhr},
     2448    contributer = {pabuhr@plg},
    24492449    title       = {Erlang Reference Manual User's Guide, Vertion 7.0},
    24502450    organization= {Erlang/OTP System Documentation},
     
    27712771    publisher   = {ACM},
    27722772    address     = {New York, NY, USA},
     2773}
     2774
     2775@article{Yang95,
     2776    keywords    = {software solutions, N-thread, mutual exclusions},
     2777    contributer = {pabuhr@plg},
     2778    author      = {Jae-Heon Yang and James H. Anderson},
     2779    title       = {A Fast, Scalable Mutual Exclusion Algorithm},
     2780    journal     = {Distributed Computing},
     2781    publisher   = {Springer-Verlag},
     2782    volume      = {9},
     2783    number      = {1},
     2784    year        = {1995},
     2785    pages       = {51-60},
    27732786}
    27742787
     
    50525065    contributer = {pabuhr@plg},
    50535066    author      = {Kathleen Jensen and Niklaus Wirth},
    5054     title       = {{P}ascal User Manual and Report},
     5067    title       = {{P}ascal User Manual and Report, ISO Pascal Standard},
    50555068    publisher   = {Springer--Verlag},
    5056     year        = 1985,
    5057     edition     = {3rd},
    5058     note        = {Revised by Andrew B. Mickel and James F. Miner, ISO Pascal Standard}
     5069    year        = 1991,
     5070    edition     = {4th},
     5071    note        = {Revised by Andrew B. Mickel and James F. Miner}
    50595072}
    50605073
  • doc/generic_types/mail

    rfea3faa rb826e6b  
    7878
    7979- OOPSLA'17 Submissions
     80
     81
     82
     83From: "OOPSLA'17 HotCRP" <noreply@oopsla17.hotcrp.com>
     84Subject: [OOPSLA'17] Paper #20 "Generic and Tuple Types with Efficient..."
     85To: Peter Buhr <pabuhr@uwaterloo.ca>
     86Cc: jonathan.aldrich@cs.cmu.edu
     87Reply-To: jonathan.aldrich@cs.cmu.edu
     88Date: Wed,  7 Jun 2017 13:33:40 +0000 (UTC)
     89
     90Dear Peter Buhr,
     91
     92The author response period for OOPSLA has started, and will continue until
     93the end of June 10th (Anywhere on Earth).  No email with a snapshot of your
     94reviews will be sent: you can see the live version of reviews (including
     95current updates) on the HotCRP system (links at the bottom).
     96
     97An author response should aim to:
     98 -correct reviewers' mistakes or misunderstandings
     99 -offer new information only when this addresses reviewers' concerns (e.g.,
     100"I wonder if A might work better...";  "we tried that, but...")
     101 -answer explicit questions by the reviewers. The key questions will be in a
     102designated "Questions for Author Response" entry of a review.
     103
     104Please keep in mind that an author response is *not* a "rebuttal". You are
     105not rebutting an opponent's arguments with your own, in front of an
     106audience that weighs both sets of arguments. Instead, your audience is the
     107same reviewers who offered the comments in the first place, and their
     108subjective weighing of different factors is very unlikely to change.
     109
     110During author response, please keep in mind that the reviewers are still
     111unaware of author identity. If you need to refer to author-identifying
     112information during your response, the ideal course of action is to place it
     113at an external location and include a URL, with an explicit warning (e.g.,
     114"WARNING: following this link will reveal author identity").
     115
     116As with all external resources, your response should be self-contained,
     117without consulting them. That is, the author-visible external URL is just
     118evidence, but the claim that this evidence supports should be clear in the
     119response text. For instance:
     120"we have received public feedback from the developers of X that confirm the
     121issue [supporting URL] (WARNING: following this link will reveal author
     122identity)"
     123
     124Your paper's access information is below:
     125
     126       Title: Generic and Tuple Types with Efficient Dynamic Layout in C∀
     127  Paper site: https://oopsla17.hotcrp.com/paper/20
     128
     129Use the link below to sign in to the site.
     130
     131https://oopsla17.hotcrp.com/?email=pabuhr%40uwaterloo.ca
     132
     133Please contact me <jonathan.aldrich@cs.cmu.edu> with any questions or
     134concerns.
     135
     136Best Regards and wishes for a constructive response,
     137
     138Jonathan Aldrich
     139
     140
     141
     142From: "OOPSLA'17 HotCRP" <noreply@oopsla17.hotcrp.com>
     143Subject: [OOPSLA'17] Paper #20 "Generic and Tuple Types with Efficient..."
     144To: Peter Buhr <pabuhr@uwaterloo.ca>
     145Cc: jonathan.aldrich@cs.cmu.edu
     146Reply-To: jonathan.aldrich@cs.cmu.edu
     147Date: Tue, 20 Jun 2017 00:33:10 +0000 (UTC)
     148
     149Dear Peter Buhr,
     150
     151I regret to inform you that your submission to OOPSLA'17 listed below has not
     152been selected for the second phase of the review process. I understand this is
     153not welcome news but selection was very competitive: 157 of the 223 papers
     154submitted did not advance to the second phase. For several of these, there was
     155a clear impression that in the future they can evolve into some of the
     156strongest results of our community.
     157
     158       Title: Generic and Tuple Types with Efficient Dynamic Layout in C∀
     159  Paper site: https://oopsla17.hotcrp.com/paper/20
     160  Login link: https://oopsla17.hotcrp.com/?email=pabuhr%40uwaterloo.ca
     161
     162Below you will find reviews, as well as author-visible comments--the latter may
     163include further communication. I hope you will find the reviewers' feedback
     164useful.
     165
     166Best Regards,
     167
     168- Jonathan Aldrich <jonathan.aldrich@cs.cmu.edu>, for OOPSLA 2017
     169Submissions
     170
     171
     172
     173===========================================================================
     174                           OOPSLA'17 Review #20A
     175---------------------------------------------------------------------------
     176 Paper #20: Generic and Tuple Types with Efficient Dynamic Layout in C∀
     177---------------------------------------------------------------------------
     178
     179                      Overall merit: C. Weak paper, though I will not fight
     180                                        strongly against it
     181                         Confidence: X. I am an expert in this area
     182
     183                         ===== Paper summary =====
     184
     185This presents an extension of the C programming language that tries to preserve the character of the existing language, while adding tuples and generics. Unlike C++ templates, generics preserve separate compilation. Types are represented at runtime, if needed, by size and alignment values, along with pointers to the code for any needed operators. A microbenchmark performance comparison is provided.
     186
     187                      ===== Comments for author =====
     188
     189This is an interesting extension to C, that may be of interest to some C programmers. It generally seems to be fairly well engineered, and mostly respects C's design goals.
     190
     191Unfortunately, there have been enough proposals for extended C dialects that this sort of design is tough to sell. And I don't think the evaluation really went far enough to make that case.
     192
     193The ideas in the paper don't appear to be fundamentally new. The idea of passing types as runtime objects has certainly been explored before. An additional ancient reference is http://dl.acm.org/citation.cfm?doid=13310.13330.
     194
     195There seems to be a new idea of minimally describing types using alignment and size attributes instead of (?) pointers to assignment operators and the like. But this scheme is not very well described. Notably, it is not clear how, say, a struct with atomic field or bit-fields would be described.
     196
     197I wasn't quite clear on the extent to which operator overloading is supported. The MAX example appears to me like it would be quite controversial among C programmers.
     198
     199It is not obvious that type inference here always converges. An outline of the algorithm would be useful.
     200
     201Above all, this needs experience results from a more complete implementation.
     202
     203Details:
     204
     205Relying on TIOBE here seems a bit dubious. Since it counts web pages, and C isn't exactly new and hot, it may actually understate your case.
     206
     207The print example seems a little simplistic, since it's not clear how it handles formatting.
     208
     209"does not using the return type"
     210
     211              ===== Questions for authors’ response =====
     212
     213How are atomics, volatile, and bit-fields in structs handled?
     214
     215===========================================================================
     216                           OOPSLA'17 Review #20B
     217---------------------------------------------------------------------------
     218 Paper #20: Generic and Tuple Types with Efficient Dynamic Layout in C∀
     219---------------------------------------------------------------------------
     220
     221                      Overall merit: D. Reject
     222                         Confidence: X. I am an expert in this area
     223
     224                         ===== Paper summary =====
     225
     226The authors present an extension to C, adding universal polymorphism and tuples. These features are described in prose. There is an implementation, though this is not described in depth in the paper. There is a benchmark evaluation.
     227
     228                      ===== Comments for author =====
     229
     230The paper is well-written and the concepts explained well. It is nice to see work in the low-level/C space - I believe that it is an area that has not been well-served by the OOPSLA community. My concerns with the paper are that the contribution is rather small and the concepts are not well-evaluated; specifically this is a language design paper and there is no attempt to evaluate the actual language design.
     231
     232While it is reasonable to describe only a couple of features in a paper, I would then expect a detailed description of the implementation and/or a formalism with proven safety properties and a thorough evaluation of the design. For a paper which only describes the design of a language the bar is higher than two features - for example, a description of a 'large' language such as D or Rust, even then I would expect a stronger evaluation.
     233
     234## On the design of C-forall
     235
     236There are some interesting points in the design of generics, notably the otype/dtype distinction. The design seems reasonable and follows what I would expect from other languages. The design for tuples is more unusual - the usual design of simple anonymous records with anonymous fields is extended with a mix of 'spread'ing, variadics, and implicit conversions. Importantly, the authors neither justify nor evaluate this departure - that is a severe omission for this paper. Furthermore, the only in-depth description of the implementation in the paper concerns tuples, and it seems to me that this is only interesting because of the unusual design - further reason for justifying it.
     237
     238## Evaluation
     239
     240The paper evaluates the implementation of C-forall with (effectively) a single micro-benchmark. That benchmark seems to show that C-forall performs worse than C++ on every measure, but this is not really discussed.
     241
     242A better performance evaluation would consist of multiple tests, both micro-benchmarks and realistic code and would test C-forall compared to alternatives (D, Rust, Go, etc.) not just C/C++.
     243
     244However, performance is not the really interesting thing to test here. The authors propose a new language and while performance is an important consideration for systems languages, it is far from the most important. I would like to see the usability of the language tested with user studies of different kinds (various levels of skill-level and coding scenarios). The authors could also use case studies or programming idioms to compare programming in C-forall vs the alternatives (again, comparing with D, Rust, etc. is more interesting to me than C).
     245
     246Finally, in designing C-forall, the authors make several assumptions about why C programmers use C. These should be backed up either with evaluation or citation. Statements in the paper certainly do not reflect my experience discussing language design with C programmers, and I would like to see them verified.
     247
     248
     249## Related work
     250
     251The related work section is broad and gives good descriptions of other languages. However, the comparisons between languages focus more on the high-level goals of the language. It would be more interesting to focus on the details of the languages - the comparisons between Cyclone, C++, Java, and C-forall generics are good, I would like to see more of this with D and Rust, which are the more modern alternatives to C-forall (for example, Rust's notion of Sized and ?Sized types seems similar to otypes/dtypes).
     252
     253The related work is really missing any discussion of why the C-forall design choices are better than other languages. To clarify, I mean the specific design of generics and tuples, c.f., the suitability of the language in general because of garbage collection or learning difficulties.
     254
     255===========================================================================
     256                           OOPSLA'17 Review #20C
     257---------------------------------------------------------------------------
     258 Paper #20: Generic and Tuple Types with Efficient Dynamic Layout in C∀
     259---------------------------------------------------------------------------
     260
     261                      Overall merit: D. Reject
     262                         Confidence: Z. I am not an expert; my evaluation
     263                                        is that of an informed outsider
     264
     265                         ===== Paper summary =====
     266
     267The paper presents two language features of "Cforall": generics and tuples.
     268
     269                      ===== Comments for author =====
     270
     271The authors really need to talk about C++ as early as possible IMHO. That's the first thing that came to mind when reading the abstract: how is this different from C++?
     272
     273Comparison with C++:
     274The main difference with C++ seems to be that Cforall favors separate compilation at the expense of runtime overhead while C++ systematically avoids any runtime overhead (at the expense of slow compilation times). C++ approach makes more sense IMHO. While it's true that people where using C for almost everything 30 years ago, that is just not true anymore. Most people writing C today are doing system programming, otherwise there would be using a higher level programming language (C#, Java etc ...).
     275Now, when doing system programming, one needs very fine grain control over the resources: memory layout, etc ...
     276It is pretty clear to me that the people writing that kind of code will favor generics that do not cost any overhead at runtime, otherwise they would be writing Java in the first place.
     277The authors need to better justify the runtime overhead, or give escape hatches for those who don't want to pay that cost at runtime.
     278They very often go back to the benefit of separate compilation, but that's not enough IMHO. Here is a proposal: why not have 2 modes, one called debug mode, used while developing the code, that would compile generics with a runtime overhead. Another, called production, that would unfold the world like C++ does?
     279
     280About Tuples:
     281The section about tuples is too long. I would have spent more time explaining generics.
     282
     283Feedback:
     284"This installation base"
     285Unclear what you mean by that.
     286
     287"Prior projects ... but failed ..."
     288Hummm ... What about C++.
     289
     290"... object-oriented or functional programming with garbage collection ..."
     291You are really mixing apples and oranges here. Many C programmers have nothing agains object-oriented features, not even functional programming (C++ 11 adds
     292a bunch of features proving my point), but it's clear that most of them feel very strongly against automated garbage collection.
     293
     294"In many cases, C++ is often ..."
     295This sentence feels like it is coming out of nowhere.
     296
     297"... the polymorphic runtime-cost ..."
     298Is there any way to avoid that overhead? It's true it will make the compiler faster, but there are cases where the user might not want to pay for
     299the overhead at runtime. Is there a way to force the compiler to specialize the code?
     300
     301"... to write a type-safe Cforall wrapper malloc based ..."
     302That cannot be true in general. Malloc produces a pointer (of any type), given an integer (the size).
     303It looks like Cforall is assuming that the integer is the result of a call to sizeof (a good practice in C).
     304However, if that's the case, it should be explained.
     305
     306"... allows variable overloading ..."
     307How are conflict resolved? In other words, what happens when two variables could be used?
     308
     309"... reuses the generated structure declarations where appropriate."
     310This is too vague.
     311
     312"... have multiple outcomes, some exceptional."
     313Humm, I would say these two things are distinct. Let's just way that this way of presenting things is strange, I woulds ay that a function can either
     314return one or multiple values or throw an exception. Not that some of the values returned are "exceptional".
     315
     316"The type-resolver ..."
     317What's that? Type-checker? Type-inference?
     318
     319"... applies C conversions."
     320Noooo! That's exactly what leads to very subtle bugs. Is there any way to stop those conversions from happening?
     321
     322"The minimal cost ..."
     323In what regard? Runtime cost? How does the "resolver" know how expensive the conversions are?
     324
     325"z = 10 // mass assignments"
     326That stuff is completely unreadable. Why not introduce a new operator?
     327
     328"... roughly equivalent time ..."
     329Well, C++ looks faster to me.
     330
     331"... is restricted because the resolution does not using ..."
     332Did you mean, does not use?
     333
     334"... D and go are garbage collected ..."
     335Yes, but in D, the use of the GC is optional.
     336
     337"... while respecting the talent and skill of C programmers."
     338Are you implying that other approaches are not?
     339
     340"On the surface, the project may appear as a rehash of similar mechanisms in C++."
     341Absolutely.
     342
     343"... integration with C and its programmers ..."
     344Bold claim. What makes you think you are integrated with programmers? Number of users?
     345
     346"... inline annotation at polymorphic function call sites to create a template-specialization ..."
     347This should have been mentioned sooner. Plus conflating inlining and specialization is unfortunate.
     348Does "inline" also inline the function? Or does it only specialize the code?
     349If it also inline, that's a very unfortunate design. I might want to specialize the code, but without inlining ...
     350How do I specialize a recursive function?
  • doc/proposals/references.md

    rfea3faa rb826e6b  
    1717derived rvalue types such as pointer types may include qualifiers;
    1818`const int *` is a distinct type from `int *`, though the latter is safely
    19 convertable to the former.
     19convertible to the former.
    2020In general, any number of qualifiers can be safely added to the
    2121pointed-to-type of a pointer type, e.g. `int *` converts safely to
     
    2323`const volatile int *`.
    2424
    25 Since lvalues are precicely "addressable objects", in C, only lvalues can be
     25Since lvalues are precisely "addressable objects", in C, only lvalues can be
    2626used as the operand of the `&` address-of operator.
    2727Similarly, only modifiable lvalues may be used as the assigned-to
     
    147147call "lvalue of type `T`" as `T&`.
    148148There's also an obvious argument that lvalues of a (possibly-qualified) type
    149 `T` should be convertable to references of type `T`, where `T` is also
     149`T` should be convertible to references of type `T`, where `T` is also
    150150so-qualified (e.g. lvalue `int` to `int&`, lvalue `const char` to
    151151`const char&`).
    152152By similar arguments to pointer types, qualifiers should be addable to the
    153153referred-to type of a reference (e.g. `int&` to `const int&`).
    154 As a note, since pointer arithmetic is explictly not defined on `T&`,
     154As a note, since pointer arithmetic is explicitly not defined on `T&`,
    155155`restrict T&` should be allowable and would have alias-analysis rules that
    156156are actually comprehensible to mere mortals.
  • doc/proposals/tagged-struct.txt

    rfea3faa rb826e6b  
    7171should be possible to do during linking.
    7272
     73If a generic/polymorphic type is tagged its tagged would then be shared
     74between all applications of that generic. Internal tags could be used to
     75seperate these structures again, however it seems in most cases simply using
     76the existing type parameters should provide the needed information.
     77
    7378
    7479Traits:
     
    102107To allow for growth each option would have to be a structure itself.
    103108
    104 Which brings us to "tagget struct union", ie. a union of tagged structures
     109Which brings us to "tagged struct union", ie. a union of tagged structures
    105110as opposed to tagging the union itself. This extention acts as a constraint.
    106111If unions are declared tagged instead of creating a new tagged type, all
    107 possible values of the union must be of that tagged type or a child type.
     112possible values of the union must be of that tagged type or a child type. If
     113the tagged type is omitted then they must all be tagged but of any tagged
     114type.
     115
     116As a short cut union_instance->type might get the type object of the loaded
     117value. It should always be the same operation regardless so it saves
     118abritarly picking a branch of the union to get the type object.
    108119
    109120
    110 Custom Type Objects (Extention):
     121Type Objects Fields (Extention):
    111122
    112 Some method to define type objects used within a tree of types. One option is
    113 to allow the tree's type object to be specified by the tree root. It would
    114 then have to be filled in for each type in the tree, including the root.
     123Adding fields to the type object allows data to be shared between instances
     124of the same type. Such behaviour could be mimiced by creating a lookup
     125function on the type object pointer, but this may be cleaner and more
     126efficient.
    115127
    116 The only required field is the parent field, a pointer to the type object's
    117 type. (This is also the only required field on the tagged structure itself.)
     128The type object fields follow similar rules to the fields on the tagged
     129objects themselves, they must be additive. So any fields present on a
     130type object will be present (and in the same place) on all of its children.
    118131
    119 A further extention could allow expanding type objects, so child types could
    120 append fields to their parent's feild list. They might need their own type
    121 objects at that point, or maybe static checks will be enough to see the
    122 minimum field list.
     132This does mean that many type object structure types will have to be auto
     133generated, and traversing up the tree might get a little wierd. That could
     134be symplified by only allowing the root type to specify fields on the type
     135object, so that the type object is consistant throughout that particular tree.
     136And hence the type_object pointers would also be consistant as the type they
     137point to would never change.
     138
     139struct Example tagged {
     140        tagged char const * const type_name = "Example";
     141        int data;
     142};
     143
     144Creates a tagged structure that has no parent, stores an integer and the type
     145object also has an extra field that stores a string on the type object.
     146This can be accessed by using member access on the type object, as a regular
     147structure.
     148
     149Type object fields will have to allow initialization on their declaration,
     150and declarations of children as well, as they are not assotiated with the
     151later instances of the tagged structure.
     152
     153        ...
     154        tagged void (*dtor)(tagged Example * this);
     155        ...
     156
     157Sub-Extention, not sure how it would work but some way to have a "dynamic"
     158field that is considered the type of the current tagged struct might be useful
     159for things like specifying a deconstructor. In this case, the following code
     160will clean up any child type of Example:
     161
     162Example * ex = get_some_example();
     163ex->type->dtor(ex);
  • doc/user/Makefile

    rfea3faa rb826e6b  
    11## Define the appropriate configuration variables.
    22
    3 TeXLIB = .:../LaTeXmacros:../LaTeXmacros/listings:../LaTeXmacros/enumitem:../bibliography/:
     3TeXLIB = .:../LaTeXmacros:../bibliography/:
    44LaTeX  = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error
    55BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex
     
    1212
    1313FIGURES = ${addsuffix .tex, \
     14EHMHierarchy \
    1415Cdecl \
    1516pointer1 \
  • doc/user/user.tex

    rfea3faa rb826e6b  
    1111%% Created On       : Wed Apr  6 14:53:29 2016
    1212%% Last Modified By : Peter A. Buhr
    13 %% Last Modified On : Fri Jun 16 12:00:01 2017
    14 %% Update Count     : 2433
     13%% Last Modified On : Mon Jul 17 13:06:40 2017
     14%% Update Count     : 2825
    1515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    1616
     
    2525\usepackage{textcomp}
    2626\usepackage[latin1]{inputenc}
    27 % Default underscore is too low and wide. Cannot use lstlisting "literate" as replacing underscore
    28 % removes it as a variable-name character so keyworks in variables are highlighted
    29 \DeclareTextCommandDefault{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}
    30 
    3127
    3228\usepackage{fullpage,times,comment}
     
    4844\renewcommand{\UrlFont}{\small\sf}
    4945
     46% Default underscore is too low and wide. Cannot use lstlisting "literate" as replacing underscore
     47% removes it as a variable-name character so keywords in variables are highlighted. MUST APPEAR
     48% AFTER HYPERREF.
     49\renewcommand{\_}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}}
     50\renewcommand{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}}
     51
    5052\setlength{\topmargin}{-0.45in}                                                 % move running title into header
    5153\setlength{\headsep}{0.25in}
     
    5456
    5557\CFAStyle                                                                                               % use default CFA format-style
     58
     59\lstnewenvironment{C++}[1][]
     60{\lstset{language=C++,moredelim=**[is][\protect\color{red}]{®}{®}#1}}
     61{}
    5662
    5763% inline code ©...© (copyright symbol) emacs: C-q M-)
     
    110116\renewcommand{\subsectionmark}[1]{\markboth{\thesubsection\quad #1}{\thesubsection\quad #1}}
    111117\pagenumbering{roman}
    112 %\linenumbers                                            % comment out to turn off line numbering
     118\linenumbers                                            % comment out to turn off line numbering
    113119
    114120\maketitle
     
    135141
    136142\CFA{}\index{cforall@\CFA}\footnote{Pronounced ``\Index*{C-for-all}'', and written \CFA, CFA, or \CFL.} is a modern general-purpose programming-language, designed as an evolutionary step forward for the C programming language.
    137 The syntax of the \CFA language builds from C, and should look immediately familiar to C/\Index*[C++]{\CC{}} programmers.
     143The syntax of \CFA builds from C and should look immediately familiar to C/\Index*[C++]{\CC{}} programmers.
    138144% Any language feature that is not described here can be assumed to be using the standard \Celeven syntax.
    139 \CFA adds many modern programming-language features that directly lead to increased \emph{\Index{safety}} and \emph{\Index{productivity}}, while maintaining interoperability with existing C programs and achieving C performance.
    140 Like C, \CFA is a statically typed, procedural language with a low-overhead runtime, meaning there is no global \Index{garbage-collection}, but \Index{regional garbage-collection}\index{garbage-collection!regional} is possible.
     145\CFA adds many modern programming-language features that directly lead to increased \emph{\Index{safety}} and \emph{\Index{productivity}}, while maintaining interoperability with existing C programs and achieving similar performance.
     146Like C, \CFA is a statically typed, procedural (non-\Index{object-oriented}) language with a low-overhead runtime, meaning there is no global \Index{garbage-collection}, but \Index{regional garbage-collection}\index{garbage-collection!regional} is possible.
    141147The primary new features include parametric-polymorphic routines and types, exceptions, concurrency, and modules.
    142148
    143 One of the main design philosophies of \CFA is to ``describe not prescribe'', which means \CFA tries to provide a pathway from low-level C programming to high-level \CFA programming, but it does not force programmers to ``do the right thing''.
    144 Programmers can cautiously add \CFA extensions to their C programs in any order and at any time to incrementally move towards safer, higher-level programming features.
    145 A programmer is always free to reach back to C from \CFA for any reason, and in many cases, new \CFA features have a fallback to a C mechanism.
    146 There is no notion or requirement for rewriting a legacy C program in \CFA;
    147 instead, a programmer evolves an existing C program into \CFA by incrementally incorporating \CFA features.
    148 New programs can be written in \CFA using a combination of C and \CFA features.
    149 \Index*[C++]{\CC{}} had a similar goal 30 years ago, but currently has the disadvantages of multiple legacy design-choices that cannot be updated and active divergence of the language model from C, requiring significant effort and training to incrementally add \CC to a C-based project.
     149One of the main design philosophies of \CFA is to ``\Index{describe not prescribe}'', which means \CFA tries to provide a pathway from low-level C programming to high-level \CFA programming, but it does not force programmers to ``do the right thing''.
     150Programmers can cautiously add \CFA extensions to their C programs in any order and at any time to incrementally move towards safer, higher-level programming.
     151A programmer is always free to reach back to C from \CFA, for any reason, and in many cases, new \CFA features can be locally switched back to there C counterpart.
     152There is no notion or requirement for \emph{rewriting} a legacy C program in \CFA;
     153instead, a programmer evolves a legacy program into \CFA by incrementally incorporating \CFA features.
     154As well, new programs can be written in \CFA using a combination of C and \CFA features.
     155
     156\Index*[C++]{\CC{}} had a similar goal 30 years ago, allowing object-oriented programming to be incrementally added to C.
     157However, \CC currently has the disadvantages of a strong object-oriented bias, multiple legacy design-choices that cannot be updated, and active divergence of the language model from C, all of which requires significant effort and training to incrementally add \CC to a C-based project.
    150158In contrast, \CFA has 30 years of hindsight and a clean starting point.
    151159
     
    154162\begin{quote2}
    155163\begin{tabular}{@{}l@{\hspace{1.5em}}l@{\hspace{1.5em}}l@{}}
    156 \multicolumn{1}{c@{\hspace{1.5em}}}{\textbf{\CFA}}      & \multicolumn{1}{c}{\textbf{C}}        & \multicolumn{1}{c}{\textbf{\CC}}      \\
    157 \begin{cfa}
    158 #include <fstream>§\indexc{fstream}§
    159 
    160 int main( void ) {
    161         int x = 0, y = 1, z = 2;
    162         ®sout | x | y | z | endl;®
    163 }
    164 \end{cfa}
    165 &
    166 \begin{lstlisting}
     164\multicolumn{1}{c@{\hspace{1.5em}}}{\textbf{C}} & \multicolumn{1}{c}{\textbf{\CFA}}     & \multicolumn{1}{c}{\textbf{\CC}}      \\
     165\begin{cfa}
    167166#include <stdio.h>§\indexc{stdio.h}§
    168167
     
    171170        ®printf( "%d %d %d\n", x, y, z );®
    172171}
    173 \end{lstlisting}
     172\end{cfa}
    174173&
    175 \begin{lstlisting}
     174\begin{cfa}
     175#include <fstream>§\indexc{fstream}§
     176
     177int main( void ) {
     178        int x = 0, y = 1, z = 2;
     179        ®sout | x | y | z | endl;®§\indexc{sout}§
     180}
     181\end{cfa}
     182&
     183\begin{cfa}
    176184#include <iostream>§\indexc{iostream}§
    177185using namespace std;
     
    180188        ®cout<<x<<" "<<y<<" "<<z<<endl;®
    181189}
    182 \end{lstlisting}
     190\end{cfa}
    183191\end{tabular}
    184192\end{quote2}
    185193While the \CFA I/O looks similar to the \Index*[C++]{\CC{}} output style, there are important differences, such as automatic spacing between variables as in \Index*{Python} (see~\VRef{s:IOLibrary}).
    186194
     195\subsection{Background}
     196
    187197This document is a programmer reference-manual for the \CFA programming language.
    188198The manual covers the core features of the language and runtime-system, with simple examples illustrating syntax and semantics of each feature.
    189199The manual does not teach programming, i.e., how to combine the new constructs to build complex programs.
    190 A reader should already have an intermediate knowledge of control flow, data structures, and concurrency issues to understand the ideas presented as well as some experience programming in C/\CC.
    191 Implementers may refer to the \CFA Programming Language Specification for details about the language syntax and semantics.
     200A 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.
     201Implementers should refer to the \CFA Programming Language Specification for details about the language syntax and semantics.
    192202Changes to the syntax and additional features are expected to be included in later revisions.
    193203
     
    198208This installation base and the programmers producing it represent a massive software-engineering investment spanning decades and likely to continue for decades more.
    199209Even with all its problems, C continues to be popular because it allows writing software at virtually any level in a computer system without restriction.
    200 For system programming, where direct access to hardware and dealing with real-time issues is a requirement, C is usually the language of choice.
     210For system programming, where direct access to hardware, storage management, and real-time issues are a requirement, C is usually the only language of choice.
    201211The TIOBE index~\cite{TIOBE} for March 2016 showed the following programming-language popularity: \Index*{Java} 20.5\%, C 14.5\%, \Index*[C++]{\CC{}} 6.7\%, \Csharp 4.3\%, \Index*{Python} 4.3\%, where the next 50 languages are less than 3\% each with a long tail.
    202212As well, for 30 years, C has been the number 1 and 2 most popular programming language:
     
    214224\end{center}
    215225Hence, C is still an extremely important programming language, with double the usage of \Index*[C++]{\CC{}}; in many cases, \CC is often used solely as a better C.
    216 Love it or hate it, C has been an important and influential part of computer science for 40 years and sit appeal is not diminishing.
    217 Unfortunately, C has too many problems and omissions to make it an acceptable programming language for modern needs.
    218 
    219 As stated, the goal of the \CFA project is to engineer modern language features into C in an evolutionary rather than revolutionary way.
     226Love it or hate it, C has been an important and influential part of computer science for 40 years and its appeal is not diminishing.
     227Unfortunately, C has many problems and omissions that make it an unacceptable programming language for modern needs.
     228
     229As stated, the goal of the \CFA project is to engineer modern language-features into C in an evolutionary rather than revolutionary way.
    220230\CC~\cite{C++14,C++} is an example of a similar project;
    221 however, it largely extended the language, and did not address many existing problems.\footnote{%
     231however, it largely extended the C language, and did not address most of C's existing problems.\footnote{%
    222232Two important existing problems addressed were changing the type of character literals from ©int© to ©char© and enumerator from ©int© to the type of its enumerators.}
    223 \Index*{Fortran}~\cite{Fortran08}, \Index*{Ada}~\cite{Ada12}, and \Index*{Cobol}~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language features (\eg objects, concurrency) are added and problems fixed within the framework of the existing language.
     233\Index*{Fortran}~\cite{Fortran08}, \Index*{Ada}~\cite{Ada12}, and \Index*{Cobol}~\cite{Cobol14} are examples of programming languages that took an evolutionary approach, where modern language-features (\eg objects, concurrency) are added and problems fixed within the framework of the existing language.
    224234\Index*{Java}~\cite{Java8}, \Index*{Go}~\cite{Go}, \Index*{Rust}~\cite{Rust} and \Index*{D}~\cite{D} are examples of the revolutionary approach for modernizing C/\CC, resulting in a new language rather than an extension of the descendent.
    225 These languages have different syntax and semantics from C, and do not interoperate directly with C, largely because of garbage collection.
     235These languages have different syntax and semantics from C, do not interoperate directly with C, and are not systems languages because of restrictive memory-management or garbage collection.
    226236As a result, there is a significant learning curve to move to these languages, and C legacy-code must be rewritten.
    227 These costs can be prohibitive for many companies with a large software base in C/\CC, and a significant number of programmers requiring retraining to a new programming language.
    228 
    229 The result of this project is a language that is largely backwards compatible with \Index*[C11]{\Celeven{}}~\cite{C11}, but fixing some of the well known C problems and containing many modern language features.
     237These costs can be prohibitive for many companies with a large software-base in C/\CC, and a significant number of programmers require retraining to the new programming language.
     238
     239The result of this project is a language that is largely backwards compatible with \Index*[C11]{\Celeven{}}~\cite{C11}, but fixes many of the well known C problems while containing modern language-features.
    230240Without significant extension to the C programming language, it is becoming unable to cope with the needs of modern programming problems and programmers;
    231241as a result, it will fade into disuse.
    232242Considering the large body of existing C code and programmers, there is significant impetus to ensure C is transformed into a modern programming language.
    233 While \Index*[C11]{\Celeven{}} made a few simple extensions to the language, nothing was added to address existing problems in the language or to augment the language with modern language features.
    234 While some may argue that modern language features may make C complex and inefficient, it is clear a language without modern capabilities is insufficient for the advanced programming problems existing today.
     243While \Index*[C11]{\Celeven{}} made a few simple extensions to the language, nothing was added to address existing problems in the language or to augment the language with modern language-features.
     244While some may argue that modern language-features may make C complex and inefficient, it is clear a language without modern capabilities is insufficient for the advanced programming problems existing today.
    235245
    236246
    237247\section{History}
    238248
    239 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 extended assignment capabilities using the notion of tuples.
     249The \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.
    240250(See~\cite{Werther96} for similar work in \Index*[C++]{\CC{}}.)
    241 A first \CFA implementation of these extensions was by Esteves~\cite{Esteves04}.
    242 The signature feature of \CFA is parametric-polymorphic functions~\cite{forceone:impl,Cormack90,Duggan96} with functions generalized using a ©forall© clause (giving the language its name):
     251The first \CFA implementation of these extensions was by Esteves~\cite{Esteves04}.
     252
     253The 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):
    243254\begin{lstlisting}
    244255®forall( otype T )® T identity( T val ) { return val; }
     
    248259\CFA{}\hspace{1pt}'s polymorphism was originally formalized by Ditchfiled~\cite{Ditchfield92}, and first implemented by Bilson~\cite{Bilson03}.
    249260However, at that time, there was little interesting in extending C, so work did not continue.
    250 As the saying goes, ``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.
     261As 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.
    251262
    252263
     
    255266
    256267\CFA is designed to integrate directly with existing C programs and libraries.
    257 The most important feature of \Index{interoperability} is using the same \Index{calling convention}s, so there is no overhead to call existing C routines.
     268The most important feature of \Index{interoperability} is using the same \Index{calling convention}s, so there is no complex interface or overhead to call existing C routines.
    258269This feature allows \CFA programmers to take advantage of the existing panoply of C libraries to access thousands of external software features.
    259270Language developers often state that adequate \Index{library support} takes more work than designing and implementing the language itself.
    260271Fortunately, \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.
    261 Hence, \CFA begins by leveraging the large repository of C libraries with little cost.
     272Hence, \CFA begins by leveraging the large repository of C libraries at little cost.
    262273
    263274\begin{comment}
     
    302313\end{comment}
    303314
    304 However, it is necessary to differentiate between C and \CFA code because of name overloading, as for \CC.
     315However, it is necessary to differentiate between C and \CFA code because of name \Index{overload}ing, as for \CC.
    305316For example, the C math-library provides the following routines for computing the absolute value of the basic types: ©abs©, ©labs©, ©llabs©, ©fabs©, ©fabsf©, ©fabsl©, ©cabsf©, ©cabs©, and ©cabsl©.
    306 Whereas, \CFA wraps each of these routines into ones with the common name ©abs©:
     317Whereas, \CFA wraps each of these routines into ones with the overloaded name ©abs©:
    307318\begin{cfa}
    308319char abs( char );
     
    324335Hence, 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.
    325336There is no way around this problem, other than C's approach of creating unique names for each pairing of operation and type.
    326 This example strongly illustrates a core idea in \CFA: \emph{the power of a name}.
     337This example strongly illustrates a core idea in \CFA: \emph{the \Index{power of a name}}.
    327338The name ``©abs©'' evokes the notion of absolute value, and many mathematical types provide the notion of absolute value.
    328 Hence, knowing the name ©abs© should be sufficient to apply it to any type where it is applicable.
    329 The time savings and safety of using one name uniformly versus $N$ unique names should not be underestimated.
    330 
    331 
    332 \section[Compiling CFA Program]{Compiling \CFA Program}
     339Hence, knowing the name ©abs© is sufficient to apply it to any type where it is applicable.
     340The time savings and safety of using one name uniformly versus $N$ unique names cannot be underestimated.
     341
     342
     343\section[Compiling a CFA Program]{Compiling a \CFA Program}
    333344
    334345The command ©cfa© is used to compile \CFA program(s), and is based on the GNU \Indexc{gcc} command, \eg:
    335346\begin{cfa}
    336 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA§-files [ assembler/loader-files ]
     347cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA{}§-files [ assembler/loader-files ]
    337348\end{cfa}
    338349\CFA programs having the following ©gcc© flags turned on:
     
    342353The 1999 C standard plus GNU extensions.
    343354\item
    344 {\lstset{deletekeywords={inline}}
    345 \Indexc{-fgnu89-inline}\index{compilation option!-fgnu89-inline@{©-fgnu89-inline©}}
     355\Indexc[deletekeywords=inline]{-fgnu89-inline}\index{compilation option!-fgnu89-inline@{\lstinline[deletekeywords=inline]$-fgnu89-inline$}}
    346356Use the traditional GNU semantics for inline routines in C99 mode, which allows inline routines in header files.
    347 }%
    348357\end{description}
    349358The following new \CFA options are available:
     
    357366\Indexc{-debug}\index{compilation option!-debug@©-debug©}
    358367The program is linked with the debugging version of the runtime system.
    359 The debug version performs runtime checks to help during the debugging phase of a \CFA program, but substantially slows the execution of the program.
     368The debug version performs runtime checks to help during the debugging phase of a \CFA program, but can substantially slow program execution.
    360369The runtime checks should only be removed after the program is completely debugged.
    361370\textbf{This option is the default.}
     
    413422\end{description}
    414423These preprocessor variables allow conditional compilation of programs that must work differently in these situations.
    415 For example, to toggle between C and \CFA extensions, using the following:
     424For example, to toggle between C and \CFA extensions, use the following:
    416425\begin{cfa}
    417426#ifndef __CFORALL__
     
    424433
    425434
    426 \section{Constants Underscores}
    427 
    428 Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, \eg:
     435\section{Constant Underscores}
     436
     437Numeric constants are extended to allow \Index{underscore}s\index{constant!underscore}, \eg:
    429438\begin{cfa}
    4304392®_®147®_®483®_®648;                                    §\C{// decimal constant}§
     
    439448L®_®§"\texttt{\textbackslash{x}}§®_®§\texttt{ff}§®_®§\texttt{ee}"§;     §\C{// wide character constant}§
    440449\end{cfa}
    441 The rules for placement of underscores is as follows:
    442 \begin{enumerate}
     450The rules for placement of underscores are:
     451\begin{enumerate}[topsep=5pt,itemsep=5pt,parsep=0pt]
    443452\item
    444453A sequence of underscores is disallowed, \eg ©12__34© is invalid.
     
    461470\label{s:BackquoteIdentifiers}
    462471
    463 \CFA accommodates keyword clashes with existing C variable-names by syntactic transformations using the \CFA backquote escape-mechanism:
     472\CFA introduces in new keywords (see \VRef{s:CFAKeywords}) that can clash with existing C variable-names in legacy code.
     473Keyword clashes are accommodated by syntactic transformations using the \CFA backquote escape-mechanism:
    464474\begin{cfa}
    465475int ®`®otype®`® = 3;                    §\C{// make keyword an identifier}§
     
    467477\end{cfa}
    468478Existing 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.
    469 \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©:
     479\VRef[Figure]{f:HeaderFileInterposition} shows how clashes in C header files (see~\VRef{s:StandardHeaders}) can be handled using preprocessor \newterm{interposition}: ©#include_next© and ©-I filename©:
    470480
    471481\begin{figure}
     
    475485#define otype ®`®otype®`®               §\C{// make keyword an identifier}§
    476486#define __CFA_BFD_H__
    477 #endif // ! otype
    478 
    479 #include_next <bfd.h>                   §\C{// must have internal check for multiple expansion}§
    480 
     487#endif
     488
     489®#include_next <bfd.h>                  §\C{// must have internal check for multiple expansion}§
     490®
    481491#if defined( otype ) && defined( __CFA_BFD_H__ )        §\C{// reset only if set}§
    482492#undef otype
    483493#undef __CFA_BFD_H__
    484 #endif // otype && __CFA_BFD_H__
    485 \end{cfa}
    486 \caption{Interposition of Header File}
    487 \label{f:InterpositionHeaderFile}
     494#endif
     495\end{cfa}
     496\caption{Header-File Interposition}
     497\label{f:HeaderFileInterposition}
    488498\end{figure}
    489499
    490500
    491 \section{Declarations}
    492 \label{s:Declarations}
    493 
    494 C declaration syntax is notoriously confusing and error prone.
    495 For example, many C programmers are confused by a declaration as simple as:
    496 \begin{quote2}
    497 \begin{tabular}{@{}ll@{}}
    498 \begin{cfa}
    499 int * x[5]
    500 \end{cfa}
    501 &
    502 \raisebox{-0.75\totalheight}{\input{Cdecl}}
    503 \end{tabular}
    504 \end{quote2}
    505 Is this an array of 5 pointers to integers or a \Index{pointer} to an array of 5 integers?
    506 The fact this declaration is unclear to many C programmers means there are \Index{productivity} and \Index{safety} issues even for basic programs.
    507 Another example of confusion results from the fact that a routine name and its parameters are embedded within the return type, mimicking the way the return value is used at the routine's call site.
    508 For example, a routine returning a \Index{pointer} to an array of integers is defined and used in the following way:
    509 \begin{cfa}
    510 int ®(*®f®())[®5®]® {...};                              §\C{definition}§
    511  ... ®(*®f®())[®3®]® += 1;                              §\C{usage}§
    512 \end{cfa}
    513 Essentially, the return type is wrapped around the routine name in successive layers (like an \Index{onion}).
    514 While attempting to make the two contexts consistent is a laudable goal, it has not worked out in practice.
    515 
    516 \CFA provides its own type, variable and routine declarations, using a different syntax.
    517 The new declarations place qualifiers to the left of the base type, while C declarations place qualifiers to the right of the base type.
    518 In the following example, \R{red} is the base type and \B{blue} is qualifiers.
    519 The \CFA declarations move the qualifiers to the left of the base type, \ie move the blue to the left of the red, while the qualifiers have the same meaning but are ordered left to right to specify a variable's type.
    520 \begin{quote2}
    521 \begin{tabular}{@{}l@{\hspace{3em}}l@{}}
    522 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c}{\textbf{C}}        \\
    523 \begin{cfa}
    524 ß[5] *ß ®int® x1;
    525 ß* [5]ß ®int® x2;
    526 ß[* [5] int]ß f®( int p )®;
    527 \end{cfa}
    528 &
    529 \begin{cfa}
    530 ®int® ß*ß x1 ß[5]ß;
    531 ®int® ß(*ßx2ß)[5]ß;
    532 ßint (*ßf®( int p )®ß)[5]ß;
    533 \end{cfa}
    534 \end{tabular}
    535 \end{quote2}
    536 The only exception is \Index{bit field} specification, which always appear to the right of the base type.
    537 % Specifically, the character ©*© is used to indicate a pointer, square brackets ©[©\,©]© are used to represent an array or function return value, and parentheses ©()© are used to indicate a routine parameter.
    538 However, unlike C, \CFA type declaration tokens are distributed across all variables in the declaration list.
    539 For instance, variables ©x© and ©y© of type \Index{pointer} to integer are defined in \CFA as follows:
    540 \begin{quote2}
    541 \begin{tabular}{@{}l@{\hspace{3em}}l@{}}
    542 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c}{\textbf{C}}        \\
    543 \begin{cfa}
    544 ®*® int x, y;
    545 \end{cfa}
    546 &
    547 \begin{cfa}
    548 int ®*®x, ®*®y;
    549 \end{cfa}
    550 \end{tabular}
    551 \end{quote2}
    552 The downside of this semantics is the need to separate regular and \Index{pointer} declarations:
    553 \begin{quote2}
    554 \begin{tabular}{@{}l@{\hspace{3em}}l@{}}
    555 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c}{\textbf{C}}        \\
    556 \begin{cfa}
    557 ®*® int x;
    558 int y;
    559 \end{cfa}
    560 &
    561 \begin{cfa}
    562 int ®*®x, y;
    563 
    564 \end{cfa}
    565 \end{tabular}
    566 \end{quote2}
    567 which is \Index{prescribing} a safety benefit.
    568 Other examples are:
    569 \begin{quote2}
    570 \begin{tabular}{@{}l@{\hspace{3em}}l@{\hspace{2em}}l@{}}
    571 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c@{\hspace{2em}}}{\textbf{C}} \\
    572 \begin{cfa}
    573 [ 5 ] int z;
    574 [ 5 ] * char w;
    575 * [ 5 ] double v;
    576 struct s {
    577         int f0:3;
    578         * int f1;
    579         [ 5 ] * int f2;
    580 };
    581 \end{cfa}
    582 &
    583 \begin{cfa}
    584 int z[ 5 ];
    585 char * w[ 5 ];
    586 double (* v)[ 5 ];
    587 struct s {
    588         int f0:3;
    589         int * f1;
    590         int * f2[ 5 ]
    591 };
    592 \end{cfa}
    593 &
    594 \begin{cfa}
    595 // array of 5 integers
    596 // array of 5 pointers to char
    597 // pointer to array of 5 doubles
    598 
    599 // common bit field syntax
    600 
    601 
    602 
    603 \end{cfa}
    604 \end{tabular}
    605 \end{quote2}
    606 
    607 All type qualifiers, \eg ©const©, ©volatile©, etc., are used in the normal way with the new declarations and also appear left to right, \eg:
    608 \begin{quote2}
    609 \begin{tabular}{@{}l@{\hspace{1em}}l@{\hspace{1em}}l@{}}
    610 \multicolumn{1}{c@{\hspace{1em}}}{\textbf{\CFA}}        & \multicolumn{1}{c@{\hspace{1em}}}{\textbf{C}} \\
    611 \begin{cfa}
    612 const * const int x;
    613 const * [ 5 ] const int y;
    614 \end{cfa}
    615 &
    616 \begin{cfa}
    617 int const * const x;
    618 const int (* const y)[ 5 ]
    619 \end{cfa}
    620 &
    621 \begin{cfa}
    622 // const pointer to const integer
    623 // const pointer to array of 5 const integers
    624 \end{cfa}
    625 \end{tabular}
    626 \end{quote2}
    627 All declaration qualifiers, \eg ©extern©, ©static©, etc., are used in the normal way with the new declarations but can only appear at the start of a \CFA routine declaration,\footnote{\label{StorageClassSpecifier}
    628 The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.~\cite[\S~6.11.5(1)]{C11}} \eg:
    629 \begin{quote2}
    630 \begin{tabular}{@{}l@{\hspace{3em}}l@{\hspace{2em}}l@{}}
    631 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c@{\hspace{2em}}}{\textbf{C}} \\
    632 \begin{cfa}
    633 extern [ 5 ] int x;
    634 static * const int y;
    635 \end{cfa}
    636 &
    637 \begin{cfa}
    638 int extern x[ 5 ];
    639 const int static * y;
    640 \end{cfa}
    641 &
    642 \begin{cfa}
    643 // externally visible array of 5 integers
    644 // internally visible pointer to constant int
    645 \end{cfa}
    646 \end{tabular}
    647 \end{quote2}
    648 
    649 The new declaration syntax can be used in other contexts where types are required, \eg casts and the pseudo-routine ©sizeof©:
    650 \begin{quote2}
    651 \begin{tabular}{@{}l@{\hspace{3em}}l@{}}
    652 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c}{\textbf{C}}        \\
    653 \begin{cfa}
    654 y = (®* int®)x;
    655 i = sizeof(®[ 5 ] * int®);
    656 \end{cfa}
    657 &
    658 \begin{cfa}
    659 y = (®int *®)x;
    660 i = sizeof(®int * [ 5 ]®);
    661 \end{cfa}
    662 \end{tabular}
    663 \end{quote2}
    664 
    665 Finally, new \CFA declarations may appear together with C declarations in the same program block, but cannot be mixed within a specific declaration.
    666 Therefore, a programmer has the option of either continuing to use traditional C declarations or take advantage of the new style.
    667 Clearly, both styles need to be supported for some time due to existing C-style header-files, particularly for UNIX systems.
    668 
    669 
    670 \section{Pointer/Reference}
    671 
    672 C provides a \newterm{pointer type};
    673 \CFA adds a \newterm{reference type}.
    674 These types may be derived from an object or routine type, called the \newterm{referenced type}.
    675 Objects of these types contain an \newterm{address}, which is normally a location in memory, but may also address memory-mapped registers in hardware devices.
    676 An integer constant expression with the value 0, or such an expression cast to type ©void *©, is called a \newterm{null-pointer constant}.\footnote{
    677 One 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;
    678 \ie the null pointer is guaranteed to compare unequal to a pointer to any object or routine.}
    679 An 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.
    680 Dereferencing an \newterm{unsound} address, including the null pointer, is \Index{undefined}, often resulting in a \Index{memory fault}.
    681 
    682 A program \newterm{object} is a region of data storage in the execution environment, the contents of which can represent values.
    683 In most cases, objects are located in memory at an address, and the variable name for an object is an implicit address to the object generated by the compiler and automatically dereferenced, as in:
    684 \begin{quote2}
    685 \begin{tabular}{@{}ll@{\hspace{2em}}l@{}}
    686 \begin{cfa}
    687 int x;
    688 x = 3;
    689 int y;
    690 y = x;
    691 \end{cfa}
    692 &
    693 \raisebox{-0.45\totalheight}{\input{pointer1}}
    694 &
    695 \begin{cfa}
    696 int * ®const® x = (int *)100
    697 *x = 3;                 // implicit dereference
    698 int * ®const® y = (int *)104;
    699 *y = *x;                // implicit dereference
    700 \end{cfa}
    701 \end{tabular}
    702 \end{quote2}
    703 where the right example is how the compiler logically interprets the variables in the left example.
    704 Since a variable name only points to one address during its lifetime, it is an \Index{immutable} \Index{pointer};
    705 hence, the implicit type of pointer variables ©x© and ©y© are constant pointers in the compiler interpretation.
    706 In general, variable addresses are stored in instructions instead of loaded from memory, and hence may not occupy storage.
    707 These approaches are contrasted in the following:
    708 \begin{quote2}
    709 \begin{tabular}{@{}l|l@{}}
    710 \multicolumn{1}{c|}{explicit variable address} & \multicolumn{1}{c}{implicit variable address} \\
    711 \hline
    712 \begin{cfa}
    713 lda             r1,100                  // load address of x
    714 ld               r2,(r1)                  // load value of x
    715 lda             r3,104                  // load address of y
    716 st               r2,(r3)                  // store x into y
    717 \end{cfa}
    718 &
    719 \begin{cfa}
    720 
    721 ld              r2,(100)                // load value of x
    722 
    723 st              r2,(104)                // store x into y
    724 \end{cfa}
    725 \end{tabular}
    726 \end{quote2}
    727 Finally, the immutable nature of a variable's address and the fact that there is no storage for the variable pointer means pointer assignment\index{pointer!assignment}\index{assignment!pointer} is impossible.
    728 Therefore, the expression ©x = y© has only one meaning, ©*x = *y©, \ie manipulate values, which is why explicitly writing the dereferences is unnecessary even though it occurs implicitly as part of \Index{instruction decoding}.
    729 
    730 A \Index{pointer}/\Index{reference} object is a generalization of an object variable-name, \ie a mutable address that can point to more than one memory location during its lifetime.
    731 (Similarly, an integer variable can contain multiple integer literals during its lifetime versus an integer constant representing a single literal during its lifetime, and like a variable name, may not occupy storage if the literal is embedded directly into instructions.)
    732 Hence, a pointer occupies memory to store its current address, and the pointer's value is loaded by dereferencing, \eg:
    733 \begin{quote2}
    734 \begin{tabular}{@{}l@{\hspace{2em}}l@{}}
    735 \begin{cfa}
    736 int x, y, ®*® p1, ®*® p2, ®**® p3;
    737 p1 = ®&®x;               // p1 points to x
    738 p2 = p1;                 // p2 points to x
    739 p1 = ®&®y;               // p1 points to y
    740 p3 = &p2;               // p3 points to p2
    741 \end{cfa}
    742 &
    743 \raisebox{-0.5\totalheight}{\input{pointer2.pstex_t}}
    744 \end{tabular}
    745 \end{quote2}
    746 
    747 Notice, an address has a \Index{duality}\index{address!duality}: a location in memory or the value at that location.
    748 In many cases, a compiler might be able to infer the best meaning for these two cases.
    749 For example, \Index*{Algol68}~\cite{Algol68} infers pointer dereferencing to select the best meaning for each pointer usage
    750 \begin{cfa}
    751 p2 = p1 + x;                                    §\C{// compiler infers *p2 = *p1 + x;}§
    752 \end{cfa}
    753 Algol68 infers the following dereferencing ©*p2 = *p1 + x©, because adding the arbitrary integer value in ©x© to the address of ©p1© and storing the resulting address into ©p2© is an unlikely operation.
    754 Unfortunately, automatic dereferencing does not work in all cases, and so some mechanism is necessary to fix incorrect choices.
    755 
    756 Rather than inferring dereference, most programming languages pick one implicit dereferencing semantics, and the programmer explicitly indicates the other to resolve address-duality.
    757 In C, objects of pointer type always manipulate the pointer object's address:
    758 \begin{cfa}
    759 p1 = p2;                                                §\C{// p1 = p2\ \ rather than\ \ *p1 = *p2}§
    760 p2 = p1 + x;                                    §\C{// p2 = p1 + x\ \ rather than\ \ *p2 = *p1 + x}§
    761 \end{cfa}
    762 even though the assignment to ©p2© is likely incorrect, and the programmer probably meant:
    763 \begin{cfa}
    764 p1 = p2;                                                §\C{// pointer address assignment}§
    765 ®*®p2 = ®*®p1 + x;                              §\C{// pointed-to value assignment / operation}§
    766 \end{cfa}
    767 The C semantics work well for situations where manipulation of addresses is the primary meaning and data is rarely accessed, such as storage management (©malloc©/©free©).
    768 
    769 However, in most other situations, the pointed-to value is requested more often than the pointer address.
    770 \begin{cfa}
    771 *p2 = ((*p1 + *p2) * (**p3 - *p1)) / (**p3 - 15);
    772 \end{cfa}
    773 In this case, it is tedious to explicitly write the dereferencing, and error prone when pointer arithmetic is allowed.
    774 It is better to have the compiler generate the dereferencing and have no implicit pointer arithmetic:
    775 \begin{cfa}
    776 p2 = ((p1 + p2) * (p3 - p1)) / (p3 - 15);
    777 \end{cfa}
    778 
    779 To support this common case, a reference type is introduced in \CFA, denoted by ©&©, which is the opposite dereference semantics to a pointer type, making the value at the pointed-to location the implicit semantics for dereferencing (similar but not the same as \CC \Index{reference type}s).
    780 \begin{cfa}
    781 int x, y, ®&® r1, ®&® r2, ®&&® r3;
    782 ®&®r1 = &x;                                             §\C{// r1 points to x}§
    783 ®&®r2 = &r1;                                    §\C{// r2 points to x}§
    784 ®&®r1 = &y;                                             §\C{// r1 points to y}§
    785 ®&&®r3 = ®&®&r2;                                §\C{// r3 points to r2}§
    786 r2 = ((r1 + r2) * (r3 - r1)) / (r3 - 15); §\C{// implicit dereferencing}§
    787 \end{cfa}
    788 Except for auto-dereferencing by the compiler, this reference example is the same as the previous pointer example.
    789 Hence, a reference behaves like the variable name for the current variable it is pointing-to.
    790 One way to conceptualize a reference is via a rewrite rule, where the compiler inserts a dereference operator before the reference variable for each reference qualifier in a declaration, so the previous example becomes:
    791 \begin{cfa}
    792 ®*®r2 = ((®*®r1 + ®*®r2) ®*® (®**®r3 - ®*®r1)) / (®**®r3 - 15);
    793 \end{cfa}
    794 When a reference operation appears beside a dereference operation, \eg ©&*©, they cancel out.
    795 However, in C, the cancellation always yields a value (\Index{rvalue}).\footnote{
    796 The unary ©&© operator yields the address of its operand.
    797 If the operand has type ``type'', the result has type ``pointer to type''.
    798 If the operand is the result of a unary ©*© operator, neither that operator nor the ©&© operator is evaluated and the result is as if both were omitted, except that the constraints on the operators still apply and the result is not an lvalue.~\cite[\S~6.5.3.2--3]{C11}}
    799 For a \CFA reference type, the cancellation on the left-hand side of assignment leaves the reference as an address (\Index{lvalue}):
    800 \begin{cfa}
    801 (&®*®)r1 = &x;                                  §\C{// (\&*) cancel giving address in r1 not variable pointed-to by r1}§
    802 \end{cfa}
    803 Similarly, the address of a reference can be obtained for assignment or computation (\Index{rvalue}):
    804 \begin{cfa}
    805 (&(&®*®)®*®)r3 = &(&®*®)r2;             §\C{// (\&*) cancel giving address in r2, (\&(\&*)*) cancel giving address in r3}§
    806 \end{cfa}
    807 Cancellation\index{cancellation!pointer/reference}\index{pointer!cancellation} works to arbitrary depth.
    808 
    809 Fundamentally, pointer and reference objects are functionally interchangeable because both contain addresses.
    810 \begin{cfa}
    811 int x, *p1 = &x, **p2 = &p1, ***p3 = &p2,
    812                  &r1 = x,    &&r2 = r1,   &&&r3 = r2;
    813 ***p3 = 3;                                              §\C{// change x}§
    814 r3 = 3;                                                 §\C{// change x, ***r3}§
    815 **p3 = ...;                                             §\C{// change p1}§
    816 &r3 = ...;                                              §\C{// change r1, (\&*)**r3, 1 cancellation}§
    817 *p3 = ...;                                              §\C{// change p2}§
    818 &&r3 = ...;                                             §\C{// change r2, (\&(\&*)*)*r3, 2 cancellations}§
    819 &&&r3 = p3;                                             §\C{// change r3 to p3, (\&(\&(\&*)*)*)r3, 3 cancellations}§
    820 \end{cfa}
    821 Furthermore, both types are equally performant, as the same amount of dereferencing occurs for both types.
    822 Therefore, the choice between them is based solely on whether the address is dereferenced frequently or infrequently, which dictates the amount of implicit dereferencing aid from the compiler.
    823 
    824 As for a pointer type, a reference type may have qualifiers:
    825 \begin{cfa}
    826 const int cx = 5;                                       §\C{// cannot change cx;}§
    827 const int & cr = cx;                            §\C{// cannot change what cr points to}§
    828 ®&®cr = &cx;                                            §\C{// can change cr}§
    829 cr = 7;                                                         §\C{// error, cannot change cx}§
    830 int & const rc = x;                                     §\C{// must be initialized}§
    831 ®&®rc = &x;                                                     §\C{// error, cannot change rc}§
    832 const int & const crc = cx;                     §\C{// must be initialized}§
    833 crc = 7;                                                        §\C{// error, cannot change cx}§
    834 ®&®crc = &cx;                                           §\C{// error, cannot change crc}§
    835 \end{cfa}
    836 Hence, for type ©& const©, there is no pointer assignment, so ©&rc = &x© is disallowed, and \emph{the address value cannot be the null pointer unless an arbitrary pointer is coerced\index{coercion} into the reference}:
    837 \begin{cfa}
    838 int & const cr = *0;                            §\C{// where 0 is the int * zero}§
    839 \end{cfa}
    840 Note, constant reference-types do not prevent \Index{addressing errors} because of explicit storage-management:
    841 \begin{cfa}
    842 int & const cr = *malloc();
    843 cr = 5;
    844 free( &cr );
    845 cr = 7;                                                         §\C{// unsound pointer dereference}§
    846 \end{cfa}
    847 
    848 The position of the ©const© qualifier \emph{after} the pointer/reference qualifier causes confuse for C programmers.
    849 The ©const© qualifier cannot be moved before the pointer/reference qualifier for C style-declarations;
    850 \CFA-style declarations (see \VRef{s:Declarations}) attempt to address this issue:
    851 \begin{quote2}
    852 \begin{tabular}{@{}l@{\hspace{3em}}l@{}}
    853 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c}{\textbf{C}}        \\
    854 \begin{cfa}
    855 ®const® * ®const® * const int ccp;
    856 ®const® & ®const® & const int ccr;
    857 \end{cfa}
    858 &
    859 \begin{cfa}
    860 const int * ®const® * ®const® ccp;
    861 
    862 \end{cfa}
    863 \end{tabular}
    864 \end{quote2}
    865 where the \CFA declaration is read left-to-right.
    866 
    867 Finally, like pointers, references are usable and composable with other type operators and generators.
    868 \begin{cfa}
    869 int w, x, y, z, & ar[3] = { x, y, z }; §\C{// initialize array of references}§
    870 &ar[1] = &w;                                            §\C{// change reference array element}§
    871 typeof( ar[1] ) p;                                      §\C{// (gcc) is int, i.e., the type of referenced object}§
    872 typeof( &ar[1] ) q;                                     §\C{// (gcc) is int \&, i.e., the type of reference}§
    873 sizeof( ar[1] ) == sizeof( int );       §\C{// is true, i.e., the size of referenced object}§
    874 sizeof( &ar[1] ) == sizeof( int *)      §\C{// is true, i.e., the size of a reference}§
    875 \end{cfa}
    876 
    877 In contrast to \CFA reference types, \Index*[C++]{\CC{}}'s reference types are all ©const© references, preventing changes to the reference address, so only value assignment is possible, which eliminates half of the \Index{address duality}.
    878 Also, \CC does not allow \Index{array}s\index{array!reference} of reference\footnote{
    879 The reason for disallowing arrays of reference is unknown, but possibly comes from references being ethereal (like a textual macro), and hence, replaceable by the referant object.}
    880 \Index*{Java}'s reference types to objects (all Java objects are on the heap) are like C pointers, which always manipulate the address, and there is no (bit-wise) object assignment, so objects are explicitly cloned by shallow or deep copying, which eliminates half of the address duality.
    881 
    882 
    883 \subsection{Initialization}
    884 
    885 \Index{Initialization} is different than \Index{assignment} because initialization occurs on the empty (uninitialized) storage on an object, while assignment occurs on possibly initialized storage of an object.
    886 There are three initialization contexts in \CFA: declaration initialization, argument/parameter binding, return/temporary binding.
    887 Because the object being initialized has no value, there is only one meaningful semantics with respect to address duality: it must mean address as there is no pointed-to value.
    888 In contrast, the left-hand side of assignment has an address that has a duality.
    889 Therefore, for pointer/reference initialization, the initializing value must be an address not a value.
    890 \begin{cfa}
    891 int * p = &x;                                           §\C{// assign address of x}§
    892 ®int * p = x;®                                          §\C{// assign value of x}§
    893 int & r = x;                                            §\C{// must have address of x}§
    894 \end{cfa}
    895 Like the previous example with C pointer-arithmetic, it is unlikely assigning the value of ©x© into a pointer is meaningful (again, a warning is usually given).
    896 Therefore, for safety, this context requires an address, so it is superfluous to require explicitly taking the address of the initialization object, even though the type is incorrect.
    897 Note, this is strictly a convenience and safety feature for a programmer.
    898 Hence, \CFA allows ©r© to be assigned ©x© because it infers a reference for ©x©, by implicitly inserting a address-of operator, ©&©, and it is an error to put an ©&© because the types no longer match due to the implicit dereference.
    899 Unfortunately, C allows ©p© to be assigned with ©&x© (address) or ©x© (value), but most compilers warn about the latter assignment as being potentially incorrect.
    900 Similarly, when a reference type is used for a parameter/return type, the call-site argument does not require a reference operator for the same reason.
    901 \begin{cfa}
    902 int & f( int & r );                                     §\C{// reference parameter and return}§
    903 z = f( x ) + f( y );                            §\C{// reference operator added, temporaries needed for call results}§
    904 \end{cfa}
    905 Within routine ©f©, it is possible to change the argument by changing the corresponding parameter, and parameter ©r© can be locally reassigned within ©f©.
    906 Since operator routine ©?+?© takes its arguments by value, the references returned from ©f© are used to initialize compiler generated temporaries with value semantics that copy from the references.
    907 \begin{cfa}
    908 int temp1 = f( x ), temp2 = f( y );
    909 z = temp1 + temp2;
    910 \end{cfa}
    911 This \Index{implicit referencing} is crucial for reducing the syntactic burden for programmers when using references;
    912 otherwise references have the same syntactic  burden as pointers in these contexts.
    913 
    914 When a pointer/reference parameter has a ©const© value (immutable), it is possible to pass literals and expressions.
    915 \begin{cfa}
    916 void f( ®const® int & cr );
    917 void g( ®const® int * cp );
    918 f( 3 );                   g( ®&®3 );
    919 f( x + y );             g( ®&®(x + y) );
    920 \end{cfa}
    921 Here, the compiler passes the address to the literal 3 or the temporary for the expression ©x + y©, knowing the argument cannot be changed through the parameter.
    922 The ©&© before the constant/expression for the pointer-type parameter (©g©) is a \CFA extension necessary to type match and is a common requirement before a variable in C (\eg ©scanf©).
    923 Importantly, ©&3© may not be equal to ©&3©, where the references occur across calls because the temporaries maybe different on each call.
    924 
    925 \CFA \emph{extends} this semantics to a mutable pointer/reference parameter, and the compiler implicitly creates the necessary temporary (copying the argument), which is subsequently pointed-to by the reference parameter and can be changed.\footnote{
    926 If whole program analysis is possible, and shows the parameter is not assigned, \ie it is ©const©, the temporary is unnecessary.}
    927 \begin{cfa}
    928 void f( int & r );
    929 void g( int * p );
    930 f( 3 );                   g( ®&®3 );            §\C{// compiler implicit generates temporaries}§
    931 f( x + y );             g( ®&®(x + y) );        §\C{// compiler implicit generates temporaries}§
    932 \end{cfa}
    933 Essentially, there is an implicit \Index{rvalue} to \Index{lvalue} conversion in this case.\footnote{
    934 This conversion attempts to address the \newterm{const hell} problem, when the innocent addition of a ©const© qualifier causes a cascade of type failures, requiring an unknown number of additional ©const© qualifiers, until it is discovered a ©const© qualifier cannot be added and all the ©const© qualifiers must be removed.}
    935 The implicit conversion allows seamless calls to any routine without having to explicitly name/copy the literal/expression to allow the call.
    936 
    937 %\CFA attempts to handle pointers and references in a uniform, symmetric manner.
    938 Finally, C handles \Index{routine object}s in an inconsistent way.
    939 A routine object is both a pointer and a reference (\Index{particle and wave}).
    940 \begin{cfa}
    941 void f( int i );
    942 void (*fp)( int );                                      §\C{// routine pointer}§
    943 fp = f;                                                         §\C{// reference initialization}§
    944 fp = &f;                                                        §\C{// pointer initialization}§
    945 fp = *f;                                                        §\C{// reference initialization}§
    946 fp(3);                                                          §\C{// reference invocation}§
    947 (*fp)(3);                                                       §\C{// pointer invocation}§
    948 \end{cfa}
    949 While C's treatment of routine objects has similarity to inferring a reference type in initialization contexts, the examples are assignment not initialization, and all possible forms of assignment are possible (©f©, ©&f©, ©*f©) without regard for type.
    950 Instead, a routine object should be referenced by a ©const© reference:
    951 \begin{cfa}
    952 ®const® void (®&® fr)( int ) = f;       §\C{// routine reference}§
    953 fr = ...                                                        §\C{// error, cannot change code}§
    954 &fr = ...;                                                      §\C{// changing routine reference}§
    955 fr( 3 );                                                        §\C{// reference call to f}§
    956 (*fr)(3);                                                       §\C{// error, incorrect type}§
    957 \end{cfa}
    958 because the value of the routine object is a routine literal, \ie the routine code is normally immutable during execution.\footnote{
    959 Dynamic code rewriting is possible but only in special circumstances.}
    960 \CFA allows this additional use of references for routine objects in an attempt to give a more consistent meaning for them.
    961 
    962 
    963 \subsection{Address-of Semantics}
    964 
    965 In C, ©&E© is an rvalue for any expression ©E©.
    966 \CFA extends the ©&© (address-of) operator as follows:
    967 \begin{itemize}
    968 \item
    969 if ©R© is an \Index{rvalue} of type ©T &$_1$...&$_r$© where $r \ge 1$ references (©&© symbols) than ©&R© has type ©T ®*®&$_{\color{red}2}$...&$_{\color{red}r}$©, \ie ©T© pointer with $r-1$ references (©&© symbols).
    970 
    971 \item
    972 if ©L© is an \Index{lvalue} of type ©T &$_1$...&$_l$© where $l \ge 0$ references (©&© symbols) then ©&L© has type ©T ®*®&$_{\color{red}1}$...&$_{\color{red}l}$©, \ie ©T© pointer with $l$ references (©&© symbols).
    973 \end{itemize}
    974 The following example shows the first rule applied to different \Index{rvalue} contexts:
    975 \begin{cfa}
    976 int x, * px, ** ppx, *** pppx, **** ppppx;
    977 int & rx = x, && rrx = rx, &&& rrrx = rrx ;
    978 x = rrrx;               // rrrx is an lvalue with type int &&& (equivalent to x)
    979 px = &rrrx;             // starting from rrrx, &rrrx is an rvalue with type int *&&& (&x)
    980 ppx = &&rrrx;   // starting from &rrrx, &&rrrx is an rvalue with type int **&& (&rx)
    981 pppx = &&&rrrx; // starting from &&rrrx, &&&rrrx is an rvalue with type int ***& (&rrx)
    982 ppppx = &&&&rrrx; // starting from &&&rrrx, &&&&rrrx is an rvalue with type int **** (&rrrx)
    983 \end{cfa}
    984 The following example shows the second rule applied to different \Index{lvalue} contexts:
    985 \begin{cfa}
    986 int x, * px, ** ppx, *** pppx;
    987 int & rx = x, && rrx = rx, &&& rrrx = rrx ;
    988 rrrx = 2;               // rrrx is an lvalue with type int &&& (equivalent to x)
    989 &rrrx = px;             // starting from rrrx, &rrrx is an rvalue with type int *&&& (rx)
    990 &&rrrx = ppx;   // starting from &rrrx, &&rrrx is an rvalue with type int **&& (rrx)
    991 &&&rrrx = pppx; // starting from &&rrrx, &&&rrrx is an rvalue with type int ***& (rrrx)
    992 \end{cfa}
    993 
    994 
    995 \subsection{Conversions}
    996 
    997 C provides a basic implicit conversion to simplify variable usage:
    998 \begin{enumerate}
    999 \setcounter{enumi}{-1}
    1000 \item
    1001 lvalue to rvalue conversion: ©cv T© converts to ©T©, which allows implicit variable dereferencing.
    1002 \begin{cfa}
    1003 int x;
    1004 x + 1;                  // lvalue variable (int) converts to rvalue for expression
    1005 \end{cfa}
    1006 An rvalue has no type qualifiers (©cv©), so the lvalue qualifiers are dropped.
    1007 \end{enumerate}
    1008 \CFA provides three new implicit conversion for reference types to simplify reference usage.
    1009 \begin{enumerate}
    1010 \item
    1011 reference to rvalue conversion: ©cv T &© converts to ©T©, which allows implicit reference dereferencing.
    1012 \begin{cfa}
    1013 int x, &r = x, f( int p );
    1014 x = ®r® + f( ®r® );  // lvalue reference converts to rvalue
    1015 \end{cfa}
    1016 An rvalue has no type qualifiers (©cv©), so the reference qualifiers are dropped.
    1017 
    1018 \item
    1019 lvalue to reference conversion: \lstinline[deletekeywords={lvalue}]@lvalue-type cv1 T@ converts to ©cv2 T &©, which allows implicitly converting variables to references.
    1020 \begin{cfa}
    1021 int x, &r = ®x®, f( int & p ); // lvalue variable (int) convert to reference (int &)
    1022 f( ®x® );               // lvalue variable (int) convert to reference (int &)
    1023 \end{cfa}
    1024 Conversion can restrict a type, where ©cv1© $\le$ ©cv2©, \eg passing an ©int© to a ©const volatile int &©, which has low cost.
    1025 Conversion can expand a type, where ©cv1© $>$ ©cv2©, \eg passing a ©const volatile int© to an ©int &©, which has high cost (\Index{warning});
    1026 furthermore, if ©cv1© has ©const© but not ©cv2©, a temporary variable is created to preserve the immutable lvalue.
    1027 
    1028 \item
    1029 rvalue to reference conversion: ©T© converts to ©cv T &©, which allows binding references to temporaries.
    1030 \begin{cfa}
    1031 int x, & f( int & p );
    1032 f( ®x + 3® );   // rvalue parameter (int) implicitly converts to lvalue temporary reference (int &)
    1033 ®&f®(...) = &x; // rvalue result (int &) implicitly converts to lvalue temporary reference (int &)
    1034 \end{cfa}
    1035 In both case, modifications to the temporary are inaccessible (\Index{warning}).
    1036 Conversion expands the temporary-type with ©cv©, which is low cost since the temporary is inaccessible.
    1037 \end{enumerate}
    1038 
    1039 
    1040 \begin{comment}
    1041 From: Richard Bilson <rcbilson@gmail.com>
    1042 Date: Wed, 13 Jul 2016 01:58:58 +0000
    1043 Subject: Re: pointers / references
    1044 To: "Peter A. Buhr" <pabuhr@plg2.cs.uwaterloo.ca>
    1045 
    1046 As a general comment I would say that I found the section confusing, as you move back and forth
    1047 between various real and imagined programming languages. If it were me I would rewrite into two
    1048 subsections, one that specifies precisely the syntax and semantics of reference variables and
    1049 another that provides the rationale.
    1050 
    1051 I don't see any obvious problems with the syntax or semantics so far as I understand them. It's not
    1052 obvious that the description you're giving is complete, but I'm sure you'll find the special cases
    1053 as you do the implementation.
    1054 
    1055 My big gripes are mostly that you're not being as precise as you need to be in your terminology, and
    1056 that you say a few things that aren't actually true even though I generally know what you mean.
    1057 
    1058 20 C provides a pointer type; CFA adds a reference type. Both types contain an address, which is normally a
    1059 21 location in memory.
    1060 
    1061 An address is not a location in memory; an address refers to a location in memory. Furthermore it
    1062 seems weird to me to say that a type "contains" an address; rather, objects of that type do.
    1063 
    1064 21 Special addresses are used to denote certain states or access co-processor memory. By
    1065 22 convention, no variable is placed at address 0, so addresses like 0, 1, 2, 3 are often used to denote no-value
    1066 23 or other special states.
    1067 
    1068 This isn't standard C at all. There has to be one null pointer representation, but it doesn't have
    1069 to be a literal zero representation and there doesn't have to be more than one such representation.
    1070 
    1071 23 Often dereferencing a special state causes a memory fault, so checking is necessary
    1072 24 during execution.
    1073 
    1074 I don't see the connection between the two clauses here. I feel like if a bad pointer will not cause
    1075 a memory fault then I need to do more checking, not less.
    1076 
    1077 24 If the programming language assigns addresses, a program's execution is sound, \ie all
    1078 25 addresses are to valid memory locations.
    1079 
    1080 You haven't said what it means to "assign" an address, but if I use my intuitive understanding of
    1081 the term I don't see how this can be true unless you're assuming automatic storage management.
    1082 
    1083 1 Program variables are implicit pointers to memory locations generated by the compiler and automatically
    1084 2 dereferenced, as in:
    1085 
    1086 There is no reason why a variable needs to have a location in memory, and indeed in a typical
    1087 program many variables will not. In standard terminology an object identifier refers to data in the
    1088 execution environment, but not necessarily in memory.
    1089 
    1090 13 A pointer/reference is a generalization of a variable name, \ie a mutable address that can point to more
    1091 14 than one memory location during its lifetime.
    1092 
    1093 I feel like you're off the reservation here. In my world there are objects of pointer type, which
    1094 seem to be what you're describing here, but also pointer values, which can be stored in an object of
    1095 pointer type but don't necessarily have to be. For example, how would you describe the value denoted
    1096 by "&main" in a C program? I would call it a (function) pointer, but that doesn't satisfy your
    1097 definition.
    1098 
    1099 16 not occupy storage as the literal is embedded directly into instructions.) Hence, a pointer occupies memory
    1100 17 to store its current address, and the pointer's value is loaded by dereferencing, e.g.:
    1101 
    1102 As with my general objection regarding your definition of variables, there is no reason why a
    1103 pointer variable (object of pointer type) needs to occupy memory.
    1104 
    1105 21 p2 = p1 + x; // compiler infers *p2 = *p1 + x;
    1106 
    1107 What language are we in now?
    1108 
    1109 24 pointer usage. However, in C, the following cases are ambiguous, especially with pointer arithmetic:
    1110 25 p1 = p2; // p1 = p2 or *p1 = *p2
    1111 
    1112 This isn't ambiguous. it's defined to be the first option.
    1113 
    1114 26 p1 = p1 + 1; // p1 = p1 + 1 or *p1 = *p1 + 1
    1115 
    1116 Again, this statement is not ambiguous.
    1117 
    1118 13 example. Hence, a reference behaves like the variable name for the current variable it is pointing-to. The
    1119 14 simplest way to understand a reference is to imagine the compiler inserting a dereference operator before
    1120 15 the reference variable for each reference qualifier in a declaration, e.g.:
    1121 
    1122 It's hard for me to understand who the audience for this part is. I think a practical programmer is
    1123 likely to be satisfied with "a reference behaves like the variable name for the current variable it
    1124 is pointing-to," maybe with some examples. Your "simplest way" doesn't strike me as simpler than
    1125 that. It feels like you're trying to provide a more precise definition for the semantics of
    1126 references, but it isn't actually precise enough to be a formal specification. If you want to
    1127 express the semantics of references using rewrite rules that's a great way to do it, but lay the
    1128 rules out clearly, and when you're showing an example of rewriting keep your
    1129 references/pointers/values separate (right now, you use \eg "r3" to mean a reference, a pointer,
    1130 and a value).
    1131 
    1132 24 Cancellation works to arbitrary depth, and pointer and reference values are interchangeable because both
    1133 25 contain addresses.
    1134 
    1135 Except they're not interchangeable, because they have different and incompatible types.
    1136 
    1137 40 Interestingly, C++ deals with the address duality by making the pointed-to value the default, and prevent-
    1138 41 ing changes to the reference address, which eliminates half of the duality. Java deals with the address duality
    1139 42 by making address assignment the default and requiring field assignment (direct or indirect via methods),
    1140 43 \ie there is no builtin bit-wise or method-wise assignment, which eliminates half of the duality.
    1141 
    1142 I can follow this but I think that's mostly because I already understand what you're trying to
    1143 say. I don't think I've ever heard the term "method-wise assignment" and I don't see you defining
    1144 it. Furthermore Java does have value assignment of basic (non-class) types, so your summary here
    1145 feels incomplete. (If it were me I'd drop this paragraph rather than try to save it.)
    1146 
    1147 11 Hence, for type & const, there is no pointer assignment, so &rc = &x is disallowed, and the address value
    1148 12 cannot be 0 unless an arbitrary pointer is assigned to the reference.
    1149 
    1150 Given the pains you've taken to motivate every little bit of the semantics up until now, this last
    1151 clause ("the address value cannot be 0") comes out of the blue. It seems like you could have
    1152 perfectly reasonable semantics that allowed the initialization of null references.
    1153 
    1154 12 In effect, the compiler is managing the
    1155 13 addresses for type & const not the programmer, and by a programming discipline of only using references
    1156 14 with references, address errors can be prevented.
    1157 
    1158 Again, is this assuming automatic storage management?
    1159 
    1160 18 rary binding. For reference initialization (like pointer), the initializing value must be an address (lvalue) not
    1161 19 a value (rvalue).
    1162 
    1163 This sentence appears to suggest that an address and an lvalue are the same thing.
    1164 
    1165 20 int * p = &x; // both &x and x are possible interpretations
    1166 
    1167 Are you saying that we should be considering "x" as a possible interpretation of the initializer
    1168 "&x"? It seems to me that this expression has only one legitimate interpretation in context.
    1169 
    1170 21 int & r = x; // x unlikely interpretation, because of auto-dereferencing
    1171 
    1172 You mean, we can initialize a reference using an integer value? Surely we would need some sort of
    1173 cast to induce that interpretation, no?
    1174 
    1175 22 Hence, the compiler implicitly inserts a reference operator, &, before the initialization expression.
    1176 
    1177 But then the expression would have pointer type, which wouldn't be compatible with the type of r.
    1178 
    1179 22 Similarly,
    1180 23 when a reference is used for a parameter/return type, the call-site argument does not require a reference
    1181 24 operator.
    1182 
    1183 Furthermore, it would not be correct to use a reference operator.
    1184 
    1185 45 The implicit conversion allows
    1186 1 seamless calls to any routine without having to explicitly name/copy the literal/expression to allow the call.
    1187 2 While C' attempts to handle pointers and references in a uniform, symmetric manner, C handles routine
    1188 3 variables in an inconsistent way: a routine variable is both a pointer and a reference (particle and wave).
    1189 
    1190 After all this talk of how expressions can have both pointer and value interpretations, you're
    1191 disparaging C because it has expressions that have both pointer and value interpretations?
    1192 
    1193 On Sat, Jul 9, 2016 at 4:18 PM Peter A. Buhr <pabuhr@plg.uwaterloo.ca> wrote:
    1194 > Aaron discovered a few places where "&"s are missing and where there are too many "&", which are
    1195 > corrected in the attached updated. None of the text has changed, if you have started reading
    1196 > already.
    1197 \end{comment}
    1198 
    1199 
    1200 \section{Routine Definition}
    1201 
    1202 \CFA also supports a new syntax for routine definition, as well as \Celeven and K\&R routine syntax.
    1203 The point of the new syntax is to allow returning multiple values from a routine~\cite{Galletly96,CLU}, \eg:
    1204 \begin{cfa}
    1205 ®[ int o1, int o2, char o3 ]® f( int i1, char i2, char i3 ) {
    1206         §\emph{routine body}§
    1207 }
    1208 \end{cfa}
    1209 where routine ©f© has three output (return values) and three input parameters.
    1210 Existing C syntax cannot be extended with multiple return types because it is impossible to embed a single routine name within multiple return type specifications.
    1211 
    1212 In detail, the brackets, ©[]©, enclose the result type, where each return value is named and that name is a local variable of the particular return type.\footnote{
    1213 \Index*{Michael Tiemann}, with help from \Index*{Doug Lea}, provided named return values in g++, circa 1989.}
    1214 The value of each local return variable is automatically returned at routine termination.
    1215 Declaration qualifiers can only appear at the start of a routine definition, \eg:
    1216 \begin{cfa}
    1217 ®extern® [ int x ] g( int y ) {§\,§}
    1218 \end{cfa}
    1219 Lastly, if there are no output parameters or input parameters, the brackets and/or parentheses must still be specified;
    1220 in both cases the type is assumed to be void as opposed to old style C defaults of int return type and unknown parameter types, respectively, as in:
    1221 \begin{cfa}
    1222 [§\,§] g();                                                     §\C{// no input or output parameters}§
    1223 [ void ] g( void );                                     §\C{// no input or output parameters}§
    1224 \end{cfa}
    1225 
    1226 Routine f is called as follows:
    1227 \begin{cfa}
    1228 [ i, j, ch ] = f( 3, 'a', ch );
    1229 \end{cfa}
    1230 The list of return values from f and the grouping on the left-hand side of the assignment is called a \newterm{return list} and discussed in Section 12.
    1231 
    1232 \CFA style declarations cannot be used to declare parameters for K\&R style routine definitions because of the following ambiguity:
    1233 \begin{cfa}
    1234 int (*f(x))[ 5 ] int x; {}
    1235 \end{cfa}
    1236 The string ``©int (*f(x))[ 5 ]©'' declares a K\&R style routine of type returning a pointer to an array of 5 integers, while the string ``©[ 5 ] int x©'' declares a \CFA style parameter x of type array of 5 integers.
    1237 Since the strings overlap starting with the open bracket, ©[©, there is an ambiguous interpretation for the string.
    1238 As well, \CFA-style declarations cannot be used to declare parameters for C-style routine-definitions because of the following ambiguity:
    1239 \begin{cfa}
    1240 typedef int foo;
    1241 int f( int (* foo) );                           §\C{// foo is redefined as a parameter name}§
    1242 \end{cfa}
    1243 The string ``©int (* foo)©'' declares a C-style named-parameter of type pointer to an integer (the parenthesis are superfluous), while the same string declares a \CFA style unnamed parameter of type routine returning integer with unnamed parameter of type pointer to foo.
    1244 The redefinition of a type name in a parameter list is the only context in C where the character ©*© can appear to the left of a type name, and \CFA relies on all type qualifier characters appearing to the right of the type name.
    1245 The inability to use \CFA declarations in these two contexts is probably a blessing because it precludes programmers from arbitrarily switching between declarations forms within a declaration contexts.
    1246 
    1247 C-style declarations can be used to declare parameters for \CFA style routine definitions, \eg:
    1248 \begin{cfa}
    1249 [ int ] f( * int, int * );                      §\C{// returns an integer, accepts 2 pointers to integers}§
    1250 [ * int, int * ] f( int );                      §\C{// returns 2 pointers to integers, accepts an integer}§
    1251 \end{cfa}
    1252 The reason for allowing both declaration styles in the new context is for backwards compatibility with existing preprocessor macros that generate C-style declaration-syntax, as in:
    1253 \begin{cfa}
    1254 #define ptoa( n, d ) int (*n)[ d ]
    1255 int f( ptoa( p, 5 ) ) ...                       §\C{// expands to int f( int (*p)[ 5 ] )}§
    1256 [ int ] f( ptoa( p, 5 ) ) ...           §\C{// expands to [ int ] f( int (*p)[ 5 ] )}§
    1257 \end{cfa}
    1258 Again, programmers are highly encouraged to use one declaration form or the other, rather than mixing the forms.
    1259 
    1260 
    1261 \subsection{Named Return Values}
    1262 
    1263 \Index{Named return values} handle the case where it is necessary to define a local variable whose value is then returned in a ©return© statement, as in:
    1264 \begin{cfa}
    1265 int f() {
    1266         int x;
    1267         ... x = 0; ... x = y; ...
    1268         return x;
    1269 }
    1270 \end{cfa}
    1271 Because the value in the return variable is automatically returned when a \CFA routine terminates, the ©return© statement \emph{does not} contain an expression, as in:
    1272 \newline
    1273 \begin{minipage}{\linewidth}
    1274 \begin{cfa}
    1275 ®[ int x, int y ]® f() {
    1276         int z;
    1277         ... x = 0; ... y = z; ...
    1278         ®return;®                                                       §\C{// implicitly return x, y}§
    1279 }
    1280 \end{cfa}
    1281 \end{minipage}
    1282 \newline
    1283 When the return is encountered, the current values of ©x© and ©y© are returned to the calling routine.
    1284 As well, ``falling off the end'' of a routine without a ©return© statement is permitted, as in:
    1285 \begin{cfa}
    1286 [ int x, int y ] f() {
    1287         ...
    1288 }                                                                               §\C{// implicitly return x, y}§
    1289 \end{cfa}
    1290 In this case, the current values of ©x© and ©y© are returned to the calling routine just as if a ©return© had been encountered.
    1291 
    1292 Named return values may be used in conjunction with named parameter values;
    1293 specifically, a return and parameter can have the same name.
    1294 \begin{cfa}
    1295 [ int x, int y ] f( int, x, int y ) {
    1296         ...
    1297 }                                                                               §\C{// implicitly return x, y}§
    1298 \end{cfa}
    1299 This notation allows the compiler to eliminate temporary variables in nested routine calls.
    1300 \begin{cfa}
    1301 [ int x, int y ] f( int, x, int y );    §\C{// prototype declaration}§
    1302 int a, b;
    1303 [a, b] = f( f( f( a, b ) ) );
    1304 \end{cfa}
    1305 While the compiler normally ignores parameters names in prototype declarations, here they are used to eliminate temporary return-values by inferring that the results of each call are the inputs of the next call, and ultimately, the left-hand side of the assignment.
    1306 Hence, even without the body of routine ©f© (separate compilation), it is possible to perform a global optimization across routine calls.
    1307 The compiler warns about naming inconsistencies between routine prototype and definition in this case, and behaviour is \Index{undefined} if the programmer is inconsistent.
    1308 
    1309 
    1310 \subsection{Routine Prototype}
    1311 
    1312 The syntax of the new routine prototype declaration follows directly from the new routine definition syntax;
    1313 as well, parameter names are optional, \eg:
    1314 \begin{cfa}
    1315 [ int x ] f ();                                                 §\C{// returning int with no parameters}§
    1316 [ * int ] g (int y);                                    §\C{// returning pointer to int with int parameter}§
    1317 [ ] h ( int, char );                                    §\C{// returning no result with int and char parameters}§
    1318 [ * int, int ] j ( int );                               §\C{// returning pointer to int and int, with int parameter}§
    1319 \end{cfa}
    1320 This syntax allows a prototype declaration to be created by cutting and pasting source text from the routine definition header (or vice versa).
    1321 It is possible to declare multiple routine-prototypes in a single declaration, but the entire type specification is distributed across \emph{all} routine names in the declaration list (see~\VRef{s:Declarations}), \eg:
    1322 \begin{quote2}
    1323 \begin{tabular}{@{}l@{\hspace{3em}}l@{}}
    1324 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c}{\textbf{C}}        \\
    1325 \begin{cfa}
    1326 [ int ] f( int ), g;
    1327 \end{cfa}
    1328 &
    1329 \begin{cfa}
    1330 int f( int ), g( int );
    1331 \end{cfa}
    1332 \end{tabular}
    1333 \end{quote2}
    1334 Declaration qualifiers can only appear at the start of a \CFA routine declaration,\footref{StorageClassSpecifier} \eg:
    1335 \begin{cfa}
    1336 extern [ int ] f ( int );
    1337 static [ int ] g ( int );
    1338 \end{cfa}
    1339 
    1340 
    1341 \section{Routine Pointers}
    1342 
    1343 The syntax for pointers to \CFA routines specifies the pointer name on the right, \eg:
    1344 \begin{cfa}
    1345 * [ int x ] () fp;                                              §\C{// pointer to routine returning int with no parameters}§
    1346 * [ * int ] (int y) gp;                                 §\C{// pointer to routine returning pointer to int with int parameter}§
    1347 * [ ] (int,char) hp;                                    §\C{// pointer to routine returning no result with int and char parameters}§
    1348 * [ * int,int ] ( int ) jp;                             §\C{// pointer to routine returning pointer to int and int, with int parameter}§
    1349 \end{cfa}
    1350 While parameter names are optional, \emph{a routine name cannot be specified};
    1351 for example, the following is incorrect:
    1352 \begin{cfa}
    1353 * [ int x ] f () fp;                                    §\C{// routine name "f" is not allowed}§
    1354 \end{cfa}
    1355 
    1356 
    1357 \section{Named and Default Arguments}
    1358 
    1359 Named\index{named arguments}\index{arguments!named} and default\index{default arguments}\index{arguments!default} arguments~\cite{Hardgrave76}\footnote{
    1360 Francez~\cite{Francez77} proposed a further extension to the named-parameter passing style, which specifies what type of communication (by value, by reference, by name) the argument is passed to the routine.}
    1361 are two mechanisms to simplify routine call.
    1362 Both mechanisms are discussed with respect to \CFA.
    1363 \begin{description}
    1364 \item[Named (or Keyword) Arguments:]
    1365 provide the ability to specify an argument to a routine call using the parameter name rather than the position of the parameter.
    1366 For example, given the routine:
    1367 \begin{cfa}
    1368 void p( int x, int y, int z ) {...}
    1369 \end{cfa}
    1370 a positional call is:
    1371 \begin{cfa}
    1372 p( 4, 7, 3 );
    1373 \end{cfa}
    1374 whereas a named (keyword) call may be:
    1375 \begin{cfa}
    1376 p( z : 3, x : 4, y : 7 );       §\C{// rewrite $\Rightarrow$ p( 4, 7, 3 )}§
    1377 \end{cfa}
    1378 Here the order of the arguments is unimportant, and the names of the parameters are used to associate argument values with the corresponding parameters.
    1379 The compiler rewrites a named call into a positional call.
    1380 The advantages of named parameters are:
    1381 \begin{itemize}
    1382 \item
    1383 Remembering the names of the parameters may be easier than the order in the routine definition.
    1384 \item
    1385 Parameter names provide documentation at the call site (assuming the names are descriptive).
    1386 \item
    1387 Changes can be made to the order or number of parameters without affecting the call (although the call must still be recompiled).
    1388 \end{itemize}
    1389 
    1390 Unfortunately, named arguments do not work in C-style programming-languages because a routine prototype is not required to specify parameter names, nor do the names in the prototype have to match with the actual definition.
    1391 For example, the following routine prototypes and definition are all valid.
    1392 \begin{cfa}
    1393 void p( int, int, int );                        §\C{// equivalent prototypes}§
    1394 void p( int x, int y, int z );
    1395 void p( int y, int x, int z );
    1396 void p( int z, int y, int x );
    1397 void p( int q, int r, int s ) {}        §\C{// match with this definition}§
    1398 \end{cfa}
    1399 Forcing matching parameter names in routine prototypes with corresponding routine definitions is possible, but goes against a strong tradition in C programming.
    1400 Alternatively, prototype definitions can be eliminated by using a two-pass compilation, and implicitly creating header files for exports.
    1401 The former is easy to do, while the latter is more complex.
    1402 
    1403 Furthermore, named arguments do not work well in a \CFA-style programming-languages because they potentially introduces a new criteria for type matching.
    1404 For example, it is technically possible to disambiguate between these two overloaded definitions of ©f© based on named arguments at the call site:
    1405 \begin{cfa}
    1406 int f( int i, int j );
    1407 int f( int x, double y );
    1408 
    1409 f( j : 3, i : 4 );                              §\C{// 1st f}§
    1410 f( x : 7, y : 8.1 );                    §\C{// 2nd f}§
    1411 f( 4, 5 );                                              §\C{// ambiguous call}§
    1412 \end{cfa}
    1413 However, named arguments compound routine resolution in conjunction with conversions:
    1414 \begin{cfa}
    1415 f( i : 3, 5.7 );                                §\C{// ambiguous call ?}§
    1416 \end{cfa}
    1417 Depending on the cost associated with named arguments, this call could be resolvable or ambiguous.
    1418 Adding named argument into the routine resolution algorithm does not seem worth the complexity.
    1419 Therefore, \CFA does \emph{not} attempt to support named arguments.
    1420 
    1421 \item[Default Arguments]
    1422 provide the ability to associate a default value with a parameter so it can be optionally specified in the argument list.
    1423 For example, given the routine:
    1424 \begin{cfa}
    1425 void p( int x = 1, int y = 2, int z = 3 ) {...}
    1426 \end{cfa}
    1427 the allowable positional calls are:
    1428 \begin{cfa}
    1429 p();                                                    §\C{// rewrite $\Rightarrow$ p( 1, 2, 3 )}§
    1430 p( 4 );                                                 §\C{// rewrite $\Rightarrow$ p( 4, 2, 3 )}§
    1431 p( 4, 4 );                                              §\C{// rewrite $\Rightarrow$ p( 4, 4, 3 )}§
    1432 p( 4, 4, 4 );                                   §\C{// rewrite $\Rightarrow$ p( 4, 4, 4 )}§
    1433 // empty arguments
    1434 p(  , 4, 4 );                                   §\C{// rewrite $\Rightarrow$ p( 1, 4, 4 )}§
    1435 p( 4,  , 4 );                                   §\C{// rewrite $\Rightarrow$ p( 4, 2, 4 )}§
    1436 p( 4, 4,   );                                   §\C{// rewrite $\Rightarrow$ p( 4, 4, 3 )}§
    1437 p( 4,  ,   );                                   §\C{// rewrite $\Rightarrow$ p( 4, 2, 3 )}§
    1438 p(  , 4,   );                                   §\C{// rewrite $\Rightarrow$ p( 1, 4, 3 )}§
    1439 p(  ,  , 4 );                                   §\C{// rewrite $\Rightarrow$ p( 1, 2, 4 )}§
    1440 p(  ,  ,   );                                   §\C{// rewrite $\Rightarrow$ p( 1, 2, 3 )}§
    1441 \end{cfa}
    1442 Here the missing arguments are inserted from the default values in the parameter list.
    1443 The compiler rewrites missing default values into explicit positional arguments.
    1444 The advantages of default values are:
    1445 \begin{itemize}
    1446 \item
    1447 Routines with a large number of parameters are often very generalized, giving a programmer a number of different options on how a computation is performed.
    1448 For many of these kinds of routines, there are standard or default settings that work for the majority of computations.
    1449 Without default values for parameters, a programmer is forced to specify these common values all the time, resulting in long argument lists that are error prone.
    1450 \item
    1451 When a routine's interface is augmented with new parameters, it extends the interface providing generalizability\footnote{
    1452 ``It should be possible for the implementor of an abstraction to increase its generality.
    1453 So long as the modified abstraction is a generalization of the original, existing uses of the abstraction will not require change.
    1454 It might be possible to modify an abstraction in a manner which is not a generalization without affecting existing uses, but, without inspecting the modules in which the uses occur, this possibility cannot be determined.
    1455 This criterion precludes the addition of parameters, unless these parameters have default or inferred values that are valid for all possible existing applications.''~\cite[p.~128]{Cormack90}}
    1456 (somewhat like the generalization provided by inheritance for classes).
    1457 That is, all existing calls are still valid, although the call must still be recompiled.
    1458 \end{itemize}
    1459 The only disadvantage of default arguments is that unintentional omission of an argument may not result in a compiler-time error.
    1460 Instead, a default value is used, which may not be the programmer's intent.
    1461 
    1462 Default values may only appear in a prototype versus definition context:
    1463 \begin{cfa}
    1464 void p( int x, int y = 2, int z = 3 );          §\C{// prototype: allowed}§
    1465 void p( int, int = 2, int = 3 );                        §\C{// prototype: allowed}§
    1466 void p( int x, int y = 2, int z = 3 ) {}        §\C{// definition: not allowed}§
    1467 \end{cfa}
    1468 The reason for this restriction is to allow separate compilation.
    1469 Multiple prototypes with different default values is an error.
    1470 \end{description}
    1471 
    1472 Ellipse (``...'') arguments present problems when used with default arguments.
    1473 The conflict occurs because both named and ellipse arguments must appear after positional arguments, giving two possibilities:
    1474 \begin{cfa}
    1475 p( /* positional */, ... , /* named */ );
    1476 p( /* positional */, /* named */, ... );
    1477 \end{cfa}
    1478 While it is possible to implement both approaches, the first possibly is more complex than the second, \eg:
    1479 \begin{cfa}
    1480 p( int x, int y, int z, ... );
    1481 p( 1, 4, 5, 6, z : 3, y : 2 ); §\C{// assume p( /* positional */, ... , /* named */ );}§
    1482 p( 1, z : 3, y : 2, 4, 5, 6 ); §\C{// assume p( /* positional */, /* named */, ... );}§
    1483 \end{cfa}
    1484 In the first call, it is necessary for the programmer to conceptually rewrite the call, changing named arguments into positional, before knowing where the ellipse arguments begin.
    1485 Hence, this approach seems significantly more difficult, and hence, confusing and error prone.
    1486 In the second call, the named arguments separate the positional and ellipse arguments, making it trivial to read the call.
    1487 
    1488 The problem is exacerbated with default arguments, \eg:
    1489 \begin{cfa}
    1490 void p( int x, int y = 2, int z = 3... );
    1491 p( 1, 4, 5, 6, z : 3 );         §\C{// assume p( /* positional */, ... , /* named */ );}§
    1492 p( 1, z : 3, 4, 5, 6 );         §\C{// assume p( /* positional */, /* named */, ... );}§
    1493 \end{cfa}
    1494 The first call is an error because arguments 4 and 5 are actually positional not ellipse arguments;
    1495 therefore, argument 5 subsequently conflicts with the named argument z : 3.
    1496 In the second call, the default value for y is implicitly inserted after argument 1 and the named arguments separate the positional and ellipse arguments, making it trivial to read the call.
    1497 For these reasons, \CFA requires named arguments before ellipse arguments.
    1498 Finally, while ellipse arguments are needed for a small set of existing C routines, like printf, the extended \CFA type system largely eliminates the need for ellipse arguments (see Section 24), making much of this discussion moot.
    1499 
    1500 Default arguments and overloading (see Section 24) are complementary.
    1501 While in theory default arguments can be simulated with overloading, as in:
    1502 \begin{quote2}
    1503 \begin{tabular}{@{}l@{\hspace{3em}}l@{}}
    1504 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{default arguments}}   & \multicolumn{1}{c}{\textbf{overloading}}      \\
    1505 \begin{cfa}
    1506 void p( int x, int y = 2, int z = 3 ) {...}
    1507 
    1508 
    1509 \end{cfa}
    1510 &
    1511 \begin{cfa}
    1512 void p( int x, int y, int z ) {...}
    1513 void p( int x ) { p( x, 2, 3 ); }
    1514 void p( int x, int y ) { p( x, y, 3 ); }
    1515 \end{cfa}
    1516 \end{tabular}
    1517 \end{quote2}
    1518 the number of required overloaded routines is linear in the number of default values, which is unacceptable growth.
    1519 In general, overloading should only be used over default arguments if the body of the routine is significantly different.
    1520 Furthermore, overloading cannot handle accessing default arguments in the middle of a positional list, via a missing argument, such as:
    1521 \begin{cfa}
    1522 p( 1, /* default */, 5 );               §\C{// rewrite $\Rightarrow$ p( 1, 2, 5 )}§
    1523 \end{cfa}
    1524 
    1525 Given the \CFA restrictions above, both named and default arguments are backwards compatible.
    1526 \Index*[C++]{\CC{}} only supports default arguments;
    1527 \Index*{Ada} supports both named and default arguments.
    1528 
    1529 
    1530 \section{Unnamed Structure Fields}
    1531 
    1532 C requires each field of a structure to have a name, except for a bit field associated with a basic type, \eg:
    1533 \begin{cfa}
    1534 struct {
    1535         int f1;                                 §\C{// named field}§
    1536         int f2 : 4;                             §\C{// named field with bit field size}§
    1537         int : 3;                                §\C{// unnamed field for basic type with bit field size}§
    1538         int ;                                   §\C{// disallowed, unnamed field}§
    1539         int *;                                  §\C{// disallowed, unnamed field}§
    1540         int (*)( int );                 §\C{// disallowed, unnamed field}§
    1541 };
    1542 \end{cfa}
    1543 This requirement is relaxed by making the field name optional for all field declarations; therefore, all the field declarations in the example are allowed.
    1544 As for unnamed bit fields, an unnamed field is used for padding a structure to a particular size.
    1545 A list of unnamed fields is also supported, \eg:
    1546 \begin{cfa}
    1547 struct {
    1548         int , , ;                               §\C{// 3 unnamed fields}§
    1549 }
    1550 \end{cfa}
    1551 
    1552 
    1553 \section{Nesting}
    1554 
    1555 Nesting of types and routines is useful for controlling name visibility (\newterm{name hiding}).
    1556 
    1557 
    1558 \subsection{Type Nesting}
    1559 
    1560 \CFA allows \Index{type nesting}, and type qualification of the nested types (see \VRef[Figure]{f:TypeNestingQualification}), where as C hoists\index{type hoisting} (refactors) nested types into the enclosing scope and has no type qualification.
    1561 \begin{figure}
    1562 \centering
    1563 \begin{tabular}{@{}l@{\hspace{3em}}l|l@{}}
    1564 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{C Type Nesting}}      & \multicolumn{1}{c}{\textbf{C Implicit Hoisting}}      & \multicolumn{1}{|c}{\textbf{\CFA}}    \\
    1565 \hline
    1566 \begin{cfa}
    1567 struct S {
    1568         enum C { R, G, B };
    1569         struct T {
    1570                 union U { int i, j; };
    1571                 enum C c;
    1572                 short int i, j;
    1573         };
    1574         struct T t;
    1575 } s;
    1576 
    1577 int fred() {
    1578         s.t.c = R;
    1579         struct T t = { R, 1, 2 };
    1580         enum C c;
    1581         union U u;
    1582 }
    1583 \end{cfa}
    1584 &
    1585 \begin{cfa}
    1586 enum C { R, G, B };
    1587 union U { int i, j; };
    1588 struct T {
    1589         enum C c;
    1590         short int i, j;
    1591 };
    1592 struct S {
    1593         struct T t;
    1594 } s;
    1595        
    1596 
    1597 
    1598 
    1599 
    1600 
    1601 
    1602 \end{cfa}
    1603 &
    1604 \begin{cfa}
    1605 struct S {
    1606         enum C { R, G, B };
    1607         struct T {
    1608                 union U { int i, j; };
    1609                 enum C c;
    1610                 short int i, j;
    1611         };
    1612         struct T t;
    1613 } s;
    1614 
    1615 int fred() {
    1616         s.t.c = ®S.®R;  // type qualification
    1617         struct ®S.®T t = { ®S.®R, 1, 2 };
    1618         enum ®S.®C c;
    1619         union ®S.T.®U u;
    1620 }
    1621 \end{cfa}
    1622 \end{tabular}
    1623 \caption{Type Nesting / Qualification}
    1624 \label{f:TypeNestingQualification}
    1625 \end{figure}
    1626 In the left example in C, types ©C©, ©U© and ©T© are implicitly hoisted outside of type ©S© into the containing block scope.
    1627 In the right example in \CFA, the types are not hoisted and accessed using the field-selection operator ``©.©'' for type qualification, as does \Index*{Java}, rather than the \CC type-selection operator ``©::©''.
    1628 
    1629 
    1630 \subsection{Routine Nesting}
    1631 
    1632 While \CFA does not provide object programming by putting routines into structures, it does rely heavily on locally nested routines to redefine operations at or close to a call site.
    1633 For example, the C quick-sort is wrapped into the following polymorphic \CFA routine:
    1634 \begin{cfa}
    1635 forall( otype T | { int ?<?( T, T ); } )
    1636 void qsort( const T * arr, size_t dimension );
    1637 \end{cfa}
    1638 which can be used to sort in ascending and descending order by locally redefining the less-than operator into greater-than.
    1639 \begin{cfa}
    1640 const unsigned int size = 5;
    1641 int ia[size];
    1642 ...                                             §\C{// assign values to array ia}§
    1643 qsort( ia, size );              §\C{// sort ascending order using builtin ?<?}§
    1644 {
    1645         ®int ?<?( int x, int y ) { return x > y; }® §\C{// nested routine}§
    1646         qsort( ia, size );      §\C{// sort descending order by local redefinition}§
    1647 }
    1648 \end{cfa}
    1649 
    1650 Nested routines are not first-class, meaning a nested routine cannot be returned if it has references to variables in its enclosing blocks;
    1651 the only exception is references to the external block of the translation unit, as these variables persist for the duration of the program.
    1652 The following program in undefined in \CFA (and Indexc{gcc})
    1653 \begin{cfa}
    1654 [* [int]( int )] foo() {                §\C{// int (*foo())( int )}§
    1655         int ®i® = 7;
    1656         int bar( int p ) {
    1657                 ®i® += 1;                               §\C{// dependent on local variable}§
    1658                 sout | ®i® | endl;
    1659         }
    1660         return bar;                                     §\C{// undefined because of local dependence}§
    1661 }
    1662 int main() {
    1663         * [int]( int ) fp = foo();      §\C{// int (*fp)( int )}§
    1664         sout | fp( 3 ) | endl;
    1665 }
    1666 \end{cfa}
    1667 because
    1668 
    1669 Currently, there are no \Index{lambda} expressions, \ie unnamed routines because routine names are very important to properly select the correct routine.
    1670 
    1671 
    1672 \section{Tuples}
    1673 
    1674 In C and \CFA, lists of elements appear in several contexts, such as the parameter list for a routine call.
    1675 (More contexts are added shortly.)
    1676 A list of such elements is called a \newterm{lexical list}.
    1677 The general syntax of a lexical list is:
    1678 \begin{cfa}
    1679 [ §\emph{exprlist}§ ]
    1680 \end{cfa}
    1681 where ©$\emph{exprlist}$© is a list of one or more expressions separated by commas.
    1682 The brackets, ©[]©, allow differentiating between lexical lists and expressions containing the C comma operator.
    1683 The following are examples of lexical lists:
    1684 \begin{cfa}
    1685 [ x, y, z ]
    1686 [ 2 ]
    1687 [ v+w, x*y, 3.14159, f() ]
    1688 \end{cfa}
    1689 Tuples are permitted to contain sub-tuples (\ie nesting), such as ©[ [ 14, 21 ], 9 ]©, which is a 2-element tuple whose first element is itself a tuple.
    1690 Note, a tuple is not a record (structure);
    1691 a record denotes a single value with substructure, whereas a tuple is multiple values with no substructure (see flattening coercion in Section 12.1).
    1692 In essence, tuples are largely a compile time phenomenon, having little or no runtime presence.
    1693 
    1694 Tuples can be organized into compile-time tuple variables;
    1695 these variables are of \newterm{tuple type}.
    1696 Tuple variables and types can be used anywhere lists of conventional variables and types can be used.
    1697 The general syntax of a tuple type is:
    1698 \begin{cfa}
    1699 [ §\emph{typelist}§ ]
    1700 \end{cfa}
    1701 where ©$\emph{typelist}$© is a list of one or more legal \CFA or C type specifications separated by commas, which may include other tuple type specifications.
    1702 Examples of tuple types include:
    1703 \begin{cfa}
    1704 [ unsigned int, char ]
    1705 [ double, double, double ]
    1706 [ * int, int * ]                §\C{// mix of CFA and ANSI}§
    1707 [ * [ 5 ] int, * * char, * [ [ int, int ] ] (int, int) ]
    1708 \end{cfa}
    1709 Like tuples, tuple types may be nested, such as ©[ [ int, int ], int ]©, which is a 2-element tuple type whose first element is itself a tuple type.
    1710 
    1711 Examples of declarations using tuple types are:
    1712 \begin{cfa}
    1713 [ int, int ] x;                 §\C{// 2 element tuple, each element of type int}§
    1714 * [ char, char ] y;             §\C{// pointer to a 2 element tuple}§
    1715 [ [ int, int ] ] z ([ int, int ]);
    1716 \end{cfa}
    1717 The last example declares an external routine that expects a 2 element tuple as an input parameter and returns a 2 element tuple as its result.
    1718 
    1719 As mentioned, tuples can appear in contexts requiring a list of value, such as an argument list of a routine call.
    1720 In unambiguous situations, the tuple brackets may be omitted, \eg a tuple that appears as an argument may have its
    1721 square brackets omitted for convenience; therefore, the following routine invocations are equivalent:
    1722 \begin{cfa}
    1723 f( [ 1, x+2, fred() ] );
    1724 f( 1, x+2, fred() );
    1725 \end{cfa}
    1726 Also, a tuple or a tuple variable may be used to supply all or part of an argument list for a routine expecting multiple input parameters or for a routine expecting a tuple as an input parameter.
    1727 For example, the following are all legal:
    1728 \begin{cfa}
    1729 [ int, int ] w1;
    1730 [ int, int, int ] w2;
    1731 [ void ] f (int, int, int); /* three input parameters of type int */
    1732 [ void ] g ([ int, int, int ]); /* 3 element tuple as input */
    1733 f( [ 1, 2, 3 ] );
    1734 f( w1, 3 );
    1735 f( 1, w1 );
    1736 f( w2 );
    1737 g( [ 1, 2, 3 ] );
    1738 g( w1, 3 );
    1739 g( 1, w1 );
    1740 g( w2 );
    1741 \end{cfa}
    1742 Note, in all cases 3 arguments are supplied even though the syntax may appear to supply less than 3. As mentioned, a
    1743 tuple does not have structure like a record; a tuple is simply converted into a list of components.
    1744 \begin{rationale}
    1745 The present implementation of \CFA does not support nested routine calls when the inner routine returns multiple values; \ie a statement such as ©g( f() )© is not supported.
    1746 Using a temporary variable to store the  results of the inner routine and then passing this variable to the outer routine works, however.
    1747 \end{rationale}
    1748 
    1749 A tuple can contain a C comma expression, provided the expression containing the comma operator is enclosed in parentheses.
    1750 For instance, the following tuples are equivalent:
    1751 \begin{cfa}
    1752 [ 1, 3, 5 ]
    1753 [ 1, (2, 3), 5 ]
    1754 \end{cfa}
    1755 The second element of the second tuple is the expression (2, 3), which yields the result 3.
    1756 This requirement is the same as for comma expressions in argument lists.
    1757 
    1758 Type qualifiers, \ie const and volatile, may modify a tuple type.
    1759 The meaning is the same as for a type qualifier modifying an aggregate type [Int99, x 6.5.2.3(7),x 6.7.3(11)], \ie the qualifier is distributed across all of the types in the tuple, \eg:
    1760 \begin{cfa}
    1761 const volatile [ int, float, const int ] x;
    1762 \end{cfa}
    1763 is equivalent to:
    1764 \begin{cfa}
    1765 [ const volatile int, const volatile float, const volatile int ] x;
    1766 \end{cfa}
    1767 Declaration qualifiers can only appear at the start of a \CFA tuple declaration4, \eg:
    1768 \begin{cfa}
    1769 extern [ int, int ] w1;
    1770 static [ int, int, int ] w2;
    1771 \end{cfa}
    1772 \begin{rationale}
    1773 Unfortunately, C's syntax for subscripts precluded treating them as tuples.
    1774 The C subscript list has the form ©[i][j]...© and not ©[i, j, ...]©.
    1775 Therefore, there is no syntactic way for a routine returning multiple values to specify the different subscript values, \eg ©f[g()]© always means a single subscript value because there is only one set of brackets.
    1776 Fixing this requires a major change to C because the syntactic form ©M[i, j, k]© already has a particular meaning: ©i, j, k© is a comma expression.
    1777 \end{rationale}
    1778 
    1779 
    1780 \subsection{Tuple Coercions}
    1781 
    1782 There are four coercions that can be performed on tuples and tuple variables: closing, opening, flattening and structuring.
    1783 In addition, the coercion of dereferencing can be performed on a tuple variable to yield its value(s), as for other variables.
    1784 A \newterm{closing coercion} takes a set of values and converts it into a tuple value, which is a contiguous set of values, as in:
    1785 \begin{cfa}
    1786 [ int, int, int, int ] w;
    1787 w = [ 1, 2, 3, 4 ];
    1788 \end{cfa}
    1789 First the right-hand tuple is closed into a tuple value and then the tuple value is assigned.
    1790 
    1791 An \newterm{opening coercion} is the opposite of closing; a tuple value is converted into a tuple of values, as in:
    1792 \begin{cfa}
    1793 [ a, b, c, d ] = w
    1794 \end{cfa}
    1795 ©w© is implicitly opened to yield a tuple of four values, which are then assigned individually.
    1796 
    1797 A \newterm{flattening coercion} coerces a nested tuple, \ie a tuple with one or more components, which are themselves tuples, into a flattened tuple, which is a tuple whose components are not tuples, as in:
    1798 \begin{cfa}
    1799 [ a, b, c, d ] = [ 1, [ 2, 3 ], 4 ];
    1800 \end{cfa}
    1801 First the right-hand tuple is flattened and then the values are assigned individually.
    1802 Flattening is also performed on tuple types.
    1803 For example, the type ©[ int, [ int, int ], int ]© can be coerced, using flattening, into the type ©[ int, int, int, int ]©.
    1804 
    1805 A \newterm{structuring coercion} is the opposite of flattening;
    1806 a tuple is structured into a more complex nested tuple.
    1807 For example, structuring the tuple ©[ 1, 2, 3, 4 ]© into the tuple ©[ 1, [ 2, 3 ], 4 ]© or the tuple type ©[ int, int, int, int ]© into the tuple type ©[ int, [ int, int ], int ]©.
    1808 In the following example, the last assignment illustrates all the tuple coercions:
    1809 \begin{cfa}
    1810 [ int, int, int, int ] w = [ 1, 2, 3, 4 ];
    1811 int x = 5;
    1812 [ x, w ] = [ w, x ];            §\C{// all four tuple coercions}§
    1813 \end{cfa}
    1814 Starting on the right-hand tuple in the last assignment statement, w is opened, producing a tuple of four values;
    1815 therefore, the right-hand tuple is now the tuple ©[ [ 1, 2, 3, 4 ], 5 ]©.
    1816 This tuple is then flattened, yielding ©[ 1, 2, 3, 4, 5 ]©, which is structured into ©[ 1, [ 2, 3, 4, 5 ] ]© to match the tuple type of the left-hand side.
    1817 The tuple ©[ 2, 3, 4, 5 ]© is then closed to create a tuple value.
    1818 Finally, ©x© is assigned ©1© and ©w© is assigned the tuple value using multiple assignment (see Section 14).
    1819 \begin{rationale}
    1820 A possible additional language extension is to use the structuring coercion for tuples to initialize a complex record with a tuple.
    1821 \end{rationale}
    1822 
    1823 
    1824 \section{Mass Assignment}
    1825 
    1826 \CFA permits assignment to several variables at once using mass assignment~\cite{CLU}.
    1827 Mass assignment has the following form:
    1828 \begin{cfa}
    1829 [ §\emph{lvalue}§, ... , §\emph{lvalue}§ ] = §\emph{expr}§;
    1830 \end{cfa}
    1831 \index{lvalue}
    1832 The left-hand side is a tuple of \emph{lvalues}, which is a list of expressions each yielding an address, \ie any data object that can appear on the left-hand side of a conventional assignment statement.
    1833 ©$\emph{expr}$© is any standard arithmetic expression.
    1834 Clearly, the types of the entities being assigned must be type compatible with the value of the expression.
    1835 
    1836 Mass assignment has parallel semantics, \eg the statement:
    1837 \begin{cfa}
    1838 [ x, y, z ] = 1.5;
    1839 \end{cfa}
    1840 is equivalent to:
    1841 \begin{cfa}
    1842 x = 1.5; y = 1.5; z = 1.5;
    1843 \end{cfa}
    1844 This semantics is not the same as the following in C:
    1845 \begin{cfa}
    1846 x = y = z = 1.5;
    1847 \end{cfa}
    1848 as conversions between intermediate assignments may lose information.
    1849 A more complex example is:
    1850 \begin{cfa}
    1851 [ i, y[i], z ] = a + b;
    1852 \end{cfa}
    1853 which is equivalent to:
    1854 \begin{cfa}
    1855 t = a + b;
    1856 a1 = &i; a2 = &y[i]; a3 = &z;
    1857 *a1 = t; *a2 = t; *a3 = t;
    1858 \end{cfa}
    1859 The temporary ©t© is necessary to store the value of the expression to eliminate conversion issues.
    1860 The temporaries for the addresses are needed so that locations on the left-hand side do not change as the values are assigned.
    1861 In this case, ©y[i]© uses the previous value of ©i© and not the new value set at the beginning of the mass assignment.
    1862 
    1863 
    1864 \section{Multiple Assignment}
    1865 
    1866 \CFA also supports the assignment of several values at once, known as multiple assignment~\cite{CLU,Galletly96}.
    1867 Multiple assignment has the following form:
    1868 \begin{cfa}
    1869 [ §\emph{lvalue}§, ... , §\emph{lvalue}§ ] = [ §\emph{expr}§, ... , §\emph{expr}§ ];
    1870 \end{cfa}
    1871 \index{lvalue}
    1872 The left-hand side is a tuple of \emph{lvalues}, and the right-hand side is a tuple of \emph{expr}s.
    1873 Each \emph{expr} appearing on the right-hand side of a multiple assignment statement is assigned to the corresponding \emph{lvalues} on the left-hand side of the statement using parallel semantics for each assignment.
    1874 An example of multiple assignment is:
    1875 \begin{cfa}
    1876 [ x, y, z ] = [ 1, 2, 3 ];
    1877 \end{cfa}
    1878 Here, the values ©1©, ©2© and ©3© are assigned, respectively, to the variables ©x©, ©y© and ©z©.
    1879  A more complex example is:
    1880 \begin{cfa}
    1881 [ i, y[ i ], z ] = [ 1, i, a + b ];
    1882 \end{cfa}
    1883 Here, the values ©1©, ©i© and ©a + b© are assigned to the variables ©i©, ©y[i]© and ©z©, respectively.
    1884  Note, the parallel semantics of
    1885 multiple assignment ensures:
    1886 \begin{cfa}
    1887 [ x, y ] = [ y, x ];
    1888 \end{cfa}
    1889 correctly interchanges (swaps) the values stored in ©x© and ©y©.
    1890 The following cases are errors:
    1891 \begin{cfa}
    1892 [ a, b, c ] = [ 1, 2, 3, 4 ];
    1893 [ a, b, c ] = [ 1, 2 ];
    1894 \end{cfa}
    1895 because the number of entities in the left-hand tuple is unequal with the right-hand tuple.
    1896 
    1897 As for all tuple contexts in C, side effects should not be used because C does not define an ordering for the evaluation of the elements of a tuple;
    1898 both these examples produce indeterminate results:
    1899 \begin{cfa}
    1900 f( x++, x++ );                          §\C{// C routine call with side effects in arguments}§
    1901 [ v1, v2 ] = [ x++, x++ ];      §\C{// side effects in righthand side of multiple assignment}§
    1902 \end{cfa}
    1903 
    1904 
    1905 \section{Cascade Assignment}
    1906 
    1907 As in C, \CFA mass and multiple assignments can be cascaded, producing cascade assignment.
    1908 Cascade assignment has the following form:
    1909 \begin{cfa}
    1910 §\emph{tuple}§ = §\emph{tuple}§ = ... = §\emph{tuple}§;
    1911 \end{cfa}
    1912 and it has the same parallel semantics as for mass and multiple assignment.
    1913 Some examples of cascade assignment are:
    1914 \begin{cfa}
    1915 x1 = y1 = x2 = y2 = 0;
    1916 [ x1, y1 ] = [ x2, y2 ] = [ x3, y3 ];
    1917 [ x1, y1 ] = [ x2, y2 ] = 0;
    1918 [ x1, y1 ] = z = 0;
    1919 \end{cfa}
    1920 As in C, the rightmost assignment is performed first, \ie assignment parses right to left.
    1921 
    1922 
    1923 \section{Field Tuples}
    1924 
    1925 Tuples may be used to select multiple fields of a record by field name.
    1926 Its general form is:
    1927 \begin{cfa}
    1928 §\emph{expr}§ . [ §\emph{fieldlist}§ ]
    1929 §\emph{expr}§ -> [ §\emph{fieldlist}§ ]
    1930 \end{cfa}
    1931 \emph{expr} is any expression yielding a value of type record, \eg ©struct©, ©union©.
    1932 Each element of \emph{ fieldlist} is an element of the record specified by \emph{expr}.
    1933 A record-field tuple may be used anywhere a tuple can be used. An example of the use of a record-field tuple is
    1934 the following:
    1935 \begin{cfa}
    1936 struct s {
    1937         int f1, f2;
    1938         char f3;
    1939         double f4;
    1940 } v;
    1941 v.[ f3, f1, f2 ] = ['x', 11, 17 ];      §\C{// equivalent to v.f3 = 'x', v.f1 = 11, v.f2 = 17}§
    1942 f( v.[ f3, f1, f2 ] );                          §\C{// equivalent to f( v.f3, v.f1, v.f2 )}§
    1943 \end{cfa}
    1944 Note, the fields appearing in a record-field tuple may be specified in any order;
    1945 also, it is unnecessary to specify all the fields of a struct in a multiple record-field tuple.
    1946 
    1947 If a field of a ©struct© is itself another ©struct©, multiple fields of this subrecord can be specified using a nested record-field tuple, as in the following example:
    1948 \begin{cfa}
    1949 struct inner {
    1950         int f2, f3;
    1951 };
    1952 struct outer {
    1953         int f1;
    1954         struct inner i;
    1955         double f4;
    1956 } o;
    1957 
    1958 o.[ f1, i.[ f2, f3 ], f4 ] = [ 11, 12, 13, 3.14159 ];
    1959 \end{cfa}
    1960 
    1961 
    1962 \section{Labelled Continue/Break}
     501\section{Exponentiation Operator}
     502
     503C, \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.
     504\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$.
     505The 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)©.
     506
     507As for \Index{division}, there are exponentiation operators for integral and floating-point types, including the builtin \Index{complex} types.
     508Unsigned integral exponentiation\index{exponentiation!unsigned integral} is performed with repeated multiplication (or shifting if the base is 2).
     509Signed integral exponentiation\index{exponentiation!signed integral} is performed with repeated multiplication (or shifting if the base is 2), but yields a floating-point result because $b^{-e}=1/b^e$.
     510Hence, 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.
     511Floating-point exponentiation\index{exponentiation!floating point} is performed using \Index{logarithm}s\index{exponentiation!logarithm}, so the base cannot be negative.
     512\begin{cfa}
     513sout | 2 ®\® 8u | 4 ®\® 3u | -4 ®\® 3u | 4 ®\® -3 | -4 ®\® -3 | 4.0 ®\® 2.1 | (1.0f+2.0fi) ®\® (3.0f+2.0fi) | endl;
     514256 64 -64 0.015625 -0.015625 18.3791736799526 0.264715-1.1922i
     515\end{cfa}
     516Parenthesis are necessary for the complex constants or the expresion is parsed as ©1.0f+(2.0fi \ 3.0f)+2.0fi©.
     517The exponentiation operator is available for all the basic types, but for user-defined types, only the integral version is available, if the user type defines multiplication, ©*©, and one, ©1©.
     518
     519
     520\section{\texorpdfstring{Labelled \LstKeywordStyle{continue} / \LstKeywordStyle{break}}{Labelled continue / break}}
    1963521
    1964522While C provides ©continue© and ©break© statements for altering control flow, both are restricted to one level of nesting for a particular control structure.
    1965523Unfortunately, this restriction forces programmers to use \Indexc{goto} to achieve the equivalent control-flow for more than one level of nesting.
    1966 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,Java}.
     524To 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}.
    1967525For both ©continue© and ©break©, the target label must be directly associated with a ©for©, ©while© or ©do© statement;
    1968526for ©break©, the target label can also be associated with a ©switch©, ©if© or compound (©{}©) statement.
    1969527\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©.
    1970528The innermost loop has 7 exit points, which cause resumption or termination of one or more of the 7 \Index{nested control-structure}s.
     529Java supports both labelled ©continue© and ©break© statements.
    1971530
    1972531\begin{figure}
     
    2091650
    2092651
    2093 \section{Switch Statement}
     652\section{\texorpdfstring{\LstKeywordStyle{switch} Statement}{switch Statement}}
    2094653
    2095654C allows a number of questionable forms for the ©switch© statement:
     
    2132691        ®// open input file
    2133692®} else if ( argc == 2 ) {
    2134         ®// open input file
     693        ®// open input file (duplicate)
    2135694
    2136695®} else {
     
    2145704\begin{cfa}
    2146705switch ( i ) {
    2147   case 1: case 3: case 5:       // odd values
    2148         // same action
     706  ®case 1: case 3: case 5:®     // odd values
     707        // odd action
    2149708        break;
    2150   case 2: case 4: case 6:       // even values
    2151         // same action
     709  ®case 2: case 4: case 6:®     // even values
     710        // even action
    2152711        break;
    2153712}
     
    2155714However, this situation is handled in other languages without fall-through by allowing a list of case values.
    2156715While fall-through itself is not a problem, the problem occurs when fall-through is the default, as this semantics is unintuitive to many programmers and is different from virtually all other programming languages with a ©switch© statement.
    2157 Hence, default fall-through semantics results in a large number of programming errors as programmers often forget the ©break© statement at the end of a ©case© clause, resulting in inadvertent fall-through.
     716Hence, default fall-through semantics results in a large number of programming errors as programmers often \emph{forget} the ©break© statement at the end of a ©case© clause, resulting in inadvertent fall-through.
    2158717
    2159718\item
     
    2239798and there is only a medium amount of fall-through from one ©case© clause to the next, and most of these result from a list of case values executing common code, rather than a sequence of case actions that compound.
    2240799\end{itemize}
    2241 These observations help to put the \CFA changes to the ©switch© into perspective.
     800These observations put into perspective the \CFA changes to the ©switch©.
    2242801\begin{enumerate}
    2243802\item
     
    2249808still works.
    2250809Nevertheless, reversing the default action would have a non-trivial effect on case actions that compound, such as the above example of processing shell arguments.
    2251 Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called ©choose©, with no implicit fall-through semantics and an explicit fall-through if the last statement of a case-clause ends with the new keyword ©fallthrough©/©fallthru©, e.g.:
     810Therefore, to preserve backwards compatibility, it is necessary to introduce a new kind of ©switch© statement, called ©choose©, with no implicit fall-through semantics and an explicit fall-through if the last statement of a case-clause ends with the new keyword ©fallthrough©/©fallthru©, \eg:
    2252811\begin{cfa}
    2253812®choose® ( i ) {
     
    2260819  case 7:
    2261820        ...
    2262         ®break®                                         §\C{// explicit end of switch}§
     821        ®break®                                         §\C{// redundant explicit end of switch}§
    2263822  default:
    2264823        j = 3;
     
    2266825\end{cfa}
    2267826Like the ©switch© statement, the ©choose© statement retains the fall-through semantics for a list of ©case© clauses;
    2268 the implicit ©break© is applied only at the end of the \emph{statements} following a ©case© clause.
    2269 The explicit ©fallthru© is retained because it is a C-idiom most C programmers expect, and its absence might discourage programmers from using the ©choose© statement.
     827An implicit ©break© is applied only at the end of the \emph{statements} following a ©case© clause.
     828An explicit ©fallthru© is retained because it is a C-idiom most C programmers expect, and its absence might discourage programmers from using the ©choose© statement.
    2270829As well, allowing an explicit ©break© from the ©choose© is a carry over from the ©switch© statement, and expected by C programmers.
    2271830\item
     
    2296855
    2297856
    2298 \section{Case Clause}
     857\section{\texorpdfstring{\LstKeywordStyle{case} Clause}{case Clause}}
    2299858
    2300859C restricts the ©case© clause of a ©switch© statement to a single value.
     
    2372931
    2373932
     933\section{\texorpdfstring{\LstKeywordStyle{with} Clause / Statement}{with Clause / Statement}}
     934\label{s:WithClauseStatement}
     935
     936In \Index{object-oriented} programming, there is an implicit first parameter, often names \textbf{©self©} or \textbf{©this©}, which is elided.
     937\begin{C++}
     938class C {
     939        int i, j;
     940        int mem() {              ®// implicit "this" parameter
     941®               i = 1;          ®// this->i
     942®               j = 3;          ®// this->j
     943®       }
     944}
     945\end{C++}
     946Since CFA is non-object-oriented, the equivalent object-oriented program looks like:
     947\begin{cfa}
     948struct S { int i, j; };
     949int mem( S &this ) {    // explicit "this" parameter
     950        ®this.®i = 1;                     // "this" is not elided
     951        ®this.®j = 2;
     952}
     953\end{cfa}
     954but it is cumbersome having to write "©this.©" many times in a member.
     955
     956\CFA provides a ©with© clause/statement to elided the "©this.©" by opening a scope containing field identifiers and changing the qualified fields into variables, giving an opportunity for optimizing qualified references.\footnote{
     957The ©with© statement comes from Pascal~\cite[\S~4.F]{Pascal}.}
     958\begin{cfa}
     959int mem( S &this ) ®with this® {
     960        i = 1;                  ®// this.i
     961®       j = 2;                  ®// this.j
     962®}
     963\end{cfa}
     964which extends to multiple routine parameters:
     965\begin{cfa}
     966struct T { double m, n; };
     967int mem2( S &this1, T &this2 ) ®with this1, this2® {
     968        i = 1; j = 2;
     969        m = 1.0; n = 2.0;
     970}
     971\end{cfa}
     972
     973The statement form is used within a block:
     974\begin{cfa}
     975int foo() {
     976        struct S1 { ... } s1;
     977        struct S2 { ... } s2;
     978        ®with s1® {
     979                // access fields of s1 without qualification
     980                ®with s2® {  // nesting
     981                        // access fields of s1 and s2 without qualification
     982                }
     983        }
     984        ®with s1, s2® {
     985                // access unambiguous fields of s1 and s2 without qualification
     986        }
     987}
     988\end{cfa}
     989
     990When opening multiple structures, fields with the same name and type are ambiguous and must be fully qualified.
     991For fields with the same name but different type, context/cast can be used to disambiguate.
     992\begin{cfa}
     993struct S { int i; int j; double m; } a, c;
     994struct T { int i; int k; int m } b, c;
     995®with a, b® {
     996        j + k;                                          §\C{// unambiguous, unique names define unique type}§
     997        i;                                                      §\C{// ambiguous, same name and type}§
     998        a.i + b.i;                                      §\C{// unambiguous, qualification defines unique type}§
     999        m;                                                      §\C{// ambiguous, no context to define unique type}§
     1000        m = 5.0;                                        §\C{// unambiguous, context defines unique type}§
     1001        m = 1;                                          §\C{// unambiguous, context defines unique type}§
     1002}
     1003®with c® { ... }                                §\C{// ambiguous, no context}§
     1004®with (S)c® { ... }                             §\C{// unambiguous, cast defines unique type}§
     1005\end{cfa}
     1006
     1007
    23741008\section{Exception Handling}
     1009\label{s:ExceptionHandling}
    23751010
    23761011Exception handling provides two mechanism: change of control flow from a raise to a handler, and communication from the raise to the handler.
    2377 \begin{cfa}
    2378 exception void h( int i );
    2379 exception int h( int i, double d );
    2380 
     1012Transfer of control can be local, within a routine, or non-local, among routines.
     1013Non-local transfer can cause stack unwinding, i.e., non-local routine termination, depending on the kind of raise.
     1014\begin{cfa}
     1015exception_t E {};                               §\C{// exception type}§
    23811016void f(...) {
    2382         ... throw h( 3 );
    2383         ... i = resume h( 3, 5.1 );
    2384 }
    2385 
     1017        ... throw E{}; ...                      §\C{// termination}§
     1018        ... throwResume E{}; ...        §\C{// resumption}§
     1019}
    23861020try {
    23871021        f(...);
    2388 } catch h( int w ) {
    2389         // reset
    2390 } resume h( int p, double x ) {
    2391         return 17;  // recover
     1022} catch( E e : §boolean-predicate§ ) {                  §\C{// termination handler}§
     1023        // recover and continue
     1024} catchResume( E e : §boolean-predicate§ ) {    §\C{// resumption handler}§
     1025        // repair and return
    23921026} finally {
    2393 }
    2394 \end{cfa}
    2395 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.
    2396 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.
     1027        // always executed
     1028}
     1029\end{cfa}
     1030The kind of raise and handler match: ©throw© with ©catch© and @throwResume@ with @catchResume@.
     1031Then the exception type must match along with any additonal predicate must be true.
     1032The ©catch© and ©catchResume© handlers may appear in any oder.
     1033However, the ©finally© clause must
     1034
     1035
     1036\subsection{Exception Hierarchy}
     1037
     1038An exception type can be derived from another exception type, just like deriving a subclass from a class, providing a kind of polymorphism among exception types.
     1039The exception-type hierarchy that is created is used to organize exception types, similar to a class hierarchy in object-oriented languages, \eg:
     1040\begin{center}
     1041\input{EHMHierarchy}
     1042\end{center}
     1043A programmer can then choose to handle an exception at different degrees of specificity along the hierarchy;
     1044derived exception-types support a more flexible programming style.
     1045For example, higher-level code should catch general exceptions to reduce coupling to the specific implementation at the lower levels;
     1046unnecessary coupling may force changes in higher-level code when low-level code changes.
     1047A consequence of derived exception-types is that multiple exceptions may match, \eg:
     1048\begin{cfa}
     1049catch( Arithmetic )
     1050\end{cfa}
     1051matches all three derived exception-types: ©DivideByZero©, ©Overflow©, and ©Underflow©.
     1052Because the propagation mechanisms perform a simple linear search of the handler clause for a guarded block, and selects the first matching handler, the order of catch clauses in the handler clause becomes important, \eg:
     1053\begin{cfa}
     1054try {
     1055        ...
     1056} catch( Overflow ) {   // must appear first
     1057        // handle overflow
     1058} catch( Arithmetic )
     1059        // handle other arithmetic issues
     1060}
     1061\end{cfa}
     1062\newterm{Multiple derivation} among exception is not supported.
     1063
     1064
     1065\section{Declarations}
     1066\label{s:Declarations}
     1067
     1068C declaration syntax is notoriously confusing and error prone.
     1069For example, many C programmers are confused by a declaration as simple as:
     1070\begin{quote2}
     1071\begin{tabular}{@{}ll@{}}
     1072\begin{cfa}
     1073int * x[5]
     1074\end{cfa}
     1075&
     1076\raisebox{-0.75\totalheight}{\input{Cdecl}}
     1077\end{tabular}
     1078\end{quote2}
     1079Is this an array of 5 pointers to integers or a \Index{pointer} to an array of 5 integers?
     1080The fact this declaration is unclear to many C programmers means there are \Index{productivity} and \Index{safety} issues even for basic programs.
     1081Another example of confusion results from the fact that a routine name and its parameters are embedded within the return type, mimicking the way the return value is used at the routine's call site.
     1082For example, a routine returning a \Index{pointer} to an array of integers is defined and used in the following way:
     1083\begin{cfa}
     1084int ®(*®f®())[®5®]® {...};                              §\C{definition}§
     1085 ... ®(*®f®())[®3®]® += 1;                              §\C{usage}§
     1086\end{cfa}
     1087Essentially, the return type is wrapped around the routine name in successive layers (like an \Index{onion}).
     1088While attempting to make the two contexts consistent is a laudable goal, it has not worked out in practice.
     1089
     1090\CFA provides its own type, variable and routine declarations, using a different syntax.
     1091The new declarations place qualifiers to the left of the base type, while C declarations place qualifiers to the right of the base type.
     1092In the following example, \R{red} is the base type and \B{blue} is qualifiers.
     1093The \CFA declarations move the qualifiers to the left of the base type, \ie move the blue to the left of the red, while the qualifiers have the same meaning but are ordered left to right to specify a variable's type.
     1094\begin{quote2}
     1095\begin{tabular}{@{}l@{\hspace{3em}}l@{}}
     1096\multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c}{\textbf{C}}        \\
     1097\begin{cfa}
     1098ß[5] *ß ®int® x1;
     1099ß* [5]ß ®int® x2;
     1100ß[* [5] int]ß f®( int p )®;
     1101\end{cfa}
     1102&
     1103\begin{cfa}
     1104®int® ß*ß x1 ß[5]ß;
     1105®int® ß(*ßx2ß)[5]ß;
     1106ßint (*ßf®( int p )®ß)[5]ß;
     1107\end{cfa}
     1108\end{tabular}
     1109\end{quote2}
     1110The only exception is \Index{bit field} specification, which always appear to the right of the base type.
     1111% Specifically, the character ©*© is used to indicate a pointer, square brackets ©[©\,©]© are used to represent an array or function return value, and parentheses ©()© are used to indicate a routine parameter.
     1112However, unlike C, \CFA type declaration tokens are distributed across all variables in the declaration list.
     1113For instance, variables ©x© and ©y© of type \Index{pointer} to integer are defined in \CFA as follows:
     1114\begin{quote2}
     1115\begin{tabular}{@{}l@{\hspace{3em}}l@{}}
     1116\multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c}{\textbf{C}}        \\
     1117\begin{cfa}
     1118®*® int x, y;
     1119\end{cfa}
     1120&
     1121\begin{cfa}
     1122int ®*®x, ®*®y;
     1123\end{cfa}
     1124\end{tabular}
     1125\end{quote2}
     1126The downside of this semantics is the need to separate regular and \Index{pointer} declarations:
     1127\begin{quote2}
     1128\begin{tabular}{@{}l@{\hspace{3em}}l@{}}
     1129\multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c}{\textbf{C}}        \\
     1130\begin{cfa}
     1131®*® int x;
     1132int y;
     1133\end{cfa}
     1134&
     1135\begin{cfa}
     1136int ®*®x, y;
     1137
     1138\end{cfa}
     1139\end{tabular}
     1140\end{quote2}
     1141which is \Index{prescribing} a safety benefit.
     1142Other examples are:
     1143\begin{quote2}
     1144\begin{tabular}{@{}l@{\hspace{3em}}l@{\hspace{2em}}l@{}}
     1145\multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c@{\hspace{2em}}}{\textbf{C}} \\
     1146\begin{cfa}
     1147[ 5 ] int z;
     1148[ 5 ] * char w;
     1149* [ 5 ] double v;
     1150struct s {
     1151        int f0:3;
     1152        * int f1;
     1153        [ 5 ] * int f2;
     1154};
     1155\end{cfa}
     1156&
     1157\begin{cfa}
     1158int z[ 5 ];
     1159char * w[ 5 ];
     1160double (* v)[ 5 ];
     1161struct s {
     1162        int f0:3;
     1163        int * f1;
     1164        int * f2[ 5 ]
     1165};
     1166\end{cfa}
     1167&
     1168\begin{cfa}
     1169// array of 5 integers
     1170// array of 5 pointers to char
     1171// pointer to array of 5 doubles
     1172
     1173// common bit field syntax
     1174
     1175
     1176
     1177\end{cfa}
     1178\end{tabular}
     1179\end{quote2}
     1180
     1181All type qualifiers, \eg ©const©, ©volatile©, etc., are used in the normal way with the new declarations and also appear left to right, \eg:
     1182\begin{quote2}
     1183\begin{tabular}{@{}l@{\hspace{1em}}l@{\hspace{1em}}l@{}}
     1184\multicolumn{1}{c@{\hspace{1em}}}{\textbf{\CFA}}        & \multicolumn{1}{c@{\hspace{1em}}}{\textbf{C}} \\
     1185\begin{cfa}
     1186const * const int x;
     1187const * [ 5 ] const int y;
     1188\end{cfa}
     1189&
     1190\begin{cfa}
     1191int const * const x;
     1192const int (* const y)[ 5 ]
     1193\end{cfa}
     1194&
     1195\begin{cfa}
     1196// const pointer to const integer
     1197// const pointer to array of 5 const integers
     1198\end{cfa}
     1199\end{tabular}
     1200\end{quote2}
     1201All declaration qualifiers, \eg ©extern©, ©static©, etc., are used in the normal way with the new declarations but can only appear at the start of a \CFA routine declaration,\footnote{\label{StorageClassSpecifier}
     1202The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.~\cite[\S~6.11.5(1)]{C11}} \eg:
     1203\begin{quote2}
     1204\begin{tabular}{@{}l@{\hspace{3em}}l@{\hspace{2em}}l@{}}
     1205\multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c@{\hspace{2em}}}{\textbf{C}} \\
     1206\begin{cfa}
     1207extern [ 5 ] int x;
     1208static * const int y;
     1209\end{cfa}
     1210&
     1211\begin{cfa}
     1212int extern x[ 5 ];
     1213const int static * y;
     1214\end{cfa}
     1215&
     1216\begin{cfa}
     1217// externally visible array of 5 integers
     1218// internally visible pointer to constant int
     1219\end{cfa}
     1220\end{tabular}
     1221\end{quote2}
     1222
     1223The new declaration syntax can be used in other contexts where types are required, \eg casts and the pseudo-routine ©sizeof©:
     1224\begin{quote2}
     1225\begin{tabular}{@{}l@{\hspace{3em}}l@{}}
     1226\multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c}{\textbf{C}}        \\
     1227\begin{cfa}
     1228y = (®* int®)x;
     1229i = sizeof(®[ 5 ] * int®);
     1230\end{cfa}
     1231&
     1232\begin{cfa}
     1233y = (®int *®)x;
     1234i = sizeof(®int * [ 5 ]®);
     1235\end{cfa}
     1236\end{tabular}
     1237\end{quote2}
     1238
     1239Finally, new \CFA declarations may appear together with C declarations in the same program block, but cannot be mixed within a specific declaration.
     1240Therefore, a programmer has the option of either continuing to use traditional C declarations or take advantage of the new style.
     1241Clearly, both styles need to be supported for some time due to existing C-style header-files, particularly for UNIX systems.
     1242
     1243
     1244\section{Pointer / Reference}
     1245
     1246C provides a \newterm{pointer type};
     1247\CFA adds a \newterm{reference type}.
     1248These types may be derived from an object or routine type, called the \newterm{referenced type}.
     1249Objects of these types contain an \newterm{address}, which is normally a location in memory, but may also address memory-mapped registers in hardware devices.
     1250An integer constant expression with the value 0, or such an expression cast to type ©void *©, is called a \newterm{null-pointer constant}.\footnote{
     1251One 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;
     1252\ie the null pointer is guaranteed to compare unequal to a pointer to any object or routine.}
     1253An 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.
     1254Dereferencing an \newterm{unsound} address, including the null pointer, is \Index{undefined}, often resulting in a \Index{memory fault}.
     1255
     1256A program \newterm{object} is a region of data storage in the execution environment, the contents of which can represent values.
     1257In most cases, objects are located in memory at an address, and the variable name for an object is an implicit address to the object generated by the compiler and automatically dereferenced, as in:
     1258\begin{quote2}
     1259\begin{tabular}{@{}ll@{\hspace{2em}}l@{}}
     1260\begin{cfa}
     1261int x;
     1262x = 3;
     1263int y;
     1264y = x;
     1265\end{cfa}
     1266&
     1267\raisebox{-0.45\totalheight}{\input{pointer1}}
     1268&
     1269\begin{cfa}
     1270int * ®const® x = (int *)100
     1271*x = 3;                 // implicit dereference
     1272int * ®const® y = (int *)104;
     1273*y = *x;                // implicit dereference
     1274\end{cfa}
     1275\end{tabular}
     1276\end{quote2}
     1277where the right example is how the compiler logically interprets the variables in the left example.
     1278Since a variable name only points to one address during its lifetime, it is an \Index{immutable} \Index{pointer};
     1279hence, the implicit type of pointer variables ©x© and ©y© are constant pointers in the compiler interpretation.
     1280In general, variable addresses are stored in instructions instead of loaded from memory, and hence may not occupy storage.
     1281These approaches are contrasted in the following:
     1282\begin{quote2}
     1283\begin{tabular}{@{}l|l@{}}
     1284\multicolumn{1}{c|}{explicit variable address} & \multicolumn{1}{c}{implicit variable address} \\
     1285\hline
     1286\begin{cfa}
     1287lda             r1,100                  // load address of x
     1288ld               r2,(r1)                  // load value of x
     1289lda             r3,104                  // load address of y
     1290st               r2,(r3)                  // store x into y
     1291\end{cfa}
     1292&
     1293\begin{cfa}
     1294
     1295ld              r2,(100)                // load value of x
     1296
     1297st              r2,(104)                // store x into y
     1298\end{cfa}
     1299\end{tabular}
     1300\end{quote2}
     1301Finally, the immutable nature of a variable's address and the fact that there is no storage for the variable pointer means pointer assignment\index{pointer!assignment}\index{assignment!pointer} is impossible.
     1302Therefore, the expression ©x = y© has only one meaning, ©*x = *y©, \ie manipulate values, which is why explicitly writing the dereferences is unnecessary even though it occurs implicitly as part of \Index{instruction decoding}.
     1303
     1304A \Index{pointer}/\Index{reference} object is a generalization of an object variable-name, \ie a mutable address that can point to more than one memory location during its lifetime.
     1305(Similarly, an integer variable can contain multiple integer literals during its lifetime versus an integer constant representing a single literal during its lifetime, and like a variable name, may not occupy storage if the literal is embedded directly into instructions.)
     1306Hence, a pointer occupies memory to store its current address, and the pointer's value is loaded by dereferencing, \eg:
     1307\begin{quote2}
     1308\begin{tabular}{@{}l@{\hspace{2em}}l@{}}
     1309\begin{cfa}
     1310int x, y, ®*® p1, ®*® p2, ®**® p3;
     1311p1 = ®&®x;               // p1 points to x
     1312p2 = p1;                 // p2 points to x
     1313p1 = ®&®y;               // p1 points to y
     1314p3 = &p2;               // p3 points to p2
     1315\end{cfa}
     1316&
     1317\raisebox{-0.5\totalheight}{\input{pointer2.pstex_t}}
     1318\end{tabular}
     1319\end{quote2}
     1320
     1321Notice, an address has a \Index{duality}\index{address!duality}: a location in memory or the value at that location.
     1322In many cases, a compiler might be able to infer the best meaning for these two cases.
     1323For example, \Index*{Algol68}~\cite{Algol68} infers pointer dereferencing to select the best meaning for each pointer usage
     1324\begin{cfa}
     1325p2 = p1 + x;                                    §\C{// compiler infers *p2 = *p1 + x;}§
     1326\end{cfa}
     1327Algol68 infers the following dereferencing ©*p2 = *p1 + x©, because adding the arbitrary integer value in ©x© to the address of ©p1© and storing the resulting address into ©p2© is an unlikely operation.
     1328Unfortunately, automatic dereferencing does not work in all cases, and so some mechanism is necessary to fix incorrect choices.
     1329
     1330Rather than inferring dereference, most programming languages pick one implicit dereferencing semantics, and the programmer explicitly indicates the other to resolve address-duality.
     1331In C, objects of pointer type always manipulate the pointer object's address:
     1332\begin{cfa}
     1333p1 = p2;                                                §\C{// p1 = p2\ \ rather than\ \ *p1 = *p2}§
     1334p2 = p1 + x;                                    §\C{// p2 = p1 + x\ \ rather than\ \ *p2 = *p1 + x}§
     1335\end{cfa}
     1336even though the assignment to ©p2© is likely incorrect, and the programmer probably meant:
     1337\begin{cfa}
     1338p1 = p2;                                                §\C{// pointer address assignment}§
     1339®*®p2 = ®*®p1 + x;                              §\C{// pointed-to value assignment / operation}§
     1340\end{cfa}
     1341The C semantics work well for situations where manipulation of addresses is the primary meaning and data is rarely accessed, such as storage management (©malloc©/©free©).
     1342
     1343However, in most other situations, the pointed-to value is requested more often than the pointer address.
     1344\begin{cfa}
     1345*p2 = ((*p1 + *p2) * (**p3 - *p1)) / (**p3 - 15);
     1346\end{cfa}
     1347In this case, it is tedious to explicitly write the dereferencing, and error prone when pointer arithmetic is allowed.
     1348It is better to have the compiler generate the dereferencing and have no implicit pointer arithmetic:
     1349\begin{cfa}
     1350p2 = ((p1 + p2) * (p3 - p1)) / (p3 - 15);
     1351\end{cfa}
     1352
     1353To support this common case, a reference type is introduced in \CFA, denoted by ©&©, which is the opposite dereference semantics to a pointer type, making the value at the pointed-to location the implicit semantics for dereferencing (similar but not the same as \CC \Index{reference type}s).
     1354\begin{cfa}
     1355int x, y, ®&® r1, ®&® r2, ®&&® r3;
     1356®&®r1 = &x;                                             §\C{// r1 points to x}§
     1357®&®r2 = &r1;                                    §\C{// r2 points to x}§
     1358®&®r1 = &y;                                             §\C{// r1 points to y}§
     1359®&&®r3 = ®&®&r2;                                §\C{// r3 points to r2}§
     1360r2 = ((r1 + r2) * (r3 - r1)) / (r3 - 15); §\C{// implicit dereferencing}§
     1361\end{cfa}
     1362Except for auto-dereferencing by the compiler, this reference example is the same as the previous pointer example.
     1363Hence, a reference behaves like the variable name for the current variable it is pointing-to.
     1364One way to conceptualize a reference is via a rewrite rule, where the compiler inserts a dereference operator before the reference variable for each reference qualifier in a declaration, so the previous example becomes:
     1365\begin{cfa}
     1366®*®r2 = ((®*®r1 + ®*®r2) ®*® (®**®r3 - ®*®r1)) / (®**®r3 - 15);
     1367\end{cfa}
     1368When a reference operation appears beside a dereference operation, \eg ©&*©, they cancel out.
     1369However, in C, the cancellation always yields a value (\Index{rvalue}).\footnote{
     1370The unary ©&© operator yields the address of its operand.
     1371If the operand has type ``type'', the result has type ``pointer to type''.
     1372If the operand is the result of a unary ©*© operator, neither that operator nor the ©&© operator is evaluated and the result is as if both were omitted, except that the constraints on the operators still apply and the result is not an lvalue.~\cite[\S~6.5.3.2--3]{C11}}
     1373For a \CFA reference type, the cancellation on the left-hand side of assignment leaves the reference as an address (\Index{lvalue}):
     1374\begin{cfa}
     1375(&®*®)r1 = &x;                                  §\C{// (\&*) cancel giving address in r1 not variable pointed-to by r1}§
     1376\end{cfa}
     1377Similarly, the address of a reference can be obtained for assignment or computation (\Index{rvalue}):
     1378\begin{cfa}
     1379(&(&®*®)®*®)r3 = &(&®*®)r2;             §\C{// (\&*) cancel giving address in r2, (\&(\&*)*) cancel giving address in r3}§
     1380\end{cfa}
     1381Cancellation\index{cancellation!pointer/reference}\index{pointer!cancellation} works to arbitrary depth.
     1382
     1383Fundamentally, pointer and reference objects are functionally interchangeable because both contain addresses.
     1384\begin{cfa}
     1385int x, *p1 = &x, **p2 = &p1, ***p3 = &p2,
     1386                 &r1 = x,    &&r2 = r1,   &&&r3 = r2;
     1387***p3 = 3;                                              §\C{// change x}§
     1388r3 = 3;                                                 §\C{// change x, ***r3}§
     1389**p3 = ...;                                             §\C{// change p1}§
     1390&r3 = ...;                                              §\C{// change r1, (\&*)**r3, 1 cancellation}§
     1391*p3 = ...;                                              §\C{// change p2}§
     1392&&r3 = ...;                                             §\C{// change r2, (\&(\&*)*)*r3, 2 cancellations}§
     1393&&&r3 = p3;                                             §\C{// change r3 to p3, (\&(\&(\&*)*)*)r3, 3 cancellations}§
     1394\end{cfa}
     1395Furthermore, both types are equally performant, as the same amount of dereferencing occurs for both types.
     1396Therefore, the choice between them is based solely on whether the address is dereferenced frequently or infrequently, which dictates the amount of implicit dereferencing aid from the compiler.
     1397
     1398As for a pointer type, a reference type may have qualifiers:
     1399\begin{cfa}
     1400const int cx = 5;                                       §\C{// cannot change cx;}§
     1401const int & cr = cx;                            §\C{// cannot change what cr points to}§
     1402®&®cr = &cx;                                            §\C{// can change cr}§
     1403cr = 7;                                                         §\C{// error, cannot change cx}§
     1404int & const rc = x;                                     §\C{// must be initialized}§
     1405®&®rc = &x;                                                     §\C{// error, cannot change rc}§
     1406const int & const crc = cx;                     §\C{// must be initialized}§
     1407crc = 7;                                                        §\C{// error, cannot change cx}§
     1408®&®crc = &cx;                                           §\C{// error, cannot change crc}§
     1409\end{cfa}
     1410Hence, for type ©& const©, there is no pointer assignment, so ©&rc = &x© is disallowed, and \emph{the address value cannot be the null pointer unless an arbitrary pointer is coerced\index{coercion} into the reference}:
     1411\begin{cfa}
     1412int & const cr = *0;                            §\C{// where 0 is the int * zero}§
     1413\end{cfa}
     1414Note, constant reference-types do not prevent \Index{addressing errors} because of explicit storage-management:
     1415\begin{cfa}
     1416int & const cr = *malloc();
     1417cr = 5;
     1418free( &cr );
     1419cr = 7;                                                         §\C{// unsound pointer dereference}§
     1420\end{cfa}
     1421
     1422The position of the ©const© qualifier \emph{after} the pointer/reference qualifier causes confuse for C programmers.
     1423The ©const© qualifier cannot be moved before the pointer/reference qualifier for C style-declarations;
     1424\CFA-style declarations (see \VRef{s:Declarations}) attempt to address this issue:
     1425\begin{quote2}
     1426\begin{tabular}{@{}l@{\hspace{3em}}l@{}}
     1427\multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c}{\textbf{C}}        \\
     1428\begin{cfa}
     1429®const® * ®const® * const int ccp;
     1430®const® & ®const® & const int ccr;
     1431\end{cfa}
     1432&
     1433\begin{cfa}
     1434const int * ®const® * ®const® ccp;
     1435
     1436\end{cfa}
     1437\end{tabular}
     1438\end{quote2}
     1439where the \CFA declaration is read left-to-right.
     1440
     1441Finally, like pointers, references are usable and composable with other type operators and generators.
     1442\begin{cfa}
     1443int w, x, y, z, & ar[3] = { x, y, z }; §\C{// initialize array of references}§
     1444&ar[1] = &w;                                            §\C{// change reference array element}§
     1445typeof( ar[1] ) p;                                      §\C{// (gcc) is int, i.e., the type of referenced object}§
     1446typeof( &ar[1] ) q;                                     §\C{// (gcc) is int \&, i.e., the type of reference}§
     1447sizeof( ar[1] ) == sizeof( int );       §\C{// is true, i.e., the size of referenced object}§
     1448sizeof( &ar[1] ) == sizeof( int *)      §\C{// is true, i.e., the size of a reference}§
     1449\end{cfa}
     1450
     1451In contrast to \CFA reference types, \Index*[C++]{\CC{}}'s reference types are all ©const© references, preventing changes to the reference address, so only value assignment is possible, which eliminates half of the \Index{address duality}.
     1452Also, \CC does not allow \Index{array}s\index{array!reference} of reference\footnote{
     1453The reason for disallowing arrays of reference is unknown, but possibly comes from references being ethereal (like a textual macro), and hence, replaceable by the referant object.}
     1454\Index*{Java}'s reference types to objects (all Java objects are on the heap) are like C pointers, which always manipulate the address, and there is no (bit-wise) object assignment, so objects are explicitly cloned by shallow or deep copying, which eliminates half of the address duality.
     1455
     1456
     1457\subsection{Initialization}
     1458
     1459\Index{Initialization} is different than \Index{assignment} because initialization occurs on the empty (uninitialized) storage on an object, while assignment occurs on possibly initialized storage of an object.
     1460There are three initialization contexts in \CFA: declaration initialization, argument/parameter binding, return/temporary binding.
     1461Because the object being initialized has no value, there is only one meaningful semantics with respect to address duality: it must mean address as there is no pointed-to value.
     1462In contrast, the left-hand side of assignment has an address that has a duality.
     1463Therefore, for pointer/reference initialization, the initializing value must be an address not a value.
     1464\begin{cfa}
     1465int * p = &x;                                           §\C{// assign address of x}§
     1466®int * p = x;®                                          §\C{// assign value of x}§
     1467int & r = x;                                            §\C{// must have address of x}§
     1468\end{cfa}
     1469Like the previous example with C pointer-arithmetic, it is unlikely assigning the value of ©x© into a pointer is meaningful (again, a warning is usually given).
     1470Therefore, for safety, this context requires an address, so it is superfluous to require explicitly taking the address of the initialization object, even though the type is incorrect.
     1471Note, this is strictly a convenience and safety feature for a programmer.
     1472Hence, \CFA allows ©r© to be assigned ©x© because it infers a reference for ©x©, by implicitly inserting a address-of operator, ©&©, and it is an error to put an ©&© because the types no longer match due to the implicit dereference.
     1473Unfortunately, C allows ©p© to be assigned with ©&x© (address) or ©x© (value), but most compilers warn about the latter assignment as being potentially incorrect.
     1474Similarly, when a reference type is used for a parameter/return type, the call-site argument does not require a reference operator for the same reason.
     1475\begin{cfa}
     1476int & f( int & r );                                     §\C{// reference parameter and return}§
     1477z = f( x ) + f( y );                            §\C{// reference operator added, temporaries needed for call results}§
     1478\end{cfa}
     1479Within routine ©f©, it is possible to change the argument by changing the corresponding parameter, and parameter ©r© can be locally reassigned within ©f©.
     1480Since operator routine ©?+?© takes its arguments by value, the references returned from ©f© are used to initialize compiler generated temporaries with value semantics that copy from the references.
     1481\begin{cfa}
     1482int temp1 = f( x ), temp2 = f( y );
     1483z = temp1 + temp2;
     1484\end{cfa}
     1485This \Index{implicit referencing} is crucial for reducing the syntactic burden for programmers when using references;
     1486otherwise references have the same syntactic  burden as pointers in these contexts.
     1487
     1488When a pointer/reference parameter has a ©const© value (immutable), it is possible to pass literals and expressions.
     1489\begin{cfa}
     1490void f( ®const® int & cr );
     1491void g( ®const® int * cp );
     1492f( 3 );                   g( ®&®3 );
     1493f( x + y );             g( ®&®(x + y) );
     1494\end{cfa}
     1495Here, the compiler passes the address to the literal 3 or the temporary for the expression ©x + y©, knowing the argument cannot be changed through the parameter.
     1496The ©&© before the constant/expression for the pointer-type parameter (©g©) is a \CFA extension necessary to type match and is a common requirement before a variable in C (\eg ©scanf©).
     1497Importantly, ©&3© may not be equal to ©&3©, where the references occur across calls because the temporaries maybe different on each call.
     1498
     1499\CFA \emph{extends} this semantics to a mutable pointer/reference parameter, and the compiler implicitly creates the necessary temporary (copying the argument), which is subsequently pointed-to by the reference parameter and can be changed.\footnote{
     1500If whole program analysis is possible, and shows the parameter is not assigned, \ie it is ©const©, the temporary is unnecessary.}
     1501\begin{cfa}
     1502void f( int & r );
     1503void g( int * p );
     1504f( 3 );                   g( ®&®3 );            §\C{// compiler implicit generates temporaries}§
     1505f( x + y );             g( ®&®(x + y) );        §\C{// compiler implicit generates temporaries}§
     1506\end{cfa}
     1507Essentially, there is an implicit \Index{rvalue} to \Index{lvalue} conversion in this case.\footnote{
     1508This conversion attempts to address the \newterm{const hell} problem, when the innocent addition of a ©const© qualifier causes a cascade of type failures, requiring an unknown number of additional ©const© qualifiers, until it is discovered a ©const© qualifier cannot be added and all the ©const© qualifiers must be removed.}
     1509The implicit conversion allows seamless calls to any routine without having to explicitly name/copy the literal/expression to allow the call.
     1510
     1511%\CFA attempts to handle pointers and references in a uniform, symmetric manner.
     1512Finally, C handles \Index{routine object}s in an inconsistent way.
     1513A routine object is both a pointer and a reference (\Index{particle and wave}).
     1514\begin{cfa}
     1515void f( int i );
     1516void (*fp)( int );                                      §\C{// routine pointer}§
     1517fp = f;                                                         §\C{// reference initialization}§
     1518fp = &f;                                                        §\C{// pointer initialization}§
     1519fp = *f;                                                        §\C{// reference initialization}§
     1520fp(3);                                                          §\C{// reference invocation}§
     1521(*fp)(3);                                                       §\C{// pointer invocation}§
     1522\end{cfa}
     1523While C's treatment of routine objects has similarity to inferring a reference type in initialization contexts, the examples are assignment not initialization, and all possible forms of assignment are possible (©f©, ©&f©, ©*f©) without regard for type.
     1524Instead, a routine object should be referenced by a ©const© reference:
     1525\begin{cfa}
     1526®const® void (®&® fr)( int ) = f;       §\C{// routine reference}§
     1527fr = ...                                                        §\C{// error, cannot change code}§
     1528&fr = ...;                                                      §\C{// changing routine reference}§
     1529fr( 3 );                                                        §\C{// reference call to f}§
     1530(*fr)(3);                                                       §\C{// error, incorrect type}§
     1531\end{cfa}
     1532because the value of the routine object is a routine literal, \ie the routine code is normally immutable during execution.\footnote{
     1533Dynamic code rewriting is possible but only in special circumstances.}
     1534\CFA allows this additional use of references for routine objects in an attempt to give a more consistent meaning for them.
     1535
     1536
     1537\subsection{Address-of Semantics}
     1538
     1539In C, ©&E© is an rvalue for any expression ©E©.
     1540\CFA extends the ©&© (address-of) operator as follows:
     1541\begin{itemize}
     1542\item
     1543if ©R© is an \Index{rvalue} of type ©T &$_1$...&$_r$© where $r \ge 1$ references (©&© symbols) than ©&R© has type ©T ®*®&$_{\color{red}2}$...&$_{\color{red}r}$©, \ie ©T© pointer with $r-1$ references (©&© symbols).
     1544
     1545\item
     1546if ©L© is an \Index{lvalue} of type ©T &$_1$...&$_l$© where $l \ge 0$ references (©&© symbols) then ©&L© has type ©T ®*®&$_{\color{red}1}$...&$_{\color{red}l}$©, \ie ©T© pointer with $l$ references (©&© symbols).
     1547\end{itemize}
     1548The following example shows the first rule applied to different \Index{rvalue} contexts:
     1549\begin{cfa}
     1550int x, * px, ** ppx, *** pppx, **** ppppx;
     1551int & rx = x, && rrx = rx, &&& rrrx = rrx ;
     1552x = rrrx;               // rrrx is an lvalue with type int &&& (equivalent to x)
     1553px = &rrrx;             // starting from rrrx, &rrrx is an rvalue with type int *&&& (&x)
     1554ppx = &&rrrx;   // starting from &rrrx, &&rrrx is an rvalue with type int **&& (&rx)
     1555pppx = &&&rrrx; // starting from &&rrrx, &&&rrrx is an rvalue with type int ***& (&rrx)
     1556ppppx = &&&&rrrx; // starting from &&&rrrx, &&&&rrrx is an rvalue with type int **** (&rrrx)
     1557\end{cfa}
     1558The following example shows the second rule applied to different \Index{lvalue} contexts:
     1559\begin{cfa}
     1560int x, * px, ** ppx, *** pppx;
     1561int & rx = x, && rrx = rx, &&& rrrx = rrx ;
     1562rrrx = 2;               // rrrx is an lvalue with type int &&& (equivalent to x)
     1563&rrrx = px;             // starting from rrrx, &rrrx is an rvalue with type int *&&& (rx)
     1564&&rrrx = ppx;   // starting from &rrrx, &&rrrx is an rvalue with type int **&& (rrx)
     1565&&&rrrx = pppx; // starting from &&rrrx, &&&rrrx is an rvalue with type int ***& (rrrx)
     1566\end{cfa}
     1567
     1568
     1569\subsection{Conversions}
     1570
     1571C provides a basic implicit conversion to simplify variable usage:
     1572\begin{enumerate}
     1573\setcounter{enumi}{-1}
     1574\item
     1575lvalue to rvalue conversion: ©cv T© converts to ©T©, which allows implicit variable dereferencing.
     1576\begin{cfa}
     1577int x;
     1578x + 1;                  // lvalue variable (int) converts to rvalue for expression
     1579\end{cfa}
     1580An rvalue has no type qualifiers (©cv©), so the lvalue qualifiers are dropped.
     1581\end{enumerate}
     1582\CFA provides three new implicit conversion for reference types to simplify reference usage.
     1583\begin{enumerate}
     1584\item
     1585reference to rvalue conversion: ©cv T &© converts to ©T©, which allows implicit reference dereferencing.
     1586\begin{cfa}
     1587int x, &r = x, f( int p );
     1588x = ®r® + f( ®r® );  // lvalue reference converts to rvalue
     1589\end{cfa}
     1590An rvalue has no type qualifiers (©cv©), so the reference qualifiers are dropped.
     1591
     1592\item
     1593lvalue to reference conversion: \lstinline[deletekeywords=lvalue]$lvalue-type cv1 T$ converts to ©cv2 T &©, which allows implicitly converting variables to references.
     1594\begin{cfa}
     1595int x, &r = ®x®, f( int & p ); // lvalue variable (int) convert to reference (int &)
     1596f( ®x® );               // lvalue variable (int) convert to reference (int &)
     1597\end{cfa}
     1598Conversion can restrict a type, where ©cv1© $\le$ ©cv2©, \eg passing an ©int© to a ©const volatile int &©, which has low cost.
     1599Conversion can expand a type, where ©cv1© $>$ ©cv2©, \eg passing a ©const volatile int© to an ©int &©, which has high cost (\Index{warning});
     1600furthermore, if ©cv1© has ©const© but not ©cv2©, a temporary variable is created to preserve the immutable lvalue.
     1601
     1602\item
     1603rvalue to reference conversion: ©T© converts to ©cv T &©, which allows binding references to temporaries.
     1604\begin{cfa}
     1605int x, & f( int & p );
     1606f( ®x + 3® );   // rvalue parameter (int) implicitly converts to lvalue temporary reference (int &)
     1607®&f®(...) = &x; // rvalue result (int &) implicitly converts to lvalue temporary reference (int &)
     1608\end{cfa}
     1609In both case, modifications to the temporary are inaccessible (\Index{warning}).
     1610Conversion expands the temporary-type with ©cv©, which is low cost since the temporary is inaccessible.
     1611\end{enumerate}
     1612
     1613
     1614\begin{comment}
     1615From: Richard Bilson <rcbilson@gmail.com>
     1616Date: Wed, 13 Jul 2016 01:58:58 +0000
     1617Subject: Re: pointers / references
     1618To: "Peter A. Buhr" <pabuhr@plg2.cs.uwaterloo.ca>
     1619
     1620As a general comment I would say that I found the section confusing, as you move back and forth
     1621between various real and imagined programming languages. If it were me I would rewrite into two
     1622subsections, one that specifies precisely the syntax and semantics of reference variables and
     1623another that provides the rationale.
     1624
     1625I don't see any obvious problems with the syntax or semantics so far as I understand them. It's not
     1626obvious that the description you're giving is complete, but I'm sure you'll find the special cases
     1627as you do the implementation.
     1628
     1629My big gripes are mostly that you're not being as precise as you need to be in your terminology, and
     1630that you say a few things that aren't actually true even though I generally know what you mean.
     1631
     163220 C provides a pointer type; CFA adds a reference type. Both types contain an address, which is normally a
     163321 location in memory.
     1634
     1635An address is not a location in memory; an address refers to a location in memory. Furthermore it
     1636seems weird to me to say that a type "contains" an address; rather, objects of that type do.
     1637
     163821 Special addresses are used to denote certain states or access co-processor memory. By
     163922 convention, no variable is placed at address 0, so addresses like 0, 1, 2, 3 are often used to denote no-value
     164023 or other special states.
     1641
     1642This isn't standard C at all. There has to be one null pointer representation, but it doesn't have
     1643to be a literal zero representation and there doesn't have to be more than one such representation.
     1644
     164523 Often dereferencing a special state causes a memory fault, so checking is necessary
     164624 during execution.
     1647
     1648I don't see the connection between the two clauses here. I feel like if a bad pointer will not cause
     1649a memory fault then I need to do more checking, not less.
     1650
     165124 If the programming language assigns addresses, a program's execution is sound, \ie all
     165225 addresses are to valid memory locations.
     1653
     1654You haven't said what it means to "assign" an address, but if I use my intuitive understanding of
     1655the term I don't see how this can be true unless you're assuming automatic storage management.
     1656
     16571 Program variables are implicit pointers to memory locations generated by the compiler and automatically
     16582 dereferenced, as in:
     1659
     1660There is no reason why a variable needs to have a location in memory, and indeed in a typical
     1661program many variables will not. In standard terminology an object identifier refers to data in the
     1662execution environment, but not necessarily in memory.
     1663
     166413 A pointer/reference is a generalization of a variable name, \ie a mutable address that can point to more
     166514 than one memory location during its lifetime.
     1666
     1667I feel like you're off the reservation here. In my world there are objects of pointer type, which
     1668seem to be what you're describing here, but also pointer values, which can be stored in an object of
     1669pointer type but don't necessarily have to be. For example, how would you describe the value denoted
     1670by "&main" in a C program? I would call it a (function) pointer, but that doesn't satisfy your
     1671definition.
     1672
     167316 not occupy storage as the literal is embedded directly into instructions.) Hence, a pointer occupies memory
     167417 to store its current address, and the pointer's value is loaded by dereferencing, \eg:
     1675
     1676As with my general objection regarding your definition of variables, there is no reason why a
     1677pointer variable (object of pointer type) needs to occupy memory.
     1678
     167921 p2 = p1 + x; // compiler infers *p2 = *p1 + x;
     1680
     1681What language are we in now?
     1682
     168324 pointer usage. However, in C, the following cases are ambiguous, especially with pointer arithmetic:
     168425 p1 = p2; // p1 = p2 or *p1 = *p2
     1685
     1686This isn't ambiguous. it's defined to be the first option.
     1687
     168826 p1 = p1 + 1; // p1 = p1 + 1 or *p1 = *p1 + 1
     1689
     1690Again, this statement is not ambiguous.
     1691
     169213 example. Hence, a reference behaves like the variable name for the current variable it is pointing-to. The
     169314 simplest way to understand a reference is to imagine the compiler inserting a dereference operator before
     169415 the reference variable for each reference qualifier in a declaration, \eg:
     1695
     1696It's hard for me to understand who the audience for this part is. I think a practical programmer is
     1697likely to be satisfied with "a reference behaves like the variable name for the current variable it
     1698is pointing-to," maybe with some examples. Your "simplest way" doesn't strike me as simpler than
     1699that. It feels like you're trying to provide a more precise definition for the semantics of
     1700references, but it isn't actually precise enough to be a formal specification. If you want to
     1701express the semantics of references using rewrite rules that's a great way to do it, but lay the
     1702rules out clearly, and when you're showing an example of rewriting keep your
     1703references/pointers/values separate (right now, you use \eg "r3" to mean a reference, a pointer,
     1704and a value).
     1705
     170624 Cancellation works to arbitrary depth, and pointer and reference values are interchangeable because both
     170725 contain addresses.
     1708
     1709Except they're not interchangeable, because they have different and incompatible types.
     1710
     171140 Interestingly, C++ deals with the address duality by making the pointed-to value the default, and prevent-
     171241 ing changes to the reference address, which eliminates half of the duality. Java deals with the address duality
     171342 by making address assignment the default and requiring field assignment (direct or indirect via methods),
     171443 \ie there is no builtin bit-wise or method-wise assignment, which eliminates half of the duality.
     1715
     1716I can follow this but I think that's mostly because I already understand what you're trying to
     1717say. I don't think I've ever heard the term "method-wise assignment" and I don't see you defining
     1718it. Furthermore Java does have value assignment of basic (non-class) types, so your summary here
     1719feels incomplete. (If it were me I'd drop this paragraph rather than try to save it.)
     1720
     172111 Hence, for type & const, there is no pointer assignment, so &rc = &x is disallowed, and the address value
     172212 cannot be 0 unless an arbitrary pointer is assigned to the reference.
     1723
     1724Given the pains you've taken to motivate every little bit of the semantics up until now, this last
     1725clause ("the address value cannot be 0") comes out of the blue. It seems like you could have
     1726perfectly reasonable semantics that allowed the initialization of null references.
     1727
     172812 In effect, the compiler is managing the
     172913 addresses for type & const not the programmer, and by a programming discipline of only using references
     173014 with references, address errors can be prevented.
     1731
     1732Again, is this assuming automatic storage management?
     1733
     173418 rary binding. For reference initialization (like pointer), the initializing value must be an address (lvalue) not
     173519 a value (rvalue).
     1736
     1737This sentence appears to suggest that an address and an lvalue are the same thing.
     1738
     173920 int * p = &x; // both &x and x are possible interpretations
     1740
     1741Are you saying that we should be considering "x" as a possible interpretation of the initializer
     1742"&x"? It seems to me that this expression has only one legitimate interpretation in context.
     1743
     174421 int & r = x; // x unlikely interpretation, because of auto-dereferencing
     1745
     1746You mean, we can initialize a reference using an integer value? Surely we would need some sort of
     1747cast to induce that interpretation, no?
     1748
     174922 Hence, the compiler implicitly inserts a reference operator, &, before the initialization expression.
     1750
     1751But then the expression would have pointer type, which wouldn't be compatible with the type of r.
     1752
     175322 Similarly,
     175423 when a reference is used for a parameter/return type, the call-site argument does not require a reference
     175524 operator.
     1756
     1757Furthermore, it would not be correct to use a reference operator.
     1758
     175945 The implicit conversion allows
     17601 seamless calls to any routine without having to explicitly name/copy the literal/expression to allow the call.
     17612 While C' attempts to handle pointers and references in a uniform, symmetric manner, C handles routine
     17623 variables in an inconsistent way: a routine variable is both a pointer and a reference (particle and wave).
     1763
     1764After all this talk of how expressions can have both pointer and value interpretations, you're
     1765disparaging C because it has expressions that have both pointer and value interpretations?
     1766
     1767On Sat, Jul 9, 2016 at 4:18 PM Peter A. Buhr <pabuhr@plg.uwaterloo.ca> wrote:
     1768> Aaron discovered a few places where "&"s are missing and where there are too many "&", which are
     1769> corrected in the attached updated. None of the text has changed, if you have started reading
     1770> already.
     1771\end{comment}
     1772
     1773
     1774\section{Routine Definition}
     1775
     1776\CFA also supports a new syntax for routine definition, as well as \Celeven and K\&R routine syntax.
     1777The point of the new syntax is to allow returning multiple values from a routine~\cite{Galletly96,CLU}, \eg:
     1778\begin{cfa}
     1779®[ int o1, int o2, char o3 ]® f( int i1, char i2, char i3 ) {
     1780        §\emph{routine body}§
     1781}
     1782\end{cfa}
     1783where routine ©f© has three output (return values) and three input parameters.
     1784Existing C syntax cannot be extended with multiple return types because it is impossible to embed a single routine name within multiple return type specifications.
     1785
     1786In 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{
     1787\Index*{Michael Tiemann}, with help from \Index*{Doug Lea}, provided named return values in g++, circa 1989.}
     1788The value of each local return variable is automatically returned at routine termination.
     1789Declaration qualifiers can only appear at the start of a routine definition, \eg:
     1790\begin{cfa}
     1791®extern® [ int x ] g( int y ) {§\,§}
     1792\end{cfa}
     1793Lastly, if there are no output parameters or input parameters, the brackets and/or parentheses must still be specified;
     1794in both cases the type is assumed to be void as opposed to old style C defaults of int return type and unknown parameter types, respectively, as in:
     1795\begin{cfa}
     1796[§\,§] g();                                                     §\C{// no input or output parameters}§
     1797[ void ] g( void );                                     §\C{// no input or output parameters}§
     1798\end{cfa}
     1799
     1800Routine f is called as follows:
     1801\begin{cfa}
     1802[ i, j, ch ] = f( 3, 'a', ch );
     1803\end{cfa}
     1804The list of return values from f and the grouping on the left-hand side of the assignment is called a \newterm{return list} and discussed in Section 12.
     1805
     1806\CFA style declarations cannot be used to declare parameters for K\&R style routine definitions because of the following ambiguity:
     1807\begin{cfa}
     1808int (*f(x))[ 5 ] int x; {}
     1809\end{cfa}
     1810The string ``©int (*f(x))[ 5 ]©'' declares a K\&R style routine of type returning a pointer to an array of 5 integers, while the string ``©[ 5 ] int x©'' declares a \CFA style parameter x of type array of 5 integers.
     1811Since the strings overlap starting with the open bracket, ©[©, there is an ambiguous interpretation for the string.
     1812As well, \CFA-style declarations cannot be used to declare parameters for C-style routine-definitions because of the following ambiguity:
     1813\begin{cfa}
     1814typedef int foo;
     1815int f( int (* foo) );                           §\C{// foo is redefined as a parameter name}§
     1816\end{cfa}
     1817The string ``©int (* foo)©'' declares a C-style named-parameter of type pointer to an integer (the parenthesis are superfluous), while the same string declares a \CFA style unnamed parameter of type routine returning integer with unnamed parameter of type pointer to foo.
     1818The redefinition of a type name in a parameter list is the only context in C where the character ©*© can appear to the left of a type name, and \CFA relies on all type qualifier characters appearing to the right of the type name.
     1819The inability to use \CFA declarations in these two contexts is probably a blessing because it precludes programmers from arbitrarily switching between declarations forms within a declaration contexts.
     1820
     1821C-style declarations can be used to declare parameters for \CFA style routine definitions, \eg:
     1822\begin{cfa}
     1823[ int ] f( * int, int * );                      §\C{// returns an integer, accepts 2 pointers to integers}§
     1824[ * int, int * ] f( int );                      §\C{// returns 2 pointers to integers, accepts an integer}§
     1825\end{cfa}
     1826The reason for allowing both declaration styles in the new context is for backwards compatibility with existing preprocessor macros that generate C-style declaration-syntax, as in:
     1827\begin{cfa}
     1828#define ptoa( n, d ) int (*n)[ d ]
     1829int f( ptoa( p, 5 ) ) ...                       §\C{// expands to int f( int (*p)[ 5 ] )}§
     1830[ int ] f( ptoa( p, 5 ) ) ...           §\C{// expands to [ int ] f( int (*p)[ 5 ] )}§
     1831\end{cfa}
     1832Again, programmers are highly encouraged to use one declaration form or the other, rather than mixing the forms.
     1833
     1834
     1835\subsection{Named Return Values}
     1836
     1837\Index{Named return values} handle the case where it is necessary to define a local variable whose value is then returned in a ©return© statement, as in:
     1838\begin{cfa}
     1839int f() {
     1840        int x;
     1841        ... x = 0; ... x = y; ...
     1842        return x;
     1843}
     1844\end{cfa}
     1845Because the value in the return variable is automatically returned when a \CFA routine terminates, the ©return© statement \emph{does not} contain an expression, as in:
     1846\newline
     1847\begin{minipage}{\linewidth}
     1848\begin{cfa}
     1849®[ int x, int y ]® f() {
     1850        int z;
     1851        ... x = 0; ... y = z; ...
     1852        ®return;®                                                       §\C{// implicitly return x, y}§
     1853}
     1854\end{cfa}
     1855\end{minipage}
     1856\newline
     1857When the return is encountered, the current values of ©x© and ©y© are returned to the calling routine.
     1858As well, ``falling off the end'' of a routine without a ©return© statement is permitted, as in:
     1859\begin{cfa}
     1860[ int x, int y ] f() {
     1861        ...
     1862}                                                                               §\C{// implicitly return x, y}§
     1863\end{cfa}
     1864In this case, the current values of ©x© and ©y© are returned to the calling routine just as if a ©return© had been encountered.
     1865
     1866Named return values may be used in conjunction with named parameter values;
     1867specifically, a return and parameter can have the same name.
     1868\begin{cfa}
     1869[ int x, int y ] f( int, x, int y ) {
     1870        ...
     1871}                                                                               §\C{// implicitly return x, y}§
     1872\end{cfa}
     1873This notation allows the compiler to eliminate temporary variables in nested routine calls.
     1874\begin{cfa}
     1875[ int x, int y ] f( int, x, int y );    §\C{// prototype declaration}§
     1876int a, b;
     1877[a, b] = f( f( f( a, b ) ) );
     1878\end{cfa}
     1879While the compiler normally ignores parameters names in prototype declarations, here they are used to eliminate temporary return-values by inferring that the results of each call are the inputs of the next call, and ultimately, the left-hand side of the assignment.
     1880Hence, even without the body of routine ©f© (separate compilation), it is possible to perform a global optimization across routine calls.
     1881The compiler warns about naming inconsistencies between routine prototype and definition in this case, and behaviour is \Index{undefined} if the programmer is inconsistent.
     1882
     1883
     1884\subsection{Routine Prototype}
     1885
     1886The syntax of the new routine prototype declaration follows directly from the new routine definition syntax;
     1887as well, parameter names are optional, \eg:
     1888\begin{cfa}
     1889[ int x ] f ();                                                 §\C{// returning int with no parameters}§
     1890[ * int ] g (int y);                                    §\C{// returning pointer to int with int parameter}§
     1891[ ] h ( int, char );                                    §\C{// returning no result with int and char parameters}§
     1892[ * int, int ] j ( int );                               §\C{// returning pointer to int and int, with int parameter}§
     1893\end{cfa}
     1894This syntax allows a prototype declaration to be created by cutting and pasting source text from the routine definition header (or vice versa).
     1895It is possible to declare multiple routine-prototypes in a single declaration, but the entire type specification is distributed across \emph{all} routine names in the declaration list (see~\VRef{s:Declarations}), \eg:
     1896\begin{quote2}
     1897\begin{tabular}{@{}l@{\hspace{3em}}l@{}}
     1898\multicolumn{1}{c@{\hspace{3em}}}{\textbf{\CFA}}        & \multicolumn{1}{c}{\textbf{C}}        \\
     1899\begin{cfa}
     1900[ int ] f( int ), g;
     1901\end{cfa}
     1902&
     1903\begin{cfa}
     1904int f( int ), g( int );
     1905\end{cfa}
     1906\end{tabular}
     1907\end{quote2}
     1908Declaration qualifiers can only appear at the start of a \CFA routine declaration,\footref{StorageClassSpecifier} \eg:
     1909\begin{cfa}
     1910extern [ int ] f ( int );
     1911static [ int ] g ( int );
     1912\end{cfa}
     1913
     1914
     1915\section{Routine Pointers}
     1916
     1917The syntax for pointers to \CFA routines specifies the pointer name on the right, \eg:
     1918\begin{cfa}
     1919* [ int x ] () fp;                                              §\C{// pointer to routine returning int with no parameters}§
     1920* [ * int ] (int y) gp;                                 §\C{// pointer to routine returning pointer to int with int parameter}§
     1921* [ ] (int,char) hp;                                    §\C{// pointer to routine returning no result with int and char parameters}§
     1922* [ * int,int ] ( int ) jp;                             §\C{// pointer to routine returning pointer to int and int, with int parameter}§
     1923\end{cfa}
     1924While parameter names are optional, \emph{a routine name cannot be specified};
     1925for example, the following is incorrect:
     1926\begin{cfa}
     1927* [ int x ] f () fp;                                    §\C{// routine name "f" is not allowed}§
     1928\end{cfa}
     1929
     1930
     1931\section{Named and Default Arguments}
     1932
     1933Named\index{named arguments}\index{arguments!named} and default\index{default arguments}\index{arguments!default} arguments~\cite{Hardgrave76}\footnote{
     1934Francez~\cite{Francez77} proposed a further extension to the named-parameter passing style, which specifies what type of communication (by value, by reference, by name) the argument is passed to the routine.}
     1935are two mechanisms to simplify routine call.
     1936Both mechanisms are discussed with respect to \CFA.
     1937\begin{description}
     1938\item[Named (or Keyword) Arguments:]
     1939provide the ability to specify an argument to a routine call using the parameter name rather than the position of the parameter.
     1940For example, given the routine:
     1941\begin{cfa}
     1942void p( int x, int y, int z ) {...}
     1943\end{cfa}
     1944a positional call is:
     1945\begin{cfa}
     1946p( 4, 7, 3 );
     1947\end{cfa}
     1948whereas a named (keyword) call may be:
     1949\begin{cfa}
     1950p( z : 3, x : 4, y : 7 );       §\C{// rewrite $\Rightarrow$ p( 4, 7, 3 )}§
     1951\end{cfa}
     1952Here the order of the arguments is unimportant, and the names of the parameters are used to associate argument values with the corresponding parameters.
     1953The compiler rewrites a named call into a positional call.
     1954The advantages of named parameters are:
     1955\begin{itemize}
     1956\item
     1957Remembering the names of the parameters may be easier than the order in the routine definition.
     1958\item
     1959Parameter names provide documentation at the call site (assuming the names are descriptive).
     1960\item
     1961Changes can be made to the order or number of parameters without affecting the call (although the call must still be recompiled).
     1962\end{itemize}
     1963
     1964Unfortunately, named arguments do not work in C-style programming-languages because a routine prototype is not required to specify parameter names, nor do the names in the prototype have to match with the actual definition.
     1965For example, the following routine prototypes and definition are all valid.
     1966\begin{cfa}
     1967void p( int, int, int );                        §\C{// equivalent prototypes}§
     1968void p( int x, int y, int z );
     1969void p( int y, int x, int z );
     1970void p( int z, int y, int x );
     1971void p( int q, int r, int s ) {}        §\C{// match with this definition}§
     1972\end{cfa}
     1973Forcing matching parameter names in routine prototypes with corresponding routine definitions is possible, but goes against a strong tradition in C programming.
     1974Alternatively, prototype definitions can be eliminated by using a two-pass compilation, and implicitly creating header files for exports.
     1975The former is easy to do, while the latter is more complex.
     1976
     1977Furthermore, named arguments do not work well in a \CFA-style programming-languages because they potentially introduces a new criteria for type matching.
     1978For example, it is technically possible to disambiguate between these two overloaded definitions of ©f© based on named arguments at the call site:
     1979\begin{cfa}
     1980int f( int i, int j );
     1981int f( int x, double y );
     1982
     1983f( j : 3, i : 4 );                              §\C{// 1st f}§
     1984f( x : 7, y : 8.1 );                    §\C{// 2nd f}§
     1985f( 4, 5 );                                              §\C{// ambiguous call}§
     1986\end{cfa}
     1987However, named arguments compound routine resolution in conjunction with conversions:
     1988\begin{cfa}
     1989f( i : 3, 5.7 );                                §\C{// ambiguous call ?}§
     1990\end{cfa}
     1991Depending on the cost associated with named arguments, this call could be resolvable or ambiguous.
     1992Adding named argument into the routine resolution algorithm does not seem worth the complexity.
     1993Therefore, \CFA does \emph{not} attempt to support named arguments.
     1994
     1995\item[Default Arguments]
     1996provide the ability to associate a default value with a parameter so it can be optionally specified in the argument list.
     1997For example, given the routine:
     1998\begin{cfa}
     1999void p( int x = 1, int y = 2, int z = 3 ) {...}
     2000\end{cfa}
     2001the allowable positional calls are:
     2002\begin{cfa}
     2003p();                                                    §\C{// rewrite $\Rightarrow$ p( 1, 2, 3 )}§
     2004p( 4 );                                                 §\C{// rewrite $\Rightarrow$ p( 4, 2, 3 )}§
     2005p( 4, 4 );                                              §\C{// rewrite $\Rightarrow$ p( 4, 4, 3 )}§
     2006p( 4, 4, 4 );                                   §\C{// rewrite $\Rightarrow$ p( 4, 4, 4 )}§
     2007// empty arguments
     2008p(  , 4, 4 );                                   §\C{// rewrite $\Rightarrow$ p( 1, 4, 4 )}§
     2009p( 4,  , 4 );                                   §\C{// rewrite $\Rightarrow$ p( 4, 2, 4 )}§
     2010p( 4, 4,   );                                   §\C{// rewrite $\Rightarrow$ p( 4, 4, 3 )}§
     2011p( 4,  ,   );                                   §\C{// rewrite $\Rightarrow$ p( 4, 2, 3 )}§
     2012p(  , 4,   );                                   §\C{// rewrite $\Rightarrow$ p( 1, 4, 3 )}§
     2013p(  ,  , 4 );                                   §\C{// rewrite $\Rightarrow$ p( 1, 2, 4 )}§
     2014p(  ,  ,   );                                   §\C{// rewrite $\Rightarrow$ p( 1, 2, 3 )}§
     2015\end{cfa}
     2016Here the missing arguments are inserted from the default values in the parameter list.
     2017The compiler rewrites missing default values into explicit positional arguments.
     2018The advantages of default values are:
     2019\begin{itemize}
     2020\item
     2021Routines with a large number of parameters are often very generalized, giving a programmer a number of different options on how a computation is performed.
     2022For many of these kinds of routines, there are standard or default settings that work for the majority of computations.
     2023Without default values for parameters, a programmer is forced to specify these common values all the time, resulting in long argument lists that are error prone.
     2024\item
     2025When a routine's interface is augmented with new parameters, it extends the interface providing generalizability\footnote{
     2026``It should be possible for the implementor of an abstraction to increase its generality.
     2027So long as the modified abstraction is a generalization of the original, existing uses of the abstraction will not require change.
     2028It might be possible to modify an abstraction in a manner which is not a generalization without affecting existing uses, but, without inspecting the modules in which the uses occur, this possibility cannot be determined.
     2029This criterion precludes the addition of parameters, unless these parameters have default or inferred values that are valid for all possible existing applications.''~\cite[p.~128]{Cormack90}}
     2030(somewhat like the generalization provided by inheritance for classes).
     2031That is, all existing calls are still valid, although the call must still be recompiled.
     2032\end{itemize}
     2033The only disadvantage of default arguments is that unintentional omission of an argument may not result in a compiler-time error.
     2034Instead, a default value is used, which may not be the programmer's intent.
     2035
     2036Default values may only appear in a prototype versus definition context:
     2037\begin{cfa}
     2038void p( int x, int y = 2, int z = 3 );          §\C{// prototype: allowed}§
     2039void p( int, int = 2, int = 3 );                        §\C{// prototype: allowed}§
     2040void p( int x, int y = 2, int z = 3 ) {}        §\C{// definition: not allowed}§
     2041\end{cfa}
     2042The reason for this restriction is to allow separate compilation.
     2043Multiple prototypes with different default values is an error.
     2044\end{description}
     2045
     2046Ellipse (``...'') arguments present problems when used with default arguments.
     2047The conflict occurs because both named and ellipse arguments must appear after positional arguments, giving two possibilities:
     2048\begin{cfa}
     2049p( /* positional */, ... , /* named */ );
     2050p( /* positional */, /* named */, ... );
     2051\end{cfa}
     2052While it is possible to implement both approaches, the first possibly is more complex than the second, \eg:
     2053\begin{cfa}
     2054p( int x, int y, int z, ... );
     2055p( 1, 4, 5, 6, z : 3, y : 2 ); §\C{// assume p( /* positional */, ... , /* named */ );}§
     2056p( 1, z : 3, y : 2, 4, 5, 6 ); §\C{// assume p( /* positional */, /* named */, ... );}§
     2057\end{cfa}
     2058In the first call, it is necessary for the programmer to conceptually rewrite the call, changing named arguments into positional, before knowing where the ellipse arguments begin.
     2059Hence, this approach seems significantly more difficult, and hence, confusing and error prone.
     2060In the second call, the named arguments separate the positional and ellipse arguments, making it trivial to read the call.
     2061
     2062The problem is exacerbated with default arguments, \eg:
     2063\begin{cfa}
     2064void p( int x, int y = 2, int z = 3... );
     2065p( 1, 4, 5, 6, z : 3 );         §\C{// assume p( /* positional */, ... , /* named */ );}§
     2066p( 1, z : 3, 4, 5, 6 );         §\C{// assume p( /* positional */, /* named */, ... );}§
     2067\end{cfa}
     2068The first call is an error because arguments 4 and 5 are actually positional not ellipse arguments;
     2069therefore, argument 5 subsequently conflicts with the named argument z : 3.
     2070In the second call, the default value for y is implicitly inserted after argument 1 and the named arguments separate the positional and ellipse arguments, making it trivial to read the call.
     2071For these reasons, \CFA requires named arguments before ellipse arguments.
     2072Finally, while ellipse arguments are needed for a small set of existing C routines, like printf, the extended \CFA type system largely eliminates the need for ellipse arguments (see Section 24), making much of this discussion moot.
     2073
     2074Default arguments and overloading (see Section 24) are complementary.
     2075While in theory default arguments can be simulated with overloading, as in:
     2076\begin{quote2}
     2077\begin{tabular}{@{}l@{\hspace{3em}}l@{}}
     2078\multicolumn{1}{c@{\hspace{3em}}}{\textbf{default arguments}}   & \multicolumn{1}{c}{\textbf{overloading}}      \\
     2079\begin{cfa}
     2080void p( int x, int y = 2, int z = 3 ) {...}
     2081
     2082
     2083\end{cfa}
     2084&
     2085\begin{cfa}
     2086void p( int x, int y, int z ) {...}
     2087void p( int x ) { p( x, 2, 3 ); }
     2088void p( int x, int y ) { p( x, y, 3 ); }
     2089\end{cfa}
     2090\end{tabular}
     2091\end{quote2}
     2092the number of required overloaded routines is linear in the number of default values, which is unacceptable growth.
     2093In general, overloading should only be used over default arguments if the body of the routine is significantly different.
     2094Furthermore, overloading cannot handle accessing default arguments in the middle of a positional list, via a missing argument, such as:
     2095\begin{cfa}
     2096p( 1, /* default */, 5 );               §\C{// rewrite $\Rightarrow$ p( 1, 2, 5 )}§
     2097\end{cfa}
     2098
     2099Given the \CFA restrictions above, both named and default arguments are backwards compatible.
     2100\Index*[C++]{\CC{}} only supports default arguments;
     2101\Index*{Ada} supports both named and default arguments.
     2102
     2103
     2104\section{Unnamed Structure Fields}
     2105
     2106C requires each field of a structure to have a name, except for a bit field associated with a basic type, \eg:
     2107\begin{cfa}
     2108struct {
     2109        int f1;                                 §\C{// named field}§
     2110        int f2 : 4;                             §\C{// named field with bit field size}§
     2111        int : 3;                                §\C{// unnamed field for basic type with bit field size}§
     2112        int ;                                   §\C{// disallowed, unnamed field}§
     2113        int *;                                  §\C{// disallowed, unnamed field}§
     2114        int (*)( int );                 §\C{// disallowed, unnamed field}§
     2115};
     2116\end{cfa}
     2117This requirement is relaxed by making the field name optional for all field declarations; therefore, all the field declarations in the example are allowed.
     2118As for unnamed bit fields, an unnamed field is used for padding a structure to a particular size.
     2119A list of unnamed fields is also supported, \eg:
     2120\begin{cfa}
     2121struct {
     2122        int , , ;                               §\C{// 3 unnamed fields}§
     2123}
     2124\end{cfa}
     2125
     2126
     2127\section{Nesting}
     2128
     2129Nesting of types and routines is useful for controlling name visibility (\newterm{name hiding}).
     2130
     2131
     2132\subsection{Type Nesting}
     2133
     2134\CFA allows \Index{type nesting}, and type qualification of the nested types (see \VRef[Figure]{f:TypeNestingQualification}), where as C hoists\index{type hoisting} (refactors) nested types into the enclosing scope and has no type qualification.
     2135\begin{figure}
     2136\centering
     2137\begin{tabular}{@{}l@{\hspace{3em}}l|l@{}}
     2138\multicolumn{1}{c@{\hspace{3em}}}{\textbf{C Type Nesting}}      & \multicolumn{1}{c}{\textbf{C Implicit Hoisting}}      & \multicolumn{1}{|c}{\textbf{\CFA}}    \\
     2139\hline
     2140\begin{cfa}
     2141struct S {
     2142        enum C { R, G, B };
     2143        struct T {
     2144                union U { int i, j; };
     2145                enum C c;
     2146                short int i, j;
     2147        };
     2148        struct T t;
     2149} s;
     2150
     2151int fred() {
     2152        s.t.c = R;
     2153        struct T t = { R, 1, 2 };
     2154        enum C c;
     2155        union U u;
     2156}
     2157\end{cfa}
     2158&
     2159\begin{cfa}
     2160enum C { R, G, B };
     2161union U { int i, j; };
     2162struct T {
     2163        enum C c;
     2164        short int i, j;
     2165};
     2166struct S {
     2167        struct T t;
     2168} s;
     2169       
     2170
     2171
     2172
     2173
     2174
     2175
     2176\end{cfa}
     2177&
     2178\begin{cfa}
     2179struct S {
     2180        enum C { R, G, B };
     2181        struct T {
     2182                union U { int i, j; };
     2183                enum C c;
     2184                short int i, j;
     2185        };
     2186        struct T t;
     2187} s;
     2188
     2189int fred() {
     2190        s.t.c = ®S.®R;  // type qualification
     2191        struct ®S.®T t = { ®S.®R, 1, 2 };
     2192        enum ®S.®C c;
     2193        union ®S.T.®U u;
     2194}
     2195\end{cfa}
     2196\end{tabular}
     2197\caption{Type Nesting / Qualification}
     2198\label{f:TypeNestingQualification}
     2199\end{figure}
     2200In the left example in C, types ©C©, ©U© and ©T© are implicitly hoisted outside of type ©S© into the containing block scope.
     2201In the right example in \CFA, the types are not hoisted and accessed using the field-selection operator ``©.©'' for type qualification, as does \Index*{Java}, rather than the \CC type-selection operator ``©::©''.
     2202
     2203
     2204\subsection{Routine Nesting}
     2205
     2206While \CFA does not provide object programming by putting routines into structures, it does rely heavily on locally nested routines to redefine operations at or close to a call site.
     2207For example, the C quick-sort is wrapped into the following polymorphic \CFA routine:
     2208\begin{cfa}
     2209forall( otype T | { int ?<?( T, T ); } )
     2210void qsort( const T * arr, size_t dimension );
     2211\end{cfa}
     2212which can be used to sort in ascending and descending order by locally redefining the less-than operator into greater-than.
     2213\begin{cfa}
     2214const unsigned int size = 5;
     2215int ia[size];
     2216...                                             §\C{// assign values to array ia}§
     2217qsort( ia, size );              §\C{// sort ascending order using builtin ?<?}§
     2218{
     2219        ®int ?<?( int x, int y ) { return x > y; }® §\C{// nested routine}§
     2220        qsort( ia, size );      §\C{// sort descending order by local redefinition}§
     2221}
     2222\end{cfa}
     2223
     2224Nested routines are not first-class, meaning a nested routine cannot be returned if it has references to variables in its enclosing blocks;
     2225the only exception is references to the external block of the translation unit, as these variables persist for the duration of the program.
     2226The following program in undefined in \CFA (and Indexc{gcc})
     2227\begin{cfa}
     2228[* [int]( int )] foo() {                §\C{// int (*foo())( int )}§
     2229        int ®i® = 7;
     2230        int bar( int p ) {
     2231                ®i® += 1;                               §\C{// dependent on local variable}§
     2232                sout | ®i® | endl;
     2233        }
     2234        return bar;                                     §\C{// undefined because of local dependence}§
     2235}
     2236int main() {
     2237        * [int]( int ) fp = foo();      §\C{// int (*fp)( int )}§
     2238        sout | fp( 3 ) | endl;
     2239}
     2240\end{cfa}
     2241because
     2242
     2243Currently, there are no \Index{lambda} expressions, \ie unnamed routines because routine names are very important to properly select the correct routine.
     2244
     2245
     2246\section{Tuples}
     2247
     2248In C and \CFA, lists of elements appear in several contexts, such as the parameter list for a routine call.
     2249(More contexts are added shortly.)
     2250A list of such elements is called a \newterm{lexical list}.
     2251The general syntax of a lexical list is:
     2252\begin{cfa}
     2253[ §\emph{exprlist}§ ]
     2254\end{cfa}
     2255where ©$\emph{exprlist}$© is a list of one or more expressions separated by commas.
     2256The brackets, ©[]©, allow differentiating between lexical lists and expressions containing the C comma operator.
     2257The following are examples of lexical lists:
     2258\begin{cfa}
     2259[ x, y, z ]
     2260[ 2 ]
     2261[ v+w, x*y, 3.14159, f() ]
     2262\end{cfa}
     2263Tuples are permitted to contain sub-tuples (\ie nesting), such as ©[ [ 14, 21 ], 9 ]©, which is a 2-element tuple whose first element is itself a tuple.
     2264Note, a tuple is not a record (structure);
     2265a record denotes a single value with substructure, whereas a tuple is multiple values with no substructure (see flattening coercion in Section 12.1).
     2266In essence, tuples are largely a compile time phenomenon, having little or no runtime presence.
     2267
     2268Tuples can be organized into compile-time tuple variables;
     2269these variables are of \newterm{tuple type}.
     2270Tuple variables and types can be used anywhere lists of conventional variables and types can be used.
     2271The general syntax of a tuple type is:
     2272\begin{cfa}
     2273[ §\emph{typelist}§ ]
     2274\end{cfa}
     2275where ©$\emph{typelist}$© is a list of one or more legal \CFA or C type specifications separated by commas, which may include other tuple type specifications.
     2276Examples of tuple types include:
     2277\begin{cfa}
     2278[ unsigned int, char ]
     2279[ double, double, double ]
     2280[ * int, int * ]                §\C{// mix of CFA and ANSI}§
     2281[ * [ 5 ] int, * * char, * [ [ int, int ] ] (int, int) ]
     2282\end{cfa}
     2283Like tuples, tuple types may be nested, such as ©[ [ int, int ], int ]©, which is a 2-element tuple type whose first element is itself a tuple type.
     2284
     2285Examples of declarations using tuple types are:
     2286\begin{cfa}
     2287[ int, int ] x;                 §\C{// 2 element tuple, each element of type int}§
     2288* [ char, char ] y;             §\C{// pointer to a 2 element tuple}§
     2289[ [ int, int ] ] z ([ int, int ]);
     2290\end{cfa}
     2291The last example declares an external routine that expects a 2 element tuple as an input parameter and returns a 2 element tuple as its result.
     2292
     2293As mentioned, tuples can appear in contexts requiring a list of value, such as an argument list of a routine call.
     2294In unambiguous situations, the tuple brackets may be omitted, \eg a tuple that appears as an argument may have its
     2295square brackets omitted for convenience; therefore, the following routine invocations are equivalent:
     2296\begin{cfa}
     2297f( [ 1, x+2, fred() ] );
     2298f( 1, x+2, fred() );
     2299\end{cfa}
     2300Also, a tuple or a tuple variable may be used to supply all or part of an argument list for a routine expecting multiple input parameters or for a routine expecting a tuple as an input parameter.
     2301For example, the following are all legal:
     2302\begin{cfa}
     2303[ int, int ] w1;
     2304[ int, int, int ] w2;
     2305[ void ] f (int, int, int); /* three input parameters of type int */
     2306[ void ] g ([ int, int, int ]); /* 3 element tuple as input */
     2307f( [ 1, 2, 3 ] );
     2308f( w1, 3 );
     2309f( 1, w1 );
     2310f( w2 );
     2311g( [ 1, 2, 3 ] );
     2312g( w1, 3 );
     2313g( 1, w1 );
     2314g( w2 );
     2315\end{cfa}
     2316Note, in all cases 3 arguments are supplied even though the syntax may appear to supply less than 3. As mentioned, a
     2317tuple does not have structure like a record; a tuple is simply converted into a list of components.
     2318\begin{rationale}
     2319The present implementation of \CFA does not support nested routine calls when the inner routine returns multiple values; \ie a statement such as ©g( f() )© is not supported.
     2320Using a temporary variable to store the  results of the inner routine and then passing this variable to the outer routine works, however.
     2321\end{rationale}
     2322
     2323A tuple can contain a C comma expression, provided the expression containing the comma operator is enclosed in parentheses.
     2324For instance, the following tuples are equivalent:
     2325\begin{cfa}
     2326[ 1, 3, 5 ]
     2327[ 1, (2, 3), 5 ]
     2328\end{cfa}
     2329The second element of the second tuple is the expression (2, 3), which yields the result 3.
     2330This requirement is the same as for comma expressions in argument lists.
     2331
     2332Type qualifiers, \ie const and volatile, may modify a tuple type.
     2333The meaning is the same as for a type qualifier modifying an aggregate type [Int99, x 6.5.2.3(7),x 6.7.3(11)], \ie the qualifier is distributed across all of the types in the tuple, \eg:
     2334\begin{cfa}
     2335const volatile [ int, float, const int ] x;
     2336\end{cfa}
     2337is equivalent to:
     2338\begin{cfa}
     2339[ const volatile int, const volatile float, const volatile int ] x;
     2340\end{cfa}
     2341Declaration qualifiers can only appear at the start of a \CFA tuple declaration4, \eg:
     2342\begin{cfa}
     2343extern [ int, int ] w1;
     2344static [ int, int, int ] w2;
     2345\end{cfa}
     2346\begin{rationale}
     2347Unfortunately, C's syntax for subscripts precluded treating them as tuples.
     2348The C subscript list has the form ©[i][j]...© and not ©[i, j, ...]©.
     2349Therefore, there is no syntactic way for a routine returning multiple values to specify the different subscript values, \eg ©f[g()]© always means a single subscript value because there is only one set of brackets.
     2350Fixing this requires a major change to C because the syntactic form ©M[i, j, k]© already has a particular meaning: ©i, j, k© is a comma expression.
     2351\end{rationale}
     2352
     2353
     2354\subsection{Tuple Coercions}
     2355
     2356There are four coercions that can be performed on tuples and tuple variables: closing, opening, flattening and structuring.
     2357In addition, the coercion of dereferencing can be performed on a tuple variable to yield its value(s), as for other variables.
     2358A \newterm{closing coercion} takes a set of values and converts it into a tuple value, which is a contiguous set of values, as in:
     2359\begin{cfa}
     2360[ int, int, int, int ] w;
     2361w = [ 1, 2, 3, 4 ];
     2362\end{cfa}
     2363First the right-hand tuple is closed into a tuple value and then the tuple value is assigned.
     2364
     2365An \newterm{opening coercion} is the opposite of closing; a tuple value is converted into a tuple of values, as in:
     2366\begin{cfa}
     2367[ a, b, c, d ] = w
     2368\end{cfa}
     2369©w© is implicitly opened to yield a tuple of four values, which are then assigned individually.
     2370
     2371A \newterm{flattening coercion} coerces a nested tuple, \ie a tuple with one or more components, which are themselves tuples, into a flattened tuple, which is a tuple whose components are not tuples, as in:
     2372\begin{cfa}
     2373[ a, b, c, d ] = [ 1, [ 2, 3 ], 4 ];
     2374\end{cfa}
     2375First the right-hand tuple is flattened and then the values are assigned individually.
     2376Flattening is also performed on tuple types.
     2377For example, the type ©[ int, [ int, int ], int ]© can be coerced, using flattening, into the type ©[ int, int, int, int ]©.
     2378
     2379A \newterm{structuring coercion} is the opposite of flattening;
     2380a tuple is structured into a more complex nested tuple.
     2381For example, structuring the tuple ©[ 1, 2, 3, 4 ]© into the tuple ©[ 1, [ 2, 3 ], 4 ]© or the tuple type ©[ int, int, int, int ]© into the tuple type ©[ int, [ int, int ], int ]©.
     2382In the following example, the last assignment illustrates all the tuple coercions:
     2383\begin{cfa}
     2384[ int, int, int, int ] w = [ 1, 2, 3, 4 ];
     2385int x = 5;
     2386[ x, w ] = [ w, x ];            §\C{// all four tuple coercions}§
     2387\end{cfa}
     2388Starting on the right-hand tuple in the last assignment statement, w is opened, producing a tuple of four values;
     2389therefore, the right-hand tuple is now the tuple ©[ [ 1, 2, 3, 4 ], 5 ]©.
     2390This tuple is then flattened, yielding ©[ 1, 2, 3, 4, 5 ]©, which is structured into ©[ 1, [ 2, 3, 4, 5 ] ]© to match the tuple type of the left-hand side.
     2391The tuple ©[ 2, 3, 4, 5 ]© is then closed to create a tuple value.
     2392Finally, ©x© is assigned ©1© and ©w© is assigned the tuple value using multiple assignment (see Section 14).
     2393\begin{rationale}
     2394A possible additional language extension is to use the structuring coercion for tuples to initialize a complex record with a tuple.
     2395\end{rationale}
     2396
     2397
     2398\section{Mass Assignment}
     2399
     2400\CFA permits assignment to several variables at once using mass assignment~\cite{CLU}.
     2401Mass assignment has the following form:
     2402\begin{cfa}
     2403[ §\emph{lvalue}§, ... , §\emph{lvalue}§ ] = §\emph{expr}§;
     2404\end{cfa}
     2405\index{lvalue}
     2406The left-hand side is a tuple of \emph{lvalues}, which is a list of expressions each yielding an address, \ie any data object that can appear on the left-hand side of a conventional assignment statement.
     2407©$\emph{expr}$© is any standard arithmetic expression.
     2408Clearly, the types of the entities being assigned must be type compatible with the value of the expression.
     2409
     2410Mass assignment has parallel semantics, \eg the statement:
     2411\begin{cfa}
     2412[ x, y, z ] = 1.5;
     2413\end{cfa}
     2414is equivalent to:
     2415\begin{cfa}
     2416x = 1.5; y = 1.5; z = 1.5;
     2417\end{cfa}
     2418This semantics is not the same as the following in C:
     2419\begin{cfa}
     2420x = y = z = 1.5;
     2421\end{cfa}
     2422as conversions between intermediate assignments may lose information.
     2423A more complex example is:
     2424\begin{cfa}
     2425[ i, y[i], z ] = a + b;
     2426\end{cfa}
     2427which is equivalent to:
     2428\begin{cfa}
     2429t = a + b;
     2430a1 = &i; a2 = &y[i]; a3 = &z;
     2431*a1 = t; *a2 = t; *a3 = t;
     2432\end{cfa}
     2433The temporary ©t© is necessary to store the value of the expression to eliminate conversion issues.
     2434The temporaries for the addresses are needed so that locations on the left-hand side do not change as the values are assigned.
     2435In this case, ©y[i]© uses the previous value of ©i© and not the new value set at the beginning of the mass assignment.
     2436
     2437
     2438\section{Multiple Assignment}
     2439
     2440\CFA also supports the assignment of several values at once, known as multiple assignment~\cite{CLU,Galletly96}.
     2441Multiple assignment has the following form:
     2442\begin{cfa}
     2443[ §\emph{lvalue}§, ... , §\emph{lvalue}§ ] = [ §\emph{expr}§, ... , §\emph{expr}§ ];
     2444\end{cfa}
     2445\index{lvalue}
     2446The left-hand side is a tuple of \emph{lvalues}, and the right-hand side is a tuple of \emph{expr}s.
     2447Each \emph{expr} appearing on the right-hand side of a multiple assignment statement is assigned to the corresponding \emph{lvalues} on the left-hand side of the statement using parallel semantics for each assignment.
     2448An example of multiple assignment is:
     2449\begin{cfa}
     2450[ x, y, z ] = [ 1, 2, 3 ];
     2451\end{cfa}
     2452Here, the values ©1©, ©2© and ©3© are assigned, respectively, to the variables ©x©, ©y© and ©z©.
     2453 A more complex example is:
     2454\begin{cfa}
     2455[ i, y[ i ], z ] = [ 1, i, a + b ];
     2456\end{cfa}
     2457Here, the values ©1©, ©i© and ©a + b© are assigned to the variables ©i©, ©y[i]© and ©z©, respectively.
     2458 Note, the parallel semantics of
     2459multiple assignment ensures:
     2460\begin{cfa}
     2461[ x, y ] = [ y, x ];
     2462\end{cfa}
     2463correctly interchanges (swaps) the values stored in ©x© and ©y©.
     2464The following cases are errors:
     2465\begin{cfa}
     2466[ a, b, c ] = [ 1, 2, 3, 4 ];
     2467[ a, b, c ] = [ 1, 2 ];
     2468\end{cfa}
     2469because the number of entities in the left-hand tuple is unequal with the right-hand tuple.
     2470
     2471As for all tuple contexts in C, side effects should not be used because C does not define an ordering for the evaluation of the elements of a tuple;
     2472both these examples produce indeterminate results:
     2473\begin{cfa}
     2474f( x++, x++ );                          §\C{// C routine call with side effects in arguments}§
     2475[ v1, v2 ] = [ x++, x++ ];      §\C{// side effects in righthand side of multiple assignment}§
     2476\end{cfa}
     2477
     2478
     2479\section{Cascade Assignment}
     2480
     2481As in C, \CFA mass and multiple assignments can be cascaded, producing cascade assignment.
     2482Cascade assignment has the following form:
     2483\begin{cfa}
     2484§\emph{tuple}§ = §\emph{tuple}§ = ... = §\emph{tuple}§;
     2485\end{cfa}
     2486and it has the same parallel semantics as for mass and multiple assignment.
     2487Some examples of cascade assignment are:
     2488\begin{cfa}
     2489x1 = y1 = x2 = y2 = 0;
     2490[ x1, y1 ] = [ x2, y2 ] = [ x3, y3 ];
     2491[ x1, y1 ] = [ x2, y2 ] = 0;
     2492[ x1, y1 ] = z = 0;
     2493\end{cfa}
     2494As in C, the rightmost assignment is performed first, \ie assignment parses right to left.
     2495
     2496
     2497\section{Field Tuples}
     2498
     2499Tuples may be used to select multiple fields of a record by field name.
     2500Its general form is:
     2501\begin{cfa}
     2502§\emph{expr}§ . [ §\emph{fieldlist}§ ]
     2503§\emph{expr}§ -> [ §\emph{fieldlist}§ ]
     2504\end{cfa}
     2505\emph{expr} is any expression yielding a value of type record, \eg ©struct©, ©union©.
     2506Each element of \emph{ fieldlist} is an element of the record specified by \emph{expr}.
     2507A record-field tuple may be used anywhere a tuple can be used. An example of the use of a record-field tuple is
     2508the following:
     2509\begin{cfa}
     2510struct s {
     2511        int f1, f2;
     2512        char f3;
     2513        double f4;
     2514} v;
     2515v.[ f3, f1, f2 ] = ['x', 11, 17 ];      §\C{// equivalent to v.f3 = 'x', v.f1 = 11, v.f2 = 17}§
     2516f( v.[ f3, f1, f2 ] );                          §\C{// equivalent to f( v.f3, v.f1, v.f2 )}§
     2517\end{cfa}
     2518Note, the fields appearing in a record-field tuple may be specified in any order;
     2519also, it is unnecessary to specify all the fields of a struct in a multiple record-field tuple.
     2520
     2521If a field of a ©struct© is itself another ©struct©, multiple fields of this subrecord can be specified using a nested record-field tuple, as in the following example:
     2522\begin{cfa}
     2523struct inner {
     2524        int f2, f3;
     2525};
     2526struct outer {
     2527        int f1;
     2528        struct inner i;
     2529        double f4;
     2530} o;
     2531
     2532o.[ f1, i.[ f2, f3 ], f4 ] = [ 11, 12, 13, 3.14159 ];
     2533\end{cfa}
    23972534
    23982535
     
    24022539
    24032540The goal of \CFA I/O is to simplify the common cases\index{I/O!common case}, while fully supporting polymorphism and user defined types in a consistent way.
     2541The approach combines ideas from \CC and Python.
    24042542The \CFA header file for the I/O library is \Indexc{fstream}.
    24052543
     
    24182556\end{cfa}
    24192557\\
    2420 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    2421 1 2 3
     2558\begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
     25591® ®2® ®3
    24222560\end{cfa}
    24232561&
    2424 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
     2562\begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
    242525631 2 3
    24262564\end{cfa}
    24272565\end{tabular}
    24282566\end{quote2}
    2429 The \CFA form has half as many characters as the \CC form, and is similar to \Index*{Python} I/O with respect to implicit separators.
    2430 A tuple prints all the tuple's values, each separated by ©", "©.
    2431 \begin{cfa}[mathescape=off,aboveskip=0pt,belowskip=0pt]
    2432 [int, int] t1 = [1, 2], t2 = [3, 4];
     2567The \CFA form has half the characters of the \CC form, and is similar to \Index*{Python} I/O with respect to implicit separators.
     2568Similar simplification occurs for \Index{tuple} I/O, which prints all tuple values separated by ``\lstinline[showspaces=true]@, @''.
     2569\begin{cfa}
     2570[int, [ int, int ] ] t1 = [ 1, [ 2, 3 ] ], t2 = [ 4, [ 5, 6 ] ];
    24332571sout | t1 | t2 | endl;                                  §\C{// print tuples}§
    24342572\end{cfa}
    2435 \begin{cfa}[mathescape=off,showspaces=true,belowskip=0pt]
    2436 1, 2, 3, 4
    2437 \end{cfa}
    2438 \CFA uses the logical-or operator for I/O because it is the lowest-priority overloadable operator, other than assignment.
     2573\begin{cfa}[showspaces=true,aboveskip=0pt]
     25741®, ®2®, ®3 4®, ®5®, ®6
     2575\end{cfa}
     2576Finally, \CFA uses the logical-or operator for I/O as it is the lowest-priority overloadable operator, other than assignment.
    24392577Therefore, fewer output expressions require parenthesis.
    24402578\begin{quote2}
     
    24532591\\
    24542592&
    2455 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
     2593\begin{cfa}[showspaces=true,aboveskip=0pt]
    245625943 3 12 0 3 1 2
    24572595\end{cfa}
    24582596\end{tabular}
    24592597\end{quote2}
    2460 Finally, the logical-or operator has a link with the Shell pipe-operator for moving data, where data flows in the correct direction for input but the opposite direction for output.
    2461 
    2462 
    2463 The implicit separator\index{I/O!separator} character (space/blank) is a separator not a terminator.
     2598There is a weak similarity between the \CFA logical-or operator and the Shell pipe-operator for moving data, where data flows in the correct direction for input but the opposite direction for output.
     2599
     2600
     2601\subsection{Implicit Separator}
     2602
     2603The \Index{implicit separator}\index{I/O!separator} character (space/blank) is a separator not a terminator.
    24642604The rules for implicitly adding the separator are:
    24652605\begin{enumerate}
     
    24692609sout | 1 | 2 | 3 | endl;
    24702610\end{cfa}
    2471 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
     2611\begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
    247226121 2 3
    24732613\end{cfa}
     
    25332673\end{enumerate}
    25342674
    2535 The following routines and \CC-style \Index{manipulator}s control implicit seperation.
     2675
     2676\subsection{Manipulator}
     2677
     2678The following \CC-style \Index{manipulator}s and routines control implicit seperation.
    25362679\begin{enumerate}
    25372680\item
    2538 Routines \Indexc{sepSet}\index{manipulator!sepSet@©sepSet©} and \Indexc{sepGet}\index{manipulator!sepGet@©sepGet©} set and get the separator string.
     2681Routines \Indexc{sepSet}\index{manipulator!sepSet@©sepSet©} and \Indexc{sep}\index{manipulator!sep@©sep©}/\Indexc{sepGet}\index{manipulator!sepGet@©sepGet©} set and get the separator string.
    25392682The separator string can be at most 16 characters including the ©'\0'© string terminator (15 printable characters).
    2540 \begin{cfa}[mathescape=off,aboveskip=0pt,belowskip=0pt]
     2683\begin{cfa}[mathescape=off,belowskip=0pt]
    25412684sepSet( sout, ", $" );                                          §\C{// set separator from " " to ", \$"}§
    2542 sout | 1 | 2 | 3 | " \"" | ®sepGet( sout )® | "\"" | endl;
     2685sout | 1 | 2 | 3 | " \"" | ®sep® | "\"" | endl;
    25432686\end{cfa}
    25442687%$
    25452688\begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt]
    2546 1, $2, $3 ®", $"®
     26891®, $®2®, $®3 ®", $"®
    25472690\end{cfa}
    25482691%$
    2549 \begin{cfa}[mathescape=off,aboveskip=0pt,belowskip=0pt]
     2692\begin{cfa}[belowskip=0pt]
    25502693sepSet( sout, " " );                                            §\C{// reset separator to " "}§
    25512694sout | 1 | 2 | 3 | " \"" | ®sepGet( sout )® | "\"" | endl;
    25522695\end{cfa}
    2553 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt]
    2554 1 2 3 ®" "®
    2555 \end{cfa}
    2556 
    2557 \item
    2558 Manipulators \Indexc{sepOn}\index{manipulator!sepOn@©sepOn©} and \Indexc{sepOff}\index{manipulator!sepOff@©sepOff©} \emph{locally} toggle printing the separator, \ie the seperator is adjusted only with respect to the next printed item.
    2559 \begin{cfa}[mathescape=off,belowskip=0pt]
    2560 sout | sepOn | 1 | 2 | 3 | sepOn | endl;        §\C{// separator at start of line}§
    2561 \end{cfa}
    2562 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    2563  1 2 3
    2564 \end{cfa}
    2565 \begin{cfa}[mathescape=off,aboveskip=0pt,belowskip=0pt]
    2566 sout | 1 | sepOff | 2 | 3 | endl;                       §\C{// locally turn off implicit separator}§
    2567 \end{cfa}
    2568 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    2569 12 3
    2570 \end{cfa}
    2571 
    2572 \item
    2573 Manipulators \Indexc{sepDisable}\index{manipulator!sepDisable@©sepDisable©} and \Indexc{sepEnable}\index{manipulator!sepEnable@©sepEnable©} \emph{globally} toggle printing the separator, \ie the seperator is adjusted with respect to all subsequent printed items, unless locally adjusted.
    2574 \begin{cfa}[mathescape=off,aboveskip=0pt,belowskip=0pt]
    2575 sout | sepDisable | 1 | 2 | 3 | endl;           §\C{// globally turn off implicit separation}§
    2576 \end{cfa}
    2577 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
     2696\begin{cfa}[showspaces=true,aboveskip=0pt]
     26971® ®2® ®3 ®" "®
     2698\end{cfa}
     2699©sepGet© can be used to store a separator and then restore it:
     2700\begin{cfa}[belowskip=0pt]
     2701char store[®sepSize®];                                          §\C{// sepSize is the maximum separator size}§
     2702strcpy( store, sepGet( sout ) );                          §\C{// copy current separator}§
     2703sepSet( sout, "_" );                                            §\C{// change separator to underscore}§
     2704sout | 1 | 2 | 3 | endl;
     2705\end{cfa}
     2706\begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
     27071®_®2®_®3
     2708\end{cfa}
     2709\begin{cfa}[belowskip=0pt]
     2710sepSet( sout, store );                                          §\C{// change separator back to original}§
     2711sout | 1 | 2 | 3 | endl;
     2712\end{cfa}
     2713\begin{cfa}[showspaces=true,aboveskip=0pt]
     27141® ®2® ®3
     2715\end{cfa}
     2716
     2717\item
     2718Routine \Indexc{sepSetTuple}\index{manipulator!sepSetTuple@©sepSetTuple©} and \Indexc{sepTuple}\index{manipulator!sepTuple@©sepTuple©}/\Indexc{sepGetTuple}\index{manipulator!sepGetTuple@©sepGetTuple©} get and set the tuple separator-string.
     2719The tuple separator-string can be at most 16 characters including the ©'\0'© string terminator (15 printable characters).
     2720\begin{cfa}[belowskip=0pt]
     2721sepSetTuple( sout, " " );                                       §\C{// set tuple separator from ", " to " "}§
     2722sout | t1 | t2 | " \"" | ®sepTuple® | "\"" | endl;
     2723\end{cfa}
     2724\begin{cfa}[showspaces=true,aboveskip=0pt]
     27251 2 3 4 5 6 ®" "®
     2726\end{cfa}
     2727\begin{cfa}[belowskip=0pt]
     2728sepSetTuple( sout, ", " );                                      §\C{// reset tuple separator to ", "}§
     2729sout | t1 | t2 | " \"" | ®sepGetTuple( sout )® | "\"" | endl;
     2730\end{cfa}
     2731\begin{cfa}[showspaces=true,aboveskip=0pt]
     27321, 2, 3 4, 5, 6 ®", "®
     2733\end{cfa}
     2734As for ©sepGet©, ©sepGetTuple© can be use to store a tuple separator and then restore it.
     2735
     2736\item
     2737Manipulators \Indexc{sepDisable}\index{manipulator!sepDisable@©sepDisable©} and \Indexc{sepEnable}\index{manipulator!sepEnable@©sepEnable©} \emph{globally} toggle printing the separator, \ie the seperator is adjusted with respect to all subsequent printed items.
     2738\begin{cfa}[belowskip=0pt]
     2739sout | sepDisable | 1 | 2 | 3 | endl;           §\C{// globally turn off implicit separator}§
     2740\end{cfa}
     2741\begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
    25782742123
    25792743\end{cfa}
    2580 \begin{cfa}[mathescape=off,aboveskip=0pt,belowskip=0pt]
    2581 sout | 1 | sepOn | 2 | 3 | endl;                        §\C{// locally turn on implicit separator}§
    2582 \end{cfa}
    2583 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    2584 1 23
    2585 \end{cfa}
    2586 \begin{cfa}[mathescape=off,aboveskip=0pt,belowskip=0pt]
    2587 sout | sepEnable | 1 | 2 | 3 | endl;            §\C{// globally turn on implicit separation}§
     2744\begin{cfa}[belowskip=0pt]
     2745sout | sepEnable | 1 | 2 | 3 | endl;            §\C{// globally turn on implicit separator}§
    25882746\end{cfa}
    25892747\begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
     
    25922750
    25932751\item
    2594 Routine \Indexc{sepSetTuple}\index{manipulator!sepSetTuple@©sepSetTuple©} and \Indexc{sepGetTuple}\index{manipulator!sepGetTuple@©sepGetTuple©} get and set the tuple separator-string.
    2595 The tuple separator-string can be at most 16 characters including the ©'\0'© string terminator (15 printable characters).
    2596 \begin{cfa}[mathescape=off,aboveskip=0pt,belowskip=0pt]
    2597 sepSetTuple( sout, " " );                                       §\C{// set tuple separator from ", " to " "}§
    2598 sout | t1 | t2 | " \"" | ®sepGetTuple( sout )® | "\"" | endl;
    2599 \end{cfa}
    2600 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt]
    2601 1 2 3 4 ®" "®
    2602 \end{cfa}
    2603 \begin{cfa}[mathescape=off,aboveskip=0pt,belowskip=0pt]
    2604 sepSetTuple( sout, ", " );                                      §\C{// reset tuple separator to ", "}§
    2605 sout | t1 | t2 | " \"" | ®sepGetTuple( sout )® | "\"" | endl;
    2606 \end{cfa}
    2607 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt]
    2608 1, 2, 3, 4 ®", "®
    2609 \end{cfa}
    2610 
    2611 \item
    2612 The tuple separator can also be turned on and off.
    2613 \begin{cfa}[mathescape=off,aboveskip=0pt,belowskip=0pt]
    2614 sout | sepOn | t1 | sepOff | t2 | endl;         §\C{// locally turn on/off implicit separation}§
    2615 \end{cfa}
    2616 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]
    2617 , 1, 23, 4
    2618 \end{cfa}
    2619 Notice a tuple seperator starts the line because the next item is a tuple.
     2752Manipulators \Indexc{sepOn}\index{manipulator!sepOn@©sepOn©} and \Indexc{sepOff}\index{manipulator!sepOff@©sepOff©} \emph{locally} toggle printing the separator, \ie the seperator is adjusted only with respect to the next printed item.
     2753\begin{cfa}[belowskip=0pt]
     2754sout | 1 | sepOff | 2 | 3 | endl;                       §\C{// locally turn off implicit separator}§
     2755\end{cfa}
     2756\begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
     275712 3
     2758\end{cfa}
     2759\begin{cfa}[belowskip=0pt]
     2760sout | sepDisable | 1 | sepOn | 2 | 3 | endl; §\C{// locally turn on implicit separator}§
     2761\end{cfa}
     2762\begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
     27631 23
     2764\end{cfa}
     2765The tuple separator also responses to being turned on and off.
     2766\begin{cfa}[belowskip=0pt]
     2767sout | t1 | sepOff | t2 | endl;                         §\C{// locally turn on/off implicit separator}§
     2768\end{cfa}
     2769\begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
     27701, 2, 34, 5, 6
     2771\end{cfa}
     2772©sepOn© \emph{cannot} be used to start/end a line with a separator because separators do not appear at the start/end of a line;
     2773use ©sep© to accomplish this functionality.
     2774\begin{cfa}[belowskip=0pt]
     2775sout | sepOn | 1 | 2 | 3 | sepOn | endl ;       §\C{// sepOn does nothing at start/end of line}§
     2776\end{cfa}
     2777\begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
     27781 2 3
     2779\end{cfa}
     2780\begin{cfa}[belowskip=0pt]
     2781sout | sep | 1 | 2 | 3 | sep | endl ;           §\C{// use sep to print separator at start/end of line}§
     2782\end{cfa}
     2783\begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt]
     2784® ®1 2 3® ®
     2785\end{cfa}
    26202786\end{enumerate}
    26212787
    26222788\begin{comment}
    26232789#include <fstream>
     2790#include <string.h>                                                                             // strcpy
    26242791
    26252792int main( void ) {
    26262793        int x = 1, y = 2, z = 3;
    26272794        sout | x | y | z | endl;
    2628         [int, int] t1 = [1, 2], t2 = [3, 4];
    2629         sout | t1 | t2 | endl;                                          // print tuple
     2795        [int, [ int, int ] ] t1 = [ 1, [ 2, 3 ] ], t2 = [ 4, [ 5, 6 ] ];
     2796        sout | t1 | t2 | endl;                                          // print tuples
    26302797        sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl;
    26312798        sout | 1 | 2 | 3 | endl;
     
    26402807
    26412808        sepSet( sout, ", $" );                                          // set separator from " " to ", $"
    2642         sout | 1 | 2 | 3 | " \"" | sepGet( sout ) | "\"" | endl;
     2809        sout | 1 | 2 | 3 | " \"" | sep | "\"" | endl;
    26432810        sepSet( sout, " " );                                            // reset separator to " "
    26442811        sout | 1 | 2 | 3 | " \"" | sepGet( sout ) | "\"" | endl;
    26452812
    2646         sout | sepOn | 1 | 2 | 3 | sepOn | endl;        // separator at start of line
    2647         sout | 1 | sepOff | 2 | 3 | endl;                       // locally turn off implicit separator
    2648 
    2649         sout | sepDisable | 1 | 2 | 3 | endl;           // globally turn off implicit separation
    2650         sout | 1 | sepOn | 2 | 3 | endl;                        // locally turn on implicit separator
    2651         sout | sepEnable | 1 | 2 | 3 | endl;            // globally turn on implicit separation
     2813        char store[sepSize];
     2814        strcpy( store, sepGet( sout ) );
     2815        sepSet( sout, "_" );
     2816        sout | 1 | 2 | 3 | endl;
     2817        sepSet( sout, store );
     2818        sout | 1 | 2 | 3 | endl;
    26522819
    26532820        sepSetTuple( sout, " " );                                       // set tuple separator from ", " to " "
    2654         sout | t1 | t2 | " \"" | sepGetTuple( sout ) | "\"" | endl;
     2821        sout | t1 | t2 | " \"" | sepTuple | "\"" | endl;
    26552822        sepSetTuple( sout, ", " );                                      // reset tuple separator to ", "
    26562823        sout | t1 | t2 | " \"" | sepGetTuple( sout ) | "\"" | endl;
    26572824
    2658         sout | t1 | t2 | endl;                                          // print tuple
    2659         sout | sepOn | t1 | sepOff | t2 | endl;         // locally turn on/off implicit separation
     2825        sout | sepDisable | 1 | 2 | 3 | endl;           // globally turn off implicit separator
     2826        sout | sepEnable | 1 | 2 | 3 | endl;            // globally turn on implicit separator
     2827       
     2828        sout | 1 | sepOff | 2 | 3 | endl;                       // locally turn on implicit separator
     2829        sout | sepDisable | 1 | sepOn | 2 | 3 | endl; // globally turn off implicit separator
     2830        sout | sepEnable;
     2831        sout | t1 | sepOff | t2 | endl;                         // locally turn on/off implicit separator
     2832
     2833        sout | sepOn | 1 | 2 | 3 | sepOn | endl ;       // sepOn does nothing at start/end of line
     2834        sout | sep | 1 | 2 | 3 | sep | endl ;           // use sep to print separator at start/end of line
    26602835}
    26612836
     
    51895364
    51905365
    5191 \section{\protect\CFA Keywords}
     5366\section{\texorpdfstring{\CFA Keywords}{Cforall Keywords}}
    51925367\label{s:CFAKeywords}
    51935368
     5369\CFA introduces the following new keywords.
     5370
    51945371\begin{quote2}
    5195 \begin{tabular}{llll}
     5372\begin{tabular}{lllll}
    51965373\begin{tabular}{@{}l@{}}
    5197 ©_AT©                   \\
     5374©_At©                   \\
    51985375©catch©                 \\
    51995376©catchResume©   \\
    52005377©choose©                \\
    52015378©coroutine©             \\
    5202 ©disable©               \\
    52035379\end{tabular}
    52045380&
    52055381\begin{tabular}{@{}l@{}}
     5382©disable©               \\
    52065383©dtype©                 \\
    52075384©enable©                \\
    52085385©fallthrough©   \\
    52095386©fallthru©              \\
    5210 ©finally©               \\
    5211 ©forall©                \\
    52125387\end{tabular}
    52135388&
    52145389\begin{tabular}{@{}l@{}}
     5390©finally©               \\
     5391©forall©                \\
    52155392©ftype©                 \\
    52165393©lvalue©                \\
    52175394©monitor©               \\
     5395\end{tabular}
     5396&
     5397\begin{tabular}{@{}l@{}}
    52185398©mutex©                 \\
    52195399©one_t©                 \\
    52205400©otype©                 \\
     5401©throw©                 \\
     5402©throwResume©   \\
    52215403\end{tabular}
    52225404&
    52235405\begin{tabular}{@{}l@{}}
    5224 ©throw©                 \\
    5225 ©throwResume©   \\
    52265406©trait©                 \\
    52275407©try©                   \\
    52285408©ttype©                 \\
    52295409©zero_t©                \\
     5410                                \\
    52305411\end{tabular}
    52315412\end{tabular}
     
    54025583\Celeven prescribes the following standard header-files~\cite[\S~7.1.2]{C11} and \CFA adds to this list:
    54035584\begin{quote2}
    5404 \lstset{deletekeywords={float}}
    5405 \begin{tabular}{@{}llll|l@{}}
    5406 \multicolumn{4}{c|}{C11} & \multicolumn{1}{c}{\CFA}             \\
     5585\begin{tabular}{@{}lllll|l@{}}
     5586\multicolumn{5}{c|}{C11} & \multicolumn{1}{c}{\CFA}             \\
    54075587\hline
    54085588\begin{tabular}{@{}l@{}}
     
    54125592\Indexc{errno.h}                \\
    54135593\Indexc{fenv.h}                 \\
    5414 \Indexc{float.h}                \\
    5415 \Indexc{inttypes.h}             \\
    5416 \Indexc{iso646.h}               \\
     5594\Indexc[deletekeywords=float]{float.h} \\
    54175595\end{tabular}
    54185596&
    54195597\begin{tabular}{@{}l@{}}
     5598\Indexc{inttypes.h}             \\
     5599\Indexc{iso646.h}               \\
    54205600\Indexc{limits.h}               \\
    54215601\Indexc{locale.h}               \\
    54225602\Indexc{math.h}                 \\
    54235603\Indexc{setjmp.h}               \\
     5604\end{tabular}
     5605&
     5606\begin{tabular}{@{}l@{}}
    54245607\Indexc{signal.h}               \\
    54255608\Indexc{stdalign.h}             \\
    54265609\Indexc{stdarg.h}               \\
    54275610\Indexc{stdatomic.h}    \\
     5611\Indexc{stdbool.h}              \\
     5612\Indexc{stddef.h}               \\
    54285613\end{tabular}
    54295614&
    54305615\begin{tabular}{@{}l@{}}
    5431 \Indexc{stdbool.h}              \\
    5432 \Indexc{stddef.h}               \\
    54335616\Indexc{stdint.h}               \\
    54345617\Indexc{stdio.h}                \\
     
    54465629\Indexc{wctype.h}               \\
    54475630                                                \\
    5448                                                 \\
    5449                                                 \\
    54505631\end{tabular}
    54515632&
     
    54535634\Indexc{unistd.h}               \\
    54545635\Indexc{gmp.h}                  \\
    5455                                                 \\
    5456                                                 \\
    54575636                                                \\
    54585637                                                \\
     
    54875666For an increase in storage size, new storage after the copied data may be filled.
    54885667\item[alignment]
    5489 an allocation starts on a specified memory boundary, e.g., an address multiple of 64 or 128 for cache-line purposes.
     5668an allocation starts on a specified memory boundary, \eg, an address multiple of 64 or 128 for cache-line purposes.
    54905669\item[array]
    54915670the allocation size is scaled to the specified number of array elements.
     
    54945673The table shows allocation routines supporting different combinations of storage-management capabilities:
    54955674\begin{center}
    5496 \begin{tabular}{@{}lr|l|l|l|l@{}}
    5497                 &                                       & \multicolumn{1}{c|}{fill}     & resize        & alignment     & array \\
     5675\begin{tabular}{@{}r|r|l|l|l|l@{}}
     5676\multicolumn{1}{c}{}&           & \multicolumn{1}{c|}{fill}     & resize        & alignment     & array \\
    54985677\hline
    54995678C               & ©malloc©                      & no                    & no            & no            & no    \\
     
    55025681                & ©memalign©            & no                    & no            & yes           & no    \\
    55035682                & ©posix_memalign©      & no                    & no            & yes           & no    \\
     5683\hline
    55045684C11             & ©aligned_alloc©       & no                    & no            & yes           & no    \\
     5685\hline
    55055686\CFA    & ©alloc©                       & no/copy/yes   & no/yes        & no            & yes   \\
    55065687                & ©align_alloc©         & no/yes                & no            & yes           & yes   \\
     
    55135694// C unsafe allocation
    55145695extern "C" {
    5515 void * mallac( size_t size );§\indexc{memset}§
     5696void * malloc( size_t size );§\indexc{memset}§
    55165697void * calloc( size_t dim, size_t size );§\indexc{calloc}§
    55175698void * realloc( void * ptr, size_t size );§\indexc{realloc}§
  • src/CodeGen/CodeGenerator.cc

    rfea3faa rb826e6b  
    1414//
    1515
    16 #include <algorithm>
    17 #include <iostream>
    18 #include <cassert>
    19 #include <list>
    20 
    21 #include "Parser/ParseNode.h"
    22 
    23 #include "SynTree/Declaration.h"
    24 #include "SynTree/Expression.h"
    25 #include "SynTree/Initializer.h"
    26 #include "SynTree/Statement.h"
    27 #include "SynTree/Type.h"
    28 #include "SynTree/Attribute.h"
    29 
    30 #include "Common/utility.h"
    31 #include "Common/UnimplementedError.h"
     16#include <cassert>                   // for assert, assertf
     17#include <list>                      // for _List_iterator, list, list<>::it...
    3218
    3319#include "CodeGenerator.h"
    34 #include "OperatorTable.h"
    35 #include "GenType.h"
    36 
    37 #include "InitTweak/InitTweak.h"
     20#include "Common/SemanticError.h"    // for SemanticError
     21#include "Common/UniqueName.h"       // for UniqueName
     22#include "Common/utility.h"          // for CodeLocation, toString
     23#include "GenType.h"                 // for genType
     24#include "InitTweak/InitTweak.h"     // for getPointerBase
     25#include "OperatorTable.h"           // for OperatorInfo, operatorLookup
     26#include "Parser/LinkageSpec.h"      // for Spec, Intrinsic
     27#include "SynTree/Attribute.h"       // for Attribute
     28#include "SynTree/BaseSyntaxNode.h"  // for BaseSyntaxNode
     29#include "SynTree/Constant.h"        // for Constant
     30#include "SynTree/Declaration.h"     // for DeclarationWithType, TypeDecl
     31#include "SynTree/Expression.h"      // for Expression, UntypedExpr, Applica...
     32#include "SynTree/Initializer.h"     // for Initializer, ListInit, Designation
     33#include "SynTree/Label.h"           // for Label, operator<<
     34#include "SynTree/Statement.h"       // for Statement, AsmStmt, BranchStmt
     35#include "SynTree/Type.h"            // for Type, Type::StorageClasses, Func...
    3836
    3937using namespace std;
     
    288286        }
    289287
    290         void CodeGenerator::printDesignators( std::list< Expression * > & designators ) {
    291                 typedef std::list< Expression * > DesignatorList;
     288        void CodeGenerator::visit( Designation * designation ) {
     289                std::list< Expression * > designators = designation->get_designators();
    292290                if ( designators.size() == 0 ) return;
    293                 for ( DesignatorList::iterator iter = designators.begin(); iter != designators.end(); ++iter ) {
    294                         if ( dynamic_cast< NameExpr * >( *iter ) ) {
    295                                 // if expression is a name, then initializing aggregate member
     291                for ( Expression * des : designators ) {
     292                        if ( dynamic_cast< NameExpr * >( des ) || dynamic_cast< VariableExpr * >( des ) ) {
     293                                // if expression is a NameExpr or VariableExpr, then initializing aggregate member
    296294                                output << ".";
    297                                 (*iter)->accept( *this );
     295                                des->accept( *this );
    298296                        } else {
    299                                 // if not a simple name, it has to be a constant expression, i.e. an array designator
     297                                // otherwise, it has to be a ConstantExpr or CastExpr, initializing array eleemnt
    300298                                output << "[";
    301                                 (*iter)->accept( *this );
     299                                des->accept( *this );
    302300                                output << "]";
    303301                        } // if
     
    307305
    308306        void CodeGenerator::visit( SingleInit * init ) {
    309                 printDesignators( init->get_designators() );
    310307                init->get_value()->accept( *this );
    311308        }
    312309
    313310        void CodeGenerator::visit( ListInit * init ) {
    314                 printDesignators( init->get_designators() );
     311                auto initBegin = init->begin();
     312                auto initEnd = init->end();
     313                auto desigBegin = init->get_designations().begin();
     314                auto desigEnd = init->get_designations().end();
     315
    315316                output << "{ ";
    316                 genCommaList( init->begin(), init->end() );
     317                for ( ; initBegin != initEnd && desigBegin != desigEnd; ) {
     318                        (*desigBegin)->accept( *this );
     319                        (*initBegin)->accept( *this );
     320                        ++initBegin, ++desigBegin;
     321                        if ( initBegin != initEnd ) {
     322                                output << ", ";
     323                        }
     324                }
    317325                output << " }";
     326                assertf( initBegin == initEnd && desigBegin == desigEnd, "Initializers and designators not the same length. %s", toString( init ).c_str() );
    318327        }
    319328
     
    716725
    717726        void CodeGenerator::visit( TypeExpr * typeExpr ) {
    718                 assertf( ! genC, "TypeExpr should not reach code generation." );
    719                 output<< genType( typeExpr->get_type(), "", pretty, genC );
     727                // if ( genC ) std::cerr << "typeexpr still exists: " << typeExpr << std::endl;
     728                // assertf( ! genC, "TypeExpr should not reach code generation." );
     729                if ( ! genC ) {
     730                        output<< genType( typeExpr->get_type(), "", pretty, genC );
     731                }
    720732        }
    721733
  • src/CodeGen/CodeGenerator.h

    rfea3faa rb826e6b  
    1717#define CODEGENV_H
    1818
    19 #include <list>
     19#include <list>                   // for list
     20#include <ostream>                // for ostream, operator<<
     21#include <string>                 // for string
    2022
    21 #include "SynTree/Declaration.h"
    22 #include "SynTree/SynTree.h"
    23 #include "SynTree/Visitor.h"
    24 
    25 #include "SymTab/Indexer.h"
    26 
    27 #include "Common/utility.h"
     23#include "SynTree/Declaration.h"  // for DeclarationWithType (ptr only), Fun...
     24#include "SynTree/Visitor.h"      // for Visitor
     25#include "SynTree/SynTree.h"      // for Visitor Nodes
    2826
    2927namespace CodeGen {
     
    4745
    4846                //*** Initializer
     47                virtual void visit( Designation * );
    4948                virtual void visit( SingleInit * );
    5049                virtual void visit( ListInit * );
     
    137136                bool lineMarks = false;
    138137
    139                 void printDesignators( std::list< Expression * > & );
    140138                void handleStorageClass( DeclarationWithType *decl );
    141139                void handleAggregate( AggregateDecl *aggDecl, const std::string & kind );
  • src/CodeGen/FixMain.cc

    rfea3faa rb826e6b  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // FixMain.cc -- 
     7// FixMain.cc --
    88//
    99// Author           : Thierry Delisle
    1010// Created On       : Thr Jan 12 14:11:09 2017
    11 // Last Modified By : 
    12 // Last Modified On : 
     11// Last Modified By :
     12// Last Modified On :
    1313// Update Count     : 0
    1414//
    1515
    1616
    17 #include "FixMain.h"   
     17#include "FixMain.h"
    1818
    19 #include <fstream>
    20 #include <iostream>
     19#include <cassert>                 // for assert, assertf
     20#include <fstream>                 // for operator<<, basic_ostream::operator<<
     21#include <list>                    // for list
     22#include <string>                  // for operator<<
    2123
    22 #include "Common/SemanticError.h"
    23 #include "SynTree/Declaration.h"
     24#include "Common/SemanticError.h"  // for SemanticError
     25#include "SynTree/Declaration.h"   // for FunctionDecl, operator<<
     26#include "SynTree/Type.h"          // for FunctionType
    2427
    2528namespace CodeGen {
    2629        bool FixMain::replace_main = false;
    2730        std::unique_ptr<FunctionDecl> FixMain::main_signature = nullptr;
    28        
    29         void FixMain::registerMain(FunctionDecl* functionDecl) 
     31
     32        void FixMain::registerMain(FunctionDecl* functionDecl)
    3033        {
    31                 if(main_signature) { 
    32                         throw SemanticError("Multiple definition of main routine\n", functionDecl); 
     34                if(main_signature) {
     35                        throw SemanticError("Multiple definition of main routine\n", functionDecl);
    3336                }
    3437                main_signature.reset( functionDecl->clone() );
  • src/CodeGen/FixNames.cc

    rfea3faa rb826e6b  
    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 : Wed Jun 21 14:22:59 2017
    13 // Update Count     : 19
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Jun 28 15:26:00 2017
     13// Update Count     : 20
    1414//
    1515
    16 #include <memory>
     16#include "FixNames.h"
    1717
    18 #include "FixNames.h"
    19 #include "SynTree/Declaration.h"
    20 #include "SynTree/Expression.h"
    21 #include "SynTree/Visitor.h"
    22 #include "SymTab/Mangler.h"
    23 #include "OperatorTable.h"
    24 #include "FixMain.h"
     18#include <memory>                  // for unique_ptr
     19#include <string>                  // for string, operator!=, operator==
     20
     21#include "Common/SemanticError.h"  // for SemanticError
     22#include "FixMain.h"               // for FixMain
     23#include "Parser/LinkageSpec.h"    // for Cforall, isMangled
     24#include "SymTab/Mangler.h"        // for Mangler
     25#include "SynTree/Constant.h"      // for Constant
     26#include "SynTree/Declaration.h"   // for FunctionDecl, ObjectDecl, Declarat...
     27#include "SynTree/Expression.h"    // for ConstantExpr
     28#include "SynTree/Label.h"         // for Label, noLabels
     29#include "SynTree/Statement.h"     // for ReturnStmt, CompoundStmt
     30#include "SynTree/Type.h"          // for Type, BasicType, Type::Qualifiers
     31#include "SynTree/Visitor.h"       // for Visitor, acceptAll
    2532
    2633namespace CodeGen {
     
    4249                                                                                                                                   main_type = new FunctionType( Type::Qualifiers(), true ), nullptr )
    4350                                };
    44                 main_type->get_returnVals().push_back( 
     51                main_type->get_returnVals().push_back(
    4552                        new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr )
    4653                );
     
    5259        std::string mangle_main_args() {
    5360                FunctionType* main_type;
    54                 std::unique_ptr<FunctionDecl> mainDecl { new FunctionDecl( "main", Type::StorageClasses(), LinkageSpec::Cforall, 
     61                std::unique_ptr<FunctionDecl> mainDecl { new FunctionDecl( "main", Type::StorageClasses(), LinkageSpec::Cforall,
    5562                                                                                                                                   main_type = new FunctionType( Type::Qualifiers(), false ), nullptr )
    5663                                };
    57                 main_type->get_returnVals().push_back( 
     64                main_type->get_returnVals().push_back(
    5865                        new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr )
    5966                );
    6067
    61                 mainDecl->get_functionType()->get_parameters().push_back( 
     68                mainDecl->get_functionType()->get_parameters().push_back(
    6269                        new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr )
    6370                );
    6471
    65                 mainDecl->get_functionType()->get_parameters().push_back( 
    66                         new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, 
    67                         new PointerType( Type::Qualifiers(), new PointerType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::Char ) ) ), 
     72                mainDecl->get_functionType()->get_parameters().push_back(
     73                        new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0,
     74                        new PointerType( Type::Qualifiers(), new PointerType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::Char ) ) ),
    6875                        nullptr )
    6976                );
     
    7582
    7683        bool is_main(const std::string& name) {
    77                 static std::string mains[] = { 
    78                         mangle_main(), 
     84                static std::string mains[] = {
     85                        mangle_main(),
    7986                        mangle_main_args()
    8087                };
     
    93100        void FixNames::fixDWT( DeclarationWithType *dwt ) {
    94101                if ( dwt->get_name() != "" ) {
    95                         if ( LinkageSpec::isDecoratable( dwt->get_linkage() ) ) {
     102                        if ( LinkageSpec::isMangled( dwt->get_linkage() ) ) {
    96103                                dwt->set_mangleName( SymTab::Mangler::mangle( dwt ) );
    97104                                dwt->set_scopeLevel( scopeLevel );
     
    112119                        int nargs = functionDecl->get_functionType()->get_parameters().size();
    113120                        if( !(nargs == 0 || nargs == 2 || nargs == 3) ) {
    114                                 throw SemanticError("Main expected to have 0, 2 or 3 arguments\n", functionDecl); 
     121                                throw SemanticError("Main expected to have 0, 2 or 3 arguments\n", functionDecl);
    115122                        }
    116123                        functionDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new ConstantExpr( Constant::from_int( 0 ) ) ) );
  • src/CodeGen/FixNames.h

    rfea3faa rb826e6b  
    1717#define FIXNAMES_H
    1818
    19 #include "SynTree/SynTree.h"
     19#include <list>  // for list
     20
     21class Declaration;
    2022
    2123namespace CodeGen {
  • src/CodeGen/GenType.cc

    rfea3faa rb826e6b  
    1414//
    1515
    16 #include <sstream>
    17 #include <cassert>
    18 
     16#include <cassert>                // for assert, assertf
     17#include <list>                   // for _List_iterator, _List_const_iterator
     18#include <sstream>                // for operator<<, ostringstream, basic_os...
     19
     20#include "CodeGenerator.h"        // for CodeGenerator
    1921#include "GenType.h"
    20 #include "CodeGenerator.h"
    21 
    22 #include "SynTree/Declaration.h"
    23 #include "SynTree/Expression.h"
    24 #include "SynTree/Type.h"
    25 #include "SynTree/Visitor.h"
     22#include "SynTree/Declaration.h"  // for DeclarationWithType
     23#include "SynTree/Expression.h"   // for Expression
     24#include "SynTree/Type.h"         // for PointerType, Type, FunctionType
     25#include "SynTree/Visitor.h"      // for Visitor
    2626
    2727namespace CodeGen {
  • src/CodeGen/GenType.h

    rfea3faa rb826e6b  
    1717#define _GENTYPE_H
    1818
    19 #include <string>
    20 #include "SynTree/SynTree.h"
     19#include <string>  // for string
     20
     21class Type;
    2122
    2223namespace CodeGen {
  • src/CodeGen/Generate.cc

    rfea3faa rb826e6b  
    1414//
    1515
    16 #include <algorithm>
    17 #include <iostream>
    18 #include <cassert>
    19 #include <list>
     16#include <iostream>                  // for ostream, endl, operator<<
     17#include <list>                      // for list
     18#include <string>                    // for operator<<
    2019
     20#include "CodeGenerator.h"           // for CodeGenerator, doSemicolon, oper...
     21#include "GenType.h"                 // for genPrettyType
    2122#include "Generate.h"
    22 #include "SynTree/Declaration.h"
    23 #include "CodeGenerator.h"
    24 #include "GenType.h"
    25 #include "SynTree/SynTree.h"
    26 #include "SynTree/Type.h"
    27 #include "SynTree/BaseSyntaxNode.h"
    28 // #include "Tuples/Tuples.h"
     23#include "Parser/LinkageSpec.h"      // for isBuiltin, isGeneratable
     24#include "SynTree/BaseSyntaxNode.h"  // for BaseSyntaxNode
     25#include "SynTree/Declaration.h"     // for Declaration
     26#include "SynTree/Type.h"            // for Type
    2927
    3028using namespace std;
  • src/CodeGen/Generate.h

    rfea3faa rb826e6b  
    1717#define GENERATE_H
    1818
    19 #include <list>
    20 #include <iostream>
     19#include <iostream>  // for ostream
     20#include <list>      // for list
    2121
    22 #include "SynTree/SynTree.h"
     22class BaseSyntaxNode;
     23class Declaration;
    2324
    2425namespace CodeGen {
  • src/CodeGen/OperatorTable.cc

    rfea3faa rb826e6b  
    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
    16 #include <map>
     16#include <map>      // for map, _Rb_tree_const_iterator, map<>::const_iterator
     17#include <utility>  // for pair
     18
    1719#include "OperatorTable.h"
    1820
     
    3335                        {       "++?",          "++",   "_operator_preincr",                    OT_PREFIXASSIGN         },
    3436                        {       "--?",          "--",   "_operator_predecr",                    OT_PREFIXASSIGN         },
     37                        {       "?\\?",         "\\",   "_operator_exponential",                OT_INFIX                        },
    3538                        {       "?*?",          "*",    "_operator_multiply",                   OT_INFIX                        },
    3639                        {       "?/?",          "/",    "_operator_divide",                             OT_INFIX                        },
     
    5053                        {       "?|?",          "|",    "_operator_bitor",                              OT_INFIX                        },
    5154                        {       "?=?",          "=",    "_operator_assign",                             OT_INFIXASSIGN          },
     55                        {       "?\\=?",        "\\=",  "_operator_expassign",                  OT_INFIXASSIGN          },
    5256                        {       "?*=?",         "*=",   "_operator_multassign",                 OT_INFIXASSIGN          },
    5357                        {       "?/=?",         "/=",   "_operator_divassign",                  OT_INFIXASSIGN          },
  • src/CodeTools/DeclStats.cc

    rfea3faa rb826e6b  
    1616#include "DeclStats.h"
    1717
    18 #include <iostream>
    19 #include <map>
    20 #include <sstream>
    21 #include <string>
    22 #include <unordered_map>
    23 #include <unordered_set>
    24 
    25 #include "Common/VectorMap.h"
    26 #include "GenPoly/GenPoly.h"
    27 #include "Parser/LinkageSpec.h"
    28 #include "SynTree/Declaration.h"
    29 #include "SynTree/Visitor.h"
     18#include <iostream>                // for operator<<, basic_ostream, cout
     19#include <map>                     // for map
     20#include <string>                  // for string, operator+, operator<<, cha...
     21#include <unordered_map>           // for unordered_map
     22#include <unordered_set>           // for unordered_set
     23#include <utility>                 // for pair, make_pair
     24
     25#include "Common/SemanticError.h"  // for SemanticError
     26#include "Common/VectorMap.h"      // for VectorMap
     27#include "GenPoly/GenPoly.h"       // for hasPolyBase
     28#include "Parser/LinkageSpec.h"    // for ::NoOfSpecs, Spec
     29#include "SynTree/Declaration.h"   // for FunctionDecl, TypeDecl, Declaration
     30#include "SynTree/Expression.h"    // for UntypedExpr, Expression
     31#include "SynTree/Statement.h"     // for CompoundStmt
     32#include "SynTree/Type.h"          // for Type, FunctionType, PointerType
     33#include "SynTree/Visitor.h"       // for maybeAccept, Visitor, acceptAll
    3034
    3135namespace CodeTools {
    32        
     36
    3337        class DeclStats : public Visitor {
    3438                template<typename T>
     
    7579                                sum(n_types, o.n_types);
    7680                                sum(p_new, o.p_new);
    77                                
     81
    7882                                return *this;
    7983                        }
    8084                };
    81                
     85
    8286                struct Stats {
    8387                        unsigned n_decls;     ///< Total number of declarations
     
    98102                        /// Stats for the return list
    99103                        ArgPackStats returns;
    100                        
     104
    101105                        /// Count of declarations with each number of assertions
    102106                        std::map<unsigned, unsigned> n_assns;
     
    105109                        /// Stats for the assertions' return types
    106110                        ArgPackStats assn_returns;
    107                        
     111
    108112                        Stats() : n_decls(0), n_type_params(), by_name(), basic_type_names(), compound_type_names(), basic_type_decls(), compound_type_decls(), params(), returns(), n_assns(), assn_params(), assn_returns() {}
    109113
     
    122126                                sum( assn_params, o.assn_params );
    123127                                sum( assn_returns, o.assn_returns );
    124                                
     128
    125129                                return *this;
    126130                        }
     
    144148
    145149                                n += dt->size();
    146                                
     150
    147151                                std::stringstream ss;
    148152                                dt->print( ss );
     
    176180                        ++pstats.n_types.at( types.size() );
    177181                }
    178                
     182
    179183                void analyzeFunc( FunctionType* fnTy, Stats& stats, ArgPackStats& params, ArgPackStats& returns ) {
    180184                        std::unordered_set<std::string> seen;
     
    186190                        auto& args = expr->get_args();
    187191                        unsigned fanout = args.size();
    188                        
     192
    189193                        ++exprs_by_fanout_at_depth[ std::make_pair(depth, fanout) ];
    190194                        for ( Expression* arg : args ) {
     
    205209                                return;
    206210                        }
    207                        
     211
    208212                        Stats& stats = for_linkage[ decl->get_linkage() ];
    209213
     
    323327                }
    324328
    325                 void printPairMap( const std::string& name, 
     329                void printPairMap( const std::string& name,
    326330                                   const std::map<std::pair<unsigned, unsigned>, unsigned>& map ) {
    327331                        for ( const auto& entry : map ) {
    328332                                const auto& key = entry.first;
    329                                 std::cout << "\"" << name << "\"," << key.first << "," << key.second << "," 
     333                                std::cout << "\"" << name << "\"," << key.first << "," << key.second << ","
    330334                                          << entry.second << std::endl;
    331335                        }
    332336                }
    333                
     337
    334338        public:
    335339                void print() {
     
    366370                stats.print();
    367371        }
    368        
     372
    369373} // namespace CodeTools
    370374
  • src/CodeTools/DeclStats.h

    rfea3faa rb826e6b  
    1717#define DECLSTATS_H
    1818
    19 #include "SynTree/SynTree.h"
     19#include <list>  // for list
     20
     21class Declaration;
    2022
    2123namespace CodeTools {
  • src/CodeTools/TrackLoc.cc

    rfea3faa rb826e6b  
    1616#include "TrackLoc.h"
    1717
    18 #include <cstdlib>
     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
    1924
    20 #include <iostream>
    21 #include <sstream>
    22 #include <stack>
    23 #include <string>
    24 #include <typeindex>
     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
    2532
    26 #include "Common/utility.h"
    27 #include "Common/PassVisitor.h"
    28 #include "Common/VectorMap.h"
    29 #include "GenPoly/GenPoly.h"
    30 #include "Parser/LinkageSpec.h"
    31 #include "SynTree/Declaration.h"
    32 #include "SynTree/Initializer.h"
     33class Declaration;
    3334
    3435namespace CodeTools {
  • src/CodeTools/TrackLoc.h

    rfea3faa rb826e6b  
    1717#define TRACKLOC_H
    1818
    19 #include "SynTree/SynTree.h"
     19#include <cstddef>   // for size_t
     20#include <list>      // for list
     21
     22class Declaration;
    2023
    2124namespace CodeTools {
  • src/Common/Assert.cc

    rfea3faa rb826e6b  
    1414//
    1515
    16 #include <assert.h>
    17 #include <cstdarg>                                                                              // varargs
    18 #include <cstdio>                                                                               // fprintf
    19 #include <cstdlib>                                                                              // abort
     16#include <cstdarg>  // for va_end, va_list, va_start
     17#include <cstdio>   // for fprintf, stderr, vfprintf
     18#include <cstdlib>  // for abort
    2019
    2120extern const char * __progname;                                                 // global name of running executable (argv[0])
  • src/Common/PassVisitor.h

    rfea3faa rb826e6b  
    1212#include "SynTree/Expression.h"
    1313#include "SynTree/Constant.h"
     14#include "SynTree/TypeSubstitution.h"
    1415
    1516#include "PassVisitor.proto.h"
     
    2627//                          stmtsToAddBefore or stmtsToAddAfter respectively.
    2728// | WithShortCircuiting  - provides the ability to skip visiting child nodes; set visit_children to false in pre{visit,mutate} to skip visiting children
    28 // | WithScopes           - provides the ability to save/restore data like a LIFO stack; to save, call GuardValue with the variable to save, the variable
     29// | WithGuards           - provides the ability to save/restore data like a LIFO stack; to save, call GuardValue with the variable to save, the variable
    2930//                          will automatically be restored to its previous value after the corresponding postvisit/postmutate teminates.
    3031//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     
    3233class PassVisitor final : public Visitor, public Mutator {
    3334public:
    34         PassVisitor() = default;
    3535
    3636        template< typename... Args >
     
    257257
    258258        void set_visit_children( bool& ref ) { bool_ref * ptr = visit_children_impl(pass, 0); if(ptr) ptr->set( ref ); }
    259 
    260         guard_value_impl init_guard() {
    261                 guard_value_impl guard;
    262                 auto at_cleanup = at_cleanup_impl(pass, 0);
    263                 if( at_cleanup ) {
    264                         *at_cleanup = [&guard]( cleanup_func_t && func, void* val ) {
    265                                 guard.push( std::move( func ), val );
    266                         };
    267                 }
    268                 return guard;
    269         }
    270259};
    271260
     
    283272
    284273public:
    285         TypeSubstitution * env;
     274        TypeSubstitution * env = nullptr;
    286275};
    287276
     
    295284        std::list< Statement* > stmtsToAddAfter;
    296285};
     286
     287class WithDeclsToAdd {
     288protected:
     289        WithDeclsToAdd() = default;
     290        ~WithDeclsToAdd() = default;
     291
     292public:
     293        std::list< Declaration* > declsToAddBefore;
     294        std::list< Declaration* > declsToAddAfter;
     295};
     296
    297297class WithShortCircuiting {
    298298protected:
     
    304304};
    305305
    306 class WithScopes {
    307 protected:
    308         WithScopes() = default;
    309         ~WithScopes() = default;
     306class WithGuards {
     307protected:
     308        WithGuards() = default;
     309        ~WithGuards() = default;
    310310
    311311public:
     
    318318                }, static_cast< void * >( & val ) );
    319319        }
     320
     321        template< typename T >
     322        void GuardScope( T& val ) {
     323                val.beginScope();
     324                at_cleanup( []( void * val ) {
     325                        static_cast< T * >( val )->endScope();
     326                }, static_cast< void * >( & val ) );
     327        }
     328
     329        template< typename Func >
     330        void GuardAction( Func func ) {
     331                at_cleanup( [func](__attribute__((unused)) void *) { func(); }, nullptr );
     332        }
    320333};
    321334
     
    323336class WithVisitorRef {
    324337protected:
    325         WithVisitorRef() = default;
    326         ~WithVisitorRef() = default;
    327 
    328 public:
    329         PassVisitor<pass_type> * const visitor;
     338        WithVisitorRef() {}
     339        ~WithVisitorRef() {}
     340
     341public:
     342        PassVisitor<pass_type> * const visitor = nullptr;
    330343};
    331344
  • src/Common/PassVisitor.impl.h

    rfea3faa rb826e6b  
    33#define VISIT_START( node )                     \
    44        __attribute__((unused))                   \
    5         const auto & guard = init_guard();        \
     5        guard_value_impl guard( at_cleanup_impl(pass, 0) );       \
    66        bool visit_children = true;               \
    77        set_visit_children( visit_children );   \
     
    1515#define MUTATE_START( node )                    \
    1616        __attribute__((unused))                   \
    17         const auto & guard = init_guard();        \
     17        guard_value_impl guard( at_cleanup_impl(pass, 0) );       \
    1818        bool visit_children = true;               \
    1919        set_visit_children( visit_children );   \
     
    6868        for ( std::list< Declaration* >::iterator i = decls.begin(); ; ++i ) {
    6969                // splice in new declarations after previous decl
    70                 if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); } 
     70                if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); }
    7171
    7272                if ( i == decls.end() ) break;
     
    8888        for ( std::list< Declaration* >::iterator i = decls.begin(); ; ++i ) {
    8989                // splice in new declarations after previous decl
    90                 if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); } 
     90                if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); }
    9191
    9292                if ( i == decls.end() ) break;
     
    104104void PassVisitor< pass_type >::handleStatementList( std::list< Statement * > & statements, func_t func ) {
    105105        SemanticError errors;
     106
     107        // don't want statements from outer CompoundStmts to be added to this CompoundStmt
     108        ValueGuardPtr< StmtList_t > oldBeforeStmts( get_beforeStmts() );
     109        ValueGuardPtr< StmtList_t > oldAfterStmts ( get_afterStmts () );
     110        ValueGuardPtr< DeclList_t > oldBeforeDecls( get_beforeDecls() );
     111        ValueGuardPtr< DeclList_t > oldAfterDecls ( get_afterDecls () );
    106112
    107113        StmtList_t* beforeStmts = get_beforeStmts();
     
    181187Statement * PassVisitor< pass_type >::visitStatement( Statement * stmt ) {
    182188        return handleStatement( stmt, [this]( Statement * stmt ) {
    183                 maybeAccept( stmt, *this ); 
     189                maybeAccept( stmt, *this );
    184190                return stmt;
    185191        });
     
    212218                expr->accept( *this );
    213219                return expr;
    214         });             
     220        });
    215221}
    216222
     
    565571        VISIT_START( node );
    566572
     573        // maybeAccept( node->get_env(), *this );
     574        maybeAccept( node->get_result(), *this );
     575
    567576        for ( auto expr : node->get_args() ) {
    568577                visitExpression( expr );
     
    575584Expression * PassVisitor< pass_type >::mutate( UntypedExpr * node ) {
    576585        MUTATE_START( node );
     586
     587        node->set_env( maybeMutate( node->get_env(), *this ) );
     588        node->set_result( maybeMutate( node->get_result(), *this ) );
    577589
    578590        for ( auto& expr : node->get_args() ) {
  • src/Common/PassVisitor.proto.h

    rfea3faa rb826e6b  
    55
    66typedef std::function<void( void * )> cleanup_func_t;
     7typedef std::function< void( cleanup_func_t, void * ) > at_cleanup_t;
    78
    89class guard_value_impl {
    910public:
    10         guard_value_impl() = default;
     11        guard_value_impl( at_cleanup_t * at_cleanup ) {
     12                if( at_cleanup ) {
     13                        *at_cleanup = [this]( cleanup_func_t && func, void* val ) {
     14                                push( std::move( func ), val );
     15                        };
     16                }
     17        }
    1118
    1219        ~guard_value_impl() {
     
    3340};
    3441
    35 typedef std::function< void( cleanup_func_t, void * ) > at_cleanup_t;
    3642
    3743class bool_ref {
     
    5662// Deep magic (a.k.a template meta programming) to make the templated visitor work
    5763// Basically the goal is to make 2 previsit_impl
    58 // 1 - Use when a pass implements a valid previsit. This uses overloading which means the any overload of 
     64// 1 - Use when a pass implements a valid previsit. This uses overloading which means the any overload of
    5965//     'pass.previsit( node )' that compiles will be used for that node for that type
    6066//     This requires that this option only compile for passes that actually define an appropriate visit.
  • src/Common/SemanticError.cc

    rfea3faa rb826e6b  
    1414//
    1515
    16 #include <iostream>
    17 #include <list>
    18 #include <string>
    19 #include <algorithm>
    20 #include <iterator>
     16#include <cstdio>            // for fileno, stderr
     17#include <unistd.h>          // for isatty
     18#include <iostream>          // for basic_ostream, operator<<, ostream
     19#include <list>              // for list, _List_iterator
     20#include <string>            // for string, operator<<, operator+, to_string
    2121
     22#include "Common/utility.h"  // for to_string, CodeLocation (ptr only)
    2223#include "SemanticError.h"
    23 
    24 #include <unistd.h>
    2524
    2625inline const std::string& error_str() {
  • src/Common/SemanticError.h

    rfea3faa rb826e6b  
    1717#define SEMANTICERROR_H
    1818
    19 #include <exception>
    20 #include <string>
    21 #include <sstream>
    22 #include <list>
    23 #include <iostream>
     19#include <exception>  // for exception
     20#include <iostream>   // for ostream
     21#include <list>       // for list
     22#include <string>     // for string
    2423
    25 #include "utility.h"
     24#include "utility.h"  // for CodeLocation, toString
    2625
    2726struct error {
  • src/Common/utility.h

    rfea3faa rb826e6b  
    305305// for ( val : group_iterate( container1, container2, ... ) ) {}
    306306// syntax to have a for each that iterates multiple containers of the same length
    307 // TODO: update to use variadic arguments
     307// TODO: update to use variadic arguments, perfect forwarding
    308308
    309309template< typename T1, typename T2 >
  • src/Concurrency/Keywords.cc

    rfea3faa rb826e6b  
    1717#include "Concurrency/Keywords.h"
    1818
    19 #include "InitTweak/InitTweak.h"
    20 #include "SymTab/AddVisit.h"
    21 #include "SynTree/Declaration.h"
    22 #include "SynTree/Expression.h"
    23 #include "SynTree/Initializer.h"
    24 #include "SynTree/Statement.h"
    25 #include "SynTree/Type.h"
    26 #include "SynTree/Visitor.h"
     19#include <cassert>                 // for assert
     20#include <string>                  // for string, operator==
     21
     22#include "Common/SemanticError.h"  // for SemanticError
     23#include "Common/utility.h"        // for deleteAll, map_range
     24#include "InitTweak/InitTweak.h"   // for isConstructor
     25#include "Parser/LinkageSpec.h"    // for Cforall
     26#include "SymTab/AddVisit.h"       // for acceptAndAdd
     27#include "SynTree/Constant.h"      // for Constant
     28#include "SynTree/Declaration.h"   // for StructDecl, FunctionDecl, ObjectDecl
     29#include "SynTree/Expression.h"    // for VariableExpr, ConstantExpr, Untype...
     30#include "SynTree/Initializer.h"   // for SingleInit, ListInit, Initializer ...
     31#include "SynTree/Label.h"         // for Label
     32#include "SynTree/Statement.h"     // for CompoundStmt, DeclStmt, ExprStmt
     33#include "SynTree/Type.h"          // for StructInstType, Type, PointerType
     34#include "SynTree/Visitor.h"       // for Visitor, acceptAll
     35
     36class Attribute;
    2737
    2838namespace Concurrency {
     
    322332                if( needs_main ) {
    323333                        FunctionType * main_type = new FunctionType( noQualifiers, false );
    324                        
     334
    325335                        main_type->get_parameters().push_back( this_decl->clone() );
    326336
     
    361371        void ConcurrentSueKeyword::addRoutines( ObjectDecl * field, FunctionDecl * func ) {
    362372                CompoundStmt * statement = new CompoundStmt( noLabels );
    363                 statement->push_back( 
     373                statement->push_back(
    364374                        new ReturnStmt(
    365375                                noLabels,
     
    386396        //=============================================================================================
    387397        void MutexKeyword::visit(FunctionDecl* decl) {
    388                 Visitor::visit(decl);           
     398                Visitor::visit(decl);
    389399
    390400                std::list<DeclarationWithType*> mutexArgs = findMutexArgs( decl );
     
    510520        void ThreadStarter::visit(FunctionDecl * decl) {
    511521                Visitor::visit(decl);
    512                
     522
    513523                if( ! InitTweak::isConstructor(decl->get_name()) ) return;
    514524
     
    528538                if( ! stmt ) return;
    529539
    530                 stmt->push_back( 
     540                stmt->push_back(
    531541                        new ExprStmt(
    532542                                noLabels,
  • src/Concurrency/Keywords.h

    rfea3faa rb826e6b  
    1818#define KEYWORDS_H
    1919
    20 #include <list>
     20#include <list>  // for list
    2121
    22 #include "SynTree/Declaration.h"
     22class Declaration;
    2323
    2424namespace Concurrency {
  • src/ControlStruct/ExceptTranslate.cc

    rfea3faa rb826e6b  
    1010// Created On       : Wed Jun 14 16:49:00 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Thr Jun 22 15:57:00 2017
    13 // Update Count     : 0
     12// Last Modified On : Tus Jul 18 10:09:00 2017
     13// Update Count     : 4
    1414//
    1515
    1616#include "ExceptTranslate.h"
    1717#include "Common/PassVisitor.h"
    18 
    19 namespace ControlFlow {
     18#include "SynTree/Statement.h"
     19#include "SynTree/Declaration.h"
     20#include "SynTree/Expression.h"
     21#include "SynTree/Type.h"
     22#include "SynTree/Attribute.h"
     23
     24namespace ControlStruct {
    2025
    2126        // This (large) section could probably be moved out of the class
     
    2429        // Type(Qualifiers &, false, std::list<Attribute *> &)
    2530
    26         // void (*function)()
    27         static FunctionType void_func_t(Type::Qualifiers(), false);
     31        // void (*function)();
     32        static FunctionType try_func_t(Type::Qualifiers(), false);
    2833        // void (*function)(int, exception);
    2934        static FunctionType catch_func_t(Type::Qualifiers(), false);
     
    3237        // bool (*function)(exception);
    3338        static FunctionType handle_func_t(Type::Qualifiers(), false);
     39        // void (*function)(__attribute__((unused)) void *);
     40        static FunctionType finally_func_t(Type::Qualifiers(), false);
    3441
    3542        static void init_func_types() {
    36                 static init_complete = false;
     43                static bool init_complete = false;
    3744                if (init_complete) {
    3845                        return;
    3946                }
    4047                ObjectDecl index_obj(
    41                         "index_t",
     48                        "__handler_index",
    4249                        Type::StorageClasses(),
    4350                        LinkageSpec::Cforall,
    4451                        /*bitfieldWidth*/ NULL,
    45                         new BasicType(emptyQualifiers, BasicType::UnsignedInt),
     52                        new BasicType( noQualifiers, BasicType::SignedInt ),
    4653                        /*init*/ NULL
    47                 );
     54                        );
    4855                ObjectDecl exception_obj(
    49                         "exception_t",
     56                        "__exception_inst",
    5057                        Type::StorageClasses(),
    5158                        LinkageSpec::Cforall,
    5259                        /*bitfieldWidth*/ NULL,
    53                         new BasicType(emptyQualifiers, BasicType::UnsignedInt),
     60                        new PointerType(
     61                                noQualifiers,
     62                                new BasicType( noQualifiers, BasicType::SignedInt )
     63                                ),
    5464                        /*init*/ NULL
    55                 );
     65                        );
    5666                ObjectDecl bool_obj(
    57                         "bool_t",
     67                        "__ret_bool",
    5868                        Type::StorageClasses(),
    5969                        LinkageSpec::Cforall,
    6070                        /*bitfieldWidth*/ NULL,
    61                         new BasicType(emptyQualifiers, BasicType::Bool),
     71                        new BasicType(noQualifiers, BasicType::Bool),
    6272                        /*init*/ NULL
    63                 );
    64 
    65                 catch_func_t.get_parameters().push_back(index_obj.clone());
    66                 catch_func_t.get_parameters().push_back(exception_obj.clone());
    67                 match_func_t.get_returnVals().push_back(index_obj.clone());
    68                 match_func_t.get_parameters().push_back(exception_obj.clone());
    69                 handle_func_t.get_returnVals().push_back(bool_obj.clone());
    70                 handle_func_t.get_parameters().push_back(exception_obj.clone());
     73                        );
     74                ObjectDecl voidptr_obj(
     75                        "__hook",
     76                        Type::StorageClasses(),
     77                        LinkageSpec::Cforall,
     78                        NULL,
     79                        new PointerType(
     80                                noQualifiers,
     81                                new VoidType(
     82                                        noQualifiers
     83                                        ),
     84                                std::list<Attribute *>{new Attribute("unused")}
     85                                ),
     86                        NULL
     87                        );
     88
     89                catch_func_t.get_parameters().push_back( index_obj.clone() );
     90                catch_func_t.get_parameters().push_back( exception_obj.clone() );
     91                match_func_t.get_returnVals().push_back( index_obj.clone() );
     92                match_func_t.get_parameters().push_back( exception_obj.clone() );
     93                handle_func_t.get_returnVals().push_back( bool_obj.clone() );
     94                handle_func_t.get_parameters().push_back( exception_obj.clone() );
     95                finally_func_t.get_parameters().push_back( voidptr_obj.clone() );
    7196
    7297                init_complete = true;
     
    78103
    79104        void split( CatchList& allHandlers, CatchList& terHandlers,
    80                     CatchList& resHandlers ) {
     105                                CatchList& resHandlers ) {
    81106                while ( !allHandlers.empty() ) {
    82                         Statement * stmt = allHandlers.front();
     107                        CatchStmt * stmt = allHandlers.front();
    83108                        allHandlers.pop_front();
    84                         if (CaseStmt::Terminate == stmt->get_kind()) {
     109                        if (CatchStmt::Terminate == stmt->get_kind()) {
    85110                                terHandlers.push_back(stmt);
    86111                        } else {
     
    92117        template<typename T>
    93118        void free_all( std::list<T *> &list ) {
    94                 std::list<T *>::iterator it;
     119                typename std::list<T *>::iterator it;
    95120                for ( it = list.begin() ; it != list.end() ; ++it ) {
    96121                        delete *it;
     
    100125
    101126        void appendDeclStmt( CompoundStmt * block, Declaration * item ) {
    102                 block->push_back(new DeclStmt(no_labels, item));
    103         }
    104 
    105         Expression * nameOf( FunctionDecl * function ) {
    106                 return new VariableExpr( function );
     127                block->push_back(new DeclStmt(noLabels, item));
     128        }
     129
     130        Expression * nameOf( DeclarationWithType * decl ) {
     131                return new VariableExpr( decl );
    107132        }
    108133
    109134        // ThrowStmt Mutation Helpers
    110135
    111         Statement * create_terminate_throw( ThrowStmt *throwStmt ) {
    112                 // __throw_terminate( EXPR );
    113                 ApplicationExpr * call = new ApplicationExpr( /* ... */ );
    114                 call->get_args.push_back( throwStmt->get_expr() );
    115                 Statement * result = new ExprStmt( throwStmt->get_labels(), call );
     136        Statement * create_given_throw(
     137                        const char * throwFunc, ThrowStmt * throwStmt ) {
     138                // { int NAME = EXPR; throwFunc( &NAME ); }
     139                CompoundStmt * result = new CompoundStmt( noLabels );
     140                ObjectDecl * local = new ObjectDecl(
     141                        "__local_exception_copy",
     142                        Type::StorageClasses(),
     143                        LinkageSpec::Cforall,
     144                        NULL,
     145                        new BasicType( noQualifiers, BasicType::SignedInt ),
     146                        new SingleInit( throwStmt->get_expr() )
     147                        );
     148                appendDeclStmt( result, local );
     149                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 ) );
    116152                throwStmt->set_expr( nullptr );
    117153                delete throwStmt;
    118154                return result;
    119155        }
     156
     157        Statement * create_terminate_throw( ThrowStmt *throwStmt ) {
     158                // { int NAME = EXPR; __throw_terminate( &NAME ); }
     159                return create_given_throw( "__cfaehm__throw_terminate", throwStmt );
     160        }
    120161        Statement * create_terminate_rethrow( ThrowStmt *throwStmt ) {
    121162                // __rethrow_terminate();
     163                assert( nullptr == throwStmt->get_expr() );
    122164                Statement * result = new ExprStmt(
    123165                        throwStmt->get_labels(),
    124                         new ApplicationExpr( /* ... */ );
     166                        new UntypedExpr( new NameExpr( "__cfaehm__rethrow_terminate" ) )
    125167                        );
    126168                delete throwStmt;
     
    129171        Statement * create_resume_throw( ThrowStmt *throwStmt ) {
    130172                // __throw_resume( EXPR );
    131                 ApplicationExpr * call = new ApplicationExpr( /* ... */ );
    132                 call->get_args.push_back( throwStmt->get_expr() );
    133                 Statement * result = new ExprStmt( throwStmt->get_labels(), call );
    134                 throwStmt->set_expr( nullptr );
    135                 delete throwStmt;
    136                 return result;
     173                return create_given_throw( "__cfaehm__throw_resume", throwStmt );
    137174        }
    138175        Statement * create_resume_rethrow( ThrowStmt *throwStmt ) {
     
    140177                Statement * result = new ReturnStmt(
    141178                        throwStmt->get_labels(),
    142                         new ConstantExpr(
    143                                 Constant(
    144                                         new BasicType(
    145                                                 Type::Qualifiers(),
    146                                                 BasicType::Bool
    147                                                 ),
    148                                         "0")
    149                                 )
     179                        new ConstantExpr( Constant::from_bool( false ) )
    150180                        );
    151181                delete throwStmt;
     
    160190                return block;
    161191        }
    162         FunctionDecl * create_try_wrapper( TryStmt *tryStmt ) {
    163                 CompoundStmt * body = base_try->get_block();
    164                 base_try->set_block(nullptr);
    165 
    166                 return new FunctionDecl("try", Type::StorageClasses(),
    167                         LinkageSpec::Cforall, void_func_t, body);
     192        FunctionDecl * create_try_wrapper( CompoundStmt *body ) {
     193
     194                return new FunctionDecl( "try", Type::StorageClasses(),
     195                        LinkageSpec::Cforall, try_func_t.clone(), body );
    168196        }
    169197
    170198        FunctionDecl * create_terminate_catch( CatchList &handlers ) {
    171199                std::list<CaseStmt *> handler_wrappers;
     200
     201                FunctionType *func_type = catch_func_t.clone();
     202                DeclarationWithType * index_obj = func_type->get_parameters().front();
     203        //      DeclarationWithType * except_obj = func_type->get_parameters().back();
    172204
    173205                // Index 1..{number of handlers}
     
    178210                        CatchStmt * handler = *it;
    179211
    180                         std::list<Statement *> core;
    181                         if ( /*the exception is named*/ ) {
    182                                 ObjectDecl * local_except = /* Dynamic case, same */;
    183                                 core->push_back( new DeclStmt( noLabel, local_except ) );
    184                         }
    185                         // Append the provided statement to the handler.
    186                         core->push_back( cur_handler->get_body() );
    187                         // Append return onto the inner block? case stmt list?
    188                         CaseStmt * wrapper = new CaseStmt(
     212                        // INTEGERconstant Version
     213                        // case `index`:
     214                        // {
     215                        //     `handler.body`
     216                        // }
     217                        // return;
     218                        std::list<Statement *> caseBody;
     219                        caseBody.push_back( handler->get_body() );
     220                        handler->set_body( nullptr );
     221                        caseBody.push_back( new ReturnStmt( noLabels, nullptr ) );
     222
     223                        handler_wrappers.push_back( new CaseStmt(
    189224                                noLabels,
    190225                                new ConstantExpr( Constant::from_int( index ) ),
    191                                 core
    192                                 );
    193                         handler_wrappers.push_back(wrapper);
     226                                caseBody
     227                                ) );
    194228                }
    195229                // TODO: Some sort of meaningful error on default perhaps?
     230
     231                std::list<Statement*> stmt_handlers;
     232                while ( !handler_wrappers.empty() ) {
     233                        stmt_handlers.push_back( handler_wrappers.front() );
     234                        handler_wrappers.pop_front();
     235                }
    196236
    197237                SwitchStmt * handler_lookup = new SwitchStmt(
    198238                        noLabels,
    199                         /*parameter 0: index*/,
    200                         handler_wrappers,
    201                         false
     239                        nameOf( index_obj ),
     240                        stmt_handlers
    202241                        );
    203242                CompoundStmt * body = new CompoundStmt( noLabels );
     
    205244
    206245                return new FunctionDecl("catch", Type::StorageClasses(),
    207                         LinkageSpec::Cforall, catch_func_t, body);
     246                        LinkageSpec::Cforall, func_type, body);
    208247        }
    209248
    210249        // Create a single check from a moddified handler.
    211         CompoundStmt *create_single_matcher( CatchStmt * modded_handler ) {
    212                 CompoundStmt * block = new CompoundStmt( noLables );
    213 
    214                 appendDeclStmt( block, modded_handler->get_decl() );
    215 
    216                 // TODO: This is not the actual check.
    217                 LogicalExpr * cond = new ConstantExpr( Constant::from_bool( false ) );
     250        // except_obj is referenced, modded_handler will be freed.
     251        CompoundStmt *create_single_matcher(
     252                        DeclarationWithType * except_obj, CatchStmt * modded_handler ) {
     253                CompoundStmt * block = new CompoundStmt( noLabels );
     254
     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                }
    218275
    219276                if ( modded_handler->get_cond() ) {
    220                         cond = new LogicalExpr( cond, modded_handler->get_cond() )q
     277                        cond = new LogicalExpr( cond, modded_handler->get_cond() );
    221278                }
    222279                block->push_back( new IfStmt( noLabels,
    223                         cond, modded_handler->get_body() );
     280                        cond, modded_handler->get_body(), nullptr ) );
    224281
    225282                modded_handler->set_decl( nullptr );
     
    232289        FunctionDecl * create_terminate_match( CatchList &handlers ) {
    233290                CompoundStmt * body = new CompoundStmt( noLabels );
     291
     292                FunctionType * func_type = match_func_t.clone();
     293                DeclarationWithType * except_obj = func_type->get_parameters().back();
    234294
    235295                // Index 1..{number of handlers}
     
    240300                        CatchStmt * handler = *it;
    241301
    242                         // body should have been taken by create_terminate_catch.
    243                         // assert( nullptr == handler->get_body() );
     302                        // Body should have been taken by create_terminate_catch.
     303                        assert( nullptr == handler->get_body() );
     304
     305                        // Create new body.
    244306                        handler->set_body( new ReturnStmt( noLabels,
    245307                                new ConstantExpr( Constant::from_int( index ) ) ) );
    246308
    247                         body->push_back( create_single_matcher( handler ) );
    248                 }
     309                        // Create the handler.
     310                        body->push_back( create_single_matcher( except_obj, handler ) );
     311                        *it = nullptr;
     312                }
     313
     314                body->push_back( new ReturnStmt( noLabels, new ConstantExpr(
     315                        Constant::from_int( 0 ) ) ) );
    249316
    250317                return new FunctionDecl("match", Type::StorageClasses(),
    251                         LinkageSpec::Cforall, match_func_t, body);
    252         }
    253 
    254         Statement * create_terminate_caller(
     318                        LinkageSpec::Cforall, func_type, body);
     319        }
     320
     321        CompoundStmt * create_terminate_caller(
    255322                        FunctionDecl * try_wrapper,
    256323                        FunctionDecl * terminate_catch,
    257324                        FunctionDecl * terminate_match) {
    258325
    259                 ApplicationExpr * caller = new ApplicationExpr( /* ... */ );
    260                 std::list<Expression *>& args = caller.get_args();
     326                UntypedExpr * caller = new UntypedExpr( new NameExpr(
     327                        "__cfaehm__try_terminate" ) );
     328                std::list<Expression *>& args = caller->get_args();
    261329                args.push_back( nameOf( try_wrapper ) );
    262330                args.push_back( nameOf( terminate_catch ) );
    263331                args.push_back( nameOf( terminate_match ) );
    264332
    265                 return new ExprStmt( noLabels, caller );
     333                CompoundStmt * callStmt = new CompoundStmt( noLabels );
     334                callStmt->push_back( new ExprStmt( noLabels, caller ) );
     335                return callStmt;
    266336        }
    267337
    268338        FunctionDecl * create_resume_handler( CatchList &handlers ) {
    269                 CompoundStmt * body = new CompountStmt( noLabels );
     339                CompoundStmt * body = new CompoundStmt( noLabels );
     340
     341                FunctionType * func_type = match_func_t.clone();
     342                DeclarationWithType * except_obj = func_type->get_parameters().back();
    270343
    271344                CatchList::iterator it;
     
    280353                                handling_code->push_back( handler->get_body() );
    281354                        }
    282                         handling_code->push_back( new ReturnStmt( noLabel,
    283                                 new ConstantExpr( Constant::from_bool( false ) ) ) );
     355                        handling_code->push_back( new ReturnStmt( noLabels,
     356                                new ConstantExpr( Constant::from_bool( true ) ) ) );
    284357                        handler->set_body( handling_code );
    285358
    286359                        // Create the handler.
    287                         body->push_back( create_single_matcher( handler ) );
    288                 }
     360                        body->push_back( create_single_matcher( except_obj, handler ) );
     361                        *it = nullptr;
     362                }
     363
     364                body->push_back( new ReturnStmt( noLabels, new ConstantExpr(
     365                        Constant::from_bool( false ) ) ) );
    289366
    290367                return new FunctionDecl("handle", Type::StorageClasses(),
    291                         LinkageSpec::Cforall, handle_func_t, body);
    292         }
    293 
    294         Statement * create_resume_wrapper(
     368                        LinkageSpec::Cforall, func_type, body);
     369        }
     370
     371        CompoundStmt * create_resume_wrapper(
     372                        StructDecl * node_decl,
    295373                        Statement * wraps,
    296374                        FunctionDecl * resume_handler ) {
    297375                CompoundStmt * body = new CompoundStmt( noLabels );
    298376
    299                 // struct node = {current top resume handler, call to resume_handler};
    300                 // __attribute__((cleanup( ... )));
    301                 // set top resume handler to node.
    302                 // The wrapped statement.
    303 
    304                 ListInit * node_init;
    305                 {
    306                         std::list<Initializer*> field_inits;
    307                         field_inits.push_back( new SingleInit( /* ... */ ) );
    308                         field_inits.push_back( new SingleInit( nameOf( resume_handler ) ) );
    309                         node_init = new ListInit( field_inits );
    310                 }
     377                // struct __try_resume_node __resume_node
     378                //      __attribute__((cleanup( __cfaehm__try_resume_cleanup )));
     379                // ** unwinding of the stack here could cause problems **
     380                // ** however I don't think that can happen currently **
     381                // __cfaehm__try_resume_setup( &__resume_node, resume_handler );
    311382
    312383                std::list< Attribute * > attributes;
    313384                {
    314385                        std::list< Expression * > attr_params;
    315                         attr_params.push_back( nameOf( /* ... deconstructor ... */ ) );
    316                         attrributes.push_back( new Attribute( "cleanup", attr_params ) );
    317                 }
    318 
    319                 appendDeclStmt( body,
    320                 /**/ ObjectDecl(
    321                         "resume_node",
     386                        attr_params.push_back( new NameExpr(
     387                                "__cfaehm__try_resume_cleanup" ) );
     388                        attributes.push_back( new Attribute( "cleanup", attr_params ) );
     389                }
     390
     391                ObjectDecl * obj = new ObjectDecl(
     392                        "__resume_node",
    322393                        Type::StorageClasses(),
    323394                        LinkageSpec::Cforall,
    324395                        nullptr,
    325                         /* Type* = resume_node */,
    326                         node_init,
     396                        new StructInstType(
     397                                Type::Qualifiers(),
     398                                node_decl
     399                                ),
     400                        nullptr,
    327401                        attributes
    328                         )
    329                 );
     402                        );
     403                appendDeclStmt( body, obj );
     404
     405                UntypedExpr *setup = new UntypedExpr( new NameExpr(
     406                        "__cfaehm__try_resume_setup" ) );
     407                setup->get_args().push_back( new AddressExpr( nameOf( obj ) ) );
     408                setup->get_args().push_back( nameOf( resume_handler ) );
     409
     410                body->push_back( new ExprStmt( noLabels, setup ) );
     411
    330412                body->push_back( wraps );
    331413                return body;
     
    333415
    334416        FunctionDecl * create_finally_wrapper( TryStmt * tryStmt ) {
    335                 CompoundStmt * body = tryStmt->get_finally();
     417                FinallyStmt * finally = tryStmt->get_finally();
     418                CompoundStmt * body = finally->get_block();
     419                finally->set_block( nullptr );
     420                delete finally;
    336421                tryStmt->set_finally( nullptr );
    337422
    338423                return new FunctionDecl("finally", Type::StorageClasses(),
    339                         LinkageSpec::Cforall, void_func_t, body);
    340         }
    341 
    342         ObjectDecl * create_finally_hook( FunctionDecl * finally_wrapper ) {
    343                 // struct _cleanup_hook NAME __attribute__((cleanup( ... )));
     424                        LinkageSpec::Cforall, finally_func_t.clone(), body);
     425        }
     426
     427        ObjectDecl * create_finally_hook(
     428                        StructDecl * hook_decl, FunctionDecl * finally_wrapper ) {
     429                // struct __cfaehm__cleanup_hook __finally_hook
     430                //      __attribute__((cleanup( finally_wrapper )));
    344431
    345432                // Make Cleanup Attribute.
     
    348435                        std::list< Expression * > attr_params;
    349436                        attr_params.push_back( nameOf( finally_wrapper ) );
    350                         attrributes.push_back( new Attribute( "cleanup", attr_params ) );
    351                 }
    352 
    353                 return ObjectDecl( /* ... */
    354                         const std::string &name "finally_hook",
     437                        attributes.push_back( new Attribute( "cleanup", attr_params ) );
     438                }
     439
     440                return new ObjectDecl(
     441                        "__finally_hook",
    355442                        Type::StorageClasses(),
    356443                        LinkageSpec::Cforall,
    357444                        nullptr,
    358                         /* ... Type * ... */,
     445                        new StructInstType(
     446                                noQualifiers,
     447                                hook_decl
     448                                ),
    359449                        nullptr,
    360450                        attributes
     
    363453
    364454
    365         class ExceptionMutatorCore : public WithScoping {
     455        class ExceptionMutatorCore : public WithGuards {
    366456                enum Context { NoHandler, TerHandler, ResHandler };
    367457
     
    370460                // loop, switch or the goto stays within the function.
    371461
    372                 Context curContext;
     462                Context cur_context;
    373463
    374464                // We might not need this, but a unique base for each try block's
     
    377467                //unsigned int try_count = 0;
    378468
     469                StructDecl *node_decl;
     470                StructDecl *hook_decl;
    379471
    380472        public:
    381473                ExceptionMutatorCore() :
    382                         curContext(NoHandler)
     474                        cur_context(NoHandler),
     475                        node_decl(nullptr), hook_decl(nullptr)
    383476                {}
    384477
    385                 void premutate( CatchStmt *tryStmt );
     478                void premutate( CatchStmt *catchStmt );
     479                void premutate( StructDecl *structDecl );
    386480                Statement * postmutate( ThrowStmt *throwStmt );
    387481                Statement * postmutate( TryStmt *tryStmt );
     
    393487                        if ( throwStmt->get_expr() ) {
    394488                                return create_terminate_throw( throwStmt );
    395                         } else if ( TerHandler == curContext ) {
     489                        } else if ( TerHandler == cur_context ) {
    396490                                return create_terminate_rethrow( throwStmt );
    397491                        } else {
    398492                                assertf(false, "Invalid throw in %s at %i\n",
    399                                         throwStmt->location.filename,
     493                                        throwStmt->location.filename.c_str(),
    400494                                        throwStmt->location.linenumber);
    401495                                return nullptr;
     
    404498                        if ( throwStmt->get_expr() ) {
    405499                                return create_resume_throw( throwStmt );
    406                         } else if ( ResHandler == curContext ) {
     500                        } else if ( ResHandler == cur_context ) {
    407501                                return create_resume_rethrow( throwStmt );
    408502                        } else {
    409503                                assertf(false, "Invalid throwResume in %s at %i\n",
    410                                         throwStmt->location.filename,
     504                                        throwStmt->location.filename.c_str(),
    411505                                        throwStmt->location.linenumber);
    412506                                return nullptr;
     
    416510
    417511        Statement * ExceptionMutatorCore::postmutate( TryStmt *tryStmt ) {
     512                assert( node_decl );
     513                assert( hook_decl );
     514
    418515                // Generate a prefix for the function names?
    419516
    420                 CompoundStmt * block = new CompoundStmt();
    421                 Statement * inner = take_try_block( tryStmt );
     517                CompoundStmt * block = new CompoundStmt( noLabels );
     518                CompoundStmt * inner = take_try_block( tryStmt );
    422519
    423520                if ( tryStmt->get_finally() ) {
     
    427524                        appendDeclStmt( block, finally_block );
    428525                        // Create and add the finally cleanup hook.
    429                         appendDeclStmt( block, create_finally_hook( finally_block ) );
    430                 }
    431 
    432                 StatementList termination_handlers;
    433                 StatementList resumption_handlers;
    434                 split( tryStmt->get_handlers(),
    435                        termination_handlers, resumption_handlers );
    436 
    437                 if ( resumeption_handlers.size() ) {
     526                        appendDeclStmt( block,
     527                                create_finally_hook( hook_decl, finally_block ) );
     528                }
     529
     530                CatchList termination_handlers;
     531                CatchList resumption_handlers;
     532                split( tryStmt->get_catchers(),
     533                           termination_handlers, resumption_handlers );
     534
     535                if ( resumption_handlers.size() ) {
    438536                        // Define the helper function.
    439537                        FunctionDecl * resume_handler =
     
    441539                        appendDeclStmt( block, resume_handler );
    442540                        // Prepare hooks
    443                         inner = create_resume_wrapper( inner, resume_handler );
     541                        inner = create_resume_wrapper( node_decl, inner, resume_handler );
    444542                }
    445543
     
    462560                block->push_back( inner );
    463561
    464                 free_all( termination_handlers );
    465                 free_all( resumption_handlers );
     562                //free_all( termination_handlers );
     563                //free_all( resumption_handlers );
    466564
    467565                return block;
     
    469567
    470568        void ExceptionMutatorCore::premutate( CatchStmt *catchStmt ) {
    471                 GuardValue( curContext );
    472                 if ( CatchStmt::Termination == catchStmt->get_kind() ) {
    473                         curContext = TerHandler;
     569                GuardValue( cur_context );
     570                if ( CatchStmt::Terminate == catchStmt->get_kind() ) {
     571                        cur_context = TerHandler;
    474572                } else {
    475                         curContext = ResHandler;
    476                 }
    477         }
    478 
    479     void translateEHM( std::list< Declaration *> & translationUnit ) {
     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
     591        void translateEHM( std::list< Declaration *> & translationUnit ) {
     592                init_func_types();
     593
    480594                PassVisitor<ExceptionMutatorCore> translator;
    481                 for ( Declaration * decl : translationUnit ) {
    482                         decl->mutate( translator );
    483                 }
     595                mutateAll( translationUnit, translator );
    484596        }
    485597}
  • src/ControlStruct/ExceptTranslate.h

    rfea3faa rb826e6b  
    1010// Created On       : Tus Jun 06 10:13:00 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Thr Jun 22 15:57:00 2017
    13 // Update Count     : 0
     12// Last Modified On : Fri Jun 30 10:20:00 2017
     13// Update Count     : 2
    1414//
    1515
     
    1717#define EXCEPT_TRANSLATE_H
    1818
    19 namespace ControlFlow {
     19#include <list>
     20#include "SynTree/SynTree.h"
     21
     22namespace ControlStruct {
    2023        void translateEHM( std::list< Declaration *> & translationUnit );
    2124        /* Converts exception handling structures into their underlying C code.
  • src/ControlStruct/module.mk

    rfea3faa rb826e6b  
    1010## Author           : Richard C. Bilson
    1111## Created On       : Mon Jun  1 17:49:17 2015
    12 ## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Thu Aug  4 11:38:06 2016
    14 ## Update Count     : 3
     12## Last Modified By : Andrew Beach
     13## Last Modified On : Wed Jun 28 16:15:00 2017
     14## Update Count     : 4
    1515###############################################################################
    1616
    1717SRC +=  ControlStruct/LabelGenerator.cc \
    1818        ControlStruct/LabelFixer.cc \
    19         ControlStruct/MLEMutator.cc \
     19        ControlStruct/MLEMutator.cc \
    2020        ControlStruct/Mutate.cc \
    21         ControlStruct/ForExprMutator.cc
    22 
     21        ControlStruct/ForExprMutator.cc \
     22        ControlStruct/ExceptTranslate.cc
  • src/GenPoly/Box.cc

    rfea3faa rb826e6b  
    506506                DeclarationWithType *Pass1::mutate( FunctionDecl *functionDecl ) {
    507507                        if ( functionDecl->get_statements() ) {         // empty routine body ?
     508                                // std::cerr << "mutating function: " << functionDecl->get_mangleName() << std::endl;
    508509                                doBeginScope();
    509510                                scopeTyVars.beginScope();
     
    550551                                retval = oldRetval;
    551552                                doEndScope();
     553                                // std::cerr << "end function: " << functionDecl->get_mangleName() << std::endl;
    552554                        } // if
    553555                        return functionDecl;
     
    11181120
    11191121                Expression *Pass1::mutate( ApplicationExpr *appExpr ) {
    1120                         // std::cerr << "mutate appExpr: ";
     1122                        // std::cerr << "mutate appExpr: " << InitTweak::getFunctionName( appExpr ) << std::endl;
    11211123                        // for ( TyVarMap::iterator i = scopeTyVars.begin(); i != scopeTyVars.end(); ++i ) {
    11221124                        //      std::cerr << i->first << " ";
     
    11431145                        ReferenceToType *dynRetType = isDynRet( function, exprTyVars );
    11441146
     1147                        // std::cerr << function << std::endl;
     1148                        // std::cerr << "scopeTyVars: ";
     1149                        // printTyVarMap( std::cerr, scopeTyVars );
     1150                        // std::cerr << "exprTyVars: ";
     1151                        // printTyVarMap( std::cerr, exprTyVars );
     1152                        // std::cerr << "env: " << *env << std::endl;
     1153                        // std::cerr << needsAdapter( function, scopeTyVars ) << ! needsAdapter( function, exprTyVars) << std::endl;
     1154
    11451155                        // NOTE: addDynRetParam needs to know the actual (generated) return type so it can make a temp variable, so pass the result type from the appExpr
    11461156                        // passTypeVars needs to know the program-text return type (i.e. the distinction between _conc_T30 and T3(int))
    11471157                        // concRetType may not be a good name in one or both of these places. A more appropriate name change is welcome.
    11481158                        if ( dynRetType ) {
     1159                                // std::cerr << "dynRetType: " << dynRetType << std::endl;
    11491160                                Type *concRetType = appExpr->get_result()->isVoid() ? nullptr : appExpr->get_result();
    11501161                                ret = addDynRetParam( appExpr, concRetType, arg ); // xxx - used to use dynRetType instead of concRetType
  • src/GenPoly/InstantiateGeneric.cc

    rfea3faa rb826e6b  
    2222#include "InstantiateGeneric.h"
    2323
    24 #include "DeclMutator.h"
    2524#include "GenPoly.h"
    2625#include "ScopedSet.h"
    2726#include "ScrubTyVars.h"
    28 #include "PolyMutator.h"
     27
     28#include "Common/PassVisitor.h"
     29#include "Common/ScopedMap.h"
     30#include "Common/UniqueName.h"
     31#include "Common/utility.h"
    2932
    3033#include "ResolvExpr/typeops.h"
     
    3437#include "SynTree/Type.h"
    3538
    36 #include "Common/ScopedMap.h"
    37 #include "Common/UniqueName.h"
    38 #include "Common/utility.h"
     39
     40#include "InitTweak/InitTweak.h"
     41
    3942
    4043namespace GenPoly {
     
    153156        }
    154157
    155         // collect the environments of each TypeInstType so that type variables can be replaced
    156         // xxx - possibly temporary solution. Access to type environments is required in GenericInstantiator, but it needs to be a DeclMutator which does not provide easy access to the type environments.
    157         class EnvFinder final : public GenPoly::PolyMutator {
    158         public:
    159                 using GenPoly::PolyMutator::mutate;
    160                 virtual Type * mutate( TypeInstType * inst ) override {
    161                         if ( env ) envMap[inst] = env;
    162                         return inst;
    163                 }
    164 
    165                 // don't want to associate an environment with TypeInstTypes that occur in function types - this may actually only apply to function types belonging to DeclarationWithTypes (or even just FunctionDecl)?
    166                 virtual Type * mutate( FunctionType * ftype ) override {
    167                         return ftype;
    168                 }
    169                 std::unordered_map< ReferenceToType *, TypeSubstitution * > envMap;
    170         };
    171 
    172158        /// Mutator pass that replaces concrete instantiations of generic types with actual struct declarations, scoped appropriately
    173         class GenericInstantiator final : public DeclMutator {
     159        struct GenericInstantiator final : public WithTypeSubstitution, public WithDeclsToAdd, public WithVisitorRef<GenericInstantiator>, public WithGuards {
    174160                /// Map of (generic type, parameter list) pairs to concrete type instantiations
    175161                InstantiationMap< AggregateDecl, AggregateDecl > instantiations;
     
    178164                /// Namer for concrete types
    179165                UniqueName typeNamer;
    180                 /// Reference to mapping of environments
    181                 const std::unordered_map< ReferenceToType *, TypeSubstitution * > & envMap;
    182         public:
    183                 GenericInstantiator( const std::unordered_map< ReferenceToType *, TypeSubstitution * > & envMap ) : DeclMutator(), instantiations(), dtypeStatics(), typeNamer("_conc_"), envMap( envMap ) {}
    184 
    185                 using DeclMutator::mutate;
    186                 virtual Type* mutate( StructInstType *inst ) override;
    187                 virtual Type* mutate( UnionInstType *inst ) override;
    188 
    189                 virtual void doBeginScope() override;
    190                 virtual void doEndScope() override;
     166                /// Should not make use of type environment to replace types of function parameter and return values.
     167                bool inFunctionType = false;
     168                GenericInstantiator() : instantiations(), dtypeStatics(), typeNamer("_conc_") {}
     169
     170                Type* postmutate( StructInstType *inst );
     171                Type* postmutate( UnionInstType *inst );
     172
     173                void premutate( __attribute__((unused)) FunctionType * ftype ) {
     174                        GuardValue( inFunctionType );
     175                        inFunctionType = true;
     176                }
     177
     178                void beginScope();
     179                void endScope();
    191180        private:
    192181                /// Wrap instantiation lookup for structs
     
    207196
    208197        void instantiateGeneric( std::list< Declaration* > &translationUnit ) {
    209                 EnvFinder finder;
    210                 mutateAll( translationUnit, finder );
    211                 GenericInstantiator instantiator( finder.envMap );
    212                 instantiator.mutateDeclarationList( translationUnit );
     198                PassVisitor<GenericInstantiator> instantiator;
     199                mutateAll( translationUnit, instantiator );
    213200        }
    214201
     
    306293        Type *GenericInstantiator::replaceWithConcrete( Type *type, bool doClone ) {
    307294                if ( TypeInstType *typeInst = dynamic_cast< TypeInstType * >( type ) ) {
    308                         if ( envMap.count( typeInst ) ) {
    309                                 TypeSubstitution * env = envMap.at( typeInst );
     295                        if ( env && ! inFunctionType ) {
    310296                                Type *concrete = env->lookup( typeInst->get_name() );
    311297                                if ( concrete ) {
     
    331317
    332318
    333         Type* GenericInstantiator::mutate( StructInstType *inst ) {
    334                 // mutate subtypes
    335                 Type *mutated = Mutator::mutate( inst );
    336                 inst = dynamic_cast< StructInstType* >( mutated );
    337                 if ( ! inst ) return mutated;
    338 
     319        Type* GenericInstantiator::postmutate( StructInstType *inst ) {
    339320                // exit early if no need for further mutation
    340321                if ( inst->get_parameters().empty() ) return inst;
     
    368349                                substituteMembers( inst->get_baseStruct()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() );
    369350                                insert( inst, typeSubs, concDecl ); // must insert before recursion
    370                                 concDecl->acceptMutator( *this ); // recursively instantiate members
    371                                 DeclMutator::addDeclaration( concDecl ); // must occur before declaration is added so that member instantiations appear first
     351                                concDecl->acceptMutator( *visitor ); // recursively instantiate members
     352                                declsToAddBefore.push_back( concDecl ); // must occur before declaration is added so that member instantiations appear first
    372353                        }
    373354                        StructInstType *newInst = new StructInstType( inst->get_qualifiers(), concDecl->get_name() );
     
    388369        }
    389370
    390         Type* GenericInstantiator::mutate( UnionInstType *inst ) {
    391                 // mutate subtypes
    392                 Type *mutated = Mutator::mutate( inst );
    393                 inst = dynamic_cast< UnionInstType* >( mutated );
    394                 if ( ! inst ) return mutated;
    395 
     371        Type* GenericInstantiator::postmutate( UnionInstType *inst ) {
    396372                // exit early if no need for further mutation
    397373                if ( inst->get_parameters().empty() ) return inst;
     
    423399                                substituteMembers( inst->get_baseUnion()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() );
    424400                                insert( inst, typeSubs, concDecl ); // must insert before recursion
    425                                 concDecl->acceptMutator( *this ); // recursively instantiate members
    426                                 DeclMutator::addDeclaration( concDecl ); // must occur before declaration is added so that member instantiations appear first
     401                                concDecl->acceptMutator( *visitor ); // recursively instantiate members
     402                                declsToAddBefore.push_back( concDecl ); // must occur before declaration is added so that member instantiations appear first
    427403                        }
    428404                        UnionInstType *newInst = new UnionInstType( inst->get_qualifiers(), concDecl->get_name() );
     
    442418        }
    443419
    444         void GenericInstantiator::doBeginScope() {
    445                 DeclMutator::doBeginScope();
     420        void GenericInstantiator::beginScope() {
    446421                instantiations.beginScope();
    447422                dtypeStatics.beginScope();
    448423        }
    449424
    450         void GenericInstantiator::doEndScope() {
    451                 DeclMutator::doEndScope();
     425        void GenericInstantiator::endScope() {
    452426                instantiations.endScope();
    453427                dtypeStatics.endScope();
  • src/InitTweak/FixInit.cc

    rfea3faa rb826e6b  
    104104                        typedef AddStmtVisitor Parent;
    105105                        using Parent::visit;
    106                         typedef std::set< ObjectDecl * > ObjectSet;
     106                        // use ordered data structure to maintain ordering for set_difference and for consistent error messages
     107                        typedef std::list< ObjectDecl * > ObjectSet;
    107108                        virtual void visit( CompoundStmt *compoundStmt ) override;
    108109                        virtual void visit( DeclStmt *stmt ) override;
     
    116117
    117118                // debug
    118                 struct printSet {
    119                         typedef ObjDeclCollector::ObjectSet ObjectSet;
    120                         printSet( const ObjectSet & objs ) : objs( objs ) {}
     119                template<typename ObjectSet>
     120                struct PrintSet {
     121                        PrintSet( const ObjectSet & objs ) : objs( objs ) {}
    121122                        const ObjectSet & objs;
    122123                };
    123                 std::ostream & operator<<( std::ostream & out, const printSet & set) {
     124                template<typename ObjectSet>
     125                PrintSet<ObjectSet> printSet( const ObjectSet & objs ) { return PrintSet<ObjectSet>( objs ); }
     126                template<typename ObjectSet>
     127                std::ostream & operator<<( std::ostream & out, const PrintSet<ObjectSet> & set) {
    124128                        out << "{ ";
    125129                        for ( ObjectDecl * obj : set.objs ) {
     
    724728                                                // static bool __objName_uninitialized = true
    725729                                                BasicType * boolType = new BasicType( Type::Qualifiers(), BasicType::Bool );
    726                                                 SingleInit * boolInitExpr = new SingleInit( new ConstantExpr( Constant::from_int( 1 ) ), noDesignators );
     730                                                SingleInit * boolInitExpr = new SingleInit( new ConstantExpr( Constant::from_int( 1 ) ) );
    727731                                                ObjectDecl * isUninitializedVar = new ObjectDecl( objDecl->get_mangleName() + "_uninitialized", Type::StorageClasses( Type::Static ), LinkageSpec::Cforall, 0, boolType, boolInitExpr );
    728732                                                isUninitializedVar->fixUniqueId();
     
    745749
    746750                                                Statement * dtor = ctorInit->get_dtor();
    747                                                 objDecl->set_init( NULL );
    748                                                 ctorInit->set_ctor( NULL );
     751                                                objDecl->set_init( nullptr );
     752                                                ctorInit->set_ctor( nullptr );
    749753                                                ctorInit->set_dtor( nullptr );
    750754                                                if ( dtor ) {
     
    799803                                                } else {
    800804                                                        stmtsToAddAfter.push_back( ctor );
    801                                                         objDecl->set_init( NULL );
    802                                                         ctorInit->set_ctor( NULL );
     805                                                        objDecl->set_init( nullptr );
     806                                                        ctorInit->set_ctor( nullptr );
    803807                                                }
    804808                                        } // if
    805809                                } else if ( Initializer * init = ctorInit->get_init() ) {
    806810                                        objDecl->set_init( init );
    807                                         ctorInit->set_init( NULL );
     811                                        ctorInit->set_init( nullptr );
    808812                                } else {
    809813                                        // no constructor and no initializer, which is okay
    810                                         objDecl->set_init( NULL );
     814                                        objDecl->set_init( nullptr );
    811815                                } // if
    812816                                delete ctorInit;
     
    816820
    817821                void ObjDeclCollector::visit( CompoundStmt * compoundStmt ) {
    818                         std::set< ObjectDecl * > prevVars = curVars;
     822                        ObjectSet prevVars = curVars;
    819823                        Parent::visit( compoundStmt );
    820824                        curVars = prevVars;
     
    824828                        // keep track of all variables currently in scope
    825829                        if ( ObjectDecl * objDecl = dynamic_cast< ObjectDecl * > ( stmt->get_decl() ) ) {
    826                                 curVars.insert( objDecl );
     830                                curVars.push_back( objDecl );
    827831                        } // if
    828832                        Parent::visit( stmt );
     
    939943                        )
    940944                        if ( ! diff.empty() ) {
     945                                // create an auxilliary set for fast lookup -- can't make diff a set, because diff ordering should be consistent for error messages.
     946                                std::unordered_set<ObjectDecl *> needsDestructor( diff.begin(), diff.end() );
     947
    941948                                // go through decl ordered list of objectdecl. for each element that occurs in diff, output destructor
    942949                                OrderedDecls ordered;
    943950                                for ( OrderedDecls & rdo : reverseDeclOrder ) {
    944951                                        // add elements from reverseDeclOrder into ordered if they occur in diff - it is key that this happens in reverse declaration order.
    945                                         copy_if( rdo.begin(), rdo.end(), back_inserter( ordered ), [&]( ObjectDecl * objDecl ) { return diff.count( objDecl ); } );
     952                                        copy_if( rdo.begin(), rdo.end(), back_inserter( ordered ), [&]( ObjectDecl * objDecl ) { return needsDestructor.count( objDecl ); } );
    946953                                } // for
    947954                                insertDtors( ordered.begin(), ordered.end(), back_inserter( stmtsToAdd ) );
  • src/InitTweak/GenInit.cc

    rfea3faa rb826e6b  
    4444        }
    4545
    46         class ReturnFixer : public WithStmtsToAdd, public WithScopes {
    47           public:
     46        struct ReturnFixer : public WithStmtsToAdd, public WithGuards {
    4847                /// consistently allocates a temporary variable for the return value
    4948                /// of a function so that anything which the resolver decides can be constructed
     
    5958        };
    6059
    61         class CtorDtor final : public GenPoly::PolyMutator {
    62           public:
    63                 typedef GenPoly::PolyMutator Parent;
    64                 using Parent::mutate;
     60        struct CtorDtor : public WithGuards, public WithShortCircuiting  {
    6561                /// create constructor and destructor statements for object declarations.
    6662                /// the actual call statements will be added in after the resolver has run
     
    6965                static void generateCtorDtor( std::list< Declaration * > &translationUnit );
    7066
    71                 virtual DeclarationWithType * mutate( ObjectDecl * ) override;
    72                 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) override;
     67                void previsit( ObjectDecl * );
     68                void previsit( FunctionDecl *functionDecl );
     69
    7370                // should not traverse into any of these declarations to find objects
    7471                // that need to be constructed or destructed
    75                 virtual Declaration* mutate( StructDecl *aggregateDecl ) override;
    76                 virtual Declaration* mutate( UnionDecl *aggregateDecl ) override { return aggregateDecl; }
    77                 virtual Declaration* mutate( EnumDecl *aggregateDecl ) override { return aggregateDecl; }
    78                 virtual Declaration* mutate( TraitDecl *aggregateDecl ) override { return aggregateDecl; }
    79                 virtual TypeDecl* mutate( TypeDecl *typeDecl ) override { return typeDecl; }
    80                 virtual Declaration* mutate( TypedefDecl *typeDecl ) override { return typeDecl; }
    81 
    82                 virtual Type * mutate( FunctionType *funcType ) override { return funcType; }
    83 
    84                 virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ) override;
     72                void previsit( StructDecl *aggregateDecl );
     73                void previsit( __attribute__((unused)) UnionDecl    * aggregateDecl ) { visit_children = false; }
     74                void previsit( __attribute__((unused)) EnumDecl     * aggregateDecl ) { visit_children = false; }
     75                void previsit( __attribute__((unused)) TraitDecl    * aggregateDecl ) { visit_children = false; }
     76                void previsit( __attribute__((unused)) TypeDecl     * typeDecl )      { visit_children = false; }
     77                void previsit( __attribute__((unused)) TypedefDecl  * typeDecl )      { visit_children = false; }
     78                void previsit( __attribute__((unused)) FunctionType * funcType )      { visit_children = false; }
     79
     80                void previsit( CompoundStmt * compoundStmt );
    8581
    8682          private:
     
    211207
    212208        void CtorDtor::generateCtorDtor( std::list< Declaration * > & translationUnit ) {
    213                 CtorDtor ctordtor;
    214                 mutateAll( translationUnit, ctordtor );
     209                PassVisitor<CtorDtor> ctordtor;
     210                acceptAll( translationUnit, ctordtor );
    215211        }
    216212
     
    289285        }
    290286
    291         DeclarationWithType * CtorDtor::mutate( ObjectDecl * objDecl ) {
     287        void CtorDtor::previsit( ObjectDecl * objDecl ) {
    292288                handleDWT( objDecl );
    293289                // hands off if @=, extern, builtin, etc.
     
    301297                        objDecl->set_init( genCtorInit( objDecl ) );
    302298                }
    303                 return Parent::mutate( objDecl );
    304         }
    305 
    306         DeclarationWithType * CtorDtor::mutate( FunctionDecl *functionDecl ) {
    307                 ValueGuard< bool > oldInFunc = inFunction;
     299        }
     300
     301        void CtorDtor::previsit( FunctionDecl *functionDecl ) {
     302                GuardValue( inFunction );
    308303                inFunction = true;
    309304
    310305                handleDWT( functionDecl );
    311306
    312                 managedTypes.beginScope();
     307                GuardScope( managedTypes );
    313308                // go through assertions and recursively add seen ctor/dtors
    314309                for ( auto & tyDecl : functionDecl->get_functionType()->get_forall() ) {
     
    317312                        }
    318313                }
    319                 // parameters should not be constructed and destructed, so don't mutate FunctionType
    320                 functionDecl->set_statements( maybeMutate( functionDecl->get_statements(), *this ) );
    321 
    322                 managedTypes.endScope();
    323                 return functionDecl;
    324         }
    325 
    326         Declaration* CtorDtor::mutate( StructDecl *aggregateDecl ) {
     314
     315                PassVisitor<CtorDtor> newCtorDtor;
     316                newCtorDtor.pass = *this;
     317                maybeAccept( functionDecl->get_statements(), newCtorDtor );
     318                visit_children = false;  // do not try and construct parameters or forall parameters - must happen after maybeAccept
     319        }
     320
     321        void CtorDtor::previsit( StructDecl *aggregateDecl ) {
     322                visit_children = false; // do not try to construct and destruct aggregate members
     323
    327324                // don't construct members, but need to take note if there is a managed member,
    328325                // because that means that this type is also managed
     
    336333                        }
    337334                }
    338                 return aggregateDecl;
    339         }
    340 
    341         CompoundStmt * CtorDtor::mutate( CompoundStmt * compoundStmt ) {
    342                 managedTypes.beginScope();
    343                 CompoundStmt * stmt = Parent::mutate( compoundStmt );
    344                 managedTypes.endScope();
    345                 return stmt;
    346         }
    347 
     335        }
     336
     337        void CtorDtor::previsit( __attribute__((unused)) CompoundStmt * compoundStmt ) {
     338                GuardScope( managedTypes );
     339        }
    348340} // namespace InitTweak
    349341
  • src/InitTweak/InitTweak.cc

    rfea3faa rb826e6b  
    1414                public:
    1515                        bool hasDesignations = false;
    16                         template<typename Init>
    17                         void handleInit( Init * init ) {
    18                                 if ( ! init->get_designators().empty() ) hasDesignations = true;
    19                                 else Visitor::visit( init );
    20                         }
    21                         virtual void visit( SingleInit * singleInit ) { handleInit( singleInit); }
    22                         virtual void visit( ListInit * listInit ) { handleInit( listInit); }
     16                        virtual void visit( Designation * des ) {
     17                                if ( ! des->get_designators().empty() ) hasDesignations = true;
     18                                else Visitor::visit( des );
     19                        }
    2320                };
    2421
  • src/MakeLibCfa.cc

    rfea3faa rb826e6b  
    1515
    1616#include "MakeLibCfa.h"
    17 #include "SynTree/Visitor.h"
    18 #include "SynTree/Declaration.h"
    19 #include "SynTree/Type.h"
    20 #include "SynTree/Expression.h"
    21 #include "SynTree/Statement.h"
    22 #include "SynTree/Initializer.h"
    23 #include "CodeGen/OperatorTable.h"
    24 #include "Common/UniqueName.h"
     17
     18#include <cassert>                 // for assert
     19#include <string>                   // for operator==, string
     20
     21#include "CodeGen/OperatorTable.h"  // for OperatorInfo, operatorLookup, Ope...
     22#include "Common/SemanticError.h"   // for SemanticError
     23#include "Common/UniqueName.h"      // for UniqueName
     24#include "Parser/LinkageSpec.h"     // for Spec, Intrinsic, C
     25#include "SynTree/Declaration.h"    // for FunctionDecl, ObjectDecl, Declara...
     26#include "SynTree/Expression.h"     // for NameExpr, UntypedExpr, VariableExpr
     27#include "SynTree/Initializer.h"    // for SingleInit
     28#include "SynTree/Label.h"          // for Label
     29#include "SynTree/Statement.h"      // for CompoundStmt, ReturnStmt
     30#include "SynTree/Type.h"           // for FunctionType
     31#include "SynTree/Visitor.h"        // for acceptAll, Visitor
    2532
    2633namespace LibCfa {
     
    9299                assert( ! objDecl->get_init() );
    93100                std::list< Expression* > noDesignators;
    94                 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators, false ) ); // cannot be constructed
     101                objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), false ) ); // cannot be constructed
    95102                newDecls.push_back( objDecl );
    96103        }
  • src/MakeLibCfa.h

    rfea3faa rb826e6b  
    1717#define LIBCFA_MAKELIBCFA_H
    1818
    19 #include <list>
    20 #include <SynTree/SynTree.h>
     19#include <list>  // for list
     20
     21class Declaration;
    2122
    2223namespace LibCfa {
  • src/Makefile.am

    rfea3faa rb826e6b  
    4343driver_cfa_cpp_SOURCES = ${SRC}
    4444driver_cfa_cpp_LDADD = ${LEXLIB} -ldl                   # yywrap
    45 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14
     45driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -Wextra -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14
    4646driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic
    4747
  • src/Makefile.in

    rfea3faa rb826e6b  
    1 # Makefile.in generated by automake 1.11.3 from Makefile.am.
     1# Makefile.in generated by automake 1.15 from Makefile.am.
    22# @configure_input@
    33
    4 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
    5 # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
    6 # Foundation, Inc.
     4# Copyright (C) 1994-2014 Free Software Foundation, Inc.
     5
    76# This Makefile.in is free software; the Free Software Foundation
    87# gives unlimited permission to copy and/or distribute it,
     
    5958
    6059VPATH = @srcdir@
     60am__is_gnu_make = { \
     61  if test -z '$(MAKELEVEL)'; then \
     62    false; \
     63  elif test -n '$(MAKE_HOST)'; then \
     64    true; \
     65  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
     66    true; \
     67  else \
     68    false; \
     69  fi; \
     70}
     71am__make_running_with_option = \
     72  case $${target_option-} in \
     73      ?) ;; \
     74      *) echo "am__make_running_with_option: internal error: invalid" \
     75              "target option '$${target_option-}' specified" >&2; \
     76         exit 1;; \
     77  esac; \
     78  has_opt=no; \
     79  sane_makeflags=$$MAKEFLAGS; \
     80  if $(am__is_gnu_make); then \
     81    sane_makeflags=$$MFLAGS; \
     82  else \
     83    case $$MAKEFLAGS in \
     84      *\\[\ \   ]*) \
     85        bs=\\; \
     86        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
     87          | sed "s/$$bs$$bs[$$bs $$bs   ]*//g"`;; \
     88    esac; \
     89  fi; \
     90  skip_next=no; \
     91  strip_trailopt () \
     92  { \
     93    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
     94  }; \
     95  for flg in $$sane_makeflags; do \
     96    test $$skip_next = yes && { skip_next=no; continue; }; \
     97    case $$flg in \
     98      *=*|--*) continue;; \
     99        -*I) strip_trailopt 'I'; skip_next=yes;; \
     100      -*I?*) strip_trailopt 'I';; \
     101        -*O) strip_trailopt 'O'; skip_next=yes;; \
     102      -*O?*) strip_trailopt 'O';; \
     103        -*l) strip_trailopt 'l'; skip_next=yes;; \
     104      -*l?*) strip_trailopt 'l';; \
     105      -[dEDm]) skip_next=yes;; \
     106      -[JT]) skip_next=yes;; \
     107    esac; \
     108    case $$flg in \
     109      *$$target_option*) has_opt=yes; break;; \
     110    esac; \
     111  done; \
     112  test $$has_opt = yes
     113am__make_dryrun = (target_option=n; $(am__make_running_with_option))
     114am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
    61115pkgdatadir = $(datadir)/@PACKAGE@
    62116pkgincludedir = $(includedir)/@PACKAGE@
     
    77131build_triplet = @build@
    78132host_triplet = @host@
    79 DIST_COMMON = $(srcdir)/CodeGen/module.mk \
    80         $(srcdir)/CodeTools/module.mk $(srcdir)/Common/module.mk \
    81         $(srcdir)/Concurrency/module.mk \
    82         $(srcdir)/ControlStruct/module.mk $(srcdir)/GenPoly/module.mk \
    83         $(srcdir)/InitTweak/module.mk $(srcdir)/Makefile.am \
    84         $(srcdir)/Makefile.in $(srcdir)/Parser/module.mk \
    85         $(srcdir)/ResolvExpr/module.mk $(srcdir)/SymTab/module.mk \
    86         $(srcdir)/SynTree/module.mk $(srcdir)/Tuples/module.mk \
    87         Parser/lex.cc Parser/parser.cc Parser/parser.h
    88133cfa_cpplib_PROGRAMS = driver/cfa-cpp$(EXEEXT)
    89134subdir = src
     
    92137am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
    93138        $(ACLOCAL_M4)
     139DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
    94140mkinstalldirs = $(install_sh) -d
    95141CONFIG_HEADER = $(top_builddir)/config.h
     
    119165        ControlStruct/driver_cfa_cpp-Mutate.$(OBJEXT) \
    120166        ControlStruct/driver_cfa_cpp-ForExprMutator.$(OBJEXT) \
     167        ControlStruct/driver_cfa_cpp-ExceptTranslate.$(OBJEXT) \
    121168        GenPoly/driver_cfa_cpp-Box.$(OBJEXT) \
    122169        GenPoly/driver_cfa_cpp-GenPoly.$(OBJEXT) \
     
    143190        Parser/driver_cfa_cpp-TypeData.$(OBJEXT) \
    144191        Parser/driver_cfa_cpp-LinkageSpec.$(OBJEXT) \
    145         Parser/driver_cfa_cpp-parseutility.$(OBJEXT) \
     192        Parser/driver_cfa_cpp-parserutility.$(OBJEXT) \
    146193        ResolvExpr/driver_cfa_cpp-AlternativeFinder.$(OBJEXT) \
    147194        ResolvExpr/driver_cfa_cpp-Alternative.$(OBJEXT) \
     
    161208        ResolvExpr/driver_cfa_cpp-Occurs.$(OBJEXT) \
    162209        ResolvExpr/driver_cfa_cpp-TypeEnvironment.$(OBJEXT) \
     210        ResolvExpr/driver_cfa_cpp-CurrentObject.$(OBJEXT) \
    163211        SymTab/driver_cfa_cpp-Indexer.$(OBJEXT) \
    164212        SymTab/driver_cfa_cpp-Mangler.$(OBJEXT) \
     
    168216        SymTab/driver_cfa_cpp-TypeEquality.$(OBJEXT) \
    169217        SymTab/driver_cfa_cpp-Autogen.$(OBJEXT) \
     218        SymTab/driver_cfa_cpp-TreeStruct.$(OBJEXT) \
    170219        SynTree/driver_cfa_cpp-Type.$(OBJEXT) \
    171220        SynTree/driver_cfa_cpp-VoidType.$(OBJEXT) \
     
    213262driver_cfa_cpp_LINK = $(CXXLD) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) \
    214263        $(driver_cfa_cpp_LDFLAGS) $(LDFLAGS) -o $@
     264AM_V_P = $(am__v_P_@AM_V@)
     265am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
     266am__v_P_0 = false
     267am__v_P_1 = :
     268AM_V_GEN = $(am__v_GEN_@AM_V@)
     269am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
     270am__v_GEN_0 = @echo "  GEN     " $@;
     271am__v_GEN_1 =
     272AM_V_at = $(am__v_at_@AM_V@)
     273am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
     274am__v_at_0 = @
     275am__v_at_1 =
    215276DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
    216277depcomp = $(SHELL) $(top_srcdir)/automake/depcomp
     
    220281am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
    221282am__v_lt_0 = --silent
     283am__v_lt_1 =
    222284CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
    223285        $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
    224286AM_V_CXX = $(am__v_CXX_@AM_V@)
    225287am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
    226 am__v_CXX_0 = @echo "  CXX   " $@;
    227 AM_V_at = $(am__v_at_@AM_V@)
    228 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
    229 am__v_at_0 = @
     288am__v_CXX_0 = @echo "  CXX     " $@;
     289am__v_CXX_1 =
    230290CXXLD = $(CXX)
    231291CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
     
    233293AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
    234294am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
    235 am__v_CXXLD_0 = @echo "  CXXLD " $@;
     295am__v_CXXLD_0 = @echo "  CXXLD   " $@;
     296am__v_CXXLD_1 =
    236297@MAINTAINER_MODE_FALSE@am__skiplex = test -f $@ ||
    237298LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS)
    238299AM_V_LEX = $(am__v_LEX_@AM_V@)
    239300am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@)
    240 am__v_LEX_0 = @echo "  LEX   " $@;
     301am__v_LEX_0 = @echo "  LEX     " $@;
     302am__v_LEX_1 =
    241303YLWRAP = $(top_srcdir)/automake/ylwrap
    242304@MAINTAINER_MODE_FALSE@am__skipyacc = test -f $@ ||
     305am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \
     306                   -e s/c++$$/h++/ -e s/c$$/h/
    243307YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS)
    244308AM_V_YACC = $(am__v_YACC_@AM_V@)
    245309am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@)
    246 am__v_YACC_0 = @echo "  YACC  " $@;
     310am__v_YACC_0 = @echo "  YACC    " $@;
     311am__v_YACC_1 =
    247312COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
    248313        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
    249314AM_V_CC = $(am__v_CC_@AM_V@)
    250315am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
    251 am__v_CC_0 = @echo "  CC    " $@;
     316am__v_CC_0 = @echo "  CC      " $@;
     317am__v_CC_1 =
    252318CCLD = $(CC)
    253319LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
    254320AM_V_CCLD = $(am__v_CCLD_@AM_V@)
    255321am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
    256 am__v_CCLD_0 = @echo "  CCLD  " $@;
    257 AM_V_GEN = $(am__v_GEN_@AM_V@)
    258 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
    259 am__v_GEN_0 = @echo "  GEN   " $@;
     322am__v_CCLD_0 = @echo "  CCLD    " $@;
     323am__v_CCLD_1 =
    260324SOURCES = $(driver_cfa_cpp_SOURCES)
    261325DIST_SOURCES = $(driver_cfa_cpp_SOURCES)
     326am__can_run_installinfo = \
     327  case $$AM_UPDATE_INFO_DIR in \
     328    n|no|NO) false;; \
     329    *) (install-info --version) >/dev/null 2>&1;; \
     330  esac
     331am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
     332# Read a list of newline-separated strings from the standard input,
     333# and print each of them once, without duplicates.  Input order is
     334# *not* preserved.
     335am__uniquify_input = $(AWK) '\
     336  BEGIN { nonempty = 0; } \
     337  { items[$$0] = 1; nonempty = 1; } \
     338  END { if (nonempty) { for (i in items) print i; }; } \
     339'
     340# Make sure the list of sources is unique.  This is necessary because,
     341# e.g., the same source file might be shared among _SOURCES variables
     342# for different programs/libraries.
     343am__define_uniq_tagged_files = \
     344  list='$(am__tagged_files)'; \
     345  unique=`for i in $$list; do \
     346    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
     347  done | $(am__uniquify_input)`
    262348ETAGS = etags
    263349CTAGS = ctags
     350am__DIST_COMMON = $(srcdir)/CodeGen/module.mk \
     351        $(srcdir)/CodeTools/module.mk $(srcdir)/Common/module.mk \
     352        $(srcdir)/Concurrency/module.mk \
     353        $(srcdir)/ControlStruct/module.mk $(srcdir)/GenPoly/module.mk \
     354        $(srcdir)/InitTweak/module.mk $(srcdir)/Makefile.in \
     355        $(srcdir)/Parser/module.mk $(srcdir)/ResolvExpr/module.mk \
     356        $(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
    264360DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
    265361ACLOCAL = @ACLOCAL@
     
    374470program_transform_name = @program_transform_name@
    375471psdir = @psdir@
     472runstatedir = @runstatedir@
    376473sbindir = @sbindir@
    377474sharedstatedir = @sharedstatedir@
     
    394491        ControlStruct/LabelGenerator.cc ControlStruct/LabelFixer.cc \
    395492        ControlStruct/MLEMutator.cc ControlStruct/Mutate.cc \
    396         ControlStruct/ForExprMutator.cc GenPoly/Box.cc \
     493        ControlStruct/ForExprMutator.cc \
     494        ControlStruct/ExceptTranslate.cc GenPoly/Box.cc \
    397495        GenPoly/GenPoly.cc GenPoly/PolyMutator.cc \
    398496        GenPoly/ScrubTyVars.cc GenPoly/Lvalue.cc GenPoly/Specialize.cc \
     
    405503        Parser/ExpressionNode.cc Parser/StatementNode.cc \
    406504        Parser/InitializerNode.cc Parser/TypeData.cc \
    407         Parser/LinkageSpec.cc Parser/parseutility.cc \
     505        Parser/LinkageSpec.cc Parser/parserutility.cc \
    408506        ResolvExpr/AlternativeFinder.cc ResolvExpr/Alternative.cc \
    409507        ResolvExpr/Unify.cc ResolvExpr/PtrsAssignable.cc \
     
    414512        ResolvExpr/RenameVars.cc ResolvExpr/FindOpenVars.cc \
    415513        ResolvExpr/PolyCost.cc ResolvExpr/Occurs.cc \
    416         ResolvExpr/TypeEnvironment.cc SymTab/Indexer.cc \
    417         SymTab/Mangler.cc SymTab/Validate.cc SymTab/FixFunction.cc \
    418         SymTab/ImplementationType.cc SymTab/TypeEquality.cc \
    419         SymTab/Autogen.cc SynTree/Type.cc SynTree/VoidType.cc \
    420         SynTree/BasicType.cc SynTree/PointerType.cc \
    421         SynTree/ArrayType.cc SynTree/FunctionType.cc \
    422         SynTree/ReferenceToType.cc SynTree/TupleType.cc \
    423         SynTree/TypeofType.cc SynTree/AttrType.cc \
     514        ResolvExpr/TypeEnvironment.cc ResolvExpr/CurrentObject.cc \
     515        SymTab/Indexer.cc SymTab/Mangler.cc SymTab/Validate.cc \
     516        SymTab/FixFunction.cc SymTab/ImplementationType.cc \
     517        SymTab/TypeEquality.cc SymTab/Autogen.cc SymTab/TreeStruct.cc \
     518        SynTree/Type.cc SynTree/VoidType.cc SynTree/BasicType.cc \
     519        SynTree/PointerType.cc SynTree/ArrayType.cc \
     520        SynTree/FunctionType.cc SynTree/ReferenceToType.cc \
     521        SynTree/TupleType.cc SynTree/TypeofType.cc SynTree/AttrType.cc \
    424522        SynTree/VarArgsType.cc SynTree/ZeroOneType.cc \
    425523        SynTree/Constant.cc SynTree/Expression.cc SynTree/TupleExpr.cc \
     
    438536MAINTAINERCLEANFILES = Parser/parser.output ${libdir}/${notdir \
    439537        ${cfa_cpplib_PROGRAMS}}
    440 BUILT_SOURCES = Parser/parser.h
     538BUILT_SOURCES = Parser/parser.hh
    441539AM_YFLAGS = -d -t -v
    442540
     
    447545driver_cfa_cpp_SOURCES = ${SRC}
    448546driver_cfa_cpp_LDADD = ${LEXLIB} -ldl                   # yywrap
    449 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14
     547driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -Wextra -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14
    450548driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic
    451549all: $(BUILT_SOURCES)
     
    466564        $(am__cd) $(top_srcdir) && \
    467565          $(AUTOMAKE) --foreign src/Makefile
    468 .PRECIOUS: Makefile
    469566Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
    470567        @case '$?' in \
     
    475572            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
    476573        esac;
    477 $(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:
     574$(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):
    478575
    479576$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
     
    487584install-cfa_cpplibPROGRAMS: $(cfa_cpplib_PROGRAMS)
    488585        @$(NORMAL_INSTALL)
    489         test -z "$(cfa_cpplibdir)" || $(MKDIR_P) "$(DESTDIR)$(cfa_cpplibdir)"
    490586        @list='$(cfa_cpplib_PROGRAMS)'; test -n "$(cfa_cpplibdir)" || list=; \
     587        if test -n "$$list"; then \
     588          echo " $(MKDIR_P) '$(DESTDIR)$(cfa_cpplibdir)'"; \
     589          $(MKDIR_P) "$(DESTDIR)$(cfa_cpplibdir)" || exit 1; \
     590        fi; \
    491591        for p in $$list; do echo "$$p $$p"; done | \
    492592        sed 's/$(EXEEXT)$$//' | \
    493         while read p p1; do if test -f $$p; \
    494           then echo "$$p"; echo "$$p"; else :; fi; \
     593        while read p p1; do if test -f $$p \
     594          ; then echo "$$p"; echo "$$p"; else :; fi; \
    495595        done | \
    496         sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
     596        sed -e 'p;s,.*/,,;n;h' \
     597            -e 's|.*|.|' \
    497598            -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
    498599        sed 'N;N;N;s,\n, ,g' | \
     
    515616        files=`for p in $$list; do echo "$$p"; done | \
    516617          sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
    517               -e 's/$$/$(EXEEXT)/' `; \
     618              -e 's/$$/$(EXEEXT)/' \
     619        `; \
    518620        test -n "$$list" || exit 0; \
    519621        echo " ( cd '$(DESTDIR)$(cfa_cpplibdir)' && rm -f" $$files ")"; \
     
    594696        ControlStruct/$(am__dirstamp) \
    595697        ControlStruct/$(DEPDIR)/$(am__dirstamp)
     698ControlStruct/driver_cfa_cpp-ExceptTranslate.$(OBJEXT):  \
     699        ControlStruct/$(am__dirstamp) \
     700        ControlStruct/$(DEPDIR)/$(am__dirstamp)
    596701GenPoly/$(am__dirstamp):
    597702        @$(MKDIR_P) GenPoly
     
    634739InitTweak/driver_cfa_cpp-InitTweak.$(OBJEXT):  \
    635740        InitTweak/$(am__dirstamp) InitTweak/$(DEPDIR)/$(am__dirstamp)
    636 Parser/parser.h: Parser/parser.cc
     741Parser/parser.hh: Parser/parser.cc
    637742        @if test ! -f $@; then rm -f Parser/parser.cc; else :; fi
    638743        @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) Parser/parser.cc; else :; fi
     
    663768Parser/driver_cfa_cpp-LinkageSpec.$(OBJEXT): Parser/$(am__dirstamp) \
    664769        Parser/$(DEPDIR)/$(am__dirstamp)
    665 Parser/driver_cfa_cpp-parseutility.$(OBJEXT): Parser/$(am__dirstamp) \
     770Parser/driver_cfa_cpp-parserutility.$(OBJEXT): Parser/$(am__dirstamp) \
    666771        Parser/$(DEPDIR)/$(am__dirstamp)
    667772ResolvExpr/$(am__dirstamp):
     
    721826        ResolvExpr/$(am__dirstamp) \
    722827        ResolvExpr/$(DEPDIR)/$(am__dirstamp)
     828ResolvExpr/driver_cfa_cpp-CurrentObject.$(OBJEXT):  \
     829        ResolvExpr/$(am__dirstamp) \
     830        ResolvExpr/$(DEPDIR)/$(am__dirstamp)
    723831SymTab/$(am__dirstamp):
    724832        @$(MKDIR_P) SymTab
     
    740848        SymTab/$(DEPDIR)/$(am__dirstamp)
    741849SymTab/driver_cfa_cpp-Autogen.$(OBJEXT): SymTab/$(am__dirstamp) \
     850        SymTab/$(DEPDIR)/$(am__dirstamp)
     851SymTab/driver_cfa_cpp-TreeStruct.$(OBJEXT): SymTab/$(am__dirstamp) \
    742852        SymTab/$(DEPDIR)/$(am__dirstamp)
    743853SynTree/$(am__dirstamp):
     
    834944        @$(MKDIR_P) driver
    835945        @: > driver/$(am__dirstamp)
     946
    836947driver/cfa-cpp$(EXEEXT): $(driver_cfa_cpp_OBJECTS) $(driver_cfa_cpp_DEPENDENCIES) $(EXTRA_driver_cfa_cpp_DEPENDENCIES) driver/$(am__dirstamp)
    837948        @rm -f driver/cfa-cpp$(EXEEXT)
     
    840951mostlyclean-compile:
    841952        -rm -f *.$(OBJEXT)
    842         -rm -f CodeGen/driver_cfa_cpp-CodeGenerator.$(OBJEXT)
    843         -rm -f CodeGen/driver_cfa_cpp-FixMain.$(OBJEXT)
    844         -rm -f CodeGen/driver_cfa_cpp-FixNames.$(OBJEXT)
    845         -rm -f CodeGen/driver_cfa_cpp-GenType.$(OBJEXT)
    846         -rm -f CodeGen/driver_cfa_cpp-Generate.$(OBJEXT)
    847         -rm -f CodeGen/driver_cfa_cpp-OperatorTable.$(OBJEXT)
    848         -rm -f CodeTools/driver_cfa_cpp-DeclStats.$(OBJEXT)
    849         -rm -f CodeTools/driver_cfa_cpp-TrackLoc.$(OBJEXT)
    850         -rm -f Common/driver_cfa_cpp-Assert.$(OBJEXT)
    851         -rm -f Common/driver_cfa_cpp-DebugMalloc.$(OBJEXT)
    852         -rm -f Common/driver_cfa_cpp-SemanticError.$(OBJEXT)
    853         -rm -f Common/driver_cfa_cpp-UniqueName.$(OBJEXT)
    854         -rm -f Concurrency/driver_cfa_cpp-Keywords.$(OBJEXT)
    855         -rm -f ControlStruct/driver_cfa_cpp-ForExprMutator.$(OBJEXT)
    856         -rm -f ControlStruct/driver_cfa_cpp-LabelFixer.$(OBJEXT)
    857         -rm -f ControlStruct/driver_cfa_cpp-LabelGenerator.$(OBJEXT)
    858         -rm -f ControlStruct/driver_cfa_cpp-MLEMutator.$(OBJEXT)
    859         -rm -f ControlStruct/driver_cfa_cpp-Mutate.$(OBJEXT)
    860         -rm -f GenPoly/driver_cfa_cpp-Box.$(OBJEXT)
    861         -rm -f GenPoly/driver_cfa_cpp-CopyParams.$(OBJEXT)
    862         -rm -f GenPoly/driver_cfa_cpp-DeclMutator.$(OBJEXT)
    863         -rm -f GenPoly/driver_cfa_cpp-FindFunction.$(OBJEXT)
    864         -rm -f GenPoly/driver_cfa_cpp-GenPoly.$(OBJEXT)
    865         -rm -f GenPoly/driver_cfa_cpp-InstantiateGeneric.$(OBJEXT)
    866         -rm -f GenPoly/driver_cfa_cpp-Lvalue.$(OBJEXT)
    867         -rm -f GenPoly/driver_cfa_cpp-PolyMutator.$(OBJEXT)
    868         -rm -f GenPoly/driver_cfa_cpp-ScrubTyVars.$(OBJEXT)
    869         -rm -f GenPoly/driver_cfa_cpp-Specialize.$(OBJEXT)
    870         -rm -f InitTweak/driver_cfa_cpp-FixGlobalInit.$(OBJEXT)
    871         -rm -f InitTweak/driver_cfa_cpp-FixInit.$(OBJEXT)
    872         -rm -f InitTweak/driver_cfa_cpp-GenInit.$(OBJEXT)
    873         -rm -f InitTweak/driver_cfa_cpp-InitTweak.$(OBJEXT)
    874         -rm -f Parser/driver_cfa_cpp-DeclarationNode.$(OBJEXT)
    875         -rm -f Parser/driver_cfa_cpp-ExpressionNode.$(OBJEXT)
    876         -rm -f Parser/driver_cfa_cpp-InitializerNode.$(OBJEXT)
    877         -rm -f Parser/driver_cfa_cpp-LinkageSpec.$(OBJEXT)
    878         -rm -f Parser/driver_cfa_cpp-ParseNode.$(OBJEXT)
    879         -rm -f Parser/driver_cfa_cpp-StatementNode.$(OBJEXT)
    880         -rm -f Parser/driver_cfa_cpp-TypeData.$(OBJEXT)
    881         -rm -f Parser/driver_cfa_cpp-TypedefTable.$(OBJEXT)
    882         -rm -f Parser/driver_cfa_cpp-lex.$(OBJEXT)
    883         -rm -f Parser/driver_cfa_cpp-parser.$(OBJEXT)
    884         -rm -f Parser/driver_cfa_cpp-parseutility.$(OBJEXT)
    885         -rm -f ResolvExpr/driver_cfa_cpp-AdjustExprType.$(OBJEXT)
    886         -rm -f ResolvExpr/driver_cfa_cpp-Alternative.$(OBJEXT)
    887         -rm -f ResolvExpr/driver_cfa_cpp-AlternativeFinder.$(OBJEXT)
    888         -rm -f ResolvExpr/driver_cfa_cpp-AlternativePrinter.$(OBJEXT)
    889         -rm -f ResolvExpr/driver_cfa_cpp-CastCost.$(OBJEXT)
    890         -rm -f ResolvExpr/driver_cfa_cpp-CommonType.$(OBJEXT)
    891         -rm -f ResolvExpr/driver_cfa_cpp-ConversionCost.$(OBJEXT)
    892         -rm -f ResolvExpr/driver_cfa_cpp-FindOpenVars.$(OBJEXT)
    893         -rm -f ResolvExpr/driver_cfa_cpp-Occurs.$(OBJEXT)
    894         -rm -f ResolvExpr/driver_cfa_cpp-PolyCost.$(OBJEXT)
    895         -rm -f ResolvExpr/driver_cfa_cpp-PtrsAssignable.$(OBJEXT)
    896         -rm -f ResolvExpr/driver_cfa_cpp-PtrsCastable.$(OBJEXT)
    897         -rm -f ResolvExpr/driver_cfa_cpp-RenameVars.$(OBJEXT)
    898         -rm -f ResolvExpr/driver_cfa_cpp-ResolveTypeof.$(OBJEXT)
    899         -rm -f ResolvExpr/driver_cfa_cpp-Resolver.$(OBJEXT)
    900         -rm -f ResolvExpr/driver_cfa_cpp-TypeEnvironment.$(OBJEXT)
    901         -rm -f ResolvExpr/driver_cfa_cpp-Unify.$(OBJEXT)
    902         -rm -f SymTab/driver_cfa_cpp-Autogen.$(OBJEXT)
    903         -rm -f SymTab/driver_cfa_cpp-FixFunction.$(OBJEXT)
    904         -rm -f SymTab/driver_cfa_cpp-ImplementationType.$(OBJEXT)
    905         -rm -f SymTab/driver_cfa_cpp-Indexer.$(OBJEXT)
    906         -rm -f SymTab/driver_cfa_cpp-Mangler.$(OBJEXT)
    907         -rm -f SymTab/driver_cfa_cpp-TypeEquality.$(OBJEXT)
    908         -rm -f SymTab/driver_cfa_cpp-Validate.$(OBJEXT)
    909         -rm -f SynTree/driver_cfa_cpp-AddStmtVisitor.$(OBJEXT)
    910         -rm -f SynTree/driver_cfa_cpp-AddressExpr.$(OBJEXT)
    911         -rm -f SynTree/driver_cfa_cpp-AggregateDecl.$(OBJEXT)
    912         -rm -f SynTree/driver_cfa_cpp-ApplicationExpr.$(OBJEXT)
    913         -rm -f SynTree/driver_cfa_cpp-ArrayType.$(OBJEXT)
    914         -rm -f SynTree/driver_cfa_cpp-AttrType.$(OBJEXT)
    915         -rm -f SynTree/driver_cfa_cpp-Attribute.$(OBJEXT)
    916         -rm -f SynTree/driver_cfa_cpp-BasicType.$(OBJEXT)
    917         -rm -f SynTree/driver_cfa_cpp-CommaExpr.$(OBJEXT)
    918         -rm -f SynTree/driver_cfa_cpp-CompoundStmt.$(OBJEXT)
    919         -rm -f SynTree/driver_cfa_cpp-Constant.$(OBJEXT)
    920         -rm -f SynTree/driver_cfa_cpp-DeclStmt.$(OBJEXT)
    921         -rm -f SynTree/driver_cfa_cpp-Declaration.$(OBJEXT)
    922         -rm -f SynTree/driver_cfa_cpp-DeclarationWithType.$(OBJEXT)
    923         -rm -f SynTree/driver_cfa_cpp-Expression.$(OBJEXT)
    924         -rm -f SynTree/driver_cfa_cpp-FunctionDecl.$(OBJEXT)
    925         -rm -f SynTree/driver_cfa_cpp-FunctionType.$(OBJEXT)
    926         -rm -f SynTree/driver_cfa_cpp-Initializer.$(OBJEXT)
    927         -rm -f SynTree/driver_cfa_cpp-Mutator.$(OBJEXT)
    928         -rm -f SynTree/driver_cfa_cpp-NamedTypeDecl.$(OBJEXT)
    929         -rm -f SynTree/driver_cfa_cpp-ObjectDecl.$(OBJEXT)
    930         -rm -f SynTree/driver_cfa_cpp-PointerType.$(OBJEXT)
    931         -rm -f SynTree/driver_cfa_cpp-ReferenceToType.$(OBJEXT)
    932         -rm -f SynTree/driver_cfa_cpp-Statement.$(OBJEXT)
    933         -rm -f SynTree/driver_cfa_cpp-TupleExpr.$(OBJEXT)
    934         -rm -f SynTree/driver_cfa_cpp-TupleType.$(OBJEXT)
    935         -rm -f SynTree/driver_cfa_cpp-Type.$(OBJEXT)
    936         -rm -f SynTree/driver_cfa_cpp-TypeDecl.$(OBJEXT)
    937         -rm -f SynTree/driver_cfa_cpp-TypeExpr.$(OBJEXT)
    938         -rm -f SynTree/driver_cfa_cpp-TypeSubstitution.$(OBJEXT)
    939         -rm -f SynTree/driver_cfa_cpp-TypeofType.$(OBJEXT)
    940         -rm -f SynTree/driver_cfa_cpp-VarArgsType.$(OBJEXT)
    941         -rm -f SynTree/driver_cfa_cpp-VarExprReplacer.$(OBJEXT)
    942         -rm -f SynTree/driver_cfa_cpp-Visitor.$(OBJEXT)
    943         -rm -f SynTree/driver_cfa_cpp-VoidType.$(OBJEXT)
    944         -rm -f SynTree/driver_cfa_cpp-ZeroOneType.$(OBJEXT)
    945         -rm -f Tuples/driver_cfa_cpp-Explode.$(OBJEXT)
    946         -rm -f Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT)
    947         -rm -f Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT)
     953        -rm -f CodeGen/*.$(OBJEXT)
     954        -rm -f CodeTools/*.$(OBJEXT)
     955        -rm -f Common/*.$(OBJEXT)
     956        -rm -f Concurrency/*.$(OBJEXT)
     957        -rm -f ControlStruct/*.$(OBJEXT)
     958        -rm -f GenPoly/*.$(OBJEXT)
     959        -rm -f InitTweak/*.$(OBJEXT)
     960        -rm -f Parser/*.$(OBJEXT)
     961        -rm -f ResolvExpr/*.$(OBJEXT)
     962        -rm -f SymTab/*.$(OBJEXT)
     963        -rm -f SynTree/*.$(OBJEXT)
     964        -rm -f Tuples/*.$(OBJEXT)
    948965
    949966distclean-compile:
     
    965982@AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-UniqueName.Po@am__quote@
    966983@AMDEP_TRUE@@am__include@ @am__quote@Concurrency/$(DEPDIR)/driver_cfa_cpp-Keywords.Po@am__quote@
     984@AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-ExceptTranslate.Po@am__quote@
    967985@AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-ForExprMutator.Po@am__quote@
    968986@AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelFixer.Po@am__quote@
     
    9941012@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-lex.Po@am__quote@
    9951013@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-parser.Po@am__quote@
    996 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Po@am__quote@
     1014@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Po@am__quote@
    9971015@AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-AdjustExprType.Po@am__quote@
    9981016@AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-Alternative.Po@am__quote@
     
    10021020@AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CommonType.Po@am__quote@
    10031021@AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-ConversionCost.Po@am__quote@
     1022@AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CurrentObject.Po@am__quote@
    10041023@AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-FindOpenVars.Po@am__quote@
    10051024@AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-Occurs.Po@am__quote@
     
    10171036@AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Indexer.Po@am__quote@
    10181037@AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Mangler.Po@am__quote@
     1038@AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Po@am__quote@
    10191039@AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-TypeEquality.Po@am__quote@
    10201040@AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Validate.Po@am__quote@
     
    13551375@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ControlStruct/driver_cfa_cpp-ForExprMutator.obj `if test -f 'ControlStruct/ForExprMutator.cc'; then $(CYGPATH_W) 'ControlStruct/ForExprMutator.cc'; else $(CYGPATH_W) '$(srcdir)/ControlStruct/ForExprMutator.cc'; fi`
    13561376
     1377ControlStruct/driver_cfa_cpp-ExceptTranslate.o: ControlStruct/ExceptTranslate.cc
     1378@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ControlStruct/driver_cfa_cpp-ExceptTranslate.o -MD -MP -MF ControlStruct/$(DEPDIR)/driver_cfa_cpp-ExceptTranslate.Tpo -c -o ControlStruct/driver_cfa_cpp-ExceptTranslate.o `test -f 'ControlStruct/ExceptTranslate.cc' || echo '$(srcdir)/'`ControlStruct/ExceptTranslate.cc
     1379@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) ControlStruct/$(DEPDIR)/driver_cfa_cpp-ExceptTranslate.Tpo ControlStruct/$(DEPDIR)/driver_cfa_cpp-ExceptTranslate.Po
     1380@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='ControlStruct/ExceptTranslate.cc' object='ControlStruct/driver_cfa_cpp-ExceptTranslate.o' libtool=no @AMDEPBACKSLASH@
     1381@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1382@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ControlStruct/driver_cfa_cpp-ExceptTranslate.o `test -f 'ControlStruct/ExceptTranslate.cc' || echo '$(srcdir)/'`ControlStruct/ExceptTranslate.cc
     1383
     1384ControlStruct/driver_cfa_cpp-ExceptTranslate.obj: ControlStruct/ExceptTranslate.cc
     1385@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ControlStruct/driver_cfa_cpp-ExceptTranslate.obj -MD -MP -MF ControlStruct/$(DEPDIR)/driver_cfa_cpp-ExceptTranslate.Tpo -c -o ControlStruct/driver_cfa_cpp-ExceptTranslate.obj `if test -f 'ControlStruct/ExceptTranslate.cc'; then $(CYGPATH_W) 'ControlStruct/ExceptTranslate.cc'; else $(CYGPATH_W) '$(srcdir)/ControlStruct/ExceptTranslate.cc'; fi`
     1386@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) ControlStruct/$(DEPDIR)/driver_cfa_cpp-ExceptTranslate.Tpo ControlStruct/$(DEPDIR)/driver_cfa_cpp-ExceptTranslate.Po
     1387@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='ControlStruct/ExceptTranslate.cc' object='ControlStruct/driver_cfa_cpp-ExceptTranslate.obj' libtool=no @AMDEPBACKSLASH@
     1388@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1389@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ControlStruct/driver_cfa_cpp-ExceptTranslate.obj `if test -f 'ControlStruct/ExceptTranslate.cc'; then $(CYGPATH_W) 'ControlStruct/ExceptTranslate.cc'; else $(CYGPATH_W) '$(srcdir)/ControlStruct/ExceptTranslate.cc'; fi`
     1390
    13571391GenPoly/driver_cfa_cpp-Box.o: GenPoly/Box.cc
    13581392@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT GenPoly/driver_cfa_cpp-Box.o -MD -MP -MF GenPoly/$(DEPDIR)/driver_cfa_cpp-Box.Tpo -c -o GenPoly/driver_cfa_cpp-Box.o `test -f 'GenPoly/Box.cc' || echo '$(srcdir)/'`GenPoly/Box.cc
     
    16911725@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Parser/driver_cfa_cpp-LinkageSpec.obj `if test -f 'Parser/LinkageSpec.cc'; then $(CYGPATH_W) 'Parser/LinkageSpec.cc'; else $(CYGPATH_W) '$(srcdir)/Parser/LinkageSpec.cc'; fi`
    16921726
    1693 Parser/driver_cfa_cpp-parseutility.o: Parser/parseutility.cc
    1694 @am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/driver_cfa_cpp-parseutility.o -MD -MP -MF Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Tpo -c -o Parser/driver_cfa_cpp-parseutility.o `test -f 'Parser/parseutility.cc' || echo '$(srcdir)/'`Parser/parseutility.cc
    1695 @am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Tpo Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Po
    1696 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Parser/parseutility.cc' object='Parser/driver_cfa_cpp-parseutility.o' libtool=no @AMDEPBACKSLASH@
    1697 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1698 @am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Parser/driver_cfa_cpp-parseutility.o `test -f 'Parser/parseutility.cc' || echo '$(srcdir)/'`Parser/parseutility.cc
    1699 
    1700 Parser/driver_cfa_cpp-parseutility.obj: Parser/parseutility.cc
    1701 @am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/driver_cfa_cpp-parseutility.obj -MD -MP -MF Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Tpo -c -o Parser/driver_cfa_cpp-parseutility.obj `if test -f 'Parser/parseutility.cc'; then $(CYGPATH_W) 'Parser/parseutility.cc'; else $(CYGPATH_W) '$(srcdir)/Parser/parseutility.cc'; fi`
    1702 @am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Tpo Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Po
    1703 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Parser/parseutility.cc' object='Parser/driver_cfa_cpp-parseutility.obj' libtool=no @AMDEPBACKSLASH@
    1704 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1705 @am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Parser/driver_cfa_cpp-parseutility.obj `if test -f 'Parser/parseutility.cc'; then $(CYGPATH_W) 'Parser/parseutility.cc'; else $(CYGPATH_W) '$(srcdir)/Parser/parseutility.cc'; fi`
     1727Parser/driver_cfa_cpp-parserutility.o: Parser/parserutility.cc
     1728@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/driver_cfa_cpp-parserutility.o -MD -MP -MF Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Tpo -c -o Parser/driver_cfa_cpp-parserutility.o `test -f 'Parser/parserutility.cc' || echo '$(srcdir)/'`Parser/parserutility.cc
     1729@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Tpo Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Po
     1730@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Parser/parserutility.cc' object='Parser/driver_cfa_cpp-parserutility.o' libtool=no @AMDEPBACKSLASH@
     1731@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1732@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Parser/driver_cfa_cpp-parserutility.o `test -f 'Parser/parserutility.cc' || echo '$(srcdir)/'`Parser/parserutility.cc
     1733
     1734Parser/driver_cfa_cpp-parserutility.obj: Parser/parserutility.cc
     1735@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/driver_cfa_cpp-parserutility.obj -MD -MP -MF Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Tpo -c -o Parser/driver_cfa_cpp-parserutility.obj `if test -f 'Parser/parserutility.cc'; then $(CYGPATH_W) 'Parser/parserutility.cc'; else $(CYGPATH_W) '$(srcdir)/Parser/parserutility.cc'; fi`
     1736@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Tpo Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Po
     1737@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Parser/parserutility.cc' object='Parser/driver_cfa_cpp-parserutility.obj' libtool=no @AMDEPBACKSLASH@
     1738@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1739@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Parser/driver_cfa_cpp-parserutility.obj `if test -f 'Parser/parserutility.cc'; then $(CYGPATH_W) 'Parser/parserutility.cc'; else $(CYGPATH_W) '$(srcdir)/Parser/parserutility.cc'; fi`
    17061740
    17071741ResolvExpr/driver_cfa_cpp-AlternativeFinder.o: ResolvExpr/AlternativeFinder.cc
     
    19431977@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ResolvExpr/driver_cfa_cpp-TypeEnvironment.obj `if test -f 'ResolvExpr/TypeEnvironment.cc'; then $(CYGPATH_W) 'ResolvExpr/TypeEnvironment.cc'; else $(CYGPATH_W) '$(srcdir)/ResolvExpr/TypeEnvironment.cc'; fi`
    19441978
     1979ResolvExpr/driver_cfa_cpp-CurrentObject.o: ResolvExpr/CurrentObject.cc
     1980@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ResolvExpr/driver_cfa_cpp-CurrentObject.o -MD -MP -MF ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CurrentObject.Tpo -c -o ResolvExpr/driver_cfa_cpp-CurrentObject.o `test -f 'ResolvExpr/CurrentObject.cc' || echo '$(srcdir)/'`ResolvExpr/CurrentObject.cc
     1981@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CurrentObject.Tpo ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CurrentObject.Po
     1982@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='ResolvExpr/CurrentObject.cc' object='ResolvExpr/driver_cfa_cpp-CurrentObject.o' libtool=no @AMDEPBACKSLASH@
     1983@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1984@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ResolvExpr/driver_cfa_cpp-CurrentObject.o `test -f 'ResolvExpr/CurrentObject.cc' || echo '$(srcdir)/'`ResolvExpr/CurrentObject.cc
     1985
     1986ResolvExpr/driver_cfa_cpp-CurrentObject.obj: ResolvExpr/CurrentObject.cc
     1987@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ResolvExpr/driver_cfa_cpp-CurrentObject.obj -MD -MP -MF ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CurrentObject.Tpo -c -o ResolvExpr/driver_cfa_cpp-CurrentObject.obj `if test -f 'ResolvExpr/CurrentObject.cc'; then $(CYGPATH_W) 'ResolvExpr/CurrentObject.cc'; else $(CYGPATH_W) '$(srcdir)/ResolvExpr/CurrentObject.cc'; fi`
     1988@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CurrentObject.Tpo ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CurrentObject.Po
     1989@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='ResolvExpr/CurrentObject.cc' object='ResolvExpr/driver_cfa_cpp-CurrentObject.obj' libtool=no @AMDEPBACKSLASH@
     1990@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1991@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ResolvExpr/driver_cfa_cpp-CurrentObject.obj `if test -f 'ResolvExpr/CurrentObject.cc'; then $(CYGPATH_W) 'ResolvExpr/CurrentObject.cc'; else $(CYGPATH_W) '$(srcdir)/ResolvExpr/CurrentObject.cc'; fi`
     1992
    19451993SymTab/driver_cfa_cpp-Indexer.o: SymTab/Indexer.cc
    19461994@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-Indexer.o -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-Indexer.Tpo -c -o SymTab/driver_cfa_cpp-Indexer.o `test -f 'SymTab/Indexer.cc' || echo '$(srcdir)/'`SymTab/Indexer.cc
     
    20412089@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-Autogen.obj `if test -f 'SymTab/Autogen.cc'; then $(CYGPATH_W) 'SymTab/Autogen.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/Autogen.cc'; fi`
    20422090
     2091SymTab/driver_cfa_cpp-TreeStruct.o: SymTab/TreeStruct.cc
     2092@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-TreeStruct.o -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo -c -o SymTab/driver_cfa_cpp-TreeStruct.o `test -f 'SymTab/TreeStruct.cc' || echo '$(srcdir)/'`SymTab/TreeStruct.cc
     2093@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Po
     2094@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='SymTab/TreeStruct.cc' object='SymTab/driver_cfa_cpp-TreeStruct.o' libtool=no @AMDEPBACKSLASH@
     2095@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     2096@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-TreeStruct.o `test -f 'SymTab/TreeStruct.cc' || echo '$(srcdir)/'`SymTab/TreeStruct.cc
     2097
     2098SymTab/driver_cfa_cpp-TreeStruct.obj: SymTab/TreeStruct.cc
     2099@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-TreeStruct.obj -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo -c -o SymTab/driver_cfa_cpp-TreeStruct.obj `if test -f 'SymTab/TreeStruct.cc'; then $(CYGPATH_W) 'SymTab/TreeStruct.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/TreeStruct.cc'; fi`
     2100@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Po
     2101@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='SymTab/TreeStruct.cc' object='SymTab/driver_cfa_cpp-TreeStruct.obj' libtool=no @AMDEPBACKSLASH@
     2102@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     2103@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-TreeStruct.obj `if test -f 'SymTab/TreeStruct.cc'; then $(CYGPATH_W) 'SymTab/TreeStruct.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/TreeStruct.cc'; fi`
     2104
    20432105SynTree/driver_cfa_cpp-Type.o: SynTree/Type.cc
    20442106@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SynTree/driver_cfa_cpp-Type.o -MD -MP -MF SynTree/$(DEPDIR)/driver_cfa_cpp-Type.Tpo -c -o SynTree/driver_cfa_cpp-Type.o `test -f 'SynTree/Type.cc' || echo '$(srcdir)/'`SynTree/Type.cc
     
    25912653
    25922654.yy.cc:
    2593         $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE)
    2594 
    2595 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
    2596         list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
    2597         unique=`for i in $$list; do \
    2598             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    2599           done | \
    2600           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    2601               END { if (nonempty) { for (i in files) print i; }; }'`; \
    2602         mkid -fID $$unique
    2603 tags: TAGS
    2604 
    2605 TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
    2606                 $(TAGS_FILES) $(LISP)
     2655        $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE)
     2656
     2657ID: $(am__tagged_files)
     2658        $(am__define_uniq_tagged_files); mkid -fID $$unique
     2659tags: tags-am
     2660TAGS: tags
     2661
     2662tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
    26072663        set x; \
    26082664        here=`pwd`; \
    2609         list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
    2610         unique=`for i in $$list; do \
    2611             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    2612           done | \
    2613           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    2614               END { if (nonempty) { for (i in files) print i; }; }'`; \
     2665        $(am__define_uniq_tagged_files); \
    26152666        shift; \
    26162667        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
     
    26242675          fi; \
    26252676        fi
    2626 ctags: CTAGS
    2627 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
    2628                 $(TAGS_FILES) $(LISP)
    2629         list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
    2630         unique=`for i in $$list; do \
    2631             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    2632           done | \
    2633           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    2634               END { if (nonempty) { for (i in files) print i; }; }'`; \
     2677ctags: ctags-am
     2678
     2679CTAGS: ctags
     2680ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
     2681        $(am__define_uniq_tagged_files); \
    26352682        test -z "$(CTAGS_ARGS)$$unique" \
    26362683          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
     
    26412688          && $(am__cd) $(top_srcdir) \
    26422689          && gtags -i $(GTAGS_ARGS) "$$here"
     2690cscopelist: cscopelist-am
     2691
     2692cscopelist-am: $(am__tagged_files)
     2693        list='$(am__tagged_files)'; \
     2694        case "$(srcdir)" in \
     2695          [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
     2696          *) sdir=$(subdir)/$(srcdir) ;; \
     2697        esac; \
     2698        for i in $$list; do \
     2699          if test -f "$$i"; then \
     2700            echo "$(subdir)/$$i"; \
     2701          else \
     2702            echo "$$sdir/$$i"; \
     2703          fi; \
     2704        done >> $(top_builddir)/cscope.files
    26432705
    26442706distclean-tags:
     
    27412803        -rm -f Parser/lex.cc
    27422804        -rm -f Parser/parser.cc
    2743         -rm -f Parser/parser.h
     2805        -rm -f Parser/parser.hh
    27442806        -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
    27452807        -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
     
    28152877.MAKE: all check install install-am install-strip
    28162878
    2817 .PHONY: CTAGS GTAGS all all-am check check-am clean \
    2818         clean-cfa_cpplibPROGRAMS clean-generic ctags distclean \
    2819         distclean-compile distclean-generic distclean-tags distdir dvi \
    2820         dvi-am html html-am info info-am install install-am \
    2821         install-cfa_cpplibPROGRAMS install-data install-data-am \
    2822         install-dvi install-dvi-am install-exec install-exec-am \
    2823         install-html install-html-am install-info install-info-am \
    2824         install-man install-pdf install-pdf-am install-ps \
    2825         install-ps-am install-strip installcheck installcheck-am \
    2826         installdirs maintainer-clean maintainer-clean-generic \
    2827         mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \
    2828         ps ps-am tags uninstall uninstall-am \
    2829         uninstall-cfa_cpplibPROGRAMS
     2879.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
     2880        clean-cfa_cpplibPROGRAMS clean-generic cscopelist-am ctags \
     2881        ctags-am distclean distclean-compile distclean-generic \
     2882        distclean-tags distdir dvi dvi-am html html-am info info-am \
     2883        install install-am install-cfa_cpplibPROGRAMS install-data \
     2884        install-data-am install-dvi install-dvi-am install-exec \
     2885        install-exec-am install-html install-html-am install-info \
     2886        install-info-am install-man install-pdf install-pdf-am \
     2887        install-ps install-ps-am install-strip installcheck \
     2888        installcheck-am installdirs maintainer-clean \
     2889        maintainer-clean-generic mostlyclean mostlyclean-compile \
     2890        mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
     2891        uninstall-am uninstall-cfa_cpplibPROGRAMS
     2892
     2893.PRECIOUS: Makefile
    28302894
    28312895
  • src/Parser/DeclarationNode.cc

    rfea3faa rb826e6b  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 12:34:05 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 17 15:46:33 2017
    13 // Update Count     : 1018
     11// Last Modified By : Andrew Beach
     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 ) {
     
    10631079          case TypeData::Enum:
    10641080          case TypeData::Aggregate: {
    1065                   ReferenceToType * ret = buildComAggInst( type, attributes );
     1081                  ReferenceToType * ret = buildComAggInst( type, attributes, linkage );
    10661082                  buildList( type->aggregate.actuals, ret->get_parameters() );
    10671083                  return ret;
  • src/Parser/ExpressionNode.cc

    rfea3faa rb826e6b  
    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 21 16:44:46 2017
    13 // Update Count     : 541
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tus Jul 18 10:08:00 2017
     13// Update Count     : 550
    1414//
    1515
     
    2727#include "SynTree/Declaration.h"
    2828#include "Common/UnimplementedError.h"
    29 #include "parseutility.h"
     29#include "parserutility.h"
    3030#include "Common/utility.h"
    3131
     
    4646// type.
    4747
    48 Type::Qualifiers emptyQualifiers;                               // no qualifiers on constants
     48Type::Qualifiers noQualifiers;                          // no qualifiers on constants
    4949
    5050static inline bool checkU( char c ) { return c == 'u' || c == 'U'; }
     
    118118        } // if
    119119
    120         Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[Unsigned][size] ), str, v ) );
     120        Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[Unsigned][size] ), str, v ) );
    121121        delete &str;                                                                            // created by lex
    122122        return ret;
     
    153153        } // if
    154154
    155         Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[complx][size] ), str, v ) );
     155        Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[complx][size] ), str, v ) );
    156156        delete &str;                                                                            // created by lex
    157157        return ret;
     
    159159
    160160Expression *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] ) );
     161        Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, BasicType::Char ), str, (unsigned long long int)(unsigned char)str[1] ) );
    162162        delete &str;                                                                            // created by lex
    163163        return ret;
     
    166166ConstantExpr *build_constantStr( const std::string & str ) {
    167167        // string should probably be a primitive type
    168         ArrayType *at = new ArrayType( emptyQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ),
     168        ArrayType *at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ),
    169169                                                                   new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ),  // +1 for '\0' and -2 for '"'
    170170                                                                   false, false );
     
    176176
    177177Expression *build_constantZeroOne( const std::string & str ) {
    178         Expression * ret = new ConstantExpr( Constant( str == "0" ? (Type *)new ZeroType( emptyQualifiers ) : (Type*)new OneType( emptyQualifiers ), str,
     178        Expression * ret = new ConstantExpr( Constant( str == "0" ? (Type *)new ZeroType( noQualifiers ) : (Type*)new OneType( noQualifiers ), str,
    179179                                                                                                   str == "0" ? (unsigned long long int)0 : (unsigned long long int)1 ) );
    180180        delete &str;                                                                            // created by lex
     
    231231}
    232232
     233// Must harmonize with OperKinds.
    233234static const char *OperName[] = {
    234235        // diadic
    235         "SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "?*?", "?/?", "?%?", "||", "&&",
     236        "SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "?\\?", "?*?", "?/?", "?%?", "||", "&&",
    236237        "?|?", "?&?", "?^?", "Cast", "?<<?", "?>>?", "?<?", "?>?", "?<=?", "?>=?", "?==?", "?!=?",
    237         "?=?", "?@=?", "?*=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?",
     238        "?=?", "?@=?", "?\\=?", "?*=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?",
    238239        "?[?]", "...",
    239240        // monadic
  • src/Parser/InitializerNode.cc

    rfea3faa rb826e6b  
    7474
    7575        InitializerNode *moreInit;
    76         if  ( get_next() != 0 && ((moreInit = dynamic_cast< InitializerNode * >( get_next() ) ) != 0) )
     76        if ( (moreInit = dynamic_cast< InitializerNode * >( get_next() ) ) ) {
    7777                moreInit->printOneLine( os );
     78        }
    7879}
    7980
    8081Initializer *InitializerNode::build() const {
    8182        if ( aggregate ) {
     83                // steal designators from children
     84                std::list< Designation * > designlist;
     85                InitializerNode * child = next_init();
     86                for ( ; child != nullptr; child = dynamic_cast< InitializerNode * >( child->get_next() ) ) {
     87                        std::list< Expression * > desList;
     88                        buildList< Expression, ExpressionNode >( child->designator, desList );
     89                        designlist.push_back( new Designation( desList ) );
     90                } // for
    8291                std::list< Initializer * > initlist;
    8392                buildList< Initializer, InitializerNode >( next_init(), initlist );
    84 
    85                 std::list< Expression * > designlist;
    86 
    87                 if ( designator != 0 ) {
    88                         buildList< Expression, ExpressionNode >( designator, designlist );
    89                 } // if
    90 
    9193                return new ListInit( initlist, designlist, maybeConstructed );
    9294        } else {
    93                 std::list< Expression * > designators;
    94 
    95                 if ( designator != 0 )
    96                         buildList< Expression, ExpressionNode >( designator, designators );
    97 
    98                 if ( get_expression() != 0)
    99                         return new SingleInit( maybeBuild< Expression >( get_expression() ), designators, maybeConstructed );
     95                if ( get_expression() != 0) {
     96                        return new SingleInit( maybeBuild< Expression >( get_expression() ), maybeConstructed );
     97                }
    10098        } // if
    101 
    10299        return 0;
    103100}
  • src/Parser/LinkageSpec.cc

    rfea3faa rb826e6b  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 13:22:09 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Oct  2 23:16:21 2016
    13 // Update Count     : 23
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Jul  7 11:11:00 2017
     13// Update Count     : 25
    1414//
    1515
     
    2222#include "Common/SemanticError.h"
    2323
    24 LinkageSpec::Spec LinkageSpec::linkageCheck( const string * spec ) {
     24namespace LinkageSpec {
     25
     26Spec linkageCheck( const string * spec ) {
     27        assert( spec );
    2528        unique_ptr<const string> guard( spec ); // allocated by lexer
    2629        if ( *spec == "\"Cforall\"" ) {
     
    2831        } else if ( *spec == "\"C\"" ) {
    2932                return C;
     33        } else if ( *spec == "\"BuiltinC\"" ) {
     34                return BuiltinC;
    3035        } else {
    3136                throw SemanticError( "Invalid linkage specifier " + *spec );
     
    3338}
    3439
    35 string LinkageSpec::linkageName( LinkageSpec::Spec linkage ) {
    36         assert( 0 <= linkage && linkage < LinkageSpec::NoOfSpecs );
    37         static const char *linkageKinds[LinkageSpec::NoOfSpecs] = {
    38                 "intrinsic", "Cforall", "C", "automatically generated", "compiler built-in",
    39         };
    40         return linkageKinds[linkage];
     40Spec linkageUpdate( Spec old_spec, const string * cmd ) {
     41        assert( cmd );
     42        unique_ptr<const string> guard( cmd ); // allocated by lexer
     43        if ( *cmd == "\"Cforall\"" ) {
     44                old_spec.is_mangled = true;
     45                return old_spec;
     46        } else if ( *cmd == "\"C\"" ) {
     47                old_spec.is_mangled = false;
     48                return old_spec;
     49        } else {
     50                throw SemanticError( "Invalid linkage specifier " + *cmd );
     51        } // if
    4152}
    4253
    43 bool LinkageSpec::isDecoratable( Spec spec ) {
    44         assert( 0 <= spec && spec < LinkageSpec::NoOfSpecs );
    45         static bool decoratable[LinkageSpec::NoOfSpecs] = {
    46                 //      Intrinsic,      Cforall,        C,              AutoGen,        Compiler
    47                         true,           true,           false,  true,           false,
    48         };
    49         return decoratable[spec];
     54std::string linkageName( Spec linkage ) {
     55    switch ( linkage ) {
     56    case Intrinsic:
     57        return "intrinsic";
     58    case C:
     59        return "C";
     60    case Cforall:
     61        return "Cforall";
     62    case AutoGen:
     63        return "autogenerated cfa";
     64    case Compiler:
     65        return "compiler built-in";
     66    case BuiltinCFA:
     67        return "cfa built-in";
     68    case BuiltinC:
     69        return "c built-in";
     70    default:
     71        return "<unnamed linkage spec>";
     72    }
    5073}
    5174
    52 bool LinkageSpec::isGeneratable( Spec spec ) {
    53         assert( 0 <= spec && spec < LinkageSpec::NoOfSpecs );
    54         static bool generatable[LinkageSpec::NoOfSpecs] = {
    55                 //      Intrinsic,      Cforall,        C,              AutoGen,        Compiler
    56                         true,           true,           true,   true,           false,
    57         };
    58         return generatable[spec];
    59 }
    60 
    61 bool LinkageSpec::isOverridable( Spec spec ) {
    62         assert( spec >= 0 && spec < LinkageSpec::NoOfSpecs );
    63         static bool overridable[LinkageSpec::NoOfSpecs] = {
    64                 //      Intrinsic,      Cforall,        C,              AutoGen,        Compiler
    65                         true,           false,          false,  true,           false,
    66         };
    67         return overridable[spec];
    68 }
    69 
    70 bool LinkageSpec::isBuiltin( Spec spec ) {
    71         assert( spec >= 0 && spec < LinkageSpec::NoOfSpecs );
    72         static bool builtin[LinkageSpec::NoOfSpecs] = {
    73                 //      Intrinsic,      Cforall,        C,              AutoGen,        Compiler
    74                         true,           false,          false,  false,          true,
    75         };
    76         return builtin[spec];
    77 }
     75} // LinkageSpec
    7876
    7977// Local Variables: //
  • src/Parser/LinkageSpec.h

    rfea3faa rb826e6b  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // LinkageSpec.h -- 
     7// LinkageSpec.h --
    88//
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 13:24:28 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Oct  1 23:03:17 2016
    13 // Update Count     : 11
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Jul  7 11:03:00 2017
     13// Update Count     : 13
    1414//
    1515
     
    1919#include <string>
    2020
    21 struct LinkageSpec {
    22         enum Spec {
    23                 Intrinsic,                                                                              // C built-in defined in prelude
    24                 Cforall,                                                                                // ordinary
    25                 C,                                                                                              // not overloadable, not mangled
    26                 AutoGen,                                                                                // built by translator (struct assignment)
    27                 Compiler,                                                                               // gcc internal
    28                 NoOfSpecs
     21namespace LinkageSpec {
     22        // All linkage specs are some combination of these flags:
     23        enum {
     24                Mangle = 1 << 0,
     25                Generate = 1 << 1,
     26                Overrideable = 1 << 2,
     27                Builtin = 1 << 3,
     28
     29                NoOfSpecs = 1 << 4,
    2930        };
    30  
    31         static Spec linkageCheck( const std::string * );
    32         static std::string linkageName( Spec );
    33  
    34         static bool isDecoratable( Spec );
    35         static bool isGeneratable( Spec );
    36         static bool isOverridable( Spec );
    37         static bool isBuiltin( Spec );
     31
     32        union Spec {
     33                unsigned int val;
     34                struct {
     35                        bool is_mangled : 1;
     36                        bool is_generatable : 1;
     37                        bool is_overridable : 1;
     38                        bool is_builtin : 1;
     39                };
     40                constexpr Spec( unsigned int val ) : val( val ) {}
     41                constexpr Spec( Spec const &other ) : val( other.val ) {}
     42                // Operators may go here.
     43                // Supports == and !=
     44                constexpr operator unsigned int () const { return val; }
     45        };
     46
     47
     48        Spec linkageCheck( const std::string * );
     49        // Returns the Spec with the given name (limited to C, Cforall & BuiltinC)
     50        Spec linkageUpdate( Spec old_spec, const std::string * cmd );
     51        /* If cmd = "C" returns a Spec that is old_spec with is_mangled = false
     52         * If cmd = "Cforall" returns old_spec Spec with is_mangled = true
     53         */
     54
     55        std::string linkageName( Spec );
     56
     57        // To Update: LinkageSpec::isXyz( cur_spec ) -> cur_spec.is_xyz
     58        inline bool isMangled( Spec spec ) { return spec.is_mangled; }
     59        inline bool isGeneratable( Spec spec ) { return spec.is_generatable; }
     60        inline bool isOverridable( Spec spec ) { return spec.is_overridable; }
     61        inline bool isBuiltin( Spec spec ) { return spec.is_builtin; }
     62
     63        // Pre-defined flag combinations:
     64        // C built-in defined in prelude
     65        constexpr Spec const Intrinsic = { Mangle | Generate | Overrideable | Builtin };
     66        // ordinary
     67        constexpr Spec const Cforall = { Mangle | Generate };
     68        // not overloadable, not mangled
     69        constexpr Spec const C = { Generate };
     70        // built by translator (struct assignment)
     71        constexpr Spec const AutoGen = { Mangle | Generate | Overrideable };
     72        // gcc internal
     73        constexpr Spec const Compiler = { Builtin };
     74        // mangled builtins
     75        constexpr Spec const BuiltinCFA = { Mangle | Generate | Builtin };
     76        // non-mangled builtins
     77        constexpr Spec const BuiltinC = { Generate | Builtin };
    3878};
    3979
  • src/Parser/ParseNode.h

    rfea3faa rb826e6b  
    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 : Sat Jul 15 16:00:48 2017
     13// Update Count     : 785
    1414//
    1515
     
    141141};
    142142
     143// Must harmonize with OperName.
    143144enum class OperKinds {
    144145        // diadic
    145         SizeOf, AlignOf, OffsetOf, Plus, Minus, Mul, Div, Mod, Or, And,
     146        SizeOf, AlignOf, OffsetOf, Plus, Minus, Exp, Mul, Div, Mod, Or, And,
    146147        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,
     148        Assign, AtAssn, ExpAssn, MulAssn, DivAssn, ModAssn, PlusAssn, MinusAssn, LSAssn, RSAssn, AndAssn, ERAssn, OrAssn,
    148149        Index, Range,
    149150        // monadic
     
    248249        static DeclarationNode * newAsmStmt( StatementNode * stmt ); // gcc external asm statement
    249250
     251        // Perhaps this would best fold into newAggragate.
     252        static DeclarationNode * newTreeStruct( Aggregate kind, const std::string * name, const std::string * parent, ExpressionNode * actuals, DeclarationNode * fields, bool body );
     253
    250254        DeclarationNode();
    251255        ~DeclarationNode();
     
    332336
    333337        static UniqueName anonymous;
     338
     339        // Temp to test TreeStruct
     340        const std::string * parent_name;
    334341}; // DeclarationNode
    335342
  • src/Parser/StatementNode.cc

    rfea3faa rb826e6b  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 14:59:41 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Mon Jun 12 13:03:00 2017
    13 // Update Count     : 329
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Tue Jul 11 21:23:15 2017
     13// Update Count     : 331
    1414//
    1515
     
    2121#include "SynTree/Statement.h"
    2222#include "SynTree/Expression.h"
    23 #include "parseutility.h"
     23#include "parserutility.h"
    2424#include "Common/utility.h"
    2525
     
    9393        std::list< Statement * > branches;
    9494        buildMoveList< Statement, StatementNode >( stmt, branches );
    95         assert( branches.size() >= 0 );                                         // size == 0 for switch (...) {}, i.e., no declaration or statements
     95        // branches.size() == 0 for switch (...) {}, i.e., no declaration or statements
    9696        return new SwitchStmt( noLabels, maybeMoveBuild< Expression >(ctl), branches );
    9797}
  • src/Parser/TypeData.cc

    rfea3faa rb826e6b  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 15:12:51 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 17 15:52:43 2017
    13 // Update Count     : 563
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tus Jul 18 10:10:00 2017
     13// Update Count     : 566
    1414//
    1515
     
    6363                aggregate.fields = nullptr;
    6464                aggregate.body = false;
     65                aggregate.tagged = false;
     66                aggregate.parent = nullptr;
    6567                break;
    6668          case AggregateInst:
     
    121123                delete aggregate.actuals;
    122124                delete aggregate.fields;
     125                delete aggregate.parent;
    123126                // delete aggregate;
    124127                break;
     
    192195                newtype->aggregate.kind = aggregate.kind;
    193196                newtype->aggregate.body = aggregate.body;
     197                newtype->aggregate.tagged = aggregate.tagged;
     198                newtype->aggregate.parent = aggregate.parent ? new string( *aggregate.parent ) : nullptr;
    194199                break;
    195200          case AggregateInst:
     
    449454          case TypeData::Builtin:
    450455                if(td->builtintype == DeclarationNode::Zero) {
    451                         return new ZeroType( emptyQualifiers );
     456                        return new ZeroType( noQualifiers );
    452457                }
    453458                else if(td->builtintype == DeclarationNode::One) {
    454                         return new OneType( emptyQualifiers );
     459                        return new OneType( noQualifiers );
    455460                }
    456461                else {
     
    614619} // buildPointer
    615620
    616 AggregateDecl * buildAggregate( const TypeData * td, std::list< Attribute * > attributes ) {
     621AggregateDecl * buildAggregate( const TypeData * td, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) {
    617622        assert( td->kind == TypeData::Aggregate );
    618623        AggregateDecl * at;
    619624        switch ( td->aggregate.kind ) {
    620625          case DeclarationNode::Struct:
     626                if ( td->aggregate.tagged ) {
     627                        at = new StructDecl( *td->aggregate.name, td->aggregate.parent, attributes, linkage );
     628                        buildForall( td->aggregate.params, at->get_parameters() );
     629                        break;
     630                }
    621631          case DeclarationNode::Coroutine:
    622632          case DeclarationNode::Monitor:
    623633          case DeclarationNode::Thread:
    624                 at = new StructDecl( *td->aggregate.name, td->aggregate.kind, attributes );
     634                at = new StructDecl( *td->aggregate.name, td->aggregate.kind, attributes, linkage );
    625635                buildForall( td->aggregate.params, at->get_parameters() );
    626636                break;
     
    643653} // buildAggregate
    644654
    645 ReferenceToType * buildComAggInst( const TypeData * type, std::list< Attribute * > attributes ) {
     655ReferenceToType * buildComAggInst( const TypeData * type, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) {
    646656        switch ( type->kind ) {
    647657          case TypeData::Enum: {
     
    656666                  ReferenceToType * ret;
    657667                  if ( type->aggregate.body ) {
    658                           AggregateDecl * typedecl = buildAggregate( type, attributes );
     668                          AggregateDecl * typedecl = buildAggregate( type, attributes, linkage );
    659669                          switch ( type->aggregate.kind ) {
    660670                                case DeclarationNode::Struct:
     
    760770                if ( cur->has_enumeratorValue() ) {
    761771                        ObjectDecl * member = dynamic_cast< ObjectDecl * >(* members);
    762                         member->set_init( new SingleInit( maybeMoveBuild< Expression >( cur->consume_enumeratorValue() ), list< Expression * >() ) );
     772                        member->set_init( new SingleInit( maybeMoveBuild< Expression >( cur->consume_enumeratorValue() ) ) );
    763773                } // if
    764774        } // for
     
    777787TupleType * buildTuple( const TypeData * td ) {
    778788        assert( td->kind == TypeData::Tuple );
    779         TupleType * ret = new TupleType( buildQualifiers( td ) );
    780         buildTypeList( td->tuple, ret->get_types() );
     789        std::list< Type * > types;
     790        buildTypeList( td->tuple, types );
     791        TupleType * ret = new TupleType( buildQualifiers( td ), types );
    781792        buildForall( td->forall, ret->get_forall() );
    782793        return ret;
     
    802813                return decl->set_asmName( asmName );
    803814        } else if ( td->kind == TypeData::Aggregate ) {
    804                 return buildAggregate( td, attributes );
     815                return buildAggregate( td, attributes, linkage );
    805816        } else if ( td->kind == TypeData::Enum ) {
    806817                return buildEnum( td, attributes );
  • src/Parser/TypeData.h

    rfea3faa rb826e6b  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 15:18:36 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 16 08:32:39 2017
    13 // Update Count     : 185
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Jul 14 16:57:00 2017
     13// Update Count     : 187
    1414//
    1515
     
    3131                DeclarationNode * fields;
    3232                bool body;
     33
     34                bool tagged;
     35                const std::string * parent;
    3336        };
    3437
     
    102105ArrayType * buildArray( const TypeData * );
    103106AggregateDecl * buildAggregate( const TypeData *, std::list< Attribute * > );
    104 ReferenceToType * buildComAggInst( const TypeData *, std::list< Attribute * > attributes );
     107ReferenceToType * buildComAggInst( const TypeData *, std::list< Attribute * > attributes, LinkageSpec::Spec linkage );
    105108ReferenceToType * buildAggInst( const TypeData * );
    106109TypeDecl * buildVariable( const TypeData * );
  • src/Parser/TypedefTable.h

    rfea3faa rb826e6b  
    1010// Created On       : Sat May 16 15:24:36 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Aug 15 18:25:04 2016
    13 // Update Count     : 28
     12// Last Modified On : Wed Jun 28 21:56:34 2017
     13// Update Count     : 33
    1414//
    1515
     
    2222#include <stack>
    2323
    24 #include "lex.h"
    25 #include "parser.h"
     24#include "ParserTypes.h"
     25#include "parser.hh"
    2626
    2727class TypedefTable {
  • src/Parser/lex.ll

    rfea3faa rb826e6b  
    1010 * Created On       : Sat Sep 22 08:58:10 2001
    1111 * Last Modified By : Peter A. Buhr
    12  * Last Modified On : Tue May 30 22:00:48 2017
    13  * Update Count     : 527
     12 * Last Modified On : Tue Jul 18 07:11:48 2017
     13 * Update Count     : 544
    1414 */
    1515
     
    2727#include <cstdio>                                                                               // FILENAME_MAX
    2828
    29 #include "lex.h"
    30 #include "parser.h"                                                                             // YACC generated definitions based on C++ grammar
    3129#include "ParseNode.h"
    3230#include "TypedefTable.h"
     
    6159}
    6260
     61// Stop warning due to incorrectly generated flex code.
     62#pragma GCC diagnostic ignored "-Wsign-compare"
    6363%}
    6464
     
    125125op_unary {op_unary_only}|{op_unary_binary}|{op_unary_pre_post}
    126126
    127 op_binary_only "/"|"%"|"^"|"&"|"|"|"<"|">"|"="|"=="|"!="|"<<"|">>"|"<="|">="|"+="|"-="|"*="|"/="|"%="|"&="|"|="|"^="|"<<="|">>="
     127op_binary_only "/"|"%"|"\\"|"^"|"&"|"|"|"<"|">"|"="|"=="|"!="|"<<"|">>"|"<="|">="|"+="|"-="|"*="|"/="|"%="|"\\="|"&="|"|="|"^="|"<<="|">>="
    128128op_binary_over {op_unary_binary}|{op_binary_only}
    129129                                // op_binary_not_over "?"|"->"|"."|"&&"|"||"|"@="
     
    136136
    137137%%
    138                                    /* line directives */
     138                                /* line directives */
    139139^{h_white}*"#"{h_white}*[0-9]+{h_white}*["][^"\n]+["].*"\n" {
    140140        /* " stop highlighting */
     
    232232int                             { KEYWORD_RETURN(INT); }
    233233__int128                { KEYWORD_RETURN(INT); }                                // GCC
     234__int128_t              { KEYWORD_RETURN(INT); }                                // GCC
    234235__label__               { KEYWORD_RETURN(LABEL); }                              // GCC
    235236long                    { KEYWORD_RETURN(LONG); }
     
    266267__typeof                { KEYWORD_RETURN(TYPEOF); }                             // GCC
    267268__typeof__              { KEYWORD_RETURN(TYPEOF); }                             // GCC
     269__uint128_t             { KEYWORD_RETURN(INT); }                                // GCC
    268270union                   { KEYWORD_RETURN(UNION); }
    269271unsigned                { KEYWORD_RETURN(UNSIGNED); }
     
    274276__volatile__    { KEYWORD_RETURN(VOLATILE); }                   // GCC
    275277while                   { KEYWORD_RETURN(WHILE); }
     278with                    { KEYWORD_RETURN(WITH); }                               // CFA
    276279zero_t                  { NUMERIC_RETURN(ZERO_T); }                             // CFA
    277280
     
    336339"-"                             { ASCIIOP_RETURN(); }
    337340"*"                             { ASCIIOP_RETURN(); }
     341"\\"                    { ASCIIOP_RETURN(); }                                   // CFA, exponentiation
    338342"/"                             { ASCIIOP_RETURN(); }
    339343"%"                             { ASCIIOP_RETURN(); }
     
    360364"+="                    { NAMEDOP_RETURN(PLUSassign); }
    361365"-="                    { NAMEDOP_RETURN(MINUSassign); }
     366"\\="                   { NAMEDOP_RETURN(EXPassign); }                  // CFA, exponentiation
    362367"*="                    { NAMEDOP_RETURN(MULTassign); }
    363368"/="                    { NAMEDOP_RETURN(DIVassign); }
  • src/Parser/module.mk

    rfea3faa rb826e6b  
    1111## Created On       : Sat May 16 15:29:09 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Tue Aug 16 17:28:34 2016
    14 ## Update Count     : 101
     13## Last Modified On : Wed Jun 28 21:58:29 2017
     14## Update Count     : 104
    1515###############################################################################
    1616
    17 BUILT_SOURCES = Parser/parser.h
     17BUILT_SOURCES = Parser/parser.hh
    1818
    1919AM_YFLAGS = -d -t -v
     
    2929       Parser/TypeData.cc \
    3030       Parser/LinkageSpec.cc \
    31        Parser/parseutility.cc
     31       Parser/parserutility.cc
    3232
    3333MAINTAINERCLEANFILES += Parser/parser.output
  • src/Parser/parser.yy

    rfea3faa rb826e6b  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // cfa.y --
     7// parser.yy --
    88//
    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 : Mon Jun 12 12:59:00 2017
    13 // Update Count     : 2402
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Mon Jul 17 12:17:00 2017
     13// Update Count     : 2455
    1414//
    1515
     
    4848#include <cstdio>
    4949#include <stack>
    50 #include "lex.h"
    51 #include "parser.h"
    5250#include "ParseNode.h"
    5351#include "TypedefTable.h"
     
    8886bool forall = false;                                                                    // aggregate have one or more forall qualifiers ?
    8987%}
     88
     89// Types declaration
     90%union
     91{
     92        Token tok;
     93        ParseNode * pn;
     94        ExpressionNode * en;
     95        DeclarationNode * decl;
     96        DeclarationNode::Aggregate aggKey;
     97        DeclarationNode::TypeClass tclass;
     98        StatementNode * sn;
     99        ConstantExpr * constant;
     100        ForCtl * fctl;
     101        LabelNode * label;
     102        InitializerNode * in;
     103        OperKinds op;
     104        std::string * str;
     105        bool flag;
     106        CatchStmt::Kind catch_kind;
     107}
    90108
    91109//************************* TERMINAL TOKENS ********************************
     
    111129%token ATTRIBUTE EXTENSION                                                              // GCC
    112130%token IF ELSE SWITCH CASE DEFAULT DO WHILE FOR BREAK CONTINUE GOTO RETURN
    113 %token CHOOSE DISABLE ENABLE FALLTHRU TRY CATCH CATCHRESUME FINALLY THROW THROWRESUME AT        // CFA
     131%token CHOOSE DISABLE ENABLE FALLTHRU TRY CATCH CATCHRESUME FINALLY THROW THROWRESUME AT WITH   // CFA
    114132%token ASM                                                                                              // C99, extension ISO/IEC 9899:1999 Section J.5.10(1)
    115133%token ALIGNAS ALIGNOF GENERIC STATICASSERT                             // C11
     
    133151%token ELLIPSIS                                                                                 // ...
    134152
    135 %token MULTassign       DIVassign       MODassign                               // *=   /=      %=/
     153%token EXPassign        MULTassign      DIVassign       MODassign       // \=   *=      /=      %=
    136154%token PLUSassign       MINUSassign                                                     // +=   -=
    137155%token LSassign         RSassign                                                        // <<=  >>=
     
    139157
    140158%token ATassign                                                                                 // @=
    141 
    142 // Types declaration
    143 %union
    144 {
    145         Token tok;
    146         ParseNode * pn;
    147         ExpressionNode * en;
    148         DeclarationNode * decl;
    149         DeclarationNode::Aggregate aggKey;
    150         DeclarationNode::TypeClass tclass;
    151         StatementNode * sn;
    152         ConstantExpr * constant;
    153         ForCtl * fctl;
    154         LabelNode * label;
    155         InitializerNode * in;
    156         OperKinds op;
    157         std::string * str;
    158         bool flag;
    159 }
    160159
    161160%type<tok> identifier  no_attr_identifier  zero_one
     
    169168%type<op> ptrref_operator                               unary_operator                          assignment_operator
    170169%type<en> primary_expression                    postfix_expression                      unary_expression
    171 %type<en> cast_expression                               multiplicative_expression       additive_expression                     shift_expression
    172 %type<en> relational_expression                 equality_expression                     AND_expression                          exclusive_OR_expression
    173 %type<en> inclusive_OR_expression               logical_AND_expression          logical_OR_expression           conditional_expression
    174 %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
    175175%type<en> comma_expression                              comma_expression_opt
    176 %type<en> argument_expression_list              argument_expression                     assignment_opt
     176%type<en> argument_expression_list              argument_expression                     default_initialize_opt
    177177%type<fctl> for_control_expression
    178178%type<en> subrange
     
    185185// statements
    186186%type<sn> labeled_statement                             compound_statement                      expression_statement            selection_statement
    187 %type<sn> iteration_statement                   jump_statement                          exception_statement                     asm_statement
     187%type<sn> iteration_statement                   jump_statement
     188%type<sn> with_statement                                exception_statement                     asm_statement
    188189%type<sn> fall_through_opt                              fall_through
    189190%type<sn> statement                                             statement_list
    190191%type<sn> block_item_list                               block_item
    191 %type<sn> case_clause
     192%type<sn> with_clause_opt
    192193%type<en> case_value
    193 %type<sn> case_value_list                               case_label                                      case_label_list
     194%type<sn> case_clause                                   case_value_list                         case_label                                      case_label_list
    194195%type<sn> switch_clause_list_opt                switch_clause_list                      choose_clause_list_opt          choose_clause_list
    195196%type<sn> /* handler_list */                    handler_clause                          finally_clause
     197%type<catch_kind> handler_key
    196198
    197199// declarations
     
    572574        ;
    573575
     576exponential_expression:
     577        cast_expression
     578        | exponential_expression '\\' cast_expression
     579                { $$ = new ExpressionNode( build_binary_val( OperKinds::Exp, $1, $3 ) ); }
     580        ;
     581
    574582multiplicative_expression:
    575         cast_expression
    576         | multiplicative_expression '*' cast_expression
     583        exponential_expression
     584        | multiplicative_expression '*' exponential_expression
    577585                { $$ = new ExpressionNode( build_binary_val( OperKinds::Mul, $1, $3 ) ); }
    578         | multiplicative_expression '/' cast_expression
     586        | multiplicative_expression '/' exponential_expression
    579587                { $$ = new ExpressionNode( build_binary_val( OperKinds::Div, $1, $3 ) ); }
    580         | multiplicative_expression '%' cast_expression
     588        | multiplicative_expression '%' exponential_expression
    581589                { $$ = new ExpressionNode( build_binary_val( OperKinds::Mod, $1, $3 ) ); }
    582590        ;
     
    677685        '='                                                                                     { $$ = OperKinds::Assign; }
    678686        | ATassign                                                                      { $$ = OperKinds::AtAssn; }
     687        | EXPassign                                                                     { $$ = OperKinds::ExpAssn; }
    679688        | MULTassign                                                            { $$ = OperKinds::MulAssn; }
    680689        | DIVassign                                                                     { $$ = OperKinds::DivAssn; }
     
    729738        | iteration_statement
    730739        | jump_statement
     740        | with_statement
    731741        | exception_statement
    732742        | asm_statement
     
    936946        ;
    937947
     948with_statement:
     949        WITH '(' tuple_expression_list ')' compound_statement
     950                { $$ = (StatementNode *)0; }                                    // FIX ME
     951        ;
     952
    938953exception_statement:
    939954        TRY compound_statement handler_clause
     
    959974
    960975handler_clause:
    961         CATCH '(' push push exception_declaration pop ')' compound_statement pop
    962                 { $$ = new StatementNode( build_catch( CatchStmt::Terminate, $5, nullptr, $8 ) ); }
    963         | handler_clause CATCH '(' push push exception_declaration pop ')' compound_statement pop
    964                 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( CatchStmt::Terminate, $6, nullptr, $9 ) ) ); }
    965         | CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop
    966                 { $$ = new StatementNode( build_catch( CatchStmt::Resume, $5, nullptr, $8 ) ); }
    967         | handler_clause CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop
    968                 { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( CatchStmt::Resume, $6, nullptr, $9 ) ) ); }
     976        // TEMPORARY, TEST EXCEPTIONS
     977        handler_key '(' push push INTEGERconstant pop ')' compound_statement pop
     978                { $$ = new StatementNode( build_catch( $1, nullptr, new ExpressionNode( build_constantInteger( *$5 ) ), $8 ) ); }
     979        | handler_clause handler_key '(' push push INTEGERconstant pop ')' compound_statement pop
     980                { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, nullptr, new ExpressionNode( build_constantInteger( *$6 ) ), $9 ) ) ); }
     981
     982        | handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop
     983                { $$ = new StatementNode( build_catch( $1, $5, nullptr, $9 ) ); }
     984        | handler_clause handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop
     985                { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, $6, nullptr, $10 ) ) ); }
     986        ;
     987
     988handler_predicate_opt:
     989        //empty
     990        | ';' conditional_expression
     991        ;
     992
     993handler_key:
     994        CATCH
     995                { $$ = CatchStmt::Terminate; }
     996        | CATCHRESUME
     997                { $$ = CatchStmt::Resume; }
    969998        ;
    970999
     
    16511680        | aggregate_key attribute_list_opt typegen_name         // CFA
    16521681                { $$ = $3->addQualifiers( $2 ); }
     1682
     1683// Temp, testing TreeStruct
     1684    | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name
     1685        {
     1686            typedefTable.makeTypedef( *$4 );            // create typedef
     1687            if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $
     1688            forall = false;                             // reset
     1689        }
     1690      '{' field_declaration_list '}'
     1691        {
     1692            $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct,
     1693                $4, nullptr, nullptr, $7, true )->addQualifiers( $3 );
     1694        }
     1695    | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name TYPEDEFname
     1696        {
     1697            typedefTable.makeTypedef( *$4 );            // create typedef
     1698            if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $
     1699            forall = false;                             // reset
     1700        }
     1701      '{' field_declaration_list '}'
     1702        {
     1703            $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct,
     1704                $4, $5, nullptr, $8, true )->addQualifiers( $3 );
     1705        }
    16531706        ;
    16541707
     
    18291882cfa_parameter_declaration:                                                              // CFA, new & old style parameter declaration
    18301883        parameter_declaration
    1831         | cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name assignment_opt
     1884        | cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name default_initialize_opt
    18321885                { $$ = $1->addName( $2 ); }
    1833         | cfa_abstract_tuple identifier_or_type_name assignment_opt
     1886        | cfa_abstract_tuple identifier_or_type_name default_initialize_opt
    18341887                // To obtain LR(1), these rules must be duplicated here (see cfa_abstract_declarator).
    18351888                { $$ = $1->addName( $2 ); }
    1836         | type_qualifier_list cfa_abstract_tuple identifier_or_type_name assignment_opt
     1889        | type_qualifier_list cfa_abstract_tuple identifier_or_type_name default_initialize_opt
    18371890                { $$ = $2->addName( $3 )->addQualifiers( $1 ); }
    18381891        | cfa_function_specifier
     
    18511904parameter_declaration:
    18521905                // No SUE declaration in parameter list.
    1853         declaration_specifier_nobody identifier_parameter_declarator assignment_opt
     1906        declaration_specifier_nobody identifier_parameter_declarator default_initialize_opt
    18541907                {
    18551908                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    18561909                        $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr );
    18571910                }
    1858         | declaration_specifier_nobody type_parameter_redeclarator assignment_opt
     1911        | declaration_specifier_nobody type_parameter_redeclarator default_initialize_opt
    18591912                {
    18601913                        typedefTable.addToEnclosingScope( TypedefTable::ID );
     
    18641917
    18651918abstract_parameter_declaration:
    1866         declaration_specifier_nobody assignment_opt
     1919        declaration_specifier_nobody default_initialize_opt
    18671920                { $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); }
    1868         | declaration_specifier_nobody abstract_parameter_declarator assignment_opt
     1921        | declaration_specifier_nobody abstract_parameter_declarator default_initialize_opt
    18691922                { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
    18701923        ;
     
    21672220                {
    21682221                        linkageStack.push( linkage );                           // handle nested extern "C"/"Cforall"
    2169                         linkage = LinkageSpec::linkageCheck( $2 );
     2222                        linkage = LinkageSpec::linkageUpdate( linkage, $2 );
    21702223                }
    21712224          '{' external_definition_list_opt '}'
     
    22032256        ;
    22042257
     2258with_clause_opt:
     2259        // empty
     2260                { $$ = (StatementNode *)0; }                                    // FIX ME
     2261        | WITH '(' tuple_expression_list ')'
     2262                { $$ = (StatementNode *)0; }                                    // FIX ME
     2263        ;
     2264
    22052265function_definition:
    2206         cfa_function_declaration compound_statement                     // CFA
     2266        cfa_function_declaration with_clause_opt compound_statement     // CFA
    22072267                {
    22082268                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22092269                        typedefTable.leaveScope();
    2210                         $$ = $1->addFunctionBody( $2 );
    2211                 }
    2212         | declaration_specifier function_declarator compound_statement
     2270                        $$ = $1->addFunctionBody( $3 );
     2271                }
     2272        | declaration_specifier function_declarator with_clause_opt compound_statement
    22132273                {
    22142274                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22152275                        typedefTable.leaveScope();
    2216                         $$ = $2->addFunctionBody( $3 )->addType( $1 );
    2217                 }
    2218         | type_qualifier_list function_declarator compound_statement
     2276                        $$ = $2->addFunctionBody( $4 )->addType( $1 );
     2277                }
     2278        | type_qualifier_list function_declarator with_clause_opt compound_statement
    22192279                {
    22202280                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22212281                        typedefTable.leaveScope();
    2222                         $$ = $2->addFunctionBody( $3 )->addQualifiers( $1 );
    2223                 }
    2224         | declaration_qualifier_list function_declarator compound_statement
     2282                        $$ = $2->addFunctionBody( $4 )->addQualifiers( $1 );
     2283                }
     2284        | declaration_qualifier_list function_declarator with_clause_opt compound_statement
    22252285                {
    22262286                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22272287                        typedefTable.leaveScope();
    2228                         $$ = $2->addFunctionBody( $3 )->addQualifiers( $1 );
    2229                 }
    2230         | declaration_qualifier_list type_qualifier_list function_declarator compound_statement
     2288                        $$ = $2->addFunctionBody( $4 )->addQualifiers( $1 );
     2289                }
     2290        | declaration_qualifier_list type_qualifier_list function_declarator with_clause_opt compound_statement
    22312291                {
    22322292                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22332293                        typedefTable.leaveScope();
    2234                         $$ = $3->addFunctionBody( $4 )->addQualifiers( $2 )->addQualifiers( $1 );
     2294                        $$ = $3->addFunctionBody( $5 )->addQualifiers( $2 )->addQualifiers( $1 );
    22352295                }
    22362296
    22372297                // Old-style K&R function definition, OBSOLESCENT (see 4)
    2238         | declaration_specifier KR_function_declarator push KR_declaration_list_opt compound_statement
     2298        | declaration_specifier KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
    22392299                {
    22402300                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22412301                        typedefTable.leaveScope();
    2242                         $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addType( $1 );
    2243                 }
    2244         | type_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement
     2302                        $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addType( $1 );
     2303                }
     2304        | type_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
    22452305                {
    22462306                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22472307                        typedefTable.leaveScope();
    2248                         $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addQualifiers( $1 );
     2308                        $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addQualifiers( $1 );
    22492309                }
    22502310
    22512311                // Old-style K&R function definition with "implicit int" type_specifier, OBSOLESCENT (see 4)
    2252         | declaration_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement
     2312        | declaration_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
    22532313                {
    22542314                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22552315                        typedefTable.leaveScope();
    2256                         $$ = $2->addOldDeclList( $4 )->addFunctionBody( $5 )->addQualifiers( $1 );
    2257                 }
    2258         | declaration_qualifier_list type_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement
     2316                        $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addQualifiers( $1 );
     2317                }
     2318        | declaration_qualifier_list type_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement
    22592319                {
    22602320                        typedefTable.addToEnclosingScope( TypedefTable::ID );
    22612321                        typedefTable.leaveScope();
    2262                         $$ = $3->addOldDeclList( $5 )->addFunctionBody( $6 )->addQualifiers( $2 )->addQualifiers( $1 );
     2322                        $$ = $3->addOldDeclList( $5 )->addFunctionBody( $7 )->addQualifiers( $2 )->addQualifiers( $1 );
    22632323                }
    22642324        ;
     
    23232383        | TYPEGENname
    23242384        | CONST
    2325                 { $$ = Token{ new string( "__const__" ) }; }
     2385                { $$ = Token{ new string( "__const__" ), { nullptr, -1 } }; }
    23262386        ;
    23272387
     
    30223082        ;
    30233083
    3024 assignment_opt:
     3084default_initialize_opt:
    30253085        // empty
    30263086                { $$ = nullptr; }
  • src/ResolvExpr/AlternativeFinder.cc

    rfea3faa rb826e6b  
    604604//          )
    605605                SymTab::Indexer decls( indexer );
    606                 PRINT(
    607                         std::cerr << "============= original indexer" << std::endl;
    608                         indexer.print( std::cerr );
    609                         std::cerr << "============= new indexer" << std::endl;
    610                         decls.print( std::cerr );
    611                 )
     606                // PRINT(
     607                //      std::cerr << "============= original indexer" << std::endl;
     608                //      indexer.print( std::cerr );
     609                //      std::cerr << "============= new indexer" << std::endl;
     610                //      decls.print( std::cerr );
     611                // )
    612612                addToIndexer( have, decls );
    613613                AssertionSet newNeed;
     
    809809        }
    810810
     811        Expression * restructureCast( Expression * argExpr, Type * toType ) {
     812                if ( argExpr->get_result()->size() > 1 && ! toType->isVoid() ) {
     813                        // Argument expression is a tuple and the target type is not void. Cast each member of the tuple
     814                        // to its corresponding target type, producing the tuple of those cast expressions. If there are
     815                        // more components of the tuple than components in the target type, then excess components do not
     816                        // come out in the result expression (but UniqueExprs ensure that side effects will still be done).
     817                        if ( Tuples::maybeImpure( argExpr ) && ! dynamic_cast< UniqueExpr * >( argExpr ) ) {
     818                                // expressions which may contain side effects require a single unique instance of the expression.
     819                                argExpr = new UniqueExpr( argExpr );
     820                        }
     821                        std::list< Expression * > componentExprs;
     822                        for ( unsigned int i = 0; i < toType->size(); i++ ) {
     823                                // cast each component
     824                                TupleIndexExpr * idx = new TupleIndexExpr( argExpr->clone(), i );
     825                                componentExprs.push_back( restructureCast( idx, toType->getComponent( i ) ) );
     826                        }
     827                        delete argExpr;
     828                        assert( componentExprs.size() > 0 );
     829                        // produce the tuple of casts
     830                        return new TupleExpr( componentExprs );
     831                } else {
     832                        // handle normally
     833                        return new CastExpr( argExpr, toType->clone() );
     834                }
     835        }
     836
    811837        void AlternativeFinder::visit( CastExpr *castExpr ) {
    812838                Type *& toType = castExpr->get_result();
     
    840866                                thisCost += Cost( 0, 0, discardedValues );
    841867
    842                                 Expression * argExpr = i->expr->clone();
    843                                 if ( argExpr->get_result()->size() > 1 && ! castExpr->get_result()->isVoid() ) {
    844                                         // Argument expression is a tuple and the target type is not void. Cast each member of the tuple
    845                                         // to its corresponding target type, producing the tuple of those cast expressions. If there are
    846                                         // more components of the tuple than components in the target type, then excess components do not
    847                                         // come out in the result expression (but UniqueExprs ensure that side effects will still be done).
    848                                         if ( Tuples::maybeImpure( argExpr ) && ! dynamic_cast< UniqueExpr * >( argExpr ) ) {
    849                                                 // expressions which may contain side effects require a single unique instance of the expression.
    850                                                 argExpr = new UniqueExpr( argExpr );
    851                                         }
    852                                         std::list< Expression * > componentExprs;
    853                                         for ( unsigned int i = 0; i < castExpr->get_result()->size(); i++ ) {
    854                                                 // cast each component
    855                                                 TupleIndexExpr * idx = new TupleIndexExpr( argExpr->clone(), i );
    856                                                 componentExprs.push_back( new CastExpr( idx, castExpr->get_result()->getComponent( i )->clone() ) );
    857                                         }
    858                                         delete argExpr;
    859                                         assert( componentExprs.size() > 0 );
    860                                         // produce the tuple of casts
    861                                         candidates.push_back( Alternative( new TupleExpr( componentExprs ), i->env, i->cost, thisCost ) );
    862                                 } else {
    863                                         // handle normally
    864                                         candidates.push_back( Alternative( new CastExpr( argExpr->clone(), toType->clone() ), i->env, i->cost, thisCost ) );
    865                                 }
     868                                candidates.push_back( Alternative( restructureCast( i->expr->clone(), toType ), i->env, i->cost, thisCost ) );
    866869                        } // if
    867870                } // for
     
    11821185        }
    11831186
     1187        void AlternativeFinder::visit( UntypedInitExpr *initExpr ) {
     1188                // handle each option like a cast
     1189                AltList candidates;
     1190                PRINT( std::cerr << "untyped init expr: " << initExpr << std::endl; )
     1191                // O(N^2) checks of d-types with e-types
     1192                for ( InitAlternative & initAlt : initExpr->get_initAlts() ) {
     1193                        Type * toType = resolveTypeof( initAlt.type, indexer );
     1194                        SymTab::validateType( toType, &indexer );
     1195                        adjustExprType( toType, env, indexer );
     1196                        // Ideally the call to findWithAdjustment could be moved out of the loop, but unfortunately it currently has to occur inside or else
     1197                        // polymorphic return types are not properly bound to the initialization type, since return type variables are only open for the duration of resolving
     1198                        // the UntypedExpr. This is only actually an issue in initialization contexts that allow more than one possible initialization type, but it is still suboptimal.
     1199                        AlternativeFinder finder( indexer, env );
     1200                        finder.targetType = toType;
     1201                        finder.findWithAdjustment( initExpr->get_expr() );
     1202                        for ( Alternative & alt : finder.get_alternatives() ) {
     1203                                TypeEnvironment newEnv( alt.env );
     1204                                AssertionSet needAssertions, haveAssertions;
     1205                                OpenVarSet openVars;  // find things in env that don't have a "representative type" and claim those are open vars?
     1206                                PRINT( std::cerr << "  @ " << toType << " " << initAlt.designation << std::endl; )
     1207                                // It's possible that a cast can throw away some values in a multiply-valued expression.  (An example is a
     1208                                // cast-to-void, which casts from one value to zero.)  Figure out the prefix of the subexpression results
     1209                                // that are cast directly.  The candidate is invalid if it has fewer results than there are types to cast
     1210                                // to.
     1211                                int discardedValues = alt.expr->get_result()->size() - toType->size();
     1212                                if ( discardedValues < 0 ) continue;
     1213                                // xxx - may need to go into tuple types and extract relevant types and use unifyList. Note that currently, this does not
     1214                                // allow casting a tuple to an atomic type (e.g. (int)([1, 2, 3]))
     1215                                // unification run for side-effects
     1216                                unify( toType, alt.expr->get_result(), newEnv, needAssertions, haveAssertions, openVars, indexer ); // xxx - do some inspecting on this line... why isn't result bound to initAlt.type??
     1217
     1218                                Cost thisCost = castCost( alt.expr->get_result(), toType, indexer, newEnv );
     1219                                if ( thisCost != Cost::infinity ) {
     1220                                        // count one safe conversion for each value that is thrown away
     1221                                        thisCost += Cost( 0, 0, discardedValues );
     1222                                        candidates.push_back( Alternative( new InitExpr( restructureCast( alt.expr->clone(), toType ), initAlt.designation->clone() ), newEnv, alt.cost, thisCost ) );
     1223                                }
     1224                        }
     1225                }
     1226
     1227                // findMinCost selects the alternatives with the lowest "cost" members, but has the side effect of copying the
     1228                // cvtCost member to the cost member (since the old cost is now irrelevant).  Thus, calling findMinCost twice
     1229                // selects first based on argument cost, then on conversion cost.
     1230                AltList minArgCost;
     1231                findMinCost( candidates.begin(), candidates.end(), std::back_inserter( minArgCost ) );
     1232                findMinCost( minArgCost.begin(), minArgCost.end(), std::back_inserter( alternatives ) );
     1233        }
    11841234} // namespace ResolvExpr
    11851235
  • src/ResolvExpr/AlternativeFinder.h

    rfea3faa rb826e6b  
    7373                virtual void visit( UniqueExpr *unqExpr );
    7474                virtual void visit( StmtExpr *stmtExpr );
     75                virtual void visit( UntypedInitExpr *initExpr );
    7576                /// Runs a new alternative finder on each element in [begin, end)
    7677                /// and writes each alternative finder to out.
  • src/ResolvExpr/Resolver.cc

    rfea3faa rb826e6b  
    1414//
    1515
     16#include <iostream>
     17
     18#include "Alternative.h"
     19#include "AlternativeFinder.h"
     20#include "CurrentObject.h"
     21#include "RenameVars.h"
    1622#include "Resolver.h"
    17 #include "AlternativeFinder.h"
    18 #include "Alternative.h"
    19 #include "RenameVars.h"
    2023#include "ResolveTypeof.h"
    2124#include "typeops.h"
     25
     26#include "SynTree/Expression.h"
     27#include "SynTree/Initializer.h"
    2228#include "SynTree/Statement.h"
    2329#include "SynTree/Type.h"
    24 #include "SynTree/Expression.h"
    25 #include "SynTree/Initializer.h"
     30
     31#include "SymTab/Autogen.h"
    2632#include "SymTab/Indexer.h"
    27 #include "SymTab/Autogen.h"
     33
    2834#include "Common/utility.h"
     35
    2936#include "InitTweak/InitTweak.h"
    3037
    31 #include <iostream>
    3238using namespace std;
    3339
     
    3945                        if ( const Resolver * res = dynamic_cast< const Resolver * >( &other ) ) {
    4046                                functionReturn = res->functionReturn;
    41                                 initContext = res->initContext;
     47                                currentObject = res->currentObject;
    4248                                inEnumDecl = res->inEnumDecl;
    4349                        }
     
    6470                virtual void visit( BranchStmt *branchStmt ) override;
    6571                virtual void visit( ReturnStmt *returnStmt ) override;
     72                virtual void visit( ThrowStmt *throwStmt ) override;
    6673
    6774                virtual void visit( SingleInit *singleInit ) override;
     
    7986
    8087                Type * functionReturn = nullptr;
    81                 Type *initContext = nullptr;
     88                CurrentObject currentObject = nullptr;
    8289                bool inEnumDecl = false;
    8390        };
     
    186193                // each value of initContext is retained, so the type on the first analysis is preserved and used for selecting
    187194                // the RHS.
    188                 Type *temp = initContext;
    189                 initContext = new_type;
    190                 if ( inEnumDecl && dynamic_cast< EnumInstType * >( initContext ) ) {
     195                ValueGuard<CurrentObject> temp( currentObject );
     196                currentObject = CurrentObject( objectDecl->get_type() );
     197                if ( inEnumDecl && dynamic_cast< EnumInstType * >( objectDecl->get_type() ) ) {
    191198                        // enumerator initializers should not use the enum type to initialize, since
    192199                        // the enum type is still incomplete at this point. Use signed int instead.
    193                         initContext = new BasicType( Type::Qualifiers(), BasicType::SignedInt );
     200                        currentObject = CurrentObject( new BasicType( Type::Qualifiers(), BasicType::SignedInt ) );
    194201                }
    195202                Parent::visit( objectDecl );
    196                 if ( inEnumDecl && dynamic_cast< EnumInstType * >( initContext ) ) {
     203                if ( inEnumDecl && dynamic_cast< EnumInstType * >( objectDecl->get_type() ) ) {
    197204                        // delete newly created signed int type
    198                         delete initContext;
    199                 }
    200                 initContext = temp;
     205                        // delete currentObject.getType();
     206                }
    201207        }
    202208
     
    315321
    316322        void Resolver::visit( SwitchStmt *switchStmt ) {
    317                 ValueGuard< Type * > oldInitContext( initContext );
     323                ValueGuard< CurrentObject > oldCurrentObject( currentObject );
    318324                Expression *newExpr;
    319325                newExpr = findIntegralExpression( switchStmt->get_condition(), *this );
     
    321327                switchStmt->set_condition( newExpr );
    322328
    323                 initContext = newExpr->get_result();
     329                currentObject = CurrentObject( newExpr->get_result() );
    324330                Parent::visit( switchStmt );
    325331        }
     
    327333        void Resolver::visit( CaseStmt *caseStmt ) {
    328334                if ( caseStmt->get_condition() ) {
    329                         assert( initContext );
    330                         CastExpr * castExpr = new CastExpr( caseStmt->get_condition(), initContext->clone() );
     335                        std::list< InitAlternative > initAlts = currentObject.getOptions();
     336                        assertf( initAlts.size() == 1, "SwitchStmt did not correctly resolve an integral expression." );
     337                        CastExpr * castExpr = new CastExpr( caseStmt->get_condition(), initAlts.front().type->clone() );
    331338                        Expression * newExpr = findSingleExpression( castExpr, *this );
    332339                        castExpr = safe_dynamic_cast< CastExpr * >( newExpr );
     
    360367        }
    361368
     369        void Resolver::visit( ThrowStmt *throwStmt ) {
     370                if ( throwStmt->get_expr() ) {
     371                        Expression * wrapped = new CastExpr( throwStmt->get_expr(), new BasicType( Type::Qualifiers(), BasicType::SignedInt ) );
     372                        Expression * newExpr = findSingleExpression( wrapped, *this );
     373                        throwStmt->set_expr( newExpr );
     374                }
     375        }
     376
    362377        template< typename T >
    363378        bool isCharType( T t ) {
     
    370385
    371386        void Resolver::visit( SingleInit *singleInit ) {
    372                 if ( singleInit->get_value() ) {
    373                         // // find all the d's
    374                         // std::list<Expression *> &designators = singleInit->get_designators();
    375                         // std::list<Type *> types1{ initContext }, types2;
    376                         // for ( Expression * expr: designators ) {
    377                         //      cerr << expr << endl;
    378                         //      if ( NameExpr * nexpr = dynamic_cast<NameExpr *>( expr ) ) {
    379                         //              for ( Type * type: types1 ) {
    380                         //                      cerr << type << endl;
    381                         //                      ReferenceToType * fred = dynamic_cast<ReferenceToType *>(type);
    382                         //                      std::list<Declaration *> members;
    383                         //                      if ( fred ) {
    384                         //                              fred->lookup( nexpr->get_name(), members ); // concatenate identical field name
    385                         //                              for ( Declaration * mem: members ) {
    386                         //                                      if ( DeclarationWithType * dwt = dynamic_cast<DeclarationWithType *>(mem) ) {
    387                         //                                              types2.push_back( dwt->get_type() );
    388                         //                                      } // if
    389                         //                              } // for
    390                         //                      } // if
    391                         //              } // for
    392                         //              types1 = types2;
    393                         //              types2.clear();
    394                         //      } // if
    395                         // } // for
    396                         // // for ( Type * type: types1 ) {
    397                         // //   cerr << type << endl;
    398                         // // } // for
    399 
    400                         // // O(N^2) checks of d-types with f-types
    401                         // // find the minimum cost
    402                         CastExpr *castExpr = new CastExpr( singleInit->get_value(), initContext->clone() );
    403                         Expression *newExpr = findSingleExpression( castExpr, *this );
    404                         delete castExpr;
    405                         singleInit->set_value( newExpr );
    406 
    407                         // check if initializing type is char[]
    408                         if ( ArrayType * at = dynamic_cast< ArrayType * >( initContext ) ) {
    409                                 if ( isCharType( at->get_base() ) ) {
    410                                         // check if the resolved type is char *
    411                                         if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_result() ) ) {
    412                                                 if ( isCharType( pt->get_base() ) ) {
    413                                                         // strip cast if we're initializing a char[] with a char *, e.g.  char x[] = "hello";
    414                                                         CastExpr *ce = dynamic_cast< CastExpr * >( newExpr );
    415                                                         singleInit->set_value( ce->get_arg() );
    416                                                         ce->set_arg( NULL );
    417                                                         delete ce;
    418                                                 }
     387                // resolve initialization using the possibilities as determined by the currentObject cursor
     388                UntypedInitExpr * untyped = new UntypedInitExpr( singleInit->get_value(), currentObject.getOptions() );
     389                Expression * newExpr = findSingleExpression( untyped, *this );
     390                InitExpr * initExpr = safe_dynamic_cast< InitExpr * >( newExpr );
     391
     392                // move cursor to the object that is actually initialized
     393                currentObject.setNext( initExpr->get_designation() );
     394
     395                // discard InitExpr wrapper and retain relevant pieces
     396                newExpr = initExpr->get_expr();
     397                newExpr->set_env( initExpr->get_env() );
     398                initExpr->set_expr( nullptr );
     399                initExpr->set_env( nullptr );
     400                delete initExpr;
     401
     402                // get the actual object's type (may not exactly match what comes back from the resolver due to conversions)
     403                Type * initContext = currentObject.getCurrentType();
     404
     405                // check if actual object's type is char[]
     406                if ( ArrayType * at = dynamic_cast< ArrayType * >( initContext ) ) {
     407                        if ( isCharType( at->get_base() ) ) {
     408                                // check if the resolved type is char *
     409                                if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_result() ) ) {
     410                                        if ( isCharType( pt->get_base() ) ) {
     411                                                // strip cast if we're initializing a char[] with a char *, e.g.  char x[] = "hello";
     412                                                CastExpr *ce = safe_dynamic_cast< CastExpr * >( newExpr );
     413                                                newExpr = ce->get_arg();
     414                                                ce->set_arg( nullptr );
     415                                                delete ce;
    419416                                        }
    420417                                }
    421418                        }
    422                 } // if
    423         }
    424 
    425         template< typename AggrInst >
    426         TypeSubstitution makeGenericSubstitutuion( AggrInst * inst ) {
    427                 assert( inst );
    428                 assert( inst->get_baseParameters() );
    429                 std::list< TypeDecl * > baseParams = *inst->get_baseParameters();
    430                 std::list< Expression * > typeSubs = inst->get_parameters();
    431                 TypeSubstitution subs( baseParams.begin(), baseParams.end(), typeSubs.begin() );
    432                 return subs;
    433         }
    434 
    435         ReferenceToType * isStructOrUnion( Type * type ) {
    436                 if ( StructInstType * sit = dynamic_cast< StructInstType * >( type ) ) {
    437                         return sit;
    438                 } else if ( UnionInstType * uit = dynamic_cast< UnionInstType * >( type ) ) {
    439                         return uit;
    440                 }
    441                 return nullptr;
    442         }
    443 
    444         void Resolver::resolveSingleAggrInit( Declaration * dcl, InitIterator & init, InitIterator & initEnd, TypeSubstitution sub ) {
    445                 DeclarationWithType * dt = dynamic_cast< DeclarationWithType * >( dcl );
    446                 assert( dt );
    447                 // need to substitute for generic types, so that casts are to concrete types
    448                 initContext = dt->get_type()->clone();
    449                 sub.apply( initContext );
    450 
    451                 try {
    452                         if ( init == initEnd ) return; // stop when there are no more initializers
    453                         (*init)->accept( *this );
    454                         ++init; // made it past an initializer
    455                 } catch( SemanticError & ) {
    456                         // need to delve deeper, if you can
    457                         if ( ReferenceToType * type = isStructOrUnion( initContext ) ) {
    458                                 resolveAggrInit( type, init, initEnd );
    459                         } else {
    460                                 // member is not an aggregate type, so can't go any deeper
    461 
    462                                 // might need to rethink what is being thrown
    463                                 throw;
    464                         } // if
    465                 }
    466         }
    467 
    468         void Resolver::resolveAggrInit( ReferenceToType * inst, InitIterator & init, InitIterator & initEnd ) {
    469                 if ( StructInstType * sit = dynamic_cast< StructInstType * >( inst ) ) {
    470                         TypeSubstitution sub = makeGenericSubstitutuion( sit );
    471                         StructDecl * st = sit->get_baseStruct();
    472                         if(st->get_members().empty()) return;
    473                         // want to resolve each initializer to the members of the struct,
    474                         // but if there are more initializers than members we should stop
    475                         list< Declaration * >::iterator it = st->get_members().begin();
    476                         for ( ; it != st->get_members().end(); ++it) {
    477                                 resolveSingleAggrInit( *it, init, initEnd, sub );
    478                         }
    479                 } else if ( UnionInstType * uit = dynamic_cast< UnionInstType * >( inst ) ) {
    480                         TypeSubstitution sub = makeGenericSubstitutuion( uit );
    481                         UnionDecl * un = uit->get_baseUnion();
    482                         if(un->get_members().empty()) return;
    483                         // only resolve to the first member of a union
    484                         resolveSingleAggrInit( *un->get_members().begin(), init, initEnd, sub );
    485                 } // if
     419                }
     420
     421                // set initializer expr to resolved express
     422                singleInit->set_value( newExpr );
     423
     424                // move cursor to next object in preparation for next initializer
     425                currentObject.increment();
    486426        }
    487427
    488428        void Resolver::visit( ListInit * listInit ) {
    489                 InitIterator iter = listInit->begin();
    490                 InitIterator end = listInit->end();
    491 
    492                 if ( ArrayType * at = dynamic_cast< ArrayType * >( initContext ) ) {
    493                         // resolve each member to the base type of the array
    494                         for ( ; iter != end; ++iter ) {
    495                                 initContext = at->get_base();
    496                                 (*iter)->accept( *this );
    497                         } // for
    498                 } else if ( TupleType * tt = dynamic_cast< TupleType * > ( initContext ) ) {
    499                         for ( Type * t : *tt ) {
    500                                 if ( iter == end ) break;
    501                                 initContext = t;
    502                                 (*iter++)->accept( *this );
    503                         }
    504                 } else if ( ReferenceToType * type = isStructOrUnion( initContext ) ) {
    505                         resolveAggrInit( type, iter, end );
    506                 } else if ( TypeInstType * tt = dynamic_cast< TypeInstType * >( initContext ) ) {
    507                         Type * base = tt->get_baseType()->get_base();
    508                         if ( base ) {
    509                                 // know the implementation type, so try using that as the initContext
    510                                 initContext = base;
    511                                 visit( listInit );
    512                         } else {
    513                                 // missing implementation type -- might be an unknown type variable, so try proceeding with the current init context
    514                                 Parent::visit( listInit );
    515                         }
    516                 } else {
    517                         assert( dynamic_cast< BasicType * >( initContext ) || dynamic_cast< PointerType * >( initContext )
    518                                 || dynamic_cast< ZeroType * >( initContext ) || dynamic_cast< OneType * >( initContext ) || dynamic_cast < EnumInstType * > ( initContext ) );
    519                         // basic types are handled here
    520                         Parent::visit( listInit );
    521                 }
    522 
    523 #if 0
    524                 if ( ArrayType *at = dynamic_cast<ArrayType*>(initContext) ) {
    525                         std::list<Initializer *>::iterator iter( listInit->begin_initializers() );
    526                         for ( ; iter != listInit->end_initializers(); ++iter ) {
    527                                 initContext = at->get_base();
    528                                 (*iter)->accept( *this );
    529                         } // for
    530                 } else if ( StructInstType *st = dynamic_cast<StructInstType*>(initContext) ) {
    531                         StructDecl *baseStruct = st->get_baseStruct();
    532                         std::list<Declaration *>::iterator iter1( baseStruct->get_members().begin() );
    533                         std::list<Initializer *>::iterator iter2( listInit->begin_initializers() );
    534                         for ( ; iter1 != baseStruct->get_members().end() && iter2 != listInit->end_initializers(); ++iter2 ) {
    535                                 if ( (*iter2)->get_designators().empty() ) {
    536                                         DeclarationWithType *dt = dynamic_cast<DeclarationWithType *>( *iter1 );
    537                                         initContext = dt->get_type();
    538                                         (*iter2)->accept( *this );
    539                                         ++iter1;
    540                                 } else {
    541                                         StructDecl *st = baseStruct;
    542                                         iter1 = st->get_members().begin();
    543                                         std::list<Expression *>::iterator iter3( (*iter2)->get_designators().begin() );
    544                                         for ( ; iter3 != (*iter2)->get_designators().end(); ++iter3 ) {
    545                                                 NameExpr *key = dynamic_cast<NameExpr *>( *iter3 );
    546                                                 assert( key );
    547                                                 for ( ; iter1 != st->get_members().end(); ++iter1 ) {
    548                                                         if ( key->get_name() == (*iter1)->get_name() ) {
    549                                                                 (*iter1)->print( cout );
    550                                                                 cout << key->get_name() << endl;
    551                                                                 ObjectDecl *fred = dynamic_cast<ObjectDecl *>( *iter1 );
    552                                                                 assert( fred );
    553                                                                 StructInstType *mary = dynamic_cast<StructInstType*>( fred->get_type() );
    554                                                                 assert( mary );
    555                                                                 st = mary->get_baseStruct();
    556                                                                 iter1 = st->get_members().begin();
    557                                                                 break;
    558                                                         } // if
    559                                                 }  // for
    560                                         } // for
    561                                         ObjectDecl *fred = dynamic_cast<ObjectDecl *>( *iter1 );
    562                                         assert( fred );
    563                                         initContext = fred->get_type();
    564                                         (*listInit->begin_initializers())->accept( *this );
    565                                 } // if
    566                         } // for
    567                 } else if ( UnionInstType *st = dynamic_cast<UnionInstType*>(initContext) ) {
    568                         DeclarationWithType *dt = dynamic_cast<DeclarationWithType *>( *st->get_baseUnion()->get_members().begin() );
    569                         initContext = dt->get_type();
    570                         (*listInit->begin_initializers())->accept( *this );
    571                 } // if
    572 #endif
     429                // move cursor into brace-enclosed initializer-list
     430                currentObject.enterListInit();
     431                // xxx - fix this so that the list isn't copied, iterator should be used to change current element
     432                std::list<Designation *> newDesignations;
     433                for ( auto p : group_iterate(listInit->get_designations(), listInit->get_initializers()) ) {
     434                        // iterate designations and initializers in pairs, moving the cursor to the current designated object and resolving
     435                        // the initializer against that object.
     436                        Designation * des = std::get<0>(p);
     437                        Initializer * init = std::get<1>(p);
     438                        newDesignations.push_back( currentObject.findNext( des ) );
     439                        init->accept( *this );
     440                }
     441                // set the set of 'resolved' designations and leave the brace-enclosed initializer-list
     442                listInit->get_designations() = newDesignations; // xxx - memory management
     443                currentObject.exitListInit();
     444
     445                // xxx - this part has not be folded into CurrentObject yet
     446                // } else if ( TypeInstType * tt = dynamic_cast< TypeInstType * >( initContext ) ) {
     447                //      Type * base = tt->get_baseType()->get_base();
     448                //      if ( base ) {
     449                //              // know the implementation type, so try using that as the initContext
     450                //              ObjectDecl tmpObj( "", Type::StorageClasses(), LinkageSpec::Cforall, nullptr, base->clone(), nullptr );
     451                //              currentObject = &tmpObj;
     452                //              visit( listInit );
     453                //      } else {
     454                //              // missing implementation type -- might be an unknown type variable, so try proceeding with the current init context
     455                //              Parent::visit( listInit );
     456                //      }
     457                // } else {
    573458        }
    574459
  • src/ResolvExpr/Unify.cc

    rfea3faa rb826e6b  
    606606                        } else if ( tupleParam ) {
    607607                                // bundle other parameters into tuple to match
    608                                 TupleType* binder = new TupleType{ paramTy->get_qualifiers() };
     608                                std::list< Type * > binderTypes;
    609609
    610610                                do {
    611                                         binder->get_types().push_back( otherParam->get_type()->clone() );
     611                                        binderTypes.push_back( otherParam->get_type()->clone() );
    612612                                        ++jt;
    613613
     
    618618                                } while (true);
    619619
    620                                 otherParamTy = binder;
     620                                otherParamTy = new TupleType{ paramTy->get_qualifiers(), binderTypes };
    621621                                ++it;  // skip ttype parameter for break
    622622                        } else if ( otherTupleParam ) {
    623623                                // bundle parameters into tuple to match other
    624                                 TupleType* binder = new TupleType{ otherParamTy->get_qualifiers() };
     624                                std::list< Type * > binderTypes;
    625625
    626626                                do {
    627                                         binder->get_types().push_back( param->get_type()->clone() );
     627                                        binderTypes.push_back( param->get_type()->clone() );
    628628                                        ++it;
    629629
     
    634634                                } while (true);
    635635
    636                                 paramTy = binder;
     636                                paramTy = new TupleType{ otherParamTy->get_qualifiers(), binderTypes };
    637637                                ++jt;  // skip ttype parameter for break
    638638                        }
     
    756756                        return function->get_returnVals().front()->get_type()->clone();
    757757                } else {
    758                         TupleType * tupleType = new TupleType( Type::Qualifiers() );
     758                        std::list< Type * > types;
    759759                        for ( DeclarationWithType * decl : function->get_returnVals() ) {
    760                                 tupleType->get_types().push_back( decl->get_type()->clone() );
     760                                types.push_back( decl->get_type()->clone() );
    761761                        } // for
    762                         return tupleType;
     762                        return new TupleType( Type::Qualifiers(), types );
    763763                }
    764764        }
  • src/ResolvExpr/module.mk

    rfea3faa rb826e6b  
    66## file "LICENCE" distributed with Cforall.
    77##
    8 ## module.mk -- 
     8## module.mk --
    99##
    1010## Author           : Richard C. Bilson
     
    3131       ResolvExpr/PolyCost.cc \
    3232       ResolvExpr/Occurs.cc \
    33        ResolvExpr/TypeEnvironment.cc
     33       ResolvExpr/TypeEnvironment.cc \
     34       ResolvExpr/CurrentObject.cc
  • src/SymTab/Autogen.cc

    rfea3faa rb826e6b  
    99// Author           : Rob Schluntz
    1010// Created On       : Thu Mar 03 15:45:56 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 17 09:41:08 2017
    13 // Update Count     : 60
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Jul 14 16:41:00 2017
     13// Update Count     : 62
    1414//
    1515
     
    400400        /// generates struct constructors, destructor, and assignment functions
    401401        void makeStructFunctions( StructDecl *aggregateDecl, StructInstType *refType, unsigned int functionNesting, std::list< Declaration * > & declsToAdd, const std::vector< FuncData > & data ) {
     402                // Builtins do not use autogeneration.
     403                if ( aggregateDecl->get_linkage() == LinkageSpec::BuiltinCFA ||
     404                         aggregateDecl->get_linkage() == LinkageSpec::BuiltinC ) {
     405                        return;
     406                }
     407
    402408                // Make function polymorphic in same parameters as generic struct, if applicable
    403409                const std::list< TypeDecl* > & typeParams = aggregateDecl->get_parameters(); // List of type variables to be placed on the generated functions
  • src/SymTab/Autogen.h

    rfea3faa rb826e6b  
    2525
    2626namespace SymTab {
    27     /// Generates assignment operators, constructors, and destructor for aggregate types as required
    28     void autogenerateRoutines( std::list< Declaration * > &translationUnit );
     27        /// Generates assignment operators, constructors, and destructor for aggregate types as required
     28        void autogenerateRoutines( std::list< Declaration * > &translationUnit );
    2929
    30     /// returns true if obj's name is the empty string and it has a bitfield width
    31     bool isUnnamedBitfield( ObjectDecl * obj );
     30        /// returns true if obj's name is the empty string and it has a bitfield width
     31        bool isUnnamedBitfield( ObjectDecl * obj );
    3232
    33     /// size_t type - set when size_t typedef is seen. Useful in a few places,
    34     /// such as in determining array dimension type
    35     extern Type * SizeType;
     33        /// size_t type - set when size_t typedef is seen. Useful in a few places,
     34        /// such as in determining array dimension type
     35        extern Type * SizeType;
    3636
    37     /// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls.
    38     template< typename OutputIterator >
     37        /// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls.
     38        template< typename OutputIterator >
    3939        Statement * genCall( InitTweak::InitExpander & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast = false, bool forward = true );
    4040
    41     /// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Should only be called with non-array types.
    42     /// optionally returns a statement which must be inserted prior to the containing loop, if there is one
    43     template< typename OutputIterator >
     41        /// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Should only be called with non-array types.
     42        /// optionally returns a statement which must be inserted prior to the containing loop, if there is one
     43        template< typename OutputIterator >
    4444        Statement * genScalarCall( InitTweak::InitExpander & srcParam, Expression *dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast = false ) {
    4545        // want to be able to generate assignment, ctor, and dtor generically,
     
    5050        dstParam = new AddressExpr( dstParam );
    5151        if ( addCast ) {
    52             // cast to T* with qualifiers removed, so that qualified objects can be constructed
    53             // and destructed with the same functions as non-qualified objects.
    54             // unfortunately, lvalue is considered a qualifier. For AddressExpr to resolve, its argument
    55             // must have an lvalue qualified type, so remove all qualifiers except lvalue. If we ever
    56             // remove lvalue as a qualifier, this can change to
    57             //   type->get_qualifiers() = Type::Qualifiers();
    58             assert( type );
    59             Type * castType = type->clone();
    60 //                      castType->get_qualifiers() -= Type::Qualifiers(true, true, true, false, true, false);
    61             castType->get_qualifiers() -= Type::Qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Atomic );
    62             castType->set_lvalue( true ); // xxx - might not need this
    63             dstParam = new CastExpr( dstParam, new PointerType( Type::Qualifiers(), castType ) );
     52                // cast to T* with qualifiers removed, so that qualified objects can be constructed
     53                // and destructed with the same functions as non-qualified objects.
     54                // unfortunately, lvalue is considered a qualifier. For AddressExpr to resolve, its argument
     55                // must have an lvalue qualified type, so remove all qualifiers except lvalue. If we ever
     56                // remove lvalue as a qualifier, this can change to
     57                //   type->get_qualifiers() = Type::Qualifiers();
     58                assert( type );
     59                Type * castType = type->clone();
     60                castType->get_qualifiers() -= Type::Qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Atomic );
     61                castType->set_lvalue( true ); // xxx - might not need this
     62                dstParam = new CastExpr( dstParam, new PointerType( Type::Qualifiers(), castType ) );
    6463        }
    6564        fExpr->get_args().push_back( dstParam );
     
    7574
    7675        return listInit;
    77     }
    78 
    79     /// Store in out a loop which calls fname on each element of the array with srcParam and dstParam as arguments.
    80     /// If forward is true, loop goes from 0 to N-1, else N-1 to 0
    81     template< typename OutputIterator >
    82         void genArrayCall( InitTweak::InitExpander & srcParam, Expression *dstParam, const std::string & fname, OutputIterator out, ArrayType *array, bool addCast = false, bool forward = true ) {
    83         static UniqueName indexName( "_index" );
    84 
    85         // for a flexible array member nothing is done -- user must define own assignment
    86         if ( ! array->get_dimension() ) return ;
    87 
    88         Expression * begin, * end, * update, * cmp;
    89         if ( forward ) {
    90             // generate: for ( int i = 0; i < N; ++i )
    91             begin = new ConstantExpr( Constant::from_int( 0 ) );
    92             end = array->get_dimension()->clone();
    93             cmp = new NameExpr( "?<?" );
    94             update = new NameExpr( "++?" );
    95         } else {
    96             // generate: for ( int i = N-1; i >= 0; --i )
    97             begin = new UntypedExpr( new NameExpr( "?-?" ) );
    98             ((UntypedExpr*)begin)->get_args().push_back( array->get_dimension()->clone() );
    99             ((UntypedExpr*)begin)->get_args().push_back( new ConstantExpr( Constant::from_int( 1 ) ) );
    100             end = new ConstantExpr( Constant::from_int( 0 ) );
    101             cmp = new NameExpr( "?>=?" );
    102             update = new NameExpr( "--?" );
    10376        }
    10477
    105         ObjectDecl *index = new ObjectDecl( indexName.newName(), Type::StorageClasses(), LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), new SingleInit( begin, std::list<Expression*>() ) );
     78        /// Store in out a loop which calls fname on each element of the array with srcParam and dstParam as arguments.
     79        /// If forward is true, loop goes from 0 to N-1, else N-1 to 0
     80        template< typename OutputIterator >
     81        void genArrayCall( InitTweak::InitExpander & srcParam, Expression *dstParam, const std::string & fname, OutputIterator out, ArrayType *array, bool addCast = false, bool forward = true ) {
     82                static UniqueName indexName( "_index" );
    10683
    107         UntypedExpr *cond = new UntypedExpr( cmp );
    108         cond->get_args().push_back( new VariableExpr( index ) );
    109         cond->get_args().push_back( end );
     84                // for a flexible array member nothing is done -- user must define own assignment
     85                if ( ! array->get_dimension() ) return ;
    11086
    111         UntypedExpr *inc = new UntypedExpr( update );
    112         inc->get_args().push_back( new AddressExpr( new VariableExpr( index ) ) );
     87                Expression * begin, * end, * update, * cmp;
     88                if ( forward ) {
     89                        // generate: for ( int i = 0; i < N; ++i )
     90                        begin = new ConstantExpr( Constant::from_int( 0 ) );
     91                        end = array->get_dimension()->clone();
     92                        cmp = new NameExpr( "?<?" );
     93                        update = new NameExpr( "++?" );
     94                } else {
     95                        // generate: for ( int i = N-1; i >= 0; --i )
     96                        begin = new UntypedExpr( new NameExpr( "?-?" ) );
     97                        ((UntypedExpr*)begin)->get_args().push_back( array->get_dimension()->clone() );
     98                        ((UntypedExpr*)begin)->get_args().push_back( new ConstantExpr( Constant::from_int( 1 ) ) );
     99                        end = new ConstantExpr( Constant::from_int( 0 ) );
     100                        cmp = new NameExpr( "?>=?" );
     101                        update = new NameExpr( "--?" );
     102                }
    113103
    114         UntypedExpr *dstIndex = new UntypedExpr( new NameExpr( "?[?]" ) );
    115         dstIndex->get_args().push_back( dstParam );
    116         dstIndex->get_args().push_back( new VariableExpr( index ) );
    117         dstParam = dstIndex;
     104                ObjectDecl *index = new ObjectDecl( indexName.newName(), Type::StorageClasses(), LinkageSpec::C, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), new SingleInit( begin ) );
    118105
    119         // srcParam must keep track of the array indices to build the
    120         // source parameter and/or array list initializer
    121         srcParam.addArrayIndex( new VariableExpr( index ), array->get_dimension()->clone() );
     106                UntypedExpr *cond = new UntypedExpr( cmp );
     107                cond->get_args().push_back( new VariableExpr( index ) );
     108                cond->get_args().push_back( end );
    122109
    123         // for stmt's body, eventually containing call
    124         CompoundStmt * body = new CompoundStmt( noLabels );
    125         Statement * listInit = genCall( srcParam, dstParam, fname, back_inserter( body->get_kids() ), array->get_base(), addCast, forward );
     110                UntypedExpr *inc = new UntypedExpr( update );
     111                inc->get_args().push_back( new AddressExpr( new VariableExpr( index ) ) );
    126112
    127         // block containing for stmt and index variable
    128         std::list<Statement *> initList;
    129         CompoundStmt * block = new CompoundStmt( noLabels );
    130         block->get_kids().push_back( new DeclStmt( noLabels, index ) );
    131         if ( listInit ) block->get_kids().push_back( listInit );
    132         block->get_kids().push_back( new ForStmt( noLabels, initList, cond, inc, body ) );
     113                UntypedExpr *dstIndex = new UntypedExpr( new NameExpr( "?[?]" ) );
     114                dstIndex->get_args().push_back( dstParam );
     115                dstIndex->get_args().push_back( new VariableExpr( index ) );
     116                dstParam = dstIndex;
    133117
    134         *out++ = block;
    135     }
     118                // srcParam must keep track of the array indices to build the
     119                // source parameter and/or array list initializer
     120                srcParam.addArrayIndex( new VariableExpr( index ), array->get_dimension()->clone() );
    136121
    137     template< typename OutputIterator >
     122                // for stmt's body, eventually containing call
     123                CompoundStmt * body = new CompoundStmt( noLabels );
     124                Statement * listInit = genCall( srcParam, dstParam, fname, back_inserter( body->get_kids() ), array->get_base(), addCast, forward );
     125
     126                // block containing for stmt and index variable
     127                std::list<Statement *> initList;
     128                CompoundStmt * block = new CompoundStmt( noLabels );
     129                block->get_kids().push_back( new DeclStmt( noLabels, index ) );
     130                if ( listInit ) block->get_kids().push_back( listInit );
     131                block->get_kids().push_back( new ForStmt( noLabels, initList, cond, inc, body ) );
     132
     133                *out++ = block;
     134        }
     135
     136        template< typename OutputIterator >
    138137        Statement * genCall( InitTweak::InitExpander &  srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast, bool forward ) {
    139         if ( ArrayType * at = dynamic_cast< ArrayType * >( type ) ) {
    140             genArrayCall( srcParam, dstParam, fname, out, at, addCast, forward );
    141             return 0;
    142         } else {
    143             return genScalarCall( srcParam, dstParam, fname, out, type, addCast );
     138                if ( ArrayType * at = dynamic_cast< ArrayType * >( type ) ) {
     139                        genArrayCall( srcParam, dstParam, fname, out, at, addCast, forward );
     140                        return 0;
     141                } else {
     142                        return genScalarCall( srcParam, dstParam, fname, out, type, addCast );
     143                }
    144144        }
    145     }
    146145
    147     /// inserts into out a generated call expression to function fname with arguments dstParam
    148     /// and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls. decl is the
    149     /// object being constructed. The function wraps constructor and destructor calls in an
    150     /// ImplicitCtorDtorStmt node.
    151     template< typename OutputIterator >
     146        /// inserts into out a generated call expression to function fname with arguments dstParam
     147        /// and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls. decl is the
     148        /// object being constructed. The function wraps constructor and destructor calls in an
     149        /// ImplicitCtorDtorStmt node.
     150        template< typename OutputIterator >
    152151        void genImplicitCall( InitTweak::InitExpander &  srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, DeclarationWithType * decl, bool forward = true ) {
    153         ObjectDecl *obj = dynamic_cast<ObjectDecl *>( decl );
    154         assert( obj );
    155         // unnamed bit fields are not copied as they cannot be accessed
    156         if ( isUnnamedBitfield( obj ) ) return;
     152                ObjectDecl *obj = dynamic_cast<ObjectDecl *>( decl );
     153                assert( obj );
     154                // unnamed bit fields are not copied as they cannot be accessed
     155                if ( isUnnamedBitfield( obj ) ) return;
    157156
    158         bool addCast = (fname == "?{}" || fname == "^?{}") && ( !obj || ( obj && obj->get_bitfieldWidth() == NULL ) );
    159         std::list< Statement * > stmts;
    160         genCall( srcParam, dstParam, fname, back_inserter( stmts ), obj->get_type(), addCast, forward );
     157                bool addCast = (fname == "?{}" || fname == "^?{}") && ( !obj || ( obj && obj->get_bitfieldWidth() == NULL ) );
     158                std::list< Statement * > stmts;
     159                genCall( srcParam, dstParam, fname, back_inserter( stmts ), obj->get_type(), addCast, forward );
    161160
    162         // currently genCall should produce at most one element, but if that changes then the next line needs to be updated to grab the statement which contains the call
    163         assert( stmts.size() <= 1 );
    164         if ( stmts.size() == 1 ) {
    165             Statement * callStmt = stmts.front();
    166             if ( addCast ) {
    167                 // implicitly generated ctor/dtor calls should be wrapped
    168                 // so that later passes are aware they were generated.
    169                 // xxx - don't mark as an implicit ctor/dtor if obj is a bitfield,
    170                 // because this causes the address to be taken at codegen, which is illegal in C.
    171                 callStmt = new ImplicitCtorDtorStmt( callStmt );
    172             }
    173             *out++ = callStmt;
     161                // currently genCall should produce at most one element, but if that changes then the next line needs to be updated to grab the statement which contains the call
     162                assert( stmts.size() <= 1 );
     163                if ( stmts.size() == 1 ) {
     164                        Statement * callStmt = stmts.front();
     165                        if ( addCast ) {
     166                                // implicitly generated ctor/dtor calls should be wrapped
     167                                // so that later passes are aware they were generated.
     168                                // xxx - don't mark as an implicit ctor/dtor if obj is a bitfield,
     169                                // because this causes the address to be taken at codegen, which is illegal in C.
     170                                callStmt = new ImplicitCtorDtorStmt( callStmt );
     171                        }
     172                        *out++ = callStmt;
     173                }
    174174        }
    175     }
    176175} // namespace SymTab
    177176#endif // AUTOGEN_H
  • src/SymTab/ImplementationType.cc

    rfea3faa rb826e6b  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // ImplementationType.cc -- 
     7// ImplementationType.cc --
    88//
    99// Author           : Richard C. Bilson
     
    9292
    9393        void ImplementationType::visit(TupleType *tupleType) {
    94                 TupleType *newType = new TupleType( Type::Qualifiers() );
     94                std::list< Type * > types;
    9595                for ( std::list< Type* >::iterator i = tupleType->get_types().begin(); i != tupleType->get_types().end(); ++i ) {
    9696                        Type *implType = implementationType( *i, indexer );
    9797                        implType->get_qualifiers() |= tupleType->get_qualifiers();
    98                         newType->get_types().push_back( implType );
     98                        types.push_back( implType );
    9999                } // for
    100                 result = newType;
     100                result = new TupleType( Type::Qualifiers(), types );
    101101        }
    102102
  • src/SymTab/Indexer.cc

    rfea3faa rb826e6b  
    652652                        for ( MangleTable::const_iterator decl = mangleTable.begin(); decl != mangleTable.end(); ++decl ) {
    653653                                // check for C decls with the same name, skipping those with a compatible type (by mangleName)
    654                                 if ( decl->second->get_linkage() == LinkageSpec::C && decl->first != mangleName ) return true;
     654                                if ( ! LinkageSpec::isMangled( decl->second->get_linkage() ) && decl->first != mangleName ) return true;
    655655                        }
    656656                }
     
    669669                                // check for C decls with the same name, skipping
    670670                                // those with an incompatible type (by mangleName)
    671                                 if ( decl->second->get_linkage() == LinkageSpec::C && decl->first == mangleName ) return true;
     671                                if ( ! LinkageSpec::isMangled( decl->second->get_linkage() ) && decl->first == mangleName ) return true;
    672672                        }
    673673                }
     
    724724                        // new definition shadows the autogenerated one, even at the same scope
    725725                        return false;
    726                 } else if ( added->get_linkage() != LinkageSpec::C || ResolvExpr::typesCompatible( added->get_type(), existing->get_type(), Indexer() ) ) {
     726                } else if ( LinkageSpec::isMangled( added->get_linkage() ) || ResolvExpr::typesCompatible( added->get_type(), existing->get_type(), Indexer() ) ) {
    727727                        // typesCompatible doesn't really do the right thing here. When checking compatibility of function types,
    728728                        // we should ignore outermost pointer qualifiers, except _Atomic?
     
    765765
    766766                // this ensures that no two declarations with the same unmangled name at the same scope both have C linkage
    767                 if ( decl->get_linkage() == LinkageSpec::C ) {
     767                if ( ! LinkageSpec::isMangled( decl->get_linkage() ) ) {
    768768                        // NOTE this is broken in Richard's original code in such a way that it never triggers (it
    769769                        // doesn't check decls that have the same manglename, and all C-linkage decls are defined to
  • src/SymTab/Mangler.cc

    rfea3faa rb826e6b  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 21:40:29 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 17 09:40:01 2017
    13 // Update Count     : 20
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Jun 28 15:31:00 2017
     13// Update Count     : 21
    1414//
    1515
     
    7272                        } else {
    7373                                // if we add another kind of overridable function, this has to change
    74                                 assert( false );
     74                                assert( false && "unknown overrideable linkage" );
    7575                        } // if
    7676                }
  • src/SymTab/Validate.cc

    rfea3faa rb826e6b  
    106106
    107107        /// Fix return types so that every function returns exactly one value
    108         class ReturnTypeFixer {
    109           public:
     108        struct ReturnTypeFixer {
    110109                static void fix( std::list< Declaration * > &translationUnit );
    111110
     
    115114
    116115        /// Replaces enum types by int, and function or array types in function parameter and return lists by appropriate pointers.
    117         class EnumAndPointerDecay {
    118         public:
     116        struct EnumAndPointerDecay {
    119117                void previsit( EnumDecl *aggregateDecl );
    120118                void previsit( FunctionType *func );
     
    159157        };
    160158
    161         class ReturnChecker : public WithScopes {
    162           public:
     159        struct ReturnChecker : public WithGuards {
    163160                /// Checks that return statements return nothing if their return type is void
    164161                /// and return something if the return type is non-void.
    165162                static void checkFunctionReturns( std::list< Declaration * > & translationUnit );
    166           private:
     163
    167164                void previsit( FunctionDecl * functionDecl );
    168165                void previsit( ReturnStmt * returnStmt );
     
    205202        };
    206203
    207         class VerifyCtorDtorAssign {
    208         public:
     204        struct VerifyCtorDtorAssign {
    209205                /// ensure that constructors, destructors, and assignment have at least one
    210206                /// parameter, the first of which must be a pointer, and that ctor/dtors have no
     
    216212
    217213        /// ensure that generic types have the correct number of type arguments
    218         class ValidateGenericParameters {
    219         public:
     214        struct ValidateGenericParameters {
    220215                void previsit( StructInstType * inst );
    221216                void previsit( UnionInstType * inst );
    222217        };
    223218
    224         class ArrayLength {
    225         public:
     219        struct ArrayLength {
    226220                /// for array types without an explicit length, compute the length and store it so that it
    227221                /// is known to the rest of the phases. For example,
     
    236230        };
    237231
    238         class CompoundLiteral final : public GenPoly::DeclMutator {
     232        struct CompoundLiteral final : public WithDeclsToAdd, public WithVisitorRef<CompoundLiteral> {
    239233                Type::StorageClasses storageClasses;
    240234
    241                 using GenPoly::DeclMutator::mutate;
    242                 DeclarationWithType * mutate( ObjectDecl *objectDecl ) final;
    243                 Expression *mutate( CompoundLiteralExpr *compLitExpr ) final;
     235                void premutate( ObjectDecl *objectDecl );
     236                Expression * postmutate( CompoundLiteralExpr *compLitExpr );
    244237        };
    245238
     
    248241                LinkReferenceToTypes lrt( doDebug, 0 );
    249242                ForallPointerDecay fpd( 0 );
    250                 CompoundLiteral compoundliteral;
     243                PassVisitor<CompoundLiteral> compoundliteral;
    251244                PassVisitor<ValidateGenericParameters> genericParams;
    252245
     
    263256                Concurrency::implementThreadStarter( translationUnit );
    264257                ReturnChecker::checkFunctionReturns( translationUnit );
    265                 compoundliteral.mutateDeclarationList( translationUnit );
     258                mutateAll( translationUnit, compoundliteral );
    266259                acceptAll( translationUnit, fpd );
    267260                ArrayLength::computeLength( translationUnit );
     
    883876        }
    884877
    885         DeclarationWithType * CompoundLiteral::mutate( ObjectDecl *objectDecl ) {
     878        void CompoundLiteral::premutate( ObjectDecl *objectDecl ) {
    886879                storageClasses = objectDecl->get_storageClasses();
    887                 DeclarationWithType * temp = Mutator::mutate( objectDecl );
    888                 return temp;
    889         }
    890 
    891         Expression *CompoundLiteral::mutate( CompoundLiteralExpr *compLitExpr ) {
     880        }
     881
     882        Expression *CompoundLiteral::postmutate( CompoundLiteralExpr *compLitExpr ) {
    892883                // transform [storage_class] ... (struct S){ 3, ... };
    893884                // into [storage_class] struct S temp =  { 3, ... };
    894885                static UniqueName indexName( "_compLit" );
    895886
    896                 ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageClasses, LinkageSpec::C, 0, compLitExpr->get_result(), compLitExpr->get_initializer() );
    897                 compLitExpr->set_result( 0 );
    898                 compLitExpr->set_initializer( 0 );
     887                ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageClasses, LinkageSpec::C, nullptr, compLitExpr->get_result(), compLitExpr->get_initializer() );
     888                compLitExpr->set_result( nullptr );
     889                compLitExpr->set_initializer( nullptr );
    899890                delete compLitExpr;
    900                 DeclarationWithType * newtempvar = mutate( tempvar );
    901                 addDeclaration( newtempvar );                                   // add modified temporary to current block
    902                 return new VariableExpr( newtempvar );
     891                declsToAddBefore.push_back( tempvar );                                  // add modified temporary to current block
     892                return new VariableExpr( tempvar );
    903893        }
    904894
  • src/SymTab/module.mk

    rfea3faa rb826e6b  
    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 : Wed Jul 12 13:06:00 2017
     14## Update Count     : 3
    1515###############################################################################
    1616
     
    2121       SymTab/ImplementationType.cc \
    2222       SymTab/TypeEquality.cc \
    23        SymTab/Autogen.cc
     23       SymTab/Autogen.cc \
     24       SymTab/TreeStruct.cc
  • src/SynTree/AggregateDecl.cc

    rfea3faa rb826e6b  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 23:56:39 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 16 07:49:07 2017
    13 // Update Count     : 20
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tus Jun 27 15:30:00 2017
     13// Update Count     : 21
    1414//
    1515
     
    2020
    2121
    22 AggregateDecl::AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes ) : Parent( name, Type::StorageClasses(), LinkageSpec::Cforall ), body( false ), attributes( attributes ) {
     22AggregateDecl::AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes, LinkageSpec::Spec linkage ) : Parent( name, Type::StorageClasses(), linkage ), body( false ), attributes( attributes ) {
    2323}
    2424
  • src/SynTree/Constant.cc

    rfea3faa rb826e6b  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Constant.cc -- 
     7// Constant.cc --
    88//
    99// Author           : Richard C. Bilson
    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
     59unsigned long long Constant::get_ival() const {
     60        assertf( safe_dynamic_cast<BasicType*>(type)->isInteger(), "Attempt to retrieve ival from non-integer constant." );
     61        return val.ival;
     62}
     63
     64double Constant::get_dval() const {
     65        assertf( ! safe_dynamic_cast<BasicType*>(type)->isInteger(), "Attempt to retrieve dval from integer constant." );
     66        return val.dval;
     67}
     68
    4869void Constant::print( std::ostream &os ) const {
    4970        os << "(" << rep << " " << val.ival;
  • src/SynTree/Constant.h

    rfea3faa rb826e6b  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // Constant.h -- 
     7// Constant.h --
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Thr Jun 22 10:13:00 2017
    13 // Update Count     : 15
     12// Last Modified On : Fri Jul 14 13:33:00 2017
     13// Update Count     : 16
    1414//
    1515
     
    3232        std::string & get_value() { return rep; }
    3333        void set_value( std::string newValue ) { rep = newValue; }
     34        unsigned long long get_ival() const;
     35        double get_dval() const;
    3436
    3537        /// generates a boolean constant of the given bool
     
    4143        /// generates a floating point constant of the given double
    4244        static Constant from_double( double d );
     45
     46        /// generates a null pointer value for the given type. void * if omitted.
     47        static Constant null( Type * ptrtype = nullptr );
    4348
    4449        virtual void accept( Visitor & v ) { v.visit( this ); }
  • src/SynTree/Declaration.h

    rfea3faa rb826e6b  
    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 16:05:08 2017
    13 // Update Count     : 121
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Jul 14 16:59:00 2017
     13// Update Count     : 123
    1414//
    1515
     
    238238        typedef Declaration Parent;
    239239  public:
    240         AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >() );
     240        AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall );
    241241        AggregateDecl( const AggregateDecl &other );
    242242        virtual ~AggregateDecl();
     
    266266        typedef AggregateDecl Parent;
    267267  public:
    268         StructDecl( const std::string &name, DeclarationNode::Aggregate kind = DeclarationNode::Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >() ) : Parent( name, attributes ), kind( kind ) {}
     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 ), tagged( false ), parent_name( "" ) {}
     269        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 : "" ) {}
    269270        StructDecl( const StructDecl &other ) : Parent( other ) {}
    270271
     
    273274        bool is_thread() { return kind == DeclarationNode::Thread; }
    274275
     276        // Tagged/Tree Structure Excetion
     277        bool get_tagged() { return tagged; }
     278        void set_tagged( bool newValue ) { tagged = newValue; }
     279        bool has_parent() { return parent_name != ""; }
     280        std::string get_parentName() { return parent_name; }
     281
    275282        virtual StructDecl *clone() const { return new StructDecl( *this ); }
    276283        virtual void accept( Visitor &v ) { v.visit( this ); }
     
    279286        DeclarationNode::Aggregate kind;
    280287        virtual std::string typeString() const;
     288
     289        bool tagged;
     290        std::string parent_name;
    281291};
    282292
     
    284294        typedef AggregateDecl Parent;
    285295  public:
    286         UnionDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >() ) : Parent( name, attributes ) {}
     296        UnionDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
    287297        UnionDecl( const UnionDecl &other ) : Parent( other ) {}
    288298
     
    297307        typedef AggregateDecl Parent;
    298308  public:
    299         EnumDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >() ) : Parent( name, attributes ) {}
     309        EnumDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
    300310        EnumDecl( const EnumDecl &other ) : Parent( other ) {}
    301311
  • src/SynTree/Expression.cc

    rfea3faa rb826e6b  
    2121#include <iterator>
    2222
     23#include "Declaration.h"
     24#include "Expression.h"
     25#include "Initializer.h"
     26#include "Statement.h"
    2327#include "Type.h"
    24 #include "Initializer.h"
    25 #include "Expression.h"
    26 #include "Declaration.h"
    27 #include "Statement.h"
    2828#include "TypeSubstitution.h"
     29#include "VarExprReplacer.h"
     30
    2931#include "Common/utility.h"
     32#include "Common/PassVisitor.h"
     33
    3034#include "InitTweak/InitTweak.h"
    3135
     
    9296
    9397        Declaration *decl = get_var();
    94         // if ( decl != 0) decl->print(os, indent + 2);
    9598        if ( decl != 0) decl->printShort(os, indent + 2);
    9699        os << std::endl;
     
    657660}
    658661
     662InitAlternative::InitAlternative( Type * type, Designation * designation ) : type( type ), designation( designation ) {}
     663InitAlternative::InitAlternative( const InitAlternative & other ) : type( maybeClone( other.type ) ), designation( maybeClone( other.designation ) ) {}
     664InitAlternative::~InitAlternative() {
     665        delete type;
     666        delete designation;
     667}
     668
     669UntypedInitExpr::UntypedInitExpr( Expression * expr, const std::list<InitAlternative> & initAlts ) : expr( expr ), initAlts( initAlts ) {}
     670UntypedInitExpr::UntypedInitExpr( const UntypedInitExpr & other ) : Expression( other ), expr( maybeClone( other.expr ) ), initAlts( other.initAlts ) {}
     671UntypedInitExpr::~UntypedInitExpr() {
     672        delete expr;
     673}
     674
     675void UntypedInitExpr::print( std::ostream & os, int indent ) const {
     676        os << "Untyped Init Expression" << std::endl << std::string( indent+2, ' ' );
     677        expr->print( os, indent+2 );
     678        if ( ! initAlts.empty() ) {
     679                for ( const InitAlternative & alt : initAlts ) {
     680                        os << std::string( indent+2, ' ' ) <<  "InitAlternative: ";
     681                        alt.type->print( os, indent+2 );
     682                        alt.designation->print( os, indent+2 );
     683                }
     684        }
     685}
     686
     687InitExpr::InitExpr( Expression * expr, Designation * designation ) : expr( expr ), designation( designation ) {
     688        set_result( expr->get_result()->clone() );
     689}
     690InitExpr::InitExpr( const InitExpr & other ) : Expression( other ), expr( maybeClone( other.expr ) ), designation( maybeClone( other.designation) ) {}
     691InitExpr::~InitExpr() {
     692        delete expr;
     693        delete designation;
     694}
     695
     696void InitExpr::print( std::ostream & os, int indent ) const {
     697        os << "Init Expression" << std::endl << std::string( indent+2, ' ' );
     698        expr->print( os, indent+2 );
     699        os << std::string( indent+2, ' ' ) << "with designation: ";
     700        designation->print( os, indent+2 );
     701}
     702
     703
    659704std::ostream & operator<<( std::ostream & out, const Expression * expr ) {
    660705        if ( expr ) {
  • src/SynTree/Expression.h

    rfea3faa rb826e6b  
    744744};
    745745
     746struct InitAlternative {
     747public:
     748        Type * type = nullptr;
     749        Designation * designation = nullptr;
     750        InitAlternative( Type * type, Designation * designation );
     751        InitAlternative( const InitAlternative & other );
     752        InitAlternative & operator=( const Initializer & other ) = delete; // at the moment this isn't used, and I don't want to implement it
     753        ~InitAlternative();
     754};
     755
     756class UntypedInitExpr : public Expression {
     757public:
     758        UntypedInitExpr( Expression * expr, const std::list<InitAlternative> & initAlts );
     759        UntypedInitExpr( const UntypedInitExpr & other );
     760        ~UntypedInitExpr();
     761
     762        Expression * get_expr() const { return expr; }
     763        UntypedInitExpr * set_expr( Expression * newValue ) { expr = newValue; return this; }
     764
     765        std::list<InitAlternative> & get_initAlts() { return initAlts; }
     766
     767        virtual UntypedInitExpr * clone() const { return new UntypedInitExpr( * this ); }
     768        virtual void accept( Visitor & v ) { v.visit( this ); }
     769        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
     770        virtual void print( std::ostream & os, int indent = 0 ) const;
     771private:
     772        Expression * expr;
     773        std::list<InitAlternative> initAlts;
     774};
     775
     776class InitExpr : public Expression {
     777public:
     778        InitExpr( Expression * expr, Designation * designation );
     779        InitExpr( const InitExpr & other );
     780        ~InitExpr();
     781
     782        Expression * get_expr() const { return expr; }
     783        InitExpr * set_expr( Expression * newValue ) { expr = newValue; return this; }
     784
     785        Designation * get_designation() const { return designation; }
     786        InitExpr * set_designation( Designation * newValue ) { designation = newValue; return this; }
     787
     788        virtual InitExpr * clone() const { return new InitExpr( * this ); }
     789        virtual void accept( Visitor & v ) { v.visit( this ); }
     790        virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
     791        virtual void print( std::ostream & os, int indent = 0 ) const;
     792private:
     793        Expression * expr;
     794        Designation * designation;
     795};
     796
     797
    746798std::ostream & operator<<( std::ostream & out, const Expression * expr );
    747799
  • src/SynTree/Initializer.cc

    rfea3faa rb826e6b  
    1919#include "Common/utility.h"
    2020
     21Designation::Designation( const std::list< Expression * > & designators ) : designators( designators ) {}
     22Designation::Designation( const Designation & other ) : BaseSyntaxNode( other ) {
     23        // std::cerr << "cloning designation" << std::endl;
     24        cloneAll( other.designators, designators );
     25        // std::cerr << "finished cloning designation" << std::endl;
     26}
     27
     28Designation::~Designation() {
     29        // std::cerr << "destroying designation" << std::endl;
     30        deleteAll( designators );
     31        // std::cerr << "finished destroying designation" << std::endl;
     32}
     33
     34void Designation::print( std::ostream &os, int indent ) const {
     35        if ( ! designators.empty() ) {
     36                os << std::string(indent + 2, ' ' ) << "designated by: " << std::endl;
     37                for ( std::list < Expression * >::const_iterator i = designators.begin(); i != designators.end(); i++ ) {
     38                        os << std::string(indent + 4, ' ' );
     39                        ( *i )->print(os, indent + 4 );
     40                }
     41                os << std::endl;
     42        } // if
     43}
     44
    2145Initializer::Initializer( bool maybeConstructed ) : maybeConstructed( maybeConstructed ) {}
    2246Initializer::Initializer( const Initializer & other ) : BaseSyntaxNode( other ), maybeConstructed( other.maybeConstructed ) {
    2347}
    24 
    25 
    2648Initializer::~Initializer() {}
    2749
    28 std::string Initializer::designator_name( Expression *des ) {
    29         if ( NameExpr *n = dynamic_cast<NameExpr *>(des) )
    30                 return n->get_name();
    31         else
    32                 throw 0;
    33 }
    34 
    35 // void Initializer::print( __attribute__((unused)) std::ostream &os, __attribute__((unused)) int indent ) {}
    36 
    37 SingleInit::SingleInit( Expression *v, const std::list< Expression *> &_designators, bool maybeConstructed ) : Initializer( maybeConstructed ), value ( v ), designators( _designators ) {
     50SingleInit::SingleInit( Expression *v, bool maybeConstructed ) : Initializer( maybeConstructed ), value ( v ) {
    3851}
    3952
    4053SingleInit::SingleInit( const SingleInit &other ) : Initializer(other), value ( maybeClone( other.value ) ) {
    41         cloneAll(other.designators, designators );
    4254}
    4355
    4456SingleInit::~SingleInit() {
    4557        delete value;
    46         deleteAll(designators);
    4758}
    4859
    49 void SingleInit::print( std::ostream &os, int indent ) {
    50         os << std::endl << std::string(indent, ' ' ) << "Simple Initializer: " << std::endl;
     60void SingleInit::print( std::ostream &os, int indent ) const {
     61        os << std::string(indent, ' ' ) << "Simple Initializer: " << std::endl;
    5162        os << std::string(indent+4, ' ' );
    5263        value->print( os, indent+4 );
    53 
    54         if ( ! designators.empty() ) {
    55                 os << std::endl << std::string(indent + 2, ' ' ) << "designated by: " << std::endl;
    56                 for ( std::list < Expression * >::iterator i = designators.begin(); i != designators.end(); i++ ) {
    57                         os << std::string(indent + 4, ' ' );
    58                         ( *i )->print(os, indent + 4 );
    59                 }
    60         } // if
    6164}
    6265
    63 ListInit::ListInit( const std::list<Initializer*> &_initializers, const std::list<Expression *> &_designators, bool maybeConstructed )
    64         : Initializer( maybeConstructed ), initializers( _initializers ), designators( _designators ) {
     66
     67ListInit::ListInit( const std::list<Initializer*> &inits, const std::list<Designation *> &des, bool maybeConstructed )
     68        : Initializer( maybeConstructed ), initializers( inits ), designations( des ) {
     69                // handle the common case where a ListInit is created without designations by making a list of empty designations with the same length as the initializer
     70                if ( designations.empty() ) {
     71                        for ( auto & i : initializers ) {
     72                                (void)i;
     73                                designations.push_back( new Designation( {} ) );
     74                        }
     75                }
     76                assertf( initializers.size() == designations.size(), "Created ListInit with mismatching initializers (%d) and designations (%d)", initializers.size(), designations.size() );
    6577}
    6678
    6779ListInit::ListInit( const ListInit & other ) : Initializer( other ) {
    6880        cloneAll( other.initializers, initializers );
    69         cloneAll( other.designators, designators );
     81        cloneAll( other.designations, designations );
    7082}
    71 
    7283
    7384ListInit::~ListInit() {
    7485        deleteAll( initializers );
    75         deleteAll( designators );
     86        deleteAll( designations );
    7687}
    7788
    78 void ListInit::print( std::ostream &os, int indent ) {
    79         os << std::endl << std::string(indent, ' ') << "Compound initializer:  ";
    80         if ( ! designators.empty() ) {
    81                 os << std::string(indent + 2, ' ' ) << "designated by: [";
    82                 for ( std::list < Expression * >::iterator i = designators.begin();
    83                           i != designators.end(); i++ ) {
    84                         ( *i )->print(os, indent + 4 );
    85                 } // for
     89void ListInit::print( std::ostream &os, int indent ) const {
     90        os << std::string(indent, ' ') << "Compound initializer:  " << std::endl;
     91        for ( Designation * d : designations ) {
     92                d->print( os, indent + 2 );
     93        }
    8694
    87                 os << std::string(indent + 2, ' ' ) << "]";
    88         } // if
    89 
    90         for ( std::list<Initializer *>::iterator i = initializers.begin(); i != initializers.end(); i++ )
    91                 (*i)->print( os, indent + 2 );
     95        for ( const Initializer * init : initializers ) {
     96                init->print( os, indent + 2 );
     97                os << std::endl;
     98        }
    9299}
    93100
     
    103110}
    104111
    105 void ConstructorInit::print( std::ostream &os, int indent ) {
     112void ConstructorInit::print( std::ostream &os, int indent ) const {
    106113        os << std::endl << std::string(indent, ' ') << "Constructor initializer: " << std::endl;
    107114        if ( ctor ) {
     
    124131}
    125132
    126 std::ostream & operator<<( std::ostream & out, Initializer * init ) {
    127         init->print( out );
     133std::ostream & operator<<( std::ostream & out, const Initializer * init ) {
     134        if ( init ) {
     135                init->print( out );
     136        } else {
     137                out << "nullptr";
     138        }
     139        return out;
     140}
     141
     142std::ostream & operator<<( std::ostream & out, const Designation * des ) {
     143        if ( des ) {
     144                des->print( out );
     145        } else {
     146                out << "nullptr";
     147        }
    128148        return out;
    129149}
  • src/SynTree/Initializer.h

    rfea3faa rb826e6b  
    2525#include "Visitor.h"
    2626
    27 const std::list<Expression*> noDesignators;
     27// Designation: list of designator (NameExpr, VariableExpr, and ConstantExpr) expressions that specify an object being initialized.
     28class Designation : public BaseSyntaxNode {
     29public:
     30        Designation( const std::list< Expression * > & designators );
     31        Designation( const Designation & other );
     32        virtual ~Designation();
     33
     34        std::list< Expression * > & get_designators() { return designators; }
     35
     36        virtual Designation * clone() const { return new Designation( *this ); };
     37        virtual void accept( Visitor &v ) { v.visit( this ); }
     38        virtual Designation * acceptMutator( Mutator &m ) { return m.mutate( this ); }
     39        virtual void print( std::ostream &os, int indent = 0 ) const;
     40private:
     41        std::list< Expression * > designators;
     42};
     43
     44const std::list<Designation *> noDesignators;
    2845
    2946// Initializer: base class for object initializers (provide default values)
    3047class Initializer : public BaseSyntaxNode {
    3148  public:
    32         //      Initializer( std::string _name = std::string(""), int _pos = 0 );
    3349        Initializer( bool maybeConstructed );
    3450        Initializer( const Initializer & other );
    3551        virtual ~Initializer();
    36 
    37         static std::string designator_name( Expression *designator );
    38 
    39         //      void set_name( std::string newValue ) { name = newValue; }
    40         //      std::string get_name() const { return name; }
    41 
    42         //      void set_pos( int newValue ) { pos = newValue; }
    43         //      int get_pos() const { return pos; }
    44         virtual void set_designators( std::list<Expression *> & ) { assert(false); }
    45         virtual std::list<Expression *> &get_designators() {
    46                 assert(false);
    47                 std::list<Expression *> *ret = 0; return *ret;  // never reached
    48         }
    4952
    5053        bool get_maybeConstructed() { return maybeConstructed; }
     
    5356        virtual void accept( Visitor &v ) = 0;
    5457        virtual Initializer *acceptMutator( Mutator &m ) = 0;
    55         virtual void print( std::ostream &os, int indent = 0 ) = 0;
     58        virtual void print( std::ostream &os, int indent = 0 ) const = 0;
    5659  private:
    57         //      std::string name;
    58         //      int pos;
    5960        bool maybeConstructed;
    6061};
     
    6364class SingleInit : public Initializer {
    6465  public:
    65         SingleInit( Expression *value, const std::list< Expression *> &designators = std::list< Expression * >(), bool maybeConstructed = false );
     66        SingleInit( Expression *value, bool maybeConstructed = false );
    6667        SingleInit( const SingleInit &other );
    6768        virtual ~SingleInit();
     
    7071        void set_value( Expression *newValue ) { value = newValue; }
    7172
    72         std::list<Expression *> &get_designators() { return designators; }
    73         void set_designators( std::list<Expression *> &newValue ) { designators = newValue; }
    74 
    7573        virtual SingleInit *clone() const { return new SingleInit( *this); }
    7674        virtual void accept( Visitor &v ) { v.visit( this ); }
    7775        virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    78         virtual void print( std::ostream &os, int indent = 0 );
     76        virtual void print( std::ostream &os, int indent = 0 ) const;
    7977  private:
    8078        //Constant *value;
    8179        Expression *value;      // has to be a compile-time constant
    82         std::list< Expression * > designators;
    8380};
    8481
     
    8885  public:
    8986        ListInit( const std::list<Initializer*> &initializers,
    90                           const std::list<Expression *> &designators = std::list< Expression * >(), bool maybeConstructed = false );
     87                          const std::list<Designation *> &designators = {}, bool maybeConstructed = false );
    9188        ListInit( const ListInit & other );
    9289        virtual ~ListInit();
    9390
    94         void set_designators( std::list<Expression *> &newValue ) { designators = newValue; }
    95         std::list<Expression *> &get_designators() { return designators; }
    96         void set_initializers( std::list<Initializer*> &newValue ) { initializers = newValue; }
    97         std::list<Initializer*> &get_initializers() { return initializers; }
     91        std::list<Designation *> & get_designations() { return designations; }
     92        std::list<Initializer *> & get_initializers() { return initializers; }
    9893
    9994        typedef std::list<Initializer*>::iterator iterator;
     95        typedef std::list<Initializer*>::const_iterator const_iterator;
    10096        iterator begin() { return initializers.begin(); }
    10197        iterator end() { return initializers.end(); }
     98        const_iterator begin() const { return initializers.begin(); }
     99        const_iterator end() const { return initializers.end(); }
    102100
    103101        virtual ListInit *clone() const { return new ListInit( *this ); }
    104102        virtual void accept( Visitor &v ) { v.visit( this ); }
    105103        virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    106         virtual void print( std::ostream &os, int indent = 0 );
     104        virtual void print( std::ostream &os, int indent = 0 ) const;
    107105  private:
    108         std::list<Initializer*> initializers;  // order *is* important
    109         std::list<Expression *> designators;
     106        std::list<Initializer *> initializers;  // order *is* important
     107        std::list<Designation *> designations;  // order/length is consistent with initializers
    110108};
    111109
     
    130128        virtual void accept( Visitor &v ) { v.visit( this ); }
    131129        virtual Initializer *acceptMutator( Mutator &m ) { return m.mutate( this ); }
    132         virtual void print( std::ostream &os, int indent = 0 );
     130        virtual void print( std::ostream &os, int indent = 0 ) const;
    133131
    134132  private:
     
    140138};
    141139
    142 std::ostream & operator<<( std::ostream & out, Initializer * init );
     140std::ostream & operator<<( std::ostream & out, const Initializer * init );
     141std::ostream & operator<<( std::ostream & out, const Designation * des );
    143142
    144143#endif // INITIALIZER_H
  • src/SynTree/Mutator.cc

    rfea3faa rb826e6b  
    433433}
    434434
     435Expression *Mutator::mutate( UntypedInitExpr * initExpr ) {
     436        initExpr->set_env( maybeMutate( initExpr->get_env(), *this ) );
     437        initExpr->set_result( maybeMutate( initExpr->get_result(), *this ) );
     438        initExpr->set_expr( maybeMutate( initExpr->get_expr(), *this ) );
     439        // not currently mutating initAlts, but this doesn't matter since this node is only used in the resolver.
     440        return initExpr;
     441}
     442
     443Expression *Mutator::mutate( InitExpr * initExpr ) {
     444        initExpr->set_env( maybeMutate( initExpr->get_env(), *this ) );
     445        initExpr->set_result( maybeMutate( initExpr->get_result(), *this ) );
     446        initExpr->set_expr( maybeMutate( initExpr->get_expr(), *this ) );
     447        initExpr->set_designation( maybeMutate( initExpr->get_designation(), *this ) );
     448        return initExpr;
     449}
     450
    435451
    436452Type *Mutator::mutate( VoidType *voidType ) {
     
    499515        mutateAll( tupleType->get_forall(), *this );
    500516        mutateAll( tupleType->get_types(), *this );
     517        mutateAll( tupleType->get_members(), *this );
    501518        return tupleType;
    502519}
     
    535552
    536553
     554Designation *Mutator::mutate( Designation * designation ) {
     555        mutateAll( designation->get_designators(), *this );
     556        return designation;
     557}
     558
    537559Initializer *Mutator::mutate( SingleInit *singleInit ) {
    538560        singleInit->set_value( singleInit->get_value()->acceptMutator( *this ) );
     
    541563
    542564Initializer *Mutator::mutate( ListInit *listInit ) {
    543         mutateAll( listInit->get_designators(), *this );
     565        mutateAll( listInit->get_designations(), *this );
    544566        mutateAll( listInit->get_initializers(), *this );
    545567        return listInit;
  • src/SynTree/Mutator.h

    rfea3faa rb826e6b  
    8585        virtual Expression* mutate( StmtExpr * stmtExpr );
    8686        virtual Expression* mutate( UniqueExpr * uniqueExpr );
     87        virtual Expression* mutate( UntypedInitExpr * initExpr );
     88        virtual Expression* mutate( InitExpr * initExpr );
    8789
    8890        virtual Type* mutate( VoidType *basicType );
     
    103105        virtual Type* mutate( OneType *oneType );
    104106
     107        virtual Designation* mutate( Designation *designation );
    105108        virtual Initializer* mutate( SingleInit *singleInit );
    106109        virtual Initializer* mutate( ListInit *listInit );
  • src/SynTree/SynTree.h

    rfea3faa rb826e6b  
    9393class StmtExpr;
    9494class UniqueExpr;
     95class UntypedInitExpr;
     96class InitExpr;
    9597
    9698class Type;
     
    113115class OneType;
    114116
     117class Designation;
    115118class Initializer;
    116119class SingleInit;
  • src/SynTree/TupleType.cc

    rfea3faa rb826e6b  
    1414//
    1515
     16#include "Declaration.h"
     17#include "Initializer.h"
    1618#include "Type.h"
    1719#include "Common/utility.h"
     20#include "Parser/LinkageSpec.h"
    1821
    1922TupleType::TupleType( const Type::Qualifiers &tq, const std::list< Type * > & types, const std::list< Attribute * > & attributes ) : Type( tq, attributes ), types( types ) {
     23        for ( Type * t : *this ) {
     24                // xxx - this is very awkward. TupleTypes should contain objects so that members can be named, but if they don't have an initializer node then
     25                // they end up getting constructors, which end up being inserted causing problems. This happens because the object decls have to be visited so that
     26                // their types are kept in sync with the types list here. Ultimately, the types list here should be eliminated and perhaps replaced with a list-view
     27                // of the object types list, but I digress. The temporary solution here is to make a ListInit with maybeConstructed = false, that way even when the
     28                // object is visited, it is never constructed. Ultimately, a better solution might be either:
     29                // a) to separate TupleType from its declarations, into TupleDecl and Tuple{Inst?}Type, ala StructDecl and StructInstType
     30                // b) separate initializer nodes better, e.g. add a MaybeConstructed node that is replaced by genInit, rather than what currently exists in a bool
     31                members.push_back( new ObjectDecl( "" , Type::StorageClasses(), LinkageSpec::Cforall, nullptr, t->clone(), new ListInit( {}, {}, false ) ) );
     32        }
    2033}
    2134
    2235TupleType::TupleType( const TupleType& other ) : Type( other ) {
    2336        cloneAll( other.types, types );
     37        cloneAll( other.members, members );
    2438}
    2539
    2640TupleType::~TupleType() {
    2741        deleteAll( types );
     42        deleteAll( members );
    2843}
    2944
  • src/SynTree/Type.h

    rfea3faa rb826e6b  
    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 : Tus Jul 18 10:06:00 2017
     13// Update Count     : 150
    1414//
    1515
     
    172172};
    173173
    174 extern Type::Qualifiers emptyQualifiers;                                // no qualifiers on constants
     174extern Type::Qualifiers noQualifiers;                           // no qualifiers on constants
    175175
    176176class VoidType : public Type {
     
    481481class TupleType : public Type {
    482482  public:
    483         TupleType( const Type::Qualifiers & tq, const std::list< Type * > & types = std::list< Type * >(), const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
     483        TupleType( const Type::Qualifiers & tq, const std::list< Type * > & types, const std::list< Attribute * > & attributes = std::list< Attribute * >()  );
    484484        TupleType( const TupleType& );
    485485        virtual ~TupleType();
     
    488488        typedef value_type::iterator iterator;
    489489
    490         std::list<Type*>& get_types() { return types; }
     490        std::list<Type *> & get_types() { return types; }
    491491        virtual unsigned size() const { return types.size(); };
     492
     493        // For now, this is entirely synthetic -- tuple types always have unnamed members.
     494        // Eventually, we may allow named tuples, in which case members should subsume types
     495        std::list<Declaration *> & get_members() { return members; }
    492496
    493497        iterator begin() { return types.begin(); }
     
    506510        virtual void print( std::ostream & os, int indent = 0 ) const;
    507511  private:
    508         std::list<Type*> types;
     512        std::list<Type *> types;
     513        std::list<Declaration *> members;
    509514};
    510515
  • src/SynTree/VarExprReplacer.cc

    rfea3faa rb826e6b  
    1414//
    1515
     16#include "Declaration.h"
    1617#include "Expression.h"
    1718#include "VarExprReplacer.h"
    1819
    19 VarExprReplacer::VarExprReplacer( const DeclMap & declMap ) : declMap( declMap ) {}
     20VarExprReplacer::VarExprReplacer( const DeclMap & declMap, bool debug ) : declMap( declMap ), debug( debug ) {}
    2021
    2122// replace variable with new node from decl map
    2223void VarExprReplacer::visit( VariableExpr * varExpr ) {
    23   // xxx - assertions and parameters aren't accounted for in this... (i.e. they aren't inserted into the map when it's made, only DeclStmts are)
    24   if ( declMap.count( varExpr->get_var() ) ) {
    25     varExpr->set_var( declMap.at( varExpr->get_var() ) );
    26   }
     24        // xxx - assertions and parameters aren't accounted for in this... (i.e. they aren't inserted into the map when it's made, only DeclStmts are)
     25        if ( declMap.count( varExpr->get_var() ) ) {
     26                if ( debug ) {
     27                        std::cerr << "replacing variable reference: " << (void*)varExpr->get_var() << " " << varExpr->get_var() << " with " << (void*)declMap.at( varExpr->get_var() ) << " " << declMap.at( varExpr->get_var() ) << std::endl;
     28                }
     29                varExpr->set_var( declMap.at( varExpr->get_var() ) );
     30        }
    2731}
  • src/SynTree/VarExprReplacer.h

    rfea3faa rb826e6b  
    2727private:
    2828        const DeclMap & declMap;
     29  bool debug;
    2930public:
    30         VarExprReplacer( const DeclMap & declMap );
     31        VarExprReplacer( const DeclMap & declMap, bool debug = false );
    3132
    3233        // replace variable with new node from decl map
  • src/SynTree/Visitor.cc

    rfea3faa rb826e6b  
    340340}
    341341
     342void Visitor::visit( UntypedInitExpr * initExpr ) {
     343        maybeAccept( initExpr->get_result(), *this );
     344        maybeAccept( initExpr->get_expr(), *this );
     345        // not currently visiting initAlts, but this doesn't matter since this node is only used in the resolver.
     346}
     347
     348void Visitor::visit( InitExpr * initExpr ) {
     349        maybeAccept( initExpr->get_result(), *this );
     350        maybeAccept( initExpr->get_expr(), *this );
     351        maybeAccept( initExpr->get_designation(), *this );
     352}
     353
    342354
    343355void Visitor::visit( VoidType *voidType ) {
     
    395407        acceptAll( tupleType->get_forall(), *this );
    396408        acceptAll( tupleType->get_types(), *this );
     409        acceptAll( tupleType->get_members(), *this );
    397410}
    398411
     
    424437}
    425438
     439void Visitor::visit( Designation * designation ) {
     440        acceptAll( designation->get_designators(), *this );
     441}
    426442
    427443void Visitor::visit( SingleInit *singleInit ) {
     
    430446
    431447void Visitor::visit( ListInit *listInit ) {
    432         acceptAll( listInit->get_designators(), *this );
     448        acceptAll( listInit->get_designations(), *this );
    433449        acceptAll( listInit->get_initializers(), *this );
    434450}
  • src/SynTree/Visitor.h

    rfea3faa rb826e6b  
    8888        virtual void visit( StmtExpr * stmtExpr );
    8989        virtual void visit( UniqueExpr * uniqueExpr );
     90        virtual void visit( UntypedInitExpr * initExpr );
     91        virtual void visit( InitExpr * initExpr );
    9092
    9193        virtual void visit( VoidType *basicType );
     
    106108        virtual void visit( OneType *oneType );
    107109
     110        virtual void visit( Designation *designation );
    108111        virtual void visit( SingleInit *singleInit );
    109112        virtual void visit( ListInit *listInit );
  • src/Tuples/TupleExpansion.cc

    rfea3faa rb826e6b  
    192192                        }
    193193                        ObjectDecl * finished = new ObjectDecl( toString( "_unq", id, "_finished_" ), Type::StorageClasses(), LinkageSpec::Cforall, nullptr, new BasicType( Type::Qualifiers(), BasicType::Bool ),
    194                                                                                                         new SingleInit( new ConstantExpr( Constant::from_int( 0 ) ), noDesignators ) );
     194                                                                                                        new SingleInit( new ConstantExpr( Constant::from_int( 0 ) ) ) );
    195195                        addDeclaration( finished );
    196196                        // (finished ? _unq_expr_N : (_unq_expr_N = <unqExpr->get_expr()>, finished = 1, _unq_expr_N))
     
    310310        Type * makeTupleType( const std::list< Expression * > & exprs ) {
    311311                // produce the TupleType which aggregates the types of the exprs
    312                 TupleType *tupleType = new TupleType( Type::Qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Lvalue | Type::Atomic | Type::Mutex ) );
    313                 Type::Qualifiers &qualifiers = tupleType->get_qualifiers();
     312                std::list< Type * > types;
     313                Type::Qualifiers qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Lvalue | Type::Atomic | Type::Mutex );
    314314                for ( Expression * expr : exprs ) {
    315315                        assert( expr->get_result() );
    316316                        if ( expr->get_result()->isVoid() ) {
    317317                                // if the type of any expr is void, the type of the entire tuple is void
    318                                 delete tupleType;
    319318                                return new VoidType( Type::Qualifiers() );
    320319                        }
    321320                        Type * type = expr->get_result()->clone();
    322                         tupleType->get_types().push_back( type );
     321                        types.push_back( type );
    323322                        // the qualifiers on the tuple type are the qualifiers that exist on all component types
    324323                        qualifiers &= type->get_qualifiers();
    325324                } // for
    326325                if ( exprs.empty() ) qualifiers = Type::Qualifiers();
    327                 return tupleType;
     326                return new TupleType( qualifiers, types );
    328327        }
    329328
  • src/benchmark/CorCtxSwitch.c

    rfea3faa rb826e6b  
    3131
    3232        StartTime = Time();
    33         // for ( volatile unsigned int i = 0; i < NoOfTimes; i += 1 ) {
    34         //      resume( this_coroutine() );
    35         //      // resume( &s );       
    36         // }
    3733        resumer( &s, NoOfTimes );
    3834        EndTime = Time();
  • src/benchmark/Makefile.am

    rfea3faa rb826e6b  
    2020CC = @CFA_BINDIR@/@CFA_NAME@
    2121
    22 noinst_PROGRAMS = bench ctxswitch-coroutine ctxswitch-thread
     22noinst_PROGRAMS = bench$(EXEEXT) ctxswitch-coroutine$(EXEEXT) ctxswitch-thread$(EXEEXT) sched-int$(EXEEXT) monitor$(EXEEXT) csv-data$(EXEEXT)
    2323
    24 bench :
     24bench$(EXEEXT) :
    2525        @for ccflags in "-debug" "-nodebug"; do \
    2626                echo ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -lrt bench.c;\
     
    3030        rm -f ./a.out ;
    3131
    32 ctxswitch-coroutine:
     32ctxswitch-coroutine$(EXEEXT):
    3333        ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 CorCtxSwitch.c
    3434        @for number in 1 2 3 4 5 6 7 8 9 10; do \
     
    3737        @rm -f ./a.out
    3838
    39 ctxswitch-thread:
     39ctxswitch-thread$(EXEEXT):
    4040        ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 ThrdCtxSwitch.c
    4141        @for number in 1 2 3 4 5 6 7 8 9 10; do \
     
    4444        @rm -f ./a.out
    4545
    46 sched-int:
     46sched-int$(EXEEXT):
    4747        ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 SchedInt.c
    4848        @for number in 1 2 3 4 5 6 7 8 9 10; do \
     
    5151        @rm -f ./a.out
    5252
    53 monitor:
     53monitor$(EXEEXT):
    5454        ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 Monitor.c
    5555        @for number in 1 2 3 4 5 6 7 8 9 10; do \
     
    5858        @rm -f ./a.out
    5959
    60 csv-data:
     60csv-data$(EXEEXT):
    6161        @${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -quiet -DN=10000000 csv-data.c
    6262        @./a.out
  • src/benchmark/Makefile.in

    rfea3faa rb826e6b  
    1 # Makefile.in generated by automake 1.11.3 from Makefile.am.
     1# Makefile.in generated by automake 1.15 from Makefile.am.
    22# @configure_input@
    33
    4 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
    5 # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
    6 # Foundation, Inc.
     4# Copyright (C) 1994-2014 Free Software Foundation, Inc.
     5
    76# This Makefile.in is free software; the Free Software Foundation
    87# gives unlimited permission to copy and/or distribute it,
     
    2019
    2120VPATH = @srcdir@
     21am__is_gnu_make = { \
     22  if test -z '$(MAKELEVEL)'; then \
     23    false; \
     24  elif test -n '$(MAKE_HOST)'; then \
     25    true; \
     26  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
     27    true; \
     28  else \
     29    false; \
     30  fi; \
     31}
     32am__make_running_with_option = \
     33  case $${target_option-} in \
     34      ?) ;; \
     35      *) echo "am__make_running_with_option: internal error: invalid" \
     36              "target option '$${target_option-}' specified" >&2; \
     37         exit 1;; \
     38  esac; \
     39  has_opt=no; \
     40  sane_makeflags=$$MAKEFLAGS; \
     41  if $(am__is_gnu_make); then \
     42    sane_makeflags=$$MFLAGS; \
     43  else \
     44    case $$MAKEFLAGS in \
     45      *\\[\ \   ]*) \
     46        bs=\\; \
     47        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
     48          | sed "s/$$bs$$bs[$$bs $$bs   ]*//g"`;; \
     49    esac; \
     50  fi; \
     51  skip_next=no; \
     52  strip_trailopt () \
     53  { \
     54    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
     55  }; \
     56  for flg in $$sane_makeflags; do \
     57    test $$skip_next = yes && { skip_next=no; continue; }; \
     58    case $$flg in \
     59      *=*|--*) continue;; \
     60        -*I) strip_trailopt 'I'; skip_next=yes;; \
     61      -*I?*) strip_trailopt 'I';; \
     62        -*O) strip_trailopt 'O'; skip_next=yes;; \
     63      -*O?*) strip_trailopt 'O';; \
     64        -*l) strip_trailopt 'l'; skip_next=yes;; \
     65      -*l?*) strip_trailopt 'l';; \
     66      -[dEDm]) skip_next=yes;; \
     67      -[JT]) skip_next=yes;; \
     68    esac; \
     69    case $$flg in \
     70      *$$target_option*) has_opt=yes; break;; \
     71    esac; \
     72  done; \
     73  test $$has_opt = yes
     74am__make_dryrun = (target_option=n; $(am__make_running_with_option))
     75am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
    2276pkgdatadir = $(datadir)/@PACKAGE@
    2377pkgincludedir = $(includedir)/@PACKAGE@
     
    3892build_triplet = @build@
    3993host_triplet = @host@
    40 noinst_PROGRAMS = bench$(EXEEXT) ctxswitch-coroutine$(EXEEXT) \
    41         ctxswitch-thread$(EXEEXT)
    4294subdir = src/benchmark
    43 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
    4495ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
    4596am__aclocal_m4_deps = $(top_srcdir)/configure.ac
    4697am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
    4798        $(ACLOCAL_M4)
     99DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
    48100mkinstalldirs = $(install_sh) -d
    49101CONFIG_HEADER = $(top_builddir)/config.h
     
    54106bench_OBJECTS = bench.$(OBJEXT)
    55107bench_LDADD = $(LDADD)
     108csv_data_SOURCES = csv-data.c
     109csv_data_OBJECTS = csv-data.$(OBJEXT)
     110csv_data_LDADD = $(LDADD)
    56111ctxswitch_coroutine_SOURCES = ctxswitch-coroutine.c
    57112ctxswitch_coroutine_OBJECTS = ctxswitch-coroutine.$(OBJEXT)
     
    60115ctxswitch_thread_OBJECTS = ctxswitch-thread.$(OBJEXT)
    61116ctxswitch_thread_LDADD = $(LDADD)
     117monitor_SOURCES = monitor.c
     118monitor_OBJECTS = monitor.$(OBJEXT)
     119monitor_LDADD = $(LDADD)
     120sched_int_SOURCES = sched-int.c
     121sched_int_OBJECTS = sched-int.$(OBJEXT)
     122sched_int_LDADD = $(LDADD)
     123AM_V_P = $(am__v_P_@AM_V@)
     124am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
     125am__v_P_0 = false
     126am__v_P_1 = :
     127AM_V_GEN = $(am__v_GEN_@AM_V@)
     128am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
     129am__v_GEN_0 = @echo "  GEN     " $@;
     130am__v_GEN_1 =
     131AM_V_at = $(am__v_at_@AM_V@)
     132am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
     133am__v_at_0 = @
     134am__v_at_1 =
    62135DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
    63136depcomp = $(SHELL) $(top_srcdir)/automake/depcomp
     
    68141AM_V_CC = $(am__v_CC_@AM_V@)
    69142am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
    70 am__v_CC_0 = @echo "  CC    " $@;
    71 AM_V_at = $(am__v_at_@AM_V@)
    72 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
    73 am__v_at_0 = @
     143am__v_CC_0 = @echo "  CC      " $@;
     144am__v_CC_1 =
    74145CCLD = $(CC)
    75146LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
    76147AM_V_CCLD = $(am__v_CCLD_@AM_V@)
    77148am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
    78 am__v_CCLD_0 = @echo "  CCLD  " $@;
    79 AM_V_GEN = $(am__v_GEN_@AM_V@)
    80 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
    81 am__v_GEN_0 = @echo "  GEN   " $@;
    82 SOURCES = bench.c ctxswitch-coroutine.c ctxswitch-thread.c
    83 DIST_SOURCES = bench.c ctxswitch-coroutine.c ctxswitch-thread.c
     149am__v_CCLD_0 = @echo "  CCLD    " $@;
     150am__v_CCLD_1 =
     151SOURCES = bench.c csv-data.c ctxswitch-coroutine.c ctxswitch-thread.c \
     152        monitor.c sched-int.c
     153DIST_SOURCES = bench.c csv-data.c ctxswitch-coroutine.c \
     154        ctxswitch-thread.c monitor.c sched-int.c
     155am__can_run_installinfo = \
     156  case $$AM_UPDATE_INFO_DIR in \
     157    n|no|NO) false;; \
     158    *) (install-info --version) >/dev/null 2>&1;; \
     159  esac
     160am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
     161# Read a list of newline-separated strings from the standard input,
     162# and print each of them once, without duplicates.  Input order is
     163# *not* preserved.
     164am__uniquify_input = $(AWK) '\
     165  BEGIN { nonempty = 0; } \
     166  { items[$$0] = 1; nonempty = 1; } \
     167  END { if (nonempty) { for (i in items) print i; }; } \
     168'
     169# Make sure the list of sources is unique.  This is necessary because,
     170# e.g., the same source file might be shared among _SOURCES variables
     171# for different programs/libraries.
     172am__define_uniq_tagged_files = \
     173  list='$(am__tagged_files)'; \
     174  unique=`for i in $$list; do \
     175    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
     176  done | $(am__uniquify_input)`
    84177ETAGS = etags
    85178CTAGS = ctags
     179am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/automake/depcomp
    86180DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
    87181ACLOCAL = @ACLOCAL@
     
    198292program_transform_name = @program_transform_name@
    199293psdir = @psdir@
     294runstatedir = @runstatedir@
    200295sbindir = @sbindir@
    201296sharedstatedir = @sharedstatedir@
     
    207302top_srcdir = @top_srcdir@
    208303AM_CFLAGS = -g -Wall -Wno-unused-function -O2
     304noinst_PROGRAMS = bench$(EXEEXT) ctxswitch-coroutine$(EXEEXT) ctxswitch-thread$(EXEEXT) sched-int$(EXEEXT) monitor$(EXEEXT) csv-data$(EXEEXT)
    209305all: all-am
    210306
     
    223319        $(am__cd) $(top_srcdir) && \
    224320          $(AUTOMAKE) --foreign src/benchmark/Makefile
    225 .PRECIOUS: Makefile
    226321Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
    227322        @case '$?' in \
     
    252347
    253348@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bench.Po@am__quote@
     349@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csv-data.Po@am__quote@
    254350@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctxswitch-coroutine.Po@am__quote@
    255351@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctxswitch-thread.Po@am__quote@
     352@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/monitor.Po@am__quote@
     353@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sched-int.Po@am__quote@
    256354
    257355.c.o:
    258 @am__fastdepCC_TRUE@    $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
    259 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
     356@am__fastdepCC_TRUE@    $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
     357@am__fastdepCC_TRUE@    $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
     358@am__fastdepCC_TRUE@    $(am__mv) $$depbase.Tpo $$depbase.Po
    260359@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
    261360@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    262 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
     361@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
    263362
    264363.c.obj:
    265 @am__fastdepCC_TRUE@    $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
    266 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
     364@am__fastdepCC_TRUE@    $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
     365@am__fastdepCC_TRUE@    $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
     366@am__fastdepCC_TRUE@    $(am__mv) $$depbase.Tpo $$depbase.Po
    267367@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
    268368@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    269 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
    270 
    271 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
    272         list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
    273         unique=`for i in $$list; do \
    274             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    275           done | \
    276           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    277               END { if (nonempty) { for (i in files) print i; }; }'`; \
    278         mkid -fID $$unique
    279 tags: TAGS
    280 
    281 TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
    282                 $(TAGS_FILES) $(LISP)
     369@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
     370
     371ID: $(am__tagged_files)
     372        $(am__define_uniq_tagged_files); mkid -fID $$unique
     373tags: tags-am
     374TAGS: tags
     375
     376tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
    283377        set x; \
    284378        here=`pwd`; \
    285         list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
    286         unique=`for i in $$list; do \
    287             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    288           done | \
    289           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    290               END { if (nonempty) { for (i in files) print i; }; }'`; \
     379        $(am__define_uniq_tagged_files); \
    291380        shift; \
    292381        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
     
    300389          fi; \
    301390        fi
    302 ctags: CTAGS
    303 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
    304                 $(TAGS_FILES) $(LISP)
    305         list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
    306         unique=`for i in $$list; do \
    307             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    308           done | \
    309           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    310               END { if (nonempty) { for (i in files) print i; }; }'`; \
     391ctags: ctags-am
     392
     393CTAGS: ctags
     394ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
     395        $(am__define_uniq_tagged_files); \
    311396        test -z "$(CTAGS_ARGS)$$unique" \
    312397          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
     
    317402          && $(am__cd) $(top_srcdir) \
    318403          && gtags -i $(GTAGS_ARGS) "$$here"
     404cscopelist: cscopelist-am
     405
     406cscopelist-am: $(am__tagged_files)
     407        list='$(am__tagged_files)'; \
     408        case "$(srcdir)" in \
     409          [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
     410          *) sdir=$(subdir)/$(srcdir) ;; \
     411        esac; \
     412        for i in $$list; do \
     413          if test -f "$$i"; then \
     414            echo "$(subdir)/$$i"; \
     415          else \
     416            echo "$$sdir/$$i"; \
     417          fi; \
     418        done >> $(top_builddir)/cscope.files
    319419
    320420distclean-tags:
     
    456556.MAKE: install-am install-strip
    457557
    458 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
    459         clean-noinstPROGRAMS ctags distclean distclean-compile \
    460         distclean-generic distclean-tags distdir dvi dvi-am html \
    461         html-am info info-am install install-am install-data \
    462         install-data-am install-dvi install-dvi-am install-exec \
    463         install-exec-am install-html install-html-am install-info \
    464         install-info-am install-man install-pdf install-pdf-am \
    465         install-ps install-ps-am install-strip installcheck \
    466         installcheck-am installdirs maintainer-clean \
     558.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
     559        clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
     560        distclean-compile distclean-generic distclean-tags distdir dvi \
     561        dvi-am html html-am info info-am install install-am \
     562        install-data install-data-am install-dvi install-dvi-am \
     563        install-exec install-exec-am install-html install-html-am \
     564        install-info install-info-am install-man install-pdf \
     565        install-pdf-am install-ps install-ps-am install-strip \
     566        installcheck installcheck-am installdirs maintainer-clean \
    467567        maintainer-clean-generic mostlyclean mostlyclean-compile \
    468         mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
     568        mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
    469569        uninstall-am
    470570
    471 
    472 bench :
     571.PRECIOUS: Makefile
     572
     573
     574bench$(EXEEXT) :
    473575        @for ccflags in "-debug" "-nodebug"; do \
    474576                echo ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -lrt bench.c;\
     
    478580        rm -f ./a.out ;
    479581
    480 ctxswitch-coroutine:
     582ctxswitch-coroutine$(EXEEXT):
    481583        ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 CorCtxSwitch.c
    482584        @for number in 1 2 3 4 5 6 7 8 9 10; do \
     
    485587        @rm -f ./a.out
    486588
    487 ctxswitch-thread:
     589ctxswitch-thread$(EXEEXT):
    488590        ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 ThrdCtxSwitch.c
    489591        @for number in 1 2 3 4 5 6 7 8 9 10; do \
     
    492594        @rm -f ./a.out
    493595
    494 sched-int:
     596sched-int$(EXEEXT):
    495597        ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 SchedInt.c
    496598        @for number in 1 2 3 4 5 6 7 8 9 10; do \
     
    499601        @rm -f ./a.out
    500602
    501 monitor:
     603monitor$(EXEEXT):
    502604        ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 Monitor.c
    503605        @for number in 1 2 3 4 5 6 7 8 9 10; do \
     
    506608        @rm -f ./a.out
    507609
    508 csv-data:
     610csv-data$(EXEEXT):
    509611        @${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -quiet -DN=10000000 csv-data.c
    510612        @./a.out
  • src/benchmark/bench.h

    rfea3faa rb826e6b  
    2626#define N 10000000
    2727#endif
     28
     29unsigned int default_preemption() {
     30        return 0;
     31}
  • src/benchmark/create_pthrd.c

    rfea3faa rb826e6b  
    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++) {
    19                 pthread_attr_t attr;
    20                 if (pthread_attr_init(&attr) < 0) {
     19                pthread_t thread;
     20                if (pthread_create(&thread, NULL, foo, NULL) < 0) {
     21                        perror( "failure" );
    2122                        return 1;
    2223                }
    23                 if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) < 0) {
    24                         return 1;
    25                 }
    26                 pthread_t thread;
    27                 if (pthread_create(&thread, &attr, foo, NULL) < 0) {
     24
     25                if (pthread_join( thread, NULL) < 0) {
     26                        perror( "failure" );
    2827                        return 1;
    2928                }
    3029        }
    31         pthread_exit(NULL);
    32         return 0;
     30        printf("finish\n");
    3331}
  • src/benchmark/csv-data.c

    rfea3faa rb826e6b  
    2525}
    2626
    27 #ifndef N
    28 #define N 100000000
    29 #endif
    30 
    3127//-----------------------------------------------------------------------------
    3228// coroutine context switch
     
    3834
    3935        StartTime = Time();
    40         // for ( volatile unsigned int i = 0; i < NoOfTimes; i += 1 ) {
    41         //      resume( this_coroutine() );
    42         //      // resume( &s );
    43         // }
    4436        resumer( &s, NoOfTimes );
    4537        EndTime = Time();
     
    10496mon_t mon1;
    10597
    106 condition cond1a; 
     98condition cond1a;
    10799condition cond1b;
    108100
     
    152144mon_t mon2;
    153145
    154 condition cond2a; 
     146condition cond2a;
    155147condition cond2b;
    156148
  • src/driver/Makefile.in

    rfea3faa rb826e6b  
    1 # Makefile.in generated by automake 1.11.3 from Makefile.am.
     1# Makefile.in generated by automake 1.15 from Makefile.am.
    22# @configure_input@
    33
    4 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
    5 # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
    6 # Foundation, Inc.
     4# Copyright (C) 1994-2014 Free Software Foundation, Inc.
     5
    76# This Makefile.in is free software; the Free Software Foundation
    87# gives unlimited permission to copy and/or distribute it,
     
    2019
    2120VPATH = @srcdir@
     21am__is_gnu_make = { \
     22  if test -z '$(MAKELEVEL)'; then \
     23    false; \
     24  elif test -n '$(MAKE_HOST)'; then \
     25    true; \
     26  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
     27    true; \
     28  else \
     29    false; \
     30  fi; \
     31}
     32am__make_running_with_option = \
     33  case $${target_option-} in \
     34      ?) ;; \
     35      *) echo "am__make_running_with_option: internal error: invalid" \
     36              "target option '$${target_option-}' specified" >&2; \
     37         exit 1;; \
     38  esac; \
     39  has_opt=no; \
     40  sane_makeflags=$$MAKEFLAGS; \
     41  if $(am__is_gnu_make); then \
     42    sane_makeflags=$$MFLAGS; \
     43  else \
     44    case $$MAKEFLAGS in \
     45      *\\[\ \   ]*) \
     46        bs=\\; \
     47        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
     48          | sed "s/$$bs$$bs[$$bs $$bs   ]*//g"`;; \
     49    esac; \
     50  fi; \
     51  skip_next=no; \
     52  strip_trailopt () \
     53  { \
     54    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
     55  }; \
     56  for flg in $$sane_makeflags; do \
     57    test $$skip_next = yes && { skip_next=no; continue; }; \
     58    case $$flg in \
     59      *=*|--*) continue;; \
     60        -*I) strip_trailopt 'I'; skip_next=yes;; \
     61      -*I?*) strip_trailopt 'I';; \
     62        -*O) strip_trailopt 'O'; skip_next=yes;; \
     63      -*O?*) strip_trailopt 'O';; \
     64        -*l) strip_trailopt 'l'; skip_next=yes;; \
     65      -*l?*) strip_trailopt 'l';; \
     66      -[dEDm]) skip_next=yes;; \
     67      -[JT]) skip_next=yes;; \
     68    esac; \
     69    case $$flg in \
     70      *$$target_option*) has_opt=yes; break;; \
     71    esac; \
     72  done; \
     73  test $$has_opt = yes
     74am__make_dryrun = (target_option=n; $(am__make_running_with_option))
     75am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
    2276pkgdatadir = $(datadir)/@PACKAGE@
    2377pkgincludedir = $(includedir)/@PACKAGE@
     
    4498cc1lib_PROGRAMS = cc1$(EXEEXT)
    4599subdir = src/driver
    46 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
    47100ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
    48101am__aclocal_m4_deps = $(top_srcdir)/configure.ac
    49102am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
    50103        $(ACLOCAL_M4)
     104DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
    51105mkinstalldirs = $(install_sh) -d
    52106CONFIG_HEADER = $(top_builddir)/config.h
     
    61115cfa_OBJECTS = $(am_cfa_OBJECTS)
    62116cfa_LDADD = $(LDADD)
     117AM_V_P = $(am__v_P_@AM_V@)
     118am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
     119am__v_P_0 = false
     120am__v_P_1 = :
     121AM_V_GEN = $(am__v_GEN_@AM_V@)
     122am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
     123am__v_GEN_0 = @echo "  GEN     " $@;
     124am__v_GEN_1 =
     125AM_V_at = $(am__v_at_@AM_V@)
     126am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
     127am__v_at_0 = @
     128am__v_at_1 =
    63129DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
    64130depcomp = $(SHELL) $(top_srcdir)/automake/depcomp
     
    69135AM_V_CXX = $(am__v_CXX_@AM_V@)
    70136am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
    71 am__v_CXX_0 = @echo "  CXX   " $@;
    72 AM_V_at = $(am__v_at_@AM_V@)
    73 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
    74 am__v_at_0 = @
     137am__v_CXX_0 = @echo "  CXX     " $@;
     138am__v_CXX_1 =
    75139CXXLD = $(CXX)
    76140CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
     
    78142AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
    79143am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
    80 am__v_CXXLD_0 = @echo "  CXXLD " $@;
    81 AM_V_GEN = $(am__v_GEN_@AM_V@)
    82 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
    83 am__v_GEN_0 = @echo "  GEN   " $@;
     144am__v_CXXLD_0 = @echo "  CXXLD   " $@;
     145am__v_CXXLD_1 =
    84146SOURCES = $(cc1_SOURCES) $(cfa_SOURCES)
    85147DIST_SOURCES = $(cc1_SOURCES) $(cfa_SOURCES)
     148am__can_run_installinfo = \
     149  case $$AM_UPDATE_INFO_DIR in \
     150    n|no|NO) false;; \
     151    *) (install-info --version) >/dev/null 2>&1;; \
     152  esac
     153am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
     154# Read a list of newline-separated strings from the standard input,
     155# and print each of them once, without duplicates.  Input order is
     156# *not* preserved.
     157am__uniquify_input = $(AWK) '\
     158  BEGIN { nonempty = 0; } \
     159  { items[$$0] = 1; nonempty = 1; } \
     160  END { if (nonempty) { for (i in items) print i; }; } \
     161'
     162# Make sure the list of sources is unique.  This is necessary because,
     163# e.g., the same source file might be shared among _SOURCES variables
     164# for different programs/libraries.
     165am__define_uniq_tagged_files = \
     166  list='$(am__tagged_files)'; \
     167  unique=`for i in $$list; do \
     168    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
     169  done | $(am__uniquify_input)`
    86170ETAGS = etags
    87171CTAGS = ctags
     172am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/automake/depcomp
    88173DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
    89174ACLOCAL = @ACLOCAL@
     
    198283program_transform_name = @program_transform_name@
    199284psdir = @psdir@
     285runstatedir = @runstatedir@
    200286sbindir = @sbindir@
    201287sharedstatedir = @sharedstatedir@
     
    232318        $(am__cd) $(top_srcdir) && \
    233319          $(AUTOMAKE) --foreign src/driver/Makefile
    234 .PRECIOUS: Makefile
    235320Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
    236321        @case '$?' in \
     
    252337install-cc1libPROGRAMS: $(cc1lib_PROGRAMS)
    253338        @$(NORMAL_INSTALL)
    254         test -z "$(cc1libdir)" || $(MKDIR_P) "$(DESTDIR)$(cc1libdir)"
    255339        @list='$(cc1lib_PROGRAMS)'; test -n "$(cc1libdir)" || list=; \
     340        if test -n "$$list"; then \
     341          echo " $(MKDIR_P) '$(DESTDIR)$(cc1libdir)'"; \
     342          $(MKDIR_P) "$(DESTDIR)$(cc1libdir)" || exit 1; \
     343        fi; \
    256344        for p in $$list; do echo "$$p $$p"; done | \
    257345        sed 's/$(EXEEXT)$$//' | \
    258         while read p p1; do if test -f $$p; \
    259           then echo "$$p"; echo "$$p"; else :; fi; \
     346        while read p p1; do if test -f $$p \
     347          ; then echo "$$p"; echo "$$p"; else :; fi; \
    260348        done | \
    261         sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
     349        sed -e 'p;s,.*/,,;n;h' \
     350            -e 's|.*|.|' \
    262351            -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
    263352        sed 'N;N;N;s,\n, ,g' | \
     
    280369        files=`for p in $$list; do echo "$$p"; done | \
    281370          sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
    282               -e 's/$$/$(EXEEXT)/' `; \
     371              -e 's/$$/$(EXEEXT)/' \
     372        `; \
    283373        test -n "$$list" || exit 0; \
    284374        echo " ( cd '$(DESTDIR)$(cc1libdir)' && rm -f" $$files ")"; \
     
    290380clean-noinstPROGRAMS:
    291381        -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
     382
    292383cc1$(EXEEXT): $(cc1_OBJECTS) $(cc1_DEPENDENCIES) $(EXTRA_cc1_DEPENDENCIES)
    293384        @rm -f cc1$(EXEEXT)
    294385        $(AM_V_CXXLD)$(CXXLINK) $(cc1_OBJECTS) $(cc1_LDADD) $(LIBS)
     386
    295387cfa$(EXEEXT): $(cfa_OBJECTS) $(cfa_DEPENDENCIES) $(EXTRA_cfa_DEPENDENCIES)
    296388        @rm -f cfa$(EXEEXT)
     
    307399
    308400.cc.o:
    309 @am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
    310 @am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
     401@am__fastdepCXX_TRUE@   $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
     402@am__fastdepCXX_TRUE@   $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
     403@am__fastdepCXX_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
    311404@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
    312405@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     
    314407
    315408.cc.obj:
    316 @am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
    317 @am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
     409@am__fastdepCXX_TRUE@   $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
     410@am__fastdepCXX_TRUE@   $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
     411@am__fastdepCXX_TRUE@   $(am__mv) $$depbase.Tpo $$depbase.Po
    318412@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
    319413@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    320414@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
    321415
    322 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
    323         list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
    324         unique=`for i in $$list; do \
    325             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    326           done | \
    327           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    328               END { if (nonempty) { for (i in files) print i; }; }'`; \
    329         mkid -fID $$unique
    330 tags: TAGS
    331 
    332 TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
    333                 $(TAGS_FILES) $(LISP)
     416ID: $(am__tagged_files)
     417        $(am__define_uniq_tagged_files); mkid -fID $$unique
     418tags: tags-am
     419TAGS: tags
     420
     421tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
    334422        set x; \
    335423        here=`pwd`; \
    336         list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
    337         unique=`for i in $$list; do \
    338             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    339           done | \
    340           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    341               END { if (nonempty) { for (i in files) print i; }; }'`; \
     424        $(am__define_uniq_tagged_files); \
    342425        shift; \
    343426        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
     
    351434          fi; \
    352435        fi
    353 ctags: CTAGS
    354 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
    355                 $(TAGS_FILES) $(LISP)
    356         list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
    357         unique=`for i in $$list; do \
    358             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    359           done | \
    360           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    361               END { if (nonempty) { for (i in files) print i; }; }'`; \
     436ctags: ctags-am
     437
     438CTAGS: ctags
     439ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
     440        $(am__define_uniq_tagged_files); \
    362441        test -z "$(CTAGS_ARGS)$$unique" \
    363442          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
     
    368447          && $(am__cd) $(top_srcdir) \
    369448          && gtags -i $(GTAGS_ARGS) "$$here"
     449cscopelist: cscopelist-am
     450
     451cscopelist-am: $(am__tagged_files)
     452        list='$(am__tagged_files)'; \
     453        case "$(srcdir)" in \
     454          [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
     455          *) sdir=$(subdir)/$(srcdir) ;; \
     456        esac; \
     457        for i in $$list; do \
     458          if test -f "$$i"; then \
     459            echo "$(subdir)/$$i"; \
     460          else \
     461            echo "$$sdir/$$i"; \
     462          fi; \
     463        done >> $(top_builddir)/cscope.files
    370464
    371465distclean-tags:
     
    514608.MAKE: install-am install-exec-am install-strip uninstall-am
    515609
    516 .PHONY: CTAGS GTAGS all all-am check check-am clean \
    517         clean-cc1libPROGRAMS clean-generic clean-noinstPROGRAMS ctags \
    518         distclean distclean-compile distclean-generic distclean-tags \
    519         distdir dvi dvi-am html html-am info info-am install \
    520         install-am install-cc1libPROGRAMS install-data install-data-am \
    521         install-dvi install-dvi-am install-exec install-exec-am \
    522         install-exec-hook install-html install-html-am install-info \
    523         install-info-am install-man install-pdf install-pdf-am \
    524         install-ps install-ps-am install-strip installcheck \
    525         installcheck-am installdirs maintainer-clean \
    526         maintainer-clean-generic mostlyclean mostlyclean-compile \
    527         mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
    528         uninstall-am uninstall-cc1libPROGRAMS uninstall-hook
     610.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
     611        clean-cc1libPROGRAMS clean-generic clean-noinstPROGRAMS \
     612        cscopelist-am ctags ctags-am distclean distclean-compile \
     613        distclean-generic distclean-tags distdir dvi dvi-am html \
     614        html-am info info-am install install-am install-cc1libPROGRAMS \
     615        install-data install-data-am install-dvi install-dvi-am \
     616        install-exec install-exec-am install-exec-hook install-html \
     617        install-html-am install-info install-info-am install-man \
     618        install-pdf install-pdf-am install-ps install-ps-am \
     619        install-strip installcheck installcheck-am installdirs \
     620        maintainer-clean maintainer-clean-generic mostlyclean \
     621        mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
     622        tags tags-am uninstall uninstall-am uninstall-cc1libPROGRAMS \
     623        uninstall-hook
     624
     625.PRECIOUS: Makefile
    529626
    530627
  • src/examples/Makefile.in

    rfea3faa rb826e6b  
    1 # Makefile.in generated by automake 1.11.3 from Makefile.am.
     1# Makefile.in generated by automake 1.15 from Makefile.am.
    22# @configure_input@
    33
    4 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
    5 # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
    6 # Foundation, Inc.
     4# Copyright (C) 1994-2014 Free Software Foundation, Inc.
     5
    76# This Makefile.in is free software; the Free Software Foundation
    87# gives unlimited permission to copy and/or distribute it,
     
    2019
    2120VPATH = @srcdir@
     21am__is_gnu_make = { \
     22  if test -z '$(MAKELEVEL)'; then \
     23    false; \
     24  elif test -n '$(MAKE_HOST)'; then \
     25    true; \
     26  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
     27    true; \
     28  else \
     29    false; \
     30  fi; \
     31}
     32am__make_running_with_option = \
     33  case $${target_option-} in \
     34      ?) ;; \
     35      *) echo "am__make_running_with_option: internal error: invalid" \
     36              "target option '$${target_option-}' specified" >&2; \
     37         exit 1;; \
     38  esac; \
     39  has_opt=no; \
     40  sane_makeflags=$$MAKEFLAGS; \
     41  if $(am__is_gnu_make); then \
     42    sane_makeflags=$$MFLAGS; \
     43  else \
     44    case $$MAKEFLAGS in \
     45      *\\[\ \   ]*) \
     46        bs=\\; \
     47        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
     48          | sed "s/$$bs$$bs[$$bs $$bs   ]*//g"`;; \
     49    esac; \
     50  fi; \
     51  skip_next=no; \
     52  strip_trailopt () \
     53  { \
     54    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
     55  }; \
     56  for flg in $$sane_makeflags; do \
     57    test $$skip_next = yes && { skip_next=no; continue; }; \
     58    case $$flg in \
     59      *=*|--*) continue;; \
     60        -*I) strip_trailopt 'I'; skip_next=yes;; \
     61      -*I?*) strip_trailopt 'I';; \
     62        -*O) strip_trailopt 'O'; skip_next=yes;; \
     63      -*O?*) strip_trailopt 'O';; \
     64        -*l) strip_trailopt 'l'; skip_next=yes;; \
     65      -*l?*) strip_trailopt 'l';; \
     66      -[dEDm]) skip_next=yes;; \
     67      -[JT]) skip_next=yes;; \
     68    esac; \
     69    case $$flg in \
     70      *$$target_option*) has_opt=yes; break;; \
     71    esac; \
     72  done; \
     73  test $$has_opt = yes
     74am__make_dryrun = (target_option=n; $(am__make_running_with_option))
     75am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
    2276pkgdatadir = $(datadir)/@PACKAGE@
    2377pkgincludedir = $(includedir)/@PACKAGE@
     
    4195        avl_test$(EXEEXT) Bench$(EXEEXT)
    4296subdir = src/examples
    43 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
    4497ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
    4598am__aclocal_m4_deps = $(top_srcdir)/configure.ac
    4699am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
    47100        $(ACLOCAL_M4)
     101DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
    48102mkinstalldirs = $(install_sh) -d
    49103CONFIG_HEADER = $(top_builddir)/config.h
     
    54108Bench_OBJECTS = Bench.$(OBJEXT)
    55109Bench_LDADD = $(LDADD)
    56 am_avl_test_OBJECTS = avl_test.$(OBJEXT) avl0.$(OBJEXT) avl1.$(OBJEXT) \
    57         avl2.$(OBJEXT) avl3.$(OBJEXT) avl4.$(OBJEXT) \
    58         avl-private.$(OBJEXT)
     110am__dirstamp = $(am__leading_dot)dirstamp
     111am_avl_test_OBJECTS = avltree/avl_test.$(OBJEXT) \
     112        avltree/avl0.$(OBJEXT) avltree/avl1.$(OBJEXT) \
     113        avltree/avl2.$(OBJEXT) avltree/avl3.$(OBJEXT) \
     114        avltree/avl4.$(OBJEXT) avltree/avl-private.$(OBJEXT)
    59115avl_test_OBJECTS = $(am_avl_test_OBJECTS)
    60116avl_test_LDADD = $(LDADD)
     
    66122vector_test_OBJECTS = $(am_vector_test_OBJECTS)
    67123vector_test_LDADD = $(LDADD)
     124AM_V_P = $(am__v_P_@AM_V@)
     125am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
     126am__v_P_0 = false
     127am__v_P_1 = :
     128AM_V_GEN = $(am__v_GEN_@AM_V@)
     129am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
     130am__v_GEN_0 = @echo "  GEN     " $@;
     131am__v_GEN_1 =
     132AM_V_at = $(am__v_at_@AM_V@)
     133am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
     134am__v_at_0 = @
     135am__v_at_1 =
    68136DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
    69137depcomp = $(SHELL) $(top_srcdir)/automake/depcomp
    70138am__depfiles_maybe = depfiles
    71139am__mv = mv -f
    72 AM_V_lt = $(am__v_lt_@AM_V@)
    73 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
    74 am__v_lt_0 = --silent
    75140COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
    76141        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
    77142AM_V_CC = $(am__v_CC_@AM_V@)
    78143am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
    79 am__v_CC_0 = @echo "  CC    " $@;
    80 AM_V_at = $(am__v_at_@AM_V@)
    81 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
    82 am__v_at_0 = @
     144am__v_CC_0 = @echo "  CC      " $@;
     145am__v_CC_1 =
    83146CCLD = $(CC)
    84147LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
    85148AM_V_CCLD = $(am__v_CCLD_@AM_V@)
    86149am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
    87 am__v_CCLD_0 = @echo "  CCLD  " $@;
    88 AM_V_GEN = $(am__v_GEN_@AM_V@)
    89 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
    90 am__v_GEN_0 = @echo "  GEN   " $@;
     150am__v_CCLD_0 = @echo "  CCLD    " $@;
     151am__v_CCLD_1 =
    91152SOURCES = Bench.c $(avl_test_SOURCES) $(fstream_test_SOURCES) \
    92153        $(vector_test_SOURCES)
    93154DIST_SOURCES = Bench.c $(avl_test_SOURCES) $(fstream_test_SOURCES) \
    94155        $(vector_test_SOURCES)
     156am__can_run_installinfo = \
     157  case $$AM_UPDATE_INFO_DIR in \
     158    n|no|NO) false;; \
     159    *) (install-info --version) >/dev/null 2>&1;; \
     160  esac
     161am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
     162# Read a list of newline-separated strings from the standard input,
     163# and print each of them once, without duplicates.  Input order is
     164# *not* preserved.
     165am__uniquify_input = $(AWK) '\
     166  BEGIN { nonempty = 0; } \
     167  { items[$$0] = 1; nonempty = 1; } \
     168  END { if (nonempty) { for (i in items) print i; }; } \
     169'
     170# Make sure the list of sources is unique.  This is necessary because,
     171# e.g., the same source file might be shared among _SOURCES variables
     172# for different programs/libraries.
     173am__define_uniq_tagged_files = \
     174  list='$(am__tagged_files)'; \
     175  unique=`for i in $$list; do \
     176    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
     177  done | $(am__uniquify_input)`
    95178ETAGS = etags
    96179CTAGS = ctags
     180am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/automake/depcomp
    97181DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
    98182ACLOCAL = @ACLOCAL@
     
    209293program_transform_name = @program_transform_name@
    210294psdir = @psdir@
     295runstatedir = @runstatedir@
    211296sbindir = @sbindir@
    212297sharedstatedir = @sharedstatedir@
     
    237322        $(am__cd) $(top_srcdir) && \
    238323          $(AUTOMAKE) --foreign src/examples/Makefile
    239 .PRECIOUS: Makefile
    240324Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
    241325        @case '$?' in \
     
    258342clean-noinstPROGRAMS:
    259343        -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
     344avltree/$(am__dirstamp):
     345        @$(MKDIR_P) avltree
     346        @: > avltree/$(am__dirstamp)
     347avltree/$(DEPDIR)/$(am__dirstamp):
     348        @$(MKDIR_P) avltree/$(DEPDIR)
     349        @: > avltree/$(DEPDIR)/$(am__dirstamp)
     350avltree/avl_test.$(OBJEXT): avltree/$(am__dirstamp) \
     351        avltree/$(DEPDIR)/$(am__dirstamp)
     352avltree/avl0.$(OBJEXT): avltree/$(am__dirstamp) \
     353        avltree/$(DEPDIR)/$(am__dirstamp)
     354avltree/avl1.$(OBJEXT): avltree/$(am__dirstamp) \
     355        avltree/$(DEPDIR)/$(am__dirstamp)
     356avltree/avl2.$(OBJEXT): avltree/$(am__dirstamp) \
     357        avltree/$(DEPDIR)/$(am__dirstamp)
     358avltree/avl3.$(OBJEXT): avltree/$(am__dirstamp) \
     359        avltree/$(DEPDIR)/$(am__dirstamp)
     360avltree/avl4.$(OBJEXT): avltree/$(am__dirstamp) \
     361        avltree/$(DEPDIR)/$(am__dirstamp)
     362avltree/avl-private.$(OBJEXT): avltree/$(am__dirstamp) \
     363        avltree/$(DEPDIR)/$(am__dirstamp)
     364
    260365avl_test$(EXEEXT): $(avl_test_OBJECTS) $(avl_test_DEPENDENCIES) $(EXTRA_avl_test_DEPENDENCIES)
    261366        @rm -f avl_test$(EXEEXT)
    262367        $(AM_V_CCLD)$(LINK) $(avl_test_OBJECTS) $(avl_test_LDADD) $(LIBS)
     368
    263369fstream_test$(EXEEXT): $(fstream_test_OBJECTS) $(fstream_test_DEPENDENCIES) $(EXTRA_fstream_test_DEPENDENCIES)
    264370        @rm -f fstream_test$(EXEEXT)
    265371        $(AM_V_CCLD)$(LINK) $(fstream_test_OBJECTS) $(fstream_test_LDADD) $(LIBS)
     372
    266373vector_test$(EXEEXT): $(vector_test_OBJECTS) $(vector_test_DEPENDENCIES) $(EXTRA_vector_test_DEPENDENCIES)
    267374        @rm -f vector_test$(EXEEXT)
     
    270377mostlyclean-compile:
    271378        -rm -f *.$(OBJEXT)
     379        -rm -f avltree/*.$(OBJEXT)
    272380
    273381distclean-compile:
     
    276384@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Bench.Po@am__quote@
    277385@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array.Po@am__quote@
    278 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl-private.Po@am__quote@
    279 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl0.Po@am__quote@
    280 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl1.Po@am__quote@
    281 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl2.Po@am__quote@
    282 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl3.Po@am__quote@
    283 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl4.Po@am__quote@
    284 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl_test.Po@am__quote@
    285386@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstream_test.Po@am__quote@
    286387@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_int.Po@am__quote@
    287388@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_test.Po@am__quote@
     389@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl-private.Po@am__quote@
     390@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl0.Po@am__quote@
     391@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl1.Po@am__quote@
     392@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl2.Po@am__quote@
     393@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl3.Po@am__quote@
     394@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl4.Po@am__quote@
     395@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl_test.Po@am__quote@
    288396
    289397.c.o:
    290 @am__fastdepCC_TRUE@    $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
    291 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
     398@am__fastdepCC_TRUE@    $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
     399@am__fastdepCC_TRUE@    $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
     400@am__fastdepCC_TRUE@    $(am__mv) $$depbase.Tpo $$depbase.Po
    292401@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
    293402@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    294 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
     403@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
    295404
    296405.c.obj:
    297 @am__fastdepCC_TRUE@    $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
    298 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
     406@am__fastdepCC_TRUE@    $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
     407@am__fastdepCC_TRUE@    $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
     408@am__fastdepCC_TRUE@    $(am__mv) $$depbase.Tpo $$depbase.Po
    299409@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
    300410@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    301 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
    302 
    303 avl_test.o: avltree/avl_test.c
    304 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl_test.o -MD -MP -MF $(DEPDIR)/avl_test.Tpo -c -o avl_test.o `test -f 'avltree/avl_test.c' || echo '$(srcdir)/'`avltree/avl_test.c
    305 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl_test.Tpo $(DEPDIR)/avl_test.Po
    306 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl_test.c' object='avl_test.o' libtool=no @AMDEPBACKSLASH@
    307 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    308 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl_test.o `test -f 'avltree/avl_test.c' || echo '$(srcdir)/'`avltree/avl_test.c
    309 
    310 avl_test.obj: avltree/avl_test.c
    311 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl_test.obj -MD -MP -MF $(DEPDIR)/avl_test.Tpo -c -o avl_test.obj `if test -f 'avltree/avl_test.c'; then $(CYGPATH_W) 'avltree/avl_test.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl_test.c'; fi`
    312 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl_test.Tpo $(DEPDIR)/avl_test.Po
    313 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl_test.c' object='avl_test.obj' libtool=no @AMDEPBACKSLASH@
    314 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    315 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl_test.obj `if test -f 'avltree/avl_test.c'; then $(CYGPATH_W) 'avltree/avl_test.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl_test.c'; fi`
    316 
    317 avl0.o: avltree/avl0.c
    318 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl0.o -MD -MP -MF $(DEPDIR)/avl0.Tpo -c -o avl0.o `test -f 'avltree/avl0.c' || echo '$(srcdir)/'`avltree/avl0.c
    319 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl0.Tpo $(DEPDIR)/avl0.Po
    320 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl0.c' object='avl0.o' libtool=no @AMDEPBACKSLASH@
    321 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    322 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl0.o `test -f 'avltree/avl0.c' || echo '$(srcdir)/'`avltree/avl0.c
    323 
    324 avl0.obj: avltree/avl0.c
    325 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl0.obj -MD -MP -MF $(DEPDIR)/avl0.Tpo -c -o avl0.obj `if test -f 'avltree/avl0.c'; then $(CYGPATH_W) 'avltree/avl0.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl0.c'; fi`
    326 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl0.Tpo $(DEPDIR)/avl0.Po
    327 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl0.c' object='avl0.obj' libtool=no @AMDEPBACKSLASH@
    328 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    329 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl0.obj `if test -f 'avltree/avl0.c'; then $(CYGPATH_W) 'avltree/avl0.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl0.c'; fi`
    330 
    331 avl1.o: avltree/avl1.c
    332 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl1.o -MD -MP -MF $(DEPDIR)/avl1.Tpo -c -o avl1.o `test -f 'avltree/avl1.c' || echo '$(srcdir)/'`avltree/avl1.c
    333 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl1.Tpo $(DEPDIR)/avl1.Po
    334 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl1.c' object='avl1.o' libtool=no @AMDEPBACKSLASH@
    335 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    336 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl1.o `test -f 'avltree/avl1.c' || echo '$(srcdir)/'`avltree/avl1.c
    337 
    338 avl1.obj: avltree/avl1.c
    339 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl1.obj -MD -MP -MF $(DEPDIR)/avl1.Tpo -c -o avl1.obj `if test -f 'avltree/avl1.c'; then $(CYGPATH_W) 'avltree/avl1.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl1.c'; fi`
    340 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl1.Tpo $(DEPDIR)/avl1.Po
    341 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl1.c' object='avl1.obj' libtool=no @AMDEPBACKSLASH@
    342 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    343 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl1.obj `if test -f 'avltree/avl1.c'; then $(CYGPATH_W) 'avltree/avl1.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl1.c'; fi`
    344 
    345 avl2.o: avltree/avl2.c
    346 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl2.o -MD -MP -MF $(DEPDIR)/avl2.Tpo -c -o avl2.o `test -f 'avltree/avl2.c' || echo '$(srcdir)/'`avltree/avl2.c
    347 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl2.Tpo $(DEPDIR)/avl2.Po
    348 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl2.c' object='avl2.o' libtool=no @AMDEPBACKSLASH@
    349 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    350 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl2.o `test -f 'avltree/avl2.c' || echo '$(srcdir)/'`avltree/avl2.c
    351 
    352 avl2.obj: avltree/avl2.c
    353 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl2.obj -MD -MP -MF $(DEPDIR)/avl2.Tpo -c -o avl2.obj `if test -f 'avltree/avl2.c'; then $(CYGPATH_W) 'avltree/avl2.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl2.c'; fi`
    354 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl2.Tpo $(DEPDIR)/avl2.Po
    355 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl2.c' object='avl2.obj' libtool=no @AMDEPBACKSLASH@
    356 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    357 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl2.obj `if test -f 'avltree/avl2.c'; then $(CYGPATH_W) 'avltree/avl2.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl2.c'; fi`
    358 
    359 avl3.o: avltree/avl3.c
    360 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl3.o -MD -MP -MF $(DEPDIR)/avl3.Tpo -c -o avl3.o `test -f 'avltree/avl3.c' || echo '$(srcdir)/'`avltree/avl3.c
    361 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl3.Tpo $(DEPDIR)/avl3.Po
    362 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl3.c' object='avl3.o' libtool=no @AMDEPBACKSLASH@
    363 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    364 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl3.o `test -f 'avltree/avl3.c' || echo '$(srcdir)/'`avltree/avl3.c
    365 
    366 avl3.obj: avltree/avl3.c
    367 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl3.obj -MD -MP -MF $(DEPDIR)/avl3.Tpo -c -o avl3.obj `if test -f 'avltree/avl3.c'; then $(CYGPATH_W) 'avltree/avl3.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl3.c'; fi`
    368 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl3.Tpo $(DEPDIR)/avl3.Po
    369 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl3.c' object='avl3.obj' libtool=no @AMDEPBACKSLASH@
    370 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    371 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl3.obj `if test -f 'avltree/avl3.c'; then $(CYGPATH_W) 'avltree/avl3.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl3.c'; fi`
    372 
    373 avl4.o: avltree/avl4.c
    374 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl4.o -MD -MP -MF $(DEPDIR)/avl4.Tpo -c -o avl4.o `test -f 'avltree/avl4.c' || echo '$(srcdir)/'`avltree/avl4.c
    375 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl4.Tpo $(DEPDIR)/avl4.Po
    376 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl4.c' object='avl4.o' libtool=no @AMDEPBACKSLASH@
    377 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    378 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl4.o `test -f 'avltree/avl4.c' || echo '$(srcdir)/'`avltree/avl4.c
    379 
    380 avl4.obj: avltree/avl4.c
    381 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl4.obj -MD -MP -MF $(DEPDIR)/avl4.Tpo -c -o avl4.obj `if test -f 'avltree/avl4.c'; then $(CYGPATH_W) 'avltree/avl4.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl4.c'; fi`
    382 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl4.Tpo $(DEPDIR)/avl4.Po
    383 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl4.c' object='avl4.obj' libtool=no @AMDEPBACKSLASH@
    384 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    385 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl4.obj `if test -f 'avltree/avl4.c'; then $(CYGPATH_W) 'avltree/avl4.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl4.c'; fi`
    386 
    387 avl-private.o: avltree/avl-private.c
    388 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl-private.o -MD -MP -MF $(DEPDIR)/avl-private.Tpo -c -o avl-private.o `test -f 'avltree/avl-private.c' || echo '$(srcdir)/'`avltree/avl-private.c
    389 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl-private.Tpo $(DEPDIR)/avl-private.Po
    390 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl-private.c' object='avl-private.o' libtool=no @AMDEPBACKSLASH@
    391 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    392 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl-private.o `test -f 'avltree/avl-private.c' || echo '$(srcdir)/'`avltree/avl-private.c
    393 
    394 avl-private.obj: avltree/avl-private.c
    395 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl-private.obj -MD -MP -MF $(DEPDIR)/avl-private.Tpo -c -o avl-private.obj `if test -f 'avltree/avl-private.c'; then $(CYGPATH_W) 'avltree/avl-private.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl-private.c'; fi`
    396 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl-private.Tpo $(DEPDIR)/avl-private.Po
    397 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl-private.c' object='avl-private.obj' libtool=no @AMDEPBACKSLASH@
    398 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    399 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl-private.obj `if test -f 'avltree/avl-private.c'; then $(CYGPATH_W) 'avltree/avl-private.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl-private.c'; fi`
    400 
    401 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
    402         list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
    403         unique=`for i in $$list; do \
    404             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    405           done | \
    406           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    407               END { if (nonempty) { for (i in files) print i; }; }'`; \
    408         mkid -fID $$unique
    409 tags: TAGS
    410 
    411 TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
    412                 $(TAGS_FILES) $(LISP)
     411@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
     412
     413ID: $(am__tagged_files)
     414        $(am__define_uniq_tagged_files); mkid -fID $$unique
     415tags: tags-am
     416TAGS: tags
     417
     418tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
    413419        set x; \
    414420        here=`pwd`; \
    415         list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
    416         unique=`for i in $$list; do \
    417             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    418           done | \
    419           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    420               END { if (nonempty) { for (i in files) print i; }; }'`; \
     421        $(am__define_uniq_tagged_files); \
    421422        shift; \
    422423        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
     
    430431          fi; \
    431432        fi
    432 ctags: CTAGS
    433 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
    434                 $(TAGS_FILES) $(LISP)
    435         list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
    436         unique=`for i in $$list; do \
    437             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    438           done | \
    439           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    440               END { if (nonempty) { for (i in files) print i; }; }'`; \
     433ctags: ctags-am
     434
     435CTAGS: ctags
     436ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
     437        $(am__define_uniq_tagged_files); \
    441438        test -z "$(CTAGS_ARGS)$$unique" \
    442439          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
     
    447444          && $(am__cd) $(top_srcdir) \
    448445          && gtags -i $(GTAGS_ARGS) "$$here"
     446cscopelist: cscopelist-am
     447
     448cscopelist-am: $(am__tagged_files)
     449        list='$(am__tagged_files)'; \
     450        case "$(srcdir)" in \
     451          [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
     452          *) sdir=$(subdir)/$(srcdir) ;; \
     453        esac; \
     454        for i in $$list; do \
     455          if test -f "$$i"; then \
     456            echo "$(subdir)/$$i"; \
     457          else \
     458            echo "$$sdir/$$i"; \
     459          fi; \
     460        done >> $(top_builddir)/cscope.files
    449461
    450462distclean-tags:
     
    511523        -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
    512524        -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
     525        -rm -f avltree/$(DEPDIR)/$(am__dirstamp)
     526        -rm -f avltree/$(am__dirstamp)
    513527
    514528maintainer-clean-generic:
     
    520534
    521535distclean: distclean-am
    522         -rm -rf ./$(DEPDIR)
     536        -rm -rf ./$(DEPDIR) avltree/$(DEPDIR)
    523537        -rm -f Makefile
    524538distclean-am: clean-am distclean-compile distclean-generic \
     
    566580
    567581maintainer-clean: maintainer-clean-am
    568         -rm -rf ./$(DEPDIR)
     582        -rm -rf ./$(DEPDIR) avltree/$(DEPDIR)
    569583        -rm -f Makefile
    570584maintainer-clean-am: distclean-am maintainer-clean-generic
     
    586600.MAKE: install-am install-strip
    587601
    588 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
    589         clean-noinstPROGRAMS ctags distclean distclean-compile \
    590         distclean-generic distclean-tags distdir dvi dvi-am html \
    591         html-am info info-am install install-am install-data \
    592         install-data-am install-dvi install-dvi-am install-exec \
    593         install-exec-am install-html install-html-am install-info \
    594         install-info-am install-man install-pdf install-pdf-am \
    595         install-ps install-ps-am install-strip installcheck \
    596         installcheck-am installdirs maintainer-clean \
     602.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
     603        clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
     604        distclean-compile distclean-generic distclean-tags distdir dvi \
     605        dvi-am html html-am info info-am install install-am \
     606        install-data install-data-am install-dvi install-dvi-am \
     607        install-exec install-exec-am install-html install-html-am \
     608        install-info install-info-am install-man install-pdf \
     609        install-pdf-am install-ps install-ps-am install-strip \
     610        installcheck installcheck-am installdirs maintainer-clean \
    597611        maintainer-clean-generic mostlyclean mostlyclean-compile \
    598         mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
     612        mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
    599613        uninstall-am
     614
     615.PRECIOUS: Makefile
    600616
    601617
  • src/include/assert.h

    rfea3faa rb826e6b  
    1515
    1616#pragma once
     17// Pragmas for header cleanup tool
     18// IWYU pragma: private, include <cassert>
    1719
    1820#include_next <assert.h>
  • src/libcfa/Makefile.am

    rfea3faa rb826e6b  
    1010## Author           : Peter A. Buhr
    1111## Created On       : Sun May 31 08:54:01 2015
    12 ## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Sun May 14 21:04:21 2017
    14 ## Update Count     : 214
     12## Last Modified By : Andrew Beach
     13## Last Modified On : Fri Jun 14 17:00:00 2017
     14## Update Count     : 216
    1515###############################################################################
    1616
    1717# create object files in directory with source files
    1818AUTOMAKE_OPTIONS = subdir-objects
     19ARFLAGS = cr
    1920
    2021libdir = ${CFA_LIBDIR}
     
    5051
    5152libobjs = ${headers:=.o}
    52 libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c}
     53libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c} \
     54        exception.c typeobject.c
    5355
    5456# not all platforms support concurrency, add option do disable it
     
    6466        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
    6567
     68libcfa_a-exception.o : exception.c
     69        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
     70
     71libcfa_a-typeobject.o : typeobject.c
     72        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
     73
    6674concurrency/libcfa_d_a-invoke.o : concurrency/invoke.c
     75        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
     76
     77libcfa_d_a-exception.o : exception.c
     78        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
     79
     80libcfa_d_a-typeobject.o : typeobject.c
    6781        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
    6882
  • src/libcfa/Makefile.in

    rfea3faa rb826e6b  
    1 # Makefile.in generated by automake 1.11.3 from Makefile.am.
     1# Makefile.in generated by automake 1.15 from Makefile.am.
    22# @configure_input@
    33
    4 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
    5 # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
    6 # Foundation, Inc.
     4# Copyright (C) 1994-2014 Free Software Foundation, Inc.
     5
    76# This Makefile.in is free software; the Free Software Foundation
    87# gives unlimited permission to copy and/or distribute it,
     
    2120
    2221VPATH = @srcdir@
     22am__is_gnu_make = { \
     23  if test -z '$(MAKELEVEL)'; then \
     24    false; \
     25  elif test -n '$(MAKE_HOST)'; then \
     26    true; \
     27  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
     28    true; \
     29  else \
     30    false; \
     31  fi; \
     32}
     33am__make_running_with_option = \
     34  case $${target_option-} in \
     35      ?) ;; \
     36      *) echo "am__make_running_with_option: internal error: invalid" \
     37              "target option '$${target_option-}' specified" >&2; \
     38         exit 1;; \
     39  esac; \
     40  has_opt=no; \
     41  sane_makeflags=$$MAKEFLAGS; \
     42  if $(am__is_gnu_make); then \
     43    sane_makeflags=$$MFLAGS; \
     44  else \
     45    case $$MAKEFLAGS in \
     46      *\\[\ \   ]*) \
     47        bs=\\; \
     48        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
     49          | sed "s/$$bs$$bs[$$bs $$bs   ]*//g"`;; \
     50    esac; \
     51  fi; \
     52  skip_next=no; \
     53  strip_trailopt () \
     54  { \
     55    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
     56  }; \
     57  for flg in $$sane_makeflags; do \
     58    test $$skip_next = yes && { skip_next=no; continue; }; \
     59    case $$flg in \
     60      *=*|--*) continue;; \
     61        -*I) strip_trailopt 'I'; skip_next=yes;; \
     62      -*I?*) strip_trailopt 'I';; \
     63        -*O) strip_trailopt 'O'; skip_next=yes;; \
     64      -*O?*) strip_trailopt 'O';; \
     65        -*l) strip_trailopt 'l'; skip_next=yes;; \
     66      -*l?*) strip_trailopt 'l';; \
     67      -[dEDm]) skip_next=yes;; \
     68      -[JT]) skip_next=yes;; \
     69    esac; \
     70    case $$flg in \
     71      *$$target_option*) has_opt=yes; break;; \
     72    esac; \
     73  done; \
     74  test $$has_opt = yes
     75am__make_dryrun = (target_option=n; $(am__make_running_with_option))
     76am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
    2377pkgdatadir = $(datadir)/@PACKAGE@
    2478pkgincludedir = $(includedir)/@PACKAGE@
     
    48102@BUILD_CONCURRENCY_TRUE@am__append_4 = concurrency/CtxSwitch-@MACHINE_TYPE@.S concurrency/alarm.c concurrency/invoke.c concurrency/preemption.c
    49103subdir = src/libcfa
    50 DIST_COMMON = $(am__nobase_cfa_include_HEADERS_DIST) \
    51         $(srcdir)/Makefile.am $(srcdir)/Makefile.in
    52104ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
    53105am__aclocal_m4_deps = $(top_srcdir)/configure.ac
    54106am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
    55107        $(ACLOCAL_M4)
     108DIST_COMMON = $(srcdir)/Makefile.am \
     109        $(am__nobase_cfa_include_HEADERS_DIST) $(am__DIST_COMMON)
    56110mkinstalldirs = $(install_sh) -d
    57111CONFIG_HEADER = $(top_builddir)/config.h
     
    88142LIBRARIES = $(lib_LIBRARIES)
    89143AR = ar
    90 ARFLAGS = cru
    91144AM_V_AR = $(am__v_AR_@AM_V@)
    92145am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
    93 am__v_AR_0 = @echo "  AR    " $@;
    94 AM_V_at = $(am__v_at_@AM_V@)
    95 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
    96 am__v_at_0 = @
     146am__v_AR_0 = @echo "  AR      " $@;
     147am__v_AR_1 =
    97148libcfa_d_a_AR = $(AR) $(ARFLAGS)
    98149libcfa_d_a_LIBADD =
     
    102153        containers/pair.c containers/result.c containers/vector.c \
    103154        concurrency/coroutine.c concurrency/thread.c \
    104         concurrency/kernel.c concurrency/monitor.c \
    105         concurrency/CtxSwitch-@MACHINE_TYPE@.S concurrency/alarm.c \
    106         concurrency/invoke.c concurrency/preemption.c
     155        concurrency/kernel.c concurrency/monitor.c exception.c \
     156        typeobject.c concurrency/CtxSwitch-@MACHINE_TYPE@.S \
     157        concurrency/alarm.c concurrency/invoke.c \
     158        concurrency/preemption.c
    107159am__dirstamp = $(am__leading_dot)dirstamp
    108160@BUILD_CONCURRENCY_TRUE@am__objects_1 = concurrency/libcfa_d_a-coroutine.$(OBJEXT) \
     
    126178        libcfa_d_a-interpose.$(OBJEXT) \
    127179        libhdr/libcfa_d_a-libdebug.$(OBJEXT) $(am__objects_2) \
     180        libcfa_d_a-exception.$(OBJEXT) libcfa_d_a-typeobject.$(OBJEXT) \
    128181        $(am__objects_3)
    129182am_libcfa_d_a_OBJECTS = $(am__objects_4)
     
    136189        containers/pair.c containers/result.c containers/vector.c \
    137190        concurrency/coroutine.c concurrency/thread.c \
    138         concurrency/kernel.c concurrency/monitor.c \
    139         concurrency/CtxSwitch-@MACHINE_TYPE@.S concurrency/alarm.c \
    140         concurrency/invoke.c concurrency/preemption.c
     191        concurrency/kernel.c concurrency/monitor.c exception.c \
     192        typeobject.c concurrency/CtxSwitch-@MACHINE_TYPE@.S \
     193        concurrency/alarm.c concurrency/invoke.c \
     194        concurrency/preemption.c
    141195@BUILD_CONCURRENCY_TRUE@am__objects_5 = concurrency/libcfa_a-coroutine.$(OBJEXT) \
    142196@BUILD_CONCURRENCY_TRUE@        concurrency/libcfa_a-thread.$(OBJEXT) \
     
    158212        libcfa_a-interpose.$(OBJEXT) \
    159213        libhdr/libcfa_a-libdebug.$(OBJEXT) $(am__objects_6) \
     214        libcfa_a-exception.$(OBJEXT) libcfa_a-typeobject.$(OBJEXT) \
    160215        $(am__objects_7)
    161216am_libcfa_a_OBJECTS = $(am__objects_8)
    162217libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS)
     218AM_V_P = $(am__v_P_@AM_V@)
     219am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
     220am__v_P_0 = false
     221am__v_P_1 = :
     222AM_V_GEN = $(am__v_GEN_@AM_V@)
     223am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
     224am__v_GEN_0 = @echo "  GEN     " $@;
     225am__v_GEN_1 =
     226AM_V_at = $(am__v_at_@AM_V@)
     227am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
     228am__v_at_0 = @
     229am__v_at_1 =
    163230DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
    164231depcomp = $(SHELL) $(top_srcdir)/automake/depcomp
     
    169236AM_V_CPPAS = $(am__v_CPPAS_@AM_V@)
    170237am__v_CPPAS_ = $(am__v_CPPAS_@AM_DEFAULT_V@)
    171 am__v_CPPAS_0 = @echo "  CPPAS " $@;
     238am__v_CPPAS_0 = @echo "  CPPAS   " $@;
     239am__v_CPPAS_1 =
    172240AM_V_lt = $(am__v_lt_@AM_V@)
    173241am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
    174242am__v_lt_0 = --silent
     243am__v_lt_1 =
    175244COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
    176245        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
    177246AM_V_CC = $(am__v_CC_@AM_V@)
    178247am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
    179 am__v_CC_0 = @echo "  CC    " $@;
     248am__v_CC_0 = @echo "  CC      " $@;
     249am__v_CC_1 =
    180250CCLD = $(CC)
    181251LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
    182252AM_V_CCLD = $(am__v_CCLD_@AM_V@)
    183253am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
    184 am__v_CCLD_0 = @echo "  CCLD  " $@;
    185 AM_V_GEN = $(am__v_GEN_@AM_V@)
    186 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
    187 am__v_GEN_0 = @echo "  GEN   " $@;
     254am__v_CCLD_0 = @echo "  CCLD    " $@;
     255am__v_CCLD_1 =
    188256SOURCES = $(libcfa_d_a_SOURCES) $(libcfa_a_SOURCES)
    189257DIST_SOURCES = $(am__libcfa_d_a_SOURCES_DIST) \
    190258        $(am__libcfa_a_SOURCES_DIST)
     259am__can_run_installinfo = \
     260  case $$AM_UPDATE_INFO_DIR in \
     261    n|no|NO) false;; \
     262    *) (install-info --version) >/dev/null 2>&1;; \
     263  esac
    191264am__nobase_cfa_include_HEADERS_DIST = assert fstream iostream iterator \
    192265        limits math rational stdlib containers/maybe containers/pair \
     
    195268        ${shell echo stdhdr/*} gmp concurrency/invoke.h
    196269HEADERS = $(nobase_cfa_include_HEADERS)
     270am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
     271# Read a list of newline-separated strings from the standard input,
     272# and print each of them once, without duplicates.  Input order is
     273# *not* preserved.
     274am__uniquify_input = $(AWK) '\
     275  BEGIN { nonempty = 0; } \
     276  { items[$$0] = 1; nonempty = 1; } \
     277  END { if (nonempty) { for (i in items) print i; }; } \
     278'
     279# Make sure the list of sources is unique.  This is necessary because,
     280# e.g., the same source file might be shared among _SOURCES variables
     281# for different programs/libraries.
     282am__define_uniq_tagged_files = \
     283  list='$(am__tagged_files)'; \
     284  unique=`for i in $$list; do \
     285    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
     286  done | $(am__uniquify_input)`
    197287ETAGS = etags
    198288CTAGS = ctags
     289am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/automake/depcomp
    199290DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
    200291ACLOCAL = @ACLOCAL@
     
    309400program_transform_name = @program_transform_name@
    310401psdir = @psdir@
     402runstatedir = @runstatedir@
    311403sbindir = @sbindir@
    312404sharedstatedir = @sharedstatedir@
     
    320412# create object files in directory with source files
    321413AUTOMAKE_OPTIONS = subdir-objects
     414ARFLAGS = cr
    322415lib_LIBRARIES = $(am__append_1) $(am__append_2)
    323416EXTRA_FLAGS = -g -Wall -Werror -Wno-unused-function -I${abs_top_srcdir}/src/libcfa/libhdr -imacros libcfa-prelude.c @CFA_FLAGS@
     
    328421libobjs = ${headers:=.o}
    329422libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c} \
    330         $(am__append_4)
     423        exception.c typeobject.c $(am__append_4)
    331424libcfa_a_SOURCES = ${libsrc}
    332425libcfa_a_CFLAGS = -nodebug -O2
     
    353446        $(am__cd) $(top_srcdir) && \
    354447          $(AUTOMAKE) --foreign src/libcfa/Makefile
    355 .PRECIOUS: Makefile
    356448Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
    357449        @case '$?' in \
     
    373465install-libLIBRARIES: $(lib_LIBRARIES)
    374466        @$(NORMAL_INSTALL)
    375         test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
    376467        @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
    377468        list2=; for p in $$list; do \
     
    381472        done; \
    382473        test -z "$$list2" || { \
     474          echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
     475          $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
    383476          echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \
    384477          $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; }
     
    448541        concurrency/$(am__dirstamp) \
    449542        concurrency/$(DEPDIR)/$(am__dirstamp)
     543
    450544libcfa-d.a: $(libcfa_d_a_OBJECTS) $(libcfa_d_a_DEPENDENCIES) $(EXTRA_libcfa_d_a_DEPENDENCIES)
    451545        $(AM_V_at)-rm -f libcfa-d.a
     
    477571        concurrency/$(am__dirstamp) \
    478572        concurrency/$(DEPDIR)/$(am__dirstamp)
     573
    479574libcfa.a: $(libcfa_a_OBJECTS) $(libcfa_a_DEPENDENCIES) $(EXTRA_libcfa_a_DEPENDENCIES)
    480575        $(AM_V_at)-rm -f libcfa.a
     
    484579mostlyclean-compile:
    485580        -rm -f *.$(OBJEXT)
    486         -rm -f concurrency/CtxSwitch-@MACHINE_TYPE@.$(OBJEXT)
    487         -rm -f concurrency/libcfa_a-alarm.$(OBJEXT)
    488         -rm -f concurrency/libcfa_a-coroutine.$(OBJEXT)
    489         -rm -f concurrency/libcfa_a-invoke.$(OBJEXT)
    490         -rm -f concurrency/libcfa_a-kernel.$(OBJEXT)
    491         -rm -f concurrency/libcfa_a-monitor.$(OBJEXT)
    492         -rm -f concurrency/libcfa_a-preemption.$(OBJEXT)
    493         -rm -f concurrency/libcfa_a-thread.$(OBJEXT)
    494         -rm -f concurrency/libcfa_d_a-alarm.$(OBJEXT)
    495         -rm -f concurrency/libcfa_d_a-coroutine.$(OBJEXT)
    496         -rm -f concurrency/libcfa_d_a-invoke.$(OBJEXT)
    497         -rm -f concurrency/libcfa_d_a-kernel.$(OBJEXT)
    498         -rm -f concurrency/libcfa_d_a-monitor.$(OBJEXT)
    499         -rm -f concurrency/libcfa_d_a-preemption.$(OBJEXT)
    500         -rm -f concurrency/libcfa_d_a-thread.$(OBJEXT)
    501         -rm -f containers/libcfa_a-maybe.$(OBJEXT)
    502         -rm -f containers/libcfa_a-pair.$(OBJEXT)
    503         -rm -f containers/libcfa_a-result.$(OBJEXT)
    504         -rm -f containers/libcfa_a-vector.$(OBJEXT)
    505         -rm -f containers/libcfa_d_a-maybe.$(OBJEXT)
    506         -rm -f containers/libcfa_d_a-pair.$(OBJEXT)
    507         -rm -f containers/libcfa_d_a-result.$(OBJEXT)
    508         -rm -f containers/libcfa_d_a-vector.$(OBJEXT)
    509         -rm -f libhdr/libcfa_a-libdebug.$(OBJEXT)
    510         -rm -f libhdr/libcfa_d_a-libdebug.$(OBJEXT)
     581        -rm -f concurrency/*.$(OBJEXT)
     582        -rm -f containers/*.$(OBJEXT)
     583        -rm -f libhdr/*.$(OBJEXT)
    511584
    512585distclean-compile:
     
    514587
    515588@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-assert.Po@am__quote@
     589@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-exception.Po@am__quote@
    516590@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-fstream.Po@am__quote@
    517591@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-interpose.Po@am__quote@
     
    523597@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-rational.Po@am__quote@
    524598@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-stdlib.Po@am__quote@
     599@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-typeobject.Po@am__quote@
    525600@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-assert.Po@am__quote@
     601@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-exception.Po@am__quote@
    526602@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-fstream.Po@am__quote@
    527603@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-interpose.Po@am__quote@
     
    533609@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-rational.Po@am__quote@
    534610@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-typeobject.Po@am__quote@
    535612@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/CtxSwitch-@MACHINE_TYPE@.Po@am__quote@
    536613@AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-alarm.Po@am__quote@
     
    850927@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`
    851928
     929libcfa_d_a-exception.obj: exception.c
     930@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`
     931@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-exception.Tpo $(DEPDIR)/libcfa_d_a-exception.Po
     932@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='exception.c' object='libcfa_d_a-exception.obj' libtool=no @AMDEPBACKSLASH@
     933@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     934@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`
     935
     936libcfa_d_a-typeobject.obj: typeobject.c
     937@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_d_a_CFLAGS) $(CFLAGS) -MT libcfa_d_a-typeobject.obj -MD -MP -MF $(DEPDIR)/libcfa_d_a-typeobject.Tpo -c -o libcfa_d_a-typeobject.obj `if test -f 'typeobject.c'; then $(CYGPATH_W) 'typeobject.c'; else $(CYGPATH_W) '$(srcdir)/typeobject.c'; fi`
     938@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_d_a-typeobject.Tpo $(DEPDIR)/libcfa_d_a-typeobject.Po
     939@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='typeobject.c' object='libcfa_d_a-typeobject.obj' libtool=no @AMDEPBACKSLASH@
     940@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     941@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-typeobject.obj `if test -f 'typeobject.c'; then $(CYGPATH_W) 'typeobject.c'; else $(CYGPATH_W) '$(srcdir)/typeobject.c'; fi`
     942
    852943concurrency/libcfa_d_a-alarm.o: concurrency/alarm.c
    853944@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
     
    11441235@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`
    11451236
     1237libcfa_a-exception.obj: exception.c
     1238@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`
     1239@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-exception.Tpo $(DEPDIR)/libcfa_a-exception.Po
     1240@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='exception.c' object='libcfa_a-exception.obj' libtool=no @AMDEPBACKSLASH@
     1241@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1242@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`
     1243
     1244libcfa_a-typeobject.obj: typeobject.c
     1245@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT libcfa_a-typeobject.obj -MD -MP -MF $(DEPDIR)/libcfa_a-typeobject.Tpo -c -o libcfa_a-typeobject.obj `if test -f 'typeobject.c'; then $(CYGPATH_W) 'typeobject.c'; else $(CYGPATH_W) '$(srcdir)/typeobject.c'; fi`
     1246@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/libcfa_a-typeobject.Tpo $(DEPDIR)/libcfa_a-typeobject.Po
     1247@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='typeobject.c' object='libcfa_a-typeobject.obj' libtool=no @AMDEPBACKSLASH@
     1248@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1249@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -c -o libcfa_a-typeobject.obj `if test -f 'typeobject.c'; then $(CYGPATH_W) 'typeobject.c'; else $(CYGPATH_W) '$(srcdir)/typeobject.c'; fi`
     1250
    11461251concurrency/libcfa_a-alarm.o: concurrency/alarm.c
    11471252@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcfa_a_CFLAGS) $(CFLAGS) -MT concurrency/libcfa_a-alarm.o -MD -MP -MF concurrency/$(DEPDIR)/libcfa_a-alarm.Tpo -c -o concurrency/libcfa_a-alarm.o `test -f 'concurrency/alarm.c' || echo '$(srcdir)/'`concurrency/alarm.c
     
    11801285install-nobase_cfa_includeHEADERS: $(nobase_cfa_include_HEADERS)
    11811286        @$(NORMAL_INSTALL)
    1182         test -z "$(cfa_includedir)" || $(MKDIR_P) "$(DESTDIR)$(cfa_includedir)"
    11831287        @list='$(nobase_cfa_include_HEADERS)'; test -n "$(cfa_includedir)" || list=; \
     1288        if test -n "$$list"; then \
     1289          echo " $(MKDIR_P) '$(DESTDIR)$(cfa_includedir)'"; \
     1290          $(MKDIR_P) "$(DESTDIR)$(cfa_includedir)" || exit 1; \
     1291        fi; \
    11841292        $(am__nobase_list) | while read dir files; do \
    11851293          xfiles=; for file in $$files; do \
     
    11881296          test -z "$$xfiles" || { \
    11891297            test "x$$dir" = x. || { \
    1190               echo "$(MKDIR_P) '$(DESTDIR)$(cfa_includedir)/$$dir'"; \
     1298              echo " $(MKDIR_P) '$(DESTDIR)$(cfa_includedir)/$$dir'"; \
    11911299              $(MKDIR_P) "$(DESTDIR)$(cfa_includedir)/$$dir"; }; \
    11921300            echo " $(INSTALL_HEADER) $$xfiles '$(DESTDIR)$(cfa_includedir)/$$dir'"; \
     
    12001308        dir='$(DESTDIR)$(cfa_includedir)'; $(am__uninstall_files_from_dir)
    12011309
    1202 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
    1203         list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
    1204         unique=`for i in $$list; do \
    1205             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    1206           done | \
    1207           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    1208               END { if (nonempty) { for (i in files) print i; }; }'`; \
    1209         mkid -fID $$unique
    1210 tags: TAGS
    1211 
    1212 TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
    1213                 $(TAGS_FILES) $(LISP)
     1310ID: $(am__tagged_files)
     1311        $(am__define_uniq_tagged_files); mkid -fID $$unique
     1312tags: tags-am
     1313TAGS: tags
     1314
     1315tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
    12141316        set x; \
    12151317        here=`pwd`; \
    1216         list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
    1217         unique=`for i in $$list; do \
    1218             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    1219           done | \
    1220           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    1221               END { if (nonempty) { for (i in files) print i; }; }'`; \
     1318        $(am__define_uniq_tagged_files); \
    12221319        shift; \
    12231320        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
     
    12311328          fi; \
    12321329        fi
    1233 ctags: CTAGS
    1234 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
    1235                 $(TAGS_FILES) $(LISP)
    1236         list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
    1237         unique=`for i in $$list; do \
    1238             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    1239           done | \
    1240           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    1241               END { if (nonempty) { for (i in files) print i; }; }'`; \
     1330ctags: ctags-am
     1331
     1332CTAGS: ctags
     1333ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
     1334        $(am__define_uniq_tagged_files); \
    12421335        test -z "$(CTAGS_ARGS)$$unique" \
    12431336          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
     
    12481341          && $(am__cd) $(top_srcdir) \
    12491342          && gtags -i $(GTAGS_ARGS) "$$here"
     1343cscopelist: cscopelist-am
     1344
     1345cscopelist-am: $(am__tagged_files)
     1346        list='$(am__tagged_files)'; \
     1347        case "$(srcdir)" in \
     1348          [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
     1349          *) sdir=$(subdir)/$(srcdir) ;; \
     1350        esac; \
     1351        for i in $$list; do \
     1352          if test -f "$$i"; then \
     1353            echo "$(subdir)/$$i"; \
     1354          else \
     1355            echo "$$sdir/$$i"; \
     1356          fi; \
     1357        done >> $(top_builddir)/cscope.files
    12501358
    12511359distclean-tags:
     
    13991507.MAKE: install-am install-strip
    14001508
    1401 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
    1402         clean-libLIBRARIES ctags distclean distclean-compile \
    1403         distclean-generic distclean-tags distdir dvi dvi-am html \
    1404         html-am info info-am install install-am install-data \
    1405         install-data-am install-dvi install-dvi-am install-exec \
    1406         install-exec-am install-html install-html-am install-info \
    1407         install-info-am install-libLIBRARIES install-man \
     1509.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
     1510        clean-libLIBRARIES cscopelist-am ctags ctags-am distclean \
     1511        distclean-compile distclean-generic distclean-tags distdir dvi \
     1512        dvi-am html html-am info info-am install install-am \
     1513        install-data install-data-am install-dvi install-dvi-am \
     1514        install-exec install-exec-am install-html install-html-am \
     1515        install-info install-info-am install-libLIBRARIES install-man \
    14081516        install-nobase_cfa_includeHEADERS install-pdf install-pdf-am \
    14091517        install-ps install-ps-am install-strip installcheck \
     
    14111519        maintainer-clean-generic maintainer-clean-local mostlyclean \
    14121520        mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
    1413         tags uninstall uninstall-am uninstall-libLIBRARIES \
     1521        tags tags-am uninstall uninstall-am uninstall-libLIBRARIES \
    14141522        uninstall-nobase_cfa_includeHEADERS
     1523
     1524.PRECIOUS: Makefile
    14151525
    14161526
     
    14281538        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
    14291539
     1540libcfa_a-exception.o : exception.c
     1541        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
     1542
     1543libcfa_a-typeobject.o : typeobject.c
     1544        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
     1545
    14301546concurrency/libcfa_d_a-invoke.o : concurrency/invoke.c
     1547        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
     1548
     1549libcfa_d_a-exception.o : exception.c
     1550        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
     1551
     1552libcfa_d_a-typeobject.o : typeobject.c
    14311553        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
    14321554
  • src/libcfa/concurrency/CtxSwitch-i386.S

    rfea3faa rb826e6b  
    9898        ret
    9999
    100 .text
    101         .align 2
    102 .globl  CtxGet
    103 CtxGet:
    104         movl %esp,SP_OFFSET(%eax)
    105         movl %ebp,FP_OFFSET(%eax)
    106 
    107         ret
    108 
    109100// Local Variables: //
    110101// compile-command: "make install" //
  • src/libcfa/concurrency/CtxSwitch-x86_64.S

    rfea3faa rb826e6b  
    1 //                               -*- Mode: Asm -*- 
     1//                               -*- Mode: Asm -*-
    22//
    33// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    1818// Free Software  Foundation; either  version 2.1 of  the License, or  (at your
    1919// option) any later version.
    20 // 
     20//
    2121// This library is distributed in the  hope that it will be useful, but WITHOUT
    2222// ANY  WARRANTY;  without even  the  implied  warranty  of MERCHANTABILITY  or
    2323// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
    2424// for more details.
    25 // 
     25//
    2626// You should  have received a  copy of the  GNU Lesser General  Public License
    2727// along  with this library.
    28 // 
     28//
    2929
    3030// This context switch routine depends on the fact that the stack of a new
     
    9393.globl  CtxInvokeStub
    9494CtxInvokeStub:
    95         movq %rbx, %rdi 
     95        movq %rbx, %rdi
    9696        jmp *%r12
    97 
    98 .text
    99         .align 2
    100 .globl  CtxGet
    101 CtxGet:
    102         movq %rsp,SP_OFFSET(%rdi)
    103         movq %rbp,FP_OFFSET(%rdi)
    104 
    105         ret
    10697
    10798// Local Variables: //
  • src/libcfa/concurrency/alarm.c

    rfea3faa rb826e6b  
    1616
    1717extern "C" {
     18#include <errno.h>
     19#include <stdio.h>
     20#include <string.h>
    1821#include <time.h>
     22#include <unistd.h>
    1923#include <sys/time.h>
    2024}
     25
     26#include "libhdr.h"
    2127
    2228#include "alarm.h"
     
    2531
    2632//=============================================================================================
     33// time type
     34//=============================================================================================
     35
     36#define one_second         1_000_000_000ul
     37#define one_milisecond         1_000_000ul
     38#define one_microsecond            1_000ul
     39#define one_nanosecond                 1ul
     40
     41__cfa_time_t zero_time = { 0 };
     42
     43void ?{}( __cfa_time_t * this ) { this->val = 0; }
     44void ?{}( __cfa_time_t * this, zero_t zero ) { this->val = 0; }
     45
     46void ?{}( itimerval * this, __cfa_time_t * alarm ) {
     47        this->it_value.tv_sec = alarm->val / one_second;                        // seconds
     48        this->it_value.tv_usec = max( (alarm->val % one_second) / one_microsecond, 1000 ); // microseconds
     49        this->it_interval.tv_sec = 0;
     50        this->it_interval.tv_usec = 0;
     51}
     52
     53
     54void ?{}( __cfa_time_t * this, timespec * curr ) {
     55        uint64_t secs  = curr->tv_sec;
     56        uint64_t nsecs = curr->tv_nsec;
     57        this->val = (secs * one_second) + nsecs;
     58}
     59
     60__cfa_time_t ?=?( __cfa_time_t * this, zero_t rhs ) {
     61        this->val = 0;
     62        return *this;
     63}
     64
     65__cfa_time_t from_s ( uint64_t val ) { __cfa_time_t ret; ret.val = val * 1_000_000_000ul; return ret; }
     66__cfa_time_t from_ms( uint64_t val ) { __cfa_time_t ret; ret.val = val *     1_000_000ul; return ret; }
     67__cfa_time_t from_us( uint64_t val ) { __cfa_time_t ret; ret.val = val *         1_000ul; return ret; }
     68__cfa_time_t from_ns( uint64_t val ) { __cfa_time_t ret; ret.val = val *             1ul; return ret; }
     69
     70//=============================================================================================
    2771// Clock logic
    2872//=============================================================================================
     
    3175        timespec curr;
    3276        clock_gettime( CLOCK_REALTIME, &curr );
    33         return ((__cfa_time_t)curr.tv_sec * TIMEGRAN) + curr.tv_nsec;
     77        return (__cfa_time_t){ &curr };
    3478}
    3579
    3680void __kernel_set_timer( __cfa_time_t alarm ) {
    37         itimerval val;
    38         val.it_value.tv_sec = alarm / TIMEGRAN;                 // seconds
    39         val.it_value.tv_usec = (alarm % TIMEGRAN) / ( TIMEGRAN / 1_000_000L ); // microseconds
    40         val.it_interval.tv_sec = 0;
    41         val.it_interval.tv_usec = 0;
     81        itimerval val = { &alarm };
    4282        setitimer( ITIMER_REAL, &val, NULL );
    4383}
     
    4787//=============================================================================================
    4888
    49 void ?{}( alarm_node_t * this, thread_desc * thrd, __cfa_time_t alarm = 0, __cfa_time_t period = 0 ) {
     89void ?{}( alarm_node_t * this, thread_desc * thrd, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time ) {
    5090        this->thrd = thrd;
    5191        this->alarm = alarm;
     
    5696}
    5797
    58 void ?{}( alarm_node_t * this, processor   * proc, __cfa_time_t alarm = 0, __cfa_time_t period = 0 ) {
     98void ?{}( alarm_node_t * this, processor   * proc, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time ) {
    5999        this->proc = proc;
    60100        this->alarm = alarm;
     
    71111}
    72112
     113LIB_DEBUG_DO( bool validate( alarm_list_t * this ) {
     114        alarm_node_t ** it = &this->head;
     115        while( (*it) ) {
     116                it = &(*it)->next;
     117        }
     118
     119        return it == this->tail;
     120})
     121
    73122static inline void insert_at( alarm_list_t * this, alarm_node_t * n, __alarm_it_t p ) {
    74         assert( !n->next );
     123        verify( !n->next );
    75124        if( p == this->tail ) {
    76125                this->tail = &n->next;
     
    80129        }
    81130        *p = n;
     131
     132        verify( validate( this ) );
    82133}
    83134
     
    89140
    90141        insert_at( this, n, it );
     142
     143        verify( validate( this ) );
    91144}
    92145
     
    100153                head->next = NULL;
    101154        }
     155        verify( validate( this ) );
    102156        return head;
    103157}
     
    105159static inline void remove_at( alarm_list_t * this, alarm_node_t * n, __alarm_it_t it ) {
    106160        verify( it );
    107         verify( (*it)->next == n );
    108 
    109         (*it)->next = n->next;
     161        verify( (*it) == n );
     162
     163        (*it) = n->next;
    110164        if( !n-> next ) {
    111165                this->tail = it;
    112166        }
    113167        n->next = NULL;
     168
     169        verify( validate( this ) );
    114170}
    115171
    116172static inline void remove( alarm_list_t * this, alarm_node_t * n ) {
    117173        alarm_node_t ** it = &this->head;
    118         while( (*it) && (*it)->next != n ) {
     174        while( (*it) && (*it) != n ) {
    119175                it = &(*it)->next;
    120176        }
    121177
     178        verify( validate( this ) );
     179
    122180        if( *it ) { remove_at( this, n, it ); }
     181
     182        verify( validate( this ) );
    123183}
    124184
    125185void register_self( alarm_node_t * this ) {
     186        alarm_list_t * alarms = &event_kernel->alarms;
     187
    126188        disable_interrupts();
    127         assert( !systemProcessor->pending_alarm );
    128         lock( &systemProcessor->alarm_lock );
     189        lock( &event_kernel->lock DEBUG_CTX2 );
    129190        {
    130                 insert( &systemProcessor->alarms, this );
    131                 if( systemProcessor->pending_alarm ) {
    132                         tick_preemption();
     191                verify( validate( alarms ) );
     192                bool first = !alarms->head;
     193
     194                insert( alarms, this );
     195                if( first ) {
     196                        __kernel_set_timer( alarms->head->alarm - __kernel_get_time() );
    133197                }
    134198        }
    135         unlock( &systemProcessor->alarm_lock );
     199        unlock( &event_kernel->lock );
    136200        this->set = true;
    137         enable_interrupts();
     201        enable_interrupts( DEBUG_CTX );
    138202}
    139203
    140204void unregister_self( alarm_node_t * this ) {
    141205        disable_interrupts();
    142         lock( &systemProcessor->alarm_lock );
    143         remove( &systemProcessor->alarms, this );
    144         unlock( &systemProcessor->alarm_lock );
    145         disable_interrupts();
     206        lock( &event_kernel->lock DEBUG_CTX2 );
     207        {
     208                verify( validate( &event_kernel->alarms ) );
     209                remove( &event_kernel->alarms, this );
     210        }
     211        unlock( &event_kernel->lock );
     212        enable_interrupts( DEBUG_CTX );
    146213        this->set = false;
    147214}
  • src/libcfa/concurrency/alarm.h

    rfea3faa rb826e6b  
    1919
    2020#include <stdbool.h>
     21#include <stdint.h>
    2122
    2223#include "assert"
    23 
    24 typedef unsigned long int __cfa_time_t;
    2524
    2625struct thread_desc;
    2726struct processor;
    2827
     28struct timespec;
     29struct itimerval;
     30
     31//=============================================================================================
     32// time type
     33//=============================================================================================
     34
     35struct __cfa_time_t {
     36        uint64_t val;
     37};
     38
     39// ctors
     40void ?{}( __cfa_time_t * this );
     41void ?{}( __cfa_time_t * this, zero_t zero );
     42void ?{}( __cfa_time_t * this, timespec * curr );
     43void ?{}( itimerval * this, __cfa_time_t * alarm );
     44
     45__cfa_time_t ?=?( __cfa_time_t * this, zero_t rhs );
     46
     47// logical ops
     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; }
     52static inline bool ?>=?( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val >= rhs.val; }
     53static inline bool ?<=?( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val <= rhs.val; }
     54
     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; }
     59static inline bool ?>=?( __cfa_time_t lhs, zero_t rhs ) { return lhs.val >= rhs; }
     60static inline bool ?<=?( __cfa_time_t lhs, zero_t rhs ) { return lhs.val <= rhs; }
     61
     62// addition/substract
     63static inline __cfa_time_t ?+?( __cfa_time_t lhs, __cfa_time_t rhs ) {
     64        __cfa_time_t ret;
     65        ret.val = lhs.val + rhs.val;
     66        return ret;
     67}
     68
     69static inline __cfa_time_t ?-?( __cfa_time_t lhs, __cfa_time_t rhs ) {
     70        __cfa_time_t ret;
     71        ret.val = lhs.val - rhs.val;
     72        return ret;
     73}
     74
     75__cfa_time_t from_s ( uint64_t );
     76__cfa_time_t from_ms( uint64_t );
     77__cfa_time_t from_us( uint64_t );
     78__cfa_time_t from_ns( uint64_t );
     79
     80extern __cfa_time_t zero_time;
     81
    2982//=============================================================================================
    3083// Clock logic
    3184//=============================================================================================
    32 
    33 #define TIMEGRAN 1_000_000_000L                         // nanosecond granularity, except for timeval
    3485
    3586__cfa_time_t __kernel_get_time();
     
    56107typedef alarm_node_t ** __alarm_it_t;
    57108
    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 );
     109void ?{}( alarm_node_t * this, thread_desc * thrd, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time );
     110void ?{}( alarm_node_t * this, processor   * proc, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time );
    60111void ^?{}( alarm_node_t * this );
    61112
  • src/libcfa/concurrency/coroutine

    rfea3faa rb826e6b  
    6363
    6464// Get current coroutine
    65 coroutine_desc * this_coroutine(void);
     65extern volatile thread_local coroutine_desc * this_coroutine;
    6666
    6767// Private wrappers for context switch and stack creation
     
    7171// Suspend implementation inlined for performance
    7272static inline void suspend() {
    73         coroutine_desc * src = this_coroutine();                // optimization
     73        coroutine_desc * src = this_coroutine;          // optimization
    7474
    7575        assertf( src->last != 0,
     
    8888forall(dtype T | is_coroutine(T))
    8989static inline void resume(T * cor) {
    90         coroutine_desc * src = this_coroutine();                // optimization
     90        coroutine_desc * src = this_coroutine;          // optimization
    9191        coroutine_desc * dst = get_coroutine(cor);
    9292
     
    112112
    113113static inline void resume(coroutine_desc * dst) {
    114         coroutine_desc * src = this_coroutine();                // optimization
     114        coroutine_desc * src = this_coroutine;          // optimization
    115115
    116116        // not resuming self ?
  • src/libcfa/concurrency/coroutine.c

    rfea3faa rb826e6b  
    3232#include "invoke.h"
    3333
    34 extern thread_local processor * this_processor;
     34extern volatile thread_local processor * this_processor;
    3535
    3636//-----------------------------------------------------------------------------
     
    4444// Coroutine ctors and dtors
    4545void ?{}(coStack_t* this) {
    46         this->size              = 10240;        // size of stack
     46        this->size              = 65000;        // size of stack
    4747        this->storage   = NULL; // pointer to stack
    4848        this->limit             = NULL; // stack grows towards stack limit
     
    5050        this->context   = NULL; // address of cfa_context_t
    5151        this->top               = NULL; // address of top of storage
    52         this->userStack = false;       
     52        this->userStack = false;
    5353}
    5454
     
    106106
    107107        // set state of current coroutine to inactive
    108         src->state = Inactive;
     108        src->state = src->state == Halted ? Halted : Inactive;
    109109
    110110        // set new coroutine that task is executing
    111         this_processor->current_coroutine = dst;
     111        this_coroutine = dst;
    112112
    113113        // context switch to specified coroutine
     114        assert( src->stack.context );
    114115        CtxSwitch( src->stack.context, dst->stack.context );
    115         // when CtxSwitch returns we are back in the src coroutine             
     116        // when CtxSwitch returns we are back in the src coroutine
    116117
    117118        // set state of new coroutine to active
     
    131132                this->size = libCeiling( storageSize, 16 );
    132133                // use malloc/memalign because "new" raises an exception for out-of-memory
    133                
     134
    134135                // assume malloc has 8 byte alignment so add 8 to allow rounding up to 16 byte alignment
    135136                LIB_DEBUG_DO( this->storage = memalign( pageSize, cxtSize + this->size + pageSize ) );
  • src/libcfa/concurrency/invoke.c

    rfea3faa rb826e6b  
    2929
    3030extern void __suspend_internal(void);
    31 extern void __leave_monitor_desc( struct monitor_desc * this );
     31extern void __leave_thread_monitor( struct thread_desc * this );
     32extern void disable_interrupts();
     33extern void enable_interrupts( DEBUG_CTX_PARAM );
    3234
    3335void CtxInvokeCoroutine(
    34       void (*main)(void *), 
    35       struct coroutine_desc *(*get_coroutine)(void *), 
     36      void (*main)(void *),
     37      struct coroutine_desc *(*get_coroutine)(void *),
    3638      void *this
    3739) {
     
    5658
    5759void CtxInvokeThread(
    58       void (*dtor)(void *), 
    59       void (*main)(void *), 
    60       struct thread_desc *(*get_thread)(void *), 
     60      void (*dtor)(void *),
     61      void (*main)(void *),
     62      struct thread_desc *(*get_thread)(void *),
    6163      void *this
    6264) {
     65      // First suspend, once the thread arrives here,
     66      // the function pointer to main can be invalidated without risk
    6367      __suspend_internal();
    6468
     69      // Fetch the thread handle from the user defined thread structure
    6570      struct thread_desc* thrd = get_thread( this );
    66       struct coroutine_desc* cor = &thrd->cor;
    67       struct monitor_desc* mon = &thrd->mon;
    68       cor->state = Active;
    6971
    70       // LIB_DEBUG_PRINTF("Invoke Thread : invoking main %p (args %p)\n", main, this);
     72      // Officially start the thread by enabling preemption
     73      enable_interrupts( DEBUG_CTX );
     74
     75      // Call the main of the thread
    7176      main( this );
    7277
    73       __leave_monitor_desc( mon );
    74 
     78      // To exit a thread we must :
     79      // 1 - Mark it as halted
     80      // 2 - Leave its monitor
     81      // 3 - Disable the interupts
     82      // 4 - Final suspend
     83      // The order of these 4 operations is very important
    7584      //Final suspend, should never return
    76       __suspend_internal();
     85      __leave_thread_monitor( thrd );
    7786      abortf("Resumed dead thread");
    7887}
     
    8089
    8190void CtxStart(
    82       void (*main)(void *), 
    83       struct coroutine_desc *(*get_coroutine)(void *), 
    84       void *this, 
     91      void (*main)(void *),
     92      struct coroutine_desc *(*get_coroutine)(void *),
     93      void *this,
    8594      void (*invoke)(void *)
    8695) {
     
    108117        ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->rturn = invoke;
    109118      ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->mxcr = 0x1F80; //Vol. 2A 3-520
    110       ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->fcw = 0x037F;  //Vol. 1 8-7 
     119      ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->fcw = 0x037F;  //Vol. 1 8-7
    111120
    112121#elif defined( __x86_64__ )
     
    128137      ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->fixedRegisters[1] = invoke;
    129138      ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->mxcr = 0x1F80; //Vol. 2A 3-520
    130       ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->fcw = 0x037F;  //Vol. 1 8-7 
     139      ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->fcw = 0x037F;  //Vol. 1 8-7
    131140#else
    132141      #error Only __i386__ and __x86_64__ is supported for threads in cfa
  • src/libcfa/concurrency/invoke.h

    rfea3faa rb826e6b  
    3131      struct spinlock {
    3232            volatile int lock;
     33            #ifdef __CFA_DEBUG__
     34                  const char * prev_name;
     35                  void* prev_thrd;
     36            #endif
    3337      };
    3438
     
    8387            struct __thread_queue_t entry_queue;      // queue of threads that are blocked waiting for the monitor
    8488            struct __condition_stack_t signal_stack;  // stack of conditions to run next once we exit the monitor
    85             struct monitor_desc * stack_owner;        // if bulk acquiring was used we need to synchronize signals with an other monitor
    8689            unsigned int recursion;                   // monitor routines can be called recursively, we need to keep track of that
    8790      };
     
    99102#ifndef _INVOKE_PRIVATE_H_
    100103#define _INVOKE_PRIVATE_H_
    101      
     104
    102105      struct machine_context_t {
    103106            void *SP;
     
    109112      extern void CtxInvokeStub( void );
    110113      void CtxSwitch( void * from, void * to ) asm ("CtxSwitch");
    111       void CtxGet( void * this ) asm ("CtxGet");
     114
     115      #if   defined( __x86_64__ )
     116      #define CtxGet( ctx ) __asm__ ( \
     117                  "movq %%rsp,%0\n"   \
     118                  "movq %%rbp,%1\n"   \
     119            : "=rm" (ctx.SP), "=rm" (ctx.FP) )
     120      #elif defined( __i386__ )
     121      #define CtxGet( ctx ) __asm__ ( \
     122                  "movl %%esp,%0\n"   \
     123                  "movl %%ebp,%1\n"   \
     124            : "=rm" (ctx.SP), "=rm" (ctx.FP) )
     125      #endif
    112126
    113127#endif //_INVOKE_PRIVATE_H_
  • src/libcfa/concurrency/kernel

    rfea3faa rb826e6b  
    2828//-----------------------------------------------------------------------------
    2929// Locks
    30 bool try_lock( spinlock * );
    31 void lock( spinlock * );
    32 void unlock( spinlock * );
     30void lock      ( spinlock * DEBUG_CTX_PARAM2 );       // Lock the spinlock, spin if already acquired
     31void lock_yield( spinlock * DEBUG_CTX_PARAM2 );       // Lock the spinlock, yield repeatedly if already acquired
     32bool try_lock  ( spinlock * DEBUG_CTX_PARAM2 );       // Lock the spinlock, return false if already acquired
     33void unlock    ( spinlock * );                        // Unlock the spinlock
    3334
    34 struct signal_once {
    35         volatile bool cond;
    36         struct spinlock lock;
    37         struct __thread_queue_t blocked;
     35struct semaphore {
     36        spinlock lock;
     37        int count;
     38        __thread_queue_t waiting;
    3839};
    3940
    40 void ?{}(signal_once * this);
    41 void ^?{}(signal_once * this);
     41void  ?{}(semaphore * this, int count = 1);
     42void ^?{}(semaphore * this);
     43void P(semaphore * this);
     44void V(semaphore * this);
    4245
    43 void wait( signal_once * );
    44 void signal( signal_once * );
    4546
    4647//-----------------------------------------------------------------------------
    4748// Cluster
    4849struct cluster {
    49         __thread_queue_t ready_queue;
    50         spinlock lock;
     50        spinlock ready_queue_lock;                      // Ready queue locks
     51        __thread_queue_t ready_queue;                   // Ready queue for threads
     52        unsigned long long int preemption;              // Preemption rate on this cluster
    5153};
    5254
     
    6870        unsigned short thrd_count;
    6971};
    70 static inline void ?{}(FinishAction * this) { 
     72static inline void ?{}(FinishAction * this) {
    7173        this->action_code = No_Action;
    7274        this->thrd = NULL;
     
    7577static inline void ^?{}(FinishAction * this) {}
    7678
     79// Processor
     80// Wrapper around kernel threads
    7781struct processor {
    78         struct processorCtx_t * runner;
    79         cluster * cltr;
    80         coroutine_desc * current_coroutine;
    81         thread_desc * current_thread;
    82         pthread_t kernel_thread;
    83        
    84         signal_once terminated;
    85         volatile bool is_terminated;
     82        // Main state
     83        struct processorCtx_t * runner;                 // Coroutine ctx who does keeps the state of the processor
     84        cluster * cltr;                                 // Cluster from which to get threads
     85        pthread_t kernel_thread;                        // Handle to pthreads
    8686
    87         struct FinishAction finish;
     87        // Termination
     88        volatile bool do_terminate;                     // Set to true to notify the processor should terminate
     89        semaphore terminated;                           // Termination synchronisation
    8890
    89         struct alarm_node_t * preemption_alarm;
    90         unsigned int preemption;
     91        // RunThread data
     92        struct FinishAction finish;                     // Action to do after a thread is ran
    9193
    92         unsigned short disable_preempt_count;
     94        // Preemption data
     95        struct alarm_node_t * preemption_alarm;         // Node which is added in the discrete event simulaiton
     96        bool pending_preemption;                        // If true, a preemption was triggered in an unsafe region, the processor must preempt as soon as possible
    9397
    94         bool pending_preemption;
     98#ifdef __CFA_DEBUG__
     99        char * last_enable;                             // Last function to enable preemption on this processor
     100#endif
    95101};
    96102
  • src/libcfa/concurrency/kernel.c

    rfea3faa rb826e6b  
    1515//
    1616
    17 #include "startup.h"
    18 
    19 //Start and stop routine for the kernel, declared first to make sure they run first
    20 void kernel_startup(void)  __attribute__(( constructor( STARTUP_PRIORITY_KERNEL ) ));
    21 void kernel_shutdown(void) __attribute__(( destructor ( STARTUP_PRIORITY_KERNEL ) ));
    22 
    23 //Header
    24 #include "kernel_private.h"
     17#include "libhdr.h"
    2518
    2619//C Includes
     
    3528
    3629//CFA Includes
    37 #include "libhdr.h"
     30#include "kernel_private.h"
    3831#include "preemption.h"
     32#include "startup.h"
    3933
    4034//Private includes
     
    4236#include "invoke.h"
    4337
     38//Start and stop routine for the kernel, declared first to make sure they run first
     39void kernel_startup(void)  __attribute__(( constructor( STARTUP_PRIORITY_KERNEL ) ));
     40void kernel_shutdown(void) __attribute__(( destructor ( STARTUP_PRIORITY_KERNEL ) ));
     41
    4442//-----------------------------------------------------------------------------
    4543// Kernel storage
    46 #define KERNEL_STORAGE(T,X) static char X##_storage[sizeof(T)]
    47 
    48 KERNEL_STORAGE(processorCtx_t, systemProcessorCtx);
    49 KERNEL_STORAGE(cluster, systemCluster);
    50 KERNEL_STORAGE(system_proc_t, systemProcessor);
    51 KERNEL_STORAGE(thread_desc, mainThread);
    52 KERNEL_STORAGE(machine_context_t, mainThread_context);
    53 
    54 cluster * systemCluster;
    55 system_proc_t * systemProcessor;
     44KERNEL_STORAGE(cluster,           mainCluster);
     45KERNEL_STORAGE(processor,         mainProcessor);
     46KERNEL_STORAGE(processorCtx_t,    mainProcessorCtx);
     47KERNEL_STORAGE(thread_desc,       mainThread);
     48KERNEL_STORAGE(machine_context_t, mainThreadCtx);
     49
     50cluster *     mainCluster;
     51processor *   mainProcessor;
    5652thread_desc * mainThread;
    5753
     
    5955// Global state
    6056
    61 thread_local processor * this_processor;
    62 
    63 coroutine_desc * this_coroutine(void) {
    64         return this_processor->current_coroutine;
    65 }
    66 
    67 thread_desc * this_thread(void) {
    68         return this_processor->current_thread;
    69 }
     57volatile thread_local coroutine_desc * this_coroutine;
     58volatile thread_local thread_desc * this_thread;
     59volatile thread_local processor * this_processor;
     60
     61volatile thread_local bool preemption_in_progress = 0;
     62volatile thread_local unsigned short disable_preempt_count = 1;
    7063
    7164//-----------------------------------------------------------------------------
    7265// Main thread construction
    7366struct current_stack_info_t {
    74         machine_context_t ctx; 
     67        machine_context_t ctx;
    7568        unsigned int size;              // size of stack
    7669        void *base;                             // base of stack
     
    8275
    8376void ?{}( current_stack_info_t * this ) {
    84         CtxGet( &this->ctx );
     77        CtxGet( this->ctx );
    8578        this->base = this->ctx.FP;
    8679        this->storage = this->ctx.SP;
     
    9184
    9285        this->limit = (void *)(((intptr_t)this->base) - this->size);
    93         this->context = &mainThread_context_storage;
     86        this->context = &storage_mainThreadCtx;
    9487        this->top = this->base;
    9588}
     
    10699
    107100void ?{}( coroutine_desc * this, current_stack_info_t * info) {
    108         (&this->stack){ info }; 
     101        (&this->stack){ info };
    109102        this->name = "Main Thread";
    110103        this->errno_ = 0;
     
    131124
    132125void ?{}(processor * this) {
    133         this{ systemCluster };
     126        this{ mainCluster };
    134127}
    135128
    136129void ?{}(processor * this, cluster * cltr) {
    137130        this->cltr = cltr;
    138         this->current_coroutine = NULL;
    139         this->current_thread = NULL;
    140         (&this->terminated){};
    141         this->is_terminated = false;
     131        (&this->terminated){ 0 };
     132        this->do_terminate = false;
    142133        this->preemption_alarm = NULL;
    143         this->preemption = default_preemption();
    144         this->disable_preempt_count = 1;                //Start with interrupts disabled
    145134        this->pending_preemption = false;
    146135
     
    150139void ?{}(processor * this, cluster * cltr, processorCtx_t * runner) {
    151140        this->cltr = cltr;
    152         this->current_coroutine = NULL;
    153         this->current_thread = NULL;
    154         (&this->terminated){};
    155         this->is_terminated = false;
    156         this->disable_preempt_count = 0;
     141        (&this->terminated){ 0 };
     142        this->do_terminate = false;
     143        this->preemption_alarm = NULL;
    157144        this->pending_preemption = false;
     145        this->kernel_thread = pthread_self();
    158146
    159147        this->runner = runner;
    160         LIB_DEBUG_PRINT_SAFE("Kernel : constructing processor context %p\n", runner);
     148        LIB_DEBUG_PRINT_SAFE("Kernel : constructing main processor context %p\n", runner);
    161149        runner{ this };
    162150}
    163151
    164 void ?{}(system_proc_t * this, cluster * cltr, processorCtx_t * runner) {
    165         (&this->alarms){};
    166         (&this->alarm_lock){};
    167         this->pending_alarm = false;
    168 
    169         (&this->proc){ cltr, runner };
    170 }
    171 
    172152void ^?{}(processor * this) {
    173         if( ! this->is_terminated ) {
     153        if( ! this->do_terminate ) {
    174154                LIB_DEBUG_PRINT_SAFE("Kernel : core %p signaling termination\n", this);
    175                 this->is_terminated = true;
    176                 wait( &this->terminated );
     155                this->do_terminate = true;
     156                P( &this->terminated );
     157                pthread_join( this->kernel_thread, NULL );
    177158        }
    178159}
     
    180161void ?{}(cluster * this) {
    181162        ( &this->ready_queue ){};
    182         ( &this->lock ){};
     163        ( &this->ready_queue_lock ){};
     164
     165        this->preemption = default_preemption();
    183166}
    184167
    185168void ^?{}(cluster * this) {
    186        
     169
    187170}
    188171
     
    203186
    204187                thread_desc * readyThread = NULL;
    205                 for( unsigned int spin_count = 0; ! this->is_terminated; spin_count++ )
     188                for( unsigned int spin_count = 0; ! this->do_terminate; spin_count++ )
    206189                {
    207190                        readyThread = nextThread( this->cltr );
     
    209192                        if(readyThread)
    210193                        {
     194                                verify( disable_preempt_count > 0 );
     195
    211196                                runThread(this, readyThread);
     197
     198                                verify( disable_preempt_count > 0 );
    212199
    213200                                //Some actions need to be taken from the kernel
     
    225212        }
    226213
    227         signal( &this->terminated );
     214        V( &this->terminated );
     215
    228216        LIB_DEBUG_PRINT_SAFE("Kernel : core %p terminated\n", this);
    229217}
    230218
    231 // runThread runs a thread by context switching 
    232 // from the processor coroutine to the target thread 
     219// runThread runs a thread by context switching
     220// from the processor coroutine to the target thread
    233221void runThread(processor * this, thread_desc * dst) {
    234222        coroutine_desc * proc_cor = get_coroutine(this->runner);
    235223        coroutine_desc * thrd_cor = get_coroutine(dst);
    236        
     224
    237225        //Reset the terminating actions here
    238226        this->finish.action_code = No_Action;
    239227
    240228        //Update global state
    241         this->current_thread = dst;
     229        this_thread = dst;
    242230
    243231        // Context Switch to the thread
     
    246234}
    247235
    248 // Once a thread has finished running, some of 
     236// Once a thread has finished running, some of
    249237// its final actions must be executed from the kernel
    250238void finishRunning(processor * this) {
     
    256244        }
    257245        else if( this->finish.action_code == Release_Schedule ) {
    258                 unlock( this->finish.lock );           
     246                unlock( this->finish.lock );
    259247                ScheduleThread( this->finish.thrd );
    260248        }
     
    289277        processor * proc = (processor *) arg;
    290278        this_processor = proc;
     279        this_coroutine = NULL;
     280        this_thread = NULL;
     281        disable_preempt_count = 1;
    291282        // SKULLDUGGERY: We want to create a context for the processor coroutine
    292283        // which is needed for the 2-step context switch. However, there is no reason
    293         // to waste the perfectly valid stack create by pthread. 
     284        // to waste the perfectly valid stack create by pthread.
    294285        current_stack_info_t info;
    295286        machine_context_t ctx;
     
    300291
    301292        //Set global state
    302         proc->current_coroutine = &proc->runner->__cor;
    303         proc->current_thread = NULL;
     293        this_coroutine = &proc->runner->__cor;
     294        this_thread = NULL;
    304295
    305296        //We now have a proper context from which to schedule threads
    306297        LIB_DEBUG_PRINT_SAFE("Kernel : core %p created (%p, %p)\n", proc, proc->runner, &ctx);
    307298
    308         // SKULLDUGGERY: Since the coroutine doesn't have its own stack, we can't 
    309         // resume it to start it like it normally would, it will just context switch 
    310         // back to here. Instead directly call the main since we already are on the 
     299        // SKULLDUGGERY: Since the coroutine doesn't have its own stack, we can't
     300        // resume it to start it like it normally would, it will just context switch
     301        // back to here. Instead directly call the main since we already are on the
    311302        // appropriate stack.
    312303        proc_cor_storage.__cor.state = Active;
     
    315306
    316307        // Main routine of the core returned, the core is now fully terminated
    317         LIB_DEBUG_PRINT_SAFE("Kernel : core %p main ended (%p)\n", proc, proc->runner); 
     308        LIB_DEBUG_PRINT_SAFE("Kernel : core %p main ended (%p)\n", proc, proc->runner);
    318309
    319310        return NULL;
     
    322313void start(processor * this) {
    323314        LIB_DEBUG_PRINT_SAFE("Kernel : Starting core %p\n", this);
    324        
     315
    325316        pthread_create( &this->kernel_thread, NULL, CtxInvokeProcessor, (void*)this );
    326317
    327         LIB_DEBUG_PRINT_SAFE("Kernel : core %p started\n", this);       
     318        LIB_DEBUG_PRINT_SAFE("Kernel : core %p started\n", this);
    328319}
    329320
     
    331322// Scheduler routines
    332323void ScheduleThread( thread_desc * thrd ) {
    333         if( !thrd ) return;
     324        // if( !thrd ) return;
     325        assert( thrd );
     326        assert( thrd->cor.state != Halted );
     327
     328        verify( disable_preempt_count > 0 );
    334329
    335330        verifyf( thrd->next == NULL, "Expected null got %p", thrd->next );
    336        
    337         lock( &systemProcessor->proc.cltr->lock );
    338         append( &systemProcessor->proc.cltr->ready_queue, thrd );
    339         unlock( &systemProcessor->proc.cltr->lock );
     331
     332        lock(   &this_processor->cltr->ready_queue_lock DEBUG_CTX2 );
     333        append( &this_processor->cltr->ready_queue, thrd );
     334        unlock( &this_processor->cltr->ready_queue_lock );
     335
     336        verify( disable_preempt_count > 0 );
    340337}
    341338
    342339thread_desc * nextThread(cluster * this) {
    343         lock( &this->lock );
     340        verify( disable_preempt_count > 0 );
     341        lock( &this->ready_queue_lock DEBUG_CTX2 );
    344342        thread_desc * head = pop_head( &this->ready_queue );
    345         unlock( &this->lock );
     343        unlock( &this->ready_queue_lock );
     344        verify( disable_preempt_count > 0 );
    346345        return head;
    347346}
    348347
    349 void ScheduleInternal() {
    350         suspend();
    351 }
    352 
    353 void ScheduleInternal( spinlock * lock ) {
     348void BlockInternal() {
     349        disable_interrupts();
     350        verify( disable_preempt_count > 0 );
     351        suspend();
     352        verify( disable_preempt_count > 0 );
     353        enable_interrupts( DEBUG_CTX );
     354}
     355
     356void BlockInternal( spinlock * lock ) {
     357        disable_interrupts();
    354358        this_processor->finish.action_code = Release;
    355359        this_processor->finish.lock = lock;
    356         suspend();
    357 }
    358 
    359 void ScheduleInternal( thread_desc * thrd ) {
     360
     361        verify( disable_preempt_count > 0 );
     362        suspend();
     363        verify( disable_preempt_count > 0 );
     364
     365        enable_interrupts( DEBUG_CTX );
     366}
     367
     368void BlockInternal( thread_desc * thrd ) {
     369        disable_interrupts();
     370        assert( thrd->cor.state != Halted );
    360371        this_processor->finish.action_code = Schedule;
    361372        this_processor->finish.thrd = thrd;
    362         suspend();
    363 }
    364 
    365 void ScheduleInternal( spinlock * lock, thread_desc * thrd ) {
     373
     374        verify( disable_preempt_count > 0 );
     375        suspend();
     376        verify( disable_preempt_count > 0 );
     377
     378        enable_interrupts( DEBUG_CTX );
     379}
     380
     381void BlockInternal( spinlock * lock, thread_desc * thrd ) {
     382        disable_interrupts();
    366383        this_processor->finish.action_code = Release_Schedule;
    367384        this_processor->finish.lock = lock;
    368385        this_processor->finish.thrd = thrd;
    369         suspend();
    370 }
    371 
    372 void ScheduleInternal(spinlock ** locks, unsigned short count) {
     386
     387        verify( disable_preempt_count > 0 );
     388        suspend();
     389        verify( disable_preempt_count > 0 );
     390
     391        enable_interrupts( DEBUG_CTX );
     392}
     393
     394void BlockInternal(spinlock ** locks, unsigned short count) {
     395        disable_interrupts();
    373396        this_processor->finish.action_code = Release_Multi;
    374397        this_processor->finish.locks = locks;
    375398        this_processor->finish.lock_count = count;
    376         suspend();
    377 }
    378 
    379 void ScheduleInternal(spinlock ** locks, unsigned short lock_count, thread_desc ** thrds, unsigned short thrd_count) {
     399
     400        verify( disable_preempt_count > 0 );
     401        suspend();
     402        verify( disable_preempt_count > 0 );
     403
     404        enable_interrupts( DEBUG_CTX );
     405}
     406
     407void BlockInternal(spinlock ** locks, unsigned short lock_count, thread_desc ** thrds, unsigned short thrd_count) {
     408        disable_interrupts();
    380409        this_processor->finish.action_code = Release_Multi_Schedule;
    381410        this_processor->finish.locks = locks;
     
    383412        this_processor->finish.thrds = thrds;
    384413        this_processor->finish.thrd_count = thrd_count;
     414
     415        verify( disable_preempt_count > 0 );
     416        suspend();
     417        verify( disable_preempt_count > 0 );
     418
     419        enable_interrupts( DEBUG_CTX );
     420}
     421
     422void LeaveThread(spinlock * lock, thread_desc * thrd) {
     423        verify( disable_preempt_count > 0 );
     424        this_processor->finish.action_code = thrd ? Release_Schedule : Release;
     425        this_processor->finish.lock = lock;
     426        this_processor->finish.thrd = thrd;
     427
    385428        suspend();
    386429}
     
    392435// Kernel boot procedures
    393436void kernel_startup(void) {
    394         LIB_DEBUG_PRINT_SAFE("Kernel : Starting\n");   
     437        LIB_DEBUG_PRINT_SAFE("Kernel : Starting\n");
    395438
    396439        // Start by initializing the main thread
    397         // SKULLDUGGERY: the mainThread steals the process main thread 
    398         // which will then be scheduled by the systemProcessor normally
    399         mainThread = (thread_desc *)&mainThread_storage;
     440        // SKULLDUGGERY: the mainThread steals the process main thread
     441        // which will then be scheduled by the mainProcessor normally
     442        mainThread = (thread_desc *)&storage_mainThread;
    400443        current_stack_info_t info;
    401444        mainThread{ &info };
     
    403446        LIB_DEBUG_PRINT_SAFE("Kernel : Main thread ready\n");
    404447
     448        // Initialize the main cluster
     449        mainCluster = (cluster *)&storage_mainCluster;
     450        mainCluster{};
     451
     452        LIB_DEBUG_PRINT_SAFE("Kernel : main cluster ready\n");
     453
     454        // Initialize the main processor and the main processor ctx
     455        // (the coroutine that contains the processing control flow)
     456        mainProcessor = (processor *)&storage_mainProcessor;
     457        mainProcessor{ mainCluster, (processorCtx_t *)&storage_mainProcessorCtx };
     458
     459        //initialize the global state variables
     460        this_processor = mainProcessor;
     461        this_thread = mainThread;
     462        this_coroutine = &mainThread->cor;
     463
    405464        // Enable preemption
    406465        kernel_start_preemption();
    407466
    408         // Initialize the system cluster
    409         systemCluster = (cluster *)&systemCluster_storage;
    410         systemCluster{};
    411 
    412         LIB_DEBUG_PRINT_SAFE("Kernel : System cluster ready\n");
    413 
    414         // Initialize the system processor and the system processor ctx
    415         // (the coroutine that contains the processing control flow)
    416         systemProcessor = (system_proc_t *)&systemProcessor_storage;
    417         systemProcessor{ systemCluster, (processorCtx_t *)&systemProcessorCtx_storage };
    418 
    419         // Add the main thread to the ready queue
    420         // once resume is called on systemProcessor->runner the mainThread needs to be scheduled like any normal thread
     467        // Add the main thread to the ready queue
     468        // once resume is called on mainProcessor->runner the mainThread needs to be scheduled like any normal thread
    421469        ScheduleThread(mainThread);
    422470
    423         //initialize the global state variables
    424         this_processor = &systemProcessor->proc;
    425         this_processor->current_thread = mainThread;
    426         this_processor->current_coroutine = &mainThread->cor;
    427 
    428         // SKULLDUGGERY: Force a context switch to the system processor to set the main thread's context to the current UNIX
     471        // SKULLDUGGERY: Force a context switch to the main processor to set the main thread's context to the current UNIX
    429472        // context. Hence, the main thread does not begin through CtxInvokeThread, like all other threads. The trick here is that
    430         // mainThread is on the ready queue when this call is made. 
    431         resume( systemProcessor->proc.runner );
     473        // mainThread is on the ready queue when this call is made.
     474        resume( mainProcessor->runner );
    432475
    433476
     
    435478        // THE SYSTEM IS NOW COMPLETELY RUNNING
    436479        LIB_DEBUG_PRINT_SAFE("Kernel : Started\n--------------------------------------------------\n\n");
     480
     481        enable_interrupts( DEBUG_CTX );
    437482}
    438483
     
    440485        LIB_DEBUG_PRINT_SAFE("\n--------------------------------------------------\nKernel : Shutting down\n");
    441486
    442         // SKULLDUGGERY: Notify the systemProcessor it needs to terminates.
     487        disable_interrupts();
     488
     489        // SKULLDUGGERY: Notify the mainProcessor it needs to terminates.
    443490        // When its coroutine terminates, it return control to the mainThread
    444491        // which is currently here
    445         systemProcessor->proc.is_terminated = true;
     492        mainProcessor->do_terminate = true;
    446493        suspend();
    447494
    448495        // THE SYSTEM IS NOW COMPLETELY STOPPED
    449496
    450         // Destroy the system processor and its context in reverse order of construction
     497        // Disable preemption
     498        kernel_stop_preemption();
     499
     500        // Destroy the main processor and its context in reverse order of construction
    451501        // These were manually constructed so we need manually destroy them
    452         ^(systemProcessor->proc.runner){};
    453         ^(systemProcessor){};
     502        ^(mainProcessor->runner){};
     503        ^(mainProcessor){};
    454504
    455505        // Final step, destroy the main thread since it is no longer needed
     
    457507        ^(mainThread){};
    458508
    459         LIB_DEBUG_PRINT_SAFE("Kernel : Shutdown complete\n");   
     509        LIB_DEBUG_PRINT_SAFE("Kernel : Shutdown complete\n");
    460510}
    461511
     
    467517        // abort cannot be recursively entered by the same or different processors because all signal handlers return when
    468518        // the globalAbort flag is true.
    469         lock( &kernel_abort_lock );
     519        lock( &kernel_abort_lock DEBUG_CTX2 );
    470520
    471521        // first task to abort ?
     
    473523                kernel_abort_called = true;
    474524                unlock( &kernel_abort_lock );
    475         } 
     525        }
    476526        else {
    477527                unlock( &kernel_abort_lock );
    478                
     528
    479529                sigset_t mask;
    480530                sigemptyset( &mask );
     
    482532                sigaddset( &mask, SIGUSR1 );                    // block SIGUSR1 signals
    483533                sigsuspend( &mask );                            // block the processor to prevent further damage during abort
    484                 _exit( EXIT_FAILURE );                          // if processor unblocks before it is killed, terminate it             
    485         }
    486 
    487         return this_thread();
     534                _exit( EXIT_FAILURE );                          // if processor unblocks before it is killed, terminate it
     535        }
     536
     537        return this_thread;
    488538}
    489539
     
    494544        __lib_debug_write( STDERR_FILENO, abort_text, len );
    495545
    496         if ( thrd != this_coroutine() ) {
    497                 len = snprintf( abort_text, abort_text_size, " in coroutine %.256s (%p).\n", this_coroutine()->name, this_coroutine() );
     546        if ( thrd != this_coroutine ) {
     547                len = snprintf( abort_text, abort_text_size, " in coroutine %.256s (%p).\n", this_coroutine->name, this_coroutine );
    498548                __lib_debug_write( STDERR_FILENO, abort_text, len );
    499         } 
     549        }
    500550        else {
    501551                __lib_debug_write( STDERR_FILENO, ".\n", 2 );
     
    505555extern "C" {
    506556        void __lib_debug_acquire() {
    507                 lock(&kernel_debug_lock);
     557                lock( &kernel_debug_lock DEBUG_CTX2 );
    508558        }
    509559
    510560        void __lib_debug_release() {
    511                 unlock(&kernel_debug_lock);
     561                unlock( &kernel_debug_lock );
    512562        }
    513563}
     
    525575}
    526576
    527 bool try_lock( spinlock * this ) {
     577bool try_lock( spinlock * this DEBUG_CTX_PARAM2 ) {
    528578        return this->lock == 0 && __sync_lock_test_and_set_4( &this->lock, 1 ) == 0;
    529579}
    530580
    531 void lock( spinlock * this ) {
     581void lock( spinlock * this DEBUG_CTX_PARAM2 ) {
    532582        for ( unsigned int i = 1;; i += 1 ) {
    533                 if ( this->lock == 0 && __sync_lock_test_and_set_4( &this->lock, 1 ) == 0 ) break;
    534         }
    535 }
     583                if ( this->lock == 0 && __sync_lock_test_and_set_4( &this->lock, 1 ) == 0 ) { break; }
     584        }
     585        LIB_DEBUG_DO(
     586                this->prev_name = caller;
     587                this->prev_thrd = this_thread;
     588        )
     589}
     590
     591void lock_yield( spinlock * this DEBUG_CTX_PARAM2 ) {
     592        for ( unsigned int i = 1;; i += 1 ) {
     593                if ( this->lock == 0 && __sync_lock_test_and_set_4( &this->lock, 1 ) == 0 ) { break; }
     594                yield();
     595        }
     596        LIB_DEBUG_DO(
     597                this->prev_name = caller;
     598                this->prev_thrd = this_thread;
     599        )
     600}
     601
    536602
    537603void unlock( spinlock * this ) {
     
    539605}
    540606
    541 void ?{}( signal_once * this ) {
    542         this->cond = false;
    543 }
    544 void ^?{}( signal_once * this ) {
    545 
    546 }
    547 
    548 void wait( signal_once * this ) {
    549         lock( &this->lock );
    550         if( !this->cond ) {
    551                 append( &this->blocked, this_thread() );
    552                 ScheduleInternal( &this->lock );
    553                 lock( &this->lock );
    554         }
     607void  ?{}( semaphore * this, int count = 1 ) {
     608        (&this->lock){};
     609        this->count = count;
     610        (&this->waiting){};
     611}
     612void ^?{}(semaphore * this) {}
     613
     614void P(semaphore * this) {
     615        lock( &this->lock DEBUG_CTX2 );
     616        this->count -= 1;
     617        if ( this->count < 0 ) {
     618                // queue current task
     619                append( &this->waiting, (thread_desc *)this_thread );
     620
     621                // atomically release spin lock and block
     622                BlockInternal( &this->lock );
     623        }
     624        else {
     625            unlock( &this->lock );
     626        }
     627}
     628
     629void V(semaphore * this) {
     630        thread_desc * thrd = NULL;
     631        lock( &this->lock DEBUG_CTX2 );
     632        this->count += 1;
     633        if ( this->count <= 0 ) {
     634                // remove task at head of waiting list
     635                thrd = pop_head( &this->waiting );
     636        }
     637
    555638        unlock( &this->lock );
    556 }
    557 
    558 void signal( signal_once * this ) {
    559         lock( &this->lock );
    560         {
    561                 this->cond = true;
    562 
    563                 thread_desc * it;
    564                 while( it = pop_head( &this->blocked) ) {
    565                         ScheduleThread( it );
    566                 }
    567         }
    568         unlock( &this->lock );
     639
     640        // make new owner
     641        WakeThread( thrd );
    569642}
    570643
     
    590663                }
    591664                head->next = NULL;
    592         }       
     665        }
    593666        return head;
    594667}
     
    609682                this->top = top->next;
    610683                top->next = NULL;
    611         }       
     684        }
    612685        return top;
    613686}
  • src/libcfa/concurrency/kernel_private.h

    rfea3faa rb826e6b  
    1818#define KERNEL_PRIVATE_H
    1919
     20#include "libhdr.h"
     21
    2022#include "kernel"
    2123#include "thread"
     
    2325#include "alarm.h"
    2426
    25 #include "libhdr.h"
    2627
    2728//-----------------------------------------------------------------------------
    2829// Scheduler
     30
     31extern "C" {
     32        void disable_interrupts();
     33        void enable_interrupts_noPoll();
     34        void enable_interrupts( DEBUG_CTX_PARAM );
     35}
     36
    2937void ScheduleThread( thread_desc * );
     38static inline void WakeThread( thread_desc * thrd ) {
     39        if( !thrd ) return;
     40
     41        disable_interrupts();
     42        ScheduleThread( thrd );
     43        enable_interrupts( DEBUG_CTX );
     44}
    3045thread_desc * nextThread(cluster * this);
    3146
    32 void ScheduleInternal(void);
    33 void ScheduleInternal(spinlock * lock);
    34 void ScheduleInternal(thread_desc * thrd);
    35 void ScheduleInternal(spinlock * lock, thread_desc * thrd);
    36 void ScheduleInternal(spinlock ** locks, unsigned short count);
    37 void ScheduleInternal(spinlock ** locks, unsigned short count, thread_desc ** thrds, unsigned short thrd_count);
     47//Block current thread and release/wake-up the following resources
     48void BlockInternal(void);
     49void BlockInternal(spinlock * lock);
     50void BlockInternal(thread_desc * thrd);
     51void BlockInternal(spinlock * lock, thread_desc * thrd);
     52void BlockInternal(spinlock ** locks, unsigned short count);
     53void BlockInternal(spinlock ** locks, unsigned short count, thread_desc ** thrds, unsigned short thrd_count);
     54void LeaveThread(spinlock * lock, thread_desc * thrd);
    3855
    3956//-----------------------------------------------------------------------------
     
    4966void spin(processor * this, unsigned int * spin_count);
    5067
    51 struct system_proc_t {
    52         processor proc;
    53 
     68struct event_kernel_t {
    5469        alarm_list_t alarms;
    55         spinlock alarm_lock;
    56 
    57         bool pending_alarm;
     70        spinlock lock;
    5871};
    5972
    60 extern cluster * systemCluster;
    61 extern system_proc_t * systemProcessor;
    62 extern thread_local processor * this_processor;
     73extern event_kernel_t * event_kernel;
    6374
    64 static inline void disable_interrupts() {
    65         __attribute__((unused)) unsigned short prev = __atomic_fetch_add_2( &this_processor->disable_preempt_count, 1, __ATOMIC_SEQ_CST );
    66         assert( prev != (unsigned short) -1 );
    67 }
    68 
    69 static inline void enable_interrupts_noRF() {
    70         __attribute__((unused)) unsigned short prev = __atomic_fetch_add_2( &this_processor->disable_preempt_count, -1, __ATOMIC_SEQ_CST );
    71         verify( prev != (unsigned short) 0 );
    72 }
    73 
    74 static inline void enable_interrupts() {
    75         __attribute__((unused)) unsigned short prev = __atomic_fetch_add_2( &this_processor->disable_preempt_count, -1, __ATOMIC_SEQ_CST );
    76         verify( prev != (unsigned short) 0 );
    77         if( prev == 1 && this_processor->pending_preemption ) {
    78                 ScheduleInternal( this_processor->current_thread );
    79                 this_processor->pending_preemption = false;
    80         }
    81 }
     75extern volatile thread_local processor * this_processor;
     76extern volatile thread_local coroutine_desc * this_coroutine;
     77extern volatile thread_local thread_desc * this_thread;
     78extern volatile thread_local bool preemption_in_progress;
     79extern volatile thread_local unsigned short disable_preempt_count;
    8280
    8381//-----------------------------------------------------------------------------
     
    9088extern void ThreadCtxSwitch(coroutine_desc * src, coroutine_desc * dst);
    9189
     90//-----------------------------------------------------------------------------
     91// Utils
     92#define KERNEL_STORAGE(T,X) static char storage_##X[sizeof(T)]
     93
    9294#endif //KERNEL_PRIVATE_H
    9395
  • src/libcfa/concurrency/monitor

    rfea3faa rb826e6b  
    2626static inline void ?{}(monitor_desc * this) {
    2727        this->owner = NULL;
    28         this->stack_owner = NULL;
    2928        this->recursion = 0;
    3029}
  • src/libcfa/concurrency/monitor.c

    rfea3faa rb826e6b  
    1919#include <stdlib>
    2020
     21#include "libhdr.h"
    2122#include "kernel_private.h"
    22 #include "libhdr.h"
    2323
    2424//-----------------------------------------------------------------------------
     
    4444
    4545extern "C" {
    46         void __enter_monitor_desc(monitor_desc * this) {
    47                 lock( &this->lock );
    48                 thread_desc * thrd = this_thread();
    49 
    50                 LIB_DEBUG_PRINT_SAFE("%p Entering %p (o: %p, r: %i)\n", thrd, this, this->owner, this->recursion);
     46        void __enter_monitor_desc( monitor_desc * this ) {
     47                lock_yield( &this->lock DEBUG_CTX2 );
     48                thread_desc * thrd = this_thread;
     49
     50                // LIB_DEBUG_PRINT_SAFE("%p Entering %p (o: %p, r: %i)\n", thrd, this, this->owner, this->recursion);
    5151
    5252                if( !this->owner ) {
     
    6262                        //Some one else has the monitor, wait in line for it
    6363                        append( &this->entry_queue, thrd );
    64                         LIB_DEBUG_PRINT_SAFE("%p Blocking on entry\n", thrd);
    65                         ScheduleInternal( &this->lock );
    66 
    67                         //ScheduleInternal will unlock spinlock, no need to unlock ourselves
    68                         return; 
     64                        // LIB_DEBUG_PRINT_SAFE("%p Blocking on entry\n", thrd);
     65                        BlockInternal( &this->lock );
     66
     67                        //BlockInternal will unlock spinlock, no need to unlock ourselves
     68                        return;
    6969                }
    7070
     
    7575        // leave pseudo code :
    7676        //      TODO
    77         void __leave_monitor_desc(monitor_desc * this) {
    78                 lock( &this->lock );
    79 
    80                 LIB_DEBUG_PRINT_SAFE("%p Leaving %p (o: %p, r: %i)\n", thrd, this, this->owner, this->recursion);
    81                 verifyf( this_thread() == this->owner, "Expected owner to be %p, got %p (r: %i)", this_thread(), this->owner, this->recursion );
     77        void __leave_monitor_desc( monitor_desc * this ) {
     78                lock_yield( &this->lock DEBUG_CTX2 );
     79
     80                // LIB_DEBUG_PRINT_SAFE("%p Leaving %p (o: %p, r: %i). ", this_thread, this, this->owner, this->recursion);
     81                verifyf( this_thread == this->owner, "Expected owner to be %p, got %p (r: %i)", this_thread, this->owner, this->recursion );
    8282
    8383                //Leaving a recursion level, decrement the counter
     
    9696                unlock( &this->lock );
    9797
    98                 LIB_DEBUG_PRINT_SAFE("Next owner is %p\n", new_owner);
     98                // LIB_DEBUG_PRINT_SAFE("Next owner is %p\n", new_owner);
    9999
    100100                //We need to wake-up the thread
    101                 ScheduleThread( new_owner );
     101                WakeThread( new_owner );
     102        }
     103
     104        void __leave_thread_monitor( thread_desc * thrd ) {
     105                monitor_desc * this = &thrd->mon;
     106                lock_yield( &this->lock DEBUG_CTX2 );
     107
     108                disable_interrupts();
     109
     110                thrd->cor.state = Halted;
     111
     112                verifyf( thrd == this->owner, "Expected owner to be %p, got %p (r: %i)", thrd, this->owner, this->recursion );
     113
     114                //Leaving a recursion level, decrement the counter
     115                this->recursion -= 1;
     116
     117                //If we haven't left the last level of recursion
     118                //it means we don't need to do anything
     119                if( this->recursion != 0) {
     120                        unlock( &this->lock );
     121                        return;
     122                }
     123
     124                thread_desc * new_owner = next_thread( this );
     125
     126                LeaveThread( &this->lock, new_owner );
    102127        }
    103128}
     
    121146        enter( this->m, this->count );
    122147
    123         this->prev_mntrs = this_thread()->current_monitors;
    124         this->prev_count = this_thread()->current_monitor_count;
    125 
    126         this_thread()->current_monitors      = m;
    127         this_thread()->current_monitor_count = count;
     148        this->prev_mntrs = this_thread->current_monitors;
     149        this->prev_count = this_thread->current_monitor_count;
     150
     151        this_thread->current_monitors      = m;
     152        this_thread->current_monitor_count = count;
    128153}
    129154
     
    131156        leave( this->m, this->count );
    132157
    133         this_thread()->current_monitors      = this->prev_mntrs;
    134         this_thread()->current_monitor_count = this->prev_count;
     158        this_thread->current_monitors      = this->prev_mntrs;
     159        this_thread->current_monitor_count = this->prev_count;
    135160}
    136161
     
    159184// Internal scheduling
    160185void wait( condition * this, uintptr_t user_info = 0 ) {
    161         LIB_DEBUG_PRINT_SAFE("Waiting\n");
     186        // LIB_DEBUG_PRINT_SAFE("Waiting\n");
    162187
    163188        brand_condition( this );
     
    170195        unsigned short count = this->monitor_count;
    171196        unsigned int recursions[ count ];               //Save the current recursion levels to restore them later
    172         spinlock *   locks     [ count ];               //We need to pass-in an array of locks to ScheduleInternal
    173 
    174         LIB_DEBUG_PRINT_SAFE("count %i\n", count);
    175 
    176         __condition_node_t waiter = { this_thread(), count, user_info };
     197        spinlock *   locks     [ count ];               //We need to pass-in an array of locks to BlockInternal
     198
     199        // LIB_DEBUG_PRINT_SAFE("count %i\n", count);
     200
     201        __condition_node_t waiter = { (thread_desc*)this_thread, count, user_info };
    177202
    178203        __condition_criterion_t criteria[count];
    179204        for(int i = 0; i < count; i++) {
    180205                (&criteria[i]){ this->monitors[i], &waiter };
    181                 LIB_DEBUG_PRINT_SAFE( "Criterion %p\n", &criteria[i] );
     206                // LIB_DEBUG_PRINT_SAFE( "Criterion %p\n", &criteria[i] );
    182207        }
    183208
     
    201226        }
    202227
    203         LIB_DEBUG_PRINT_SAFE("Will unblock: ");
     228        // LIB_DEBUG_PRINT_SAFE("Will unblock: ");
    204229        for(int i = 0; i < thread_count; i++) {
    205                 LIB_DEBUG_PRINT_SAFE("%p ", threads[i]);
    206         }
    207         LIB_DEBUG_PRINT_SAFE("\n");
     230                // LIB_DEBUG_PRINT_SAFE("%p ", threads[i]);
     231        }
     232        // LIB_DEBUG_PRINT_SAFE("\n");
    208233
    209234        // Everything is ready to go to sleep
    210         ScheduleInternal( locks, count, threads, thread_count );
     235        BlockInternal( locks, count, threads, thread_count );
    211236
    212237
     
    222247bool signal( condition * this ) {
    223248        if( is_empty( this ) ) {
    224                 LIB_DEBUG_PRINT_SAFE("Nothing to signal\n");
     249                // LIB_DEBUG_PRINT_SAFE("Nothing to signal\n");
    225250                return false;
    226251        }
     
    231256
    232257        unsigned short count = this->monitor_count;
    233        
     258
    234259        //Some more checking in debug
    235260        LIB_DEBUG_DO(
    236                 thread_desc * this_thrd = this_thread();
     261                thread_desc * this_thrd = this_thread;
    237262                if ( this->monitor_count != this_thrd->current_monitor_count ) {
    238263                        abortf( "Signal on condition %p made with different number of monitor(s), expected %i got %i", this, this->monitor_count, this_thrd->current_monitor_count );
     
    248273        //Lock all the monitors
    249274        lock_all( this->monitors, NULL, count );
    250         LIB_DEBUG_PRINT_SAFE("Signalling");
     275        // LIB_DEBUG_PRINT_SAFE("Signalling");
    251276
    252277        //Pop the head of the waiting queue
     
    256281        for(int i = 0; i < count; i++) {
    257282                __condition_criterion_t * crit = &node->criteria[i];
    258                 LIB_DEBUG_PRINT_SAFE(" %p", crit->target);
     283                // LIB_DEBUG_PRINT_SAFE(" %p", crit->target);
    259284                assert( !crit->ready );
    260285                push( &crit->target->signal_stack, crit );
    261286        }
    262287
    263         LIB_DEBUG_PRINT_SAFE("\n");
     288        // LIB_DEBUG_PRINT_SAFE("\n");
    264289
    265290        //Release
     
    281306        unsigned short count = this->monitor_count;
    282307        unsigned int recursions[ count ];               //Save the current recursion levels to restore them later
    283         spinlock *   locks     [ count ];               //We need to pass-in an array of locks to ScheduleInternal
     308        spinlock *   locks     [ count ];               //We need to pass-in an array of locks to BlockInternal
    284309
    285310        lock_all( this->monitors, locks, count );
    286311
    287312        //create creteria
    288         __condition_node_t waiter = { this_thread(), count, 0 };
     313        __condition_node_t waiter = { (thread_desc*)this_thread, count, 0 };
    289314
    290315        __condition_criterion_t criteria[count];
    291316        for(int i = 0; i < count; i++) {
    292317                (&criteria[i]){ this->monitors[i], &waiter };
    293                 LIB_DEBUG_PRINT_SAFE( "Criterion %p\n", &criteria[i] );
     318                // LIB_DEBUG_PRINT_SAFE( "Criterion %p\n", &criteria[i] );
    294319                push( &criteria[i].target->signal_stack, &criteria[i] );
    295320        }
     
    309334
    310335        //Everything is ready to go to sleep
    311         ScheduleInternal( locks, count, &signallee, 1 );
     336        BlockInternal( locks, count, &signallee, 1 );
    312337
    313338
     
    325350
    326351uintptr_t front( condition * this ) {
    327         verifyf( !is_empty(this), 
     352        verifyf( !is_empty(this),
    328353                "Attempt to access user data on an empty condition.\n"
    329354                "Possible cause is not checking if the condition is empty before reading stored data."
     
    335360// Internal scheduling
    336361void __accept_internal( unsigned short count, __acceptable_t * acceptables, void (*func)(void) ) {
    337         // thread_desc * this = this_thread();
     362        // thread_desc * this = this_thread;
    338363
    339364        // unsigned short count = this->current_monitor_count;
    340365        // unsigned int recursions[ count ];            //Save the current recursion levels to restore them later
    341         // spinlock *   locks     [ count ];            //We need to pass-in an array of locks to ScheduleInternal
     366        // spinlock *   locks     [ count ];            //We need to pass-in an array of locks to BlockInternal
    342367
    343368        // lock_all( this->current_monitors, locks, count );
     
    348373
    349374        // // // Everything is ready to go to sleep
    350         // // ScheduleInternal( locks, count, threads, thread_count );
     375        // // BlockInternal( locks, count, threads, thread_count );
    351376
    352377
     
    393418static inline void lock_all( spinlock ** locks, unsigned short count ) {
    394419        for( int i = 0; i < count; i++ ) {
    395                 lock( locks[i] );
     420                lock_yield( locks[i] DEBUG_CTX2 );
    396421        }
    397422}
     
    400425        for( int i = 0; i < count; i++ ) {
    401426                spinlock * l = &source[i]->lock;
    402                 lock( l );
     427                lock_yield( l DEBUG_CTX2 );
    403428                if(locks) locks[i] = l;
    404429        }
     
    443468        for(    int i = 0; i < count; i++ ) {
    444469
    445                 LIB_DEBUG_PRINT_SAFE( "Checking %p for %p\n", &criteria[i], target );
     470                // LIB_DEBUG_PRINT_SAFE( "Checking %p for %p\n", &criteria[i], target );
    446471                if( &criteria[i] == target ) {
    447472                        criteria[i].ready = true;
    448                         LIB_DEBUG_PRINT_SAFE( "True\n" );
     473                        // LIB_DEBUG_PRINT_SAFE( "True\n" );
    449474                }
    450475
     
    452477        }
    453478
    454         LIB_DEBUG_PRINT_SAFE( "Runing %i\n", ready2run );
     479        // LIB_DEBUG_PRINT_SAFE( "Runing %i\n", ready2run );
    455480        return ready2run ? node->waiting_thread : NULL;
    456481}
    457482
    458483static inline void brand_condition( condition * this ) {
    459         thread_desc * thrd = this_thread();
     484        thread_desc * thrd = this_thread;
    460485        if( !this->monitors ) {
    461                 LIB_DEBUG_PRINT_SAFE("Branding\n");
     486                // LIB_DEBUG_PRINT_SAFE("Branding\n");
    462487                assertf( thrd->current_monitors != NULL, "No current monitor to brand condition", thrd->current_monitors );
    463488                this->monitor_count = thrd->current_monitor_count;
  • src/libcfa/concurrency/preemption.c

    rfea3faa rb826e6b  
    1515//
    1616
     17#include "libhdr.h"
    1718#include "preemption.h"
    1819
    1920extern "C" {
     21#include <errno.h>
     22#include <execinfo.h>
     23#define __USE_GNU
    2024#include <signal.h>
    21 }
    22 
    23 #define __CFA_DEFAULT_PREEMPTION__ 10
    24 
     25#undef __USE_GNU
     26#include <stdio.h>
     27#include <string.h>
     28#include <unistd.h>
     29}
     30
     31
     32#ifdef __USE_STREAM__
     33#include "fstream"
     34#endif
     35
     36//TODO move to defaults
     37#define __CFA_DEFAULT_PREEMPTION__ 10000
     38
     39//TODO move to defaults
    2540__attribute__((weak)) unsigned int default_preemption() {
    2641        return __CFA_DEFAULT_PREEMPTION__;
    2742}
    2843
     44// Short hands for signal context information
     45#define __CFA_SIGCXT__ ucontext_t *
     46#define __CFA_SIGPARMS__ __attribute__((unused)) int sig, __attribute__((unused)) siginfo_t *sfp, __attribute__((unused)) __CFA_SIGCXT__ cxt
     47
     48// FwdDeclarations : timeout handlers
    2949static void preempt( processor   * this );
    3050static void timeout( thread_desc * this );
    3151
     52// FwdDeclarations : Signal handlers
     53void sigHandler_ctxSwitch( __CFA_SIGPARMS__ );
     54void sigHandler_segv     ( __CFA_SIGPARMS__ );
     55void sigHandler_abort    ( __CFA_SIGPARMS__ );
     56
     57// FwdDeclarations : sigaction wrapper
     58static void __kernel_sigaction( int sig, void (*handler)(__CFA_SIGPARMS__), int flags );
     59
     60// FwdDeclarations : alarm thread main
     61void * alarm_loop( __attribute__((unused)) void * args );
     62
     63// Machine specific register name
     64#ifdef __x86_64__
     65#define CFA_REG_IP REG_RIP
     66#else
     67#define CFA_REG_IP REG_EIP
     68#endif
     69
     70KERNEL_STORAGE(event_kernel_t, event_kernel);         // private storage for event kernel
     71event_kernel_t * event_kernel;                        // kernel public handle to even kernel
     72static pthread_t alarm_thread;                        // pthread handle to alarm thread
     73
     74void ?{}(event_kernel_t * this) {
     75        (&this->alarms){};
     76        (&this->lock){};
     77}
     78
    3279//=============================================================================================
    3380// Kernel Preemption logic
    3481//=============================================================================================
    3582
    36 void kernel_start_preemption() {
    37 
    38 }
    39 
     83// Get next expired node
     84static inline alarm_node_t * get_expired( alarm_list_t * alarms, __cfa_time_t currtime ) {
     85        if( !alarms->head ) return NULL;                          // If no alarms return null
     86        if( alarms->head->alarm >= currtime ) return NULL;        // If alarms head not expired return null
     87        return pop(alarms);                                       // Otherwise just pop head
     88}
     89
     90// Tick one frame of the Discrete Event Simulation for alarms
    4091void tick_preemption() {
    41         alarm_list_t * alarms = &systemProcessor->alarms;
    42         __cfa_time_t currtime = __kernel_get_time();
    43         while( alarms->head && alarms->head->alarm < currtime ) {
    44                 alarm_node_t * node = pop(alarms);
     92        alarm_node_t * node = NULL;                     // Used in the while loop but cannot be declared in the while condition
     93        alarm_list_t * alarms = &event_kernel->alarms;  // Local copy for ease of reading
     94        __cfa_time_t currtime = __kernel_get_time();    // Check current time once so we everything "happens at once"
     95
     96        //Loop throught every thing expired
     97        while( node = get_expired( alarms, currtime ) ) {
     98
     99                // Check if this is a kernel
    45100                if( node->kernel_alarm ) {
    46101                        preempt( node->proc );
     
    50105                }
    51106
    52                 if( node->period > 0 ) {
    53                         node->alarm += node->period;
    54                         insert( alarms, node );
     107                // Check if this is a periodic alarm
     108                __cfa_time_t period = node->period;
     109                if( period > 0 ) {
     110                        node->alarm = currtime + period;    // Alarm is periodic, add currtime to it (used cached current time)
     111                        insert( alarms, node );             // Reinsert the node for the next time it triggers
    55112                }
    56113                else {
    57                         node->set = false;
    58                 }
    59         }
    60 
    61         if( alarms->head ) {
    62                 __kernel_set_timer( alarms->head->alarm - currtime );
    63         }
    64 }
    65 
     114                        node->set = false;                  // Node is one-shot, just mark it as not pending
     115                }
     116        }
     117
     118        // If there are still alarms pending, reset the timer
     119        if( alarms->head ) { __kernel_set_timer( alarms->head->alarm - currtime ); }
     120}
     121
     122// Update the preemption of a processor and notify interested parties
    66123void update_preemption( processor * this, __cfa_time_t duration ) {
    67         //     assert( THREAD_GETMEM( disableInt ) && THREAD_GETMEM( disableIntCnt ) == 1 );
    68124        alarm_node_t * alarm = this->preemption_alarm;
    69125
     
    89145}
    90146
     147//=============================================================================================
     148// Kernel Signal Tools
     149//=============================================================================================
     150
     151LIB_DEBUG_DO( static thread_local void * last_interrupt = 0; )
     152
     153extern "C" {
     154        // Disable interrupts by incrementing the counter
     155        void disable_interrupts() {
     156                __attribute__((unused)) unsigned short new_val = __atomic_add_fetch_2( &disable_preempt_count, 1, __ATOMIC_SEQ_CST );
     157                verify( new_val < 65_000u );              // If this triggers someone is disabling interrupts without enabling them
     158        }
     159
     160        // Enable interrupts by decrementing the counter
     161        // If counter reaches 0, execute any pending CtxSwitch
     162        void enable_interrupts( DEBUG_CTX_PARAM ) {
     163                processor * proc   = this_processor;      // Cache the processor now since interrupts can start happening after the atomic add
     164                thread_desc * thrd = this_thread;         // Cache the thread now since interrupts can start happening after the atomic add
     165
     166                unsigned short prev = __atomic_fetch_add_2( &disable_preempt_count, -1, __ATOMIC_SEQ_CST );
     167                verify( prev != 0u );                     // If this triggers someone is enabled already enabled interruptsverify( prev != 0u );
     168
     169                // Check if we need to prempt the thread because an interrupt was missed
     170                if( prev == 1 && proc->pending_preemption ) {
     171                        proc->pending_preemption = false;
     172                        BlockInternal( thrd );
     173                }
     174
     175                // For debugging purposes : keep track of the last person to enable the interrupts
     176                LIB_DEBUG_DO( proc->last_enable = caller; )
     177        }
     178
     179        // Disable interrupts by incrementint the counter
     180        // Don't execute any pending CtxSwitch even if counter reaches 0
     181        void enable_interrupts_noPoll() {
     182                __attribute__((unused)) unsigned short prev = __atomic_fetch_add_2( &disable_preempt_count, -1, __ATOMIC_SEQ_CST );
     183                verify( prev != 0u );                     // If this triggers someone is enabled already enabled interrupts
     184        }
     185}
     186
     187// sigprocmask wrapper : unblock a single signal
     188static inline void signal_unblock( int sig ) {
     189        sigset_t mask;
     190        sigemptyset( &mask );
     191        sigaddset( &mask, sig );
     192
     193        if ( pthread_sigmask( SIG_UNBLOCK, &mask, NULL ) == -1 ) {
     194            abortf( "internal error, pthread_sigmask" );
     195        }
     196}
     197
     198// sigprocmask wrapper : block a single signal
     199static inline void signal_block( int sig ) {
     200        sigset_t mask;
     201        sigemptyset( &mask );
     202        sigaddset( &mask, sig );
     203
     204        if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) {
     205            abortf( "internal error, pthread_sigmask" );
     206        }
     207}
     208
     209// kill wrapper : signal a processor
     210static void preempt( processor * this ) {
     211        pthread_kill( this->kernel_thread, SIGUSR1 );
     212}
     213
     214// reserved for future use
     215static void timeout( thread_desc * this ) {
     216        //TODO : implement waking threads
     217}
     218
     219
     220// Check if a CtxSwitch signal handler shoud defer
     221// If true  : preemption is safe
     222// If false : preemption is unsafe and marked as pending
     223static inline bool preemption_ready() {
     224        bool ready = disable_preempt_count == 0 && !preemption_in_progress; // Check if preemption is safe
     225        this_processor->pending_preemption = !ready;                        // Adjust the pending flag accordingly
     226        return ready;
     227}
     228
     229//=============================================================================================
     230// Kernel Signal Startup/Shutdown logic
     231//=============================================================================================
     232
     233// Startup routine to activate preemption
     234// Called from kernel_startup
     235void kernel_start_preemption() {
     236        LIB_DEBUG_PRINT_SAFE("Kernel : Starting preemption\n");
     237
     238        // Start with preemption disabled until ready
     239        disable_preempt_count = 1;
     240
     241        // Initialize the event kernel
     242        event_kernel = (event_kernel_t *)&storage_event_kernel;
     243        event_kernel{};
     244
     245        // Setup proper signal handlers
     246        __kernel_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO );         // CtxSwitch handler
     247        // __kernel_sigaction( SIGSEGV, sigHandler_segv     , SA_SIGINFO );      // Failure handler
     248        // __kernel_sigaction( SIGBUS , sigHandler_segv     , SA_SIGINFO );      // Failure handler
     249
     250        signal_block( SIGALRM );
     251
     252        pthread_create( &alarm_thread, NULL, alarm_loop, NULL );
     253}
     254
     255// Shutdown routine to deactivate preemption
     256// Called from kernel_shutdown
     257void kernel_stop_preemption() {
     258        LIB_DEBUG_PRINT_SAFE("Kernel : Preemption stopping\n");
     259
     260        // Block all signals since we are already shutting down
     261        sigset_t mask;
     262        sigfillset( &mask );
     263        sigprocmask( SIG_BLOCK, &mask, NULL );
     264
     265        // Notify the alarm thread of the shutdown
     266        sigval val = { 1 };
     267        pthread_sigqueue( alarm_thread, SIGALRM, val );
     268
     269        // Wait for the preemption thread to finish
     270        pthread_join( alarm_thread, NULL );
     271
     272        // Preemption is now fully stopped
     273
     274        LIB_DEBUG_PRINT_SAFE("Kernel : Preemption stopped\n");
     275}
     276
     277// Raii ctor/dtor for the preemption_scope
     278// Used by thread to control when they want to receive preemption signals
    91279void ?{}( preemption_scope * this, processor * proc ) {
    92         (&this->alarm){ proc };
     280        (&this->alarm){ proc, zero_time, zero_time };
    93281        this->proc = proc;
    94282        this->proc->preemption_alarm = &this->alarm;
    95         update_preemption( this->proc, this->proc->preemption );
     283
     284        update_preemption( this->proc, from_us(this->proc->cltr->preemption) );
    96285}
    97286
    98287void ^?{}( preemption_scope * this ) {
    99         update_preemption( this->proc, 0 );
    100 }
    101 
    102 //=============================================================================================
    103 // Kernel Signal logic
    104 //=============================================================================================
    105 
    106 static inline bool preemption_ready() {
    107         return this_processor->disable_preempt_count == 0;
    108 }
    109 
    110 static inline void defer_ctxSwitch() {
    111         this_processor->pending_preemption = true;
    112 }
    113 
    114 static inline void defer_alarm() {
    115         systemProcessor->pending_alarm = true;
    116 }
    117 
    118 void sigHandler_ctxSwitch( __attribute__((unused)) int sig ) {
    119         if( preemption_ready() ) {
    120                 ScheduleInternal( this_processor->current_thread );
    121         }
    122         else {
    123                 defer_ctxSwitch();
    124         }
    125 }
    126 
    127 void sigHandler_alarm( __attribute__((unused)) int sig ) {
    128         if( try_lock( &systemProcessor->alarm_lock ) ) {
    129                 tick_preemption();
    130                 unlock( &systemProcessor->alarm_lock );
    131         }
    132         else {
    133                 defer_alarm();
    134         }
    135 }
    136 
    137 static void preempt( processor * this ) {
    138         pthread_kill( this->kernel_thread, SIGUSR1 );
    139 }
    140 
    141 static void timeout( thread_desc * this ) {
    142         //TODO : implement waking threads
    143 }
     288        disable_interrupts();
     289
     290        update_preemption( this->proc, zero_time );
     291}
     292
     293//=============================================================================================
     294// Kernel Signal Handlers
     295//=============================================================================================
     296
     297// Context switch signal handler
     298// Receives SIGUSR1 signal and causes the current thread to yield
     299void sigHandler_ctxSwitch( __CFA_SIGPARMS__ ) {
     300        LIB_DEBUG_DO( last_interrupt = (void *)(cxt->uc_mcontext.gregs[CFA_REG_IP]); )
     301
     302        // Check if it is safe to preempt here
     303        if( !preemption_ready() ) { return; }
     304
     305        preemption_in_progress = true;                      // Sync flag : prevent recursive calls to the signal handler
     306        signal_unblock( SIGUSR1 );                          // We are about to CtxSwitch out of the signal handler, let other handlers in
     307        preemption_in_progress = false;                     // Clear the in progress flag
     308
     309        // Preemption can occur here
     310
     311        BlockInternal( (thread_desc*)this_thread );         // Do the actual CtxSwitch
     312}
     313
     314// Main of the alarm thread
     315// Waits on SIGALRM and send SIGUSR1 to whom ever needs it
     316void * alarm_loop( __attribute__((unused)) void * args ) {
     317        // Block sigalrms to control when they arrive
     318        sigset_t mask;
     319        sigemptyset( &mask );
     320        sigaddset( &mask, SIGALRM );
     321
     322        if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) {
     323            abortf( "internal error, pthread_sigmask" );
     324        }
     325
     326        // Main loop
     327        while( true ) {
     328                // Wait for a sigalrm
     329                siginfo_t info;
     330                int sig = sigwaitinfo( &mask, &info );
     331
     332                // If another signal arrived something went wrong
     333                assertf(sig == SIGALRM, "Kernel Internal Error, sigwait: Unexpected signal %d (%d : %d)\n", sig, info.si_code, info.si_value.sival_int);
     334
     335                LIB_DEBUG_PRINT_SAFE("Kernel : Caught alarm from %d with %d\n", info.si_code, info.si_value.sival_int );
     336                // Switch on the code (a.k.a. the sender) to
     337                switch( info.si_code )
     338                {
     339                // Timers can apparently be marked as sent for the kernel
     340                // In either case, tick preemption
     341                case SI_TIMER:
     342                case SI_KERNEL:
     343                        LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread tick\n");
     344                        lock( &event_kernel->lock DEBUG_CTX2 );
     345                        tick_preemption();
     346                        unlock( &event_kernel->lock );
     347                        break;
     348                // Signal was not sent by the kernel but by an other thread
     349                case SI_QUEUE:
     350                        // For now, other thread only signal the alarm thread to shut it down
     351                        // If this needs to change use info.si_value and handle the case here
     352                        goto EXIT;
     353                }
     354        }
     355
     356EXIT:
     357        LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread stopping\n");
     358        return NULL;
     359}
     360
     361// Sigaction wrapper : register an signal handler
     362static void __kernel_sigaction( int sig, void (*handler)(__CFA_SIGPARMS__), int flags ) {
     363        struct sigaction act;
     364
     365        act.sa_sigaction = (void (*)(int, siginfo_t *, void *))handler;
     366        act.sa_flags = flags;
     367
     368        if ( sigaction( sig, &act, NULL ) == -1 ) {
     369                LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO,
     370                        " __kernel_sigaction( sig:%d, handler:%p, flags:%d ), problem installing signal handler, error(%d) %s.\n",
     371                        sig, handler, flags, errno, strerror( errno )
     372                );
     373                _exit( EXIT_FAILURE );
     374        }
     375}
     376
     377// Sigaction wrapper : restore default handler
     378static void __kernel_sigdefault( int sig ) {
     379        struct sigaction act;
     380
     381        act.sa_handler = SIG_DFL;
     382        act.sa_flags = 0;
     383        sigemptyset( &act.sa_mask );
     384
     385        if ( sigaction( sig, &act, NULL ) == -1 ) {
     386                LIB_DEBUG_PRINT_BUFFER_DECL( STDERR_FILENO,
     387                        " __kernel_sigdefault( sig:%d ), problem reseting signal handler, error(%d) %s.\n",
     388                        sig, errno, strerror( errno )
     389                );
     390                _exit( EXIT_FAILURE );
     391        }
     392}
     393
     394//=============================================================================================
     395// Terminating Signals logic
     396//=============================================================================================
     397
     398LIB_DEBUG_DO(
     399        static void __kernel_backtrace( int start ) {
     400                // skip first N stack frames
     401
     402                enum { Frames = 50 };
     403                void * array[Frames];
     404                int size = backtrace( array, Frames );
     405                char ** messages = backtrace_symbols( array, size );
     406
     407                // find executable name
     408                *index( messages[0], '(' ) = '\0';
     409                #ifdef __USE_STREAM__
     410                serr | "Stack back trace for:" | messages[0] | endl;
     411                #else
     412                fprintf( stderr, "Stack back trace for: %s\n", messages[0]);
     413                #endif
     414
     415                // skip last 2 stack frames after main
     416                for ( int i = start; i < size && messages != NULL; i += 1 ) {
     417                        char * name = NULL;
     418                        char * offset_begin = NULL;
     419                        char * offset_end = NULL;
     420
     421                        for ( char *p = messages[i]; *p; ++p ) {
     422                                // find parantheses and +offset
     423                                if ( *p == '(' ) {
     424                                        name = p;
     425                                }
     426                                else if ( *p == '+' ) {
     427                                        offset_begin = p;
     428                                }
     429                                else if ( *p == ')' ) {
     430                                        offset_end = p;
     431                                        break;
     432                                }
     433                        }
     434
     435                        // if line contains symbol print it
     436                        int frameNo = i - start;
     437                        if ( name && offset_begin && offset_end && name < offset_begin ) {
     438                                // delimit strings
     439                                *name++ = '\0';
     440                                *offset_begin++ = '\0';
     441                                *offset_end++ = '\0';
     442
     443                                #ifdef __USE_STREAM__
     444                                serr    | "("  | frameNo | ")" | messages[i] | ":"
     445                                        | name | "+" | offset_begin | offset_end | endl;
     446                                #else
     447                                fprintf( stderr, "(%i) %s : %s + %s %s\n", frameNo, messages[i], name, offset_begin, offset_end);
     448                                #endif
     449                        }
     450                        // otherwise, print the whole line
     451                        else {
     452                                #ifdef __USE_STREAM__
     453                                serr | "(" | frameNo | ")" | messages[i] | endl;
     454                                #else
     455                                fprintf( stderr, "(%i) %s\n", frameNo, messages[i] );
     456                                #endif
     457                        }
     458                }
     459
     460                free( messages );
     461        }
     462)
     463
     464// void sigHandler_segv( __CFA_SIGPARMS__ ) {
     465//      LIB_DEBUG_DO(
     466//              #ifdef __USE_STREAM__
     467//              serr    | "*CFA runtime error* program cfa-cpp terminated with"
     468//                      | (sig == SIGSEGV ? "segment fault." : "bus error.")
     469//                      | endl;
     470//              #else
     471//              fprintf( stderr, "*CFA runtime error* program cfa-cpp terminated with %s\n", sig == SIGSEGV ? "segment fault." : "bus error." );
     472//              #endif
     473
     474//              // skip first 2 stack frames
     475//              __kernel_backtrace( 1 );
     476//      )
     477//      exit( EXIT_FAILURE );
     478// }
     479
     480// void sigHandler_abort( __CFA_SIGPARMS__ ) {
     481//      // skip first 6 stack frames
     482//      LIB_DEBUG_DO( __kernel_backtrace( 6 ); )
     483
     484//      // reset default signal handler
     485//      __kernel_sigdefault( SIGABRT );
     486
     487//      raise( SIGABRT );
     488// }
  • src/libcfa/concurrency/thread

    rfea3faa rb826e6b  
    5454}
    5555
    56 thread_desc * this_thread(void);
     56extern volatile thread_local thread_desc * this_thread;
    5757
    5858forall( dtype T | is_thread(T) )
  • src/libcfa/concurrency/thread.c

    rfea3faa rb826e6b  
    2828}
    2929
    30 extern thread_local processor * this_processor;
     30extern volatile thread_local processor * this_processor;
    3131
    3232//-----------------------------------------------------------------------------
     
    7171        coroutine_desc* thrd_c = get_coroutine(this);
    7272        thread_desc*  thrd_h = get_thread   (this);
    73         thrd_c->last = this_coroutine();
    74         this_processor->current_coroutine = thrd_c;
     73        thrd_c->last = this_coroutine;
    7574
    76         LIB_DEBUG_PRINT_SAFE("Thread start : %p (t %p, c %p)\n", this, thrd_c, thrd_h);
     75        // LIB_DEBUG_PRINT_SAFE("Thread start : %p (t %p, c %p)\n", this, thrd_c, thrd_h);
    7776
     77        disable_interrupts();
    7878        create_stack(&thrd_c->stack, thrd_c->stack.size);
     79        this_coroutine = thrd_c;
    7980        CtxStart(this, CtxInvokeThread);
     81        assert( thrd_c->last->stack.context );
    8082        CtxSwitch( thrd_c->last->stack.context, thrd_c->stack.context );
    8183
    8284        ScheduleThread(thrd_h);
     85        enable_interrupts( DEBUG_CTX );
    8386}
    8487
    8588void yield( void ) {
    86         ScheduleInternal( this_processor->current_thread );
     89        BlockInternal( (thread_desc *)this_thread );
    8790}
    8891
     
    9598void ThreadCtxSwitch(coroutine_desc* src, coroutine_desc* dst) {
    9699        // set state of current coroutine to inactive
    97         src->state = Inactive;
     100        src->state = src->state == Halted ? Halted : Inactive;
    98101        dst->state = Active;
    99102
     
    103106        // set new coroutine that the processor is executing
    104107        // and context switch to it
    105         this_processor->current_coroutine = dst;
     108        this_coroutine = dst;
     109        assert( src->stack.context );
    106110        CtxSwitch( src->stack.context, dst->stack.context );
    107         this_processor->current_coroutine = src;
     111        this_coroutine = src;
    108112
    109113        // set state of new coroutine to active
    110         dst->state = Inactive;
     114        dst->state = dst->state == Halted ? Halted : Inactive;
    111115        src->state = Active;
    112116}
  • src/libcfa/fstream

    rfea3faa rb826e6b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon May 15 18:11:09 2017
    13 // Update Count     : 104
     12// Last Modified On : Fri Jul  7 08:32:38 2017
     13// Update Count     : 117
    1414//
    1515
    16 #ifndef __FSTREAM_H__
    17 #define __FSTREAM_H__
     16#pragma once
    1817
    1918#include "iostream"
    2019
    21 enum { separateSize = 16 };
     20enum { sepSize = 16 };
    2221struct ofstream {
    2322        void * file;
    2423        _Bool sepDefault;
    2524        _Bool sepOnOff;
     25        _Bool sawNL;
    2626        const char * sepCur;
    27         char separator[separateSize];
    28         char tupleSeparator[separateSize];
     27        char separator[sepSize];
     28        char tupleSeparator[sepSize];
    2929}; // ofstream
    3030
     
    3535const char * sepGetCur( ofstream * );
    3636void sepSetCur( ofstream *, const char * );
     37_Bool getNL( ofstream * );
     38void setNL( ofstream *, _Bool );
    3739
    3840// public
     
    7375extern ifstream * sin;
    7476
    75 #endif // __FSTREAM_H__
    76 
    7777// Local Variables: //
    7878// mode: c //
  • src/libcfa/fstream.c

    rfea3faa rb826e6b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon May 15 18:11:11 2017
    13 // Update Count     : 234
     12// Last Modified On : Thu Jul  6 18:38:25 2017
     13// Update Count     : 251
    1414//
    1515
     
    3939
    4040// private
    41 _Bool sepPrt( ofstream * os ) { return os->sepOnOff; }
     41_Bool sepPrt( ofstream * os ) { setNL( os, false ); return os->sepOnOff; }
    4242void sepReset( ofstream * os ) { os->sepOnOff = os->sepDefault; }
    4343void sepReset( ofstream * os, _Bool reset ) { os->sepDefault = reset; os->sepOnOff = os->sepDefault; }
    4444const char * sepGetCur( ofstream * os ) { return os->sepCur; }
    4545void sepSetCur( ofstream * os, const char * sepCur ) { os->sepCur = sepCur; }
     46_Bool getNL( ofstream * os ) { return os->sawNL; }
     47void setNL( ofstream * os, _Bool state ) { os->sawNL = state; }
    4648
    4749// public
    48 void sepOn( ofstream * os ) { os->sepOnOff = 1; }
    49 void sepOff( ofstream * os ) { os->sepOnOff = 0; }
     50void sepOn( ofstream * os ) { os->sepOnOff = ! getNL( os ); }
     51void sepOff( ofstream * os ) { os->sepOnOff = false; }
    5052
    5153_Bool sepDisable( ofstream *os ) {
     
    6668void sepSet( ofstream * os, const char * s ) {
    6769        assert( s );
    68         strncpy( os->separator, s, separateSize - 1 );
    69         os->separator[separateSize - 1] = '\0';
     70        strncpy( os->separator, s, sepSize - 1 );
     71        os->separator[sepSize - 1] = '\0';
    7072} // sepSet
    7173
     
    7375void sepSetTuple( ofstream * os, const char * s ) {
    7476        assert( s );
    75         strncpy( os->tupleSeparator, s, separateSize - 1 );
    76         os->tupleSeparator[separateSize - 1] = '\0';
     77        strncpy( os->tupleSeparator, s, sepSize - 1 );
     78        os->tupleSeparator[sepSize - 1] = '\0';
    7779} // sepSet
    7880
     
    9294                exit( EXIT_FAILURE );
    9395        } // if
    94         ?{}( os, file, 1, 0, " ", ", " );
     96        ?{}( os, file, true, false, " ", ", " );
    9597} // open
    9698
     
    132134} // fmt
    133135
    134 static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 1, 0, " ", ", " };
     136static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), true, false, " ", ", " };
    135137ofstream *sout = &soutFile;
    136 static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 1, 0, " ", ", " };
     138static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), true, false, " ", ", " };
    137139ofstream *serr = &serrFile;
    138140
     
    150152
    151153void open( ifstream * is, const char * name, const char * mode ) {
    152         FILE *t = fopen( name, mode );
    153         if ( t == 0 ) {                                                                         // do not change unless successful
     154        FILE *file = fopen( name, mode );
     155        if ( file == 0 ) {                                                                      // do not change unless successful
    154156                fprintf( stderr, IO_MSG "open input file \"%s\", ", name );
    155157                perror( 0 );
    156158                exit( EXIT_FAILURE );
    157159        } // if
    158         is->file = t;
     160        is->file = file;
    159161} // open
    160162
  • src/libcfa/gmp

    rfea3faa rb826e6b  
    1010// Created On       : Tue Apr 19 08:43:43 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat May 27 09:55:51 2017
    13 // Update Count     : 14
     12// Last Modified On : Fri Jul  7 09:33:20 2017
     13// Update Count     : 15
    1414//
    1515
    1616// https://gmplib.org/gmp-man-6.1.1.pdf
     17
     18#pragma once
    1719
    1820#include <gmp.h>                                                                                // GNU multi-precise integers
  • src/libcfa/iostream

    rfea3faa rb826e6b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon May 15 18:08:44 2017
    13 // Update Count     : 105
     12// Last Modified On : Fri Jul  7 08:35:59 2017
     13// Update Count     : 118
    1414//
    1515
    16 #ifndef __IOSTREAM_H__
    17 #define __IOSTREAM_H__
     16#pragma once
    1817
    1918#include "iterator"
     
    2625        const char * sepGetCur( ostype * );                                     // get current separator string
    2726        void sepSetCur( ostype *, const char * );                       // set current separator string
     27        _Bool getNL( ostype * );                                                        // check newline
     28        void setNL( ostype *, _Bool );                                          // saw newline
    2829        // public
    2930        void sepOn( ostype * );                                                         // turn separator state on
     
    4344        ostype * write( ostype *, const char *, unsigned long int );
    4445        int fmt( ostype *, const char fmt[], ... );
    45 };
     46}; // ostream
    4647
    4748trait writeable( otype T ) {
    4849        forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, T );
    49 };
     50}; // writeable
    5051
    5152// implement writable for intrinsic types
     
    8182forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, ostype * (*)( ostype * ) );
    8283forall( dtype ostype | ostream( ostype ) ) ostype * endl( ostype * );
     84forall( dtype ostype | ostream( ostype ) ) ostype * sep( ostype * );
     85forall( dtype ostype | ostream( ostype ) ) ostype * sepTuple( ostype * );
    8386forall( dtype ostype | ostream( ostype ) ) ostype * sepOn( ostype * );
    8487forall( dtype ostype | ostream( ostype ) ) ostype * sepOff( ostype * );
     
    103106        istype * ungetc( istype *, char );
    104107        int fmt( istype *, const char fmt[], ... );
    105 };
     108}; // istream
    106109
    107110trait readable( otype T ) {
    108111        forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, T );
    109 };
     112}; // readable
    110113
    111114forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, char * );
     
    136139forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_cstrC );
    137140
    138 #endif // __IOSTREAM_H
    139 
    140141// Local Variables: //
    141142// mode: c //
  • src/libcfa/iostream.c

    rfea3faa rb826e6b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon May  8 18:24:23 2017
    13 // Update Count     : 369
     12// Last Modified On : Sun Jul 16 21:12:03 2017
     13// Update Count     : 398
    1414//
    1515
     
    1818extern "C" {
    1919#include <stdio.h>
     20#include <stdbool.h>                                                                    // true/false
    2021#include <string.h>                                                                             // strlen
    2122#include <float.h>                                                                              // DBL_DIG, LDBL_DIG
     
    2425
    2526forall( dtype ostype | ostream( ostype ) )
    26 ostype * ?|?( ostype * os, char c ) {
    27         fmt( os, "%c", c );
     27ostype * ?|?( ostype * os, char ch ) {
     28        fmt( os, "%c", ch );
     29        if ( ch == '\n' ) setNL( os, true );
    2830        sepOff( os );
    2931        return os;
     
    123125forall( dtype ostype | ostream( ostype ) )
    124126ostype * ?|?( ostype * os, float _Complex fc ) {
    125         os | crealf( fc );
    126         _Bool temp = sepDisable( os );                                          // disable separators within complex value
    127         if ( cimagf( fc ) >= 0 ) os | '+';                                      // negative value prints '-'
    128         os | cimagf( fc ) | 'i';
    129         sepReset( os, temp );                                                           // reset separator
     127        if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
     128        fmt( os, "%g%+gi", crealf( fc ), cimagf( fc ) );
    130129        return os;
    131130} // ?|?
     
    133132forall( dtype ostype | ostream( ostype ) )
    134133ostype * ?|?( ostype * os, double _Complex dc ) {
    135         os | creal( dc );
    136         _Bool temp = sepDisable( os );                                          // disable separators within complex value
    137         if ( cimag( dc ) >= 0 ) os | '+';                                       // negative value prints '-'
    138         os | cimag( dc ) | 'i';
    139         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 ) );
    140136        return os;
    141137} // ?|?
     
    143139forall( dtype ostype | ostream( ostype ) )
    144140ostype * ?|?( ostype * os, long double _Complex ldc ) {
    145         os | creall( ldc );
    146         _Bool temp = sepDisable( os );                                          // disable separators within complex value
    147         if ( cimagl( ldc ) >= 0 ) os | '+';                                     // negative value prints '-'
    148         os | cimagl( ldc ) | 'i';
    149         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 ) );
    150143        return os;
    151144} // ?|?
     
    180173
    181174        // last character IS spacing or opening punctuation => turn off separator for next item
    182         unsigned int len = strlen( cp ), posn = len - 1;
    183         ch = cp[posn];                                                                          // must make unsigned
     175        size_t len = strlen( cp );
     176        ch = cp[len - 1];                                                                       // must make unsigned
    184177        if ( sepPrt( os ) && mask[ ch ] != Open && mask[ ch ] != OpenClose ) {
    185178                sepOn( os );
     
    187180                sepOff( os );
    188181        } // if
     182        if ( ch == '\n' ) setNL( os, true );                            // check *AFTER* sepPrt call above as it resets NL flag
    189183        return write( os, cp, len );
    190184} // ?|?
     
    201195forall( dtype ostype, otype T, ttype Params | ostream( ostype ) | writeable( T ) | { ostype * ?|?( ostype *, Params ); } )
    202196ostype * ?|?( ostype * os, T arg, Params rest ) {
     197        os | arg;                                                                                       // print first argument
    203198        sepSetCur( os, sepGetTuple( os ) );                                     // switch to tuple separator
    204         os | arg;                                                                                       // print first argument
    205199        os | rest;                                                                                      // print remaining arguments
    206200        sepSetCur( os, sepGet( os ) );                                          // switch to regular separator
     
    216210
    217211forall( dtype ostype | ostream( ostype ) )
     212ostype * sep( ostype * os ) {
     213        os | sepGet( os );
     214        return os;
     215} // sep
     216
     217forall( dtype ostype | ostream( ostype ) )
     218ostype * sepTuple( ostype * os ) {
     219        os | sepGetTuple( os );
     220        return os;
     221} // sepTuple
     222
     223forall( dtype ostype | ostream( ostype ) )
    218224ostype * endl( ostype * os ) {
    219225        os | '\n';
     226        setNL( os, true );
    220227        flush( os );
    221228        sepOff( os );                                                                           // prepare for next line
  • src/libcfa/iterator

    rfea3faa rb826e6b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar  2 18:06:05 2016
    13 // Update Count     : 9
     12// Last Modified On : Fri Jul  7 08:37:25 2017
     13// Update Count     : 10
    1414//
    1515
    16 #ifndef ITERATOR_H
    17 #define ITERATOR_H
     16#pragma once
    1817
    1918// An iterator can be used to traverse a data structure.
     
    3938
    4039forall( otype iterator_type, otype elt_type | iterator( iterator_type, elt_type ) )
    41 void for_each( iterator_type begin, iterator_type end, void (*func)( elt_type ) );
     40void for_each( iterator_type begin, iterator_type end, void (* func)( elt_type ) );
    4241
    4342forall( otype iterator_type, otype elt_type | iterator( iterator_type, elt_type ) )
    44 void for_each_reverse( iterator_type begin, iterator_type end, void (*func)( elt_type ) );
    45 
    46 #endif // ITERATOR_H
     43void for_each_reverse( iterator_type begin, iterator_type end, void (* func)( elt_type ) );
    4744
    4845// Local Variables: //
  • src/libcfa/iterator.c

    rfea3faa rb826e6b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar  2 18:08:11 2016
    13 // Update Count     : 27
     12// Last Modified On : Fri Jul  7 08:38:23 2017
     13// Update Count     : 28
    1414//
    1515
     
    1717
    1818forall( otype iterator_type, otype elt_type | iterator( iterator_type, elt_type ) )
    19 void for_each( iterator_type begin, iterator_type end, void (*func)( elt_type ) ) {
     19void for_each( iterator_type begin, iterator_type end, void (* func)( elt_type ) ) {
    2020        for ( iterator_type i = begin; i != end; ++i ) {
    2121                func( *i );
    22         }
    23 }
     22        } // for
     23} // for_each
    2424
    2525forall( otype iterator_type, otype elt_type | iterator( iterator_type, elt_type ) )
    26 void for_each_reverse( iterator_type begin, iterator_type end, void (*func)( elt_type ) ) {
     26void for_each_reverse( iterator_type begin, iterator_type end, void (* func)( elt_type ) ) {
    2727        for ( iterator_type i = end; i != begin; ) {
    2828                --i;
    2929                func( *i );
    30         }
    31 }
     30        } // for
     31} // for_each_reverse
    3232
    3333// Local Variables: //
  • src/libcfa/libhdr/libalign.h

    rfea3faa rb826e6b  
    1 //                              -*- Mode: C++ -*- 
     1//                              -*- Mode: C++ -*-
    22//
    33// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
     
    1818// Free Software  Foundation; either  version 2.1 of  the License, or  (at your
    1919// option) any later version.
    20 // 
     20//
    2121// This library is distributed in the  hope that it will be useful, but WITHOUT
    2222// ANY  WARRANTY;  without even  the  implied  warranty  of MERCHANTABILITY  or
    2323// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
    2424// for more details.
    25 // 
     25//
    2626// You should  have received a  copy of the  GNU Lesser General  Public License
    2727// along  with this library.
    28 // 
     28//
    2929
    3030
     
    3333
    3434#include "assert"
     35#include <stdbool.h>
    3536
    36 // Minimum size used to align memory boundaries for memory allocations. 
     37// Minimum size used to align memory boundaries for memory allocations.
    3738#define libAlign() (sizeof(double))
    3839
  • src/libcfa/libhdr/libdebug.h

    rfea3faa rb826e6b  
    1818
    1919#ifdef __CFA_DEBUG__
    20         #define LIB_DEBUG_DO(x) x
    21         #define LIB_NO_DEBUG_DO(x) ((void)0)
     20        #define LIB_DEBUG_DO(...) __VA_ARGS__
     21        #define LIB_NO_DEBUG_DO(...)
     22        #define DEBUG_CTX __PRETTY_FUNCTION__
     23        #define DEBUG_CTX2 , __PRETTY_FUNCTION__
     24        #define DEBUG_CTX_PARAM const char * caller
     25        #define DEBUG_CTX_PARAM2 , const char * caller
    2226#else
    23         #define LIB_DEBUG_DO(x) ((void)0)
    24         #define LIB_NO_DEBUG_DO(x) x     
     27        #define LIB_DEBUG_DO(...)
     28        #define LIB_NO_DEBUG_DO(...) __VA_ARGS__
     29        #define DEBUG_CTX
     30        #define DEBUG_CTX2
     31        #define DEBUG_CTX_PARAM
     32        #define DEBUG_CTX_PARAM2
    2533#endif
    2634
     
    5159
    5260#ifdef __CFA_DEBUG_PRINT__
    53       #define LIB_DEBUG_WRITE( fd, buffer, len )  __lib_debug_write( fd, buffer, len )
    54       #define LIB_DEBUG_ACQUIRE()                 __lib_debug_acquire()
    55       #define LIB_DEBUG_RELEASE()                 __lib_debug_release()
    56       #define LIB_DEBUG_PRINT_SAFE(...)           __lib_debug_print_safe   (__VA_ARGS__)
    57       #define LIB_DEBUG_PRINT_NOLOCK(...)         __lib_debug_print_nolock (__VA_ARGS__)
    58       #define LIB_DEBUG_PRINT_BUFFER(...)         __lib_debug_print_buffer (__VA_ARGS__)
     61        #define LIB_DEBUG_WRITE( fd, buffer, len )     __lib_debug_write( fd, buffer, len )
     62        #define LIB_DEBUG_ACQUIRE()                    __lib_debug_acquire()
     63        #define LIB_DEBUG_RELEASE()                    __lib_debug_release()
     64        #define LIB_DEBUG_PRINT_SAFE(...)              __lib_debug_print_safe   (__VA_ARGS__)
     65        #define LIB_DEBUG_PRINT_NOLOCK(...)            __lib_debug_print_nolock (__VA_ARGS__)
     66        #define LIB_DEBUG_PRINT_BUFFER(...)            __lib_debug_print_buffer (__VA_ARGS__)
     67        #define LIB_DEBUG_PRINT_BUFFER_DECL(fd, ...)   char text[256]; int len = snprintf( text, 256, __VA_ARGS__ ); __lib_debug_write( fd, text, len );
     68        #define LIB_DEBUG_PRINT_BUFFER_LOCAL(fd, ...)  len = snprintf( text, 256, __VA_ARGS__ ); __lib_debug_write( fd, text, len );
    5969#else
    60       #define LIB_DEBUG_WRITE(...)          ((void)0)
    61       #define LIB_DEBUG_ACQUIRE()           ((void)0)
    62       #define LIB_DEBUG_RELEASE()           ((void)0)
    63       #define LIB_DEBUG_PRINT_SAFE(...)     ((void)0)
    64       #define LIB_DEBUG_PRINT_NOLOCK(...)   ((void)0)
    65       #define LIB_DEBUG_PRINT_BUFFER(...)   ((void)0)
     70        #define LIB_DEBUG_WRITE(...)               ((void)0)
     71        #define LIB_DEBUG_ACQUIRE()                ((void)0)
     72        #define LIB_DEBUG_RELEASE()                ((void)0)
     73        #define LIB_DEBUG_PRINT_SAFE(...)          ((void)0)
     74        #define LIB_DEBUG_PRINT_NOLOCK(...)        ((void)0)
     75        #define LIB_DEBUG_PRINT_BUFFER(...)        ((void)0)
     76        #define LIB_DEBUG_PRINT_BUFFER_DECL(...)   ((void)0)
     77        #define LIB_DEBUG_PRINT_BUFFER_LOCAL(...)  ((void)0)
    6678#endif
    6779
  • src/libcfa/limits

    rfea3faa rb826e6b  
    1010// Created On       : Wed Apr  6 18:06:52 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Apr  6 21:08:16 2016
    13 // Update Count     : 6
     12// Last Modified On : Fri Jul  7 09:33:57 2017
     13// Update Count     : 7
    1414//
    1515
    16 #ifndef LIMITS_H
    17 #define LIMITS_H
     16#pragma once
    1817
    1918// Integral Constants
     
    110109extern const long _Complex _1_SQRT_2;                                   // 1 / sqrt(2)
    111110
    112 #endif // LIMITS_H
    113 
    114111// Local Variables: //
    115112// mode: c //
  • src/libcfa/math

    rfea3faa rb826e6b  
    1010// Created On       : Mon Apr 18 23:37:04 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed May 24 17:40:39 2017
    13 // Update Count     : 60
    14 //
    15 
    16 #ifndef MATH_H
    17 #define MATH_H
     12// Last Modified On : Fri Jul  7 09:34:15 2017
     13// Update Count     : 61
     14//
     15
     16#pragma once
    1817
    1918extern "C" {
     
    345344long double scalbln( long double, long int );
    346345
    347 #endif // MATH_H
    348 
    349346// Local Variables: //
    350347// mode: c //
  • src/libcfa/rational

    rfea3faa rb826e6b  
    1212// Created On       : Wed Apr  6 17:56:25 2016
    1313// Last Modified By : Peter A. Buhr
    14 // Last Modified On : Mon May 15 21:30:12 2017
    15 // Update Count     : 90
     14// Last Modified On : Fri Jul  7 09:34:33 2017
     15// Update Count     : 93
    1616//
    1717
    18 #ifndef RATIONAL_H
    19 #define RATIONAL_H
     18#pragma once
    2019
    2120#include "iostream"
     
    4746// implementation
    4847
    49 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     48forall( otype RationalImpl | arithmetic( RationalImpl ) )
    5049struct Rational {
    5150        RationalImpl numerator, denominator;                            // invariant: denominator > 0
     
    5453// constructors
    5554
    56 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     55forall( otype RationalImpl | arithmetic( RationalImpl ) )
    5756void ?{}( Rational(RationalImpl) * r );
    5857
    59 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     58forall( otype RationalImpl | arithmetic( RationalImpl ) )
    6059void ?{}( Rational(RationalImpl) * r, RationalImpl n );
    6160
    62 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     61forall( otype RationalImpl | arithmetic( RationalImpl ) )
    6362void ?{}( Rational(RationalImpl) * r, RationalImpl n, RationalImpl d );
    6463
    65 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     64forall( otype RationalImpl | arithmetic( RationalImpl ) )
    6665void ?{}( Rational(RationalImpl) * r, zero_t );
    6766
    68 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     67forall( otype RationalImpl | arithmetic( RationalImpl ) )
    6968void ?{}( Rational(RationalImpl) * r, one_t );
    7069
    71 // getter for numerator/denominator
     70// numerator/denominator getter
    7271
    73 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     72forall( otype RationalImpl | arithmetic( RationalImpl ) )
    7473RationalImpl numerator( Rational(RationalImpl) r );
    7574
    76 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     75forall( otype RationalImpl | arithmetic( RationalImpl ) )
    7776RationalImpl denominator( Rational(RationalImpl) r );
    78 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     77
     78forall( otype RationalImpl | arithmetic( RationalImpl ) )
    7979[ RationalImpl, RationalImpl ] ?=?( * [ RationalImpl, RationalImpl ] dest, Rational(RationalImpl) src );
    8080
    81 // setter for numerator/denominator
     81// numerator/denominator setter
    8282
    83 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     83forall( otype RationalImpl | arithmetic( RationalImpl ) )
    8484RationalImpl numerator( Rational(RationalImpl) r, RationalImpl n );
    8585
    86 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     86forall( otype RationalImpl | arithmetic( RationalImpl ) )
    8787RationalImpl denominator( Rational(RationalImpl) r, RationalImpl d );
    8888
    8989// comparison
    9090
    91 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     91forall( otype RationalImpl | arithmetic( RationalImpl ) )
    9292int ?==?( Rational(RationalImpl) l, Rational(RationalImpl) r );
    9393
    94 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     94forall( otype RationalImpl | arithmetic( RationalImpl ) )
    9595int ?!=?( Rational(RationalImpl) l, Rational(RationalImpl) r );
    9696
    97 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     97forall( otype RationalImpl | arithmetic( RationalImpl ) )
    9898int ?<?( Rational(RationalImpl) l, Rational(RationalImpl) r );
    9999
    100 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     100forall( otype RationalImpl | arithmetic( RationalImpl ) )
    101101int ?<=?( Rational(RationalImpl) l, Rational(RationalImpl) r );
    102102
    103 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     103forall( otype RationalImpl | arithmetic( RationalImpl ) )
    104104int ?>?( Rational(RationalImpl) l, Rational(RationalImpl) r );
    105105
    106 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     106forall( otype RationalImpl | arithmetic( RationalImpl ) )
    107107int ?>=?( Rational(RationalImpl) l, Rational(RationalImpl) r );
    108108
    109109// arithmetic
    110110
    111 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     111forall( otype RationalImpl | arithmetic( RationalImpl ) )
    112112Rational(RationalImpl) +?( Rational(RationalImpl) r );
    113113
    114 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     114forall( otype RationalImpl | arithmetic( RationalImpl ) )
    115115Rational(RationalImpl) -?( Rational(RationalImpl) r );
    116116
    117 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     117forall( otype RationalImpl | arithmetic( RationalImpl ) )
    118118Rational(RationalImpl) ?+?( Rational(RationalImpl) l, Rational(RationalImpl) r );
    119119
    120 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     120forall( otype RationalImpl | arithmetic( RationalImpl ) )
    121121Rational(RationalImpl) ?-?( Rational(RationalImpl) l, Rational(RationalImpl) r );
    122122
    123 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     123forall( otype RationalImpl | arithmetic( RationalImpl ) )
    124124Rational(RationalImpl) ?*?( Rational(RationalImpl) l, Rational(RationalImpl) r );
    125125
    126 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     126forall( otype RationalImpl | arithmetic( RationalImpl ) )
    127127Rational(RationalImpl) ?/?( Rational(RationalImpl) l, Rational(RationalImpl) r );
    128128
    129129// conversion
    130 forall ( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } )
     130forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } )
    131131double widen( Rational(RationalImpl) r );
    132 forall ( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl );  RationalImpl convert( double );} )
     132forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl );  RationalImpl convert( double );} )
    133133Rational(RationalImpl) narrow( double f, RationalImpl md );
    134134
    135135// I/O
    136 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     136forall( otype RationalImpl | arithmetic( RationalImpl ) )
    137137forall( dtype istype | istream( istype ) | { istype * ?|?( istype *, RationalImpl * ); } )
    138138istype * ?|?( istype *, Rational(RationalImpl) * );
    139139
    140 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     140forall( otype RationalImpl | arithmetic( RationalImpl ) )
    141141forall( dtype ostype | ostream( ostype ) | { ostype * ?|?( ostype *, RationalImpl ); } )
    142142ostype * ?|?( ostype *, Rational(RationalImpl ) );
    143 
    144 #endif // RATIONAL_H
    145143
    146144// Local Variables: //
  • src/libcfa/rational.c

    rfea3faa rb826e6b  
    1010// Created On       : Wed Apr  6 17:54:28 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon May 15 21:29:23 2017
    13 // Update Count     : 149
     12// Last Modified On : Tue May 16 18:35:36 2017
     13// Update Count     : 150
    1414//
    1515
     
    2222// Calculate greatest common denominator of two numbers, the first of which may be negative. Used to reduce rationals.
    2323// alternative: https://en.wikipedia.org/wiki/Binary_GCD_algorithm
    24 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     24forall( otype RationalImpl | arithmetic( RationalImpl ) )
    2525static RationalImpl gcd( RationalImpl a, RationalImpl b ) {
    2626        for ( ;; ) {                                                                            // Euclid's algorithm
     
    3333} // gcd
    3434
    35 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     35forall( otype RationalImpl | arithmetic( RationalImpl ) )
    3636static RationalImpl simplify( RationalImpl * n, RationalImpl * d ) {
    3737        if ( *d == (RationalImpl){0} ) {
     
    4646// constructors
    4747
    48 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     48forall( otype RationalImpl | arithmetic( RationalImpl ) )
    4949void ?{}( Rational(RationalImpl) * r ) {
    5050        r{ (RationalImpl){0}, (RationalImpl){1} };
    5151} // rational
    5252
    53 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     53forall( otype RationalImpl | arithmetic( RationalImpl ) )
    5454void ?{}( Rational(RationalImpl) * r, RationalImpl n ) {
    5555        r{ n, (RationalImpl){1} };
    5656} // rational
    5757
    58 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     58forall( otype RationalImpl | arithmetic( RationalImpl ) )
    5959void ?{}( Rational(RationalImpl) * r, RationalImpl n, RationalImpl d ) {
    6060        RationalImpl t = simplify( &n, &d );                            // simplify
     
    6666// getter for numerator/denominator
    6767
    68 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     68forall( otype RationalImpl | arithmetic( RationalImpl ) )
    6969RationalImpl numerator( Rational(RationalImpl) r ) {
    7070        return r.numerator;
    7171} // numerator
    7272
    73 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     73forall( otype RationalImpl | arithmetic( RationalImpl ) )
    7474RationalImpl denominator( Rational(RationalImpl) r ) {
    7575        return r.denominator;
    7676} // denominator
    7777
    78 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     78forall( otype RationalImpl | arithmetic( RationalImpl ) )
    7979[ RationalImpl, RationalImpl ] ?=?( * [ RationalImpl, RationalImpl ] dest, Rational(RationalImpl) src ) {
    8080        return *dest = src.[ numerator, denominator ];
     
    8383// setter for numerator/denominator
    8484
    85 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     85forall( otype RationalImpl | arithmetic( RationalImpl ) )
    8686RationalImpl numerator( Rational(RationalImpl) r, RationalImpl n ) {
    8787        RationalImpl prev = r.numerator;
     
    9292} // numerator
    9393
    94 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     94forall( otype RationalImpl | arithmetic( RationalImpl ) )
    9595RationalImpl denominator( Rational(RationalImpl) r, RationalImpl d ) {
    9696        RationalImpl prev = r.denominator;
     
    104104// comparison
    105105
    106 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     106forall( otype RationalImpl | arithmetic( RationalImpl ) )
    107107int ?==?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    108108        return l.numerator * r.denominator == l.denominator * r.numerator;
    109109} // ?==?
    110110
    111 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     111forall( otype RationalImpl | arithmetic( RationalImpl ) )
    112112int ?!=?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    113113        return ! ( l == r );
    114114} // ?!=?
    115115
    116 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     116forall( otype RationalImpl | arithmetic( RationalImpl ) )
    117117int ?<?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    118118        return l.numerator * r.denominator < l.denominator * r.numerator;
    119119} // ?<?
    120120
    121 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     121forall( otype RationalImpl | arithmetic( RationalImpl ) )
    122122int ?<=?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    123123        return l.numerator * r.denominator <= l.denominator * r.numerator;
    124124} // ?<=?
    125125
    126 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     126forall( otype RationalImpl | arithmetic( RationalImpl ) )
    127127int ?>?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    128128        return ! ( l <= r );
    129129} // ?>?
    130130
    131 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     131forall( otype RationalImpl | arithmetic( RationalImpl ) )
    132132int ?>=?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    133133        return ! ( l < r );
     
    137137// arithmetic
    138138
    139 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     139forall( otype RationalImpl | arithmetic( RationalImpl ) )
    140140Rational(RationalImpl) +?( Rational(RationalImpl) r ) {
    141141        Rational(RationalImpl) t = { r.numerator, r.denominator };
     
    143143} // +?
    144144
    145 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     145forall( otype RationalImpl | arithmetic( RationalImpl ) )
    146146Rational(RationalImpl) -?( Rational(RationalImpl) r ) {
    147147        Rational(RationalImpl) t = { -r.numerator, r.denominator };
     
    149149} // -?
    150150
    151 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     151forall( otype RationalImpl | arithmetic( RationalImpl ) )
    152152Rational(RationalImpl) ?+?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    153153        if ( l.denominator == r.denominator ) {                         // special case
     
    160160} // ?+?
    161161
    162 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     162forall( otype RationalImpl | arithmetic( RationalImpl ) )
    163163Rational(RationalImpl) ?-?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    164164        if ( l.denominator == r.denominator ) {                         // special case
     
    171171} // ?-?
    172172
    173 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     173forall( otype RationalImpl | arithmetic( RationalImpl ) )
    174174Rational(RationalImpl) ?*?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    175175        Rational(RationalImpl) t = { l.numerator * r.numerator, l.denominator * r.denominator };
     
    177177} // ?*?
    178178
    179 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     179forall( otype RationalImpl | arithmetic( RationalImpl ) )
    180180Rational(RationalImpl) ?/?( Rational(RationalImpl) l, Rational(RationalImpl) r ) {
    181181        if ( r.numerator < (RationalImpl){0} ) {
     
    190190// conversion
    191191
    192 forall ( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } )
     192forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } )
    193193double widen( Rational(RationalImpl) r ) {
    194194        return convert( r.numerator ) / convert( r.denominator );
     
    196196
    197197// http://www.ics.uci.edu/~eppstein/numth/frap.c
    198 forall ( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); RationalImpl convert( double ); } )
     198forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); RationalImpl convert( double ); } )
    199199Rational(RationalImpl) narrow( double f, RationalImpl md ) {
    200200        if ( md <= (RationalImpl){1} ) {                                        // maximum fractional digits too small?
     
    227227// I/O
    228228
    229 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     229forall( otype RationalImpl | arithmetic( RationalImpl ) )
    230230forall( dtype istype | istream( istype ) | { istype * ?|?( istype *, RationalImpl * ); } )
    231231istype * ?|?( istype * is, Rational(RationalImpl) * r ) {
     
    238238} // ?|?
    239239
    240 forall ( otype RationalImpl | arithmetic( RationalImpl ) )
     240forall( otype RationalImpl | arithmetic( RationalImpl ) )
    241241forall( dtype ostype | ostream( ostype ) | { ostype * ?|?( ostype *, RationalImpl ); } )
    242242ostype * ?|?( ostype * os, Rational(RationalImpl ) r ) {
  • src/libcfa/stdlib

    rfea3faa rb826e6b  
    1010// Created On       : Thu Jan 28 17:12:35 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jun  2 15:51:03 2017
    13 // Update Count     : 218
    14 //
    15 
    16 #ifndef STDLIB_H
    17 #define STDLIB_H
     12// Last Modified On : Fri Jul  7 09:34:49 2017
     13// Update Count     : 219
     14//
     15
     16#pragma once
    1817
    1918//---------------------------------------
     
    232231void swap( T * t1, T * t2 );
    233232
    234 #endif // STDLIB_H
    235 
    236233// Local Variables: //
    237234// mode: c //
  • src/main.cc

    rfea3faa rb826e6b  
    1111// Created On       : Fri May 15 23:12:02 2015
    1212// Last Modified By : Andrew Beach
    13 // Last Modified On : Wed May 10 14:45:00 2017
    14 // Update Count     : 437
     13// Last Modified On : Fri Jul  7 11:13:00 2017
     14// Update Count     : 442
    1515//
    1616
    17 #include <iostream>
    18 #include <fstream>
    19 #include <signal.h>                                                                             // signal
    20 #include <getopt.h>                                                                             // getopt
    21 #include <execinfo.h>                                                                   // backtrace, backtrace_symbols
    22 #include <cxxabi.h>                                                                             // __cxa_demangle
    23 #include <cstring>                                                                              // index
    24 
    25 using namespace std;
    26 
    27 #include "Parser/lex.h"
    28 #include "Parser/parser.h"
    29 #include "Parser/TypedefTable.h"
    30 #include "GenPoly/Lvalue.h"
    31 #include "GenPoly/Specialize.h"
    32 #include "GenPoly/Box.h"
    33 #include "GenPoly/CopyParams.h"
    34 #include "GenPoly/InstantiateGeneric.h"
    35 #include "Concurrency/Keywords.h"
    36 #include "CodeGen/Generate.h"
    37 #include "CodeGen/FixNames.h"
    38 #include "CodeGen/FixMain.h"
    39 #include "CodeTools/DeclStats.h"
    40 #include "CodeTools/TrackLoc.h"
    41 #include "ControlStruct/Mutate.h"
    42 #include "SymTab/Validate.h"
    43 #include "ResolvExpr/AlternativePrinter.h"
    44 #include "ResolvExpr/Resolver.h"
    45 #include "MakeLibCfa.h"
    46 #include "InitTweak/GenInit.h"
    47 #include "InitTweak/FixInit.h"
    48 #include "Common/UnimplementedError.h"
    49 #include "../config.h"
    50 #include "Tuples/Tuples.h"
     17#include <cassert>                          // for assertf
     18#include <cxxabi.h>                         // for __cxa_demangle
     19#include <execinfo.h>                       // for backtrace, backtrace_symbols
     20#include <getopt.h>                         // for no_argument, optind, geto...
     21#include <signal.h>                         // for signal, SIGABRT, SIGSEGV
     22#include <cstdio>                           // for fopen, FILE, fclose, stdin
     23#include <cstdlib>                          // for exit, free, abort, EXIT_F...
     24#include <cstring>                          // for index
     25#include <fstream>                          // for ofstream
     26#include <iostream>                         // for operator<<, basic_ostream
     27#include <iterator>                         // for back_inserter
     28#include <list>                             // for list
     29#include <string>                           // for operator<<, allocator
     30
     31#include "../config.h"                      // for CFA_LIBDIR
     32#include "CodeGen/FixMain.h"                // for FixMain
     33#include "CodeGen/FixNames.h"               // for fixNames
     34#include "CodeGen/Generate.h"               // for generate
     35#include "CodeTools/DeclStats.h"            // for printDeclStats
     36#include "CodeTools/TrackLoc.h"             // for fillLocations
     37#include "Common/CompilerError.h"           // for CompilerError
     38#include "Common/SemanticError.h"           // for SemanticError
     39#include "Common/UnimplementedError.h"      // for UnimplementedError
     40#include "Common/utility.h"                 // for deleteAll, filter, printAll
     41#include "ControlStruct/ExceptTranslate.h"  // for translateEHM
     42#include "ControlStruct/Mutate.h"           // for mutate
     43#include "GenPoly/Box.h"                    // for box
     44#include "GenPoly/CopyParams.h"             // for copyParams
     45#include "GenPoly/InstantiateGeneric.h"     // for instantiateGeneric
     46#include "GenPoly/Lvalue.h"                 // for convertLvalue
     47#include "GenPoly/Specialize.h"             // for convertSpecializations
     48#include "InitTweak/FixInit.h"              // for fix
     49#include "InitTweak/GenInit.h"              // for genInit
     50#include "MakeLibCfa.h"                     // for makeLibCfa
     51#include "Parser/LinkageSpec.h"             // for Spec, Cforall, Intrinsic
     52#include "Parser/ParseNode.h"               // for DeclarationNode, buildList
     53#include "Parser/TypedefTable.h"            // for TypedefTable
     54#include "ResolvExpr/AlternativePrinter.h"  // for AlternativePrinter
     55#include "ResolvExpr/Resolver.h"            // for resolve
     56#include "SymTab/Validate.h"                // for validate
     57#include "SynTree/Declaration.h"            // for Declaration
     58#include "SynTree/Visitor.h"                // for acceptAll
     59#include "Tuples/Tuples.h"                  // for expandMemberTuples, expan...
    5160
    5261using namespace std;
     
    186195                if ( ! nopreludep ) {                                                   // include gcc builtins
    187196                        // -l is for initial build ONLY and builtins.cf is not in the lib directory so access it here.
    188                         // Read to cfa builtins, if not generating the cfa library
    189                         FILE * builtins = fopen( libcfap | treep ? "../prelude/builtins.cf" : CFA_LIBDIR "/builtins.cf", "r" );
    190                         assertf( builtins, "cannot open builtins.cf\n" );
    191                         parse( builtins, LinkageSpec::Compiler );
    192197
    193198                        // Read to gcc builtins, if not generating the cfa library
     
    206211                                assertf( prelude, "cannot open prelude.cf\n" );
    207212                                parse( prelude, LinkageSpec::Intrinsic );
     213
     214                                // Read to cfa builtins, if not generating the cfa library
     215                                FILE * builtins = fopen( libcfap | treep ? "../prelude/builtins.cf" : CFA_LIBDIR "/builtins.cf", "r" );
     216                                assertf( builtins, "cannot open builtins.cf\n" );
     217                                parse( builtins, LinkageSpec::BuiltinCFA );
    208218                        } // if
    209219                } // if
     
    289299                OPTPRINT( "expandUniqueExpr" ); // xxx - is this the right place for this? want to expand ASAP so that subsequent passes don't need to worry about double-visiting a unique expr - needs to go after InitTweak::fix so that copy constructed return declarations are reused
    290300                Tuples::expandUniqueExpr( translationUnit );
     301
     302                OPTPRINT( "translateEHM" );
     303                ControlStruct::translateEHM( translationUnit );
    291304
    292305                OPTPRINT( "convertSpecializations" ) // needs to happen before tuple types are expanded
     
    481494                        break;
    482495                  case '?':
    483                         assertf( false, "Unknown option: '%c'\n", (char)optopt );
     496                        if ( optopt ) {                                                         // short option ?
     497                                assertf( false, "Unknown option: -%c\n", (char)optopt );
     498                        } else {
     499                                assertf( false, "Unknown option: %s\n", argv[optind - 1] );
     500                        } // if
    484501                  default:
    485502                        abort();
  • src/prelude/Makefile.am

    rfea3faa rb826e6b  
    2323noinst_DATA = ../libcfa/libcfa-prelude.c
    2424
     25CC = ${abs_top_srcdir}/src/driver/cfa
     26
     27$(DEPDIR) :
     28        mkdir $(DEPDIR)
     29
     30$(DEPDIR)/builtins.Po : $(DEPDIR)
     31        touch ${@}
     32
    2533# create extra forward types/declarations to reduce inclusion of library files
    2634extras.cf : extras.regx extras.c
     
    3947
    4048# create forward declarations for cfa builtins
    41 builtins.cf : builtins.c
    42         ${AM_V_GEN}@BACKEND_CC@ -E -P ${<} -o ${@}
     49builtins.cf : builtins.c ${CC}
     50        ${AM_V_GEN}${CC} -E -P ${<} -o ${@} -MD -MP -MF $(DEPDIR)/builtins.Po
     51        ${AM_V_at}sed -i 's/builtins.o/builtins.cf/g' $(DEPDIR)/builtins.Po
     52
     53include $(DEPDIR)/builtins.Po
    4354
    4455../libcfa/libcfa-prelude.c : prelude.cf extras.cf gcc-builtins.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp
     
    4859        ${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -tpmL bootloader.cf $@  # use src/cfa-cpp as not in lib until after install
    4960
     61maintainer-clean-local :
     62        rm -rf $(DEPDIR)
     63
    5064MAINTAINERCLEANFILES = gcc-builtins.c gcc-builtins.cf builtins.cf extras.cf bootloader.c ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}}
  • src/prelude/Makefile.in

    rfea3faa rb826e6b  
    1 # Makefile.in generated by automake 1.11.3 from Makefile.am.
     1# Makefile.in generated by automake 1.15 from Makefile.am.
    22# @configure_input@
    33
    4 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
    5 # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
    6 # Foundation, Inc.
     4# Copyright (C) 1994-2014 Free Software Foundation, Inc.
     5
    76# This Makefile.in is free software; the Free Software Foundation
    87# gives unlimited permission to copy and/or distribute it,
     
    2019
    2120VPATH = @srcdir@
     21am__is_gnu_make = { \
     22  if test -z '$(MAKELEVEL)'; then \
     23    false; \
     24  elif test -n '$(MAKE_HOST)'; then \
     25    true; \
     26  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
     27    true; \
     28  else \
     29    false; \
     30  fi; \
     31}
     32am__make_running_with_option = \
     33  case $${target_option-} in \
     34      ?) ;; \
     35      *) echo "am__make_running_with_option: internal error: invalid" \
     36              "target option '$${target_option-}' specified" >&2; \
     37         exit 1;; \
     38  esac; \
     39  has_opt=no; \
     40  sane_makeflags=$$MAKEFLAGS; \
     41  if $(am__is_gnu_make); then \
     42    sane_makeflags=$$MFLAGS; \
     43  else \
     44    case $$MAKEFLAGS in \
     45      *\\[\ \   ]*) \
     46        bs=\\; \
     47        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
     48          | sed "s/$$bs$$bs[$$bs $$bs   ]*//g"`;; \
     49    esac; \
     50  fi; \
     51  skip_next=no; \
     52  strip_trailopt () \
     53  { \
     54    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
     55  }; \
     56  for flg in $$sane_makeflags; do \
     57    test $$skip_next = yes && { skip_next=no; continue; }; \
     58    case $$flg in \
     59      *=*|--*) continue;; \
     60        -*I) strip_trailopt 'I'; skip_next=yes;; \
     61      -*I?*) strip_trailopt 'I';; \
     62        -*O) strip_trailopt 'O'; skip_next=yes;; \
     63      -*O?*) strip_trailopt 'O';; \
     64        -*l) strip_trailopt 'l'; skip_next=yes;; \
     65      -*l?*) strip_trailopt 'l';; \
     66      -[dEDm]) skip_next=yes;; \
     67      -[JT]) skip_next=yes;; \
     68    esac; \
     69    case $$flg in \
     70      *$$target_option*) has_opt=yes; break;; \
     71    esac; \
     72  done; \
     73  test $$has_opt = yes
     74am__make_dryrun = (target_option=n; $(am__make_running_with_option))
     75am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
    2276pkgdatadir = $(datadir)/@PACKAGE@
    2377pkgincludedir = $(includedir)/@PACKAGE@
     
    3993host_triplet = @host@
    4094subdir = src/prelude
    41 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
    4295ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
    4396am__aclocal_m4_deps = $(top_srcdir)/configure.ac
    4497am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
    4598        $(ACLOCAL_M4)
     99DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
    46100mkinstalldirs = $(install_sh) -d
    47101CONFIG_HEADER = $(top_builddir)/config.h
    48102CONFIG_CLEAN_FILES =
    49103CONFIG_CLEAN_VPATH_FILES =
     104AM_V_P = $(am__v_P_@AM_V@)
     105am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
     106am__v_P_0 = false
     107am__v_P_1 = :
    50108AM_V_GEN = $(am__v_GEN_@AM_V@)
    51109am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
    52 am__v_GEN_0 = @echo "  GEN   " $@;
     110am__v_GEN_0 = @echo "  GEN     " $@;
     111am__v_GEN_1 =
    53112AM_V_at = $(am__v_at_@AM_V@)
    54113am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
    55114am__v_at_0 = @
     115am__v_at_1 =
    56116SOURCES =
    57117DIST_SOURCES =
     118am__can_run_installinfo = \
     119  case $$AM_UPDATE_INFO_DIR in \
     120    n|no|NO) false;; \
     121    *) (install-info --version) >/dev/null 2>&1;; \
     122  esac
    58123am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
    59124am__vpath_adj = case $$p in \
     
    85150am__installdirs = "$(DESTDIR)$(cfalibdir)"
    86151DATA = $(cfalib_DATA) $(noinst_DATA)
     152am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
     153am__DIST_COMMON = $(srcdir)/Makefile.in
    87154DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
    88155ACLOCAL = @ACLOCAL@
     
    95162AWK = @AWK@
    96163BACKEND_CC = @BACKEND_CC@
    97 CC = @CC@
     164CC = ${abs_top_srcdir}/src/driver/cfa
    98165CCAS = @CCAS@
    99166CCASDEPMODE = @CCASDEPMODE@
     
    197264program_transform_name = @program_transform_name@
    198265psdir = @psdir@
     266runstatedir = @runstatedir@
    199267sbindir = @sbindir@
    200268sharedstatedir = @sharedstatedir@
     
    229297        $(am__cd) $(top_srcdir) && \
    230298          $(AUTOMAKE) --foreign src/prelude/Makefile
    231 .PRECIOUS: Makefile
    232299Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
    233300        @case '$?' in \
     
    249316install-cfalibDATA: $(cfalib_DATA)
    250317        @$(NORMAL_INSTALL)
    251         test -z "$(cfalibdir)" || $(MKDIR_P) "$(DESTDIR)$(cfalibdir)"
    252318        @list='$(cfalib_DATA)'; test -n "$(cfalibdir)" || list=; \
     319        if test -n "$$list"; then \
     320          echo " $(MKDIR_P) '$(DESTDIR)$(cfalibdir)'"; \
     321          $(MKDIR_P) "$(DESTDIR)$(cfalibdir)" || exit 1; \
     322        fi; \
    253323        for p in $$list; do \
    254324          if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
     
    265335        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
    266336        dir='$(DESTDIR)$(cfalibdir)'; $(am__uninstall_files_from_dir)
    267 tags: TAGS
    268 TAGS:
    269 
    270 ctags: CTAGS
    271 CTAGS:
     337tags TAGS:
     338
     339ctags CTAGS:
     340
     341cscope cscopelist:
    272342
    273343
     
    390460maintainer-clean: maintainer-clean-am
    391461        -rm -f Makefile
    392 maintainer-clean-am: distclean-am maintainer-clean-generic
     462maintainer-clean-am: distclean-am maintainer-clean-generic \
     463        maintainer-clean-local
    393464
    394465mostlyclean: mostlyclean-am
     
    408479.MAKE: install-am install-strip
    409480
    410 .PHONY: all all-am check check-am clean clean-generic distclean \
    411         distclean-generic distdir dvi dvi-am html html-am info info-am \
    412         install install-am install-cfalibDATA install-data \
    413         install-data-am install-dvi install-dvi-am install-exec \
    414         install-exec-am install-html install-html-am install-info \
    415         install-info-am install-man install-pdf install-pdf-am \
    416         install-ps install-ps-am install-strip installcheck \
    417         installcheck-am installdirs maintainer-clean \
    418         maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
    419         pdf-am ps ps-am uninstall uninstall-am uninstall-cfalibDATA
    420 
     481.PHONY: all all-am check check-am clean clean-generic cscopelist-am \
     482        ctags-am distclean distclean-generic distdir dvi dvi-am html \
     483        html-am info info-am install install-am install-cfalibDATA \
     484        install-data install-data-am install-dvi install-dvi-am \
     485        install-exec install-exec-am install-html install-html-am \
     486        install-info install-info-am install-man install-pdf \
     487        install-pdf-am install-ps install-ps-am install-strip \
     488        installcheck installcheck-am installdirs maintainer-clean \
     489        maintainer-clean-generic maintainer-clean-local mostlyclean \
     490        mostlyclean-generic pdf pdf-am ps ps-am tags-am uninstall \
     491        uninstall-am uninstall-cfalibDATA
     492
     493.PRECIOUS: Makefile
     494
     495
     496$(DEPDIR) :
     497        mkdir $(DEPDIR)
     498
     499$(DEPDIR)/builtins.Po : $(DEPDIR)
     500        touch ${@}
    421501
    422502# create extra forward types/declarations to reduce inclusion of library files
     
    436516
    437517# create forward declarations for cfa builtins
    438 builtins.cf : builtins.c
    439         ${AM_V_GEN}@BACKEND_CC@ -E -P ${<} -o ${@}
     518builtins.cf : builtins.c ${CC}
     519        ${AM_V_GEN}${CC} -E -P ${<} -o ${@} -MD -MP -MF $(DEPDIR)/builtins.Po
     520        ${AM_V_at}sed -i 's/builtins.o/builtins.cf/g' $(DEPDIR)/builtins.Po
     521
     522include $(DEPDIR)/builtins.Po
    440523
    441524../libcfa/libcfa-prelude.c : prelude.cf extras.cf gcc-builtins.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp
     
    444527bootloader.c : bootloader.cf prelude.cf extras.cf gcc-builtins.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp
    445528        ${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -tpmL bootloader.cf $@  # use src/cfa-cpp as not in lib until after install
     529
     530maintainer-clean-local :
     531        rm -rf $(DEPDIR)
    446532
    447533# Tell versions [3.59,3.63) of GNU make to not export all variables.
  • src/prelude/builtins.c

    rfea3faa rb826e6b  
    11typedef unsigned long long __cfaabi_exception_type_t;
     2
     3#include "../libcfa/exception.h"
  • src/tests/.expect/32/math.txt

    rfea3faa rb826e6b  
    2222cos:0.540302 0.54030230586814 0.540302305868139717 0.83373-0.988898i 0.833730025131149-0.988897705762865i 0.833730025131149049-0.988897705762865096i
    2323tan:1.55741 1.5574077246549 1.55740772465490223 0.271753+1.08392i 0.271752585319512+1.08392332733869i 0.271752585319511717+1.08392332733869454i
    24 asin:1.5708 1.5707963267949 1.57079632679489662 0.66624+1.06128i 0.666239432492515+1.06127506190504i 0.666239432492515255+1.06127506190503565i
     24asin:1.5708 1.5707963267949 1.57079632679489662 0.666239+1.06128i 0.666239432492515+1.06127506190504i 0.666239432492515255+1.06127506190503565i
    2525acos:0 0 0 0.904557-1.06128i 0.904556894302381-1.06127506190504i 0.904556894302381364-1.06127506190503565i
    2626atan:0.785398 0.785398163397448 0.78539816339744831 1.01722+0.402359i 1.01722196789785+0.402359478108525i 1.01722196789785137+0.402359478108525094i
  • src/tests/.expect/concurrent/sched-int-disjoint.txt

    rfea3faa rb826e6b  
    999000
    101010000
    11 11000
    12 12000
    13 13000
    14 14000
    15 15000
    16 16000
    17 17000
    18 18000
    19 19000
    20 20000
    21 21000
    22 22000
    23 23000
    24 24000
    25 25000
    26 26000
    27 27000
    28 28000
    29 29000
    30 30000
    31 31000
    32 32000
    33 33000
    34 34000
    35 35000
    36 36000
    37 37000
    38 38000
    39 39000
    40 40000
    41 41000
    42 42000
    43 43000
    44 44000
    45 45000
    46 46000
    47 47000
    48 48000
    49 49000
    50 50000
    51 51000
    52 52000
    53 53000
    54 54000
    55 55000
    56 56000
    57 57000
    58 58000
    59 59000
    60 60000
    61 61000
    62 62000
    63 63000
    64 64000
    65 65000
    66 66000
    67 67000
    68 68000
    69 69000
    70 70000
    71 71000
    72 72000
    73 73000
    74 74000
    75 75000
    76 76000
    77 77000
    78 78000
    79 79000
    80 80000
    81 81000
    82 82000
    83 83000
    84 84000
    85 85000
    86 86000
    87 87000
    88 88000
    89 89000
    90 90000
    91 91000
    92 92000
    93 93000
    94 94000
    95 95000
    96 96000
    97 97000
    98 98000
    99 99000
    100 100000
    10111All waiter done
  • src/tests/.expect/io.txt

    rfea3faa rb826e6b  
    44123
    55
     6opening delimiters
    67x (1 x [2 x {3 x =4 x $5 x £6 x ¥7 x ¡8 x ¿9 x «10
     8
     9closing delimiters
    7101, x 2. x 3; x 4! x 5? x 6% x 7¢ x 8» x 9) x 10] x 11} x
     11
     12opening/closing delimiters
    813x`1`x'2'x"3"x:4:x 5 x   6       x
    9147
     
    152010
    1621x
     22
     23override opening/closing delimiters
    1724x ( 1 ) x 2 , x 3 :x: 4
     25
     26input bacis types
     27
     28output basic types
    1829A
    19301 2 3 4 5 6 7 8
     
    21321.1+2.3i 1.1-2.3i 1.1-2.3i
    2233
     34tuples
     351, 2, 3 4, 5, 6
     36
     37toggle separator
    23381.11.21.3
    24391.1+2.3i1.1-2.3i1.1-2.3i
    25  abcxyz
     401.1+2.3i 1.1-2.3i1.1-2.3i
     411.1+2.3i 1.1-2.3i 1.1-2.3i
     421.1+2.3i1.1-2.3i 1.1-2.3i
     43abcxyz
    2644abcxyz
    2745
     46change separator
     47from " " to ", $"
    28481.1, $1.2, $1.3
    29491.1+2.3i, $1.1-2.3i, $1.1-2.3i
    3050abc, $xyz
     511, 2, 3, $4, 5, 6
    3152
    32 1, 2, 3, 4
    33 1, $2, $3 ", $"
    34 1 2 3 " "
    35  1 2 3
     53from ", $" to " "
     541.1 1.2 1.3
     551.1+2.3i 1.1-2.3i 1.1-2.3i
     56abc xyz
     571, 2, 3 4, 5, 6
     58
     59check sepOn/sepOff
     601 2 3
    366112 3
     621 2 3
     631 2 3
     64
     651 2 3
     66
     67check enable/disable
    3768123
    38691 23
    39701 2 3
    40 1 2 3 4 " "
    41 1, 2, 3, 4 ", "
    42 1, 2, 3, 4
     71123
     721 2 3
     73123
     741 2 3
     75
     761 2 3 4 5 6 " "
     771, 2, 3 4, 5, 6 " "
     781, 2, 3 4, 5, 6
     79
    43803, 4, a, 7.2
    44813, 4, a, 7.2
    45823 4 a 7.2
    46  3 4 a 7.234a7.23 4 a 7.2
    47 3-4-a-7.2^3^4-3-4-a-7.2
     833 4 a 7.234a7.23 4 a 7.2
     843-4-a-7.2^3^4^3-4-a-7.2
  • src/tests/Makefile.am

    rfea3faa rb826e6b  
    2929
    3030# applies to both programs
    31 EXTRA_FLAGS =
    32 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ ${EXTRA_FLAGS}
     31DEBUG_FLAGS =
     32
     33BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@
     34if !BUILD_DEBUG
     35BUILD_FLAGS += -nodebug
     36else
     37if !BUILD_RELEASE
     38BUILD_FLAGS += -debug
     39else
     40BUILD_FLAGS += ${DEBUG_FLAGS}
     41endif
     42endif
     43
    3344TEST_FLAGS = $(if $(test), 2> .err/${@}.log, )
    34 CFLAGS = ${TEST_FLAGS} ${BUILD_FLAGS}
     45AM_CFLAGS = ${TEST_FLAGS} ${BUILD_FLAGS}
    3546CC = @CFA_BINDIR@/@CFA_NAME@
    3647
     
    3950
    4051fstream_test_SOURCES = fstream_test.c
     52fstream_test_CFLAGS = $(if $(test), 2>> .err/fstream_test.log, ) ${BUILD_FLAGS}
     53
    4154vector_test_SOURCES = vector/vector_int.c vector/array.c vector/vector_test.c
     55vector_test_CFLAGS = $(if $(test), 2>> .err/vector_test.log, ) ${BUILD_FLAGS}
     56
    4257avl_test_SOURCES = avltree/avl_test.c avltree/avl0.c avltree/avl1.c avltree/avl2.c avltree/avl3.c avltree/avl4.c avltree/avl-private.c
     58avl_test_CFLAGS = $(if $(test), 2>> .err/avl_test.log, ) ${BUILD_FLAGS}
    4359
    4460all-local :
     
    6278
    6379% : %.c @CFA_BINDIR@/@CFA_NAME@
    64         ${CC} ${CFLAGS} ${<} -o ${@}
     80        ${CC} ${AM_CFLAGS} ${CFLAGS} ${<} -o ${@}
    6581
    6682dtor-early-exit-ERR1: dtor-early-exit.c @CFA_BINDIR@/@CFA_NAME@
    67         ${CC} ${CFLAGS} -DERR1 ${<} -o ${@}
     83        ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@}
    6884
    6985dtor-early-exit-ERR2: dtor-early-exit.c @CFA_BINDIR@/@CFA_NAME@
    70         ${CC} ${CFLAGS} -DERR2 ${<} -o ${@}
     86        ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR2 ${<} -o ${@}
    7187
    7288declarationSpecifier: declarationSpecifier.c @CFA_BINDIR@/@CFA_NAME@
    73         ${CC} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
     89        ${CC} ${AM_CFLAGS} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
    7490
    7591gccExtensions : gccExtensions.c @CFA_BINDIR@/@CFA_NAME@
    76         ${CC} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
     92        ${CC} ${AM_CFLAGS} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
    7793
    7894extension : extension.c @CFA_BINDIR@/@CFA_NAME@
    79         ${CC} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
     95        ${CC} ${AM_CFLAGS} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
    8096
    8197attributes : attributes.c @CFA_BINDIR@/@CFA_NAME@
    82         ${CC} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
     98        ${CC} ${AM_CFLAGS} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
    8399
    84100KRfunctions : KRfunctions.c @CFA_BINDIR@/@CFA_NAME@
    85         ${CC} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
     101        ${CC} ${AM_CFLAGS} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
    86102
    87103gmp : gmp.c @CFA_BINDIR@/@CFA_NAME@
    88         ${CC} ${CFLAGS} -lgmp ${<} -o ${@}
     104        ${CC} ${AM_CFLAGS} ${CFLAGS} -lgmp ${<} -o ${@}
    89105
    90106memberCtors-ERR1: memberCtors.c @CFA_BINDIR@/@CFA_NAME@
    91         ${CC} ${CFLAGS} -DERR1 ${<} -o ${@}
     107        ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@}
    92108
    93109completeTypeError : completeTypeError.c @CFA_BINDIR@/@CFA_NAME@
    94         ${CC} ${CFLAGS} -DERR1 ${<} -o ${@}
     110        ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@}
  • src/tests/Makefile.in

    rfea3faa rb826e6b  
    1 # Makefile.in generated by automake 1.11.3 from Makefile.am.
     1# Makefile.in generated by automake 1.15 from Makefile.am.
    22# @configure_input@
    33
    4 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
    5 # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
    6 # Foundation, Inc.
     4# Copyright (C) 1994-2014 Free Software Foundation, Inc.
     5
    76# This Makefile.in is free software; the Free Software Foundation
    87# gives unlimited permission to copy and/or distribute it,
     
    1918###############################################################################
    2019VPATH = @srcdir@
     20am__is_gnu_make = { \
     21  if test -z '$(MAKELEVEL)'; then \
     22    false; \
     23  elif test -n '$(MAKE_HOST)'; then \
     24    true; \
     25  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
     26    true; \
     27  else \
     28    false; \
     29  fi; \
     30}
     31am__make_running_with_option = \
     32  case $${target_option-} in \
     33      ?) ;; \
     34      *) echo "am__make_running_with_option: internal error: invalid" \
     35              "target option '$${target_option-}' specified" >&2; \
     36         exit 1;; \
     37  esac; \
     38  has_opt=no; \
     39  sane_makeflags=$$MAKEFLAGS; \
     40  if $(am__is_gnu_make); then \
     41    sane_makeflags=$$MFLAGS; \
     42  else \
     43    case $$MAKEFLAGS in \
     44      *\\[\ \   ]*) \
     45        bs=\\; \
     46        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
     47          | sed "s/$$bs$$bs[$$bs $$bs   ]*//g"`;; \
     48    esac; \
     49  fi; \
     50  skip_next=no; \
     51  strip_trailopt () \
     52  { \
     53    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
     54  }; \
     55  for flg in $$sane_makeflags; do \
     56    test $$skip_next = yes && { skip_next=no; continue; }; \
     57    case $$flg in \
     58      *=*|--*) continue;; \
     59        -*I) strip_trailopt 'I'; skip_next=yes;; \
     60      -*I?*) strip_trailopt 'I';; \
     61        -*O) strip_trailopt 'O'; skip_next=yes;; \
     62      -*O?*) strip_trailopt 'O';; \
     63        -*l) strip_trailopt 'l'; skip_next=yes;; \
     64      -*l?*) strip_trailopt 'l';; \
     65      -[dEDm]) skip_next=yes;; \
     66      -[JT]) skip_next=yes;; \
     67    esac; \
     68    case $$flg in \
     69      *$$target_option*) has_opt=yes; break;; \
     70    esac; \
     71  done; \
     72  test $$has_opt = yes
     73am__make_dryrun = (target_option=n; $(am__make_running_with_option))
     74am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
    2175pkgdatadir = $(datadir)/@PACKAGE@
    2276pkgincludedir = $(includedir)/@PACKAGE@
     
    3892host_triplet = @host@
    3993@BUILD_CONCURRENCY_TRUE@am__append_1 = coroutine thread monitor
     94@BUILD_DEBUG_FALSE@am__append_2 = -nodebug
     95@BUILD_DEBUG_TRUE@@BUILD_RELEASE_FALSE@am__append_3 = -debug
     96@BUILD_DEBUG_TRUE@@BUILD_RELEASE_TRUE@am__append_4 = ${DEBUG_FLAGS}
    4097EXTRA_PROGRAMS = fstream_test$(EXEEXT) vector_test$(EXEEXT) \
    4198        avl_test$(EXEEXT)
    4299subdir = src/tests
    43 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
    44100ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
    45101am__aclocal_m4_deps = $(top_srcdir)/configure.ac
    46102am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
    47103        $(ACLOCAL_M4)
     104DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
    48105mkinstalldirs = $(install_sh) -d
    49106CONFIG_HEADER = $(top_builddir)/config.h
    50107CONFIG_CLEAN_FILES =
    51108CONFIG_CLEAN_VPATH_FILES =
    52 am_avl_test_OBJECTS = avl_test.$(OBJEXT) avl0.$(OBJEXT) avl1.$(OBJEXT) \
    53         avl2.$(OBJEXT) avl3.$(OBJEXT) avl4.$(OBJEXT) \
    54         avl-private.$(OBJEXT)
     109am__dirstamp = $(am__leading_dot)dirstamp
     110am_avl_test_OBJECTS = avltree/avl_test-avl_test.$(OBJEXT) \
     111        avltree/avl_test-avl0.$(OBJEXT) \
     112        avltree/avl_test-avl1.$(OBJEXT) \
     113        avltree/avl_test-avl2.$(OBJEXT) \
     114        avltree/avl_test-avl3.$(OBJEXT) \
     115        avltree/avl_test-avl4.$(OBJEXT) \
     116        avltree/avl_test-avl-private.$(OBJEXT)
    55117avl_test_OBJECTS = $(am_avl_test_OBJECTS)
    56118avl_test_LDADD = $(LDADD)
    57 am_fstream_test_OBJECTS = fstream_test.$(OBJEXT)
     119avl_test_LINK = $(CCLD) $(avl_test_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
     120        $(LDFLAGS) -o $@
     121am_fstream_test_OBJECTS = fstream_test-fstream_test.$(OBJEXT)
    58122fstream_test_OBJECTS = $(am_fstream_test_OBJECTS)
    59123fstream_test_LDADD = $(LDADD)
    60 am_vector_test_OBJECTS = vector_int.$(OBJEXT) array.$(OBJEXT) \
    61         vector_test.$(OBJEXT)
     124fstream_test_LINK = $(CCLD) $(fstream_test_CFLAGS) $(CFLAGS) \
     125        $(AM_LDFLAGS) $(LDFLAGS) -o $@
     126am_vector_test_OBJECTS = vector/vector_test-vector_int.$(OBJEXT) \
     127        vector/vector_test-array.$(OBJEXT) \
     128        vector/vector_test-vector_test.$(OBJEXT)
    62129vector_test_OBJECTS = $(am_vector_test_OBJECTS)
    63130vector_test_LDADD = $(LDADD)
     131vector_test_LINK = $(CCLD) $(vector_test_CFLAGS) $(CFLAGS) \
     132        $(AM_LDFLAGS) $(LDFLAGS) -o $@
     133AM_V_P = $(am__v_P_@AM_V@)
     134am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
     135am__v_P_0 = false
     136am__v_P_1 = :
     137AM_V_GEN = $(am__v_GEN_@AM_V@)
     138am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
     139am__v_GEN_0 = @echo "  GEN     " $@;
     140am__v_GEN_1 =
     141AM_V_at = $(am__v_at_@AM_V@)
     142am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
     143am__v_at_0 = @
     144am__v_at_1 =
    64145DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
    65146depcomp = $(SHELL) $(top_srcdir)/automake/depcomp
     
    69150am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
    70151am__v_lt_0 = --silent
     152am__v_lt_1 =
    71153COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
    72154        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
    73155AM_V_CC = $(am__v_CC_@AM_V@)
    74156am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
    75 am__v_CC_0 = @echo "  CC    " $@;
    76 AM_V_at = $(am__v_at_@AM_V@)
    77 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
    78 am__v_at_0 = @
     157am__v_CC_0 = @echo "  CC      " $@;
     158am__v_CC_1 =
    79159CCLD = $(CC)
    80160LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
    81161AM_V_CCLD = $(am__v_CCLD_@AM_V@)
    82162am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
    83 am__v_CCLD_0 = @echo "  CCLD  " $@;
    84 AM_V_GEN = $(am__v_GEN_@AM_V@)
    85 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
    86 am__v_GEN_0 = @echo "  GEN   " $@;
     163am__v_CCLD_0 = @echo "  CCLD    " $@;
     164am__v_CCLD_1 =
    87165SOURCES = $(avl_test_SOURCES) $(fstream_test_SOURCES) \
    88166        $(vector_test_SOURCES)
    89167DIST_SOURCES = $(avl_test_SOURCES) $(fstream_test_SOURCES) \
    90168        $(vector_test_SOURCES)
     169am__can_run_installinfo = \
     170  case $$AM_UPDATE_INFO_DIR in \
     171    n|no|NO) false;; \
     172    *) (install-info --version) >/dev/null 2>&1;; \
     173  esac
     174am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
     175# Read a list of newline-separated strings from the standard input,
     176# and print each of them once, without duplicates.  Input order is
     177# *not* preserved.
     178am__uniquify_input = $(AWK) '\
     179  BEGIN { nonempty = 0; } \
     180  { items[$$0] = 1; nonempty = 1; } \
     181  END { if (nonempty) { for (i in items) print i; }; } \
     182'
     183# Make sure the list of sources is unique.  This is necessary because,
     184# e.g., the same source file might be shared among _SOURCES variables
     185# for different programs/libraries.
     186am__define_uniq_tagged_files = \
     187  list='$(am__tagged_files)'; \
     188  unique=`for i in $$list; do \
     189    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
     190  done | $(am__uniquify_input)`
    91191ETAGS = etags
    92192CTAGS = ctags
     193am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/automake/depcomp
    93194DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
    94195ACLOCAL = @ACLOCAL@
     
    113214CFA_NAME = @CFA_NAME@
    114215CFA_PREFIX = @CFA_PREFIX@
    115 CFLAGS = ${TEST_FLAGS} ${BUILD_FLAGS}
     216CFLAGS = @CFLAGS@
    116217CPP = @CPP@
    117218CPPFLAGS = @CPPFLAGS@
     
    203304program_transform_name = @program_transform_name@
    204305psdir = @psdir@
     306runstatedir = @runstatedir@
    205307sbindir = @sbindir@
    206308sharedstatedir = @sharedstatedir@
     
    221323
    222324# applies to both programs
    223 EXTRA_FLAGS =
    224 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ ${EXTRA_FLAGS}
     325DEBUG_FLAGS =
     326BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ \
     327        $(am__append_2) $(am__append_3) $(am__append_4)
    225328TEST_FLAGS = $(if $(test), 2> .err/${@}.log, )
     329AM_CFLAGS = ${TEST_FLAGS} ${BUILD_FLAGS}
    226330fstream_test_SOURCES = fstream_test.c
     331fstream_test_CFLAGS = $(if $(test), 2>> .err/fstream_test.log, ) ${BUILD_FLAGS}
    227332vector_test_SOURCES = vector/vector_int.c vector/array.c vector/vector_test.c
     333vector_test_CFLAGS = $(if $(test), 2>> .err/vector_test.log, ) ${BUILD_FLAGS}
    228334avl_test_SOURCES = avltree/avl_test.c avltree/avl0.c avltree/avl1.c avltree/avl2.c avltree/avl3.c avltree/avl4.c avltree/avl-private.c
     335avl_test_CFLAGS = $(if $(test), 2>> .err/avl_test.log, ) ${BUILD_FLAGS}
    229336all: all-am
    230337
     
    243350        $(am__cd) $(top_srcdir) && \
    244351          $(AUTOMAKE) --foreign src/tests/Makefile
    245 .PRECIOUS: Makefile
    246352Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
    247353        @case '$?' in \
     
    261367        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
    262368$(am__aclocal_m4_deps):
     369avltree/$(am__dirstamp):
     370        @$(MKDIR_P) avltree
     371        @: > avltree/$(am__dirstamp)
     372avltree/$(DEPDIR)/$(am__dirstamp):
     373        @$(MKDIR_P) avltree/$(DEPDIR)
     374        @: > avltree/$(DEPDIR)/$(am__dirstamp)
     375avltree/avl_test-avl_test.$(OBJEXT): avltree/$(am__dirstamp) \
     376        avltree/$(DEPDIR)/$(am__dirstamp)
     377avltree/avl_test-avl0.$(OBJEXT): avltree/$(am__dirstamp) \
     378        avltree/$(DEPDIR)/$(am__dirstamp)
     379avltree/avl_test-avl1.$(OBJEXT): avltree/$(am__dirstamp) \
     380        avltree/$(DEPDIR)/$(am__dirstamp)
     381avltree/avl_test-avl2.$(OBJEXT): avltree/$(am__dirstamp) \
     382        avltree/$(DEPDIR)/$(am__dirstamp)
     383avltree/avl_test-avl3.$(OBJEXT): avltree/$(am__dirstamp) \
     384        avltree/$(DEPDIR)/$(am__dirstamp)
     385avltree/avl_test-avl4.$(OBJEXT): avltree/$(am__dirstamp) \
     386        avltree/$(DEPDIR)/$(am__dirstamp)
     387avltree/avl_test-avl-private.$(OBJEXT): avltree/$(am__dirstamp) \
     388        avltree/$(DEPDIR)/$(am__dirstamp)
     389
    263390avl_test$(EXEEXT): $(avl_test_OBJECTS) $(avl_test_DEPENDENCIES) $(EXTRA_avl_test_DEPENDENCIES)
    264391        @rm -f avl_test$(EXEEXT)
    265         $(AM_V_CCLD)$(LINK) $(avl_test_OBJECTS) $(avl_test_LDADD) $(LIBS)
     392        $(AM_V_CCLD)$(avl_test_LINK) $(avl_test_OBJECTS) $(avl_test_LDADD) $(LIBS)
     393
    266394fstream_test$(EXEEXT): $(fstream_test_OBJECTS) $(fstream_test_DEPENDENCIES) $(EXTRA_fstream_test_DEPENDENCIES)
    267395        @rm -f fstream_test$(EXEEXT)
    268         $(AM_V_CCLD)$(LINK) $(fstream_test_OBJECTS) $(fstream_test_LDADD) $(LIBS)
     396        $(AM_V_CCLD)$(fstream_test_LINK) $(fstream_test_OBJECTS) $(fstream_test_LDADD) $(LIBS)
     397vector/$(am__dirstamp):
     398        @$(MKDIR_P) vector
     399        @: > vector/$(am__dirstamp)
     400vector/$(DEPDIR)/$(am__dirstamp):
     401        @$(MKDIR_P) vector/$(DEPDIR)
     402        @: > vector/$(DEPDIR)/$(am__dirstamp)
     403vector/vector_test-vector_int.$(OBJEXT): vector/$(am__dirstamp) \
     404        vector/$(DEPDIR)/$(am__dirstamp)
     405vector/vector_test-array.$(OBJEXT): vector/$(am__dirstamp) \
     406        vector/$(DEPDIR)/$(am__dirstamp)
     407vector/vector_test-vector_test.$(OBJEXT): vector/$(am__dirstamp) \
     408        vector/$(DEPDIR)/$(am__dirstamp)
     409
    269410vector_test$(EXEEXT): $(vector_test_OBJECTS) $(vector_test_DEPENDENCIES) $(EXTRA_vector_test_DEPENDENCIES)
    270411        @rm -f vector_test$(EXEEXT)
    271         $(AM_V_CCLD)$(LINK) $(vector_test_OBJECTS) $(vector_test_LDADD) $(LIBS)
     412        $(AM_V_CCLD)$(vector_test_LINK) $(vector_test_OBJECTS) $(vector_test_LDADD) $(LIBS)
    272413
    273414mostlyclean-compile:
    274415        -rm -f *.$(OBJEXT)
     416        -rm -f avltree/*.$(OBJEXT)
     417        -rm -f vector/*.$(OBJEXT)
    275418
    276419distclean-compile:
    277420        -rm -f *.tab.c
    278421
    279 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array.Po@am__quote@
    280 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl-private.Po@am__quote@
    281 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl0.Po@am__quote@
    282 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl1.Po@am__quote@
    283 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl2.Po@am__quote@
    284 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl3.Po@am__quote@
    285 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl4.Po@am__quote@
    286 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/avl_test.Po@am__quote@
    287 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstream_test.Po@am__quote@
    288 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_int.Po@am__quote@
    289 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_test.Po@am__quote@
     422@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstream_test-fstream_test.Po@am__quote@
     423@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl_test-avl-private.Po@am__quote@
     424@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl_test-avl0.Po@am__quote@
     425@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl_test-avl1.Po@am__quote@
     426@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl_test-avl2.Po@am__quote@
     427@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl_test-avl3.Po@am__quote@
     428@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl_test-avl4.Po@am__quote@
     429@AMDEP_TRUE@@am__include@ @am__quote@avltree/$(DEPDIR)/avl_test-avl_test.Po@am__quote@
     430@AMDEP_TRUE@@am__include@ @am__quote@vector/$(DEPDIR)/vector_test-array.Po@am__quote@
     431@AMDEP_TRUE@@am__include@ @am__quote@vector/$(DEPDIR)/vector_test-vector_int.Po@am__quote@
     432@AMDEP_TRUE@@am__include@ @am__quote@vector/$(DEPDIR)/vector_test-vector_test.Po@am__quote@
    290433
    291434.c.o:
    292 @am__fastdepCC_TRUE@    $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
    293 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
     435@am__fastdepCC_TRUE@    $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
     436@am__fastdepCC_TRUE@    $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
     437@am__fastdepCC_TRUE@    $(am__mv) $$depbase.Tpo $$depbase.Po
    294438@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
    295439@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    296 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
     440@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
    297441
    298442.c.obj:
    299 @am__fastdepCC_TRUE@    $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
    300 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
     443@am__fastdepCC_TRUE@    $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
     444@am__fastdepCC_TRUE@    $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
     445@am__fastdepCC_TRUE@    $(am__mv) $$depbase.Tpo $$depbase.Po
    301446@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
    302447@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    303 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
    304 
    305 avl_test.o: avltree/avl_test.c
    306 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl_test.o -MD -MP -MF $(DEPDIR)/avl_test.Tpo -c -o avl_test.o `test -f 'avltree/avl_test.c' || echo '$(srcdir)/'`avltree/avl_test.c
    307 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl_test.Tpo $(DEPDIR)/avl_test.Po
    308 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl_test.c' object='avl_test.o' libtool=no @AMDEPBACKSLASH@
    309 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    310 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl_test.o `test -f 'avltree/avl_test.c' || echo '$(srcdir)/'`avltree/avl_test.c
    311 
    312 avl_test.obj: avltree/avl_test.c
    313 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl_test.obj -MD -MP -MF $(DEPDIR)/avl_test.Tpo -c -o avl_test.obj `if test -f 'avltree/avl_test.c'; then $(CYGPATH_W) 'avltree/avl_test.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl_test.c'; fi`
    314 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl_test.Tpo $(DEPDIR)/avl_test.Po
    315 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl_test.c' object='avl_test.obj' libtool=no @AMDEPBACKSLASH@
    316 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    317 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl_test.obj `if test -f 'avltree/avl_test.c'; then $(CYGPATH_W) 'avltree/avl_test.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl_test.c'; fi`
    318 
    319 avl0.o: avltree/avl0.c
    320 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl0.o -MD -MP -MF $(DEPDIR)/avl0.Tpo -c -o avl0.o `test -f 'avltree/avl0.c' || echo '$(srcdir)/'`avltree/avl0.c
    321 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl0.Tpo $(DEPDIR)/avl0.Po
    322 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl0.c' object='avl0.o' libtool=no @AMDEPBACKSLASH@
    323 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    324 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl0.o `test -f 'avltree/avl0.c' || echo '$(srcdir)/'`avltree/avl0.c
    325 
    326 avl0.obj: avltree/avl0.c
    327 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl0.obj -MD -MP -MF $(DEPDIR)/avl0.Tpo -c -o avl0.obj `if test -f 'avltree/avl0.c'; then $(CYGPATH_W) 'avltree/avl0.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl0.c'; fi`
    328 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl0.Tpo $(DEPDIR)/avl0.Po
    329 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl0.c' object='avl0.obj' libtool=no @AMDEPBACKSLASH@
    330 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    331 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl0.obj `if test -f 'avltree/avl0.c'; then $(CYGPATH_W) 'avltree/avl0.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl0.c'; fi`
    332 
    333 avl1.o: avltree/avl1.c
    334 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl1.o -MD -MP -MF $(DEPDIR)/avl1.Tpo -c -o avl1.o `test -f 'avltree/avl1.c' || echo '$(srcdir)/'`avltree/avl1.c
    335 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl1.Tpo $(DEPDIR)/avl1.Po
    336 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl1.c' object='avl1.o' libtool=no @AMDEPBACKSLASH@
    337 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    338 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl1.o `test -f 'avltree/avl1.c' || echo '$(srcdir)/'`avltree/avl1.c
    339 
    340 avl1.obj: avltree/avl1.c
    341 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl1.obj -MD -MP -MF $(DEPDIR)/avl1.Tpo -c -o avl1.obj `if test -f 'avltree/avl1.c'; then $(CYGPATH_W) 'avltree/avl1.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl1.c'; fi`
    342 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl1.Tpo $(DEPDIR)/avl1.Po
    343 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl1.c' object='avl1.obj' libtool=no @AMDEPBACKSLASH@
    344 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    345 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl1.obj `if test -f 'avltree/avl1.c'; then $(CYGPATH_W) 'avltree/avl1.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl1.c'; fi`
    346 
    347 avl2.o: avltree/avl2.c
    348 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl2.o -MD -MP -MF $(DEPDIR)/avl2.Tpo -c -o avl2.o `test -f 'avltree/avl2.c' || echo '$(srcdir)/'`avltree/avl2.c
    349 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl2.Tpo $(DEPDIR)/avl2.Po
    350 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl2.c' object='avl2.o' libtool=no @AMDEPBACKSLASH@
    351 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    352 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl2.o `test -f 'avltree/avl2.c' || echo '$(srcdir)/'`avltree/avl2.c
    353 
    354 avl2.obj: avltree/avl2.c
    355 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl2.obj -MD -MP -MF $(DEPDIR)/avl2.Tpo -c -o avl2.obj `if test -f 'avltree/avl2.c'; then $(CYGPATH_W) 'avltree/avl2.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl2.c'; fi`
    356 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl2.Tpo $(DEPDIR)/avl2.Po
    357 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl2.c' object='avl2.obj' libtool=no @AMDEPBACKSLASH@
    358 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    359 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl2.obj `if test -f 'avltree/avl2.c'; then $(CYGPATH_W) 'avltree/avl2.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl2.c'; fi`
    360 
    361 avl3.o: avltree/avl3.c
    362 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl3.o -MD -MP -MF $(DEPDIR)/avl3.Tpo -c -o avl3.o `test -f 'avltree/avl3.c' || echo '$(srcdir)/'`avltree/avl3.c
    363 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl3.Tpo $(DEPDIR)/avl3.Po
    364 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl3.c' object='avl3.o' libtool=no @AMDEPBACKSLASH@
    365 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    366 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl3.o `test -f 'avltree/avl3.c' || echo '$(srcdir)/'`avltree/avl3.c
    367 
    368 avl3.obj: avltree/avl3.c
    369 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl3.obj -MD -MP -MF $(DEPDIR)/avl3.Tpo -c -o avl3.obj `if test -f 'avltree/avl3.c'; then $(CYGPATH_W) 'avltree/avl3.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl3.c'; fi`
    370 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl3.Tpo $(DEPDIR)/avl3.Po
    371 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl3.c' object='avl3.obj' libtool=no @AMDEPBACKSLASH@
    372 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    373 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl3.obj `if test -f 'avltree/avl3.c'; then $(CYGPATH_W) 'avltree/avl3.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl3.c'; fi`
    374 
    375 avl4.o: avltree/avl4.c
    376 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl4.o -MD -MP -MF $(DEPDIR)/avl4.Tpo -c -o avl4.o `test -f 'avltree/avl4.c' || echo '$(srcdir)/'`avltree/avl4.c
    377 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl4.Tpo $(DEPDIR)/avl4.Po
    378 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl4.c' object='avl4.o' libtool=no @AMDEPBACKSLASH@
    379 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    380 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl4.o `test -f 'avltree/avl4.c' || echo '$(srcdir)/'`avltree/avl4.c
    381 
    382 avl4.obj: avltree/avl4.c
    383 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl4.obj -MD -MP -MF $(DEPDIR)/avl4.Tpo -c -o avl4.obj `if test -f 'avltree/avl4.c'; then $(CYGPATH_W) 'avltree/avl4.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl4.c'; fi`
    384 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl4.Tpo $(DEPDIR)/avl4.Po
    385 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl4.c' object='avl4.obj' libtool=no @AMDEPBACKSLASH@
    386 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    387 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl4.obj `if test -f 'avltree/avl4.c'; then $(CYGPATH_W) 'avltree/avl4.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl4.c'; fi`
    388 
    389 avl-private.o: avltree/avl-private.c
    390 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl-private.o -MD -MP -MF $(DEPDIR)/avl-private.Tpo -c -o avl-private.o `test -f 'avltree/avl-private.c' || echo '$(srcdir)/'`avltree/avl-private.c
    391 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl-private.Tpo $(DEPDIR)/avl-private.Po
    392 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl-private.c' object='avl-private.o' libtool=no @AMDEPBACKSLASH@
    393 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    394 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl-private.o `test -f 'avltree/avl-private.c' || echo '$(srcdir)/'`avltree/avl-private.c
    395 
    396 avl-private.obj: avltree/avl-private.c
    397 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT avl-private.obj -MD -MP -MF $(DEPDIR)/avl-private.Tpo -c -o avl-private.obj `if test -f 'avltree/avl-private.c'; then $(CYGPATH_W) 'avltree/avl-private.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl-private.c'; fi`
    398 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/avl-private.Tpo $(DEPDIR)/avl-private.Po
    399 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl-private.c' object='avl-private.obj' libtool=no @AMDEPBACKSLASH@
    400 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    401 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o avl-private.obj `if test -f 'avltree/avl-private.c'; then $(CYGPATH_W) 'avltree/avl-private.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl-private.c'; fi`
    402 
    403 vector_int.o: vector/vector_int.c
    404 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_int.o -MD -MP -MF $(DEPDIR)/vector_int.Tpo -c -o vector_int.o `test -f 'vector/vector_int.c' || echo '$(srcdir)/'`vector/vector_int.c
    405 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/vector_int.Tpo $(DEPDIR)/vector_int.Po
    406 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='vector/vector_int.c' object='vector_int.o' libtool=no @AMDEPBACKSLASH@
    407 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    408 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_int.o `test -f 'vector/vector_int.c' || echo '$(srcdir)/'`vector/vector_int.c
    409 
    410 vector_int.obj: vector/vector_int.c
    411 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_int.obj -MD -MP -MF $(DEPDIR)/vector_int.Tpo -c -o vector_int.obj `if test -f 'vector/vector_int.c'; then $(CYGPATH_W) 'vector/vector_int.c'; else $(CYGPATH_W) '$(srcdir)/vector/vector_int.c'; fi`
    412 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/vector_int.Tpo $(DEPDIR)/vector_int.Po
    413 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='vector/vector_int.c' object='vector_int.obj' libtool=no @AMDEPBACKSLASH@
    414 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    415 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_int.obj `if test -f 'vector/vector_int.c'; then $(CYGPATH_W) 'vector/vector_int.c'; else $(CYGPATH_W) '$(srcdir)/vector/vector_int.c'; fi`
    416 
    417 array.o: vector/array.c
    418 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT array.o -MD -MP -MF $(DEPDIR)/array.Tpo -c -o array.o `test -f 'vector/array.c' || echo '$(srcdir)/'`vector/array.c
    419 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/array.Tpo $(DEPDIR)/array.Po
    420 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='vector/array.c' object='array.o' libtool=no @AMDEPBACKSLASH@
    421 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    422 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o array.o `test -f 'vector/array.c' || echo '$(srcdir)/'`vector/array.c
    423 
    424 array.obj: vector/array.c
    425 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT array.obj -MD -MP -MF $(DEPDIR)/array.Tpo -c -o array.obj `if test -f 'vector/array.c'; then $(CYGPATH_W) 'vector/array.c'; else $(CYGPATH_W) '$(srcdir)/vector/array.c'; fi`
    426 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/array.Tpo $(DEPDIR)/array.Po
    427 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='vector/array.c' object='array.obj' libtool=no @AMDEPBACKSLASH@
    428 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    429 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o array.obj `if test -f 'vector/array.c'; then $(CYGPATH_W) 'vector/array.c'; else $(CYGPATH_W) '$(srcdir)/vector/array.c'; fi`
    430 
    431 vector_test.o: vector/vector_test.c
    432 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_test.o -MD -MP -MF $(DEPDIR)/vector_test.Tpo -c -o vector_test.o `test -f 'vector/vector_test.c' || echo '$(srcdir)/'`vector/vector_test.c
    433 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/vector_test.Tpo $(DEPDIR)/vector_test.Po
    434 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='vector/vector_test.c' object='vector_test.o' libtool=no @AMDEPBACKSLASH@
    435 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    436 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_test.o `test -f 'vector/vector_test.c' || echo '$(srcdir)/'`vector/vector_test.c
    437 
    438 vector_test.obj: vector/vector_test.c
    439 @am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT vector_test.obj -MD -MP -MF $(DEPDIR)/vector_test.Tpo -c -o vector_test.obj `if test -f 'vector/vector_test.c'; then $(CYGPATH_W) 'vector/vector_test.c'; else $(CYGPATH_W) '$(srcdir)/vector/vector_test.c'; fi`
    440 @am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/vector_test.Tpo $(DEPDIR)/vector_test.Po
    441 @AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='vector/vector_test.c' object='vector_test.obj' libtool=no @AMDEPBACKSLASH@
    442 @AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    443 @am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o vector_test.obj `if test -f 'vector/vector_test.c'; then $(CYGPATH_W) 'vector/vector_test.c'; else $(CYGPATH_W) '$(srcdir)/vector/vector_test.c'; fi`
    444 
    445 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
    446         list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
    447         unique=`for i in $$list; do \
    448             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    449           done | \
    450           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    451               END { if (nonempty) { for (i in files) print i; }; }'`; \
    452         mkid -fID $$unique
    453 tags: TAGS
    454 
    455 TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
    456                 $(TAGS_FILES) $(LISP)
     448@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
     449
     450avltree/avl_test-avl_test.o: avltree/avl_test.c
     451@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -MT avltree/avl_test-avl_test.o -MD -MP -MF avltree/$(DEPDIR)/avl_test-avl_test.Tpo -c -o avltree/avl_test-avl_test.o `test -f 'avltree/avl_test.c' || echo '$(srcdir)/'`avltree/avl_test.c
     452@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) avltree/$(DEPDIR)/avl_test-avl_test.Tpo avltree/$(DEPDIR)/avl_test-avl_test.Po
     453@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl_test.c' object='avltree/avl_test-avl_test.o' libtool=no @AMDEPBACKSLASH@
     454@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     455@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -c -o avltree/avl_test-avl_test.o `test -f 'avltree/avl_test.c' || echo '$(srcdir)/'`avltree/avl_test.c
     456
     457avltree/avl_test-avl_test.obj: avltree/avl_test.c
     458@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -MT avltree/avl_test-avl_test.obj -MD -MP -MF avltree/$(DEPDIR)/avl_test-avl_test.Tpo -c -o avltree/avl_test-avl_test.obj `if test -f 'avltree/avl_test.c'; then $(CYGPATH_W) 'avltree/avl_test.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl_test.c'; fi`
     459@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) avltree/$(DEPDIR)/avl_test-avl_test.Tpo avltree/$(DEPDIR)/avl_test-avl_test.Po
     460@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl_test.c' object='avltree/avl_test-avl_test.obj' libtool=no @AMDEPBACKSLASH@
     461@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     462@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -c -o avltree/avl_test-avl_test.obj `if test -f 'avltree/avl_test.c'; then $(CYGPATH_W) 'avltree/avl_test.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl_test.c'; fi`
     463
     464avltree/avl_test-avl0.o: avltree/avl0.c
     465@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -MT avltree/avl_test-avl0.o -MD -MP -MF avltree/$(DEPDIR)/avl_test-avl0.Tpo -c -o avltree/avl_test-avl0.o `test -f 'avltree/avl0.c' || echo '$(srcdir)/'`avltree/avl0.c
     466@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) avltree/$(DEPDIR)/avl_test-avl0.Tpo avltree/$(DEPDIR)/avl_test-avl0.Po
     467@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl0.c' object='avltree/avl_test-avl0.o' libtool=no @AMDEPBACKSLASH@
     468@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     469@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -c -o avltree/avl_test-avl0.o `test -f 'avltree/avl0.c' || echo '$(srcdir)/'`avltree/avl0.c
     470
     471avltree/avl_test-avl0.obj: avltree/avl0.c
     472@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -MT avltree/avl_test-avl0.obj -MD -MP -MF avltree/$(DEPDIR)/avl_test-avl0.Tpo -c -o avltree/avl_test-avl0.obj `if test -f 'avltree/avl0.c'; then $(CYGPATH_W) 'avltree/avl0.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl0.c'; fi`
     473@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) avltree/$(DEPDIR)/avl_test-avl0.Tpo avltree/$(DEPDIR)/avl_test-avl0.Po
     474@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl0.c' object='avltree/avl_test-avl0.obj' libtool=no @AMDEPBACKSLASH@
     475@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     476@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -c -o avltree/avl_test-avl0.obj `if test -f 'avltree/avl0.c'; then $(CYGPATH_W) 'avltree/avl0.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl0.c'; fi`
     477
     478avltree/avl_test-avl1.o: avltree/avl1.c
     479@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -MT avltree/avl_test-avl1.o -MD -MP -MF avltree/$(DEPDIR)/avl_test-avl1.Tpo -c -o avltree/avl_test-avl1.o `test -f 'avltree/avl1.c' || echo '$(srcdir)/'`avltree/avl1.c
     480@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) avltree/$(DEPDIR)/avl_test-avl1.Tpo avltree/$(DEPDIR)/avl_test-avl1.Po
     481@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl1.c' object='avltree/avl_test-avl1.o' libtool=no @AMDEPBACKSLASH@
     482@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     483@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -c -o avltree/avl_test-avl1.o `test -f 'avltree/avl1.c' || echo '$(srcdir)/'`avltree/avl1.c
     484
     485avltree/avl_test-avl1.obj: avltree/avl1.c
     486@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -MT avltree/avl_test-avl1.obj -MD -MP -MF avltree/$(DEPDIR)/avl_test-avl1.Tpo -c -o avltree/avl_test-avl1.obj `if test -f 'avltree/avl1.c'; then $(CYGPATH_W) 'avltree/avl1.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl1.c'; fi`
     487@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) avltree/$(DEPDIR)/avl_test-avl1.Tpo avltree/$(DEPDIR)/avl_test-avl1.Po
     488@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl1.c' object='avltree/avl_test-avl1.obj' libtool=no @AMDEPBACKSLASH@
     489@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     490@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -c -o avltree/avl_test-avl1.obj `if test -f 'avltree/avl1.c'; then $(CYGPATH_W) 'avltree/avl1.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl1.c'; fi`
     491
     492avltree/avl_test-avl2.o: avltree/avl2.c
     493@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -MT avltree/avl_test-avl2.o -MD -MP -MF avltree/$(DEPDIR)/avl_test-avl2.Tpo -c -o avltree/avl_test-avl2.o `test -f 'avltree/avl2.c' || echo '$(srcdir)/'`avltree/avl2.c
     494@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) avltree/$(DEPDIR)/avl_test-avl2.Tpo avltree/$(DEPDIR)/avl_test-avl2.Po
     495@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl2.c' object='avltree/avl_test-avl2.o' libtool=no @AMDEPBACKSLASH@
     496@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     497@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -c -o avltree/avl_test-avl2.o `test -f 'avltree/avl2.c' || echo '$(srcdir)/'`avltree/avl2.c
     498
     499avltree/avl_test-avl2.obj: avltree/avl2.c
     500@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -MT avltree/avl_test-avl2.obj -MD -MP -MF avltree/$(DEPDIR)/avl_test-avl2.Tpo -c -o avltree/avl_test-avl2.obj `if test -f 'avltree/avl2.c'; then $(CYGPATH_W) 'avltree/avl2.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl2.c'; fi`
     501@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) avltree/$(DEPDIR)/avl_test-avl2.Tpo avltree/$(DEPDIR)/avl_test-avl2.Po
     502@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl2.c' object='avltree/avl_test-avl2.obj' libtool=no @AMDEPBACKSLASH@
     503@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     504@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -c -o avltree/avl_test-avl2.obj `if test -f 'avltree/avl2.c'; then $(CYGPATH_W) 'avltree/avl2.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl2.c'; fi`
     505
     506avltree/avl_test-avl3.o: avltree/avl3.c
     507@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -MT avltree/avl_test-avl3.o -MD -MP -MF avltree/$(DEPDIR)/avl_test-avl3.Tpo -c -o avltree/avl_test-avl3.o `test -f 'avltree/avl3.c' || echo '$(srcdir)/'`avltree/avl3.c
     508@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) avltree/$(DEPDIR)/avl_test-avl3.Tpo avltree/$(DEPDIR)/avl_test-avl3.Po
     509@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl3.c' object='avltree/avl_test-avl3.o' libtool=no @AMDEPBACKSLASH@
     510@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     511@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -c -o avltree/avl_test-avl3.o `test -f 'avltree/avl3.c' || echo '$(srcdir)/'`avltree/avl3.c
     512
     513avltree/avl_test-avl3.obj: avltree/avl3.c
     514@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -MT avltree/avl_test-avl3.obj -MD -MP -MF avltree/$(DEPDIR)/avl_test-avl3.Tpo -c -o avltree/avl_test-avl3.obj `if test -f 'avltree/avl3.c'; then $(CYGPATH_W) 'avltree/avl3.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl3.c'; fi`
     515@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) avltree/$(DEPDIR)/avl_test-avl3.Tpo avltree/$(DEPDIR)/avl_test-avl3.Po
     516@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl3.c' object='avltree/avl_test-avl3.obj' libtool=no @AMDEPBACKSLASH@
     517@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     518@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -c -o avltree/avl_test-avl3.obj `if test -f 'avltree/avl3.c'; then $(CYGPATH_W) 'avltree/avl3.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl3.c'; fi`
     519
     520avltree/avl_test-avl4.o: avltree/avl4.c
     521@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -MT avltree/avl_test-avl4.o -MD -MP -MF avltree/$(DEPDIR)/avl_test-avl4.Tpo -c -o avltree/avl_test-avl4.o `test -f 'avltree/avl4.c' || echo '$(srcdir)/'`avltree/avl4.c
     522@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) avltree/$(DEPDIR)/avl_test-avl4.Tpo avltree/$(DEPDIR)/avl_test-avl4.Po
     523@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl4.c' object='avltree/avl_test-avl4.o' libtool=no @AMDEPBACKSLASH@
     524@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     525@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -c -o avltree/avl_test-avl4.o `test -f 'avltree/avl4.c' || echo '$(srcdir)/'`avltree/avl4.c
     526
     527avltree/avl_test-avl4.obj: avltree/avl4.c
     528@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -MT avltree/avl_test-avl4.obj -MD -MP -MF avltree/$(DEPDIR)/avl_test-avl4.Tpo -c -o avltree/avl_test-avl4.obj `if test -f 'avltree/avl4.c'; then $(CYGPATH_W) 'avltree/avl4.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl4.c'; fi`
     529@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) avltree/$(DEPDIR)/avl_test-avl4.Tpo avltree/$(DEPDIR)/avl_test-avl4.Po
     530@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl4.c' object='avltree/avl_test-avl4.obj' libtool=no @AMDEPBACKSLASH@
     531@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     532@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -c -o avltree/avl_test-avl4.obj `if test -f 'avltree/avl4.c'; then $(CYGPATH_W) 'avltree/avl4.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl4.c'; fi`
     533
     534avltree/avl_test-avl-private.o: avltree/avl-private.c
     535@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -MT avltree/avl_test-avl-private.o -MD -MP -MF avltree/$(DEPDIR)/avl_test-avl-private.Tpo -c -o avltree/avl_test-avl-private.o `test -f 'avltree/avl-private.c' || echo '$(srcdir)/'`avltree/avl-private.c
     536@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) avltree/$(DEPDIR)/avl_test-avl-private.Tpo avltree/$(DEPDIR)/avl_test-avl-private.Po
     537@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl-private.c' object='avltree/avl_test-avl-private.o' libtool=no @AMDEPBACKSLASH@
     538@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     539@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -c -o avltree/avl_test-avl-private.o `test -f 'avltree/avl-private.c' || echo '$(srcdir)/'`avltree/avl-private.c
     540
     541avltree/avl_test-avl-private.obj: avltree/avl-private.c
     542@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -MT avltree/avl_test-avl-private.obj -MD -MP -MF avltree/$(DEPDIR)/avl_test-avl-private.Tpo -c -o avltree/avl_test-avl-private.obj `if test -f 'avltree/avl-private.c'; then $(CYGPATH_W) 'avltree/avl-private.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl-private.c'; fi`
     543@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) avltree/$(DEPDIR)/avl_test-avl-private.Tpo avltree/$(DEPDIR)/avl_test-avl-private.Po
     544@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='avltree/avl-private.c' object='avltree/avl_test-avl-private.obj' libtool=no @AMDEPBACKSLASH@
     545@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     546@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(avl_test_CFLAGS) $(CFLAGS) -c -o avltree/avl_test-avl-private.obj `if test -f 'avltree/avl-private.c'; then $(CYGPATH_W) 'avltree/avl-private.c'; else $(CYGPATH_W) '$(srcdir)/avltree/avl-private.c'; fi`
     547
     548fstream_test-fstream_test.o: fstream_test.c
     549@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fstream_test_CFLAGS) $(CFLAGS) -MT fstream_test-fstream_test.o -MD -MP -MF $(DEPDIR)/fstream_test-fstream_test.Tpo -c -o fstream_test-fstream_test.o `test -f 'fstream_test.c' || echo '$(srcdir)/'`fstream_test.c
     550@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/fstream_test-fstream_test.Tpo $(DEPDIR)/fstream_test-fstream_test.Po
     551@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='fstream_test.c' object='fstream_test-fstream_test.o' libtool=no @AMDEPBACKSLASH@
     552@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     553@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fstream_test_CFLAGS) $(CFLAGS) -c -o fstream_test-fstream_test.o `test -f 'fstream_test.c' || echo '$(srcdir)/'`fstream_test.c
     554
     555fstream_test-fstream_test.obj: fstream_test.c
     556@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fstream_test_CFLAGS) $(CFLAGS) -MT fstream_test-fstream_test.obj -MD -MP -MF $(DEPDIR)/fstream_test-fstream_test.Tpo -c -o fstream_test-fstream_test.obj `if test -f 'fstream_test.c'; then $(CYGPATH_W) 'fstream_test.c'; else $(CYGPATH_W) '$(srcdir)/fstream_test.c'; fi`
     557@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) $(DEPDIR)/fstream_test-fstream_test.Tpo $(DEPDIR)/fstream_test-fstream_test.Po
     558@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='fstream_test.c' object='fstream_test-fstream_test.obj' libtool=no @AMDEPBACKSLASH@
     559@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     560@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(fstream_test_CFLAGS) $(CFLAGS) -c -o fstream_test-fstream_test.obj `if test -f 'fstream_test.c'; then $(CYGPATH_W) 'fstream_test.c'; else $(CYGPATH_W) '$(srcdir)/fstream_test.c'; fi`
     561
     562vector/vector_test-vector_int.o: vector/vector_int.c
     563@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vector_test_CFLAGS) $(CFLAGS) -MT vector/vector_test-vector_int.o -MD -MP -MF vector/$(DEPDIR)/vector_test-vector_int.Tpo -c -o vector/vector_test-vector_int.o `test -f 'vector/vector_int.c' || echo '$(srcdir)/'`vector/vector_int.c
     564@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) vector/$(DEPDIR)/vector_test-vector_int.Tpo vector/$(DEPDIR)/vector_test-vector_int.Po
     565@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='vector/vector_int.c' object='vector/vector_test-vector_int.o' libtool=no @AMDEPBACKSLASH@
     566@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     567@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vector_test_CFLAGS) $(CFLAGS) -c -o vector/vector_test-vector_int.o `test -f 'vector/vector_int.c' || echo '$(srcdir)/'`vector/vector_int.c
     568
     569vector/vector_test-vector_int.obj: vector/vector_int.c
     570@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vector_test_CFLAGS) $(CFLAGS) -MT vector/vector_test-vector_int.obj -MD -MP -MF vector/$(DEPDIR)/vector_test-vector_int.Tpo -c -o vector/vector_test-vector_int.obj `if test -f 'vector/vector_int.c'; then $(CYGPATH_W) 'vector/vector_int.c'; else $(CYGPATH_W) '$(srcdir)/vector/vector_int.c'; fi`
     571@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) vector/$(DEPDIR)/vector_test-vector_int.Tpo vector/$(DEPDIR)/vector_test-vector_int.Po
     572@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='vector/vector_int.c' object='vector/vector_test-vector_int.obj' libtool=no @AMDEPBACKSLASH@
     573@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     574@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vector_test_CFLAGS) $(CFLAGS) -c -o vector/vector_test-vector_int.obj `if test -f 'vector/vector_int.c'; then $(CYGPATH_W) 'vector/vector_int.c'; else $(CYGPATH_W) '$(srcdir)/vector/vector_int.c'; fi`
     575
     576vector/vector_test-array.o: vector/array.c
     577@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vector_test_CFLAGS) $(CFLAGS) -MT vector/vector_test-array.o -MD -MP -MF vector/$(DEPDIR)/vector_test-array.Tpo -c -o vector/vector_test-array.o `test -f 'vector/array.c' || echo '$(srcdir)/'`vector/array.c
     578@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) vector/$(DEPDIR)/vector_test-array.Tpo vector/$(DEPDIR)/vector_test-array.Po
     579@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='vector/array.c' object='vector/vector_test-array.o' libtool=no @AMDEPBACKSLASH@
     580@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     581@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vector_test_CFLAGS) $(CFLAGS) -c -o vector/vector_test-array.o `test -f 'vector/array.c' || echo '$(srcdir)/'`vector/array.c
     582
     583vector/vector_test-array.obj: vector/array.c
     584@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vector_test_CFLAGS) $(CFLAGS) -MT vector/vector_test-array.obj -MD -MP -MF vector/$(DEPDIR)/vector_test-array.Tpo -c -o vector/vector_test-array.obj `if test -f 'vector/array.c'; then $(CYGPATH_W) 'vector/array.c'; else $(CYGPATH_W) '$(srcdir)/vector/array.c'; fi`
     585@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) vector/$(DEPDIR)/vector_test-array.Tpo vector/$(DEPDIR)/vector_test-array.Po
     586@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='vector/array.c' object='vector/vector_test-array.obj' libtool=no @AMDEPBACKSLASH@
     587@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     588@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vector_test_CFLAGS) $(CFLAGS) -c -o vector/vector_test-array.obj `if test -f 'vector/array.c'; then $(CYGPATH_W) 'vector/array.c'; else $(CYGPATH_W) '$(srcdir)/vector/array.c'; fi`
     589
     590vector/vector_test-vector_test.o: vector/vector_test.c
     591@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vector_test_CFLAGS) $(CFLAGS) -MT vector/vector_test-vector_test.o -MD -MP -MF vector/$(DEPDIR)/vector_test-vector_test.Tpo -c -o vector/vector_test-vector_test.o `test -f 'vector/vector_test.c' || echo '$(srcdir)/'`vector/vector_test.c
     592@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) vector/$(DEPDIR)/vector_test-vector_test.Tpo vector/$(DEPDIR)/vector_test-vector_test.Po
     593@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='vector/vector_test.c' object='vector/vector_test-vector_test.o' libtool=no @AMDEPBACKSLASH@
     594@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     595@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vector_test_CFLAGS) $(CFLAGS) -c -o vector/vector_test-vector_test.o `test -f 'vector/vector_test.c' || echo '$(srcdir)/'`vector/vector_test.c
     596
     597vector/vector_test-vector_test.obj: vector/vector_test.c
     598@am__fastdepCC_TRUE@    $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vector_test_CFLAGS) $(CFLAGS) -MT vector/vector_test-vector_test.obj -MD -MP -MF vector/$(DEPDIR)/vector_test-vector_test.Tpo -c -o vector/vector_test-vector_test.obj `if test -f 'vector/vector_test.c'; then $(CYGPATH_W) 'vector/vector_test.c'; else $(CYGPATH_W) '$(srcdir)/vector/vector_test.c'; fi`
     599@am__fastdepCC_TRUE@    $(AM_V_at)$(am__mv) vector/$(DEPDIR)/vector_test-vector_test.Tpo vector/$(DEPDIR)/vector_test-vector_test.Po
     600@AMDEP_TRUE@@am__fastdepCC_FALSE@       $(AM_V_CC)source='vector/vector_test.c' object='vector/vector_test-vector_test.obj' libtool=no @AMDEPBACKSLASH@
     601@AMDEP_TRUE@@am__fastdepCC_FALSE@       DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     602@am__fastdepCC_FALSE@   $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(vector_test_CFLAGS) $(CFLAGS) -c -o vector/vector_test-vector_test.obj `if test -f 'vector/vector_test.c'; then $(CYGPATH_W) 'vector/vector_test.c'; else $(CYGPATH_W) '$(srcdir)/vector/vector_test.c'; fi`
     603
     604ID: $(am__tagged_files)
     605        $(am__define_uniq_tagged_files); mkid -fID $$unique
     606tags: tags-am
     607TAGS: tags
     608
     609tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
    457610        set x; \
    458611        here=`pwd`; \
    459         list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
    460         unique=`for i in $$list; do \
    461             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    462           done | \
    463           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    464               END { if (nonempty) { for (i in files) print i; }; }'`; \
     612        $(am__define_uniq_tagged_files); \
    465613        shift; \
    466614        if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
     
    474622          fi; \
    475623        fi
    476 ctags: CTAGS
    477 CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
    478                 $(TAGS_FILES) $(LISP)
    479         list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
    480         unique=`for i in $$list; do \
    481             if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
    482           done | \
    483           $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
    484               END { if (nonempty) { for (i in files) print i; }; }'`; \
     624ctags: ctags-am
     625
     626CTAGS: ctags
     627ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
     628        $(am__define_uniq_tagged_files); \
    485629        test -z "$(CTAGS_ARGS)$$unique" \
    486630          || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
     
    491635          && $(am__cd) $(top_srcdir) \
    492636          && gtags -i $(GTAGS_ARGS) "$$here"
     637cscopelist: cscopelist-am
     638
     639cscopelist-am: $(am__tagged_files)
     640        list='$(am__tagged_files)'; \
     641        case "$(srcdir)" in \
     642          [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
     643          *) sdir=$(subdir)/$(srcdir) ;; \
     644        esac; \
     645        for i in $$list; do \
     646          if test -f "$$i"; then \
     647            echo "$(subdir)/$$i"; \
     648          else \
     649            echo "$$sdir/$$i"; \
     650          fi; \
     651        done >> $(top_builddir)/cscope.files
    493652
    494653distclean-tags:
     
    555714        -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
    556715        -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
     716        -rm -f avltree/$(DEPDIR)/$(am__dirstamp)
     717        -rm -f avltree/$(am__dirstamp)
     718        -rm -f vector/$(DEPDIR)/$(am__dirstamp)
     719        -rm -f vector/$(am__dirstamp)
    557720
    558721maintainer-clean-generic:
     
    564727
    565728distclean: distclean-am
    566         -rm -rf ./$(DEPDIR)
     729        -rm -rf ./$(DEPDIR) avltree/$(DEPDIR) vector/$(DEPDIR)
    567730        -rm -f Makefile
    568731distclean-am: clean-am distclean-compile distclean-generic \
     
    610773
    611774maintainer-clean: maintainer-clean-am
    612         -rm -rf ./$(DEPDIR)
     775        -rm -rf ./$(DEPDIR) avltree/$(DEPDIR) vector/$(DEPDIR)
    613776        -rm -f Makefile
    614777maintainer-clean-am: distclean-am maintainer-clean-generic
     
    630793.MAKE: install-am install-strip
    631794
    632 .PHONY: CTAGS GTAGS all all-am all-local check check-am clean \
    633         clean-generic clean-local ctags distclean distclean-compile \
    634         distclean-generic distclean-tags distdir dvi dvi-am html \
    635         html-am info info-am install install-am install-data \
    636         install-data-am install-dvi install-dvi-am install-exec \
    637         install-exec-am install-html install-html-am install-info \
    638         install-info-am install-man install-pdf install-pdf-am \
    639         install-ps install-ps-am install-strip installcheck \
    640         installcheck-am installdirs maintainer-clean \
    641         maintainer-clean-generic mostlyclean mostlyclean-compile \
    642         mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \
    643         uninstall-am
     795.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \
     796        clean-generic clean-local cscopelist-am ctags ctags-am \
     797        distclean distclean-compile distclean-generic distclean-tags \
     798        distdir dvi dvi-am html html-am info info-am install \
     799        install-am install-data install-data-am install-dvi \
     800        install-dvi-am install-exec install-exec-am install-html \
     801        install-html-am install-info install-info-am install-man \
     802        install-pdf install-pdf-am install-ps install-ps-am \
     803        install-strip installcheck installcheck-am installdirs \
     804        maintainer-clean maintainer-clean-generic mostlyclean \
     805        mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
     806        tags tags-am uninstall uninstall-am
     807
     808.PRECIOUS: Makefile
    644809
    645810
     
    665830
    666831% : %.c @CFA_BINDIR@/@CFA_NAME@
    667         ${CC} ${CFLAGS} ${<} -o ${@}
     832        ${CC} ${AM_CFLAGS} ${CFLAGS} ${<} -o ${@}
    668833
    669834dtor-early-exit-ERR1: dtor-early-exit.c @CFA_BINDIR@/@CFA_NAME@
    670         ${CC} ${CFLAGS} -DERR1 ${<} -o ${@}
     835        ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@}
    671836
    672837dtor-early-exit-ERR2: dtor-early-exit.c @CFA_BINDIR@/@CFA_NAME@
    673         ${CC} ${CFLAGS} -DERR2 ${<} -o ${@}
     838        ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR2 ${<} -o ${@}
    674839
    675840declarationSpecifier: declarationSpecifier.c @CFA_BINDIR@/@CFA_NAME@
    676         ${CC} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
     841        ${CC} ${AM_CFLAGS} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
    677842
    678843gccExtensions : gccExtensions.c @CFA_BINDIR@/@CFA_NAME@
    679         ${CC} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
     844        ${CC} ${AM_CFLAGS} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
    680845
    681846extension : extension.c @CFA_BINDIR@/@CFA_NAME@
    682         ${CC} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
     847        ${CC} ${AM_CFLAGS} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
    683848
    684849attributes : attributes.c @CFA_BINDIR@/@CFA_NAME@
    685         ${CC} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
     850        ${CC} ${AM_CFLAGS} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
    686851
    687852KRfunctions : KRfunctions.c @CFA_BINDIR@/@CFA_NAME@
    688         ${CC} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
     853        ${CC} ${AM_CFLAGS} ${CFLAGS} -CFA -XCFA -p -XCFA -L ${<} -o ${@}
    689854
    690855gmp : gmp.c @CFA_BINDIR@/@CFA_NAME@
    691         ${CC} ${CFLAGS} -lgmp ${<} -o ${@}
     856        ${CC} ${AM_CFLAGS} ${CFLAGS} -lgmp ${<} -o ${@}
    692857
    693858memberCtors-ERR1: memberCtors.c @CFA_BINDIR@/@CFA_NAME@
    694         ${CC} ${CFLAGS} -DERR1 ${<} -o ${@}
     859        ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@}
    695860
    696861completeTypeError : completeTypeError.c @CFA_BINDIR@/@CFA_NAME@
    697         ${CC} ${CFLAGS} -DERR1 ${<} -o ${@}
     862        ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@}
    698863
    699864# Tell versions [3.59,3.63) of GNU make to not export all variables.
  • src/tests/gmp.c

    rfea3faa rb826e6b  
    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/io.c

    rfea3faa rb826e6b  
    1010// Created On       : Wed Mar  2 16:56:02 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jun  8 09:52:10 2017
    13 // Update Count     : 51
     12// Last Modified On : Thu Jul  6 23:26:12 2017
     13// Update Count     : 78
    1414//
    1515
     
    4242        sout | endl;
    4343
     44        sout | "opening delimiters" | endl;
    4445        sout
    45                 // opening delimiters
    4646                | "x (" | 1
    4747                | "x [" | 2
     
    5454                | "x ¿" | 9
    5555                | "x «" | 10
    56                 | endl;
     56                | endl | endl;
     57
     58        sout | "closing delimiters" | endl;
    5759        sout
    58                 // closing delimiters
    5960                | 1 | ", x"
    6061                | 2 | ". x"
     
    6869                | 10 | "] x"
    6970                | 11 | "} x"
    70                 | endl;
     71                | endl | endl;
     72
     73        sout | "opening/closing delimiters" | endl;
    7174        sout
    72                 // opening-closing delimiters
    7375                | "x`" | 1 | "`x'" | 2
    7476                | "'x\"" | 3 | "\"x:" | 4
     
    7678                | "\tx\f" | 7 | "\fx\v" | 8
    7779                | "\vx\n" | 9 | "\nx\r" | 10
    78                 | "\rx" |
    79                 endl;
     80                | "\rx"
     81                | endl | endl;
     82
     83        sout | "override opening/closing delimiters" | endl;
    8084        sout | "x ( " | 1 | " ) x" | 2 | " , x" | 3 | " :x: " | 4 | endl;
     85        sout | endl;
    8186
    8287        ifstream in;                                                                            // create / open file
    8388        open( &in, "io.data", "r" );
    8489
     90        sout | "input bacis types" | endl;
    8591        &in | &c                                                                                        // character
    8692                | &si | &usi | &i | &ui | &li | &uli | &lli | &ulli     // integral
     
    8894                | &fc | &dc | &ldc                                                              // floating-point complex
    8995                | cstr( s1 ) | cstr( s2, size );                                // C string, length unchecked and checked
     96        sout | endl;
    9097
     98        sout | "output basic types" | endl;
    9199        sout | c | ' ' | endl                                                           // character
    92100                | si | usi | i | ui | li | uli | lli | ulli | endl // integral
     
    94102                | fc | dc | ldc | endl;                                                 // complex
    95103        sout | endl;
    96         sout | f | "" | d | "" | ld | endl                                      // floating point without separator
    97                 | sepDisable | fc | dc | ldc | sepEnable | endl // complex without separator
    98                 | sepOn | s1 | sepOff | s2 | endl                               // local separator removal
    99                 | s1 | "" | s2 | endl;                                                  // C string without separator
     104
     105        sout | "tuples" | endl;
     106        [int, [ int, int ] ] t1 = [ 1, [ 2, 3 ] ], t2 = [ 4, [ 5, 6 ] ];
     107        sout | t1 | t2 | endl;                                                          // print tuple
    100108        sout | endl;
    101109
     110        sout | "toggle separator" | endl;
     111        sout | f | "" | d | "" | ld | endl                                      // floating point without separator
     112                | sepDisable | fc | dc | ldc | endl                             // complex without separator
     113                | fc | sepOn | dc | ldc | endl                                  // local separator add
     114                | sepEnable | fc | dc | ldc | endl                              // complex with separator
     115                | fc | sepOff | dc | ldc | endl                                 // local separator removal
     116                | s1 | sepOff | s2 | endl                                               // local separator removal
     117                | s1 | "" | s2 | endl;                                                  // local separator removal
     118        sout | endl;
     119
     120        sout | "change separator" | endl;
     121        sout | "from \"" | sep | "\"";
    102122        sepSet( sout, ", $" );                                                          // change separator, maximum of 15 characters
     123        sout | " to \"" | sep | "\"" | endl;
    103124        sout | f | d | ld | endl
    104125                | fc | dc | ldc | endl
    105                 | s1 | s2 | endl;
     126                | s1 | s2 | endl
     127                | t1 | t2 | endl;                                                               // print tuple
     128        sout | endl;
     129        sout | "from \"" | sep | "\" ";
     130        sepSet( sout, " " );                                                            // restore separator
     131        sout | "to \"" | sep | "\"" | endl;
     132        sout | f | d | ld | endl
     133                | fc | dc | ldc | endl
     134                | s1 | s2 | endl
     135                | t1 | t2 | endl;                                                               // print tuple
    106136        sout | endl;
    107137
    108         [int, int] t1 = [1, 2], t2 = [3, 4];
    109         sout | t1 | t2 | endl;                                                          // print tuple
     138        sout | "check sepOn/sepOff" | endl;
     139        sout | sepOn | 1 | 2 | 3 | sepOn | endl;                        // no separator at start/end of line
     140        sout | 1 | sepOff | 2 | 3 | endl;                                       // locally turn off implicit separator
     141        sout | sepOn | sepOn | 1 | 2 | 3 | sepOn | sepOff | sepOn | '\n'; // no separator at start/end of line
     142        sout | 1 | 2 | 3 | "\n\n" | sepOn;                                      // no separator at start of next line
     143        sout | 1 | 2 | 3 | endl;
     144        sout | endl;
    110145
    111         sepSet( sout, " " );
    112         sepSet( sout, ", $" );                                                          // set separator from " " to ", $"
    113         sout | 1 | 2 | 3 | " \"" | sepGet( sout ) | "\"" | endl;
    114         sepSet( sout, " " );                                                            // reset separator to " "
    115         sout | 1 | 2 | 3 | " \"" | sepGet( sout ) | "\"" | endl;
    116 
    117         sout | sepOn | 1 | 2 | 3 | sepOn | endl;                        // separator at start of line
    118         sout | 1 | sepOff | 2 | 3 | endl;                                       // locally turn off implicit separator
    119 
     146        sout | "check enable/disable" | endl;
    120147        sout | sepDisable | 1 | 2 | 3 | endl;                           // globally turn off implicit separation
    121148        sout | 1 | sepOn | 2 | 3 | endl;                                        // locally turn on implicit separator
    122         sout | sepEnable | 1 | 2 | 3 | endl;                            // globally turn on implicit separation
     149        sout | sepEnable | 1 | 2 | 3 | endl | sepDisable;       // globally turn on/off implicit separation
     150        sout | 1 | 2 | 3 | endl | sepEnable;                            // globally turn on implicit separation
     151        sout | 1 | 2 | 3 | sepOn | sepDisable | endl;           // ignore seperate at end of line
     152        sout | 1 | 2 | 3 | sepOn | sepEnable | endl;            // separator at end of line
     153        sout | 1 | 2 | 3 | endl;
     154        sout | endl;
     155
     156//      sout | fmt( d, "%8.3f" ) || endl;
     157//      sout | endl;
    123158
    124159        sepSetTuple( sout, " " );                                                       // set tuple separator from ", " to " "
    125         sout | t1 | t2 | " \"" | sepGetTuple( sout ) | "\"" | endl;
     160        sout | t1 | t2 | " \"" | sep | "\"" | endl;
    126161        sepSetTuple( sout, ", " );                                                      // reset tuple separator to ", "
    127         sout | t1 | t2 | " \"" | sepGetTuple( sout ) | "\"" | endl;
    128 
     162        sout | t1 | t2 | " \"" | sep | "\"" | endl;
    129163        sout | t1 | t2 | endl;                                                          // print tuple
     164        sout | endl;
    130165
    131166        [int, int, const char *, double] t3 = { 3, 4, "a", 7.2 };
  • src/tests/preempt_longrun/Makefile.am

    rfea3faa rb826e6b  
    1010## Author           : Thierry Delisle
    1111## Created On       : Fri Jun 16 10:57:34 2017
    12 ## Last Modified By : 
    13 ## Last Modified On : 
     12## Last Modified By :
     13## Last Modified On :
    1414## Update Count     : 0
    1515###############################################################################
    1616
    1717repeats=10
    18 max_time=10
    19 N=10ul
    20 preempt=10_000ul
     18max_time=600
     19preempt=1_000ul
    2120
    2221REPEAT = ${abs_top_srcdir}/tools/repeat -s
    2322
    24 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -DN=${N} -DPREEMPTION_RATE=${preempt}
     23BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -DPREEMPTION_RATE=${preempt}
    2524CFLAGS = ${BUILD_FLAGS}
    2625CC = @CFA_BINDIR@/@CFA_NAME@
    2726
    28 TESTS = barge block create disjoint processor stack wait yield
     27TESTS = barge block create disjoint enter enter3 processor stack wait yield
    2928
    3029.INTERMEDIATE: ${TESTS}
    3130
    3231all-local: ${TESTS:=.run}
     32
     33clean-local:
     34        rm -f ${TESTS}
    3335
    3436% : %.c ${CC}
  • src/tests/preempt_longrun/Makefile.in

    rfea3faa rb826e6b  
    1 # Makefile.in generated by automake 1.11.3 from Makefile.am.
     1# Makefile.in generated by automake 1.15 from Makefile.am.
    22# @configure_input@
    33
    4 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
    5 # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
    6 # Foundation, Inc.
     4# Copyright (C) 1994-2014 Free Software Foundation, Inc.
     5
    76# This Makefile.in is free software; the Free Software Foundation
    87# gives unlimited permission to copy and/or distribute it,
     
    1918###############################################################################
    2019VPATH = @srcdir@
     20am__is_gnu_make = { \
     21  if test -z '$(MAKELEVEL)'; then \
     22    false; \
     23  elif test -n '$(MAKE_HOST)'; then \
     24    true; \
     25  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
     26    true; \
     27  else \
     28    false; \
     29  fi; \
     30}
     31am__make_running_with_option = \
     32  case $${target_option-} in \
     33      ?) ;; \
     34      *) echo "am__make_running_with_option: internal error: invalid" \
     35              "target option '$${target_option-}' specified" >&2; \
     36         exit 1;; \
     37  esac; \
     38  has_opt=no; \
     39  sane_makeflags=$$MAKEFLAGS; \
     40  if $(am__is_gnu_make); then \
     41    sane_makeflags=$$MFLAGS; \
     42  else \
     43    case $$MAKEFLAGS in \
     44      *\\[\ \   ]*) \
     45        bs=\\; \
     46        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
     47          | sed "s/$$bs$$bs[$$bs $$bs   ]*//g"`;; \
     48    esac; \
     49  fi; \
     50  skip_next=no; \
     51  strip_trailopt () \
     52  { \
     53    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
     54  }; \
     55  for flg in $$sane_makeflags; do \
     56    test $$skip_next = yes && { skip_next=no; continue; }; \
     57    case $$flg in \
     58      *=*|--*) continue;; \
     59        -*I) strip_trailopt 'I'; skip_next=yes;; \
     60      -*I?*) strip_trailopt 'I';; \
     61        -*O) strip_trailopt 'O'; skip_next=yes;; \
     62      -*O?*) strip_trailopt 'O';; \
     63        -*l) strip_trailopt 'l'; skip_next=yes;; \
     64      -*l?*) strip_trailopt 'l';; \
     65      -[dEDm]) skip_next=yes;; \
     66      -[JT]) skip_next=yes;; \
     67    esac; \
     68    case $$flg in \
     69      *$$target_option*) has_opt=yes; break;; \
     70    esac; \
     71  done; \
     72  test $$has_opt = yes
     73am__make_dryrun = (target_option=n; $(am__make_running_with_option))
     74am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
    2175pkgdatadir = $(datadir)/@PACKAGE@
    2276pkgincludedir = $(includedir)/@PACKAGE@
     
    3892host_triplet = @host@
    3993subdir = src/tests/preempt_longrun
    40 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
    4194ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
    4295am__aclocal_m4_deps = $(top_srcdir)/configure.ac
    4396am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
    4497        $(ACLOCAL_M4)
     98DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
    4599mkinstalldirs = $(install_sh) -d
    46100CONFIG_HEADER = $(top_builddir)/config.h
    47101CONFIG_CLEAN_FILES =
    48102CONFIG_CLEAN_VPATH_FILES =
     103AM_V_P = $(am__v_P_@AM_V@)
     104am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
     105am__v_P_0 = false
     106am__v_P_1 = :
    49107AM_V_GEN = $(am__v_GEN_@AM_V@)
    50108am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
    51 am__v_GEN_0 = @echo "  GEN   " $@;
     109am__v_GEN_0 = @echo "  GEN     " $@;
     110am__v_GEN_1 =
    52111AM_V_at = $(am__v_at_@AM_V@)
    53112am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
    54113am__v_at_0 = @
     114am__v_at_1 =
    55115SOURCES =
    56116DIST_SOURCES =
    57 am__tty_colors = \
    58 red=; grn=; lgn=; blu=; std=
     117am__can_run_installinfo = \
     118  case $$AM_UPDATE_INFO_DIR in \
     119    n|no|NO) false;; \
     120    *) (install-info --version) >/dev/null 2>&1;; \
     121  esac
     122am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
     123am__tty_colors_dummy = \
     124  mgn= red= grn= lgn= blu= brg= std=; \
     125  am__color_tests=no
     126am__tty_colors = { \
     127  $(am__tty_colors_dummy); \
     128  if test "X$(AM_COLOR_TESTS)" = Xno; then \
     129    am__color_tests=no; \
     130  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
     131    am__color_tests=yes; \
     132  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
     133    am__color_tests=yes; \
     134  fi; \
     135  if test $$am__color_tests = yes; then \
     136    red='[0;31m'; \
     137    grn='[0;32m'; \
     138    lgn='[1;32m'; \
     139    blu='[1;34m'; \
     140    mgn='[0;35m'; \
     141    brg='[1m'; \
     142    std='[m'; \
     143  fi; \
     144}
     145am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
     146am__vpath_adj = case $$p in \
     147    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
     148    *) f=$$p;; \
     149  esac;
     150am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
     151am__install_max = 40
     152am__nobase_strip_setup = \
     153  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
     154am__nobase_strip = \
     155  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
     156am__nobase_list = $(am__nobase_strip_setup); \
     157  for p in $$list; do echo "$$p $$p"; done | \
     158  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
     159  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
     160    if (++n[$$2] == $(am__install_max)) \
     161      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
     162    END { for (dir in files) print dir, files[dir] }'
     163am__base_list = \
     164  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
     165  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
     166am__uninstall_files_from_dir = { \
     167  test -z "$$files" \
     168    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
     169    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
     170         $(am__cd) "$$dir" && rm -f $$files; }; \
     171  }
     172am__recheck_rx = ^[     ]*:recheck:[    ]*
     173am__global_test_result_rx = ^[  ]*:global-test-result:[         ]*
     174am__copy_in_global_log_rx = ^[  ]*:copy-in-global-log:[         ]*
     175# A command that, given a newline-separated list of test names on the
     176# standard input, print the name of the tests that are to be re-run
     177# upon "make recheck".
     178am__list_recheck_tests = $(AWK) '{ \
     179  recheck = 1; \
     180  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
     181    { \
     182      if (rc < 0) \
     183        { \
     184          if ((getline line2 < ($$0 ".log")) < 0) \
     185            recheck = 0; \
     186          break; \
     187        } \
     188      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
     189        { \
     190          recheck = 0; \
     191          break; \
     192        } \
     193      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
     194        { \
     195          break; \
     196        } \
     197    }; \
     198  if (recheck) \
     199    print $$0; \
     200  close ($$0 ".trs"); \
     201  close ($$0 ".log"); \
     202}'
     203# A command that, given a newline-separated list of test names on the
     204# standard input, create the global log from their .trs and .log files.
     205am__create_global_log = $(AWK) ' \
     206function fatal(msg) \
     207{ \
     208  print "fatal: making $@: " msg | "cat >&2"; \
     209  exit 1; \
     210} \
     211function rst_section(header) \
     212{ \
     213  print header; \
     214  len = length(header); \
     215  for (i = 1; i <= len; i = i + 1) \
     216    printf "="; \
     217  printf "\n\n"; \
     218} \
     219{ \
     220  copy_in_global_log = 1; \
     221  global_test_result = "RUN"; \
     222  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
     223    { \
     224      if (rc < 0) \
     225         fatal("failed to read from " $$0 ".trs"); \
     226      if (line ~ /$(am__global_test_result_rx)/) \
     227        { \
     228          sub("$(am__global_test_result_rx)", "", line); \
     229          sub("[        ]*$$", "", line); \
     230          global_test_result = line; \
     231        } \
     232      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
     233        copy_in_global_log = 0; \
     234    }; \
     235  if (copy_in_global_log) \
     236    { \
     237      rst_section(global_test_result ": " $$0); \
     238      while ((rc = (getline line < ($$0 ".log"))) != 0) \
     239      { \
     240        if (rc < 0) \
     241          fatal("failed to read from " $$0 ".log"); \
     242        print line; \
     243      }; \
     244      printf "\n"; \
     245    }; \
     246  close ($$0 ".trs"); \
     247  close ($$0 ".log"); \
     248}'
     249# Restructured Text title.
     250am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
     251# Solaris 10 'make', and several other traditional 'make' implementations,
     252# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
     253# by disabling -e (using the XSI extension "set +e") if it's set.
     254am__sh_e_setup = case $$- in *e*) set +e;; esac
     255# Default flags passed to test drivers.
     256am__common_driver_flags = \
     257  --color-tests "$$am__color_tests" \
     258  --enable-hard-errors "$$am__enable_hard_errors" \
     259  --expect-failure "$$am__expect_failure"
     260# To be inserted before the command running the test.  Creates the
     261# directory for the log if needed.  Stores in $dir the directory
     262# containing $f, in $tst the test, in $log the log.  Executes the
     263# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
     264# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
     265# will run the test scripts (or their associated LOG_COMPILER, if
     266# thy have one).
     267am__check_pre = \
     268$(am__sh_e_setup);                                      \
     269$(am__vpath_adj_setup) $(am__vpath_adj)                 \
     270$(am__tty_colors);                                      \
     271srcdir=$(srcdir); export srcdir;                        \
     272case "$@" in                                            \
     273  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;    \
     274    *) am__odir=.;;                                     \
     275esac;                                                   \
     276test "x$$am__odir" = x"." || test -d "$$am__odir"       \
     277  || $(MKDIR_P) "$$am__odir" || exit $$?;               \
     278if test -f "./$$f"; then dir=./;                        \
     279elif test -f "$$f"; then dir=;                          \
     280else dir="$(srcdir)/"; fi;                              \
     281tst=$$dir$$f; log='$@';                                 \
     282if test -n '$(DISABLE_HARD_ERRORS)'; then               \
     283  am__enable_hard_errors=no;                            \
     284else                                                    \
     285  am__enable_hard_errors=yes;                           \
     286fi;                                                     \
     287case " $(XFAIL_TESTS) " in                              \
     288  *[\ \ ]$$f[\ \        ]* | *[\ \      ]$$dir$$f[\ \   ]*) \
     289    am__expect_failure=yes;;                            \
     290  *)                                                    \
     291    am__expect_failure=no;;                             \
     292esac;                                                   \
     293$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
     294# A shell command to get the names of the tests scripts with any registered
     295# extension removed (i.e., equivalently, the names of the test logs, with
     296# the '.log' extension removed).  The result is saved in the shell variable
     297# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
     298# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
     299# since that might cause problem with VPATH rewrites for suffix-less tests.
     300# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
     301am__set_TESTS_bases = \
     302  bases='$(TEST_LOGS)'; \
     303  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
     304  bases=`echo $$bases`
     305RECHECK_LOGS = $(TEST_LOGS)
     306AM_RECURSIVE_TARGETS = check recheck
     307TEST_SUITE_LOG = test-suite.log
     308TEST_EXTENSIONS = @EXEEXT@ .test
     309LOG_DRIVER = $(SHELL) $(top_srcdir)/automake/test-driver
     310LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
     311am__set_b = \
     312  case '$@' in \
     313    */*) \
     314      case '$*' in \
     315        */*) b='$*';; \
     316          *) b=`echo '$@' | sed 's/\.log$$//'`; \
     317       esac;; \
     318    *) \
     319      b='$*';; \
     320  esac
     321am__test_logs1 = $(TESTS:=.log)
     322am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
     323TEST_LOGS = $(am__test_logs2:.test.log=.log)
     324TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/automake/test-driver
     325TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
     326        $(TEST_LOG_FLAGS)
     327am__DIST_COMMON = $(srcdir)/Makefile.in \
     328        $(top_srcdir)/automake/test-driver
    59329DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
    60330ACLOCAL = @ACLOCAL@
     
    169439program_transform_name = @program_transform_name@
    170440psdir = @psdir@
     441runstatedir = @runstatedir@
    171442sbindir = @sbindir@
    172443sharedstatedir = @sharedstatedir@
     
    178449top_srcdir = @top_srcdir@
    179450repeats = 10
    180 max_time = 10
    181 N = 10ul
    182 preempt = 10_000ul
     451max_time = 600
     452preempt = 1_000ul
    183453REPEAT = ${abs_top_srcdir}/tools/repeat -s
    184 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -DN=${N} -DPREEMPTION_RATE=${preempt}
    185 TESTS = barge block create disjoint processor stack wait yield
     454BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -DPREEMPTION_RATE=${preempt}
     455TESTS = barge block create disjoint enter enter3 processor stack wait yield
    186456all: all-am
    187457
    188458.SUFFIXES:
     459.SUFFIXES: .log .test .test$(EXEEXT) .trs
    189460$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
    190461        @for dep in $?; do \
     
    199470        $(am__cd) $(top_srcdir) && \
    200471          $(AUTOMAKE) --foreign src/tests/preempt_longrun/Makefile
    201 .PRECIOUS: Makefile
    202472Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
    203473        @case '$?' in \
     
    217487        cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
    218488$(am__aclocal_m4_deps):
    219 tags: TAGS
    220 TAGS:
    221 
    222 ctags: CTAGS
    223 CTAGS:
    224 
    225 
    226 check-TESTS: $(TESTS)
    227         @failed=0; all=0; xfail=0; xpass=0; skip=0; \
    228         srcdir=$(srcdir); export srcdir; \
    229         list=' $(TESTS) '; \
    230         $(am__tty_colors); \
    231         if test -n "$$list"; then \
    232           for tst in $$list; do \
    233             if test -f ./$$tst; then dir=./; \
    234             elif test -f $$tst; then dir=; \
    235             else dir="$(srcdir)/"; fi; \
    236             if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
    237               all=`expr $$all + 1`; \
    238               case " $(XFAIL_TESTS) " in \
    239               *[\ \     ]$$tst[\ \      ]*) \
    240                 xpass=`expr $$xpass + 1`; \
    241                 failed=`expr $$failed + 1`; \
    242                 col=$$red; res=XPASS; \
    243               ;; \
    244               *) \
    245                 col=$$grn; res=PASS; \
    246               ;; \
    247               esac; \
    248             elif test $$? -ne 77; then \
    249               all=`expr $$all + 1`; \
    250               case " $(XFAIL_TESTS) " in \
    251               *[\ \     ]$$tst[\ \      ]*) \
    252                 xfail=`expr $$xfail + 1`; \
    253                 col=$$lgn; res=XFAIL; \
    254               ;; \
    255               *) \
    256                 failed=`expr $$failed + 1`; \
    257                 col=$$red; res=FAIL; \
    258               ;; \
    259               esac; \
     489tags TAGS:
     490
     491ctags CTAGS:
     492
     493cscope cscopelist:
     494
     495
     496# Recover from deleted '.trs' file; this should ensure that
     497# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
     498# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
     499# to avoid problems with "make -n".
     500.log.trs:
     501        rm -f $< $@
     502        $(MAKE) $(AM_MAKEFLAGS) $<
     503
     504# Leading 'am--fnord' is there to ensure the list of targets does not
     505# expand to empty, as could happen e.g. with make check TESTS=''.
     506am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
     507am--force-recheck:
     508        @:
     509
     510$(TEST_SUITE_LOG): $(TEST_LOGS)
     511        @$(am__set_TESTS_bases); \
     512        am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
     513        redo_bases=`for i in $$bases; do \
     514                      am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
     515                    done`; \
     516        if test -n "$$redo_bases"; then \
     517          redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
     518          redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
     519          if $(am__make_dryrun); then :; else \
     520            rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
     521          fi; \
     522        fi; \
     523        if test -n "$$am__remaking_logs"; then \
     524          echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
     525               "recursion detected" >&2; \
     526        elif test -n "$$redo_logs"; then \
     527          am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
     528        fi; \
     529        if $(am__make_dryrun); then :; else \
     530          st=0;  \
     531          errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
     532          for i in $$redo_bases; do \
     533            test -f $$i.trs && test -r $$i.trs \
     534              || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
     535            test -f $$i.log && test -r $$i.log \
     536              || { echo "$$errmsg $$i.log" >&2; st=1; }; \
     537          done; \
     538          test $$st -eq 0 || exit 1; \
     539        fi
     540        @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
     541        ws='[   ]'; \
     542        results=`for b in $$bases; do echo $$b.trs; done`; \
     543        test -n "$$results" || results=/dev/null; \
     544        all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
     545        pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
     546        fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
     547        skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
     548        xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
     549        xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
     550        error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
     551        if test `expr $$fail + $$xpass + $$error` -eq 0; then \
     552          success=true; \
     553        else \
     554          success=false; \
     555        fi; \
     556        br='==================='; br=$$br$$br$$br$$br; \
     557        result_count () \
     558        { \
     559            if test x"$$1" = x"--maybe-color"; then \
     560              maybe_colorize=yes; \
     561            elif test x"$$1" = x"--no-color"; then \
     562              maybe_colorize=no; \
    260563            else \
    261               skip=`expr $$skip + 1`; \
    262               col=$$blu; res=SKIP; \
     564              echo "$@: invalid 'result_count' usage" >&2; exit 4; \
    263565            fi; \
    264             echo "$${col}$$res$${std}: $$tst"; \
    265           done; \
    266           if test "$$all" -eq 1; then \
    267             tests="test"; \
    268             All=""; \
    269           else \
    270             tests="tests"; \
    271             All="All "; \
    272           fi; \
    273           if test "$$failed" -eq 0; then \
    274             if test "$$xfail" -eq 0; then \
    275               banner="$$All$$all $$tests passed"; \
     566            shift; \
     567            desc=$$1 count=$$2; \
     568            if test $$maybe_colorize = yes && test $$count -gt 0; then \
     569              color_start=$$3 color_end=$$std; \
    276570            else \
    277               if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
    278               banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
     571              color_start= color_end=; \
    279572            fi; \
    280           else \
    281             if test "$$xpass" -eq 0; then \
    282               banner="$$failed of $$all $$tests failed"; \
    283             else \
    284               if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
    285               banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
    286             fi; \
    287           fi; \
    288           dashes="$$banner"; \
    289           skipped=""; \
    290           if test "$$skip" -ne 0; then \
    291             if test "$$skip" -eq 1; then \
    292               skipped="($$skip test was not run)"; \
    293             else \
    294               skipped="($$skip tests were not run)"; \
    295             fi; \
    296             test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
    297               dashes="$$skipped"; \
    298           fi; \
    299           report=""; \
    300           if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
    301             report="Please report to $(PACKAGE_BUGREPORT)"; \
    302             test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
    303               dashes="$$report"; \
    304           fi; \
    305           dashes=`echo "$$dashes" | sed s/./=/g`; \
    306           if test "$$failed" -eq 0; then \
    307             col="$$grn"; \
    308           else \
    309             col="$$red"; \
    310           fi; \
    311           echo "$${col}$$dashes$${std}"; \
    312           echo "$${col}$$banner$${std}"; \
    313           test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
    314           test -z "$$report" || echo "$${col}$$report$${std}"; \
    315           echo "$${col}$$dashes$${std}"; \
    316           test "$$failed" -eq 0; \
    317         else :; fi
     573            echo "$${color_start}# $$desc $$count$${color_end}"; \
     574        }; \
     575        create_testsuite_report () \
     576        { \
     577          result_count $$1 "TOTAL:" $$all   "$$brg"; \
     578          result_count $$1 "PASS: " $$pass  "$$grn"; \
     579          result_count $$1 "SKIP: " $$skip  "$$blu"; \
     580          result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
     581          result_count $$1 "FAIL: " $$fail  "$$red"; \
     582          result_count $$1 "XPASS:" $$xpass "$$red"; \
     583          result_count $$1 "ERROR:" $$error "$$mgn"; \
     584        }; \
     585        {                                                               \
     586          echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |       \
     587            $(am__rst_title);                                           \
     588          create_testsuite_report --no-color;                           \
     589          echo;                                                         \
     590          echo ".. contents:: :depth: 2";                               \
     591          echo;                                                         \
     592          for b in $$bases; do echo $$b; done                           \
     593            | $(am__create_global_log);                                 \
     594        } >$(TEST_SUITE_LOG).tmp || exit 1;                             \
     595        mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);                     \
     596        if $$success; then                                              \
     597          col="$$grn";                                                  \
     598         else                                                           \
     599          col="$$red";                                                  \
     600          test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);               \
     601        fi;                                                             \
     602        echo "$${col}$$br$${std}";                                      \
     603        echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";   \
     604        echo "$${col}$$br$${std}";                                      \
     605        create_testsuite_report --maybe-color;                          \
     606        echo "$$col$$br$$std";                                          \
     607        if $$success; then :; else                                      \
     608          echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";         \
     609          if test -n "$(PACKAGE_BUGREPORT)"; then                       \
     610            echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
     611          fi;                                                           \
     612          echo "$$col$$br$$std";                                        \
     613        fi;                                                             \
     614        $$success || exit 1
     615
     616check-TESTS:
     617        @list='$(RECHECK_LOGS)';           test -z "$$list" || rm -f $$list
     618        @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
     619        @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
     620        @set +e; $(am__set_TESTS_bases); \
     621        log_list=`for i in $$bases; do echo $$i.log; done`; \
     622        trs_list=`for i in $$bases; do echo $$i.trs; done`; \
     623        log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
     624        $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
     625        exit $$?;
     626recheck: all
     627        @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
     628        @set +e; $(am__set_TESTS_bases); \
     629        bases=`for i in $$bases; do echo $$i; done \
     630                 | $(am__list_recheck_tests)` || exit 1; \
     631        log_list=`for i in $$bases; do echo $$i.log; done`; \
     632        log_list=`echo $$log_list`; \
     633        $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
     634                am__force_recheck=am--force-recheck \
     635                TEST_LOGS="$$log_list"; \
     636        exit $$?
     637barge.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)
     644block.log: block
     645        @p='block'; \
     646        b='block'; \
     647        $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
     648        --log-file $$b.log --trs-file $$b.trs \
     649        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
     650        "$$tst" $(AM_TESTS_FD_REDIRECT)
     651create.log: create
     652        @p='create'; \
     653        b='create'; \
     654        $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
     655        --log-file $$b.log --trs-file $$b.trs \
     656        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
     657        "$$tst" $(AM_TESTS_FD_REDIRECT)
     658disjoint.log: disjoint
     659        @p='disjoint'; \
     660        b='disjoint'; \
     661        $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
     662        --log-file $$b.log --trs-file $$b.trs \
     663        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
     664        "$$tst" $(AM_TESTS_FD_REDIRECT)
     665enter.log: enter
     666        @p='enter'; \
     667        b='enter'; \
     668        $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
     669        --log-file $$b.log --trs-file $$b.trs \
     670        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
     671        "$$tst" $(AM_TESTS_FD_REDIRECT)
     672enter3.log: enter3
     673        @p='enter3'; \
     674        b='enter3'; \
     675        $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
     676        --log-file $$b.log --trs-file $$b.trs \
     677        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
     678        "$$tst" $(AM_TESTS_FD_REDIRECT)
     679processor.log: processor
     680        @p='processor'; \
     681        b='processor'; \
     682        $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
     683        --log-file $$b.log --trs-file $$b.trs \
     684        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
     685        "$$tst" $(AM_TESTS_FD_REDIRECT)
     686stack.log: stack
     687        @p='stack'; \
     688        b='stack'; \
     689        $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
     690        --log-file $$b.log --trs-file $$b.trs \
     691        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
     692        "$$tst" $(AM_TESTS_FD_REDIRECT)
     693wait.log: wait
     694        @p='wait'; \
     695        b='wait'; \
     696        $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
     697        --log-file $$b.log --trs-file $$b.trs \
     698        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
     699        "$$tst" $(AM_TESTS_FD_REDIRECT)
     700yield.log: yield
     701        @p='yield'; \
     702        b='yield'; \
     703        $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
     704        --log-file $$b.log --trs-file $$b.trs \
     705        $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
     706        "$$tst" $(AM_TESTS_FD_REDIRECT)
     707.test.log:
     708        @p='$<'; \
     709        $(am__set_b); \
     710        $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
     711        --log-file $$b.log --trs-file $$b.trs \
     712        $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
     713        "$$tst" $(AM_TESTS_FD_REDIRECT)
     714@am__EXEEXT_TRUE@.test$(EXEEXT).log:
     715@am__EXEEXT_TRUE@       @p='$<'; \
     716@am__EXEEXT_TRUE@       $(am__set_b); \
     717@am__EXEEXT_TRUE@       $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
     718@am__EXEEXT_TRUE@       --log-file $$b.log --trs-file $$b.trs \
     719@am__EXEEXT_TRUE@       $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
     720@am__EXEEXT_TRUE@       "$$tst" $(AM_TESTS_FD_REDIRECT)
    318721
    319722distdir: $(DISTFILES)
     
    372775        fi
    373776mostlyclean-generic:
     777        -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
     778        -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
     779        -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
    374780
    375781clean-generic:
     
    384790clean: clean-am
    385791
    386 clean-am: clean-generic mostlyclean-am
     792clean-am: clean-generic clean-local mostlyclean-am
    387793
    388794distclean: distclean-am
     
    451857
    452858.PHONY: all all-am all-local check check-TESTS check-am clean \
    453         clean-generic distclean distclean-generic distdir dvi dvi-am \
    454         html html-am info info-am install install-am install-data \
    455         install-data-am install-dvi install-dvi-am install-exec \
    456         install-exec-am install-html install-html-am install-info \
    457         install-info-am install-man install-pdf install-pdf-am \
    458         install-ps install-ps-am install-strip installcheck \
    459         installcheck-am installdirs maintainer-clean \
    460         maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
    461         pdf-am ps ps-am uninstall uninstall-am
     859        clean-generic clean-local cscopelist-am ctags-am distclean \
     860        distclean-generic distdir dvi dvi-am html html-am info info-am \
     861        install install-am install-data install-data-am install-dvi \
     862        install-dvi-am install-exec install-exec-am install-html \
     863        install-html-am install-info install-info-am install-man \
     864        install-pdf install-pdf-am install-ps install-ps-am \
     865        install-strip installcheck installcheck-am installdirs \
     866        maintainer-clean maintainer-clean-generic mostlyclean \
     867        mostlyclean-generic pdf pdf-am ps ps-am recheck tags-am \
     868        uninstall uninstall-am
     869
     870.PRECIOUS: Makefile
    462871
    463872
     
    465874
    466875all-local: ${TESTS:=.run}
     876
     877clean-local:
     878        rm -f ${TESTS}
    467879
    468880% : %.c ${CC}
  • src/tests/preempt_longrun/create.c

    rfea3faa rb826e6b  
    1010}
    1111
    12 thread Worker {};
     12thread worker_t {};
    1313
    14 void main(Worker * this) {}
     14void main(worker_t * this) {}
    1515
    1616int main(int argc, char* argv[]) {
    17         for(int i = 0; i < 100_000ul; i++) {
    18                 Worker w;
     17        processor p;
     18        for(int i = 0; i < 10_000ul; i++) {
     19                worker_t w[7];
    1920        }
    2021}
  • src/tests/preempt_longrun/processor.c

    rfea3faa rb826e6b  
    1010}
    1111
    12 thread Worker {};
     12thread worker_t {};
    1313
    14 void main(Worker * this) {}
     14void main(worker_t * this) {}
    1515
    1616int main(int argc, char* argv[]) {
    17         for(int i = 0; i < 100_000ul; i++) {
     17        for(int i = 0; i < 10_000ul; i++) {
    1818                processor p;
    1919        }
  • src/tests/preempt_longrun/stack.c

    rfea3faa rb826e6b  
    1212}
    1313
    14 thread Worker {};
     14thread worker_t {};
    1515
    16 void main(Worker * this) {
     16void main(worker_t * this) {
    1717        volatile long p = 5_021_609ul;
    1818        volatile long a = 326_417ul;
    1919        volatile long n = 1l;
    20         for (volatile long i = 0; i < p; i++) { 
    21                 n *= a; 
    22                 n %= p; 
     20        for (volatile long i = 0; i < p; i++) {
     21                n *= a;
     22                n %= p;
    2323        }
    24                
     24
    2525        if( n != a ) {
    2626                abort();
     
    2828}
    2929
     30extern "C" {
     31static worker_t * workers;
     32}
     33
    3034int main(int argc, char* argv[]) {
    3135        processor p;
    3236        {
    33                 Worker w[7];
     37                worker_t w[7];
     38                workers = w;
    3439        }
    3540}
  • src/tests/preempt_longrun/yield.c

    rfea3faa rb826e6b  
    1010}
    1111
    12 thread Worker {};
     12thread worker_t {};
    1313
    14 void main(Worker * this) {
    15         for(int i = 0; i < 100_000ul; i++) {
     14void main(worker_t * this) {
     15        for(int i = 0; i < 325_000ul; i++) {
    1616                yield();
    1717        }
     18}
     19
     20extern "C" {
     21static worker_t * workers;
    1822}
    1923
     
    2125        processor p;
    2226        {
    23                 Worker w[7];
     27                worker_t w[7];
     28                workers = w;
    2429        }
    2530}
  • src/tests/sched-int-barge.c

    rfea3faa rb826e6b  
    44#include <stdlib>
    55#include <thread>
     6
     7#ifndef N
     8#define N 100_000
     9#endif
    610
    711enum state_t { WAIT, SIGNAL, BARGE };
     
    7377        }
    7478
    75         if( c->counter >= 100_000 ) c->done = true;
     79        if( c->counter >= N ) c->done = true;
    7680        return !c->done;
    7781}
  • src/tests/sched-int-block.c

    rfea3faa rb826e6b  
    66
    77#ifndef N
    8 #define N 100_000
     8#define N 10_000
    99#endif
    1010
     
    3131//------------------------------------------------------------------------------
    3232void wait_op( global_data_t * mutex a, global_data_t * mutex b, unsigned i ) {
    33         wait( &cond, (uintptr_t)this_thread() );
     33        wait( &cond, (uintptr_t)this_thread );
    3434
    3535        yield( ((unsigned)rand48()) % 10 );
     
    4040        }
    4141
    42         a->last_thread = b->last_thread = this_thread();
     42        a->last_thread = b->last_thread = this_thread;
    4343
    4444        yield( ((unsigned)rand48()) % 10 );
     
    5656        yield( ((unsigned)rand48()) % 10 );
    5757
    58         a->last_thread = b->last_thread = a->last_signaller = b->last_signaller = this_thread();
     58        a->last_thread = b->last_thread = a->last_signaller = b->last_signaller = this_thread;
    5959
    6060        if( !is_empty( &cond ) ) {
     
    8686//------------------------------------------------------------------------------
    8787void barge_op( global_data_t * mutex a ) {
    88         a->last_thread = this_thread();
     88        a->last_thread = this_thread;
    8989}
    9090
  • src/tests/sched-int-disjoint.c

    rfea3faa rb826e6b  
    55
    66#ifndef N
    7 #define N 100_000
     7#define N 10_000
    88#endif
    99
     
    4242
    4343void main( Barger * this ) {
    44         while( !all_done ) { 
     44        while( !all_done ) {
    4545                barge( &data );
    46                 yield(); 
     46                yield();
    4747        }
    4848}
     
    5353        wait( &cond );
    5454        if( d->state != SIGNAL ) {
    55                 sout | "ERROR barging!" | endl; 
     55                sout | "ERROR barging!" | endl;
    5656        }
    5757
     
    8585        bool running = data.counter < N && data.counter > 0;
    8686        if( data.state != SIGNAL && running ) {
    87                 sout | "ERROR Eager signal" | data.state | endl; 
     87                sout | "ERROR Eager signal" | data.state | endl;
    8888        }
    8989}
     
    9292
    9393void main( Signaller * this ) {
    94         while( !all_done ) { 
     94        while( !all_done ) {
    9595                logic( &mut );
    96                 yield(); 
     96                yield();
    9797        }
    9898}
     
    111111                sout | "All waiter done" | endl;
    112112                all_done = true;
    113         }       
     113        }
    114114}
  • src/tests/sched-int-wait.c

    rfea3faa rb826e6b  
    5050                unsigned action = (unsigned)rand48() % 4;
    5151                switch( action ) {
    52                         case 0: 
     52                        case 0:
    5353                                signal( &condABC, &globalA, &globalB, &globalC );
    5454                                break;
    55                         case 1: 
     55                        case 1:
    5656                                signal( &condAB , &globalA, &globalB );
    5757                                break;
    58                         case 2: 
     58                        case 2:
    5959                                signal( &condBC , &globalB, &globalC );
    6060                                break;
    61                         case 3: 
     61                        case 3:
    6262                                signal( &condAC , &globalA, &globalC );
    6363                                break;
     
    6767                }
    6868                yield();
    69         }       
     69        }
    7070}
    7171
  • src/tests/test.py

    rfea3faa rb826e6b  
    161161
    162162        # remove any outputs from the previous tests to prevent side effects
    163         rm( (out_file, test.name), dry_run )
     163        rm( (out_file, err_file, test.name), dry_run )
    164164
    165165        options = "-debug" if debug else "-nodebug"
    166166
    167167        # build, skipping to next test on error
    168         make_ret, _ = sh("""%s test=yes EXTRA_FLAGS="%s" %s 2> %s 1> /dev/null""" % (make_cmd, options, test.name, out_file), dry_run)
     168        make_ret, _ = sh("""%s test=yes DEBUG_FLAGS="%s" %s 2> %s 1> /dev/null""" % (make_cmd, options, test.name, out_file), dry_run)
    169169
    170170        retcode = 0
     
    202202                        error = myfile.read()
    203203
    204                
     204
    205205        # clean the executable
    206206        sh("rm -f %s > /dev/null 2>&1" % test.name, dry_run)
     
    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/thread.c

    rfea3faa rb826e6b  
    44#include <thread>
    55
    6 // thread First;
    7 // void main(First* this);
     6thread First  { semaphore* lock; };
     7thread Second { semaphore* lock; };
    88
    9 // thread Second;
    10 // void main(Second* this);
    11 
    12 thread First  { signal_once* lock; };
    13 thread Second { signal_once* lock; };
    14 
    15 void ?{}( First * this, signal_once* lock ) { this->lock = lock; }
    16 void ?{}( Second * this, signal_once* lock ) { this->lock = lock; }
     9void ?{}( First * this, semaphore* lock ) { this->lock = lock; }
     10void ?{}( Second * this, semaphore* lock ) { this->lock = lock; }
    1711
    1812void main(First* this) {
     
    2115                yield();
    2216        }
    23         signal(this->lock);
     17        V(this->lock);
    2418}
    2519
    2620void main(Second* this) {
    27         wait(this->lock);
     21        P(this->lock);
    2822        for(int i = 0; i < 10; i++) {
    2923                sout | "Second : Suspend No." | i + 1 | endl;
     
    3428
    3529int main(int argc, char* argv[]) {
    36         signal_once lock;
     30        semaphore lock = { 0 };
    3731        sout | "User main begin" | endl;
    3832        {
  • tools/cfa.nanorc

    rfea3faa rb826e6b  
    22## WIP
    33
    4 syntax "cfa" "\.cfa$"
    5 ## No magic
     4syntax "cfa" "\.cfa"
    65
    76# Macros
     
    1918# Control Flow Structures
    2019color brightyellow "\<(if|else|while|do|for|switch|choose|case|default)\>"
    21 ##color brightyellow "\<(try|catch|catchResume|finally)\>"
     20color brightyellow "\<(try|catch(Resume)?|finally)\>"
    2221
    2322# Control Flow Statements
    24 color magenta "\<(return|break|continue|fallthru|throw)\>"
     23color magenta "\<(goto|return|break|continue|fallthr(u|ough)|throw(Resume)?)\>"
    2524
    2625# Operator Names
     
    4645color brightmagenta "'\\(([0-3]?[0-7]{1,2}))'" "'\\x[0-9A-Fa-f]{1,2}'"
    4746# Strings and Angle Strings
    48 color brightyellow ""([^"]|\\")*"" "<[^[:blank:]=]*>"
     47color yellow ""([^"]|\\")*"" "<[^[:blank:]=]*>"
    4948# Multiline Strings: This regex is VERY expencive and often too strong.
    5049###color brightyellow start=""(\\.|[^"])*\\[[:space:]]*$" end="^(\\.|[^"])*""
Note: See TracChangeset for help on using the changeset viewer.