Changes in / [fea3faa:b826e6b]
- Files:
-
- 39 added
- 29 deleted
- 160 edited
Legend:
- Unmodified
- Added
- Removed
-
.gitignore
rfea3faa rb826e6b 37 37 src/libcfa/libcfa-prelude.c 38 38 39 # generated by bison and lex from cfa.yy and lex.ll, respectively39 # generated by bison and lex from parser.yy and lex.ll 40 40 src/Parser/parser.output 41 41 src/Parser/lex.cc 42 42 src/Parser/parser.cc 43 43 src/Parser/parser.h 44 src/Parser/parser.hh 45 46 tools/prettyprinter/parser.output 47 tools/prettyprinter/lex.cc 48 tools/prettyprinter/parser.cc 49 tools/prettyprinter/parser.h 50 tools/prettyprinter/parser.hh 51 tools/prettyprinter/pretty 52 tools/pretty 44 53 45 54 # generated by xfig for user manual … … 47 56 doc/user/pointer1.tex 48 57 doc/user/pointer2.tex 58 doc/user/EHMHierarchy.tex -
Makefile.in
rfea3faa rb826e6b 1 # Makefile.in generated by automake 1.1 1.3from Makefile.am.1 # Makefile.in generated by automake 1.15 from Makefile.am. 2 2 # @configure_input@ 3 3 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 7 6 # This Makefile.in is free software; the Free Software Foundation 8 7 # gives unlimited permission to copy and/or distribute it, … … 19 18 ############################################################################### 20 19 VPATH = @srcdir@ 20 am__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 } 31 am__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 73 am__make_dryrun = (target_option=n; $(am__make_running_with_option)) 74 am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 21 75 pkgdatadir = $(datadir)/@PACKAGE@ 22 76 pkgincludedir = $(includedir)/@PACKAGE@ … … 38 92 host_triplet = @host@ 39 93 subdir = . 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/ylwrap45 94 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 46 95 am__aclocal_m4_deps = $(top_srcdir)/configure.ac 47 96 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ 48 97 $(ACLOCAL_M4) 98 DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ 99 $(am__configure_deps) $(am__DIST_COMMON) 49 100 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ 50 101 configure.lineno config.status.lineno … … 53 104 CONFIG_CLEAN_FILES = 54 105 CONFIG_CLEAN_VPATH_FILES = 106 AM_V_P = $(am__v_P_@AM_V@) 107 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) 108 am__v_P_0 = false 109 am__v_P_1 = : 55 110 AM_V_GEN = $(am__v_GEN_@AM_V@) 56 111 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) 57 am__v_GEN_0 = @echo " GEN " $@; 112 am__v_GEN_0 = @echo " GEN " $@; 113 am__v_GEN_1 = 58 114 AM_V_at = $(am__v_at_@AM_V@) 59 115 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) 60 116 am__v_at_0 = @ 117 am__v_at_1 = 61 118 SOURCES = 62 119 DIST_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 120 RECURSIVE_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 128 am__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 70 133 RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ 71 134 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 135 am__recursive_targets = \ 136 $(RECURSIVE_TARGETS) \ 137 $(RECURSIVE_CLEAN_TARGETS) \ 138 $(am__extra_recursive_targets) 139 AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ 140 cscope distdir dist dist-all distcheck 141 am__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. 146 am__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. 154 am__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)` 75 159 ETAGS = etags 76 160 CTAGS = ctags 161 CSCOPE = cscope 77 162 DIST_SUBDIRS = $(SUBDIRS) 163 am__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 78 171 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 79 172 distdir = $(PACKAGE)-$(VERSION) … … 85 178 || { sleep 5 && rm -rf "$(distdir)"; }; \ 86 179 else :; fi 180 am__post_remove_distdir = $(am__remove_distdir) 87 181 am__relativize = \ 88 182 dir0=`pwd`; \ … … 112 206 DIST_ARCHIVES = $(distdir).tar.gz 113 207 GZIP_ENV = --best 208 DIST_TARGETS = dist-gzip 114 209 distuninstallcheck_listfiles = find . -type f -print 115 210 am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ … … 227 322 program_transform_name = @program_transform_name@ 228 323 psdir = @psdir@ 324 runstatedir = @runstatedir@ 229 325 sbindir = @sbindir@ 230 326 sharedstatedir = @sharedstatedir@ … … 258 354 $(am__cd) $(top_srcdir) && \ 259 355 $(AUTOMAKE) --foreign Makefile 260 .PRECIOUS: Makefile261 356 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 262 357 @case '$?' in \ … … 279 374 280 375 config.h: stamp-h1 281 @ if test ! -f $@; then rm -f stamp-h1; else :; fi282 @ if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi376 @test -f $@ || rm -f stamp-h1 377 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 283 378 284 379 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status … … 294 389 295 390 # 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; \ 309 403 dot_seen=no; \ 310 404 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 \ 312 410 echo "Making $$target in $$subdir"; \ 313 411 if test "$$subdir" = "."; then \ … … 324 422 fi; test -z "$$fail" 325 423 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) 424 ID: $(am__tagged_files) 425 $(am__define_uniq_tagged_files); mkid -fID $$unique 426 tags: tags-recursive 427 TAGS: tags 428 429 tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 377 430 set x; \ 378 431 here=`pwd`; \ … … 390 443 fi; \ 391 444 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); \ 398 446 shift; \ 399 447 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ … … 407 455 fi; \ 408 456 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; }; }'`; \ 457 ctags: ctags-recursive 458 459 CTAGS: ctags 460 ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 461 $(am__define_uniq_tagged_files); \ 418 462 test -z "$(CTAGS_ARGS)$$unique" \ 419 463 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ … … 424 468 && $(am__cd) $(top_srcdir) \ 425 469 && gtags -i $(GTAGS_ARGS) "$$here" 470 cscope: cscope.files 471 test ! -s cscope.files \ 472 || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) 473 clean-cscope: 474 -rm -f cscope.files 475 cscope.files: clean-cscope cscopelist 476 cscopelist: cscopelist-recursive 477 478 cscopelist-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 426 491 427 492 distclean-tags: 428 493 -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags 494 -rm -f cscope.out cscope.in.out cscope.po.out cscope.files 429 495 430 496 distdir: $(DISTFILES) … … 462 528 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ 463 529 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; \ 471 534 dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ 472 535 $(am__relativize); \ … … 497 560 dist-gzip: distdir 498 561 tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz 499 $(am__ remove_distdir)562 $(am__post_remove_distdir) 500 563 501 564 dist-bzip2: distdir 502 565 tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 503 $(am__ remove_distdir)566 $(am__post_remove_distdir) 504 567 505 568 dist-lzip: distdir 506 569 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) 512 571 513 572 dist-xz: distdir 514 573 tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz 515 $(am__ remove_distdir)574 $(am__post_remove_distdir) 516 575 517 576 dist-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 518 580 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z 519 $(am__ remove_distdir)581 $(am__post_remove_distdir) 520 582 521 583 dist-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 522 587 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz 523 $(am__ remove_distdir)588 $(am__post_remove_distdir) 524 589 525 590 dist-zip: distdir 526 591 -rm -f $(distdir).zip 527 592 zip -rq $(distdir).zip $(distdir) 528 $(am__ remove_distdir)529 530 dist dist-all: distdir531 tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz532 $(am__ remove_distdir)593 $(am__post_remove_distdir) 594 595 dist dist-all: 596 $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' 597 $(am__post_remove_distdir) 533 598 534 599 # This target untars the dist file and tries a VPATH configuration. Then … … 541 606 *.tar.bz2*) \ 542 607 bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ 543 *.tar.lzma*) \544 lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\545 608 *.tar.lz*) \ 546 609 lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ … … 554 617 unzip $(distdir).zip ;;\ 555 618 esac 556 chmod -R a-w $(distdir) ; chmod a+w $(distdir)557 mkdir $(distdir)/_build558 mkdir $(distdir)/_ inst619 chmod -R a-w $(distdir) 620 chmod u+w $(distdir) 621 mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst 559 622 chmod a-w $(distdir) 560 623 test -d $(distdir)/_build || exit 0; \ … … 562 625 && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ 563 626 && am__cwd=`pwd` \ 564 && $(am__cd) $(distdir)/_build \565 && ../ configure --srcdir=.. --prefix="$$dc_install_base"\627 && $(am__cd) $(distdir)/_build/sub \ 628 && ../../configure \ 566 629 $(AM_DISTCHECK_CONFIGURE_FLAGS) \ 567 630 $(DISTCHECK_CONFIGURE_FLAGS) \ 631 --srcdir=../.. --prefix="$$dc_install_base" \ 568 632 && $(MAKE) $(AM_MAKEFLAGS) \ 569 633 && $(MAKE) $(AM_MAKEFLAGS) dvi \ … … 588 652 && cd "$$am__cwd" \ 589 653 || exit 1 590 $(am__ remove_distdir)654 $(am__post_remove_distdir) 591 655 @(echo "$(distdir) archives ready for distribution: "; \ 592 656 list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ … … 723 787 uninstall-am: 724 788 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 \ 732 795 distcheck distclean distclean-generic distclean-hdr \ 733 796 distclean-tags distcleancheck distdir distuninstallcheck dvi \ … … 739 802 installcheck installcheck-am installdirs installdirs-am \ 740 803 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 743 808 744 809 -
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 6 5 # This file is free software; the Free Software Foundation 7 6 # gives unlimited permission to copy and/or distribute it, … … 13 12 # PARTICULAR PURPOSE. 14 13 14 m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) 15 15 m4_ifndef([AC_AUTOCONF_VERSION], 16 16 [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl 17 m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.6 8],,18 [m4_warning([this file was generated for autoconf 2.6 8.17 m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, 18 [m4_warning([this file was generated for autoconf 2.69. 19 19 You have another version of autoconf. It may work, but is not guaranteed to. 20 20 If 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 21 To 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. 31 28 32 29 # AM_AUTOMAKE_VERSION(VERSION) … … 36 33 # (This private macro should not be called outside this file.) 37 34 AC_DEFUN([AM_AUTOMAKE_VERSION], 38 [am__api_version='1.1 1'35 [am__api_version='1.15' 39 36 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to 40 37 dnl require some minimum version. Point them to the right macro. 41 m4_if([$1], [1.1 1.3], [],38 m4_if([$1], [1.15], [], 42 39 [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl 43 40 ]) … … 55 52 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. 56 53 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], 57 [AM_AUTOMAKE_VERSION([1.1 1.3])dnl54 [AM_AUTOMAKE_VERSION([1.15])dnl 58 55 m4_ifndef([AC_AUTOCONF_VERSION], 59 56 [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl … … 62 59 # Figure out how to run the assembler. -*- Autoconf -*- 63 60 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. 71 66 72 67 # AM_PROG_AS … … 84 79 # AM_AUX_DIR_EXPAND -*- Autoconf -*- 85 80 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. 93 86 94 87 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets 95 # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to96 # `$srcdir', `$srcdir/..', or `$srcdir/../..'.88 # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to 89 # '$srcdir', '$srcdir/..', or '$srcdir/../..'. 97 90 # 98 91 # Of course, Automake must honor this variable whenever it calls a … … 113 106 # The reason of the latter failure is that $top_srcdir and $ac_aux_dir 114 107 # are both prefixed by $srcdir. In an in-source build this is usually 115 # harmless because $srcdir is `.', but things will broke when you108 # harmless because $srcdir is '.', but things will broke when you 116 109 # start a VPATH build or use an absolute $srcdir. 117 110 # … … 131 124 132 125 AC_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. 128 am_aux_dir=`cd "$ac_aux_dir" && pwd` 137 129 ]) 138 130 139 131 # AM_COND_IF -*- Autoconf -*- 140 132 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. 148 138 149 139 # _AM_COND_IF … … 155 145 m4_define([_AM_COND_ELSE]) 156 146 m4_define([_AM_COND_ENDIF]) 157 158 147 159 148 # AM_COND_IF(COND, [IF-TRUE], [IF-FALSE]) … … 179 168 # AM_CONDITIONAL -*- Autoconf -*- 180 169 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. 189 175 190 176 # AM_CONDITIONAL(NAME, SHELL-CONDITION) … … 192 178 # Define a conditional. 193 179 AC_DEFUN([AM_CONDITIONAL], 194 [AC_PREREQ( 2.52)dnl195 ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],196 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 197 183 AC_SUBST([$1_TRUE])dnl 198 184 AC_SUBST([$1_FALSE])dnl … … 213 199 fi])]) 214 200 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 225 209 # written in clear, in which case automake, when reading aclocal.m4, 226 210 # will think it sees a *use*, and therefore will trigger all it's … … 232 216 # ---------------------- 233 217 # 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". 235 219 # We try a few techniques and use that to set a single cache variable. 236 220 # … … 245 229 AC_REQUIRE([AM_DEP_TRACK])dnl 246 230 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=]) 231 m4_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=]) 253 238 254 239 AC_CACHE_CHECK([dependency style of $depcc], … … 258 243 # making bogus files that we don't know about and never remove. For 259 244 # 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 output261 # in D '.245 # making a dummy file named 'D' -- because '-MD' means "put the output 246 # in D". 262 247 rm -rf conftest.dir 263 248 mkdir conftest.dir … … 299 284 for i in 1 2 3 4 5 6; do 300 285 echo '#include "conftst'$i'.h"' >> sub/conftest.c 301 # Using `: > sub/conftst$i.h'creates only sub/conftst1.h with302 # Solaris 8's {/usr,}/bin/sh.303 touchsub/conftst$i.h286 # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with 287 # Solaris 10 /bin/sh. 288 echo '/* dummy */' > sub/conftst$i.h 304 289 done 305 290 echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf 306 291 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" 308 293 # mode. It turns out that the SunPro C++ compiler does not properly 309 # handle `-M -o', and we need to detect this. Also, some Intel310 # 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. 311 296 am__obj=sub/conftest.${OBJEXT-o} 312 297 am__minus_obj="-o $am__obj" … … 317 302 ;; 318 303 nosideeffect) 319 # after this tag, mechanisms are not by side-effect, so they'll320 # 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. 321 306 if test "x$enable_dependency_tracking" = xyes; then 322 307 continue … … 326 311 ;; 327 312 msvc7 | msvc7msys | msvisualcpp | msvcmsys) 328 # This compiler won't grok `-c -o', but also, the minuso test has313 # This compiler won't grok '-c -o', but also, the minuso test has 329 314 # not run yet. These depmodes are late enough in the game, and 330 315 # so weak that their functioning should not be impacted. … … 374 359 # ------------- 375 360 # 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. 377 362 AC_DEFUN([AM_SET_DEPDIR], 378 363 [AC_REQUIRE([AM_SET_LEADING_DOT])dnl … … 384 369 # ------------ 385 370 AC_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 372 AS_HELP_STRING( 373 [--enable-dependency-tracking], 374 [do not reject slow dependency extractors]) 375 AS_HELP_STRING( 376 [--disable-dependency-tracking], 377 [speeds up one-time build])]) 389 378 if test "x$enable_dependency_tracking" != xno; then 390 379 am_depcomp="$ac_aux_dir/depcomp" … … 401 390 # Generate code to set up dependency tracking. -*- Autoconf -*- 402 391 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 411 398 412 399 # _AM_OUTPUT_DEPENDENCY_COMMANDS … … 414 401 AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], 415 402 [{ 416 # Autoconf 2.62quotes --file arguments for eval, but not when files403 # Older Autoconf quotes --file arguments for eval, but not when files 417 404 # are listed without --file. Let's play safe and only enable the eval 418 405 # if we detect the quoting. … … 427 414 mf=`echo "$mf" | sed -e 's/:.*$//'` 428 415 # Check whether this is an Automake generated Makefile or not. 429 # We used to match only the files named `Makefile.in', but416 # We used to match only the files named 'Makefile.in', but 430 417 # some people rename them; so instead we look at the file content. 431 418 # Grep'ing the first line is not enough: some people post-process … … 439 426 fi 440 427 # Extract the definition of DEPDIR, am__include, and am__quote 441 # from the Makefile without running `make'.428 # from the Makefile without running 'make'. 442 429 DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` 443 430 test -z "$DEPDIR" && continue 444 431 am__include=`sed -n 's/^am__include = //p' < "$mf"` 445 test -z " am__include" && continue432 test -z "$am__include" && continue 446 433 am__quote=`sed -n 's/^am__quote = //p' < "$mf"` 447 # When using ansi2knr, U may be empty or an underscore; expand it448 U=`sed -n 's/^U = //p' < "$mf"`449 434 # Find all dependency output files, they are included files with 450 435 # $(DEPDIR) in their names. We invoke sed twice because it is the … … 453 438 for file in `sed -n " 454 439 s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ 455 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do440 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do 456 441 # Make sure the directory exists. 457 442 test -f "$dirpart/$file" && continue … … 471 456 # 472 457 # This code is only required when automatic dependency tracking 473 # is enabled. FIXME. This creates each `.P' file that we will458 # is enabled. FIXME. This creates each '.P' file that we will 474 459 # need in order to bootstrap the dependency handling code. 475 460 AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], … … 481 466 # Do all the work for Automake. -*- Autoconf -*- 482 467 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. 491 473 492 474 # This macro actually does too much. Some checks are only needed if 493 475 # your package does certain things. But this isn't really a big deal. 476 477 dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. 478 m4_define([AC_PROG_CC], 479 m4_defn([AC_PROG_CC]) 480 [_AM_PROG_CC_C_O 481 ]) 494 482 495 483 # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) … … 505 493 # release and drop the old call support. 506 494 AC_DEFUN([AM_INIT_AUTOMAKE], 507 [AC_PREREQ([2.6 2])dnl495 [AC_PREREQ([2.65])dnl 508 496 dnl Autoconf wants to disallow AM_ names. We explicitly allow 509 497 dnl the ones we care about. … … 534 522 dnl Distinguish between old-style and new-style calls. 535 523 m4_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.]) 526 m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl 537 527 AC_SUBST([PACKAGE], [$1])dnl 538 528 AC_SUBST([VERSION], [$2])], 539 529 [_AM_SET_OPTIONS([$1])dnl 540 530 dnl 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,, 531 m4_if( 532 m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), 533 [ok:ok],, 542 534 [m4_fatal([AC_INIT should be called with package and version arguments])])dnl 543 535 AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl … … 545 537 546 538 _AM_IF_OPTION([no-define],, 547 [AC_DEFINE_UNQUOTED( PACKAGE, "$PACKAGE", [Name of package])548 AC_DEFINE_UNQUOTED( VERSION, "$VERSION", [Version number of package])])dnl539 [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) 540 AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl 549 541 550 542 # Some tools Automake needs. 551 543 AC_REQUIRE([AM_SANITY_CHECK])dnl 552 544 AC_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)545 AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) 546 AM_MISSING_PROG([AUTOCONF], [autoconf]) 547 AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) 548 AM_MISSING_PROG([AUTOHEADER], [autoheader]) 549 AM_MISSING_PROG([MAKEINFO], [makeinfo]) 558 550 AC_REQUIRE([AM_PROG_INSTALL_SH])dnl 559 551 AC_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. 552 AC_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> 557 AC_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. 563 560 AC_REQUIRE([AC_PROG_AWK])dnl 564 561 AC_REQUIRE([AC_PROG_MAKE_SET])dnl … … 569 566 _AM_IF_OPTION([no-dependencies],, 570 567 [AC_PROVIDE_IFELSE([AC_PROG_CC], 571 [_AM_DEPENDENCIES( CC)],572 [ define([AC_PROG_CC],573 defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl568 [_AM_DEPENDENCIES([CC])], 569 [m4_define([AC_PROG_CC], 570 m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl 574 571 AC_PROVIDE_IFELSE([AC_PROG_CXX], 575 [_AM_DEPENDENCIES( CXX)],576 [ define([AC_PROG_CXX],577 defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl572 [_AM_DEPENDENCIES([CXX])], 573 [m4_define([AC_PROG_CXX], 574 m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl 578 575 AC_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 579 AC_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 ]) 584 AC_REQUIRE([AM_SILENT_RULES])dnl 585 dnl The testsuite driver may need to know about EXEEXT, so add the 586 dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This 587 dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. 587 588 AC_CONFIG_COMMANDS_PRE(dnl 588 589 [m4_provide_if([_AM_COMPILER_EXEEXT], 589 590 [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. 600 if rm -f && rm -fr && rm -rf; then : OK; else 601 cat >&2 <<'END' 602 Oops! 603 604 Your 'rm' program seems unable to run without file operands specified 605 on the command line, even when the '-f' option is present. This is contrary 606 to the behaviour of most rm programs out there, and not conforming with 607 the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542> 608 609 Please tell bug-automake@gnu.org about your system, including the value 610 of your $PATH and any error possibly output before this message. This 611 can help us improve future automake versions. 612 613 END 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' 620 Aborting the configuration process, to ensure you take notice of the issue. 621 622 You can download and install GNU coreutils to get an 'rm' implementation 623 that behaves properly: <http://www.gnu.org/software/coreutils/>. 624 625 If you want to complete the configuration process using your problematic 626 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM 627 to "yes", and re-run configure. 628 629 END 630 AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) 631 fi 632 fi 633 dnl The trailing newline in this macro's definition is deliberate, for 634 dnl backward compatibility and to allow trailing 'dnl'-style comments 635 dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. 636 ]) 637 638 dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not 593 639 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further 594 640 dnl mangled by Autoconf and run in a shell conditional statement. 595 641 m4_define([_AC_COMPILER_EXEEXT], 596 642 m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) 597 598 643 599 644 # When config.status generates a header, we must update the stamp-h file. … … 618 663 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) 619 664 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. 628 670 629 671 # AM_PROG_INSTALL_SH … … 632 674 AC_DEFUN([AM_PROG_INSTALL_SH], 633 675 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl 634 if test x"${install_sh }" != xset; then676 if test x"${install_sh+set}" != xset; then 635 677 case $am_aux_dir in 636 678 *\ * | *\ *) … … 640 682 esac 641 683 fi 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 684 AC_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. 651 691 652 692 # Check whether the underlying file-system supports filenames … … 666 706 # From Jim Meyering 667 707 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. 676 713 677 714 # AM_MAINTAINER_MODE([DEFAULT-MODE]) 678 715 # ---------------------------------- 679 716 # 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 user717 # Default is to disable them, unless 'enable' is passed literally. 718 # For symmetry, 'disable' may be passed as well. Anyway, the user 682 719 # can override the default with the --enable/--disable switch. 683 720 AC_DEFUN([AM_MAINTAINER_MODE], … … 690 727 dnl maintainer-mode's default is 'disable' unless 'enable' is passed 691 728 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])) 696 734 AC_MSG_RESULT([$USE_MAINTAINER_MODE]) 697 735 AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) … … 701 739 ) 702 740 703 AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])704 705 741 # Check to see how 'make' treats includes. -*- Autoconf -*- 706 742 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. 714 748 715 749 # AM_MAKE_INCLUDE() … … 730 764 # First try GNU make style include. 731 765 echo "include confinc" > confmf 732 # Ignore all kinds of additional output from `make'.766 # Ignore all kinds of additional output from 'make'. 733 767 case `$am_make -s -f confmf 2> /dev/null` in #( 734 768 *the\ am__doit\ target*) … … 755 789 ]) 756 790 757 # Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008758 # Free Software Foundation, Inc.759 #760 # This file is free software; the Free Software Foundation761 # gives unlimited permission to copy and/or distribute it,762 # with or without modifications, as long as this notice is preserved.763 764 # serial 6765 766 # AM_PROG_CC_C_O767 # --------------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])dnl771 AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl772 AC_REQUIRE_AUX_FILE([compile])dnl773 # FIXME: we rely on the cache variable name because774 # there is no other way.775 set dummy $CC776 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_o778 if test "$am_t" != yes; then779 # 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 fi786 dnl Make sure AC_PROG_CC is never called again, or it will override our787 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 792 791 # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- 793 792 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. 802 798 803 799 # AM_MISSING_PROG(NAME, PROGRAM) … … 808 804 AC_SUBST($1)]) 809 805 810 811 806 # AM_MISSING_HAS_RUN 812 807 # ------------------ 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. 815 810 AC_DEFUN([AM_MISSING_HAS_RUN], 816 811 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl … … 825 820 fi 826 821 # Use eval to expand $SHELL 827 if eval "$MISSING -- run true"; then828 am_missing_run="$MISSING --run"822 if eval "$MISSING --is-lightweight"; then 823 am_missing_run="$MISSING " 829 824 else 830 825 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]) 827 fi 862 828 ]) 863 829 864 830 # Helper functions for option handling. -*- Autoconf -*- 865 831 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. 874 837 875 838 # _AM_MANGLE_OPTION(NAME) … … 882 845 # Set option NAME. Presently that only means defining a flag for this option. 883 846 AC_DEFUN([_AM_SET_OPTION], 884 [m4_define(_AM_MANGLE_OPTION([$1]), 1)])847 [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) 885 848 886 849 # _AM_SET_OPTIONS(OPTIONS) … … 896 859 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) 897 860 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. 871 AC_DEFUN([_AM_PROG_CC_C_O], 872 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl 873 AC_REQUIRE_AUX_FILE([compile])dnl 874 AC_LANG_PUSH([C])dnl 875 AC_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]) 895 if 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" 902 fi 903 AC_LANG_POP([C])]) 904 905 # For backward compatibility. 906 AC_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.) 918 AC_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 898 925 # Check to make sure that the build environment is sane. -*- Autoconf -*- 899 926 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. 908 932 909 933 # AM_SANITY_CHECK … … 911 935 AC_DEFUN([AM_SANITY_CHECK], 912 936 [AC_MSG_CHECKING([whether build environment is sane]) 913 # Just in case914 sleep 1915 echo timestamp > conftest.file916 937 # Reject unsafe characters in $srcdir or the absolute working directory 917 938 # name. Accept space and tab only in the latter. … … 924 945 case $srcdir in 925 946 *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) 926 AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;947 AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; 927 948 esac 928 949 929 # Do `set' in a subshell so we don't clobber the current shell's950 # Do 'set' in a subshell so we don't clobber the current shell's 930 951 # arguments. Must try -L first in case configure is actually a 931 952 # symlink; some systems play weird games with the mod time of symlinks … … 933 954 # directory). 934 955 if ( 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 952 981 test "$[2]" = conftest.file 953 982 ) … … 959 988 Check your system clock]) 960 989 fi 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 990 AC_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. 993 am_sleep_pid= 994 if grep 'slept: no' conftest.file >/dev/null 2>&1; then 995 ( sleep 1 ) & 996 am_sleep_pid=$! 997 fi 998 AC_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])]) 1005 rm -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. 970 1013 971 1014 # AM_SILENT_RULES([DEFAULT]) 972 1015 # -------------------------- 973 1016 # 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). 975 1018 AC_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 1020 AS_HELP_STRING( 1021 [--enable-silent-rules], 1022 [less verbose build output (undo: "make V=1")]) 1023 AS_HELP_STRING( 1024 [--disable-silent-rules], 1025 [verbose build output (undo: "make V=0")])dnl 1026 ]) 1027 case $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]);; 983 1031 esac 984 1032 dnl 985 dnl A few `make' implementations (e.g., NonStop OS and NextStep)1033 dnl A few 'make' implementations (e.g., NonStop OS and NextStep) 986 1034 dnl do not support nested variable expansions. 987 1035 dnl See automake bug#9928 and bug#10237. … … 1001 1049 fi]) 1002 1050 if 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. 1004 1052 AM_V='$(V)' 1005 1053 AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' … … 1018 1066 ]) 1019 1067 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. 1027 1073 1028 1074 # AM_PROG_INSTALL_STRIP 1029 1075 # --------------------- 1030 # One issue with vendor `install' (even GNU) is that you can't1076 # One issue with vendor 'install' (even GNU) is that you can't 1031 1077 # specify the program used to strip binaries. This is especially 1032 1078 # annoying in cross-compiling environments, where the build's strip 1033 1079 # is unlikely to handle the host's binaries. 1034 1080 # Fortunately install-sh will honor a STRIPPROG variable, so we 1035 # always use install-sh in `make install-strip', and initialize1081 # always use install-sh in "make install-strip", and initialize 1036 1082 # STRIPPROG with the value of the STRIP variable (set by the user). 1037 1083 AC_DEFUN([AM_PROG_INSTALL_STRIP], 1038 1084 [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl 1039 # Installed binaries are usually stripped using `strip' when the user1040 # run `make install-strip'. However `strip' might not be the right1085 # Installed binaries are usually stripped using 'strip' when the user 1086 # run "make install-strip". However 'strip' might not be the right 1041 1087 # 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. 1089 dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. 1044 1090 if test "$cross_compiling" != no; then 1045 1091 AC_CHECK_TOOL([STRIP], [strip], :) … … 1048 1094 AC_SUBST([INSTALL_STRIP_PROGRAM])]) 1049 1095 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. 1057 1101 1058 1102 # _AM_SUBST_NOTMAKE(VARIABLE) … … 1069 1113 # Check how to create a tarball. -*- Autoconf -*- 1070 1114 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. 1078 1120 1079 1121 # _AM_PROG_TAR(FORMAT) 1080 1122 # -------------------- 1081 1123 # 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'. 1083 1125 # 1084 1126 # Substitute a variable $(am__tar) that is a command … … 1090 1132 # a tarball read from stdin. 1091 1133 # $(am__untar) < result.tar 1134 # 1092 1135 AC_DEFUN([_AM_PROG_TAR], 1093 1136 [# Always define AMTAR for backward compatibility. Yes, it's still used 1094 1137 # in the wild :-( We should find a proper way to deprecate it ... 1095 1138 AC_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 1096 1143 m4_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 1148 1237 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 1162 1242 AC_SUBST([am__tar]) 1163 1243 AC_SUBST([am__untar]) -
automake/config.guess
rfea3faa rb826e6b 1 /usr/share/automake-1.1 1/config.guess1 /usr/share/automake-1.15/config.guess -
automake/config.sub
rfea3faa rb826e6b 1 /usr/share/automake-1.1 1/config.sub1 /usr/share/automake-1.15/config.sub -
automake/missing
rfea3faa rb826e6b 1 1 #! /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 4 scriptversion=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. 9 8 10 9 # This program is free software; you can redistribute it and/or modify … … 27 26 28 27 if test $# -eq 0; then 29 echo 1>&2 "Try \`$0 --help' for more information"28 echo 1>&2 "Try '$0 --help' for more information" 30 29 exit 1 31 30 fi 32 31 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 the38 # srcdir already.39 if test -f configure.ac; then40 configure_ac=configure.ac41 else42 configure_ac=configure.in43 fi44 45 msg="missing on your system"46 47 32 case $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 ;; 63 44 64 45 -h|--h|--he|--hel|--help) … … 66 47 $0 [OPTION]... PROGRAM [ARGUMENT]... 67 48 68 Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an 69 error status if there is no known handling for PROGRAM.49 Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due 50 to PROGRAM being missing or too old. 70 51 71 52 Options: 72 53 -h, --help display this help and exit 73 54 -v, --version output version information and exit 74 --run try to run the given command, and emulate it if it fails75 55 76 56 Supported 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 60 Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 61 'g' are ignored when checking the name. 91 62 92 63 Send bug reports to <bug-automake@gnu.org>." … … 100 71 101 72 -*) 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" 104 75 exit 1 105 76 ;; … … 107 78 esac 108 79 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. 84 test $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. 89 case $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. 94 if test $st -eq 63; then 95 msg="probably too old" 96 elif test $st -eq 127; then 97 # Program was missing. 98 msg="missing on your system" 99 else 100 # Program was found and executed, but failed. Give up. 101 exit $st 102 fi 103 104 perl_URL=http://www.perl.org/ 105 flex_URL=http://flex.sourceforge.net/ 106 gnu_software_URL=http://www.gnu.org/software 107 108 program_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 129 give_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 202 give_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). 207 exit $st 324 208 325 209 # Local variables: -
config.h.in
rfea3faa rb826e6b 120 120 /* Define to 1 if the system has the type `_Bool'. */ 121 121 #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_O125 122 126 123 /* Name of package */ -
configure
rfea3faa rb826e6b 1 1 #! /bin/sh 2 2 # Guess values for system-dependent variables and create Makefiles. 3 # Generated by GNU Autoconf 2.6 8for cfa-cc 1.0.0.0.3 # Generated by GNU Autoconf 2.69 for cfa-cc 1.0.0.0. 4 4 # 5 5 # Report bugs to <cforall@plg.uwaterloo.ca>. 6 6 # 7 7 # 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. 11 9 # 12 10 # … … 137 135 (unset CDPATH) >/dev/null 2>&1 && unset CDPATH 138 136 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. 145 BASH_ENV=/dev/null 146 ENV=/dev/null 147 (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV 148 case $- in # (((( 149 *v*x* | *x*v* ) as_opts=-vx ;; 150 *v* ) as_opts=-v ;; 151 *x* ) as_opts=-x ;; 152 * ) as_opts= ;; 153 esac 154 exec $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 158 as_fn_exit 255 159 fi 160 # We don't want this to propagate to other subprocesses. 161 { _as_can_reexec=; unset _as_can_reexec;} 139 162 if test "x$CONFIG_SHELL" = x; then 140 163 as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : … … 170 193 exitcode=1; echo positional parameters were not saved. 171 194 fi 172 test x\$exitcode = x0 || exit 1" 195 test x\$exitcode = x0 || exit 1 196 test -x / || exit 1" 173 197 as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO 174 198 as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO … … 215 239 216 240 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. 246 BASH_ENV=/dev/null 247 ENV=/dev/null 248 (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV 249 case $- in # (((( 250 *v*x* | *x*v* ) as_opts=-vx ;; 251 *v* ) as_opts=-v ;; 252 *x* ) as_opts=-x ;; 253 * ) as_opts= ;; 254 esac 255 exec $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 259 exit 255 232 260 fi 233 261 … … 332 360 333 361 } # as_fn_mkdir_p 362 363 # as_fn_executable_p FILE 364 # ----------------------- 365 # Test if FILE is an executable regular file. 366 as_fn_executable_p () 367 { 368 test -f "$1" && test -x "$1" 369 } # as_fn_executable_p 334 370 # as_fn_append VAR VALUE 335 371 # ---------------------- … … 453 489 { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } 454 490 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 455 495 # Don't try to exec as it changes $[0], causing all sort of problems 456 496 # (the dirname of $[0] is not the place where we might find the … … 487 527 # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. 488 528 # 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'. 490 530 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' 492 532 elif ln conf$$.file conf$$ 2>/dev/null; then 493 533 as_ln_s=ln 494 534 else 495 as_ln_s='cp -p '535 as_ln_s='cp -pR' 496 536 fi 497 537 else 498 as_ln_s='cp -p '538 as_ln_s='cp -pR' 499 539 fi 500 540 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file … … 508 548 fi 509 549 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 550 as_test_x='test -x' 551 as_executable_p=as_fn_executable_p 532 552 533 553 # Sed expression to map a string onto a valid CPP name. … … 718 738 oldincludedir 719 739 includedir 740 runstatedir 720 741 localstatedir 721 742 sharedstatedir … … 803 824 sharedstatedir='${prefix}/com' 804 825 localstatedir='${prefix}/var' 826 runstatedir='${localstatedir}/run' 805 827 includedir='${prefix}/include' 806 828 oldincludedir='/usr/include' … … 1055 1077 silent=yes ;; 1056 1078 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 1057 1088 -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) 1058 1089 ac_prev=sbindir ;; … … 1192 1223 datadir sysconfdir sharedstatedir localstatedir includedir \ 1193 1224 oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ 1194 libdir localedir mandir 1225 libdir localedir mandir runstatedir 1195 1226 do 1196 1227 eval ac_val=\$$ac_var … … 1220 1251 if test "x$build_alias" = x; then 1221 1252 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" >&21224 1253 elif test "x$build_alias" != "x$host_alias"; then 1225 1254 cross_compiling=yes … … 1347 1376 --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] 1348 1377 --localstatedir=DIR modifiable single-machine data [PREFIX/var] 1378 --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] 1349 1379 --libdir=DIR object code libraries [EPREFIX/lib] 1350 1380 --includedir=DIR C header files [PREFIX/include] … … 1385 1415 --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) 1386 1416 --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 1391 1422 --enable-target-release Build and install the release target 1392 1423 --enable-target-debug Build and install the debug target 1393 1424 --enable-threading Build and install libcfa with threading support 1394 1425 (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 1397 1430 1398 1431 Optional Packages: … … 1489 1522 cat <<\_ACEOF 1490 1523 cfa-cc configure 1.0.0.0 1491 generated by GNU Autoconf 2.6 81492 1493 Copyright (C) 201 0Free Software Foundation, Inc.1524 generated by GNU Autoconf 2.69 1525 1526 Copyright (C) 2012 Free Software Foundation, Inc. 1494 1527 This configure script is free software; the Free Software Foundation 1495 1528 gives unlimited permission to copy, distribute and modify it. … … 1605 1638 } && test -s conftest$ac_exeext && { 1606 1639 test "$cross_compiling" = yes || 1607 $as_test_x conftest$ac_exeext1640 test -x conftest$ac_exeext 1608 1641 }; then : 1609 1642 ac_retval=0 … … 1971 2004 { 1972 2005 static int test_array [1 - 2 * !(0 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1))]; 1973 test_array [0] = 0 2006 test_array [0] = 0; 2007 return test_array [0]; 1974 2008 1975 2009 ; … … 1987 2021 static int test_array [1 - 2 * !(($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 1) 1988 2022 < ($ac_type) ((((($ac_type) 1 << N) << N) - 1) * 2 + 2))]; 1989 test_array [0] = 0 2023 test_array [0] = 0; 2024 return test_array [0]; 1990 2025 1991 2026 ; … … 2044 2079 { 2045 2080 static int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)]; 2046 test_array [0] = 0 2081 test_array [0] = 0; 2082 return test_array [0]; 2047 2083 2048 2084 ; … … 2077 2113 2078 2114 It was created by cfa-cc $as_me 1.0.0.0, which was 2079 generated by GNU Autoconf 2.6 8. Invocation command line was2115 generated by GNU Autoconf 2.69. Invocation command line was 2080 2116 2081 2117 $ $0 $@ … … 2461 2497 fi 2462 2498 2463 case $enable_silent_rules in 2464 yes) AM_DEFAULT_VERBOSITY=0;;2465 no)AM_DEFAULT_VERBOSITY=1;;2466 *)AM_DEFAULT_VERBOSITY=1;;2499 case $enable_silent_rules in # ((( 2500 yes) AM_DEFAULT_VERBOSITY=0;; 2501 no) AM_DEFAULT_VERBOSITY=1;; 2502 *) AM_DEFAULT_VERBOSITY=1;; 2467 2503 esac 2468 2504 am_make=${MAKE-make} … … 2496 2532 2497 2533 2498 am__api_version='1.1 1'2534 am__api_version='1.15' 2499 2535 2500 2536 # Find a good install program. We prefer a C program (faster), … … 2535 2571 for ac_prog in ginstall scoinst install; do 2536 2572 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"; }; then2573 if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then 2538 2574 if test $ac_prog = install && 2539 2575 grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then … … 2593 2629 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 2594 2630 $as_echo_n "checking whether build environment is sane... " >&6; } 2595 # Just in case2596 sleep 12597 echo timestamp > conftest.file2598 2631 # Reject unsafe characters in $srcdir or the absolute working directory 2599 2632 # name. Accept space and tab only in the latter. … … 2606 2639 case $srcdir in 2607 2640 *[\\\"\#\$\&\'\`$am_lf\ \ ]*) 2608 as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;2641 as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; 2609 2642 esac 2610 2643 2611 # Do `set' in a subshell so we don't clobber the current shell's2644 # Do 'set' in a subshell so we don't clobber the current shell's 2612 2645 # arguments. Must try -L first in case configure is actually a 2613 2646 # symlink; some systems play weird games with the mod time of symlinks … … 2615 2648 # directory). 2616 2649 if ( 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 2634 2675 test "$2" = conftest.file 2635 2676 ) … … 2643 2684 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 2644 2685 $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. 2688 am_sleep_pid= 2689 if grep 'slept: no' conftest.file >/dev/null 2>&1; then 2690 ( sleep 1 ) & 2691 am_sleep_pid=$! 2692 fi 2693 2694 rm -f conftest.file 2695 2645 2696 test "$program_prefix" != NONE && 2646 2697 program_transform_name="s&^&$program_prefix&;$program_transform_name" … … 2653 2704 program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` 2654 2705 2655 # expand $ac_aux_dir to an absolute path2656 am_aux_dir=`cd $ac_aux_dir&& pwd`2706 # Expand $ac_aux_dir to an absolute path. 2707 am_aux_dir=`cd "$ac_aux_dir" && pwd` 2657 2708 2658 2709 if test x"${MISSING+set}" != xset; then … … 2665 2716 fi 2666 2717 # Use eval to expand $SHELL 2667 if eval "$MISSING -- run true"; then2668 am_missing_run="$MISSING --run"2718 if eval "$MISSING --is-lightweight"; then 2719 am_missing_run="$MISSING " 2669 2720 else 2670 2721 am_missing_run= 2671 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&52672 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}2673 fi 2674 2675 if test x"${install_sh }" != xset; then2722 { $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;} 2724 fi 2725 2726 if test x"${install_sh+set}" != xset; then 2676 2727 case $am_aux_dir in 2677 2728 *\ * | *\ *) … … 2682 2733 fi 2683 2734 2684 # Installed binaries are usually stripped using `strip' when the user2685 # run `make install-strip'. However `strip' might not be the right2735 # Installed binaries are usually stripped using 'strip' when the user 2736 # run "make install-strip". However 'strip' might not be the right 2686 2737 # 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. 2688 2739 if test "$cross_compiling" != no; then 2689 2740 if test -n "$ac_tool_prefix"; then … … 2704 2755 test -z "$as_dir" && as_dir=. 2705 2756 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"; }; then2757 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 2707 2758 ac_cv_prog_STRIP="${ac_tool_prefix}strip" 2708 2759 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 2744 2795 test -z "$as_dir" && as_dir=. 2745 2796 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"; }; then2797 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 2747 2798 ac_cv_prog_ac_ct_STRIP="strip" 2748 2799 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 2795 2846 for ac_prog in mkdir gmkdir; do 2796 2847 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"; }|| continue2848 as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue 2798 2849 case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 2799 2850 'mkdir (GNU coreutils) '* | \ … … 2824 2875 $as_echo "$MKDIR_P" >&6; } 2825 2876 2826 mkdir_p="$MKDIR_P"2827 case $mkdir_p in2828 [\\/$]* | ?:[\\/]*) ;;2829 */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;2830 esac2831 2832 2877 for ac_prog in gawk mawk nawk awk 2833 2878 do … … 2848 2893 test -z "$as_dir" && as_dir=. 2849 2894 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"; }; then2895 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 2851 2896 ac_cv_prog_AWK="$ac_prog" 2852 2897 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 2962 3007 MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} 2963 3008 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> 3013 mkdir_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. 2966 3017 # Always define AMTAR for backward compatibility. Yes, it's still used 2967 3018 # in the wild :-( We should find a proper way to deprecate it ... 2968 3019 AMTAR='$${TAR-tar}' 2969 3020 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 2970 3025 am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' 2971 3026 … … 2973 3028 2974 3029 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. 3040 if rm -f && rm -fr && rm -rf; then : OK; else 3041 cat >&2 <<'END' 3042 Oops! 3043 3044 Your 'rm' program seems unable to run without file operands specified 3045 on the command line, even when the '-f' option is present. This is contrary 3046 to the behaviour of most rm programs out there, and not conforming with 3047 the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542> 3048 3049 Please tell bug-automake@gnu.org about your system, including the value 3050 of your $PATH and any error possibly output before this message. This 3051 can help us improve future automake versions. 3052 3053 END 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' 3060 Aborting the configuration process, to ensure you take notice of the issue. 3061 3062 You can download and install GNU coreutils to get an 'rm' implementation 3063 that behaves properly: <http://www.gnu.org/software/coreutils/>. 3064 3065 If you want to complete the configuration process using your problematic 3066 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM 3067 to "yes", and re-run configure. 3068 3069 END 3070 as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 3071 fi 3072 fi 2975 3073 2976 3074 … … 3102 3200 test -z "$as_dir" && as_dir=. 3103 3201 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"; }; then3202 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 3105 3203 ac_cv_path_BACKEND_CC="$as_dir/$ac_word$ac_exec_ext" 3106 3204 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 3373 3471 case $host_cpu in 3374 3472 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 " 3379 3477 ;; 3380 3478 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 " 3385 3483 ;; 3386 3484 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 " 3391 3489 ;; 3392 3490 esac … … 3430 3528 test -z "$as_dir" && as_dir=. 3431 3529 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"; }; then3530 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 3433 3531 ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" 3434 3532 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 3474 3572 test -z "$as_dir" && as_dir=. 3475 3573 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"; }; then3574 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 3477 3575 ac_cv_prog_ac_ct_CXX="$ac_prog" 3478 3576 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 3927 4025 # First try GNU make style include. 3928 4026 echo "include confinc" > confmf 3929 # Ignore all kinds of additional output from `make'.4027 # Ignore all kinds of additional output from 'make'. 3930 4028 case `$am_make -s -f confmf 2> /dev/null` in #( 3931 4029 *the\ am__doit\ target*) … … 3983 4081 # making bogus files that we don't know about and never remove. For 3984 4082 # 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 output3986 # in D '.4083 # making a dummy file named 'D' -- because '-MD' means "put the output 4084 # in D". 3987 4085 rm -rf conftest.dir 3988 4086 mkdir conftest.dir … … 4019 4117 for i in 1 2 3 4 5 6; do 4020 4118 echo '#include "conftst'$i'.h"' >> sub/conftest.c 4021 # Using `: > sub/conftst$i.h'creates only sub/conftst1.h with4022 # Solaris 8's {/usr,}/bin/sh.4023 touchsub/conftst$i.h4119 # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with 4120 # Solaris 10 /bin/sh. 4121 echo '/* dummy */' > sub/conftst$i.h 4024 4122 done 4025 4123 echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf 4026 4124 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" 4028 4126 # mode. It turns out that the SunPro C++ compiler does not properly 4029 # handle `-M -o', and we need to detect this. Also, some Intel4030 # 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. 4031 4129 am__obj=sub/conftest.${OBJEXT-o} 4032 4130 am__minus_obj="-o $am__obj" … … 4037 4135 ;; 4038 4136 nosideeffect) 4039 # after this tag, mechanisms are not by side-effect, so they'll4040 # 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. 4041 4139 if test "x$enable_dependency_tracking" = xyes; then 4042 4140 continue … … 4046 4144 ;; 4047 4145 msvc7 | msvc7msys | msvisualcpp | msvcmsys) 4048 # This compiler won't grok `-c -o', but also, the minuso test has4146 # This compiler won't grok '-c -o', but also, the minuso test has 4049 4147 # not run yet. These depmodes are late enough in the game, and 4050 4148 # so weak that their functioning should not be impacted. … … 4122 4220 test -z "$as_dir" && as_dir=. 4123 4221 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"; }; then4222 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 4125 4223 ac_cv_prog_CC="${ac_tool_prefix}gcc" 4126 4224 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 4162 4260 test -z "$as_dir" && as_dir=. 4163 4261 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"; }; then4262 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 4165 4263 ac_cv_prog_ac_ct_CC="gcc" 4166 4264 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 4215 4313 test -z "$as_dir" && as_dir=. 4216 4314 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"; }; then4315 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 4218 4316 ac_cv_prog_CC="${ac_tool_prefix}cc" 4219 4317 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 4256 4354 test -z "$as_dir" && as_dir=. 4257 4355 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"; }; then4356 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 4259 4357 if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then 4260 4358 ac_prog_rejected=yes … … 4314 4412 test -z "$as_dir" && as_dir=. 4315 4413 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"; }; then4414 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 4317 4415 ac_cv_prog_CC="$ac_tool_prefix$ac_prog" 4318 4416 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 4358 4456 test -z "$as_dir" && as_dir=. 4359 4457 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"; }; then4458 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 4361 4459 ac_cv_prog_ac_ct_CC="$ac_prog" 4362 4460 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 4554 4652 #include <stdarg.h> 4555 4653 #include <stdio.h> 4556 #include <sys/types.h> 4557 #include <sys/stat.h> 4654 struct stat; 4558 4655 /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ 4559 4656 struct buf { int x; }; … … 4640 4737 ac_compiler_gnu=$ac_cv_c_compiler_gnu 4641 4738 4739 ac_ext=c 4740 ac_cpp='$CPP $CPPFLAGS' 4741 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' 4742 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' 4743 ac_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; } 4746 if ${am_cv_prog_cc_c_o+:} false; then : 4747 $as_echo_n "(cached) " >&6 4748 else 4749 cat confdefs.h - <<_ACEOF >conftest.$ac_ext 4750 /* end confdefs.h. */ 4751 4752 int 4753 main () 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 4780 fi 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; } 4783 if 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" 4790 fi 4791 ac_ext=c 4792 ac_cpp='$CPP $CPPFLAGS' 4793 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' 4794 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' 4795 ac_compiler_gnu=$ac_cv_c_compiler_gnu 4796 4797 4642 4798 depcc="$CC" am_compiler_list= 4643 4799 … … 4651 4807 # making bogus files that we don't know about and never remove. For 4652 4808 # 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 output4654 # in D '.4809 # making a dummy file named 'D' -- because '-MD' means "put the output 4810 # in D". 4655 4811 rm -rf conftest.dir 4656 4812 mkdir conftest.dir … … 4687 4843 for i in 1 2 3 4 5 6; do 4688 4844 echo '#include "conftst'$i'.h"' >> sub/conftest.c 4689 # Using `: > sub/conftst$i.h'creates only sub/conftst1.h with4690 # Solaris 8's {/usr,}/bin/sh.4691 touchsub/conftst$i.h4845 # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with 4846 # Solaris 10 /bin/sh. 4847 echo '/* dummy */' > sub/conftst$i.h 4692 4848 done 4693 4849 echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf 4694 4850 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" 4696 4852 # mode. It turns out that the SunPro C++ compiler does not properly 4697 # handle `-M -o', and we need to detect this. Also, some Intel4698 # 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. 4699 4855 am__obj=sub/conftest.${OBJEXT-o} 4700 4856 am__minus_obj="-o $am__obj" … … 4705 4861 ;; 4706 4862 nosideeffect) 4707 # after this tag, mechanisms are not by side-effect, so they'll4708 # 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. 4709 4865 if test "x$enable_dependency_tracking" = xyes; then 4710 4866 continue … … 4714 4870 ;; 4715 4871 msvc7 | msvc7msys | msvisualcpp | msvcmsys) 4716 # This compiler won't grok `-c -o', but also, the minuso test has4872 # This compiler won't grok '-c -o', but also, the minuso test has 4717 4873 # not run yet. These depmodes are late enough in the game, and 4718 4874 # so weak that their functioning should not be impacted. … … 4786 4942 # making bogus files that we don't know about and never remove. For 4787 4943 # 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 output4789 # in D '.4944 # making a dummy file named 'D' -- because '-MD' means "put the output 4945 # in D". 4790 4946 rm -rf conftest.dir 4791 4947 mkdir conftest.dir … … 4820 4976 for i in 1 2 3 4 5 6; do 4821 4977 echo '#include "conftst'$i'.h"' >> sub/conftest.c 4822 # Using `: > sub/conftst$i.h'creates only sub/conftst1.h with4823 # Solaris 8's {/usr,}/bin/sh.4824 touchsub/conftst$i.h4978 # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with 4979 # Solaris 10 /bin/sh. 4980 echo '/* dummy */' > sub/conftst$i.h 4825 4981 done 4826 4982 echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf 4827 4983 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" 4829 4985 # mode. It turns out that the SunPro C++ compiler does not properly 4830 # handle `-M -o', and we need to detect this. Also, some Intel4831 # 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. 4832 4988 am__obj=sub/conftest.${OBJEXT-o} 4833 4989 am__minus_obj="-o $am__obj" … … 4838 4994 ;; 4839 4995 nosideeffect) 4840 # after this tag, mechanisms are not by side-effect, so they'll4841 # 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. 4842 4998 if test "x$enable_dependency_tracking" = xyes; then 4843 4999 continue … … 4847 5003 ;; 4848 5004 msvc7 | msvc7msys | msvisualcpp | msvcmsys) 4849 # This compiler won't grok `-c -o', but also, the minuso test has5005 # This compiler won't grok '-c -o', but also, the minuso test has 4850 5006 # not run yet. These depmodes are late enough in the game, and 4851 5007 # so weak that their functioning should not be impacted. … … 4901 5057 4902 5058 4903 if test "x$CC" != xcc; then4904 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&54905 $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; }4906 else4907 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&54908 $as_echo_n "checking whether cc understands -c and -o together... " >&6; }4909 fi4910 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) " >&64914 else4915 cat confdefs.h - <<_ACEOF >conftest.$ac_ext4916 /* end confdefs.h. */4917 4918 int4919 main ()4920 {4921 4922 ;4923 return 0;4924 }4925 _ACEOF4926 # Make sure it works both with $CC and with simple cc.4927 # We do the test twice because some compilers refuse to overwrite an4928 # 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" in4932 *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;4933 *) ac_try_echo=$ac_try;;4934 esac4935 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""4936 $as_echo "$ac_try_echo"; } >&54937 (eval "$ac_try") 2>&54938 ac_status=$?4939 $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&54940 test $ac_status = 0; } &&4941 test -f conftest2.$ac_objext && { { case "(($ac_try" in4942 *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;4943 *) ac_try_echo=$ac_try;;4944 esac4945 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""4946 $as_echo "$ac_try_echo"; } >&54947 (eval "$ac_try") 2>&54948 ac_status=$?4949 $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&54950 test $ac_status = 0; };4951 then4952 eval ac_cv_prog_cc_${ac_cc}_c_o=yes4953 if test "x$CC" != xcc; then4954 # Test first that cc exists at all.4955 if { ac_try='cc -c conftest.$ac_ext >&5'4956 { { case "(($ac_try" in4957 *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;4958 *) ac_try_echo=$ac_try;;4959 esac4960 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""4961 $as_echo "$ac_try_echo"; } >&54962 (eval "$ac_try") 2>&54963 ac_status=$?4964 $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&54965 test $ac_status = 0; }; }; then4966 ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'4967 rm -f conftest2.*4968 if { { case "(($ac_try" in4969 *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;4970 *) ac_try_echo=$ac_try;;4971 esac4972 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""4973 $as_echo "$ac_try_echo"; } >&54974 (eval "$ac_try") 2>&54975 ac_status=$?4976 $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&54977 test $ac_status = 0; } &&4978 test -f conftest2.$ac_objext && { { case "(($ac_try" in4979 *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;4980 *) ac_try_echo=$ac_try;;4981 esac4982 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""4983 $as_echo "$ac_try_echo"; } >&54984 (eval "$ac_try") 2>&54985 ac_status=$?4986 $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&54987 test $ac_status = 0; };4988 then4989 # cc works too.4990 :4991 else4992 # cc exists but doesn't like -o.4993 eval ac_cv_prog_cc_${ac_cc}_c_o=no4994 fi4995 fi4996 fi4997 else4998 eval ac_cv_prog_cc_${ac_cc}_c_o=no4999 fi5000 rm -f core conftest*5001 5002 fi5003 if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then5004 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&55005 $as_echo "yes" >&6; }5006 else5007 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&55008 $as_echo "no" >&6; }5009 5010 $as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h5011 5012 fi5013 5014 # FIXME: we rely on the cache variable name because5015 # there is no other way.5016 set dummy $CC5017 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_o5019 if test "$am_t" != yes; then5020 # 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 fi5027 5028 5059 # deprecated 5029 5060 # These are often not installed and people miss seeing the "no", so stop the configure. … … 5046 5077 test -z "$as_dir" && as_dir=. 5047 5078 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"; }; then5079 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 5049 5080 ac_cv_prog_YACC="$ac_prog" 5050 5081 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 5091 5122 test -z "$as_dir" && as_dir=. 5092 5123 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"; }; then5124 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 5094 5125 ac_cv_prog_LEX="$ac_prog" 5095 5126 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 5123 5154 c { yymore (); } 5124 5155 d { yyless (1); } 5125 e { yyless (input () != 0); } 5156 e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ 5157 yyless ((input () != 0)); } 5126 5158 f { unput (yytext[0]); } 5127 5159 . { BEGIN INITIAL; } … … 5281 5313 test -z "$as_dir" && as_dir=. 5282 5314 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"; }; then5315 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 5284 5316 ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" 5285 5317 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 5321 5353 test -z "$as_dir" && as_dir=. 5322 5354 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"; }; then5355 if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then 5324 5356 ac_cv_prog_ac_ct_RANLIB="ranlib" 5325 5357 $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 … … 5514 5546 for ac_exec_ext in '' $ac_executable_extensions; do 5515 5547 ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" 5516 { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; }|| continue5548 as_fn_executable_p "$ac_path_GREP" || continue 5517 5549 # Check for GNU ac_path_GREP and select it if it is found. 5518 5550 # Check for GNU $ac_path_GREP … … 5580 5612 for ac_exec_ext in '' $ac_executable_extensions; do 5581 5613 ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" 5582 { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; }|| continue5614 as_fn_executable_p "$ac_path_EGREP" || continue 5583 5615 # Check for GNU ac_path_EGREP and select it if it is found. 5584 5616 # Check for GNU $ac_path_EGREP … … 5919 5951 $ac_includes_default 5920 5952 int 5921 find_stack_direction ( )5953 find_stack_direction (int *addr, int depth) 5922 5954 { 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; 5932 5961 } 5933 5962 5934 5963 int 5935 main ( )5964 main (int argc, char **argv) 5936 5965 { 5937 return find_stack_direction ( ) < 0;5966 return find_stack_direction (0, argc + !argv + 20) < 0; 5938 5967 } 5939 5968 _ACEOF … … 5980 6009 /* end confdefs.h. */ 5981 6010 5982 #include <stdbool.h>5983 #ifndef bool5984 "error: bool is not defined"5985 #endif5986 #ifndef false5987 "error: false is not defined"5988 #endif5989 #if false5990 "error: false is not 0"5991 #endif5992 #ifndef true5993 "error: true is not defined"5994 #endif5995 #if true != 15996 "error: true is not 1"5997 #endif5998 #ifndef __bool_true_false_are_defined5999 "error: __bool_true_false_are_defined is not defined"6000 #endif6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 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; 6025 6054 6026 6055 int … … 6028 6057 { 6029 6058 6030 6031 6032 6033 6034 6035 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); 6036 6065 6037 6066 ; … … 6048 6077 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 6049 6078 $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" 6051 6080 if test "x$ac_cv_type__Bool" = xyes; then : 6052 6081 … … 6057 6086 6058 6087 fi 6088 6059 6089 6060 6090 if test $ac_cv_header_stdbool_h = yes; then … … 6251 6281 6252 6282 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 "6283 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 tools/prettyprinter/Makefile" 6254 6284 6255 6285 … … 6363 6393 6364 6394 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; } 6365 6403 if test -n "$EXEEXT"; then 6366 6404 am__EXEEXT_TRUE= … … 6705 6743 # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. 6706 6744 # 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'. 6708 6746 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' 6710 6748 elif ln conf$$.file conf$$ 2>/dev/null; then 6711 6749 as_ln_s=ln 6712 6750 else 6713 as_ln_s='cp -p '6751 as_ln_s='cp -pR' 6714 6752 fi 6715 6753 else 6716 as_ln_s='cp -p '6754 as_ln_s='cp -pR' 6717 6755 fi 6718 6756 rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file … … 6774 6812 fi 6775 6813 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. 6818 as_fn_executable_p () 6819 { 6820 test -f "$1" && test -x "$1" 6821 } # as_fn_executable_p 6822 as_test_x='test -x' 6823 as_executable_p=as_fn_executable_p 6798 6824 6799 6825 # Sed expression to map a string onto a valid CPP name. … … 6817 6843 ac_log=" 6818 6844 This file was extended by cfa-cc $as_me 1.0.0.0, which was 6819 generated by GNU Autoconf 2.6 8. Invocation command line was6845 generated by GNU Autoconf 2.69. Invocation command line was 6820 6846 6821 6847 CONFIG_FILES = $CONFIG_FILES … … 6883 6909 ac_cs_version="\\ 6884 6910 cfa-cc config.status 1.0.0.0 6885 configured by $0, generated by GNU Autoconf 2.6 8,6911 configured by $0, generated by GNU Autoconf 2.69, 6886 6912 with options \\"\$ac_cs_config\\" 6887 6913 6888 Copyright (C) 201 0Free Software Foundation, Inc.6914 Copyright (C) 2012 Free Software Foundation, Inc. 6889 6915 This config.status script is free software; the Free Software Foundation 6890 6916 gives unlimited permission to copy, distribute and modify it." … … 6977 7003 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 6978 7004 if \$ac_cs_recheck; then 6979 set X '$SHELL''$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion7005 set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion 6980 7006 shift 6981 7007 \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 … … 7022 7048 "src/prelude/Makefile") CONFIG_FILES="$CONFIG_FILES src/prelude/Makefile" ;; 7023 7049 "src/libcfa/Makefile") CONFIG_FILES="$CONFIG_FILES src/libcfa/Makefile" ;; 7050 "tools/prettyprinter/Makefile") CONFIG_FILES="$CONFIG_FILES tools/prettyprinter/Makefile" ;; 7024 7051 7025 7052 *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; … … 7618 7645 case $ac_file$ac_mode in 7619 7646 "depfiles":C) test x"$AMDEP_TRUE" != x"" || { 7620 # Autoconf 2.62quotes --file arguments for eval, but not when files7647 # Older Autoconf quotes --file arguments for eval, but not when files 7621 7648 # are listed without --file. Let's play safe and only enable the eval 7622 7649 # if we detect the quoting. … … 7631 7658 mf=`echo "$mf" | sed -e 's/:.*$//'` 7632 7659 # Check whether this is an Automake generated Makefile or not. 7633 # We used to match only the files named `Makefile.in', but7660 # We used to match only the files named 'Makefile.in', but 7634 7661 # some people rename them; so instead we look at the file content. 7635 7662 # Grep'ing the first line is not enough: some people post-process … … 7665 7692 fi 7666 7693 # Extract the definition of DEPDIR, am__include, and am__quote 7667 # from the Makefile without running `make'.7694 # from the Makefile without running 'make'. 7668 7695 DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` 7669 7696 test -z "$DEPDIR" && continue 7670 7697 am__include=`sed -n 's/^am__include = //p' < "$mf"` 7671 test -z " am__include" && continue7698 test -z "$am__include" && continue 7672 7699 am__quote=`sed -n 's/^am__quote = //p' < "$mf"` 7673 # When using ansi2knr, U may be empty or an underscore; expand it7674 U=`sed -n 's/^U = //p' < "$mf"`7675 7700 # Find all dependency output files, they are included files with 7676 7701 # $(DEPDIR) in their names. We invoke sed twice because it is the … … 7679 7704 for file in `sed -n " 7680 7705 s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ 7681 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do7706 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do 7682 7707 # Make sure the directory exists. 7683 7708 test -f "$dirpart/$file" && continue -
configure.ac
rfea3faa rb826e6b 9 9 AM_SILENT_RULES([no]) 10 10 11 AM_INIT_AUTOMAKE 11 AM_INIT_AUTOMAKE([subdir-objects]) 12 12 AM_MAINTAINER_MODE(enable) # may require auto* software to be installed 13 13 … … 167 167 AC_SUBST([MACHINE_TYPE],[$host_cpu]) 168 168 169 if ! test "$host_cpu" = "$build_cpu"; then 169 if ! test "$host_cpu" = "$build_cpu"; then 170 170 case $host_cpu in 171 171 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 " 176 176 ;; 177 177 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 " 182 182 ;; 183 183 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 " 188 188 ;; 189 189 esac … … 238 238 src/prelude/Makefile 239 239 src/libcfa/Makefile 240 tools/prettyprinter/Makefile 240 241 ]) 241 242 -
doc/LaTeXmacros/common.tex
rfea3faa rb826e6b 11 11 %% Created On : Sat Apr 9 10:06:17 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Sun Jun 18 20:32:32201714 %% Update Count : 3 1913 %% Last Modified On : Mon Jul 17 10:21:17 2017 14 %% Update Count : 348 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 36 36 % Names used in the document. 37 37 38 \newcommand{\CFAIcon}{\text rm{C}\raisebox{\depth}{\rotatebox{180}{\textsf{A}}}\xspace} % Cforall symbolic name38 \newcommand{\CFAIcon}{\textsf{C}\raisebox{\depth}{\rotatebox{180}{\textsf{A}}}\xspace} % Cforall symbolic name 39 39 \newcommand{\CFA}{\protect\CFAIcon} % safe for section/caption 40 40 \newcommand{\CFL}{\textrm{Cforall}\xspace} % Cforall symbolic name … … 55 55 \setlength{\parindentlnth}{\parindent} 56 56 57 \newcommand{\LstKeywordStyle}[1]{{\lst@basicstyle{\lst@keywordstyle{#1}}}} 58 \newcommand{\LstCommentStyle}[1]{{\lst@basicstyle{\lst@commentstyle{#1}}}} 59 57 60 \newlength{\gcolumnposn} % temporary hack because lstlisting does not handle tabs correctly 58 61 \newlength{\columnposn} 59 62 \setlength{\gcolumnposn}{2.5in} 60 63 \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}}}} 62 65 \newcommand{\CRT}{\global\columnposn=\gcolumnposn} 63 66 … … 131 134 132 135 % 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$}} 134 137 % code index (cannot use ©) 135 \newcommand{\indexc}[ 1]{\index{#1@\lstinline$#1$}}138 \newcommand{\indexc}[2][\@empty]{\index{#2@\lstinline[#1]$#2$}} 136 139 137 140 % Denote newterms in particular font and index them without particular font and in lowercase, e.g., \newterm{abc}. … … 231 234 basicstyle=\linespread{0.9}\sf, % reduce line spacing and use sanserif font 232 235 stringstyle=\tt, % use typewriter font 233 tabsize= 4, % 4space tabbing236 tabsize=6, % N space tabbing 234 237 xleftmargin=\parindentlnth, % indent code to paragraph indentation 235 238 extendedchars=true, % allow ASCII characters in the range 128-255 -
doc/LaTeXmacros/lstlang.sty
rfea3faa rb826e6b 8 8 %% Created On : Sat May 13 16:34:42 2017 9 9 %% Last Modified By : Peter A. Buhr 10 %% Last Modified On : Fri May 26 12:47:09 201711 %% Update Count : 810 %% Last Modified On : Wed Jul 12 22:42:09 2017 11 %% Update Count : 12 12 12 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13 13 … … 112 112 finally, forall, ftype, _Generic, _Imaginary, inline, __label__, lvalue, _Noreturn, one_t, 113 113 otype, restrict, _Static_assert, throw, throwResume, trait, try, ttype, typeof, __typeof, 114 __typeof__, zero_t},114 __typeof__, with, zero_t}, 115 115 morekeywords=[2]{ 116 116 _Atomic, coroutine, is_coroutine, is_monitor, is_thread, monitor, mutex, nomutex, 117 117 resume, suspend, thread, _Thread_local, yield}, 118 moredirectives={defined,include_next}% 118 119 } 120 121 % C++ programming language 122 \lstdefinelanguage{C++}[ANSI]{C++}{} 119 123 120 124 % uC++ programming language, based on ANSI C++ -
doc/bibliography/cfa.bib
rfea3faa rb826e6b 2273 2273 @manual{JavaScript, 2274 2274 keywords = {JavaScript}, 2275 contributer = {pabuhr },2275 contributer = {pabuhr@plg}, 2276 2276 title = {ECMAScript 2015 Language Specification {JavaScript}}, 2277 2277 organization= {ECAM International}, … … 2446 2446 @manual{Erlang, 2447 2447 keywords = {Erlang}, 2448 contributer = {pabuhr },2448 contributer = {pabuhr@plg}, 2449 2449 title = {Erlang Reference Manual User's Guide, Vertion 7.0}, 2450 2450 organization= {Erlang/OTP System Documentation}, … … 2771 2771 publisher = {ACM}, 2772 2772 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}, 2773 2786 } 2774 2787 … … 5052 5065 contributer = {pabuhr@plg}, 5053 5066 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}, 5055 5068 publisher = {Springer--Verlag}, 5056 year = 19 85,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} 5059 5072 } 5060 5073 -
doc/generic_types/mail
rfea3faa rb826e6b 78 78 79 79 - OOPSLA'17 Submissions 80 81 82 83 From: "OOPSLA'17 HotCRP" <noreply@oopsla17.hotcrp.com> 84 Subject: [OOPSLA'17] Paper #20 "Generic and Tuple Types with Efficient..." 85 To: Peter Buhr <pabuhr@uwaterloo.ca> 86 Cc: jonathan.aldrich@cs.cmu.edu 87 Reply-To: jonathan.aldrich@cs.cmu.edu 88 Date: Wed, 7 Jun 2017 13:33:40 +0000 (UTC) 89 90 Dear Peter Buhr, 91 92 The author response period for OOPSLA has started, and will continue until 93 the end of June 10th (Anywhere on Earth). No email with a snapshot of your 94 reviews will be sent: you can see the live version of reviews (including 95 current updates) on the HotCRP system (links at the bottom). 96 97 An 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 102 designated "Questions for Author Response" entry of a review. 103 104 Please keep in mind that an author response is *not* a "rebuttal". You are 105 not rebutting an opponent's arguments with your own, in front of an 106 audience that weighs both sets of arguments. Instead, your audience is the 107 same reviewers who offered the comments in the first place, and their 108 subjective weighing of different factors is very unlikely to change. 109 110 During author response, please keep in mind that the reviewers are still 111 unaware of author identity. If you need to refer to author-identifying 112 information during your response, the ideal course of action is to place it 113 at an external location and include a URL, with an explicit warning (e.g., 114 "WARNING: following this link will reveal author identity"). 115 116 As with all external resources, your response should be self-contained, 117 without consulting them. That is, the author-visible external URL is just 118 evidence, but the claim that this evidence supports should be clear in the 119 response text. For instance: 120 "we have received public feedback from the developers of X that confirm the 121 issue [supporting URL] (WARNING: following this link will reveal author 122 identity)" 123 124 Your 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 129 Use the link below to sign in to the site. 130 131 https://oopsla17.hotcrp.com/?email=pabuhr%40uwaterloo.ca 132 133 Please contact me <jonathan.aldrich@cs.cmu.edu> with any questions or 134 concerns. 135 136 Best Regards and wishes for a constructive response, 137 138 Jonathan Aldrich 139 140 141 142 From: "OOPSLA'17 HotCRP" <noreply@oopsla17.hotcrp.com> 143 Subject: [OOPSLA'17] Paper #20 "Generic and Tuple Types with Efficient..." 144 To: Peter Buhr <pabuhr@uwaterloo.ca> 145 Cc: jonathan.aldrich@cs.cmu.edu 146 Reply-To: jonathan.aldrich@cs.cmu.edu 147 Date: Tue, 20 Jun 2017 00:33:10 +0000 (UTC) 148 149 Dear Peter Buhr, 150 151 I regret to inform you that your submission to OOPSLA'17 listed below has not 152 been selected for the second phase of the review process. I understand this is 153 not welcome news but selection was very competitive: 157 of the 223 papers 154 submitted did not advance to the second phase. For several of these, there was 155 a clear impression that in the future they can evolve into some of the 156 strongest 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 162 Below you will find reviews, as well as author-visible comments--the latter may 163 include further communication. I hope you will find the reviewers' feedback 164 useful. 165 166 Best Regards, 167 168 - Jonathan Aldrich <jonathan.aldrich@cs.cmu.edu>, for OOPSLA 2017 169 Submissions 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 185 This 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 189 This 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 191 Unfortunately, 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 193 The 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 195 There 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 197 I 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 199 It is not obvious that type inference here always converges. An outline of the algorithm would be useful. 200 201 Above all, this needs experience results from a more complete implementation. 202 203 Details: 204 205 Relying 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 207 The 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 213 How 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 226 The 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 230 The 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 232 While 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 236 There 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 240 The 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 242 A 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 244 However, 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 246 Finally, 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 251 The 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 253 The 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 267 The paper presents two language features of "Cforall": generics and tuples. 268 269 ===== Comments for author ===== 270 271 The 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 273 Comparison with C++: 274 The 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 ...). 275 Now, when doing system programming, one needs very fine grain control over the resources: memory layout, etc ... 276 It 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. 277 The authors need to better justify the runtime overhead, or give escape hatches for those who don't want to pay that cost at runtime. 278 They 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 280 About Tuples: 281 The section about tuples is too long. I would have spent more time explaining generics. 282 283 Feedback: 284 "This installation base" 285 Unclear what you mean by that. 286 287 "Prior projects ... but failed ..." 288 Hummm ... What about C++. 289 290 "... object-oriented or functional programming with garbage collection ..." 291 You are really mixing apples and oranges here. Many C programmers have nothing agains object-oriented features, not even functional programming (C++ 11 adds 292 a 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 ..." 295 This sentence feels like it is coming out of nowhere. 296 297 "... the polymorphic runtime-cost ..." 298 Is 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 299 the 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 ..." 302 That cannot be true in general. Malloc produces a pointer (of any type), given an integer (the size). 303 It looks like Cforall is assuming that the integer is the result of a call to sizeof (a good practice in C). 304 However, if that's the case, it should be explained. 305 306 "... allows variable overloading ..." 307 How are conflict resolved? In other words, what happens when two variables could be used? 308 309 "... reuses the generated structure declarations where appropriate." 310 This is too vague. 311 312 "... have multiple outcomes, some exceptional." 313 Humm, 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 314 return one or multiple values or throw an exception. Not that some of the values returned are "exceptional". 315 316 "The type-resolver ..." 317 What's that? Type-checker? Type-inference? 318 319 "... applies C conversions." 320 Noooo! That's exactly what leads to very subtle bugs. Is there any way to stop those conversions from happening? 321 322 "The minimal cost ..." 323 In what regard? Runtime cost? How does the "resolver" know how expensive the conversions are? 324 325 "z = 10 // mass assignments" 326 That stuff is completely unreadable. Why not introduce a new operator? 327 328 "... roughly equivalent time ..." 329 Well, C++ looks faster to me. 330 331 "... is restricted because the resolution does not using ..." 332 Did you mean, does not use? 333 334 "... D and go are garbage collected ..." 335 Yes, but in D, the use of the GC is optional. 336 337 "... while respecting the talent and skill of C programmers." 338 Are you implying that other approaches are not? 339 340 "On the surface, the project may appear as a rehash of similar mechanisms in C++." 341 Absolutely. 342 343 "... integration with C and its programmers ..." 344 Bold 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 ..." 347 This should have been mentioned sooner. Plus conflating inlining and specialization is unfortunate. 348 Does "inline" also inline the function? Or does it only specialize the code? 349 If it also inline, that's a very unfortunate design. I might want to specialize the code, but without inlining ... 350 How do I specialize a recursive function? -
doc/proposals/references.md
rfea3faa rb826e6b 17 17 derived rvalue types such as pointer types may include qualifiers; 18 18 `const int *` is a distinct type from `int *`, though the latter is safely 19 convert able to the former.19 convertible to the former. 20 20 In general, any number of qualifiers can be safely added to the 21 21 pointed-to-type of a pointer type, e.g. `int *` converts safely to … … 23 23 `const volatile int *`. 24 24 25 Since lvalues are preci cely "addressable objects", in C, only lvalues can be25 Since lvalues are precisely "addressable objects", in C, only lvalues can be 26 26 used as the operand of the `&` address-of operator. 27 27 Similarly, only modifiable lvalues may be used as the assigned-to … … 147 147 call "lvalue of type `T`" as `T&`. 148 148 There's also an obvious argument that lvalues of a (possibly-qualified) type 149 `T` should be convert able to references of type `T`, where `T` is also149 `T` should be convertible to references of type `T`, where `T` is also 150 150 so-qualified (e.g. lvalue `int` to `int&`, lvalue `const char` to 151 151 `const char&`). 152 152 By similar arguments to pointer types, qualifiers should be addable to the 153 153 referred-to type of a reference (e.g. `int&` to `const int&`). 154 As a note, since pointer arithmetic is explic tly not defined on `T&`,154 As a note, since pointer arithmetic is explicitly not defined on `T&`, 155 155 `restrict T&` should be allowable and would have alias-analysis rules that 156 156 are actually comprehensible to mere mortals. -
doc/proposals/tagged-struct.txt
rfea3faa rb826e6b 71 71 should be possible to do during linking. 72 72 73 If a generic/polymorphic type is tagged its tagged would then be shared 74 between all applications of that generic. Internal tags could be used to 75 seperate these structures again, however it seems in most cases simply using 76 the existing type parameters should provide the needed information. 77 73 78 74 79 Traits: … … 102 107 To allow for growth each option would have to be a structure itself. 103 108 104 Which brings us to "tagge tstruct union", ie. a union of tagged structures109 Which brings us to "tagged struct union", ie. a union of tagged structures 105 110 as opposed to tagging the union itself. This extention acts as a constraint. 106 111 If 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. 112 possible values of the union must be of that tagged type or a child type. If 113 the tagged type is omitted then they must all be tagged but of any tagged 114 type. 115 116 As a short cut union_instance->type might get the type object of the loaded 117 value. It should always be the same operation regardless so it saves 118 abritarly picking a branch of the union to get the type object. 108 119 109 120 110 Custom Type Objects (Extention):121 Type Objects Fields (Extention): 111 122 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. 123 Adding fields to the type object allows data to be shared between instances 124 of the same type. Such behaviour could be mimiced by creating a lookup 125 function on the type object pointer, but this may be cleaner and more 126 efficient. 115 127 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.) 128 The type object fields follow similar rules to the fields on the tagged 129 objects themselves, they must be additive. So any fields present on a 130 type object will be present (and in the same place) on all of its children. 118 131 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. 132 This does mean that many type object structure types will have to be auto 133 generated, and traversing up the tree might get a little wierd. That could 134 be symplified by only allowing the root type to specify fields on the type 135 object, so that the type object is consistant throughout that particular tree. 136 And hence the type_object pointers would also be consistant as the type they 137 point to would never change. 138 139 struct Example tagged { 140 tagged char const * const type_name = "Example"; 141 int data; 142 }; 143 144 Creates a tagged structure that has no parent, stores an integer and the type 145 object also has an extra field that stores a string on the type object. 146 This can be accessed by using member access on the type object, as a regular 147 structure. 148 149 Type object fields will have to allow initialization on their declaration, 150 and declarations of children as well, as they are not assotiated with the 151 later instances of the tagged structure. 152 153 ... 154 tagged void (*dtor)(tagged Example * this); 155 ... 156 157 Sub-Extention, not sure how it would work but some way to have a "dynamic" 158 field that is considered the type of the current tagged struct might be useful 159 for things like specifying a deconstructor. In this case, the following code 160 will clean up any child type of Example: 161 162 Example * ex = get_some_example(); 163 ex->type->dtor(ex); -
doc/user/Makefile
rfea3faa rb826e6b 1 1 ## Define the appropriate configuration variables. 2 2 3 TeXLIB = .:../LaTeXmacros:../ LaTeXmacros/listings:../LaTeXmacros/enumitem:../bibliography/:3 TeXLIB = .:../LaTeXmacros:../bibliography/: 4 4 LaTeX = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex -halt-on-error 5 5 BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex … … 12 12 13 13 FIGURES = ${addsuffix .tex, \ 14 EHMHierarchy \ 14 15 Cdecl \ 15 16 pointer1 \ -
doc/user/user.tex
rfea3faa rb826e6b 11 11 %% Created On : Wed Apr 6 14:53:29 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Fri Jun 16 12:00:01201714 %% Update Count : 2 43313 %% Last Modified On : Mon Jul 17 13:06:40 2017 14 %% Update Count : 2825 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 25 25 \usepackage{textcomp} 26 26 \usepackage[latin1]{inputenc} 27 % Default underscore is too low and wide. Cannot use lstlisting "literate" as replacing underscore28 % removes it as a variable-name character so keyworks in variables are highlighted29 \DeclareTextCommandDefault{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}30 31 27 32 28 \usepackage{fullpage,times,comment} … … 48 44 \renewcommand{\UrlFont}{\small\sf} 49 45 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 50 52 \setlength{\topmargin}{-0.45in} % move running title into header 51 53 \setlength{\headsep}{0.25in} … … 54 56 55 57 \CFAStyle % use default CFA format-style 58 59 \lstnewenvironment{C++}[1][] 60 {\lstset{language=C++,moredelim=**[is][\protect\color{red}]{®}{®}#1}} 61 {} 56 62 57 63 % inline code ©...© (copyright symbol) emacs: C-q M-) … … 110 116 \renewcommand{\subsectionmark}[1]{\markboth{\thesubsection\quad #1}{\thesubsection\quad #1}} 111 117 \pagenumbering{roman} 112 %\linenumbers % comment out to turn off line numbering118 \linenumbers % comment out to turn off line numbering 113 119 114 120 \maketitle … … 135 141 136 142 \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.143 The syntax of \CFA builds from C and should look immediately familiar to C/\Index*[C++]{\CC{}} programmers. 138 144 % 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 Cperformance.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. 146 Like 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. 141 147 The primary new features include parametric-polymorphic routines and types, exceptions, concurrency, and modules. 142 148 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. 149 One 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''. 150 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. 151 A 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. 152 There is no notion or requirement for \emph{rewriting} a legacy C program in \CFA; 153 instead, a programmer evolves a legacy program into \CFA by incrementally incorporating \CFA features. 154 As 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. 157 However, \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. 150 158 In contrast, \CFA has 30 years of hindsight and a clean starting point. 151 159 … … 154 162 \begin{quote2} 155 163 \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} 167 166 #include <stdio.h>§\indexc{stdio.h}§ 168 167 … … 171 170 ®printf( "%d %d %d\n", x, y, z );® 172 171 } 173 \end{ lstlisting}172 \end{cfa} 174 173 & 175 \begin{lstlisting} 174 \begin{cfa} 175 #include <fstream>§\indexc{fstream}§ 176 177 int 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} 176 184 #include <iostream>§\indexc{iostream}§ 177 185 using namespace std; … … 180 188 ®cout<<x<<" "<<y<<" "<<z<<endl;® 181 189 } 182 \end{ lstlisting}190 \end{cfa} 183 191 \end{tabular} 184 192 \end{quote2} 185 193 While 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}). 186 194 195 \subsection{Background} 196 187 197 This document is a programmer reference-manual for the \CFA programming language. 188 198 The manual covers the core features of the language and runtime-system, with simple examples illustrating syntax and semantics of each feature. 189 199 The 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 mayrefer to the \CFA Programming Language Specification for details about the language syntax and semantics.200 A reader should already have an intermediate knowledge of control flow, data structures, and concurrency issues to understand the ideas presented, as well as some experience programming in C/\CC. 201 Implementers should refer to the \CFA Programming Language Specification for details about the language syntax and semantics. 192 202 Changes to the syntax and additional features are expected to be included in later revisions. 193 203 … … 198 208 This installation base and the programmers producing it represent a massive software-engineering investment spanning decades and likely to continue for decades more. 199 209 Even 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 thelanguage of choice.210 For system programming, where direct access to hardware, storage management, and real-time issues are a requirement, C is usually the only language of choice. 201 211 The 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. 202 212 As well, for 30 years, C has been the number 1 and 2 most popular programming language: … … 214 224 \end{center} 215 225 Hence, 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 sitappeal is not diminishing.217 Unfortunately, C has too many problems and omissions to make it anacceptable programming language for modern needs.218 219 As stated, the goal of the \CFA project is to engineer modern language 226 Love it or hate it, C has been an important and influential part of computer science for 40 years and its appeal is not diminishing. 227 Unfortunately, C has many problems and omissions that make it an unacceptable programming language for modern needs. 228 229 As stated, the goal of the \CFA project is to engineer modern language-features into C in an evolutionary rather than revolutionary way. 220 230 \CC~\cite{C++14,C++} is an example of a similar project; 221 however, it largely extended the language, and did not address manyexisting problems.\footnote{%231 however, it largely extended the C language, and did not address most of C's existing problems.\footnote{% 222 232 Two 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 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. 224 234 \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 ofgarbage collection.235 These 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. 226 236 As 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 anew programming language.228 229 The result of this project is a language that is largely backwards compatible with \Index*[C11]{\Celeven{}}~\cite{C11}, but fix ing some of the well known C problems and containing many modern languagefeatures.237 These 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 239 The 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. 230 240 Without significant extension to the C programming language, it is becoming unable to cope with the needs of modern programming problems and programmers; 231 241 as a result, it will fade into disuse. 232 242 Considering 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 234 While some may argue that modern language 243 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. 244 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. 235 245 236 246 237 247 \section{History} 238 248 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.249 The \CFA project started with \Index*{K-W C}~\cite{Buhr94a,Till89}, which extended C with new declaration syntax, multiple return values from routines, and advanced assignment capabilities using the notion of tuples. 240 250 (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): 251 The first \CFA implementation of these extensions was by Esteves~\cite{Esteves04}. 252 253 The signature feature of \CFA is \Index{overload}able \Index{parametric-polymorphic} functions~\cite{forceone:impl,Cormack90,Duggan96} with functions generalized using a ©forall© clause (giving the language its name): 243 254 \begin{lstlisting} 244 255 ®forall( otype T )® T identity( T val ) { return val; } … … 248 259 \CFA{}\hspace{1pt}'s polymorphism was originally formalized by Ditchfiled~\cite{Ditchfield92}, and first implemented by Bilson~\cite{Bilson03}. 249 260 However, 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.261 As the saying goes, ``\Index*{What goes around, comes around.}'', and there is now renewed interest in the C programming language because of legacy code-bases, so the \CFA project has been restarted. 251 262 252 263 … … 255 266 256 267 \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.268 The 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. 258 269 This feature allows \CFA programmers to take advantage of the existing panoply of C libraries to access thousands of external software features. 259 270 Language developers often state that adequate \Index{library support} takes more work than designing and implementing the language itself. 260 271 Fortunately, \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 withlittle cost.272 Hence, \CFA begins by leveraging the large repository of C libraries at little cost. 262 273 263 274 \begin{comment} … … 302 313 \end{comment} 303 314 304 However, it is necessary to differentiate between C and \CFA code because of name overloading, as for \CC.315 However, it is necessary to differentiate between C and \CFA code because of name \Index{overload}ing, as for \CC. 305 316 For 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 commonname ©abs©:317 Whereas, \CFA wraps each of these routines into ones with the overloaded name ©abs©: 307 318 \begin{cfa} 308 319 char abs( char ); … … 324 335 Hence, 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. 325 336 There 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}.337 This example strongly illustrates a core idea in \CFA: \emph{the \Index{power of a name}}. 327 338 The 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 besufficient 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 shouldnot be underestimated.330 331 332 \section[Compiling CFA Program]{Compiling\CFA Program}339 Hence, knowing the name ©abs© is sufficient to apply it to any type where it is applicable. 340 The 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} 333 344 334 345 The command ©cfa© is used to compile \CFA program(s), and is based on the GNU \Indexc{gcc} command, \eg: 335 346 \begin{cfa} 336 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA §-files [ assembler/loader-files ]347 cfa§\indexc{cfa}\index{compilation!cfa@©cfa©}§ [ gcc-options ] C/§\CFA{}§-files [ assembler/loader-files ] 337 348 \end{cfa} 338 349 \CFA programs having the following ©gcc© flags turned on: … … 342 353 The 1999 C standard plus GNU extensions. 343 354 \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$}} 346 356 Use the traditional GNU semantics for inline routines in C99 mode, which allows inline routines in header files. 347 }%348 357 \end{description} 349 358 The following new \CFA options are available: … … 357 366 \Indexc{-debug}\index{compilation option!-debug@©-debug©} 358 367 The 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.368 The debug version performs runtime checks to help during the debugging phase of a \CFA program, but can substantially slow program execution. 360 369 The runtime checks should only be removed after the program is completely debugged. 361 370 \textbf{This option is the default.} … … 413 422 \end{description} 414 423 These preprocessor variables allow conditional compilation of programs that must work differently in these situations. 415 For example, to toggle between C and \CFA extensions, us ingthe following:424 For example, to toggle between C and \CFA extensions, use the following: 416 425 \begin{cfa} 417 426 #ifndef __CFORALL__ … … 424 433 425 434 426 \section{Constant sUnderscores}427 428 Numeric constants are extended to allow \Index{underscore}s within constants\index{constant!underscore}, \eg:435 \section{Constant Underscores} 436 437 Numeric constants are extended to allow \Index{underscore}s\index{constant!underscore}, \eg: 429 438 \begin{cfa} 430 439 2®_®147®_®483®_®648; §\C{// decimal constant}§ … … 439 448 L®_®§"\texttt{\textbackslash{x}}§®_®§\texttt{ff}§®_®§\texttt{ee}"§; §\C{// wide character constant}§ 440 449 \end{cfa} 441 The rules for placement of underscores is as follows:442 \begin{enumerate} 450 The rules for placement of underscores are: 451 \begin{enumerate}[topsep=5pt,itemsep=5pt,parsep=0pt] 443 452 \item 444 453 A sequence of underscores is disallowed, \eg ©12__34© is invalid. … … 461 470 \label{s:BackquoteIdentifiers} 462 471 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. 473 Keyword clashes are accommodated by syntactic transformations using the \CFA backquote escape-mechanism: 464 474 \begin{cfa} 465 475 int ®`®otype®`® = 3; §\C{// make keyword an identifier}§ … … 467 477 \end{cfa} 468 478 Existing 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©: 470 480 471 481 \begin{figure} … … 475 485 #define otype ®`®otype®`® §\C{// make keyword an identifier}§ 476 486 #define __CFA_BFD_H__ 477 #endif // ! otype478 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 ® 481 491 #if defined( otype ) && defined( __CFA_BFD_H__ ) §\C{// reset only if set}§ 482 492 #undef otype 483 493 #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} 488 498 \end{figure} 489 499 490 500 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 503 C, \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$. 505 The 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 507 As for \Index{division}, there are exponentiation operators for integral and floating-point types, including the builtin \Index{complex} types. 508 Unsigned integral exponentiation\index{exponentiation!unsigned integral} is performed with repeated multiplication (or shifting if the base is 2). 509 Signed integral exponentiation\index{exponentiation!signed integral} is performed with repeated multiplication (or shifting if the base is 2), but yields a floating-point result because $b^{-e}=1/b^e$. 510 Hence, it is important to designate exponent integral-constants as unsigned or signed: ©3 \ 3u© return an integral result, while ©3 \ 3© returns a floating-point result. 511 Floating-point exponentiation\index{exponentiation!floating point} is performed using \Index{logarithm}s\index{exponentiation!logarithm}, so the base cannot be negative. 512 \begin{cfa} 513 sout | 2 ®\® 8u | 4 ®\® 3u | -4 ®\® 3u | 4 ®\® -3 | -4 ®\® -3 | 4.0 ®\® 2.1 | (1.0f+2.0fi) ®\® (3.0f+2.0fi) | endl; 514 256 64 -64 0.015625 -0.015625 18.3791736799526 0.264715-1.1922i 515 \end{cfa} 516 Parenthesis are necessary for the complex constants or the expresion is parsed as ©1.0f+(2.0fi \ 3.0f)+2.0fi©. 517 The 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}} 1963 521 1964 522 While C provides ©continue© and ©break© statements for altering control flow, both are restricted to one level of nesting for a particular control structure. 1965 523 Unfortunately, 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}.524 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}. 1967 525 For both ©continue© and ©break©, the target label must be directly associated with a ©for©, ©while© or ©do© statement; 1968 526 for ©break©, the target label can also be associated with a ©switch©, ©if© or compound (©{}©) statement. 1969 527 \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©. 1970 528 The innermost loop has 7 exit points, which cause resumption or termination of one or more of the 7 \Index{nested control-structure}s. 529 Java supports both labelled ©continue© and ©break© statements. 1971 530 1972 531 \begin{figure} … … 2091 650 2092 651 2093 \section{ Switch Statement}652 \section{\texorpdfstring{\LstKeywordStyle{switch} Statement}{switch Statement}} 2094 653 2095 654 C allows a number of questionable forms for the ©switch© statement: … … 2132 691 ®// open input file 2133 692 ®} else if ( argc == 2 ) { 2134 ®// open input file 693 ®// open input file (duplicate) 2135 694 2136 695 ®} else { … … 2145 704 \begin{cfa} 2146 705 switch ( i ) { 2147 case 1: case 3: case 5:// odd values2148 // sameaction706 ®case 1: case 3: case 5:® // odd values 707 // odd action 2149 708 break; 2150 case 2: case 4: case 6:// even values2151 // sameaction709 ®case 2: case 4: case 6:® // even values 710 // even action 2152 711 break; 2153 712 } … … 2155 714 However, this situation is handled in other languages without fall-through by allowing a list of case values. 2156 715 While 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 forgetthe ©break© statement at the end of a ©case© clause, resulting in inadvertent fall-through.716 Hence, 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. 2158 717 2159 718 \item … … 2239 798 and 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. 2240 799 \end{itemize} 2241 These observations help to put the \CFA changes to the ©switch© into perspective.800 These observations put into perspective the \CFA changes to the ©switch©. 2242 801 \begin{enumerate} 2243 802 \item … … 2249 808 still works. 2250 809 Nevertheless, 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.:810 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©, \eg: 2252 811 \begin{cfa} 2253 812 ®choose® ( i ) { … … 2260 819 case 7: 2261 820 ... 2262 ®break® §\C{// explicit end of switch}§821 ®break® §\C{// redundant explicit end of switch}§ 2263 822 default: 2264 823 j = 3; … … 2266 825 \end{cfa} 2267 826 Like the ©switch© statement, the ©choose© statement retains the fall-through semantics for a list of ©case© clauses; 2268 theimplicit ©break© is applied only at the end of the \emph{statements} following a ©case© clause.2269 Theexplicit ©fallthru© is retained because it is a C-idiom most C programmers expect, and its absence might discourage programmers from using the ©choose© statement.827 An implicit ©break© is applied only at the end of the \emph{statements} following a ©case© clause. 828 An 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. 2270 829 As well, allowing an explicit ©break© from the ©choose© is a carry over from the ©switch© statement, and expected by C programmers. 2271 830 \item … … 2296 855 2297 856 2298 \section{ Case Clause}857 \section{\texorpdfstring{\LstKeywordStyle{case} Clause}{case Clause}} 2299 858 2300 859 C restricts the ©case© clause of a ©switch© statement to a single value. … … 2372 931 2373 932 933 \section{\texorpdfstring{\LstKeywordStyle{with} Clause / Statement}{with Clause / Statement}} 934 \label{s:WithClauseStatement} 935 936 In \Index{object-oriented} programming, there is an implicit first parameter, often names \textbf{©self©} or \textbf{©this©}, which is elided. 937 \begin{C++} 938 class 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++} 946 Since CFA is non-object-oriented, the equivalent object-oriented program looks like: 947 \begin{cfa} 948 struct S { int i, j; }; 949 int mem( S &this ) { // explicit "this" parameter 950 ®this.®i = 1; // "this" is not elided 951 ®this.®j = 2; 952 } 953 \end{cfa} 954 but 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{ 957 The ©with© statement comes from Pascal~\cite[\S~4.F]{Pascal}.} 958 \begin{cfa} 959 int mem( S &this ) ®with this® { 960 i = 1; ®// this.i 961 ® j = 2; ®// this.j 962 ®} 963 \end{cfa} 964 which extends to multiple routine parameters: 965 \begin{cfa} 966 struct T { double m, n; }; 967 int 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 973 The statement form is used within a block: 974 \begin{cfa} 975 int 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 990 When opening multiple structures, fields with the same name and type are ambiguous and must be fully qualified. 991 For fields with the same name but different type, context/cast can be used to disambiguate. 992 \begin{cfa} 993 struct S { int i; int j; double m; } a, c; 994 struct 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 2374 1008 \section{Exception Handling} 1009 \label{s:ExceptionHandling} 2375 1010 2376 1011 Exception 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 1012 Transfer of control can be local, within a routine, or non-local, among routines. 1013 Non-local transfer can cause stack unwinding, i.e., non-local routine termination, depending on the kind of raise. 1014 \begin{cfa} 1015 exception_t E {}; §\C{// exception type}§ 2381 1016 void 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 } 2386 1020 try { 2387 1021 f(...); 2388 } catch h( int w ) {2389 // re set2390 } resume h( int p, double x ) {2391 return 17; // recover1022 } 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 2392 1026 } 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} 1030 The kind of raise and handler match: ©throw© with ©catch© and @throwResume@ with @catchResume@. 1031 Then the exception type must match along with any additonal predicate must be true. 1032 The ©catch© and ©catchResume© handlers may appear in any oder. 1033 However, the ©finally© clause must 1034 1035 1036 \subsection{Exception Hierarchy} 1037 1038 An 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. 1039 The 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} 1043 A programmer can then choose to handle an exception at different degrees of specificity along the hierarchy; 1044 derived exception-types support a more flexible programming style. 1045 For example, higher-level code should catch general exceptions to reduce coupling to the specific implementation at the lower levels; 1046 unnecessary coupling may force changes in higher-level code when low-level code changes. 1047 A consequence of derived exception-types is that multiple exceptions may match, \eg: 1048 \begin{cfa} 1049 catch( Arithmetic ) 1050 \end{cfa} 1051 matches all three derived exception-types: ©DivideByZero©, ©Overflow©, and ©Underflow©. 1052 Because 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} 1054 try { 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 1068 C declaration syntax is notoriously confusing and error prone. 1069 For example, many C programmers are confused by a declaration as simple as: 1070 \begin{quote2} 1071 \begin{tabular}{@{}ll@{}} 1072 \begin{cfa} 1073 int * x[5] 1074 \end{cfa} 1075 & 1076 \raisebox{-0.75\totalheight}{\input{Cdecl}} 1077 \end{tabular} 1078 \end{quote2} 1079 Is this an array of 5 pointers to integers or a \Index{pointer} to an array of 5 integers? 1080 The fact this declaration is unclear to many C programmers means there are \Index{productivity} and \Index{safety} issues even for basic programs. 1081 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. 1082 For example, a routine returning a \Index{pointer} to an array of integers is defined and used in the following way: 1083 \begin{cfa} 1084 int ®(*®f®())[®5®]® {...}; §\C{definition}§ 1085 ... ®(*®f®())[®3®]® += 1; §\C{usage}§ 1086 \end{cfa} 1087 Essentially, the return type is wrapped around the routine name in successive layers (like an \Index{onion}). 1088 While 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. 1091 The new declarations place qualifiers to the left of the base type, while C declarations place qualifiers to the right of the base type. 1092 In the following example, \R{red} is the base type and \B{blue} is qualifiers. 1093 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. 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} 1110 The 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. 1112 However, unlike C, \CFA type declaration tokens are distributed across all variables in the declaration list. 1113 For 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} 1122 int ®*®x, ®*®y; 1123 \end{cfa} 1124 \end{tabular} 1125 \end{quote2} 1126 The 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; 1132 int y; 1133 \end{cfa} 1134 & 1135 \begin{cfa} 1136 int ®*®x, y; 1137 1138 \end{cfa} 1139 \end{tabular} 1140 \end{quote2} 1141 which is \Index{prescribing} a safety benefit. 1142 Other 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; 1150 struct s { 1151 int f0:3; 1152 * int f1; 1153 [ 5 ] * int f2; 1154 }; 1155 \end{cfa} 1156 & 1157 \begin{cfa} 1158 int z[ 5 ]; 1159 char * w[ 5 ]; 1160 double (* v)[ 5 ]; 1161 struct 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 1181 All 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} 1186 const * const int x; 1187 const * [ 5 ] const int y; 1188 \end{cfa} 1189 & 1190 \begin{cfa} 1191 int const * const x; 1192 const 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} 1201 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} 1202 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: 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} 1207 extern [ 5 ] int x; 1208 static * const int y; 1209 \end{cfa} 1210 & 1211 \begin{cfa} 1212 int extern x[ 5 ]; 1213 const 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 1223 The 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} 1228 y = (®* int®)x; 1229 i = sizeof(®[ 5 ] * int®); 1230 \end{cfa} 1231 & 1232 \begin{cfa} 1233 y = (®int *®)x; 1234 i = sizeof(®int * [ 5 ]®); 1235 \end{cfa} 1236 \end{tabular} 1237 \end{quote2} 1238 1239 Finally, new \CFA declarations may appear together with C declarations in the same program block, but cannot be mixed within a specific declaration. 1240 Therefore, a programmer has the option of either continuing to use traditional C declarations or take advantage of the new style. 1241 Clearly, 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 1246 C provides a \newterm{pointer type}; 1247 \CFA adds a \newterm{reference type}. 1248 These types may be derived from an object or routine type, called the \newterm{referenced type}. 1249 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. 1250 An integer constant expression with the value 0, or such an expression cast to type ©void *©, is called a \newterm{null-pointer constant}.\footnote{ 1251 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; 1252 \ie the null pointer is guaranteed to compare unequal to a pointer to any object or routine.} 1253 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. 1254 Dereferencing an \newterm{unsound} address, including the null pointer, is \Index{undefined}, often resulting in a \Index{memory fault}. 1255 1256 A program \newterm{object} is a region of data storage in the execution environment, the contents of which can represent values. 1257 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: 1258 \begin{quote2} 1259 \begin{tabular}{@{}ll@{\hspace{2em}}l@{}} 1260 \begin{cfa} 1261 int x; 1262 x = 3; 1263 int y; 1264 y = x; 1265 \end{cfa} 1266 & 1267 \raisebox{-0.45\totalheight}{\input{pointer1}} 1268 & 1269 \begin{cfa} 1270 int * ®const® x = (int *)100 1271 *x = 3; // implicit dereference 1272 int * ®const® y = (int *)104; 1273 *y = *x; // implicit dereference 1274 \end{cfa} 1275 \end{tabular} 1276 \end{quote2} 1277 where the right example is how the compiler logically interprets the variables in the left example. 1278 Since a variable name only points to one address during its lifetime, it is an \Index{immutable} \Index{pointer}; 1279 hence, the implicit type of pointer variables ©x© and ©y© are constant pointers in the compiler interpretation. 1280 In general, variable addresses are stored in instructions instead of loaded from memory, and hence may not occupy storage. 1281 These 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} 1287 lda r1,100 // load address of x 1288 ld r2,(r1) // load value of x 1289 lda r3,104 // load address of y 1290 st r2,(r3) // store x into y 1291 \end{cfa} 1292 & 1293 \begin{cfa} 1294 1295 ld r2,(100) // load value of x 1296 1297 st r2,(104) // store x into y 1298 \end{cfa} 1299 \end{tabular} 1300 \end{quote2} 1301 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. 1302 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}. 1303 1304 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. 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.) 1306 Hence, 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} 1310 int x, y, ®*® p1, ®*® p2, ®**® p3; 1311 p1 = ®&®x; // p1 points to x 1312 p2 = p1; // p2 points to x 1313 p1 = ®&®y; // p1 points to y 1314 p3 = &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 1321 Notice, an address has a \Index{duality}\index{address!duality}: a location in memory or the value at that location. 1322 In many cases, a compiler might be able to infer the best meaning for these two cases. 1323 For example, \Index*{Algol68}~\cite{Algol68} infers pointer dereferencing to select the best meaning for each pointer usage 1324 \begin{cfa} 1325 p2 = p1 + x; §\C{// compiler infers *p2 = *p1 + x;}§ 1326 \end{cfa} 1327 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. 1328 Unfortunately, automatic dereferencing does not work in all cases, and so some mechanism is necessary to fix incorrect choices. 1329 1330 Rather than inferring dereference, most programming languages pick one implicit dereferencing semantics, and the programmer explicitly indicates the other to resolve address-duality. 1331 In C, objects of pointer type always manipulate the pointer object's address: 1332 \begin{cfa} 1333 p1 = p2; §\C{// p1 = p2\ \ rather than\ \ *p1 = *p2}§ 1334 p2 = p1 + x; §\C{// p2 = p1 + x\ \ rather than\ \ *p2 = *p1 + x}§ 1335 \end{cfa} 1336 even though the assignment to ©p2© is likely incorrect, and the programmer probably meant: 1337 \begin{cfa} 1338 p1 = p2; §\C{// pointer address assignment}§ 1339 ®*®p2 = ®*®p1 + x; §\C{// pointed-to value assignment / operation}§ 1340 \end{cfa} 1341 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©). 1342 1343 However, 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} 1347 In this case, it is tedious to explicitly write the dereferencing, and error prone when pointer arithmetic is allowed. 1348 It is better to have the compiler generate the dereferencing and have no implicit pointer arithmetic: 1349 \begin{cfa} 1350 p2 = ((p1 + p2) * (p3 - p1)) / (p3 - 15); 1351 \end{cfa} 1352 1353 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). 1354 \begin{cfa} 1355 int 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}§ 1360 r2 = ((r1 + r2) * (r3 - r1)) / (r3 - 15); §\C{// implicit dereferencing}§ 1361 \end{cfa} 1362 Except for auto-dereferencing by the compiler, this reference example is the same as the previous pointer example. 1363 Hence, a reference behaves like the variable name for the current variable it is pointing-to. 1364 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: 1365 \begin{cfa} 1366 ®*®r2 = ((®*®r1 + ®*®r2) ®*® (®**®r3 - ®*®r1)) / (®**®r3 - 15); 1367 \end{cfa} 1368 When a reference operation appears beside a dereference operation, \eg ©&*©, they cancel out. 1369 However, in C, the cancellation always yields a value (\Index{rvalue}).\footnote{ 1370 The unary ©&© operator yields the address of its operand. 1371 If the operand has type ``type'', the result has type ``pointer to type''. 1372 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}} 1373 For 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} 1377 Similarly, 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} 1381 Cancellation\index{cancellation!pointer/reference}\index{pointer!cancellation} works to arbitrary depth. 1382 1383 Fundamentally, pointer and reference objects are functionally interchangeable because both contain addresses. 1384 \begin{cfa} 1385 int x, *p1 = &x, **p2 = &p1, ***p3 = &p2, 1386 &r1 = x, &&r2 = r1, &&&r3 = r2; 1387 ***p3 = 3; §\C{// change x}§ 1388 r3 = 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} 1395 Furthermore, both types are equally performant, as the same amount of dereferencing occurs for both types. 1396 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. 1397 1398 As for a pointer type, a reference type may have qualifiers: 1399 \begin{cfa} 1400 const int cx = 5; §\C{// cannot change cx;}§ 1401 const int & cr = cx; §\C{// cannot change what cr points to}§ 1402 ®&®cr = &cx; §\C{// can change cr}§ 1403 cr = 7; §\C{// error, cannot change cx}§ 1404 int & const rc = x; §\C{// must be initialized}§ 1405 ®&®rc = &x; §\C{// error, cannot change rc}§ 1406 const int & const crc = cx; §\C{// must be initialized}§ 1407 crc = 7; §\C{// error, cannot change cx}§ 1408 ®&®crc = &cx; §\C{// error, cannot change crc}§ 1409 \end{cfa} 1410 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}: 1411 \begin{cfa} 1412 int & const cr = *0; §\C{// where 0 is the int * zero}§ 1413 \end{cfa} 1414 Note, constant reference-types do not prevent \Index{addressing errors} because of explicit storage-management: 1415 \begin{cfa} 1416 int & const cr = *malloc(); 1417 cr = 5; 1418 free( &cr ); 1419 cr = 7; §\C{// unsound pointer dereference}§ 1420 \end{cfa} 1421 1422 The position of the ©const© qualifier \emph{after} the pointer/reference qualifier causes confuse for C programmers. 1423 The ©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} 1434 const int * ®const® * ®const® ccp; 1435 1436 \end{cfa} 1437 \end{tabular} 1438 \end{quote2} 1439 where the \CFA declaration is read left-to-right. 1440 1441 Finally, like pointers, references are usable and composable with other type operators and generators. 1442 \begin{cfa} 1443 int w, x, y, z, & ar[3] = { x, y, z }; §\C{// initialize array of references}§ 1444 &ar[1] = &w; §\C{// change reference array element}§ 1445 typeof( ar[1] ) p; §\C{// (gcc) is int, i.e., the type of referenced object}§ 1446 typeof( &ar[1] ) q; §\C{// (gcc) is int \&, i.e., the type of reference}§ 1447 sizeof( ar[1] ) == sizeof( int ); §\C{// is true, i.e., the size of referenced object}§ 1448 sizeof( &ar[1] ) == sizeof( int *) §\C{// is true, i.e., the size of a reference}§ 1449 \end{cfa} 1450 1451 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}. 1452 Also, \CC does not allow \Index{array}s\index{array!reference} of reference\footnote{ 1453 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.} 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. 1460 There are three initialization contexts in \CFA: declaration initialization, argument/parameter binding, return/temporary binding. 1461 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. 1462 In contrast, the left-hand side of assignment has an address that has a duality. 1463 Therefore, for pointer/reference initialization, the initializing value must be an address not a value. 1464 \begin{cfa} 1465 int * p = &x; §\C{// assign address of x}§ 1466 ®int * p = x;® §\C{// assign value of x}§ 1467 int & r = x; §\C{// must have address of x}§ 1468 \end{cfa} 1469 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). 1470 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. 1471 Note, this is strictly a convenience and safety feature for a programmer. 1472 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. 1473 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. 1474 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. 1475 \begin{cfa} 1476 int & f( int & r ); §\C{// reference parameter and return}§ 1477 z = f( x ) + f( y ); §\C{// reference operator added, temporaries needed for call results}§ 1478 \end{cfa} 1479 Within routine ©f©, it is possible to change the argument by changing the corresponding parameter, and parameter ©r© can be locally reassigned within ©f©. 1480 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. 1481 \begin{cfa} 1482 int temp1 = f( x ), temp2 = f( y ); 1483 z = temp1 + temp2; 1484 \end{cfa} 1485 This \Index{implicit referencing} is crucial for reducing the syntactic burden for programmers when using references; 1486 otherwise references have the same syntactic burden as pointers in these contexts. 1487 1488 When a pointer/reference parameter has a ©const© value (immutable), it is possible to pass literals and expressions. 1489 \begin{cfa} 1490 void f( ®const® int & cr ); 1491 void g( ®const® int * cp ); 1492 f( 3 ); g( ®&®3 ); 1493 f( x + y ); g( ®&®(x + y) ); 1494 \end{cfa} 1495 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. 1496 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©). 1497 Importantly, ©&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{ 1500 If whole program analysis is possible, and shows the parameter is not assigned, \ie it is ©const©, the temporary is unnecessary.} 1501 \begin{cfa} 1502 void f( int & r ); 1503 void g( int * p ); 1504 f( 3 ); g( ®&®3 ); §\C{// compiler implicit generates temporaries}§ 1505 f( x + y ); g( ®&®(x + y) ); §\C{// compiler implicit generates temporaries}§ 1506 \end{cfa} 1507 Essentially, there is an implicit \Index{rvalue} to \Index{lvalue} conversion in this case.\footnote{ 1508 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.} 1509 The 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. 1512 Finally, C handles \Index{routine object}s in an inconsistent way. 1513 A routine object is both a pointer and a reference (\Index{particle and wave}). 1514 \begin{cfa} 1515 void f( int i ); 1516 void (*fp)( int ); §\C{// routine pointer}§ 1517 fp = f; §\C{// reference initialization}§ 1518 fp = &f; §\C{// pointer initialization}§ 1519 fp = *f; §\C{// reference initialization}§ 1520 fp(3); §\C{// reference invocation}§ 1521 (*fp)(3); §\C{// pointer invocation}§ 1522 \end{cfa} 1523 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. 1524 Instead, a routine object should be referenced by a ©const© reference: 1525 \begin{cfa} 1526 ®const® void (®&® fr)( int ) = f; §\C{// routine reference}§ 1527 fr = ... §\C{// error, cannot change code}§ 1528 &fr = ...; §\C{// changing routine reference}§ 1529 fr( 3 ); §\C{// reference call to f}§ 1530 (*fr)(3); §\C{// error, incorrect type}§ 1531 \end{cfa} 1532 because the value of the routine object is a routine literal, \ie the routine code is normally immutable during execution.\footnote{ 1533 Dynamic 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 1539 In C, ©&E© is an rvalue for any expression ©E©. 1540 \CFA extends the ©&© (address-of) operator as follows: 1541 \begin{itemize} 1542 \item 1543 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). 1544 1545 \item 1546 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). 1547 \end{itemize} 1548 The following example shows the first rule applied to different \Index{rvalue} contexts: 1549 \begin{cfa} 1550 int x, * px, ** ppx, *** pppx, **** ppppx; 1551 int & rx = x, && rrx = rx, &&& rrrx = rrx ; 1552 x = rrrx; // rrrx is an lvalue with type int &&& (equivalent to x) 1553 px = &rrrx; // starting from rrrx, &rrrx is an rvalue with type int *&&& (&x) 1554 ppx = &&rrrx; // starting from &rrrx, &&rrrx is an rvalue with type int **&& (&rx) 1555 pppx = &&&rrrx; // starting from &&rrrx, &&&rrrx is an rvalue with type int ***& (&rrx) 1556 ppppx = &&&&rrrx; // starting from &&&rrrx, &&&&rrrx is an rvalue with type int **** (&rrrx) 1557 \end{cfa} 1558 The following example shows the second rule applied to different \Index{lvalue} contexts: 1559 \begin{cfa} 1560 int x, * px, ** ppx, *** pppx; 1561 int & rx = x, && rrx = rx, &&& rrrx = rrx ; 1562 rrrx = 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 1571 C provides a basic implicit conversion to simplify variable usage: 1572 \begin{enumerate} 1573 \setcounter{enumi}{-1} 1574 \item 1575 lvalue to rvalue conversion: ©cv T© converts to ©T©, which allows implicit variable dereferencing. 1576 \begin{cfa} 1577 int x; 1578 x + 1; // lvalue variable (int) converts to rvalue for expression 1579 \end{cfa} 1580 An 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 1585 reference to rvalue conversion: ©cv T &© converts to ©T©, which allows implicit reference dereferencing. 1586 \begin{cfa} 1587 int x, &r = x, f( int p ); 1588 x = ®r® + f( ®r® ); // lvalue reference converts to rvalue 1589 \end{cfa} 1590 An rvalue has no type qualifiers (©cv©), so the reference qualifiers are dropped. 1591 1592 \item 1593 lvalue to reference conversion: \lstinline[deletekeywords=lvalue]$lvalue-type cv1 T$ converts to ©cv2 T &©, which allows implicitly converting variables to references. 1594 \begin{cfa} 1595 int x, &r = ®x®, f( int & p ); // lvalue variable (int) convert to reference (int &) 1596 f( ®x® ); // lvalue variable (int) convert to reference (int &) 1597 \end{cfa} 1598 Conversion can restrict a type, where ©cv1© $\le$ ©cv2©, \eg passing an ©int© to a ©const volatile int &©, which has low cost. 1599 Conversion can expand a type, where ©cv1© $>$ ©cv2©, \eg passing a ©const volatile int© to an ©int &©, which has high cost (\Index{warning}); 1600 furthermore, if ©cv1© has ©const© but not ©cv2©, a temporary variable is created to preserve the immutable lvalue. 1601 1602 \item 1603 rvalue to reference conversion: ©T© converts to ©cv T &©, which allows binding references to temporaries. 1604 \begin{cfa} 1605 int x, & f( int & p ); 1606 f( ®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} 1609 In both case, modifications to the temporary are inaccessible (\Index{warning}). 1610 Conversion expands the temporary-type with ©cv©, which is low cost since the temporary is inaccessible. 1611 \end{enumerate} 1612 1613 1614 \begin{comment} 1615 From: Richard Bilson <rcbilson@gmail.com> 1616 Date: Wed, 13 Jul 2016 01:58:58 +0000 1617 Subject: Re: pointers / references 1618 To: "Peter A. Buhr" <pabuhr@plg2.cs.uwaterloo.ca> 1619 1620 As a general comment I would say that I found the section confusing, as you move back and forth 1621 between various real and imagined programming languages. If it were me I would rewrite into two 1622 subsections, one that specifies precisely the syntax and semantics of reference variables and 1623 another that provides the rationale. 1624 1625 I don't see any obvious problems with the syntax or semantics so far as I understand them. It's not 1626 obvious that the description you're giving is complete, but I'm sure you'll find the special cases 1627 as you do the implementation. 1628 1629 My big gripes are mostly that you're not being as precise as you need to be in your terminology, and 1630 that you say a few things that aren't actually true even though I generally know what you mean. 1631 1632 20 C provides a pointer type; CFA adds a reference type. Both types contain an address, which is normally a 1633 21 location in memory. 1634 1635 An address is not a location in memory; an address refers to a location in memory. Furthermore it 1636 seems weird to me to say that a type "contains" an address; rather, objects of that type do. 1637 1638 21 Special addresses are used to denote certain states or access co-processor memory. By 1639 22 convention, no variable is placed at address 0, so addresses like 0, 1, 2, 3 are often used to denote no-value 1640 23 or other special states. 1641 1642 This isn't standard C at all. There has to be one null pointer representation, but it doesn't have 1643 to be a literal zero representation and there doesn't have to be more than one such representation. 1644 1645 23 Often dereferencing a special state causes a memory fault, so checking is necessary 1646 24 during execution. 1647 1648 I don't see the connection between the two clauses here. I feel like if a bad pointer will not cause 1649 a memory fault then I need to do more checking, not less. 1650 1651 24 If the programming language assigns addresses, a program's execution is sound, \ie all 1652 25 addresses are to valid memory locations. 1653 1654 You haven't said what it means to "assign" an address, but if I use my intuitive understanding of 1655 the term I don't see how this can be true unless you're assuming automatic storage management. 1656 1657 1 Program variables are implicit pointers to memory locations generated by the compiler and automatically 1658 2 dereferenced, as in: 1659 1660 There is no reason why a variable needs to have a location in memory, and indeed in a typical 1661 program many variables will not. In standard terminology an object identifier refers to data in the 1662 execution environment, but not necessarily in memory. 1663 1664 13 A pointer/reference is a generalization of a variable name, \ie a mutable address that can point to more 1665 14 than one memory location during its lifetime. 1666 1667 I feel like you're off the reservation here. In my world there are objects of pointer type, which 1668 seem to be what you're describing here, but also pointer values, which can be stored in an object of 1669 pointer type but don't necessarily have to be. For example, how would you describe the value denoted 1670 by "&main" in a C program? I would call it a (function) pointer, but that doesn't satisfy your 1671 definition. 1672 1673 16 not occupy storage as the literal is embedded directly into instructions.) Hence, a pointer occupies memory 1674 17 to store its current address, and the pointer's value is loaded by dereferencing, \eg: 1675 1676 As with my general objection regarding your definition of variables, there is no reason why a 1677 pointer variable (object of pointer type) needs to occupy memory. 1678 1679 21 p2 = p1 + x; // compiler infers *p2 = *p1 + x; 1680 1681 What language are we in now? 1682 1683 24 pointer usage. However, in C, the following cases are ambiguous, especially with pointer arithmetic: 1684 25 p1 = p2; // p1 = p2 or *p1 = *p2 1685 1686 This isn't ambiguous. it's defined to be the first option. 1687 1688 26 p1 = p1 + 1; // p1 = p1 + 1 or *p1 = *p1 + 1 1689 1690 Again, this statement is not ambiguous. 1691 1692 13 example. Hence, a reference behaves like the variable name for the current variable it is pointing-to. The 1693 14 simplest way to understand a reference is to imagine the compiler inserting a dereference operator before 1694 15 the reference variable for each reference qualifier in a declaration, \eg: 1695 1696 It's hard for me to understand who the audience for this part is. I think a practical programmer is 1697 likely to be satisfied with "a reference behaves like the variable name for the current variable it 1698 is pointing-to," maybe with some examples. Your "simplest way" doesn't strike me as simpler than 1699 that. It feels like you're trying to provide a more precise definition for the semantics of 1700 references, but it isn't actually precise enough to be a formal specification. If you want to 1701 express the semantics of references using rewrite rules that's a great way to do it, but lay the 1702 rules out clearly, and when you're showing an example of rewriting keep your 1703 references/pointers/values separate (right now, you use \eg "r3" to mean a reference, a pointer, 1704 and a value). 1705 1706 24 Cancellation works to arbitrary depth, and pointer and reference values are interchangeable because both 1707 25 contain addresses. 1708 1709 Except they're not interchangeable, because they have different and incompatible types. 1710 1711 40 Interestingly, C++ deals with the address duality by making the pointed-to value the default, and prevent- 1712 41 ing changes to the reference address, which eliminates half of the duality. Java deals with the address duality 1713 42 by making address assignment the default and requiring field assignment (direct or indirect via methods), 1714 43 \ie there is no builtin bit-wise or method-wise assignment, which eliminates half of the duality. 1715 1716 I can follow this but I think that's mostly because I already understand what you're trying to 1717 say. I don't think I've ever heard the term "method-wise assignment" and I don't see you defining 1718 it. Furthermore Java does have value assignment of basic (non-class) types, so your summary here 1719 feels incomplete. (If it were me I'd drop this paragraph rather than try to save it.) 1720 1721 11 Hence, for type & const, there is no pointer assignment, so &rc = &x is disallowed, and the address value 1722 12 cannot be 0 unless an arbitrary pointer is assigned to the reference. 1723 1724 Given the pains you've taken to motivate every little bit of the semantics up until now, this last 1725 clause ("the address value cannot be 0") comes out of the blue. It seems like you could have 1726 perfectly reasonable semantics that allowed the initialization of null references. 1727 1728 12 In effect, the compiler is managing the 1729 13 addresses for type & const not the programmer, and by a programming discipline of only using references 1730 14 with references, address errors can be prevented. 1731 1732 Again, is this assuming automatic storage management? 1733 1734 18 rary binding. For reference initialization (like pointer), the initializing value must be an address (lvalue) not 1735 19 a value (rvalue). 1736 1737 This sentence appears to suggest that an address and an lvalue are the same thing. 1738 1739 20 int * p = &x; // both &x and x are possible interpretations 1740 1741 Are 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 1744 21 int & r = x; // x unlikely interpretation, because of auto-dereferencing 1745 1746 You mean, we can initialize a reference using an integer value? Surely we would need some sort of 1747 cast to induce that interpretation, no? 1748 1749 22 Hence, the compiler implicitly inserts a reference operator, &, before the initialization expression. 1750 1751 But then the expression would have pointer type, which wouldn't be compatible with the type of r. 1752 1753 22 Similarly, 1754 23 when a reference is used for a parameter/return type, the call-site argument does not require a reference 1755 24 operator. 1756 1757 Furthermore, it would not be correct to use a reference operator. 1758 1759 45 The implicit conversion allows 1760 1 seamless calls to any routine without having to explicitly name/copy the literal/expression to allow the call. 1761 2 While C' attempts to handle pointers and references in a uniform, symmetric manner, C handles routine 1762 3 variables in an inconsistent way: a routine variable is both a pointer and a reference (particle and wave). 1763 1764 After all this talk of how expressions can have both pointer and value interpretations, you're 1765 disparaging C because it has expressions that have both pointer and value interpretations? 1766 1767 On 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. 1777 The 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} 1783 where routine ©f© has three output (return values) and three input parameters. 1784 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. 1785 1786 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{ 1787 \Index*{Michael Tiemann}, with help from \Index*{Doug Lea}, provided named return values in g++, circa 1989.} 1788 The value of each local return variable is automatically returned at routine termination. 1789 Declaration 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} 1793 Lastly, if there are no output parameters or input parameters, the brackets and/or parentheses must still be specified; 1794 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: 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 1800 Routine f is called as follows: 1801 \begin{cfa} 1802 [ i, j, ch ] = f( 3, 'a', ch ); 1803 \end{cfa} 1804 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. 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} 1808 int (*f(x))[ 5 ] int x; {} 1809 \end{cfa} 1810 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. 1811 Since the strings overlap starting with the open bracket, ©[©, there is an ambiguous interpretation for the string. 1812 As well, \CFA-style declarations cannot be used to declare parameters for C-style routine-definitions because of the following ambiguity: 1813 \begin{cfa} 1814 typedef int foo; 1815 int f( int (* foo) ); §\C{// foo is redefined as a parameter name}§ 1816 \end{cfa} 1817 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. 1818 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. 1819 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. 1820 1821 C-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} 1826 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: 1827 \begin{cfa} 1828 #define ptoa( n, d ) int (*n)[ d ] 1829 int 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} 1832 Again, 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} 1839 int f() { 1840 int x; 1841 ... x = 0; ... x = y; ... 1842 return x; 1843 } 1844 \end{cfa} 1845 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: 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 1857 When the return is encountered, the current values of ©x© and ©y© are returned to the calling routine. 1858 As 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} 1864 In this case, the current values of ©x© and ©y© are returned to the calling routine just as if a ©return© had been encountered. 1865 1866 Named return values may be used in conjunction with named parameter values; 1867 specifically, 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} 1873 This 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}§ 1876 int a, b; 1877 [a, b] = f( f( f( a, b ) ) ); 1878 \end{cfa} 1879 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. 1880 Hence, even without the body of routine ©f© (separate compilation), it is possible to perform a global optimization across routine calls. 1881 The 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 1886 The syntax of the new routine prototype declaration follows directly from the new routine definition syntax; 1887 as 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} 1894 This syntax allows a prototype declaration to be created by cutting and pasting source text from the routine definition header (or vice versa). 1895 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: 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} 1904 int f( int ), g( int ); 1905 \end{cfa} 1906 \end{tabular} 1907 \end{quote2} 1908 Declaration qualifiers can only appear at the start of a \CFA routine declaration,\footref{StorageClassSpecifier} \eg: 1909 \begin{cfa} 1910 extern [ int ] f ( int ); 1911 static [ int ] g ( int ); 1912 \end{cfa} 1913 1914 1915 \section{Routine Pointers} 1916 1917 The 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} 1924 While parameter names are optional, \emph{a routine name cannot be specified}; 1925 for 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 1933 Named\index{named arguments}\index{arguments!named} and default\index{default arguments}\index{arguments!default} arguments~\cite{Hardgrave76}\footnote{ 1934 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.} 1935 are two mechanisms to simplify routine call. 1936 Both mechanisms are discussed with respect to \CFA. 1937 \begin{description} 1938 \item[Named (or Keyword) Arguments:] 1939 provide the ability to specify an argument to a routine call using the parameter name rather than the position of the parameter. 1940 For example, given the routine: 1941 \begin{cfa} 1942 void p( int x, int y, int z ) {...} 1943 \end{cfa} 1944 a positional call is: 1945 \begin{cfa} 1946 p( 4, 7, 3 ); 1947 \end{cfa} 1948 whereas a named (keyword) call may be: 1949 \begin{cfa} 1950 p( z : 3, x : 4, y : 7 ); §\C{// rewrite $\Rightarrow$ p( 4, 7, 3 )}§ 1951 \end{cfa} 1952 Here the order of the arguments is unimportant, and the names of the parameters are used to associate argument values with the corresponding parameters. 1953 The compiler rewrites a named call into a positional call. 1954 The advantages of named parameters are: 1955 \begin{itemize} 1956 \item 1957 Remembering the names of the parameters may be easier than the order in the routine definition. 1958 \item 1959 Parameter names provide documentation at the call site (assuming the names are descriptive). 1960 \item 1961 Changes 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 1964 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. 1965 For example, the following routine prototypes and definition are all valid. 1966 \begin{cfa} 1967 void p( int, int, int ); §\C{// equivalent prototypes}§ 1968 void p( int x, int y, int z ); 1969 void p( int y, int x, int z ); 1970 void p( int z, int y, int x ); 1971 void p( int q, int r, int s ) {} §\C{// match with this definition}§ 1972 \end{cfa} 1973 Forcing matching parameter names in routine prototypes with corresponding routine definitions is possible, but goes against a strong tradition in C programming. 1974 Alternatively, prototype definitions can be eliminated by using a two-pass compilation, and implicitly creating header files for exports. 1975 The former is easy to do, while the latter is more complex. 1976 1977 Furthermore, named arguments do not work well in a \CFA-style programming-languages because they potentially introduces a new criteria for type matching. 1978 For 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} 1980 int f( int i, int j ); 1981 int f( int x, double y ); 1982 1983 f( j : 3, i : 4 ); §\C{// 1st f}§ 1984 f( x : 7, y : 8.1 ); §\C{// 2nd f}§ 1985 f( 4, 5 ); §\C{// ambiguous call}§ 1986 \end{cfa} 1987 However, named arguments compound routine resolution in conjunction with conversions: 1988 \begin{cfa} 1989 f( i : 3, 5.7 ); §\C{// ambiguous call ?}§ 1990 \end{cfa} 1991 Depending on the cost associated with named arguments, this call could be resolvable or ambiguous. 1992 Adding named argument into the routine resolution algorithm does not seem worth the complexity. 1993 Therefore, \CFA does \emph{not} attempt to support named arguments. 1994 1995 \item[Default Arguments] 1996 provide the ability to associate a default value with a parameter so it can be optionally specified in the argument list. 1997 For example, given the routine: 1998 \begin{cfa} 1999 void p( int x = 1, int y = 2, int z = 3 ) {...} 2000 \end{cfa} 2001 the allowable positional calls are: 2002 \begin{cfa} 2003 p(); §\C{// rewrite $\Rightarrow$ p( 1, 2, 3 )}§ 2004 p( 4 ); §\C{// rewrite $\Rightarrow$ p( 4, 2, 3 )}§ 2005 p( 4, 4 ); §\C{// rewrite $\Rightarrow$ p( 4, 4, 3 )}§ 2006 p( 4, 4, 4 ); §\C{// rewrite $\Rightarrow$ p( 4, 4, 4 )}§ 2007 // empty arguments 2008 p( , 4, 4 ); §\C{// rewrite $\Rightarrow$ p( 1, 4, 4 )}§ 2009 p( 4, , 4 ); §\C{// rewrite $\Rightarrow$ p( 4, 2, 4 )}§ 2010 p( 4, 4, ); §\C{// rewrite $\Rightarrow$ p( 4, 4, 3 )}§ 2011 p( 4, , ); §\C{// rewrite $\Rightarrow$ p( 4, 2, 3 )}§ 2012 p( , 4, ); §\C{// rewrite $\Rightarrow$ p( 1, 4, 3 )}§ 2013 p( , , 4 ); §\C{// rewrite $\Rightarrow$ p( 1, 2, 4 )}§ 2014 p( , , ); §\C{// rewrite $\Rightarrow$ p( 1, 2, 3 )}§ 2015 \end{cfa} 2016 Here the missing arguments are inserted from the default values in the parameter list. 2017 The compiler rewrites missing default values into explicit positional arguments. 2018 The advantages of default values are: 2019 \begin{itemize} 2020 \item 2021 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. 2022 For many of these kinds of routines, there are standard or default settings that work for the majority of computations. 2023 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. 2024 \item 2025 When 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. 2027 So long as the modified abstraction is a generalization of the original, existing uses of the abstraction will not require change. 2028 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. 2029 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}} 2030 (somewhat like the generalization provided by inheritance for classes). 2031 That is, all existing calls are still valid, although the call must still be recompiled. 2032 \end{itemize} 2033 The only disadvantage of default arguments is that unintentional omission of an argument may not result in a compiler-time error. 2034 Instead, a default value is used, which may not be the programmer's intent. 2035 2036 Default values may only appear in a prototype versus definition context: 2037 \begin{cfa} 2038 void p( int x, int y = 2, int z = 3 ); §\C{// prototype: allowed}§ 2039 void p( int, int = 2, int = 3 ); §\C{// prototype: allowed}§ 2040 void p( int x, int y = 2, int z = 3 ) {} §\C{// definition: not allowed}§ 2041 \end{cfa} 2042 The reason for this restriction is to allow separate compilation. 2043 Multiple prototypes with different default values is an error. 2044 \end{description} 2045 2046 Ellipse (``...'') arguments present problems when used with default arguments. 2047 The conflict occurs because both named and ellipse arguments must appear after positional arguments, giving two possibilities: 2048 \begin{cfa} 2049 p( /* positional */, ... , /* named */ ); 2050 p( /* positional */, /* named */, ... ); 2051 \end{cfa} 2052 While it is possible to implement both approaches, the first possibly is more complex than the second, \eg: 2053 \begin{cfa} 2054 p( int x, int y, int z, ... ); 2055 p( 1, 4, 5, 6, z : 3, y : 2 ); §\C{// assume p( /* positional */, ... , /* named */ );}§ 2056 p( 1, z : 3, y : 2, 4, 5, 6 ); §\C{// assume p( /* positional */, /* named */, ... );}§ 2057 \end{cfa} 2058 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. 2059 Hence, this approach seems significantly more difficult, and hence, confusing and error prone. 2060 In the second call, the named arguments separate the positional and ellipse arguments, making it trivial to read the call. 2061 2062 The problem is exacerbated with default arguments, \eg: 2063 \begin{cfa} 2064 void p( int x, int y = 2, int z = 3... ); 2065 p( 1, 4, 5, 6, z : 3 ); §\C{// assume p( /* positional */, ... , /* named */ );}§ 2066 p( 1, z : 3, 4, 5, 6 ); §\C{// assume p( /* positional */, /* named */, ... );}§ 2067 \end{cfa} 2068 The first call is an error because arguments 4 and 5 are actually positional not ellipse arguments; 2069 therefore, argument 5 subsequently conflicts with the named argument z : 3. 2070 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. 2071 For these reasons, \CFA requires named arguments before ellipse arguments. 2072 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. 2073 2074 Default arguments and overloading (see Section 24) are complementary. 2075 While 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} 2080 void p( int x, int y = 2, int z = 3 ) {...} 2081 2082 2083 \end{cfa} 2084 & 2085 \begin{cfa} 2086 void p( int x, int y, int z ) {...} 2087 void p( int x ) { p( x, 2, 3 ); } 2088 void p( int x, int y ) { p( x, y, 3 ); } 2089 \end{cfa} 2090 \end{tabular} 2091 \end{quote2} 2092 the number of required overloaded routines is linear in the number of default values, which is unacceptable growth. 2093 In general, overloading should only be used over default arguments if the body of the routine is significantly different. 2094 Furthermore, overloading cannot handle accessing default arguments in the middle of a positional list, via a missing argument, such as: 2095 \begin{cfa} 2096 p( 1, /* default */, 5 ); §\C{// rewrite $\Rightarrow$ p( 1, 2, 5 )}§ 2097 \end{cfa} 2098 2099 Given 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 2106 C requires each field of a structure to have a name, except for a bit field associated with a basic type, \eg: 2107 \begin{cfa} 2108 struct { 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} 2117 This requirement is relaxed by making the field name optional for all field declarations; therefore, all the field declarations in the example are allowed. 2118 As for unnamed bit fields, an unnamed field is used for padding a structure to a particular size. 2119 A list of unnamed fields is also supported, \eg: 2120 \begin{cfa} 2121 struct { 2122 int , , ; §\C{// 3 unnamed fields}§ 2123 } 2124 \end{cfa} 2125 2126 2127 \section{Nesting} 2128 2129 Nesting 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} 2141 struct 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 2151 int 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} 2160 enum C { R, G, B }; 2161 union U { int i, j; }; 2162 struct T { 2163 enum C c; 2164 short int i, j; 2165 }; 2166 struct S { 2167 struct T t; 2168 } s; 2169 2170 2171 2172 2173 2174 2175 2176 \end{cfa} 2177 & 2178 \begin{cfa} 2179 struct 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 2189 int 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} 2200 In the left example in C, types ©C©, ©U© and ©T© are implicitly hoisted outside of type ©S© into the containing block scope. 2201 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 ``©::©''. 2202 2203 2204 \subsection{Routine Nesting} 2205 2206 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. 2207 For example, the C quick-sort is wrapped into the following polymorphic \CFA routine: 2208 \begin{cfa} 2209 forall( otype T | { int ?<?( T, T ); } ) 2210 void qsort( const T * arr, size_t dimension ); 2211 \end{cfa} 2212 which can be used to sort in ascending and descending order by locally redefining the less-than operator into greater-than. 2213 \begin{cfa} 2214 const unsigned int size = 5; 2215 int ia[size]; 2216 ... §\C{// assign values to array ia}§ 2217 qsort( 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 2224 Nested routines are not first-class, meaning a nested routine cannot be returned if it has references to variables in its enclosing blocks; 2225 the only exception is references to the external block of the translation unit, as these variables persist for the duration of the program. 2226 The 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 } 2236 int main() { 2237 * [int]( int ) fp = foo(); §\C{// int (*fp)( int )}§ 2238 sout | fp( 3 ) | endl; 2239 } 2240 \end{cfa} 2241 because 2242 2243 Currently, 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 2248 In 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.) 2250 A list of such elements is called a \newterm{lexical list}. 2251 The general syntax of a lexical list is: 2252 \begin{cfa} 2253 [ §\emph{exprlist}§ ] 2254 \end{cfa} 2255 where ©$\emph{exprlist}$© is a list of one or more expressions separated by commas. 2256 The brackets, ©[]©, allow differentiating between lexical lists and expressions containing the C comma operator. 2257 The 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} 2263 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. 2264 Note, a tuple is not a record (structure); 2265 a record denotes a single value with substructure, whereas a tuple is multiple values with no substructure (see flattening coercion in Section 12.1). 2266 In essence, tuples are largely a compile time phenomenon, having little or no runtime presence. 2267 2268 Tuples can be organized into compile-time tuple variables; 2269 these variables are of \newterm{tuple type}. 2270 Tuple variables and types can be used anywhere lists of conventional variables and types can be used. 2271 The general syntax of a tuple type is: 2272 \begin{cfa} 2273 [ §\emph{typelist}§ ] 2274 \end{cfa} 2275 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. 2276 Examples 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} 2283 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. 2284 2285 Examples 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} 2291 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. 2292 2293 As mentioned, tuples can appear in contexts requiring a list of value, such as an argument list of a routine call. 2294 In unambiguous situations, the tuple brackets may be omitted, \eg a tuple that appears as an argument may have its 2295 square brackets omitted for convenience; therefore, the following routine invocations are equivalent: 2296 \begin{cfa} 2297 f( [ 1, x+2, fred() ] ); 2298 f( 1, x+2, fred() ); 2299 \end{cfa} 2300 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. 2301 For 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 */ 2307 f( [ 1, 2, 3 ] ); 2308 f( w1, 3 ); 2309 f( 1, w1 ); 2310 f( w2 ); 2311 g( [ 1, 2, 3 ] ); 2312 g( w1, 3 ); 2313 g( 1, w1 ); 2314 g( w2 ); 2315 \end{cfa} 2316 Note, in all cases 3 arguments are supplied even though the syntax may appear to supply less than 3. As mentioned, a 2317 tuple does not have structure like a record; a tuple is simply converted into a list of components. 2318 \begin{rationale} 2319 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. 2320 Using 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 2323 A tuple can contain a C comma expression, provided the expression containing the comma operator is enclosed in parentheses. 2324 For instance, the following tuples are equivalent: 2325 \begin{cfa} 2326 [ 1, 3, 5 ] 2327 [ 1, (2, 3), 5 ] 2328 \end{cfa} 2329 The second element of the second tuple is the expression (2, 3), which yields the result 3. 2330 This requirement is the same as for comma expressions in argument lists. 2331 2332 Type qualifiers, \ie const and volatile, may modify a tuple type. 2333 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: 2334 \begin{cfa} 2335 const volatile [ int, float, const int ] x; 2336 \end{cfa} 2337 is equivalent to: 2338 \begin{cfa} 2339 [ const volatile int, const volatile float, const volatile int ] x; 2340 \end{cfa} 2341 Declaration qualifiers can only appear at the start of a \CFA tuple declaration4, \eg: 2342 \begin{cfa} 2343 extern [ int, int ] w1; 2344 static [ int, int, int ] w2; 2345 \end{cfa} 2346 \begin{rationale} 2347 Unfortunately, C's syntax for subscripts precluded treating them as tuples. 2348 The C subscript list has the form ©[i][j]...© and not ©[i, j, ...]©. 2349 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. 2350 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. 2351 \end{rationale} 2352 2353 2354 \subsection{Tuple Coercions} 2355 2356 There are four coercions that can be performed on tuples and tuple variables: closing, opening, flattening and structuring. 2357 In addition, the coercion of dereferencing can be performed on a tuple variable to yield its value(s), as for other variables. 2358 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: 2359 \begin{cfa} 2360 [ int, int, int, int ] w; 2361 w = [ 1, 2, 3, 4 ]; 2362 \end{cfa} 2363 First the right-hand tuple is closed into a tuple value and then the tuple value is assigned. 2364 2365 An \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 2371 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: 2372 \begin{cfa} 2373 [ a, b, c, d ] = [ 1, [ 2, 3 ], 4 ]; 2374 \end{cfa} 2375 First the right-hand tuple is flattened and then the values are assigned individually. 2376 Flattening is also performed on tuple types. 2377 For example, the type ©[ int, [ int, int ], int ]© can be coerced, using flattening, into the type ©[ int, int, int, int ]©. 2378 2379 A \newterm{structuring coercion} is the opposite of flattening; 2380 a tuple is structured into a more complex nested tuple. 2381 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 ]©. 2382 In the following example, the last assignment illustrates all the tuple coercions: 2383 \begin{cfa} 2384 [ int, int, int, int ] w = [ 1, 2, 3, 4 ]; 2385 int x = 5; 2386 [ x, w ] = [ w, x ]; §\C{// all four tuple coercions}§ 2387 \end{cfa} 2388 Starting on the right-hand tuple in the last assignment statement, w is opened, producing a tuple of four values; 2389 therefore, the right-hand tuple is now the tuple ©[ [ 1, 2, 3, 4 ], 5 ]©. 2390 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. 2391 The tuple ©[ 2, 3, 4, 5 ]© is then closed to create a tuple value. 2392 Finally, ©x© is assigned ©1© and ©w© is assigned the tuple value using multiple assignment (see Section 14). 2393 \begin{rationale} 2394 A 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}. 2401 Mass assignment has the following form: 2402 \begin{cfa} 2403 [ §\emph{lvalue}§, ... , §\emph{lvalue}§ ] = §\emph{expr}§; 2404 \end{cfa} 2405 \index{lvalue} 2406 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. 2407 ©$\emph{expr}$© is any standard arithmetic expression. 2408 Clearly, the types of the entities being assigned must be type compatible with the value of the expression. 2409 2410 Mass assignment has parallel semantics, \eg the statement: 2411 \begin{cfa} 2412 [ x, y, z ] = 1.5; 2413 \end{cfa} 2414 is equivalent to: 2415 \begin{cfa} 2416 x = 1.5; y = 1.5; z = 1.5; 2417 \end{cfa} 2418 This semantics is not the same as the following in C: 2419 \begin{cfa} 2420 x = y = z = 1.5; 2421 \end{cfa} 2422 as conversions between intermediate assignments may lose information. 2423 A more complex example is: 2424 \begin{cfa} 2425 [ i, y[i], z ] = a + b; 2426 \end{cfa} 2427 which is equivalent to: 2428 \begin{cfa} 2429 t = a + b; 2430 a1 = &i; a2 = &y[i]; a3 = &z; 2431 *a1 = t; *a2 = t; *a3 = t; 2432 \end{cfa} 2433 The temporary ©t© is necessary to store the value of the expression to eliminate conversion issues. 2434 The temporaries for the addresses are needed so that locations on the left-hand side do not change as the values are assigned. 2435 In 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}. 2441 Multiple assignment has the following form: 2442 \begin{cfa} 2443 [ §\emph{lvalue}§, ... , §\emph{lvalue}§ ] = [ §\emph{expr}§, ... , §\emph{expr}§ ]; 2444 \end{cfa} 2445 \index{lvalue} 2446 The left-hand side is a tuple of \emph{lvalues}, and the right-hand side is a tuple of \emph{expr}s. 2447 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. 2448 An example of multiple assignment is: 2449 \begin{cfa} 2450 [ x, y, z ] = [ 1, 2, 3 ]; 2451 \end{cfa} 2452 Here, 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} 2457 Here, the values ©1©, ©i© and ©a + b© are assigned to the variables ©i©, ©y[i]© and ©z©, respectively. 2458 Note, the parallel semantics of 2459 multiple assignment ensures: 2460 \begin{cfa} 2461 [ x, y ] = [ y, x ]; 2462 \end{cfa} 2463 correctly interchanges (swaps) the values stored in ©x© and ©y©. 2464 The following cases are errors: 2465 \begin{cfa} 2466 [ a, b, c ] = [ 1, 2, 3, 4 ]; 2467 [ a, b, c ] = [ 1, 2 ]; 2468 \end{cfa} 2469 because the number of entities in the left-hand tuple is unequal with the right-hand tuple. 2470 2471 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; 2472 both these examples produce indeterminate results: 2473 \begin{cfa} 2474 f( 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 2481 As in C, \CFA mass and multiple assignments can be cascaded, producing cascade assignment. 2482 Cascade assignment has the following form: 2483 \begin{cfa} 2484 §\emph{tuple}§ = §\emph{tuple}§ = ... = §\emph{tuple}§; 2485 \end{cfa} 2486 and it has the same parallel semantics as for mass and multiple assignment. 2487 Some examples of cascade assignment are: 2488 \begin{cfa} 2489 x1 = 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} 2494 As in C, the rightmost assignment is performed first, \ie assignment parses right to left. 2495 2496 2497 \section{Field Tuples} 2498 2499 Tuples may be used to select multiple fields of a record by field name. 2500 Its 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©. 2506 Each element of \emph{ fieldlist} is an element of the record specified by \emph{expr}. 2507 A record-field tuple may be used anywhere a tuple can be used. An example of the use of a record-field tuple is 2508 the following: 2509 \begin{cfa} 2510 struct s { 2511 int f1, f2; 2512 char f3; 2513 double f4; 2514 } v; 2515 v.[ f3, f1, f2 ] = ['x', 11, 17 ]; §\C{// equivalent to v.f3 = 'x', v.f1 = 11, v.f2 = 17}§ 2516 f( v.[ f3, f1, f2 ] ); §\C{// equivalent to f( v.f3, v.f1, v.f2 )}§ 2517 \end{cfa} 2518 Note, the fields appearing in a record-field tuple may be specified in any order; 2519 also, it is unnecessary to specify all the fields of a struct in a multiple record-field tuple. 2520 2521 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: 2522 \begin{cfa} 2523 struct inner { 2524 int f2, f3; 2525 }; 2526 struct outer { 2527 int f1; 2528 struct inner i; 2529 double f4; 2530 } o; 2531 2532 o.[ f1, i.[ f2, f3 ], f4 ] = [ 11, 12, 13, 3.14159 ]; 2533 \end{cfa} 2397 2534 2398 2535 … … 2402 2539 2403 2540 The 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. 2541 The approach combines ideas from \CC and Python. 2404 2542 The \CFA header file for the I/O library is \Indexc{fstream}. 2405 2543 … … 2418 2556 \end{cfa} 2419 2557 \\ 2420 \begin{cfa}[ mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]2421 1 232558 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt] 2559 1® ®2® ®3 2422 2560 \end{cfa} 2423 2561 & 2424 \begin{cfa}[ mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]2562 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt] 2425 2563 1 2 3 2426 2564 \end{cfa} 2427 2565 \end{tabular} 2428 2566 \end{quote2} 2429 The \CFA form has half as many characters asthe \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];2567 The \CFA form has half the characters of the \CC form, and is similar to \Index*{Python} I/O with respect to implicit separators. 2568 Similar 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 ] ]; 2433 2571 sout | t1 | t2 | endl; §\C{// print tuples}§ 2434 2572 \end{cfa} 2435 \begin{cfa}[ mathescape=off,showspaces=true,belowskip=0pt]2436 1 , 2, 3, 42437 \end{cfa} 2438 \CFA uses the logical-or operator for I/O becauseit is the lowest-priority overloadable operator, other than assignment.2573 \begin{cfa}[showspaces=true,aboveskip=0pt] 2574 1®, ®2®, ®3 4®, ®5®, ®6 2575 \end{cfa} 2576 Finally, \CFA uses the logical-or operator for I/O as it is the lowest-priority overloadable operator, other than assignment. 2439 2577 Therefore, fewer output expressions require parenthesis. 2440 2578 \begin{quote2} … … 2453 2591 \\ 2454 2592 & 2455 \begin{cfa}[ mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]2593 \begin{cfa}[showspaces=true,aboveskip=0pt] 2456 2594 3 3 12 0 3 1 2 2457 2595 \end{cfa} 2458 2596 \end{tabular} 2459 2597 \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. 2598 There 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 2603 The \Index{implicit separator}\index{I/O!separator} character (space/blank) is a separator not a terminator. 2464 2604 The rules for implicitly adding the separator are: 2465 2605 \begin{enumerate} … … 2469 2609 sout | 1 | 2 | 3 | endl; 2470 2610 \end{cfa} 2471 \begin{cfa}[ mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt]2611 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt] 2472 2612 1 2 3 2473 2613 \end{cfa} … … 2533 2673 \end{enumerate} 2534 2674 2535 The following routines and \CC-style \Index{manipulator}s control implicit seperation. 2675 2676 \subsection{Manipulator} 2677 2678 The following \CC-style \Index{manipulator}s and routines control implicit seperation. 2536 2679 \begin{enumerate} 2537 2680 \item 2538 Routines \Indexc{sepSet}\index{manipulator!sepSet@©sepSet©} and \Indexc{sep Get}\index{manipulator!sepGet@©sepGet©} set and get the separator string.2681 Routines \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. 2539 2682 The 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] 2541 2684 sepSet( sout, ", $" ); §\C{// set separator from " " to ", \$"}§ 2542 sout | 1 | 2 | 3 | " \"" | ®sep Get( sout )® | "\"" | endl;2685 sout | 1 | 2 | 3 | " \"" | ®sep® | "\"" | endl; 2543 2686 \end{cfa} 2544 2687 %$ 2545 2688 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt] 2546 1 , $2, $3 ®", $"®2689 1®, $®2®, $®3 ®", $"® 2547 2690 \end{cfa} 2548 2691 %$ 2549 \begin{cfa}[ mathescape=off,aboveskip=0pt,belowskip=0pt]2692 \begin{cfa}[belowskip=0pt] 2550 2693 sepSet( sout, " " ); §\C{// reset separator to " "}§ 2551 2694 sout | 1 | 2 | 3 | " \"" | ®sepGet( sout )® | "\"" | endl; 2552 2695 \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] 2697 1® ®2® ®3 ®" "® 2698 \end{cfa} 2699 ©sepGet© can be used to store a separator and then restore it: 2700 \begin{cfa}[belowskip=0pt] 2701 char store[®sepSize®]; §\C{// sepSize is the maximum separator size}§ 2702 strcpy( store, sepGet( sout ) ); §\C{// copy current separator}§ 2703 sepSet( sout, "_" ); §\C{// change separator to underscore}§ 2704 sout | 1 | 2 | 3 | endl; 2705 \end{cfa} 2706 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt] 2707 1®_®2®_®3 2708 \end{cfa} 2709 \begin{cfa}[belowskip=0pt] 2710 sepSet( sout, store ); §\C{// change separator back to original}§ 2711 sout | 1 | 2 | 3 | endl; 2712 \end{cfa} 2713 \begin{cfa}[showspaces=true,aboveskip=0pt] 2714 1® ®2® ®3 2715 \end{cfa} 2716 2717 \item 2718 Routine \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. 2719 The tuple separator-string can be at most 16 characters including the ©'\0'© string terminator (15 printable characters). 2720 \begin{cfa}[belowskip=0pt] 2721 sepSetTuple( sout, " " ); §\C{// set tuple separator from ", " to " "}§ 2722 sout | t1 | t2 | " \"" | ®sepTuple® | "\"" | endl; 2723 \end{cfa} 2724 \begin{cfa}[showspaces=true,aboveskip=0pt] 2725 1 2 3 4 5 6 ®" "® 2726 \end{cfa} 2727 \begin{cfa}[belowskip=0pt] 2728 sepSetTuple( sout, ", " ); §\C{// reset tuple separator to ", "}§ 2729 sout | t1 | t2 | " \"" | ®sepGetTuple( sout )® | "\"" | endl; 2730 \end{cfa} 2731 \begin{cfa}[showspaces=true,aboveskip=0pt] 2732 1, 2, 3 4, 5, 6 ®", "® 2733 \end{cfa} 2734 As for ©sepGet©, ©sepGetTuple© can be use to store a tuple separator and then restore it. 2735 2736 \item 2737 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. 2738 \begin{cfa}[belowskip=0pt] 2739 sout | sepDisable | 1 | 2 | 3 | endl; §\C{// globally turn off implicit separator}§ 2740 \end{cfa} 2741 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt] 2578 2742 123 2579 2743 \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] 2745 sout | sepEnable | 1 | 2 | 3 | endl; §\C{// globally turn on implicit separator}§ 2588 2746 \end{cfa} 2589 2747 \begin{cfa}[mathescape=off,showspaces=true,aboveskip=0pt,belowskip=0pt] … … 2592 2750 2593 2751 \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. 2752 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. 2753 \begin{cfa}[belowskip=0pt] 2754 sout | 1 | sepOff | 2 | 3 | endl; §\C{// locally turn off implicit separator}§ 2755 \end{cfa} 2756 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt] 2757 12 3 2758 \end{cfa} 2759 \begin{cfa}[belowskip=0pt] 2760 sout | sepDisable | 1 | sepOn | 2 | 3 | endl; §\C{// locally turn on implicit separator}§ 2761 \end{cfa} 2762 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt] 2763 1 23 2764 \end{cfa} 2765 The tuple separator also responses to being turned on and off. 2766 \begin{cfa}[belowskip=0pt] 2767 sout | t1 | sepOff | t2 | endl; §\C{// locally turn on/off implicit separator}§ 2768 \end{cfa} 2769 \begin{cfa}[showspaces=true,aboveskip=0pt,belowskip=0pt] 2770 1, 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; 2773 use ©sep© to accomplish this functionality. 2774 \begin{cfa}[belowskip=0pt] 2775 sout | 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] 2778 1 2 3 2779 \end{cfa} 2780 \begin{cfa}[belowskip=0pt] 2781 sout | 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} 2620 2786 \end{enumerate} 2621 2787 2622 2788 \begin{comment} 2623 2789 #include <fstream> 2790 #include <string.h> // strcpy 2624 2791 2625 2792 int main( void ) { 2626 2793 int x = 1, y = 2, z = 3; 2627 2794 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 2630 2797 sout | x * 3 | y + 1 | z << 2 | x == y | (x | y) | (x || y) | (x > z ? 1 : 2) | endl; 2631 2798 sout | 1 | 2 | 3 | endl; … … 2640 2807 2641 2808 sepSet( sout, ", $" ); // set separator from " " to ", $" 2642 sout | 1 | 2 | 3 | " \"" | sep Get( sout )| "\"" | endl;2809 sout | 1 | 2 | 3 | " \"" | sep | "\"" | endl; 2643 2810 sepSet( sout, " " ); // reset separator to " " 2644 2811 sout | 1 | 2 | 3 | " \"" | sepGet( sout ) | "\"" | endl; 2645 2812 2646 sout | sepOn | 1 | 2 | 3 | sepOn | endl; // separator at start of line2647 s out | 1 | sepOff | 2 | 3 | endl; // locally turn off implicit separator2648 2649 sout | sepDisable | 1 | 2 | 3 | endl; // globally turn off implicit separation2650 s out | 1 | sepOn | 2 | 3 | endl; // locally turn on implicit separator2651 sout | sepEnable | 1 | 2 | 3 | endl; // globally turn on implicit separation2813 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; 2652 2819 2653 2820 sepSetTuple( sout, " " ); // set tuple separator from ", " to " " 2654 sout | t1 | t2 | " \"" | sep GetTuple( sout )| "\"" | endl;2821 sout | t1 | t2 | " \"" | sepTuple | "\"" | endl; 2655 2822 sepSetTuple( sout, ", " ); // reset tuple separator to ", " 2656 2823 sout | t1 | t2 | " \"" | sepGetTuple( sout ) | "\"" | endl; 2657 2824 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 2660 2835 } 2661 2836 … … 5189 5364 5190 5365 5191 \section{\ protect\CFA Keywords}5366 \section{\texorpdfstring{\CFA Keywords}{Cforall Keywords}} 5192 5367 \label{s:CFAKeywords} 5193 5368 5369 \CFA introduces the following new keywords. 5370 5194 5371 \begin{quote2} 5195 \begin{tabular}{llll }5372 \begin{tabular}{lllll} 5196 5373 \begin{tabular}{@{}l@{}} 5197 ©_A T© \\5374 ©_At© \\ 5198 5375 ©catch© \\ 5199 5376 ©catchResume© \\ 5200 5377 ©choose© \\ 5201 5378 ©coroutine© \\ 5202 ©disable© \\5203 5379 \end{tabular} 5204 5380 & 5205 5381 \begin{tabular}{@{}l@{}} 5382 ©disable© \\ 5206 5383 ©dtype© \\ 5207 5384 ©enable© \\ 5208 5385 ©fallthrough© \\ 5209 5386 ©fallthru© \\ 5210 ©finally© \\5211 ©forall© \\5212 5387 \end{tabular} 5213 5388 & 5214 5389 \begin{tabular}{@{}l@{}} 5390 ©finally© \\ 5391 ©forall© \\ 5215 5392 ©ftype© \\ 5216 5393 ©lvalue© \\ 5217 5394 ©monitor© \\ 5395 \end{tabular} 5396 & 5397 \begin{tabular}{@{}l@{}} 5218 5398 ©mutex© \\ 5219 5399 ©one_t© \\ 5220 5400 ©otype© \\ 5401 ©throw© \\ 5402 ©throwResume© \\ 5221 5403 \end{tabular} 5222 5404 & 5223 5405 \begin{tabular}{@{}l@{}} 5224 ©throw© \\5225 ©throwResume© \\5226 5406 ©trait© \\ 5227 5407 ©try© \\ 5228 5408 ©ttype© \\ 5229 5409 ©zero_t© \\ 5410 \\ 5230 5411 \end{tabular} 5231 5412 \end{tabular} … … 5402 5583 \Celeven prescribes the following standard header-files~\cite[\S~7.1.2]{C11} and \CFA adds to this list: 5403 5584 \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} \\ 5407 5587 \hline 5408 5588 \begin{tabular}{@{}l@{}} … … 5412 5592 \Indexc{errno.h} \\ 5413 5593 \Indexc{fenv.h} \\ 5414 \Indexc{float.h} \\ 5415 \Indexc{inttypes.h} \\ 5416 \Indexc{iso646.h} \\ 5594 \Indexc[deletekeywords=float]{float.h} \\ 5417 5595 \end{tabular} 5418 5596 & 5419 5597 \begin{tabular}{@{}l@{}} 5598 \Indexc{inttypes.h} \\ 5599 \Indexc{iso646.h} \\ 5420 5600 \Indexc{limits.h} \\ 5421 5601 \Indexc{locale.h} \\ 5422 5602 \Indexc{math.h} \\ 5423 5603 \Indexc{setjmp.h} \\ 5604 \end{tabular} 5605 & 5606 \begin{tabular}{@{}l@{}} 5424 5607 \Indexc{signal.h} \\ 5425 5608 \Indexc{stdalign.h} \\ 5426 5609 \Indexc{stdarg.h} \\ 5427 5610 \Indexc{stdatomic.h} \\ 5611 \Indexc{stdbool.h} \\ 5612 \Indexc{stddef.h} \\ 5428 5613 \end{tabular} 5429 5614 & 5430 5615 \begin{tabular}{@{}l@{}} 5431 \Indexc{stdbool.h} \\5432 \Indexc{stddef.h} \\5433 5616 \Indexc{stdint.h} \\ 5434 5617 \Indexc{stdio.h} \\ … … 5446 5629 \Indexc{wctype.h} \\ 5447 5630 \\ 5448 \\5449 \\5450 5631 \end{tabular} 5451 5632 & … … 5453 5634 \Indexc{unistd.h} \\ 5454 5635 \Indexc{gmp.h} \\ 5455 \\5456 \\5457 5636 \\ 5458 5637 \\ … … 5487 5666 For an increase in storage size, new storage after the copied data may be filled. 5488 5667 \item[alignment] 5489 an allocation starts on a specified memory boundary, e.g., an address multiple of 64 or 128 for cache-line purposes.5668 an allocation starts on a specified memory boundary, \eg, an address multiple of 64 or 128 for cache-line purposes. 5490 5669 \item[array] 5491 5670 the allocation size is scaled to the specified number of array elements. … … 5494 5673 The table shows allocation routines supporting different combinations of storage-management capabilities: 5495 5674 \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 \\ 5498 5677 \hline 5499 5678 C & ©malloc© & no & no & no & no \\ … … 5502 5681 & ©memalign© & no & no & yes & no \\ 5503 5682 & ©posix_memalign© & no & no & yes & no \\ 5683 \hline 5504 5684 C11 & ©aligned_alloc© & no & no & yes & no \\ 5685 \hline 5505 5686 \CFA & ©alloc© & no/copy/yes & no/yes & no & yes \\ 5506 5687 & ©align_alloc© & no/yes & no & yes & yes \\ … … 5513 5694 // C unsafe allocation 5514 5695 extern "C" { 5515 void * mall ac( size_t size );§\indexc{memset}§5696 void * malloc( size_t size );§\indexc{memset}§ 5516 5697 void * calloc( size_t dim, size_t size );§\indexc{calloc}§ 5517 5698 void * realloc( void * ptr, size_t size );§\indexc{realloc}§ -
src/CodeGen/CodeGenerator.cc
rfea3faa rb826e6b 14 14 // 15 15 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... 32 18 33 19 #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... 38 36 39 37 using namespace std; … … 288 286 } 289 287 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(); 292 290 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 member291 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 296 294 output << "."; 297 (*iter)->accept( *this );295 des->accept( *this ); 298 296 } else { 299 // if not a simple name, it has to be a constant expression, i.e. an array designator297 // otherwise, it has to be a ConstantExpr or CastExpr, initializing array eleemnt 300 298 output << "["; 301 (*iter)->accept( *this );299 des->accept( *this ); 302 300 output << "]"; 303 301 } // if … … 307 305 308 306 void CodeGenerator::visit( SingleInit * init ) { 309 printDesignators( init->get_designators() );310 307 init->get_value()->accept( *this ); 311 308 } 312 309 313 310 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 315 316 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 } 317 325 output << " }"; 326 assertf( initBegin == initEnd && desigBegin == desigEnd, "Initializers and designators not the same length. %s", toString( init ).c_str() ); 318 327 } 319 328 … … 716 725 717 726 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 } 720 732 } 721 733 -
src/CodeGen/CodeGenerator.h
rfea3faa rb826e6b 17 17 #define CODEGENV_H 18 18 19 #include <list> 19 #include <list> // for list 20 #include <ostream> // for ostream, operator<< 21 #include <string> // for string 20 22 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 28 26 29 27 namespace CodeGen { … … 47 45 48 46 //*** Initializer 47 virtual void visit( Designation * ); 49 48 virtual void visit( SingleInit * ); 50 49 virtual void visit( ListInit * ); … … 137 136 bool lineMarks = false; 138 137 139 void printDesignators( std::list< Expression * > & );140 138 void handleStorageClass( DeclarationWithType *decl ); 141 139 void handleAggregate( AggregateDecl *aggDecl, const std::string & kind ); -
src/CodeGen/FixMain.cc
rfea3faa rb826e6b 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // FixMain.cc -- 7 // FixMain.cc -- 8 8 // 9 9 // Author : Thierry Delisle 10 10 // 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 : 13 13 // Update Count : 0 14 14 // 15 15 16 16 17 #include "FixMain.h" 17 #include "FixMain.h" 18 18 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<< 21 23 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 24 27 25 28 namespace CodeGen { 26 29 bool FixMain::replace_main = false; 27 30 std::unique_ptr<FunctionDecl> FixMain::main_signature = nullptr; 28 29 void FixMain::registerMain(FunctionDecl* functionDecl) 31 32 void FixMain::registerMain(FunctionDecl* functionDecl) 30 33 { 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); 33 36 } 34 37 main_signature.reset( functionDecl->clone() ); -
src/CodeGen/FixNames.cc
rfea3faa rb826e6b 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Jun 2 1 14:22:59201713 // Update Count : 1911 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed Jun 28 15:26:00 2017 13 // Update Count : 20 14 14 // 15 15 16 #include <memory>16 #include "FixNames.h" 17 17 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 25 32 26 33 namespace CodeGen { … … 42 49 main_type = new FunctionType( Type::Qualifiers(), true ), nullptr ) 43 50 }; 44 main_type->get_returnVals().push_back( 51 main_type->get_returnVals().push_back( 45 52 new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr ) 46 53 ); … … 52 59 std::string mangle_main_args() { 53 60 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, 55 62 main_type = new FunctionType( Type::Qualifiers(), false ), nullptr ) 56 63 }; 57 main_type->get_returnVals().push_back( 64 main_type->get_returnVals().push_back( 58 65 new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr ) 59 66 ); 60 67 61 mainDecl->get_functionType()->get_parameters().push_back( 68 mainDecl->get_functionType()->get_parameters().push_back( 62 69 new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr ) 63 70 ); 64 71 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 ) ) ), 68 75 nullptr ) 69 76 ); … … 75 82 76 83 bool is_main(const std::string& name) { 77 static std::string mains[] = { 78 mangle_main(), 84 static std::string mains[] = { 85 mangle_main(), 79 86 mangle_main_args() 80 87 }; … … 93 100 void FixNames::fixDWT( DeclarationWithType *dwt ) { 94 101 if ( dwt->get_name() != "" ) { 95 if ( LinkageSpec::is Decoratable( dwt->get_linkage() ) ) {102 if ( LinkageSpec::isMangled( dwt->get_linkage() ) ) { 96 103 dwt->set_mangleName( SymTab::Mangler::mangle( dwt ) ); 97 104 dwt->set_scopeLevel( scopeLevel ); … … 112 119 int nargs = functionDecl->get_functionType()->get_parameters().size(); 113 120 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); 115 122 } 116 123 functionDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new ConstantExpr( Constant::from_int( 0 ) ) ) ); -
src/CodeGen/FixNames.h
rfea3faa rb826e6b 17 17 #define FIXNAMES_H 18 18 19 #include "SynTree/SynTree.h" 19 #include <list> // for list 20 21 class Declaration; 20 22 21 23 namespace CodeGen { -
src/CodeGen/GenType.cc
rfea3faa rb826e6b 14 14 // 15 15 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 19 21 #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 26 26 27 27 namespace CodeGen { -
src/CodeGen/GenType.h
rfea3faa rb826e6b 17 17 #define _GENTYPE_H 18 18 19 #include <string> 20 #include "SynTree/SynTree.h" 19 #include <string> // for string 20 21 class Type; 21 22 22 23 namespace CodeGen { -
src/CodeGen/Generate.cc
rfea3faa rb826e6b 14 14 // 15 15 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<< 20 19 20 #include "CodeGenerator.h" // for CodeGenerator, doSemicolon, oper... 21 #include "GenType.h" // for genPrettyType 21 22 #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 29 27 30 28 using namespace std; -
src/CodeGen/Generate.h
rfea3faa rb826e6b 17 17 #define GENERATE_H 18 18 19 #include < list>20 #include < iostream>19 #include <iostream> // for ostream 20 #include <list> // for list 21 21 22 #include "SynTree/SynTree.h" 22 class BaseSyntaxNode; 23 class Declaration; 23 24 24 25 namespace CodeGen { -
src/CodeGen/OperatorTable.cc
rfea3faa rb826e6b 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Dec 13 14:33:05 201613 // Update Count : 1 012 // Last Modified On : Sat Jul 15 17:12:22 2017 13 // Update Count : 15 14 14 // 15 15 16 #include <map> 16 #include <map> // for map, _Rb_tree_const_iterator, map<>::const_iterator 17 #include <utility> // for pair 18 17 19 #include "OperatorTable.h" 18 20 … … 33 35 { "++?", "++", "_operator_preincr", OT_PREFIXASSIGN }, 34 36 { "--?", "--", "_operator_predecr", OT_PREFIXASSIGN }, 37 { "?\\?", "\\", "_operator_exponential", OT_INFIX }, 35 38 { "?*?", "*", "_operator_multiply", OT_INFIX }, 36 39 { "?/?", "/", "_operator_divide", OT_INFIX }, … … 50 53 { "?|?", "|", "_operator_bitor", OT_INFIX }, 51 54 { "?=?", "=", "_operator_assign", OT_INFIXASSIGN }, 55 { "?\\=?", "\\=", "_operator_expassign", OT_INFIXASSIGN }, 52 56 { "?*=?", "*=", "_operator_multassign", OT_INFIXASSIGN }, 53 57 { "?/=?", "/=", "_operator_divassign", OT_INFIXASSIGN }, -
src/CodeTools/DeclStats.cc
rfea3faa rb826e6b 16 16 #include "DeclStats.h" 17 17 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 30 34 31 35 namespace CodeTools { 32 36 33 37 class DeclStats : public Visitor { 34 38 template<typename T> … … 75 79 sum(n_types, o.n_types); 76 80 sum(p_new, o.p_new); 77 81 78 82 return *this; 79 83 } 80 84 }; 81 85 82 86 struct Stats { 83 87 unsigned n_decls; ///< Total number of declarations … … 98 102 /// Stats for the return list 99 103 ArgPackStats returns; 100 104 101 105 /// Count of declarations with each number of assertions 102 106 std::map<unsigned, unsigned> n_assns; … … 105 109 /// Stats for the assertions' return types 106 110 ArgPackStats assn_returns; 107 111 108 112 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() {} 109 113 … … 122 126 sum( assn_params, o.assn_params ); 123 127 sum( assn_returns, o.assn_returns ); 124 128 125 129 return *this; 126 130 } … … 144 148 145 149 n += dt->size(); 146 150 147 151 std::stringstream ss; 148 152 dt->print( ss ); … … 176 180 ++pstats.n_types.at( types.size() ); 177 181 } 178 182 179 183 void analyzeFunc( FunctionType* fnTy, Stats& stats, ArgPackStats& params, ArgPackStats& returns ) { 180 184 std::unordered_set<std::string> seen; … … 186 190 auto& args = expr->get_args(); 187 191 unsigned fanout = args.size(); 188 192 189 193 ++exprs_by_fanout_at_depth[ std::make_pair(depth, fanout) ]; 190 194 for ( Expression* arg : args ) { … … 205 209 return; 206 210 } 207 211 208 212 Stats& stats = for_linkage[ decl->get_linkage() ]; 209 213 … … 323 327 } 324 328 325 void printPairMap( const std::string& name, 329 void printPairMap( const std::string& name, 326 330 const std::map<std::pair<unsigned, unsigned>, unsigned>& map ) { 327 331 for ( const auto& entry : map ) { 328 332 const auto& key = entry.first; 329 std::cout << "\"" << name << "\"," << key.first << "," << key.second << "," 333 std::cout << "\"" << name << "\"," << key.first << "," << key.second << "," 330 334 << entry.second << std::endl; 331 335 } 332 336 } 333 337 334 338 public: 335 339 void print() { … … 366 370 stats.print(); 367 371 } 368 372 369 373 } // namespace CodeTools 370 374 -
src/CodeTools/DeclStats.h
rfea3faa rb826e6b 17 17 #define DECLSTATS_H 18 18 19 #include "SynTree/SynTree.h" 19 #include <list> // for list 20 21 class Declaration; 20 22 21 23 namespace CodeTools { -
src/CodeTools/TrackLoc.cc
rfea3faa rb826e6b 16 16 #include "TrackLoc.h" 17 17 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 19 24 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 25 32 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" 33 class Declaration; 33 34 34 35 namespace CodeTools { -
src/CodeTools/TrackLoc.h
rfea3faa rb826e6b 17 17 #define TRACKLOC_H 18 18 19 #include "SynTree/SynTree.h" 19 #include <cstddef> // for size_t 20 #include <list> // for list 21 22 class Declaration; 20 23 21 24 namespace CodeTools { -
src/Common/Assert.cc
rfea3faa rb826e6b 14 14 // 15 15 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 20 19 21 20 extern const char * __progname; // global name of running executable (argv[0]) -
src/Common/PassVisitor.h
rfea3faa rb826e6b 12 12 #include "SynTree/Expression.h" 13 13 #include "SynTree/Constant.h" 14 #include "SynTree/TypeSubstitution.h" 14 15 15 16 #include "PassVisitor.proto.h" … … 26 27 // stmtsToAddBefore or stmtsToAddAfter respectively. 27 28 // | WithShortCircuiting - provides the ability to skip visiting child nodes; set visit_children to false in pre{visit,mutate} to skip visiting children 28 // | With Scopes - provides the ability to save/restore data like a LIFO stack; to save, call GuardValue with the variable to save, the variable29 // | WithGuards - provides the ability to save/restore data like a LIFO stack; to save, call GuardValue with the variable to save, the variable 29 30 // will automatically be restored to its previous value after the corresponding postvisit/postmutate teminates. 30 31 //------------------------------------------------------------------------------------------------------------------------------------------------------------------------- … … 32 33 class PassVisitor final : public Visitor, public Mutator { 33 34 public: 34 PassVisitor() = default;35 35 36 36 template< typename... Args > … … 257 257 258 258 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 }270 259 }; 271 260 … … 283 272 284 273 public: 285 TypeSubstitution * env ;274 TypeSubstitution * env = nullptr; 286 275 }; 287 276 … … 295 284 std::list< Statement* > stmtsToAddAfter; 296 285 }; 286 287 class WithDeclsToAdd { 288 protected: 289 WithDeclsToAdd() = default; 290 ~WithDeclsToAdd() = default; 291 292 public: 293 std::list< Declaration* > declsToAddBefore; 294 std::list< Declaration* > declsToAddAfter; 295 }; 296 297 297 class WithShortCircuiting { 298 298 protected: … … 304 304 }; 305 305 306 class With Scopes {307 protected: 308 With Scopes() = default;309 ~With Scopes() = default;306 class WithGuards { 307 protected: 308 WithGuards() = default; 309 ~WithGuards() = default; 310 310 311 311 public: … … 318 318 }, static_cast< void * >( & val ) ); 319 319 } 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 } 320 333 }; 321 334 … … 323 336 class WithVisitorRef { 324 337 protected: 325 WithVisitorRef() = default;326 ~WithVisitorRef() = default;327 328 public: 329 PassVisitor<pass_type> * const visitor ;338 WithVisitorRef() {} 339 ~WithVisitorRef() {} 340 341 public: 342 PassVisitor<pass_type> * const visitor = nullptr; 330 343 }; 331 344 -
src/Common/PassVisitor.impl.h
rfea3faa rb826e6b 3 3 #define VISIT_START( node ) \ 4 4 __attribute__((unused)) \ 5 const auto & guard = init_guard();\5 guard_value_impl guard( at_cleanup_impl(pass, 0) ); \ 6 6 bool visit_children = true; \ 7 7 set_visit_children( visit_children ); \ … … 15 15 #define MUTATE_START( node ) \ 16 16 __attribute__((unused)) \ 17 const auto & guard = init_guard();\17 guard_value_impl guard( at_cleanup_impl(pass, 0) ); \ 18 18 bool visit_children = true; \ 19 19 set_visit_children( visit_children ); \ … … 68 68 for ( std::list< Declaration* >::iterator i = decls.begin(); ; ++i ) { 69 69 // splice in new declarations after previous decl 70 if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); } 70 if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); } 71 71 72 72 if ( i == decls.end() ) break; … … 88 88 for ( std::list< Declaration* >::iterator i = decls.begin(); ; ++i ) { 89 89 // splice in new declarations after previous decl 90 if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); } 90 if ( !empty( afterDecls ) ) { decls.splice( i, *afterDecls ); } 91 91 92 92 if ( i == decls.end() ) break; … … 104 104 void PassVisitor< pass_type >::handleStatementList( std::list< Statement * > & statements, func_t func ) { 105 105 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 () ); 106 112 107 113 StmtList_t* beforeStmts = get_beforeStmts(); … … 181 187 Statement * PassVisitor< pass_type >::visitStatement( Statement * stmt ) { 182 188 return handleStatement( stmt, [this]( Statement * stmt ) { 183 maybeAccept( stmt, *this ); 189 maybeAccept( stmt, *this ); 184 190 return stmt; 185 191 }); … … 212 218 expr->accept( *this ); 213 219 return expr; 214 }); 220 }); 215 221 } 216 222 … … 565 571 VISIT_START( node ); 566 572 573 // maybeAccept( node->get_env(), *this ); 574 maybeAccept( node->get_result(), *this ); 575 567 576 for ( auto expr : node->get_args() ) { 568 577 visitExpression( expr ); … … 575 584 Expression * PassVisitor< pass_type >::mutate( UntypedExpr * node ) { 576 585 MUTATE_START( node ); 586 587 node->set_env( maybeMutate( node->get_env(), *this ) ); 588 node->set_result( maybeMutate( node->get_result(), *this ) ); 577 589 578 590 for ( auto& expr : node->get_args() ) { -
src/Common/PassVisitor.proto.h
rfea3faa rb826e6b 5 5 6 6 typedef std::function<void( void * )> cleanup_func_t; 7 typedef std::function< void( cleanup_func_t, void * ) > at_cleanup_t; 7 8 8 9 class guard_value_impl { 9 10 public: 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 } 11 18 12 19 ~guard_value_impl() { … … 33 40 }; 34 41 35 typedef std::function< void( cleanup_func_t, void * ) > at_cleanup_t;36 42 37 43 class bool_ref { … … 56 62 // Deep magic (a.k.a template meta programming) to make the templated visitor work 57 63 // 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 59 65 // 'pass.previsit( node )' that compiles will be used for that node for that type 60 66 // This requires that this option only compile for passes that actually define an appropriate visit. -
src/Common/SemanticError.cc
rfea3faa rb826e6b 14 14 // 15 15 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 21 21 22 #include "Common/utility.h" // for to_string, CodeLocation (ptr only) 22 23 #include "SemanticError.h" 23 24 #include <unistd.h>25 24 26 25 inline const std::string& error_str() { -
src/Common/SemanticError.h
rfea3faa rb826e6b 17 17 #define SEMANTICERROR_H 18 18 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 24 23 25 #include "utility.h" 24 #include "utility.h" // for CodeLocation, toString 26 25 27 26 struct error { -
src/Common/utility.h
rfea3faa rb826e6b 305 305 // for ( val : group_iterate( container1, container2, ... ) ) {} 306 306 // 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 308 308 309 309 template< typename T1, typename T2 > -
src/Concurrency/Keywords.cc
rfea3faa rb826e6b 17 17 #include "Concurrency/Keywords.h" 18 18 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 36 class Attribute; 27 37 28 38 namespace Concurrency { … … 322 332 if( needs_main ) { 323 333 FunctionType * main_type = new FunctionType( noQualifiers, false ); 324 334 325 335 main_type->get_parameters().push_back( this_decl->clone() ); 326 336 … … 361 371 void ConcurrentSueKeyword::addRoutines( ObjectDecl * field, FunctionDecl * func ) { 362 372 CompoundStmt * statement = new CompoundStmt( noLabels ); 363 statement->push_back( 373 statement->push_back( 364 374 new ReturnStmt( 365 375 noLabels, … … 386 396 //============================================================================================= 387 397 void MutexKeyword::visit(FunctionDecl* decl) { 388 Visitor::visit(decl); 398 Visitor::visit(decl); 389 399 390 400 std::list<DeclarationWithType*> mutexArgs = findMutexArgs( decl ); … … 510 520 void ThreadStarter::visit(FunctionDecl * decl) { 511 521 Visitor::visit(decl); 512 522 513 523 if( ! InitTweak::isConstructor(decl->get_name()) ) return; 514 524 … … 528 538 if( ! stmt ) return; 529 539 530 stmt->push_back( 540 stmt->push_back( 531 541 new ExprStmt( 532 542 noLabels, -
src/Concurrency/Keywords.h
rfea3faa rb826e6b 18 18 #define KEYWORDS_H 19 19 20 #include <list> 20 #include <list> // for list 21 21 22 #include "SynTree/Declaration.h" 22 class Declaration; 23 23 24 24 namespace Concurrency { -
src/ControlStruct/ExceptTranslate.cc
rfea3faa rb826e6b 10 10 // Created On : Wed Jun 14 16:49:00 2017 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : T hr Jun 22 15:57:00 201713 // Update Count : 012 // Last Modified On : Tus Jul 18 10:09:00 2017 13 // Update Count : 4 14 14 // 15 15 16 16 #include "ExceptTranslate.h" 17 17 #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 24 namespace ControlStruct { 20 25 21 26 // This (large) section could probably be moved out of the class … … 24 29 // Type(Qualifiers &, false, std::list<Attribute *> &) 25 30 26 // void (*function)() 27 static FunctionType void_func_t(Type::Qualifiers(), false);31 // void (*function)(); 32 static FunctionType try_func_t(Type::Qualifiers(), false); 28 33 // void (*function)(int, exception); 29 34 static FunctionType catch_func_t(Type::Qualifiers(), false); … … 32 37 // bool (*function)(exception); 33 38 static FunctionType handle_func_t(Type::Qualifiers(), false); 39 // void (*function)(__attribute__((unused)) void *); 40 static FunctionType finally_func_t(Type::Qualifiers(), false); 34 41 35 42 static void init_func_types() { 36 static init_complete = false;43 static bool init_complete = false; 37 44 if (init_complete) { 38 45 return; 39 46 } 40 47 ObjectDecl index_obj( 41 " index_t",48 "__handler_index", 42 49 Type::StorageClasses(), 43 50 LinkageSpec::Cforall, 44 51 /*bitfieldWidth*/ NULL, 45 new BasicType( emptyQualifiers, BasicType::UnsignedInt),52 new BasicType( noQualifiers, BasicType::SignedInt ), 46 53 /*init*/ NULL 47 );54 ); 48 55 ObjectDecl exception_obj( 49 " exception_t",56 "__exception_inst", 50 57 Type::StorageClasses(), 51 58 LinkageSpec::Cforall, 52 59 /*bitfieldWidth*/ NULL, 53 new BasicType(emptyQualifiers, BasicType::UnsignedInt), 60 new PointerType( 61 noQualifiers, 62 new BasicType( noQualifiers, BasicType::SignedInt ) 63 ), 54 64 /*init*/ NULL 55 );65 ); 56 66 ObjectDecl bool_obj( 57 " bool_t",67 "__ret_bool", 58 68 Type::StorageClasses(), 59 69 LinkageSpec::Cforall, 60 70 /*bitfieldWidth*/ NULL, 61 new BasicType( emptyQualifiers, BasicType::Bool),71 new BasicType(noQualifiers, BasicType::Bool), 62 72 /*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() ); 71 96 72 97 init_complete = true; … … 78 103 79 104 void split( CatchList& allHandlers, CatchList& terHandlers, 80 105 CatchList& resHandlers ) { 81 106 while ( !allHandlers.empty() ) { 82 Statement * stmt = allHandlers.front();107 CatchStmt * stmt = allHandlers.front(); 83 108 allHandlers.pop_front(); 84 if (Ca seStmt::Terminate == stmt->get_kind()) {109 if (CatchStmt::Terminate == stmt->get_kind()) { 85 110 terHandlers.push_back(stmt); 86 111 } else { … … 92 117 template<typename T> 93 118 void free_all( std::list<T *> &list ) { 94 std::list<T *>::iterator it;119 typename std::list<T *>::iterator it; 95 120 for ( it = list.begin() ; it != list.end() ; ++it ) { 96 121 delete *it; … … 100 125 101 126 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 ); 107 132 } 108 133 109 134 // ThrowStmt Mutation Helpers 110 135 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 ) ); 116 152 throwStmt->set_expr( nullptr ); 117 153 delete throwStmt; 118 154 return result; 119 155 } 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 } 120 161 Statement * create_terminate_rethrow( ThrowStmt *throwStmt ) { 121 162 // __rethrow_terminate(); 163 assert( nullptr == throwStmt->get_expr() ); 122 164 Statement * result = new ExprStmt( 123 165 throwStmt->get_labels(), 124 new ApplicationExpr( /* ... */ );166 new UntypedExpr( new NameExpr( "__cfaehm__rethrow_terminate" ) ) 125 167 ); 126 168 delete throwStmt; … … 129 171 Statement * create_resume_throw( ThrowStmt *throwStmt ) { 130 172 // __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 ); 137 174 } 138 175 Statement * create_resume_rethrow( ThrowStmt *throwStmt ) { … … 140 177 Statement * result = new ReturnStmt( 141 178 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 ) ) 150 180 ); 151 181 delete throwStmt; … … 160 190 return block; 161 191 } 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 ); 168 196 } 169 197 170 198 FunctionDecl * create_terminate_catch( CatchList &handlers ) { 171 199 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(); 172 204 173 205 // Index 1..{number of handlers} … … 178 210 CatchStmt * handler = *it; 179 211 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( 189 224 noLabels, 190 225 new ConstantExpr( Constant::from_int( index ) ), 191 core 192 ); 193 handler_wrappers.push_back(wrapper); 226 caseBody 227 ) ); 194 228 } 195 229 // 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 } 196 236 197 237 SwitchStmt * handler_lookup = new SwitchStmt( 198 238 noLabels, 199 /*parameter 0: index*/, 200 handler_wrappers, 201 false 239 nameOf( index_obj ), 240 stmt_handlers 202 241 ); 203 242 CompoundStmt * body = new CompoundStmt( noLabels ); … … 205 244 206 245 return new FunctionDecl("catch", Type::StorageClasses(), 207 LinkageSpec::Cforall, catch_func_t, body);246 LinkageSpec::Cforall, func_type, body); 208 247 } 209 248 210 249 // 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 } 218 275 219 276 if ( modded_handler->get_cond() ) { 220 cond = new LogicalExpr( cond, modded_handler->get_cond() ) q277 cond = new LogicalExpr( cond, modded_handler->get_cond() ); 221 278 } 222 279 block->push_back( new IfStmt( noLabels, 223 cond, modded_handler->get_body() );280 cond, modded_handler->get_body(), nullptr ) ); 224 281 225 282 modded_handler->set_decl( nullptr ); … … 232 289 FunctionDecl * create_terminate_match( CatchList &handlers ) { 233 290 CompoundStmt * body = new CompoundStmt( noLabels ); 291 292 FunctionType * func_type = match_func_t.clone(); 293 DeclarationWithType * except_obj = func_type->get_parameters().back(); 234 294 235 295 // Index 1..{number of handlers} … … 240 300 CatchStmt * handler = *it; 241 301 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. 244 306 handler->set_body( new ReturnStmt( noLabels, 245 307 new ConstantExpr( Constant::from_int( index ) ) ) ); 246 308 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 ) ) ) ); 249 316 250 317 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( 255 322 FunctionDecl * try_wrapper, 256 323 FunctionDecl * terminate_catch, 257 324 FunctionDecl * terminate_match) { 258 325 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(); 261 329 args.push_back( nameOf( try_wrapper ) ); 262 330 args.push_back( nameOf( terminate_catch ) ); 263 331 args.push_back( nameOf( terminate_match ) ); 264 332 265 return new ExprStmt( noLabels, caller ); 333 CompoundStmt * callStmt = new CompoundStmt( noLabels ); 334 callStmt->push_back( new ExprStmt( noLabels, caller ) ); 335 return callStmt; 266 336 } 267 337 268 338 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(); 270 343 271 344 CatchList::iterator it; … … 280 353 handling_code->push_back( handler->get_body() ); 281 354 } 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 ) ) ) ); 284 357 handler->set_body( handling_code ); 285 358 286 359 // 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 ) ) ) ); 289 366 290 367 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, 295 373 Statement * wraps, 296 374 FunctionDecl * resume_handler ) { 297 375 CompoundStmt * body = new CompoundStmt( noLabels ); 298 376 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 ); 311 382 312 383 std::list< Attribute * > attributes; 313 384 { 314 385 std::list< Expression * > attr_params; 315 attr_params.push_back( n ameOf( /* ... 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", 322 393 Type::StorageClasses(), 323 394 LinkageSpec::Cforall, 324 395 nullptr, 325 /* Type* = resume_node */, 326 node_init, 396 new StructInstType( 397 Type::Qualifiers(), 398 node_decl 399 ), 400 nullptr, 327 401 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 330 412 body->push_back( wraps ); 331 413 return body; … … 333 415 334 416 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; 336 421 tryStmt->set_finally( nullptr ); 337 422 338 423 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 ))); 344 431 345 432 // Make Cleanup Attribute. … … 348 435 std::list< Expression * > attr_params; 349 436 attr_params.push_back( nameOf( finally_wrapper ) ); 350 attr ributes.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", 355 442 Type::StorageClasses(), 356 443 LinkageSpec::Cforall, 357 444 nullptr, 358 /* ... Type * ... */, 445 new StructInstType( 446 noQualifiers, 447 hook_decl 448 ), 359 449 nullptr, 360 450 attributes … … 363 453 364 454 365 class ExceptionMutatorCore : public With Scoping{455 class ExceptionMutatorCore : public WithGuards { 366 456 enum Context { NoHandler, TerHandler, ResHandler }; 367 457 … … 370 460 // loop, switch or the goto stays within the function. 371 461 372 Context cur Context;462 Context cur_context; 373 463 374 464 // We might not need this, but a unique base for each try block's … … 377 467 //unsigned int try_count = 0; 378 468 469 StructDecl *node_decl; 470 StructDecl *hook_decl; 379 471 380 472 public: 381 473 ExceptionMutatorCore() : 382 curContext(NoHandler) 474 cur_context(NoHandler), 475 node_decl(nullptr), hook_decl(nullptr) 383 476 {} 384 477 385 void premutate( CatchStmt *tryStmt ); 478 void premutate( CatchStmt *catchStmt ); 479 void premutate( StructDecl *structDecl ); 386 480 Statement * postmutate( ThrowStmt *throwStmt ); 387 481 Statement * postmutate( TryStmt *tryStmt ); … … 393 487 if ( throwStmt->get_expr() ) { 394 488 return create_terminate_throw( throwStmt ); 395 } else if ( TerHandler == cur Context ) {489 } else if ( TerHandler == cur_context ) { 396 490 return create_terminate_rethrow( throwStmt ); 397 491 } else { 398 492 assertf(false, "Invalid throw in %s at %i\n", 399 throwStmt->location.filename ,493 throwStmt->location.filename.c_str(), 400 494 throwStmt->location.linenumber); 401 495 return nullptr; … … 404 498 if ( throwStmt->get_expr() ) { 405 499 return create_resume_throw( throwStmt ); 406 } else if ( ResHandler == cur Context ) {500 } else if ( ResHandler == cur_context ) { 407 501 return create_resume_rethrow( throwStmt ); 408 502 } else { 409 503 assertf(false, "Invalid throwResume in %s at %i\n", 410 throwStmt->location.filename ,504 throwStmt->location.filename.c_str(), 411 505 throwStmt->location.linenumber); 412 506 return nullptr; … … 416 510 417 511 Statement * ExceptionMutatorCore::postmutate( TryStmt *tryStmt ) { 512 assert( node_decl ); 513 assert( hook_decl ); 514 418 515 // Generate a prefix for the function names? 419 516 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 ); 422 519 423 520 if ( tryStmt->get_finally() ) { … … 427 524 appendDeclStmt( block, finally_block ); 428 525 // 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() ) { 438 536 // Define the helper function. 439 537 FunctionDecl * resume_handler = … … 441 539 appendDeclStmt( block, resume_handler ); 442 540 // Prepare hooks 443 inner = create_resume_wrapper( inner, resume_handler );541 inner = create_resume_wrapper( node_decl, inner, resume_handler ); 444 542 } 445 543 … … 462 560 block->push_back( inner ); 463 561 464 free_all( termination_handlers );465 free_all( resumption_handlers );562 //free_all( termination_handlers ); 563 //free_all( resumption_handlers ); 466 564 467 565 return block; … … 469 567 470 568 void ExceptionMutatorCore::premutate( CatchStmt *catchStmt ) { 471 GuardValue( cur Context );472 if ( CatchStmt::Terminat ion== catchStmt->get_kind() ) {473 cur Context = TerHandler;569 GuardValue( cur_context ); 570 if ( CatchStmt::Terminate == catchStmt->get_kind() ) { 571 cur_context = TerHandler; 474 572 } 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 480 594 PassVisitor<ExceptionMutatorCore> translator; 481 for ( Declaration * decl : translationUnit ) { 482 decl->mutate( translator ); 483 } 595 mutateAll( translationUnit, translator ); 484 596 } 485 597 } -
src/ControlStruct/ExceptTranslate.h
rfea3faa rb826e6b 10 10 // Created On : Tus Jun 06 10:13:00 2017 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Thr Jun 22 15:57:00 201713 // Update Count : 012 // Last Modified On : Fri Jun 30 10:20:00 2017 13 // Update Count : 2 14 14 // 15 15 … … 17 17 #define EXCEPT_TRANSLATE_H 18 18 19 namespace ControlFlow { 19 #include <list> 20 #include "SynTree/SynTree.h" 21 22 namespace ControlStruct { 20 23 void translateEHM( std::list< Declaration *> & translationUnit ); 21 24 /* Converts exception handling structures into their underlying C code. -
src/ControlStruct/module.mk
rfea3faa rb826e6b 10 10 ## Author : Richard C. Bilson 11 11 ## Created On : Mon Jun 1 17:49:17 2015 12 ## Last Modified By : Peter A. Buhr13 ## Last Modified On : Thu Aug 4 11:38:06 201614 ## Update Count : 312 ## Last Modified By : Andrew Beach 13 ## Last Modified On : Wed Jun 28 16:15:00 2017 14 ## Update Count : 4 15 15 ############################################################################### 16 16 17 17 SRC += ControlStruct/LabelGenerator.cc \ 18 18 ControlStruct/LabelFixer.cc \ 19 19 ControlStruct/MLEMutator.cc \ 20 20 ControlStruct/Mutate.cc \ 21 ControlStruct/ForExprMutator.cc 22 21 ControlStruct/ForExprMutator.cc \ 22 ControlStruct/ExceptTranslate.cc -
src/GenPoly/Box.cc
rfea3faa rb826e6b 506 506 DeclarationWithType *Pass1::mutate( FunctionDecl *functionDecl ) { 507 507 if ( functionDecl->get_statements() ) { // empty routine body ? 508 // std::cerr << "mutating function: " << functionDecl->get_mangleName() << std::endl; 508 509 doBeginScope(); 509 510 scopeTyVars.beginScope(); … … 550 551 retval = oldRetval; 551 552 doEndScope(); 553 // std::cerr << "end function: " << functionDecl->get_mangleName() << std::endl; 552 554 } // if 553 555 return functionDecl; … … 1118 1120 1119 1121 Expression *Pass1::mutate( ApplicationExpr *appExpr ) { 1120 // std::cerr << "mutate appExpr: " ;1122 // std::cerr << "mutate appExpr: " << InitTweak::getFunctionName( appExpr ) << std::endl; 1121 1123 // for ( TyVarMap::iterator i = scopeTyVars.begin(); i != scopeTyVars.end(); ++i ) { 1122 1124 // std::cerr << i->first << " "; … … 1143 1145 ReferenceToType *dynRetType = isDynRet( function, exprTyVars ); 1144 1146 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 1145 1155 // 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 1146 1156 // passTypeVars needs to know the program-text return type (i.e. the distinction between _conc_T30 and T3(int)) 1147 1157 // concRetType may not be a good name in one or both of these places. A more appropriate name change is welcome. 1148 1158 if ( dynRetType ) { 1159 // std::cerr << "dynRetType: " << dynRetType << std::endl; 1149 1160 Type *concRetType = appExpr->get_result()->isVoid() ? nullptr : appExpr->get_result(); 1150 1161 ret = addDynRetParam( appExpr, concRetType, arg ); // xxx - used to use dynRetType instead of concRetType -
src/GenPoly/InstantiateGeneric.cc
rfea3faa rb826e6b 22 22 #include "InstantiateGeneric.h" 23 23 24 #include "DeclMutator.h"25 24 #include "GenPoly.h" 26 25 #include "ScopedSet.h" 27 26 #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" 29 32 30 33 #include "ResolvExpr/typeops.h" … … 34 37 #include "SynTree/Type.h" 35 38 36 #include "Common/ScopedMap.h" 37 #include " Common/UniqueName.h"38 #include "Common/utility.h" 39 40 #include "InitTweak/InitTweak.h" 41 39 42 40 43 namespace GenPoly { … … 153 156 } 154 157 155 // collect the environments of each TypeInstType so that type variables can be replaced156 // 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 172 158 /// 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 { 174 160 /// Map of (generic type, parameter list) pairs to concrete type instantiations 175 161 InstantiationMap< AggregateDecl, AggregateDecl > instantiations; … … 178 164 /// Namer for concrete types 179 165 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(); 191 180 private: 192 181 /// Wrap instantiation lookup for structs … … 207 196 208 197 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 ); 213 200 } 214 201 … … 306 293 Type *GenericInstantiator::replaceWithConcrete( Type *type, bool doClone ) { 307 294 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType * >( type ) ) { 308 if ( envMap.count( typeInst ) ) { 309 TypeSubstitution * env = envMap.at( typeInst ); 295 if ( env && ! inFunctionType ) { 310 296 Type *concrete = env->lookup( typeInst->get_name() ); 311 297 if ( concrete ) { … … 331 317 332 318 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 ) { 339 320 // exit early if no need for further mutation 340 321 if ( inst->get_parameters().empty() ) return inst; … … 368 349 substituteMembers( inst->get_baseStruct()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() ); 369 350 insert( inst, typeSubs, concDecl ); // must insert before recursion 370 concDecl->acceptMutator( * this); // recursively instantiate members371 DeclMutator::addDeclaration( concDecl ); // must occur before declaration is added so that member instantiations appear first351 concDecl->acceptMutator( *visitor ); // recursively instantiate members 352 declsToAddBefore.push_back( concDecl ); // must occur before declaration is added so that member instantiations appear first 372 353 } 373 354 StructInstType *newInst = new StructInstType( inst->get_qualifiers(), concDecl->get_name() ); … … 388 369 } 389 370 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 ) { 396 372 // exit early if no need for further mutation 397 373 if ( inst->get_parameters().empty() ) return inst; … … 423 399 substituteMembers( inst->get_baseUnion()->get_members(), *inst->get_baseParameters(), typeSubs, concDecl->get_members() ); 424 400 insert( inst, typeSubs, concDecl ); // must insert before recursion 425 concDecl->acceptMutator( * this); // recursively instantiate members426 DeclMutator::addDeclaration( concDecl ); // must occur before declaration is added so that member instantiations appear first401 concDecl->acceptMutator( *visitor ); // recursively instantiate members 402 declsToAddBefore.push_back( concDecl ); // must occur before declaration is added so that member instantiations appear first 427 403 } 428 404 UnionInstType *newInst = new UnionInstType( inst->get_qualifiers(), concDecl->get_name() ); … … 442 418 } 443 419 444 void GenericInstantiator::doBeginScope() { 445 DeclMutator::doBeginScope(); 420 void GenericInstantiator::beginScope() { 446 421 instantiations.beginScope(); 447 422 dtypeStatics.beginScope(); 448 423 } 449 424 450 void GenericInstantiator::doEndScope() { 451 DeclMutator::doEndScope(); 425 void GenericInstantiator::endScope() { 452 426 instantiations.endScope(); 453 427 dtypeStatics.endScope(); -
src/InitTweak/FixInit.cc
rfea3faa rb826e6b 104 104 typedef AddStmtVisitor Parent; 105 105 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; 107 108 virtual void visit( CompoundStmt *compoundStmt ) override; 108 109 virtual void visit( DeclStmt *stmt ) override; … … 116 117 117 118 // 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 ) {} 121 122 const ObjectSet & objs; 122 123 }; 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) { 124 128 out << "{ "; 125 129 for ( ObjectDecl * obj : set.objs ) { … … 724 728 // static bool __objName_uninitialized = true 725 729 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 ) ) ); 727 731 ObjectDecl * isUninitializedVar = new ObjectDecl( objDecl->get_mangleName() + "_uninitialized", Type::StorageClasses( Type::Static ), LinkageSpec::Cforall, 0, boolType, boolInitExpr ); 728 732 isUninitializedVar->fixUniqueId(); … … 745 749 746 750 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 ); 749 753 ctorInit->set_dtor( nullptr ); 750 754 if ( dtor ) { … … 799 803 } else { 800 804 stmtsToAddAfter.push_back( ctor ); 801 objDecl->set_init( NULL);802 ctorInit->set_ctor( NULL);805 objDecl->set_init( nullptr ); 806 ctorInit->set_ctor( nullptr ); 803 807 } 804 808 } // if 805 809 } else if ( Initializer * init = ctorInit->get_init() ) { 806 810 objDecl->set_init( init ); 807 ctorInit->set_init( NULL);811 ctorInit->set_init( nullptr ); 808 812 } else { 809 813 // no constructor and no initializer, which is okay 810 objDecl->set_init( NULL);814 objDecl->set_init( nullptr ); 811 815 } // if 812 816 delete ctorInit; … … 816 820 817 821 void ObjDeclCollector::visit( CompoundStmt * compoundStmt ) { 818 std::set< ObjectDecl * >prevVars = curVars;822 ObjectSet prevVars = curVars; 819 823 Parent::visit( compoundStmt ); 820 824 curVars = prevVars; … … 824 828 // keep track of all variables currently in scope 825 829 if ( ObjectDecl * objDecl = dynamic_cast< ObjectDecl * > ( stmt->get_decl() ) ) { 826 curVars. insert( objDecl );830 curVars.push_back( objDecl ); 827 831 } // if 828 832 Parent::visit( stmt ); … … 939 943 ) 940 944 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 941 948 // go through decl ordered list of objectdecl. for each element that occurs in diff, output destructor 942 949 OrderedDecls ordered; 943 950 for ( OrderedDecls & rdo : reverseDeclOrder ) { 944 951 // 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 ); } ); 946 953 } // for 947 954 insertDtors( ordered.begin(), ordered.end(), back_inserter( stmtsToAdd ) ); -
src/InitTweak/GenInit.cc
rfea3faa rb826e6b 44 44 } 45 45 46 class ReturnFixer : public WithStmtsToAdd, public WithScopes { 47 public: 46 struct ReturnFixer : public WithStmtsToAdd, public WithGuards { 48 47 /// consistently allocates a temporary variable for the return value 49 48 /// of a function so that anything which the resolver decides can be constructed … … 59 58 }; 60 59 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 { 65 61 /// create constructor and destructor statements for object declarations. 66 62 /// the actual call statements will be added in after the resolver has run … … 69 65 static void generateCtorDtor( std::list< Declaration * > &translationUnit ); 70 66 71 virtual DeclarationWithType * mutate( ObjectDecl * ) override; 72 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) override; 67 void previsit( ObjectDecl * ); 68 void previsit( FunctionDecl *functionDecl ); 69 73 70 // should not traverse into any of these declarations to find objects 74 71 // 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 ); 85 81 86 82 private: … … 211 207 212 208 void CtorDtor::generateCtorDtor( std::list< Declaration * > & translationUnit ) { 213 CtorDtorctordtor;214 mutateAll( translationUnit, ctordtor );209 PassVisitor<CtorDtor> ctordtor; 210 acceptAll( translationUnit, ctordtor ); 215 211 } 216 212 … … 289 285 } 290 286 291 DeclarationWithType * CtorDtor::mutate( ObjectDecl * objDecl ) {287 void CtorDtor::previsit( ObjectDecl * objDecl ) { 292 288 handleDWT( objDecl ); 293 289 // hands off if @=, extern, builtin, etc. … … 301 297 objDecl->set_init( genCtorInit( objDecl ) ); 302 298 } 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 ); 308 303 inFunction = true; 309 304 310 305 handleDWT( functionDecl ); 311 306 312 managedTypes.beginScope();307 GuardScope( managedTypes ); 313 308 // go through assertions and recursively add seen ctor/dtors 314 309 for ( auto & tyDecl : functionDecl->get_functionType()->get_forall() ) { … … 317 312 } 318 313 } 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 327 324 // don't construct members, but need to take note if there is a managed member, 328 325 // because that means that this type is also managed … … 336 333 } 337 334 } 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 } 348 340 } // namespace InitTweak 349 341 -
src/InitTweak/InitTweak.cc
rfea3faa rb826e6b 14 14 public: 15 15 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 } 23 20 }; 24 21 -
src/MakeLibCfa.cc
rfea3faa rb826e6b 15 15 16 16 #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 25 32 26 33 namespace LibCfa { … … 92 99 assert( ! objDecl->get_init() ); 93 100 std::list< Expression* > noDesignators; 94 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators,false ) ); // cannot be constructed101 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), false ) ); // cannot be constructed 95 102 newDecls.push_back( objDecl ); 96 103 } -
src/MakeLibCfa.h
rfea3faa rb826e6b 17 17 #define LIBCFA_MAKELIBCFA_H 18 18 19 #include <list> 20 #include <SynTree/SynTree.h> 19 #include <list> // for list 20 21 class Declaration; 21 22 22 23 namespace LibCfa { -
src/Makefile.am
rfea3faa rb826e6b 43 43 driver_cfa_cpp_SOURCES = ${SRC} 44 44 driver_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++1445 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -Wextra -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14 46 46 driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic 47 47 -
src/Makefile.in
rfea3faa rb826e6b 1 # Makefile.in generated by automake 1.1 1.3from Makefile.am.1 # Makefile.in generated by automake 1.15 from Makefile.am. 2 2 # @configure_input@ 3 3 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 7 6 # This Makefile.in is free software; the Free Software Foundation 8 7 # gives unlimited permission to copy and/or distribute it, … … 59 58 60 59 VPATH = @srcdir@ 60 am__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 } 71 am__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 113 am__make_dryrun = (target_option=n; $(am__make_running_with_option)) 114 am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 61 115 pkgdatadir = $(datadir)/@PACKAGE@ 62 116 pkgincludedir = $(includedir)/@PACKAGE@ … … 77 131 build_triplet = @build@ 78 132 host_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.h88 133 cfa_cpplib_PROGRAMS = driver/cfa-cpp$(EXEEXT) 89 134 subdir = src … … 92 137 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ 93 138 $(ACLOCAL_M4) 139 DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) 94 140 mkinstalldirs = $(install_sh) -d 95 141 CONFIG_HEADER = $(top_builddir)/config.h … … 119 165 ControlStruct/driver_cfa_cpp-Mutate.$(OBJEXT) \ 120 166 ControlStruct/driver_cfa_cpp-ForExprMutator.$(OBJEXT) \ 167 ControlStruct/driver_cfa_cpp-ExceptTranslate.$(OBJEXT) \ 121 168 GenPoly/driver_cfa_cpp-Box.$(OBJEXT) \ 122 169 GenPoly/driver_cfa_cpp-GenPoly.$(OBJEXT) \ … … 143 190 Parser/driver_cfa_cpp-TypeData.$(OBJEXT) \ 144 191 Parser/driver_cfa_cpp-LinkageSpec.$(OBJEXT) \ 145 Parser/driver_cfa_cpp-parse utility.$(OBJEXT) \192 Parser/driver_cfa_cpp-parserutility.$(OBJEXT) \ 146 193 ResolvExpr/driver_cfa_cpp-AlternativeFinder.$(OBJEXT) \ 147 194 ResolvExpr/driver_cfa_cpp-Alternative.$(OBJEXT) \ … … 161 208 ResolvExpr/driver_cfa_cpp-Occurs.$(OBJEXT) \ 162 209 ResolvExpr/driver_cfa_cpp-TypeEnvironment.$(OBJEXT) \ 210 ResolvExpr/driver_cfa_cpp-CurrentObject.$(OBJEXT) \ 163 211 SymTab/driver_cfa_cpp-Indexer.$(OBJEXT) \ 164 212 SymTab/driver_cfa_cpp-Mangler.$(OBJEXT) \ … … 168 216 SymTab/driver_cfa_cpp-TypeEquality.$(OBJEXT) \ 169 217 SymTab/driver_cfa_cpp-Autogen.$(OBJEXT) \ 218 SymTab/driver_cfa_cpp-TreeStruct.$(OBJEXT) \ 170 219 SynTree/driver_cfa_cpp-Type.$(OBJEXT) \ 171 220 SynTree/driver_cfa_cpp-VoidType.$(OBJEXT) \ … … 213 262 driver_cfa_cpp_LINK = $(CXXLD) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) \ 214 263 $(driver_cfa_cpp_LDFLAGS) $(LDFLAGS) -o $@ 264 AM_V_P = $(am__v_P_@AM_V@) 265 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) 266 am__v_P_0 = false 267 am__v_P_1 = : 268 AM_V_GEN = $(am__v_GEN_@AM_V@) 269 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) 270 am__v_GEN_0 = @echo " GEN " $@; 271 am__v_GEN_1 = 272 AM_V_at = $(am__v_at_@AM_V@) 273 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) 274 am__v_at_0 = @ 275 am__v_at_1 = 215 276 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) 216 277 depcomp = $(SHELL) $(top_srcdir)/automake/depcomp … … 220 281 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) 221 282 am__v_lt_0 = --silent 283 am__v_lt_1 = 222 284 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ 223 285 $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) 224 286 AM_V_CXX = $(am__v_CXX_@AM_V@) 225 287 am__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 = @ 288 am__v_CXX_0 = @echo " CXX " $@; 289 am__v_CXX_1 = 230 290 CXXLD = $(CXX) 231 291 CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ … … 233 293 AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) 234 294 am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) 235 am__v_CXXLD_0 = @echo " CXXLD " $@; 295 am__v_CXXLD_0 = @echo " CXXLD " $@; 296 am__v_CXXLD_1 = 236 297 @MAINTAINER_MODE_FALSE@am__skiplex = test -f $@ || 237 298 LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS) 238 299 AM_V_LEX = $(am__v_LEX_@AM_V@) 239 300 am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@) 240 am__v_LEX_0 = @echo " LEX " $@; 301 am__v_LEX_0 = @echo " LEX " $@; 302 am__v_LEX_1 = 241 303 YLWRAP = $(top_srcdir)/automake/ylwrap 242 304 @MAINTAINER_MODE_FALSE@am__skipyacc = test -f $@ || 305 am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \ 306 -e s/c++$$/h++/ -e s/c$$/h/ 243 307 YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) 244 308 AM_V_YACC = $(am__v_YACC_@AM_V@) 245 309 am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@) 246 am__v_YACC_0 = @echo " YACC " $@; 310 am__v_YACC_0 = @echo " YACC " $@; 311 am__v_YACC_1 = 247 312 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ 248 313 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) 249 314 AM_V_CC = $(am__v_CC_@AM_V@) 250 315 am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) 251 am__v_CC_0 = @echo " CC " $@; 316 am__v_CC_0 = @echo " CC " $@; 317 am__v_CC_1 = 252 318 CCLD = $(CC) 253 319 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ 254 320 AM_V_CCLD = $(am__v_CCLD_@AM_V@) 255 321 am__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 " $@; 322 am__v_CCLD_0 = @echo " CCLD " $@; 323 am__v_CCLD_1 = 260 324 SOURCES = $(driver_cfa_cpp_SOURCES) 261 325 DIST_SOURCES = $(driver_cfa_cpp_SOURCES) 326 am__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 331 am__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. 335 am__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. 343 am__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)` 262 348 ETAGS = etags 263 349 CTAGS = ctags 350 am__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 264 360 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 265 361 ACLOCAL = @ACLOCAL@ … … 374 470 program_transform_name = @program_transform_name@ 375 471 psdir = @psdir@ 472 runstatedir = @runstatedir@ 376 473 sbindir = @sbindir@ 377 474 sharedstatedir = @sharedstatedir@ … … 394 491 ControlStruct/LabelGenerator.cc ControlStruct/LabelFixer.cc \ 395 492 ControlStruct/MLEMutator.cc ControlStruct/Mutate.cc \ 396 ControlStruct/ForExprMutator.cc GenPoly/Box.cc \ 493 ControlStruct/ForExprMutator.cc \ 494 ControlStruct/ExceptTranslate.cc GenPoly/Box.cc \ 397 495 GenPoly/GenPoly.cc GenPoly/PolyMutator.cc \ 398 496 GenPoly/ScrubTyVars.cc GenPoly/Lvalue.cc GenPoly/Specialize.cc \ … … 405 503 Parser/ExpressionNode.cc Parser/StatementNode.cc \ 406 504 Parser/InitializerNode.cc Parser/TypeData.cc \ 407 Parser/LinkageSpec.cc Parser/parse utility.cc \505 Parser/LinkageSpec.cc Parser/parserutility.cc \ 408 506 ResolvExpr/AlternativeFinder.cc ResolvExpr/Alternative.cc \ 409 507 ResolvExpr/Unify.cc ResolvExpr/PtrsAssignable.cc \ … … 414 512 ResolvExpr/RenameVars.cc ResolvExpr/FindOpenVars.cc \ 415 513 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/T ypeofType.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 \ 424 522 SynTree/VarArgsType.cc SynTree/ZeroOneType.cc \ 425 523 SynTree/Constant.cc SynTree/Expression.cc SynTree/TupleExpr.cc \ … … 438 536 MAINTAINERCLEANFILES = Parser/parser.output ${libdir}/${notdir \ 439 537 ${cfa_cpplib_PROGRAMS}} 440 BUILT_SOURCES = Parser/parser.h 538 BUILT_SOURCES = Parser/parser.hh 441 539 AM_YFLAGS = -d -t -v 442 540 … … 447 545 driver_cfa_cpp_SOURCES = ${SRC} 448 546 driver_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++14547 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -Wextra -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14 450 548 driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic 451 549 all: $(BUILT_SOURCES) … … 466 564 $(am__cd) $(top_srcdir) && \ 467 565 $(AUTOMAKE) --foreign src/Makefile 468 .PRECIOUS: Makefile469 566 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 470 567 @case '$?' in \ … … 475 572 cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 476 573 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): 478 575 479 576 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) … … 487 584 install-cfa_cpplibPROGRAMS: $(cfa_cpplib_PROGRAMS) 488 585 @$(NORMAL_INSTALL) 489 test -z "$(cfa_cpplibdir)" || $(MKDIR_P) "$(DESTDIR)$(cfa_cpplibdir)"490 586 @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; \ 491 591 for p in $$list; do echo "$$p $$p"; done | \ 492 592 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; \ 495 595 done | \ 496 sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ 596 sed -e 'p;s,.*/,,;n;h' \ 597 -e 's|.*|.|' \ 497 598 -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ 498 599 sed 'N;N;N;s,\n, ,g' | \ … … 515 616 files=`for p in $$list; do echo "$$p"; done | \ 516 617 sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ 517 -e 's/$$/$(EXEEXT)/' `; \ 618 -e 's/$$/$(EXEEXT)/' \ 619 `; \ 518 620 test -n "$$list" || exit 0; \ 519 621 echo " ( cd '$(DESTDIR)$(cfa_cpplibdir)' && rm -f" $$files ")"; \ … … 594 696 ControlStruct/$(am__dirstamp) \ 595 697 ControlStruct/$(DEPDIR)/$(am__dirstamp) 698 ControlStruct/driver_cfa_cpp-ExceptTranslate.$(OBJEXT): \ 699 ControlStruct/$(am__dirstamp) \ 700 ControlStruct/$(DEPDIR)/$(am__dirstamp) 596 701 GenPoly/$(am__dirstamp): 597 702 @$(MKDIR_P) GenPoly … … 634 739 InitTweak/driver_cfa_cpp-InitTweak.$(OBJEXT): \ 635 740 InitTweak/$(am__dirstamp) InitTweak/$(DEPDIR)/$(am__dirstamp) 636 Parser/parser.h : Parser/parser.cc741 Parser/parser.hh: Parser/parser.cc 637 742 @if test ! -f $@; then rm -f Parser/parser.cc; else :; fi 638 743 @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) Parser/parser.cc; else :; fi … … 663 768 Parser/driver_cfa_cpp-LinkageSpec.$(OBJEXT): Parser/$(am__dirstamp) \ 664 769 Parser/$(DEPDIR)/$(am__dirstamp) 665 Parser/driver_cfa_cpp-parse utility.$(OBJEXT): Parser/$(am__dirstamp) \770 Parser/driver_cfa_cpp-parserutility.$(OBJEXT): Parser/$(am__dirstamp) \ 666 771 Parser/$(DEPDIR)/$(am__dirstamp) 667 772 ResolvExpr/$(am__dirstamp): … … 721 826 ResolvExpr/$(am__dirstamp) \ 722 827 ResolvExpr/$(DEPDIR)/$(am__dirstamp) 828 ResolvExpr/driver_cfa_cpp-CurrentObject.$(OBJEXT): \ 829 ResolvExpr/$(am__dirstamp) \ 830 ResolvExpr/$(DEPDIR)/$(am__dirstamp) 723 831 SymTab/$(am__dirstamp): 724 832 @$(MKDIR_P) SymTab … … 740 848 SymTab/$(DEPDIR)/$(am__dirstamp) 741 849 SymTab/driver_cfa_cpp-Autogen.$(OBJEXT): SymTab/$(am__dirstamp) \ 850 SymTab/$(DEPDIR)/$(am__dirstamp) 851 SymTab/driver_cfa_cpp-TreeStruct.$(OBJEXT): SymTab/$(am__dirstamp) \ 742 852 SymTab/$(DEPDIR)/$(am__dirstamp) 743 853 SynTree/$(am__dirstamp): … … 834 944 @$(MKDIR_P) driver 835 945 @: > driver/$(am__dirstamp) 946 836 947 driver/cfa-cpp$(EXEEXT): $(driver_cfa_cpp_OBJECTS) $(driver_cfa_cpp_DEPENDENCIES) $(EXTRA_driver_cfa_cpp_DEPENDENCIES) driver/$(am__dirstamp) 837 948 @rm -f driver/cfa-cpp$(EXEEXT) … … 840 951 mostlyclean-compile: 841 952 -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) 948 965 949 966 distclean-compile: … … 965 982 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-UniqueName.Po@am__quote@ 966 983 @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@ 967 985 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-ForExprMutator.Po@am__quote@ 968 986 @AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelFixer.Po@am__quote@ … … 994 1012 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-lex.Po@am__quote@ 995 1013 @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-parse utility.Po@am__quote@1014 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Po@am__quote@ 997 1015 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-AdjustExprType.Po@am__quote@ 998 1016 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-Alternative.Po@am__quote@ … … 1002 1020 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-CommonType.Po@am__quote@ 1003 1021 @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@ 1004 1023 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-FindOpenVars.Po@am__quote@ 1005 1024 @AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-Occurs.Po@am__quote@ … … 1017 1036 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Indexer.Po@am__quote@ 1018 1037 @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@ 1019 1039 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-TypeEquality.Po@am__quote@ 1020 1040 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Validate.Po@am__quote@ … … 1355 1375 @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` 1356 1376 1377 ControlStruct/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 1384 ControlStruct/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 1357 1391 GenPoly/driver_cfa_cpp-Box.o: GenPoly/Box.cc 1358 1392 @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 … … 1691 1725 @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` 1692 1726 1693 Parser/driver_cfa_cpp-parse utility.o: Parser/parseutility.cc1694 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/driver_cfa_cpp-parse utility.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.cc1695 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Parser/$(DEPDIR)/driver_cfa_cpp-parse utility.Tpo Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Po1696 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Parser/parse utility.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-parse utility.o `test -f 'Parser/parseutility.cc' || echo '$(srcdir)/'`Parser/parseutility.cc1699 1700 Parser/driver_cfa_cpp-parse utility.obj: Parser/parseutility.cc1701 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/driver_cfa_cpp-parse utility.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-parse utility.Tpo Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Po1703 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Parser/parse utility.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-parse utility.obj `if test -f 'Parser/parseutility.cc'; then $(CYGPATH_W) 'Parser/parseutility.cc'; else $(CYGPATH_W) '$(srcdir)/Parser/parseutility.cc'; fi`1727 Parser/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 1734 Parser/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` 1706 1740 1707 1741 ResolvExpr/driver_cfa_cpp-AlternativeFinder.o: ResolvExpr/AlternativeFinder.cc … … 1943 1977 @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` 1944 1978 1979 ResolvExpr/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 1986 ResolvExpr/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 1945 1993 SymTab/driver_cfa_cpp-Indexer.o: SymTab/Indexer.cc 1946 1994 @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 … … 2041 2089 @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` 2042 2090 2091 SymTab/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 2098 SymTab/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 2043 2105 SynTree/driver_cfa_cpp-Type.o: SynTree/Type.cc 2044 2106 @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 … … 2591 2653 2592 2654 .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 2657 ID: $(am__tagged_files) 2658 $(am__define_uniq_tagged_files); mkid -fID $$unique 2659 tags: tags-am 2660 TAGS: tags 2661 2662 tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 2607 2663 set x; \ 2608 2664 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); \ 2615 2666 shift; \ 2616 2667 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ … … 2624 2675 fi; \ 2625 2676 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; }; }'`; \ 2677 ctags: ctags-am 2678 2679 CTAGS: ctags 2680 ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 2681 $(am__define_uniq_tagged_files); \ 2635 2682 test -z "$(CTAGS_ARGS)$$unique" \ 2636 2683 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ … … 2641 2688 && $(am__cd) $(top_srcdir) \ 2642 2689 && gtags -i $(GTAGS_ARGS) "$$here" 2690 cscopelist: cscopelist-am 2691 2692 cscopelist-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 2643 2705 2644 2706 distclean-tags: … … 2741 2803 -rm -f Parser/lex.cc 2742 2804 -rm -f Parser/parser.cc 2743 -rm -f Parser/parser.h 2805 -rm -f Parser/parser.hh 2744 2806 -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) 2745 2807 -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) … … 2815 2877 .MAKE: all check install install-am install-strip 2816 2878 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 2830 2894 2831 2895 -
src/Parser/DeclarationNode.cc
rfea3faa rb826e6b 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 12:34:05 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Mar 17 15:46:33201713 // Update Count : 10 1811 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Jul 14 16:55:00 2017 13 // Update Count : 1020 14 14 // 15 15 … … 253 253 newnode->type->aggregate.fields = fields; 254 254 newnode->type->aggregate.body = body; 255 newnode->type->aggregate.tagged = false; 256 newnode->type->aggregate.parent = nullptr; 255 257 return newnode; 256 258 } // DeclarationNode::newAggregate … … 273 275 return newnode; 274 276 } // DeclarationNode::newEnumConstant 277 278 DeclarationNode * 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 275 291 276 292 DeclarationNode * DeclarationNode::newName( string * name ) { … … 1063 1079 case TypeData::Enum: 1064 1080 case TypeData::Aggregate: { 1065 ReferenceToType * ret = buildComAggInst( type, attributes );1081 ReferenceToType * ret = buildComAggInst( type, attributes, linkage ); 1066 1082 buildList( type->aggregate.actuals, ret->get_parameters() ); 1067 1083 return ret; -
src/Parser/ExpressionNode.cc
rfea3faa rb826e6b 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:17:07 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Jun 21 16:44:46201713 // Update Count : 5 4111 // Last Modified By : Andrew Beach 12 // Last Modified On : Tus Jul 18 10:08:00 2017 13 // Update Count : 550 14 14 // 15 15 … … 27 27 #include "SynTree/Declaration.h" 28 28 #include "Common/UnimplementedError.h" 29 #include "parse utility.h"29 #include "parserutility.h" 30 30 #include "Common/utility.h" 31 31 … … 46 46 // type. 47 47 48 Type::Qualifiers emptyQualifiers; // no qualifiers on constants48 Type::Qualifiers noQualifiers; // no qualifiers on constants 49 49 50 50 static inline bool checkU( char c ) { return c == 'u' || c == 'U'; } … … 118 118 } // if 119 119 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 ) ); 121 121 delete &str; // created by lex 122 122 return ret; … … 153 153 } // if 154 154 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 ) ); 156 156 delete &str; // created by lex 157 157 return ret; … … 159 159 160 160 Expression *build_constantChar( const std::string & str ) { 161 Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::Char ), str, (unsigned long long int)(unsigned char)str[1] ) );161 Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, BasicType::Char ), str, (unsigned long long int)(unsigned char)str[1] ) ); 162 162 delete &str; // created by lex 163 163 return ret; … … 166 166 ConstantExpr *build_constantStr( const std::string & str ) { 167 167 // 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 ), 169 169 new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ), // +1 for '\0' and -2 for '"' 170 170 false, false ); … … 176 176 177 177 Expression *build_constantZeroOne( const std::string & str ) { 178 Expression * ret = new ConstantExpr( Constant( str == "0" ? (Type *)new ZeroType( emptyQualifiers ) : (Type*)new OneType( emptyQualifiers ), str,178 Expression * ret = new ConstantExpr( Constant( str == "0" ? (Type *)new ZeroType( noQualifiers ) : (Type*)new OneType( noQualifiers ), str, 179 179 str == "0" ? (unsigned long long int)0 : (unsigned long long int)1 ) ); 180 180 delete &str; // created by lex … … 231 231 } 232 232 233 // Must harmonize with OperKinds. 233 234 static const char *OperName[] = { 234 235 // diadic 235 "SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "? *?", "?/?", "?%?", "||", "&&",236 "SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "?\\?", "?*?", "?/?", "?%?", "||", "&&", 236 237 "?|?", "?&?", "?^?", "Cast", "?<<?", "?>>?", "?<?", "?>?", "?<=?", "?>=?", "?==?", "?!=?", 237 "?=?", "?@=?", "? *=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?",238 "?=?", "?@=?", "?\\=?", "?*=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?", 238 239 "?[?]", "...", 239 240 // monadic -
src/Parser/InitializerNode.cc
rfea3faa rb826e6b 74 74 75 75 InitializerNode *moreInit; 76 if ( get_next() != 0 && ((moreInit = dynamic_cast< InitializerNode * >( get_next() ) ) != 0) )76 if ( (moreInit = dynamic_cast< InitializerNode * >( get_next() ) ) ) { 77 77 moreInit->printOneLine( os ); 78 } 78 79 } 79 80 80 81 Initializer *InitializerNode::build() const { 81 82 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 82 91 std::list< Initializer * > initlist; 83 92 buildList< Initializer, InitializerNode >( next_init(), initlist ); 84 85 std::list< Expression * > designlist;86 87 if ( designator != 0 ) {88 buildList< Expression, ExpressionNode >( designator, designlist );89 } // if90 91 93 return new ListInit( initlist, designlist, maybeConstructed ); 92 94 } 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 } 100 98 } // if 101 102 99 return 0; 103 100 } -
src/Parser/LinkageSpec.cc
rfea3faa rb826e6b 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:22:09 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sun Oct 2 23:16:21 201613 // Update Count : 2 311 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Jul 7 11:11:00 2017 13 // Update Count : 25 14 14 // 15 15 … … 22 22 #include "Common/SemanticError.h" 23 23 24 LinkageSpec::Spec LinkageSpec::linkageCheck( const string * spec ) { 24 namespace LinkageSpec { 25 26 Spec linkageCheck( const string * spec ) { 27 assert( spec ); 25 28 unique_ptr<const string> guard( spec ); // allocated by lexer 26 29 if ( *spec == "\"Cforall\"" ) { … … 28 31 } else if ( *spec == "\"C\"" ) { 29 32 return C; 33 } else if ( *spec == "\"BuiltinC\"" ) { 34 return BuiltinC; 30 35 } else { 31 36 throw SemanticError( "Invalid linkage specifier " + *spec ); … … 33 38 } 34 39 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]; 40 Spec 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 41 52 } 42 53 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]; 54 std::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 } 50 73 } 51 74 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 78 76 79 77 // Local Variables: // -
src/Parser/LinkageSpec.h
rfea3faa rb826e6b 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // LinkageSpec.h -- 7 // LinkageSpec.h -- 8 8 // 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:24:28 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sat Oct 1 23:03:17 201613 // Update Count : 1 111 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Jul 7 11:03:00 2017 13 // Update Count : 13 14 14 // 15 15 … … 19 19 #include <string> 20 20 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 21 namespace 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, 29 30 }; 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 }; 38 78 }; 39 79 -
src/Parser/ParseNode.h
rfea3faa rb826e6b 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:28:16 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Mon Jun 12 13:00:00201713 // Update Count : 7 7911 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 15 16:00:48 2017 13 // Update Count : 785 14 14 // 15 15 … … 141 141 }; 142 142 143 // Must harmonize with OperName. 143 144 enum class OperKinds { 144 145 // diadic 145 SizeOf, AlignOf, OffsetOf, Plus, Minus, Mul, Div, Mod, Or, And,146 SizeOf, AlignOf, OffsetOf, Plus, Minus, Exp, Mul, Div, Mod, Or, And, 146 147 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, 148 149 Index, Range, 149 150 // monadic … … 248 249 static DeclarationNode * newAsmStmt( StatementNode * stmt ); // gcc external asm statement 249 250 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 250 254 DeclarationNode(); 251 255 ~DeclarationNode(); … … 332 336 333 337 static UniqueName anonymous; 338 339 // Temp to test TreeStruct 340 const std::string * parent_name; 334 341 }; // DeclarationNode 335 342 -
src/Parser/StatementNode.cc
rfea3faa rb826e6b 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 14:59:41 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Mon Jun 12 13:03:00201713 // Update Count : 3 2911 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jul 11 21:23:15 2017 13 // Update Count : 331 14 14 // 15 15 … … 21 21 #include "SynTree/Statement.h" 22 22 #include "SynTree/Expression.h" 23 #include "parse utility.h"23 #include "parserutility.h" 24 24 #include "Common/utility.h" 25 25 … … 93 93 std::list< Statement * > branches; 94 94 buildMoveList< Statement, StatementNode >( stmt, branches ); 95 assert( branches.size() >= 0 ); // size== 0 for switch (...) {}, i.e., no declaration or statements95 // branches.size() == 0 for switch (...) {}, i.e., no declaration or statements 96 96 return new SwitchStmt( noLabels, maybeMoveBuild< Expression >(ctl), branches ); 97 97 } -
src/Parser/TypeData.cc
rfea3faa rb826e6b 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 15:12:51 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Mar 17 15:52:43201713 // Update Count : 56 311 // Last Modified By : Andrew Beach 12 // Last Modified On : Tus Jul 18 10:10:00 2017 13 // Update Count : 566 14 14 // 15 15 … … 63 63 aggregate.fields = nullptr; 64 64 aggregate.body = false; 65 aggregate.tagged = false; 66 aggregate.parent = nullptr; 65 67 break; 66 68 case AggregateInst: … … 121 123 delete aggregate.actuals; 122 124 delete aggregate.fields; 125 delete aggregate.parent; 123 126 // delete aggregate; 124 127 break; … … 192 195 newtype->aggregate.kind = aggregate.kind; 193 196 newtype->aggregate.body = aggregate.body; 197 newtype->aggregate.tagged = aggregate.tagged; 198 newtype->aggregate.parent = aggregate.parent ? new string( *aggregate.parent ) : nullptr; 194 199 break; 195 200 case AggregateInst: … … 449 454 case TypeData::Builtin: 450 455 if(td->builtintype == DeclarationNode::Zero) { 451 return new ZeroType( emptyQualifiers );456 return new ZeroType( noQualifiers ); 452 457 } 453 458 else if(td->builtintype == DeclarationNode::One) { 454 return new OneType( emptyQualifiers );459 return new OneType( noQualifiers ); 455 460 } 456 461 else { … … 614 619 } // buildPointer 615 620 616 AggregateDecl * buildAggregate( const TypeData * td, std::list< Attribute * > attributes ) {621 AggregateDecl * buildAggregate( const TypeData * td, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) { 617 622 assert( td->kind == TypeData::Aggregate ); 618 623 AggregateDecl * at; 619 624 switch ( td->aggregate.kind ) { 620 625 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 } 621 631 case DeclarationNode::Coroutine: 622 632 case DeclarationNode::Monitor: 623 633 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 ); 625 635 buildForall( td->aggregate.params, at->get_parameters() ); 626 636 break; … … 643 653 } // buildAggregate 644 654 645 ReferenceToType * buildComAggInst( const TypeData * type, std::list< Attribute * > attributes ) {655 ReferenceToType * buildComAggInst( const TypeData * type, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) { 646 656 switch ( type->kind ) { 647 657 case TypeData::Enum: { … … 656 666 ReferenceToType * ret; 657 667 if ( type->aggregate.body ) { 658 AggregateDecl * typedecl = buildAggregate( type, attributes );668 AggregateDecl * typedecl = buildAggregate( type, attributes, linkage ); 659 669 switch ( type->aggregate.kind ) { 660 670 case DeclarationNode::Struct: … … 760 770 if ( cur->has_enumeratorValue() ) { 761 771 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() ) ) ); 763 773 } // if 764 774 } // for … … 777 787 TupleType * buildTuple( const TypeData * td ) { 778 788 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 ); 781 792 buildForall( td->forall, ret->get_forall() ); 782 793 return ret; … … 802 813 return decl->set_asmName( asmName ); 803 814 } else if ( td->kind == TypeData::Aggregate ) { 804 return buildAggregate( td, attributes );815 return buildAggregate( td, attributes, linkage ); 805 816 } else if ( td->kind == TypeData::Enum ) { 806 817 return buildEnum( td, attributes ); -
src/Parser/TypeData.h
rfea3faa rb826e6b 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 15:18:36 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Thu Mar 16 08:32:39201713 // Update Count : 18 511 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Jul 14 16:57:00 2017 13 // Update Count : 187 14 14 // 15 15 … … 31 31 DeclarationNode * fields; 32 32 bool body; 33 34 bool tagged; 35 const std::string * parent; 33 36 }; 34 37 … … 102 105 ArrayType * buildArray( const TypeData * ); 103 106 AggregateDecl * buildAggregate( const TypeData *, std::list< Attribute * > ); 104 ReferenceToType * buildComAggInst( const TypeData *, std::list< Attribute * > attributes );107 ReferenceToType * buildComAggInst( const TypeData *, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ); 105 108 ReferenceToType * buildAggInst( const TypeData * ); 106 109 TypeDecl * buildVariable( const TypeData * ); -
src/Parser/TypedefTable.h
rfea3faa rb826e6b 10 10 // Created On : Sat May 16 15:24:36 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Aug 15 18:25:04 201613 // Update Count : 2812 // Last Modified On : Wed Jun 28 21:56:34 2017 13 // Update Count : 33 14 14 // 15 15 … … 22 22 #include <stack> 23 23 24 #include " lex.h"25 #include "parser.h "24 #include "ParserTypes.h" 25 #include "parser.hh" 26 26 27 27 class TypedefTable { -
src/Parser/lex.ll
rfea3faa rb826e6b 10 10 * Created On : Sat Sep 22 08:58:10 2001 11 11 * Last Modified By : Peter A. Buhr 12 * Last Modified On : Tue May 30 22:00:48 201713 * Update Count : 5 2712 * Last Modified On : Tue Jul 18 07:11:48 2017 13 * Update Count : 544 14 14 */ 15 15 … … 27 27 #include <cstdio> // FILENAME_MAX 28 28 29 #include "lex.h"30 #include "parser.h" // YACC generated definitions based on C++ grammar31 29 #include "ParseNode.h" 32 30 #include "TypedefTable.h" … … 61 59 } 62 60 61 // Stop warning due to incorrectly generated flex code. 62 #pragma GCC diagnostic ignored "-Wsign-compare" 63 63 %} 64 64 … … 125 125 op_unary {op_unary_only}|{op_unary_binary}|{op_unary_pre_post} 126 126 127 op_binary_only "/"|"%"|" ^"|"&"|"|"|"<"|">"|"="|"=="|"!="|"<<"|">>"|"<="|">="|"+="|"-="|"*="|"/="|"%="|"&="|"|="|"^="|"<<="|">>="127 op_binary_only "/"|"%"|"\\"|"^"|"&"|"|"|"<"|">"|"="|"=="|"!="|"<<"|">>"|"<="|">="|"+="|"-="|"*="|"/="|"%="|"\\="|"&="|"|="|"^="|"<<="|">>=" 128 128 op_binary_over {op_unary_binary}|{op_binary_only} 129 129 // op_binary_not_over "?"|"->"|"."|"&&"|"||"|"@=" … … 136 136 137 137 %% 138 138 /* line directives */ 139 139 ^{h_white}*"#"{h_white}*[0-9]+{h_white}*["][^"\n]+["].*"\n" { 140 140 /* " stop highlighting */ … … 232 232 int { KEYWORD_RETURN(INT); } 233 233 __int128 { KEYWORD_RETURN(INT); } // GCC 234 __int128_t { KEYWORD_RETURN(INT); } // GCC 234 235 __label__ { KEYWORD_RETURN(LABEL); } // GCC 235 236 long { KEYWORD_RETURN(LONG); } … … 266 267 __typeof { KEYWORD_RETURN(TYPEOF); } // GCC 267 268 __typeof__ { KEYWORD_RETURN(TYPEOF); } // GCC 269 __uint128_t { KEYWORD_RETURN(INT); } // GCC 268 270 union { KEYWORD_RETURN(UNION); } 269 271 unsigned { KEYWORD_RETURN(UNSIGNED); } … … 274 276 __volatile__ { KEYWORD_RETURN(VOLATILE); } // GCC 275 277 while { KEYWORD_RETURN(WHILE); } 278 with { KEYWORD_RETURN(WITH); } // CFA 276 279 zero_t { NUMERIC_RETURN(ZERO_T); } // CFA 277 280 … … 336 339 "-" { ASCIIOP_RETURN(); } 337 340 "*" { ASCIIOP_RETURN(); } 341 "\\" { ASCIIOP_RETURN(); } // CFA, exponentiation 338 342 "/" { ASCIIOP_RETURN(); } 339 343 "%" { ASCIIOP_RETURN(); } … … 360 364 "+=" { NAMEDOP_RETURN(PLUSassign); } 361 365 "-=" { NAMEDOP_RETURN(MINUSassign); } 366 "\\=" { NAMEDOP_RETURN(EXPassign); } // CFA, exponentiation 362 367 "*=" { NAMEDOP_RETURN(MULTassign); } 363 368 "/=" { NAMEDOP_RETURN(DIVassign); } -
src/Parser/module.mk
rfea3faa rb826e6b 11 11 ## Created On : Sat May 16 15:29:09 2015 12 12 ## Last Modified By : Peter A. Buhr 13 ## Last Modified On : Tue Aug 16 17:28:34 201614 ## Update Count : 10 113 ## Last Modified On : Wed Jun 28 21:58:29 2017 14 ## Update Count : 104 15 15 ############################################################################### 16 16 17 BUILT_SOURCES = Parser/parser.h 17 BUILT_SOURCES = Parser/parser.hh 18 18 19 19 AM_YFLAGS = -d -t -v … … 29 29 Parser/TypeData.cc \ 30 30 Parser/LinkageSpec.cc \ 31 Parser/parse utility.cc31 Parser/parserutility.cc 32 32 33 33 MAINTAINERCLEANFILES += Parser/parser.output -
src/Parser/parser.yy
rfea3faa rb826e6b 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // cfa.y --7 // parser.yy -- 8 8 // 9 9 // Author : Peter A. Buhr 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Mon Ju n 12 12:59:00 201713 // Update Count : 24 0211 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Jul 17 12:17:00 2017 13 // Update Count : 2455 14 14 // 15 15 … … 48 48 #include <cstdio> 49 49 #include <stack> 50 #include "lex.h"51 #include "parser.h"52 50 #include "ParseNode.h" 53 51 #include "TypedefTable.h" … … 88 86 bool forall = false; // aggregate have one or more forall qualifiers ? 89 87 %} 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 } 90 108 91 109 //************************* TERMINAL TOKENS ******************************** … … 111 129 %token ATTRIBUTE EXTENSION // GCC 112 130 %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 // CFA131 %token CHOOSE DISABLE ENABLE FALLTHRU TRY CATCH CATCHRESUME FINALLY THROW THROWRESUME AT WITH // CFA 114 132 %token ASM // C99, extension ISO/IEC 9899:1999 Section J.5.10(1) 115 133 %token ALIGNAS ALIGNOF GENERIC STATICASSERT // C11 … … 133 151 %token ELLIPSIS // ... 134 152 135 %token MULTassign DIVassign MODassign // *= /= %=/153 %token EXPassign MULTassign DIVassign MODassign // \= *= /= %= 136 154 %token PLUSassign MINUSassign // += -= 137 155 %token LSassign RSassign // <<= >>= … … 139 157 140 158 %token ATassign // @= 141 142 // Types declaration143 %union144 {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 }160 159 161 160 %type<tok> identifier no_attr_identifier zero_one … … 169 168 %type<op> ptrref_operator unary_operator assignment_operator 170 169 %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 175 175 %type<en> comma_expression comma_expression_opt 176 %type<en> argument_expression_list argument_expression assignment_opt176 %type<en> argument_expression_list argument_expression default_initialize_opt 177 177 %type<fctl> for_control_expression 178 178 %type<en> subrange … … 185 185 // statements 186 186 %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 188 189 %type<sn> fall_through_opt fall_through 189 190 %type<sn> statement statement_list 190 191 %type<sn> block_item_list block_item 191 %type<sn> case_clause192 %type<sn> with_clause_opt 192 193 %type<en> case_value 193 %type<sn> case_ value_list case_label case_label_list194 %type<sn> case_clause case_value_list case_label case_label_list 194 195 %type<sn> switch_clause_list_opt switch_clause_list choose_clause_list_opt choose_clause_list 195 196 %type<sn> /* handler_list */ handler_clause finally_clause 197 %type<catch_kind> handler_key 196 198 197 199 // declarations … … 572 574 ; 573 575 576 exponential_expression: 577 cast_expression 578 | exponential_expression '\\' cast_expression 579 { $$ = new ExpressionNode( build_binary_val( OperKinds::Exp, $1, $3 ) ); } 580 ; 581 574 582 multiplicative_expression: 575 cast_expression576 | multiplicative_expression '*' cast_expression583 exponential_expression 584 | multiplicative_expression '*' exponential_expression 577 585 { $$ = new ExpressionNode( build_binary_val( OperKinds::Mul, $1, $3 ) ); } 578 | multiplicative_expression '/' cast_expression586 | multiplicative_expression '/' exponential_expression 579 587 { $$ = new ExpressionNode( build_binary_val( OperKinds::Div, $1, $3 ) ); } 580 | multiplicative_expression '%' cast_expression588 | multiplicative_expression '%' exponential_expression 581 589 { $$ = new ExpressionNode( build_binary_val( OperKinds::Mod, $1, $3 ) ); } 582 590 ; … … 677 685 '=' { $$ = OperKinds::Assign; } 678 686 | ATassign { $$ = OperKinds::AtAssn; } 687 | EXPassign { $$ = OperKinds::ExpAssn; } 679 688 | MULTassign { $$ = OperKinds::MulAssn; } 680 689 | DIVassign { $$ = OperKinds::DivAssn; } … … 729 738 | iteration_statement 730 739 | jump_statement 740 | with_statement 731 741 | exception_statement 732 742 | asm_statement … … 936 946 ; 937 947 948 with_statement: 949 WITH '(' tuple_expression_list ')' compound_statement 950 { $$ = (StatementNode *)0; } // FIX ME 951 ; 952 938 953 exception_statement: 939 954 TRY compound_statement handler_clause … … 959 974 960 975 handler_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 988 handler_predicate_opt: 989 //empty 990 | ';' conditional_expression 991 ; 992 993 handler_key: 994 CATCH 995 { $$ = CatchStmt::Terminate; } 996 | CATCHRESUME 997 { $$ = CatchStmt::Resume; } 969 998 ; 970 999 … … 1651 1680 | aggregate_key attribute_list_opt typegen_name // CFA 1652 1681 { $$ = $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 } 1653 1706 ; 1654 1707 … … 1829 1882 cfa_parameter_declaration: // CFA, new & old style parameter declaration 1830 1883 parameter_declaration 1831 | cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name assignment_opt1884 | cfa_identifier_parameter_declarator_no_tuple identifier_or_type_name default_initialize_opt 1832 1885 { $$ = $1->addName( $2 ); } 1833 | cfa_abstract_tuple identifier_or_type_name assignment_opt1886 | cfa_abstract_tuple identifier_or_type_name default_initialize_opt 1834 1887 // To obtain LR(1), these rules must be duplicated here (see cfa_abstract_declarator). 1835 1888 { $$ = $1->addName( $2 ); } 1836 | type_qualifier_list cfa_abstract_tuple identifier_or_type_name assignment_opt1889 | type_qualifier_list cfa_abstract_tuple identifier_or_type_name default_initialize_opt 1837 1890 { $$ = $2->addName( $3 )->addQualifiers( $1 ); } 1838 1891 | cfa_function_specifier … … 1851 1904 parameter_declaration: 1852 1905 // No SUE declaration in parameter list. 1853 declaration_specifier_nobody identifier_parameter_declarator assignment_opt1906 declaration_specifier_nobody identifier_parameter_declarator default_initialize_opt 1854 1907 { 1855 1908 typedefTable.addToEnclosingScope( TypedefTable::ID ); 1856 1909 $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); 1857 1910 } 1858 | declaration_specifier_nobody type_parameter_redeclarator assignment_opt1911 | declaration_specifier_nobody type_parameter_redeclarator default_initialize_opt 1859 1912 { 1860 1913 typedefTable.addToEnclosingScope( TypedefTable::ID ); … … 1864 1917 1865 1918 abstract_parameter_declaration: 1866 declaration_specifier_nobody assignment_opt1919 declaration_specifier_nobody default_initialize_opt 1867 1920 { $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); } 1868 | declaration_specifier_nobody abstract_parameter_declarator assignment_opt1921 | declaration_specifier_nobody abstract_parameter_declarator default_initialize_opt 1869 1922 { $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); } 1870 1923 ; … … 2167 2220 { 2168 2221 linkageStack.push( linkage ); // handle nested extern "C"/"Cforall" 2169 linkage = LinkageSpec::linkage Check($2 );2222 linkage = LinkageSpec::linkageUpdate( linkage, $2 ); 2170 2223 } 2171 2224 '{' external_definition_list_opt '}' … … 2203 2256 ; 2204 2257 2258 with_clause_opt: 2259 // empty 2260 { $$ = (StatementNode *)0; } // FIX ME 2261 | WITH '(' tuple_expression_list ')' 2262 { $$ = (StatementNode *)0; } // FIX ME 2263 ; 2264 2205 2265 function_definition: 2206 cfa_function_declaration compound_statement// CFA2266 cfa_function_declaration with_clause_opt compound_statement // CFA 2207 2267 { 2208 2268 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2209 2269 typedefTable.leaveScope(); 2210 $$ = $1->addFunctionBody( $ 2);2211 } 2212 | declaration_specifier function_declarator compound_statement2270 $$ = $1->addFunctionBody( $3 ); 2271 } 2272 | declaration_specifier function_declarator with_clause_opt compound_statement 2213 2273 { 2214 2274 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2215 2275 typedefTable.leaveScope(); 2216 $$ = $2->addFunctionBody( $ 3)->addType( $1 );2217 } 2218 | type_qualifier_list function_declarator compound_statement2276 $$ = $2->addFunctionBody( $4 )->addType( $1 ); 2277 } 2278 | type_qualifier_list function_declarator with_clause_opt compound_statement 2219 2279 { 2220 2280 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2221 2281 typedefTable.leaveScope(); 2222 $$ = $2->addFunctionBody( $ 3)->addQualifiers( $1 );2223 } 2224 | declaration_qualifier_list function_declarator compound_statement2282 $$ = $2->addFunctionBody( $4 )->addQualifiers( $1 ); 2283 } 2284 | declaration_qualifier_list function_declarator with_clause_opt compound_statement 2225 2285 { 2226 2286 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2227 2287 typedefTable.leaveScope(); 2228 $$ = $2->addFunctionBody( $ 3)->addQualifiers( $1 );2229 } 2230 | declaration_qualifier_list type_qualifier_list function_declarator compound_statement2288 $$ = $2->addFunctionBody( $4 )->addQualifiers( $1 ); 2289 } 2290 | declaration_qualifier_list type_qualifier_list function_declarator with_clause_opt compound_statement 2231 2291 { 2232 2292 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2233 2293 typedefTable.leaveScope(); 2234 $$ = $3->addFunctionBody( $ 4)->addQualifiers( $2 )->addQualifiers( $1 );2294 $$ = $3->addFunctionBody( $5 )->addQualifiers( $2 )->addQualifiers( $1 ); 2235 2295 } 2236 2296 2237 2297 // Old-style K&R function definition, OBSOLESCENT (see 4) 2238 | declaration_specifier KR_function_declarator push KR_declaration_list_opt compound_statement2298 | declaration_specifier KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement 2239 2299 { 2240 2300 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2241 2301 typedefTable.leaveScope(); 2242 $$ = $2->addOldDeclList( $4 )->addFunctionBody( $ 5)->addType( $1 );2243 } 2244 | type_qualifier_list KR_function_declarator push KR_declaration_list_opt compound_statement2302 $$ = $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 2245 2305 { 2246 2306 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2247 2307 typedefTable.leaveScope(); 2248 $$ = $2->addOldDeclList( $4 )->addFunctionBody( $ 5)->addQualifiers( $1 );2308 $$ = $2->addOldDeclList( $4 )->addFunctionBody( $6 )->addQualifiers( $1 ); 2249 2309 } 2250 2310 2251 2311 // 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_statement2312 | declaration_qualifier_list KR_function_declarator push KR_declaration_list_opt with_clause_opt compound_statement 2253 2313 { 2254 2314 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2255 2315 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_statement2316 $$ = $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 2259 2319 { 2260 2320 typedefTable.addToEnclosingScope( TypedefTable::ID ); 2261 2321 typedefTable.leaveScope(); 2262 $$ = $3->addOldDeclList( $5 )->addFunctionBody( $ 6)->addQualifiers( $2 )->addQualifiers( $1 );2322 $$ = $3->addOldDeclList( $5 )->addFunctionBody( $7 )->addQualifiers( $2 )->addQualifiers( $1 ); 2263 2323 } 2264 2324 ; … … 2323 2383 | TYPEGENname 2324 2384 | CONST 2325 { $$ = Token{ new string( "__const__" ) }; }2385 { $$ = Token{ new string( "__const__" ), { nullptr, -1 } }; } 2326 2386 ; 2327 2387 … … 3022 3082 ; 3023 3083 3024 assignment_opt:3084 default_initialize_opt: 3025 3085 // empty 3026 3086 { $$ = nullptr; } -
src/ResolvExpr/AlternativeFinder.cc
rfea3faa rb826e6b 604 604 // ) 605 605 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 // ) 612 612 addToIndexer( have, decls ); 613 613 AssertionSet newNeed; … … 809 809 } 810 810 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 811 837 void AlternativeFinder::visit( CastExpr *castExpr ) { 812 838 Type *& toType = castExpr->get_result(); … … 840 866 thisCost += Cost( 0, 0, discardedValues ); 841 867 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 ) ); 866 869 } // if 867 870 } // for … … 1182 1185 } 1183 1186 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 } 1184 1234 } // namespace ResolvExpr 1185 1235 -
src/ResolvExpr/AlternativeFinder.h
rfea3faa rb826e6b 73 73 virtual void visit( UniqueExpr *unqExpr ); 74 74 virtual void visit( StmtExpr *stmtExpr ); 75 virtual void visit( UntypedInitExpr *initExpr ); 75 76 /// Runs a new alternative finder on each element in [begin, end) 76 77 /// and writes each alternative finder to out. -
src/ResolvExpr/Resolver.cc
rfea3faa rb826e6b 14 14 // 15 15 16 #include <iostream> 17 18 #include "Alternative.h" 19 #include "AlternativeFinder.h" 20 #include "CurrentObject.h" 21 #include "RenameVars.h" 16 22 #include "Resolver.h" 17 #include "AlternativeFinder.h"18 #include "Alternative.h"19 #include "RenameVars.h"20 23 #include "ResolveTypeof.h" 21 24 #include "typeops.h" 25 26 #include "SynTree/Expression.h" 27 #include "SynTree/Initializer.h" 22 28 #include "SynTree/Statement.h" 23 29 #include "SynTree/Type.h" 24 #include "SynTree/Expression.h" 25 #include "Sy nTree/Initializer.h"30 31 #include "SymTab/Autogen.h" 26 32 #include "SymTab/Indexer.h" 27 #include "SymTab/Autogen.h" 33 28 34 #include "Common/utility.h" 35 29 36 #include "InitTweak/InitTweak.h" 30 37 31 #include <iostream>32 38 using namespace std; 33 39 … … 39 45 if ( const Resolver * res = dynamic_cast< const Resolver * >( &other ) ) { 40 46 functionReturn = res->functionReturn; 41 initContext = res->initContext;47 currentObject = res->currentObject; 42 48 inEnumDecl = res->inEnumDecl; 43 49 } … … 64 70 virtual void visit( BranchStmt *branchStmt ) override; 65 71 virtual void visit( ReturnStmt *returnStmt ) override; 72 virtual void visit( ThrowStmt *throwStmt ) override; 66 73 67 74 virtual void visit( SingleInit *singleInit ) override; … … 79 86 80 87 Type * functionReturn = nullptr; 81 Type *initContext = nullptr;88 CurrentObject currentObject = nullptr; 82 89 bool inEnumDecl = false; 83 90 }; … … 186 193 // each value of initContext is retained, so the type on the first analysis is preserved and used for selecting 187 194 // 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() ) ) { 191 198 // enumerator initializers should not use the enum type to initialize, since 192 199 // 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 ) ); 194 201 } 195 202 Parent::visit( objectDecl ); 196 if ( inEnumDecl && dynamic_cast< EnumInstType * >( initContext) ) {203 if ( inEnumDecl && dynamic_cast< EnumInstType * >( objectDecl->get_type() ) ) { 197 204 // delete newly created signed int type 198 delete initContext; 199 } 200 initContext = temp; 205 // delete currentObject.getType(); 206 } 201 207 } 202 208 … … 315 321 316 322 void Resolver::visit( SwitchStmt *switchStmt ) { 317 ValueGuard< Type * > oldInitContext( initContext );323 ValueGuard< CurrentObject > oldCurrentObject( currentObject ); 318 324 Expression *newExpr; 319 325 newExpr = findIntegralExpression( switchStmt->get_condition(), *this ); … … 321 327 switchStmt->set_condition( newExpr ); 322 328 323 initContext = newExpr->get_result();329 currentObject = CurrentObject( newExpr->get_result() ); 324 330 Parent::visit( switchStmt ); 325 331 } … … 327 333 void Resolver::visit( CaseStmt *caseStmt ) { 328 334 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() ); 331 338 Expression * newExpr = findSingleExpression( castExpr, *this ); 332 339 castExpr = safe_dynamic_cast< CastExpr * >( newExpr ); … … 360 367 } 361 368 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 362 377 template< typename T > 363 378 bool isCharType( T t ) { … … 370 385 371 386 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; 419 416 } 420 417 } 421 418 } 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(); 486 426 } 487 427 488 428 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 { 573 458 } 574 459 -
src/ResolvExpr/Unify.cc
rfea3faa rb826e6b 606 606 } else if ( tupleParam ) { 607 607 // bundle other parameters into tuple to match 608 TupleType* binder = new TupleType{ paramTy->get_qualifiers() };608 std::list< Type * > binderTypes; 609 609 610 610 do { 611 binder ->get_types().push_back( otherParam->get_type()->clone() );611 binderTypes.push_back( otherParam->get_type()->clone() ); 612 612 ++jt; 613 613 … … 618 618 } while (true); 619 619 620 otherParamTy = binder;620 otherParamTy = new TupleType{ paramTy->get_qualifiers(), binderTypes }; 621 621 ++it; // skip ttype parameter for break 622 622 } else if ( otherTupleParam ) { 623 623 // bundle parameters into tuple to match other 624 TupleType* binder = new TupleType{ otherParamTy->get_qualifiers() };624 std::list< Type * > binderTypes; 625 625 626 626 do { 627 binder ->get_types().push_back( param->get_type()->clone() );627 binderTypes.push_back( param->get_type()->clone() ); 628 628 ++it; 629 629 … … 634 634 } while (true); 635 635 636 paramTy = binder;636 paramTy = new TupleType{ otherParamTy->get_qualifiers(), binderTypes }; 637 637 ++jt; // skip ttype parameter for break 638 638 } … … 756 756 return function->get_returnVals().front()->get_type()->clone(); 757 757 } else { 758 TupleType * tupleType = new TupleType( Type::Qualifiers() );758 std::list< Type * > types; 759 759 for ( DeclarationWithType * decl : function->get_returnVals() ) { 760 t upleType->get_types().push_back( decl->get_type()->clone() );760 types.push_back( decl->get_type()->clone() ); 761 761 } // for 762 return tupleType;762 return new TupleType( Type::Qualifiers(), types ); 763 763 } 764 764 } -
src/ResolvExpr/module.mk
rfea3faa rb826e6b 6 6 ## file "LICENCE" distributed with Cforall. 7 7 ## 8 ## module.mk -- 8 ## module.mk -- 9 9 ## 10 10 ## Author : Richard C. Bilson … … 31 31 ResolvExpr/PolyCost.cc \ 32 32 ResolvExpr/Occurs.cc \ 33 ResolvExpr/TypeEnvironment.cc 33 ResolvExpr/TypeEnvironment.cc \ 34 ResolvExpr/CurrentObject.cc -
src/SymTab/Autogen.cc
rfea3faa rb826e6b 9 9 // Author : Rob Schluntz 10 10 // Created On : Thu Mar 03 15:45:56 2016 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Mar 17 09:41:08201713 // Update Count : 6 011 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Jul 14 16:41:00 2017 13 // Update Count : 62 14 14 // 15 15 … … 400 400 /// generates struct constructors, destructor, and assignment functions 401 401 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 402 408 // Make function polymorphic in same parameters as generic struct, if applicable 403 409 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 25 25 26 26 namespace SymTab { 27 28 27 /// Generates assignment operators, constructors, and destructor for aggregate types as required 28 void autogenerateRoutines( std::list< Declaration * > &translationUnit ); 29 29 30 31 30 /// returns true if obj's name is the empty string and it has a bitfield width 31 bool isUnnamedBitfield( ObjectDecl * obj ); 32 32 33 34 35 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; 36 36 37 38 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 > 39 39 Statement * genCall( InitTweak::InitExpander & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast = false, bool forward = true ); 40 40 41 42 43 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 > 44 44 Statement * genScalarCall( InitTweak::InitExpander & srcParam, Expression *dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast = false ) { 45 45 // want to be able to generate assignment, ctor, and dtor generically, … … 50 50 dstParam = new AddressExpr( dstParam ); 51 51 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 ) ); 64 63 } 65 64 fExpr->get_args().push_back( dstParam ); … … 75 74 76 75 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 081 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 assignment86 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( "--?" );103 76 } 104 77 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" ); 106 83 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 ; 110 86 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 } 113 103 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 ) ); 118 105 119 // srcParam must keep track of the array indices to build the120 // source parameter and/or array list initializer121 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 ); 122 109 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 ) ) ); 126 112 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; 133 117 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() ); 136 121 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 > 138 137 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 } 144 144 } 145 }146 145 147 148 149 150 151 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 > 152 151 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 accessed156 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; 157 156 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 ); 161 160 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 } 174 174 } 175 }176 175 } // namespace SymTab 177 176 #endif // AUTOGEN_H -
src/SymTab/ImplementationType.cc
rfea3faa rb826e6b 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // ImplementationType.cc -- 7 // ImplementationType.cc -- 8 8 // 9 9 // Author : Richard C. Bilson … … 92 92 93 93 void ImplementationType::visit(TupleType *tupleType) { 94 TupleType *newType = new TupleType( Type::Qualifiers() );94 std::list< Type * > types; 95 95 for ( std::list< Type* >::iterator i = tupleType->get_types().begin(); i != tupleType->get_types().end(); ++i ) { 96 96 Type *implType = implementationType( *i, indexer ); 97 97 implType->get_qualifiers() |= tupleType->get_qualifiers(); 98 newType->get_types().push_back( implType );98 types.push_back( implType ); 99 99 } // for 100 result = new Type;100 result = new TupleType( Type::Qualifiers(), types ); 101 101 } 102 102 -
src/SymTab/Indexer.cc
rfea3faa rb826e6b 652 652 for ( MangleTable::const_iterator decl = mangleTable.begin(); decl != mangleTable.end(); ++decl ) { 653 653 // 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; 655 655 } 656 656 } … … 669 669 // check for C decls with the same name, skipping 670 670 // 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; 672 672 } 673 673 } … … 724 724 // new definition shadows the autogenerated one, even at the same scope 725 725 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() ) ) { 727 727 // typesCompatible doesn't really do the right thing here. When checking compatibility of function types, 728 728 // we should ignore outermost pointer qualifiers, except _Atomic? … … 765 765 766 766 // 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() ) ) { 768 768 // NOTE this is broken in Richard's original code in such a way that it never triggers (it 769 769 // doesn't check decls that have the same manglename, and all C-linkage decls are defined to -
src/SymTab/Mangler.cc
rfea3faa rb826e6b 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:40:29 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Mar 17 09:40:01201713 // Update Count : 2 011 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed Jun 28 15:31:00 2017 13 // Update Count : 21 14 14 // 15 15 … … 72 72 } else { 73 73 // if we add another kind of overridable function, this has to change 74 assert( false );74 assert( false && "unknown overrideable linkage" ); 75 75 } // if 76 76 } -
src/SymTab/Validate.cc
rfea3faa rb826e6b 106 106 107 107 /// Fix return types so that every function returns exactly one value 108 class ReturnTypeFixer { 109 public: 108 struct ReturnTypeFixer { 110 109 static void fix( std::list< Declaration * > &translationUnit ); 111 110 … … 115 114 116 115 /// 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 { 119 117 void previsit( EnumDecl *aggregateDecl ); 120 118 void previsit( FunctionType *func ); … … 159 157 }; 160 158 161 class ReturnChecker : public WithScopes { 162 public: 159 struct ReturnChecker : public WithGuards { 163 160 /// Checks that return statements return nothing if their return type is void 164 161 /// and return something if the return type is non-void. 165 162 static void checkFunctionReturns( std::list< Declaration * > & translationUnit ); 166 private: 163 167 164 void previsit( FunctionDecl * functionDecl ); 168 165 void previsit( ReturnStmt * returnStmt ); … … 205 202 }; 206 203 207 class VerifyCtorDtorAssign { 208 public: 204 struct VerifyCtorDtorAssign { 209 205 /// ensure that constructors, destructors, and assignment have at least one 210 206 /// parameter, the first of which must be a pointer, and that ctor/dtors have no … … 216 212 217 213 /// ensure that generic types have the correct number of type arguments 218 class ValidateGenericParameters { 219 public: 214 struct ValidateGenericParameters { 220 215 void previsit( StructInstType * inst ); 221 216 void previsit( UnionInstType * inst ); 222 217 }; 223 218 224 class ArrayLength { 225 public: 219 struct ArrayLength { 226 220 /// for array types without an explicit length, compute the length and store it so that it 227 221 /// is known to the rest of the phases. For example, … … 236 230 }; 237 231 238 class CompoundLiteral final : public GenPoly::DeclMutator{232 struct CompoundLiteral final : public WithDeclsToAdd, public WithVisitorRef<CompoundLiteral> { 239 233 Type::StorageClasses storageClasses; 240 234 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 ); 244 237 }; 245 238 … … 248 241 LinkReferenceToTypes lrt( doDebug, 0 ); 249 242 ForallPointerDecay fpd( 0 ); 250 CompoundLiteralcompoundliteral;243 PassVisitor<CompoundLiteral> compoundliteral; 251 244 PassVisitor<ValidateGenericParameters> genericParams; 252 245 … … 263 256 Concurrency::implementThreadStarter( translationUnit ); 264 257 ReturnChecker::checkFunctionReturns( translationUnit ); 265 compoundliteral.mutateDeclarationList( translationUnit);258 mutateAll( translationUnit, compoundliteral ); 266 259 acceptAll( translationUnit, fpd ); 267 260 ArrayLength::computeLength( translationUnit ); … … 883 876 } 884 877 885 DeclarationWithType * CompoundLiteral::mutate( ObjectDecl *objectDecl ) {878 void CompoundLiteral::premutate( ObjectDecl *objectDecl ) { 886 879 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 ) { 892 883 // transform [storage_class] ... (struct S){ 3, ... }; 893 884 // into [storage_class] struct S temp = { 3, ... }; 894 885 static UniqueName indexName( "_compLit" ); 895 886 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 ); 899 890 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 ); 903 893 } 904 894 -
src/SymTab/module.mk
rfea3faa rb826e6b 10 10 ## Author : Richard C. Bilson 11 11 ## Created On : Mon Jun 1 17:49:17 2015 12 ## Last Modified By : Rob Schluntz13 ## Last Modified On : Tue Jul 07 16:22:23 201514 ## Update Count : 212 ## Last Modified By : Andrew Beach 13 ## Last Modified On : Wed Jul 12 13:06:00 2017 14 ## Update Count : 3 15 15 ############################################################################### 16 16 … … 21 21 SymTab/ImplementationType.cc \ 22 22 SymTab/TypeEquality.cc \ 23 SymTab/Autogen.cc 23 SymTab/Autogen.cc \ 24 SymTab/TreeStruct.cc -
src/SynTree/AggregateDecl.cc
rfea3faa rb826e6b 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 23:56:39 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T hu Mar 16 07:49:07201713 // Update Count : 2 011 // Last Modified By : Andrew Beach 12 // Last Modified On : Tus Jun 27 15:30:00 2017 13 // Update Count : 21 14 14 // 15 15 … … 20 20 21 21 22 AggregateDecl::AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes ) : Parent( name, Type::StorageClasses(), LinkageSpec::Cforall), body( false ), attributes( attributes ) {22 AggregateDecl::AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes, LinkageSpec::Spec linkage ) : Parent( name, Type::StorageClasses(), linkage ), body( false ), attributes( attributes ) { 23 23 } 24 24 -
src/SynTree/Constant.cc
rfea3faa rb826e6b 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Constant.cc -- 7 // Constant.cc -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Thr Jun 22 10:11:00 201713 // Update Count : 2 812 // Last Modified On : Fri Jul 14 14:50:00 2017 13 // Update Count : 29 14 14 // 15 15 … … 46 46 } 47 47 48 Constant 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 59 unsigned 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 64 double 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 48 69 void Constant::print( std::ostream &os ) const { 49 70 os << "(" << rep << " " << val.ival; -
src/SynTree/Constant.h
rfea3faa rb826e6b 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Constant.h -- 7 // Constant.h -- 8 8 // 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Thr Jun 22 10:13:00 201713 // Update Count : 1 512 // Last Modified On : Fri Jul 14 13:33:00 2017 13 // Update Count : 16 14 14 // 15 15 … … 32 32 std::string & get_value() { return rep; } 33 33 void set_value( std::string newValue ) { rep = newValue; } 34 unsigned long long get_ival() const; 35 double get_dval() const; 34 36 35 37 /// generates a boolean constant of the given bool … … 41 43 /// generates a floating point constant of the given double 42 44 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 ); 43 48 44 49 virtual void accept( Visitor & v ) { v.visit( this ); } -
src/SynTree/Declaration.h
rfea3faa rb826e6b 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Mar 17 16:05:08201713 // Update Count : 12 111 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Jul 14 16:59:00 2017 13 // Update Count : 123 14 14 // 15 15 … … 238 238 typedef Declaration Parent; 239 239 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 ); 241 241 AggregateDecl( const AggregateDecl &other ); 242 242 virtual ~AggregateDecl(); … … 266 266 typedef AggregateDecl Parent; 267 267 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 : "" ) {} 269 270 StructDecl( const StructDecl &other ) : Parent( other ) {} 270 271 … … 273 274 bool is_thread() { return kind == DeclarationNode::Thread; } 274 275 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 275 282 virtual StructDecl *clone() const { return new StructDecl( *this ); } 276 283 virtual void accept( Visitor &v ) { v.visit( this ); } … … 279 286 DeclarationNode::Aggregate kind; 280 287 virtual std::string typeString() const; 288 289 bool tagged; 290 std::string parent_name; 281 291 }; 282 292 … … 284 294 typedef AggregateDecl Parent; 285 295 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 ) {} 287 297 UnionDecl( const UnionDecl &other ) : Parent( other ) {} 288 298 … … 297 307 typedef AggregateDecl Parent; 298 308 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 ) {} 300 310 EnumDecl( const EnumDecl &other ) : Parent( other ) {} 301 311 -
src/SynTree/Expression.cc
rfea3faa rb826e6b 21 21 #include <iterator> 22 22 23 #include "Declaration.h" 24 #include "Expression.h" 25 #include "Initializer.h" 26 #include "Statement.h" 23 27 #include "Type.h" 24 #include "Initializer.h"25 #include "Expression.h"26 #include "Declaration.h"27 #include "Statement.h"28 28 #include "TypeSubstitution.h" 29 #include "VarExprReplacer.h" 30 29 31 #include "Common/utility.h" 32 #include "Common/PassVisitor.h" 33 30 34 #include "InitTweak/InitTweak.h" 31 35 … … 92 96 93 97 Declaration *decl = get_var(); 94 // if ( decl != 0) decl->print(os, indent + 2);95 98 if ( decl != 0) decl->printShort(os, indent + 2); 96 99 os << std::endl; … … 657 660 } 658 661 662 InitAlternative::InitAlternative( Type * type, Designation * designation ) : type( type ), designation( designation ) {} 663 InitAlternative::InitAlternative( const InitAlternative & other ) : type( maybeClone( other.type ) ), designation( maybeClone( other.designation ) ) {} 664 InitAlternative::~InitAlternative() { 665 delete type; 666 delete designation; 667 } 668 669 UntypedInitExpr::UntypedInitExpr( Expression * expr, const std::list<InitAlternative> & initAlts ) : expr( expr ), initAlts( initAlts ) {} 670 UntypedInitExpr::UntypedInitExpr( const UntypedInitExpr & other ) : Expression( other ), expr( maybeClone( other.expr ) ), initAlts( other.initAlts ) {} 671 UntypedInitExpr::~UntypedInitExpr() { 672 delete expr; 673 } 674 675 void 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 687 InitExpr::InitExpr( Expression * expr, Designation * designation ) : expr( expr ), designation( designation ) { 688 set_result( expr->get_result()->clone() ); 689 } 690 InitExpr::InitExpr( const InitExpr & other ) : Expression( other ), expr( maybeClone( other.expr ) ), designation( maybeClone( other.designation) ) {} 691 InitExpr::~InitExpr() { 692 delete expr; 693 delete designation; 694 } 695 696 void 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 659 704 std::ostream & operator<<( std::ostream & out, const Expression * expr ) { 660 705 if ( expr ) { -
src/SynTree/Expression.h
rfea3faa rb826e6b 744 744 }; 745 745 746 struct InitAlternative { 747 public: 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 756 class UntypedInitExpr : public Expression { 757 public: 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; 771 private: 772 Expression * expr; 773 std::list<InitAlternative> initAlts; 774 }; 775 776 class InitExpr : public Expression { 777 public: 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; 792 private: 793 Expression * expr; 794 Designation * designation; 795 }; 796 797 746 798 std::ostream & operator<<( std::ostream & out, const Expression * expr ); 747 799 -
src/SynTree/Initializer.cc
rfea3faa rb826e6b 19 19 #include "Common/utility.h" 20 20 21 Designation::Designation( const std::list< Expression * > & designators ) : designators( designators ) {} 22 Designation::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 28 Designation::~Designation() { 29 // std::cerr << "destroying designation" << std::endl; 30 deleteAll( designators ); 31 // std::cerr << "finished destroying designation" << std::endl; 32 } 33 34 void 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 21 45 Initializer::Initializer( bool maybeConstructed ) : maybeConstructed( maybeConstructed ) {} 22 46 Initializer::Initializer( const Initializer & other ) : BaseSyntaxNode( other ), maybeConstructed( other.maybeConstructed ) { 23 47 } 24 25 26 48 Initializer::~Initializer() {} 27 49 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 ) { 50 SingleInit::SingleInit( Expression *v, bool maybeConstructed ) : Initializer( maybeConstructed ), value ( v ) { 38 51 } 39 52 40 53 SingleInit::SingleInit( const SingleInit &other ) : Initializer(other), value ( maybeClone( other.value ) ) { 41 cloneAll(other.designators, designators );42 54 } 43 55 44 56 SingleInit::~SingleInit() { 45 57 delete value; 46 deleteAll(designators);47 58 } 48 59 49 void SingleInit::print( std::ostream &os, int indent ) {50 os << std:: endl << std::string(indent, ' ' ) << "Simple Initializer: " << std::endl;60 void SingleInit::print( std::ostream &os, int indent ) const { 61 os << std::string(indent, ' ' ) << "Simple Initializer: " << std::endl; 51 62 os << std::string(indent+4, ' ' ); 52 63 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 } // if61 64 } 62 65 63 ListInit::ListInit( const std::list<Initializer*> &_initializers, const std::list<Expression *> &_designators, bool maybeConstructed ) 64 : Initializer( maybeConstructed ), initializers( _initializers ), designators( _designators ) { 66 67 ListInit::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() ); 65 77 } 66 78 67 79 ListInit::ListInit( const ListInit & other ) : Initializer( other ) { 68 80 cloneAll( other.initializers, initializers ); 69 cloneAll( other.designat ors, designators );81 cloneAll( other.designations, designations ); 70 82 } 71 72 83 73 84 ListInit::~ListInit() { 74 85 deleteAll( initializers ); 75 deleteAll( designat ors );86 deleteAll( designations ); 76 87 } 77 88 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 89 void 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 } 86 94 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 } 92 99 } 93 100 … … 103 110 } 104 111 105 void ConstructorInit::print( std::ostream &os, int indent ) {112 void ConstructorInit::print( std::ostream &os, int indent ) const { 106 113 os << std::endl << std::string(indent, ' ') << "Constructor initializer: " << std::endl; 107 114 if ( ctor ) { … … 124 131 } 125 132 126 std::ostream & operator<<( std::ostream & out, Initializer * init ) { 127 init->print( out ); 133 std::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 142 std::ostream & operator<<( std::ostream & out, const Designation * des ) { 143 if ( des ) { 144 des->print( out ); 145 } else { 146 out << "nullptr"; 147 } 128 148 return out; 129 149 } -
src/SynTree/Initializer.h
rfea3faa rb826e6b 25 25 #include "Visitor.h" 26 26 27 const std::list<Expression*> noDesignators; 27 // Designation: list of designator (NameExpr, VariableExpr, and ConstantExpr) expressions that specify an object being initialized. 28 class Designation : public BaseSyntaxNode { 29 public: 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; 40 private: 41 std::list< Expression * > designators; 42 }; 43 44 const std::list<Designation *> noDesignators; 28 45 29 46 // Initializer: base class for object initializers (provide default values) 30 47 class Initializer : public BaseSyntaxNode { 31 48 public: 32 // Initializer( std::string _name = std::string(""), int _pos = 0 );33 49 Initializer( bool maybeConstructed ); 34 50 Initializer( const Initializer & other ); 35 51 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 reached48 }49 52 50 53 bool get_maybeConstructed() { return maybeConstructed; } … … 53 56 virtual void accept( Visitor &v ) = 0; 54 57 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; 56 59 private: 57 // std::string name;58 // int pos;59 60 bool maybeConstructed; 60 61 }; … … 63 64 class SingleInit : public Initializer { 64 65 public: 65 SingleInit( Expression *value, const std::list< Expression *> &designators = std::list< Expression * >(),bool maybeConstructed = false );66 SingleInit( Expression *value, bool maybeConstructed = false ); 66 67 SingleInit( const SingleInit &other ); 67 68 virtual ~SingleInit(); … … 70 71 void set_value( Expression *newValue ) { value = newValue; } 71 72 72 std::list<Expression *> &get_designators() { return designators; }73 void set_designators( std::list<Expression *> &newValue ) { designators = newValue; }74 75 73 virtual SingleInit *clone() const { return new SingleInit( *this); } 76 74 virtual void accept( Visitor &v ) { v.visit( this ); } 77 75 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; 79 77 private: 80 78 //Constant *value; 81 79 Expression *value; // has to be a compile-time constant 82 std::list< Expression * > designators;83 80 }; 84 81 … … 88 85 public: 89 86 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 ); 91 88 ListInit( const ListInit & other ); 92 89 virtual ~ListInit(); 93 90 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; } 98 93 99 94 typedef std::list<Initializer*>::iterator iterator; 95 typedef std::list<Initializer*>::const_iterator const_iterator; 100 96 iterator begin() { return initializers.begin(); } 101 97 iterator end() { return initializers.end(); } 98 const_iterator begin() const { return initializers.begin(); } 99 const_iterator end() const { return initializers.end(); } 102 100 103 101 virtual ListInit *clone() const { return new ListInit( *this ); } 104 102 virtual void accept( Visitor &v ) { v.visit( this ); } 105 103 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; 107 105 private: 108 std::list<Initializer *> initializers; // order *is* important109 std::list< Expression *> designators;106 std::list<Initializer *> initializers; // order *is* important 107 std::list<Designation *> designations; // order/length is consistent with initializers 110 108 }; 111 109 … … 130 128 virtual void accept( Visitor &v ) { v.visit( this ); } 131 129 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; 133 131 134 132 private: … … 140 138 }; 141 139 142 std::ostream & operator<<( std::ostream & out, Initializer * init ); 140 std::ostream & operator<<( std::ostream & out, const Initializer * init ); 141 std::ostream & operator<<( std::ostream & out, const Designation * des ); 143 142 144 143 #endif // INITIALIZER_H -
src/SynTree/Mutator.cc
rfea3faa rb826e6b 433 433 } 434 434 435 Expression *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 443 Expression *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 435 451 436 452 Type *Mutator::mutate( VoidType *voidType ) { … … 499 515 mutateAll( tupleType->get_forall(), *this ); 500 516 mutateAll( tupleType->get_types(), *this ); 517 mutateAll( tupleType->get_members(), *this ); 501 518 return tupleType; 502 519 } … … 535 552 536 553 554 Designation *Mutator::mutate( Designation * designation ) { 555 mutateAll( designation->get_designators(), *this ); 556 return designation; 557 } 558 537 559 Initializer *Mutator::mutate( SingleInit *singleInit ) { 538 560 singleInit->set_value( singleInit->get_value()->acceptMutator( *this ) ); … … 541 563 542 564 Initializer *Mutator::mutate( ListInit *listInit ) { 543 mutateAll( listInit->get_designat ors(), *this );565 mutateAll( listInit->get_designations(), *this ); 544 566 mutateAll( listInit->get_initializers(), *this ); 545 567 return listInit; -
src/SynTree/Mutator.h
rfea3faa rb826e6b 85 85 virtual Expression* mutate( StmtExpr * stmtExpr ); 86 86 virtual Expression* mutate( UniqueExpr * uniqueExpr ); 87 virtual Expression* mutate( UntypedInitExpr * initExpr ); 88 virtual Expression* mutate( InitExpr * initExpr ); 87 89 88 90 virtual Type* mutate( VoidType *basicType ); … … 103 105 virtual Type* mutate( OneType *oneType ); 104 106 107 virtual Designation* mutate( Designation *designation ); 105 108 virtual Initializer* mutate( SingleInit *singleInit ); 106 109 virtual Initializer* mutate( ListInit *listInit ); -
src/SynTree/SynTree.h
rfea3faa rb826e6b 93 93 class StmtExpr; 94 94 class UniqueExpr; 95 class UntypedInitExpr; 96 class InitExpr; 95 97 96 98 class Type; … … 113 115 class OneType; 114 116 117 class Designation; 115 118 class Initializer; 116 119 class SingleInit; -
src/SynTree/TupleType.cc
rfea3faa rb826e6b 14 14 // 15 15 16 #include "Declaration.h" 17 #include "Initializer.h" 16 18 #include "Type.h" 17 19 #include "Common/utility.h" 20 #include "Parser/LinkageSpec.h" 18 21 19 22 TupleType::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 } 20 33 } 21 34 22 35 TupleType::TupleType( const TupleType& other ) : Type( other ) { 23 36 cloneAll( other.types, types ); 37 cloneAll( other.members, members ); 24 38 } 25 39 26 40 TupleType::~TupleType() { 27 41 deleteAll( types ); 42 deleteAll( members ); 28 43 } 29 44 -
src/SynTree/Type.h
rfea3faa rb826e6b 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T hu Mar 23 16:16:36201713 // Update Count : 1 4911 // Last Modified By : Andrew Beach 12 // Last Modified On : Tus Jul 18 10:06:00 2017 13 // Update Count : 150 14 14 // 15 15 … … 172 172 }; 173 173 174 extern Type::Qualifiers emptyQualifiers; // no qualifiers on constants174 extern Type::Qualifiers noQualifiers; // no qualifiers on constants 175 175 176 176 class VoidType : public Type { … … 481 481 class TupleType : public Type { 482 482 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 * >() ); 484 484 TupleType( const TupleType& ); 485 485 virtual ~TupleType(); … … 488 488 typedef value_type::iterator iterator; 489 489 490 std::list<Type *>& get_types() { return types; }490 std::list<Type *> & get_types() { return types; } 491 491 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; } 492 496 493 497 iterator begin() { return types.begin(); } … … 506 510 virtual void print( std::ostream & os, int indent = 0 ) const; 507 511 private: 508 std::list<Type*> types; 512 std::list<Type *> types; 513 std::list<Declaration *> members; 509 514 }; 510 515 -
src/SynTree/VarExprReplacer.cc
rfea3faa rb826e6b 14 14 // 15 15 16 #include "Declaration.h" 16 17 #include "Expression.h" 17 18 #include "VarExprReplacer.h" 18 19 19 VarExprReplacer::VarExprReplacer( const DeclMap & declMap ) : declMap( declMap) {}20 VarExprReplacer::VarExprReplacer( const DeclMap & declMap, bool debug ) : declMap( declMap ), debug( debug ) {} 20 21 21 22 // replace variable with new node from decl map 22 23 void 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 } 27 31 } -
src/SynTree/VarExprReplacer.h
rfea3faa rb826e6b 27 27 private: 28 28 const DeclMap & declMap; 29 bool debug; 29 30 public: 30 VarExprReplacer( const DeclMap & declMap );31 VarExprReplacer( const DeclMap & declMap, bool debug = false ); 31 32 32 33 // replace variable with new node from decl map -
src/SynTree/Visitor.cc
rfea3faa rb826e6b 340 340 } 341 341 342 void 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 348 void Visitor::visit( InitExpr * initExpr ) { 349 maybeAccept( initExpr->get_result(), *this ); 350 maybeAccept( initExpr->get_expr(), *this ); 351 maybeAccept( initExpr->get_designation(), *this ); 352 } 353 342 354 343 355 void Visitor::visit( VoidType *voidType ) { … … 395 407 acceptAll( tupleType->get_forall(), *this ); 396 408 acceptAll( tupleType->get_types(), *this ); 409 acceptAll( tupleType->get_members(), *this ); 397 410 } 398 411 … … 424 437 } 425 438 439 void Visitor::visit( Designation * designation ) { 440 acceptAll( designation->get_designators(), *this ); 441 } 426 442 427 443 void Visitor::visit( SingleInit *singleInit ) { … … 430 446 431 447 void Visitor::visit( ListInit *listInit ) { 432 acceptAll( listInit->get_designat ors(), *this );448 acceptAll( listInit->get_designations(), *this ); 433 449 acceptAll( listInit->get_initializers(), *this ); 434 450 } -
src/SynTree/Visitor.h
rfea3faa rb826e6b 88 88 virtual void visit( StmtExpr * stmtExpr ); 89 89 virtual void visit( UniqueExpr * uniqueExpr ); 90 virtual void visit( UntypedInitExpr * initExpr ); 91 virtual void visit( InitExpr * initExpr ); 90 92 91 93 virtual void visit( VoidType *basicType ); … … 106 108 virtual void visit( OneType *oneType ); 107 109 110 virtual void visit( Designation *designation ); 108 111 virtual void visit( SingleInit *singleInit ); 109 112 virtual void visit( ListInit *listInit ); -
src/Tuples/TupleExpansion.cc
rfea3faa rb826e6b 192 192 } 193 193 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 ) ) ) ); 195 195 addDeclaration( finished ); 196 196 // (finished ? _unq_expr_N : (_unq_expr_N = <unqExpr->get_expr()>, finished = 1, _unq_expr_N)) … … 310 310 Type * makeTupleType( const std::list< Expression * > & exprs ) { 311 311 // 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 ); 314 314 for ( Expression * expr : exprs ) { 315 315 assert( expr->get_result() ); 316 316 if ( expr->get_result()->isVoid() ) { 317 317 // if the type of any expr is void, the type of the entire tuple is void 318 delete tupleType;319 318 return new VoidType( Type::Qualifiers() ); 320 319 } 321 320 Type * type = expr->get_result()->clone(); 322 t upleType->get_types().push_back( type );321 types.push_back( type ); 323 322 // the qualifiers on the tuple type are the qualifiers that exist on all component types 324 323 qualifiers &= type->get_qualifiers(); 325 324 } // for 326 325 if ( exprs.empty() ) qualifiers = Type::Qualifiers(); 327 return tupleType;326 return new TupleType( qualifiers, types ); 328 327 } 329 328 -
src/benchmark/CorCtxSwitch.c
rfea3faa rb826e6b 31 31 32 32 StartTime = Time(); 33 // for ( volatile unsigned int i = 0; i < NoOfTimes; i += 1 ) {34 // resume( this_coroutine() );35 // // resume( &s );36 // }37 33 resumer( &s, NoOfTimes ); 38 34 EndTime = Time(); -
src/benchmark/Makefile.am
rfea3faa rb826e6b 20 20 CC = @CFA_BINDIR@/@CFA_NAME@ 21 21 22 noinst_PROGRAMS = bench ctxswitch-coroutine ctxswitch-thread22 noinst_PROGRAMS = bench$(EXEEXT) ctxswitch-coroutine$(EXEEXT) ctxswitch-thread$(EXEEXT) sched-int$(EXEEXT) monitor$(EXEEXT) csv-data$(EXEEXT) 23 23 24 bench :24 bench$(EXEEXT) : 25 25 @for ccflags in "-debug" "-nodebug"; do \ 26 26 echo ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -lrt bench.c;\ … … 30 30 rm -f ./a.out ; 31 31 32 ctxswitch-coroutine :32 ctxswitch-coroutine$(EXEEXT): 33 33 ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 CorCtxSwitch.c 34 34 @for number in 1 2 3 4 5 6 7 8 9 10; do \ … … 37 37 @rm -f ./a.out 38 38 39 ctxswitch-thread :39 ctxswitch-thread$(EXEEXT): 40 40 ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 ThrdCtxSwitch.c 41 41 @for number in 1 2 3 4 5 6 7 8 9 10; do \ … … 44 44 @rm -f ./a.out 45 45 46 sched-int :46 sched-int$(EXEEXT): 47 47 ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 SchedInt.c 48 48 @for number in 1 2 3 4 5 6 7 8 9 10; do \ … … 51 51 @rm -f ./a.out 52 52 53 monitor :53 monitor$(EXEEXT): 54 54 ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 Monitor.c 55 55 @for number in 1 2 3 4 5 6 7 8 9 10; do \ … … 58 58 @rm -f ./a.out 59 59 60 csv-data :60 csv-data$(EXEEXT): 61 61 @${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -quiet -DN=10000000 csv-data.c 62 62 @./a.out -
src/benchmark/Makefile.in
rfea3faa rb826e6b 1 # Makefile.in generated by automake 1.1 1.3from Makefile.am.1 # Makefile.in generated by automake 1.15 from Makefile.am. 2 2 # @configure_input@ 3 3 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 7 6 # This Makefile.in is free software; the Free Software Foundation 8 7 # gives unlimited permission to copy and/or distribute it, … … 20 19 21 20 VPATH = @srcdir@ 21 am__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 } 32 am__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 74 am__make_dryrun = (target_option=n; $(am__make_running_with_option)) 75 am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 22 76 pkgdatadir = $(datadir)/@PACKAGE@ 23 77 pkgincludedir = $(includedir)/@PACKAGE@ … … 38 92 build_triplet = @build@ 39 93 host_triplet = @host@ 40 noinst_PROGRAMS = bench$(EXEEXT) ctxswitch-coroutine$(EXEEXT) \41 ctxswitch-thread$(EXEEXT)42 94 subdir = src/benchmark 43 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in44 95 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 45 96 am__aclocal_m4_deps = $(top_srcdir)/configure.ac 46 97 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ 47 98 $(ACLOCAL_M4) 99 DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) 48 100 mkinstalldirs = $(install_sh) -d 49 101 CONFIG_HEADER = $(top_builddir)/config.h … … 54 106 bench_OBJECTS = bench.$(OBJEXT) 55 107 bench_LDADD = $(LDADD) 108 csv_data_SOURCES = csv-data.c 109 csv_data_OBJECTS = csv-data.$(OBJEXT) 110 csv_data_LDADD = $(LDADD) 56 111 ctxswitch_coroutine_SOURCES = ctxswitch-coroutine.c 57 112 ctxswitch_coroutine_OBJECTS = ctxswitch-coroutine.$(OBJEXT) … … 60 115 ctxswitch_thread_OBJECTS = ctxswitch-thread.$(OBJEXT) 61 116 ctxswitch_thread_LDADD = $(LDADD) 117 monitor_SOURCES = monitor.c 118 monitor_OBJECTS = monitor.$(OBJEXT) 119 monitor_LDADD = $(LDADD) 120 sched_int_SOURCES = sched-int.c 121 sched_int_OBJECTS = sched-int.$(OBJEXT) 122 sched_int_LDADD = $(LDADD) 123 AM_V_P = $(am__v_P_@AM_V@) 124 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) 125 am__v_P_0 = false 126 am__v_P_1 = : 127 AM_V_GEN = $(am__v_GEN_@AM_V@) 128 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) 129 am__v_GEN_0 = @echo " GEN " $@; 130 am__v_GEN_1 = 131 AM_V_at = $(am__v_at_@AM_V@) 132 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) 133 am__v_at_0 = @ 134 am__v_at_1 = 62 135 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) 63 136 depcomp = $(SHELL) $(top_srcdir)/automake/depcomp … … 68 141 AM_V_CC = $(am__v_CC_@AM_V@) 69 142 am__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 = @ 143 am__v_CC_0 = @echo " CC " $@; 144 am__v_CC_1 = 74 145 CCLD = $(CC) 75 146 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ 76 147 AM_V_CCLD = $(am__v_CCLD_@AM_V@) 77 148 am__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 149 am__v_CCLD_0 = @echo " CCLD " $@; 150 am__v_CCLD_1 = 151 SOURCES = bench.c csv-data.c ctxswitch-coroutine.c ctxswitch-thread.c \ 152 monitor.c sched-int.c 153 DIST_SOURCES = bench.c csv-data.c ctxswitch-coroutine.c \ 154 ctxswitch-thread.c monitor.c sched-int.c 155 am__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 160 am__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. 164 am__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. 172 am__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)` 84 177 ETAGS = etags 85 178 CTAGS = ctags 179 am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/automake/depcomp 86 180 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 87 181 ACLOCAL = @ACLOCAL@ … … 198 292 program_transform_name = @program_transform_name@ 199 293 psdir = @psdir@ 294 runstatedir = @runstatedir@ 200 295 sbindir = @sbindir@ 201 296 sharedstatedir = @sharedstatedir@ … … 207 302 top_srcdir = @top_srcdir@ 208 303 AM_CFLAGS = -g -Wall -Wno-unused-function -O2 304 noinst_PROGRAMS = bench$(EXEEXT) ctxswitch-coroutine$(EXEEXT) ctxswitch-thread$(EXEEXT) sched-int$(EXEEXT) monitor$(EXEEXT) csv-data$(EXEEXT) 209 305 all: all-am 210 306 … … 223 319 $(am__cd) $(top_srcdir) && \ 224 320 $(AUTOMAKE) --foreign src/benchmark/Makefile 225 .PRECIOUS: Makefile226 321 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 227 322 @case '$?' in \ … … 252 347 253 348 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bench.Po@am__quote@ 349 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/csv-data.Po@am__quote@ 254 350 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctxswitch-coroutine.Po@am__quote@ 255 351 @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@ 256 354 257 355 .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 260 359 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ 261 360 @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 $@ $< 263 362 264 363 .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 267 367 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ 268 368 @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 371 ID: $(am__tagged_files) 372 $(am__define_uniq_tagged_files); mkid -fID $$unique 373 tags: tags-am 374 TAGS: tags 375 376 tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 283 377 set x; \ 284 378 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); \ 291 380 shift; \ 292 381 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ … … 300 389 fi; \ 301 390 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; }; }'`; \ 391 ctags: ctags-am 392 393 CTAGS: ctags 394 ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 395 $(am__define_uniq_tagged_files); \ 311 396 test -z "$(CTAGS_ARGS)$$unique" \ 312 397 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ … … 317 402 && $(am__cd) $(top_srcdir) \ 318 403 && gtags -i $(GTAGS_ARGS) "$$here" 404 cscopelist: cscopelist-am 405 406 cscopelist-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 319 419 320 420 distclean-tags: … … 456 556 .MAKE: install-am install-strip 457 557 458 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \459 clean-noinstPROGRAMS c tags 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-p s 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 \ 467 567 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 \ 469 569 uninstall-am 470 570 471 472 bench : 571 .PRECIOUS: Makefile 572 573 574 bench$(EXEEXT) : 473 575 @for ccflags in "-debug" "-nodebug"; do \ 474 576 echo ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -lrt bench.c;\ … … 478 580 rm -f ./a.out ; 479 581 480 ctxswitch-coroutine :582 ctxswitch-coroutine$(EXEEXT): 481 583 ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 CorCtxSwitch.c 482 584 @for number in 1 2 3 4 5 6 7 8 9 10; do \ … … 485 587 @rm -f ./a.out 486 588 487 ctxswitch-thread :589 ctxswitch-thread$(EXEEXT): 488 590 ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 ThrdCtxSwitch.c 489 591 @for number in 1 2 3 4 5 6 7 8 9 10; do \ … … 492 594 @rm -f ./a.out 493 595 494 sched-int :596 sched-int$(EXEEXT): 495 597 ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 SchedInt.c 496 598 @for number in 1 2 3 4 5 6 7 8 9 10; do \ … … 499 601 @rm -f ./a.out 500 602 501 monitor :603 monitor$(EXEEXT): 502 604 ${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -DN=10000000 Monitor.c 503 605 @for number in 1 2 3 4 5 6 7 8 9 10; do \ … … 506 608 @rm -f ./a.out 507 609 508 csv-data :610 csv-data$(EXEEXT): 509 611 @${CC} ${AM_CFLAGS} ${CFLAGS} ${ccflags} @CFA_FLAGS@ -nodebug -lrt -quiet -DN=10000000 csv-data.c 510 612 @./a.out -
src/benchmark/bench.h
rfea3faa rb826e6b 26 26 #define N 10000000 27 27 #endif 28 29 unsigned int default_preemption() { 30 return 0; 31 } -
src/benchmark/create_pthrd.c
rfea3faa rb826e6b 14 14 n = atoi(argv[1]); 15 15 } 16 printf(" %lu\n", n);16 printf("create %lu pthreads ... ", n); 17 17 18 18 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" ); 21 22 return 1; 22 23 } 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" ); 28 27 return 1; 29 28 } 30 29 } 31 pthread_exit(NULL); 32 return 0; 30 printf("finish\n"); 33 31 } -
src/benchmark/csv-data.c
rfea3faa rb826e6b 25 25 } 26 26 27 #ifndef N28 #define N 10000000029 #endif30 31 27 //----------------------------------------------------------------------------- 32 28 // coroutine context switch … … 38 34 39 35 StartTime = Time(); 40 // for ( volatile unsigned int i = 0; i < NoOfTimes; i += 1 ) {41 // resume( this_coroutine() );42 // // resume( &s );43 // }44 36 resumer( &s, NoOfTimes ); 45 37 EndTime = Time(); … … 104 96 mon_t mon1; 105 97 106 condition cond1a; 98 condition cond1a; 107 99 condition cond1b; 108 100 … … 152 144 mon_t mon2; 153 145 154 condition cond2a; 146 condition cond2a; 155 147 condition cond2b; 156 148 -
src/driver/Makefile.in
rfea3faa rb826e6b 1 # Makefile.in generated by automake 1.1 1.3from Makefile.am.1 # Makefile.in generated by automake 1.15 from Makefile.am. 2 2 # @configure_input@ 3 3 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 7 6 # This Makefile.in is free software; the Free Software Foundation 8 7 # gives unlimited permission to copy and/or distribute it, … … 20 19 21 20 VPATH = @srcdir@ 21 am__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 } 32 am__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 74 am__make_dryrun = (target_option=n; $(am__make_running_with_option)) 75 am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 22 76 pkgdatadir = $(datadir)/@PACKAGE@ 23 77 pkgincludedir = $(includedir)/@PACKAGE@ … … 44 98 cc1lib_PROGRAMS = cc1$(EXEEXT) 45 99 subdir = src/driver 46 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in47 100 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 48 101 am__aclocal_m4_deps = $(top_srcdir)/configure.ac 49 102 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ 50 103 $(ACLOCAL_M4) 104 DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) 51 105 mkinstalldirs = $(install_sh) -d 52 106 CONFIG_HEADER = $(top_builddir)/config.h … … 61 115 cfa_OBJECTS = $(am_cfa_OBJECTS) 62 116 cfa_LDADD = $(LDADD) 117 AM_V_P = $(am__v_P_@AM_V@) 118 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) 119 am__v_P_0 = false 120 am__v_P_1 = : 121 AM_V_GEN = $(am__v_GEN_@AM_V@) 122 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) 123 am__v_GEN_0 = @echo " GEN " $@; 124 am__v_GEN_1 = 125 AM_V_at = $(am__v_at_@AM_V@) 126 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) 127 am__v_at_0 = @ 128 am__v_at_1 = 63 129 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) 64 130 depcomp = $(SHELL) $(top_srcdir)/automake/depcomp … … 69 135 AM_V_CXX = $(am__v_CXX_@AM_V@) 70 136 am__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 = @ 137 am__v_CXX_0 = @echo " CXX " $@; 138 am__v_CXX_1 = 75 139 CXXLD = $(CXX) 76 140 CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ … … 78 142 AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) 79 143 am__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 " $@; 144 am__v_CXXLD_0 = @echo " CXXLD " $@; 145 am__v_CXXLD_1 = 84 146 SOURCES = $(cc1_SOURCES) $(cfa_SOURCES) 85 147 DIST_SOURCES = $(cc1_SOURCES) $(cfa_SOURCES) 148 am__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 153 am__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. 157 am__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. 165 am__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)` 86 170 ETAGS = etags 87 171 CTAGS = ctags 172 am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/automake/depcomp 88 173 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 89 174 ACLOCAL = @ACLOCAL@ … … 198 283 program_transform_name = @program_transform_name@ 199 284 psdir = @psdir@ 285 runstatedir = @runstatedir@ 200 286 sbindir = @sbindir@ 201 287 sharedstatedir = @sharedstatedir@ … … 232 318 $(am__cd) $(top_srcdir) && \ 233 319 $(AUTOMAKE) --foreign src/driver/Makefile 234 .PRECIOUS: Makefile235 320 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 236 321 @case '$?' in \ … … 252 337 install-cc1libPROGRAMS: $(cc1lib_PROGRAMS) 253 338 @$(NORMAL_INSTALL) 254 test -z "$(cc1libdir)" || $(MKDIR_P) "$(DESTDIR)$(cc1libdir)"255 339 @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; \ 256 344 for p in $$list; do echo "$$p $$p"; done | \ 257 345 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; \ 260 348 done | \ 261 sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ 349 sed -e 'p;s,.*/,,;n;h' \ 350 -e 's|.*|.|' \ 262 351 -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ 263 352 sed 'N;N;N;s,\n, ,g' | \ … … 280 369 files=`for p in $$list; do echo "$$p"; done | \ 281 370 sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ 282 -e 's/$$/$(EXEEXT)/' `; \ 371 -e 's/$$/$(EXEEXT)/' \ 372 `; \ 283 373 test -n "$$list" || exit 0; \ 284 374 echo " ( cd '$(DESTDIR)$(cc1libdir)' && rm -f" $$files ")"; \ … … 290 380 clean-noinstPROGRAMS: 291 381 -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) 382 292 383 cc1$(EXEEXT): $(cc1_OBJECTS) $(cc1_DEPENDENCIES) $(EXTRA_cc1_DEPENDENCIES) 293 384 @rm -f cc1$(EXEEXT) 294 385 $(AM_V_CXXLD)$(CXXLINK) $(cc1_OBJECTS) $(cc1_LDADD) $(LIBS) 386 295 387 cfa$(EXEEXT): $(cfa_OBJECTS) $(cfa_DEPENDENCIES) $(EXTRA_cfa_DEPENDENCIES) 296 388 @rm -f cfa$(EXEEXT) … … 307 399 308 400 .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 311 404 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ 312 405 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ … … 314 407 315 408 .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 318 412 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ 319 413 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 320 414 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` 321 415 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) 416 ID: $(am__tagged_files) 417 $(am__define_uniq_tagged_files); mkid -fID $$unique 418 tags: tags-am 419 TAGS: tags 420 421 tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 334 422 set x; \ 335 423 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); \ 342 425 shift; \ 343 426 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ … … 351 434 fi; \ 352 435 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; }; }'`; \ 436 ctags: ctags-am 437 438 CTAGS: ctags 439 ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 440 $(am__define_uniq_tagged_files); \ 362 441 test -z "$(CTAGS_ARGS)$$unique" \ 363 442 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ … … 368 447 && $(am__cd) $(top_srcdir) \ 369 448 && gtags -i $(GTAGS_ARGS) "$$here" 449 cscopelist: cscopelist-am 450 451 cscopelist-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 370 464 371 465 distclean-tags: … … 514 608 .MAKE: install-am install-exec-am install-strip uninstall-am 515 609 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 529 626 530 627 -
src/examples/Makefile.in
rfea3faa rb826e6b 1 # Makefile.in generated by automake 1.1 1.3from Makefile.am.1 # Makefile.in generated by automake 1.15 from Makefile.am. 2 2 # @configure_input@ 3 3 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 7 6 # This Makefile.in is free software; the Free Software Foundation 8 7 # gives unlimited permission to copy and/or distribute it, … … 20 19 21 20 VPATH = @srcdir@ 21 am__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 } 32 am__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 74 am__make_dryrun = (target_option=n; $(am__make_running_with_option)) 75 am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 22 76 pkgdatadir = $(datadir)/@PACKAGE@ 23 77 pkgincludedir = $(includedir)/@PACKAGE@ … … 41 95 avl_test$(EXEEXT) Bench$(EXEEXT) 42 96 subdir = src/examples 43 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in44 97 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 45 98 am__aclocal_m4_deps = $(top_srcdir)/configure.ac 46 99 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ 47 100 $(ACLOCAL_M4) 101 DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) 48 102 mkinstalldirs = $(install_sh) -d 49 103 CONFIG_HEADER = $(top_builddir)/config.h … … 54 108 Bench_OBJECTS = Bench.$(OBJEXT) 55 109 Bench_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) 110 am__dirstamp = $(am__leading_dot)dirstamp 111 am_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) 59 115 avl_test_OBJECTS = $(am_avl_test_OBJECTS) 60 116 avl_test_LDADD = $(LDADD) … … 66 122 vector_test_OBJECTS = $(am_vector_test_OBJECTS) 67 123 vector_test_LDADD = $(LDADD) 124 AM_V_P = $(am__v_P_@AM_V@) 125 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) 126 am__v_P_0 = false 127 am__v_P_1 = : 128 AM_V_GEN = $(am__v_GEN_@AM_V@) 129 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) 130 am__v_GEN_0 = @echo " GEN " $@; 131 am__v_GEN_1 = 132 AM_V_at = $(am__v_at_@AM_V@) 133 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) 134 am__v_at_0 = @ 135 am__v_at_1 = 68 136 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) 69 137 depcomp = $(SHELL) $(top_srcdir)/automake/depcomp 70 138 am__depfiles_maybe = depfiles 71 139 am__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 = --silent75 140 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ 76 141 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) 77 142 AM_V_CC = $(am__v_CC_@AM_V@) 78 143 am__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 = @ 144 am__v_CC_0 = @echo " CC " $@; 145 am__v_CC_1 = 83 146 CCLD = $(CC) 84 147 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ 85 148 AM_V_CCLD = $(am__v_CCLD_@AM_V@) 86 149 am__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 " $@; 150 am__v_CCLD_0 = @echo " CCLD " $@; 151 am__v_CCLD_1 = 91 152 SOURCES = Bench.c $(avl_test_SOURCES) $(fstream_test_SOURCES) \ 92 153 $(vector_test_SOURCES) 93 154 DIST_SOURCES = Bench.c $(avl_test_SOURCES) $(fstream_test_SOURCES) \ 94 155 $(vector_test_SOURCES) 156 am__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 161 am__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. 165 am__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. 173 am__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)` 95 178 ETAGS = etags 96 179 CTAGS = ctags 180 am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/automake/depcomp 97 181 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 98 182 ACLOCAL = @ACLOCAL@ … … 209 293 program_transform_name = @program_transform_name@ 210 294 psdir = @psdir@ 295 runstatedir = @runstatedir@ 211 296 sbindir = @sbindir@ 212 297 sharedstatedir = @sharedstatedir@ … … 237 322 $(am__cd) $(top_srcdir) && \ 238 323 $(AUTOMAKE) --foreign src/examples/Makefile 239 .PRECIOUS: Makefile240 324 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 241 325 @case '$?' in \ … … 258 342 clean-noinstPROGRAMS: 259 343 -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) 344 avltree/$(am__dirstamp): 345 @$(MKDIR_P) avltree 346 @: > avltree/$(am__dirstamp) 347 avltree/$(DEPDIR)/$(am__dirstamp): 348 @$(MKDIR_P) avltree/$(DEPDIR) 349 @: > avltree/$(DEPDIR)/$(am__dirstamp) 350 avltree/avl_test.$(OBJEXT): avltree/$(am__dirstamp) \ 351 avltree/$(DEPDIR)/$(am__dirstamp) 352 avltree/avl0.$(OBJEXT): avltree/$(am__dirstamp) \ 353 avltree/$(DEPDIR)/$(am__dirstamp) 354 avltree/avl1.$(OBJEXT): avltree/$(am__dirstamp) \ 355 avltree/$(DEPDIR)/$(am__dirstamp) 356 avltree/avl2.$(OBJEXT): avltree/$(am__dirstamp) \ 357 avltree/$(DEPDIR)/$(am__dirstamp) 358 avltree/avl3.$(OBJEXT): avltree/$(am__dirstamp) \ 359 avltree/$(DEPDIR)/$(am__dirstamp) 360 avltree/avl4.$(OBJEXT): avltree/$(am__dirstamp) \ 361 avltree/$(DEPDIR)/$(am__dirstamp) 362 avltree/avl-private.$(OBJEXT): avltree/$(am__dirstamp) \ 363 avltree/$(DEPDIR)/$(am__dirstamp) 364 260 365 avl_test$(EXEEXT): $(avl_test_OBJECTS) $(avl_test_DEPENDENCIES) $(EXTRA_avl_test_DEPENDENCIES) 261 366 @rm -f avl_test$(EXEEXT) 262 367 $(AM_V_CCLD)$(LINK) $(avl_test_OBJECTS) $(avl_test_LDADD) $(LIBS) 368 263 369 fstream_test$(EXEEXT): $(fstream_test_OBJECTS) $(fstream_test_DEPENDENCIES) $(EXTRA_fstream_test_DEPENDENCIES) 264 370 @rm -f fstream_test$(EXEEXT) 265 371 $(AM_V_CCLD)$(LINK) $(fstream_test_OBJECTS) $(fstream_test_LDADD) $(LIBS) 372 266 373 vector_test$(EXEEXT): $(vector_test_OBJECTS) $(vector_test_DEPENDENCIES) $(EXTRA_vector_test_DEPENDENCIES) 267 374 @rm -f vector_test$(EXEEXT) … … 270 377 mostlyclean-compile: 271 378 -rm -f *.$(OBJEXT) 379 -rm -f avltree/*.$(OBJEXT) 272 380 273 381 distclean-compile: … … 276 384 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Bench.Po@am__quote@ 277 385 @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@285 386 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fstream_test.Po@am__quote@ 286 387 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vector_int.Po@am__quote@ 287 388 @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@ 288 396 289 397 .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 292 401 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ 293 402 @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 $@ $< 295 404 296 405 .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 299 409 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ 300 410 @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 413 ID: $(am__tagged_files) 414 $(am__define_uniq_tagged_files); mkid -fID $$unique 415 tags: tags-am 416 TAGS: tags 417 418 tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 413 419 set x; \ 414 420 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); \ 421 422 shift; \ 422 423 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ … … 430 431 fi; \ 431 432 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; }; }'`; \ 433 ctags: ctags-am 434 435 CTAGS: ctags 436 ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 437 $(am__define_uniq_tagged_files); \ 441 438 test -z "$(CTAGS_ARGS)$$unique" \ 442 439 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ … … 447 444 && $(am__cd) $(top_srcdir) \ 448 445 && gtags -i $(GTAGS_ARGS) "$$here" 446 cscopelist: cscopelist-am 447 448 cscopelist-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 449 461 450 462 distclean-tags: … … 511 523 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) 512 524 -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) 513 527 514 528 maintainer-clean-generic: … … 520 534 521 535 distclean: distclean-am 522 -rm -rf ./$(DEPDIR) 536 -rm -rf ./$(DEPDIR) avltree/$(DEPDIR) 523 537 -rm -f Makefile 524 538 distclean-am: clean-am distclean-compile distclean-generic \ … … 566 580 567 581 maintainer-clean: maintainer-clean-am 568 -rm -rf ./$(DEPDIR) 582 -rm -rf ./$(DEPDIR) avltree/$(DEPDIR) 569 583 -rm -f Makefile 570 584 maintainer-clean-am: distclean-am maintainer-clean-generic … … 586 600 .MAKE: install-am install-strip 587 601 588 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \589 clean-noinstPROGRAMS c tags 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-p s 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 \ 597 611 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 \ 599 613 uninstall-am 614 615 .PRECIOUS: Makefile 600 616 601 617 -
src/include/assert.h
rfea3faa rb826e6b 15 15 16 16 #pragma once 17 // Pragmas for header cleanup tool 18 // IWYU pragma: private, include <cassert> 17 19 18 20 #include_next <assert.h> -
src/libcfa/Makefile.am
rfea3faa rb826e6b 10 10 ## Author : Peter A. Buhr 11 11 ## Created On : Sun May 31 08:54:01 2015 12 ## Last Modified By : Peter A. Buhr13 ## Last Modified On : Sun May 14 21:04:21201714 ## Update Count : 21 412 ## Last Modified By : Andrew Beach 13 ## Last Modified On : Fri Jun 14 17:00:00 2017 14 ## Update Count : 216 15 15 ############################################################################### 16 16 17 17 # create object files in directory with source files 18 18 AUTOMAKE_OPTIONS = subdir-objects 19 ARFLAGS = cr 19 20 20 21 libdir = ${CFA_LIBDIR} … … 50 51 51 52 libobjs = ${headers:=.o} 52 libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c} 53 libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c} \ 54 exception.c typeobject.c 53 55 54 56 # not all platforms support concurrency, add option do disable it … … 64 66 ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $< 65 67 68 libcfa_a-exception.o : exception.c 69 ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $< 70 71 libcfa_a-typeobject.o : typeobject.c 72 ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $< 73 66 74 concurrency/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 77 libcfa_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 80 libcfa_d_a-typeobject.o : typeobject.c 67 81 ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $< 68 82 -
src/libcfa/Makefile.in
rfea3faa rb826e6b 1 # Makefile.in generated by automake 1.1 1.3from Makefile.am.1 # Makefile.in generated by automake 1.15 from Makefile.am. 2 2 # @configure_input@ 3 3 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 7 6 # This Makefile.in is free software; the Free Software Foundation 8 7 # gives unlimited permission to copy and/or distribute it, … … 21 20 22 21 VPATH = @srcdir@ 22 am__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 } 33 am__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 75 am__make_dryrun = (target_option=n; $(am__make_running_with_option)) 76 am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 23 77 pkgdatadir = $(datadir)/@PACKAGE@ 24 78 pkgincludedir = $(includedir)/@PACKAGE@ … … 48 102 @BUILD_CONCURRENCY_TRUE@am__append_4 = concurrency/CtxSwitch-@MACHINE_TYPE@.S concurrency/alarm.c concurrency/invoke.c concurrency/preemption.c 49 103 subdir = src/libcfa 50 DIST_COMMON = $(am__nobase_cfa_include_HEADERS_DIST) \51 $(srcdir)/Makefile.am $(srcdir)/Makefile.in52 104 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 53 105 am__aclocal_m4_deps = $(top_srcdir)/configure.ac 54 106 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ 55 107 $(ACLOCAL_M4) 108 DIST_COMMON = $(srcdir)/Makefile.am \ 109 $(am__nobase_cfa_include_HEADERS_DIST) $(am__DIST_COMMON) 56 110 mkinstalldirs = $(install_sh) -d 57 111 CONFIG_HEADER = $(top_builddir)/config.h … … 88 142 LIBRARIES = $(lib_LIBRARIES) 89 143 AR = ar 90 ARFLAGS = cru91 144 AM_V_AR = $(am__v_AR_@AM_V@) 92 145 am__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 = @ 146 am__v_AR_0 = @echo " AR " $@; 147 am__v_AR_1 = 97 148 libcfa_d_a_AR = $(AR) $(ARFLAGS) 98 149 libcfa_d_a_LIBADD = … … 102 153 containers/pair.c containers/result.c containers/vector.c \ 103 154 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 107 159 am__dirstamp = $(am__leading_dot)dirstamp 108 160 @BUILD_CONCURRENCY_TRUE@am__objects_1 = concurrency/libcfa_d_a-coroutine.$(OBJEXT) \ … … 126 178 libcfa_d_a-interpose.$(OBJEXT) \ 127 179 libhdr/libcfa_d_a-libdebug.$(OBJEXT) $(am__objects_2) \ 180 libcfa_d_a-exception.$(OBJEXT) libcfa_d_a-typeobject.$(OBJEXT) \ 128 181 $(am__objects_3) 129 182 am_libcfa_d_a_OBJECTS = $(am__objects_4) … … 136 189 containers/pair.c containers/result.c containers/vector.c \ 137 190 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 141 195 @BUILD_CONCURRENCY_TRUE@am__objects_5 = concurrency/libcfa_a-coroutine.$(OBJEXT) \ 142 196 @BUILD_CONCURRENCY_TRUE@ concurrency/libcfa_a-thread.$(OBJEXT) \ … … 158 212 libcfa_a-interpose.$(OBJEXT) \ 159 213 libhdr/libcfa_a-libdebug.$(OBJEXT) $(am__objects_6) \ 214 libcfa_a-exception.$(OBJEXT) libcfa_a-typeobject.$(OBJEXT) \ 160 215 $(am__objects_7) 161 216 am_libcfa_a_OBJECTS = $(am__objects_8) 162 217 libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS) 218 AM_V_P = $(am__v_P_@AM_V@) 219 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) 220 am__v_P_0 = false 221 am__v_P_1 = : 222 AM_V_GEN = $(am__v_GEN_@AM_V@) 223 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) 224 am__v_GEN_0 = @echo " GEN " $@; 225 am__v_GEN_1 = 226 AM_V_at = $(am__v_at_@AM_V@) 227 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) 228 am__v_at_0 = @ 229 am__v_at_1 = 163 230 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) 164 231 depcomp = $(SHELL) $(top_srcdir)/automake/depcomp … … 169 236 AM_V_CPPAS = $(am__v_CPPAS_@AM_V@) 170 237 am__v_CPPAS_ = $(am__v_CPPAS_@AM_DEFAULT_V@) 171 am__v_CPPAS_0 = @echo " CPPAS " $@; 238 am__v_CPPAS_0 = @echo " CPPAS " $@; 239 am__v_CPPAS_1 = 172 240 AM_V_lt = $(am__v_lt_@AM_V@) 173 241 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) 174 242 am__v_lt_0 = --silent 243 am__v_lt_1 = 175 244 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ 176 245 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) 177 246 AM_V_CC = $(am__v_CC_@AM_V@) 178 247 am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) 179 am__v_CC_0 = @echo " CC " $@; 248 am__v_CC_0 = @echo " CC " $@; 249 am__v_CC_1 = 180 250 CCLD = $(CC) 181 251 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ 182 252 AM_V_CCLD = $(am__v_CCLD_@AM_V@) 183 253 am__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 " $@; 254 am__v_CCLD_0 = @echo " CCLD " $@; 255 am__v_CCLD_1 = 188 256 SOURCES = $(libcfa_d_a_SOURCES) $(libcfa_a_SOURCES) 189 257 DIST_SOURCES = $(am__libcfa_d_a_SOURCES_DIST) \ 190 258 $(am__libcfa_a_SOURCES_DIST) 259 am__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 191 264 am__nobase_cfa_include_HEADERS_DIST = assert fstream iostream iterator \ 192 265 limits math rational stdlib containers/maybe containers/pair \ … … 195 268 ${shell echo stdhdr/*} gmp concurrency/invoke.h 196 269 HEADERS = $(nobase_cfa_include_HEADERS) 270 am__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. 274 am__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. 282 am__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)` 197 287 ETAGS = etags 198 288 CTAGS = ctags 289 am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/automake/depcomp 199 290 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 200 291 ACLOCAL = @ACLOCAL@ … … 309 400 program_transform_name = @program_transform_name@ 310 401 psdir = @psdir@ 402 runstatedir = @runstatedir@ 311 403 sbindir = @sbindir@ 312 404 sharedstatedir = @sharedstatedir@ … … 320 412 # create object files in directory with source files 321 413 AUTOMAKE_OPTIONS = subdir-objects 414 ARFLAGS = cr 322 415 lib_LIBRARIES = $(am__append_1) $(am__append_2) 323 416 EXTRA_FLAGS = -g -Wall -Werror -Wno-unused-function -I${abs_top_srcdir}/src/libcfa/libhdr -imacros libcfa-prelude.c @CFA_FLAGS@ … … 328 421 libobjs = ${headers:=.o} 329 422 libsrc = libcfa-prelude.c interpose.c libhdr/libdebug.c ${headers:=.c} \ 330 $(am__append_4)423 exception.c typeobject.c $(am__append_4) 331 424 libcfa_a_SOURCES = ${libsrc} 332 425 libcfa_a_CFLAGS = -nodebug -O2 … … 353 446 $(am__cd) $(top_srcdir) && \ 354 447 $(AUTOMAKE) --foreign src/libcfa/Makefile 355 .PRECIOUS: Makefile356 448 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 357 449 @case '$?' in \ … … 373 465 install-libLIBRARIES: $(lib_LIBRARIES) 374 466 @$(NORMAL_INSTALL) 375 test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"376 467 @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ 377 468 list2=; for p in $$list; do \ … … 381 472 done; \ 382 473 test -z "$$list2" || { \ 474 echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ 475 $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ 383 476 echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \ 384 477 $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; } … … 448 541 concurrency/$(am__dirstamp) \ 449 542 concurrency/$(DEPDIR)/$(am__dirstamp) 543 450 544 libcfa-d.a: $(libcfa_d_a_OBJECTS) $(libcfa_d_a_DEPENDENCIES) $(EXTRA_libcfa_d_a_DEPENDENCIES) 451 545 $(AM_V_at)-rm -f libcfa-d.a … … 477 571 concurrency/$(am__dirstamp) \ 478 572 concurrency/$(DEPDIR)/$(am__dirstamp) 573 479 574 libcfa.a: $(libcfa_a_OBJECTS) $(libcfa_a_DEPENDENCIES) $(EXTRA_libcfa_a_DEPENDENCIES) 480 575 $(AM_V_at)-rm -f libcfa.a … … 484 579 mostlyclean-compile: 485 580 -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) 511 584 512 585 distclean-compile: … … 514 587 515 588 @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@ 516 590 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-fstream.Po@am__quote@ 517 591 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-interpose.Po@am__quote@ … … 523 597 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_a-rational.Po@am__quote@ 524 598 @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@ 525 600 @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@ 526 602 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-fstream.Po@am__quote@ 527 603 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-interpose.Po@am__quote@ … … 533 609 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa_d_a-rational.Po@am__quote@ 534 610 @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@ 535 612 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/CtxSwitch-@MACHINE_TYPE@.Po@am__quote@ 536 613 @AMDEP_TRUE@@am__include@ @am__quote@concurrency/$(DEPDIR)/libcfa_a-alarm.Po@am__quote@ … … 850 927 @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` 851 928 929 libcfa_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 936 libcfa_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 852 943 concurrency/libcfa_d_a-alarm.o: concurrency/alarm.c 853 944 @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 … … 1144 1235 @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` 1145 1236 1237 libcfa_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 1244 libcfa_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 1146 1251 concurrency/libcfa_a-alarm.o: concurrency/alarm.c 1147 1252 @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 … … 1180 1285 install-nobase_cfa_includeHEADERS: $(nobase_cfa_include_HEADERS) 1181 1286 @$(NORMAL_INSTALL) 1182 test -z "$(cfa_includedir)" || $(MKDIR_P) "$(DESTDIR)$(cfa_includedir)"1183 1287 @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; \ 1184 1292 $(am__nobase_list) | while read dir files; do \ 1185 1293 xfiles=; for file in $$files; do \ … … 1188 1296 test -z "$$xfiles" || { \ 1189 1297 test "x$$dir" = x. || { \ 1190 echo " $(MKDIR_P) '$(DESTDIR)$(cfa_includedir)/$$dir'"; \1298 echo " $(MKDIR_P) '$(DESTDIR)$(cfa_includedir)/$$dir'"; \ 1191 1299 $(MKDIR_P) "$(DESTDIR)$(cfa_includedir)/$$dir"; }; \ 1192 1300 echo " $(INSTALL_HEADER) $$xfiles '$(DESTDIR)$(cfa_includedir)/$$dir'"; \ … … 1200 1308 dir='$(DESTDIR)$(cfa_includedir)'; $(am__uninstall_files_from_dir) 1201 1309 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) 1310 ID: $(am__tagged_files) 1311 $(am__define_uniq_tagged_files); mkid -fID $$unique 1312 tags: tags-am 1313 TAGS: tags 1314 1315 tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 1214 1316 set x; \ 1215 1317 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); \ 1222 1319 shift; \ 1223 1320 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ … … 1231 1328 fi; \ 1232 1329 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; }; }'`; \ 1330 ctags: ctags-am 1331 1332 CTAGS: ctags 1333 ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 1334 $(am__define_uniq_tagged_files); \ 1242 1335 test -z "$(CTAGS_ARGS)$$unique" \ 1243 1336 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ … … 1248 1341 && $(am__cd) $(top_srcdir) \ 1249 1342 && gtags -i $(GTAGS_ARGS) "$$here" 1343 cscopelist: cscopelist-am 1344 1345 cscopelist-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 1250 1358 1251 1359 distclean-tags: … … 1399 1507 .MAKE: install-am install-strip 1400 1508 1401 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \1402 clean-libLIBRARIES c tags 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 \ 1408 1516 install-nobase_cfa_includeHEADERS install-pdf install-pdf-am \ 1409 1517 install-ps install-ps-am install-strip installcheck \ … … 1411 1519 maintainer-clean-generic maintainer-clean-local mostlyclean \ 1412 1520 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 \ 1414 1522 uninstall-nobase_cfa_includeHEADERS 1523 1524 .PRECIOUS: Makefile 1415 1525 1416 1526 … … 1428 1538 ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $< 1429 1539 1540 libcfa_a-exception.o : exception.c 1541 ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $< 1542 1543 libcfa_a-typeobject.o : typeobject.c 1544 ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $< 1545 1430 1546 concurrency/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 1549 libcfa_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 1552 libcfa_d_a-typeobject.o : typeobject.c 1431 1553 ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $< 1432 1554 -
src/libcfa/concurrency/CtxSwitch-i386.S
rfea3faa rb826e6b 98 98 ret 99 99 100 .text101 .align 2102 .globl CtxGet103 CtxGet:104 movl %esp,SP_OFFSET(%eax)105 movl %ebp,FP_OFFSET(%eax)106 107 ret108 109 100 // Local Variables: // 110 101 // compile-command: "make install" // -
src/libcfa/concurrency/CtxSwitch-x86_64.S
rfea3faa rb826e6b 1 // -*- Mode: Asm -*- 1 // -*- Mode: Asm -*- 2 2 // 3 3 // Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo … … 18 18 // Free Software Foundation; either version 2.1 of the License, or (at your 19 19 // option) any later version. 20 // 20 // 21 21 // This library is distributed in the hope that it will be useful, but WITHOUT 22 22 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 23 23 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License 24 24 // for more details. 25 // 25 // 26 26 // You should have received a copy of the GNU Lesser General Public License 27 27 // along with this library. 28 // 28 // 29 29 30 30 // This context switch routine depends on the fact that the stack of a new … … 93 93 .globl CtxInvokeStub 94 94 CtxInvokeStub: 95 movq %rbx, %rdi 95 movq %rbx, %rdi 96 96 jmp *%r12 97 98 .text99 .align 2100 .globl CtxGet101 CtxGet:102 movq %rsp,SP_OFFSET(%rdi)103 movq %rbp,FP_OFFSET(%rdi)104 105 ret106 97 107 98 // Local Variables: // -
src/libcfa/concurrency/alarm.c
rfea3faa rb826e6b 16 16 17 17 extern "C" { 18 #include <errno.h> 19 #include <stdio.h> 20 #include <string.h> 18 21 #include <time.h> 22 #include <unistd.h> 19 23 #include <sys/time.h> 20 24 } 25 26 #include "libhdr.h" 21 27 22 28 #include "alarm.h" … … 25 31 26 32 //============================================================================================= 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 43 void ?{}( __cfa_time_t * this ) { this->val = 0; } 44 void ?{}( __cfa_time_t * this, zero_t zero ) { this->val = 0; } 45 46 void ?{}( 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 54 void ?{}( __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 //============================================================================================= 27 71 // Clock logic 28 72 //============================================================================================= … … 31 75 timespec curr; 32 76 clock_gettime( CLOCK_REALTIME, &curr ); 33 return ( (__cfa_time_t)curr.tv_sec * TIMEGRAN) + curr.tv_nsec;77 return (__cfa_time_t){ &curr }; 34 78 } 35 79 36 80 void __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 }; 42 82 setitimer( ITIMER_REAL, &val, NULL ); 43 83 } … … 47 87 //============================================================================================= 48 88 49 void ?{}( alarm_node_t * this, thread_desc * thrd, __cfa_time_t alarm = 0, __cfa_time_t period = 0) {89 void ?{}( alarm_node_t * this, thread_desc * thrd, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time ) { 50 90 this->thrd = thrd; 51 91 this->alarm = alarm; … … 56 96 } 57 97 58 void ?{}( alarm_node_t * this, processor * proc, __cfa_time_t alarm = 0, __cfa_time_t period = 0) {98 void ?{}( alarm_node_t * this, processor * proc, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time ) { 59 99 this->proc = proc; 60 100 this->alarm = alarm; … … 71 111 } 72 112 113 LIB_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 73 122 static inline void insert_at( alarm_list_t * this, alarm_node_t * n, __alarm_it_t p ) { 74 assert( !n->next );123 verify( !n->next ); 75 124 if( p == this->tail ) { 76 125 this->tail = &n->next; … … 80 129 } 81 130 *p = n; 131 132 verify( validate( this ) ); 82 133 } 83 134 … … 89 140 90 141 insert_at( this, n, it ); 142 143 verify( validate( this ) ); 91 144 } 92 145 … … 100 153 head->next = NULL; 101 154 } 155 verify( validate( this ) ); 102 156 return head; 103 157 } … … 105 159 static inline void remove_at( alarm_list_t * this, alarm_node_t * n, __alarm_it_t it ) { 106 160 verify( it ); 107 verify( (*it) ->next== n );108 109 (*it) ->next= n->next;161 verify( (*it) == n ); 162 163 (*it) = n->next; 110 164 if( !n-> next ) { 111 165 this->tail = it; 112 166 } 113 167 n->next = NULL; 168 169 verify( validate( this ) ); 114 170 } 115 171 116 172 static inline void remove( alarm_list_t * this, alarm_node_t * n ) { 117 173 alarm_node_t ** it = &this->head; 118 while( (*it) && (*it) ->next!= n ) {174 while( (*it) && (*it) != n ) { 119 175 it = &(*it)->next; 120 176 } 121 177 178 verify( validate( this ) ); 179 122 180 if( *it ) { remove_at( this, n, it ); } 181 182 verify( validate( this ) ); 123 183 } 124 184 125 185 void register_self( alarm_node_t * this ) { 186 alarm_list_t * alarms = &event_kernel->alarms; 187 126 188 disable_interrupts(); 127 assert( !systemProcessor->pending_alarm ); 128 lock( &systemProcessor->alarm_lock ); 189 lock( &event_kernel->lock DEBUG_CTX2 ); 129 190 { 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() ); 133 197 } 134 198 } 135 unlock( & systemProcessor->alarm_lock );199 unlock( &event_kernel->lock ); 136 200 this->set = true; 137 enable_interrupts( );201 enable_interrupts( DEBUG_CTX ); 138 202 } 139 203 140 204 void unregister_self( alarm_node_t * this ) { 141 205 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 ); 146 213 this->set = false; 147 214 } -
src/libcfa/concurrency/alarm.h
rfea3faa rb826e6b 19 19 20 20 #include <stdbool.h> 21 #include <stdint.h> 21 22 22 23 #include "assert" 23 24 typedef unsigned long int __cfa_time_t;25 24 26 25 struct thread_desc; 27 26 struct processor; 28 27 28 struct timespec; 29 struct itimerval; 30 31 //============================================================================================= 32 // time type 33 //============================================================================================= 34 35 struct __cfa_time_t { 36 uint64_t val; 37 }; 38 39 // ctors 40 void ?{}( __cfa_time_t * this ); 41 void ?{}( __cfa_time_t * this, zero_t zero ); 42 void ?{}( __cfa_time_t * this, timespec * curr ); 43 void ?{}( itimerval * this, __cfa_time_t * alarm ); 44 45 __cfa_time_t ?=?( __cfa_time_t * this, zero_t rhs ); 46 47 // logical ops 48 static inline bool ?==?( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val == rhs.val; } 49 static inline bool ?!=?( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val != rhs.val; } 50 static inline bool ?>? ( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val > rhs.val; } 51 static inline bool ?<? ( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val < rhs.val; } 52 static inline bool ?>=?( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val >= rhs.val; } 53 static inline bool ?<=?( __cfa_time_t lhs, __cfa_time_t rhs ) { return lhs.val <= rhs.val; } 54 55 static inline bool ?==?( __cfa_time_t lhs, zero_t rhs ) { return lhs.val == rhs; } 56 static inline bool ?!=?( __cfa_time_t lhs, zero_t rhs ) { return lhs.val != rhs; } 57 static inline bool ?>? ( __cfa_time_t lhs, zero_t rhs ) { return lhs.val > rhs; } 58 static inline bool ?<? ( __cfa_time_t lhs, zero_t rhs ) { return lhs.val < rhs; } 59 static inline bool ?>=?( __cfa_time_t lhs, zero_t rhs ) { return lhs.val >= rhs; } 60 static inline bool ?<=?( __cfa_time_t lhs, zero_t rhs ) { return lhs.val <= rhs; } 61 62 // addition/substract 63 static 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 69 static 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 80 extern __cfa_time_t zero_time; 81 29 82 //============================================================================================= 30 83 // Clock logic 31 84 //============================================================================================= 32 33 #define TIMEGRAN 1_000_000_000L // nanosecond granularity, except for timeval34 85 35 86 __cfa_time_t __kernel_get_time(); … … 56 107 typedef alarm_node_t ** __alarm_it_t; 57 108 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);109 void ?{}( alarm_node_t * this, thread_desc * thrd, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time ); 110 void ?{}( alarm_node_t * this, processor * proc, __cfa_time_t alarm = zero_time, __cfa_time_t period = zero_time ); 60 111 void ^?{}( alarm_node_t * this ); 61 112 -
src/libcfa/concurrency/coroutine
rfea3faa rb826e6b 63 63 64 64 // Get current coroutine 65 coroutine_desc * this_coroutine(void);65 extern volatile thread_local coroutine_desc * this_coroutine; 66 66 67 67 // Private wrappers for context switch and stack creation … … 71 71 // Suspend implementation inlined for performance 72 72 static inline void suspend() { 73 coroutine_desc * src = this_coroutine (); // optimization73 coroutine_desc * src = this_coroutine; // optimization 74 74 75 75 assertf( src->last != 0, … … 88 88 forall(dtype T | is_coroutine(T)) 89 89 static inline void resume(T * cor) { 90 coroutine_desc * src = this_coroutine (); // optimization90 coroutine_desc * src = this_coroutine; // optimization 91 91 coroutine_desc * dst = get_coroutine(cor); 92 92 … … 112 112 113 113 static inline void resume(coroutine_desc * dst) { 114 coroutine_desc * src = this_coroutine (); // optimization114 coroutine_desc * src = this_coroutine; // optimization 115 115 116 116 // not resuming self ? -
src/libcfa/concurrency/coroutine.c
rfea3faa rb826e6b 32 32 #include "invoke.h" 33 33 34 extern thread_local processor * this_processor;34 extern volatile thread_local processor * this_processor; 35 35 36 36 //----------------------------------------------------------------------------- … … 44 44 // Coroutine ctors and dtors 45 45 void ?{}(coStack_t* this) { 46 this->size = 10240; // size of stack46 this->size = 65000; // size of stack 47 47 this->storage = NULL; // pointer to stack 48 48 this->limit = NULL; // stack grows towards stack limit … … 50 50 this->context = NULL; // address of cfa_context_t 51 51 this->top = NULL; // address of top of storage 52 this->userStack = false; 52 this->userStack = false; 53 53 } 54 54 … … 106 106 107 107 // set state of current coroutine to inactive 108 src->state = Inactive;108 src->state = src->state == Halted ? Halted : Inactive; 109 109 110 110 // set new coroutine that task is executing 111 this_ processor->current_coroutine = dst;111 this_coroutine = dst; 112 112 113 113 // context switch to specified coroutine 114 assert( src->stack.context ); 114 115 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 116 117 117 118 // set state of new coroutine to active … … 131 132 this->size = libCeiling( storageSize, 16 ); 132 133 // use malloc/memalign because "new" raises an exception for out-of-memory 133 134 134 135 // assume malloc has 8 byte alignment so add 8 to allow rounding up to 16 byte alignment 135 136 LIB_DEBUG_DO( this->storage = memalign( pageSize, cxtSize + this->size + pageSize ) ); -
src/libcfa/concurrency/invoke.c
rfea3faa rb826e6b 29 29 30 30 extern void __suspend_internal(void); 31 extern void __leave_monitor_desc( struct monitor_desc * this ); 31 extern void __leave_thread_monitor( struct thread_desc * this ); 32 extern void disable_interrupts(); 33 extern void enable_interrupts( DEBUG_CTX_PARAM ); 32 34 33 35 void CtxInvokeCoroutine( 34 void (*main)(void *), 35 struct coroutine_desc *(*get_coroutine)(void *), 36 void (*main)(void *), 37 struct coroutine_desc *(*get_coroutine)(void *), 36 38 void *this 37 39 ) { … … 56 58 57 59 void 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 *), 61 63 void *this 62 64 ) { 65 // First suspend, once the thread arrives here, 66 // the function pointer to main can be invalidated without risk 63 67 __suspend_internal(); 64 68 69 // Fetch the thread handle from the user defined thread structure 65 70 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;69 71 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 71 76 main( this ); 72 77 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 75 84 //Final suspend, should never return 76 __ suspend_internal();85 __leave_thread_monitor( thrd ); 77 86 abortf("Resumed dead thread"); 78 87 } … … 80 89 81 90 void 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, 85 94 void (*invoke)(void *) 86 95 ) { … … 108 117 ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->rturn = invoke; 109 118 ((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 111 120 112 121 #elif defined( __x86_64__ ) … … 128 137 ((struct FakeStack *)(((struct machine_context_t *)stack->context)->SP))->fixedRegisters[1] = invoke; 129 138 ((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 131 140 #else 132 141 #error Only __i386__ and __x86_64__ is supported for threads in cfa -
src/libcfa/concurrency/invoke.h
rfea3faa rb826e6b 31 31 struct spinlock { 32 32 volatile int lock; 33 #ifdef __CFA_DEBUG__ 34 const char * prev_name; 35 void* prev_thrd; 36 #endif 33 37 }; 34 38 … … 83 87 struct __thread_queue_t entry_queue; // queue of threads that are blocked waiting for the monitor 84 88 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 monitor86 89 unsigned int recursion; // monitor routines can be called recursively, we need to keep track of that 87 90 }; … … 99 102 #ifndef _INVOKE_PRIVATE_H_ 100 103 #define _INVOKE_PRIVATE_H_ 101 104 102 105 struct machine_context_t { 103 106 void *SP; … … 109 112 extern void CtxInvokeStub( void ); 110 113 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 112 126 113 127 #endif //_INVOKE_PRIVATE_H_ -
src/libcfa/concurrency/kernel
rfea3faa rb826e6b 28 28 //----------------------------------------------------------------------------- 29 29 // Locks 30 bool try_lock( spinlock * ); 31 void lock( spinlock * ); 32 void unlock( spinlock * ); 30 void lock ( spinlock * DEBUG_CTX_PARAM2 ); // Lock the spinlock, spin if already acquired 31 void lock_yield( spinlock * DEBUG_CTX_PARAM2 ); // Lock the spinlock, yield repeatedly if already acquired 32 bool try_lock ( spinlock * DEBUG_CTX_PARAM2 ); // Lock the spinlock, return false if already acquired 33 void unlock ( spinlock * ); // Unlock the spinlock 33 34 34 struct s ignal_once {35 volatile bool cond;36 struct spinlock lock;37 struct __thread_queue_t blocked;35 struct semaphore { 36 spinlock lock; 37 int count; 38 __thread_queue_t waiting; 38 39 }; 39 40 40 void ?{}(signal_once * this); 41 void ^?{}(signal_once * this); 41 void ?{}(semaphore * this, int count = 1); 42 void ^?{}(semaphore * this); 43 void P(semaphore * this); 44 void V(semaphore * this); 42 45 43 void wait( signal_once * );44 void signal( signal_once * );45 46 46 47 //----------------------------------------------------------------------------- 47 48 // Cluster 48 49 struct 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 51 53 }; 52 54 … … 68 70 unsigned short thrd_count; 69 71 }; 70 static inline void ?{}(FinishAction * this) { 72 static inline void ?{}(FinishAction * this) { 71 73 this->action_code = No_Action; 72 74 this->thrd = NULL; … … 75 77 static inline void ^?{}(FinishAction * this) {} 76 78 79 // Processor 80 // Wrapper around kernel threads 77 81 struct 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 86 86 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 88 90 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 91 93 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 93 97 94 bool pending_preemption; 98 #ifdef __CFA_DEBUG__ 99 char * last_enable; // Last function to enable preemption on this processor 100 #endif 95 101 }; 96 102 -
src/libcfa/concurrency/kernel.c
rfea3faa rb826e6b 15 15 // 16 16 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" 25 18 26 19 //C Includes … … 35 28 36 29 //CFA Includes 37 #include " libhdr.h"30 #include "kernel_private.h" 38 31 #include "preemption.h" 32 #include "startup.h" 39 33 40 34 //Private includes … … 42 36 #include "invoke.h" 43 37 38 //Start and stop routine for the kernel, declared first to make sure they run first 39 void kernel_startup(void) __attribute__(( constructor( STARTUP_PRIORITY_KERNEL ) )); 40 void kernel_shutdown(void) __attribute__(( destructor ( STARTUP_PRIORITY_KERNEL ) )); 41 44 42 //----------------------------------------------------------------------------- 45 43 // 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; 44 KERNEL_STORAGE(cluster, mainCluster); 45 KERNEL_STORAGE(processor, mainProcessor); 46 KERNEL_STORAGE(processorCtx_t, mainProcessorCtx); 47 KERNEL_STORAGE(thread_desc, mainThread); 48 KERNEL_STORAGE(machine_context_t, mainThreadCtx); 49 50 cluster * mainCluster; 51 processor * mainProcessor; 56 52 thread_desc * mainThread; 57 53 … … 59 55 // Global state 60 56 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 } 57 volatile thread_local coroutine_desc * this_coroutine; 58 volatile thread_local thread_desc * this_thread; 59 volatile thread_local processor * this_processor; 60 61 volatile thread_local bool preemption_in_progress = 0; 62 volatile thread_local unsigned short disable_preempt_count = 1; 70 63 71 64 //----------------------------------------------------------------------------- 72 65 // Main thread construction 73 66 struct current_stack_info_t { 74 machine_context_t ctx; 67 machine_context_t ctx; 75 68 unsigned int size; // size of stack 76 69 void *base; // base of stack … … 82 75 83 76 void ?{}( current_stack_info_t * this ) { 84 CtxGet( &this->ctx );77 CtxGet( this->ctx ); 85 78 this->base = this->ctx.FP; 86 79 this->storage = this->ctx.SP; … … 91 84 92 85 this->limit = (void *)(((intptr_t)this->base) - this->size); 93 this->context = & mainThread_context_storage;86 this->context = &storage_mainThreadCtx; 94 87 this->top = this->base; 95 88 } … … 106 99 107 100 void ?{}( coroutine_desc * this, current_stack_info_t * info) { 108 (&this->stack){ info }; 101 (&this->stack){ info }; 109 102 this->name = "Main Thread"; 110 103 this->errno_ = 0; … … 131 124 132 125 void ?{}(processor * this) { 133 this{ systemCluster };126 this{ mainCluster }; 134 127 } 135 128 136 129 void ?{}(processor * this, cluster * cltr) { 137 130 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; 142 133 this->preemption_alarm = NULL; 143 this->preemption = default_preemption();144 this->disable_preempt_count = 1; //Start with interrupts disabled145 134 this->pending_preemption = false; 146 135 … … 150 139 void ?{}(processor * this, cluster * cltr, processorCtx_t * runner) { 151 140 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; 157 144 this->pending_preemption = false; 145 this->kernel_thread = pthread_self(); 158 146 159 147 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); 161 149 runner{ this }; 162 150 } 163 151 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 172 152 void ^?{}(processor * this) { 173 if( ! this-> is_terminated) {153 if( ! this->do_terminate ) { 174 154 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 ); 177 158 } 178 159 } … … 180 161 void ?{}(cluster * this) { 181 162 ( &this->ready_queue ){}; 182 ( &this->lock ){}; 163 ( &this->ready_queue_lock ){}; 164 165 this->preemption = default_preemption(); 183 166 } 184 167 185 168 void ^?{}(cluster * this) { 186 169 187 170 } 188 171 … … 203 186 204 187 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++ ) 206 189 { 207 190 readyThread = nextThread( this->cltr ); … … 209 192 if(readyThread) 210 193 { 194 verify( disable_preempt_count > 0 ); 195 211 196 runThread(this, readyThread); 197 198 verify( disable_preempt_count > 0 ); 212 199 213 200 //Some actions need to be taken from the kernel … … 225 212 } 226 213 227 signal( &this->terminated ); 214 V( &this->terminated ); 215 228 216 LIB_DEBUG_PRINT_SAFE("Kernel : core %p terminated\n", this); 229 217 } 230 218 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 233 221 void runThread(processor * this, thread_desc * dst) { 234 222 coroutine_desc * proc_cor = get_coroutine(this->runner); 235 223 coroutine_desc * thrd_cor = get_coroutine(dst); 236 224 237 225 //Reset the terminating actions here 238 226 this->finish.action_code = No_Action; 239 227 240 228 //Update global state 241 this ->current_thread = dst;229 this_thread = dst; 242 230 243 231 // Context Switch to the thread … … 246 234 } 247 235 248 // Once a thread has finished running, some of 236 // Once a thread has finished running, some of 249 237 // its final actions must be executed from the kernel 250 238 void finishRunning(processor * this) { … … 256 244 } 257 245 else if( this->finish.action_code == Release_Schedule ) { 258 unlock( this->finish.lock ); 246 unlock( this->finish.lock ); 259 247 ScheduleThread( this->finish.thrd ); 260 248 } … … 289 277 processor * proc = (processor *) arg; 290 278 this_processor = proc; 279 this_coroutine = NULL; 280 this_thread = NULL; 281 disable_preempt_count = 1; 291 282 // SKULLDUGGERY: We want to create a context for the processor coroutine 292 283 // 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. 294 285 current_stack_info_t info; 295 286 machine_context_t ctx; … … 300 291 301 292 //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; 304 295 305 296 //We now have a proper context from which to schedule threads 306 297 LIB_DEBUG_PRINT_SAFE("Kernel : core %p created (%p, %p)\n", proc, proc->runner, &ctx); 307 298 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 311 302 // appropriate stack. 312 303 proc_cor_storage.__cor.state = Active; … … 315 306 316 307 // 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); 318 309 319 310 return NULL; … … 322 313 void start(processor * this) { 323 314 LIB_DEBUG_PRINT_SAFE("Kernel : Starting core %p\n", this); 324 315 325 316 pthread_create( &this->kernel_thread, NULL, CtxInvokeProcessor, (void*)this ); 326 317 327 LIB_DEBUG_PRINT_SAFE("Kernel : core %p started\n", this); 318 LIB_DEBUG_PRINT_SAFE("Kernel : core %p started\n", this); 328 319 } 329 320 … … 331 322 // Scheduler routines 332 323 void 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 ); 334 329 335 330 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 ); 340 337 } 341 338 342 339 thread_desc * nextThread(cluster * this) { 343 lock( &this->lock ); 340 verify( disable_preempt_count > 0 ); 341 lock( &this->ready_queue_lock DEBUG_CTX2 ); 344 342 thread_desc * head = pop_head( &this->ready_queue ); 345 unlock( &this->lock ); 343 unlock( &this->ready_queue_lock ); 344 verify( disable_preempt_count > 0 ); 346 345 return head; 347 346 } 348 347 349 void ScheduleInternal() { 350 suspend(); 351 } 352 353 void ScheduleInternal( spinlock * lock ) { 348 void 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 356 void BlockInternal( spinlock * lock ) { 357 disable_interrupts(); 354 358 this_processor->finish.action_code = Release; 355 359 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 368 void BlockInternal( thread_desc * thrd ) { 369 disable_interrupts(); 370 assert( thrd->cor.state != Halted ); 360 371 this_processor->finish.action_code = Schedule; 361 372 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 381 void BlockInternal( spinlock * lock, thread_desc * thrd ) { 382 disable_interrupts(); 366 383 this_processor->finish.action_code = Release_Schedule; 367 384 this_processor->finish.lock = lock; 368 385 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 394 void BlockInternal(spinlock ** locks, unsigned short count) { 395 disable_interrupts(); 373 396 this_processor->finish.action_code = Release_Multi; 374 397 this_processor->finish.locks = locks; 375 398 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 407 void BlockInternal(spinlock ** locks, unsigned short lock_count, thread_desc ** thrds, unsigned short thrd_count) { 408 disable_interrupts(); 380 409 this_processor->finish.action_code = Release_Multi_Schedule; 381 410 this_processor->finish.locks = locks; … … 383 412 this_processor->finish.thrds = thrds; 384 413 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 422 void 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 385 428 suspend(); 386 429 } … … 392 435 // Kernel boot procedures 393 436 void kernel_startup(void) { 394 LIB_DEBUG_PRINT_SAFE("Kernel : Starting\n"); 437 LIB_DEBUG_PRINT_SAFE("Kernel : Starting\n"); 395 438 396 439 // Start by initializing the main thread 397 // SKULLDUGGERY: the mainThread steals the process main thread 398 // which will then be scheduled by the systemProcessor normally399 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; 400 443 current_stack_info_t info; 401 444 mainThread{ &info }; … … 403 446 LIB_DEBUG_PRINT_SAFE("Kernel : Main thread ready\n"); 404 447 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 405 464 // Enable preemption 406 465 kernel_start_preemption(); 407 466 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 421 469 ScheduleThread(mainThread); 422 470 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 429 472 // 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 ); 432 475 433 476 … … 435 478 // THE SYSTEM IS NOW COMPLETELY RUNNING 436 479 LIB_DEBUG_PRINT_SAFE("Kernel : Started\n--------------------------------------------------\n\n"); 480 481 enable_interrupts( DEBUG_CTX ); 437 482 } 438 483 … … 440 485 LIB_DEBUG_PRINT_SAFE("\n--------------------------------------------------\nKernel : Shutting down\n"); 441 486 442 // SKULLDUGGERY: Notify the systemProcessor it needs to terminates. 487 disable_interrupts(); 488 489 // SKULLDUGGERY: Notify the mainProcessor it needs to terminates. 443 490 // When its coroutine terminates, it return control to the mainThread 444 491 // which is currently here 445 systemProcessor->proc.is_terminated= true;492 mainProcessor->do_terminate = true; 446 493 suspend(); 447 494 448 495 // THE SYSTEM IS NOW COMPLETELY STOPPED 449 496 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 451 501 // These were manually constructed so we need manually destroy them 452 ^( systemProcessor->proc.runner){};453 ^( systemProcessor){};502 ^(mainProcessor->runner){}; 503 ^(mainProcessor){}; 454 504 455 505 // Final step, destroy the main thread since it is no longer needed … … 457 507 ^(mainThread){}; 458 508 459 LIB_DEBUG_PRINT_SAFE("Kernel : Shutdown complete\n"); 509 LIB_DEBUG_PRINT_SAFE("Kernel : Shutdown complete\n"); 460 510 } 461 511 … … 467 517 // abort cannot be recursively entered by the same or different processors because all signal handlers return when 468 518 // the globalAbort flag is true. 469 lock( &kernel_abort_lock );519 lock( &kernel_abort_lock DEBUG_CTX2 ); 470 520 471 521 // first task to abort ? … … 473 523 kernel_abort_called = true; 474 524 unlock( &kernel_abort_lock ); 475 } 525 } 476 526 else { 477 527 unlock( &kernel_abort_lock ); 478 528 479 529 sigset_t mask; 480 530 sigemptyset( &mask ); … … 482 532 sigaddset( &mask, SIGUSR1 ); // block SIGUSR1 signals 483 533 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; 488 538 } 489 539 … … 494 544 __lib_debug_write( STDERR_FILENO, abort_text, len ); 495 545 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 ); 498 548 __lib_debug_write( STDERR_FILENO, abort_text, len ); 499 } 549 } 500 550 else { 501 551 __lib_debug_write( STDERR_FILENO, ".\n", 2 ); … … 505 555 extern "C" { 506 556 void __lib_debug_acquire() { 507 lock( &kernel_debug_lock);557 lock( &kernel_debug_lock DEBUG_CTX2 ); 508 558 } 509 559 510 560 void __lib_debug_release() { 511 unlock( &kernel_debug_lock);561 unlock( &kernel_debug_lock ); 512 562 } 513 563 } … … 525 575 } 526 576 527 bool try_lock( spinlock * this ) {577 bool try_lock( spinlock * this DEBUG_CTX_PARAM2 ) { 528 578 return this->lock == 0 && __sync_lock_test_and_set_4( &this->lock, 1 ) == 0; 529 579 } 530 580 531 void lock( spinlock * this ) {581 void lock( spinlock * this DEBUG_CTX_PARAM2 ) { 532 582 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 591 void 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 536 602 537 603 void unlock( spinlock * this ) { … … 539 605 } 540 606 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 } 607 void ?{}( semaphore * this, int count = 1 ) { 608 (&this->lock){}; 609 this->count = count; 610 (&this->waiting){}; 611 } 612 void ^?{}(semaphore * this) {} 613 614 void 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 629 void 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 555 638 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 ); 569 642 } 570 643 … … 590 663 } 591 664 head->next = NULL; 592 } 665 } 593 666 return head; 594 667 } … … 609 682 this->top = top->next; 610 683 top->next = NULL; 611 } 684 } 612 685 return top; 613 686 } -
src/libcfa/concurrency/kernel_private.h
rfea3faa rb826e6b 18 18 #define KERNEL_PRIVATE_H 19 19 20 #include "libhdr.h" 21 20 22 #include "kernel" 21 23 #include "thread" … … 23 25 #include "alarm.h" 24 26 25 #include "libhdr.h"26 27 27 28 //----------------------------------------------------------------------------- 28 29 // Scheduler 30 31 extern "C" { 32 void disable_interrupts(); 33 void enable_interrupts_noPoll(); 34 void enable_interrupts( DEBUG_CTX_PARAM ); 35 } 36 29 37 void ScheduleThread( thread_desc * ); 38 static inline void WakeThread( thread_desc * thrd ) { 39 if( !thrd ) return; 40 41 disable_interrupts(); 42 ScheduleThread( thrd ); 43 enable_interrupts( DEBUG_CTX ); 44 } 30 45 thread_desc * nextThread(cluster * this); 31 46 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 48 void BlockInternal(void); 49 void BlockInternal(spinlock * lock); 50 void BlockInternal(thread_desc * thrd); 51 void BlockInternal(spinlock * lock, thread_desc * thrd); 52 void BlockInternal(spinlock ** locks, unsigned short count); 53 void BlockInternal(spinlock ** locks, unsigned short count, thread_desc ** thrds, unsigned short thrd_count); 54 void LeaveThread(spinlock * lock, thread_desc * thrd); 38 55 39 56 //----------------------------------------------------------------------------- … … 49 66 void spin(processor * this, unsigned int * spin_count); 50 67 51 struct system_proc_t { 52 processor proc; 53 68 struct event_kernel_t { 54 69 alarm_list_t alarms; 55 spinlock alarm_lock; 56 57 bool pending_alarm; 70 spinlock lock; 58 71 }; 59 72 60 extern cluster * systemCluster; 61 extern system_proc_t * systemProcessor; 62 extern thread_local processor * this_processor; 73 extern event_kernel_t * event_kernel; 63 74 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 } 75 extern volatile thread_local processor * this_processor; 76 extern volatile thread_local coroutine_desc * this_coroutine; 77 extern volatile thread_local thread_desc * this_thread; 78 extern volatile thread_local bool preemption_in_progress; 79 extern volatile thread_local unsigned short disable_preempt_count; 82 80 83 81 //----------------------------------------------------------------------------- … … 90 88 extern void ThreadCtxSwitch(coroutine_desc * src, coroutine_desc * dst); 91 89 90 //----------------------------------------------------------------------------- 91 // Utils 92 #define KERNEL_STORAGE(T,X) static char storage_##X[sizeof(T)] 93 92 94 #endif //KERNEL_PRIVATE_H 93 95 -
src/libcfa/concurrency/monitor
rfea3faa rb826e6b 26 26 static inline void ?{}(monitor_desc * this) { 27 27 this->owner = NULL; 28 this->stack_owner = NULL;29 28 this->recursion = 0; 30 29 } -
src/libcfa/concurrency/monitor.c
rfea3faa rb826e6b 19 19 #include <stdlib> 20 20 21 #include "libhdr.h" 21 22 #include "kernel_private.h" 22 #include "libhdr.h"23 23 24 24 //----------------------------------------------------------------------------- … … 44 44 45 45 extern "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); 51 51 52 52 if( !this->owner ) { … … 62 62 //Some one else has the monitor, wait in line for it 63 63 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 ourselves68 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; 69 69 } 70 70 … … 75 75 // leave pseudo code : 76 76 // 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 ); 82 82 83 83 //Leaving a recursion level, decrement the counter … … 96 96 unlock( &this->lock ); 97 97 98 LIB_DEBUG_PRINT_SAFE("Next owner is %p\n", new_owner);98 // LIB_DEBUG_PRINT_SAFE("Next owner is %p\n", new_owner); 99 99 100 100 //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 ); 102 127 } 103 128 } … … 121 146 enter( this->m, this->count ); 122 147 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; 128 153 } 129 154 … … 131 156 leave( this->m, this->count ); 132 157 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; 135 160 } 136 161 … … 159 184 // Internal scheduling 160 185 void wait( condition * this, uintptr_t user_info = 0 ) { 161 LIB_DEBUG_PRINT_SAFE("Waiting\n");186 // LIB_DEBUG_PRINT_SAFE("Waiting\n"); 162 187 163 188 brand_condition( this ); … … 170 195 unsigned short count = this->monitor_count; 171 196 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 ScheduleInternal173 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 }; 177 202 178 203 __condition_criterion_t criteria[count]; 179 204 for(int i = 0; i < count; i++) { 180 205 (&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] ); 182 207 } 183 208 … … 201 226 } 202 227 203 LIB_DEBUG_PRINT_SAFE("Will unblock: ");228 // LIB_DEBUG_PRINT_SAFE("Will unblock: "); 204 229 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"); 208 233 209 234 // Everything is ready to go to sleep 210 ScheduleInternal( locks, count, threads, thread_count );235 BlockInternal( locks, count, threads, thread_count ); 211 236 212 237 … … 222 247 bool signal( condition * this ) { 223 248 if( is_empty( this ) ) { 224 LIB_DEBUG_PRINT_SAFE("Nothing to signal\n");249 // LIB_DEBUG_PRINT_SAFE("Nothing to signal\n"); 225 250 return false; 226 251 } … … 231 256 232 257 unsigned short count = this->monitor_count; 233 258 234 259 //Some more checking in debug 235 260 LIB_DEBUG_DO( 236 thread_desc * this_thrd = this_thread ();261 thread_desc * this_thrd = this_thread; 237 262 if ( this->monitor_count != this_thrd->current_monitor_count ) { 238 263 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 ); … … 248 273 //Lock all the monitors 249 274 lock_all( this->monitors, NULL, count ); 250 LIB_DEBUG_PRINT_SAFE("Signalling");275 // LIB_DEBUG_PRINT_SAFE("Signalling"); 251 276 252 277 //Pop the head of the waiting queue … … 256 281 for(int i = 0; i < count; i++) { 257 282 __condition_criterion_t * crit = &node->criteria[i]; 258 LIB_DEBUG_PRINT_SAFE(" %p", crit->target);283 // LIB_DEBUG_PRINT_SAFE(" %p", crit->target); 259 284 assert( !crit->ready ); 260 285 push( &crit->target->signal_stack, crit ); 261 286 } 262 287 263 LIB_DEBUG_PRINT_SAFE("\n");288 // LIB_DEBUG_PRINT_SAFE("\n"); 264 289 265 290 //Release … … 281 306 unsigned short count = this->monitor_count; 282 307 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 ScheduleInternal308 spinlock * locks [ count ]; //We need to pass-in an array of locks to BlockInternal 284 309 285 310 lock_all( this->monitors, locks, count ); 286 311 287 312 //create creteria 288 __condition_node_t waiter = { this_thread(), count, 0 };313 __condition_node_t waiter = { (thread_desc*)this_thread, count, 0 }; 289 314 290 315 __condition_criterion_t criteria[count]; 291 316 for(int i = 0; i < count; i++) { 292 317 (&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] ); 294 319 push( &criteria[i].target->signal_stack, &criteria[i] ); 295 320 } … … 309 334 310 335 //Everything is ready to go to sleep 311 ScheduleInternal( locks, count, &signallee, 1 );336 BlockInternal( locks, count, &signallee, 1 ); 312 337 313 338 … … 325 350 326 351 uintptr_t front( condition * this ) { 327 verifyf( !is_empty(this), 352 verifyf( !is_empty(this), 328 353 "Attempt to access user data on an empty condition.\n" 329 354 "Possible cause is not checking if the condition is empty before reading stored data." … … 335 360 // Internal scheduling 336 361 void __accept_internal( unsigned short count, __acceptable_t * acceptables, void (*func)(void) ) { 337 // thread_desc * this = this_thread ();362 // thread_desc * this = this_thread; 338 363 339 364 // unsigned short count = this->current_monitor_count; 340 365 // 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 ScheduleInternal366 // spinlock * locks [ count ]; //We need to pass-in an array of locks to BlockInternal 342 367 343 368 // lock_all( this->current_monitors, locks, count ); … … 348 373 349 374 // // // Everything is ready to go to sleep 350 // // ScheduleInternal( locks, count, threads, thread_count );375 // // BlockInternal( locks, count, threads, thread_count ); 351 376 352 377 … … 393 418 static inline void lock_all( spinlock ** locks, unsigned short count ) { 394 419 for( int i = 0; i < count; i++ ) { 395 lock ( locks[i]);420 lock_yield( locks[i] DEBUG_CTX2 ); 396 421 } 397 422 } … … 400 425 for( int i = 0; i < count; i++ ) { 401 426 spinlock * l = &source[i]->lock; 402 lock ( l);427 lock_yield( l DEBUG_CTX2 ); 403 428 if(locks) locks[i] = l; 404 429 } … … 443 468 for( int i = 0; i < count; i++ ) { 444 469 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 ); 446 471 if( &criteria[i] == target ) { 447 472 criteria[i].ready = true; 448 LIB_DEBUG_PRINT_SAFE( "True\n" );473 // LIB_DEBUG_PRINT_SAFE( "True\n" ); 449 474 } 450 475 … … 452 477 } 453 478 454 LIB_DEBUG_PRINT_SAFE( "Runing %i\n", ready2run );479 // LIB_DEBUG_PRINT_SAFE( "Runing %i\n", ready2run ); 455 480 return ready2run ? node->waiting_thread : NULL; 456 481 } 457 482 458 483 static inline void brand_condition( condition * this ) { 459 thread_desc * thrd = this_thread ();484 thread_desc * thrd = this_thread; 460 485 if( !this->monitors ) { 461 LIB_DEBUG_PRINT_SAFE("Branding\n");486 // LIB_DEBUG_PRINT_SAFE("Branding\n"); 462 487 assertf( thrd->current_monitors != NULL, "No current monitor to brand condition", thrd->current_monitors ); 463 488 this->monitor_count = thrd->current_monitor_count; -
src/libcfa/concurrency/preemption.c
rfea3faa rb826e6b 15 15 // 16 16 17 #include "libhdr.h" 17 18 #include "preemption.h" 18 19 19 20 extern "C" { 21 #include <errno.h> 22 #include <execinfo.h> 23 #define __USE_GNU 20 24 #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 25 40 __attribute__((weak)) unsigned int default_preemption() { 26 41 return __CFA_DEFAULT_PREEMPTION__; 27 42 } 28 43 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 29 49 static void preempt( processor * this ); 30 50 static void timeout( thread_desc * this ); 31 51 52 // FwdDeclarations : Signal handlers 53 void sigHandler_ctxSwitch( __CFA_SIGPARMS__ ); 54 void sigHandler_segv ( __CFA_SIGPARMS__ ); 55 void sigHandler_abort ( __CFA_SIGPARMS__ ); 56 57 // FwdDeclarations : sigaction wrapper 58 static void __kernel_sigaction( int sig, void (*handler)(__CFA_SIGPARMS__), int flags ); 59 60 // FwdDeclarations : alarm thread main 61 void * 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 70 KERNEL_STORAGE(event_kernel_t, event_kernel); // private storage for event kernel 71 event_kernel_t * event_kernel; // kernel public handle to even kernel 72 static pthread_t alarm_thread; // pthread handle to alarm thread 73 74 void ?{}(event_kernel_t * this) { 75 (&this->alarms){}; 76 (&this->lock){}; 77 } 78 32 79 //============================================================================================= 33 80 // Kernel Preemption logic 34 81 //============================================================================================= 35 82 36 void kernel_start_preemption() { 37 38 } 39 83 // Get next expired node 84 static 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 40 91 void 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 45 100 if( node->kernel_alarm ) { 46 101 preempt( node->proc ); … … 50 105 } 51 106 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 55 112 } 56 113 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 66 123 void update_preemption( processor * this, __cfa_time_t duration ) { 67 // assert( THREAD_GETMEM( disableInt ) && THREAD_GETMEM( disableIntCnt ) == 1 );68 124 alarm_node_t * alarm = this->preemption_alarm; 69 125 … … 89 145 } 90 146 147 //============================================================================================= 148 // Kernel Signal Tools 149 //============================================================================================= 150 151 LIB_DEBUG_DO( static thread_local void * last_interrupt = 0; ) 152 153 extern "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 188 static 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 199 static 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 210 static void preempt( processor * this ) { 211 pthread_kill( this->kernel_thread, SIGUSR1 ); 212 } 213 214 // reserved for future use 215 static 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 223 static 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 235 void 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 257 void 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 91 279 void ?{}( preemption_scope * this, processor * proc ) { 92 (&this->alarm){ proc };280 (&this->alarm){ proc, zero_time, zero_time }; 93 281 this->proc = proc; 94 282 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) ); 96 285 } 97 286 98 287 void ^?{}( 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 299 void 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 316 void * 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 356 EXIT: 357 LIB_DEBUG_PRINT_SAFE("Kernel : Preemption thread stopping\n"); 358 return NULL; 359 } 360 361 // Sigaction wrapper : register an signal handler 362 static 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 378 static 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 398 LIB_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 54 54 } 55 55 56 thread_desc * this_thread(void);56 extern volatile thread_local thread_desc * this_thread; 57 57 58 58 forall( dtype T | is_thread(T) ) -
src/libcfa/concurrency/thread.c
rfea3faa rb826e6b 28 28 } 29 29 30 extern thread_local processor * this_processor;30 extern volatile thread_local processor * this_processor; 31 31 32 32 //----------------------------------------------------------------------------- … … 71 71 coroutine_desc* thrd_c = get_coroutine(this); 72 72 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; 75 74 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); 77 76 77 disable_interrupts(); 78 78 create_stack(&thrd_c->stack, thrd_c->stack.size); 79 this_coroutine = thrd_c; 79 80 CtxStart(this, CtxInvokeThread); 81 assert( thrd_c->last->stack.context ); 80 82 CtxSwitch( thrd_c->last->stack.context, thrd_c->stack.context ); 81 83 82 84 ScheduleThread(thrd_h); 85 enable_interrupts( DEBUG_CTX ); 83 86 } 84 87 85 88 void yield( void ) { 86 ScheduleInternal( this_processor->current_thread );89 BlockInternal( (thread_desc *)this_thread ); 87 90 } 88 91 … … 95 98 void ThreadCtxSwitch(coroutine_desc* src, coroutine_desc* dst) { 96 99 // set state of current coroutine to inactive 97 src->state = Inactive;100 src->state = src->state == Halted ? Halted : Inactive; 98 101 dst->state = Active; 99 102 … … 103 106 // set new coroutine that the processor is executing 104 107 // and context switch to it 105 this_processor->current_coroutine = dst; 108 this_coroutine = dst; 109 assert( src->stack.context ); 106 110 CtxSwitch( src->stack.context, dst->stack.context ); 107 this_ processor->current_coroutine = src;111 this_coroutine = src; 108 112 109 113 // set state of new coroutine to active 110 dst->state = Inactive;114 dst->state = dst->state == Halted ? Halted : Inactive; 111 115 src->state = Active; 112 116 } -
src/libcfa/fstream
rfea3faa rb826e6b 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon May 15 18:11:09201713 // Update Count : 1 0412 // Last Modified On : Fri Jul 7 08:32:38 2017 13 // Update Count : 117 14 14 // 15 15 16 #ifndef __FSTREAM_H__ 17 #define __FSTREAM_H__ 16 #pragma once 18 17 19 18 #include "iostream" 20 19 21 enum { sep arateSize = 16 };20 enum { sepSize = 16 }; 22 21 struct ofstream { 23 22 void * file; 24 23 _Bool sepDefault; 25 24 _Bool sepOnOff; 25 _Bool sawNL; 26 26 const char * sepCur; 27 char separator[sep arateSize];28 char tupleSeparator[sep arateSize];27 char separator[sepSize]; 28 char tupleSeparator[sepSize]; 29 29 }; // ofstream 30 30 … … 35 35 const char * sepGetCur( ofstream * ); 36 36 void sepSetCur( ofstream *, const char * ); 37 _Bool getNL( ofstream * ); 38 void setNL( ofstream *, _Bool ); 37 39 38 40 // public … … 73 75 extern ifstream * sin; 74 76 75 #endif // __FSTREAM_H__76 77 77 // Local Variables: // 78 78 // mode: c // -
src/libcfa/fstream.c
rfea3faa rb826e6b 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon May 15 18:11:11201713 // Update Count : 2 3412 // Last Modified On : Thu Jul 6 18:38:25 2017 13 // Update Count : 251 14 14 // 15 15 … … 39 39 40 40 // private 41 _Bool sepPrt( ofstream * os ) { return os->sepOnOff; }41 _Bool sepPrt( ofstream * os ) { setNL( os, false ); return os->sepOnOff; } 42 42 void sepReset( ofstream * os ) { os->sepOnOff = os->sepDefault; } 43 43 void sepReset( ofstream * os, _Bool reset ) { os->sepDefault = reset; os->sepOnOff = os->sepDefault; } 44 44 const char * sepGetCur( ofstream * os ) { return os->sepCur; } 45 45 void sepSetCur( ofstream * os, const char * sepCur ) { os->sepCur = sepCur; } 46 _Bool getNL( ofstream * os ) { return os->sawNL; } 47 void setNL( ofstream * os, _Bool state ) { os->sawNL = state; } 46 48 47 49 // public 48 void sepOn( ofstream * os ) { os->sepOnOff = 1; }49 void sepOff( ofstream * os ) { os->sepOnOff = 0; }50 void sepOn( ofstream * os ) { os->sepOnOff = ! getNL( os ); } 51 void sepOff( ofstream * os ) { os->sepOnOff = false; } 50 52 51 53 _Bool sepDisable( ofstream *os ) { … … 66 68 void sepSet( ofstream * os, const char * s ) { 67 69 assert( s ); 68 strncpy( os->separator, s, sep arateSize - 1 );69 os->separator[sep arateSize - 1] = '\0';70 strncpy( os->separator, s, sepSize - 1 ); 71 os->separator[sepSize - 1] = '\0'; 70 72 } // sepSet 71 73 … … 73 75 void sepSetTuple( ofstream * os, const char * s ) { 74 76 assert( s ); 75 strncpy( os->tupleSeparator, s, sep arateSize - 1 );76 os->tupleSeparator[sep arateSize - 1] = '\0';77 strncpy( os->tupleSeparator, s, sepSize - 1 ); 78 os->tupleSeparator[sepSize - 1] = '\0'; 77 79 } // sepSet 78 80 … … 92 94 exit( EXIT_FAILURE ); 93 95 } // if 94 ?{}( os, file, 1, 0, " ", ", " );96 ?{}( os, file, true, false, " ", ", " ); 95 97 } // open 96 98 … … 132 134 } // fmt 133 135 134 static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 1, 0, " ", ", " };136 static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), true, false, " ", ", " }; 135 137 ofstream *sout = &soutFile; 136 static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 1, 0, " ", ", " };138 static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), true, false, " ", ", " }; 137 139 ofstream *serr = &serrFile; 138 140 … … 150 152 151 153 void open( ifstream * is, const char * name, const char * mode ) { 152 FILE * t= fopen( name, mode );153 if ( t == 0 ) {// do not change unless successful154 FILE *file = fopen( name, mode ); 155 if ( file == 0 ) { // do not change unless successful 154 156 fprintf( stderr, IO_MSG "open input file \"%s\", ", name ); 155 157 perror( 0 ); 156 158 exit( EXIT_FAILURE ); 157 159 } // if 158 is->file = t;160 is->file = file; 159 161 } // open 160 162 -
src/libcfa/gmp
rfea3faa rb826e6b 10 10 // Created On : Tue Apr 19 08:43:43 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat May 27 09:55:51201713 // Update Count : 1 412 // Last Modified On : Fri Jul 7 09:33:20 2017 13 // Update Count : 15 14 14 // 15 15 16 16 // https://gmplib.org/gmp-man-6.1.1.pdf 17 18 #pragma once 17 19 18 20 #include <gmp.h> // GNU multi-precise integers -
src/libcfa/iostream
rfea3faa rb826e6b 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon May 15 18:08:44201713 // Update Count : 1 0512 // Last Modified On : Fri Jul 7 08:35:59 2017 13 // Update Count : 118 14 14 // 15 15 16 #ifndef __IOSTREAM_H__ 17 #define __IOSTREAM_H__ 16 #pragma once 18 17 19 18 #include "iterator" … … 26 25 const char * sepGetCur( ostype * ); // get current separator string 27 26 void sepSetCur( ostype *, const char * ); // set current separator string 27 _Bool getNL( ostype * ); // check newline 28 void setNL( ostype *, _Bool ); // saw newline 28 29 // public 29 30 void sepOn( ostype * ); // turn separator state on … … 43 44 ostype * write( ostype *, const char *, unsigned long int ); 44 45 int fmt( ostype *, const char fmt[], ... ); 45 }; 46 }; // ostream 46 47 47 48 trait writeable( otype T ) { 48 49 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, T ); 49 }; 50 }; // writeable 50 51 51 52 // implement writable for intrinsic types … … 81 82 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, ostype * (*)( ostype * ) ); 82 83 forall( dtype ostype | ostream( ostype ) ) ostype * endl( ostype * ); 84 forall( dtype ostype | ostream( ostype ) ) ostype * sep( ostype * ); 85 forall( dtype ostype | ostream( ostype ) ) ostype * sepTuple( ostype * ); 83 86 forall( dtype ostype | ostream( ostype ) ) ostype * sepOn( ostype * ); 84 87 forall( dtype ostype | ostream( ostype ) ) ostype * sepOff( ostype * ); … … 103 106 istype * ungetc( istype *, char ); 104 107 int fmt( istype *, const char fmt[], ... ); 105 }; 108 }; // istream 106 109 107 110 trait readable( otype T ) { 108 111 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, T ); 109 }; 112 }; // readable 110 113 111 114 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, char * ); … … 136 139 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_cstrC ); 137 140 138 #endif // __IOSTREAM_H139 140 141 // Local Variables: // 141 142 // mode: c // -
src/libcfa/iostream.c
rfea3faa rb826e6b 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon May 8 18:24:23 201713 // Update Count : 3 6912 // Last Modified On : Sun Jul 16 21:12:03 2017 13 // Update Count : 398 14 14 // 15 15 … … 18 18 extern "C" { 19 19 #include <stdio.h> 20 #include <stdbool.h> // true/false 20 21 #include <string.h> // strlen 21 22 #include <float.h> // DBL_DIG, LDBL_DIG … … 24 25 25 26 forall( dtype ostype | ostream( ostype ) ) 26 ostype * ?|?( ostype * os, char c ) { 27 fmt( os, "%c", c ); 27 ostype * ?|?( ostype * os, char ch ) { 28 fmt( os, "%c", ch ); 29 if ( ch == '\n' ) setNL( os, true ); 28 30 sepOff( os ); 29 31 return os; … … 123 125 forall( dtype ostype | ostream( ostype ) ) 124 126 ostype * ?|?( 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 ) ); 130 129 return os; 131 130 } // ?|? … … 133 132 forall( dtype ostype | ostream( ostype ) ) 134 133 ostype * ?|?( 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 ) ); 140 136 return os; 141 137 } // ?|? … … 143 139 forall( dtype ostype | ostream( ostype ) ) 144 140 ostype * ?|?( 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 ) ); 150 143 return os; 151 144 } // ?|? … … 180 173 181 174 // 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 unsigned175 size_t len = strlen( cp ); 176 ch = cp[len - 1]; // must make unsigned 184 177 if ( sepPrt( os ) && mask[ ch ] != Open && mask[ ch ] != OpenClose ) { 185 178 sepOn( os ); … … 187 180 sepOff( os ); 188 181 } // if 182 if ( ch == '\n' ) setNL( os, true ); // check *AFTER* sepPrt call above as it resets NL flag 189 183 return write( os, cp, len ); 190 184 } // ?|? … … 201 195 forall( dtype ostype, otype T, ttype Params | ostream( ostype ) | writeable( T ) | { ostype * ?|?( ostype *, Params ); } ) 202 196 ostype * ?|?( ostype * os, T arg, Params rest ) { 197 os | arg; // print first argument 203 198 sepSetCur( os, sepGetTuple( os ) ); // switch to tuple separator 204 os | arg; // print first argument205 199 os | rest; // print remaining arguments 206 200 sepSetCur( os, sepGet( os ) ); // switch to regular separator … … 216 210 217 211 forall( dtype ostype | ostream( ostype ) ) 212 ostype * sep( ostype * os ) { 213 os | sepGet( os ); 214 return os; 215 } // sep 216 217 forall( dtype ostype | ostream( ostype ) ) 218 ostype * sepTuple( ostype * os ) { 219 os | sepGetTuple( os ); 220 return os; 221 } // sepTuple 222 223 forall( dtype ostype | ostream( ostype ) ) 218 224 ostype * endl( ostype * os ) { 219 225 os | '\n'; 226 setNL( os, true ); 220 227 flush( os ); 221 228 sepOff( os ); // prepare for next line -
src/libcfa/iterator
rfea3faa rb826e6b 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 18:06:05 201613 // Update Count : 912 // Last Modified On : Fri Jul 7 08:37:25 2017 13 // Update Count : 10 14 14 // 15 15 16 #ifndef ITERATOR_H 17 #define ITERATOR_H 16 #pragma once 18 17 19 18 // An iterator can be used to traverse a data structure. … … 39 38 40 39 forall( 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 ) );40 void for_each( iterator_type begin, iterator_type end, void (* func)( elt_type ) ); 42 41 43 42 forall( 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 43 void for_each_reverse( iterator_type begin, iterator_type end, void (* func)( elt_type ) ); 47 44 48 45 // Local Variables: // -
src/libcfa/iterator.c
rfea3faa rb826e6b 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 18:08:11 201613 // Update Count : 2 712 // Last Modified On : Fri Jul 7 08:38:23 2017 13 // Update Count : 28 14 14 // 15 15 … … 17 17 18 18 forall( 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 ) ) {19 void for_each( iterator_type begin, iterator_type end, void (* func)( elt_type ) ) { 20 20 for ( iterator_type i = begin; i != end; ++i ) { 21 21 func( *i ); 22 } 23 } 22 } // for 23 } // for_each 24 24 25 25 forall( 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 ) ) {26 void for_each_reverse( iterator_type begin, iterator_type end, void (* func)( elt_type ) ) { 27 27 for ( iterator_type i = end; i != begin; ) { 28 28 --i; 29 29 func( *i ); 30 } 31 } 30 } // for 31 } // for_each_reverse 32 32 33 33 // Local Variables: // -
src/libcfa/libhdr/libalign.h
rfea3faa rb826e6b 1 // -*- Mode: C++ -*- 1 // -*- Mode: C++ -*- 2 2 // 3 3 // Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo … … 18 18 // Free Software Foundation; either version 2.1 of the License, or (at your 19 19 // option) any later version. 20 // 20 // 21 21 // This library is distributed in the hope that it will be useful, but WITHOUT 22 22 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 23 23 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License 24 24 // for more details. 25 // 25 // 26 26 // You should have received a copy of the GNU Lesser General Public License 27 27 // along with this library. 28 // 28 // 29 29 30 30 … … 33 33 34 34 #include "assert" 35 #include <stdbool.h> 35 36 36 // Minimum size used to align memory boundaries for memory allocations. 37 // Minimum size used to align memory boundaries for memory allocations. 37 38 #define libAlign() (sizeof(double)) 38 39 -
src/libcfa/libhdr/libdebug.h
rfea3faa rb826e6b 18 18 19 19 #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 22 26 #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 25 33 #endif 26 34 … … 51 59 52 60 #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 ); 59 69 #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) 66 78 #endif 67 79 -
src/libcfa/limits
rfea3faa rb826e6b 10 10 // Created On : Wed Apr 6 18:06:52 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Apr 6 21:08:16 201613 // Update Count : 612 // Last Modified On : Fri Jul 7 09:33:57 2017 13 // Update Count : 7 14 14 // 15 15 16 #ifndef LIMITS_H 17 #define LIMITS_H 16 #pragma once 18 17 19 18 // Integral Constants … … 110 109 extern const long _Complex _1_SQRT_2; // 1 / sqrt(2) 111 110 112 #endif // LIMITS_H113 114 111 // Local Variables: // 115 112 // mode: c // -
src/libcfa/math
rfea3faa rb826e6b 10 10 // Created On : Mon Apr 18 23:37:04 2016 11 11 // 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 18 17 19 18 extern "C" { … … 345 344 long double scalbln( long double, long int ); 346 345 347 #endif // MATH_H348 349 346 // Local Variables: // 350 347 // mode: c // -
src/libcfa/rational
rfea3faa rb826e6b 12 12 // Created On : Wed Apr 6 17:56:25 2016 13 13 // Last Modified By : Peter A. Buhr 14 // Last Modified On : Mon May 15 21:30:12201715 // Update Count : 9 014 // Last Modified On : Fri Jul 7 09:34:33 2017 15 // Update Count : 93 16 16 // 17 17 18 #ifndef RATIONAL_H 19 #define RATIONAL_H 18 #pragma once 20 19 21 20 #include "iostream" … … 47 46 // implementation 48 47 49 forall 48 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 50 49 struct Rational { 51 50 RationalImpl numerator, denominator; // invariant: denominator > 0 … … 54 53 // constructors 55 54 56 forall 55 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 57 56 void ?{}( Rational(RationalImpl) * r ); 58 57 59 forall 58 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 60 59 void ?{}( Rational(RationalImpl) * r, RationalImpl n ); 61 60 62 forall 61 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 63 62 void ?{}( Rational(RationalImpl) * r, RationalImpl n, RationalImpl d ); 64 63 65 forall 64 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 66 65 void ?{}( Rational(RationalImpl) * r, zero_t ); 67 66 68 forall 67 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 69 68 void ?{}( Rational(RationalImpl) * r, one_t ); 70 69 71 // getter for numerator/denominator70 // numerator/denominator getter 72 71 73 forall 72 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 74 73 RationalImpl numerator( Rational(RationalImpl) r ); 75 74 76 forall 75 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 77 76 RationalImpl denominator( Rational(RationalImpl) r ); 78 forall ( otype RationalImpl | arithmetic( RationalImpl ) ) 77 78 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 79 79 [ RationalImpl, RationalImpl ] ?=?( * [ RationalImpl, RationalImpl ] dest, Rational(RationalImpl) src ); 80 80 81 // setter for numerator/denominator81 // numerator/denominator setter 82 82 83 forall 83 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 84 84 RationalImpl numerator( Rational(RationalImpl) r, RationalImpl n ); 85 85 86 forall 86 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 87 87 RationalImpl denominator( Rational(RationalImpl) r, RationalImpl d ); 88 88 89 89 // comparison 90 90 91 forall 91 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 92 92 int ?==?( Rational(RationalImpl) l, Rational(RationalImpl) r ); 93 93 94 forall 94 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 95 95 int ?!=?( Rational(RationalImpl) l, Rational(RationalImpl) r ); 96 96 97 forall 97 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 98 98 int ?<?( Rational(RationalImpl) l, Rational(RationalImpl) r ); 99 99 100 forall 100 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 101 101 int ?<=?( Rational(RationalImpl) l, Rational(RationalImpl) r ); 102 102 103 forall 103 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 104 104 int ?>?( Rational(RationalImpl) l, Rational(RationalImpl) r ); 105 105 106 forall 106 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 107 107 int ?>=?( Rational(RationalImpl) l, Rational(RationalImpl) r ); 108 108 109 109 // arithmetic 110 110 111 forall 111 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 112 112 Rational(RationalImpl) +?( Rational(RationalImpl) r ); 113 113 114 forall 114 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 115 115 Rational(RationalImpl) -?( Rational(RationalImpl) r ); 116 116 117 forall 117 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 118 118 Rational(RationalImpl) ?+?( Rational(RationalImpl) l, Rational(RationalImpl) r ); 119 119 120 forall 120 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 121 121 Rational(RationalImpl) ?-?( Rational(RationalImpl) l, Rational(RationalImpl) r ); 122 122 123 forall 123 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 124 124 Rational(RationalImpl) ?*?( Rational(RationalImpl) l, Rational(RationalImpl) r ); 125 125 126 forall 126 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 127 127 Rational(RationalImpl) ?/?( Rational(RationalImpl) l, Rational(RationalImpl) r ); 128 128 129 129 // conversion 130 forall 130 forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } ) 131 131 double widen( Rational(RationalImpl) r ); 132 forall 132 forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); RationalImpl convert( double );} ) 133 133 Rational(RationalImpl) narrow( double f, RationalImpl md ); 134 134 135 135 // I/O 136 forall 136 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 137 137 forall( dtype istype | istream( istype ) | { istype * ?|?( istype *, RationalImpl * ); } ) 138 138 istype * ?|?( istype *, Rational(RationalImpl) * ); 139 139 140 forall 140 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 141 141 forall( dtype ostype | ostream( ostype ) | { ostype * ?|?( ostype *, RationalImpl ); } ) 142 142 ostype * ?|?( ostype *, Rational(RationalImpl ) ); 143 144 #endif // RATIONAL_H145 143 146 144 // Local Variables: // -
src/libcfa/rational.c
rfea3faa rb826e6b 10 10 // Created On : Wed Apr 6 17:54:28 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon May 15 21:29:23201713 // Update Count : 1 4912 // Last Modified On : Tue May 16 18:35:36 2017 13 // Update Count : 150 14 14 // 15 15 … … 22 22 // Calculate greatest common denominator of two numbers, the first of which may be negative. Used to reduce rationals. 23 23 // alternative: https://en.wikipedia.org/wiki/Binary_GCD_algorithm 24 forall 24 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 25 25 static RationalImpl gcd( RationalImpl a, RationalImpl b ) { 26 26 for ( ;; ) { // Euclid's algorithm … … 33 33 } // gcd 34 34 35 forall 35 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 36 36 static RationalImpl simplify( RationalImpl * n, RationalImpl * d ) { 37 37 if ( *d == (RationalImpl){0} ) { … … 46 46 // constructors 47 47 48 forall 48 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 49 49 void ?{}( Rational(RationalImpl) * r ) { 50 50 r{ (RationalImpl){0}, (RationalImpl){1} }; 51 51 } // rational 52 52 53 forall 53 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 54 54 void ?{}( Rational(RationalImpl) * r, RationalImpl n ) { 55 55 r{ n, (RationalImpl){1} }; 56 56 } // rational 57 57 58 forall 58 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 59 59 void ?{}( Rational(RationalImpl) * r, RationalImpl n, RationalImpl d ) { 60 60 RationalImpl t = simplify( &n, &d ); // simplify … … 66 66 // getter for numerator/denominator 67 67 68 forall 68 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 69 69 RationalImpl numerator( Rational(RationalImpl) r ) { 70 70 return r.numerator; 71 71 } // numerator 72 72 73 forall 73 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 74 74 RationalImpl denominator( Rational(RationalImpl) r ) { 75 75 return r.denominator; 76 76 } // denominator 77 77 78 forall 78 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 79 79 [ RationalImpl, RationalImpl ] ?=?( * [ RationalImpl, RationalImpl ] dest, Rational(RationalImpl) src ) { 80 80 return *dest = src.[ numerator, denominator ]; … … 83 83 // setter for numerator/denominator 84 84 85 forall 85 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 86 86 RationalImpl numerator( Rational(RationalImpl) r, RationalImpl n ) { 87 87 RationalImpl prev = r.numerator; … … 92 92 } // numerator 93 93 94 forall 94 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 95 95 RationalImpl denominator( Rational(RationalImpl) r, RationalImpl d ) { 96 96 RationalImpl prev = r.denominator; … … 104 104 // comparison 105 105 106 forall 106 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 107 107 int ?==?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 108 108 return l.numerator * r.denominator == l.denominator * r.numerator; 109 109 } // ?==? 110 110 111 forall 111 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 112 112 int ?!=?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 113 113 return ! ( l == r ); 114 114 } // ?!=? 115 115 116 forall 116 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 117 117 int ?<?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 118 118 return l.numerator * r.denominator < l.denominator * r.numerator; 119 119 } // ?<? 120 120 121 forall 121 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 122 122 int ?<=?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 123 123 return l.numerator * r.denominator <= l.denominator * r.numerator; 124 124 } // ?<=? 125 125 126 forall 126 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 127 127 int ?>?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 128 128 return ! ( l <= r ); 129 129 } // ?>? 130 130 131 forall 131 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 132 132 int ?>=?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 133 133 return ! ( l < r ); … … 137 137 // arithmetic 138 138 139 forall 139 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 140 140 Rational(RationalImpl) +?( Rational(RationalImpl) r ) { 141 141 Rational(RationalImpl) t = { r.numerator, r.denominator }; … … 143 143 } // +? 144 144 145 forall 145 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 146 146 Rational(RationalImpl) -?( Rational(RationalImpl) r ) { 147 147 Rational(RationalImpl) t = { -r.numerator, r.denominator }; … … 149 149 } // -? 150 150 151 forall 151 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 152 152 Rational(RationalImpl) ?+?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 153 153 if ( l.denominator == r.denominator ) { // special case … … 160 160 } // ?+? 161 161 162 forall 162 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 163 163 Rational(RationalImpl) ?-?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 164 164 if ( l.denominator == r.denominator ) { // special case … … 171 171 } // ?-? 172 172 173 forall 173 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 174 174 Rational(RationalImpl) ?*?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 175 175 Rational(RationalImpl) t = { l.numerator * r.numerator, l.denominator * r.denominator }; … … 177 177 } // ?*? 178 178 179 forall 179 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 180 180 Rational(RationalImpl) ?/?( Rational(RationalImpl) l, Rational(RationalImpl) r ) { 181 181 if ( r.numerator < (RationalImpl){0} ) { … … 190 190 // conversion 191 191 192 forall 192 forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); } ) 193 193 double widen( Rational(RationalImpl) r ) { 194 194 return convert( r.numerator ) / convert( r.denominator ); … … 196 196 197 197 // http://www.ics.uci.edu/~eppstein/numth/frap.c 198 forall 198 forall( otype RationalImpl | arithmetic( RationalImpl ) | { double convert( RationalImpl ); RationalImpl convert( double ); } ) 199 199 Rational(RationalImpl) narrow( double f, RationalImpl md ) { 200 200 if ( md <= (RationalImpl){1} ) { // maximum fractional digits too small? … … 227 227 // I/O 228 228 229 forall 229 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 230 230 forall( dtype istype | istream( istype ) | { istype * ?|?( istype *, RationalImpl * ); } ) 231 231 istype * ?|?( istype * is, Rational(RationalImpl) * r ) { … … 238 238 } // ?|? 239 239 240 forall 240 forall( otype RationalImpl | arithmetic( RationalImpl ) ) 241 241 forall( dtype ostype | ostream( ostype ) | { ostype * ?|?( ostype *, RationalImpl ); } ) 242 242 ostype * ?|?( ostype * os, Rational(RationalImpl ) r ) { -
src/libcfa/stdlib
rfea3faa rb826e6b 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 11 // 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 18 17 19 18 //--------------------------------------- … … 232 231 void swap( T * t1, T * t2 ); 233 232 234 #endif // STDLIB_H235 236 233 // Local Variables: // 237 234 // mode: c // -
src/main.cc
rfea3faa rb826e6b 11 11 // Created On : Fri May 15 23:12:02 2015 12 12 // Last Modified By : Andrew Beach 13 // Last Modified On : Wed May 10 14:45:00 201714 // Update Count : 4 3713 // Last Modified On : Fri Jul 7 11:13:00 2017 14 // Update Count : 442 15 15 // 16 16 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... 51 60 52 61 using namespace std; … … 186 195 if ( ! nopreludep ) { // include gcc builtins 187 196 // -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 library189 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 );192 197 193 198 // Read to gcc builtins, if not generating the cfa library … … 206 211 assertf( prelude, "cannot open prelude.cf\n" ); 207 212 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 ); 208 218 } // if 209 219 } // if … … 289 299 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 290 300 Tuples::expandUniqueExpr( translationUnit ); 301 302 OPTPRINT( "translateEHM" ); 303 ControlStruct::translateEHM( translationUnit ); 291 304 292 305 OPTPRINT( "convertSpecializations" ) // needs to happen before tuple types are expanded … … 481 494 break; 482 495 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 484 501 default: 485 502 abort(); -
src/prelude/Makefile.am
rfea3faa rb826e6b 23 23 noinst_DATA = ../libcfa/libcfa-prelude.c 24 24 25 CC = ${abs_top_srcdir}/src/driver/cfa 26 27 $(DEPDIR) : 28 mkdir $(DEPDIR) 29 30 $(DEPDIR)/builtins.Po : $(DEPDIR) 31 touch ${@} 32 25 33 # create extra forward types/declarations to reduce inclusion of library files 26 34 extras.cf : extras.regx extras.c … … 39 47 40 48 # create forward declarations for cfa builtins 41 builtins.cf : builtins.c 42 ${AM_V_GEN}@BACKEND_CC@ -E -P ${<} -o ${@} 49 builtins.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 53 include $(DEPDIR)/builtins.Po 43 54 44 55 ../libcfa/libcfa-prelude.c : prelude.cf extras.cf gcc-builtins.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp … … 48 59 ${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -tpmL bootloader.cf $@ # use src/cfa-cpp as not in lib until after install 49 60 61 maintainer-clean-local : 62 rm -rf $(DEPDIR) 63 50 64 MAINTAINERCLEANFILES = 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.1 1.3from Makefile.am.1 # Makefile.in generated by automake 1.15 from Makefile.am. 2 2 # @configure_input@ 3 3 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 7 6 # This Makefile.in is free software; the Free Software Foundation 8 7 # gives unlimited permission to copy and/or distribute it, … … 20 19 21 20 VPATH = @srcdir@ 21 am__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 } 32 am__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 74 am__make_dryrun = (target_option=n; $(am__make_running_with_option)) 75 am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 22 76 pkgdatadir = $(datadir)/@PACKAGE@ 23 77 pkgincludedir = $(includedir)/@PACKAGE@ … … 39 93 host_triplet = @host@ 40 94 subdir = src/prelude 41 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in42 95 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 43 96 am__aclocal_m4_deps = $(top_srcdir)/configure.ac 44 97 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ 45 98 $(ACLOCAL_M4) 99 DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) 46 100 mkinstalldirs = $(install_sh) -d 47 101 CONFIG_HEADER = $(top_builddir)/config.h 48 102 CONFIG_CLEAN_FILES = 49 103 CONFIG_CLEAN_VPATH_FILES = 104 AM_V_P = $(am__v_P_@AM_V@) 105 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) 106 am__v_P_0 = false 107 am__v_P_1 = : 50 108 AM_V_GEN = $(am__v_GEN_@AM_V@) 51 109 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) 52 am__v_GEN_0 = @echo " GEN " $@; 110 am__v_GEN_0 = @echo " GEN " $@; 111 am__v_GEN_1 = 53 112 AM_V_at = $(am__v_at_@AM_V@) 54 113 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) 55 114 am__v_at_0 = @ 115 am__v_at_1 = 56 116 SOURCES = 57 117 DIST_SOURCES = 118 am__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 58 123 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; 59 124 am__vpath_adj = case $$p in \ … … 85 150 am__installdirs = "$(DESTDIR)$(cfalibdir)" 86 151 DATA = $(cfalib_DATA) $(noinst_DATA) 152 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) 153 am__DIST_COMMON = $(srcdir)/Makefile.in 87 154 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 88 155 ACLOCAL = @ACLOCAL@ … … 95 162 AWK = @AWK@ 96 163 BACKEND_CC = @BACKEND_CC@ 97 CC = @CC@164 CC = ${abs_top_srcdir}/src/driver/cfa 98 165 CCAS = @CCAS@ 99 166 CCASDEPMODE = @CCASDEPMODE@ … … 197 264 program_transform_name = @program_transform_name@ 198 265 psdir = @psdir@ 266 runstatedir = @runstatedir@ 199 267 sbindir = @sbindir@ 200 268 sharedstatedir = @sharedstatedir@ … … 229 297 $(am__cd) $(top_srcdir) && \ 230 298 $(AUTOMAKE) --foreign src/prelude/Makefile 231 .PRECIOUS: Makefile232 299 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 233 300 @case '$?' in \ … … 249 316 install-cfalibDATA: $(cfalib_DATA) 250 317 @$(NORMAL_INSTALL) 251 test -z "$(cfalibdir)" || $(MKDIR_P) "$(DESTDIR)$(cfalibdir)"252 318 @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; \ 253 323 for p in $$list; do \ 254 324 if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ … … 265 335 files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ 266 336 dir='$(DESTDIR)$(cfalibdir)'; $(am__uninstall_files_from_dir) 267 tags : TAGS268 TAGS: 269 270 ctags: CTAGS 271 CTAGS:337 tags TAGS: 338 339 ctags CTAGS: 340 341 cscope cscopelist: 272 342 273 343 … … 390 460 maintainer-clean: maintainer-clean-am 391 461 -rm -f Makefile 392 maintainer-clean-am: distclean-am maintainer-clean-generic 462 maintainer-clean-am: distclean-am maintainer-clean-generic \ 463 maintainer-clean-local 393 464 394 465 mostlyclean: mostlyclean-am … … 408 479 .MAKE: install-am install-strip 409 480 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 ${@} 421 501 422 502 # create extra forward types/declarations to reduce inclusion of library files … … 436 516 437 517 # create forward declarations for cfa builtins 438 builtins.cf : builtins.c 439 ${AM_V_GEN}@BACKEND_CC@ -E -P ${<} -o ${@} 518 builtins.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 522 include $(DEPDIR)/builtins.Po 440 523 441 524 ../libcfa/libcfa-prelude.c : prelude.cf extras.cf gcc-builtins.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp … … 444 527 bootloader.c : bootloader.cf prelude.cf extras.cf gcc-builtins.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp 445 528 ${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 530 maintainer-clean-local : 531 rm -rf $(DEPDIR) 446 532 447 533 # Tell versions [3.59,3.63) of GNU make to not export all variables. -
src/prelude/builtins.c
rfea3faa rb826e6b 1 1 typedef unsigned long long __cfaabi_exception_type_t; 2 3 #include "../libcfa/exception.h" -
src/tests/.expect/32/math.txt
rfea3faa rb826e6b 22 22 cos:0.540302 0.54030230586814 0.540302305868139717 0.83373-0.988898i 0.833730025131149-0.988897705762865i 0.833730025131149049-0.988897705762865096i 23 23 tan: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.6662 4+1.06128i 0.666239432492515+1.06127506190504i 0.666239432492515255+1.06127506190503565i24 asin:1.5708 1.5707963267949 1.57079632679489662 0.666239+1.06128i 0.666239432492515+1.06127506190504i 0.666239432492515255+1.06127506190503565i 25 25 acos:0 0 0 0.904557-1.06128i 0.904556894302381-1.06127506190504i 0.904556894302381364-1.06127506190503565i 26 26 atan: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 9 9 9000 10 10 10000 11 1100012 1200013 1300014 1400015 1500016 1600017 1700018 1800019 1900020 2000021 2100022 2200023 2300024 2400025 2500026 2600027 2700028 2800029 2900030 3000031 3100032 3200033 3300034 3400035 3500036 3600037 3700038 3800039 3900040 4000041 4100042 4200043 4300044 4400045 4500046 4600047 4700048 4800049 4900050 5000051 5100052 5200053 5300054 5400055 5500056 5600057 5700058 5800059 5900060 6000061 6100062 6200063 6300064 6400065 6500066 6600067 6700068 6800069 6900070 7000071 7100072 7200073 7300074 7400075 7500076 7600077 7700078 7800079 7900080 8000081 8100082 8200083 8300084 8400085 8500086 8600087 8700088 8800089 8900090 9000091 9100092 9200093 9300094 9400095 9500096 9600097 9700098 9800099 99000100 100000101 11 All waiter done -
src/tests/.expect/io.txt
rfea3faa rb826e6b 4 4 123 5 5 6 opening delimiters 6 7 x (1 x [2 x {3 x =4 x $5 x £6 x ¥7 x ¡8 x ¿9 x «10 8 9 closing delimiters 7 10 1, x 2. x 3; x 4! x 5? x 6% x 7¢ x 8» x 9) x 10] x 11} x 11 12 opening/closing delimiters 8 13 x`1`x'2'x"3"x:4:x 5 x 6 x 9 14 7 … … 15 20 10 16 21 x 22 23 override opening/closing delimiters 17 24 x ( 1 ) x 2 , x 3 :x: 4 25 26 input bacis types 27 28 output basic types 18 29 A 19 30 1 2 3 4 5 6 7 8 … … 21 32 1.1+2.3i 1.1-2.3i 1.1-2.3i 22 33 34 tuples 35 1, 2, 3 4, 5, 6 36 37 toggle separator 23 38 1.11.21.3 24 39 1.1+2.3i1.1-2.3i1.1-2.3i 25 abcxyz 40 1.1+2.3i 1.1-2.3i1.1-2.3i 41 1.1+2.3i 1.1-2.3i 1.1-2.3i 42 1.1+2.3i1.1-2.3i 1.1-2.3i 43 abcxyz 26 44 abcxyz 27 45 46 change separator 47 from " " to ", $" 28 48 1.1, $1.2, $1.3 29 49 1.1+2.3i, $1.1-2.3i, $1.1-2.3i 30 50 abc, $xyz 51 1, 2, 3, $4, 5, 6 31 52 32 1, 2, 3, 4 33 1, $2, $3 ", $" 34 1 2 3 " " 35 1 2 3 53 from ", $" to " " 54 1.1 1.2 1.3 55 1.1+2.3i 1.1-2.3i 1.1-2.3i 56 abc xyz 57 1, 2, 3 4, 5, 6 58 59 check sepOn/sepOff 60 1 2 3 36 61 12 3 62 1 2 3 63 1 2 3 64 65 1 2 3 66 67 check enable/disable 37 68 123 38 69 1 23 39 70 1 2 3 40 1 2 3 4 " " 41 1, 2, 3, 4 ", " 42 1, 2, 3, 4 71 123 72 1 2 3 73 123 74 1 2 3 75 76 1 2 3 4 5 6 " " 77 1, 2, 3 4, 5, 6 " " 78 1, 2, 3 4, 5, 6 79 43 80 3, 4, a, 7.2 44 81 3, 4, a, 7.2 45 82 3 4 a 7.2 46 47 3-4-a-7.2^3^4 -3-4-a-7.283 3 4 a 7.234a7.23 4 a 7.2 84 3-4-a-7.2^3^4^3-4-a-7.2 -
src/tests/Makefile.am
rfea3faa rb826e6b 29 29 30 30 # applies to both programs 31 EXTRA_FLAGS = 32 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ ${EXTRA_FLAGS} 31 DEBUG_FLAGS = 32 33 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ 34 if !BUILD_DEBUG 35 BUILD_FLAGS += -nodebug 36 else 37 if !BUILD_RELEASE 38 BUILD_FLAGS += -debug 39 else 40 BUILD_FLAGS += ${DEBUG_FLAGS} 41 endif 42 endif 43 33 44 TEST_FLAGS = $(if $(test), 2> .err/${@}.log, ) 34 CFLAGS = ${TEST_FLAGS} ${BUILD_FLAGS}45 AM_CFLAGS = ${TEST_FLAGS} ${BUILD_FLAGS} 35 46 CC = @CFA_BINDIR@/@CFA_NAME@ 36 47 … … 39 50 40 51 fstream_test_SOURCES = fstream_test.c 52 fstream_test_CFLAGS = $(if $(test), 2>> .err/fstream_test.log, ) ${BUILD_FLAGS} 53 41 54 vector_test_SOURCES = vector/vector_int.c vector/array.c vector/vector_test.c 55 vector_test_CFLAGS = $(if $(test), 2>> .err/vector_test.log, ) ${BUILD_FLAGS} 56 42 57 avl_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 58 avl_test_CFLAGS = $(if $(test), 2>> .err/avl_test.log, ) ${BUILD_FLAGS} 43 59 44 60 all-local : … … 62 78 63 79 % : %.c @CFA_BINDIR@/@CFA_NAME@ 64 ${CC} ${ CFLAGS} ${<} -o ${@}80 ${CC} ${AM_CFLAGS} ${CFLAGS} ${<} -o ${@} 65 81 66 82 dtor-early-exit-ERR1: dtor-early-exit.c @CFA_BINDIR@/@CFA_NAME@ 67 ${CC} ${ CFLAGS} -DERR1 ${<} -o ${@}83 ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@} 68 84 69 85 dtor-early-exit-ERR2: dtor-early-exit.c @CFA_BINDIR@/@CFA_NAME@ 70 ${CC} ${ CFLAGS} -DERR2 ${<} -o ${@}86 ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR2 ${<} -o ${@} 71 87 72 88 declarationSpecifier: 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 ${@} 74 90 75 91 gccExtensions : 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 ${@} 77 93 78 94 extension : 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 ${@} 80 96 81 97 attributes : 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 ${@} 83 99 84 100 KRfunctions : 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 ${@} 86 102 87 103 gmp : gmp.c @CFA_BINDIR@/@CFA_NAME@ 88 ${CC} ${ CFLAGS} -lgmp ${<} -o ${@}104 ${CC} ${AM_CFLAGS} ${CFLAGS} -lgmp ${<} -o ${@} 89 105 90 106 memberCtors-ERR1: memberCtors.c @CFA_BINDIR@/@CFA_NAME@ 91 ${CC} ${ CFLAGS} -DERR1 ${<} -o ${@}107 ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@} 92 108 93 109 completeTypeError : 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.1 1.3from Makefile.am.1 # Makefile.in generated by automake 1.15 from Makefile.am. 2 2 # @configure_input@ 3 3 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 7 6 # This Makefile.in is free software; the Free Software Foundation 8 7 # gives unlimited permission to copy and/or distribute it, … … 19 18 ############################################################################### 20 19 VPATH = @srcdir@ 20 am__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 } 31 am__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 73 am__make_dryrun = (target_option=n; $(am__make_running_with_option)) 74 am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 21 75 pkgdatadir = $(datadir)/@PACKAGE@ 22 76 pkgincludedir = $(includedir)/@PACKAGE@ … … 38 92 host_triplet = @host@ 39 93 @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} 40 97 EXTRA_PROGRAMS = fstream_test$(EXEEXT) vector_test$(EXEEXT) \ 41 98 avl_test$(EXEEXT) 42 99 subdir = src/tests 43 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in44 100 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 45 101 am__aclocal_m4_deps = $(top_srcdir)/configure.ac 46 102 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ 47 103 $(ACLOCAL_M4) 104 DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) 48 105 mkinstalldirs = $(install_sh) -d 49 106 CONFIG_HEADER = $(top_builddir)/config.h 50 107 CONFIG_CLEAN_FILES = 51 108 CONFIG_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) 109 am__dirstamp = $(am__leading_dot)dirstamp 110 am_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) 55 117 avl_test_OBJECTS = $(am_avl_test_OBJECTS) 56 118 avl_test_LDADD = $(LDADD) 57 am_fstream_test_OBJECTS = fstream_test.$(OBJEXT) 119 avl_test_LINK = $(CCLD) $(avl_test_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ 120 $(LDFLAGS) -o $@ 121 am_fstream_test_OBJECTS = fstream_test-fstream_test.$(OBJEXT) 58 122 fstream_test_OBJECTS = $(am_fstream_test_OBJECTS) 59 123 fstream_test_LDADD = $(LDADD) 60 am_vector_test_OBJECTS = vector_int.$(OBJEXT) array.$(OBJEXT) \ 61 vector_test.$(OBJEXT) 124 fstream_test_LINK = $(CCLD) $(fstream_test_CFLAGS) $(CFLAGS) \ 125 $(AM_LDFLAGS) $(LDFLAGS) -o $@ 126 am_vector_test_OBJECTS = vector/vector_test-vector_int.$(OBJEXT) \ 127 vector/vector_test-array.$(OBJEXT) \ 128 vector/vector_test-vector_test.$(OBJEXT) 62 129 vector_test_OBJECTS = $(am_vector_test_OBJECTS) 63 130 vector_test_LDADD = $(LDADD) 131 vector_test_LINK = $(CCLD) $(vector_test_CFLAGS) $(CFLAGS) \ 132 $(AM_LDFLAGS) $(LDFLAGS) -o $@ 133 AM_V_P = $(am__v_P_@AM_V@) 134 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) 135 am__v_P_0 = false 136 am__v_P_1 = : 137 AM_V_GEN = $(am__v_GEN_@AM_V@) 138 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) 139 am__v_GEN_0 = @echo " GEN " $@; 140 am__v_GEN_1 = 141 AM_V_at = $(am__v_at_@AM_V@) 142 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) 143 am__v_at_0 = @ 144 am__v_at_1 = 64 145 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) 65 146 depcomp = $(SHELL) $(top_srcdir)/automake/depcomp … … 69 150 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) 70 151 am__v_lt_0 = --silent 152 am__v_lt_1 = 71 153 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ 72 154 $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) 73 155 AM_V_CC = $(am__v_CC_@AM_V@) 74 156 am__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 = @ 157 am__v_CC_0 = @echo " CC " $@; 158 am__v_CC_1 = 79 159 CCLD = $(CC) 80 160 LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ 81 161 AM_V_CCLD = $(am__v_CCLD_@AM_V@) 82 162 am__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 " $@; 163 am__v_CCLD_0 = @echo " CCLD " $@; 164 am__v_CCLD_1 = 87 165 SOURCES = $(avl_test_SOURCES) $(fstream_test_SOURCES) \ 88 166 $(vector_test_SOURCES) 89 167 DIST_SOURCES = $(avl_test_SOURCES) $(fstream_test_SOURCES) \ 90 168 $(vector_test_SOURCES) 169 am__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 174 am__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. 178 am__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. 186 am__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)` 91 191 ETAGS = etags 92 192 CTAGS = ctags 193 am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/automake/depcomp 93 194 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 94 195 ACLOCAL = @ACLOCAL@ … … 113 214 CFA_NAME = @CFA_NAME@ 114 215 CFA_PREFIX = @CFA_PREFIX@ 115 CFLAGS = ${TEST_FLAGS} ${BUILD_FLAGS}216 CFLAGS = @CFLAGS@ 116 217 CPP = @CPP@ 117 218 CPPFLAGS = @CPPFLAGS@ … … 203 304 program_transform_name = @program_transform_name@ 204 305 psdir = @psdir@ 306 runstatedir = @runstatedir@ 205 307 sbindir = @sbindir@ 206 308 sharedstatedir = @sharedstatedir@ … … 221 323 222 324 # applies to both programs 223 EXTRA_FLAGS = 224 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ ${EXTRA_FLAGS} 325 DEBUG_FLAGS = 326 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ \ 327 $(am__append_2) $(am__append_3) $(am__append_4) 225 328 TEST_FLAGS = $(if $(test), 2> .err/${@}.log, ) 329 AM_CFLAGS = ${TEST_FLAGS} ${BUILD_FLAGS} 226 330 fstream_test_SOURCES = fstream_test.c 331 fstream_test_CFLAGS = $(if $(test), 2>> .err/fstream_test.log, ) ${BUILD_FLAGS} 227 332 vector_test_SOURCES = vector/vector_int.c vector/array.c vector/vector_test.c 333 vector_test_CFLAGS = $(if $(test), 2>> .err/vector_test.log, ) ${BUILD_FLAGS} 228 334 avl_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 335 avl_test_CFLAGS = $(if $(test), 2>> .err/avl_test.log, ) ${BUILD_FLAGS} 229 336 all: all-am 230 337 … … 243 350 $(am__cd) $(top_srcdir) && \ 244 351 $(AUTOMAKE) --foreign src/tests/Makefile 245 .PRECIOUS: Makefile246 352 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 247 353 @case '$?' in \ … … 261 367 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh 262 368 $(am__aclocal_m4_deps): 369 avltree/$(am__dirstamp): 370 @$(MKDIR_P) avltree 371 @: > avltree/$(am__dirstamp) 372 avltree/$(DEPDIR)/$(am__dirstamp): 373 @$(MKDIR_P) avltree/$(DEPDIR) 374 @: > avltree/$(DEPDIR)/$(am__dirstamp) 375 avltree/avl_test-avl_test.$(OBJEXT): avltree/$(am__dirstamp) \ 376 avltree/$(DEPDIR)/$(am__dirstamp) 377 avltree/avl_test-avl0.$(OBJEXT): avltree/$(am__dirstamp) \ 378 avltree/$(DEPDIR)/$(am__dirstamp) 379 avltree/avl_test-avl1.$(OBJEXT): avltree/$(am__dirstamp) \ 380 avltree/$(DEPDIR)/$(am__dirstamp) 381 avltree/avl_test-avl2.$(OBJEXT): avltree/$(am__dirstamp) \ 382 avltree/$(DEPDIR)/$(am__dirstamp) 383 avltree/avl_test-avl3.$(OBJEXT): avltree/$(am__dirstamp) \ 384 avltree/$(DEPDIR)/$(am__dirstamp) 385 avltree/avl_test-avl4.$(OBJEXT): avltree/$(am__dirstamp) \ 386 avltree/$(DEPDIR)/$(am__dirstamp) 387 avltree/avl_test-avl-private.$(OBJEXT): avltree/$(am__dirstamp) \ 388 avltree/$(DEPDIR)/$(am__dirstamp) 389 263 390 avl_test$(EXEEXT): $(avl_test_OBJECTS) $(avl_test_DEPENDENCIES) $(EXTRA_avl_test_DEPENDENCIES) 264 391 @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 266 394 fstream_test$(EXEEXT): $(fstream_test_OBJECTS) $(fstream_test_DEPENDENCIES) $(EXTRA_fstream_test_DEPENDENCIES) 267 395 @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) 397 vector/$(am__dirstamp): 398 @$(MKDIR_P) vector 399 @: > vector/$(am__dirstamp) 400 vector/$(DEPDIR)/$(am__dirstamp): 401 @$(MKDIR_P) vector/$(DEPDIR) 402 @: > vector/$(DEPDIR)/$(am__dirstamp) 403 vector/vector_test-vector_int.$(OBJEXT): vector/$(am__dirstamp) \ 404 vector/$(DEPDIR)/$(am__dirstamp) 405 vector/vector_test-array.$(OBJEXT): vector/$(am__dirstamp) \ 406 vector/$(DEPDIR)/$(am__dirstamp) 407 vector/vector_test-vector_test.$(OBJEXT): vector/$(am__dirstamp) \ 408 vector/$(DEPDIR)/$(am__dirstamp) 409 269 410 vector_test$(EXEEXT): $(vector_test_OBJECTS) $(vector_test_DEPENDENCIES) $(EXTRA_vector_test_DEPENDENCIES) 270 411 @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) 272 413 273 414 mostlyclean-compile: 274 415 -rm -f *.$(OBJEXT) 416 -rm -f avltree/*.$(OBJEXT) 417 -rm -f vector/*.$(OBJEXT) 275 418 276 419 distclean-compile: 277 420 -rm -f *.tab.c 278 421 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@ 290 433 291 434 .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 294 438 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ 295 439 @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 $@ $< 297 441 298 442 .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 301 446 @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ 302 447 @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 450 avltree/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 457 avltree/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 464 avltree/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 471 avltree/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 478 avltree/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 485 avltree/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 492 avltree/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 499 avltree/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 506 avltree/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 513 avltree/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 520 avltree/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 527 avltree/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 534 avltree/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 541 avltree/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 548 fstream_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 555 fstream_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 562 vector/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 569 vector/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 576 vector/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 583 vector/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 590 vector/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 597 vector/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 604 ID: $(am__tagged_files) 605 $(am__define_uniq_tagged_files); mkid -fID $$unique 606 tags: tags-am 607 TAGS: tags 608 609 tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 457 610 set x; \ 458 611 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); \ 465 613 shift; \ 466 614 if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ … … 474 622 fi; \ 475 623 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; }; }'`; \ 624 ctags: ctags-am 625 626 CTAGS: ctags 627 ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 628 $(am__define_uniq_tagged_files); \ 485 629 test -z "$(CTAGS_ARGS)$$unique" \ 486 630 || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ … … 491 635 && $(am__cd) $(top_srcdir) \ 492 636 && gtags -i $(GTAGS_ARGS) "$$here" 637 cscopelist: cscopelist-am 638 639 cscopelist-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 493 652 494 653 distclean-tags: … … 555 714 -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) 556 715 -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) 557 720 558 721 maintainer-clean-generic: … … 564 727 565 728 distclean: distclean-am 566 -rm -rf ./$(DEPDIR) 729 -rm -rf ./$(DEPDIR) avltree/$(DEPDIR) vector/$(DEPDIR) 567 730 -rm -f Makefile 568 731 distclean-am: clean-am distclean-compile distclean-generic \ … … 610 773 611 774 maintainer-clean: maintainer-clean-am 612 -rm -rf ./$(DEPDIR) 775 -rm -rf ./$(DEPDIR) avltree/$(DEPDIR) vector/$(DEPDIR) 613 776 -rm -f Makefile 614 777 maintainer-clean-am: distclean-am maintainer-clean-generic … … 630 793 .MAKE: install-am install-strip 631 794 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 644 809 645 810 … … 665 830 666 831 % : %.c @CFA_BINDIR@/@CFA_NAME@ 667 ${CC} ${ CFLAGS} ${<} -o ${@}832 ${CC} ${AM_CFLAGS} ${CFLAGS} ${<} -o ${@} 668 833 669 834 dtor-early-exit-ERR1: dtor-early-exit.c @CFA_BINDIR@/@CFA_NAME@ 670 ${CC} ${ CFLAGS} -DERR1 ${<} -o ${@}835 ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@} 671 836 672 837 dtor-early-exit-ERR2: dtor-early-exit.c @CFA_BINDIR@/@CFA_NAME@ 673 ${CC} ${ CFLAGS} -DERR2 ${<} -o ${@}838 ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR2 ${<} -o ${@} 674 839 675 840 declarationSpecifier: 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 ${@} 677 842 678 843 gccExtensions : 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 ${@} 680 845 681 846 extension : 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 ${@} 683 848 684 849 attributes : 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 ${@} 686 851 687 852 KRfunctions : 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 ${@} 689 854 690 855 gmp : gmp.c @CFA_BINDIR@/@CFA_NAME@ 691 ${CC} ${ CFLAGS} -lgmp ${<} -o ${@}856 ${CC} ${AM_CFLAGS} ${CFLAGS} -lgmp ${<} -o ${@} 692 857 693 858 memberCtors-ERR1: memberCtors.c @CFA_BINDIR@/@CFA_NAME@ 694 ${CC} ${ CFLAGS} -DERR1 ${<} -o ${@}859 ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@} 695 860 696 861 completeTypeError : completeTypeError.c @CFA_BINDIR@/@CFA_NAME@ 697 ${CC} ${ CFLAGS} -DERR1 ${<} -o ${@}862 ${CC} ${AM_CFLAGS} ${CFLAGS} -DERR1 ${<} -o ${@} 698 863 699 864 # Tell versions [3.59,3.63) of GNU make to not export all variables. -
src/tests/gmp.c
rfea3faa rb826e6b 10 10 // Created On : Tue Apr 19 08:55:51 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed May 24 22:05:38201713 // Update Count : 54 012 // Last Modified On : Thu Jul 13 16:35:01 2017 13 // Update Count : 541 14 14 // 15 15 … … 95 95 // Local Variables: // 96 96 // tab-width: 4 // 97 // compile-command: "cfa gmp.c -l 97 // compile-command: "cfa gmp.c -lgmp" // 98 98 // End: // -
src/tests/io.c
rfea3faa rb826e6b 10 10 // Created On : Wed Mar 2 16:56:02 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Ju n 8 09:52:10201713 // Update Count : 5112 // Last Modified On : Thu Jul 6 23:26:12 2017 13 // Update Count : 78 14 14 // 15 15 … … 42 42 sout | endl; 43 43 44 sout | "opening delimiters" | endl; 44 45 sout 45 // opening delimiters46 46 | "x (" | 1 47 47 | "x [" | 2 … … 54 54 | "x ¿" | 9 55 55 | "x «" | 10 56 | endl; 56 | endl | endl; 57 58 sout | "closing delimiters" | endl; 57 59 sout 58 // closing delimiters59 60 | 1 | ", x" 60 61 | 2 | ". x" … … 68 69 | 10 | "] x" 69 70 | 11 | "} x" 70 | endl; 71 | endl | endl; 72 73 sout | "opening/closing delimiters" | endl; 71 74 sout 72 // opening-closing delimiters73 75 | "x`" | 1 | "`x'" | 2 74 76 | "'x\"" | 3 | "\"x:" | 4 … … 76 78 | "\tx\f" | 7 | "\fx\v" | 8 77 79 | "\vx\n" | 9 | "\nx\r" | 10 78 | "\rx" | 79 endl; 80 | "\rx" 81 | endl | endl; 82 83 sout | "override opening/closing delimiters" | endl; 80 84 sout | "x ( " | 1 | " ) x" | 2 | " , x" | 3 | " :x: " | 4 | endl; 85 sout | endl; 81 86 82 87 ifstream in; // create / open file 83 88 open( &in, "io.data", "r" ); 84 89 90 sout | "input bacis types" | endl; 85 91 &in | &c // character 86 92 | &si | &usi | &i | &ui | &li | &uli | &lli | &ulli // integral … … 88 94 | &fc | &dc | &ldc // floating-point complex 89 95 | cstr( s1 ) | cstr( s2, size ); // C string, length unchecked and checked 96 sout | endl; 90 97 98 sout | "output basic types" | endl; 91 99 sout | c | ' ' | endl // character 92 100 | si | usi | i | ui | li | uli | lli | ulli | endl // integral … … 94 102 | fc | dc | ldc | endl; // complex 95 103 sout | endl; 96 sout | f | "" | d | "" | ld | endl // floating point without separator 97 | sepDisable | fc | dc | ldc | sepEnable | endl // complex without separator98 | sepOn | s1 | sepOff | s2 | endl // local separator removal99 | s1 | "" | s2 | endl; // C string without separator104 105 sout | "tuples" | endl; 106 [int, [ int, int ] ] t1 = [ 1, [ 2, 3 ] ], t2 = [ 4, [ 5, 6 ] ]; 107 sout | t1 | t2 | endl; // print tuple 100 108 sout | endl; 101 109 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 | "\""; 102 122 sepSet( sout, ", $" ); // change separator, maximum of 15 characters 123 sout | " to \"" | sep | "\"" | endl; 103 124 sout | f | d | ld | endl 104 125 | 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 106 136 sout | endl; 107 137 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; 110 145 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; 120 147 sout | sepDisable | 1 | 2 | 3 | endl; // globally turn off implicit separation 121 148 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; 123 158 124 159 sepSetTuple( sout, " " ); // set tuple separator from ", " to " " 125 sout | t1 | t2 | " \"" | sep GetTuple( sout )| "\"" | endl;160 sout | t1 | t2 | " \"" | sep | "\"" | endl; 126 161 sepSetTuple( sout, ", " ); // reset tuple separator to ", " 127 sout | t1 | t2 | " \"" | sepGetTuple( sout ) | "\"" | endl; 128 162 sout | t1 | t2 | " \"" | sep | "\"" | endl; 129 163 sout | t1 | t2 | endl; // print tuple 164 sout | endl; 130 165 131 166 [int, int, const char *, double] t3 = { 3, 4, "a", 7.2 }; -
src/tests/preempt_longrun/Makefile.am
rfea3faa rb826e6b 10 10 ## Author : Thierry Delisle 11 11 ## 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 : 14 14 ## Update Count : 0 15 15 ############################################################################### 16 16 17 17 repeats=10 18 max_time=10 19 N=10ul 20 preempt=10_000ul 18 max_time=600 19 preempt=1_000ul 21 20 22 21 REPEAT = ${abs_top_srcdir}/tools/repeat -s 23 22 24 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -D N=${N} -DPREEMPTION_RATE=${preempt}23 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -DPREEMPTION_RATE=${preempt} 25 24 CFLAGS = ${BUILD_FLAGS} 26 25 CC = @CFA_BINDIR@/@CFA_NAME@ 27 26 28 TESTS = barge block create disjoint processor stack wait yield27 TESTS = barge block create disjoint enter enter3 processor stack wait yield 29 28 30 29 .INTERMEDIATE: ${TESTS} 31 30 32 31 all-local: ${TESTS:=.run} 32 33 clean-local: 34 rm -f ${TESTS} 33 35 34 36 % : %.c ${CC} -
src/tests/preempt_longrun/Makefile.in
rfea3faa rb826e6b 1 # Makefile.in generated by automake 1.1 1.3from Makefile.am.1 # Makefile.in generated by automake 1.15 from Makefile.am. 2 2 # @configure_input@ 3 3 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 7 6 # This Makefile.in is free software; the Free Software Foundation 8 7 # gives unlimited permission to copy and/or distribute it, … … 19 18 ############################################################################### 20 19 VPATH = @srcdir@ 20 am__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 } 31 am__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 73 am__make_dryrun = (target_option=n; $(am__make_running_with_option)) 74 am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 21 75 pkgdatadir = $(datadir)/@PACKAGE@ 22 76 pkgincludedir = $(includedir)/@PACKAGE@ … … 38 92 host_triplet = @host@ 39 93 subdir = src/tests/preempt_longrun 40 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in41 94 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 42 95 am__aclocal_m4_deps = $(top_srcdir)/configure.ac 43 96 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ 44 97 $(ACLOCAL_M4) 98 DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) 45 99 mkinstalldirs = $(install_sh) -d 46 100 CONFIG_HEADER = $(top_builddir)/config.h 47 101 CONFIG_CLEAN_FILES = 48 102 CONFIG_CLEAN_VPATH_FILES = 103 AM_V_P = $(am__v_P_@AM_V@) 104 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) 105 am__v_P_0 = false 106 am__v_P_1 = : 49 107 AM_V_GEN = $(am__v_GEN_@AM_V@) 50 108 am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) 51 am__v_GEN_0 = @echo " GEN " $@; 109 am__v_GEN_0 = @echo " GEN " $@; 110 am__v_GEN_1 = 52 111 AM_V_at = $(am__v_at_@AM_V@) 53 112 am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) 54 113 am__v_at_0 = @ 114 am__v_at_1 = 55 115 SOURCES = 56 116 DIST_SOURCES = 57 am__tty_colors = \ 58 red=; grn=; lgn=; blu=; std= 117 am__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 122 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) 123 am__tty_colors_dummy = \ 124 mgn= red= grn= lgn= blu= brg= std=; \ 125 am__color_tests=no 126 am__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 } 145 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; 146 am__vpath_adj = case $$p in \ 147 $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ 148 *) f=$$p;; \ 149 esac; 150 am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; 151 am__install_max = 40 152 am__nobase_strip_setup = \ 153 srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` 154 am__nobase_strip = \ 155 for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" 156 am__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] }' 163 am__base_list = \ 164 sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ 165 sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' 166 am__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 } 172 am__recheck_rx = ^[ ]*:recheck:[ ]* 173 am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* 174 am__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". 178 am__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. 205 am__create_global_log = $(AWK) ' \ 206 function fatal(msg) \ 207 { \ 208 print "fatal: making $@: " msg | "cat >&2"; \ 209 exit 1; \ 210 } \ 211 function 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. 250 am__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. 254 am__sh_e_setup = case $$- in *e*) set +e;; esac 255 # Default flags passed to test drivers. 256 am__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). 267 am__check_pre = \ 268 $(am__sh_e_setup); \ 269 $(am__vpath_adj_setup) $(am__vpath_adj) \ 270 $(am__tty_colors); \ 271 srcdir=$(srcdir); export srcdir; \ 272 case "$@" in \ 273 */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ 274 *) am__odir=.;; \ 275 esac; \ 276 test "x$$am__odir" = x"." || test -d "$$am__odir" \ 277 || $(MKDIR_P) "$$am__odir" || exit $$?; \ 278 if test -f "./$$f"; then dir=./; \ 279 elif test -f "$$f"; then dir=; \ 280 else dir="$(srcdir)/"; fi; \ 281 tst=$$dir$$f; log='$@'; \ 282 if test -n '$(DISABLE_HARD_ERRORS)'; then \ 283 am__enable_hard_errors=no; \ 284 else \ 285 am__enable_hard_errors=yes; \ 286 fi; \ 287 case " $(XFAIL_TESTS) " in \ 288 *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ 289 am__expect_failure=yes;; \ 290 *) \ 291 am__expect_failure=no;; \ 292 esac; \ 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'. 301 am__set_TESTS_bases = \ 302 bases='$(TEST_LOGS)'; \ 303 bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ 304 bases=`echo $$bases` 305 RECHECK_LOGS = $(TEST_LOGS) 306 AM_RECURSIVE_TARGETS = check recheck 307 TEST_SUITE_LOG = test-suite.log 308 TEST_EXTENSIONS = @EXEEXT@ .test 309 LOG_DRIVER = $(SHELL) $(top_srcdir)/automake/test-driver 310 LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) 311 am__set_b = \ 312 case '$@' in \ 313 */*) \ 314 case '$*' in \ 315 */*) b='$*';; \ 316 *) b=`echo '$@' | sed 's/\.log$$//'`; \ 317 esac;; \ 318 *) \ 319 b='$*';; \ 320 esac 321 am__test_logs1 = $(TESTS:=.log) 322 am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) 323 TEST_LOGS = $(am__test_logs2:.test.log=.log) 324 TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/automake/test-driver 325 TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ 326 $(TEST_LOG_FLAGS) 327 am__DIST_COMMON = $(srcdir)/Makefile.in \ 328 $(top_srcdir)/automake/test-driver 59 329 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 60 330 ACLOCAL = @ACLOCAL@ … … 169 439 program_transform_name = @program_transform_name@ 170 440 psdir = @psdir@ 441 runstatedir = @runstatedir@ 171 442 sbindir = @sbindir@ 172 443 sharedstatedir = @sharedstatedir@ … … 178 449 top_srcdir = @top_srcdir@ 179 450 repeats = 10 180 max_time = 10 181 N = 10ul 182 preempt = 10_000ul 451 max_time = 600 452 preempt = 1_000ul 183 453 REPEAT = ${abs_top_srcdir}/tools/repeat -s 184 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -D N=${N} -DPREEMPTION_RATE=${preempt}185 TESTS = barge block create disjoint processor stack wait yield454 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -DPREEMPTION_RATE=${preempt} 455 TESTS = barge block create disjoint enter enter3 processor stack wait yield 186 456 all: all-am 187 457 188 458 .SUFFIXES: 459 .SUFFIXES: .log .test .test$(EXEEXT) .trs 189 460 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) 190 461 @for dep in $?; do \ … … 199 470 $(am__cd) $(top_srcdir) && \ 200 471 $(AUTOMAKE) --foreign src/tests/preempt_longrun/Makefile 201 .PRECIOUS: Makefile202 472 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status 203 473 @case '$?' in \ … … 217 487 cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh 218 488 $(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; \ 489 tags TAGS: 490 491 ctags CTAGS: 492 493 cscope 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=''. 506 am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) 507 am--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; \ 260 563 else \ 261 skip=`expr $$skip + 1`; \ 262 col=$$blu; res=SKIP; \ 564 echo "$@: invalid 'result_count' usage" >&2; exit 4; \ 263 565 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; \ 276 570 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=; \ 279 572 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 616 check-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 $$?; 626 recheck: 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 $$? 637 barge.log: barge 638 @p='barge'; \ 639 b='barge'; \ 640 $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ 641 --log-file $$b.log --trs-file $$b.trs \ 642 $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ 643 "$$tst" $(AM_TESTS_FD_REDIRECT) 644 block.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) 651 create.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) 658 disjoint.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) 665 enter.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) 672 enter3.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) 679 processor.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) 686 stack.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) 693 wait.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) 700 yield.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) 318 721 319 722 distdir: $(DISTFILES) … … 372 775 fi 373 776 mostlyclean-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) 374 780 375 781 clean-generic: … … 384 790 clean: clean-am 385 791 386 clean-am: clean-generic mostlyclean-am792 clean-am: clean-generic clean-local mostlyclean-am 387 793 388 794 distclean: distclean-am … … 451 857 452 858 .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 462 871 463 872 … … 465 874 466 875 all-local: ${TESTS:=.run} 876 877 clean-local: 878 rm -f ${TESTS} 467 879 468 880 % : %.c ${CC} -
src/tests/preempt_longrun/create.c
rfea3faa rb826e6b 10 10 } 11 11 12 thread Worker{};12 thread worker_t {}; 13 13 14 void main( Worker* this) {}14 void main(worker_t * this) {} 15 15 16 16 int 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]; 19 20 } 20 21 } -
src/tests/preempt_longrun/processor.c
rfea3faa rb826e6b 10 10 } 11 11 12 thread Worker{};12 thread worker_t {}; 13 13 14 void main( Worker* this) {}14 void main(worker_t * this) {} 15 15 16 16 int main(int argc, char* argv[]) { 17 for(int i = 0; i < 10 0_000ul; i++) {17 for(int i = 0; i < 10_000ul; i++) { 18 18 processor p; 19 19 } -
src/tests/preempt_longrun/stack.c
rfea3faa rb826e6b 12 12 } 13 13 14 thread Worker{};14 thread worker_t {}; 15 15 16 void main( Worker* this) {16 void main(worker_t * this) { 17 17 volatile long p = 5_021_609ul; 18 18 volatile long a = 326_417ul; 19 19 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; 23 23 } 24 24 25 25 if( n != a ) { 26 26 abort(); … … 28 28 } 29 29 30 extern "C" { 31 static worker_t * workers; 32 } 33 30 34 int main(int argc, char* argv[]) { 31 35 processor p; 32 36 { 33 Worker w[7]; 37 worker_t w[7]; 38 workers = w; 34 39 } 35 40 } -
src/tests/preempt_longrun/yield.c
rfea3faa rb826e6b 10 10 } 11 11 12 thread Worker{};12 thread worker_t {}; 13 13 14 void main( Worker* this) {15 for(int i = 0; i < 100_000ul; i++) {14 void main(worker_t * this) { 15 for(int i = 0; i < 325_000ul; i++) { 16 16 yield(); 17 17 } 18 } 19 20 extern "C" { 21 static worker_t * workers; 18 22 } 19 23 … … 21 25 processor p; 22 26 { 23 Worker w[7]; 27 worker_t w[7]; 28 workers = w; 24 29 } 25 30 } -
src/tests/sched-int-barge.c
rfea3faa rb826e6b 4 4 #include <stdlib> 5 5 #include <thread> 6 7 #ifndef N 8 #define N 100_000 9 #endif 6 10 7 11 enum state_t { WAIT, SIGNAL, BARGE }; … … 73 77 } 74 78 75 if( c->counter >= 100_000) c->done = true;79 if( c->counter >= N ) c->done = true; 76 80 return !c->done; 77 81 } -
src/tests/sched-int-block.c
rfea3faa rb826e6b 6 6 7 7 #ifndef N 8 #define N 10 0_0008 #define N 10_000 9 9 #endif 10 10 … … 31 31 //------------------------------------------------------------------------------ 32 32 void 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 ); 34 34 35 35 yield( ((unsigned)rand48()) % 10 ); … … 40 40 } 41 41 42 a->last_thread = b->last_thread = this_thread ();42 a->last_thread = b->last_thread = this_thread; 43 43 44 44 yield( ((unsigned)rand48()) % 10 ); … … 56 56 yield( ((unsigned)rand48()) % 10 ); 57 57 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; 59 59 60 60 if( !is_empty( &cond ) ) { … … 86 86 //------------------------------------------------------------------------------ 87 87 void barge_op( global_data_t * mutex a ) { 88 a->last_thread = this_thread ();88 a->last_thread = this_thread; 89 89 } 90 90 -
src/tests/sched-int-disjoint.c
rfea3faa rb826e6b 5 5 6 6 #ifndef N 7 #define N 10 0_0007 #define N 10_000 8 8 #endif 9 9 … … 42 42 43 43 void main( Barger * this ) { 44 while( !all_done ) { 44 while( !all_done ) { 45 45 barge( &data ); 46 yield(); 46 yield(); 47 47 } 48 48 } … … 53 53 wait( &cond ); 54 54 if( d->state != SIGNAL ) { 55 sout | "ERROR barging!" | endl; 55 sout | "ERROR barging!" | endl; 56 56 } 57 57 … … 85 85 bool running = data.counter < N && data.counter > 0; 86 86 if( data.state != SIGNAL && running ) { 87 sout | "ERROR Eager signal" | data.state | endl; 87 sout | "ERROR Eager signal" | data.state | endl; 88 88 } 89 89 } … … 92 92 93 93 void main( Signaller * this ) { 94 while( !all_done ) { 94 while( !all_done ) { 95 95 logic( &mut ); 96 yield(); 96 yield(); 97 97 } 98 98 } … … 111 111 sout | "All waiter done" | endl; 112 112 all_done = true; 113 } 113 } 114 114 } -
src/tests/sched-int-wait.c
rfea3faa rb826e6b 50 50 unsigned action = (unsigned)rand48() % 4; 51 51 switch( action ) { 52 case 0: 52 case 0: 53 53 signal( &condABC, &globalA, &globalB, &globalC ); 54 54 break; 55 case 1: 55 case 1: 56 56 signal( &condAB , &globalA, &globalB ); 57 57 break; 58 case 2: 58 case 2: 59 59 signal( &condBC , &globalB, &globalC ); 60 60 break; 61 case 3: 61 case 3: 62 62 signal( &condAC , &globalA, &globalC ); 63 63 break; … … 67 67 } 68 68 yield(); 69 } 69 } 70 70 } 71 71 -
src/tests/test.py
rfea3faa rb826e6b 161 161 162 162 # 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 ) 164 164 165 165 options = "-debug" if debug else "-nodebug" 166 166 167 167 # 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) 169 169 170 170 retcode = 0 … … 202 202 error = myfile.read() 203 203 204 204 205 205 # clean the executable 206 206 sh("rm -f %s > /dev/null 2>&1" % test.name, dry_run) … … 221 221 if retcode == TestResult.SUCCESS: result_txt = "Done" 222 222 elif retcode == TestResult.TIMEOUT: result_txt = "TIMEOUT" 223 else : result_txt = "ERROR "223 else : result_txt = "ERROR code %d" % retcode 224 224 else : 225 225 if retcode == TestResult.SUCCESS: result_txt = "PASSED" 226 226 elif retcode == TestResult.TIMEOUT: result_txt = "TIMEOUT" 227 else : result_txt = "FAILED "227 else : result_txt = "FAILED with code %d" % retcode 228 228 229 229 #print result with error if needed -
src/tests/thread.c
rfea3faa rb826e6b 4 4 #include <thread> 5 5 6 // thread First;7 // void main(First* this);6 thread First { semaphore* lock; }; 7 thread Second { semaphore* lock; }; 8 8 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; } 9 void ?{}( First * this, semaphore* lock ) { this->lock = lock; } 10 void ?{}( Second * this, semaphore* lock ) { this->lock = lock; } 17 11 18 12 void main(First* this) { … … 21 15 yield(); 22 16 } 23 signal(this->lock);17 V(this->lock); 24 18 } 25 19 26 20 void main(Second* this) { 27 wait(this->lock);21 P(this->lock); 28 22 for(int i = 0; i < 10; i++) { 29 23 sout | "Second : Suspend No." | i + 1 | endl; … … 34 28 35 29 int main(int argc, char* argv[]) { 36 s ignal_once lock;30 semaphore lock = { 0 }; 37 31 sout | "User main begin" | endl; 38 32 { -
tools/cfa.nanorc
rfea3faa rb826e6b 2 2 ## WIP 3 3 4 syntax "cfa" "\.cfa$" 5 ## No magic 4 syntax "cfa" "\.cfa" 6 5 7 6 # Macros … … 19 18 # Control Flow Structures 20 19 color brightyellow "\<(if|else|while|do|for|switch|choose|case|default)\>" 21 ##color brightyellow "\<(try|catch|catchResume|finally)\>"20 color brightyellow "\<(try|catch(Resume)?|finally)\>" 22 21 23 22 # Control Flow Statements 24 color magenta "\<( return|break|continue|fallthru|throw)\>"23 color magenta "\<(goto|return|break|continue|fallthr(u|ough)|throw(Resume)?)\>" 25 24 26 25 # Operator Names … … 46 45 color brightmagenta "'\\(([0-3]?[0-7]{1,2}))'" "'\\x[0-9A-Fa-f]{1,2}'" 47 46 # Strings and Angle Strings 48 color brightyellow ""([^"]|\\")*"" "<[^[:blank:]=]*>"47 color yellow ""([^"]|\\")*"" "<[^[:blank:]=]*>" 49 48 # Multiline Strings: This regex is VERY expencive and often too strong. 50 49 ###color brightyellow start=""(\\.|[^"])*\\[[:space:]]*$" end="^(\\.|[^"])*""
Note:
See TracChangeset
for help on using the changeset viewer.