Changes in / [3d5701e:9fb8f01]


Ignore:
Files:
36 added
100 deleted
267 edited

Legend:

Unmodified
Added
Removed
  • .gitignore

    r3d5701e r9fb8f01  
    2121.deps
    2222.dirstamp
    23 /bin
    24 /lib
    25 /include
    26 /share
    27 /build
     23bin
     24lib
     25include
     26share
     27build
    2828*.class
    2929
  • Jenkins/FullBuild

    r3d5701e r9fb8f01  
    1717
    1818                                parallel (
    19                                         clang_x86: { trigger_build( 'gcc-8',   'x86' ) },
    20                                         gcc_5_x86: { trigger_build( 'gcc-7',   'x86' ) },
     19                                        gcc_6_x64: { trigger_build( 'gcc-6',   'x64' ) },
    2120                                        gcc_6_x86: { trigger_build( 'gcc-6',   'x86' ) },
    22                                         gcc_9_x64: { trigger_build( 'gcc-9',   'x64' ) },
    23                                         gcc_8_x64: { trigger_build( 'gcc-8',   'x64' ) },
    24                                         gcc_7_x64: { trigger_build( 'gcc-7',   'x64' ) },
    25                                         gcc_6_x64: { trigger_build( 'gcc-6',   'x64' ) },
    2621                                        gcc_5_x64: { trigger_build( 'gcc-5',   'x64' ) },
     22                                        gcc_5_x86: { trigger_build( 'gcc-5',   'x86' ) },
    2723                                        clang_x64: { trigger_build( 'clang',   'x64' ) },
     24                                        clang_x86: { trigger_build( 'clang',   'x86' ) },
    2825                                )
    2926                        }
  • Jenkinsfile

    r3d5701e r9fb8f01  
    102102
    103103                echo GitLogMessage()
    104 
    105                 // This is a complete hack but it solves problems with automake thinking it needs to regenerate makefiles
    106                 // We fudged automake/missing to handle that but automake stills bakes prints inside the makefiles
    107                 // and these cause more problems.
    108                 sh 'find . -name Makefile.in -exec touch {} +'
    109104        }
    110105}
     
    160155
    161156def test() {
    162         try {
    163                 build_stage('Test: short', !Settings.RunAllTests) {
    164                         dir (BuildDir) {
    165                                 //Run the tests from the tests directory
    166                                 sh "make --no-print-directory -C tests archiveerrors=${BuildDir}/tests/crashes/short"
    167                         }
    168                 }
    169 
    170                 build_stage('Test: full', Settings.RunAllTests) {
    171                         dir (BuildDir) {
    172                                         //Run the tests from the tests directory
    173                                         sh """make --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" all-tests debug=yes archiveerrors=${BuildDir}/tests/crashes/full-debug"""
    174                                         sh """make --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" all-tests debug=no  archiveerrors=${BuildDir}/tests/crashes/full-nodebug"""
    175                         }
    176                 }
    177         }
    178         catch (Exception err) {
    179                 echo "Archiving core dumps"
    180                 dir (BuildDir) {
    181                         archiveArtifacts artifacts: "tests/crashes/**/*", fingerprint: true
    182                 }
    183                 throw err
     157        build_stage('Test: short', !Settings.RunAllTests) {
     158                dir (BuildDir) {
     159                        //Run the tests from the tests directory
     160                        sh 'make --no-print-directory -C tests'
     161                }
     162        }
     163
     164        build_stage('Test: full', Settings.RunAllTests) {
     165                dir (BuildDir) {
     166                        //Run the tests from the tests directory
     167                        sh 'make --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" all-tests debug=yes'
     168                        sh 'make --no-print-directory -C tests timeouts="--timeout=600 --global-timeout=14400" all-tests debug=no '
     169                }
    184170        }
    185171}
     
    215201
    216202                //Then publish the results
    217                 do_plot(Settings.RunBenchmark && Settings.Publish, 'compile'        , groupCompile    , false, 'Compilation')
    218                 do_plot(Settings.RunBenchmark && Settings.Publish, 'compile.diff'   , groupCompile    , true , 'Compilation (relative)')
    219                 do_plot(Settings.RunBenchmark && Settings.Publish, 'ctxswitch'      , groupConcurrency, false, 'Context Switching')
    220                 do_plot(Settings.RunBenchmark && Settings.Publish, 'ctxswitch.diff' , groupConcurrency, true , 'Context Switching (relative)')
    221                 do_plot(Settings.RunBenchmark && Settings.Publish, 'mutex'          , groupConcurrency, false, 'Mutual Exclusion')
    222                 do_plot(Settings.RunBenchmark && Settings.Publish, 'mutex.diff'     , groupConcurrency, true , 'Mutual Exclusion (relative)')
    223                 do_plot(Settings.RunBenchmark && Settings.Publish, 'scheduling'     , groupConcurrency, false, 'Internal and External Scheduling')
    224                 do_plot(Settings.RunBenchmark && Settings.Publish, 'scheduling.diff', groupConcurrency, true , 'Internal and External Scheduling (relative)')
     203                do_plot(Settings.RunBenchmark && Settings.Publish, 'compile'       , groupCompile    , false, 'Compilation')
     204                do_plot(Settings.RunBenchmark && Settings.Publish, 'compile.diff'  , groupCompile    , true , 'Compilation (relative)')
     205                do_plot(Settings.RunBenchmark && Settings.Publish, 'ctxswitch'     , groupConcurrency, false, 'Context Switching')
     206                do_plot(Settings.RunBenchmark && Settings.Publish, 'ctxswitch.diff', groupConcurrency, true , 'Context Switching (relative)')
     207                do_plot(Settings.RunBenchmark && Settings.Publish, 'mutex'         , groupConcurrency, false, 'Mutual Exclusion')
     208                do_plot(Settings.RunBenchmark && Settings.Publish, 'mutex.diff'    , groupConcurrency, true , 'Mutual Exclusion (relative)')
     209                do_plot(Settings.RunBenchmark && Settings.Publish, 'signal'        , groupConcurrency, false, 'Internal and External Scheduling')
     210                do_plot(Settings.RunBenchmark && Settings.Publish, 'signal.diff'   , groupConcurrency, true , 'Internal and External Scheduling (relative)')
    225211        }
    226212}
     
    229215//Routine responsible of sending the email notification once the build is completed
    230216//===========================================================================================================
    231 @NonCPS
    232 def SplitLines(String text) {
    233         def list = []
    234 
    235         text.eachLine {
    236                 list += it
    237         }
    238 
    239         return list
    240 }
    241 
    242217def GitLogMessage() {
    243218        if (!Settings || !Settings.GitOldRef || !Settings.GitNewRef) return "\nERROR retrieveing git information!\n"
    244219
    245         def oldRef = Settings.GitOldRef
    246         def newRef = Settings.GitNewRef
    247 
    248         def revText = sh(returnStdout: true, script: "git rev-list ${oldRef}..${newRef}").trim()
    249         def revList = SplitLines( revText )
    250 
    251         def gitUpdate = ""
    252         revList.each { rev ->
    253                 def type = sh(returnStdout: true, script: "git cat-file -t ${rev}").trim()
    254                 gitUpdate = gitUpdate + "       via  ${rev} (${type})"
    255         }
    256 
    257         def rev = oldRef
    258         def type = sh(returnStdout: true, script: "git cat-file -t ${rev}").trim()
    259         gitUpdate = gitUpdate + "      from  ${rev} (${type})"
    260 
    261         def gitLog    = sh(returnStdout: true, script: "git rev-list --format=short ${oldRef}...${newRef}").trim()
    262 
    263         def gitDiff   = sh(returnStdout: true, script: "git diff --stat --color ${newRef} ${oldRef}").trim()
    264         gitDiff = gitDiff.replace('[32m', '<span style="color: #00AA00;">')
    265         gitDiff = gitDiff.replace('[31m', '<span style="color: #AA0000;">')
    266         gitDiff = gitDiff.replace('[m', '</span>')
     220        sh "${SrcDir}/tools/PrettyGitLogs.sh ${SrcDir} ${BuildDir} ${Settings.GitOldRef} ${Settings.GitNewRef}"
     221
     222        def gitUpdate = readFile("${BuildDir}/GIT_UPDATE")
     223        def gitLog    = readFile("${BuildDir}/GIT_LOG")
     224        def gitDiff   = readFile("${BuildDir}/GIT_DIFF")
    267225
    268226        return """
     
    363321        BuildSettings(java.util.Collections$UnmodifiableMap param, String branch) {
    364322                switch( param.Compiler ) {
    365                         case 'gcc-9':
    366                                 this.Compiler = new CC_Desc('gcc-9', 'g++-9', 'gcc-9')
    367                         break
    368                         case 'gcc-8':
    369                                 this.Compiler = new CC_Desc('gcc-8', 'g++-8', 'gcc-8')
    370                         break
    371                         case 'gcc-7':
    372                                 this.Compiler = new CC_Desc('gcc-7', 'g++-7', 'gcc-7')
    373                         break
    374323                        case 'gcc-6':
    375324                                this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6')
     
    382331                        break
    383332                        case 'clang':
    384                                 this.Compiler = new CC_Desc('clang', 'clang++-6.0', 'gcc-6')
     333                                this.Compiler = new CC_Desc('clang', 'clang++', 'gcc-6')
    385334                        break
    386335                        default :
     
    444393                                        description: 'Which compiler to use',                                   \
    445394                                        name: 'Compiler',                                                                       \
    446                                         choices: 'gcc-9\ngcc-8\ngcc-7\ngcc-6\ngcc-5\ngcc-4.9\nclang',                                   \
    447                                         defaultValue: 'gcc-8',                                                          \
     395                                        choices: 'gcc-6\ngcc-5\ngcc-4.9\nclang',                                        \
     396                                        defaultValue: 'gcc-6',                                                          \
    448397                                ],                                                                                              \
    449398                                [$class: 'ChoiceParameterDefinition',                                           \
  • Makefile.in

    r3d5701e r9fb8f01  
    264264CCDEPMODE = @CCDEPMODE@
    265265CFACC = @CFACC@
    266 CFACC_INSTALL = @CFACC_INSTALL@
    267266CFACPP = @CFACPP@
    268267CFA_BACKEND_CC = @CFA_BACKEND_CC@
     
    295294FGREP = @FGREP@
    296295GREP = @GREP@
    297 HAS_DISTCC = @HAS_DISTCC@
    298296HOST_FLAGS = @HOST_FLAGS@
    299297INSTALL = @INSTALL@
  • benchmark/Makefile.am

    r3d5701e r9fb8f01  
    1111## Created On       : Sun May 31 09:08:15 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Sat Jan 25 09:20:44 2020
    14 ## Update Count     : 255
     13## Last Modified On : Mon Jul 29 18:02:19 2019
     14## Update Count     : 54
    1515###############################################################################
    1616
     
    2222
    2323AM_CFLAGS = -O2 -Wall -Wextra -I$(srcdir) -lrt -pthread # -Werror
    24 AM_CFAFLAGS = -quiet -nodebug
     24AM_CFAFLAGS = -quiet -nodebug -in-tree
    2525AM_UPPFLAGS = -quiet -nodebug -multi -std=c++14
    2626
     
    2828BENCH_V_CFA = $(__bench_v_CFA_$(__quiet))
    2929BENCH_V_CXX = $(__bench_v_CXX_$(__quiet))
     30BENCH_V_GOC = $(__bench_v_GOC_$(__quiet))
     31BENCH_V_JAVAC = $(__bench_v_JAVAC_$(__quiet))
    3032BENCH_V_UPP = $(__bench_v_UPP_$(__quiet))
    31 BENCH_V_GOC = $(__bench_v_GOC_$(__quiet))
    32 BENCH_V_PY = $(__bench_v_PY_$(__quiet))
    33 BENCH_V_RUSTC = $(__bench_v_RUSTC_$(__quiet))
    34 BENCH_V_NODEJS = $(__bench_v_NODEJS_$(__quiet))
    35 BENCH_V_JAVAC = $(__bench_v_JAVAC_$(__quiet))
    3633
    3734__quiet = verbose
     
    3936__bench_v_CFA_quiet = @
    4037__bench_v_CXX_quiet = @
     38__bench_v_GOC_quiet = @
     39__bench_v_JAVAC_quiet = @
    4140__bench_v_UPP_quiet = @
    42 __bench_v_GOC_quiet = @
    43 __bench_v_RUSTC_quiet = @
    44 __bench_v_JAVAC_quiet = @
    4541__bench_v_CC_verbose = $(AM_V_CC)
    4642__bench_v_CFA_verbose = $(AM_V_CFA)
    4743__bench_v_CXX_verbose = $(AM_V_CXX)
     44__bench_v_GOC_verbose = $(AM_V_GOC)
     45__bench_v_JAVAC_verbose = $(AM_V_JAVAC)
    4846__bench_v_UPP_verbose = $(AM_V_UPP)
    49 __bench_v_GOC_verbose = $(AM_V_GOC)
    50 __bench_v_PY_verbose = $(AM_V_PY)
    51 __bench_v_RUSTC_verbose = $(AM_V_RUST)
    52 __bench_v_NODEJS_verbose = $(AM_V_NODEJS)
    53 __bench_v_JAVAC_verbose = $(AM_V_JAVAC)
    5447
    5548
     
    5851STATS    = ${abs_top_srcdir}/tools/stat.py
    5952# NEED AT LEAST 4 DATA VALUES FOR BENCHMARKS BECAUSE THE MAX AND MIN VALUES ARE REMOVED
    60 repeats  = 13 # 31 for benchmarks
     53repeats  = 5 # 31 for benchmarks
    6154arch     = x64
    6255skipcompile = no
     
    6962
    7063dummyC.c:
    71         echo "int main() { return 0; }" > ${@}
     64        @echo "int main() { return 0; }" > ${@}
    7265
    7366dummyCXX.cpp:
    74         echo "int main() { return 0; }" > ${@}
    75 
    76 .SILENT:                # do not print recipe
     67        @echo "int main() { return 0; }" > ${@}
     68
    7769.NOTPARALLEL:
    78 .PHONY: jenkins cleancsv
    79 
    80 ## =========================================================================================================
    81 
    82 all : basic$(EXEEXT) ctxswitch$(EXEEXT) mutex$(EXEEXT) schedint$(EXEEXT) schedext$(EXEEXT) creation$(EXEEXT)
    83 
    84 basic_loop_DURATION = 15000000000
    85 basic_function_DURATION = 10000000000
    86 basic_tls_fetch_add_DURATION = 10000000000
    87 basic_DURATION = 250000000
    88 
    89 ctxswitch_pthread_DURATION = 25000000
    90 ctxswitch_rust_thread_DURATION = $(ctxswitch_pthread_DURATION)
    91 ctxswitch_cfa_generator_DURATION = 5000000000
    92 ctxswitch_nodejs_await_DURATION = 5000000
    93 ctxswitch_DURATION = 100000000
    94 
    95 #mutex_java_DURATION = 10000000
    96 mutex_DURATION = 50000000
    97 
    98 schedint_pthread_DURATION = 1000000
    99 schedint_java_DURATION = $(schedint_pthread_DURATION)
    100 schedint_rust_DURATION = $(schedint_pthread_DURATION)
    101 schedint_DURATION = 10000000
    102 
    103 schedext_DURATION = 10000000
    104 
    105 creation_pthread_DURATION = 250000
    106 creation_rust_thread_DURATION = ${creation_pthread_DURATION}
    107 creation_java_thread_DURATION = ${creation_pthread_DURATION}
    108 creation_cfa_coroutine_DURATION = 100000000
    109 creation_cfa_coroutine_eager_DURATION = 10000000
    110 creation_upp_coroutine_DURATION = ${creation_cfa_coroutine_eager_DURATION}
    111 creation_cfa_thread_DURATION = 10000000
    112 creation_upp_thread_DURATION = ${creation_cfa_thread_DURATION}
    113 creation_DURATION = 10000000
     70.PHONY: compile.csv ctxswitch.csv mutex.csv signal.csv
     71
     72## =========================================================================================================
     73all : ctxswitch$(EXEEXT) mutex$(EXEEXT) signal$(EXEEXT) waitfor$(EXEEXT) creation$(EXEEXT)
    11474
    11575%.run : %$(EXEEXT) ${REPEAT}
    116         rm -f .result.log
    117         echo "------------------------------------------------------"
    118         echo $<
    119         ${REPEAT} ${repeats} -- ./a.out\
    120                 $(if ${$(subst -,_,$(basename $@))_DURATION},\
    121                         ${$(subst -,_,$(basename $@))_DURATION},\
    122                         ${$(firstword $(subst -, ,$(basename $@)))_DURATION}) | tee -a .result.log
    123         ${STATS} .result.log
    124         echo "------------------------------------------------------"
    125         rm -f a.out .result.log *.class
    126 
    127 #       ${REPEAT} ${repeats} -- /usr/bin/time -f "%Uu %Ss %Er %Mkb" ./a.out
     76        @rm -f .result.log
     77        @echo "------------------------------------------------------"
     78        @echo $<
     79        @${REPEAT} ${repeats} ./a.out | tee -a .result.log
     80        @${STATS} .result.log
     81        @echo "------------------------------------------------------"
     82        @rm -f a.out .result.log *.class
    12883
    12984%.runquiet :
    130         +make $(basename $@) CFLAGS="-w" __quiet=quiet
    131         taskset -c 1 ./a.out
    132         rm -f a.out
     85        @+make $(basename $@) CFLAGS="-w" __quiet=quiet
     86        @taskset -c 1 ./a.out
     87        @rm -f a.out
    13388
    13489%.make :
    135         printf "${PRINT_FORMAT}" $(basename $(subst compile-,,$@))
    136         +/usr/bin/time -f ${TIME_FORMAT} make $(basename $@) 2>&1
     90        @printf "${PRINT_FORMAT}" $(basename $(subst compile-,,$@))
     91        @+/usr/bin/time -f ${TIME_FORMAT} make $(basename $@) 2>&1
    13792
    13893${REPEAT} :
    139         +make -C ${abs_top_builddir}/tools repeat
     94        @+make -C ${abs_top_builddir}/tools repeat
    14095
    14196## =========================================================================================================
     
    14398FIX_NEW_LINES = cat $@ | tr "\n" "\t" | sed -r 's/\t,/,/' | tr "\t" "\n" > $@
    14499
    145 cleancsv:
    146         rm -f compile.csv basic.csv ctxswitch.csv mutex.csv scheduling.csv
    147 
    148 jenkins$(EXEEXT): cleancsv
     100jenkins$(EXEEXT):
    149101@DOifskipcompile@
    150         +make compile.csv
    151         -+make compile.diff.csv
     102        @+make compile.csv
     103        @-+make compile.diff.csv
    152104@DOendif@
    153         +make ctxswitch.csv
    154         -+make ctxswitch.diff.csv
    155         +make mutex.csv
    156         -+make mutex.diff.csv
    157         +make scheduling.csv
    158         -+make scheduling.diff.csv
     105        @+make ctxswitch.csv
     106        @-+make ctxswitch.diff.csv
     107        @+make mutex.csv
     108        @-+make mutex.diff.csv
     109        @+make signal.csv
     110        @-+make signal.diff.csv
    159111@DOifskipcompile@
    160112        cat compile.csv
     
    165117        cat mutex.csv
    166118        -cat mutex.diff.csv
    167         cat scheduling.csv
    168         -cat scheduling.diff.csv
     119        cat signal.csv
     120        -cat signal.diff.csv
    169121
    170122compile.csv:
    171         echo "building $@"
    172         echo "array,attributes,empty,expression,io,monitor,operators,typeof" > $@
    173         +make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-array.make >> $@
    174         +make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-attributes.make >> $@
    175         +make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-empty.make >> $@
    176         +make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-expression.make >> $@
    177         +make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-io.make >> $@
    178         +make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-monitor.make >> $@
    179         +make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-operators.make >> $@
    180         +make TIME_FORMAT='%e' PRINT_FORMAT='' compile-typeof.make >> $@
    181         $(srcdir)/fixcsv.sh $@
     123        @echo "array,attributes,empty,expression,io,monitor,operators,typeof" > $@
     124        @+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-array.make >> $@
     125        @+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-attributes.make >> $@
     126        @+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-empty.make >> $@
     127        @+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-expression.make >> $@
     128        @+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-io.make >> $@
     129        @+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-monitor.make >> $@
     130        @+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-operators.make >> $@
     131        @+make TIME_FORMAT='%e' PRINT_FORMAT='' compile-typeof.make >> $@
     132        @$(srcdir)/fixcsv.sh $@
    182133
    183134ctxswitch.csv:
    184         echo "building $@"
    185         echo "generator,coroutine,thread" > $@
    186         +make ctxswitch-cfa_generator.runquiet >> $@ && echo -n ',' >> $@
    187         +make ctxswitch-cfa_coroutine.runquiet >> $@ && echo -n ',' >> $@
    188         +make ctxswitch-cfa_thread.runquiet >> $@
    189         $(srcdir)/fixcsv.sh $@
     135        @echo "generator,coroutine,thread" > $@
     136        @+make ctxswitch-cfa_generator.runquiet >> $@ && echo -n ',' >> $@
     137        @+make ctxswitch-cfa_coroutine.runquiet >> $@ && echo -n ',' >> $@
     138        @+make ctxswitch-cfa_thread.runquiet >> $@
     139        @$(srcdir)/fixcsv.sh $@
    190140
    191141mutex.csv:
    192         echo "building $@"
    193         echo "1-monitor,2-monitor" > $@
    194         +make mutex-cfa1.runquiet >> $@ && echo -n ',' >> $@
    195         +make mutex-cfa2.runquiet >> $@
    196         $(srcdir)/fixcsv.sh $@
    197 
    198 scheduling.csv:
    199         echo "building $@"
    200         echo "schedint-1,schedint-2,schedext-1,schedext-2" > $@
    201         +make schedint-cfa1.runquiet >> $@ && echo -n ',' >> $@
    202         +make schedint-cfa2.runquiet >> $@ && echo -n ',' >> $@
    203         +make schedext-cfa1.runquiet >> $@ && echo -n ',' >> $@
    204         +make schedext-cfa2.runquiet >> $@
    205         $(srcdir)/fixcsv.sh $@
     142        @echo "1-monitor,2-monitor" > $@
     143        @+make mutex-cfa1.runquiet >> $@ && echo -n ',' >> $@
     144        @+make mutex-cfa2.runquiet >> $@
     145        @$(srcdir)/fixcsv.sh $@
     146
     147signal.csv:
     148        @echo "signal-1,signal-2,waitfor-1,waitfor-2" > $@
     149        @+make signal-cfa1.runquiet >> $@ && echo -n ',' >> $@
     150        @+make signal-cfa2.runquiet >> $@ && echo -n ',' >> $@
     151        @+make waitfor-cfa1.runquiet >> $@ && echo -n ',' >> $@
     152        @+make waitfor-cfa2.runquiet >> $@
     153        @$(srcdir)/fixcsv.sh $@
    206154
    207155%.diff.csv: %.csv
    208         test -e $(srcdir)/baselines/$(arch)/$< || (echo "Error : Missing baseline for ${<}" && false)
    209         $(srcdir)/baselines/calc.py $(srcdir)/baselines/$(arch)/$(<) $(<) > $@
    210 
    211 ## =========================================================================================================
    212 
    213 BASIC_DEPEND  =                                 \
    214         basic-loop.run                          \
    215         basic-function.run                      \
    216         basic-fetch_add.run                     \
    217         basic-ttst_lock.run                     \
    218         basic-tls-fetch_add.run
    219 
    220 basic-loop$(EXEEXT):
    221         $(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/loop.c
    222 
    223 basic-function$(EXEEXT):
    224         $(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/function.c
    225 
    226 basic-fetch_add$(EXEEXT):
    227         $(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/fetch_add.c
    228 
    229 basic-ttst_lock$(EXEEXT):
    230         $(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/ttst_lock.c
    231 
    232 basic-tls-fetch_add$(EXEEXT):
    233         $(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/tls_fetch_add.c
    234 
    235 basic$(EXEEXT): $(BASIC_DEPEND)
    236 
    237 ## =========================================================================================================
    238 
    239 CTXSWITCH_DEPEND  =                     \
     156        @test -e $(srcdir)/baselines/$(arch)/$< || (echo "Error : Missing baseline for ${<}" && false)
     157        @$(srcdir)/baselines/calc.py $(srcdir)/baselines/$(arch)/$(<) $(<) > $@
     158
     159
     160## =========================================================================================================
     161loop$(EXEEXT):
     162        $(BENCH_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/loop.c
     163
     164function$(EXEEXT):
     165        $(BENCH_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/function.c
     166
     167fetch_add$(EXEEXT):
     168        $(BENCH_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/fetch_add.c
     169
     170ttst_lock$(EXEEXT):
     171        $(BENCH_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/ttst_lock.c
     172
     173tls-fetch_add$(EXEEXT):
     174        $(BENCH_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/tls-fetch_add.c
     175
     176## =========================================================================================================
     177CTXSWITCH_DEPEND  =                 \
     178        loop.run                                \
     179        function.run                    \
     180        fetch_add.run                   \
     181        ttst_lock.run                   \
     182        tls-fetch_add.run                       \
     183        ctxswitch-pthread.run           \
    240184        ctxswitch-cfa_generator.run     \
    241185        ctxswitch-cfa_coroutine.run     \
     
    244188        ctxswitch-upp_coroutine.run     \
    245189        ctxswitch-upp_thread.run        \
    246         ctxswitch-python_coroutine.run  \
    247         ctxswitch-nodejs_coroutine.run  \
    248         ctxswitch-nodejs_await.run      \
    249         ctxswitch-goroutine_thread.run  \
    250         ctxswitch-rust_thread.run       \
    251         ctxswitch-nodejs_coroutine.run  \
    252         ctxswitch-java_thread.run       \
    253         ctxswitch-pthread.run
     190        ctxswitch-goroutine.run         \
     191        ctxswitch-java_thread.run
     192
    254193
    255194if WITH_LIBFIBRE
    256 CTXSWITCH_DEPEND  +=                    \
    257         ctxswitch-kos_fibre.run         \
     195CTXSWITCH_DEPEND  +=           \
     196        ctxswitch-kos_fibre.run  \
    258197        ctxswitch-kos_fibre2.run
     198
    259199
    260200ctxswitch-kos_fibre$(EXEEXT):
     
    267207ctxswitch$(EXEEXT): $(CTXSWITCH_DEPEND)
    268208
     209ctxswitch-pthread$(EXEEXT):
     210        $(BENCH_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/ctxswitch/pthreads.c
     211
    269212ctxswitch-cfa_generator$(EXEEXT):
    270         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_gen.cfa
     213        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_gen.cfa
    271214
    272215ctxswitch-cfa_coroutine$(EXEEXT):
    273         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_cor.cfa
     216        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_cor.cfa
    274217
    275218ctxswitch-cfa_thread$(EXEEXT):
    276         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_thrd.cfa
     219        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd.cfa
    277220
    278221ctxswitch-cfa_thread2$(EXEEXT):
    279         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_thrd2.cfa
     222        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd2.cfa
    280223
    281224ctxswitch-upp_coroutine$(EXEEXT):
    282         $(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/ctxswitch/upp_cor.cc
     225        $(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_cor.cc
    283226
    284227ctxswitch-upp_thread$(EXEEXT):
    285         $(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/ctxswitch/upp_thrd.cc
    286 
    287 ctxswitch-python_coroutine$(EXEEXT):
    288         $(BENCH_V_PY)echo "#!/bin/sh" > a.out
    289         echo "python3.7 $(srcdir)/ctxswitch/python_cor.py" >> a.out
    290         chmod a+x a.out
    291 
    292 ctxswitch-nodejs_coroutine$(EXEEXT):
    293         $(BENCH_V_NODEJS)echo "#!/bin/sh" > a.out
    294         echo "nodejs $(srcdir)/ctxswitch/node_cor.js" >> a.out
    295         chmod a+x a.out
    296 
    297 ctxswitch-nodejs_await$(EXEEXT):
    298         $(BENCH_V_NODEJS)echo "#!/bin/sh" > a.out
    299         echo "nodejs $(srcdir)/ctxswitch/node_await.js" >> a.out
    300         chmod a+x a.out
    301 
    302 ctxswitch-goroutine_thread$(EXEEXT):
     228        $(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_thrd.cc
     229
     230ctxswitch-goroutine$(EXEEXT):
    303231        $(BENCH_V_GOC)go build -o a.out $(srcdir)/ctxswitch/goroutine.go
    304 
    305 ctxswitch-rust_thread$(EXEEXT):
    306         $(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/ctxswitch/rust_thrd.rs
    307232
    308233ctxswitch-java_thread$(EXEEXT):
    309234        $(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/ctxswitch/JavaThread.java
    310         echo "#!/bin/sh" > a.out
    311         echo "java JavaThread" >> a.out
    312         chmod a+x a.out
    313 
    314 ctxswitch-pthread$(EXEEXT):
    315         $(BENCH_V_CC)$(COMPILE) $(srcdir)/ctxswitch/pthreads.c
    316 
    317 ## =========================================================================================================
    318 
    319 mutex$(EXEEXT) :                \
     235        @echo "#!/bin/sh" > a.out
     236        @echo "java JavaThread" >> a.out
     237        @chmod a+x a.out
     238
     239## =========================================================================================================
     240mutex$(EXEEXT) :\
     241        loop.run                        \
     242        function.run            \
     243        fetch_add.run           \
     244        mutex-pthread_lock.run  \
     245        mutex-upp.run           \
    320246        mutex-cfa1.run          \
    321247        mutex-cfa2.run          \
    322248        mutex-cfa4.run          \
    323         mutex-upp.run           \
    324         mutex-go.run            \
    325         mutex-rust.run          \
    326         mutex-java.run          \
    327         mutex-pthread.run
    328 
    329 mutex-pthread$(EXEEXT):
    330         $(BENCH_V_CC)$(COMPILE) $(srcdir)/mutex/pthreads.c
     249        mutex-java_thread.run
     250
     251mutex-pthread_lock$(EXEEXT):
     252        $(BENCH_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/mutex/pthreads.c
     253
     254mutex-upp$(EXEEXT):
     255        $(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/mutex/upp.cc
    331256
    332257mutex-cfa1$(EXEEXT):
    333         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/mutex/cfa1.cfa
     258        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa1.cfa
    334259
    335260mutex-cfa2$(EXEEXT):
    336         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/mutex/cfa2.cfa
     261        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa2.cfa
    337262
    338263mutex-cfa4$(EXEEXT):
    339         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/mutex/cfa4.cfa
    340 
    341 mutex-upp$(EXEEXT):
    342         $(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/mutex/upp.cc
    343 
    344 mutex-go$(EXEEXT):
    345         $(BENCH_V_GOC)go build -o a.out $(srcdir)/mutex/goroutine.go
    346 
    347 mutex-rust$(EXEEXT):
    348         $(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/mutex/rust.rs
    349 
    350 mutex-java$(EXEEXT):
     264        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa4.cfa
     265
     266mutex-java_thread$(EXEEXT):
    351267        $(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/mutex/JavaThread.java
    352         echo "#!/bin/sh" > a.out
    353         echo "java JavaThread" >> a.out
    354         chmod a+x a.out
    355 
    356 ## =========================================================================================================
    357 
    358 schedint$(EXEEXT) :             \
    359         schedint-cfa1.run       \
    360         schedint-cfa2.run       \
    361         schedint-cfa4.run       \
    362         schedint-upp.run        \
    363         schedint-rust.run       \
    364         schedint-java.run       \
    365         schedint-pthread.run
    366 
    367 schedint-cfa1$(EXEEXT):
    368         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa1.cfa
    369 
    370 schedint-cfa2$(EXEEXT):
    371         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa2.cfa
    372 
    373 schedint-cfa4$(EXEEXT):
    374         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa4.cfa
    375 
    376 schedint-upp$(EXEEXT):
    377         $(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/schedint/upp.cc
    378 
    379 schedint-rust$(EXEEXT):
    380         $(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/schedint/rust.rs
    381 
    382 schedint-java$(EXEEXT):
     268        @echo "#!/bin/sh" > a.out
     269        @echo "java JavaThread" >> a.out
     270        @chmod a+x a.out
     271
     272## =========================================================================================================
     273signal$(EXEEXT) :\
     274        signal-pthread_cond.run \
     275        signal-upp.run          \
     276        signal-cfa1.run         \
     277        signal-cfa2.run         \
     278        signal-cfa4.run         \
     279        signal-java_thread.run
     280
     281signal-pthread_cond$(EXEEXT):
     282        $(BENCH_V_CC)$(COMPILE)    -DBENCH_N=500000  $(srcdir)/schedint/pthreads.c
     283
     284signal-upp$(EXEEXT):
     285        $(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedint/upp.cc
     286
     287signal-cfa1$(EXEEXT):
     288        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa1.cfa
     289
     290signal-cfa2$(EXEEXT):
     291        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa2.cfa
     292
     293signal-cfa4$(EXEEXT):
     294        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa4.cfa
     295
     296signal-java_thread$(EXEEXT):
    383297        $(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/schedint/JavaThread.java
    384         echo "#!/bin/sh" > a.out
    385         echo "java JavaThread" >> a.out
    386         chmod a+x a.out
    387 
    388 schedint-pthread$(EXEEXT):
    389         $(BENCH_V_CC)$(COMPILE) $(srcdir)/schedint/pthreads.c
    390 
    391 ## =========================================================================================================
    392 
    393 schedext$(EXEEXT) :             \
    394         schedext-cfa1.run       \
    395         schedext-cfa2.run       \
    396         schedext-cfa4.run       \
    397         schedext-upp.run        \
    398         schedext-goroutine.run
    399 
    400 schedext-cfa1$(EXEEXT):
    401         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa1.cfa
    402 
    403 schedext-cfa2$(EXEEXT):
    404         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa2.cfa
    405 
    406 schedext-cfa4$(EXEEXT):
    407         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa4.cfa
    408 
    409 schedext-upp$(EXEEXT):
    410         $(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/schedext/upp.cc
    411 
    412 schedext-goroutine$(EXEEXT):
    413         $(BENCH_V_GOC)go build -o a.out $(srcdir)/schedext/goroutine.go
    414 
    415 
    416 ## =========================================================================================================
    417 
    418 creation$(EXEEXT) :                             \
    419         creation-cfa_generator.run              \
     298        @echo "#!/bin/sh" > a.out
     299        @echo "java JavaThread" >> a.out
     300        @chmod a+x a.out
     301
     302
     303## =========================================================================================================
     304waitfor$(EXEEXT) :\
     305        waitfor-upp.run         \
     306        waitfor-cfa1.run                \
     307        waitfor-cfa2.run                \
     308        waitfor-cfa4.run
     309
     310waitfor-upp$(EXEEXT):
     311        $(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedext/upp.cc
     312
     313waitfor-cfa1$(EXEEXT):
     314        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa1.cfa
     315
     316waitfor-cfa2$(EXEEXT):
     317        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa2.cfa
     318
     319waitfor-cfa4$(EXEEXT):
     320        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa4.cfa
     321
     322## =========================================================================================================
     323creation$(EXEEXT) :\
     324        creation-pthread.run                    \
    420325        creation-cfa_coroutine.run              \
    421326        creation-cfa_coroutine_eager.run        \
     
    423328        creation-upp_coroutine.run              \
    424329        creation-upp_thread.run                 \
    425         creation-python_coroutine.run           \
    426         creation-nodejs_coroutine.run           \
    427         creation-goroutine_thread.run           \
    428         creation-rust_thread.run                \
    429         creation-java_thread.run                \
    430         creation-pthread.run
    431 
    432 creation-cfa_generator$(EXEEXT):
    433         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_gen.cfa
     330        creation-goroutine.run                  \
     331        creation-java_thread.run
    434332
    435333creation-cfa_coroutine$(EXEEXT):
    436         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_cor.cfa
     334        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa
    437335
    438336creation-cfa_coroutine_eager$(EXEEXT):
    439         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_cor.cfa  -DEAGER
     337        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa  -DEAGER
    440338
    441339creation-cfa_thread$(EXEEXT):
    442         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_thrd.cfa
     340        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_thrd.cfa
    443341
    444342creation-upp_coroutine$(EXEEXT):
    445         $(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/creation/upp_cor.cc
     343        $(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_cor.cc
    446344
    447345creation-upp_thread$(EXEEXT):
    448         $(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/creation/upp_thrd.cc
    449 
    450 creation-python_coroutine$(EXEEXT):
    451         $(BENCH_V_PY)echo "#!/bin/sh" > a.out
    452         echo "python3.7 $(srcdir)/creation/python_cor.py" >> a.out
    453         chmod a+x a.out
    454 
    455 creation-nodejs_coroutine$(EXEEXT):
    456         $(BENCH_V_NODEJS)echo "#!/bin/sh" > a.out
    457         echo "nodejs $(srcdir)/creation/node_cor.js" >> a.out
    458         chmod a+x a.out
    459 
    460 creation-goroutine_thread$(EXEEXT):
     346        $(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_thrd.cc
     347
     348creation-pthread$(EXEEXT):
     349        $(BENCH_V_CC)$(COMPILE)    -DBENCH_N=250000   $(srcdir)/creation/pthreads.c
     350
     351creation-goroutine$(EXEEXT):
    461352        $(BENCH_V_GOC)go build -o a.out $(srcdir)/creation/goroutine.go
    462 
    463 creation-rust_thread$(EXEEXT):
    464         $(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/creation/rust_thrd.rs
    465353
    466354creation-java_thread$(EXEEXT):
    467355        $(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/creation/JavaThread.java
    468         echo "#!/bin/sh" > a.out
    469         echo "java JavaThread" >> a.out
    470         chmod a+x a.out
    471 
    472 creation-pthread$(EXEEXT):
    473         $(BENCH_V_CC)$(COMPILE) $(srcdir)/creation/pthreads.c
    474 
    475 ## =========================================================================================================
    476 
    477 compile$(EXEEXT) :              \
     356        @echo "#!/bin/sh" > a.out
     357        @echo "java JavaThread" >> a.out
     358        @chmod a+x a.out
     359
     360## =========================================================================================================
     361
     362compile$(EXEEXT) :\
    478363        compile-array.make      \
    479364        compile-attributes.make \
     
    485370        compile-typeof.make
    486371
     372
    487373testdir = $(top_srcdir)/tests
    488374
    489375compile-array$(EXEEXT):
    490         $(CFACOMPILE) -fsyntax-only -w $(testdir)/array.cfa
     376        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/array.cfa
    491377
    492378compile-attributes$(EXEEXT):
    493         $(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
     379        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
    494380
    495381compile-empty$(EXEEXT):
    496         $(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.cfa
     382        @$(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.cfa
    497383
    498384compile-expression$(EXEEXT):
    499         $(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.cfa
     385        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.cfa
    500386
    501387compile-io$(EXEEXT):
    502         $(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.cfa
     388        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.cfa
    503389
    504390compile-monitor$(EXEEXT):
    505         $(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
     391        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
    506392
    507393compile-operators$(EXEEXT):
    508         $(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.cfa
     394        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.cfa
    509395
    510396compile-thread$(EXEEXT):
    511         $(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.cfa
     397        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.cfa
    512398
    513399compile-typeof$(EXEEXT):
    514         $(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.cfa
    515 
    516 ## =========================================================================================================
    517 
    518 size$(EXEEXT) : size-cfa.runquiet
    519 
    520 size-cfa$(EXEEXT):
    521         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/size/size.cfa
     400        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.cfa
  • benchmark/Makefile.in

    r3d5701e r9fb8f01  
    9393EXTRA_PROGRAMS = dummy$(EXEEXT)
    9494@WITH_LIBFIBRE_TRUE@am__append_1 = \
    95 @WITH_LIBFIBRE_TRUE@    ctxswitch-kos_fibre.run         \
     95@WITH_LIBFIBRE_TRUE@    ctxswitch-kos_fibre.run  \
    9696@WITH_LIBFIBRE_TRUE@    ctxswitch-kos_fibre2.run
    9797
     
    214214CCDEPMODE = @CCDEPMODE@
    215215CFACC = @CFACC@
    216 CFACC_INSTALL = @CFACC_INSTALL@
    217216CFACPP = @CFACPP@
    218217CFA_BACKEND_CC = @CFA_BACKEND_CC@
     
    245244FGREP = @FGREP@
    246245GREP = @GREP@
    247 HAS_DISTCC = @HAS_DISTCC@
    248246HOST_FLAGS = @HOST_FLAGS@
    249247INSTALL = @INSTALL@
     
    352350LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
    353351        $(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \
    354         $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS)
     352        $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \
     353        $(AM_CFLAGS) $(CFLAGS)
    355354
    356355AM_V_CFA = $(am__v_CFA_@AM_V@)
     
    358357am__v_CFA_0 = @echo "  CFA     " $@;
    359358am__v_CFA_1 =
     359AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
     360am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
     361am__v_JAVAC_0 = @echo "  JAVAC   " $@;
     362am__v_JAVAC_1 =
     363AM_V_GOC = $(am__v_GOC_@AM_V@)
     364am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
     365am__v_GOC_0 = @echo "  GOC     " $@;
     366am__v_GOC_1 =
    360367UPPCC = u++
    361368UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
     
    364371am__v_UPP_0 = @echo "  UPP     " $@;
    365372am__v_UPP_1 =
    366 AM_V_GOC = $(am__v_GOC_@AM_V@)
    367 am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
    368 am__v_GOC_0 = @echo "  GOC     " $@;
    369 am__v_GOC_1 =
    370 AM_V_PY = $(am__v_PY_@AM_V@)
    371 am__v_PY_ = $(am__v_PY_@AM_DEFAULT_V@)
    372 am__v_PY_0 = @echo "  PYTHON  " $@;
    373 am__v_PY_1 =
    374 AM_V_RUST = $(am__v_RUST_@AM_V@)
    375 am__v_RUST_ = $(am__v_RUST_@AM_DEFAULT_V@)
    376 am__v_RUST_0 = @echo "  RUST    " $@;
    377 am__v_RUST_1 =
    378 AM_V_NODEJS = $(am__v_NODEJS_@AM_V@)
    379 am__v_NODEJS_ = $(am__v_NODEJS_@AM_DEFAULT_V@)
    380 am__v_NODEJS_0 = @echo "  NODEJS  " $@;
    381 am__v_NODEJS_1 =
    382 AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
    383 am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
    384 am__v_JAVAC_0 = @echo "  JAVAC   " $@;
    385 am__v_JAVAC_1 =
    386373
    387374# applies to both programs
    388375AM_CFLAGS = -O2 -Wall -Wextra -I$(srcdir) -lrt -pthread # -Werror
    389 AM_CFAFLAGS = -quiet -nodebug
     376AM_CFAFLAGS = -quiet -nodebug -in-tree
    390377AM_UPPFLAGS = -quiet -nodebug -multi -std=c++14
    391378BENCH_V_CC = $(__bench_v_CC_$(__quiet))
    392379BENCH_V_CFA = $(__bench_v_CFA_$(__quiet))
    393380BENCH_V_CXX = $(__bench_v_CXX_$(__quiet))
     381BENCH_V_GOC = $(__bench_v_GOC_$(__quiet))
     382BENCH_V_JAVAC = $(__bench_v_JAVAC_$(__quiet))
    394383BENCH_V_UPP = $(__bench_v_UPP_$(__quiet))
    395 BENCH_V_GOC = $(__bench_v_GOC_$(__quiet))
    396 BENCH_V_PY = $(__bench_v_PY_$(__quiet))
    397 BENCH_V_RUSTC = $(__bench_v_RUSTC_$(__quiet))
    398 BENCH_V_NODEJS = $(__bench_v_NODEJS_$(__quiet))
    399 BENCH_V_JAVAC = $(__bench_v_JAVAC_$(__quiet))
    400384__quiet = verbose
    401385__bench_v_CC_quiet = @
    402386__bench_v_CFA_quiet = @
    403387__bench_v_CXX_quiet = @
     388__bench_v_GOC_quiet = @
     389__bench_v_JAVAC_quiet = @
    404390__bench_v_UPP_quiet = @
    405 __bench_v_GOC_quiet = @
    406 __bench_v_RUSTC_quiet = @
    407 __bench_v_JAVAC_quiet = @
    408391__bench_v_CC_verbose = $(AM_V_CC)
    409392__bench_v_CFA_verbose = $(AM_V_CFA)
    410393__bench_v_CXX_verbose = $(AM_V_CXX)
     394__bench_v_GOC_verbose = $(AM_V_GOC)
     395__bench_v_JAVAC_verbose = $(AM_V_JAVAC)
    411396__bench_v_UPP_verbose = $(AM_V_UPP)
    412 __bench_v_GOC_verbose = $(AM_V_GOC)
    413 __bench_v_PY_verbose = $(AM_V_PY)
    414 __bench_v_RUSTC_verbose = $(AM_V_RUST)
    415 __bench_v_NODEJS_verbose = $(AM_V_NODEJS)
    416 __bench_v_JAVAC_verbose = $(AM_V_JAVAC)
    417397TOOLSDIR = ${abs_top_builddir}/tools/
    418398REPEAT = ${abs_top_builddir}/tools/repeat
    419399STATS = ${abs_top_srcdir}/tools/stat.py
    420400# NEED AT LEAST 4 DATA VALUES FOR BENCHMARKS BECAUSE THE MAX AND MIN VALUES ARE REMOVED
    421 repeats = 13 # 31 for benchmarks
     401repeats = 5 # 31 for benchmarks
    422402arch = x64
    423403skipcompile = no
     
    425405PRINT_FORMAT = %20s: #Comments needed for spacing
    426406dummy_SOURCES = dummyC.c dummyCXX.cpp
    427 basic_loop_DURATION = 15000000000
    428 basic_function_DURATION = 10000000000
    429 basic_tls_fetch_add_DURATION = 10000000000
    430 basic_DURATION = 250000000
    431 ctxswitch_pthread_DURATION = 25000000
    432 ctxswitch_rust_thread_DURATION = $(ctxswitch_pthread_DURATION)
    433 ctxswitch_cfa_generator_DURATION = 5000000000
    434 ctxswitch_nodejs_await_DURATION = 5000000
    435 ctxswitch_DURATION = 100000000
    436 
    437 #mutex_java_DURATION = 10000000
    438 mutex_DURATION = 50000000
    439 schedint_pthread_DURATION = 1000000
    440 schedint_java_DURATION = $(schedint_pthread_DURATION)
    441 schedint_rust_DURATION = $(schedint_pthread_DURATION)
    442 schedint_DURATION = 10000000
    443 schedext_DURATION = 10000000
    444 creation_pthread_DURATION = 250000
    445 creation_rust_thread_DURATION = ${creation_pthread_DURATION}
    446 creation_java_thread_DURATION = ${creation_pthread_DURATION}
    447 creation_cfa_coroutine_DURATION = 100000000
    448 creation_cfa_coroutine_eager_DURATION = 10000000
    449 creation_upp_coroutine_DURATION = ${creation_cfa_coroutine_eager_DURATION}
    450 creation_cfa_thread_DURATION = 10000000
    451 creation_upp_thread_DURATION = ${creation_cfa_thread_DURATION}
    452 creation_DURATION = 10000000
    453407FIX_NEW_LINES = cat $@ | tr "\n" "\t" | sed -r 's/\t,/,/' | tr "\t" "\n" > $@
    454 BASIC_DEPEND = \
    455         basic-loop.run                          \
    456         basic-function.run                      \
    457         basic-fetch_add.run                     \
    458         basic-ttst_lock.run                     \
    459         basic-tls-fetch_add.run
    460 
    461 CTXSWITCH_DEPEND = ctxswitch-cfa_generator.run \
    462         ctxswitch-cfa_coroutine.run ctxswitch-cfa_thread.run \
    463         ctxswitch-cfa_thread2.run ctxswitch-upp_coroutine.run \
    464         ctxswitch-upp_thread.run ctxswitch-python_coroutine.run \
    465         ctxswitch-nodejs_coroutine.run ctxswitch-nodejs_await.run \
    466         ctxswitch-goroutine_thread.run ctxswitch-rust_thread.run \
    467         ctxswitch-nodejs_coroutine.run ctxswitch-java_thread.run \
    468         ctxswitch-pthread.run $(am__append_1)
     408CTXSWITCH_DEPEND = loop.run function.run fetch_add.run ttst_lock.run \
     409        tls-fetch_add.run ctxswitch-pthread.run \
     410        ctxswitch-cfa_generator.run ctxswitch-cfa_coroutine.run \
     411        ctxswitch-cfa_thread.run ctxswitch-cfa_thread2.run \
     412        ctxswitch-upp_coroutine.run ctxswitch-upp_thread.run \
     413        ctxswitch-goroutine.run ctxswitch-java_thread.run \
     414        $(am__append_1)
    469415testdir = $(top_srcdir)/tests
    470416all: all-am
     
    785731
    786732dummyC.c:
    787         echo "int main() { return 0; }" > ${@}
     733        @echo "int main() { return 0; }" > ${@}
    788734
    789735dummyCXX.cpp:
    790         echo "int main() { return 0; }" > ${@}
    791 
    792 .SILENT:                # do not print recipe
     736        @echo "int main() { return 0; }" > ${@}
     737
    793738.NOTPARALLEL:
    794 .PHONY: jenkins cleancsv
    795 
    796 all : basic$(EXEEXT) ctxswitch$(EXEEXT) mutex$(EXEEXT) schedint$(EXEEXT) schedext$(EXEEXT) creation$(EXEEXT)
     739.PHONY: compile.csv ctxswitch.csv mutex.csv signal.csv
     740
     741all : ctxswitch$(EXEEXT) mutex$(EXEEXT) signal$(EXEEXT) waitfor$(EXEEXT) creation$(EXEEXT)
    797742
    798743%.run : %$(EXEEXT) ${REPEAT}
    799         rm -f .result.log
    800         echo "------------------------------------------------------"
    801         echo $<
    802         ${REPEAT} ${repeats} -- ./a.out\
    803                 $(if ${$(subst -,_,$(basename $@))_DURATION},\
    804                         ${$(subst -,_,$(basename $@))_DURATION},\
    805                         ${$(firstword $(subst -, ,$(basename $@)))_DURATION}) | tee -a .result.log
    806         ${STATS} .result.log
    807         echo "------------------------------------------------------"
    808         rm -f a.out .result.log *.class
    809 
    810 #       ${REPEAT} ${repeats} -- /usr/bin/time -f "%Uu %Ss %Er %Mkb" ./a.out
     744        @rm -f .result.log
     745        @echo "------------------------------------------------------"
     746        @echo $<
     747        @${REPEAT} ${repeats} ./a.out | tee -a .result.log
     748        @${STATS} .result.log
     749        @echo "------------------------------------------------------"
     750        @rm -f a.out .result.log *.class
    811751
    812752%.runquiet :
    813         +make $(basename $@) CFLAGS="-w" __quiet=quiet
    814         taskset -c 1 ./a.out
    815         rm -f a.out
     753        @+make $(basename $@) CFLAGS="-w" __quiet=quiet
     754        @taskset -c 1 ./a.out
     755        @rm -f a.out
    816756
    817757%.make :
    818         printf "${PRINT_FORMAT}" $(basename $(subst compile-,,$@))
    819         +/usr/bin/time -f ${TIME_FORMAT} make $(basename $@) 2>&1
     758        @printf "${PRINT_FORMAT}" $(basename $(subst compile-,,$@))
     759        @+/usr/bin/time -f ${TIME_FORMAT} make $(basename $@) 2>&1
    820760
    821761${REPEAT} :
    822         +make -C ${abs_top_builddir}/tools repeat
    823 
    824 cleancsv:
    825         rm -f compile.csv basic.csv ctxswitch.csv mutex.csv scheduling.csv
    826 
    827 jenkins$(EXEEXT): cleancsv
     762        @+make -C ${abs_top_builddir}/tools repeat
     763
     764jenkins$(EXEEXT):
    828765@DOifskipcompile@
    829         +make compile.csv
    830         -+make compile.diff.csv
     766        @+make compile.csv
     767        @-+make compile.diff.csv
    831768@DOendif@
    832         +make ctxswitch.csv
    833         -+make ctxswitch.diff.csv
    834         +make mutex.csv
    835         -+make mutex.diff.csv
    836         +make scheduling.csv
    837         -+make scheduling.diff.csv
     769        @+make ctxswitch.csv
     770        @-+make ctxswitch.diff.csv
     771        @+make mutex.csv
     772        @-+make mutex.diff.csv
     773        @+make signal.csv
     774        @-+make signal.diff.csv
    838775@DOifskipcompile@
    839776        cat compile.csv
     
    844781        cat mutex.csv
    845782        -cat mutex.diff.csv
    846         cat scheduling.csv
    847         -cat scheduling.diff.csv
     783        cat signal.csv
     784        -cat signal.diff.csv
    848785
    849786compile.csv:
    850         echo "building $@"
    851         echo "array,attributes,empty,expression,io,monitor,operators,typeof" > $@
    852         +make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-array.make >> $@
    853         +make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-attributes.make >> $@
    854         +make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-empty.make >> $@
    855         +make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-expression.make >> $@
    856         +make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-io.make >> $@
    857         +make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-monitor.make >> $@
    858         +make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-operators.make >> $@
    859         +make TIME_FORMAT='%e' PRINT_FORMAT='' compile-typeof.make >> $@
    860         $(srcdir)/fixcsv.sh $@
     787        @echo "array,attributes,empty,expression,io,monitor,operators,typeof" > $@
     788        @+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-array.make >> $@
     789        @+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-attributes.make >> $@
     790        @+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-empty.make >> $@
     791        @+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-expression.make >> $@
     792        @+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-io.make >> $@
     793        @+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-monitor.make >> $@
     794        @+make TIME_FORMAT='%e,' PRINT_FORMAT='' compile-operators.make >> $@
     795        @+make TIME_FORMAT='%e' PRINT_FORMAT='' compile-typeof.make >> $@
     796        @$(srcdir)/fixcsv.sh $@
    861797
    862798ctxswitch.csv:
    863         echo "building $@"
    864         echo "generator,coroutine,thread" > $@
    865         +make ctxswitch-cfa_generator.runquiet >> $@ && echo -n ',' >> $@
    866         +make ctxswitch-cfa_coroutine.runquiet >> $@ && echo -n ',' >> $@
    867         +make ctxswitch-cfa_thread.runquiet >> $@
    868         $(srcdir)/fixcsv.sh $@
     799        @echo "generator,coroutine,thread" > $@
     800        @+make ctxswitch-cfa_generator.runquiet >> $@ && echo -n ',' >> $@
     801        @+make ctxswitch-cfa_coroutine.runquiet >> $@ && echo -n ',' >> $@
     802        @+make ctxswitch-cfa_thread.runquiet >> $@
     803        @$(srcdir)/fixcsv.sh $@
    869804
    870805mutex.csv:
    871         echo "building $@"
    872         echo "1-monitor,2-monitor" > $@
    873         +make mutex-cfa1.runquiet >> $@ && echo -n ',' >> $@
    874         +make mutex-cfa2.runquiet >> $@
    875         $(srcdir)/fixcsv.sh $@
    876 
    877 scheduling.csv:
    878         echo "building $@"
    879         echo "schedint-1,schedint-2,schedext-1,schedext-2" > $@
    880         +make schedint-cfa1.runquiet >> $@ && echo -n ',' >> $@
    881         +make schedint-cfa2.runquiet >> $@ && echo -n ',' >> $@
    882         +make schedext-cfa1.runquiet >> $@ && echo -n ',' >> $@
    883         +make schedext-cfa2.runquiet >> $@
    884         $(srcdir)/fixcsv.sh $@
     806        @echo "1-monitor,2-monitor" > $@
     807        @+make mutex-cfa1.runquiet >> $@ && echo -n ',' >> $@
     808        @+make mutex-cfa2.runquiet >> $@
     809        @$(srcdir)/fixcsv.sh $@
     810
     811signal.csv:
     812        @echo "signal-1,signal-2,waitfor-1,waitfor-2" > $@
     813        @+make signal-cfa1.runquiet >> $@ && echo -n ',' >> $@
     814        @+make signal-cfa2.runquiet >> $@ && echo -n ',' >> $@
     815        @+make waitfor-cfa1.runquiet >> $@ && echo -n ',' >> $@
     816        @+make waitfor-cfa2.runquiet >> $@
     817        @$(srcdir)/fixcsv.sh $@
    885818
    886819%.diff.csv: %.csv
    887         test -e $(srcdir)/baselines/$(arch)/$< || (echo "Error : Missing baseline for ${<}" && false)
    888         $(srcdir)/baselines/calc.py $(srcdir)/baselines/$(arch)/$(<) $(<) > $@
    889 
    890 basic-loop$(EXEEXT):
    891         $(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/loop.c
    892 
    893 basic-function$(EXEEXT):
    894         $(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/function.c
    895 
    896 basic-fetch_add$(EXEEXT):
    897         $(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/fetch_add.c
    898 
    899 basic-ttst_lock$(EXEEXT):
    900         $(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/ttst_lock.c
    901 
    902 basic-tls-fetch_add$(EXEEXT):
    903         $(BENCH_V_CC)$(COMPILE) $(srcdir)/basic/tls_fetch_add.c
    904 
    905 basic$(EXEEXT): $(BASIC_DEPEND)
     820        @test -e $(srcdir)/baselines/$(arch)/$< || (echo "Error : Missing baseline for ${<}" && false)
     821        @$(srcdir)/baselines/calc.py $(srcdir)/baselines/$(arch)/$(<) $(<) > $@
     822
     823loop$(EXEEXT):
     824        $(BENCH_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/loop.c
     825
     826function$(EXEEXT):
     827        $(BENCH_V_CC)$(COMPILE) -DBENCH_N=5000000000 $(srcdir)/function.c
     828
     829fetch_add$(EXEEXT):
     830        $(BENCH_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/fetch_add.c
     831
     832ttst_lock$(EXEEXT):
     833        $(BENCH_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/ttst_lock.c
     834
     835tls-fetch_add$(EXEEXT):
     836        $(BENCH_V_CC)$(COMPILE) -DBENCH_N=500000000  $(srcdir)/tls-fetch_add.c
    906837
    907838@WITH_LIBFIBRE_TRUE@ctxswitch-kos_fibre$(EXEEXT):
     
    913844ctxswitch$(EXEEXT): $(CTXSWITCH_DEPEND)
    914845
     846ctxswitch-pthread$(EXEEXT):
     847        $(BENCH_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/ctxswitch/pthreads.c
     848
    915849ctxswitch-cfa_generator$(EXEEXT):
    916         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_gen.cfa
     850        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_gen.cfa
    917851
    918852ctxswitch-cfa_coroutine$(EXEEXT):
    919         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_cor.cfa
     853        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_cor.cfa
    920854
    921855ctxswitch-cfa_thread$(EXEEXT):
    922         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_thrd.cfa
     856        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd.cfa
    923857
    924858ctxswitch-cfa_thread2$(EXEEXT):
    925         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/ctxswitch/cfa_thrd2.cfa
     859        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/cfa_thrd2.cfa
    926860
    927861ctxswitch-upp_coroutine$(EXEEXT):
    928         $(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/ctxswitch/upp_cor.cc
     862        $(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_cor.cc
    929863
    930864ctxswitch-upp_thread$(EXEEXT):
    931         $(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/ctxswitch/upp_thrd.cc
    932 
    933 ctxswitch-python_coroutine$(EXEEXT):
    934         $(BENCH_V_PY)echo "#!/bin/sh" > a.out
    935         echo "python3.7 $(srcdir)/ctxswitch/python_cor.py" >> a.out
    936         chmod a+x a.out
    937 
    938 ctxswitch-nodejs_coroutine$(EXEEXT):
    939         $(BENCH_V_NODEJS)echo "#!/bin/sh" > a.out
    940         echo "nodejs $(srcdir)/ctxswitch/node_cor.js" >> a.out
    941         chmod a+x a.out
    942 
    943 ctxswitch-nodejs_await$(EXEEXT):
    944         $(BENCH_V_NODEJS)echo "#!/bin/sh" > a.out
    945         echo "nodejs $(srcdir)/ctxswitch/node_await.js" >> a.out
    946         chmod a+x a.out
    947 
    948 ctxswitch-goroutine_thread$(EXEEXT):
     865        $(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/ctxswitch/upp_thrd.cc
     866
     867ctxswitch-goroutine$(EXEEXT):
    949868        $(BENCH_V_GOC)go build -o a.out $(srcdir)/ctxswitch/goroutine.go
    950 
    951 ctxswitch-rust_thread$(EXEEXT):
    952         $(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/ctxswitch/rust_thrd.rs
    953869
    954870ctxswitch-java_thread$(EXEEXT):
    955871        $(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/ctxswitch/JavaThread.java
    956         echo "#!/bin/sh" > a.out
    957         echo "java JavaThread" >> a.out
    958         chmod a+x a.out
    959 
    960 ctxswitch-pthread$(EXEEXT):
    961         $(BENCH_V_CC)$(COMPILE) $(srcdir)/ctxswitch/pthreads.c
    962 
    963 mutex$(EXEEXT) :                \
     872        @echo "#!/bin/sh" > a.out
     873        @echo "java JavaThread" >> a.out
     874        @chmod a+x a.out
     875
     876mutex$(EXEEXT) :\
     877        loop.run                        \
     878        function.run            \
     879        fetch_add.run           \
     880        mutex-pthread_lock.run  \
     881        mutex-upp.run           \
    964882        mutex-cfa1.run          \
    965883        mutex-cfa2.run          \
    966884        mutex-cfa4.run          \
    967         mutex-upp.run           \
    968         mutex-go.run            \
    969         mutex-rust.run          \
    970         mutex-java.run          \
    971         mutex-pthread.run
    972 
    973 mutex-pthread$(EXEEXT):
    974         $(BENCH_V_CC)$(COMPILE) $(srcdir)/mutex/pthreads.c
     885        mutex-java_thread.run
     886
     887mutex-pthread_lock$(EXEEXT):
     888        $(BENCH_V_CC)$(COMPILE)    -DBENCH_N=50000000 $(srcdir)/mutex/pthreads.c
     889
     890mutex-upp$(EXEEXT):
     891        $(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/mutex/upp.cc
    975892
    976893mutex-cfa1$(EXEEXT):
    977         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/mutex/cfa1.cfa
     894        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa1.cfa
    978895
    979896mutex-cfa2$(EXEEXT):
    980         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/mutex/cfa2.cfa
     897        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa2.cfa
    981898
    982899mutex-cfa4$(EXEEXT):
    983         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/mutex/cfa4.cfa
    984 
    985 mutex-upp$(EXEEXT):
    986         $(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/mutex/upp.cc
    987 
    988 mutex-go$(EXEEXT):
    989         $(BENCH_V_GOC)go build -o a.out $(srcdir)/mutex/goroutine.go
    990 
    991 mutex-rust$(EXEEXT):
    992         $(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/mutex/rust.rs
    993 
    994 mutex-java$(EXEEXT):
     900        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=5000000  $(srcdir)/mutex/cfa4.cfa
     901
     902mutex-java_thread$(EXEEXT):
    995903        $(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/mutex/JavaThread.java
    996         echo "#!/bin/sh" > a.out
    997         echo "java JavaThread" >> a.out
    998         chmod a+x a.out
    999 
    1000 schedint$(EXEEXT) :             \
    1001         schedint-cfa1.run       \
    1002         schedint-cfa2.run       \
    1003         schedint-cfa4.run       \
    1004         schedint-upp.run        \
    1005         schedint-rust.run       \
    1006         schedint-java.run       \
    1007         schedint-pthread.run
    1008 
    1009 schedint-cfa1$(EXEEXT):
    1010         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa1.cfa
    1011 
    1012 schedint-cfa2$(EXEEXT):
    1013         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa2.cfa
    1014 
    1015 schedint-cfa4$(EXEEXT):
    1016         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedint/cfa4.cfa
    1017 
    1018 schedint-upp$(EXEEXT):
    1019         $(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/schedint/upp.cc
    1020 
    1021 schedint-rust$(EXEEXT):
    1022         $(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/schedint/rust.rs
    1023 
    1024 schedint-java$(EXEEXT):
     904        @echo "#!/bin/sh" > a.out
     905        @echo "java JavaThread" >> a.out
     906        @chmod a+x a.out
     907
     908signal$(EXEEXT) :\
     909        signal-pthread_cond.run \
     910        signal-upp.run          \
     911        signal-cfa1.run         \
     912        signal-cfa2.run         \
     913        signal-cfa4.run         \
     914        signal-java_thread.run
     915
     916signal-pthread_cond$(EXEEXT):
     917        $(BENCH_V_CC)$(COMPILE)    -DBENCH_N=500000  $(srcdir)/schedint/pthreads.c
     918
     919signal-upp$(EXEEXT):
     920        $(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedint/upp.cc
     921
     922signal-cfa1$(EXEEXT):
     923        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa1.cfa
     924
     925signal-cfa2$(EXEEXT):
     926        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa2.cfa
     927
     928signal-cfa4$(EXEEXT):
     929        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedint/cfa4.cfa
     930
     931signal-java_thread$(EXEEXT):
    1025932        $(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/schedint/JavaThread.java
    1026         echo "#!/bin/sh" > a.out
    1027         echo "java JavaThread" >> a.out
    1028         chmod a+x a.out
    1029 
    1030 schedint-pthread$(EXEEXT):
    1031         $(BENCH_V_CC)$(COMPILE) $(srcdir)/schedint/pthreads.c
    1032 
    1033 schedext$(EXEEXT) :             \
    1034         schedext-cfa1.run       \
    1035         schedext-cfa2.run       \
    1036         schedext-cfa4.run       \
    1037         schedext-upp.run        \
    1038         schedext-goroutine.run
    1039 
    1040 schedext-cfa1$(EXEEXT):
    1041         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa1.cfa
    1042 
    1043 schedext-cfa2$(EXEEXT):
    1044         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa2.cfa
    1045 
    1046 schedext-cfa4$(EXEEXT):
    1047         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/schedext/cfa4.cfa
    1048 
    1049 schedext-upp$(EXEEXT):
    1050         $(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/schedext/upp.cc
    1051 
    1052 schedext-goroutine$(EXEEXT):
    1053         $(BENCH_V_GOC)go build -o a.out $(srcdir)/schedext/goroutine.go
    1054 
    1055 creation$(EXEEXT) :                             \
    1056         creation-cfa_generator.run              \
     933        @echo "#!/bin/sh" > a.out
     934        @echo "java JavaThread" >> a.out
     935        @chmod a+x a.out
     936
     937waitfor$(EXEEXT) :\
     938        waitfor-upp.run         \
     939        waitfor-cfa1.run                \
     940        waitfor-cfa2.run                \
     941        waitfor-cfa4.run
     942
     943waitfor-upp$(EXEEXT):
     944        $(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=5000000 $(srcdir)/schedext/upp.cc
     945
     946waitfor-cfa1$(EXEEXT):
     947        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa1.cfa
     948
     949waitfor-cfa2$(EXEEXT):
     950        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa2.cfa
     951
     952waitfor-cfa4$(EXEEXT):
     953        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=500000  $(srcdir)/schedext/cfa4.cfa
     954
     955creation$(EXEEXT) :\
     956        creation-pthread.run                    \
    1057957        creation-cfa_coroutine.run              \
    1058958        creation-cfa_coroutine_eager.run        \
     
    1060960        creation-upp_coroutine.run              \
    1061961        creation-upp_thread.run                 \
    1062         creation-python_coroutine.run           \
    1063         creation-nodejs_coroutine.run           \
    1064         creation-goroutine_thread.run           \
    1065         creation-rust_thread.run                \
    1066         creation-java_thread.run                \
    1067         creation-pthread.run
    1068 
    1069 creation-cfa_generator$(EXEEXT):
    1070         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_gen.cfa
     962        creation-goroutine.run                  \
     963        creation-java_thread.run
    1071964
    1072965creation-cfa_coroutine$(EXEEXT):
    1073         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_cor.cfa
     966        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa
    1074967
    1075968creation-cfa_coroutine_eager$(EXEEXT):
    1076         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_cor.cfa  -DEAGER
     969        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_cor.cfa  -DEAGER
    1077970
    1078971creation-cfa_thread$(EXEEXT):
    1079         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/creation/cfa_thrd.cfa
     972        $(BENCH_V_CFA)$(CFACOMPILE) -DBENCH_N=10000000 $(srcdir)/creation/cfa_thrd.cfa
    1080973
    1081974creation-upp_coroutine$(EXEEXT):
    1082         $(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/creation/upp_cor.cc
     975        $(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_cor.cc
    1083976
    1084977creation-upp_thread$(EXEEXT):
    1085         $(BENCH_V_UPP)$(UPPCOMPILE) $(srcdir)/creation/upp_thrd.cc
    1086 
    1087 creation-python_coroutine$(EXEEXT):
    1088         $(BENCH_V_PY)echo "#!/bin/sh" > a.out
    1089         echo "python3.7 $(srcdir)/creation/python_cor.py" >> a.out
    1090         chmod a+x a.out
    1091 
    1092 creation-nodejs_coroutine$(EXEEXT):
    1093         $(BENCH_V_NODEJS)echo "#!/bin/sh" > a.out
    1094         echo "nodejs $(srcdir)/creation/node_cor.js" >> a.out
    1095         chmod a+x a.out
    1096 
    1097 creation-goroutine_thread$(EXEEXT):
     978        $(BENCH_V_UPP)$(UPPCOMPILE) -DBENCH_N=50000000 $(srcdir)/creation/upp_thrd.cc
     979
     980creation-pthread$(EXEEXT):
     981        $(BENCH_V_CC)$(COMPILE)    -DBENCH_N=250000   $(srcdir)/creation/pthreads.c
     982
     983creation-goroutine$(EXEEXT):
    1098984        $(BENCH_V_GOC)go build -o a.out $(srcdir)/creation/goroutine.go
    1099 
    1100 creation-rust_thread$(EXEEXT):
    1101         $(BENCH_V_RUSTC)rustc -C opt-level=3 -o a.out $(srcdir)/creation/rust_thrd.rs
    1102985
    1103986creation-java_thread$(EXEEXT):
    1104987        $(BENCH_V_JAVAC)javac -d $(builddir) $(srcdir)/creation/JavaThread.java
    1105         echo "#!/bin/sh" > a.out
    1106         echo "java JavaThread" >> a.out
    1107         chmod a+x a.out
    1108 
    1109 creation-pthread$(EXEEXT):
    1110         $(BENCH_V_CC)$(COMPILE) $(srcdir)/creation/pthreads.c
    1111 
    1112 compile$(EXEEXT) :              \
     988        @echo "#!/bin/sh" > a.out
     989        @echo "java JavaThread" >> a.out
     990        @chmod a+x a.out
     991
     992compile$(EXEEXT) :\
    1113993        compile-array.make      \
    1114994        compile-attributes.make \
     
    11211001
    11221002compile-array$(EXEEXT):
    1123         $(CFACOMPILE) -fsyntax-only -w $(testdir)/array.cfa
     1003        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/array.cfa
    11241004
    11251005compile-attributes$(EXEEXT):
    1126         $(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
     1006        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/attributes.cfa
    11271007
    11281008compile-empty$(EXEEXT):
    1129         $(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.cfa
     1009        @$(CFACOMPILE) -fsyntax-only -w $(srcdir)/compile/empty.cfa
    11301010
    11311011compile-expression$(EXEEXT):
    1132         $(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.cfa
     1012        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/expression.cfa
    11331013
    11341014compile-io$(EXEEXT):
    1135         $(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.cfa
     1015        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/io1.cfa
    11361016
    11371017compile-monitor$(EXEEXT):
    1138         $(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
     1018        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/monitor.cfa
    11391019
    11401020compile-operators$(EXEEXT):
    1141         $(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.cfa
     1021        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/operators.cfa
    11421022
    11431023compile-thread$(EXEEXT):
    1144         $(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.cfa
     1024        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/concurrent/thread.cfa
    11451025
    11461026compile-typeof$(EXEEXT):
    1147         $(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.cfa
    1148 
    1149 size$(EXEEXT) : size-cfa.runquiet
    1150 
    1151 size-cfa$(EXEEXT):
    1152         $(BENCH_V_CFA)$(CFACOMPILE) $(srcdir)/size/size.cfa
     1027        @$(CFACOMPILE) -fsyntax-only -w $(testdir)/typeof.cfa
    11531028
    11541029# Tell versions [3.59,3.63) of GNU make to not export all variables.
  • benchmark/bench.h

    r3d5701e r9fb8f01  
    55#endif
    66        #include <stdlib.h>
    7         #include <stdint.h>                             // uint64_t
    8         #include <unistd.h>                             // sysconf
     7        #include <unistd.h>                                     // sysconf
    98#if ! defined(__cforall)
    109        #include <time.h>
     
    1615
    1716
    18 static inline uint64_t bench_time() {
    19         struct timespec ts;
    20         clock_gettime( CLOCK_THREAD_CPUTIME_ID, &ts );
    21         return 1000000000LL * ts.tv_sec + ts.tv_nsec;
    22 } // bench_time
     17static inline unsigned long long int bench_time() {
     18    struct timespec ts;
     19    clock_gettime(
     20#if defined( __linux__ )
     21         CLOCK_THREAD_CPUTIME_ID,
     22#elif defined( __freebsd__ )
     23         CLOCK_PROF,
     24#elif defined( __solaris__ )
     25         CLOCK_HIGHRES,
     26#else
     27    #error uC++ : internal error, unsupported architecture
     28#endif
     29         &ts );
     30    return 1000000000LL * ts.tv_sec + ts.tv_nsec;
     31} // Time
    2332
    2433#ifndef BENCH_N
    25 #define BENCH_N 10000000
     34#define BENCH_N 500 //10000000
    2635#endif
    2736
    28 size_t times = BENCH_N;
    29 
    30 #define BENCH_START()                           \
    31         if ( argc > 2 ) exit( EXIT_FAILURE );   \
    32         if ( argc == 2 ) {                      \
    33                 times = atoi( argv[1] );        \
    34         }
    35 
    3637#define BENCH(statement, output)                \
    37         uint64_t StartTime, EndTime;            \
     38        size_t n = BENCH_N;                     \
     39        if( argc > 2 ) return 1;                \
     40        if( argc == 2 ) {                               \
     41                n = atoi(argv[1]);              \
     42        }                                               \
     43        long long int StartTime, EndTime;       \
    3844        StartTime = bench_time();               \
    39         statement;                              \
     45        statement;                                      \
    4046        EndTime = bench_time();                 \
    41         double output = (double)( EndTime - StartTime ) / times;
    42 
     47        double output =         \
     48            (double)( EndTime - StartTime ) / n;
    4349
    4450#if defined(__cforall)
     
    4753}
    4854#endif
    49 #if defined(__U_CPLUSPLUS__)
    50 unsigned int uDefaultPreemption() {
    51         return 0;
    52 }
    53 #endif
  • benchmark/creation/JavaThread.java

    r3d5701e r9fb8f01  
    2626        static int x = 2;
    2727
    28         static private int times = Integer.parseInt("10000") ;
     28        static private final int NoOfTimes = Integer.parseInt("10000") ;
    2929
    3030        public static class MyThread extends Thread {
     
    3333        }
    3434        public static void helper() throws InterruptedException {
    35                 for(int i = 1; i <= times; i += 1) {
     35                for(int i = 1; i <= NoOfTimes; i += 1) {
    3636                        MyThread m = new MyThread();
    3737                        x = nextRandom( x );
     
    4444                helper();
    4545                long end = System.nanoTime();
    46                 System.out.println( (end - start) / times );
     46                System.out.println( (end - start) / NoOfTimes );
    4747        }
    4848        public static void main(String[] args) throws InterruptedException {
    49                 if ( args.length > 2 ) System.exit( 1 );
    50                 if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }
    51 
    52                 for (int i = Integer.parseInt("5"); --i >= 0 ; ) {
     49                for (int n = Integer.parseInt("5"); --n >= 0 ; ) {
    5350                        InnerMain();
    54                         Thread.sleep(2000);             // 2 seconds
     51                        Thread.sleep(2000);     // 2 seconds
    5552                        x = nextRandom(x);
    5653                }
     
    5855        }
    5956}
    60 
    61 // Local Variables: //
    62 // tab-width: 4 //
    63 // End: //
  • benchmark/creation/cfa_cor.cfa

    r3d5701e r9fb8f01  
    55
    66coroutine MyCoroutine {};
    7 void ?{}( MyCoroutine & this ) {
     7void ?{} (MyCoroutine & this) {
    88#ifdef EAGER
    9         resume( this );
     9        resume(this);
    1010#endif
    1111}
    12 void main( MyCoroutine & ) {}
     12void main(MyCoroutine &) {}
    1313
    14 int main( int argc, char * argv[] ) {
    15         BENCH_START()
     14int main(int argc, char* argv[]) {
    1615        BENCH(
    17                 for ( times ) {
    18                         MyCoroutine c;
     16                for ( i; n ) {
     17                        MyCoroutine m;
    1918                },
    2019                result
    2120        )
    22         printf( "%g\n", result );
     21
     22        printf("%g\n", result);
    2323}
    24 
    25 // Local Variables: //
    26 // tab-width: 4 //
    27 // End: //
  • benchmark/creation/cfa_thrd.cfa

    r3d5701e r9fb8f01  
    77void main(MyThread &) {}
    88
    9 int main( int argc, char * argv[] ) {
    10         BENCH_START()
     9int main(int argc, char* argv[]) {
    1110        BENCH(
    12                 for ( times ) {
     11                for ( i; n ) {
    1312                        MyThread m;
    1413                },
    1514                result
    1615        )
    17         printf( "%g\n", result );
     16
     17        printf("%g\n", result);
    1818}
    19 
    20 // Local Variables: //
    21 // tab-width: 4 //
    22 // End: //
  • benchmark/creation/goroutine.go

    r3d5701e r9fb8f01  
    22
    33import (
    4         "fmt"
    5         "time"
    6         "os"
    7         "strconv"
     4    "fmt"
     5    "time"
    86)
    97
     
    1917
    2018func main() {
    21         var times int = 10000000
    22         if len( os.Args ) > 2 { os.Exit( 1 ) }
    23         if len( os.Args ) == 2 { times, _ = strconv.Atoi(os.Args[1]) }
    24 
     19        const NoOfTimes = 500000
    2520        start := time.Now()
    26         for i := 1; i <= times; i += 1 {
     21        for i := 1; i <= NoOfTimes; i += 1 {
    2722                go noop()               // creation
    28                 <- shake                // wait for completion
    2923        }
    3024        end := time.Now()
    31         fmt.Printf( "%d\n", end.Sub(start) / time.Duration(times) )
     25        fmt.Printf("%d\n", end.Sub(start) / time.Duration(NoOfTimes))
     26        <- shake
    3227}
    33 
    34 // Local Variables: //
    35 // tab-width: 4 //
    36 // End: //
  • benchmark/creation/pthreads.c

    r3d5701e r9fb8f01  
    44#include "bench.h"
    55
    6 static void * foo(void *arg) {
     6static void *foo(void *arg) {
    77    return arg;
    88}
    99
    10 int main( int argc, char * argv[] ) {
    11         BENCH_START()
     10int main(int argc, char* argv[]) {
    1211        BENCH(
    13                 for (size_t i = 0; i < times; i++) {
     12                for (size_t i = 0; i < n; i++) {
    1413                        pthread_t thread;
    1514                        if (pthread_create(&thread, NULL, foo, NULL) < 0) {
     
    1716                                return 1;
    1817                        }
     18
    1919                        if (pthread_join( thread, NULL) < 0) {
    2020                                perror( "failure" );
     
    2424                result
    2525        )
    26         printf( "%g\n", result );
     26
     27        printf("%g\n", result);
    2728}
    28 
    29 // Local Variables: //
    30 // tab-width: 4 //
    31 // End: //
  • benchmark/creation/upp_cor.cc

    r3d5701e r9fb8f01  
    55_Coroutine MyCor {
    66        void main() {}
    7   public:
    8         MyCor() { resume(); }
    97};
    108
    11 int main( int argc, char * argv[] ) {
    12         BENCH_START()
     9int main(int argc, char* argv[]) {
    1310        BENCH(
    14                 for (size_t i = 0; i < times; i++) {
     11                for (size_t i = 0; i < n; i++) {
    1512                        MyCor m;
    1613                },
    1714                result
    1815        )
    19         printf( "%g\n", result );
     16
     17        printf("%g\n", result);
    2018}
    21 
    22 // Local Variables: //
    23 // tab-width: 4 //
    24 // End: //
  • benchmark/creation/upp_thrd.cc

    r3d5701e r9fb8f01  
    77};
    88
    9 int main( int argc, char * argv[] ) {
    10         BENCH_START()
     9int main(int argc, char* argv[]) {
    1110        BENCH(
    12                 for (size_t i = 0; i < times; i++) {
     11                for (size_t i = 0; i < n; i++) {
    1312                        MyThread m;
    1413                },
    1514                result
    1615        )
    17         printf( "%g\n", result );
     16
     17        printf("%g\n", result);
    1818}
    19 
    20 // Local Variables: //
    21 // tab-width: 4 //
    22 // End: //
  • benchmark/ctxswitch/JavaThread.java

    r3d5701e r9fb8f01  
    2626        static int x = 2;
    2727
    28         static private int times = Integer.parseInt("100000");
     28        static private final int NoOfTimes = Integer.parseInt("1000000") ;
    2929
    3030        public static void helper() {
    31                 for(int i = 1; i <= times; i += 1) {
     31                for(int i = 1; i <= NoOfTimes; i += 1) {
    3232                        Thread.yield();
    3333                }
     
    3737                helper();
    3838                long end = System.nanoTime();
    39                 System.out.println( (end - start) / times );
     39                System.out.println( (end - start) / NoOfTimes );
    4040        }
    4141        public static void main(String[] args) throws InterruptedException {
    42                 if ( args.length > 2 ) System.exit( 1 );
    43                 if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }
    44 
    45                 for (int i = Integer.parseInt("5"); --i >= 0 ; ) {
     42                for (int n = Integer.parseInt("5"); --n >= 0 ; ) {
    4643                        InnerMain();
    47                         Thread.sleep(2000);     // 2 seconds
     44                        Thread.sleep(2000);     // 2 seconds
    4845                        x = nextRandom(x);
    4946                }
     
    5148        }
    5249}
    53 
    54 // Local Variables: //
    55 // tab-width: 4 //
    56 // End: //
  • benchmark/ctxswitch/cfa_cor.cfa

    r3d5701e r9fb8f01  
    44#include "bench.h"
    55
    6 coroutine C {} c;
    7 void main( __attribute__((unused)) C & ) {
    8         while () {
     6coroutine GreatSuspender {};
     7
     8void ?{}( GreatSuspender & this ) {
     9        prime(this);
     10}
     11
     12void main( __attribute__((unused)) GreatSuspender & this ) {
     13        while( true ) {
    914                suspend();
    1015        }
    1116}
    12 int main( int argc, char * argv[] ) {
    13         BENCH_START()
     17
     18int main(int argc, char* argv[]) {
     19        GreatSuspender s;
     20
    1421        BENCH(
    15                 for ( times ) {
    16                         resume( c );
     22                for ( i; n ) {
     23                        resume( s );
    1724                },
    1825                result
    1926        )
    20         printf( "%g\n", result );
     27
     28        printf("%g\n", result);
    2129}
    22 
    23 // Local Variables: //
    24 // tab-width: 4 //
    25 // End: //
  • benchmark/ctxswitch/cfa_cor_then.cfa

    r3d5701e r9fb8f01  
    66void noOp(void) {}
    77
    8 coroutine C {} c;
     8coroutine GreatSuspender {};
    99
    10 void ?{}( C & this ) {
     10void ?{}( GreatSuspender & this ) {
    1111        prime(this);
    1212}
    1313
    14 void main( __attribute__((unused)) C & this ) {
    15         while () {
     14void main( __attribute__((unused)) GreatSuspender & this ) {
     15        while( true ) {
    1616                suspend_then(noOp);
    1717        }
    1818}
    1919
    20 int main( int argc, char * argv[] ) {
    21         BENCH_START()
     20int main(int argc, char* argv[]) {
     21        GreatSuspender s;
     22
    2223        BENCH(
    23                 for ( times ) {
    24                         resume( c );
     24                for ( i; n ) {
     25                        resume( s );
    2526                },
    2627                result
    2728        )
    28         printf( "%g\n", result );
     29
     30        printf("%g\n", result);
    2931}
    30 
    31 // Local Variables: //
    32 // tab-width: 4 //
    33 // End: //
  • benchmark/ctxswitch/cfa_gen.cfa

    r3d5701e r9fb8f01  
    33typedef struct {
    44        void * next;
    5 } C;
     5} GreatSuspender;
    66
    7 void comain( C * c ) {
    8         if ( __builtin_expect(c->next != 0, 1) ) goto *(c->next);
    9         c->next = &&s1;
     7void comain( GreatSuspender * this ) {
     8    if ( __builtin_expect(this->next != 0, 1) ) goto *(this->next);
     9    this->next = &&s1;
    1010        for () {
    11                 return;
     11            return;
    1212          s1: ;
    1313        }
    1414}
    1515
    16 int main( int argc, char * argv[] ) {
    17         BENCH_START()
    18         C c = { 0 };
     16int main(int argc, char* argv[]) {
     17    GreatSuspender s = { 0 };
     18
    1919        BENCH(
    20                 for ( times ) {
    21                         comain( &c );
     20                for ( i; n ) {
     21                        comain( &s );
    2222                },
    2323                result
    2424        )
    25         printf( "%g\n", result );
     25
     26        printf("%g\n", result);
    2627}
    27 
    28 // Local Variables: //
    29 // tab-width: 4 //
    30 // End: //
  • benchmark/ctxswitch/cfa_thrd.cfa

    r3d5701e r9fb8f01  
    33#include "bench.h"
    44
    5 int main( int argc, char * argv[] ) {
    6         BENCH_START()
     5int main(int argc, char* argv[]) {
    76        BENCH(
    8                 for ( times ) {
     7                for ( i; n ) {
    98                        yield();
    109                },
    1110                result
    1211        )
    13         printf( "%g\n", result );
     12
     13        printf("%g\n", result);
    1414}
    15 
    16 // Local Variables: //
    17 // tab-width: 4 //
    18 // End: //
  • benchmark/ctxswitch/cfa_thrd2.cfa

    r3d5701e r9fb8f01  
    88
    99void main(__attribute__((unused)) Fibre & this) {
    10         while ( ! done ) {
     10        while(!done) {
    1111                yield();
    1212        }
    1313}
    1414
    15 int main( int argc, char * argv[] ) {
    16         BENCH_START()
     15int main(int argc, char* argv[]) {
    1716        Fibre f1;
    1817        BENCH(
    19                 for ( times ) {
     18                for ( i; n ) {
    2019                        yield();
    2120                },
    2221                result
    2322        )
    24         printf( "%g\n", result );
     23
     24        printf("%g\n", result);
    2525        done = true;
     26        return 0;
    2627}
    27 
    28 // Local Variables: //
    29 // tab-width: 4 //
    30 // End: //
  • benchmark/ctxswitch/goroutine.go

    r3d5701e r9fb8f01  
    22
    33import (
    4         "fmt"
    5         "time"
    6         "os"
    7         "strconv"
    8         "runtime"
     4    "fmt"
     5    "runtime"
     6    "time"
    97)
    108
     
    3028
    3129func main() {
    32         var times int = 10000000
    33         if len( os.Args ) > 2 { os.Exit( 1 ) }
    34         if len( os.Args ) == 2 { times, _ = strconv.Atoi(os.Args[1]) }
    35         go ContextSwitch( times )               // context switch
     30        const NoOfTimes = 10000000
     31        go ContextSwitch( NoOfTimes )           // context switch
    3632        <- shake
    3733}
    38 
    39 // Local Variables: //
    40 // tab-width: 4 //
    41 // End: //
  • benchmark/ctxswitch/kos_fibre.cpp

    r3d5701e r9fb8f01  
    33#include "bench.h"
    44
    5 int main( int argc, char * argv[] ) {
    6         BENCH_START()
     5int main(int argc, char* argv[]) {
    76        BENCH(
    8                 for (size_t i = 0; i < times; i++) {
     7                for (size_t i = 0; i < n; i++) {
    98                        Fibre::yield();
    109                },
    1110                result
    1211        )
    13         printf( "%g\n", result );
     12        printf("%g\n", result);
     13        return 0;
    1414}
    15 
    16 // Local Variables: //
    17 // tab-width: 4 //
    18 // End: //
  • benchmark/ctxswitch/kos_fibre2.cpp

    r3d5701e r9fb8f01  
    1111}
    1212
    13 int main( int argc, char * argv[] ) {
    14         BENCH_START()
     13int main(int argc, char* argv[]) {
    1514        Fibre* f1 = (new Fibre)->run(f1main);
    1615        BENCH(
    17                 for (size_t i = 0; i < times; i++) {
     16                for (size_t i = 0; i < n; i++) {
    1817                        Fibre::yield();
    1918                },
    2019                result
    2120        )
    22         printf( "%g\n", result );
     21        printf("%g\n", result);
    2322        done = true;
    2423        Fibre::yield();
    2524        f1->join();
     25        return 0;
    2626}
    27 
    28 // Local Variables: //
    29 // tab-width: 4 //
    30 // End: //
  • benchmark/ctxswitch/pthreads.c

    r3d5701e r9fb8f01  
    66#include "bench.h"
    77
    8 int main( int argc, char * argv[] ) {
    9         BENCH_START()
     8int main(int argc, char* argv[]) {
    109        BENCH(
    11                 for (size_t i = 0; i < times; i++) {
     10                for (size_t i = 0; i < n; i++) {
    1211                        sched_yield();
    1312                },
    1413                result
    1514        )
    16         printf( "%g\n", result );
     15
     16        printf("%g\n", result);
    1717}
  • benchmark/ctxswitch/upp_cor.cc

    r3d5701e r9fb8f01  
    33#include "bench.h"
    44
    5 _Coroutine C {
     5_Coroutine GreatSuspender {
     6public:
     7        GreatSuspender() {
     8                resume();
     9        }
     10
     11        void do_resume() {
     12                resume();
     13        }
     14private:
    615        void main() {
    716                while( true ) {
     
    918                }
    1019        }
    11   public:
    12         void do_resume() {
    13                 resume();
    14         }
    15 } c;
    16 int main( int argc, char * argv[] ) {
    17         BENCH_START()
     20};
     21
     22int main(int argc, char* argv[]) {
     23        GreatSuspender s;
     24
    1825        BENCH(
    19                 for (size_t i = 0; i < times; i++) {
    20                         c.do_resume();
     26                for (size_t i = 0; i < n; i++) {
     27                        s.do_resume();
    2128                },
    2229                result
    2330        )
    24         printf( "%g\n", result );
     31
     32        printf("%g\n", result);
    2533}
    26 
    27 // Local Variables: //
    28 // tab-width: 4 //
    29 // End: //
  • benchmark/ctxswitch/upp_thrd.cc

    r3d5701e r9fb8f01  
    33#include "bench.h"
    44
    5 int main( int argc, char * argv[] ) {
    6         BENCH_START()
     5int main(int argc, char* argv[]) {
    76        BENCH(
    8                 for (size_t i = 0; i < times; i++) {
     7                for (size_t i = 0; i < n; i++) {
    98                        uThisTask().yield();
    109                },
    1110                result
    1211        )
    13         printf( "%g\n", result );
     12
     13        printf("%g\n", result);
    1414}
    15 
    16 // Local Variables: //
    17 // tab-width: 4 //
    18 // End: //
  • benchmark/mutex/JavaThread.java

    r3d5701e r9fb8f01  
    2626        static int x = 2;
    2727
    28         static private int times = Integer.parseInt("100000000");
     28        static private final int NoOfTimes = Integer.parseInt("100000000") ;
    2929
    3030        public synchronized void noop() {
     
    3535                // Inhibit biased locking ...
    3636                x = (j.hashCode() ^ System.identityHashCode(j)) | 1 ;     
    37                 for(int i = 1; i <= times; i += 1) {
     37                for(int i = 1; i <= NoOfTimes; i += 1) {
    3838                        x = nextRandom(x);
    3939                        j.noop();
     
    4444                helper();
    4545                long end = System.nanoTime();
    46                 System.out.println( (end - start) / times );
     46                System.out.println( (end - start) / NoOfTimes );
    4747        }
    4848        public static void main(String[] args) throws InterruptedException {
    49                 if ( args.length > 2 ) System.exit( 1 );
    50                 if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }
    51 
    5249                for (int n = Integer.parseInt("5"); --n >= 0 ; ) {
    5350                        InnerMain();
     
    5855        }
    5956}
    60 
    61 // Local Variables: //
    62 // tab-width: 4 //
    63 // End: //
  • benchmark/mutex/cfa1.cfa

    r3d5701e r9fb8f01  
    44#include "bench.h"
    55
    6 monitor M {} m1;
    7 void __attribute__((noinline)) call( M & mutex p1 ) {}
     6monitor M {};
     7void __attribute__((noinline)) call( M & mutex m ) {}
    88
    9 int main( int argc, char * argv[] ) {
    10         BENCH_START()
     9int main(int argc, char* argv[]) {
     10        M m;
    1111        BENCH(
    12                 for ( times ) {
    13                         call( m1 );
     12                for ( i; n ) {
     13                        call(m);
    1414                },
    1515                result
    1616        )
    17         printf( "%g\n", result );
     17
     18        printf("%g\n", result);
    1819}
    19 
    20 // Local Variables: //
    21 // tab-width: 4 //
    22 // End: //
  • benchmark/mutex/cfa2.cfa

    r3d5701e r9fb8f01  
    44#include "bench.h"
    55
    6 monitor M {} m1, m2;
     6monitor M {};
     7void __attribute__((noinline)) call( M & mutex m1, M & mutex m2 ) {}
    78
    8 void __attribute__((noinline)) call( M & mutex p1, M & mutex p2 ) {}
    9 
    10 int main( int argc, char * argv[] ) {
    11         BENCH_START()
     9int main(int argc, char* argv[]) {
     10        M m1, m2;
    1211        BENCH(
    13                 for ( times ) {
    14                         call( m1, m2 );
     12                for ( i; n ) {
     13                        call(m1, m2);
    1514                },
    1615                result
    1716        )
    18         printf( "%g\n", result );
     17
     18        printf("%g\n", result);
    1919}
    20 
    21 // Local Variables: //
    22 // tab-width: 4 //
    23 // End: //
  • benchmark/mutex/cfa4.cfa

    r3d5701e r9fb8f01  
    55
    66
    7 monitor M {} m1, m2, m3, m4;
    8 void __attribute__((noinline)) call( M & mutex p1, M & mutex p2, M & mutex p3, M & mutex p4 ) {}
     7monitor M {};
     8void __attribute__((noinline)) call( M & mutex m1, M & mutex m2, M & mutex m3, M & mutex m4 ) {}
    99
    10 int main( int argc, char * argv[] ) {
    11         BENCH_START()
     10int main(int argc, char* argv[]) {
     11        M m1, m2, m3, m4;
    1212        BENCH(
    13                 for ( times ) {
    14                         call( m1, m2, m3, m4 );
     13                for ( i; n ) {
     14                        call(m1, m2, m3, m4);
    1515                },
    1616                result
    1717        )
    18         printf( "%g\n", result );
     18
     19        printf("%g\n", result);
    1920}
    20 
    21 // Local Variables: //
    22 // tab-width: 4 //
    23 // End: //
  • benchmark/mutex/pthreads.c

    r3d5701e r9fb8f01  
    77
    88void __attribute__((noinline)) call() {
    9          pthread_mutex_lock( &mutex );
    10          pthread_mutex_unlock( &mutex );
     9         pthread_mutex_lock  (&mutex);
     10         pthread_mutex_unlock(&mutex);
    1111}
    12 int main( int argc, char * argv[] ) {
    13         BENCH_START()
     12
     13int main(int argc, char* argv[]) {
    1414        BENCH(
    15                 for ( size_t i = 0; i < times; i++ ) {
     15                for (size_t i = 0; i < n; i++) {
    1616                        call();
    1717                },
    1818                result
    1919        )
    20         printf( "%g\n", result );
     20
     21        printf("%g\n", result);
    2122}
    22 
    23 // Local Variables: //
    24 // tab-width: 4 //
    25 // End: //
  • benchmark/mutex/upp.cc

    r3d5701e r9fb8f01  
    88};
    99
    10 int main( int argc, char * argv[] ) {
    11         BENCH_START()
     10int main(int argc, char* argv[]) {
    1211        MyMonitor m;
    1312        BENCH(
    14                 for ( size_t i = 0; i < times; i++ ) {
     13                for (size_t i = 0; i < n; i++) {
    1514                        m.call();
    1615                },
    1716                result
    1817        )
    19         printf( "%g\n", result );
     18
     19        printf("%g\n", result);
    2020}
    21 
    22 // Local Variables: //
    23 // tab-width: 4 //
    24 // End: //
  • benchmark/schedext/cfa1.cfa

    r3d5701e r9fb8f01  
    44#include <stdio.h>
    55
    6 #include "../bench.h"
     6#include "bench.h"
    77
    8 monitor M {} m1;
     8int argc;
     9char** argv;
     10volatile int go = 0;
    911
    10 void __attribute__((noinline)) call( M & mutex p1 ) {}
    11 void __attribute__((noinline)) wait( M & mutex p1 ) {
    12         for ( times ) {
    13                 waitfor( call : p1 );
    14         }
     12monitor M {};
     13M m1;
     14
     15void __attribute__((noinline)) call( M & mutex a1 ) {}
     16
     17int  __attribute__((noinline)) wait( M & mutex a1 ) {
     18        go = 1;
     19        BENCH(
     20                for ( i; n ) {
     21                        waitfor(call, a1);
     22                },
     23                result
     24        )
     25
     26        printf("%g\n", result);
     27        go = 0;
     28        return 0;
    1529}
    1630
    1731thread T {};
     32void ^?{}( T & mutex this ) {}
    1833void main( T & ) {
    19         BENCH(
    20                 for ( times ) { call( m1 ); },
    21                 result
    22         )
    23         printf( "%g\n", result );
     34        while(go == 0) { yield(); }
     35        while(go == 1) { call(m1); }
     36
    2437}
    2538
    26 int main( int argc, char * argv[] ) {
    27         BENCH_START()
     39int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
    2840        T t;
    29         wait( m1 );
     41        return wait(m1);
    3042}
    31 
    32 // Local Variables: //
    33 // tab-width: 4 //
    34 // End: //
  • benchmark/schedext/cfa2.cfa

    r3d5701e r9fb8f01  
    44#include <stdio.h>
    55
    6 #include "../bench.h"
     6#include "bench.h"
    77
    8 monitor M {} m1, m2;
     8int argc;
     9char** argv;
     10volatile int go = 0;
    911
    10 void __attribute__((noinline)) call( M & mutex p1, M & mutex p2 ) {}
    11 void __attribute__((noinline)) wait( M & mutex p1, M & mutex p2 ) {
    12         for ( times ) {
    13                 waitfor( call : p1, p2 );
    14         }
    15 }
    16 thread T {};
    17 void main( T & ) {
     12monitor M {};
     13M m1, m2;
     14
     15void __attribute__((noinline)) call( M & mutex a1, M & mutex a2 ) {}
     16
     17int  __attribute__((noinline)) wait( M & mutex a1, M & mutex a2 ) {
     18        go = 1;
    1819        BENCH(
    19                 for ( times ) {
    20                         call( m1, m2 );
     20                for ( i; n ) {
     21                        waitfor(call, a1, a2);
    2122                },
    2223                result
    2324        )
    24         printf( "%g\n", result );
     25
     26        printf("%g\n", result);
     27        go = 0;
     28        return 0;
    2529}
    2630
    27 int main( int argc, char * argv[] ) {
    28         BENCH_START()
    29         T t;
    30         wait( m1, m2 );
     31thread T {};
     32void ^?{}( T & mutex this ) {}
     33void main( T & ) {
     34        while(go == 0) { yield(); }
     35        while(go == 1) { call(m1, m2); }
     36
    3137}
    3238
    33 // Local Variables: //
    34 // tab-width: 4 //
    35 // End: //
     39int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
     40        T t;
     41        return wait(m1, m2);
     42}
  • benchmark/schedext/cfa4.cfa

    r3d5701e r9fb8f01  
    44#include <stdio.h>
    55
    6 #include "../bench.h"
     6#include "bench.h"
    77
    8 monitor M {} m1, m2, m3, m4;
     8int argc;
     9char** argv;
     10volatile int go = 0;
    911
    10 void __attribute__((noinline)) call( M & mutex p1, M & mutex p2, M & mutex p3, M & mutex p4 ) {}
    11 void __attribute__((noinline)) wait( M & mutex p1, M & mutex p2, M & mutex p3, M & mutex p4 ) {
    12         for ( times ) {
    13                 waitfor( call : p1, p2, p3, p4 );
    14         }
    15 }
    16 thread T {};
    17 void main( T & ) {
     12monitor M {};
     13M m1, m2, m3, m4;
     14
     15void __attribute__((noinline)) call( M & mutex a1, M & mutex a2, M & mutex a3, M & mutex a4 ) {}
     16
     17int  __attribute__((noinline)) wait( M & mutex a1, M & mutex a2, M & mutex a3, M & mutex a4 ) {
     18        go = 1;
    1819        BENCH(
    19                 for ( times ) {
    20                         call( m1, m2, m3, m4 );
     20                for ( i; n ) {
     21                        waitfor(call, a1, a2, a3, a4);
    2122                },
    2223                result
    2324        )
    24         printf( "%g\n", result );
     25
     26        printf("%g\n", result);
     27        go = 0;
     28        return 0;
    2529}
    2630
    27 int main( int argc, char * argv[] ) {
    28         BENCH_START()
    29         T t;
    30         wait( m1, m2, m3, m4 );
     31thread T {};
     32void ^?{}( T & mutex this ) {}
     33void main( T & ) {
     34        while(go == 0) { yield(); }
     35        while(go == 1) { call(m1, m2, m3, m4); }
     36
    3137}
    3238
    33 // Local Variables: //
    34 // tab-width: 4 //
    35 // End: //
     39int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
     40        T t;
     41        return wait(m1, m2, m3, m4);
     42}
  • benchmark/schedext/upp.cc

    r3d5701e r9fb8f01  
    33#include "bench.h"
    44
     5int argc;
     6char** argv;
     7volatile int go = 0;
     8
    59_Monitor M {
    610public:
    711        void __attribute__((noinline)) call() {}
    8         void __attribute__((noinline)) wait() {
    9                 for ( size_t i = 0; i < times; i++ ) {
    10                         _Accept(call);
    11                 }
     12
     13        int __attribute__((noinline)) wait() {
     14                go = 1;
     15                BENCH(
     16                        for (size_t i = 0; i < n; i++) {
     17                                _Accept(call);
     18                        },
     19                        result
     20                )
     21
     22                printf("%g\n", result);
     23                go = 0;
     24                return 0;
    1225        }
    13 } m;
     26};
     27
     28M m;
    1429
    1530_Task T {
    1631        void main() {
    17                 BENCH(
    18                         for ( size_t i = 0; i < times; i++ ) {
    19                                 m.call();
    20                         },
    21                         result
    22                 )
    23                 printf( "%g\n", result );
     32                while(go == 0) { yield(); }
     33                while(go == 1) { m.call(); }
     34
    2435        }
    2536};
    2637
    27 int main( int argc, char * argv[] ) {
    28         BENCH_START()
     38int main(int margc, char* margv[]) {
     39        argc = margc;
     40        argv = margv;
    2941        T t;
    30         m.wait();
     42        return m.wait();
    3143}
    32 
    33 // Local Variables: //
    34 // tab-width: 4 //
    35 // End: //
  • benchmark/schedint/JavaThread.java

    r3d5701e r9fb8f01  
    4949        static int x = 2;
    5050
    51         static private int times = Integer.parseInt("1000000");
     51        static private final int NoOfTimes = Integer.parseInt("1000000") ;
    5252
    5353        public static void helper( Monitor m ) throws InterruptedException {
    54                 for(int i = 1; i <= times; i += 1) {
     54                for(int i = 1; i <= NoOfTimes; i += 1) {
    5555                        m.wait();               // relase monitor lock
    5656                        m.next = true;
     
    6363                synchronized(m) {
    6464                        s.start();
    65                         while( ! Monitor.go ) { // waiter must start first
     65                        while( !Monitor.go ) {
    6666                                Thread.yield();
    6767                        }
     
    7272                Monitor.go = false;
    7373                s.join();
    74                 System.out.println( (end - start) / times);
     74                System.out.println( (end - start) / NoOfTimes);
    7575        }
    7676        public static void main(String[] args) throws InterruptedException {
    77                 if ( args.length > 2 ) System.exit( 1 );
    78                 if ( args.length == 2 ) { times = Integer.parseInt(args[1]); }
    79 
    8077                for (int n = Integer.parseInt("5"); --n >= 0 ; ) {
    8178                        InnerMain();
     
    8683        }
    8784}
    88 
    89 // Local Variables: //
    90 // tab-width: 4 //
    91 // End: //
  • benchmark/schedint/cfa1.cfa

    r3d5701e r9fb8f01  
    44#include <stdio.h>
    55
    6 #include "../bench.h"
     6#include "bench.h"
    77
     8int argc;
     9char** argv;
    810volatile int go = 0;
    911
    1012condition c;
    11 monitor M {} m1;
     13monitor M {};
     14M m1;
    1215
    13 void __attribute__((noinline)) call( M & mutex p1 ) {
    14         signal( c );
     16void __attribute__((noinline)) call( M & mutex a1 ) {
     17        signal(c);
    1518}
    16 void __attribute__((noinline)) wait( M & mutex p1 ) {
     19
     20int  __attribute__((noinline)) wait( M & mutex a1 ) {
    1721        go = 1;
    18         for ( times ) {
    19                 wait( c );
    20         }
     22        BENCH(
     23                for ( i; n ) {
     24                        wait(c);
     25                },
     26                result
     27        )
     28
     29        printf("%g\n", result);
     30        go = 0;
     31        return 0;
    2132}
    2233
    2334thread T {};
     35void ^?{}( T & mutex ) {}
    2436void main( T & ) {
    25         while ( go == 0 ) { yield(); } // waiter must start first
    26         BENCH(
    27                 for ( times ) { call( m1 ); },
    28                 result
    29         )
    30         printf( "%g\n", result );
     37        while(go == 0) { yield(); }
     38        while(go == 1) { call(m1); }
     39
    3140}
    3241
    33 int main( int argc, char * argv[] ) {
    34         BENCH_START()
     42int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
    3543        T t;
    36         wait( m1 );
     44        return wait(m1);
    3745}
    38 
    39 // Local Variables: //
    40 // tab-width: 4 //
    41 // End: //
  • benchmark/schedint/cfa2.cfa

    r3d5701e r9fb8f01  
    44#include <stdio.h>
    55
    6 #include "../bench.h"
     6#include "bench.h"
    77
     8int argc;
     9char** argv;
    810volatile int go = 0;
    911
    1012condition c;
    11 monitor M {} m1, m2;
     13monitor M {};
     14M m1, m2;
    1215
    13 void __attribute__((noinline)) call( M & mutex p1, M & mutex p2 ) {
    14         signal( c );
     16void __attribute__((noinline)) call( M & mutex a1, M & mutex a2 ) {
     17        signal(c);
    1518}
    16 void __attribute__((noinline)) wait( M & mutex p1, M & mutex p2 ) {
     19
     20int  __attribute__((noinline)) wait( M & mutex a1, M & mutex a2 ) {
    1721        go = 1;
    18         for ( times ) {
    19                 wait( c );
    20         }
     22        BENCH(
     23                for ( i; n ) {
     24                        wait(c);
     25                },
     26                result
     27        )
     28
     29        printf("%g\n", result);
     30        go = 0;
     31        return 0;
    2132}
    2233
    2334thread T {};
     35void ^?{}( T & mutex this ) {}
    2436void main( T & ) {
    25         while ( go == 0 ) { yield(); } // waiter must start first
    26         BENCH(
    27                 for ( times ) { call( m1, m2 ); },
    28                 result
    29         )
    30         printf( "%g\n", result );
     37        while(go == 0) { yield(); }
     38        while(go == 1) { call(m1, m2); }
     39
    3140}
    3241
    33 int main( int argc, char * argv[] ) {
    34         BENCH_START()
     42int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
    3543        T t;
    36         wait( m1, m2 );
     44        return wait(m1, m2);
    3745}
    38 
    39 // Local Variables: //
    40 // tab-width: 4 //
    41 // End: //
  • benchmark/schedint/cfa4.cfa

    r3d5701e r9fb8f01  
    44#include <stdio.h>
    55
    6 #include "../bench.h"
     6#include "bench.h"
    77
     8int argc;
     9char** argv;
    810volatile int go = 0;
    911
    1012condition c;
    11 monitor M {} m1, m2, m3, m4;
     13monitor M {};
     14M m1, m2, m3, m4;
    1215
    13 void __attribute__((noinline)) call( M & mutex p1, M & mutex p2, M & mutex p3, M & mutex p4 ) {
    14         signal( c );
     16void __attribute__((noinline)) call( M & mutex a1, M & mutex a2, M & mutex a3, M & mutex a4 ) {
     17        signal(c);
    1518}
    16 void __attribute__((noinline)) wait( M & mutex p1, M & mutex p2, M & mutex p3, M & mutex p4 ) {
     19
     20int  __attribute__((noinline)) wait( M & mutex a1, M & mutex a2, M & mutex a3, M & mutex a4 ) {
    1721        go = 1;
    18         for ( times ) {
    19                 wait( c );
    20         }
     22        BENCH(
     23                for ( i; n ) {
     24                        wait(c);
     25                },
     26                result
     27        )
     28
     29        printf("%g\n", result);
     30        go = 0;
     31        return 0;
    2132}
    2233
    2334thread T {};
     35void ^?{}( T & mutex this ) {}
    2436void main( T & ) {
    25         while ( go == 0 ) { yield(); } // waiter must start first
    26         BENCH(
    27                 for ( times ) { call( m1, m2, m3, m4 ); },
    28                 result
    29         )
    30         printf( "%g\n", result );
     37        while(go == 0) { yield(); }
     38        while(go == 1) { call(m1, m2, m3, m4); }
     39
    3140}
    3241
    33 int main( int argc, char * argv[] ) {
    34         BENCH_START()
     42int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
    3543        T t;
    36         wait( m1, m2, m3, m4 );
     44        return wait(m1, m2, m3, m4);
    3745}
    38 
    39 // Local Variables: //
    40 // tab-width: 4 //
    41 // End: //
  • benchmark/schedint/pthreads.c

    r3d5701e r9fb8f01  
    44#include "bench.h"
    55
     6int argc;
     7char** argv;
    68volatile int go = 0;
    79
     10pthread_cond_t c;
    811pthread_mutex_t m;
    9 pthread_cond_t c;
    1012
    1113void __attribute__((noinline)) call() {
    12         pthread_mutex_lock( &m );
    13         pthread_cond_signal( &c );
    14         pthread_mutex_unlock( &m );
     14        pthread_mutex_lock(&m);
     15        pthread_cond_signal(&c);
     16        pthread_mutex_unlock(&m);
    1517}
    1618
    17 void __attribute__((noinline)) wait() {
     19int __attribute__((noinline)) wait() {
    1820        pthread_mutex_lock(&m);
    1921        go = 1;
    20         for ( size_t i = 0; i < times; i++ ) {
    21                 pthread_cond_wait( &c, &m );
    22         }
     22        BENCH(
     23                for (size_t i = 0; i < n; i++) {
     24                        pthread_cond_wait(&c, &m);
     25                },
     26                result
     27        )
     28
     29        printf("%g\n", result);
    2330        go = 0;
    24         pthread_mutex_unlock( &m );
     31        pthread_mutex_unlock(&m);
     32        return 0;
    2533}
    2634
    27 void * thread_main( __attribute__((unused)) void * arg ) {
    28         while ( go == 0 ) { sched_yield(); } // waiter must start first
    29         // barging for lock acquire => may not execute N times
    30         BENCH(
    31                 while ( go == 1 ) { call(); },
    32                 result
    33         )
    34         printf( "%g\n", result );
     35void* thread_main(__attribute__((unused)) void * arg ) {
     36        while(go == 0) { sched_yield(); }
     37        while(go == 1) { call(); }
    3538        return NULL;
    3639}
    3740
    38 int main( int argc, char * argv[] ) {
    39         BENCH_START()
     41int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
    4042        pthread_t thread;
    41         if ( pthread_create( &thread, NULL, thread_main, NULL ) < 0 ) {
     43        if (pthread_create(&thread, NULL, thread_main, NULL) < 0) {
    4244                perror( "failure" );
    4345                return 1;
    4446        }
    4547        wait();
    46         if ( pthread_join( thread, NULL ) < 0 ) {
     48        if (pthread_join( thread, NULL) < 0) {
    4749                perror( "failure" );
    4850                return 1;
    4951        }
     52        return 0;
    5053}
    51 
    52 // Local Variables: //
    53 // tab-width: 4 //
    54 // End: //
  • benchmark/schedint/upp.cc

    r3d5701e r9fb8f01  
    33#include "bench.h"
    44
     5int argc;
     6char** argv;
    57volatile int go = 0;
    68
     
    1113                cond.signal();
    1214        }
    13         void __attribute__((noinline)) wait() {
     15
     16        int __attribute__((noinline)) wait() {
    1417                go = 1;
    15                 for ( size_t i = 0; i < times; i++ ) {
    16                         cond.wait();
    17                 }
     18                BENCH(
     19                        for (size_t i = 0; i < n; i++) {
     20                                cond.wait();
     21                        },
     22                        result
     23                )
     24
     25                printf("%g\n", result);
     26                go = 0;
     27                return 0;
    1828        }
    19 } m;
     29};
     30
     31M m;
    2032
    2133_Task T {
    2234        void main() {
    23                 while ( go == 0 ) { yield(); } // waiter must start first
    24                 BENCH(
    25                         for ( size_t i = 0; i < times; i++ ) {
    26                                 m.call();
    27                         },
    28                         result
    29                 )
    30                 printf( "%g\n", result );
     35                while(go == 0) { yield(); }
     36                while(go == 1) { m.call(); }
     37
    3138        }
    3239};
    3340
    34 int main( int argc, char * argv[] ) {
    35         BENCH_START()
     41int main(__attribute__((unused)) int argc, __attribute__((unused)) char* argv[]) {
    3642        T t;
    37         m.wait();
     43        return m.wait();
    3844}
    39 
    40 // Local Variables: //
    41 // tab-width: 4 //
    42 // End: //
  • configure

    r3d5701e r9fb8f01  
    663663ac_ct_DUMPBIN
    664664DUMPBIN
     665LD
    665666FGREP
    666667EGREP
     
    700701LDFLAGS
    701702CXXFLAGS
     703CXX
    702704CFA_FLAGS
    703705LIBCFA_TARGET_MAKEFILES
     
    715717BUILD_IN_TREE_FLAGS
    716718CFACPP
    717 CFACC_INSTALL
    718719CFACC
    719720DRIVER_DIR
     
    722723CFA_INCDIR
    723724CFA_PREFIX
    724 HAS_DISTCC
    725 LD
    726 CXX
    727 ENABLE_DISTCC_FALSE
    728 ENABLE_DISTCC_TRUE
    729725DOendif
    730726DOifskipcompile
     
    801797enable_silent_rules
    802798with_cfa_name
    803 enable_distcc
    804799with_target_hosts
    805800enable_gprofiler
     
    14641459  --enable-silent-rules   less verbose build output (undo: "make V=1")
    14651460  --disable-silent-rules  verbose build output (undo: "make V=0")
    1466   --enable-distcc     whether or not to enable distributed compilation
    14671461  --enable-gprofiler     whether or not to enable gprofiler tools (if available)
    14681462  --enable-demangler     whether or not to build the demangler (executable and library)
     
    31903184
    31913185#==============================================================================
    3192 # distcc support
    3193 
    3194 # Check whether --enable-distcc was given.
    3195 if test "${enable_distcc+set}" = set; then :
    3196   enableval=$enable_distcc; enable_distcc=$enableval
    3197 else
    3198   enable_distcc=no
    3199 fi
    3200 
    3201 
    3202  if test x$enable_distcc = xyes; then
    3203   ENABLE_DISTCC_TRUE=
    3204   ENABLE_DISTCC_FALSE='#'
    3205 else
    3206   ENABLE_DISTCC_TRUE='#'
    3207   ENABLE_DISTCC_FALSE=
    3208 fi
    3209 
    3210 HAS_DISTCC="False"
    3211 
    3212 if test x$enable_distcc = xyes; then
    3213         CXX="distcc ${CXX}"
    3214         LD="distcc ${LD} -lstdc++"
    3215         HAS_DISTCC="True"
    3216         echo "Enabling distributed builds"
    3217 fi
    3218 
    3219 
    3220 
    3221 
    3222 
    3223 #==============================================================================
    32243186# Installation paths
    32253187
     
    33043266DRIVER_DIR=${TOP_BUILDDIR}driver/
    33053267CFACC=${DRIVER_DIR}cfa
    3306 CFACC_INSTALL=${CFA_BINDIR}${CFA_NAME}
    33073268CFACPP=${DRIVER_DIR}cfa-cpp
    3308 
    33093269
    33103270
     
    1705717017fi
    1705817018
    17059 if test -z "${ENABLE_DISTCC_TRUE}" && test -z "${ENABLE_DISTCC_FALSE}"; then
    17060   as_fn_error $? "conditional \"ENABLE_DISTCC\" was never defined.
    17061 Usually this means the macro was only invoked conditionally." "$LINENO" 5
    17062 fi
    1706317019if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
    1706417020  as_fn_error $? "conditional \"AMDEP\" was never defined.
  • configure.ac

    r3d5701e r9fb8f01  
    5858
    5959#==============================================================================
    60 # distcc support
    61 
    62 AC_ARG_ENABLE(distcc,
    63         [  --enable-distcc     whether or not to enable distributed compilation],
    64         enable_distcc=$enableval, enable_distcc=no)
    65 
    66 AM_CONDITIONAL([ENABLE_DISTCC], [test x$enable_distcc = xyes])
    67 HAS_DISTCC="False"
    68 
    69 if test x$enable_distcc = xyes; then
    70         CXX="distcc ${CXX}"
    71         LD="distcc ${LD} -lstdc++"
    72         HAS_DISTCC="True"
    73         echo "Enabling distributed builds"
    74 fi
    75 
    76 AC_SUBST(CXX)
    77 AC_SUBST(LD)
    78 AC_SUBST(HAS_DISTCC)
    79 
    80 #==============================================================================
    8160# Installation paths
    8261M4CFA_PARSE_PREFIX
     
    9372DRIVER_DIR=${TOP_BUILDDIR}driver/
    9473CFACC=${DRIVER_DIR}cfa
    95 CFACC_INSTALL=${CFA_BINDIR}${CFA_NAME}
    9674CFACPP=${DRIVER_DIR}cfa-cpp
    9775AC_SUBST(DRIVER_DIR)
    9876AC_SUBST(CFACC)
    99 AC_SUBST(CFACC_INSTALL)
    10077AC_SUBST(CFACPP)
    10178
  • doc/papers/concurrency/Paper.tex

    r3d5701e r9fb8f01  
    239239\lstMakeShortInline@%
    240240
    241 \newcommand{\commenttd}[1]{{\color{red}{Thierry : #1}}}
    242 
    243241\let\OLDthebibliography\thebibliography
    244242\renewcommand\thebibliography[1]{
     
    11651163% }
    11661164% int main() {
    1167 %
     1165% 
    11681166%       for ( int i = 0; i < 10; i += 1 ) {
    11691167%               printf( "%d\n", fib() );
     
    18361834                if ( random() % 3 ) transfer( b1, b2, 7 );
    18371835        }
    1838 }
     1836}   
    18391837int main() {
    18401838        `Person p1 = { b1, b2 }, p2 = { b2, b1 };`
     
    18661864                if ( random() % 3 ) transfer( b1, b2, 7 );
    18671865        }
    1868 }
     1866}   
    18691867int main() {
    18701868        `thread p1(person, ref(b1), ref(b2)), p2(person, ref(b2), ref(b1));`
     
    27412739% \section{Parallelism}
    27422740% \label{s:Parallelism}
    2743 %
     2741% 
    27442742% Historically, computer performance was about processor speeds.
    27452743% However, with heat dissipation being a direct consequence of speed increase, parallelism is the new source for increased performance~\cite{Sutter05, Sutter05b}.
     
    27482746% However, kernel threads are better as an implementation tool because of complexity and higher cost.
    27492747% Therefore, different abstractions are often layered onto kernel threads to simplify them, \eg pthreads.
    2750 %
    2751 %
     2748% 
     2749% 
    27522750% \subsection{User Threads}
    2753 %
     2751% 
    27542752% A direct improvement on kernel threads is user threads, \eg Erlang~\cite{Erlang} and \uC~\cite{uC++book}.
    27552753% This approach provides an interface that matches the language paradigms, gives more control over concurrency by the language runtime, and an abstract (and portable) interface to the underlying kernel threads across operating systems.
     
    27572755% Like kernel threads, user threads support preemption, which maximizes nondeterminism, but increases the potential for concurrency errors: race, livelock, starvation, and deadlock.
    27582756% \CFA adopts user-threads to provide more flexibility and a low-cost mechanism to build any other concurrency approach, \eg thread pools and actors~\cite{Actors}.
    2759 %
     2757% 
    27602758% A variant of user thread is \newterm{fibres}, which removes preemption, \eg Go~\cite{Go} @goroutine@s.
    27612759% Like functional programming, which removes mutation and its associated problems, removing preemption from concurrency reduces nondeterminism, making race and deadlock errors more difficult to generate.
  • driver/Makefile.in

    r3d5701e r9fb8f01  
    201201CCDEPMODE = @CCDEPMODE@
    202202CFACC = @CFACC@
    203 CFACC_INSTALL = @CFACC_INSTALL@
    204203CFACPP = @CFACPP@
    205204CFA_BACKEND_CC = @CFA_BACKEND_CC@
     
    232231FGREP = @FGREP@
    233232GREP = @GREP@
    234 HAS_DISTCC = @HAS_DISTCC@
    235233HOST_FLAGS = @HOST_FLAGS@
    236234INSTALL = @INSTALL@
  • driver/cc1.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Fri Aug 26 14:23:51 2005
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Oct 20 08:14:33 2019
    13 // Update Count     : 385
     12// Last Modified On : Fri Aug 23 15:06:27 2019
     13// Update Count     : 371
    1414//
    1515
     
    3333
    3434
    35 static string compiler_path( CFA_BACKEND_CC );                  // C compiler path/name
     35static string installlibdir( CFA_LIBDIR );                              // fixed location of cc1 and cfa-cpp commands when installed
     36static string compiler_path( CFA_BACKEND_CC );                  // path/name of C compiler
    3637static bool CFA_flag = false;                                                   // -CFA flag
    3738static bool save_temps = false;                                                 // -save-temps flag
    3839static string o_file;
    39 static string bprefix;
    4040
    4141
     
    5858
    5959
    60 static string __CFA_FLAGPREFIX__( "__CFA_FLAG" );               // "N__=" suffix
     60static string __CFA_FLAGPREFIX__( "__CFA_FLAG" );
    6161
    6262static void checkEnv1( const char * args[], int & nargs ) { // stage 1
     
    7070
    7171                if ( prefix( arg, __CFA_FLAGPREFIX__ ) ) {
    72                         string val( arg.substr( arg.find_first_of( "=" ) + 1 ) );
     72                        string val( arg.substr( __CFA_FLAGPREFIX__.size() + 4 ) );
    7373                        if ( prefix( val, "-compiler=" ) ) {
    7474                                compiler_path = val.substr( 10 );
     
    8989
    9090                if ( prefix( arg, __CFA_FLAGPREFIX__ ) ) {
    91                         string val( arg.substr( arg.find_first_of( "=" ) + 1 ) );
     91                        string val( arg.substr( __CFA_FLAGPREFIX__.size() + 4 ) );
    9292                        if ( prefix( val, "-compiler=" ) ) {
    9393                                compiler_path = val.substr( 10 );
     
    9898                        } else if ( prefix( val, "-o=" ) ) {            // output file for -CFA
    9999                                o_file = val.substr( 3 );
    100                         } else if ( prefix( val, "-B=" ) ) {            // location of cfa-cpp
    101                                 bprefix = val.substr( 3 );
    102                         } else {                                                                        // normal flag for cfa-cpp
    103                                 args[nargs++] = ( *new string( arg.substr( arg.find_first_of( "=" ) + 1 ) ) ).c_str();
     100                        } else {
     101                                args[nargs++] = ( *new string( arg.substr( __CFA_FLAGPREFIX__.size() + 4 ) ) ).c_str();
    104102                        } // if
    105103                } // if
     
    108106
    109107
    110 static char tmpname[] = P_tmpdir "/CFAXXXXXX.ifa";
     108static char tmpname[] = P_tmpdir "/CFAXXXXXX.i";
    111109static int tmpfilefd = -1;
    112110static bool startrm = false;
     
    293291
    294292                execvp( args[0], (char * const *)args );                // should not return
    295                 perror( "CC1 Translator error: stage 1 cpp, execvp" );
    296                 cerr << " invoked " << args[0] << endl;
     293                perror( "CC1 Translator error: stage 1, execvp" );
    297294                exit( EXIT_FAILURE );
    298295        } // if
     
    335332        #endif // __DEBUG_H__
    336333
    337         enum {
    338                 Color_Auto   = 0,
    339                 Color_Always = 1,
    340                 Color_Never  = 2,
    341         } color_arg = Color_Auto;
    342 
    343         const char * color_names[3] = { "--colors=auto", "--colors=always", "--colors=never" };
    344 
    345334        // process all the arguments
    346335
     
    349338                if ( prefix( arg, "-" ) ) {
    350339                        // strip inappropriate flags
    351 
    352                         if ( prefix( arg, "-fdiagnostics-color=" ) ) {
    353                                 string choice = arg.substr(20);
    354                                      if(choice == "always") color_arg = Color_Always;
    355                                 else if(choice == "never" ) color_arg = Color_Never;
    356                                 else if(choice == "auto"  ) color_arg = Color_Auto;
    357                         } else if ( arg == "-fno-diagnostics-color" ) {
    358                                 color_arg = Color_Auto;
    359                         }
    360340
    361341                        if ( arg == "-quiet" || arg == "-version" || arg == "-fpreprocessed" ||
     
    431411                        } // if
    432412                } else {
    433                         tmpfilefd = mkstemps( tmpname, 4 );
     413                        tmpfilefd = mkstemps( tmpname, 2 );
    434414                        if ( tmpfilefd == -1 ) {
    435415                                perror( "CC1 Translator error: stage 2, mkstemp" );
     
    447427
    448428        if ( fork() == 0 ) {                                                            // child runs CFA
    449                 cargs[0] = ( *new string( bprefix + "cfa-cpp" ) ).c_str();
     429                cargs[0] = ( *new string( installlibdir + "cfa-cpp" ) ).c_str();
     430
    450431                cargs[ncargs++] = cpp_in;
    451432
     
    457438                        cargs[ncargs++] = cfa_cpp_out.c_str();
    458439                } // if
    459 
    460                 cargs[ncargs++] = color_names[color_arg];
    461 
    462                 cargs[ncargs] = nullptr;                                                // terminate argument list
     440                cargs[ncargs] = nullptr;                                                        // terminate argument list
    463441
    464442                #ifdef __DEBUG_H__
     
    470448
    471449                execvp( cargs[0], (char * const *)cargs );              // should not return
    472                 perror( "CC1 Translator error: stage 2 cfa-cpp, execvp" );
    473                 cerr << " invoked " << cargs[0] << endl;
     450                perror( "CC1 Translator error: stage 2, execvp" );
    474451                exit( EXIT_FAILURE );
    475452        } // if
     
    507484                args[0] = compiler_path.c_str();
    508485                args[nargs++] = "-S";                                                   // only compile and put assembler output in specified file
    509                 args[nargs++] = "-x";
    510                 args[nargs++] = "cpp-output";
    511 
     486                if ( save_temps ) {                                                             // make gcc accept .ifa suffix
     487                        args[nargs++] = "-x";
     488                        args[nargs++] = "cpp-output";
     489                } // if
    512490                args[nargs++] = cfa_cpp_out.c_str();
    513491                args[nargs] = nullptr;                                                  // terminate argument list
     
    522500
    523501                execvp( args[0], (char * const *)args );                // should not return
    524                 perror( "CC1 Translator error: stage 2 cc1, execvp" );
    525                 cerr << " invoked " << args[0] << endl;
     502                perror( "CC1 Translator error: stage 2, execvp" );
    526503                exit( EXIT_FAILURE );                                                   // tell gcc not to go any further
    527504        } // if
    528505
    529506        wait( &code );                                                                          // wait for child to finish
     507
     508        if ( WIFSIGNALED(code) ) {                                                      // child failed ?
     509                rmtmpfile();                                                                    // remove tmpname
     510                cerr << "CC1 Translator error: stage 2, child failed " << WTERMSIG(code) << endl;
     511                exit( EXIT_FAILURE );
     512        } // if
     513
     514        #ifdef __DEBUG_H__
     515        cerr << "return code from gcc cc1:" << WEXITSTATUS(code) << endl;
     516        #endif // __DEBUG_H__
     517
    530518        rmtmpfile();                                                                            // remove tmpname
    531 
    532         if ( WIFSIGNALED(code) ) {                                                      // child failed ?
    533                 cerr << "CC1 Translator error: stage 2, child failed " << WTERMSIG(code) << endl;
    534                 exit( EXIT_FAILURE );
    535         } // if
    536 
    537         #ifdef __DEBUG_H__
    538         cerr << "return code from gcc cc1:" << WEXITSTATUS(code) << endl;
    539         #endif // __DEBUG_H__
    540 
    541519        exit( WEXITSTATUS( code ) );                                            // stop regardless of success or failure
    542520} // Stage2
  • driver/cfa.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Aug 20 13:44:49 2002
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jan 31 16:48:03 2020
    13 // Update Count     : 421
     12// Last Modified On : Fri Aug 23 16:27:07 2019
     13// Update Count     : 411
    1414//
    1515
    1616#include <iostream>
    17 #include <cstdio>      // perror
    18 #include <cstdlib>     // putenv, exit
    19 #include <climits>     // PATH_MAX
    20 #include <unistd.h>    // execvp
    21 #include <string>      // STL version
    22 #include <string.h>    // strcmp
    23 #include <algorithm>   // find
     17#include <cstdio>                                                                               // perror
     18#include <cstdlib>                                                                              // putenv, exit
     19#include <unistd.h>                                                                             // execvp
     20#include <string>                                                                               // STL version
     21#include <string.h>                                                                             // strcmp
     22#include <algorithm>                                                                    // find
    2423
    2524#include <sys/types.h>
     
    3433using std::to_string;
    3534
    36 // #define __DEBUG_H__
    37 
    38 // "N__=" suffix
    39 static string __CFA_FLAGPREFIX__( "__CFA_FLAG" );
     35//#define __DEBUG_H__
     36
    4037
    4138void Putenv( char * argv[], string arg ) {
    42         // environment variables must have unique names
    43         static int flags = 0;
    44 
    45         if ( putenv( (char *)( *new string( string( __CFA_FLAGPREFIX__ + to_string( flags++ ) + "__=" ) + arg ) ).c_str() ) ) {
     39        static int flags = 0;                                                           // environment variables must have unique names
     40
     41        if ( putenv( (char *)( *new string( string( "__CFA_FLAG" + to_string( flags++ ) + "__=" ) + arg ) ).c_str() ) ) {
    4642                cerr << argv[0] << " error, cannot set environment variable." << endl;
    4743                exit( EXIT_FAILURE );
     
    4945} // Putenv
    5046
    51 // check if string has prefix
    52 bool prefix( const string & arg, const string & pre ) {
     47
     48bool prefix( const string & arg, const string & pre ) { // check if string has prefix
    5349        return arg.substr( 0, pre.size() ) == pre;
    5450} // prefix
    5551
    56 inline bool ends_with(const string & str, const string & sfix) {
    57         if (sfix.size() > str.size()) return false;
    58         return std::equal(str.rbegin(), str.rbegin() + sfix.size(), sfix.rbegin(), sfix.rend());
    59 }
    60 
    61 // check if string has suffix
    62 bool suffix( const string & arg ) {
     52bool suffix( const string & arg ) {                                             // check if string has suffix
    6353        enum { NumSuffixes = 3 };
    6454        static const string suffixes[NumSuffixes] = { "cfa", "hfa", "ifa" };
     
    7464    struct stat info;
    7565    if ( stat( path.c_str(), &info ) != 0 ) return false;
    76         return (info.st_mode & S_IFDIR) != 0;
     66    if ( info.st_mode & S_IFDIR ) return true;
     67        return false;
    7768} // dirExists
    78 
    79 static inline string dir(const string & path) {
    80         return path.substr(0, path.find_last_of('/'));
    81 }
    82 
    83 // Different path modes
    84 enum PathMode {
    85         Installed,     // cfa is installed, use prefix
    86         BuildTree,     // cfa is in the tree, use source and build tree
    87         Distributed    // cfa is distributed, use build tree for includes and executable directory for .cfs
    88 };
    89 
    90 // Get path mode from /proc
    91 PathMode FromProc() {
    92         std::string abspath;
    93         abspath.resize(PATH_MAX);
    94 
    95         // get executable path from /proc/self/exe
    96         ssize_t size = readlink("/proc/self/exe", const_cast<char*>(abspath.c_str()), abspath.size());
    97         if(size <= 0) {
    98                 std::cerr << "Error could not evaluate absolute path from /proc/self/exe" << std::endl;
    99                 std::cerr << "Failed with " << std::strerror(errno) << std::endl;
    100                 std::exit(1);
    101         }
    102 
    103         // Trim extra characters
    104         abspath.resize(size);
    105 
    106         // Are we installed
    107         if(abspath.rfind(CFA_BINDIR  , 0) == 0) { return Installed; }
    108 
    109         // Is this the build tree
    110         if(abspath.rfind(TOP_BUILDDIR, 0) == 0) { return BuildTree; }
    111 
    112         // Does this look like distcc
    113         if(abspath.find("/.cfadistcc/") != std::string::npos) { return Distributed; }
    114 
    115         // None of the above? Give up since we don't know where the prelude or include directories are
    116         std::cerr << "Cannot find required files from excutable path " << abspath << std::endl;
    117         std::exit(1);
    118 }
    11969
    12070
     
    13282        string heading;                                                                         // banner printed at start of cfa compilation
    13383        string arg;                                                                                     // current command-line argument during command-line parsing
    134         string bprefix;                                                                         // path where gcc looks for compiler steps
     84        string Bprefix;                                                                         // path where gcc looks for compiler command steps
    13585        string langstd;                                                                         // language standard
    13686
     
    153103        bool m32 = false;                                                                       // -m32 flag
    154104        bool m64 = false;                                                                       // -m64 flag
    155         bool compiling_libs = false;
     105        bool intree = false;                                                            // build in tree
    156106        int o_file = 0;                                                                         // -o filename position
    157 
    158         PathMode path = FromProc();
    159107
    160108        const char *args[argc + 100];                                           // cfa command line values, plus some space for additional flags
     
    187135                        } else if ( arg == "-XCFA" ) {                          // CFA pass through
    188136                                i += 1;
    189                                 if ( i == argc ) continue;                              // next argument available ?
    190137                                Putenv( argv, argv[i] );
    191138
     
    212159                        } else if ( arg == "-no-include-stdhdr" ) {
    213160                                noincstd_flag = true;                                   // strip the no-include-stdhdr flag
    214                         } else if ( arg == "-cfalib") {
    215                                 compiling_libs = true;
     161                        } else if ( arg == "-in-tree" ) {
     162                                intree = true;
    216163                        } else if ( arg == "-compiler" ) {
    217164                                // use the user specified compiler
     
    264211                                } // if
    265212                        } else if ( prefix( arg, "-B" ) ) {
    266                                 bprefix = arg.substr(2);                                // strip the -B flag
     213                                Bprefix = arg.substr(2);                                // strip the -B flag
     214                                args[nargs++] = ( *new string( string("-D__GCC_BPREFIX__=") + Bprefix ) ).c_str();
    267215                        } else if ( arg == "-c" || arg == "-S" || arg == "-E" || arg == "-M" || arg == "-MM" ) {
    268216                                args[nargs++] = argv[i];                                // pass argument along
     
    315263        // -E flag stops at cc1 stage 1, so cfa-cpp in cc1 stage 2 is never executed.
    316264        if ( cpp_flag && CFA_flag ) {
    317                 CFA_flag = false;
    318                 cerr << argv[0] << " warning, both -E and -CFA flags specified, using -E and ignoring -CFA." << endl;
     265                cerr << argv[0] << " error, cannot use -E and -CFA flags together." << endl;
     266                exit( EXIT_FAILURE );
    319267        } // if
    320268
    321269        // add the CFA include-library paths, which allow direct access to header files without directory qualification
    322         string libbase;
    323         switch(path) {
    324         case Installed:
     270        if ( ! intree ) {
    325271                args[nargs++] = "-I" CFA_INCDIR;
    326                 // do not use during build
    327                 if ( ! noincstd_flag ) {
     272                if ( ! noincstd_flag ) {                                                // do not use during build
    328273                        args[nargs++] = "-I" CFA_INCDIR "stdhdr";
    329274                } // if
    330275                args[nargs++] = "-I" CFA_INCDIR "concurrency";
    331276                args[nargs++] = "-I" CFA_INCDIR "containers";
    332                 libbase = CFA_LIBDIR;
    333                 break;
    334         case BuildTree:
    335         case Distributed:
     277        } else {
    336278                args[nargs++] = "-I" TOP_SRCDIR "libcfa/src";
    337                 // do not use during build
    338                 if ( ! noincstd_flag ) {
     279                if ( ! noincstd_flag ) {                                                // do not use during build
    339280                        args[nargs++] = "-I" TOP_SRCDIR "libcfa/src" "/stdhdr";
    340281                } // if
    341282                args[nargs++] = "-I" TOP_SRCDIR "libcfa/src" "/concurrency";
    342283                args[nargs++] = "-I" TOP_SRCDIR "libcfa/src" "/containers";
    343 
    344                 libbase = TOP_BUILDDIR "libcfa/";
    345 
    346                 break;
    347284        } // if
    348285
     
    351288        args[nargs++] = "stdbool.h";
    352289
    353         if( compiling_libs ) {
     290        string libbase;
     291        if ( ! intree ) {
     292                libbase = CFA_LIBDIR;
     293        } else {
     294                libbase = TOP_BUILDDIR "libcfa/";
    354295                Putenv( argv, "-t" );
    355296        } // if
     
    364305        } // if
    365306
    366         const char * config = nolib ? "nolib" : (debug ? "debug": "nodebug");
    367         string libdir = libbase + arch + "-" + config;
    368 
    369         if (path != Distributed) {
    370                 if ( ! nolib && ! dirExists( libdir ) ) {
    371                         cerr << argv[0] << " internal error, configuration " << config << " not installed." << endl;
    372                         cerr << "Was looking for " << libdir << endl;
    373                         for(int i = 1; i < argc; i++) {
    374                                 cerr << argv[i] << " ";
    375                         }
    376                         cerr << endl;
    377                         libdir = libbase + arch + "-" + "nolib";
    378                 } // if
    379 
    380                 if ( ! dirExists( libdir ) ) {
    381                         cerr << argv[0] << " internal error, cannot find prelude directory." << endl;
    382                         cerr << "Was looking for " << libdir << endl;
    383                         exit( EXIT_FAILURE );
    384                 } // if
    385         } // if
    386 
    387         switch(path) {
    388         case Installed   : Putenv( argv, "--prelude-dir=" + libdir ); break;
    389         case BuildTree   : Putenv( argv, "--prelude-dir=" + libdir + "/prelude" ); break;
    390         case Distributed : Putenv( argv, "--prelude-dir=" + dir(argv[0]) ); break;
    391         }
     307        string libdir( libbase + arch + "-" + (nolib ? "nolib" : (debug ? "debug": "nodebug")) );
     308        if ( ! dirExists( libdir ) ) {
     309                cerr << argv[0] << " internal error, cannot find prelude directory " << libdir << endl;
     310                exit( EXIT_FAILURE );
     311        } // if
    392312
    393313        for ( int i = 0; i < nlibs; i += 1 ) {                          // copy non-user libraries after all user libraries
     
    402322                args[nargs++] = "-Xlinker";
    403323                args[nargs++] = "--undefined=__cfaabi_appready_startup";
    404                 args[nargs++] = "-z";
    405                 args[nargs++] = "execstack";
    406 
    407                 // include the cfa library in case it is needed
    408                 args[nargs++] = ( *new string( string("-L" ) + libdir + (path != Installed ? "/src/.libs" : "")) ).c_str();
    409                 args[nargs++] = ( *new string( string("-Wl,-rpath," ) + libdir + (path != Installed ? "/src/.libs" : "")) ).c_str();
     324
     325                // include the cfa library in case it's needed
     326                args[nargs++] = ( *new string( string("-L" ) + libdir + (intree ? "/src/.libs" : "")) ).c_str();
     327                args[nargs++] = ( *new string( string("-Wl,-rpath," ) + libdir + (intree ? "/src/.libs" : "")) ).c_str();
    410328                args[nargs++] = "-Wl,--push-state,--as-needed";
    411329                args[nargs++] = "-lcfathread";
    412330                args[nargs++] = "-Wl,--pop-state";
    413                 args[nargs++] = "-Wl,--push-state,--no-as-needed";
    414331                args[nargs++] = "-lcfa";
    415                 args[nargs++] = "-Wl,--pop-state";
    416                 args[nargs++] = "-pthread";
     332                args[nargs++] = "-lpthread";
    417333                args[nargs++] = "-ldl";
    418334                args[nargs++] = "-lrt";
     
    445361        } // if
    446362
     363        Putenv( argv, "--prelude-dir=" + libdir + (intree ? "/prelude" : "") );
     364
    447365        if ( debug ) {
    448366                heading += " (debug)";
     
    452370        } // if
    453371
    454         if ( bprefix.length() == 0 ) {
    455                 switch(path) {
    456                 case Installed   : bprefix = installlibdir; break;
    457                 case BuildTree   : bprefix = srcdriverdir ; break;
    458                 case Distributed : bprefix = dir(argv[0]) ; break;
    459                 }
    460                 if ( bprefix[bprefix.length() - 1] != '/' ) bprefix += '/';
    461                 Putenv( argv, string("-B=") + bprefix );
     372        if ( Bprefix.length() == 0 ) {
     373                Bprefix = ! intree ? installlibdir : srcdriverdir;
     374                if ( Bprefix[Bprefix.length() - 1] != '/' ) Bprefix += '/';
     375                args[nargs++] = ( *new string( string("-D__GCC_BPREFIX__=") + Bprefix ) ).c_str();
    462376        } // if
    463377
     
    487401                args[nargs++] = "-fgnu89-inline";
    488402                args[nargs++] = "-D__int8_t_defined";                   // prevent gcc type-size attributes
    489                 args[nargs++] = ( *new string( string("-B") + bprefix ) ).c_str();
     403                args[nargs++] = ( *new string( string("-B") + Bprefix ) ).c_str();
    490404        } else {
    491405                cerr << argv[0] << " error, compiler \"" << compiler_name << "\" unsupported." << endl;
     
    501415                cerr << " \"" << args[i] << "\"" << endl;
    502416        } // for
    503         cerr << endl;
    504417        #endif // __DEBUG_H__
    505418
    506419        if ( ! quiet ) {
    507420                cerr << "CFA " << "Version " << Version << heading << endl;
     421
    508422                if ( help ) {
    509423                        cerr <<
  • libcfa/Makefile.in

    r3d5701e r9fb8f01  
    231231CFACC = @CFACC@
    232232CFACPP = @CFACPP@
    233 CFADIR_HASH = @CFADIR_HASH@
    234233CFA_BINDIR = @CFA_BINDIR@
    235234CFA_INCDIR = @CFA_INCDIR@
     
    275274LIPO = @LIPO@
    276275LN_S = @LN_S@
    277 LOCAL_CC1 = @LOCAL_CC1@
    278 LOCAL_CFACC = @LOCAL_CFACC@
    279276LTLIBOBJS = @LTLIBOBJS@
    280277LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
  • libcfa/automake/missing

    • Property mode changed from 100644 to 120000
    r3d5701e r9fb8f01  
    1 #! /bin/sh
    2 # Tdelisle : having the Makefiles.in automatically regenerated causes problems
    3 #            when using multiple versions of automake, even if only on end user machines
    4 #            therefore I am disabling that feature by commenting this script
    5 exit 0
     1/usr/share/automake-1.15/missing
  • libcfa/configure

    r3d5701e r9fb8f01  
    707707CONFIG_CFLAGS
    708708ARCH_FLAGS
    709 CFADIR_HASH
    710 LOCAL_CC1
    711 LOCAL_CFACC
    712709CFACPP
    713710CFACC
    714 ENABLE_DISTCC_FALSE
    715 ENABLE_DISTCC_TRUE
    716711CFA_VERSION
    717712DRIVER_DIR
     
    788783enable_option_checking
    789784enable_silent_rules
    790 enable_distcc
    791785with_cfa_name
    792786enable_shared
     
    14511445  --enable-silent-rules   less verbose build output (undo: "make V=1")
    14521446  --disable-silent-rules  verbose build output (undo: "make V=0")
    1453   --enable-distcc     whether or not to enable distributed compilation
    14541447  --enable-shared[=PKGS]  build shared libraries [default=yes]
    14551448  --enable-static[=PKGS]  build static libraries [default=yes]
     
    29482941
    29492942
    2950 # Check whether --enable-distcc was given.
    2951 if test "${enable_distcc+set}" = set; then :
    2952   enableval=$enable_distcc; enable_distcc=$enableval
    2953 else
    2954   enable_distcc=no
    2955 fi
    2956 
    2957 
    2958 echo -n "checking for distributated build... "
    2959 if test x$enable_distcc = xno; then
    2960         CFACC=${DRIVER_DIR}cfa
    2961         echo "no"
    2962 else
    2963         tools="$(readlink -m $ac_confdir/)/../tools/build"
    2964         config=$(basename $(readlink -f .))
    2965         echo "$tools/distcc_hash $config"
    2966         CFADIR_HASH=$($tools/distcc_hash $config)
    2967         CFACC="distcc ~/.cfadistcc/${CFADIR_HASH}/cfa"
    2968         echo "yes (hash=${CFADIR_HASH})"
    2969 fi
     2943CFACC=${DRIVER_DIR}cfa
    29702944CFACPP=${DRIVER_DIR}cfa-cpp
    2971 LOCAL_CFACC=${DRIVER_DIR}cfa
    2972 LOCAL_CC1=${DRIVER_DIR}cc1
    2973 
    2974  if test x$enable_distcc = xyes; then
    2975   ENABLE_DISTCC_TRUE=
    2976   ENABLE_DISTCC_FALSE='#'
    2977 else
    2978   ENABLE_DISTCC_TRUE='#'
    2979   ENABLE_DISTCC_FALSE=
    2980 fi
    2981 
    2982 
    2983 
    2984 
    2985 
    29862945
    29872946
     
    30002959case $CONFIGURATION in
    30012960        "debug"   )
    3002                 CONFIG_CFLAGS="-O0 -g"
     2961                CONFIG_CFLAGS="-Og -g"
    30032962                CONFIG_CFAFLAGS="-debug"
    30042963                CONFIG_BUILDLIB="yes"
     
    1702316982fi
    1702416983
    17025 if test -z "${ENABLE_DISTCC_TRUE}" && test -z "${ENABLE_DISTCC_FALSE}"; then
    17026   as_fn_error $? "conditional \"ENABLE_DISTCC\" was never defined.
    17027 Usually this means the macro was only invoked conditionally." "$LINENO" 5
    17028 fi
    1702916984if test -z "${BUILDLIB_TRUE}" && test -z "${BUILDLIB_FALSE}"; then
    1703016985  as_fn_error $? "conditional \"BUILDLIB\" was never defined.
  • libcfa/configure.ac

    r3d5701e r9fb8f01  
    2727AC_ARG_VAR(CFA_VERSION, [The long version of cfa])
    2828
    29 AC_ARG_ENABLE(distcc,
    30         [  --enable-distcc     whether or not to enable distributed compilation],
    31         enable_distcc=$enableval, enable_distcc=no)
    32 
    33 echo -n "checking for distributated build... "
    34 if test x$enable_distcc = xno; then
    35         CFACC=${DRIVER_DIR}cfa
    36         echo "no"
    37 else
    38         tools="$(readlink -m $ac_confdir/)/../tools/build"
    39         config=$(basename $(readlink -f .))
    40         echo "$tools/distcc_hash $config"
    41         CFADIR_HASH=$($tools/distcc_hash $config)
    42         CFACC="distcc ~/.cfadistcc/${CFADIR_HASH}/cfa"
    43         echo "yes (hash=${CFADIR_HASH})"
    44 fi
     29CFACC=${DRIVER_DIR}cfa
    4530CFACPP=${DRIVER_DIR}cfa-cpp
    46 LOCAL_CFACC=${DRIVER_DIR}cfa
    47 LOCAL_CC1=${DRIVER_DIR}cc1
    48 
    49 AM_CONDITIONAL([ENABLE_DISTCC], [test x$enable_distcc = xyes])
    50 
    5131AC_SUBST(CFACC)
    5232AC_SUBST(CFACPP)
    53 AC_SUBST(LOCAL_CFACC)
    54 AC_SUBST(LOCAL_CC1)
    55 AC_SUBST(CFADIR_HASH)
    5633AC_SUBST(CFA_VERSION)
    5734
     
    6845case $CONFIGURATION in
    6946        "debug"   )
    70                 CONFIG_CFLAGS="-O0 -g"
     47                CONFIG_CFLAGS="-Og -g"
    7148                CONFIG_CFAFLAGS="-debug"
    7249                CONFIG_BUILDLIB="yes"
  • libcfa/prelude/Makefile.am

    r3d5701e r9fb8f01  
    1111## Created On       : Sun May 31 08:54:01 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Mon Feb  3 21:27:18 2020
    14 ## Update Count     : 208
     13## Last Modified On : Wed Dec 14 15:00:35 2016
     14## Update Count     : 205
    1515###############################################################################
    1616
     
    2323cfalib_DATA = gcc-builtins.cf builtins.cf extras.cf prelude.cfa bootloader.c
    2424
    25 CC = @LOCAL_CFACC@
     25CC = @CFACC@
    2626AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC @ARCH_FLAGS@ @CONFIG_CFLAGS@
    2727AM_CFAFLAGS = @CONFIG_CFAFLAGS@
     
    3636extras.cf : ${srcdir}/extras.regx ${srcdir}/extras.c
    3737        ${AM_V_GEN}gcc ${AM_CFLAGS} -E ${srcdir}/extras.c | grep -f ${srcdir}/extras.regx > extras.cf
    38         ${AM_V_GEN}gcc ${AM_CFLAGS} -E ${srcdir}/extras.c | grep -zo -f ${srcdir}/extras.regx2 | tr '\0' '\n' >> extras.cf
    3938
    4039# create forward declarations for gcc builtins
     
    5554
    5655# create forward declarations for cfa builtins
    57 builtins.cf : builtins.c @LOCAL_CFACC@
     56builtins.cf : builtins.c ${CC}
    5857        ${AM_V_GEN}gcc ${AM_CFLAGS} -E -P ${<} -o ${@} -MD -MP -MF $(DEPDIR)/builtins.Po -D__cforall
    5958        ${AM_V_at}sed -i 's/builtins.o/builtins.cf/g' $(DEPDIR)/builtins.Po
     
    6968MOSTLYCLEANFILES = bootloader.c builtins.cf extras.cf gcc-builtins.c gcc-builtins.cf prelude.cfa
    7069MAINTAINERCLEANFILES = ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}}
    71 
    72 if ENABLE_DISTCC
    73 distribution: @LOCAL_CFACC@ @LOCAL_CC1@ @CFACPP@ gcc-builtins.cf builtins.cf extras.cf prelude.cfa bootloader.c $(srcdir)/../../tools/build/push2dist.sh
    74         ${AM_V_GEN}$(srcdir)/../../tools/build/push2dist.sh @CFADIR_HASH@
    75         @echo "Dummy file to track distribution to remote hosts" > ${@}
    76 
    77 all: all-am distribution
    78 endif ENABLE_DISTCC
  • libcfa/prelude/Makefile.in

    r3d5701e r9fb8f01  
    1 # Makefile.in generated by automake 1.16.1 from Makefile.am.
     1# Makefile.in generated by automake 1.15 from Makefile.am.
    22# @configure_input@
    33
    4 # Copyright (C) 1994-2018 Free Software Foundation, Inc.
     4# Copyright (C) 1994-2014 Free Software Foundation, Inc.
    55
    66# This Makefile.in is free software; the Free Software Foundation
     
    167167AUTOMAKE = @AUTOMAKE@
    168168AWK = @AWK@
    169 CC = @LOCAL_CFACC@
     169CC = @CFACC@
    170170CCAS = @CCAS@
    171171CCASDEPMODE = @CCASDEPMODE@
     
    174174CFACC = @CFACC@
    175175CFACPP = @CFACPP@
    176 CFADIR_HASH = @CFADIR_HASH@
    177176CFA_BINDIR = @CFA_BINDIR@
    178177CFA_INCDIR = @CFA_INCDIR@
     
    218217LIPO = @LIPO@
    219218LN_S = @LN_S@
    220 LOCAL_CC1 = @LOCAL_CC1@
    221 LOCAL_CFACC = @LOCAL_CFACC@
    222219LTLIBOBJS = @LTLIBOBJS@
    223220LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
     
    331328            cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
    332329          *) \
    333             echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
    334             cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
     330            echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
     331            cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
    335332        esac;
    336333
     
    377374
    378375
    379 distdir: $(BUILT_SOURCES)
    380         $(MAKE) $(AM_MAKEFLAGS) distdir-am
    381 
    382 distdir-am: $(DISTFILES)
     376distdir: $(DISTFILES)
    383377        @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
    384378        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
     
    543537extras.cf : ${srcdir}/extras.regx ${srcdir}/extras.c
    544538        ${AM_V_GEN}gcc ${AM_CFLAGS} -E ${srcdir}/extras.c | grep -f ${srcdir}/extras.regx > extras.cf
    545         ${AM_V_GEN}gcc ${AM_CFLAGS} -E ${srcdir}/extras.c | grep -zo -f ${srcdir}/extras.regx2 | tr '\0' '\n' >> extras.cf
    546539
    547540# create forward declarations for gcc builtins
     
    562555
    563556# create forward declarations for cfa builtins
    564 builtins.cf : builtins.c @LOCAL_CFACC@
     557builtins.cf : builtins.c ${CC}
    565558        ${AM_V_GEN}gcc ${AM_CFLAGS} -E -P ${<} -o ${@} -MD -MP -MF $(DEPDIR)/builtins.Po -D__cforall
    566559        ${AM_V_at}sed -i 's/builtins.o/builtins.cf/g' $(DEPDIR)/builtins.Po
     
    573566maintainer-clean-local :
    574567        rm -rf $(DEPDIR)
    575 
    576 @ENABLE_DISTCC_TRUE@distribution: @LOCAL_CFACC@ @LOCAL_CC1@ @CFACPP@ gcc-builtins.cf builtins.cf extras.cf prelude.cfa bootloader.c $(srcdir)/../../tools/build/push2dist.sh
    577 @ENABLE_DISTCC_TRUE@    ${AM_V_GEN}$(srcdir)/../../tools/build/push2dist.sh @CFADIR_HASH@
    578 @ENABLE_DISTCC_TRUE@    @echo "Dummy file to track distribution to remote hosts" > ${@}
    579 
    580 @ENABLE_DISTCC_TRUE@all: all-am distribution
    581568
    582569# Tell versions [3.59,3.63) of GNU make to not export all variables.
  • libcfa/prelude/builtins.c

    r3d5701e r9fb8f01  
    1010// Created On       : Fri Jul 21 16:21:03 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Nov 21 16:31:39 2019
    13 // Update Count     : 101
     12// Last Modified On : Tue Jun 25 18:06:52 2019
     13// Update Count     : 97
    1414//
    1515
     
    6969
    7070// universal typed pointer constant
    71 static inline forall( dtype DT ) DT * intptr( uintptr_t addr ) { return (DT *)addr; }
     71// Compiler issue: there is a problem with anonymous types that do not have a size.
     72static inline forall( dtype DT | sized(DT) ) DT * intptr( uintptr_t addr ) { return (DT *)addr; }
    7273
    7374// exponentiation operator implementation
  • libcfa/prelude/extras.regx

    r3d5701e r9fb8f01  
    1919typedef.* uint32_t;
    2020typedef.* uint64_t;
    21 typedef.* __uint_least16_t;
    22 typedef.* __uint_least32_t;
    2321typedef.* char16_t;
    2422typedef.* char32_t;
    2523typedef.* wchar_t;
     24extern.*\*malloc\(.*\).*
     25extern.* free\(.*\).*
     26extern.* exit\(.*\).*
     27extern.* atexit\(.*\).*
     28extern.* abort\(.*\).*
     29extern.* printf\(.*\).*
  • libcfa/prelude/prototypes.awk

    r3d5701e r9fb8f01  
    1010# Created On       : Sat May 16 07:57:37 2015
    1111# Last Modified By : Peter A. Buhr
    12 # Last Modified On : Sat Feb  8 09:46:58 2020
    13 # Update Count     : 36
     12# Last Modified On : Thu Jun  6 20:46:28 2019
     13# Update Count     : 34
    1414#
    1515
     
    1717
    1818BEGIN {
    19         FS = "[( )]"
     19  FS = "[( )]"
    2020        # order so string search is longest string
    2121        i=-1
     
    8484
    8585/BT_FN/ {
    86         for (i = 1; i <= NF; i += 1 ) {
    87                 if ( match($i, "BT_FN") != 0 ) {
    88                         prototypes[$i] = $i
    89                 }
     86        for (i = 1; i <= NF; i++) {
     87          if( match($i, "BT_FN") != 0 ) {
     88                prototypes[$i] = $i
     89          }
    9090        }
    91 }
     91  }
    9292
    9393END {
     
    103103
    104104        for ( prototype in prototypes ) {
    105                 # printf( "//\"%s\"\n", prototype )
    106                 if ( index( "BT_LAST", prototype ) == 1 ) {
    107                         continue
     105          # printf( "//\"%s\"\n", prototype )
     106          if ( index( "BT_LAST", prototype ) == 1 ) {
     107                continue
     108          } # if
     109
     110          printf( "#define %s(NAME) FUNC_SIMPLE(", prototype )
     111
     112          if ( sub( "BT_FN_", "", prototype ) == 0 ) {
     113                printf( "\n********** BAD MACRO NAME \"%s\" **********\n", prototype )
     114                exit 0
     115          } # if
     116
     117          # generate function return type as macro
     118          for ( t = 0; t < N; t += 1 ) {                                        # find longest match
     119                type = types[t];
     120                if ( index( prototype, type ) == 1 ) {          # found match
     121                  printf( "BT_%s, NAME", type )
     122                  sub( type, "", prototype )
     123                  break;
    108124                } # if
     125          } # for
    109126
    110                 printf( "#define %s(NAME) FUNC_SIMPLE(", prototype )
    111 
    112                 if ( sub( "BT_FN_", "", prototype ) == 0 ) {
    113                         printf( "\n********** BAD MACRO NAME \"%s\" **********\n", prototype )
     127          # generate function parameter types as macro
     128          if ( index( prototype, "VAR" ) != 2 ) {                       # C-style empty parameters ?
     129                for ( p = 0; length( prototype ) > 0; p += 1 ) { # until all parameters types are removed
     130                  sub( "_", "", prototype)                              # remove "_"
     131                  printf( ", ", type )
     132                  temp = prototype
     133                  for ( t = 0; t < N; t += 1 ) {                        # find longest match
     134                        type = types[t];
     135                        if ( index( prototype, type ) == 1 ) { # found match
     136                          printf( "BT_%s", type )
     137                          sub( type, "", prototype )
     138                          break;
     139                        } # if
     140                  } # for
     141                  if ( temp == prototype ) {                            # no match found for parameter in macro table
     142                        printf( "\n********** MISSING TYPE \"%s\" **********\n", prototype )
    114143                        exit 0
    115                 } # if
    116 
    117                 # generate function return type as macro
    118                 for ( t = 0; t < N; t += 1 ) {                                  # find longest match
    119                         type = types[t];
    120                         if ( index( prototype, type ) == 1 ) {          # found match
    121                                 printf( "BT_%s, NAME", type )
    122                                 sub( type, "", prototype )
    123                                 break;
    124                         } # if
     144                  } # if
    125145                } # for
    126 
    127                 # generate function parameter types as macro
    128                 if ( index( prototype, "VAR" ) != 2 ) {                 # C-style empty parameters ?
    129                         for ( p = 0; length( prototype ) > 0; p += 1 ) { # until all parameters types are removed
    130                                 sub( "_", "", prototype)                                # remove "_"
    131                                 printf( ", ", type )
    132                                 temp = prototype
    133                                 for ( t = 0; t < N; t += 1 ) {                  # find longest match
    134                                         type = types[t];
    135                                         if ( index( prototype, type ) == 1 ) { # found match
    136                                                 printf( "BT_%s", type )
    137                                                 sub( type, "", prototype )
    138                                                 break;
    139                                         } # if
    140                                 } # for
    141                                 if ( temp == prototype ) {                              # no match found for parameter in macro table
    142                                         printf( "\n********** MISSING TYPE \"%s\" **********\n", prototype )
    143                                         exit 0
    144                                 } # if
    145                         } # for
    146                 } # if
    147                 printf( ")\n" )
     146          } # if
     147          printf( ")\n" )
    148148        } # for
    149149
  • libcfa/prelude/sync-builtins.cf

    r3d5701e r9fb8f01  
    11char __sync_fetch_and_add(volatile char *, char,...);
     2char __sync_fetch_and_add_1(volatile char *, char,...);
    23signed char __sync_fetch_and_add(volatile signed char *, signed char,...);
     4signed char __sync_fetch_and_add_1(volatile signed char *, signed char,...);
    35unsigned char __sync_fetch_and_add(volatile unsigned char *, unsigned char,...);
     6unsigned char __sync_fetch_and_add_1(volatile unsigned char *, unsigned char,...);
    47signed short __sync_fetch_and_add(volatile signed short *, signed short,...);
     8signed short __sync_fetch_and_add_2(volatile signed short *, signed short,...);
    59unsigned short __sync_fetch_and_add(volatile unsigned short *, unsigned short,...);
     10unsigned short __sync_fetch_and_add_2(volatile unsigned short *, unsigned short,...);
    611signed int __sync_fetch_and_add(volatile signed int *, signed int,...);
     12signed int __sync_fetch_and_add_4(volatile signed int *, signed int,...);
    713unsigned int __sync_fetch_and_add(volatile unsigned int *, unsigned int,...);
    8 signed long int __sync_fetch_and_add(volatile signed long int *, signed long int,...);
    9 unsigned long int __sync_fetch_and_add(volatile unsigned long int *, unsigned long int,...);
     14unsigned int __sync_fetch_and_add_4(volatile unsigned int *, unsigned int,...);
    1015signed long long int __sync_fetch_and_add(volatile signed long long int *, signed long long int,...);
     16signed long long int __sync_fetch_and_add_8(volatile signed long long int *, signed long long int,...);
    1117unsigned long long int __sync_fetch_and_add(volatile unsigned long long int *, unsigned long long int,...);
     18unsigned long long int __sync_fetch_and_add_8(volatile unsigned long long int *, unsigned long long int,...);
    1219#if defined(__SIZEOF_INT128__)
    1320signed __int128 __sync_fetch_and_add(volatile signed __int128 *, signed __int128,...);
     21signed __int128 __sync_fetch_and_add_16(volatile signed __int128 *, signed __int128,...);
    1422unsigned __int128 __sync_fetch_and_add(volatile unsigned __int128 *, unsigned __int128,...);
     23unsigned __int128 __sync_fetch_and_add_16(volatile unsigned __int128 *, unsigned __int128,...);
    1524#endif
    1625
    1726char __sync_fetch_and_sub(volatile char *, char,...);
     27char __sync_fetch_and_sub_1(volatile char *, char,...);
    1828signed char __sync_fetch_and_sub(volatile signed char *, signed char,...);
     29signed char __sync_fetch_and_sub_1(volatile signed char *, signed char,...);
    1930unsigned char __sync_fetch_and_sub(volatile unsigned char *, unsigned char,...);
     31unsigned char __sync_fetch_and_sub_1(volatile unsigned char *, unsigned char,...);
    2032signed short __sync_fetch_and_sub(volatile signed short *, signed short,...);
     33signed short __sync_fetch_and_sub_2(volatile signed short *, signed short,...);
    2134unsigned short __sync_fetch_and_sub(volatile unsigned short *, unsigned short,...);
     35unsigned short __sync_fetch_and_sub_2(volatile unsigned short *, unsigned short,...);
    2236signed int __sync_fetch_and_sub(volatile signed int *, signed int,...);
     37signed int __sync_fetch_and_sub_4(volatile signed int *, signed int,...);
    2338unsigned int __sync_fetch_and_sub(volatile unsigned int *, unsigned int,...);
    24 signed long int __sync_fetch_and_sub(volatile signed long int *, signed long int,...);
    25 unsigned long int __sync_fetch_and_sub(volatile unsigned long int *, unsigned long int,...);
     39unsigned int __sync_fetch_and_sub_4(volatile unsigned int *, unsigned int,...);
    2640signed long long int __sync_fetch_and_sub(volatile signed long long int *, signed long long int,...);
     41signed long long int __sync_fetch_and_sub_8(volatile signed long long int *, signed long long int,...);
    2742unsigned long long int __sync_fetch_and_sub(volatile unsigned long long int *, unsigned long long int,...);
     43unsigned long long int __sync_fetch_and_sub_8(volatile unsigned long long int *, unsigned long long int,...);
    2844#if defined(__SIZEOF_INT128__)
    2945signed __int128 __sync_fetch_and_sub(volatile signed __int128 *, signed __int128,...);
     46signed __int128 __sync_fetch_and_sub_16(volatile signed __int128 *, signed __int128,...);
    3047unsigned __int128 __sync_fetch_and_sub(volatile unsigned __int128 *, unsigned __int128,...);
     48unsigned __int128 __sync_fetch_and_sub_16(volatile unsigned __int128 *, unsigned __int128,...);
    3149#endif
    3250
    3351char __sync_fetch_and_or(volatile char *, char,...);
     52char __sync_fetch_and_or_1(volatile char *, char,...);
    3453signed char __sync_fetch_and_or(volatile signed char *, signed char,...);
     54signed char __sync_fetch_and_or_1(volatile signed char *, signed char,...);
    3555unsigned char __sync_fetch_and_or(volatile unsigned char *, unsigned char,...);
     56unsigned char __sync_fetch_and_or_1(volatile unsigned char *, unsigned char,...);
    3657signed short __sync_fetch_and_or(volatile signed short *, signed short,...);
     58signed short __sync_fetch_and_or_2(volatile signed short *, signed short,...);
    3759unsigned short __sync_fetch_and_or(volatile unsigned short *, unsigned short,...);
     60unsigned short __sync_fetch_and_or_2(volatile unsigned short *, unsigned short,...);
    3861signed int __sync_fetch_and_or(volatile signed int *, signed int,...);
     62signed int __sync_fetch_and_or_4(volatile signed int *, signed int,...);
    3963unsigned int __sync_fetch_and_or(volatile unsigned int *, unsigned int,...);
    40 signed long int __sync_fetch_and_or(volatile signed long int *, signed long int,...);
    41 unsigned long int __sync_fetch_and_or(volatile unsigned long int *, unsigned long int,...);
     64unsigned int __sync_fetch_and_or_4(volatile unsigned int *, unsigned int,...);
    4265signed long long int __sync_fetch_and_or(volatile signed long long int *, signed long long int,...);
     66signed long long int __sync_fetch_and_or_8(volatile signed long long int *, signed long long int,...);
    4367unsigned long long int __sync_fetch_and_or(volatile unsigned long long int *, unsigned long long int,...);
     68unsigned long long int __sync_fetch_and_or_8(volatile unsigned long long int *, unsigned long long int,...);
    4469#if defined(__SIZEOF_INT128__)
    4570signed __int128 __sync_fetch_and_or(volatile signed __int128 *, signed __int128,...);
     71signed __int128 __sync_fetch_and_or_16(volatile signed __int128 *, signed __int128,...);
    4672unsigned __int128 __sync_fetch_and_or(volatile unsigned __int128 *, unsigned __int128,...);
     73unsigned __int128 __sync_fetch_and_or_16(volatile unsigned __int128 *, unsigned __int128,...);
    4774#endif
    4875
    4976char __sync_fetch_and_and(volatile char *, char,...);
     77char __sync_fetch_and_and_1(volatile char *, char,...);
    5078signed char __sync_fetch_and_and(volatile signed char *, signed char,...);
     79signed char __sync_fetch_and_and_1(volatile signed char *, signed char,...);
    5180unsigned char __sync_fetch_and_and(volatile unsigned char *, unsigned char,...);
     81unsigned char __sync_fetch_and_and_1(volatile unsigned char *, unsigned char,...);
    5282signed short __sync_fetch_and_and(volatile signed short *, signed short,...);
     83signed short __sync_fetch_and_and_2(volatile signed short *, signed short,...);
    5384unsigned short __sync_fetch_and_and(volatile unsigned short *, unsigned short,...);
     85unsigned short __sync_fetch_and_and_2(volatile unsigned short *, unsigned short,...);
    5486signed int __sync_fetch_and_and(volatile signed int *, signed int,...);
     87signed int __sync_fetch_and_and_4(volatile signed int *, signed int,...);
    5588unsigned int __sync_fetch_and_and(volatile unsigned int *, unsigned int,...);
    56 signed long int __sync_fetch_and_and(volatile signed long int *, signed long int,...);
    57 unsigned long int __sync_fetch_and_and(volatile unsigned long int *, unsigned long int,...);
     89unsigned int __sync_fetch_and_and_4(volatile unsigned int *, unsigned int,...);
    5890signed long long int __sync_fetch_and_and(volatile signed long long int *, signed long long int,...);
     91signed long long int __sync_fetch_and_and_8(volatile signed long long int *, signed long long int,...);
    5992unsigned long long int __sync_fetch_and_and(volatile unsigned long long int *, unsigned long long int,...);
     93unsigned long long int __sync_fetch_and_and_8(volatile unsigned long long int *, unsigned long long int,...);
    6094#if defined(__SIZEOF_INT128__)
    6195signed __int128 __sync_fetch_and_and(volatile signed __int128 *, signed __int128,...);
     96signed __int128 __sync_fetch_and_and_16(volatile signed __int128 *, signed __int128,...);
    6297unsigned __int128 __sync_fetch_and_and(volatile unsigned __int128 *, unsigned __int128,...);
     98unsigned __int128 __sync_fetch_and_and_16(volatile unsigned __int128 *, unsigned __int128,...);
    6399#endif
    64100
    65101char __sync_fetch_and_xor(volatile char *, char,...);
     102char __sync_fetch_and_xor_1(volatile char *, char,...);
    66103signed char __sync_fetch_and_xor(volatile signed char *, signed char,...);
     104signed char __sync_fetch_and_xor_1(volatile signed char *, signed char,...);
    67105unsigned char __sync_fetch_and_xor(volatile unsigned char *, unsigned char,...);
     106unsigned char __sync_fetch_and_xor_1(volatile unsigned char *, unsigned char,...);
    68107signed short __sync_fetch_and_xor(volatile signed short *, signed short,...);
     108signed short __sync_fetch_and_xor_2(volatile signed short *, signed short,...);
    69109unsigned short __sync_fetch_and_xor(volatile unsigned short *, unsigned short,...);
     110unsigned short __sync_fetch_and_xor_2(volatile unsigned short *, unsigned short,...);
    70111signed int __sync_fetch_and_xor(volatile signed int *, signed int,...);
     112signed int __sync_fetch_and_xor_4(volatile signed int *, signed int,...);
    71113unsigned int __sync_fetch_and_xor(volatile unsigned int *, unsigned int,...);
    72 signed long int __sync_fetch_and_xor(volatile signed long int *, signed long int,...);
    73 unsigned long int __sync_fetch_and_xor(volatile unsigned long int *, unsigned long int,...);
     114unsigned int __sync_fetch_and_xor_4(volatile unsigned int *, unsigned int,...);
    74115signed long long int __sync_fetch_and_xor(volatile signed long long int *, signed long long int,...);
     116signed long long int __sync_fetch_and_xor_8(volatile signed long long int *, signed long long int,...);
    75117unsigned long long int __sync_fetch_and_xor(volatile unsigned long long int *, unsigned long long int,...);
     118unsigned long long int __sync_fetch_and_xor_8(volatile unsigned long long int *, unsigned long long int,...);
    76119#if defined(__SIZEOF_INT128__)
    77120signed __int128 __sync_fetch_and_xor(volatile signed __int128 *, signed __int128,...);
     121signed __int128 __sync_fetch_and_xor_16(volatile signed __int128 *, signed __int128,...);
    78122unsigned __int128 __sync_fetch_and_xor(volatile unsigned __int128 *, unsigned __int128,...);
     123unsigned __int128 __sync_fetch_and_xor_16(volatile unsigned __int128 *, unsigned __int128,...);
    79124#endif
    80125
    81126char __sync_fetch_and_nand(volatile char *, char,...);
     127char __sync_fetch_and_nand_1(volatile char *, char,...);
    82128signed char __sync_fetch_and_nand(volatile signed char *, signed char,...);
     129signed char __sync_fetch_and_nand_1(volatile signed char *, signed char,...);
    83130unsigned char __sync_fetch_and_nand(volatile unsigned char *, unsigned char,...);
     131unsigned char __sync_fetch_and_nand_1(volatile unsigned char *, unsigned char,...);
    84132signed short __sync_fetch_and_nand(volatile signed short *, signed short,...);
     133signed short __sync_fetch_and_nand_2(volatile signed short *, signed short,...);
    85134unsigned short __sync_fetch_and_nand(volatile unsigned short *, unsigned short,...);
     135unsigned short __sync_fetch_and_nand_2(volatile unsigned short *, unsigned short,...);
    86136signed int __sync_fetch_and_nand(volatile signed int *, signed int,...);
     137signed int __sync_fetch_and_nand_4(volatile signed int *, signed int,...);
    87138unsigned int __sync_fetch_and_nand(volatile unsigned int *, unsigned int,...);
    88 signed long int __sync_fetch_and_nand(volatile signed long int *, signed long int,...);
    89 unsigned long int __sync_fetch_and_nand(volatile unsigned long int *, unsigned long int,...);
     139unsigned int __sync_fetch_and_nand_4(volatile unsigned int *, unsigned int,...);
    90140signed long long int __sync_fetch_and_nand(volatile signed long long int *, signed long long int,...);
     141signed long long int __sync_fetch_and_nand_8(volatile signed long long int *, signed long long int,...);
    91142unsigned long long int __sync_fetch_and_nand(volatile unsigned long long int *, unsigned long long int,...);
     143unsigned long long int __sync_fetch_and_nand_8(volatile unsigned long long int *, unsigned long long int,...);
    92144#if defined(__SIZEOF_INT128__)
    93145signed __int128 __sync_fetch_and_nand(volatile signed __int128 *, signed __int128,...);
     146signed __int128 __sync_fetch_and_nand_16(volatile signed __int128 *, signed __int128,...);
    94147unsigned __int128 __sync_fetch_and_nand(volatile unsigned __int128 *, unsigned __int128,...);
     148unsigned __int128 __sync_fetch_and_nand_16(volatile unsigned __int128 *, unsigned __int128,...);
    95149#endif
    96150
    97151char __sync_add_and_fetch(volatile char *, char,...);
     152char __sync_add_and_fetch_1(volatile char *, char,...);
    98153signed char __sync_add_and_fetch(volatile signed char *, signed char,...);
     154signed char __sync_add_and_fetch_1(volatile signed char *, signed char,...);
    99155unsigned char __sync_add_and_fetch(volatile unsigned char *, unsigned char,...);
     156unsigned char __sync_add_and_fetch_1(volatile unsigned char *, unsigned char,...);
    100157signed short __sync_add_and_fetch(volatile signed short *, signed short,...);
     158signed short __sync_add_and_fetch_2(volatile signed short *, signed short,...);
    101159unsigned short __sync_add_and_fetch(volatile unsigned short *, unsigned short,...);
     160unsigned short __sync_add_and_fetch_2(volatile unsigned short *, unsigned short,...);
    102161signed int __sync_add_and_fetch(volatile signed int *, signed int,...);
     162signed int __sync_add_and_fetch_4(volatile signed int *, signed int,...);
    103163signed int __sync_add_and_fetch(volatile signed int *, signed int,...);
    104 signed long int __sync_add_and_fetch(volatile signed long int *, signed long int,...);
    105 unsigned long int __sync_add_and_fetch(volatile unsigned long int *, unsigned long int,...);
     164signed int __sync_add_and_fetch_4(volatile signed int *, signed int,...);
    106165signed long long int __sync_add_and_fetch(volatile signed long long int *, signed long long int,...);
     166signed long long int __sync_add_and_fetch_8(volatile signed long long int *, signed long long int,...);
    107167unsigned long long int __sync_add_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
     168unsigned long long int __sync_add_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
    108169#if defined(__SIZEOF_INT128__)
    109170signed __int128 __sync_add_and_fetch(volatile signed __int128 *, signed __int128,...);
     171signed __int128 __sync_add_and_fetch_16(volatile signed __int128 *, signed __int128,...);
    110172unsigned __int128 __sync_add_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
     173unsigned __int128 __sync_add_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
    111174#endif
    112175
    113176char __sync_sub_and_fetch(volatile char *, char,...);
     177char __sync_sub_and_fetch_1(volatile char *, char,...);
    114178signed char __sync_sub_and_fetch(volatile signed char *, signed char,...);
     179signed char __sync_sub_and_fetch_1(volatile signed char *, signed char,...);
    115180unsigned char __sync_sub_and_fetch(volatile unsigned char *, unsigned char,...);
     181unsigned char __sync_sub_and_fetch_1(volatile unsigned char *, unsigned char,...);
    116182signed short __sync_sub_and_fetch(volatile signed short *, signed short,...);
     183signed short __sync_sub_and_fetch_2(volatile signed short *, signed short,...);
    117184unsigned short __sync_sub_and_fetch(volatile unsigned short *, unsigned short,...);
     185unsigned short __sync_sub_and_fetch_2(volatile unsigned short *, unsigned short,...);
    118186signed int __sync_sub_and_fetch(volatile signed int *, signed int,...);
     187signed int __sync_sub_and_fetch_4(volatile signed int *, signed int,...);
    119188unsigned int __sync_sub_and_fetch(volatile unsigned int *, unsigned int,...);
    120 signed long int __sync_sub_and_fetch(volatile signed long int *, signed long int,...);
    121 unsigned long int __sync_sub_and_fetch(volatile unsigned long int *, unsigned long int,...);
     189unsigned int __sync_sub_and_fetch_4(volatile unsigned int *, unsigned int,...);
    122190signed long long int __sync_sub_and_fetch(volatile signed long long int *, signed long long int,...);
     191signed long long int __sync_sub_and_fetch_8(volatile signed long long int *, signed long long int,...);
    123192unsigned long long int __sync_sub_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
     193unsigned long long int __sync_sub_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
    124194#if defined(__SIZEOF_INT128__)
    125195signed __int128 __sync_sub_and_fetch(volatile signed __int128 *, signed __int128,...);
     196signed __int128 __sync_sub_and_fetch_16(volatile signed __int128 *, signed __int128,...);
    126197unsigned __int128 __sync_sub_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
     198unsigned __int128 __sync_sub_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
    127199#endif
    128200
    129201char __sync_or_and_fetch(volatile char *, char,...);
     202char __sync_or_and_fetch_1(volatile char *, char,...);
    130203signed char __sync_or_and_fetch(volatile signed char *, signed char,...);
     204signed char __sync_or_and_fetch_1(volatile signed char *, signed char,...);
    131205unsigned char __sync_or_and_fetch(volatile unsigned char *, unsigned char,...);
     206unsigned char __sync_or_and_fetch_1(volatile unsigned char *, unsigned char,...);
    132207signed short __sync_or_and_fetch(volatile signed short *, signed short,...);
     208signed short __sync_or_and_fetch_2(volatile signed short *, signed short,...);
    133209unsigned short __sync_or_and_fetch(volatile unsigned short *, unsigned short,...);
     210unsigned short __sync_or_and_fetch_2(volatile unsigned short *, unsigned short,...);
    134211signed int __sync_or_and_fetch(volatile signed int *, signed int,...);
     212signed int __sync_or_and_fetch_4(volatile signed int *, signed int,...);
    135213unsigned int __sync_or_and_fetch(volatile unsigned int *, unsigned int,...);
    136 signed long int __sync_or_and_fetch(volatile signed long int *, signed long int,...);
    137 unsigned long int __sync_or_and_fetch(volatile unsigned long int *, unsigned long int,...);
     214unsigned int __sync_or_and_fetch_4(volatile unsigned int *, unsigned int,...);
    138215signed long long int __sync_or_and_fetch(volatile signed long long int *, signed long long int,...);
     216signed long long int __sync_or_and_fetch_8(volatile signed long long int *, signed long long int,...);
    139217unsigned long long int __sync_or_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
     218unsigned long long int __sync_or_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
    140219#if defined(__SIZEOF_INT128__)
    141220signed __int128 __sync_or_and_fetch(volatile signed __int128 *, signed __int128,...);
     221signed __int128 __sync_or_and_fetch_16(volatile signed __int128 *, signed __int128,...);
    142222unsigned __int128 __sync_or_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
     223unsigned __int128 __sync_or_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
    143224#endif
    144225
    145226char __sync_and_and_fetch(volatile char *, char,...);
     227char __sync_and_and_fetch_1(volatile char *, char,...);
    146228signed char __sync_and_and_fetch(volatile signed char *, signed char,...);
     229signed char __sync_and_and_fetch_1(volatile signed char *, signed char,...);
    147230unsigned char __sync_and_and_fetch(volatile unsigned char *, unsigned char,...);
     231unsigned char __sync_and_and_fetch_1(volatile unsigned char *, unsigned char,...);
    148232signed short __sync_and_and_fetch(volatile signed short *, signed short,...);
     233signed short __sync_and_and_fetch_2(volatile signed short *, signed short,...);
    149234unsigned short __sync_and_and_fetch(volatile unsigned short *, unsigned short,...);
     235unsigned short __sync_and_and_fetch_2(volatile unsigned short *, unsigned short,...);
    150236signed int __sync_and_and_fetch(volatile signed int *, signed int,...);
     237signed int __sync_and_and_fetch_4(volatile signed int *, signed int,...);
    151238unsigned int __sync_and_and_fetch(volatile unsigned int *, unsigned int,...);
    152 signed long int __sync_and_and_fetch(volatile signed long int *, signed long int,...);
    153 unsigned long int __sync_and_and_fetch(volatile unsigned long int *, unsigned long int,...);
     239unsigned int __sync_and_and_fetch_4(volatile unsigned int *, unsigned int,...);
    154240signed long long int __sync_and_and_fetch(volatile signed long long int *, signed long long int,...);
     241signed long long int __sync_and_and_fetch_8(volatile signed long long int *, signed long long int,...);
    155242unsigned long long int __sync_and_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
     243unsigned long long int __sync_and_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
    156244#if defined(__SIZEOF_INT128__)
    157245signed __int128 __sync_and_and_fetch(volatile signed __int128 *, signed __int128,...);
     246signed __int128 __sync_and_and_fetch_16(volatile signed __int128 *, signed __int128,...);
    158247unsigned __int128 __sync_and_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
     248unsigned __int128 __sync_and_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
    159249#endif
    160250
    161251char __sync_xor_and_fetch(volatile char *, char,...);
     252char __sync_xor_and_fetch_1(volatile char *, char,...);
    162253signed char __sync_xor_and_fetch(volatile signed char *, signed char,...);
     254signed char __sync_xor_and_fetch_1(volatile signed char *, signed char,...);
    163255unsigned char __sync_xor_and_fetch(volatile unsigned char *, unsigned char,...);
     256unsigned char __sync_xor_and_fetch_1(volatile unsigned char *, unsigned char,...);
    164257signed short __sync_xor_and_fetch(volatile signed short *, signed short,...);
     258signed short __sync_xor_and_fetch_2(volatile signed short *, signed short,...);
    165259unsigned short __sync_xor_and_fetch(volatile unsigned short *, unsigned short,...);
     260unsigned short __sync_xor_and_fetch_2(volatile unsigned short *, unsigned short,...);
    166261signed int __sync_xor_and_fetch(volatile signed int *, signed int,...);
     262signed int __sync_xor_and_fetch_4(volatile signed int *, signed int,...);
    167263unsigned int __sync_xor_and_fetch(volatile unsigned int *, unsigned int,...);
    168 signed long int __sync_xor_and_fetch(volatile signed long int *, signed long int,...);
    169 unsigned long int __sync_xor_and_fetch(volatile unsigned long int *, unsigned long int,...);
     264unsigned int __sync_xor_and_fetch_4(volatile unsigned int *, unsigned int,...);
    170265signed long long int __sync_xor_and_fetch(volatile signed long long int *, signed long long int,...);
     266signed long long int __sync_xor_and_fetch_8(volatile signed long long int *, signed long long int,...);
    171267unsigned long long int __sync_xor_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
     268unsigned long long int __sync_xor_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
    172269#if defined(__SIZEOF_INT128__)
    173270signed __int128 __sync_xor_and_fetch(volatile signed __int128 *, signed __int128,...);
     271signed __int128 __sync_xor_and_fetch_16(volatile signed __int128 *, signed __int128,...);
    174272unsigned __int128 __sync_xor_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
     273unsigned __int128 __sync_xor_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
    175274#endif
    176275
    177276char __sync_nand_and_fetch(volatile char *, char,...);
     277char __sync_nand_and_fetch_1(volatile char *, char,...);
    178278signed char __sync_nand_and_fetch(volatile signed char *, signed char,...);
     279signed char __sync_nand_and_fetch_1(volatile signed char *, signed char,...);
    179280unsigned char __sync_nand_and_fetch(volatile unsigned char *, unsigned char,...);
     281unsigned char __sync_nand_and_fetch_1(volatile unsigned char *, unsigned char,...);
    180282signed short __sync_nand_and_fetch(volatile signed short *, signed short,...);
     283signed short __sync_nand_and_fetch_2(volatile signed short *, signed short,...);
    181284unsigned short __sync_nand_and_fetch(volatile unsigned short *, unsigned short,...);
     285unsigned short __sync_nand_and_fetch_2(volatile unsigned short *, unsigned short,...);
    182286signed int __sync_nand_and_fetch(volatile signed int *, signed int,...);
     287signed int __sync_nand_and_fetch_4(volatile signed int *, signed int,...);
    183288unsigned int __sync_nand_and_fetch(volatile unsigned int *, unsigned int,...);
    184 signed long int __sync_nand_and_fetch(volatile signed long int *, signed long int,...);
    185 unsigned long int __sync_nand_and_fetch(volatile unsigned long int *, unsigned long int,...);
     289unsigned int __sync_nand_and_fetch_4(volatile unsigned int *, unsigned int,...);
    186290signed long long int __sync_nand_and_fetch(volatile signed long long int *, signed long long int,...);
     291signed long long int __sync_nand_and_fetch_8(volatile signed long long int *, signed long long int,...);
    187292unsigned long long int __sync_nand_and_fetch(volatile unsigned long long int *, unsigned long long int,...);
     293unsigned long long int __sync_nand_and_fetch_8(volatile unsigned long long int *, unsigned long long int,...);
    188294#if defined(__SIZEOF_INT128__)
    189295signed __int128 __sync_nand_and_fetch(volatile signed __int128 *, signed __int128,...);
     296signed __int128 __sync_nand_and_fetch_16(volatile signed __int128 *, signed __int128,...);
    190297unsigned __int128 __sync_nand_and_fetch(volatile unsigned __int128 *, unsigned __int128,...);
     298unsigned __int128 __sync_nand_and_fetch_16(volatile unsigned __int128 *, unsigned __int128,...);
    191299#endif
    192300
    193301_Bool __sync_bool_compare_and_swap(volatile char *, char, char,...);
     302_Bool __sync_bool_compare_and_swap_1(volatile char *, char, char,...);
    194303_Bool __sync_bool_compare_and_swap(volatile signed char *, signed char, signed char,...);
     304_Bool __sync_bool_compare_and_swap_1(volatile signed char *, signed char, signed char,...);
    195305_Bool __sync_bool_compare_and_swap(volatile unsigned char *, unsigned char, unsigned char,...);
     306_Bool __sync_bool_compare_and_swap_1(volatile unsigned char *, unsigned char, unsigned char,...);
    196307_Bool __sync_bool_compare_and_swap(volatile short *, signed short, signed short,...);
     308_Bool __sync_bool_compare_and_swap_2(volatile short *, signed short, signed short,...);
    197309_Bool __sync_bool_compare_and_swap(volatile short *, unsigned short, unsigned short,...);
     310_Bool __sync_bool_compare_and_swap_2(volatile short *, unsigned short, unsigned short,...);
    198311_Bool __sync_bool_compare_and_swap(volatile signed int *, signed int, signed int,...);
     312_Bool __sync_bool_compare_and_swap_4(volatile signed int *, signed int, signed int,...);
    199313_Bool __sync_bool_compare_and_swap(volatile unsigned int *, unsigned int, unsigned int,...);
    200 _Bool __sync_bool_compare_and_swap(volatile signed long int *, signed long int, signed long int,...);
    201 _Bool __sync_bool_compare_and_swap(volatile unsigned long int *, unsigned long int, unsigned long int,...);
     314_Bool __sync_bool_compare_and_swap_4(volatile unsigned int *, unsigned int, unsigned int,...);
    202315_Bool __sync_bool_compare_and_swap(volatile signed long long int *, signed long long int, signed long long int,...);
     316_Bool __sync_bool_compare_and_swap_8(volatile signed long long int *, signed long long int, signed long long int,...);
    203317_Bool __sync_bool_compare_and_swap(volatile unsigned long long int *, unsigned long long int, unsigned long long int,...);
     318_Bool __sync_bool_compare_and_swap_8(volatile unsigned long long int *, unsigned long long int, unsigned long long int,...);
    204319#if defined(__SIZEOF_INT128__)
    205320_Bool __sync_bool_compare_and_swap(volatile signed __int128 *, signed __int128, signed __int128,...);
     321_Bool __sync_bool_compare_and_swap_16(volatile signed __int128 *, signed __int128, signed __int128,...);
    206322_Bool __sync_bool_compare_and_swap(volatile unsigned __int128 *, unsigned __int128, unsigned __int128,...);
     323_Bool __sync_bool_compare_and_swap_16(volatile unsigned __int128 *, unsigned __int128, unsigned __int128,...);
    207324#endif
    208325forall(dtype T) _Bool __sync_bool_compare_and_swap(T * volatile *, T *, T*, ...);
    209326
    210327char __sync_val_compare_and_swap(volatile char *, char, char,...);
     328char __sync_val_compare_and_swap_1(volatile char *, char, char,...);
    211329signed char __sync_val_compare_and_swap(volatile signed char *, signed char, signed char,...);
     330signed char __sync_val_compare_and_swap_1(volatile signed char *, signed char, signed char,...);
    212331unsigned char __sync_val_compare_and_swap(volatile unsigned char *, unsigned char, unsigned char,...);
     332unsigned char __sync_val_compare_and_swap_1(volatile unsigned char *, unsigned char, unsigned char,...);
    213333signed short __sync_val_compare_and_swap(volatile signed short *, signed short, signed short,...);
     334signed short __sync_val_compare_and_swap_2(volatile signed short *, signed short, signed short,...);
    214335unsigned short __sync_val_compare_and_swap(volatile unsigned short *, unsigned short, unsigned short,...);
     336unsigned short __sync_val_compare_and_swap_2(volatile unsigned short *, unsigned short, unsigned short,...);
    215337signed int __sync_val_compare_and_swap(volatile signed int *, signed int, signed int,...);
     338signed int __sync_val_compare_and_swap_4(volatile signed int *, signed int, signed int,...);
    216339unsigned int __sync_val_compare_and_swap(volatile unsigned int *, unsigned int, unsigned int,...);
    217 signed long int __sync_val_compare_and_swap(volatile signed long int *, signed long int, signed long int,...);
    218 unsigned long int __sync_val_compare_and_swap(volatile unsigned long int *, unsigned long int, unsigned long int,...);
     340unsigned int __sync_val_compare_and_swap_4(volatile unsigned int *, unsigned int, unsigned int,...);
    219341signed long long int __sync_val_compare_and_swap(volatile signed long long int *, signed long long int, signed long long int,...);
     342signed long long int __sync_val_compare_and_swap_8(volatile signed long long int *, signed long long int, signed long long int,...);
    220343unsigned long long int __sync_val_compare_and_swap(volatile unsigned long long int *, unsigned long long int, unsigned long long int,...);
     344unsigned long long int __sync_val_compare_and_swap_8(volatile unsigned long long int *, unsigned long long int, unsigned long long int,...);
    221345#if defined(__SIZEOF_INT128__)
    222346signed __int128 __sync_val_compare_and_swap(volatile signed __int128 *, signed __int128, signed __int128,...);
     347signed __int128 __sync_val_compare_and_swap_16(volatile signed __int128 *, signed __int128, signed __int128,...);
    223348unsigned __int128 __sync_val_compare_and_swap(volatile unsigned __int128 *, unsigned __int128, unsigned __int128,...);
     349unsigned __int128 __sync_val_compare_and_swap_16(volatile unsigned __int128 *, unsigned __int128, unsigned __int128,...);
    224350#endif
    225351forall(dtype T) T * __sync_val_compare_and_swap(T * volatile *, T *, T*,...);
    226352
    227353char __sync_lock_test_and_set(volatile char *, char,...);
     354char __sync_lock_test_and_set_1(volatile char *, char,...);
    228355signed char __sync_lock_test_and_set(volatile signed char *, signed char,...);
     356signed char __sync_lock_test_and_set_1(volatile signed char *, signed char,...);
    229357unsigned char __sync_lock_test_and_set(volatile unsigned char *, unsigned char,...);
     358unsigned char __sync_lock_test_and_set_1(volatile unsigned char *, unsigned char,...);
    230359signed short __sync_lock_test_and_set(volatile signed short *, signed short,...);
     360signed short __sync_lock_test_and_set_2(volatile signed short *, signed short,...);
    231361unsigned short __sync_lock_test_and_set(volatile unsigned short *, unsigned short,...);
     362unsigned short __sync_lock_test_and_set_2(volatile unsigned short *, unsigned short,...);
    232363signed int __sync_lock_test_and_set(volatile signed int *, signed int,...);
     364signed int __sync_lock_test_and_set_4(volatile signed int *, signed int,...);
    233365unsigned int __sync_lock_test_and_set(volatile unsigned int *, unsigned int,...);
    234 signed long int __sync_lock_test_and_set(volatile signed long int *, signed long int,...);
    235 unsigned long int __sync_lock_test_and_set(volatile unsigned long int *, unsigned long int,...);
     366unsigned int __sync_lock_test_and_set_4(volatile unsigned int *, unsigned int,...);
    236367signed long long int __sync_lock_test_and_set(volatile signed long long int *, signed long long int,...);
     368signed long long int __sync_lock_test_and_set_8(volatile signed long long int *, signed long long int,...);
    237369unsigned long long int __sync_lock_test_and_set(volatile unsigned long long int *, unsigned long long int,...);
     370unsigned long long int __sync_lock_test_and_set_8(volatile unsigned long long int *, unsigned long long int,...);
    238371#if defined(__SIZEOF_INT128__)
    239372signed __int128 __sync_lock_test_and_set(volatile signed __int128 *, signed __int128,...);
     373signed __int128 __sync_lock_test_and_set_16(volatile signed __int128 *, signed __int128,...);
    240374unsigned __int128 __sync_lock_test_and_set(volatile unsigned __int128 *, unsigned __int128,...);
     375unsigned __int128 __sync_lock_test_and_set_16(volatile unsigned __int128 *, unsigned __int128,...);
    241376#endif
    242377
    243378void __sync_lock_release(volatile char *,...);
     379void __sync_lock_release_1(volatile char *,...);
    244380void __sync_lock_release(volatile signed char *,...);
     381void __sync_lock_release_1(volatile signed char *,...);
    245382void __sync_lock_release(volatile unsigned char *,...);
     383void __sync_lock_release_1(volatile unsigned char *,...);
    246384void __sync_lock_release(volatile signed short *,...);
     385void __sync_lock_release_2(volatile signed short *,...);
    247386void __sync_lock_release(volatile unsigned short *,...);
     387void __sync_lock_release_2(volatile unsigned short *,...);
    248388void __sync_lock_release(volatile signed int *,...);
     389void __sync_lock_release_4(volatile signed int *,...);
    249390void __sync_lock_release(volatile unsigned int *,...);
    250 void __sync_lock_release(volatile signed long int *,...);
    251 void __sync_lock_release(volatile unsigned long int *,...);
     391void __sync_lock_release_4(volatile unsigned int *,...);
    252392void __sync_lock_release(volatile signed long long int *,...);
     393void __sync_lock_release_8(volatile signed long long int *,...);
    253394void __sync_lock_release(volatile unsigned long long int *,...);
     395void __sync_lock_release_8(volatile unsigned long long int *,...);
    254396#if defined(__SIZEOF_INT128__)
    255397void __sync_lock_release(volatile signed __int128 *,...);
     398void __sync_lock_release_16(volatile signed __int128 *,...);
    256399void __sync_lock_release(volatile unsigned __int128 *,...);
     400void __sync_lock_release_16(volatile unsigned __int128 *,...);
    257401#endif
    258402
     
    270414_Bool __atomic_test_and_set(volatile signed int *, int);
    271415_Bool __atomic_test_and_set(volatile unsigned int *, int);
    272 _Bool __atomic_test_and_set(volatile signed long int *, int);
    273 _Bool __atomic_test_and_set(volatile unsigned long int *, int);
    274416_Bool __atomic_test_and_set(volatile signed long long int *, int);
    275417_Bool __atomic_test_and_set(volatile unsigned long long int *, int);
     
    287429void __atomic_clear(volatile signed int *, int);
    288430void __atomic_clear(volatile unsigned int *, int);
    289 void __atomic_clear(volatile signed long int *, int);
    290 void __atomic_clear(volatile unsigned long int *, int);
    291431void __atomic_clear(volatile signed long long int *, int);
    292432void __atomic_clear(volatile unsigned long long int *, int);
     
    296436#endif
    297437
    298 _Bool __atomic_exchange_n(volatile _Bool *, _Bool, int);
    299 void __atomic_exchange(volatile _Bool *, volatile _Bool *, volatile _Bool *, int);
    300438char __atomic_exchange_n(volatile char *, char, int);
     439char __atomic_exchange_1(volatile char *, char, int);
    301440void __atomic_exchange(volatile char *, volatile char *, volatile char *, int);
    302441signed char __atomic_exchange_n(volatile signed char *, signed char, int);
     442signed char __atomic_exchange_1(volatile signed char *, signed char, int);
    303443void __atomic_exchange(volatile signed char *, volatile signed char *, volatile signed char *, int);
    304444unsigned char __atomic_exchange_n(volatile unsigned char *, unsigned char, int);
     445unsigned char __atomic_exchange_1(volatile unsigned char *, unsigned char, int);
    305446void __atomic_exchange(volatile unsigned char *, volatile unsigned char *, volatile unsigned char *, int);
    306447signed short __atomic_exchange_n(volatile signed short *, signed short, int);
     448signed short __atomic_exchange_2(volatile signed short *, signed short, int);
    307449void __atomic_exchange(volatile signed short *, volatile signed short *, volatile signed short *, int);
    308450unsigned short __atomic_exchange_n(volatile unsigned short *, unsigned short, int);
     451unsigned short __atomic_exchange_2(volatile unsigned short *, unsigned short, int);
    309452void __atomic_exchange(volatile unsigned short *, volatile unsigned short *, volatile unsigned short *, int);
    310453signed int __atomic_exchange_n(volatile signed int *, signed int, int);
     454signed int __atomic_exchange_4(volatile signed int *, signed int, int);
    311455void __atomic_exchange(volatile signed int *, volatile signed int *, volatile signed int *, int);
    312456unsigned int __atomic_exchange_n(volatile unsigned int *, unsigned int, int);
     457unsigned int __atomic_exchange_4(volatile unsigned int *, unsigned int, int);
    313458void __atomic_exchange(volatile unsigned int *, volatile unsigned int *, volatile unsigned int *, int);
    314 signed long int __atomic_exchange_n(volatile signed long int *, signed long int, int);
    315 void __atomic_exchange(volatile signed long int *, volatile signed long int *, volatile signed long int *, int);
    316 unsigned long int __atomic_exchange_n(volatile unsigned long int *, unsigned long int, int);
    317 void __atomic_exchange(volatile unsigned long int *, volatile unsigned long int *, volatile unsigned long int *, int);
    318459signed long long int __atomic_exchange_n(volatile signed long long int *, signed long long int, int);
     460signed long long int __atomic_exchange_8(volatile signed long long int *, signed long long int, int);
    319461void __atomic_exchange(volatile signed long long int *, volatile signed long long int *, volatile signed long long int *, int);
    320462unsigned long long int __atomic_exchange_n(volatile unsigned long long int *, unsigned long long int, int);
     463unsigned long long int __atomic_exchange_8(volatile unsigned long long int *, unsigned long long int, int);
    321464void __atomic_exchange(volatile unsigned long long int *, volatile unsigned long long int *, volatile unsigned long long int *, int);
    322465#if defined(__SIZEOF_INT128__)
    323466signed __int128 __atomic_exchange_n(volatile signed __int128 *, signed __int128, int);
     467signed __int128 __atomic_exchange_16(volatile signed __int128 *, signed __int128, int);
    324468void __atomic_exchange(volatile signed __int128 *, volatile signed __int128 *, volatile signed __int128 *, int);
    325469unsigned __int128 __atomic_exchange_n(volatile unsigned __int128 *, unsigned __int128, int);
     470unsigned __int128 __atomic_exchange_16(volatile unsigned __int128 *, unsigned __int128, int);
    326471void __atomic_exchange(volatile unsigned __int128 *, volatile unsigned __int128 *, volatile unsigned __int128 *, int);
    327472#endif
     
    332477void __atomic_load(const volatile _Bool *, volatile _Bool *, int);
    333478char __atomic_load_n(const volatile char *, int);
     479char __atomic_load_1(const volatile char *, int);
    334480void __atomic_load(const volatile char *, volatile char *, int);
    335481signed char __atomic_load_n(const volatile signed char *, int);
     482signed char __atomic_load_1(const volatile signed char *, int);
    336483void __atomic_load(const volatile signed char *, volatile signed char *, int);
    337484unsigned char __atomic_load_n(const volatile unsigned char *, int);
     485unsigned char __atomic_load_1(const volatile unsigned char *, int);
    338486void __atomic_load(const volatile unsigned char *, volatile unsigned char *, int);
    339487signed short __atomic_load_n(const volatile signed short *, int);
     488signed short __atomic_load_2(const volatile signed short *, int);
    340489void __atomic_load(const volatile signed short *, volatile signed short *, int);
    341490unsigned short __atomic_load_n(const volatile unsigned short *, int);
     491unsigned short __atomic_load_2(const volatile unsigned short *, int);
    342492void __atomic_load(const volatile unsigned short *, volatile unsigned short *, int);
    343493signed int __atomic_load_n(const volatile signed int *, int);
     494signed int __atomic_load_4(const volatile signed int *, int);
    344495void __atomic_load(const volatile signed int *, volatile signed int *, int);
    345496unsigned int __atomic_load_n(const volatile unsigned int *, int);
     497unsigned int __atomic_load_4(const volatile unsigned int *, int);
    346498void __atomic_load(const volatile unsigned int *, volatile unsigned int *, int);
    347 signed long int __atomic_load_n(const volatile signed long int *, int);
    348 void __atomic_load(const volatile signed long int *, volatile signed long int *, int);
    349 unsigned long int __atomic_load_n(const volatile unsigned long int *, int);
    350 void __atomic_load(const volatile unsigned long int *, volatile unsigned long int *, int);
    351499signed long long int __atomic_load_n(const volatile signed long long int *, int);
     500signed long long int __atomic_load_8(const volatile signed long long int *, int);
    352501void __atomic_load(const volatile signed long long int *, volatile signed long long int *, int);
    353502unsigned long long int __atomic_load_n(const volatile unsigned long long int *, int);
     503unsigned long long int __atomic_load_8(const volatile unsigned long long int *, int);
    354504void __atomic_load(const volatile unsigned long long int *, volatile unsigned long long int *, int);
    355505#if defined(__SIZEOF_INT128__)
    356506signed __int128 __atomic_load_n(const volatile signed __int128 *, int);
     507signed __int128 __atomic_load_16(const volatile signed __int128 *, int);
    357508void __atomic_load(const volatile signed __int128 *, volatile signed __int128 *, int);
    358509unsigned __int128 __atomic_load_n(const volatile unsigned __int128 *, int);
     510unsigned __int128 __atomic_load_16(const volatile unsigned __int128 *, int);
    359511void __atomic_load(const volatile unsigned __int128 *, volatile unsigned __int128 *, int);
    360512#endif
     
    363515
    364516_Bool __atomic_compare_exchange_n(volatile char *, char *, char, _Bool, int, int);
     517_Bool __atomic_compare_exchange_1(volatile char *, char *, char, _Bool, int, int);
    365518_Bool __atomic_compare_exchange  (volatile char *, char *, char *, _Bool, int, int);
    366519_Bool __atomic_compare_exchange_n(volatile signed char *, signed char *, signed char, _Bool, int, int);
     520_Bool __atomic_compare_exchange_1(volatile signed char *, signed char *, signed char, _Bool, int, int);
    367521_Bool __atomic_compare_exchange  (volatile signed char *, signed char *, signed char *, _Bool, int, int);
    368522_Bool __atomic_compare_exchange_n(volatile unsigned char *, unsigned char *, unsigned char, _Bool, int, int);
     523_Bool __atomic_compare_exchange_1(volatile unsigned char *, unsigned char *, unsigned char, _Bool, int, int);
    369524_Bool __atomic_compare_exchange  (volatile unsigned char *, unsigned char *, unsigned char *, _Bool, int, int);
    370525_Bool __atomic_compare_exchange_n(volatile signed short *, signed short *, signed short, _Bool, int, int);
     526_Bool __atomic_compare_exchange_2(volatile signed short *, signed short *, signed short, _Bool, int, int);
    371527_Bool __atomic_compare_exchange  (volatile signed short *, signed short *, signed short *, _Bool, int, int);
    372528_Bool __atomic_compare_exchange_n(volatile unsigned short *, unsigned short *, unsigned short, _Bool, int, int);
     529_Bool __atomic_compare_exchange_2(volatile unsigned short *, unsigned short *, unsigned short, _Bool, int, int);
    373530_Bool __atomic_compare_exchange  (volatile unsigned short *, unsigned short *, unsigned short *, _Bool, int, int);
    374531_Bool __atomic_compare_exchange_n(volatile signed int *, signed int *, signed int, _Bool, int, int);
     532_Bool __atomic_compare_exchange_4(volatile signed int *, signed int *, signed int, _Bool, int, int);
    375533_Bool __atomic_compare_exchange  (volatile signed int *, signed int *, signed int *, _Bool, int, int);
    376534_Bool __atomic_compare_exchange_n(volatile unsigned int *, unsigned int *, unsigned int, _Bool, int, int);
     535_Bool __atomic_compare_exchange_4(volatile unsigned int *, unsigned int *, unsigned int, _Bool, int, int);
    377536_Bool __atomic_compare_exchange  (volatile unsigned int *, unsigned int *, unsigned int *, _Bool, int, int);
    378 _Bool __atomic_compare_exchange_n(volatile signed long int *, signed long int *, signed long int, _Bool, int, int);
    379 _Bool __atomic_compare_exchange  (volatile signed long int *, signed long int *, signed long int *, _Bool, int, int);
    380 _Bool __atomic_compare_exchange_n(volatile unsigned long int *, unsigned long int *, unsigned long int, _Bool, int, int);
    381 _Bool __atomic_compare_exchange  (volatile unsigned long int *, unsigned long int *, unsigned long int *, _Bool, int, int);
    382537_Bool __atomic_compare_exchange_n(volatile signed long long int *, signed long long int *, signed long long int, _Bool, int, int);
     538_Bool __atomic_compare_exchange_8(volatile signed long long int *, signed long long int *, signed long long int, _Bool, int, int);
    383539_Bool __atomic_compare_exchange  (volatile signed long long int *, signed long long int *, signed long long int *, _Bool, int, int);
    384540_Bool __atomic_compare_exchange_n(volatile unsigned long long int *, unsigned long long int *, unsigned long long int, _Bool, int, int);
     541_Bool __atomic_compare_exchange_8(volatile unsigned long long int *, unsigned long long int *, unsigned long long int, _Bool, int, int);
    385542_Bool __atomic_compare_exchange  (volatile unsigned long long int *, unsigned long long int *, unsigned long long int *, _Bool, int, int);
    386543#if defined(__SIZEOF_INT128__)
    387544_Bool __atomic_compare_exchange_n (volatile signed __int128 *, signed __int128 *, signed __int128, _Bool, int, int);
     545_Bool __atomic_compare_exchange_16(volatile signed __int128 *, signed __int128 *, signed __int128, _Bool, int, int);
    388546_Bool __atomic_compare_exchange   (volatile signed __int128 *, signed __int128 *, signed __int128 *, _Bool, int, int);
    389547_Bool __atomic_compare_exchange_n (volatile unsigned __int128 *, unsigned __int128 *, unsigned __int128, _Bool, int, int);
     548_Bool __atomic_compare_exchange_16(volatile unsigned __int128 *, unsigned __int128 *, unsigned __int128, _Bool, int, int);
    390549_Bool __atomic_compare_exchange   (volatile unsigned __int128 *, unsigned __int128 *, unsigned __int128 *, _Bool, int, int);
    391550#endif
     
    396555void __atomic_store(volatile _Bool *, _Bool *, int);
    397556void __atomic_store_n(volatile char *, char, int);
     557void __atomic_store_1(volatile char *, char, int);
    398558void __atomic_store(volatile char *, char *, int);
    399559void __atomic_store_n(volatile signed char *, signed char, int);
     560void __atomic_store_1(volatile signed char *, signed char, int);
    400561void __atomic_store(volatile signed char *, signed char *, int);
    401562void __atomic_store_n(volatile unsigned char *, unsigned char, int);
     563void __atomic_store_1(volatile unsigned char *, unsigned char, int);
    402564void __atomic_store(volatile unsigned char *, unsigned char *, int);
    403565void __atomic_store_n(volatile signed short *, signed short, int);
     566void __atomic_store_2(volatile signed short *, signed short, int);
    404567void __atomic_store(volatile signed short *, signed short *, int);
    405568void __atomic_store_n(volatile unsigned short *, unsigned short, int);
     569void __atomic_store_2(volatile unsigned short *, unsigned short, int);
    406570void __atomic_store(volatile unsigned short *, unsigned short *, int);
    407571void __atomic_store_n(volatile signed int *, signed int, int);
     572void __atomic_store_4(volatile signed int *, signed int, int);
    408573void __atomic_store(volatile signed int *, signed int *, int);
    409574void __atomic_store_n(volatile unsigned int *, unsigned int, int);
     575void __atomic_store_4(volatile unsigned int *, unsigned int, int);
    410576void __atomic_store(volatile unsigned int *, unsigned int *, int);
    411 void __atomic_store_n(volatile signed long int *, signed long int, int);
    412 void __atomic_store(volatile signed long int *, signed long int *, int);
    413 void __atomic_store_n(volatile unsigned long int *, unsigned long int, int);
    414 void __atomic_store(volatile unsigned long int *, unsigned long int *, int);
    415577void __atomic_store_n(volatile signed long long int *, signed long long int, int);
     578void __atomic_store_8(volatile signed long long int *, signed long long int, int);
    416579void __atomic_store(volatile signed long long int *, signed long long int *, int);
    417580void __atomic_store_n(volatile unsigned long long int *, unsigned long long int, int);
     581void __atomic_store_8(volatile unsigned long long int *, unsigned long long int, int);
    418582void __atomic_store(volatile unsigned long long int *, unsigned long long int *, int);
    419583#if defined(__SIZEOF_INT128__)
    420584void __atomic_store_n(volatile signed __int128 *, signed __int128, int);
     585void __atomic_store_16(volatile signed __int128 *, signed __int128, int);
    421586void __atomic_store(volatile signed __int128 *, signed __int128 *, int);
    422587void __atomic_store_n(volatile unsigned __int128 *, unsigned __int128, int);
     588void __atomic_store_16(volatile unsigned __int128 *, unsigned __int128, int);
    423589void __atomic_store(volatile unsigned __int128 *, unsigned __int128 *, int);
    424590#endif
     
    427593
    428594char __atomic_add_fetch  (volatile char *, char, int);
     595char __atomic_add_fetch_1(volatile char *, char, int);
    429596signed char __atomic_add_fetch  (volatile signed char *, signed char, int);
     597signed char __atomic_add_fetch_1(volatile signed char *, signed char, int);
    430598unsigned char __atomic_add_fetch  (volatile unsigned char *, unsigned char, int);
     599unsigned char __atomic_add_fetch_1(volatile unsigned char *, unsigned char, int);
    431600signed short __atomic_add_fetch  (volatile signed short *, signed short, int);
     601signed short __atomic_add_fetch_2(volatile signed short *, signed short, int);
    432602unsigned short __atomic_add_fetch  (volatile unsigned short *, unsigned short, int);
     603unsigned short __atomic_add_fetch_2(volatile unsigned short *, unsigned short, int);
    433604signed int __atomic_add_fetch  (volatile signed int *, signed int, int);
     605signed int __atomic_add_fetch_4(volatile signed int *, signed int, int);
    434606unsigned int __atomic_add_fetch  (volatile unsigned int *, unsigned int, int);
    435 signed long int __atomic_add_fetch  (volatile signed long int *, signed long int, int);
    436 unsigned long int __atomic_add_fetch  (volatile unsigned long int *, unsigned long int, int);
     607unsigned int __atomic_add_fetch_4(volatile unsigned int *, unsigned int, int);
    437608signed long long int __atomic_add_fetch  (volatile signed long long int *, signed long long int, int);
     609signed long long int __atomic_add_fetch_8(volatile signed long long int *, signed long long int, int);
    438610unsigned long long int __atomic_add_fetch  (volatile unsigned long long int *, unsigned long long int, int);
     611unsigned long long int __atomic_add_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
    439612#if defined(__SIZEOF_INT128__)
    440613signed __int128 __atomic_add_fetch   (volatile signed __int128 *, signed __int128, int);
     614signed __int128 __atomic_add_fetch_16(volatile signed __int128 *, signed __int128, int);
    441615unsigned __int128 __atomic_add_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
     616unsigned __int128 __atomic_add_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
    442617#endif
    443618
    444619char __atomic_sub_fetch  (volatile char *, char, int);
     620char __atomic_sub_fetch_1(volatile char *, char, int);
    445621signed char __atomic_sub_fetch  (volatile signed char *, signed char, int);
     622signed char __atomic_sub_fetch_1(volatile signed char *, signed char, int);
    446623unsigned char __atomic_sub_fetch  (volatile unsigned char *, unsigned char, int);
     624unsigned char __atomic_sub_fetch_1(volatile unsigned char *, unsigned char, int);
    447625signed short __atomic_sub_fetch  (volatile signed short *, signed short, int);
     626signed short __atomic_sub_fetch_2(volatile signed short *, signed short, int);
    448627unsigned short __atomic_sub_fetch  (volatile unsigned short *, unsigned short, int);
     628unsigned short __atomic_sub_fetch_2(volatile unsigned short *, unsigned short, int);
    449629signed int __atomic_sub_fetch  (volatile signed int *, signed int, int);
     630signed int __atomic_sub_fetch_4(volatile signed int *, signed int, int);
    450631unsigned int __atomic_sub_fetch  (volatile unsigned int *, unsigned int, int);
    451 signed long long int __atomic_sub_fetch  (volatile signed long int *, signed long int, int);
    452 unsigned long long int __atomic_sub_fetch  (volatile unsigned long int *, unsigned long int, int);
     632unsigned int __atomic_sub_fetch_4(volatile unsigned int *, unsigned int, int);
    453633signed long long int __atomic_sub_fetch  (volatile signed long long int *, signed long long int, int);
     634signed long long int __atomic_sub_fetch_8(volatile signed long long int *, signed long long int, int);
    454635unsigned long long int __atomic_sub_fetch  (volatile unsigned long long int *, unsigned long long int, int);
     636unsigned long long int __atomic_sub_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
    455637#if defined(__SIZEOF_INT128__)
    456638signed __int128 __atomic_sub_fetch   (volatile signed __int128 *, signed __int128, int);
     639signed __int128 __atomic_sub_fetch_16(volatile signed __int128 *, signed __int128, int);
    457640unsigned __int128 __atomic_sub_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
     641unsigned __int128 __atomic_sub_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
    458642#endif
    459643
    460644char __atomic_and_fetch  (volatile char *, char, int);
     645char __atomic_and_fetch_1(volatile char *, char, int);
    461646signed char __atomic_and_fetch  (volatile signed char *, signed char, int);
     647signed char __atomic_and_fetch_1(volatile signed char *, signed char, int);
    462648unsigned char __atomic_and_fetch  (volatile unsigned char *, unsigned char, int);
     649unsigned char __atomic_and_fetch_1(volatile unsigned char *, unsigned char, int);
    463650signed short __atomic_and_fetch  (volatile signed short *, signed short, int);
     651signed short __atomic_and_fetch_2(volatile signed short *, signed short, int);
    464652unsigned short __atomic_and_fetch  (volatile unsigned short *, unsigned short, int);
     653unsigned short __atomic_and_fetch_2(volatile unsigned short *, unsigned short, int);
    465654signed int __atomic_and_fetch  (volatile signed int *, signed int, int);
     655signed int __atomic_and_fetch_4(volatile signed int *, signed int, int);
    466656unsigned int __atomic_and_fetch  (volatile unsigned int *, unsigned int, int);
    467 signed long int __atomic_and_fetch  (volatile signed long int *, signed long int, int);
    468 unsigned long int __atomic_and_fetch  (volatile unsigned long int *, unsigned long int, int);
     657unsigned int __atomic_and_fetch_4(volatile unsigned int *, unsigned int, int);
    469658signed long long int __atomic_and_fetch  (volatile signed long long int *, signed long long int, int);
     659signed long long int __atomic_and_fetch_8(volatile signed long long int *, signed long long int, int);
    470660unsigned long long int __atomic_and_fetch  (volatile unsigned long long int *, unsigned long long int, int);
     661unsigned long long int __atomic_and_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
    471662#if defined(__SIZEOF_INT128__)
    472663signed __int128 __atomic_and_fetch   (volatile signed __int128 *, signed __int128, int);
     664signed __int128 __atomic_and_fetch_16(volatile signed __int128 *, signed __int128, int);
    473665unsigned __int128 __atomic_and_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
     666unsigned __int128 __atomic_and_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
    474667#endif
    475668
    476669char __atomic_nand_fetch  (volatile char *, char, int);
     670char __atomic_nand_fetch_1(volatile char *, char, int);
    477671signed char __atomic_nand_fetch  (volatile signed char *, signed char, int);
     672signed char __atomic_nand_fetch_1(volatile signed char *, signed char, int);
    478673unsigned char __atomic_nand_fetch  (volatile unsigned char *, unsigned char, int);
     674unsigned char __atomic_nand_fetch_1(volatile unsigned char *, unsigned char, int);
    479675signed short __atomic_nand_fetch  (volatile signed short *, signed short, int);
     676signed short __atomic_nand_fetch_2(volatile signed short *, signed short, int);
    480677unsigned short __atomic_nand_fetch  (volatile unsigned short *, unsigned short, int);
     678unsigned short __atomic_nand_fetch_2(volatile unsigned short *, unsigned short, int);
    481679signed int __atomic_nand_fetch  (volatile signed int *, signed int, int);
     680signed int __atomic_nand_fetch_4(volatile signed int *, signed int, int);
    482681unsigned int __atomic_nand_fetch  (volatile unsigned int *, unsigned int, int);
    483 signed long int __atomic_nand_fetch  (volatile signed long int *, signed long int, int);
    484 unsigned long int __atomic_nand_fetch  (volatile unsigned long int *, unsigned long int, int);
     682unsigned int __atomic_nand_fetch_4(volatile unsigned int *, unsigned int, int);
    485683signed long long int __atomic_nand_fetch  (volatile signed long long int *, signed long long int, int);
     684signed long long int __atomic_nand_fetch_8(volatile signed long long int *, signed long long int, int);
    486685unsigned long long int __atomic_nand_fetch  (volatile unsigned long long int *, unsigned long long int, int);
     686unsigned long long int __atomic_nand_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
    487687#if defined(__SIZEOF_INT128__)
    488688signed __int128 __atomic_nand_fetch   (volatile signed __int128 *, signed __int128, int);
     689signed __int128 __atomic_nand_fetch_16(volatile signed __int128 *, signed __int128, int);
    489690unsigned __int128 __atomic_nand_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
     691unsigned __int128 __atomic_nand_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
    490692#endif
    491693
    492694char __atomic_xor_fetch  (volatile char *, char, int);
     695char __atomic_xor_fetch_1(volatile char *, char, int);
    493696signed char __atomic_xor_fetch  (volatile signed char *, signed char, int);
     697signed char __atomic_xor_fetch_1(volatile signed char *, signed char, int);
    494698unsigned char __atomic_xor_fetch  (volatile unsigned char *, unsigned char, int);
     699unsigned char __atomic_xor_fetch_1(volatile unsigned char *, unsigned char, int);
    495700signed short __atomic_xor_fetch  (volatile signed short *, signed short, int);
     701signed short __atomic_xor_fetch_2(volatile signed short *, signed short, int);
    496702unsigned short __atomic_xor_fetch  (volatile unsigned short *, unsigned short, int);
     703unsigned short __atomic_xor_fetch_2(volatile unsigned short *, unsigned short, int);
    497704signed int __atomic_xor_fetch  (volatile signed int *, signed int, int);
     705signed int __atomic_xor_fetch_4(volatile signed int *, signed int, int);
    498706unsigned int __atomic_xor_fetch  (volatile unsigned int *, unsigned int, int);
    499 signed long int __atomic_xor_fetch  (volatile signed long int *, signed long int, int);
    500 unsigned long int __atomic_xor_fetch  (volatile unsigned long int *, unsigned long int, int);
     707unsigned int __atomic_xor_fetch_4(volatile unsigned int *, unsigned int, int);
    501708signed long long int __atomic_xor_fetch  (volatile signed long long int *, signed long long int, int);
     709signed long long int __atomic_xor_fetch_8(volatile signed long long int *, signed long long int, int);
    502710unsigned long long int __atomic_xor_fetch  (volatile unsigned long long int *, unsigned long long int, int);
     711unsigned long long int __atomic_xor_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
    503712#if defined(__SIZEOF_INT128__)
    504713signed __int128 __atomic_xor_fetch   (volatile signed __int128 *, signed __int128, int);
     714signed __int128 __atomic_xor_fetch_16(volatile signed __int128 *, signed __int128, int);
    505715unsigned __int128 __atomic_xor_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
     716unsigned __int128 __atomic_xor_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
    506717#endif
    507718
    508719char __atomic_or_fetch  (volatile char *, char, int);
     720char __atomic_or_fetch_1(volatile char *, char, int);
    509721signed char __atomic_or_fetch  (volatile signed char *, signed char, int);
     722signed char __atomic_or_fetch_1(volatile signed char *, signed char, int);
    510723unsigned char __atomic_or_fetch  (volatile unsigned char *, unsigned char, int);
     724unsigned char __atomic_or_fetch_1(volatile unsigned char *, unsigned char, int);
    511725signed short __atomic_or_fetch  (volatile signed short *, signed short, int);
     726signed short __atomic_or_fetch_2(volatile signed short *, signed short, int);
    512727unsigned short __atomic_or_fetch  (volatile unsigned short *, unsigned short, int);
     728unsigned short __atomic_or_fetch_2(volatile unsigned short *, unsigned short, int);
    513729signed int __atomic_or_fetch  (volatile signed int *, signed int, int);
     730signed int __atomic_or_fetch_4(volatile signed int *, signed int, int);
    514731unsigned int __atomic_or_fetch  (volatile unsigned int *, unsigned int, int);
    515 signed long int __atomic_or_fetch  (volatile signed long int *, signed long int, int);
    516 unsigned long int __atomic_or_fetch  (volatile unsigned long int *, unsigned long int, int);
     732unsigned int __atomic_or_fetch_4(volatile unsigned int *, unsigned int, int);
    517733signed long long int __atomic_or_fetch  (volatile signed long long int *, signed long long int, int);
     734signed long long int __atomic_or_fetch_8(volatile signed long long int *, signed long long int, int);
    518735unsigned long long int __atomic_or_fetch  (volatile unsigned long long int *, unsigned long long int, int);
     736unsigned long long int __atomic_or_fetch_8(volatile unsigned long long int *, unsigned long long int, int);
    519737#if defined(__SIZEOF_INT128__)
    520738signed __int128 __atomic_or_fetch   (volatile signed __int128 *, signed __int128, int);
     739signed __int128 __atomic_or_fetch_16(volatile signed __int128 *, signed __int128, int);
    521740unsigned __int128 __atomic_or_fetch   (volatile unsigned __int128 *, unsigned __int128, int);
     741unsigned __int128 __atomic_or_fetch_16(volatile unsigned __int128 *, unsigned __int128, int);
    522742#endif
    523743
    524744char __atomic_fetch_add  (volatile char *, char, int);
     745char __atomic_fetch_add_1(volatile char *, char, int);
    525746signed char __atomic_fetch_add  (volatile signed char *, signed char, int);
     747signed char __atomic_fetch_add_1(volatile signed char *, signed char, int);
    526748unsigned char __atomic_fetch_add  (volatile unsigned char *, unsigned char, int);
     749unsigned char __atomic_fetch_add_1(volatile unsigned char *, unsigned char, int);
    527750signed short __atomic_fetch_add  (volatile signed short *, signed short, int);
     751signed short __atomic_fetch_add_2(volatile signed short *, signed short, int);
    528752unsigned short __atomic_fetch_add  (volatile unsigned short *, unsigned short, int);
     753unsigned short __atomic_fetch_add_2(volatile unsigned short *, unsigned short, int);
    529754signed int __atomic_fetch_add  (volatile signed int *, signed int, int);
     755signed int __atomic_fetch_add_4(volatile signed int *, signed int, int);
    530756unsigned int __atomic_fetch_add  (volatile unsigned int *, unsigned int, int);
    531 signed long int __atomic_fetch_add  (volatile signed long int *, signed long int, int);
    532 unsigned long int __atomic_fetch_add  (volatile unsigned long int *, unsigned long int, int);
     757unsigned int __atomic_fetch_add_4(volatile unsigned int *, unsigned int, int);
    533758signed long long int __atomic_fetch_add  (volatile signed long long int *, signed long long int, int);
     759signed long long int __atomic_fetch_add_8(volatile signed long long int *, signed long long int, int);
    534760unsigned long long int __atomic_fetch_add  (volatile unsigned long long int *, unsigned long long int, int);
     761unsigned long long int __atomic_fetch_add_8(volatile unsigned long long int *, unsigned long long int, int);
    535762#if defined(__SIZEOF_INT128__)
    536763signed __int128 __atomic_fetch_add   (volatile signed __int128 *, signed __int128, int);
     764signed __int128 __atomic_fetch_add_16(volatile signed __int128 *, signed __int128, int);
    537765unsigned __int128 __atomic_fetch_add   (volatile unsigned __int128 *, unsigned __int128, int);
     766unsigned __int128 __atomic_fetch_add_16(volatile unsigned __int128 *, unsigned __int128, int);
    538767#endif
    539768
    540769char __atomic_fetch_sub  (volatile char *, char, int);
     770char __atomic_fetch_sub_1(volatile char *, char, int);
    541771signed char __atomic_fetch_sub  (volatile signed char *, signed char, int);
     772signed char __atomic_fetch_sub_1(volatile signed char *, signed char, int);
    542773unsigned char __atomic_fetch_sub  (volatile unsigned char *, unsigned char, int);
     774unsigned char __atomic_fetch_sub_1(volatile unsigned char *, unsigned char, int);
    543775signed short __atomic_fetch_sub  (volatile signed short *, signed short, int);
     776signed short __atomic_fetch_sub_2(volatile signed short *, signed short, int);
    544777unsigned short __atomic_fetch_sub  (volatile unsigned short *, unsigned short, int);
     778unsigned short __atomic_fetch_sub_2(volatile unsigned short *, unsigned short, int);
    545779signed int __atomic_fetch_sub  (volatile signed int *, signed int, int);
     780signed int __atomic_fetch_sub_4(volatile signed int *, signed int, int);
    546781unsigned int __atomic_fetch_sub  (volatile unsigned int *, unsigned int, int);
    547 signed long int __atomic_fetch_sub  (volatile signed long int *, signed long int, int);
    548 unsigned long int __atomic_fetch_sub  (volatile unsigned long int *, unsigned long int, int);
     782unsigned int __atomic_fetch_sub_4(volatile unsigned int *, unsigned int, int);
    549783signed long long int __atomic_fetch_sub  (volatile signed long long int *, signed long long int, int);
     784signed long long int __atomic_fetch_sub_8(volatile signed long long int *, signed long long int, int);
    550785unsigned long long int __atomic_fetch_sub  (volatile unsigned long long int *, unsigned long long int, int);
     786unsigned long long int __atomic_fetch_sub_8(volatile unsigned long long int *, unsigned long long int, int);
    551787#if defined(__SIZEOF_INT128__)
    552788signed __int128 __atomic_fetch_sub   (volatile signed  __int128 *, signed __int128, int);
     789signed __int128 __atomic_fetch_sub_16(volatile signed  __int128 *, signed __int128, int);
    553790unsigned __int128 __atomic_fetch_sub   (volatile unsigned  __int128 *, unsigned __int128, int);
     791unsigned __int128 __atomic_fetch_sub_16(volatile unsigned  __int128 *, unsigned __int128, int);
    554792#endif
    555793
    556794char __atomic_fetch_and  (volatile char *, char, int);
     795char __atomic_fetch_and_1(volatile char *, char, int);
    557796signed char __atomic_fetch_and  (volatile signed char *, signed char, int);
     797signed char __atomic_fetch_and_1(volatile signed char *, signed char, int);
    558798unsigned char __atomic_fetch_and  (volatile unsigned char *, unsigned char, int);
     799unsigned char __atomic_fetch_and_1(volatile unsigned char *, unsigned char, int);
    559800signed short __atomic_fetch_and  (volatile signed short *, signed short, int);
     801signed short __atomic_fetch_and_2(volatile signed short *, signed short, int);
    560802unsigned short __atomic_fetch_and  (volatile unsigned short *, unsigned short, int);
     803unsigned short __atomic_fetch_and_2(volatile unsigned short *, unsigned short, int);
    561804signed int __atomic_fetch_and  (volatile signed int *, signed int, int);
     805signed int __atomic_fetch_and_4(volatile signed int *, signed int, int);
    562806unsigned int __atomic_fetch_and  (volatile unsigned int *, unsigned int, int);
    563 signed long int __atomic_fetch_and  (volatile signed long int *, signed long int, int);
    564 unsigned long int __atomic_fetch_and  (volatile unsigned long int *, unsigned long int, int);
     807unsigned int __atomic_fetch_and_4(volatile unsigned int *, unsigned int, int);
    565808signed long long int __atomic_fetch_and  (volatile signed long long int *, signed long long int, int);
     809signed long long int __atomic_fetch_and_8(volatile signed long long int *, signed long long int, int);
    566810unsigned long long int __atomic_fetch_and  (volatile unsigned long long int *, unsigned long long int, int);
     811unsigned long long int __atomic_fetch_and_8(volatile unsigned long long int *, unsigned long long int, int);
    567812#if defined(__SIZEOF_INT128__)
    568813signed __int128 __atomic_fetch_and   (volatile signed __int128 *, signed __int128, int);
     814signed __int128 __atomic_fetch_and_16(volatile signed __int128 *, signed __int128, int);
    569815unsigned __int128 __atomic_fetch_and   (volatile unsigned __int128 *, unsigned __int128, int);
     816unsigned __int128 __atomic_fetch_and_16(volatile unsigned __int128 *, unsigned __int128, int);
    570817#endif
    571818
    572819char __atomic_fetch_nand  (volatile char *, char, int);
     820char __atomic_fetch_nand_1(volatile char *, char, int);
    573821signed char __atomic_fetch_nand  (volatile signed char *, signed char, int);
     822signed char __atomic_fetch_nand_1(volatile signed char *, signed char, int);
    574823unsigned char __atomic_fetch_nand  (volatile unsigned char *, unsigned char, int);
     824unsigned char __atomic_fetch_nand_1(volatile unsigned char *, unsigned char, int);
    575825signed short __atomic_fetch_nand  (volatile signed short *, signed short, int);
     826signed short __atomic_fetch_nand_2(volatile signed short *, signed short, int);
    576827unsigned short __atomic_fetch_nand  (volatile unsigned short *, unsigned short, int);
     828unsigned short __atomic_fetch_nand_2(volatile unsigned short *, unsigned short, int);
    577829signed int __atomic_fetch_nand  (volatile signed int *, signed int, int);
     830signed int __atomic_fetch_nand_4(volatile signed int *, signed int, int);
    578831unsigned int __atomic_fetch_nand  (volatile unsigned int *, unsigned int, int);
    579 signed long int __atomic_fetch_nand  (volatile signed long int *, signed long int, int);
    580 unsigned long int __atomic_fetch_nand  (volatile unsigned long int *, unsigned long int, int);
     832unsigned int __atomic_fetch_nand_4(volatile unsigned int *, unsigned int, int);
    581833signed long long int __atomic_fetch_nand  (volatile signed long long int *, signed long long int, int);
     834signed long long int __atomic_fetch_nand_8(volatile signed long long int *, signed long long int, int);
    582835unsigned long long int __atomic_fetch_nand  (volatile unsigned long long int *, unsigned long long int, int);
     836unsigned long long int __atomic_fetch_nand_8(volatile unsigned long long int *, unsigned long long int, int);
    583837#if defined(__SIZEOF_INT128__)
    584838signed __int128 __atomic_fetch_nand   (volatile signed __int128 *, signed __int128, int);
     839signed __int128 __atomic_fetch_nand_16(volatile signed __int128 *, signed __int128, int);
    585840unsigned __int128 __atomic_fetch_nand   (volatile unsigned __int128 *, unsigned __int128, int);
     841unsigned __int128 __atomic_fetch_nand_16(volatile unsigned __int128 *, unsigned __int128, int);
    586842#endif
    587843
    588844char __atomic_fetch_xor  (volatile char *, char, int);
     845char __atomic_fetch_xor_1(volatile char *, char, int);
    589846signed char __atomic_fetch_xor  (volatile signed char *, signed char, int);
     847signed char __atomic_fetch_xor_1(volatile signed char *, signed char, int);
    590848unsigned char __atomic_fetch_xor  (volatile unsigned char *, unsigned char, int);
     849unsigned char __atomic_fetch_xor_1(volatile unsigned char *, unsigned char, int);
    591850signed short __atomic_fetch_xor  (volatile signed short *, signed short, int);
     851signed short __atomic_fetch_xor_2(volatile signed short *, signed short, int);
    592852unsigned short __atomic_fetch_xor  (volatile unsigned short *, unsigned short, int);
     853unsigned short __atomic_fetch_xor_2(volatile unsigned short *, unsigned short, int);
    593854signed int __atomic_fetch_xor  (volatile signed int *, signed int, int);
     855signed int __atomic_fetch_xor_4(volatile signed int *, signed int, int);
    594856unsigned int __atomic_fetch_xor  (volatile unsigned int *, unsigned int, int);
    595 signed long int __atomic_fetch_xor  (volatile signed long int *, signed long int, int);
    596 unsigned long int __atomic_fetch_xor  (volatile unsigned long int *, unsigned long int, int);
     857unsigned int __atomic_fetch_xor_4(volatile unsigned int *, unsigned int, int);
    597858signed long long int __atomic_fetch_xor  (volatile signed long long int *, signed long long int, int);
     859signed long long int __atomic_fetch_xor_8(volatile signed long long int *, signed long long int, int);
    598860unsigned long long int __atomic_fetch_xor  (volatile unsigned long long int *, unsigned long long int, int);
     861unsigned long long int __atomic_fetch_xor_8(volatile unsigned long long int *, unsigned long long int, int);
    599862#if defined(__SIZEOF_INT128__)
    600863signed __int128 __atomic_fetch_xor   (volatile signed __int128 *, signed __int128, int);
     864signed __int128 __atomic_fetch_xor_16(volatile signed __int128 *, signed __int128, int);
    601865unsigned __int128 __atomic_fetch_xor   (volatile unsigned __int128 *, unsigned __int128, int);
     866unsigned __int128 __atomic_fetch_xor_16(volatile unsigned __int128 *, unsigned __int128, int);
    602867#endif
    603868
    604869char __atomic_fetch_or  (volatile char *, char, int);
     870char __atomic_fetch_or_1(volatile char *, char, int);
    605871signed char __atomic_fetch_or  (volatile signed char *, signed char, int);
     872signed char __atomic_fetch_or_1(volatile signed char *, signed char, int);
    606873unsigned char __atomic_fetch_or  (volatile unsigned char *, unsigned char, int);
     874unsigned char __atomic_fetch_or_1(volatile unsigned char *, unsigned char, int);
    607875signed short __atomic_fetch_or  (volatile signed short *, signed short, int);
     876signed short __atomic_fetch_or_2(volatile signed short *, signed short, int);
    608877unsigned short __atomic_fetch_or  (volatile unsigned short *, unsigned short, int);
     878unsigned short __atomic_fetch_or_2(volatile unsigned short *, unsigned short, int);
    609879signed int __atomic_fetch_or  (volatile signed int *, signed int, int);
     880signed int __atomic_fetch_or_4(volatile signed int *, signed int, int);
    610881unsigned int __atomic_fetch_or  (volatile unsigned int *, unsigned int, int);
    611 signed long int __atomic_fetch_or  (volatile signed long int *, signed long int, int);
    612 unsigned long int __atomic_fetch_or  (volatile unsigned long int *, unsigned long int, int);
     882unsigned int __atomic_fetch_or_4(volatile unsigned int *, unsigned int, int);
    613883signed long long int __atomic_fetch_or  (volatile signed long long int *, signed long long int, int);
     884signed long long int __atomic_fetch_or_8(volatile signed long long int *, signed long long int, int);
    614885unsigned long long int __atomic_fetch_or  (volatile unsigned long long int *, unsigned long long int, int);
     886unsigned long long int __atomic_fetch_or_8(volatile unsigned long long int *, unsigned long long int, int);
    615887#if defined(__SIZEOF_INT128__)
    616888signed __int128 __atomic_fetch_or   (volatile signed __int128 *, signed __int128, int);
     889signed __int128 __atomic_fetch_or_16(volatile signed __int128 *, signed __int128, int);
    617890unsigned __int128 __atomic_fetch_or   (volatile unsigned __int128 *, unsigned __int128, int);
     891unsigned __int128 __atomic_fetch_or_16(volatile unsigned __int128 *, unsigned __int128, int);
    618892#endif
    619893
  • libcfa/src/Makefile.am

    r3d5701e r9fb8f01  
    3232# use -no-include-stdhdr to prevent rebuild cycles
    3333# The built sources must not depend on the installed headers
    34 AM_CFAFLAGS = -quiet -cfalib -I$(srcdir)/stdhdr $(if $(findstring ${gdbwaittarget}, ${@}), -XCFA --gdb) @CONFIG_CFAFLAGS@
    35 AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC -pthread @ARCH_FLAGS@ @CONFIG_CFLAGS@
     34AM_CFAFLAGS = -quiet -in-tree -I$(srcdir)/stdhdr $(if $(findstring ${gdbwaittarget}, ${@}), -XCFA --gdb) @CONFIG_CFAFLAGS@
     35AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC @ARCH_FLAGS@ @CONFIG_CFLAGS@
    3636AM_CCASFLAGS = -g -Wall -Wno-unused-function @ARCH_FLAGS@ @CONFIG_CFLAGS@
    3737CFACC = @CFACC@
     
    6464# add dependency of cfa files
    6565libobjs = $(addsuffix .lo, $(basename $(filter %.cfa,$(libsrc))))
    66 $(libobjs) : @LOCAL_CFACC@ @CFACPP@ prelude.cfa
     66$(libobjs) : @CFACC@ @CFACPP@ prelude.cfa
    6767
    6868thread_libobjs = $(addsuffix .lo, $(basename $(filter %.cfa,$(thread_libsrc))))
    69 $(thread_libobjs) : @LOCAL_CFACC@ @CFACPP@ prelude.cfa
     69$(thread_libobjs) : @CFACC@ @CFACPP@ prelude.cfa
    7070
    7171
     
    8686
    8787
    88 if ENABLE_DISTCC
     88prelude.o : prelude.cfa extras.cf gcc-builtins.cf builtins.cf @CFACC@ @CFACPP@
     89        ${AM_V_GEN}$(CFACOMPILE) -quiet -in-tree -XCFA -l ${<} -c -o ${@}
    8990
    90 ../prelude/distribution: @LOCAL_CFACC@ @LOCAL_CC1@ @CFACPP@ ../prelude/gcc-builtins.cf ../prelude/builtins.cf ../prelude/extras.cf ../prelude/prelude.cfa ../prelude/bootloader.c $(srcdir)/../../tools/build/push2dist.sh
    91         @+make -C ../prelude distribution
     91prelude.lo: prelude.cfa extras.cf gcc-builtins.cf builtins.cf @CFACC@ @CFACPP@
     92        ${AM_V_GEN}$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile \
     93        $(CFACOMPILE) -quiet -in-tree -XCFA -l ${<} -c -o ${@}
    9294
    93 prelude.o prelude.lo $(libobjs) $(thread_libobjs) : ../prelude/distribution
    94 
    95 endif ENABLE_DISTCC
    96 
    97 prelude.o : prelude.cfa extras.cf gcc-builtins.cf builtins.cf @LOCAL_CFACC@ @CFACPP@
    98         ${AM_V_GEN}$(CFACOMPILE) -quiet -XCFA -l ${<} -c -o ${@}
    99 
    100 prelude.lo: prelude.cfa extras.cf gcc-builtins.cf builtins.cf @LOCAL_CFACC@ @CFACPP@
    101         ${AM_V_GEN}$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile \
    102         $(CFACOMPILE) -quiet -XCFA -l ${<} -c -o ${@}
    10395
    10496#----------------------------------------------------------------------------------------------------------------
  • libcfa/src/Makefile.in

    r3d5701e r9fb8f01  
    284284CFACC = @CFACC@
    285285CFACPP = @CFACPP@
    286 CFADIR_HASH = @CFADIR_HASH@
    287286CFA_BINDIR = @CFA_BINDIR@
    288287CFA_INCDIR = @CFA_INCDIR@
     
    328327LIPO = @LIPO@
    329328LN_S = @LN_S@
    330 LOCAL_CC1 = @LOCAL_CC1@
    331 LOCAL_CFACC = @LOCAL_CFACC@
    332329LTLIBOBJS = @LTLIBOBJS@
    333330LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
     
    416413LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
    417414        $(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \
    418         $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS)
     415        $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \
     416        $(AM_CFLAGS) $(CFLAGS)
    419417
    420418AM_V_CFA = $(am__v_CFA_@AM_V@)
     
    422420am__v_CFA_0 = @echo "  CFA     " $@;
    423421am__v_CFA_1 =
     422AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
     423am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
     424am__v_JAVAC_0 = @echo "  JAVAC   " $@;
     425am__v_JAVAC_1 =
     426AM_V_GOC = $(am__v_GOC_@AM_V@)
     427am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
     428am__v_GOC_0 = @echo "  GOC     " $@;
     429am__v_GOC_1 =
    424430UPPCC = u++
    425431UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
     
    428434am__v_UPP_0 = @echo "  UPP     " $@;
    429435am__v_UPP_1 =
    430 AM_V_GOC = $(am__v_GOC_@AM_V@)
    431 am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
    432 am__v_GOC_0 = @echo "  GOC     " $@;
    433 am__v_GOC_1 =
    434 AM_V_RUST = $(am__v_RUST_@AM_V@)
    435 am__v_RUST_ = $(am__v_RUST_@AM_DEFAULT_V@)
    436 am__v_RUST_0 = @echo "  RUST     " $@;
    437 am__v_RUST_1 =
    438 AM_V_NODEJS = $(am__v_NODEJS_@AM_V@)
    439 am__v_NODEJS_ = $(am__v_NODEJS_@AM_DEFAULT_V@)
    440 am__v_NODEJS_0 = @echo "  NODEJS     " $@;
    441 am__v_NODEJS_1 =
    442 AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
    443 am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
    444 am__v_JAVAC_0 = @echo "  JAVAC   " $@;
    445 am__v_JAVAC_1 =
    446436lib_LTLIBRARIES = libcfa.la libcfathread.la
    447437gdbwaittarget = ""
     
    451441# use -no-include-stdhdr to prevent rebuild cycles
    452442# The built sources must not depend on the installed headers
    453 AM_CFAFLAGS = -quiet -cfalib -I$(srcdir)/stdhdr $(if $(findstring ${gdbwaittarget}, ${@}), -XCFA --gdb) @CONFIG_CFAFLAGS@
    454 AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC -pthread @ARCH_FLAGS@ @CONFIG_CFLAGS@
     443AM_CFAFLAGS = -quiet -in-tree -I$(srcdir)/stdhdr $(if $(findstring ${gdbwaittarget}, ${@}), -XCFA --gdb) @CONFIG_CFAFLAGS@
     444AM_CFLAGS = -g -Wall -Wno-unused-function -fPIC @ARCH_FLAGS@ @CONFIG_CFLAGS@
    455445AM_CCASFLAGS = -g -Wall -Wno-unused-function @ARCH_FLAGS@ @CONFIG_CFLAGS@
    456446@BUILDLIB_FALSE@headers_nosrc =
     
    947937        $(LTCFACOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
    948938        $(am__mv) $$depbase.Tpo $$depbase.Plo
    949 $(libobjs) : @LOCAL_CFACC@ @CFACPP@ prelude.cfa
    950 $(thread_libobjs) : @LOCAL_CFACC@ @CFACPP@ prelude.cfa
     939$(libobjs) : @CFACC@ @CFACPP@ prelude.cfa
     940$(thread_libobjs) : @CFACC@ @CFACPP@ prelude.cfa
    951941
    952942-include $(libdeps)
     
    954944-include $(thread_libdeps)
    955945
    956 @ENABLE_DISTCC_TRUE@../prelude/distribution: @LOCAL_CFACC@ @LOCAL_CC1@ @CFACPP@ ../prelude/gcc-builtins.cf ../prelude/builtins.cf ../prelude/extras.cf ../prelude/prelude.cfa ../prelude/bootloader.c $(srcdir)/../../tools/build/push2dist.sh
    957 @ENABLE_DISTCC_TRUE@    @+make -C ../prelude distribution
    958 
    959 @ENABLE_DISTCC_TRUE@prelude.o prelude.lo $(libobjs) $(thread_libobjs) : ../prelude/distribution
    960 
    961 prelude.o : prelude.cfa extras.cf gcc-builtins.cf builtins.cf @LOCAL_CFACC@ @CFACPP@
    962         ${AM_V_GEN}$(CFACOMPILE) -quiet -XCFA -l ${<} -c -o ${@}
    963 
    964 prelude.lo: prelude.cfa extras.cf gcc-builtins.cf builtins.cf @LOCAL_CFACC@ @CFACPP@
     946prelude.o : prelude.cfa extras.cf gcc-builtins.cf builtins.cf @CFACC@ @CFACPP@
     947        ${AM_V_GEN}$(CFACOMPILE) -quiet -in-tree -XCFA -l ${<} -c -o ${@}
     948
     949prelude.lo: prelude.cfa extras.cf gcc-builtins.cf builtins.cf @CFACC@ @CFACPP@
    965950        ${AM_V_GEN}$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile \
    966         $(CFACOMPILE) -quiet -XCFA -l ${<} -c -o ${@}
     951        $(CFACOMPILE) -quiet -in-tree -XCFA -l ${<} -c -o ${@}
    967952
    968953#----------------------------------------------------------------------------------------------------------------
  • libcfa/src/assert.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Mon Nov 28 12:27:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 13:00:18 2020
    13 // Update Count     : 6
     12// Last Modified On : Thu Jul 20 15:10:26 2017
     13// Update Count     : 2
    1414//
    1515
     
    1717#include <stdarg.h>                                                             // varargs
    1818#include <stdio.h>                                                              // fprintf
    19 #include <unistd.h>                                                             // STDERR_FILENO
    2019#include "bits/debug.hfa"
    2120
     
    2625
    2726        // called by macro assert in assert.h
    28         void __assert_fail( const char assertion[], const char file[], unsigned int line, const char function[] ) {
    29                 __cfaabi_bits_print_safe( STDERR_FILENO, CFA_ASSERT_FMT ".\n", assertion, __progname, function, line, file );
     27        void __assert_fail( const char *assertion, const char *file, unsigned int line, const char *function ) {
     28                __cfaabi_dbg_bits_print_safe( CFA_ASSERT_FMT ".\n", assertion, __progname, function, line, file );
    3029                abort();
    3130        }
    3231
    3332        // called by macro assertf
    34         void __assert_fail_f( const char assertion[], const char file[], unsigned int line, const char function[], const char fmt[], ... ) {
    35                 __cfaabi_bits_acquire();
    36                 __cfaabi_bits_print_nolock( STDERR_FILENO, CFA_ASSERT_FMT ": ", assertion, __progname, function, line, file );
     33        void __assert_fail_f( const char *assertion, const char *file, unsigned int line, const char *function, const char *fmt, ... ) {
     34                __cfaabi_dbg_bits_acquire();
     35                __cfaabi_dbg_bits_print_nolock( CFA_ASSERT_FMT ": ", assertion, __progname, function, line, file );
    3736
    3837                va_list args;
    3938                va_start( args, fmt );
    40                 __cfaabi_bits_print_vararg( STDERR_FILENO, fmt, args );
     39                __cfaabi_dbg_bits_print_vararg( fmt, args );
    4140                va_end( args );
    4241
    43                 __cfaabi_bits_print_nolock( STDERR_FILENO, "\n" );
    44                 __cfaabi_bits_release();
     42                __cfaabi_dbg_bits_print_nolock( "\n" );
     43                __cfaabi_dbg_bits_release();
    4544                abort();
    4645        }
  • libcfa/src/bits/align.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Mon Nov 28 12:27:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Nov 16 18:58:22 2019
    13 // Update Count     : 3
     12// Last Modified On : Fri Jul 21 23:05:35 2017
     13// Update Count     : 2
    1414//
    1515// This  library is free  software; you  can redistribute  it and/or  modify it
     
    3333
    3434// Minimum size used to align memory boundaries for memory allocations.
    35 //#define libAlign() (sizeof(double))
    36 // gcc-7 uses xmms instructions, which require 16 byte alignment.
    37 #define libAlign() (16)
     35#define libAlign() (sizeof(double))
    3836
    3937// Check for power of 2
  • libcfa/src/bits/containers.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Oct 31 16:38:50 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jan 15 07:42:35 2020
    13 // Update Count     : 28
     12// Last Modified On : Wed Jun 26 08:52:20 2019
     13// Update Count     : 4
    1414
    1515#pragma once
     
    4444
    4545        forall(dtype T | sized(T))
    46         static inline T & ?[?]( __small_array(T) & this, __lock_size_t idx ) {
     46        static inline T& ?[?]( __small_array(T) & this, __lock_size_t idx) {
    4747                return ((typeof(this.data))this.data)[idx];
    4848        }
    4949
    5050        forall(dtype T | sized(T))
    51         static inline T & ?[?]( const __small_array(T) & this, __lock_size_t idx ) {
     51        static inline T& ?[?]( const __small_array(T) & this, __lock_size_t idx) {
    5252                return ((typeof(this.data))this.data)[idx];
    5353        }
    5454
    55         forall(dtype T)
    56         static inline T * begin( const __small_array(T) & this ) {
     55        forall(dtype T | sized(T))
     56        static inline T* begin( const __small_array(T) & this ) {
    5757                return ((typeof(this.data))this.data);
    5858        }
    5959
    6060        forall(dtype T | sized(T))
    61         static inline T * end( const __small_array(T) & this ) {
     61        static inline T* end( const __small_array(T) & this ) {
    6262                return ((typeof(this.data))this.data) + this.size;
    6363        }
     
    7070#ifdef __cforall
    7171        trait is_node(dtype T) {
    72                 T *& get_next( T & );
     72                T*& get_next( T& );
    7373        };
    7474#endif
     
    9797        forall(dtype T)
    9898        static inline void ?{}( __stack(T) & this ) {
    99                 (this.top){ 0p };
    100         }
    101 
    102         static inline forall( dtype T | is_node(T) ) {
    103                 void push( __stack(T) & this, T * val ) {
    104                         verify( !get_next( *val ) );
    105                         get_next( *val ) = this.top;
    106                         this.top = val;
    107                 }
    108 
    109                 T * pop( __stack(T) & this ) {
    110                         T * top = this.top;
    111                         if( top ) {
    112                                 this.top = get_next( *top );
    113                                 get_next( *top ) = 0p;
    114                         }
    115                         return top;
    116                 }
    117 
    118                 int ?!=?( const __stack(T) & this, __attribute__((unused)) zero_t zero ) {
    119                         return this.top != 0;
    120                 }
     99                (this.top){ NULL };
     100        }
     101
     102        forall(dtype T | is_node(T) | sized(T))
     103        static inline void push( __stack(T) & this, T * val ) {
     104                verify( !get_next( *val ) );
     105                get_next( *val ) = this.top;
     106                this.top = val;
     107        }
     108
     109        forall(dtype T | is_node(T) | sized(T))
     110        static inline T * pop( __stack(T) & this ) {
     111                T * top = this.top;
     112                if( top ) {
     113                        this.top = get_next( *top );
     114                        get_next( *top ) = NULL;
     115                }
     116                return top;
     117        }
     118
     119        forall(dtype T | is_node(T))
     120        static inline int ?!=?( const __stack(T) & this, __attribute__((unused)) zero_t zero ) {
     121                return this.top != 0;
    121122        }
    122123#endif
     
    144145
    145146#ifdef __cforall
    146         static inline forall( dtype T | is_node(T) ) {
    147                 void ?{}( __queue(T) & this ) with( this ) {
    148                         head{ 1p };
    149                         tail{ &head };
    150                         verify(*tail == 1p);
    151                 }
    152 
    153                 void append( __queue(T) & this, T * val ) with( this ) {
    154                         verify(tail != 0p);
    155                         verify(*tail == 1p);
    156                         *tail = val;
    157                         tail = &get_next( *val );
    158                         *tail = 1p;
    159                 }
    160 
    161                 T * pop_head( __queue(T) & this ) {
    162                         verify(*this.tail == 1p);
    163                         T * head = this.head;
    164                         if( head != 1p ) {
    165                                 this.head = get_next( *head );
    166                                 if( get_next( *head ) == 1p ) {
    167                                         this.tail = &this.head;
    168                                 }
    169                                 get_next( *head ) = 0p;
    170                                 verify(*this.tail == 1p);
    171                                 return head;
     147
     148        forall(dtype T)
     149        static inline void ?{}( __queue(T) & this ) with( this ) {
     150                head{ NULL };
     151                tail{ &head };
     152        }
     153
     154        forall(dtype T | is_node(T) | sized(T))
     155        static inline void append( __queue(T) & this, T * val ) with( this ) {
     156                verify(tail != NULL);
     157                *tail = val;
     158                tail = &get_next( *val );
     159        }
     160
     161        forall(dtype T | is_node(T) | sized(T))
     162        static inline T * pop_head( __queue(T) & this ) {
     163                T * head = this.head;
     164                if( head ) {
     165                        this.head = get_next( *head );
     166                        if( !get_next( *head ) ) {
     167                                this.tail = &this.head;
    172168                        }
    173                         verify(*this.tail == 1p);
    174                         return 0p;
    175                 }
    176 
    177                 T * remove( __queue(T) & this, T ** it ) with( this ) {
    178                         T * val = *it;
    179                         verify( val );
    180 
    181                         (*it) = get_next( *val );
    182 
    183                         if( tail == &get_next( *val ) ) {
    184                                 tail = it;
    185                         }
    186 
    187                         get_next( *val ) = 0p;
    188 
    189                         verify( (head == 1p) == (&head == tail) );
    190                         verify( *tail == 1p );
    191                         return val;
    192                 }
    193 
    194                 int ?!=?( const __queue(T) & this, __attribute__((unused)) zero_t zero ) {
    195                         return this.head != 0;
    196                 }
     169                        get_next( *head ) = NULL;
     170                }
     171                return head;
     172        }
     173
     174        forall(dtype T | is_node(T) | sized(T))
     175        static inline T * remove( __queue(T) & this, T ** it ) with( this ) {
     176                T * val = *it;
     177                verify( val );
     178
     179                (*it) = get_next( *val );
     180
     181                if( tail == &get_next( *val ) ) {
     182                        tail = it;
     183                }
     184
     185                get_next( *val ) = NULL;
     186
     187                verify( (head == NULL) == (&head == tail) );
     188                verify( *tail == NULL );
     189                return val;
     190        }
     191
     192        forall(dtype T | is_node(T))
     193        static inline int ?!=?( const __queue(T) & this, __attribute__((unused)) zero_t zero ) {
     194                return this.head != 0;
    197195        }
    198196#endif
     
    225223
    226224#ifdef __cforall
    227         forall(dtype T )
     225
     226        forall(dtype T | sized(T))
    228227        static inline [void] ?{}( __dllist(T) & this, * [T * & next, T * & prev] ( T & ) __get ) {
    229                 this.head{ 0p };
     228                this.head{ NULL };
    230229                this.__get = __get;
    231230        }
     
    233232        #define next 0
    234233        #define prev 1
    235         static inline forall(dtype T) {
    236                 void push_front( __dllist(T) & this, T & node ) with( this ) {
    237                         verify(__get);
    238                         if ( head ) {
    239                                 __get( node ).next = head;
    240                                 __get( node ).prev = __get( *head ).prev;
    241                                 // inserted node must be consistent before it is seen
    242                                 // prevent code movement across barrier
    243                                 asm( "" : : : "memory" );
    244                                 __get( *head ).prev = &node;
    245                                 T & _prev = *__get( node ).prev;
    246                                 __get( _prev ).next = &node;
    247                         } else {
    248                                 __get( node ).next = &node;
    249                                 __get( node ).prev = &node;
    250                         }
    251 
     234        forall(dtype T | sized(T))
     235        static inline void push_front( __dllist(T) & this, T & node ) with( this ) {
     236                verify(__get);
     237                if ( head ) {
     238                        __get( node ).next = head;
     239                        __get( node ).prev = __get( *head ).prev;
     240                        // inserted node must be consistent before it is seen
    252241                        // prevent code movement across barrier
    253242                        asm( "" : : : "memory" );
    254                         head = &node;
    255                 }
    256 
    257                 void remove( __dllist(T) & this, T & node ) with( this ) {
    258                         verify(__get);
    259                         if ( &node == head ) {
    260                                 if ( __get( *head ).next == head ) {
    261                                         head = 0p;
    262                                 } else {
    263                                         head = __get( *head ).next;
    264                                 }
     243                        __get( *head ).prev = &node;
     244                        T & _prev = *__get( node ).prev;
     245                        __get( _prev ).next = &node;
     246                }
     247                else {
     248                        __get( node ).next = &node;
     249                        __get( node ).prev = &node;
     250                }
     251
     252                // prevent code movement across barrier
     253                asm( "" : : : "memory" );
     254                head = &node;
     255        }
     256
     257        forall(dtype T | sized(T))
     258        static inline void remove( __dllist(T) & this, T & node ) with( this ) {
     259                verify(__get);
     260                if ( &node == head ) {
     261                        if ( __get( *head ).next == head ) {
     262                                head = NULL;
    265263                        }
    266                         __get( *__get( node ).next ).prev = __get( node ).prev;
    267                         __get( *__get( node ).prev ).next = __get( node ).next;
    268                         __get( node ).next = 0p;
    269                         __get( node ).prev = 0p;
    270                 }
    271 
    272                 int ?!=?( const __dllist(T) & this, __attribute__((unused)) zero_t zero ) {
    273                         return this.head != 0;
    274                 }
     264                        else {
     265                                head = __get( *head ).next;
     266                        }
     267                }
     268                __get( *__get( node ).next ).prev = __get( node ).prev;
     269                __get( *__get( node ).prev ).next = __get( node ).next;
     270                __get( node ).next = NULL;
     271                __get( node ).prev = NULL;
     272        }
     273
     274        forall(dtype T | sized(T))
     275        static inline int ?!=?( const __dllist(T) & this, __attribute__((unused)) zero_t zero ) {
     276                return this.head != 0;
    275277        }
    276278        #undef next
     
    284286
    285287#endif
    286 
    287 // Local Variables: //
    288 // tab-width: 4 //
    289 // End: //
  • libcfa/src/bits/debug.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Thu Mar 30 12:30:01 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 13:03:16 2020
    13 // Update Count     : 11
     12// Last Modified On : Sun Jul 14 22:17:35 2019
     13// Update Count     : 4
    1414//
    1515
     
    2727
    2828extern "C" {
    29         void __cfaabi_bits_write( int fd, const char in_buffer[], int len ) {
     29
     30        void __cfaabi_dbg_bits_write( const char *in_buffer, int len ) {
    3031                // ensure all data is written
    3132                for ( int count = 0, retcode; count < len; count += retcode ) {
     
    3334
    3435                        for ( ;; ) {
    35                                 retcode = write( fd, in_buffer, len - count );
     36                                retcode = write( STDERR_FILENO, in_buffer, len - count );
    3637
    3738                                // not a timer interrupt ?
     
    4344        }
    4445
    45         void __cfaabi_bits_acquire() __attribute__((__weak__)) {}
    46         void __cfaabi_bits_release() __attribute__((__weak__)) {}
     46        void __cfaabi_dbg_bits_acquire() __attribute__((__weak__)) {}
     47        void __cfaabi_dbg_bits_release() __attribute__((__weak__)) {}
    4748
    48         void __cfaabi_bits_print_safe  ( int fd, const char fmt[], ... ) __attribute__(( format(printf, 2, 3) )) {
     49        void __cfaabi_dbg_bits_print_safe  ( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) )) {
    4950                va_list args;
    5051
    5152                va_start( args, fmt );
    52                 __cfaabi_bits_acquire();
     53                __cfaabi_dbg_bits_acquire();
    5354
    5455                int len = vsnprintf( buffer, buffer_size, fmt, args );
    55                 __cfaabi_bits_write( fd, buffer, len );
     56                __cfaabi_dbg_bits_write( buffer, len );
    5657
    57                 __cfaabi_bits_release();
     58                __cfaabi_dbg_bits_release();
    5859                va_end( args );
    5960        }
    6061
    61         void __cfaabi_bits_print_nolock( int fd, const char fmt[], ... ) __attribute__(( format(printf, 2, 3) )) {
     62        void __cfaabi_dbg_bits_print_nolock( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) )) {
    6263                va_list args;
    6364
     
    6566
    6667                int len = vsnprintf( buffer, buffer_size, fmt, args );
    67                 __cfaabi_bits_write( fd, buffer, len );
     68                __cfaabi_dbg_bits_write( buffer, len );
    6869
    6970                va_end( args );
    7071        }
    7172
    72         void __cfaabi_bits_print_vararg( int fd, const char fmt[], va_list args ) {
     73        void __cfaabi_dbg_bits_print_vararg( const char fmt[], va_list args ) {
    7374                int len = vsnprintf( buffer, buffer_size, fmt, args );
    74                 __cfaabi_bits_write( fd, buffer, len );
     75                __cfaabi_dbg_bits_write( buffer, len );
    7576        }
    7677
    77         void __cfaabi_bits_print_buffer( int fd, char in_buffer[], int in_buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 4, 5) )) {
     78        void __cfaabi_dbg_bits_print_buffer( char in_buffer[], int in_buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 3, 4) )) {
    7879                va_list args;
    7980
     
    8182
    8283                int len = vsnprintf( in_buffer, in_buffer_size, fmt, args );
    83                 __cfaabi_bits_write( fd, in_buffer, len );
     84                __cfaabi_dbg_bits_write( in_buffer, len );
    8485
    8586                va_end( args );
  • libcfa/src/bits/debug.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Mon Nov 28 12:27:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 12:29:21 2020
    13 // Update Count     : 9
     12// Last Modified On : Thu Feb  8 12:35:19 2018
     13// Update Count     : 2
    1414//
    1515
     
    2121        #define __cfaabi_dbg_ctx __PRETTY_FUNCTION__
    2222        #define __cfaabi_dbg_ctx2 , __PRETTY_FUNCTION__
    23         #define __cfaabi_dbg_ctx_param const char caller[]
    24         #define __cfaabi_dbg_ctx_param2 , const char caller[]
     23        #define __cfaabi_dbg_ctx_param const char * caller
     24        #define __cfaabi_dbg_ctx_param2 , const char * caller
    2525#else
    2626        #define __cfaabi_dbg_debug_do(...)
     
    3838        #include <stdio.h>
    3939
    40         extern void __cfaabi_bits_write( int fd, const char buffer[], int len );
    41         extern void __cfaabi_bits_acquire();
    42         extern void __cfaabi_bits_release();
    43         extern void __cfaabi_bits_print_safe  ( int fd, const char fmt[], ... ) __attribute__(( format(printf, 2, 3) ));
    44         extern void __cfaabi_bits_print_nolock( int fd, const char fmt[], ... ) __attribute__(( format(printf, 2, 3) ));
    45         extern void __cfaabi_bits_print_vararg( int fd, const char fmt[], va_list arg );
    46         extern void __cfaabi_bits_print_buffer( int fd, char buffer[], int buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 4, 5) ));
     40      extern void __cfaabi_dbg_bits_write( const char *buffer, int len );
     41      extern void __cfaabi_dbg_bits_acquire();
     42      extern void __cfaabi_dbg_bits_release();
     43      extern void __cfaabi_dbg_bits_print_safe  ( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) ));
     44      extern void __cfaabi_dbg_bits_print_nolock( const char fmt[], ... ) __attribute__(( format(printf, 1, 2) ));
     45      extern void __cfaabi_dbg_bits_print_vararg( const char fmt[], va_list arg );
     46      extern void __cfaabi_dbg_bits_print_buffer( char buffer[], int buffer_size, const char fmt[], ... ) __attribute__(( format(printf, 3, 4) ));
    4747#ifdef __cforall
    4848}
     
    5050
    5151#ifdef __CFA_DEBUG_PRINT__
    52         #define __cfaabi_dbg_write( buffer, len )         __cfaabi_bits_write( STDERR_FILENO, buffer, len )
    53         #define __cfaabi_dbg_acquire()                    __cfaabi_bits_acquire()
    54         #define __cfaabi_dbg_release()                    __cfaabi_bits_release()
    55         #define __cfaabi_dbg_print_safe(...)              __cfaabi_bits_print_safe   (__VA_ARGS__)
    56         #define __cfaabi_dbg_print_nolock(...)            __cfaabi_bits_print_nolock (__VA_ARGS__)
    57         #define __cfaabi_dbg_print_buffer(...)            __cfaabi_bits_print_buffer (__VA_ARGS__)
    58         #define __cfaabi_dbg_print_buffer_decl(...)       char __dbg_text[256]; int __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_bits_write( __dbg_text, __dbg_len );
    59         #define __cfaabi_dbg_print_buffer_local(...)      __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_dbg_write( __dbg_text, __dbg_len );
     52        #define __cfaabi_dbg_write( buffer, len )         __cfaabi_dbg_bits_write( buffer, len )
     53        #define __cfaabi_dbg_acquire()                    __cfaabi_dbg_bits_acquire()
     54        #define __cfaabi_dbg_release()                    __cfaabi_dbg_bits_release()
     55        #define __cfaabi_dbg_print_safe(...)              __cfaabi_dbg_bits_print_safe   (__VA_ARGS__)
     56        #define __cfaabi_dbg_print_nolock(...)            __cfaabi_dbg_bits_print_nolock (__VA_ARGS__)
     57        #define __cfaabi_dbg_print_buffer(...)            __cfaabi_dbg_bits_print_buffer (__VA_ARGS__)
     58        #define __cfaabi_dbg_print_buffer_decl(...)       char __dbg_text[256]; int __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_dbg_bits_write( __dbg_text, __dbg_len );
     59        #define __cfaabi_dbg_print_buffer_local(...)      __dbg_len = snprintf( __dbg_text, 256, __VA_ARGS__ ); __cfaabi_dbg_bits_write( __dbg_text, __dbg_len );
    6060#else
    6161        #define __cfaabi_dbg_write(...)               ((void)0)
  • libcfa/src/bits/defs.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Thu Nov  9 13:24:10 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Jan 28 22:38:27 2020
    13 // Update Count     : 9
     12// Last Modified On : Thu Feb  8 16:22:41 2018
     13// Update Count     : 8
    1414//
    1515
     
    3434
    3535#ifdef __cforall
    36 void abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ ));
    37 void abort( bool signalAbort, const char fmt[], ... ) __attribute__ (( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ ));
     36void abort ( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ ));
    3837extern "C" {
    3938#endif
     
    4847#define OPTIONAL_THREAD __attribute__((weak))
    4948#endif
    50 
    51 static inline long long rdtscl(void) {
    52     unsigned int lo, hi;
    53     __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
    54     return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
    55 }
  • libcfa/src/bits/locks.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Oct 31 15:14:38 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 13:03:19 2020
    13 // Update Count     : 11
     12// Last Modified On : Sat Aug 11 15:42:24 2018
     13// Update Count     : 10
    1414//
    1515
     
    5454
    5555                #ifdef __CFA_DEBUG__
    56                         void __cfaabi_dbg_record(__spinlock_t & this, const char prev_name[]);
     56                        void __cfaabi_dbg_record(__spinlock_t & this, const char * prev_name);
    5757                #else
    5858                        #define __cfaabi_dbg_record(x, y)
    5959                #endif
    6060        }
     61
     62        extern void yield( unsigned int );
    6163
    6264        static inline void ?{}( __spinlock_t & this ) {
     
    6668        // Lock the spinlock, return false if already acquired
    6769        static inline bool try_lock  ( __spinlock_t & this __cfaabi_dbg_ctx_param2 ) {
    68                 disable_interrupts();
    6970                bool result = (this.lock == 0) && (__atomic_test_and_set( &this.lock, __ATOMIC_ACQUIRE ) == 0);
    7071                if( result ) {
     72                        disable_interrupts();
    7173                        __cfaabi_dbg_record( this, caller );
    72                 } else {
    73                         enable_interrupts_noPoll();
    7474                }
    7575                return result;
     
    8383                #endif
    8484
    85                 disable_interrupts();
    8685                for ( unsigned int i = 1;; i += 1 ) {
    8786                        if ( (this.lock == 0) && (__atomic_test_and_set( &this.lock, __ATOMIC_ACQUIRE ) == 0) ) break;
     
    9998                        #endif
    10099                }
     100                disable_interrupts();
    101101                __cfaabi_dbg_record( this, caller );
    102102        }
    103103
    104104        static inline void unlock( __spinlock_t & this ) {
     105                enable_interrupts_noPoll();
    105106                __atomic_clear( &this.lock, __ATOMIC_RELEASE );
    106                 enable_interrupts_noPoll();
    107107        }
    108108
  • libcfa/src/bits/signal.hfa

    r3d5701e r9fb8f01  
    3737
    3838        act.sa_sigaction = (void (*)(int, siginfo_t *, void *))handler;
    39         sigemptyset( &act.sa_mask );
    40         sigaddset( &act.sa_mask, SIGALRM );             // disabled during signal handler
    41         sigaddset( &act.sa_mask, SIGUSR1 );
    42         sigaddset( &act.sa_mask, SIGSEGV );
    43         sigaddset( &act.sa_mask, SIGBUS );
    44         sigaddset( &act.sa_mask, SIGILL );
    45         sigaddset( &act.sa_mask, SIGFPE );
    46         sigaddset( &act.sa_mask, SIGHUP );              // revert to default on second delivery
    47         sigaddset( &act.sa_mask, SIGTERM );
    48         sigaddset( &act.sa_mask, SIGINT );
    4939        act.sa_flags = flags;
    5040
    51         if ( sigaction( sig, &act, 0p ) == -1 ) {
     41        if ( sigaction( sig, &act, NULL ) == -1 ) {
    5242                __cfaabi_dbg_print_buffer_decl(
    5343                        " __cfaabi_sigaction( sig:%d, handler:%p, flags:%d ), problem installing signal handler, error(%d) %s.\n",
     
    5545                );
    5646                _exit( EXIT_FAILURE );
    57         } // if
     47        }
    5848}
     49
     50// Sigaction wrapper : restore default handler
     51static void __cfaabi_sigdefault( int sig ) {
     52        struct sigaction act;
     53
     54        act.sa_handler = SIG_DFL;
     55        act.sa_flags = 0;
     56        sigemptyset( &act.sa_mask );
     57
     58        if ( sigaction( sig, &act, NULL ) == -1 ) {
     59                __cfaabi_dbg_print_buffer_decl(
     60                        " __cfaabi_sigdefault( sig:%d ), problem reseting signal handler, error(%d) %s.\n",
     61                        sig, errno, strerror( errno )
     62                );
     63                _exit( EXIT_FAILURE );
     64        }
     65}
  • libcfa/src/clock.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Thu Apr 12 14:36:06 2018
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Jan  6 12:49:58 2020
    13 // Update Count     : 9
     12// Last Modified On : Thu Jun 13 21:21:13 2019
     13// Update Count     : 8
    1414//
    1515
    1616#include <time.hfa>
     17
    1718
    1819//######################### C time #########################
     
    2526static inline tm * localtime_r( time_t tp, tm * result ) { return localtime_r( &tp, result ); }
    2627
     28
    2729//######################### Clock #########################
    2830
    2931struct Clock {                                                                                  // private
    3032        Duration offset;                                                                        // for virtual clock: contains offset from real-time
     33        int clocktype;                                                                          // implementation only -1 (virtual), CLOCK_REALTIME
    3134};
    3235
    3336static inline {
     37        void resetClock( Clock & clk ) with( clk ) {
     38                clocktype = CLOCK_REALTIME_COARSE;
     39        } // Clock::resetClock
     40
    3441        void resetClock( Clock & clk, Duration adj ) with( clk ) {
     42                clocktype = -1;
    3543                offset = adj + __timezone`s;                                    // timezone (global) is (UTC - local time) in seconds
    3644        } // resetClock
    3745
     46        void ?{}( Clock & clk ) { resetClock( clk ); }
    3847        void ?{}( Clock & clk, Duration adj ) { resetClock( clk, adj ); }
    3948
     
    8089                return ret;
    8190        } // getTime
    82 
    83         Time getCPUTime() {
    84                 timespec ts;
    85                 clock_gettime( CLOCK_THREAD_CPUTIME_ID, &ts );
    86                 return (Time){ ts };
    87     } // getCPUTime
    8891} // distribution
    8992
  • libcfa/src/concurrency/CtxSwitch-arm.S

    r3d5701e r9fb8f01  
    1313        .text
    1414        .align  2
    15         .global __cfactx_switch
    16         .type   __cfactx_switch, %function
     15        .global CtxSwitch
     16        .type   CtxSwitch, %function
    1717
    18 __cfactx_switch:
     18CtxSwitch:
    1919        @ save callee-saved registers: r4-r8, r10, r11, r13(sp) (plus r9 depending on platform specification)
    2020        @ I've seen reference to 31 registers on 64-bit, if this is the case, more need to be saved
     
    5252        mov r15, r14
    5353        #endif // R9_SPECIAL
    54 
     54       
    5555        .text
    5656        .align  2
    57         .global __cfactx_invoke_stub
    58         .type   __cfactx_invoke_stub, %function
     57        .global CtxInvokeStub
     58        .type   CtxInvokeStub, %function
    5959
    60 __cfactx_invoke_stub:
     60CtxInvokeStub:
    6161        ldmfd r13!, {r0-r1}
    6262        mov r15, r1
  • libcfa/src/concurrency/CtxSwitch-i386.S

    r3d5701e r9fb8f01  
    4343        .text
    4444        .align 2
    45         .globl __cfactx_switch
    46         .type  __cfactx_switch, @function
    47 __cfactx_switch:
     45        .globl CtxSwitch
     46        .type  CtxSwitch, @function
     47CtxSwitch:
    4848
    4949        // Copy the "from" context argument from the stack to register eax
     
    8383
    8484        ret
    85         .size  __cfactx_switch, .-__cfactx_switch
     85        .size  CtxSwitch, .-CtxSwitch
    8686
    8787// Local Variables: //
  • libcfa/src/concurrency/CtxSwitch-x86_64.S

    r3d5701e r9fb8f01  
    4444        .text
    4545        .align 2
    46         .globl __cfactx_switch
    47         .type  __cfactx_switch, @function
    48 __cfactx_switch:
     46        .globl CtxSwitch
     47        .type  CtxSwitch, @function
     48CtxSwitch:
    4949
    5050        // Save volatile registers on the stack.
     
    7777
    7878        ret
    79         .size  __cfactx_switch, .-__cfactx_switch
     79        .size  CtxSwitch, .-CtxSwitch
    8080
    8181//-----------------------------------------------------------------------------
     
    8383        .text
    8484        .align 2
    85         .globl __cfactx_invoke_stub
    86         .type    __cfactx_invoke_stub, @function
    87 __cfactx_invoke_stub:
     85        .globl CtxInvokeStub
     86        .type    CtxInvokeStub, @function
     87CtxInvokeStub:
    8888        movq %rbx, %rdi
    89         movq %r12, %rsi
    90         jmp *%r13
    91         .size  __cfactx_invoke_stub, .-__cfactx_invoke_stub
     89        jmp *%r12
     90        .size  CtxInvokeStub, .-CtxInvokeStub
    9291
    9392// Local Variables: //
  • libcfa/src/concurrency/alarm.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Fri Jun 2 11:31:25 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Jan  5 08:41:36 2020
    13 // Update Count     : 69
     12// Last Modified On : Fri May 25 06:25:47 2018
     13// Update Count     : 67
    1414//
    1515
     
    3939
    4040void __kernel_set_timer( Duration alarm ) {
    41         verifyf(alarm >= 1`us || alarm == 0, "Setting timer to < 1us (%jins)", alarm`ns);
    42         setitimer( ITIMER_REAL, &(itimerval){ alarm }, 0p );
     41        verifyf(alarm >= 1`us || alarm == 0, "Setting timer to < 1us (%jins)", alarm.tv);
     42        setitimer( ITIMER_REAL, &(itimerval){ alarm }, NULL );
    4343}
    4444
     
    4747//=============================================================================================
    4848
    49 void ?{}( alarm_node_t & this, $thread * thrd, Time alarm, Duration period ) with( this ) {
     49void ?{}( alarm_node_t & this, thread_desc * thrd, Time alarm, Duration period ) with( this ) {
    5050        this.thrd = thrd;
    5151        this.alarm = alarm;
     
    113113                        this->tail = &this->head;
    114114                }
    115                 head->next = 0p;
     115                head->next = NULL;
    116116        }
    117117        verify( validate( this ) );
     
    127127                this->tail = it;
    128128        }
    129         n->next = 0p;
     129        n->next = NULL;
    130130
    131131        verify( validate( this ) );
  • libcfa/src/concurrency/alarm.hfa

    r3d5701e r9fb8f01  
    2323#include "time.hfa"
    2424
    25 struct $thread;
     25struct thread_desc;
    2626struct processor;
    2727
     
    4343
    4444        union {
    45                 $thread * thrd; // thrd who created event
     45                thread_desc * thrd;     // thrd who created event
    4646                processor * proc;               // proc who created event
    4747        };
     
    5353typedef alarm_node_t ** __alarm_it_t;
    5454
    55 void ?{}( alarm_node_t & this, $thread * thrd, Time alarm, Duration period );
     55void ?{}( alarm_node_t & this, thread_desc * thrd, Time alarm, Duration period );
    5656void ?{}( alarm_node_t & this, processor   * proc, Time alarm, Duration period );
    5757void ^?{}( alarm_node_t & this );
  • libcfa/src/concurrency/coroutine.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Mon Nov 28 12:27:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 12:29:25 2020
    13 // Update Count     : 16
     12// Last Modified On : Fri Mar 30 17:20:57 2018
     13// Update Count     : 9
    1414//
    1515
     
    3737
    3838extern "C" {
    39         void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage, struct $coroutine *) __attribute__ ((__noreturn__));
     39        void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage, struct coroutine_desc *) __attribute__ ((__noreturn__));
    4040        static void _CtxCoroutine_UnwindCleanup(_Unwind_Reason_Code, struct _Unwind_Exception *) __attribute__ ((__noreturn__));
    4141        static void _CtxCoroutine_UnwindCleanup(_Unwind_Reason_Code, struct _Unwind_Exception *) {
     
    8989}
    9090
    91 void ?{}( $coroutine & this, const char name[], void * storage, size_t storageSize ) with( this ) {
    92         (this.context){0p, 0p};
     91void ?{}( coroutine_desc & this, const char * name, void * storage, size_t storageSize ) with( this ) {
     92        (this.context){NULL, NULL};
    9393        (this.stack){storage, storageSize};
    9494        this.name = name;
    9595        state = Start;
    96         starter = 0p;
    97         last = 0p;
    98         cancellation = 0p;
    99 }
    100 
    101 void ^?{}($coroutine& this) {
     96        starter = NULL;
     97        last = NULL;
     98        cancellation = NULL;
     99}
     100
     101void ^?{}(coroutine_desc& this) {
    102102        if(this.state != Halted && this.state != Start && this.state != Primed) {
    103                 $coroutine * src = TL_GET( this_thread )->curr_cor;
    104                 $coroutine * dst = &this;
     103                coroutine_desc * src = TL_GET( this_thread )->curr_cor;
     104                coroutine_desc * dst = &this;
    105105
    106106                struct _Unwind_Exception storage;
     
    115115                }
    116116
    117                 $ctx_switch( src, dst );
     117                CoroutineCtxSwitch( src, dst );
    118118        }
    119119}
     
    123123forall(dtype T | is_coroutine(T))
    124124void prime(T& cor) {
    125         $coroutine* this = get_coroutine(cor);
     125        coroutine_desc* this = get_coroutine(cor);
    126126        assert(this->state == Start);
    127127
     
    131131
    132132[void *, size_t] __stack_alloc( size_t storageSize ) {
    133         const size_t stack_data_size = libCeiling( sizeof(__stack_t), 16 ); // minimum alignment
     133        static const size_t stack_data_size = libCeiling( sizeof(__stack_t), 16 ); // minimum alignment
    134134        assert(__page_size != 0l);
    135135        size_t size = libCeiling( storageSize, 16 ) + stack_data_size;
     
    157157
    158158void __stack_prepare( __stack_info_t * this, size_t create_size ) {
    159         const size_t stack_data_size = libCeiling( sizeof(__stack_t), 16 ); // minimum alignment
     159        static const size_t stack_data_size = libCeiling( sizeof(__stack_t), 16 ); // minimum alignment
    160160        bool userStack;
    161161        void * storage;
     
    187187// is not inline (We can't inline Cforall in C)
    188188extern "C" {
    189         void __cfactx_cor_leave( struct $coroutine * src ) {
    190                 $coroutine * starter = src->cancellation != 0 ? src->last : src->starter;
     189        void __suspend_internal(void) {
     190                suspend();
     191        }
     192
     193        void __leave_coroutine( coroutine_desc * src ) {
     194                coroutine_desc * starter = src->cancellation != 0 ? src->last : src->starter;
    191195
    192196                src->state = Halted;
     
    201205                        src->name, src, starter->name, starter );
    202206
    203                 $ctx_switch( src, starter );
    204         }
    205 
    206         struct $coroutine * __cfactx_cor_finish(void) {
    207                 struct $coroutine * cor = kernelTLS.this_thread->curr_cor;
    208 
    209                 if(cor->state == Primed) {
    210                         suspend();
    211                 }
    212 
    213                 cor->state = Active;
    214 
    215                 return cor;
     207                CoroutineCtxSwitch( src, starter );
    216208        }
    217209}
  • libcfa/src/concurrency/coroutine.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Mon Nov 28 12:27:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 12:29:26 2020
    13 // Update Count     : 11
     12// Last Modified On : Fri Jun 21 17:49:39 2019
     13// Update Count     : 9
    1414//
    1515
     
    2525trait is_coroutine(dtype T) {
    2626      void main(T & this);
    27       $coroutine * get_coroutine(T & this);
     27      coroutine_desc * get_coroutine(T & this);
    2828};
    2929
    30 #define DECL_COROUTINE(X) static inline $coroutine* get_coroutine(X& this) { return &this.__cor; } void main(X& this)
     30#define DECL_COROUTINE(X) static inline coroutine_desc* get_coroutine(X& this) { return &this.__cor; } void main(X& this)
    3131
    3232//-----------------------------------------------------------------------------
     
    3535// void ^?{}( coStack_t & this );
    3636
    37 void  ?{}( $coroutine & this, const char name[], void * storage, size_t storageSize );
    38 void ^?{}( $coroutine & this );
     37void ?{}( coroutine_desc & this, const char * name, void * storage, size_t storageSize );
     38void ^?{}( coroutine_desc & this );
    3939
    40 static inline void ?{}( $coroutine & this)                                       { this{ "Anonymous Coroutine", 0p, 0 }; }
    41 static inline void ?{}( $coroutine & this, size_t stackSize)                     { this{ "Anonymous Coroutine", 0p, stackSize }; }
    42 static inline void ?{}( $coroutine & this, void * storage, size_t storageSize )  { this{ "Anonymous Coroutine", storage, storageSize }; }
    43 static inline void ?{}( $coroutine & this, const char name[])                    { this{ name, 0p, 0 }; }
    44 static inline void ?{}( $coroutine & this, const char name[], size_t stackSize ) { this{ name, 0p, stackSize }; }
     40static inline void ?{}( coroutine_desc & this)                                       { this{ "Anonymous Coroutine", NULL, 0 }; }
     41static inline void ?{}( coroutine_desc & this, size_t stackSize)                     { this{ "Anonymous Coroutine", NULL, stackSize }; }
     42static inline void ?{}( coroutine_desc & this, void * storage, size_t storageSize )  { this{ "Anonymous Coroutine", storage, storageSize }; }
     43static inline void ?{}( coroutine_desc & this, const char * name)                    { this{ name, NULL, 0 }; }
     44static inline void ?{}( coroutine_desc & this, const char * name, size_t stackSize ) { this{ name, NULL, stackSize }; }
    4545
    4646//-----------------------------------------------------------------------------
     
    5454void prime(T & cor);
    5555
    56 static inline struct $coroutine * active_coroutine() { return TL_GET( this_thread )->curr_cor; }
     56static inline struct coroutine_desc * active_coroutine() { return TL_GET( this_thread )->curr_cor; }
    5757
    5858//-----------------------------------------------------------------------------
     
    6161// Start coroutine routines
    6262extern "C" {
    63         void __cfactx_invoke_coroutine(void (*main)(void *), void * this);
     63      forall(dtype T | is_coroutine(T))
     64      void CtxInvokeCoroutine(T * this);
    6465
    65         forall(dtype T)
    66         void __cfactx_start(void (*main)(T &), struct $coroutine * cor, T & this, void (*invoke)(void (*main)(void *), void *));
     66      forall(dtype T | is_coroutine(T))
     67      void CtxStart(T * this, void ( *invoke)(T *));
    6768
    68         extern void __cfactx_coroutine_unwind(struct _Unwind_Exception * storage, struct $coroutine *) __attribute__ ((__noreturn__));
     69        extern void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage, struct coroutine_desc *) __attribute__ ((__noreturn__));
    6970
    70         extern void __cfactx_switch( struct __stack_context_t * from, struct __stack_context_t * to ) asm ("__cfactx_switch");
     71        extern void CtxSwitch( struct __stack_context_t * from, struct __stack_context_t * to ) asm ("CtxSwitch");
    7172}
    7273
    7374// Private wrappers for context switch and stack creation
    7475// Wrapper for co
    75 static inline void $ctx_switch( $coroutine * src, $coroutine * dst ) __attribute__((nonnull (1, 2))) {
     76static inline void CoroutineCtxSwitch(coroutine_desc* src, coroutine_desc* dst) {
    7677        // set state of current coroutine to inactive
    7778        src->state = src->state == Halted ? Halted : Inactive;
     
    8283        // context switch to specified coroutine
    8384        verify( dst->context.SP );
    84         __cfactx_switch( &src->context, &dst->context );
    85         // when __cfactx_switch returns we are back in the src coroutine
     85        CtxSwitch( &src->context, &dst->context );
     86        // when CtxSwitch returns we are back in the src coroutine
    8687
    8788        // set state of new coroutine to active
    8889        src->state = Active;
    8990
    90         if( unlikely(src->cancellation != 0p) ) {
    91                 __cfactx_coroutine_unwind(src->cancellation, src);
     91        if( unlikely(src->cancellation != NULL) ) {
     92                _CtxCoroutine_Unwind(src->cancellation, src);
    9293        }
    9394}
     
    102103        // will also migrate which means this value will
    103104        // stay in syn with the TLS
    104         $coroutine * src = TL_GET( this_thread )->curr_cor;
     105        coroutine_desc * src = TL_GET( this_thread )->curr_cor;
    105106
    106107        assertf( src->last != 0,
     
    113114                src->name, src, src->last->name, src->last );
    114115
    115         $ctx_switch( src, src->last );
     116        CoroutineCtxSwitch( src, src->last );
    116117}
    117118
     
    124125        // will also migrate which means this value will
    125126        // stay in syn with the TLS
    126         $coroutine * src = TL_GET( this_thread )->curr_cor;
    127         $coroutine * dst = get_coroutine(cor);
     127        coroutine_desc * src = TL_GET( this_thread )->curr_cor;
     128        coroutine_desc * dst = get_coroutine(cor);
    128129
    129         if( unlikely(dst->context.SP == 0p) ) {
    130                 TL_GET( this_thread )->curr_cor = dst;
     130        if( unlikely(dst->context.SP == NULL) ) {
    131131                __stack_prepare(&dst->stack, 65000);
    132                 __cfactx_start(main, dst, cor, __cfactx_invoke_coroutine);
    133                 TL_GET( this_thread )->curr_cor = src;
     132                CtxStart(&cor, CtxInvokeCoroutine);
    134133        }
    135134
     
    147146
    148147        // always done for performance testing
    149         $ctx_switch( src, dst );
     148        CoroutineCtxSwitch( src, dst );
    150149
    151150        return cor;
    152151}
    153152
    154 static inline void resume( $coroutine * dst ) __attribute__((nonnull (1))) {
     153static inline void resume(coroutine_desc * dst) {
    155154        // optimization : read TLS once and reuse it
    156155        // Safety note: this is preemption safe since if
     
    158157        // will also migrate which means this value will
    159158        // stay in syn with the TLS
    160         $coroutine * src = TL_GET( this_thread )->curr_cor;
     159        coroutine_desc * src = TL_GET( this_thread )->curr_cor;
    161160
    162161        // not resuming self ?
     
    172171
    173172        // always done for performance testing
    174         $ctx_switch( src, dst );
     173        CoroutineCtxSwitch( src, dst );
    175174}
    176175
  • libcfa/src/concurrency/invoke.c

    r3d5701e r9fb8f01  
    2929// Called from the kernel when starting a coroutine or task so must switch back to user mode.
    3030
    31 extern struct $coroutine * __cfactx_cor_finish(void);
    32 extern void __cfactx_cor_leave ( struct $coroutine * );
    33 extern void __cfactx_thrd_leave();
    34 
     31extern void __suspend_internal(void);
     32extern void __leave_coroutine( struct coroutine_desc * );
     33extern void __finish_creation( struct thread_desc * );
     34extern void __leave_thread_monitor( struct thread_desc * this );
    3535extern void disable_interrupts() OPTIONAL_THREAD;
    3636extern void enable_interrupts( __cfaabi_dbg_ctx_param );
    3737
    38 void __cfactx_invoke_coroutine(
     38void CtxInvokeCoroutine(
    3939        void (*main)(void *),
     40        struct coroutine_desc *(*get_coroutine)(void *),
    4041        void *this
    4142) {
    42         // Finish setting up the coroutine by setting its state
    43         struct $coroutine * cor = __cfactx_cor_finish();
     43        struct coroutine_desc* cor = get_coroutine( this );
    4444
    45         // Call the main of the coroutine
     45        if(cor->state == Primed) {
     46                __suspend_internal();
     47        }
     48
     49        cor->state = Active;
     50
    4651        main( this );
    4752
    4853        //Final suspend, should never return
    49         __cfactx_cor_leave( cor );
     54        __leave_coroutine( cor );
    5055        __cabi_abort( "Resumed dead coroutine" );
    5156}
    5257
    53 static _Unwind_Reason_Code __cfactx_coroutine_unwindstop(
     58static _Unwind_Reason_Code _CtxCoroutine_UnwindStop(
    5459        __attribute((__unused__)) int version,
    5560        _Unwind_Action actions,
     
    6267                // We finished unwinding the coroutine,
    6368                // leave it
    64                 __cfactx_cor_leave( param );
     69                __leave_coroutine( param );
    6570                __cabi_abort( "Resumed dead coroutine" );
    6671        }
     
    7075}
    7176
    72 void __cfactx_coroutine_unwind(struct _Unwind_Exception * storage, struct $coroutine * cor) __attribute__ ((__noreturn__));
    73 void __cfactx_coroutine_unwind(struct _Unwind_Exception * storage, struct $coroutine * cor) {
    74         _Unwind_Reason_Code ret = _Unwind_ForcedUnwind( storage, __cfactx_coroutine_unwindstop, cor );
     77void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage, struct coroutine_desc * cor) __attribute__ ((__noreturn__));
     78void _CtxCoroutine_Unwind(struct _Unwind_Exception * storage, struct coroutine_desc * cor) {
     79        _Unwind_Reason_Code ret = _Unwind_ForcedUnwind( storage, _CtxCoroutine_UnwindStop, cor );
    7580        printf("UNWIND ERROR %d after force unwind\n", ret);
    7681        abort();
    7782}
    7883
    79 void __cfactx_invoke_thread(
     84void CtxInvokeThread(
     85        void (*dtor)(void *),
    8086        void (*main)(void *),
     87        struct thread_desc *(*get_thread)(void *),
    8188        void *this
    8289) {
     90        // Fetch the thread handle from the user defined thread structure
     91        struct thread_desc* thrd = get_thread( this );
     92
     93        // First suspend, once the thread arrives here,
     94        // the function pointer to main can be invalidated without risk
     95        __finish_creation( thrd );
     96
    8397        // Officially start the thread by enabling preemption
    8498        enable_interrupts( __cfaabi_dbg_ctx );
     
    94108        // The order of these 4 operations is very important
    95109        //Final suspend, should never return
    96         __cfactx_thrd_leave();
     110        __leave_thread_monitor( thrd );
    97111        __cabi_abort( "Resumed dead thread" );
    98112}
    99113
    100 void __cfactx_start(
     114
     115void CtxStart(
    101116        void (*main)(void *),
    102         struct $coroutine * cor,
     117        struct coroutine_desc *(*get_coroutine)(void *),
    103118        void *this,
    104119        void (*invoke)(void *)
    105120) {
     121        struct coroutine_desc * cor = get_coroutine( this );
    106122        struct __stack_t * stack = cor->stack.storage;
    107123
     
    122138
    123139        fs->dummyReturn = NULL;
    124         fs->argument[0] = main;     // argument to invoke
    125         fs->argument[1] = this;     // argument to invoke
     140        fs->argument[0] = this;     // argument to invoke
    126141        fs->rturn = invoke;
    127142
     
    140155
    141156        fs->dummyReturn = NULL;
    142         fs->rturn = __cfactx_invoke_stub;
    143         fs->fixedRegisters[0] = main;
    144         fs->fixedRegisters[1] = this;
    145         fs->fixedRegisters[2] = invoke;
     157        fs->rturn = CtxInvokeStub;
     158        fs->fixedRegisters[0] = this;
     159        fs->fixedRegisters[1] = invoke;
    146160
    147161#elif defined( __ARM_ARCH )
    148 #error ARM needs to be upgrade to use to parameters like X86/X64 (A.K.A. : I broke this and do not know how to fix it)
     162
    149163        struct FakeStack {
    150164                float fpRegs[16];                       // floating point registers
     
    158172        struct FakeStack *fs = (struct FakeStack *)cor->context.SP;
    159173
    160         fs->intRegs[8] = __cfactx_invoke_stub;
     174        fs->intRegs[8] = CtxInvokeStub;
    161175        fs->arg[0] = this;
    162176        fs->arg[1] = invoke;
  • libcfa/src/concurrency/invoke.h

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Jan 17 12:27:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Dec  5 16:26:03 2019
    13 // Update Count     : 44
     12// Last Modified On : Sat Jun 22 18:19:13 2019
     13// Update Count     : 40
    1414//
    1515
     
    4646        #ifdef __cforall
    4747        extern "Cforall" {
    48                 extern __attribute__((aligned(128))) thread_local struct KernelThreadData {
    49                         struct $thread    * volatile this_thread;
     48                extern thread_local struct KernelThreadData {
     49                        struct thread_desc    * volatile this_thread;
    5050                        struct processor      * volatile this_processor;
    5151
     
    5555                                volatile bool in_progress;
    5656                        } preemption_state;
    57 
    58                         uint32_t rand_seed;
    5957                } kernelTLS __attribute__ ((tls_model ( "initial-exec" )));
    6058        }
     
    9290        };
    9391
    94         enum coroutine_state { Halted, Start, Primed, Inactive, Active, Rerun };
    95         enum __Preemption_Reason { __NO_PREEMPTION, __ALARM_PREEMPTION, __POLL_PREEMPTION, __MANUAL_PREEMPTION };
    96 
    97         struct $coroutine {
    98                 // context that is switch during a __cfactx_switch
     92        enum coroutine_state { Halted, Start, Inactive, Active, Primed };
     93
     94        struct coroutine_desc {
     95                // context that is switch during a CtxSwitch
    9996                struct __stack_context_t context;
    10097
     
    109106
    110107                // first coroutine to resume this one
    111                 struct $coroutine * starter;
     108                struct coroutine_desc * starter;
    112109
    113110                // last coroutine to resume this one
    114                 struct $coroutine * last;
     111                struct coroutine_desc * last;
    115112
    116113                // If non-null stack must be unwound with this exception
     
    128125        };
    129126
    130         struct $monitor {
     127        struct monitor_desc {
    131128                // spinlock to protect internal data
    132129                struct __spinlock_t lock;
    133130
    134131                // current owner of the monitor
    135                 struct $thread * owner;
     132                struct thread_desc * owner;
    136133
    137134                // queue of threads that are blocked waiting for the monitor
    138                 __queue_t(struct $thread) entry_queue;
     135                __queue_t(struct thread_desc) entry_queue;
    139136
    140137                // stack of conditions to run next once we exit the monitor
     
    153150        struct __monitor_group_t {
    154151                // currently held monitors
    155                 __cfa_anonymous_object( __small_array_t($monitor*) );
     152                __cfa_anonymous_object( __small_array_t(monitor_desc*) );
    156153
    157154                // last function that acquired monitors
     
    159156        };
    160157
    161         struct $thread {
     158        struct thread_desc {
    162159                // Core threading fields
    163                 // context that is switch during a __cfactx_switch
     160                // context that is switch during a CtxSwitch
    164161                struct __stack_context_t context;
    165162
    166163                // current execution status for coroutine
    167                 volatile int state;
    168                 enum __Preemption_Reason preempted;
     164                enum coroutine_state state;
    169165
    170166                //SKULLDUGGERY errno is not save in the thread data structure because returnToKernel appears to be the only function to require saving and restoring it
    171167
    172168                // coroutine body used to store context
    173                 struct $coroutine  self_cor;
     169                struct coroutine_desc  self_cor;
    174170
    175171                // current active context
    176                 struct $coroutine * curr_cor;
     172                struct coroutine_desc * curr_cor;
    177173
    178174                // monitor body used for mutual exclusion
    179                 struct $monitor    self_mon;
     175                struct monitor_desc    self_mon;
    180176
    181177                // pointer to monitor with sufficient lifetime for current monitors
    182                 struct $monitor *  self_mon_p;
     178                struct monitor_desc *  self_mon_p;
    183179
    184180                // pointer to the cluster on which the thread is running
     
    190186                // Link lists fields
    191187                // instrusive link field for threads
    192                 struct $thread * next;
     188                struct thread_desc * next;
    193189
    194190                struct {
    195                         struct $thread * next;
    196                         struct $thread * prev;
     191                        struct thread_desc * next;
     192                        struct thread_desc * prev;
    197193                } node;
    198194        };
     
    200196        #ifdef __cforall
    201197        extern "Cforall" {
    202                 static inline $thread *& get_next( $thread & this ) __attribute__((const)) {
     198                static inline thread_desc *& get_next( thread_desc & this ) {
    203199                        return this.next;
    204200                }
    205201
    206                 static inline [$thread *&, $thread *& ] __get( $thread & this ) __attribute__((const)) {
     202                static inline [thread_desc *&, thread_desc *& ] __get( thread_desc & this ) {
    207203                        return this.node.[next, prev];
    208204                }
    209205
    210206                static inline void ?{}(__monitor_group_t & this) {
    211                         (this.data){0p};
     207                        (this.data){NULL};
    212208                        (this.size){0};
    213209                        (this.func){NULL};
    214210                }
    215211
    216                 static inline void ?{}(__monitor_group_t & this, struct $monitor ** data, __lock_size_t size, fptr_t func) {
     212                static inline void ?{}(__monitor_group_t & this, struct monitor_desc ** data, __lock_size_t size, fptr_t func) {
    217213                        (this.data){data};
    218214                        (this.size){size};
     
    220216                }
    221217
    222                 static inline bool ?==?( const __monitor_group_t & lhs, const __monitor_group_t & rhs ) __attribute__((const)) {
     218                static inline bool ?==?( const __monitor_group_t & lhs, const __monitor_group_t & rhs ) {
    223219                        if( (lhs.data != 0) != (rhs.data != 0) ) return false;
    224220                        if( lhs.size != rhs.size ) return false;
     
    254250
    255251        // assembler routines that performs the context switch
    256         extern void __cfactx_invoke_stub( void );
    257         extern void __cfactx_switch( struct __stack_context_t * from, struct __stack_context_t * to ) asm ("__cfactx_switch");
     252        extern void CtxInvokeStub( void );
     253        extern void CtxSwitch( struct __stack_context_t * from, struct __stack_context_t * to ) asm ("CtxSwitch");
    258254        // void CtxStore ( void * this ) asm ("CtxStore");
    259255        // void CtxRet   ( void * dst  ) asm ("CtxRet");
  • libcfa/src/concurrency/kernel.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Jan 17 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 13:03:15 2020
    13 // Update Count     : 58
     12// Last Modified On : Thu Jun 20 17:21:23 2019
     13// Update Count     : 25
    1414//
    1515
     
    2626#include <signal.h>
    2727#include <unistd.h>
    28 #include <limits.h>                                                                             // PTHREAD_STACK_MIN
    29 #include <sys/mman.h>                                                                   // mprotect
    3028}
    3129
     
    4240//-----------------------------------------------------------------------------
    4341// Some assembly required
    44 #if defined( __i386 )
     42#if   defined( __i386 )
    4543        #define CtxGet( ctx )        \
    4644                __asm__ volatile (     \
     
    110108//-----------------------------------------------------------------------------
    111109//Start and stop routine for the kernel, declared first to make sure they run first
    112 static void __kernel_startup (void) __attribute__(( constructor( STARTUP_PRIORITY_KERNEL ) ));
    113 static void __kernel_shutdown(void) __attribute__(( destructor ( STARTUP_PRIORITY_KERNEL ) ));
     110static void kernel_startup(void) __attribute__(( constructor( STARTUP_PRIORITY_KERNEL ) ));
     111static void kernel_shutdown(void) __attribute__(( destructor ( STARTUP_PRIORITY_KERNEL ) ));
    114112
    115113//-----------------------------------------------------------------------------
     
    117115KERNEL_STORAGE(cluster,         mainCluster);
    118116KERNEL_STORAGE(processor,       mainProcessor);
    119 KERNEL_STORAGE($thread, mainThread);
     117KERNEL_STORAGE(thread_desc,     mainThread);
    120118KERNEL_STORAGE(__stack_t,       mainThreadCtx);
    121119
    122120cluster     * mainCluster;
    123121processor   * mainProcessor;
    124 $thread * mainThread;
     122thread_desc * mainThread;
    125123
    126124extern "C" {
    127         struct { __dllist_t(cluster) list; __spinlock_t lock; } __cfa_dbg_global_clusters;
     125struct { __dllist_t(cluster) list; __spinlock_t lock; } __cfa_dbg_global_clusters;
    128126}
    129127
     
    133131// Global state
    134132thread_local struct KernelThreadData kernelTLS __attribute__ ((tls_model ( "initial-exec" ))) = {
    135         NULL,                                                                                           // cannot use 0p
    136133        NULL,
    137         { 1, false, false },
    138         6u //this should be seeded better but due to a bug calling rdtsc doesn't work
     134        NULL,
     135        { 1, false, false }
    139136};
    140137
     
    142139// Struct to steal stack
    143140struct current_stack_info_t {
    144         __stack_t * storage;                                                            // pointer to stack object
    145         void * base;                                                                            // base of stack
    146         void * limit;                                                                           // stack grows towards stack limit
    147         void * context;                                                                         // address of cfa_context_t
     141        __stack_t * storage;            // pointer to stack object
     142        void *base;                             // base of stack
     143        void *limit;                    // stack grows towards stack limit
     144        void *context;                  // address of cfa_context_t
    148145};
    149146
     
    164161// Main thread construction
    165162
    166 void ?{}( $coroutine & this, current_stack_info_t * info) with( this ) {
     163void ?{}( coroutine_desc & this, current_stack_info_t * info) with( this ) {
    167164        stack.storage = info->storage;
    168165        with(*stack.storage) {
     
    174171        name = "Main Thread";
    175172        state = Start;
    176         starter = 0p;
    177         last = 0p;
    178         cancellation = 0p;
    179 }
    180 
    181 void ?{}( $thread & this, current_stack_info_t * info) with( this ) {
     173        starter = NULL;
     174        last = NULL;
     175        cancellation = NULL;
     176}
     177
     178void ?{}( thread_desc & this, current_stack_info_t * info) with( this ) {
    182179        state = Start;
    183180        self_cor{ info };
     
    187184        self_mon.recursion = 1;
    188185        self_mon_p = &self_mon;
    189         next = 0p;
    190 
    191         node.next = 0p;
    192         node.prev = 0p;
     186        next = NULL;
     187
     188        node.next = NULL;
     189        node.prev = NULL;
    193190        doregister(curr_cluster, this);
    194191
     
    208205}
    209206
    210 static void * __invoke_processor(void * arg);
    211 
    212 void ?{}(processor & this, const char name[], cluster & cltr) with( this ) {
     207static void start(processor * this);
     208void ?{}(processor & this, const char * name, cluster & cltr) with( this ) {
    213209        this.name = name;
    214210        this.cltr = &cltr;
    215211        terminated{ 0 };
    216         destroyer = 0p;
    217212        do_terminate = false;
    218         preemption_alarm = 0p;
     213        preemption_alarm = NULL;
    219214        pending_preemption = false;
    220215        runner.proc = &this;
     
    222217        idleLock{};
    223218
    224         __cfaabi_dbg_print_safe("Kernel : Starting core %p\n", &this);
    225 
    226         this.stack = __create_pthread( &this.kernel_thread, __invoke_processor, (void *)&this );
    227 
    228         __cfaabi_dbg_print_safe("Kernel : core %p started\n", &this);
     219        start( &this );
    229220}
    230221
     
    240231        }
    241232
    242         pthread_join( kernel_thread, 0p );
    243         free( this.stack );
    244 }
    245 
    246 void ?{}(cluster & this, const char name[], Duration preemption_rate) with( this ) {
     233        pthread_join( kernel_thread, NULL );
     234}
     235
     236void ?{}(cluster & this, const char * name, Duration preemption_rate) with( this ) {
    247237        this.name = name;
    248238        this.preemption_rate = preemption_rate;
     
    264254// Kernel Scheduling logic
    265255//=============================================================================================
    266 static $thread * __next_thread(cluster * this);
    267 static void __run_thread(processor * this, $thread * dst);
    268 static void __halt(processor * this);
     256static void runThread(processor * this, thread_desc * dst);
     257static void finishRunning(processor * this);
     258static void halt(processor * this);
    269259
    270260//Main of the processor contexts
    271261void main(processorCtx_t & runner) {
    272         // Because of a bug, we couldn't initialized the seed on construction
    273         // Do it here
    274         kernelTLS.rand_seed ^= rdtscl();
    275 
    276262        processor * this = runner.proc;
    277263        verify(this);
     
    287273                __cfaabi_dbg_print_safe("Kernel : core %p started\n", this);
    288274
    289                 $thread * readyThread = 0p;
    290                 for( unsigned int spin_count = 0; ! __atomic_load_n(&this->do_terminate, __ATOMIC_SEQ_CST); spin_count++ ) {
    291                         readyThread = __next_thread( this->cltr );
    292 
    293                         if(readyThread) {
    294                                 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    295                                 /* paranoid */ verifyf( readyThread->state == Inactive || readyThread->state == Start || readyThread->preempted != __NO_PREEMPTION, "state : %d, preempted %d\n", readyThread->state, readyThread->preempted);
    296                                 /* paranoid */ verifyf( readyThread->next == 0p, "Expected null got %p", readyThread->next );
    297 
    298                                 __run_thread(this, readyThread);
    299 
    300                                 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
     275                thread_desc * readyThread = NULL;
     276                for( unsigned int spin_count = 0; ! __atomic_load_n(&this->do_terminate, __ATOMIC_SEQ_CST); spin_count++ )
     277                {
     278                        readyThread = nextThread( this->cltr );
     279
     280                        if(readyThread)
     281                        {
     282                                verify( ! kernelTLS.preemption_state.enabled );
     283
     284                                runThread(this, readyThread);
     285
     286                                verify( ! kernelTLS.preemption_state.enabled );
     287
     288                                //Some actions need to be taken from the kernel
     289                                finishRunning(this);
    301290
    302291                                spin_count = 0;
    303                         } else {
     292                        }
     293                        else
     294                        {
    304295                                // spin(this, &spin_count);
    305                                 __halt(this);
     296                                halt(this);
    306297                        }
    307298                }
     
    323314// runThread runs a thread by context switching
    324315// from the processor coroutine to the target thread
    325 static void __run_thread(processor * this, $thread * thrd_dst) {
    326         $coroutine * proc_cor = get_coroutine(this->runner);
     316static void runThread(processor * this, thread_desc * thrd_dst) {
     317        coroutine_desc * proc_cor = get_coroutine(this->runner);
     318
     319        // Reset the terminating actions here
     320        this->finish.action_code = No_Action;
    327321
    328322        // Update global state
    329323        kernelTLS.this_thread = thrd_dst;
    330324
    331         // set state of processor coroutine to inactive
    332         verify(proc_cor->state == Active);
    333         proc_cor->state = Inactive;
    334 
    335         // Actually run the thread
    336         RUNNING:  while(true) {
    337                 if(unlikely(thrd_dst->preempted)) {
    338                         thrd_dst->preempted = __NO_PREEMPTION;
    339                         verify(thrd_dst->state == Active || thrd_dst->state == Rerun);
    340                 } else {
    341                         verify(thrd_dst->state == Start || thrd_dst->state == Primed || thrd_dst->state == Inactive);
    342                         thrd_dst->state = Active;
     325        // set state of processor coroutine to inactive and the thread to active
     326        proc_cor->state = proc_cor->state == Halted ? Halted : Inactive;
     327        thrd_dst->state = Active;
     328
     329        // set context switch to the thread that the processor is executing
     330        verify( thrd_dst->context.SP );
     331        CtxSwitch( &proc_cor->context, &thrd_dst->context );
     332        // when CtxSwitch returns we are back in the processor coroutine
     333
     334        // set state of processor coroutine to active and the thread to inactive
     335        thrd_dst->state = thrd_dst->state == Halted ? Halted : Inactive;
     336        proc_cor->state = Active;
     337}
     338
     339// KERNEL_ONLY
     340static void returnToKernel() {
     341        coroutine_desc * proc_cor = get_coroutine(kernelTLS.this_processor->runner);
     342        thread_desc * thrd_src = kernelTLS.this_thread;
     343
     344        // set state of current coroutine to inactive
     345        thrd_src->state = thrd_src->state == Halted ? Halted : Inactive;
     346        proc_cor->state = Active;
     347        int local_errno = *__volatile_errno();
     348        #if defined( __i386 ) || defined( __x86_64 )
     349                __x87_store;
     350        #endif
     351
     352        // set new coroutine that the processor is executing
     353        // and context switch to it
     354        verify( proc_cor->context.SP );
     355        CtxSwitch( &thrd_src->context, &proc_cor->context );
     356
     357        // set state of new coroutine to active
     358        proc_cor->state = proc_cor->state == Halted ? Halted : Inactive;
     359        thrd_src->state = Active;
     360
     361        #if defined( __i386 ) || defined( __x86_64 )
     362                __x87_load;
     363        #endif
     364        *__volatile_errno() = local_errno;
     365}
     366
     367// KERNEL_ONLY
     368// Once a thread has finished running, some of
     369// its final actions must be executed from the kernel
     370static void finishRunning(processor * this) with( this->finish ) {
     371        verify( ! kernelTLS.preemption_state.enabled );
     372        choose( action_code ) {
     373        case No_Action:
     374                break;
     375        case Release:
     376                unlock( *lock );
     377        case Schedule:
     378                ScheduleThread( thrd );
     379        case Release_Schedule:
     380                unlock( *lock );
     381                ScheduleThread( thrd );
     382        case Release_Multi:
     383                for(int i = 0; i < lock_count; i++) {
     384                        unlock( *locks[i] );
    343385                }
    344 
    345                 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    346 
    347                 // set context switch to the thread that the processor is executing
    348                 verify( thrd_dst->context.SP );
    349                 __cfactx_switch( &proc_cor->context, &thrd_dst->context );
    350                 // when __cfactx_switch returns we are back in the processor coroutine
    351 
    352                 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    353 
    354 
    355                 // We just finished running a thread, there are a few things that could have happened.
    356                 // 1 - Regular case : the thread has blocked and now one has scheduled it yet.
    357                 // 2 - Racy case    : the thread has blocked but someone has already tried to schedule it.
    358                 // 3 - Polite Racy case : the thread has blocked, someone has already tried to schedule it, but the thread is nice and wants to go through the ready-queue any way
    359                 // 4 - Preempted
    360                 // In case 1, we may have won a race so we can't write to the state again.
    361                 // In case 2, we lost the race so we now own the thread.
    362                 // In case 3, we lost the race but can just reschedule the thread.
    363 
    364                 if(unlikely(thrd_dst->preempted != __NO_PREEMPTION)) {
    365                         // The thread was preempted, reschedule it and reset the flag
    366                         __schedule_thread( thrd_dst );
    367                         break RUNNING;
     386        case Release_Multi_Schedule:
     387                for(int i = 0; i < lock_count; i++) {
     388                        unlock( *locks[i] );
    368389                }
    369 
    370                 // set state of processor coroutine to active and the thread to inactive
    371                 static_assert(sizeof(thrd_dst->state) == sizeof(int));
    372                 enum coroutine_state old_state = __atomic_exchange_n(&thrd_dst->state, Inactive, __ATOMIC_SEQ_CST);
    373                 switch(old_state) {
    374                         case Halted:
    375                                 // The thread has halted, it should never be scheduled/run again, leave it back to Halted and move on
    376                                 thrd_dst->state = Halted;
    377 
    378                                 // We may need to wake someone up here since
    379                                 unpark( this->destroyer );
    380                                 this->destroyer = 0p;
    381                                 break RUNNING;
    382                         case Active:
    383                                 // This is case 1, the regular case, nothing more is needed
    384                                 break RUNNING;
    385                         case Rerun:
    386                                 // This is case 2, the racy case, someone tried to run this thread before it finished blocking
    387                                 // In this case, just run it again.
    388                                 continue RUNNING;
    389                         default:
    390                                 // This makes no sense, something is wrong abort
    391                                 abort("Finished running a thread that was Inactive/Start/Primed %d\n", old_state);
     390                for(int i = 0; i < thrd_count; i++) {
     391                        ScheduleThread( thrds[i] );
    392392                }
    393         }
    394 
    395         // Just before returning to the processor, set the processor coroutine to active
    396         proc_cor->state = Active;
    397 }
    398 
    399 // KERNEL_ONLY
    400 void returnToKernel() {
    401         /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    402         $coroutine * proc_cor = get_coroutine(kernelTLS.this_processor->runner);
    403         $thread * thrd_src = kernelTLS.this_thread;
    404 
    405         // Run the thread on this processor
    406         {
    407                 int local_errno = *__volatile_errno();
    408                 #if defined( __i386 ) || defined( __x86_64 )
    409                         __x87_store;
    410                 #endif
    411                 verify( proc_cor->context.SP );
    412                 __cfactx_switch( &thrd_src->context, &proc_cor->context );
    413                 #if defined( __i386 ) || defined( __x86_64 )
    414                         __x87_load;
    415                 #endif
    416                 *__volatile_errno() = local_errno;
    417         }
    418 
    419         /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
     393        case Callback:
     394                callback();
     395        default:
     396                abort("KERNEL ERROR: Unexpected action to run after thread");
     397        }
    420398}
    421399
     
    424402// This is the entry point for processors (kernel threads)
    425403// It effectively constructs a coroutine by stealing the pthread stack
    426 static void * __invoke_processor(void * arg) {
     404static void * CtxInvokeProcessor(void * arg) {
    427405        processor * proc = (processor *) arg;
    428406        kernelTLS.this_processor = proc;
    429         kernelTLS.this_thread    = 0p;
     407        kernelTLS.this_thread    = NULL;
    430408        kernelTLS.preemption_state.[enabled, disable_count] = [false, 1];
    431409        // SKULLDUGGERY: We want to create a context for the processor coroutine
     
    440418
    441419        //Set global state
    442         kernelTLS.this_thread = 0p;
     420        kernelTLS.this_thread    = NULL;
    443421
    444422        //We now have a proper context from which to schedule threads
     
    456434        __cfaabi_dbg_print_safe("Kernel : core %p main ended (%p)\n", proc, &proc->runner);
    457435
    458         return 0p;
    459 }
    460 
    461 static void Abort( int ret, const char func[] ) {
    462         if ( ret ) {                                                                            // pthread routines return errno values
    463                 abort( "%s : internal error, error(%d) %s.", func, ret, strerror( ret ) );
    464         } // if
    465 } // Abort
    466 
    467 void * __create_pthread( pthread_t * pthread, void * (*start)(void *), void * arg ) {
    468         pthread_attr_t attr;
    469 
    470         Abort( pthread_attr_init( &attr ), "pthread_attr_init" ); // initialize attribute
    471 
    472         size_t stacksize;
    473         // default stack size, normally defined by shell limit
    474         Abort( pthread_attr_getstacksize( &attr, &stacksize ), "pthread_attr_getstacksize" );
    475         assert( stacksize >= PTHREAD_STACK_MIN );
    476 
    477         void * stack;
    478         __cfaabi_dbg_debug_do(
    479                 stack = memalign( __page_size, stacksize + __page_size );
    480                 // pthread has no mechanism to create the guard page in user supplied stack.
    481                 if ( mprotect( stack, __page_size, PROT_NONE ) == -1 ) {
    482                         abort( "mprotect : internal error, mprotect failure, error(%d) %s.", errno, strerror( errno ) );
    483                 } // if
    484         );
    485         __cfaabi_dbg_no_debug_do(
    486                 stack = malloc( stacksize );
    487         );
    488 
    489         Abort( pthread_attr_setstack( &attr, stack, stacksize ), "pthread_attr_setstack" );
    490 
    491         Abort( pthread_create( pthread, &attr, start, arg ), "pthread_create" );
    492         return stack;
     436        return NULL;
     437}
     438
     439static void start(processor * this) {
     440        __cfaabi_dbg_print_safe("Kernel : Starting core %p\n", this);
     441
     442        pthread_create( &this->kernel_thread, NULL, CtxInvokeProcessor, (void*)this );
     443
     444        __cfaabi_dbg_print_safe("Kernel : core %p started\n", this);
    493445}
    494446
    495447// KERNEL_ONLY
    496 static void __kernel_first_resume( processor * this ) {
    497         $thread * src = mainThread;
    498         $coroutine * dst = get_coroutine(this->runner);
    499 
    500         verify( ! kernelTLS.preemption_state.enabled );
    501 
    502         kernelTLS.this_thread->curr_cor = dst;
     448void kernel_first_resume( processor * this ) {
     449        thread_desc * src = mainThread;
     450        coroutine_desc * dst = get_coroutine(this->runner);
     451
     452        verify( ! kernelTLS.preemption_state.enabled );
     453
    503454        __stack_prepare( &dst->stack, 65000 );
    504         __cfactx_start(main, dst, this->runner, __cfactx_invoke_coroutine);
     455        CtxStart(&this->runner, CtxInvokeCoroutine);
    505456
    506457        verify( ! kernelTLS.preemption_state.enabled );
     
    514465        // context switch to specified coroutine
    515466        verify( dst->context.SP );
    516         __cfactx_switch( &src->context, &dst->context );
    517         // when __cfactx_switch returns we are back in the src coroutine
    518 
    519         mainThread->curr_cor = &mainThread->self_cor;
     467        CtxSwitch( &src->context, &dst->context );
     468        // when CtxSwitch returns we are back in the src coroutine
    520469
    521470        // set state of new coroutine to active
     
    526475
    527476// KERNEL_ONLY
    528 static void __kernel_last_resume( processor * this ) {
    529         $coroutine * src = &mainThread->self_cor;
    530         $coroutine * dst = get_coroutine(this->runner);
     477void kernel_last_resume( processor * this ) {
     478        coroutine_desc * src = &mainThread->self_cor;
     479        coroutine_desc * dst = get_coroutine(this->runner);
    531480
    532481        verify( ! kernelTLS.preemption_state.enabled );
     
    535484
    536485        // context switch to the processor
    537         __cfactx_switch( &src->context, &dst->context );
     486        CtxSwitch( &src->context, &dst->context );
    538487}
    539488
    540489//-----------------------------------------------------------------------------
    541490// Scheduler routines
     491
    542492// KERNEL ONLY
    543 void __schedule_thread( $thread * thrd ) with( *thrd->curr_cluster ) {
    544         /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    545         /* paranoid */ #if defined( __CFA_WITH_VERIFY__ )
    546         /* paranoid */ if( thrd->state == Inactive || thrd->state == Start ) assertf( thrd->preempted == __NO_PREEMPTION,
    547                           "Error inactive thread marked as preempted, state %d, preemption %d\n", thrd->state, thrd->preempted );
    548         /* paranoid */ if( thrd->preempted != __NO_PREEMPTION ) assertf(thrd->state == Active || thrd->state == Rerun,
    549                           "Error preempted thread marked as not currently running, state %d, preemption %d\n", thrd->state, thrd->preempted );
    550         /* paranoid */ #endif
    551         /* paranoid */ verifyf( thrd->next == 0p, "Expected null got %p", thrd->next );
    552 
    553         lock  ( ready_queue_lock __cfaabi_dbg_ctx2 );
    554         bool was_empty = !(ready_queue != 0);
    555         append( ready_queue, thrd );
     493void ScheduleThread( thread_desc * thrd ) {
     494        verify( thrd );
     495        verify( thrd->state != Halted );
     496
     497        verify( ! kernelTLS.preemption_state.enabled );
     498
     499        verifyf( thrd->next == NULL, "Expected null got %p", thrd->next );
     500
     501        with( *thrd->curr_cluster ) {
     502                lock  ( ready_queue_lock __cfaabi_dbg_ctx2 );
     503                bool was_empty = !(ready_queue != 0);
     504                append( ready_queue, thrd );
     505                unlock( ready_queue_lock );
     506
     507                if(was_empty) {
     508                        lock      (proc_list_lock __cfaabi_dbg_ctx2);
     509                        if(idles) {
     510                                wake_fast(idles.head);
     511                        }
     512                        unlock    (proc_list_lock);
     513                }
     514                else if( struct processor * idle = idles.head ) {
     515                        wake_fast(idle);
     516                }
     517
     518        }
     519
     520        verify( ! kernelTLS.preemption_state.enabled );
     521}
     522
     523// KERNEL ONLY
     524thread_desc * nextThread(cluster * this) with( *this ) {
     525        verify( ! kernelTLS.preemption_state.enabled );
     526        lock( ready_queue_lock __cfaabi_dbg_ctx2 );
     527        thread_desc * head = pop_head( ready_queue );
    556528        unlock( ready_queue_lock );
    557 
    558         if(was_empty) {
    559                 lock      (proc_list_lock __cfaabi_dbg_ctx2);
    560                 if(idles) {
    561                         wake_fast(idles.head);
    562                 }
    563                 unlock    (proc_list_lock);
    564         }
    565         else if( struct processor * idle = idles.head ) {
    566                 wake_fast(idle);
    567         }
    568 
    569         /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
     529        verify( ! kernelTLS.preemption_state.enabled );
     530        return head;
     531}
     532
     533void BlockInternal() {
     534        disable_interrupts();
     535        verify( ! kernelTLS.preemption_state.enabled );
     536        returnToKernel();
     537        verify( ! kernelTLS.preemption_state.enabled );
     538        enable_interrupts( __cfaabi_dbg_ctx );
     539}
     540
     541void BlockInternal( __spinlock_t * lock ) {
     542        disable_interrupts();
     543        with( *kernelTLS.this_processor ) {
     544                finish.action_code = Release;
     545                finish.lock        = lock;
     546        }
     547
     548        verify( ! kernelTLS.preemption_state.enabled );
     549        returnToKernel();
     550        verify( ! kernelTLS.preemption_state.enabled );
     551
     552        enable_interrupts( __cfaabi_dbg_ctx );
     553}
     554
     555void BlockInternal( thread_desc * thrd ) {
     556        disable_interrupts();
     557        with( * kernelTLS.this_processor ) {
     558                finish.action_code = Schedule;
     559                finish.thrd        = thrd;
     560        }
     561
     562        verify( ! kernelTLS.preemption_state.enabled );
     563        returnToKernel();
     564        verify( ! kernelTLS.preemption_state.enabled );
     565
     566        enable_interrupts( __cfaabi_dbg_ctx );
     567}
     568
     569void BlockInternal( __spinlock_t * lock, thread_desc * thrd ) {
     570        assert(thrd);
     571        disable_interrupts();
     572        with( * kernelTLS.this_processor ) {
     573                finish.action_code = Release_Schedule;
     574                finish.lock        = lock;
     575                finish.thrd        = thrd;
     576        }
     577
     578        verify( ! kernelTLS.preemption_state.enabled );
     579        returnToKernel();
     580        verify( ! kernelTLS.preemption_state.enabled );
     581
     582        enable_interrupts( __cfaabi_dbg_ctx );
     583}
     584
     585void BlockInternal(__spinlock_t * locks [], unsigned short count) {
     586        disable_interrupts();
     587        with( * kernelTLS.this_processor ) {
     588                finish.action_code = Release_Multi;
     589                finish.locks       = locks;
     590                finish.lock_count  = count;
     591        }
     592
     593        verify( ! kernelTLS.preemption_state.enabled );
     594        returnToKernel();
     595        verify( ! kernelTLS.preemption_state.enabled );
     596
     597        enable_interrupts( __cfaabi_dbg_ctx );
     598}
     599
     600void BlockInternal(__spinlock_t * locks [], unsigned short lock_count, thread_desc * thrds [], unsigned short thrd_count) {
     601        disable_interrupts();
     602        with( *kernelTLS.this_processor ) {
     603                finish.action_code = Release_Multi_Schedule;
     604                finish.locks       = locks;
     605                finish.lock_count  = lock_count;
     606                finish.thrds       = thrds;
     607                finish.thrd_count  = thrd_count;
     608        }
     609
     610        verify( ! kernelTLS.preemption_state.enabled );
     611        returnToKernel();
     612        verify( ! kernelTLS.preemption_state.enabled );
     613
     614        enable_interrupts( __cfaabi_dbg_ctx );
     615}
     616
     617void BlockInternal(__finish_callback_fptr_t callback) {
     618        disable_interrupts();
     619        with( *kernelTLS.this_processor ) {
     620                finish.action_code = Callback;
     621                finish.callback    = callback;
     622        }
     623
     624        verify( ! kernelTLS.preemption_state.enabled );
     625        returnToKernel();
     626        verify( ! kernelTLS.preemption_state.enabled );
     627
     628        enable_interrupts( __cfaabi_dbg_ctx );
    570629}
    571630
    572631// KERNEL ONLY
    573 static $thread * __next_thread(cluster * this) with( *this ) {
    574         /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    575 
    576         lock( ready_queue_lock __cfaabi_dbg_ctx2 );
    577         $thread * head = pop_head( ready_queue );
    578         unlock( ready_queue_lock );
    579 
    580         /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    581         return head;
    582 }
    583 
    584 void unpark( $thread * thrd ) {
    585         if( !thrd ) return;
    586 
    587         disable_interrupts();
    588         static_assert(sizeof(thrd->state) == sizeof(int));
    589         enum coroutine_state old_state = __atomic_exchange_n(&thrd->state, Rerun, __ATOMIC_SEQ_CST);
    590         switch(old_state) {
    591                 case Active:
    592                         // Wake won the race, the thread will reschedule/rerun itself
    593                         break;
    594                 case Inactive:
    595                         /* paranoid */ verify( ! thrd->preempted != __NO_PREEMPTION );
    596 
    597                         // Wake lost the race,
    598                         thrd->state = Inactive;
    599                         __schedule_thread( thrd );
    600                         break;
    601                 case Rerun:
    602                         abort("More than one thread attempted to schedule thread %p\n", thrd);
    603                         break;
    604                 case Halted:
    605                 case Start:
    606                 case Primed:
    607                 default:
    608                         // This makes no sense, something is wrong abort
    609                         abort();
    610         }
    611         enable_interrupts( __cfaabi_dbg_ctx );
    612 }
    613 
    614 void park( void ) {
    615         /* paranoid */ verify( kernelTLS.preemption_state.enabled );
    616         disable_interrupts();
    617         /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    618         /* paranoid */ verify( kernelTLS.this_thread->preempted == __NO_PREEMPTION );
     632void LeaveThread(__spinlock_t * lock, thread_desc * thrd) {
     633        verify( ! kernelTLS.preemption_state.enabled );
     634        with( * kernelTLS.this_processor ) {
     635                finish.action_code = thrd ? Release_Schedule : Release;
     636                finish.lock        = lock;
     637                finish.thrd        = thrd;
     638        }
    619639
    620640        returnToKernel();
    621 
    622         /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    623         enable_interrupts( __cfaabi_dbg_ctx );
    624         /* paranoid */ verify( kernelTLS.preemption_state.enabled );
    625 
    626 }
    627 
    628 // KERNEL ONLY
    629 void __leave_thread() {
    630         /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    631         returnToKernel();
    632         abort();
    633 }
    634 
    635 // KERNEL ONLY
    636 bool force_yield( __Preemption_Reason reason ) {
    637         /* paranoid */ verify( kernelTLS.preemption_state.enabled );
    638         disable_interrupts();
    639         /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    640 
    641         $thread * thrd = kernelTLS.this_thread;
    642         /* paranoid */ verify(thrd->state == Active || thrd->state == Rerun);
    643 
    644         // SKULLDUGGERY: It is possible that we are preempting this thread just before
    645         // it was going to park itself. If that is the case and it is already using the
    646         // intrusive fields then we can't use them to preempt the thread
    647         // If that is the case, abandon the preemption.
    648         bool preempted = false;
    649         if(thrd->next == 0p) {
    650                 preempted = true;
    651                 thrd->preempted = reason;
    652                 returnToKernel();
    653         }
    654 
    655         /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    656         enable_interrupts_noPoll();
    657         /* paranoid */ verify( kernelTLS.preemption_state.enabled );
    658 
    659         return preempted;
    660641}
    661642
     
    665646//-----------------------------------------------------------------------------
    666647// Kernel boot procedures
    667 static void __kernel_startup(void) {
     648static void kernel_startup(void) {
    668649        verify( ! kernelTLS.preemption_state.enabled );
    669650        __cfaabi_dbg_print_safe("Kernel : Starting\n");
     
    683664        // SKULLDUGGERY: the mainThread steals the process main thread
    684665        // which will then be scheduled by the mainProcessor normally
    685         mainThread = ($thread *)&storage_mainThread;
     666        mainThread = (thread_desc *)&storage_mainThread;
    686667        current_stack_info_t info;
    687668        info.storage = (__stack_t*)&storage_mainThreadCtx;
     
    695676        void ?{}(processorCtx_t & this, processor * proc) {
    696677                (this.__cor){ "Processor" };
    697                 this.__cor.starter = 0p;
     678                this.__cor.starter = NULL;
    698679                this.proc = proc;
    699680        }
     
    704685                terminated{ 0 };
    705686                do_terminate = false;
    706                 preemption_alarm = 0p;
     687                preemption_alarm = NULL;
    707688                pending_preemption = false;
    708689                kernel_thread = pthread_self();
     
    726707        // Add the main thread to the ready queue
    727708        // once resume is called on mainProcessor->runner the mainThread needs to be scheduled like any normal thread
    728         __schedule_thread(mainThread);
     709        ScheduleThread(mainThread);
    729710
    730711        // SKULLDUGGERY: Force a context switch to the main processor to set the main thread's context to the current UNIX
    731         // context. Hence, the main thread does not begin through __cfactx_invoke_thread, like all other threads. The trick here is that
     712        // context. Hence, the main thread does not begin through CtxInvokeThread, like all other threads. The trick here is that
    732713        // mainThread is on the ready queue when this call is made.
    733         __kernel_first_resume( kernelTLS.this_processor );
     714        kernel_first_resume( kernelTLS.this_processor );
    734715
    735716
     
    743724}
    744725
    745 static void __kernel_shutdown(void) {
     726static void kernel_shutdown(void) {
    746727        __cfaabi_dbg_print_safe("\n--------------------------------------------------\nKernel : Shutting down\n");
    747728
     
    754735        // which is currently here
    755736        __atomic_store_n(&mainProcessor->do_terminate, true, __ATOMIC_RELEASE);
    756         __kernel_last_resume( kernelTLS.this_processor );
     737        kernel_last_resume( kernelTLS.this_processor );
    757738        mainThread->self_cor.state = Halted;
    758739
     
    780761// Kernel Quiescing
    781762//=============================================================================================
    782 static void __halt(processor * this) with( *this ) {
     763static void halt(processor * this) with( *this ) {
    783764        // verify( ! __atomic_load_n(&do_terminate, __ATOMIC_SEQ_CST) );
    784765
     
    822803                sigemptyset( &mask );
    823804                sigaddset( &mask, SIGALRM );            // block SIGALRM signals
    824                 sigaddset( &mask, SIGUSR1 );            // block SIGALRM signals
    825                 sigsuspend( &mask );                            // block the processor to prevent further damage during abort
    826                 _exit( EXIT_FAILURE );                          // if processor unblocks before it is killed, terminate it
     805                sigsuspend( &mask );                    // block the processor to prevent further damage during abort
     806                _exit( EXIT_FAILURE );                  // if processor unblocks before it is killed, terminate it
    827807        }
    828808        else {
     
    835815
    836816void kernel_abort_msg( void * kernel_data, char * abort_text, int abort_text_size ) {
    837         $thread * thrd = kernel_data;
     817        thread_desc * thrd = kernel_data;
    838818
    839819        if(thrd) {
    840820                int len = snprintf( abort_text, abort_text_size, "Error occurred while executing thread %.256s (%p)", thrd->self_cor.name, thrd );
    841                 __cfaabi_bits_write( STDERR_FILENO, abort_text, len );
     821                __cfaabi_dbg_bits_write( abort_text, len );
    842822
    843823                if ( &thrd->self_cor != thrd->curr_cor ) {
    844824                        len = snprintf( abort_text, abort_text_size, " in coroutine %.256s (%p).\n", thrd->curr_cor->name, thrd->curr_cor );
    845                         __cfaabi_bits_write( STDERR_FILENO, abort_text, len );
     825                        __cfaabi_dbg_bits_write( abort_text, len );
    846826                }
    847827                else {
    848                         __cfaabi_bits_write( STDERR_FILENO, ".\n", 2 );
     828                        __cfaabi_dbg_bits_write( ".\n", 2 );
    849829                }
    850830        }
    851831        else {
    852832                int len = snprintf( abort_text, abort_text_size, "Error occurred outside of any thread.\n" );
    853                 __cfaabi_bits_write( STDERR_FILENO, abort_text, len );
     833                __cfaabi_dbg_bits_write( abort_text, len );
    854834        }
    855835}
     
    862842
    863843extern "C" {
    864         void __cfaabi_bits_acquire() {
     844        void __cfaabi_dbg_bits_acquire() {
    865845                lock( kernel_debug_lock __cfaabi_dbg_ctx2 );
    866846        }
    867847
    868         void __cfaabi_bits_release() {
     848        void __cfaabi_dbg_bits_release() {
    869849                unlock( kernel_debug_lock );
    870850        }
     
    891871
    892872                // atomically release spin lock and block
    893                 unlock( lock );
    894                 park();
     873                BlockInternal( &lock );
    895874        }
    896875        else {
     
    900879
    901880void V(semaphore & this) with( this ) {
    902         $thread * thrd = 0p;
     881        thread_desc * thrd = NULL;
    903882        lock( lock __cfaabi_dbg_ctx2 );
    904883        count += 1;
     
    911890
    912891        // make new owner
    913         unpark( thrd );
     892        WakeThread( thrd );
    914893}
    915894
     
    928907}
    929908
    930 void doregister( cluster * cltr, $thread & thrd ) {
     909void doregister( cluster * cltr, thread_desc & thrd ) {
    931910        lock      (cltr->thread_list_lock __cfaabi_dbg_ctx2);
    932911        cltr->nthreads += 1;
     
    935914}
    936915
    937 void unregister( cluster * cltr, $thread & thrd ) {
     916void unregister( cluster * cltr, thread_desc & thrd ) {
    938917        lock  (cltr->thread_list_lock __cfaabi_dbg_ctx2);
    939918        remove(cltr->threads, thrd );
     
    960939__cfaabi_dbg_debug_do(
    961940        extern "C" {
    962                 void __cfaabi_dbg_record(__spinlock_t & this, const char prev_name[]) {
     941                void __cfaabi_dbg_record(__spinlock_t & this, const char * prev_name) {
    963942                        this.prev_name = prev_name;
    964943                        this.prev_thrd = kernelTLS.this_thread;
     
    969948//-----------------------------------------------------------------------------
    970949// Debug
    971 bool threading_enabled(void) __attribute__((const)) {
     950bool threading_enabled(void) {
    972951        return true;
    973952}
  • libcfa/src/concurrency/kernel.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Jan 17 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 12:29:26 2020
    13 // Update Count     : 22
     12// Last Modified On : Sat Jun 22 11:39:17 2019
     13// Update Count     : 16
    1414//
    1515
     
    2020#include "invoke.h"
    2121#include "time_t.hfa"
    22 #include "coroutine.hfa"
    2322
    2423extern "C" {
     
    3231        __spinlock_t lock;
    3332        int count;
    34         __queue_t($thread) waiting;
     33        __queue_t(thread_desc) waiting;
    3534};
    3635
     
    4443// Processor
    4544extern struct cluster * mainCluster;
     45
     46enum FinishOpCode { No_Action, Release, Schedule, Release_Schedule, Release_Multi, Release_Multi_Schedule, Callback };
     47
     48typedef void (*__finish_callback_fptr_t)(void);
     49
     50//TODO use union, many of these fields are mutually exclusive (i.e. MULTI vs NOMULTI)
     51struct FinishAction {
     52        FinishOpCode action_code;
     53        /*
     54        // Union of possible actions
     55        union {
     56                // Option 1 : locks and threads
     57                struct {
     58                        // 1 thread or N thread
     59                        union {
     60                                thread_desc * thrd;
     61                                struct {
     62                                        thread_desc ** thrds;
     63                                        unsigned short thrd_count;
     64                                };
     65                        };
     66                        // 1 lock or N lock
     67                        union {
     68                                __spinlock_t * lock;
     69                                struct {
     70                                        __spinlock_t ** locks;
     71                                        unsigned short lock_count;
     72                                };
     73                        };
     74                };
     75                // Option 2 : action pointer
     76                __finish_callback_fptr_t callback;
     77        };
     78        /*/
     79        thread_desc * thrd;
     80        thread_desc ** thrds;
     81        unsigned short thrd_count;
     82        __spinlock_t * lock;
     83        __spinlock_t ** locks;
     84        unsigned short lock_count;
     85        __finish_callback_fptr_t callback;
     86        //*/
     87};
     88static inline void ?{}(FinishAction & this) {
     89        this.action_code = No_Action;
     90        this.thrd = NULL;
     91        this.lock = NULL;
     92}
     93static inline void ^?{}(FinishAction &) {}
    4694
    4795// Processor
     
    67115        // RunThread data
    68116        // Action to do after a thread is ran
    69         $thread * destroyer;
     117        struct FinishAction finish;
    70118
    71119        // Preemption data
     
    85133        // Termination synchronisation
    86134        semaphore terminated;
    87 
    88         // pthread Stack
    89         void * stack;
    90135
    91136        // Link lists fields
     
    101146};
    102147
    103 void  ?{}(processor & this, const char name[], struct cluster & cltr);
     148void  ?{}(processor & this, const char * name, struct cluster & cltr);
    104149void ^?{}(processor & this);
    105150
    106151static inline void  ?{}(processor & this)                    { this{ "Anonymous Processor", *mainCluster}; }
    107152static inline void  ?{}(processor & this, struct cluster & cltr)    { this{ "Anonymous Processor", cltr}; }
    108 static inline void  ?{}(processor & this, const char name[]) { this{name, *mainCluster }; }
    109 
    110 static inline [processor *&, processor *& ] __get( processor & this ) __attribute__((const)) { return this.node.[next, prev]; }
     153static inline void  ?{}(processor & this, const char * name) { this{name, *mainCluster }; }
     154
     155static inline [processor *&, processor *& ] __get( processor & this ) {
     156        return this.node.[next, prev];
     157}
    111158
    112159//-----------------------------------------------------------------------------
     
    117164
    118165        // Ready queue for threads
    119         __queue_t($thread) ready_queue;
     166        __queue_t(thread_desc) ready_queue;
    120167
    121168        // Name of the cluster
     
    133180        // List of threads
    134181        __spinlock_t thread_list_lock;
    135         __dllist_t(struct $thread) threads;
     182        __dllist_t(struct thread_desc) threads;
    136183        unsigned int nthreads;
    137184
     
    144191extern Duration default_preemption();
    145192
    146 void ?{} (cluster & this, const char name[], Duration preemption_rate);
     193void ?{} (cluster & this, const char * name, Duration preemption_rate);
    147194void ^?{}(cluster & this);
    148195
    149196static inline void ?{} (cluster & this)                           { this{"Anonymous Cluster", default_preemption()}; }
    150197static inline void ?{} (cluster & this, Duration preemption_rate) { this{"Anonymous Cluster", preemption_rate}; }
    151 static inline void ?{} (cluster & this, const char name[])        { this{name, default_preemption()}; }
    152 
    153 static inline [cluster *&, cluster *& ] __get( cluster & this ) __attribute__((const)) { return this.node.[next, prev]; }
     198static inline void ?{} (cluster & this, const char * name)        { this{name, default_preemption()}; }
     199
     200static inline [cluster *&, cluster *& ] __get( cluster & this ) {
     201        return this.node.[next, prev];
     202}
    154203
    155204static inline struct processor * active_processor() { return TL_GET( this_processor ); } // UNSAFE
  • libcfa/src/concurrency/kernel_private.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Mon Feb 13 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Nov 30 19:25:02 2019
    13 // Update Count     : 8
     12// Last Modified On : Thu Mar 29 14:06:40 2018
     13// Update Count     : 3
    1414//
    1515
     
    3131}
    3232
    33 void __schedule_thread( $thread * ) __attribute__((nonnull (1)));
     33void ScheduleThread( thread_desc * );
     34static inline void WakeThread( thread_desc * thrd ) {
     35        if( !thrd ) return;
     36
     37        disable_interrupts();
     38        ScheduleThread( thrd );
     39        enable_interrupts( __cfaabi_dbg_ctx );
     40}
     41thread_desc * nextThread(cluster * this);
    3442
    3543//Block current thread and release/wake-up the following resources
    36 void __leave_thread() __attribute__((noreturn));
     44void BlockInternal(void);
     45void BlockInternal(__spinlock_t * lock);
     46void BlockInternal(thread_desc * thrd);
     47void BlockInternal(__spinlock_t * lock, thread_desc * thrd);
     48void BlockInternal(__spinlock_t * locks [], unsigned short count);
     49void BlockInternal(__spinlock_t * locks [], unsigned short count, thread_desc * thrds [], unsigned short thrd_count);
     50void BlockInternal(__finish_callback_fptr_t callback);
     51void LeaveThread(__spinlock_t * lock, thread_desc * thrd);
    3752
    3853//-----------------------------------------------------------------------------
    3954// Processor
    4055void main(processorCtx_t *);
    41 
    42 void * __create_pthread( pthread_t *, void * (*)(void *), void * );
    4356
    4457static inline void wake_fast(processor * this) {
     
    7184// Threads
    7285extern "C" {
    73       void __cfactx_invoke_thread(void (*main)(void *), void * this);
     86      forall(dtype T | is_thread(T))
     87      void CtxInvokeThread(T * this);
    7488}
    7589
     90extern void ThreadCtxSwitch(coroutine_desc * src, coroutine_desc * dst);
     91
    7692__cfaabi_dbg_debug_do(
    77         extern void __cfaabi_dbg_thread_register  ( $thread * thrd );
    78         extern void __cfaabi_dbg_thread_unregister( $thread * thrd );
     93        extern void __cfaabi_dbg_thread_register  ( thread_desc * thrd );
     94        extern void __cfaabi_dbg_thread_unregister( thread_desc * thrd );
    7995)
    8096
     
    8399#define KERNEL_STORAGE(T,X) static char storage_##X[sizeof(T)]
    84100
    85 static inline uint32_t __tls_rand() {
    86         kernelTLS.rand_seed ^= kernelTLS.rand_seed << 6;
    87         kernelTLS.rand_seed ^= kernelTLS.rand_seed >> 21;
    88         kernelTLS.rand_seed ^= kernelTLS.rand_seed << 7;
    89         return kernelTLS.rand_seed;
    90 }
    91 
    92101
    93102void doregister( struct cluster & cltr );
    94103void unregister( struct cluster & cltr );
    95104
    96 void doregister( struct cluster * cltr, struct $thread & thrd );
    97 void unregister( struct cluster * cltr, struct $thread & thrd );
     105void doregister( struct cluster * cltr, struct thread_desc & thrd );
     106void unregister( struct cluster * cltr, struct thread_desc & thrd );
    98107
    99108void doregister( struct cluster * cltr, struct processor * proc );
  • libcfa/src/concurrency/monitor.cfa

    r3d5701e r9fb8f01  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // $monitor.c --
     7// monitor_desc.c --
    88//
    99// Author           : Thierry Delisle
    1010// Created On       : Thd Feb 23 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec  4 07:55:14 2019
    13 // Update Count     : 10
     12// Last Modified On : Fri Mar 30 14:30:26 2018
     13// Update Count     : 9
    1414//
    1515
     
    2727//-----------------------------------------------------------------------------
    2828// Forward declarations
    29 static inline void __set_owner ( $monitor * this, $thread * owner );
    30 static inline void __set_owner ( $monitor * storage [], __lock_size_t count, $thread * owner );
    31 static inline void set_mask  ( $monitor * storage [], __lock_size_t count, const __waitfor_mask_t & mask );
    32 static inline void reset_mask( $monitor * this );
    33 
    34 static inline $thread * next_thread( $monitor * this );
    35 static inline bool is_accepted( $monitor * this, const __monitor_group_t & monitors );
     29static inline void set_owner ( monitor_desc * this, thread_desc * owner );
     30static inline void set_owner ( monitor_desc * storage [], __lock_size_t count, thread_desc * owner );
     31static inline void set_mask  ( monitor_desc * storage [], __lock_size_t count, const __waitfor_mask_t & mask );
     32static inline void reset_mask( monitor_desc * this );
     33
     34static inline thread_desc * next_thread( monitor_desc * this );
     35static inline bool is_accepted( monitor_desc * this, const __monitor_group_t & monitors );
    3636
    3737static inline void lock_all  ( __spinlock_t * locks [], __lock_size_t count );
    38 static inline void lock_all  ( $monitor * source [], __spinlock_t * /*out*/ locks [], __lock_size_t count );
     38static inline void lock_all  ( monitor_desc * source [], __spinlock_t * /*out*/ locks [], __lock_size_t count );
    3939static inline void unlock_all( __spinlock_t * locks [], __lock_size_t count );
    40 static inline void unlock_all( $monitor * locks [], __lock_size_t count );
    41 
    42 static inline void save   ( $monitor * ctx [], __lock_size_t count, __spinlock_t * locks [], unsigned int /*out*/ recursions [], __waitfor_mask_t /*out*/ masks [] );
    43 static inline void restore( $monitor * ctx [], __lock_size_t count, __spinlock_t * locks [], unsigned int /*in */ recursions [], __waitfor_mask_t /*in */ masks [] );
    44 
    45 static inline void init     ( __lock_size_t count, $monitor * monitors [], __condition_node_t & waiter, __condition_criterion_t criteria [] );
    46 static inline void init_push( __lock_size_t count, $monitor * monitors [], __condition_node_t & waiter, __condition_criterion_t criteria [] );
    47 
    48 static inline $thread *        check_condition   ( __condition_criterion_t * );
     40static inline void unlock_all( monitor_desc * locks [], __lock_size_t count );
     41
     42static inline void save   ( monitor_desc * ctx [], __lock_size_t count, __spinlock_t * locks [], unsigned int /*out*/ recursions [], __waitfor_mask_t /*out*/ masks [] );
     43static inline void restore( monitor_desc * ctx [], __lock_size_t count, __spinlock_t * locks [], unsigned int /*in */ recursions [], __waitfor_mask_t /*in */ masks [] );
     44
     45static inline void init     ( __lock_size_t count, monitor_desc * monitors [], __condition_node_t & waiter, __condition_criterion_t criteria [] );
     46static inline void init_push( __lock_size_t count, monitor_desc * monitors [], __condition_node_t & waiter, __condition_criterion_t criteria [] );
     47
     48static inline thread_desc *        check_condition   ( __condition_criterion_t * );
    4949static inline void                 brand_condition   ( condition & );
    50 static inline [$thread *, int] search_entry_queue( const __waitfor_mask_t &, $monitor * monitors [], __lock_size_t count );
     50static inline [thread_desc *, int] search_entry_queue( const __waitfor_mask_t &, monitor_desc * monitors [], __lock_size_t count );
    5151
    5252forall(dtype T | sized( T ))
    5353static inline __lock_size_t insert_unique( T * array [], __lock_size_t & size, T * val );
    5454static inline __lock_size_t count_max    ( const __waitfor_mask_t & mask );
    55 static inline __lock_size_t aggregate    ( $monitor * storage [], const __waitfor_mask_t & mask );
     55static inline __lock_size_t aggregate    ( monitor_desc * storage [], const __waitfor_mask_t & mask );
    5656
    5757//-----------------------------------------------------------------------------
     
    6868
    6969#define monitor_ctx( mons, cnt )                                /* Define that create the necessary struct for internal/external scheduling operations */ \
    70         $monitor ** monitors = mons;                          /* Save the targeted monitors                                                          */ \
     70        monitor_desc ** monitors = mons;                          /* Save the targeted monitors                                                          */ \
    7171        __lock_size_t count = cnt;                                /* Save the count to a local variable                                                  */ \
    7272        unsigned int recursions[ count ];                         /* Save the current recursion levels to restore them later                             */ \
     
    8080//-----------------------------------------------------------------------------
    8181// Enter/Leave routines
    82 // Enter single monitor
    83 static void __enter( $monitor * this, const __monitor_group_t & group ) {
    84         // Lock the monitor spinlock
    85         lock( this->lock __cfaabi_dbg_ctx2 );
    86         // Interrupts disable inside critical section
    87         $thread * thrd = kernelTLS.this_thread;
    88 
    89         __cfaabi_dbg_print_safe( "Kernel : %10p Entering mon %p (%p)\n", thrd, this, this->owner);
    90 
    91         if( !this->owner ) {
    92                 // No one has the monitor, just take it
    93                 __set_owner( this, thrd );
    94 
    95                 __cfaabi_dbg_print_safe( "Kernel :  mon is free \n" );
    96         }
    97         else if( this->owner == thrd) {
    98                 // We already have the monitor, just note how many times we took it
    99                 this->recursion += 1;
    100 
    101                 __cfaabi_dbg_print_safe( "Kernel :  mon already owned \n" );
    102         }
    103         else if( is_accepted( this, group) ) {
    104                 // Some one was waiting for us, enter
    105                 __set_owner( this, thrd );
    106 
    107                 // Reset mask
    108                 reset_mask( this );
    109 
    110                 __cfaabi_dbg_print_safe( "Kernel :  mon accepts \n" );
    111         }
    112         else {
    113                 __cfaabi_dbg_print_safe( "Kernel :  blocking \n" );
    114 
    115                 // Some one else has the monitor, wait in line for it
    116                 /* paranoid */ verify( thrd->next == 0p );
    117                 append( this->entry_queue, thrd );
    118                 /* paranoid */ verify( thrd->next == 1p );
    119 
    120                 unlock( this->lock );
    121                 park();
     82
     83
     84extern "C" {
     85        // Enter single monitor
     86        static void __enter_monitor_desc( monitor_desc * this, const __monitor_group_t & group ) {
     87                // Lock the monitor spinlock
     88                lock( this->lock __cfaabi_dbg_ctx2 );
     89                // Interrupts disable inside critical section
     90                thread_desc * thrd = kernelTLS.this_thread;
     91
     92                __cfaabi_dbg_print_safe( "Kernel : %10p Entering mon %p (%p)\n", thrd, this, this->owner);
     93
     94                if( !this->owner ) {
     95                        // No one has the monitor, just take it
     96                        set_owner( this, thrd );
     97
     98                        __cfaabi_dbg_print_safe( "Kernel :  mon is free \n" );
     99                }
     100                else if( this->owner == thrd) {
     101                        // We already have the monitor, just note how many times we took it
     102                        this->recursion += 1;
     103
     104                        __cfaabi_dbg_print_safe( "Kernel :  mon already owned \n" );
     105                }
     106                else if( is_accepted( this, group) ) {
     107                        // Some one was waiting for us, enter
     108                        set_owner( this, thrd );
     109
     110                        // Reset mask
     111                        reset_mask( this );
     112
     113                        __cfaabi_dbg_print_safe( "Kernel :  mon accepts \n" );
     114                }
     115                else {
     116                        __cfaabi_dbg_print_safe( "Kernel :  blocking \n" );
     117
     118                        // Some one else has the monitor, wait in line for it
     119                        append( this->entry_queue, thrd );
     120
     121                        BlockInternal( &this->lock );
     122
     123                        __cfaabi_dbg_print_safe( "Kernel : %10p Entered  mon %p\n", thrd, this);
     124
     125                        // BlockInternal will unlock spinlock, no need to unlock ourselves
     126                        return;
     127                }
    122128
    123129                __cfaabi_dbg_print_safe( "Kernel : %10p Entered  mon %p\n", thrd, this);
    124130
    125                 /* paranoid */ verifyf( kernelTLS.this_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, this->owner, this->recursion, this );
    126                 return;
    127         }
    128 
    129         __cfaabi_dbg_print_safe( "Kernel : %10p Entered  mon %p\n", thrd, this);
    130 
    131         /* paranoid */ verifyf( kernelTLS.this_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, this->owner, this->recursion, this );
    132         /* paranoid */ verify( this->lock.lock );
    133 
    134         // Release the lock and leave
    135         unlock( this->lock );
    136         return;
    137 }
    138 
    139 static void __dtor_enter( $monitor * this, fptr_t func ) {
    140         // Lock the monitor spinlock
    141         lock( this->lock __cfaabi_dbg_ctx2 );
    142         // Interrupts disable inside critical section
    143         $thread * thrd = kernelTLS.this_thread;
    144 
    145         __cfaabi_dbg_print_safe( "Kernel : %10p Entering dtor for mon %p (%p)\n", thrd, this, this->owner);
    146 
    147 
    148         if( !this->owner ) {
    149                 __cfaabi_dbg_print_safe( "Kernel : Destroying free mon %p\n", this);
    150 
    151                 // No one has the monitor, just take it
    152                 __set_owner( this, thrd );
    153 
    154                 verifyf( kernelTLS.this_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, this->owner, this->recursion, this );
    155 
     131                // Release the lock and leave
    156132                unlock( this->lock );
    157133                return;
    158134        }
    159         else if( this->owner == thrd) {
    160                 // We already have the monitor... but where about to destroy it so the nesting will fail
    161                 // Abort!
    162                 abort( "Attempt to destroy monitor %p by thread \"%.256s\" (%p) in nested mutex.", this, thrd->self_cor.name, thrd );
    163         }
    164 
    165         __lock_size_t count = 1;
    166         $monitor ** monitors = &this;
    167         __monitor_group_t group = { &this, 1, func };
    168         if( is_accepted( this, group) ) {
    169                 __cfaabi_dbg_print_safe( "Kernel :  mon accepts dtor, block and signal it \n" );
    170 
    171                 // Wake the thread that is waiting for this
    172                 __condition_criterion_t * urgent = pop( this->signal_stack );
    173                 /* paranoid */ verify( urgent );
    174 
    175                 // Reset mask
    176                 reset_mask( this );
    177 
    178                 // Create the node specific to this wait operation
    179                 wait_ctx_primed( thrd, 0 )
    180 
    181                 // Some one else has the monitor, wait for him to finish and then run
     135
     136        static void __enter_monitor_dtor( monitor_desc * this, fptr_t func ) {
     137                // Lock the monitor spinlock
     138                lock( this->lock __cfaabi_dbg_ctx2 );
     139                // Interrupts disable inside critical section
     140                thread_desc * thrd = kernelTLS.this_thread;
     141
     142                __cfaabi_dbg_print_safe( "Kernel : %10p Entering dtor for mon %p (%p)\n", thrd, this, this->owner);
     143
     144
     145                if( !this->owner ) {
     146                        __cfaabi_dbg_print_safe( "Kernel : Destroying free mon %p\n", this);
     147
     148                        // No one has the monitor, just take it
     149                        set_owner( this, thrd );
     150
     151                        unlock( this->lock );
     152                        return;
     153                }
     154                else if( this->owner == thrd) {
     155                        // We already have the monitor... but where about to destroy it so the nesting will fail
     156                        // Abort!
     157                        abort( "Attempt to destroy monitor %p by thread \"%.256s\" (%p) in nested mutex.", this, thrd->self_cor.name, thrd );
     158                }
     159
     160                __lock_size_t count = 1;
     161                monitor_desc ** monitors = &this;
     162                __monitor_group_t group = { &this, 1, func };
     163                if( is_accepted( this, group) ) {
     164                        __cfaabi_dbg_print_safe( "Kernel :  mon accepts dtor, block and signal it \n" );
     165
     166                        // Wake the thread that is waiting for this
     167                        __condition_criterion_t * urgent = pop( this->signal_stack );
     168                        verify( urgent );
     169
     170                        // Reset mask
     171                        reset_mask( this );
     172
     173                        // Create the node specific to this wait operation
     174                        wait_ctx_primed( thrd, 0 )
     175
     176                        // Some one else has the monitor, wait for him to finish and then run
     177                        BlockInternal( &this->lock, urgent->owner->waiting_thread );
     178
     179                        // Some one was waiting for us, enter
     180                        set_owner( this, thrd );
     181                }
     182                else {
     183                        __cfaabi_dbg_print_safe( "Kernel :  blocking \n" );
     184
     185                        wait_ctx( thrd, 0 )
     186                        this->dtor_node = &waiter;
     187
     188                        // Some one else has the monitor, wait in line for it
     189                        append( this->entry_queue, thrd );
     190                        BlockInternal( &this->lock );
     191
     192                        // BlockInternal will unlock spinlock, no need to unlock ourselves
     193                        return;
     194                }
     195
     196                __cfaabi_dbg_print_safe( "Kernel : Destroying %p\n", this);
     197
     198        }
     199
     200        // Leave single monitor
     201        void __leave_monitor_desc( monitor_desc * this ) {
     202                // Lock the monitor spinlock
     203                lock( this->lock __cfaabi_dbg_ctx2 );
     204
     205                __cfaabi_dbg_print_safe( "Kernel : %10p Leaving mon %p (%p)\n", kernelTLS.this_thread, this, this->owner);
     206
     207                verifyf( kernelTLS.this_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, this->owner, this->recursion, this );
     208
     209                // Leaving a recursion level, decrement the counter
     210                this->recursion -= 1;
     211
     212                // If we haven't left the last level of recursion
     213                // it means we don't need to do anything
     214                if( this->recursion != 0) {
     215                        __cfaabi_dbg_print_safe( "Kernel :  recursion still %d\n", this->recursion);
     216                        unlock( this->lock );
     217                        return;
     218                }
     219
     220                // Get the next thread, will be null on low contention monitor
     221                thread_desc * new_owner = next_thread( this );
     222
     223                // We can now let other threads in safely
    182224                unlock( this->lock );
    183225
    184                 // Release the next thread
    185                 /* paranoid */ verifyf( urgent->owner->waiting_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, this->owner, this->recursion, this );
    186                 unpark( urgent->owner->waiting_thread );
    187 
    188                 // Park current thread waiting
    189                 park();
    190 
    191                 // Some one was waiting for us, enter
    192                 /* paranoid */ verifyf( kernelTLS.this_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, this->owner, this->recursion, this );
    193         }
    194         else {
    195                 __cfaabi_dbg_print_safe( "Kernel :  blocking \n" );
    196 
    197                 wait_ctx( thrd, 0 )
    198                 this->dtor_node = &waiter;
    199 
    200                 // Some one else has the monitor, wait in line for it
    201                 /* paranoid */ verify( thrd->next == 0p );
    202                 append( this->entry_queue, thrd );
    203                 /* paranoid */ verify( thrd->next == 1p );
    204                 unlock( this->lock );
    205 
    206                 // Park current thread waiting
    207                 park();
    208 
    209                 /* paranoid */ verifyf( kernelTLS.this_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, this->owner, this->recursion, this );
    210                 return;
    211         }
    212 
    213         __cfaabi_dbg_print_safe( "Kernel : Destroying %p\n", this);
    214 
    215 }
    216 
    217 // Leave single monitor
    218 void __leave( $monitor * this ) {
    219         // Lock the monitor spinlock
    220         lock( this->lock __cfaabi_dbg_ctx2 );
    221 
    222         __cfaabi_dbg_print_safe( "Kernel : %10p Leaving mon %p (%p)\n", kernelTLS.this_thread, this, this->owner);
    223 
    224         /* paranoid */ verifyf( kernelTLS.this_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, this->owner, this->recursion, this );
    225 
    226         // Leaving a recursion level, decrement the counter
    227         this->recursion -= 1;
    228 
    229         // If we haven't left the last level of recursion
    230         // it means we don't need to do anything
    231         if( this->recursion != 0) {
    232                 __cfaabi_dbg_print_safe( "Kernel :  recursion still %d\n", this->recursion);
    233                 unlock( this->lock );
    234                 return;
    235         }
    236 
    237         // Get the next thread, will be null on low contention monitor
    238         $thread * new_owner = next_thread( this );
    239 
    240         // Check the new owner is consistent with who we wake-up
    241         // new_owner might be null even if someone owns the monitor when the owner is still waiting for another monitor
    242         /* paranoid */ verifyf( !new_owner || new_owner == this->owner, "Expected owner to be %p, got %p (m: %p)", new_owner, this->owner, this );
    243 
    244         // We can now let other threads in safely
    245         unlock( this->lock );
    246 
    247         //We need to wake-up the thread
    248         /* paranoid */ verifyf( !new_owner || new_owner == this->owner, "Expected owner to be %p, got %p (m: %p)", new_owner, this->owner, this );
    249         unpark( new_owner );
    250 }
    251 
    252 // Leave single monitor for the last time
    253 void __dtor_leave( $monitor * this ) {
    254         __cfaabi_dbg_debug_do(
    255                 if( TL_GET( this_thread ) != this->owner ) {
    256                         abort( "Destroyed monitor %p has inconsistent owner, expected %p got %p.\n", this, TL_GET( this_thread ), this->owner);
    257                 }
    258                 if( this->recursion != 1 ) {
    259                         abort( "Destroyed monitor %p has %d outstanding nested calls.\n", this, this->recursion - 1);
    260                 }
    261         )
    262 }
    263 
    264 extern "C" {
     226                //We need to wake-up the thread
     227                WakeThread( new_owner );
     228        }
     229
     230        // Leave single monitor for the last time
     231        void __leave_dtor_monitor_desc( monitor_desc * this ) {
     232                __cfaabi_dbg_debug_do(
     233                        if( TL_GET( this_thread ) != this->owner ) {
     234                                abort( "Destroyed monitor %p has inconsistent owner, expected %p got %p.\n", this, TL_GET( this_thread ), this->owner);
     235                        }
     236                        if( this->recursion != 1 ) {
     237                                abort( "Destroyed monitor %p has %d outstanding nested calls.\n", this, this->recursion - 1);
     238                        }
     239                )
     240        }
     241
    265242        // Leave the thread monitor
    266243        // last routine called by a thread.
    267244        // Should never return
    268         void __cfactx_thrd_leave() {
    269                 $thread * thrd = TL_GET( this_thread );
    270                 $monitor * this = &thrd->self_mon;
     245        void __leave_thread_monitor( thread_desc * thrd ) {
     246                monitor_desc * this = &thrd->self_mon;
    271247
    272248                // Lock the monitor now
     
    275251                disable_interrupts();
    276252
    277                 thrd->state = Halted;
    278 
    279                 /* paranoid */ verifyf( thrd == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", thrd, this->owner, this->recursion, this );
     253                thrd->self_cor.state = Halted;
     254
     255                verifyf( thrd == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", thrd, this->owner, this->recursion, this );
    280256
    281257                // Leaving a recursion level, decrement the counter
     
    287263
    288264                // Fetch the next thread, can be null
    289                 $thread * new_owner = next_thread( this );
    290 
    291                 // Release the monitor lock
    292                 unlock( this->lock );
    293 
    294                 // Unpark the next owner if needed
    295                 /* paranoid */ verifyf( !new_owner || new_owner == this->owner, "Expected owner to be %p, got %p (m: %p)", new_owner, this->owner, this );
    296                 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
    297                 /* paranoid */ verify( ! kernelTLS.this_processor->destroyer );
    298                 /* paranoid */ verify( thrd->state == Halted );
    299 
    300                 kernelTLS.this_processor->destroyer = new_owner;
    301 
    302                 // Leave the thread
    303                 __leave_thread();
     265                thread_desc * new_owner = next_thread( this );
     266
     267                // Leave the thread, this will unlock the spinlock
     268                // Use leave thread instead of BlockInternal which is
     269                // specialized for this case and supports null new_owner
     270                LeaveThread( &this->lock, new_owner );
    304271
    305272                // Control flow should never reach here!
     
    311278static inline void enter( __monitor_group_t monitors ) {
    312279        for( __lock_size_t i = 0; i < monitors.size; i++) {
    313                 __enter( monitors[i], monitors );
     280                __enter_monitor_desc( monitors[i], monitors );
    314281        }
    315282}
     
    317284// Leave multiple monitor
    318285// relies on the monitor array being sorted
    319 static inline void leave($monitor * monitors [], __lock_size_t count) {
     286static inline void leave(monitor_desc * monitors [], __lock_size_t count) {
    320287        for( __lock_size_t i = count - 1; i >= 0; i--) {
    321                 __leave( monitors[i] );
     288                __leave_monitor_desc( monitors[i] );
    322289        }
    323290}
     
    325292// Ctor for monitor guard
    326293// Sorts monitors before entering
    327 void ?{}( monitor_guard_t & this, $monitor * m [], __lock_size_t count, fptr_t func ) {
    328         $thread * thrd = TL_GET( this_thread );
     294void ?{}( monitor_guard_t & this, monitor_desc * m [], __lock_size_t count, fptr_t func ) {
     295        thread_desc * thrd = TL_GET( this_thread );
    329296
    330297        // Store current array
     
    366333// Ctor for monitor guard
    367334// Sorts monitors before entering
    368 void ?{}( monitor_dtor_guard_t & this, $monitor * m [], fptr_t func ) {
     335void ?{}( monitor_dtor_guard_t & this, monitor_desc * m [], fptr_t func ) {
    369336        // optimization
    370         $thread * thrd = TL_GET( this_thread );
     337        thread_desc * thrd = TL_GET( this_thread );
    371338
    372339        // Store current array
     
    379346        (thrd->monitors){m, 1, func};
    380347
    381         __dtor_enter( this.m, func );
     348        __enter_monitor_dtor( this.m, func );
    382349}
    383350
     
    385352void ^?{}( monitor_dtor_guard_t & this ) {
    386353        // Leave the monitors in order
    387         __dtor_leave( this.m );
     354        __leave_dtor_monitor_desc( this.m );
    388355
    389356        // Restore thread context
     
    393360//-----------------------------------------------------------------------------
    394361// Internal scheduling types
    395 void ?{}(__condition_node_t & this, $thread * waiting_thread, __lock_size_t count, uintptr_t user_info ) {
     362void ?{}(__condition_node_t & this, thread_desc * waiting_thread, __lock_size_t count, uintptr_t user_info ) {
    396363        this.waiting_thread = waiting_thread;
    397364        this.count = count;
    398         this.next = 0p;
     365        this.next = NULL;
    399366        this.user_info = user_info;
    400367}
     
    402369void ?{}(__condition_criterion_t & this ) with( this ) {
    403370        ready  = false;
    404         target = 0p;
    405         owner  = 0p;
    406         next   = 0p;
    407 }
    408 
    409 void ?{}(__condition_criterion_t & this, $monitor * target, __condition_node_t & owner ) {
     371        target = NULL;
     372        owner  = NULL;
     373        next   = NULL;
     374}
     375
     376void ?{}(__condition_criterion_t & this, monitor_desc * target, __condition_node_t & owner ) {
    410377        this.ready  = false;
    411378        this.target = target;
    412379        this.owner  = &owner;
    413         this.next   = 0p;
     380        this.next   = NULL;
    414381}
    415382
     
    420387
    421388        // Check that everything is as expected
    422         assertf( this.monitors != 0p, "Waiting with no monitors (%p)", this.monitors );
     389        assertf( this.monitors != NULL, "Waiting with no monitors (%p)", this.monitors );
    423390        verifyf( this.monitor_count != 0, "Waiting with 0 monitors (%"PRIiFAST16")", this.monitor_count );
    424391        verifyf( this.monitor_count < 32u, "Excessive monitor count (%"PRIiFAST16")", this.monitor_count );
     
    432399        // Append the current wait operation to the ones already queued on the condition
    433400        // We don't need locks for that since conditions must always be waited on inside monitor mutual exclusion
    434         /* paranoid */ verify( waiter.next == 0p );
    435401        append( this.blocked, &waiter );
    436         /* paranoid */ verify( waiter.next == 1p );
    437402
    438403        // Lock all monitors (aggregates the locks as well)
     
    441406        // Find the next thread(s) to run
    442407        __lock_size_t thread_count = 0;
    443         $thread * threads[ count ];
     408        thread_desc * threads[ count ];
    444409        __builtin_memset( threads, 0, sizeof( threads ) );
    445410
     
    449414        // Remove any duplicate threads
    450415        for( __lock_size_t i = 0; i < count; i++) {
    451                 $thread * new_owner = next_thread( monitors[i] );
     416                thread_desc * new_owner = next_thread( monitors[i] );
    452417                insert_unique( threads, thread_count, new_owner );
    453418        }
    454419
    455         // Unlock the locks, we don't need them anymore
    456         for(int i = 0; i < count; i++) {
    457                 unlock( *locks[i] );
    458         }
    459 
    460         // Wake the threads
    461         for(int i = 0; i < thread_count; i++) {
    462                 unpark( threads[i] );
    463         }
    464 
    465420        // Everything is ready to go to sleep
    466         park();
     421        BlockInternal( locks, count, threads, thread_count );
    467422
    468423        // We are back, restore the owners and recursions
     
    479434        //Some more checking in debug
    480435        __cfaabi_dbg_debug_do(
    481                 $thread * this_thrd = TL_GET( this_thread );
     436                thread_desc * this_thrd = TL_GET( this_thread );
    482437                if ( this.monitor_count != this_thrd->monitors.size ) {
    483438                        abort( "Signal on condition %p made with different number of monitor(s), expected %zi got %zi", &this, this.monitor_count, this_thrd->monitors.size );
     
    494449
    495450        // Lock all monitors
    496         lock_all( this.monitors, 0p, count );
     451        lock_all( this.monitors, NULL, count );
    497452
    498453        //Pop the head of the waiting queue
     
    516471
    517472        //Check that everything is as expected
    518         verifyf( this.monitors != 0p, "Waiting with no monitors (%p)", this.monitors );
     473        verifyf( this.monitors != NULL, "Waiting with no monitors (%p)", this.monitors );
    519474        verifyf( this.monitor_count != 0, "Waiting with 0 monitors (%"PRIiFAST16")", this.monitor_count );
    520475
     
    533488
    534489        //Find the thread to run
    535         $thread * signallee = pop_head( this.blocked )->waiting_thread;
    536         /* paranoid */ verify( signallee->next == 0p );
    537         __set_owner( monitors, count, signallee );
     490        thread_desc * signallee = pop_head( this.blocked )->waiting_thread;
     491        set_owner( monitors, count, signallee );
    538492
    539493        __cfaabi_dbg_print_buffer_decl( "Kernel : signal_block condition %p (s: %p)\n", &this, signallee );
    540494
    541         // unlock all the monitors
    542         unlock_all( locks, count );
    543 
    544         // unpark the thread we signalled
    545         unpark( signallee );
    546 
    547495        //Everything is ready to go to sleep
    548         park();
     496        BlockInternal( locks, count, &signallee, 1 );
    549497
    550498
     
    587535        // Create one!
    588536        __lock_size_t max = count_max( mask );
    589         $monitor * mon_storage[max];
     537        monitor_desc * mon_storage[max];
    590538        __builtin_memset( mon_storage, 0, sizeof( mon_storage ) );
    591539        __lock_size_t actual_count = aggregate( mon_storage, mask );
     
    605553        {
    606554                // Check if the entry queue
    607                 $thread * next; int index;
     555                thread_desc * next; int index;
    608556                [next, index] = search_entry_queue( mask, monitors, count );
    609557
     
    615563                                verifyf( accepted.size == 1,  "ERROR: Accepted dtor has more than 1 mutex parameter." );
    616564
    617                                 $monitor * mon2dtor = accepted[0];
     565                                monitor_desc * mon2dtor = accepted[0];
    618566                                verifyf( mon2dtor->dtor_node, "ERROR: Accepted monitor has no dtor_node." );
    619567
     
    641589
    642590                                // Set the owners to be the next thread
    643                                 __set_owner( monitors, count, next );
    644 
    645                                 // unlock all the monitors
    646                                 unlock_all( locks, count );
    647 
    648                                 // unpark the thread we signalled
    649                                 unpark( next );
    650 
    651                                 //Everything is ready to go to sleep
    652                                 park();
     591                                set_owner( monitors, count, next );
     592
     593                                // Everything is ready to go to sleep
     594                                BlockInternal( locks, count, &next, 1 );
    653595
    654596                                // We are back, restore the owners and recursions
     
    688630        }
    689631
    690         // unlock all the monitors
    691         unlock_all( locks, count );
    692 
    693632        //Everything is ready to go to sleep
    694         park();
     633        BlockInternal( locks, count );
    695634
    696635
     
    709648// Utilities
    710649
    711 static inline void __set_owner( $monitor * this, $thread * owner ) {
    712         /* paranoid */ verify( this->lock.lock );
     650static inline void set_owner( monitor_desc * this, thread_desc * owner ) {
     651        // __cfaabi_dbg_print_safe( "Kernal :   Setting owner of %p to %p ( was %p)\n", this, owner, this->owner );
    713652
    714653        //Pass the monitor appropriately
     
    719658}
    720659
    721 static inline void __set_owner( $monitor * monitors [], __lock_size_t count, $thread * owner ) {
    722         /* paranoid */ verify ( monitors[0]->lock.lock );
    723         /* paranoid */ verifyf( monitors[0]->owner == kernelTLS.this_thread, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, monitors[0]->owner, monitors[0]->recursion, monitors[0] );
    724         monitors[0]->owner        = owner;
    725         monitors[0]->recursion    = 1;
     660static inline void set_owner( monitor_desc * monitors [], __lock_size_t count, thread_desc * owner ) {
     661        monitors[0]->owner     = owner;
     662        monitors[0]->recursion = 1;
    726663        for( __lock_size_t i = 1; i < count; i++ ) {
    727                 /* paranoid */ verify ( monitors[i]->lock.lock );
    728                 /* paranoid */ verifyf( monitors[i]->owner == kernelTLS.this_thread, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, monitors[i]->owner, monitors[i]->recursion, monitors[i] );
    729                 monitors[i]->owner        = owner;
    730                 monitors[i]->recursion    = 0;
    731         }
    732 }
    733 
    734 static inline void set_mask( $monitor * storage [], __lock_size_t count, const __waitfor_mask_t & mask ) {
     664                monitors[i]->owner     = owner;
     665                monitors[i]->recursion = 0;
     666        }
     667}
     668
     669static inline void set_mask( monitor_desc * storage [], __lock_size_t count, const __waitfor_mask_t & mask ) {
    735670        for( __lock_size_t i = 0; i < count; i++) {
    736671                storage[i]->mask = mask;
     
    738673}
    739674
    740 static inline void reset_mask( $monitor * this ) {
    741         this->mask.accepted = 0p;
    742         this->mask.data = 0p;
     675static inline void reset_mask( monitor_desc * this ) {
     676        this->mask.accepted = NULL;
     677        this->mask.data = NULL;
    743678        this->mask.size = 0;
    744679}
    745680
    746 static inline $thread * next_thread( $monitor * this ) {
     681static inline thread_desc * next_thread( monitor_desc * this ) {
    747682        //Check the signaller stack
    748683        __cfaabi_dbg_print_safe( "Kernel :  mon %p AS-stack top %p\n", this, this->signal_stack.top);
     
    752687                //regardless of if we are ready to baton pass,
    753688                //we need to set the monitor as in use
    754                 /* paranoid */ verifyf( !this->owner || kernelTLS.this_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, this->owner, this->recursion, this );
    755                 __set_owner( this,  urgent->owner->waiting_thread );
     689                set_owner( this,  urgent->owner->waiting_thread );
    756690
    757691                return check_condition( urgent );
     
    760694        // No signaller thread
    761695        // Get the next thread in the entry_queue
    762         $thread * new_owner = pop_head( this->entry_queue );
    763         /* paranoid */ verifyf( !this->owner || kernelTLS.this_thread == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", kernelTLS.this_thread, this->owner, this->recursion, this );
    764         /* paranoid */ verify( !new_owner || new_owner->next == 0p );
    765         __set_owner( this, new_owner );
     696        thread_desc * new_owner = pop_head( this->entry_queue );
     697        set_owner( this, new_owner );
    766698
    767699        return new_owner;
    768700}
    769701
    770 static inline bool is_accepted( $monitor * this, const __monitor_group_t & group ) {
     702static inline bool is_accepted( monitor_desc * this, const __monitor_group_t & group ) {
    771703        __acceptable_t * it = this->mask.data; // Optim
    772704        __lock_size_t count = this->mask.size;
     
    790722}
    791723
    792 static inline void init( __lock_size_t count, $monitor * monitors [], __condition_node_t & waiter, __condition_criterion_t criteria [] ) {
     724static inline void init( __lock_size_t count, monitor_desc * monitors [], __condition_node_t & waiter, __condition_criterion_t criteria [] ) {
    793725        for( __lock_size_t i = 0; i < count; i++) {
    794726                (criteria[i]){ monitors[i], waiter };
     
    798730}
    799731
    800 static inline void init_push( __lock_size_t count, $monitor * monitors [], __condition_node_t & waiter, __condition_criterion_t criteria [] ) {
     732static inline void init_push( __lock_size_t count, monitor_desc * monitors [], __condition_node_t & waiter, __condition_criterion_t criteria [] ) {
    801733        for( __lock_size_t i = 0; i < count; i++) {
    802734                (criteria[i]){ monitors[i], waiter };
     
    814746}
    815747
    816 static inline void lock_all( $monitor * source [], __spinlock_t * /*out*/ locks [], __lock_size_t count ) {
     748static inline void lock_all( monitor_desc * source [], __spinlock_t * /*out*/ locks [], __lock_size_t count ) {
    817749        for( __lock_size_t i = 0; i < count; i++ ) {
    818750                __spinlock_t * l = &source[i]->lock;
     
    828760}
    829761
    830 static inline void unlock_all( $monitor * locks [], __lock_size_t count ) {
     762static inline void unlock_all( monitor_desc * locks [], __lock_size_t count ) {
    831763        for( __lock_size_t i = 0; i < count; i++ ) {
    832764                unlock( locks[i]->lock );
     
    835767
    836768static inline void save(
    837         $monitor * ctx [],
     769        monitor_desc * ctx [],
    838770        __lock_size_t count,
    839771        __attribute((unused)) __spinlock_t * locks [],
     
    848780
    849781static inline void restore(
    850         $monitor * ctx [],
     782        monitor_desc * ctx [],
    851783        __lock_size_t count,
    852784        __spinlock_t * locks [],
     
    866798// 2 - Checks if all the monitors are ready to run
    867799//     if so return the thread to run
    868 static inline $thread * check_condition( __condition_criterion_t * target ) {
     800static inline thread_desc * check_condition( __condition_criterion_t * target ) {
    869801        __condition_node_t * node = target->owner;
    870802        unsigned short count = node->count;
     
    884816        }
    885817
    886         __cfaabi_dbg_print_safe( "Kernel :  Runing %i (%p)\n", ready2run, ready2run ? node->waiting_thread : 0p );
    887         return ready2run ? node->waiting_thread : 0p;
     818        __cfaabi_dbg_print_safe( "Kernel :  Runing %i (%p)\n", ready2run, ready2run ? node->waiting_thread : NULL );
     819        return ready2run ? node->waiting_thread : NULL;
    888820}
    889821
    890822static inline void brand_condition( condition & this ) {
    891         $thread * thrd = TL_GET( this_thread );
     823        thread_desc * thrd = TL_GET( this_thread );
    892824        if( !this.monitors ) {
    893825                // __cfaabi_dbg_print_safe( "Branding\n" );
    894                 assertf( thrd->monitors.data != 0p, "No current monitor to brand condition %p", thrd->monitors.data );
     826                assertf( thrd->monitors.data != NULL, "No current monitor to brand condition %p", thrd->monitors.data );
    895827                this.monitor_count = thrd->monitors.size;
    896828
    897                 this.monitors = ($monitor **)malloc( this.monitor_count * sizeof( *this.monitors ) );
     829                this.monitors = (monitor_desc **)malloc( this.monitor_count * sizeof( *this.monitors ) );
    898830                for( int i = 0; i < this.monitor_count; i++ ) {
    899831                        this.monitors[i] = thrd->monitors[i];
     
    902834}
    903835
    904 static inline [$thread *, int] search_entry_queue( const __waitfor_mask_t & mask, $monitor * monitors [], __lock_size_t count ) {
    905 
    906         __queue_t($thread) & entry_queue = monitors[0]->entry_queue;
     836static inline [thread_desc *, int] search_entry_queue( const __waitfor_mask_t & mask, monitor_desc * monitors [], __lock_size_t count ) {
     837
     838        __queue_t(thread_desc) & entry_queue = monitors[0]->entry_queue;
    907839
    908840        // For each thread in the entry-queue
    909         for(    $thread ** thrd_it = &entry_queue.head;
    910                 *thrd_it != 1p;
     841        for(    thread_desc ** thrd_it = &entry_queue.head;
     842                *thrd_it;
    911843                thrd_it = &(*thrd_it)->next
    912844        ) {
     
    951883}
    952884
    953 static inline __lock_size_t aggregate( $monitor * storage [], const __waitfor_mask_t & mask ) {
     885static inline __lock_size_t aggregate( monitor_desc * storage [], const __waitfor_mask_t & mask ) {
    954886        __lock_size_t size = 0;
    955887        for( __lock_size_t i = 0; i < mask.size; i++ ) {
  • libcfa/src/concurrency/monitor.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Thd Feb 23 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec  4 07:55:32 2019
    13 // Update Count     : 11
     12// Last Modified On : Sat Oct  7 18:06:45 2017
     13// Update Count     : 10
    1414//
    1515
     
    2323
    2424trait is_monitor(dtype T) {
    25         $monitor * get_monitor( T & );
     25        monitor_desc * get_monitor( T & );
    2626        void ^?{}( T & mutex );
    2727};
    2828
    29 static inline void ?{}($monitor & this) with( this ) {
     29static inline void ?{}(monitor_desc & this) with( this ) {
    3030        lock{};
    3131        entry_queue{};
    3232        signal_stack{};
    33         owner         = 0p;
     33        owner         = NULL;
    3434        recursion     = 0;
    35         mask.accepted = 0p;
    36         mask.data     = 0p;
     35        mask.accepted = NULL;
     36        mask.data     = NULL;
    3737        mask.size     = 0;
    38         dtor_node     = 0p;
     38        dtor_node     = NULL;
    3939}
    4040
    41 static inline void ^?{}($monitor & ) {}
    42 
    4341struct monitor_guard_t {
    44         $monitor **     m;
     42        monitor_desc **         m;
    4543        __lock_size_t           count;
    4644        __monitor_group_t prev;
    4745};
    4846
    49 void ?{}( monitor_guard_t & this, $monitor ** m, __lock_size_t count, void (*func)() );
     47void ?{}( monitor_guard_t & this, monitor_desc ** m, __lock_size_t count, void (*func)() );
    5048void ^?{}( monitor_guard_t & this );
    5149
    5250struct monitor_dtor_guard_t {
    53         $monitor *    m;
     51        monitor_desc *    m;
    5452        __monitor_group_t prev;
    5553};
    5654
    57 void ?{}( monitor_dtor_guard_t & this, $monitor ** m, void (*func)() );
     55void ?{}( monitor_dtor_guard_t & this, monitor_desc ** m, void (*func)() );
    5856void ^?{}( monitor_dtor_guard_t & this );
    5957
     
    7270
    7371        // The monitor this criterion concerns
    74         $monitor * target;
     72        monitor_desc * target;
    7573
    7674        // The parent node to which this criterion belongs
     
    8785struct __condition_node_t {
    8886        // Thread that needs to be woken when all criteria are met
    89         $thread * waiting_thread;
     87        thread_desc * waiting_thread;
    9088
    9189        // Array of criteria (Criterions are contiguous in memory)
     
    106104}
    107105
    108 void ?{}(__condition_node_t & this, $thread * waiting_thread, __lock_size_t count, uintptr_t user_info );
     106void ?{}(__condition_node_t & this, thread_desc * waiting_thread, __lock_size_t count, uintptr_t user_info );
    109107void ?{}(__condition_criterion_t & this );
    110 void ?{}(__condition_criterion_t & this, $monitor * target, __condition_node_t * owner );
     108void ?{}(__condition_criterion_t & this, monitor_desc * target, __condition_node_t * owner );
    111109
    112110struct condition {
     
    115113
    116114        // Array of monitor pointers (Monitors are NOT contiguous in memory)
    117         $monitor ** monitors;
     115        monitor_desc ** monitors;
    118116
    119117        // Number of monitors in the array
     
    122120
    123121static inline void ?{}( condition & this ) {
    124         this.monitors = 0p;
     122        this.monitors = NULL;
    125123        this.monitor_count = 0;
    126124}
     
    133131              bool signal      ( condition & this );
    134132              bool signal_block( condition & this );
    135 static inline bool is_empty    ( condition & this ) { return this.blocked.head == 1p; }
     133static inline bool is_empty    ( condition & this ) { return !this.blocked.head; }
    136134         uintptr_t front       ( condition & this );
    137135
  • libcfa/src/concurrency/mutex.cfa

    r3d5701e r9fb8f01  
    1111// Author           : Thierry Delisle
    1212// Created On       : Fri May 25 01:37:11 2018
    13 // Last Modified By : Peter A. Buhr
    14 // Last Modified On : Wed Dec  4 09:16:39 2019
    15 // Update Count     : 1
     13// Last Modified By : Thierry Delisle
     14// Last Modified On : Fri May 25 01:37:51 2018
     15// Update Count     : 0
    1616//
    1717
     
    4040        if( is_locked ) {
    4141                append( blocked_threads, kernelTLS.this_thread );
    42                 unlock( lock );
    43                 park();
     42                BlockInternal( &lock );
    4443        }
    4544        else {
     
    6362        lock( this.lock __cfaabi_dbg_ctx2 );
    6463        this.is_locked = (this.blocked_threads != 0);
    65         unpark(
     64        WakeThread(
    6665                pop_head( this.blocked_threads )
    6766        );
     
    7473        this.lock{};
    7574        this.blocked_threads{};
    76         this.owner = 0p;
     75        this.owner = NULL;
    7776        this.recursion_count = 0;
    7877}
     
    8483void lock(recursive_mutex_lock & this) with(this) {
    8584        lock( lock __cfaabi_dbg_ctx2 );
    86         if( owner == 0p ) {
     85        if( owner == NULL ) {
    8786                owner = kernelTLS.this_thread;
    8887                recursion_count = 1;
     
    9594        else {
    9695                append( blocked_threads, kernelTLS.this_thread );
    97                 unlock( lock );
    98                 park();
     96                BlockInternal( &lock );
    9997        }
    10098}
     
    103101        bool ret = false;
    104102        lock( lock __cfaabi_dbg_ctx2 );
    105         if( owner == 0p ) {
     103        if( owner == NULL ) {
    106104                owner = kernelTLS.this_thread;
    107105                recursion_count = 1;
     
    120118        recursion_count--;
    121119        if( recursion_count == 0 ) {
    122                 $thread * thrd = pop_head( blocked_threads );
     120                thread_desc * thrd = pop_head( blocked_threads );
    123121                owner = thrd;
    124122                recursion_count = (thrd ? 1 : 0);
    125                 unpark( thrd );
     123                WakeThread( thrd );
    126124        }
    127125        unlock( lock );
     
    140138void notify_one(condition_variable & this) with(this) {
    141139        lock( lock __cfaabi_dbg_ctx2 );
    142         unpark(
     140        WakeThread(
    143141                pop_head( this.blocked_threads )
    144142        );
     
    149147        lock( lock __cfaabi_dbg_ctx2 );
    150148        while(this.blocked_threads) {
    151                 unpark(
     149                WakeThread(
    152150                        pop_head( this.blocked_threads )
    153151                );
     
    159157        lock( this.lock __cfaabi_dbg_ctx2 );
    160158        append( this.blocked_threads, kernelTLS.this_thread );
    161         unlock( this.lock );
    162         park();
     159        BlockInternal( &this.lock );
    163160}
    164161
     
    167164        lock( this.lock __cfaabi_dbg_ctx2 );
    168165        append( this.blocked_threads, kernelTLS.this_thread );
    169         unlock(l);
    170         unlock(this.lock);
    171         park();
     166        void __unlock(void) {
     167                unlock(l);
     168                unlock(this.lock);
     169        }
     170        BlockInternal( __unlock );
    172171        lock(l);
    173172}
  • libcfa/src/concurrency/mutex.hfa

    r3d5701e r9fb8f01  
    1111// Author           : Thierry Delisle
    1212// Created On       : Fri May 25 01:24:09 2018
    13 // Last Modified By : Peter A. Buhr
    14 // Last Modified On : Wed Dec  4 09:16:53 2019
    15 // Update Count     : 1
     13// Last Modified By : Thierry Delisle
     14// Last Modified On : Fri May 25 01:24:12 2018
     15// Update Count     : 0
    1616//
    1717
     
    3636
    3737        // List of blocked threads
    38         __queue_t(struct $thread) blocked_threads;
     38        __queue_t(struct thread_desc) blocked_threads;
    3939
    4040        // Locked flag
     
    5555
    5656        // List of blocked threads
    57         __queue_t(struct $thread) blocked_threads;
     57        __queue_t(struct thread_desc) blocked_threads;
    5858
    5959        // Current thread owning the lock
    60         struct $thread * owner;
     60        struct thread_desc * owner;
    6161
    6262        // Number of recursion level
     
    8383
    8484        // List of blocked threads
    85         __queue_t(struct $thread) blocked_threads;
     85        __queue_t(struct thread_desc) blocked_threads;
    8686};
    8787
     
    110110
    111111        static inline void ?{}(lock_scope(L) & this) {
    112                 this.locks = 0p;
     112                this.locks = NULL;
    113113                this.count = 0;
    114114        }
  • libcfa/src/concurrency/preemption.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Mon Jun 5 14:20:42 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Dec  5 16:34:05 2019
    13 // Update Count     : 43
     12// Last Modified On : Tue Jun  5 17:35:49 2018
     13// Update Count     : 37
    1414//
    1515
     
    2424#include <string.h>
    2525#include <unistd.h>
    26 #include <limits.h>                                                                             // PTHREAD_STACK_MIN
    2726}
    2827
     
    3938// FwdDeclarations : timeout handlers
    4039static void preempt( processor   * this );
    41 static void timeout( $thread * this );
     40static void timeout( thread_desc * this );
    4241
    4342// FwdDeclarations : Signal handlers
     
    6564event_kernel_t * event_kernel;                        // kernel public handle to even kernel
    6665static pthread_t alarm_thread;                        // pthread handle to alarm thread
    67 static void * alarm_stack;                                                        // pthread stack for alarm thread
    6866
    6967static void ?{}(event_kernel_t & this) with( this ) {
     
    8381// Get next expired node
    8482static inline alarm_node_t * get_expired( alarm_list_t * alarms, Time currtime ) {
    85         if( !alarms->head ) return 0p;                                          // If no alarms return null
    86         if( alarms->head->alarm >= currtime ) return 0p;        // If alarms head not expired return null
    87         return pop(alarms);                                                                     // Otherwise just pop head
     83        if( !alarms->head ) return NULL;                          // If no alarms return null
     84        if( alarms->head->alarm >= currtime ) return NULL;        // If alarms head not expired return null
     85        return pop(alarms);                                       // Otherwise just pop head
    8886}
    8987
    9088// Tick one frame of the Discrete Event Simulation for alarms
    9189static void tick_preemption() {
    92         alarm_node_t * node = 0p;                                                       // 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         Time currtime = __kernel_get_time();                            // Check current time once so everything "happens at once"
     90        alarm_node_t * node = NULL;                     // Used in the while loop but cannot be declared in the while condition
     91        alarm_list_t * alarms = &event_kernel->alarms;  // Local copy for ease of reading
     92        Time currtime = __kernel_get_time();                    // Check current time once so we everything "happens at once"
    9593
    9694        //Loop throught every thing expired
     
    184182
    185183        // Enable interrupts by decrementing the counter
    186         // If counter reaches 0, execute any pending __cfactx_switch
     184        // If counter reaches 0, execute any pending CtxSwitch
    187185        void enable_interrupts( __cfaabi_dbg_ctx_param ) {
    188186                processor   * proc = kernelTLS.this_processor; // Cache the processor now since interrupts can start happening after the atomic store
     187                thread_desc * thrd = kernelTLS.this_thread;       // Cache the thread now since interrupts can start happening after the atomic store
    189188
    190189                with( kernelTLS.preemption_state ){
     
    208207                                if( proc->pending_preemption ) {
    209208                                        proc->pending_preemption = false;
    210                                         force_yield( __POLL_PREEMPTION );
     209                                        BlockInternal( thrd );
    211210                                }
    212211                        }
     
    218217
    219218        // Disable interrupts by incrementint the counter
    220         // Don't execute any pending __cfactx_switch even if counter reaches 0
     219        // Don't execute any pending CtxSwitch even if counter reaches 0
    221220        void enable_interrupts_noPoll() {
    222221                unsigned short prev = kernelTLS.preemption_state.disable_count;
     
    244243        sigaddset( &mask, sig );
    245244
    246         if ( pthread_sigmask( SIG_UNBLOCK, &mask, 0p ) == -1 ) {
     245        if ( pthread_sigmask( SIG_UNBLOCK, &mask, NULL ) == -1 ) {
    247246            abort( "internal error, pthread_sigmask" );
    248247        }
     
    255254        sigaddset( &mask, sig );
    256255
    257         if ( pthread_sigmask( SIG_BLOCK, &mask, 0p ) == -1 ) {
     256        if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) {
    258257            abort( "internal error, pthread_sigmask" );
    259258        }
     
    267266
    268267// reserved for future use
    269 static void timeout( $thread * this ) {
     268static void timeout( thread_desc * this ) {
    270269        //TODO : implement waking threads
    271270}
    272271
    273272// KERNEL ONLY
    274 // Check if a __cfactx_switch signal handler shoud defer
     273// Check if a CtxSwitch signal handler shoud defer
    275274// If true  : preemption is safe
    276275// If false : preemption is unsafe and marked as pending
     
    302301
    303302        // Setup proper signal handlers
    304         __cfaabi_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO | SA_RESTART ); // __cfactx_switch handler
     303        __cfaabi_sigaction( SIGUSR1, sigHandler_ctxSwitch, SA_SIGINFO | SA_RESTART );         // CtxSwitch handler
    305304
    306305        signal_block( SIGALRM );
    307306
    308         alarm_stack = __create_pthread( &alarm_thread, alarm_loop, 0p );
     307        pthread_create( &alarm_thread, NULL, alarm_loop, NULL );
    309308}
    310309
     
    317316        sigset_t mask;
    318317        sigfillset( &mask );
    319         sigprocmask( SIG_BLOCK, &mask, 0p );
     318        sigprocmask( SIG_BLOCK, &mask, NULL );
    320319
    321320        // Notify the alarm thread of the shutdown
     
    324323
    325324        // Wait for the preemption thread to finish
    326 
    327         pthread_join( alarm_thread, 0p );
    328         free( alarm_stack );
     325        pthread_join( alarm_thread, NULL );
    329326
    330327        // Preemption is now fully stopped
     
    383380        static_assert( sizeof( sigset_t ) == sizeof( cxt->uc_sigmask ), "Expected cxt->uc_sigmask to be of sigset_t" );
    384381        #endif
    385         if ( pthread_sigmask( SIG_SETMASK, (sigset_t *)&(cxt->uc_sigmask), 0p ) == -1 ) {
     382        if ( pthread_sigmask( SIG_SETMASK, (sigset_t *)&(cxt->uc_sigmask), NULL ) == -1 ) {
    386383                abort( "internal error, sigprocmask" );
    387384        }
     
    393390        // Preemption can occur here
    394391
    395         force_yield( __ALARM_PREEMPTION ); // Do the actual __cfactx_switch
     392        BlockInternal( kernelTLS.this_thread ); // Do the actual CtxSwitch
    396393}
    397394
     
    402399        sigset_t mask;
    403400        sigfillset(&mask);
    404         if ( pthread_sigmask( SIG_BLOCK, &mask, 0p ) == -1 ) {
     401        if ( pthread_sigmask( SIG_BLOCK, &mask, NULL ) == -1 ) {
    405402            abort( "internal error, pthread_sigmask" );
    406403        }
     
    423420                                        {__cfaabi_dbg_print_buffer_decl( " KERNEL: Spurious wakeup %d.\n", err );}
    424421                                        continue;
    425                                 case EINVAL :
     422                        case EINVAL :
    426423                                        abort( "Timeout was invalid." );
    427424                                default:
     
    456453EXIT:
    457454        __cfaabi_dbg_print_safe( "Kernel : Preemption thread stopping\n" );
    458         return 0p;
     455        return NULL;
    459456}
    460457
     
    469466        sigset_t oldset;
    470467        int ret;
    471         ret = pthread_sigmask(0, 0p, &oldset);
     468        ret = pthread_sigmask(0, NULL, &oldset);
    472469        if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); }
    473470
  • libcfa/src/concurrency/thread.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Jan 17 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec  4 09:17:49 2019
    13 // Update Count     : 9
     12// Last Modified On : Fri Mar 30 17:19:52 2018
     13// Update Count     : 8
    1414//
    1515
     
    2323#include "invoke.h"
    2424
     25extern "C" {
     26        #include <fenv.h>
     27        #include <stddef.h>
     28}
     29
     30//extern volatile thread_local processor * this_processor;
     31
    2532//-----------------------------------------------------------------------------
    2633// Thread ctors and dtors
    27 void ?{}($thread & this, const char * const name, cluster & cl, void * storage, size_t storageSize ) with( this ) {
    28         context{ 0p, 0p };
     34void ?{}(thread_desc & this, const char * const name, cluster & cl, void * storage, size_t storageSize ) with( this ) {
     35        context{ NULL, NULL };
    2936        self_cor{ name, storage, storageSize };
    3037        state = Start;
    31         preempted = __NO_PREEMPTION;
    3238        curr_cor = &self_cor;
    3339        self_mon.owner = &this;
     
    3541        self_mon_p = &self_mon;
    3642        curr_cluster = &cl;
    37         next = 0p;
     43        next = NULL;
    3844
    39         node.next = 0p;
    40         node.prev = 0p;
     45        node.next = NULL;
     46        node.prev = NULL;
    4147        doregister(curr_cluster, this);
    4248
     
    4450}
    4551
    46 void ^?{}($thread& this) with( this ) {
     52void ^?{}(thread_desc& this) with( this ) {
    4753        unregister(curr_cluster, this);
    4854        ^self_cor{};
    4955}
    5056
    51 //-----------------------------------------------------------------------------
    52 // Starting and stopping threads
    53 forall( dtype T | is_thread(T) )
    54 void __thrd_start( T & this, void (*main_p)(T &) ) {
    55         $thread * this_thrd = get_thread(this);
    56 
    57         disable_interrupts();
    58         __cfactx_start(main_p, get_coroutine(this), this, __cfactx_invoke_thread);
    59 
    60         this_thrd->context.[SP, FP] = this_thrd->self_cor.context.[SP, FP];
    61         verify( this_thrd->context.SP );
    62 
    63         __schedule_thread(this_thrd);
    64         enable_interrupts( __cfaabi_dbg_ctx );
    65 }
    66 
    67 //-----------------------------------------------------------------------------
    68 // Support for threads that don't ues the thread keyword
    6957forall( dtype T | sized(T) | is_thread(T) | { void ?{}(T&); } )
    7058void ?{}( scoped(T)& this ) with( this ) {
    7159        handle{};
    72         __thrd_start(handle, main);
     60        __thrd_start(handle);
    7361}
    7462
     
    7664void ?{}( scoped(T)& this, P params ) with( this ) {
    7765        handle{ params };
    78         __thrd_start(handle, main);
     66        __thrd_start(handle);
    7967}
    8068
     
    8472}
    8573
     74//-----------------------------------------------------------------------------
     75// Starting and stopping threads
     76forall( dtype T | is_thread(T) )
     77void __thrd_start( T& this ) {
     78        thread_desc * this_thrd = get_thread(this);
     79        thread_desc * curr_thrd = TL_GET( this_thread );
     80
     81        disable_interrupts();
     82        CtxStart(&this, CtxInvokeThread);
     83        this_thrd->context.[SP, FP] = this_thrd->self_cor.context.[SP, FP];
     84        verify( this_thrd->context.SP );
     85        CtxSwitch( &curr_thrd->context, &this_thrd->context );
     86
     87        ScheduleThread(this_thrd);
     88        enable_interrupts( __cfaabi_dbg_ctx );
     89}
     90
     91extern "C" {
     92        // KERNEL ONLY
     93        void __finish_creation(thread_desc * this) {
     94                // set new coroutine that the processor is executing
     95                // and context switch to it
     96                verify( kernelTLS.this_thread != this );
     97                verify( kernelTLS.this_thread->context.SP );
     98                CtxSwitch( &this->context, &kernelTLS.this_thread->context );
     99        }
     100}
     101
     102void yield( void ) {
     103        // Safety note : This could cause some false positives due to preemption
     104      verify( TL_GET( preemption_state.enabled ) );
     105        BlockInternal( TL_GET( this_thread ) );
     106        // Safety note : This could cause some false positives due to preemption
     107      verify( TL_GET( preemption_state.enabled ) );
     108}
     109
     110void yield( unsigned times ) {
     111        for( unsigned i = 0; i < times; i++ ) {
     112                yield();
     113        }
     114}
     115
    86116// Local Variables: //
    87117// mode: c //
  • libcfa/src/concurrency/thread.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Jan 17 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec  4 09:18:14 2019
    13 // Update Count     : 6
     12// Last Modified On : Fri Jun 21 17:51:33 2019
     13// Update Count     : 5
    1414//
    1515
     
    2828      void ^?{}(T& mutex this);
    2929      void main(T& this);
    30       $thread* get_thread(T& this);
     30      thread_desc* get_thread(T& this);
    3131};
    3232
    33 // define that satisfies the trait without using the thread keyword
    34 #define DECL_THREAD(X) $thread* get_thread(X& this) __attribute__((const)) { return &this.__thrd; } void main(X& this)
    35 
    36 // Inline getters for threads/coroutines/monitors
    37 forall( dtype T | is_thread(T) )
    38 static inline $coroutine* get_coroutine(T & this) __attribute__((const)) { return &get_thread(this)->self_cor; }
     33#define DECL_THREAD(X) thread_desc* get_thread(X& this) { return &this.__thrd; } void main(X& this)
    3934
    4035forall( dtype T | is_thread(T) )
    41 static inline $monitor  * get_monitor  (T & this) __attribute__((const)) { return &get_thread(this)->self_mon; }
     36static inline coroutine_desc* get_coroutine(T & this) {
     37        return &get_thread(this)->self_cor;
     38}
    4239
    43 static inline $coroutine* get_coroutine($thread * this) __attribute__((const)) { return &this->self_cor; }
    44 static inline $monitor  * get_monitor  ($thread * this) __attribute__((const)) { return &this->self_mon; }
     40forall( dtype T | is_thread(T) )
     41static inline monitor_desc* get_monitor(T & this) {
     42        return &get_thread(this)->self_mon;
     43}
    4544
    46 //-----------------------------------------------------------------------------
    47 // forward declarations needed for threads
     45static inline coroutine_desc* get_coroutine(thread_desc * this) {
     46        return &this->self_cor;
     47}
     48
     49static inline monitor_desc* get_monitor(thread_desc * this) {
     50        return &this->self_mon;
     51}
     52
    4853extern struct cluster * mainCluster;
    4954
    5055forall( dtype T | is_thread(T) )
    51 void __thrd_start( T & this, void (*)(T &) );
     56void __thrd_start( T & this );
    5257
    5358//-----------------------------------------------------------------------------
    5459// Ctors and dtors
    55 void ?{}($thread & this, const char * const name, struct cluster & cl, void * storage, size_t storageSize );
    56 void ^?{}($thread & this);
     60void ?{}(thread_desc & this, const char * const name, struct cluster & cl, void * storage, size_t storageSize );
     61void ^?{}(thread_desc & this);
    5762
    58 static inline void ?{}($thread & this)                                                                  { this{ "Anonymous Thread", *mainCluster, 0p, 65000 }; }
    59 static inline void ?{}($thread & this, size_t stackSize )                                               { this{ "Anonymous Thread", *mainCluster, 0p, stackSize }; }
    60 static inline void ?{}($thread & this, void * storage, size_t storageSize )                             { this{ "Anonymous Thread", *mainCluster, storage, storageSize }; }
    61 static inline void ?{}($thread & this, struct cluster & cl )                                            { this{ "Anonymous Thread", cl, 0p, 65000 }; }
    62 static inline void ?{}($thread & this, struct cluster & cl, size_t stackSize )                          { this{ "Anonymous Thread", cl, 0p, stackSize }; }
    63 static inline void ?{}($thread & this, struct cluster & cl, void * storage, size_t storageSize )        { this{ "Anonymous Thread", cl, storage, storageSize }; }
    64 static inline void ?{}($thread & this, const char * const name)                                         { this{ name, *mainCluster, 0p, 65000 }; }
    65 static inline void ?{}($thread & this, const char * const name, struct cluster & cl )                   { this{ name, cl, 0p, 65000 }; }
    66 static inline void ?{}($thread & this, const char * const name, struct cluster & cl, size_t stackSize ) { this{ name, cl, 0p, stackSize }; }
     63static inline void ?{}(thread_desc & this)                                                                  { this{ "Anonymous Thread", *mainCluster, NULL, 65000 }; }
     64static inline void ?{}(thread_desc & this, size_t stackSize )                                               { this{ "Anonymous Thread", *mainCluster, NULL, stackSize }; }
     65static inline void ?{}(thread_desc & this, void * storage, size_t storageSize )                             { this{ "Anonymous Thread", *mainCluster, storage, storageSize }; }
     66static inline void ?{}(thread_desc & this, struct cluster & cl )                                            { this{ "Anonymous Thread", cl, NULL, 65000 }; }
     67static inline void ?{}(thread_desc & this, struct cluster & cl, size_t stackSize )                          { this{ "Anonymous Thread", cl, NULL, stackSize }; }
     68static inline void ?{}(thread_desc & this, struct cluster & cl, void * storage, size_t storageSize )        { this{ "Anonymous Thread", cl, storage, storageSize }; }
     69static inline void ?{}(thread_desc & this, const char * const name)                                         { this{ name, *mainCluster, NULL, 65000 }; }
     70static inline void ?{}(thread_desc & this, const char * const name, struct cluster & cl )                   { this{ name, cl, NULL, 65000 }; }
     71static inline void ?{}(thread_desc & this, const char * const name, struct cluster & cl, size_t stackSize ) { this{ name, cl, NULL, stackSize }; }
    6772
    6873//-----------------------------------------------------------------------------
     
    8388void ^?{}( scoped(T)& this );
    8489
    85 //-----------------------------------------------------------------------------
    86 // Thread getters
    87 static inline struct $thread * active_thread () { return TL_GET( this_thread ); }
     90void yield();
     91void yield( unsigned times );
    8892
    89 //-----------------------------------------------------------------------------
    90 // Scheduler API
    91 
    92 //----------
    93 // Park thread: block until corresponding call to unpark, won't block if unpark is already called
    94 void park( void );
    95 
    96 //----------
    97 // Unpark a thread, if the thread is already blocked, schedule it
    98 //                  if the thread is not yet block, signal that it should rerun immediately
    99 void unpark( $thread * this );
    100 
    101 forall( dtype T | is_thread(T) )
    102 static inline void unpark( T & this ) { if(!&this) return; unpark( get_thread( this ) );}
    103 
    104 //----------
    105 // Yield: force thread to block and be rescheduled
    106 bool force_yield( enum __Preemption_Reason );
    107 
    108 static inline void yield() {
    109         force_yield(__MANUAL_PREEMPTION);
    110 }
    111 
    112 // Yield: yield N times
    113 static inline void yield( unsigned times ) {
    114         for( times ) {
    115                 yield();
    116         }
    117 }
     93static inline struct thread_desc * active_thread () { return TL_GET( this_thread ); }
    11894
    11995// Local Variables: //
  • libcfa/src/exception.c

    r3d5701e r9fb8f01  
    6969
    7070
    71 // This macro should be the only thing that needs to change across machines.
    72 // Used in the personality function, way down in termination.
     71// This macro should be the only thing that needs to change across machines.  Used in the personality function, way down
     72// in termination.
    7373// struct _Unwind_Context * -> _Unwind_Reason_Code(*)(exception_t *)
    7474#define MATCHER_FROM_CONTEXT(ptr_to_context) \
     
    102102}
    103103
    104 // Do we control where exceptions get thrown even with concurency?
    105 // If not these are not quite thread safe, the cleanup hook has to
    106 // be added after the node is built but before it is made the top node.
     104// Do we control where exceptions get thrown even with concurency?  If not these are not quite thread safe, the cleanup
     105// hook has to be added after the node is built but before it is made the top node.
    107106
    108107void __cfaabi_ehm__try_resume_setup(struct __cfaabi_ehm__try_resume_node * node,
     
    213212        _Unwind_Reason_Code ret = _Unwind_RaiseException( &this_exception_storage );
    214213
    215         // If we reach here it means something happened. For resumption to work we need to find a way
    216         // to return back to here. Most of them will probably boil down to setting a global flag and
    217         // making the phase 1 either stop or fail. Causing an error on purpose may help avoiding
    218         // unnecessary work but it might have some weird side effects. If we just pretend no handler
    219         // was found that would work but may be expensive for no reason since we will always search
    220         // the whole stack.
     214        // If we reach here it means something happened.  For resumption to work we need to find a way to return back to
     215        // here.  Most of them will probably boil down to setting a global flag and making the phase 1 either stop or
     216        // fail.  Causing an error on purpose may help avoiding unnecessary work but it might have some weird side
     217        // effects.  If we just pretend no handler was found that would work but may be expensive for no reason since we
     218        // will always search the whole stack.
    221219
    222220        if( ret == _URC_END_OF_STACK ) {
    223                 // No proper handler was found. This can be handled in many ways, C++ calls std::terminate.
    224                 // Here we force unwind the stack, basically raising a cancellation.
     221                // No proper handler was found.  This can be handled in several way.  C++ calls std::terminate Here we
     222                // force unwind the stack, basically raising a cancellation.
    225223                printf("Uncaught exception %p\n", &this_exception_storage);
    226224
     
    230228        }
    231229
    232         // We did not simply reach the end of the stack without finding a handler. This is an error.
     230        // We did not simply reach the end of the stack without finding a handler.  Something wen't wrong
    233231        printf("UNWIND ERROR %d after raise exception\n", ret);
    234232        abort();
     
    248246}
    249247
    250 #pragma GCC push_options
    251 #pragma GCC optimize("O0")
    252 
    253 // This is our personality routine. For every stack frame annotated with
    254 // ".cfi_personality 0x3,__gcfa_personality_v0" this function will be called twice when unwinding.
    255 //  Once in the search phase and once in the cleanup phase.
     248#if defined(PIC)
     249#warning Exceptions not yet supported when using Position-Independent Code
     250__attribute__((noinline))
     251void __cfaabi_ehm__try_terminate(void (*try_block)(),
     252                void (*catch_block)(int index, exception_t * except),
     253                __attribute__((unused)) int (*match_block)(exception_t * except)) {
     254        abort();
     255}
     256#else
     257// This is our personality routine.  For every stack frame anotated with ".cfi_personality 0x3,__gcfa_personality_v0".
     258// This function will be called twice when unwinding.  Once in the search phased and once in the cleanup phase.
    256259_Unwind_Reason_Code __gcfa_personality_v0 (
    257260                int version, _Unwind_Action actions, unsigned long long exceptionClass,
     
    261264
    262265        //__cfaabi_dbg_print_safe("CFA: 0x%lx\n", _Unwind_GetCFA(context));
    263         __cfaabi_dbg_print_safe("Personality function (%d, %x, %llu, %p, %p):",
    264                         version, actions, exceptionClass, unwind_exception, context);
     266        __cfaabi_dbg_print_safe("Personality function (%d, %x, %llu, %p, %p):", version, actions, exceptionClass, unwind_exception, context);
    265267
    266268        // If we've reached the end of the stack then there is nothing much we can do...
     
    289291        // Get the instuction pointer and a reading pointer into the exception table
    290292        lsda_header_info lsd_info;
    291         const unsigned char * cur_ptr = parse_lsda_header(context, lsd, &lsd_info);
     293        const unsigned char * cur_ptr = parse_lsda_header( context, lsd, &lsd_info);
    292294        _Unwind_Ptr instruction_ptr = _Unwind_GetIP( context );
    293295
     
    300302
    301303                // Decode the common stuff we have in here
    302                 cur_ptr = read_encoded_value(0, lsd_info.call_site_encoding, cur_ptr, &callsite_start);
    303                 cur_ptr = read_encoded_value(0, lsd_info.call_site_encoding, cur_ptr, &callsite_len);
    304                 cur_ptr = read_encoded_value(0, lsd_info.call_site_encoding, cur_ptr, &callsite_landing_pad);
    305                 cur_ptr = read_uleb128(cur_ptr, &callsite_action);
     304                cur_ptr = read_encoded_value (0, lsd_info.call_site_encoding, cur_ptr, &callsite_start);
     305                cur_ptr = read_encoded_value (0, lsd_info.call_site_encoding, cur_ptr, &callsite_len);
     306                cur_ptr = read_encoded_value (0, lsd_info.call_site_encoding, cur_ptr, &callsite_landing_pad);
     307                cur_ptr = read_uleb128 (cur_ptr, &callsite_action);
    306308
    307309                // Have we reach the correct frame info yet?
     
    314316                        void * ep = (void*)lsd_info.Start + callsite_start + callsite_len;
    315317                        void * ip = (void*)instruction_ptr;
    316                         __cfaabi_dbg_print_safe("\nfound %p - %p (%p, %p, %p), looking for %p\n",
    317                                         bp, ep, ls, cs, cl, ip);
     318                        __cfaabi_dbg_print_safe("\nfound %p - %p (%p, %p, %p), looking for %p\n", bp, ep, ls, cs, cl, ip);
    318319#endif // __CFA_DEBUG_PRINT__
    319320                        continue;
    320321                }
    321322
    322                 // Have we gone too far?
     323                // Have we gone too far
    323324                if( lsd_info.Start + callsite_start > instruction_ptr ) {
    324325                        printf(" gone too far");
     
    330331                        // Which phase are we in
    331332                        if (actions & _UA_SEARCH_PHASE) {
    332                                 // In search phase, these means we found a potential handler we must check.
    333 
    334                                 // We have arbitrarily decided that 0 means nothing to do and 1 means there is
    335                                 // a potential handler. This doesn't seem to conflict the gcc default behavior.
     333                                // Search phase, this means we probably found a potential handler and must check if it is a match
     334
     335                                // If we have arbitrarily decided that 0 means nothing to do and 1 means there is a potential handler
     336                                // This doesn't seem to conflict the gcc default behavior
    336337                                if (callsite_action != 0) {
    337338                                        // Now we want to run some code to see if the handler matches
     
    350351                                        // The current apprach uses one exception table entry per try block
    351352                                        _uleb128_t imatcher;
    352                                         // Get the relative offset to the {...}?
    353                                         cur_ptr = read_uleb128(cur_ptr, &imatcher);
     353                                        // Get the relative offset to the
     354                                        cur_ptr = read_uleb128 (cur_ptr, &imatcher);
     355
     356                                        // Get a function pointer from the relative offset and call it
     357                                        // _Unwind_Reason_Code (*matcher)() = (_Unwind_Reason_Code (*)())lsd_info.LPStart + imatcher;
    354358
    355359                                        _Unwind_Reason_Code (*matcher)(exception_t *) =
     
    410414}
    411415
    412 // Try statements are hoisted out see comments for details. While this could probably be unique
    413 // and simply linked from libcfa but there is one problem left, see the exception table for details
     416// Try statements are hoisted out see comments for details.  With this could probably be unique and simply linked from
     417// libcfa but there is one problem left, see the exception table for details
    414418__attribute__((noinline))
    415419void __cfaabi_ehm__try_terminate(void (*try_block)(),
     
    424428        // assembly works.
    425429
    426         // Setup the personality routine and exception table.
    427 #ifdef __PIC__
    428         asm volatile (".cfi_personality 0x9b,CFA.ref.__gcfa_personality_v0");
    429         asm volatile (".cfi_lsda 0x1b, .LLSDACFA2");
    430 #else
     430        // Setup the personality routine
    431431        asm volatile (".cfi_personality 0x3,__gcfa_personality_v0");
     432        // Setup the exception table
    432433        asm volatile (".cfi_lsda 0x3, .LLSDACFA2");
    433 #endif
    434434
    435435        // Label which defines the start of the area for which the handler is setup.
     
    442442        asm volatile goto ("" : : : : CATCH );
    443443
    444         // Normal return for when there is no throw.
     444        // Normal return
    445445        return;
    446446
     
    459459}
    460460
    461 // Exception table data we need to generate. While this is almost generic, the custom data refers
    462 // to {*}try_terminate, which is no way generic. Some more works need to be done if we want to
    463 // have a single call to the try routine.
    464 
    465 #ifdef __PIC__
     461// Exception table data we need to generate.  While this is almost generic, the custom data refers to foo_try_match try
     462// match, which is no way generic.  Some more works need to be done if we want to have a single call to the try routine.
     463
    466464#if defined( __i386 ) || defined( __x86_64 )
    467465asm (
    468         // HEADER
     466        //HEADER
    469467        ".LFECFA1:\n"
    470468        "       .globl  __gcfa_personality_v0\n"
    471469        "       .section        .gcc_except_table,\"a\",@progbits\n"
    472         // TABLE HEADER (important field is the BODY length at the end)
    473         ".LLSDACFA2:\n"
     470        ".LLSDACFA2:\n"                                                 //TABLE header
    474471        "       .byte   0xff\n"
    475472        "       .byte   0xff\n"
    476473        "       .byte   0x1\n"
    477         "       .uleb128 .LLSDACSECFA2-.LLSDACSBCFA2\n"
    478         // BODY (language specific data)
    479         // This uses language specific data and can be modified arbitrarily
    480         // We use handled area offset, handled area length,
    481         // handler landing pad offset and 1 (action code, gcc seems to use 0).
    482         ".LLSDACSBCFA2:\n"
    483         "       .uleb128 .TRYSTART-__cfaabi_ehm__try_terminate\n"
    484         "       .uleb128 .TRYEND-.TRYSTART\n"
    485         "       .uleb128 .CATCH-__cfaabi_ehm__try_terminate\n"
    486         "       .uleb128 1\n"
    487         ".LLSDACSECFA2:\n"
    488         // TABLE FOOTER
    489         "       .text\n"
    490         "       .size   __cfaabi_ehm__try_terminate, .-__cfaabi_ehm__try_terminate\n"
    491 );
    492 
    493 // Somehow this piece of helps with the resolution of debug symbols.
    494 __attribute__((unused)) static const int dummy = 0;
    495 
    496 asm (
    497         // Add a hidden symbol which points at the function.
    498         "       .hidden CFA.ref.__gcfa_personality_v0\n"
    499         "       .weak   CFA.ref.__gcfa_personality_v0\n"
    500         // No clue what this does specifically
    501         "       .section        .data.rel.local.CFA.ref.__gcfa_personality_v0,\"awG\",@progbits,CFA.ref.__gcfa_personality_v0,comdat\n"
    502         "       .align 8\n"
    503         "       .type CFA.ref.__gcfa_personality_v0, @object\n"
    504         "       .size CFA.ref.__gcfa_personality_v0, 8\n"
    505         "CFA.ref.__gcfa_personality_v0:\n"
    506 #if defined( __x86_64 )
    507         "       .quad __gcfa_personality_v0\n"
    508 #else // then __i386
    509         "   .long __gcfa_personality_v0\n"
    510 #endif
    511 );
    512 #else
    513 #error Exception Handling: unknown architecture for position independent code.
    514 #endif // __i386 || __x86_64
    515 #else // __PIC__
    516 #if defined( __i386 ) || defined( __x86_64 )
    517 asm (
    518         // HEADER
    519         ".LFECFA1:\n"
    520         "       .globl  __gcfa_personality_v0\n"
    521         "       .section        .gcc_except_table,\"a\",@progbits\n"
    522         // TABLE HEADER (important field is the BODY length at the end)
    523         ".LLSDACFA2:\n"
    524         "       .byte   0xff\n"
    525         "       .byte   0xff\n"
    526         "       .byte   0x1\n"
    527         "       .uleb128 .LLSDACSECFA2-.LLSDACSBCFA2\n"
    528         // BODY (language specific data)
    529         ".LLSDACSBCFA2:\n"
    530         //      Handled area start (relative to start of function)
    531         "       .uleb128 .TRYSTART-__cfaabi_ehm__try_terminate\n"
    532         //      Handled area length
    533         "       .uleb128 .TRYEND-.TRYSTART\n"
    534         //      Handler landing pad address (relative to start of function)
    535         "       .uleb128 .CATCH-__cfaabi_ehm__try_terminate\n"
    536         //      Action code, gcc seems to always use 0.
    537         "       .uleb128 1\n"
    538         // TABLE FOOTER
    539         ".LLSDACSECFA2:\n"
    540         "       .text\n"
     474        "       .uleb128 .LLSDACSECFA2-.LLSDACSBCFA2\n"         // BODY length
     475        // Body uses language specific data and therefore could be modified arbitrarily
     476        ".LLSDACSBCFA2:\n"                                              // BODY start
     477        "       .uleb128 .TRYSTART-__cfaabi_ehm__try_terminate\n"               // Handled area start  (relative to start of function)
     478        "       .uleb128 .TRYEND-.TRYSTART\n"                           // Handled area length
     479        "       .uleb128 .CATCH-__cfaabi_ehm__try_terminate\n"                          // Hanlder landing pad adress  (relative to start of function)
     480        "       .uleb128 1\n"                                           // Action code, gcc seems to use always 0
     481        ".LLSDACSECFA2:\n"                                              // BODY end
     482        "       .text\n"                                                        // TABLE footer
    541483        "       .size   __cfaabi_ehm__try_terminate, .-__cfaabi_ehm__try_terminate\n"
    542484        "       .ident  \"GCC: (Ubuntu 6.2.0-3ubuntu11~16.04) 6.2.0 20160901\"\n"
    543         "       .section        .note.GNU-stack,\"x\",@progbits\n"
     485//      "       .section        .note.GNU-stack,\"x\",@progbits\n"
    544486);
    545 #else
    546 #error Exception Handling: unknown architecture for position dependent code.
    547487#endif // __i386 || __x86_64
    548 #endif // __PIC__
    549 
    550 #pragma GCC pop_options
     488#endif //PIC
  • libcfa/src/executor.cfa

    r3d5701e r9fb8f01  
    88#include <stdio.h>
    99
    10 forall( dtype T )
    11 monitor Buffer {                                        // unbounded buffer
    12     __queue_t( T ) queue;                               // unbounded list of work requests
    13     condition delay;
    14 }; // Buffer
    15 forall( dtype T | is_node(T) ) {
     10forall( otype T | is_node(T) | is_monitor(T) ) {
     11    monitor Buffer {                                    // unbounded buffer
     12        __queue_t( T ) queue;                           // unbounded list of work requests
     13        condition delay;
     14    }; // Buffer
     15
    1616    void insert( Buffer( T ) & mutex buf, T * elem ) with(buf) {
    1717        append( queue, elem );                          // insert element into buffer
     
    2020
    2121    T * remove( Buffer( T ) & mutex buf ) with(buf) {
    22         if ( queue.head != 0 ) wait( delay );                   // no request to process ? => wait
    23 //      return pop_head( queue );
     22        if ( ! queue ) wait( delay );                   // no request to process ? => wait
     23        return pop_head( queue );
    2424    } // remove
    2525} // distribution
  • libcfa/src/fstream.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Feb  7 19:01:01 2020
    13 // Update Count     : 363
     12// Last Modified On : Mon Jul 15 18:11:26 2019
     13// Update Count     : 349
    1414//
    1515
     
    3232
    3333void ?{}( ofstream & os, void * file ) {
    34         os.$file = file;
    35         os.$sepDefault = true;
    36         os.$sepOnOff = false;
    37         os.$nlOnOff = true;
    38         os.$prt = false;
    39         os.$sawNL = false;
    40         $sepSetCur( os, sepGet( os ) );
     34        os.file = file;
     35        os.sepDefault = true;
     36        os.sepOnOff = false;
     37        os.nlOnOff = true;
     38        os.prt = false;
     39        os.sawNL = false;
    4140        sepSet( os, " " );
     41        sepSetCur( os, sepGet( os ) );
    4242        sepSetTuple( os, ", " );
    4343} // ?{}
    4444
    4545// private
    46 bool $sepPrt( ofstream & os ) { $setNL( os, false ); return os.$sepOnOff; }
    47 void $sepReset( ofstream & os ) { os.$sepOnOff = os.$sepDefault; }
    48 void $sepReset( ofstream & os, bool reset ) { os.$sepDefault = reset; os.$sepOnOff = os.$sepDefault; }
    49 const char * $sepGetCur( ofstream & os ) { return os.$sepCur; }
    50 void $sepSetCur( ofstream & os, const char sepCur[] ) { os.$sepCur = sepCur; }
    51 bool $getNL( ofstream & os ) { return os.$sawNL; }
    52 void $setNL( ofstream & os, bool state ) { os.$sawNL = state; }
    53 bool $getANL( ofstream & os ) { return os.$nlOnOff; }
    54 bool $getPrt( ofstream & os ) { return os.$prt; }
    55 void $setPrt( ofstream & os, bool state ) { os.$prt = state; }
     46bool sepPrt( ofstream & os ) { setNL( os, false ); return os.sepOnOff; }
     47void sepReset( ofstream & os ) { os.sepOnOff = os.sepDefault; }
     48void sepReset( ofstream & os, bool reset ) { os.sepDefault = reset; os.sepOnOff = os.sepDefault; }
     49const char * sepGetCur( ofstream & os ) { return os.sepCur; }
     50void sepSetCur( ofstream & os, const char * sepCur ) { os.sepCur = sepCur; }
     51bool getNL( ofstream & os ) { return os.sawNL; }
     52void setNL( ofstream & os, bool state ) { os.sawNL = state; }
     53bool getANL( ofstream & os ) { return os.nlOnOff; }
     54bool getPrt( ofstream & os ) { return os.prt; }
     55void setPrt( ofstream & os, bool state ) { os.prt = state; }
    5656
    5757// public
    58 void ?{}( ofstream & os ) { os.$file = 0p; }
    59 
    60 void ?{}( ofstream & os, const char name[], const char mode[] ) {
     58void ?{}( ofstream & os ) { os.file = 0; }
     59
     60void ?{}( ofstream & os, const char * name, const char * mode ) {
    6161        open( os, name, mode );
    6262} // ?{}
    6363
    64 void ?{}( ofstream & os, const char name[] ) {
     64void ?{}( ofstream & os, const char * name ) {
    6565        open( os, name, "w" );
    6666} // ?{}
    6767
    68 void ^?{}( ofstream & os ) {
    69         close( os );
    70 } // ^?{}
    71 
    72 void sepOn( ofstream & os ) { os.$sepOnOff = ! $getNL( os ); }
    73 void sepOff( ofstream & os ) { os.$sepOnOff = false; }
     68void sepOn( ofstream & os ) { os.sepOnOff = ! getNL( os ); }
     69void sepOff( ofstream & os ) { os.sepOnOff = false; }
    7470
    7571bool sepDisable( ofstream & os ) {
    76         bool temp = os.$sepDefault;
    77         os.$sepDefault = false;
    78         $sepReset( os );
     72        bool temp = os.sepDefault;
     73        os.sepDefault = false;
     74        sepReset( os );
    7975        return temp;
    8076} // sepDisable
    8177
    8278bool sepEnable( ofstream & os ) {
    83         bool temp = os.$sepDefault;
    84         os.$sepDefault = true;
    85         if ( os.$sepOnOff ) $sepReset( os );                            // start of line ?
     79        bool temp = os.sepDefault;
     80        os.sepDefault = true;
     81        if ( os.sepOnOff ) sepReset( os );                                      // start of line ?
    8682        return temp;
    8783} // sepEnable
    8884
    89 void nlOn( ofstream & os ) { os.$nlOnOff = true; }
    90 void nlOff( ofstream & os ) { os.$nlOnOff = false; }
    91 
    92 const char * sepGet( ofstream & os ) { return os.$separator; }
    93 void sepSet( ofstream & os, const char s[] ) {
     85void nlOn( ofstream & os ) { os.nlOnOff = true; }
     86void nlOff( ofstream & os ) { os.nlOnOff = false; }
     87
     88const char * sepGet( ofstream & os ) { return os.separator; }
     89void sepSet( ofstream & os, const char * s ) {
    9490        assert( s );
    95         strncpy( os.$separator, s, sepSize - 1 );
    96         os.$separator[sepSize - 1] = '\0';
     91        strncpy( os.separator, s, sepSize - 1 );
     92        os.separator[sepSize - 1] = '\0';
    9793} // sepSet
    9894
    99 const char * sepGetTuple( ofstream & os ) { return os.$tupleSeparator; }
    100 void sepSetTuple( ofstream & os, const char s[] ) {
     95const char * sepGetTuple( ofstream & os ) { return os.tupleSeparator; }
     96void sepSetTuple( ofstream & os, const char * s ) {
    10197        assert( s );
    102         strncpy( os.$tupleSeparator, s, sepSize - 1 );
    103         os.$tupleSeparator[sepSize - 1] = '\0';
     98        strncpy( os.tupleSeparator, s, sepSize - 1 );
     99        os.tupleSeparator[sepSize - 1] = '\0';
    104100} // sepSet
    105101
    106102void ends( ofstream & os ) {
    107         if ( $getANL( os ) ) nl( os );
    108         else $setPrt( os, false );                                                      // turn off
     103        if ( getANL( os ) ) nl( os );
     104        else setPrt( os, false );                                                       // turn off
    109105        if ( &os == &exit ) exit( EXIT_FAILURE );
    110106        if ( &os == &abort ) abort();
     
    112108
    113109int fail( ofstream & os ) {
    114         return os.$file == 0 || ferror( (FILE *)(os.$file) );
     110        return os.file == 0 || ferror( (FILE *)(os.file) );
    115111} // fail
    116112
    117113int flush( ofstream & os ) {
    118         return fflush( (FILE *)(os.$file) );
     114        return fflush( (FILE *)(os.file) );
    119115} // flush
    120116
    121 void open( ofstream & os, const char name[], const char mode[] ) {
     117void open( ofstream & os, const char * name, const char * mode ) {
    122118        FILE * file = fopen( name, mode );
    123119        #ifdef __CFA_DEBUG__
    124         if ( file == 0p ) {
     120        if ( file == 0 ) {
    125121                abort | IO_MSG "open output file \"" | name | "\"" | nl | strerror( errno );
    126122        } // if
     
    129125} // open
    130126
    131 void open( ofstream & os, const char name[] ) {
     127void open( ofstream & os, const char * name ) {
    132128        open( os, name, "w" );
    133129} // open
    134130
    135131void close( ofstream & os ) {
    136         if ( (FILE *)(os.$file) == stdout || (FILE *)(os.$file) == stderr ) return;
    137 
    138         if ( fclose( (FILE *)(os.$file) ) == EOF ) {
     132        if ( (FILE *)(os.file) == stdout || (FILE *)(os.file) == stderr ) return;
     133
     134        if ( fclose( (FILE *)(os.file) ) == EOF ) {
    139135                abort | IO_MSG "close output" | nl | strerror( errno );
    140136        } // if
    141137} // close
    142138
    143 ofstream & write( ofstream & os, const char data[], size_t size ) {
     139ofstream & write( ofstream & os, const char * data, size_t size ) {
    144140        if ( fail( os ) ) {
    145141                abort | IO_MSG "attempt write I/O on failed stream";
    146142        } // if
    147143
    148         if ( fwrite( data, 1, size, (FILE *)(os.$file) ) != size ) {
     144        if ( fwrite( data, 1, size, (FILE *)(os.file) ) != size ) {
    149145                abort | IO_MSG "write" | nl | strerror( errno );
    150146        } // if
     
    155151        va_list args;
    156152        va_start( args, format );
    157         int len = vfprintf( (FILE *)(os.$file), format, args );
     153        int len = vfprintf( (FILE *)(os.file), format, args );
    158154        if ( len == EOF ) {
    159                 if ( ferror( (FILE *)(os.$file) ) ) {
     155                if ( ferror( (FILE *)(os.file) ) ) {
    160156                        abort | IO_MSG "invalid write";
    161157                } // if
     
    163159        va_end( args );
    164160
    165         $setPrt( os, true );                                                            // called in output cascade
    166         $sepReset( os );                                                                        // reset separator
     161        setPrt( os, true );                                                                     // called in output cascade
     162        sepReset( os );                                                                         // reset separator
    167163        return len;
    168164} // fmt
    169165
    170 static ofstream soutFile = { (FILE *)stdout };
     166static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_) };
    171167ofstream & sout = soutFile, & stdout = soutFile;
    172 static ofstream serrFile = { (FILE *)stderr };
     168static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_) };
    173169ofstream & serr = serrFile, & stderr = serrFile;
    174170
    175 static ofstream exitFile = { (FILE *)stdout };
     171static ofstream exitFile = { (FILE *)(&_IO_2_1_stdout_) };
    176172ofstream & exit = exitFile;
    177 static ofstream abortFile = { (FILE *)stderr };
     173static ofstream abortFile = { (FILE *)(&_IO_2_1_stderr_) };
    178174ofstream & abort = abortFile;
    179175
     
    184180// private
    185181void ?{}( ifstream & is, void * file ) {
    186         is.$file = file;
    187         is.$nlOnOff = false;
     182        is.file = file;
     183        is.nlOnOff = false;
    188184} // ?{}
    189185
    190186// public
    191 void ?{}( ifstream & is ) { is.$file = 0p; }
    192 
    193 void ?{}( ifstream & is, const char name[], const char mode[] ) {
     187void ?{}( ifstream & is ) {     is.file = 0; }
     188
     189void ?{}( ifstream & is, const char * name, const char * mode ) {
    194190        open( is, name, mode );
    195191} // ?{}
    196192
    197 void ?{}( ifstream & is, const char name[] ) {
     193void ?{}( ifstream & is, const char * name ) {
    198194        open( is, name, "r" );
    199195} // ?{}
    200196
    201 void ^?{}( ifstream & is ) {
    202         close( is );
    203 } // ^?{}
    204 
    205 void nlOn( ifstream & os ) { os.$nlOnOff = true; }
    206 void nlOff( ifstream & os ) { os.$nlOnOff = false; }
    207 bool getANL( ifstream & os ) { return os.$nlOnOff; }
     197void nlOn( ifstream & os ) { os.nlOnOff = true; }
     198void nlOff( ifstream & os ) { os.nlOnOff = false; }
     199bool getANL( ifstream & os ) { return os.nlOnOff; }
    208200
    209201int fail( ifstream & is ) {
    210         return is.$file == 0p || ferror( (FILE *)(is.$file) );
     202        return is.file == 0 || ferror( (FILE *)(is.file) );
    211203} // fail
    212204
    213205int eof( ifstream & is ) {
    214         return feof( (FILE *)(is.$file) );
     206        return feof( (FILE *)(is.file) );
    215207} // eof
    216208
    217 void open( ifstream & is, const char name[], const char mode[] ) {
     209void open( ifstream & is, const char * name, const char * mode ) {
    218210        FILE * file = fopen( name, mode );
    219211        #ifdef __CFA_DEBUG__
    220         if ( file == 0p ) {
     212        if ( file == 0 ) {
    221213                abort | IO_MSG "open input file \"" | name | "\"" | nl | strerror( errno );
    222214        } // if
    223215        #endif // __CFA_DEBUG__
    224         is.$file = file;
    225 } // open
    226 
    227 void open( ifstream & is, const char name[] ) {
     216        is.file = file;
     217} // open
     218
     219void open( ifstream & is, const char * name ) {
    228220        open( is, name, "r" );
    229221} // open
    230222
    231223void close( ifstream & is ) {
    232         if ( (FILE *)(is.$file) == stdin ) return;
    233 
    234         if ( fclose( (FILE *)(is.$file) ) == EOF ) {
     224        if ( (FILE *)(is.file) == stdin ) return;
     225
     226        if ( fclose( (FILE *)(is.file) ) == EOF ) {
    235227                abort | IO_MSG "close input" | nl | strerror( errno );
    236228        } // if
     
    242234        } // if
    243235
    244         if ( fread( data, size, 1, (FILE *)(is.$file) ) == 0 ) {
     236        if ( fread( data, size, 1, (FILE *)(is.file) ) == 0 ) {
    245237                abort | IO_MSG "read" | nl | strerror( errno );
    246238        } // if
     
    253245        } // if
    254246
    255         if ( ungetc( c, (FILE *)(is.$file) ) == EOF ) {
     247        if ( ungetc( c, (FILE *)(is.file) ) == EOF ) {
    256248                abort | IO_MSG "ungetc" | nl | strerror( errno );
    257249        } // if
     
    263255
    264256        va_start( args, format );
    265         int len = vfscanf( (FILE *)(is.$file), format, args );
     257        int len = vfscanf( (FILE *)(is.file), format, args );
    266258        if ( len == EOF ) {
    267                 if ( ferror( (FILE *)(is.$file) ) ) {
     259                if ( ferror( (FILE *)(is.file) ) ) {
    268260                        abort | IO_MSG "invalid read";
    269261                } // if
     
    273265} // fmt
    274266
    275 static ifstream sinFile = { (FILE *)stdin };
     267
     268static ifstream sinFile = { (FILE *)(&_IO_2_1_stdin_) };
    276269ifstream & sin = sinFile, & stdin = sinFile;
    277270
  • libcfa/src/fstream.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Feb 17 08:29:23 2020
    13 // Update Count     : 175
     12// Last Modified On : Mon Jul 15 18:10:23 2019
     13// Update Count     : 167
    1414//
    1515
     
    2424enum { sepSize = 16 };
    2525struct ofstream {
    26         void * $file;
    27         bool $sepDefault;
    28         bool $sepOnOff;
    29         bool $nlOnOff;
    30         bool $prt;                                                                                      // print text
    31         bool $sawNL;
    32         const char * $sepCur;
    33         char $separator[sepSize];
    34         char $tupleSeparator[sepSize];
     26        void * file;
     27        bool sepDefault;
     28        bool sepOnOff;
     29        bool nlOnOff;
     30        bool prt;                                                                                       // print text
     31        bool sawNL;
     32        const char * sepCur;
     33        char separator[sepSize];
     34        char tupleSeparator[sepSize];
    3535}; // ofstream
    3636
    3737// private
    38 bool $sepPrt( ofstream & );
    39 void $sepReset( ofstream & );
    40 void $sepReset( ofstream &, bool );
    41 const char * $sepGetCur( ofstream & );
    42 void $sepSetCur( ofstream &, const char [] );
    43 bool $getNL( ofstream & );
    44 void $setNL( ofstream &, bool );
    45 bool $getANL( ofstream & );
    46 bool $getPrt( ofstream & );
    47 void $setPrt( ofstream &, bool );
     38bool sepPrt( ofstream & );
     39void sepReset( ofstream & );
     40void sepReset( ofstream &, bool );
     41const char * sepGetCur( ofstream & );
     42void sepSetCur( ofstream &, const char * );
     43bool getNL( ofstream & );
     44void setNL( ofstream &, bool );
     45bool getANL( ofstream & );
     46bool getPrt( ofstream & );
     47void setPrt( ofstream &, bool );
    4848
    4949// public
     
    5656
    5757const char * sepGet( ofstream & );
    58 void sepSet( ofstream &, const char [] );
     58void sepSet( ofstream &, const char * );
    5959const char * sepGetTuple( ofstream & );
    60 void sepSetTuple( ofstream &, const char [] );
     60void sepSetTuple( ofstream &, const char * );
    6161
    6262void ends( ofstream & os );
    6363int fail( ofstream & );
    6464int flush( ofstream & );
    65 void open( ofstream &, const char name[], const char mode[] );
    66 void open( ofstream &, const char name[] );
     65void open( ofstream &, const char * name, const char * mode );
     66void open( ofstream &, const char * name );
    6767void close( ofstream & );
    68 ofstream & write( ofstream &, const char data[], size_t size );
    69 int fmt( ofstream &, const char format[], ... ) __attribute__(( format(printf, 2, 3) ));
     68ofstream & write( ofstream &, const char * data, size_t size );
     69int fmt( ofstream &, const char format[], ... );
    7070
    7171void ?{}( ofstream & os );
    72 void ?{}( ofstream & os, const char name[], const char mode[] );
    73 void ?{}( ofstream & os, const char name[] );
    74 void ^?{}( ofstream & os );
     72void ?{}( ofstream & os, const char * name, const char * mode );
     73void ?{}( ofstream & os, const char * name );
    7574
    7675extern ofstream & sout, & stdout, & serr, & stderr;             // aliases
     
    8281
    8382struct ifstream {
    84         void * $file;
    85         bool $nlOnOff;
     83        void * file;
     84        bool nlOnOff;
    8685}; // ifstream
    8786
     
    9291int fail( ifstream & is );
    9392int eof( ifstream & is );
    94 void open( ifstream & is, const char name[], const char mode[] );
    95 void open( ifstream & is, const char name[] );
     93void open( ifstream & is, const char * name, const char * mode );
     94void open( ifstream & is, const char * name );
    9695void close( ifstream & is );
    9796ifstream & read( ifstream & is, char * data, size_t size );
    9897ifstream & ungetc( ifstream & is, char c );
    99 int fmt( ifstream &, const char format[], ... ) __attribute__(( format(scanf, 2, 3) ));
     98int fmt( ifstream &, const char format[], ... );
    10099
    101100void ?{}( ifstream & is );
    102 void ?{}( ifstream & is, const char name[], const char mode[] );
    103 void ?{}( ifstream & is, const char name[] );
    104 void ^?{}( ifstream & is );
     101void ?{}( ifstream & is, const char * name, const char * mode );
     102void ?{}( ifstream & is, const char * name );
    105103
    106104extern ifstream & sin, & stdin;                                                 // aliases
  • libcfa/src/gmp.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Apr 19 08:43:43 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Feb  9 09:56:54 2020
    13 // Update Count     : 31
     12// Last Modified On : Sat Jul 13 15:25:05 2019
     13// Update Count     : 27
    1414//
    1515
     
    2424
    2525static inline {
    26         // constructor, zero_t/one_t are unnecessary because of relationship with signed/unsigned int
     26        // constructor
    2727        void ?{}( Int & this ) { mpz_init( this.mpz ); }
    2828        void ?{}( Int & this, Int init ) { mpz_init_set( this.mpz, init.mpz ); }
     29        void ?{}( Int & this, zero_t ) { mpz_init_set_si( this.mpz, 0 ); }
     30        void ?{}( Int & this, one_t ) { mpz_init_set_si( this.mpz, 1 ); }
    2931        void ?{}( Int & this, signed long int init ) { mpz_init_set_si( this.mpz, init ); }
    3032        void ?{}( Int & this, unsigned long int init ) { mpz_init_set_ui( this.mpz, init ); }
    31         void ?{}( Int & this, const char val[] ) { if ( mpz_init_set_str( this.mpz, val, 0 ) ) abort(); }
     33        void ?{}( Int & this, const char * val ) { if ( mpz_init_set_str( this.mpz, val, 0 ) ) abort(); }
    3234        void ^?{}( Int & this ) { mpz_clear( this.mpz ); }
    3335
     
    3537        Int ?`mp( signed long int init ) { return (Int){ init }; }
    3638        Int ?`mp( unsigned long int init ) { return (Int){ init }; }
    37         Int ?`mp( const char init[] ) { return (Int){ init }; }
     39        Int ?`mp( const char * init ) { return (Int){ init }; }
    3840
    3941        // assignment
     
    4143        Int ?=?( Int & lhs, long int rhs ) { mpz_set_si( lhs.mpz, rhs ); return lhs; }
    4244        Int ?=?( Int & lhs, unsigned long int rhs ) { mpz_set_ui( lhs.mpz, rhs ); return lhs; }
    43         Int ?=?( Int & lhs, const char rhs[] ) { if ( mpz_set_str( lhs.mpz, rhs, 0 ) ) { abort | "invalid string conversion"; } return lhs; }
     45        Int ?=?( Int & lhs, const char * rhs ) { if ( mpz_set_str( lhs.mpz, rhs, 0 ) ) { abort | "invalid string conversion"; } return lhs; }
    4446
    4547        char ?=?( char & lhs, Int rhs ) { char val = mpz_get_si( rhs.mpz ); lhs = val; return lhs; }
     
    263265        forall( dtype ostype | ostream( ostype ) ) {
    264266                ostype & ?|?( ostype & os, Int mp ) {
    265                         if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     267                        if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    266268                        gmp_printf( "%Zd", mp.mpz );
    267269                        sepOn( os );
  • libcfa/src/heap.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Dec 19 21:58:35 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 10:04:51 2020
    13 // Update Count     : 648
     12// Last Modified On : Wed Jul 24 13:12:45 2019
     13// Update Count     : 550
    1414//
    1515
     
    1818#include <stdio.h>                                                                              // snprintf, fileno
    1919#include <errno.h>                                                                              // errno
    20 #include <string.h>                                                                             // memset, memcpy
    2120extern "C" {
    2221#include <sys/mman.h>                                                                   // mmap, munmap
     
    2827#include "bits/locks.hfa"                                                               // __spinlock_t
    2928#include "startup.hfa"                                                                  // STARTUP_PRIORITY_MEMORY
    30 //#include "stdlib.hfa"                                                                 // bsearchl
     29#include "stdlib.hfa"                                                                   // bsearchl
    3130#include "malloc.h"
    3231
    33 #define MIN(x, y) (y > x ? x : y)
    3432
    3533static bool traceHeap = false;
    3634
    37 inline bool traceHeap() { return traceHeap; }
     35inline bool traceHeap() {
     36        return traceHeap;
     37} // traceHeap
    3838
    3939bool traceHeapOn() {
     
    4949} // traceHeapOff
    5050
    51 bool traceHeapTerm() { return false; }
    52 
    53 
    54 static bool prtFree = false;
    55 
    56 inline bool prtFree() {
    57         return prtFree;
    58 } // prtFree
    59 
    60 bool prtFreeOn() {
    61         bool temp = prtFree;
    62         prtFree = true;
     51
     52static bool checkFree = false;
     53
     54inline bool checkFree() {
     55        return checkFree;
     56} // checkFree
     57
     58bool checkFreeOn() {
     59        bool temp = checkFree;
     60        checkFree = true;
    6361        return temp;
    64 } // prtFreeOn
    65 
    66 bool prtFreeOff() {
    67         bool temp = prtFree;
    68         prtFree = false;
     62} // checkFreeOn
     63
     64bool checkFreeOff() {
     65        bool temp = checkFree;
     66        checkFree = false;
    6967        return temp;
    70 } // prtFreeOff
     68} // checkFreeOff
     69
     70
     71// static bool traceHeapTerm = false;
     72
     73// inline bool traceHeapTerm() {
     74//      return traceHeapTerm;
     75// } // traceHeapTerm
     76
     77// bool traceHeapTermOn() {
     78//      bool temp = traceHeapTerm;
     79//      traceHeapTerm = true;
     80//      return temp;
     81// } // traceHeapTermOn
     82
     83// bool traceHeapTermOff() {
     84//      bool temp = traceHeapTerm;
     85//      traceHeapTerm = false;
     86//      return temp;
     87// } // traceHeapTermOff
    7188
    7289
    7390enum {
    74         // Define the default extension heap amount in units of bytes. When the uC++ supplied heap reaches the brk address,
    75         // the brk address is extended by the extension amount.
     91        __CFA_DEFAULT_MMAP_START__ = (512 * 1024 + 1),
    7692        __CFA_DEFAULT_HEAP_EXPANSION__ = (1 * 1024 * 1024),
    77 
    78         // Define the mmap crossover point during allocation. Allocations less than this amount are allocated from buckets;
    79         // values greater than or equal to this value are mmap from the operating system.
    80         __CFA_DEFAULT_MMAP_START__ = (512 * 1024 + 1),
    8193};
    8294
     
    93105static unsigned int allocFree;                                                  // running total of allocations minus frees
    94106
    95 static void prtUnfreed() {
     107static void checkUnfreed() {
    96108        if ( allocFree != 0 ) {
    97109                // DO NOT USE STREAMS AS THEY MAY BE UNAVAILABLE AT THIS POINT.
    98                 char helpText[512];
    99                 int len = snprintf( helpText, sizeof(helpText), "CFA warning (UNIX pid:%ld) : program terminating with %u(0x%x) bytes of storage allocated but not freed.\n"
    100                                                         "Possible cause is unfreed storage allocated by the program or system/library routines called from the program.\n",
    101                                                         (long int)getpid(), allocFree, allocFree ); // always print the UNIX pid
    102                 __cfaabi_bits_write( STDERR_FILENO, helpText, len ); // print debug/nodebug
    103         } // if
    104 } // prtUnfreed
     110                // char helpText[512];
     111                // int len = snprintf( helpText, sizeof(helpText), "CFA warning (UNIX pid:%ld) : program terminating with %u(0x%x) bytes of storage allocated but not freed.\n"
     112                //                                      "Possible cause is unfreed storage allocated by the program or system/library routines called from the program.\n",
     113                //                                      (long int)getpid(), allocFree, allocFree ); // always print the UNIX pid
     114                // __cfaabi_dbg_bits_write( helpText, len );
     115        } // if
     116} // checkUnfreed
    105117
    106118extern "C" {
     
    111123        void heapAppStop() {                                                            // called by __cfaabi_appready_startdown
    112124                fclose( stdin ); fclose( stdout );
    113                 prtUnfreed();
     125                checkUnfreed();
    114126        } // heapAppStop
    115127} // extern "C"
    116128#endif // __CFA_DEBUG__
    117 
    118129
    119130// statically allocated variables => zero filled.
     
    123134static unsigned int maxBucketsUsed;                                             // maximum number of buckets in use
    124135
     136
     137// #comment TD : This defined is significantly different from the __ALIGN__ define from locks.hfa
     138#define ALIGN 16
    125139
    126140#define SPINLOCK 0
     
    133147// Recursive definitions: HeapManager needs size of bucket array and bucket area needs sizeof HeapManager storage.
    134148// Break recusion by hardcoding number of buckets and statically checking number is correct after bucket array defined.
    135 enum { NoBucketSizes = 91 };                                                    // number of buckets sizes
     149enum { NoBucketSizes = 93 };                                                    // number of buckets sizes
    136150
    137151struct HeapManager {
     
    180194                        } kind; // Kind
    181195                } header; // Header
    182                 char pad[libAlign() - sizeof( Header )];
     196                char pad[ALIGN - sizeof( Header )];
    183197                char data[0];                                                                   // storage
    184198        }; // Storage
    185199
    186         static_assert( libAlign() >= sizeof( Storage ), "libAlign() < sizeof( Storage )" );
     200        static_assert( ALIGN >= sizeof( Storage ), "ALIGN < sizeof( Storage )" );
    187201
    188202        struct FreeHeader {
     
    214228#define __STATISTICS__
    215229
    216 // Bucket size must be multiple of 16.
    217230// Powers of 2 are common allocation sizes, so make powers of 2 generate the minimum required size.
    218231static const unsigned int bucketSizes[] @= {                    // different bucket sizes
    219         16, 32, 48, 64 + sizeof(HeapManager.Storage), // 4
    220         96, 112, 128 + sizeof(HeapManager.Storage), // 3
    221         160, 192, 224, 256 + sizeof(HeapManager.Storage), // 4
    222         320, 384, 448, 512 + sizeof(HeapManager.Storage), // 4
    223         640, 768, 896, 1_024 + sizeof(HeapManager.Storage), // 4
    224         1_536, 2_048 + sizeof(HeapManager.Storage), // 2
    225         2_560, 3_072, 3_584, 4_096 + sizeof(HeapManager.Storage), // 4
    226         6_144, 8_192 + sizeof(HeapManager.Storage), // 2
    227         9_216, 10_240, 11_264, 12_288, 13_312, 14_336, 15_360, 16_384 + sizeof(HeapManager.Storage), // 8
    228         18_432, 20_480, 22_528, 24_576, 26_624, 28_672, 30_720, 32_768 + sizeof(HeapManager.Storage), // 8
    229         36_864, 40_960, 45_056, 49_152, 53_248, 57_344, 61_440, 65_536 + sizeof(HeapManager.Storage), // 8
    230         73_728, 81_920, 90_112, 98_304, 106_496, 114_688, 122_880, 131_072 + sizeof(HeapManager.Storage), // 8
    231         147_456, 163_840, 180_224, 196_608, 212_992, 229_376, 245_760, 262_144 + sizeof(HeapManager.Storage), // 8
    232         294_912, 327_680, 360_448, 393_216, 425_984, 458_752, 491_520, 524_288 + sizeof(HeapManager.Storage), // 8
    233         655_360, 786_432, 917_504, 1_048_576 + sizeof(HeapManager.Storage), // 4
    234         1_179_648, 1_310_720, 1_441_792, 1_572_864, 1_703_936, 1_835_008, 1_966_080, 2_097_152 + sizeof(HeapManager.Storage), // 8
    235         2_621_440, 3_145_728, 3_670_016, 4_194_304 + sizeof(HeapManager.Storage), // 4
     232        16, 32, 48, 64,
     233        64 + sizeof(HeapManager.Storage), 96, 112, 128, 128 + sizeof(HeapManager.Storage), 160, 192, 224,
     234        256 + sizeof(HeapManager.Storage), 320, 384, 448, 512 + sizeof(HeapManager.Storage), 640, 768, 896,
     235        1_024 + sizeof(HeapManager.Storage), 1_536, 2_048 + sizeof(HeapManager.Storage), 2_560, 3_072, 3_584, 4_096 + sizeof(HeapManager.Storage), 6_144,
     236        8_192 + sizeof(HeapManager.Storage), 9_216, 10_240, 11_264, 12_288, 13_312, 14_336, 15_360,
     237        16_384 + sizeof(HeapManager.Storage), 18_432, 20_480, 22_528, 24_576, 26_624, 28_672, 30_720,
     238        32_768 + sizeof(HeapManager.Storage), 36_864, 40_960, 45_056, 49_152, 53_248, 57_344, 61_440,
     239        65_536 + sizeof(HeapManager.Storage), 73_728, 81_920, 90_112, 98_304, 106_496, 114_688, 122_880,
     240        131_072 + sizeof(HeapManager.Storage), 147_456, 163_840, 180_224, 196_608, 212_992, 229_376, 245_760,
     241        262_144 + sizeof(HeapManager.Storage), 294_912, 327_680, 360_448, 393_216, 425_984, 458_752, 491_520,
     242        524_288 + sizeof(HeapManager.Storage), 655_360, 786_432, 917_504, 1_048_576 + sizeof(HeapManager.Storage), 1_179_648, 1_310_720, 1_441_792,
     243        1_572_864, 1_703_936, 1_835_008, 1_966_080, 2_097_152 + sizeof(HeapManager.Storage), 2_621_440, 3_145_728, 3_670_016,
     244        4_194_304 + sizeof(HeapManager.Storage)
    236245};
    237246
     
    242251static unsigned char lookup[LookupSizes];                               // O(1) lookup for small sizes
    243252#endif // FASTLOOKUP
    244 
    245253static int mmapFd = -1;                                                                 // fake or actual fd for anonymous file
     254
     255
    246256#ifdef __CFA_DEBUG__
    247257static bool heapBoot = 0;                                                               // detect recursion during boot
     
    249259static HeapManager heapManager __attribute__(( aligned (128) )) @= {}; // size of cache line to prevent false sharing
    250260
     261// #comment TD : The return type of this function should be commented
     262static inline bool setMmapStart( size_t value ) {
     263  if ( value < pageSize || bucketSizes[NoBucketSizes - 1] < value ) return true;
     264        mmapStart = value;                                                                      // set global
     265
     266        // find the closest bucket size less than or equal to the mmapStart size
     267        maxBucketsUsed = bsearchl( (unsigned int)mmapStart, bucketSizes, NoBucketSizes ); // binary search
     268        assert( maxBucketsUsed < NoBucketSizes );                       // subscript failure ?
     269        assert( mmapStart <= bucketSizes[maxBucketsUsed] ); // search failure ?
     270        return false;
     271} // setMmapStart
     272
     273
     274static void ?{}( HeapManager & manager ) with ( manager ) {
     275        pageSize = sysconf( _SC_PAGESIZE );
     276
     277        for ( unsigned int i = 0; i < NoBucketSizes; i += 1 ) { // initialize the free lists
     278                freeLists[i].blockSize = bucketSizes[i];
     279        } // for
     280
     281        #ifdef FASTLOOKUP
     282        unsigned int idx = 0;
     283        for ( unsigned int i = 0; i < LookupSizes; i += 1 ) {
     284                if ( i > bucketSizes[idx] ) idx += 1;
     285                lookup[i] = idx;
     286        } // for
     287        #endif // FASTLOOKUP
     288
     289        if ( setMmapStart( default_mmap_start() ) ) {
     290                abort( "HeapManager : internal error, mmap start initialization failure." );
     291        } // if
     292        heapExpand = default_heap_expansion();
     293
     294        char * End = (char *)sbrk( 0 );
     295        sbrk( (char *)libCeiling( (long unsigned int)End, libAlign() ) - End ); // move start of heap to multiple of alignment
     296        heapBegin = heapEnd = sbrk( 0 );                                        // get new start point
     297} // HeapManager
     298
     299
     300static void ^?{}( HeapManager & ) {
     301        #ifdef __STATISTICS__
     302        // if ( traceHeapTerm() ) {
     303        //      printStats();
     304        //      if ( checkfree() ) checkFree( heapManager, true );
     305        // } // if
     306        #endif // __STATISTICS__
     307} // ~HeapManager
     308
     309
     310static void memory_startup( void ) __attribute__(( constructor( STARTUP_PRIORITY_MEMORY ) ));
     311void memory_startup( void ) {
     312        #ifdef __CFA_DEBUG__
     313        if ( unlikely( heapBoot ) ) {                                           // check for recursion during system boot
     314                // DO NOT USE STREAMS AS THEY MAY BE UNAVAILABLE AT THIS POINT.
     315                abort( "boot() : internal error, recursively invoked during system boot." );
     316        } // if
     317        heapBoot = true;
     318        #endif // __CFA_DEBUG__
     319
     320        //assert( heapManager.heapBegin != 0 );
     321        //heapManager{};
     322        if ( heapManager.heapBegin == 0 ) heapManager{};
     323} // memory_startup
     324
     325static void memory_shutdown( void ) __attribute__(( destructor( STARTUP_PRIORITY_MEMORY ) ));
     326void memory_shutdown( void ) {
     327        ^heapManager{};
     328} // memory_shutdown
     329
    251330
    252331#ifdef __STATISTICS__
    253 // Heap statistics counters.
    254 static unsigned long long int mmap_storage;
     332static unsigned long long int mmap_storage;                             // heap statistics counters
    255333static unsigned int mmap_calls;
    256334static unsigned long long int munmap_storage;
     
    270348static unsigned long long int realloc_storage;
    271349static unsigned int realloc_calls;
    272 // Statistics file descriptor (changed by malloc_stats_fd).
    273 static int statfd = STDERR_FILENO;                                              // default stderr
     350
     351static int statfd;                                                                              // statistics file descriptor (changed by malloc_stats_fd)
     352
    274353
    275354// Use "write" because streams may be shutdown when calls are made.
    276355static void printStats() {
    277356        char helpText[512];
    278         __cfaabi_bits_print_buffer( STDERR_FILENO, helpText, sizeof(helpText),
     357        __cfaabi_dbg_bits_print_buffer( helpText, sizeof(helpText),
    279358                                                                        "\nHeap statistics:\n"
    280359                                                                        "  malloc: calls %u / storage %llu\n"
     
    326405                                                sbrk_calls, sbrk_storage
    327406                );
    328         __cfaabi_bits_write( fileno( stream ), helpText, len ); // ensures all bytes written or exit
    329         return len;
     407        return write( fileno( stream ), helpText, len );        // -1 => error
    330408} // printStatsXML
    331409#endif // __STATISTICS__
    332410
    333 
    334 // static inline void noMemory() {
    335 //      abort( "Heap memory exhausted at %zu bytes.\n"
    336 //                 "Possible cause is very large memory allocation and/or large amount of unfreed storage allocated by the program or system/library routines.",
    337 //                 ((char *)(sbrk( 0 )) - (char *)(heapManager.heapBegin)) );
    338 // } // noMemory
     411// #comment TD : Is this the samething as Out-of-Memory?
     412static inline void noMemory() {
     413        abort( "Heap memory exhausted at %zu bytes.\n"
     414                   "Possible cause is very large memory allocation and/or large amount of unfreed storage allocated by the program or system/library routines.",
     415                   ((char *)(sbrk( 0 )) - (char *)(heapManager.heapBegin)) );
     416} // noMemory
    339417
    340418
    341419static inline void checkAlign( size_t alignment ) {
    342         if ( alignment < libAlign() || ! libPow2( alignment ) ) {
    343                 abort( "Alignment %zu for memory allocation is less than %d and/or not a power of 2.", alignment, libAlign() );
     420        if ( alignment < sizeof(void *) || ! libPow2( alignment ) ) {
     421                abort( "Alignment %zu for memory allocation is less than sizeof(void *) and/or not a power of 2.", alignment );
    344422        } // if
    345423} // checkAlign
     
    353431
    354432
    355 // thunk problem
     433static inline void checkHeader( bool check, const char * name, void * addr ) {
     434        if ( unlikely( check ) ) {                                                      // bad address ?
     435                abort( "Attempt to %s storage %p with address outside the heap.\n"
     436                           "Possible cause is duplicate free on same block or overwriting of memory.",
     437                           name, addr );
     438        } // if
     439} // checkHeader
     440
     441// #comment TD : function should be commented and/or have a more evocative name
     442//               this isn't either a check or a constructor which is what I would expect this function to be
     443static inline void fakeHeader( HeapManager.Storage.Header *& header, size_t & size, size_t & alignment ) {
     444        if ( unlikely( (header->kind.fake.alignment & 1) == 1 ) ) { // fake header ?
     445                size_t offset = header->kind.fake.offset;
     446                alignment = header->kind.fake.alignment & -2;   // remove flag from value
     447                #ifdef __CFA_DEBUG__
     448                checkAlign( alignment );                                                // check alignment
     449                #endif // __CFA_DEBUG__
     450                header = (HeapManager.Storage.Header *)((char *)header - offset);
     451        } // if
     452} // fakeHeader
     453
     454// #comment TD : Why is this a define
     455#define headerAddr( addr ) ((HeapManager.Storage.Header *)( (char *)addr - sizeof(HeapManager.Storage) ))
     456
     457static inline bool headers( const char * name, void * addr, HeapManager.Storage.Header *& header, HeapManager.FreeHeader *& freeElem, size_t & size, size_t & alignment ) with ( heapManager ) {
     458        header = headerAddr( addr );
     459
     460        if ( unlikely( heapEnd < addr ) ) {                                     // mmapped ?
     461                fakeHeader( header, size, alignment );
     462                size = header->kind.real.blockSize & -3;                // mmap size
     463                return true;
     464        } // if
     465
     466        #ifdef __CFA_DEBUG__
     467        checkHeader( addr < heapBegin || header < (HeapManager.Storage.Header *)heapBegin, name, addr ); // bad low address ?
     468        #endif // __CFA_DEBUG__
     469
     470        // #comment TD : This code looks weird...
     471        //               It's called as the first statement of both branches of the last if, with the same parameters in all cases
     472
     473        // header may be safe to dereference
     474        fakeHeader( header, size, alignment );
     475        #ifdef __CFA_DEBUG__
     476        checkHeader( header < (HeapManager.Storage.Header *)heapBegin || (HeapManager.Storage.Header *)heapEnd < header, name, addr ); // bad address ? (offset could be + or -)
     477        #endif // __CFA_DEBUG__
     478
     479        freeElem = (HeapManager.FreeHeader *)((size_t)header->kind.real.home & -3);
     480        #ifdef __CFA_DEBUG__
     481        if ( freeElem < &freeLists[0] || &freeLists[NoBucketSizes] <= freeElem ) {
     482                abort( "Attempt to %s storage %p with corrupted header.\n"
     483                           "Possible cause is duplicate free on same block or overwriting of header information.",
     484                           name, addr );
     485        } // if
     486        #endif // __CFA_DEBUG__
     487        size = freeElem->blockSize;
     488        return false;
     489} // headers
     490
     491
     492static inline void * extend( size_t size ) with ( heapManager ) {
     493        lock( extlock __cfaabi_dbg_ctx2 );
     494        ptrdiff_t rem = heapRemaining - size;
     495        if ( rem < 0 ) {
     496                // If the size requested is bigger than the current remaining storage, increase the size of the heap.
     497
     498                size_t increase = libCeiling( size > heapExpand ? size : heapExpand, libAlign() );
     499                if ( sbrk( increase ) == (void *)-1 ) {
     500                        unlock( extlock );
     501                        errno = ENOMEM;
     502                        return 0;
     503                } // if
     504                #ifdef __STATISTICS__
     505                sbrk_calls += 1;
     506                sbrk_storage += increase;
     507                #endif // __STATISTICS__
     508                #ifdef __CFA_DEBUG__
     509                // Set new memory to garbage so subsequent uninitialized usages might fail.
     510                memset( (char *)heapEnd + heapRemaining, '\377', increase );
     511                #endif // __CFA_DEBUG__
     512                rem = heapRemaining + increase - size;
     513        } // if
     514
     515        HeapManager.Storage * block = (HeapManager.Storage *)heapEnd;
     516        heapRemaining = rem;
     517        heapEnd = (char *)heapEnd + size;
     518        unlock( extlock );
     519        return block;
     520} // extend
     521
     522
    356523size_t Bsearchl( unsigned int key, const unsigned int * vals, size_t dim ) {
    357524        size_t l = 0, m, h = dim;
     
    368535
    369536
    370 static inline bool setMmapStart( size_t value ) {               // true => mmapped, false => sbrk
    371   if ( value < pageSize || bucketSizes[NoBucketSizes - 1] < value ) return true;
    372         mmapStart = value;                                                                      // set global
    373 
    374         // find the closest bucket size less than or equal to the mmapStart size
    375         maxBucketsUsed = Bsearchl( (unsigned int)mmapStart, bucketSizes, NoBucketSizes ); // binary search
    376         assert( maxBucketsUsed < NoBucketSizes );                       // subscript failure ?
    377         assert( mmapStart <= bucketSizes[maxBucketsUsed] ); // search failure ?
    378         return false;
    379 } // setMmapStart
    380 
    381 
    382 static inline void checkHeader( bool check, const char name[], void * addr ) {
    383         if ( unlikely( check ) ) {                                                      // bad address ?
    384                 abort( "Attempt to %s storage %p with address outside the heap.\n"
    385                            "Possible cause is duplicate free on same block or overwriting of memory.",
    386                            name, addr );
    387         } // if
    388 } // checkHeader
    389 
    390 
    391 static inline void fakeHeader( HeapManager.Storage.Header *& header, size_t & alignment ) {
    392         if ( unlikely( (header->kind.fake.alignment & 1) == 1 ) ) { // fake header ?
    393                 size_t offset = header->kind.fake.offset;
    394                 alignment = header->kind.fake.alignment & -2;   // remove flag from value
    395                 #ifdef __CFA_DEBUG__
    396                 checkAlign( alignment );                                                // check alignment
    397                 #endif // __CFA_DEBUG__
    398                 header = (HeapManager.Storage.Header *)((char *)header - offset);
    399         } // if
    400 } // fakeHeader
    401 
    402 
    403 // <-------+----------------------------------------------------> bsize (bucket size)
    404 // |header |addr
    405 //==================================================================================
    406 //                                | alignment
    407 // <-----------------<------------+-----------------------------> bsize (bucket size)
    408 //                   |fake-header | addr
    409 #define headerAddr( addr ) ((HeapManager.Storage.Header *)( (char *)addr - sizeof(HeapManager.Storage) ))
    410 
    411 // <-------<<--------------------- dsize ---------------------->> bsize (bucket size)
    412 // |header |addr
    413 //==================================================================================
    414 //                                | alignment
    415 // <------------------------------<<---------- dsize --------->>> bsize (bucket size)
    416 //                   |fake-header |addr
    417 #define dataStorage( bsize, addr, header ) (bsize - ( (char *)addr - (char *)header ))
    418 
    419 
    420 static inline bool headers( const char name[] __attribute__(( unused )), void * addr, HeapManager.Storage.Header *& header, HeapManager.FreeHeader *& freeElem, size_t & size, size_t & alignment ) with ( heapManager ) {
    421         header = headerAddr( addr );
    422 
    423         if ( unlikely( heapEnd < addr ) ) {                                     // mmapped ?
    424                 fakeHeader( header, alignment );
    425                 size = header->kind.real.blockSize & -3;                // mmap size
    426                 return true;
    427         } // if
    428 
    429         #ifdef __CFA_DEBUG__
    430         checkHeader( addr < heapBegin || header < (HeapManager.Storage.Header *)heapBegin, name, addr ); // bad low address ?
    431         #endif // __CFA_DEBUG__
    432 
    433         // header may be safe to dereference
    434         fakeHeader( header, alignment );
    435         #ifdef __CFA_DEBUG__
    436         checkHeader( header < (HeapManager.Storage.Header *)heapBegin || (HeapManager.Storage.Header *)heapEnd < header, name, addr ); // bad address ? (offset could be + or -)
    437         #endif // __CFA_DEBUG__
    438 
    439         freeElem = (HeapManager.FreeHeader *)((size_t)header->kind.real.home & -3);
    440         #ifdef __CFA_DEBUG__
    441         if ( freeElem < &freeLists[0] || &freeLists[NoBucketSizes] <= freeElem ) {
    442                 abort( "Attempt to %s storage %p with corrupted header.\n"
    443                            "Possible cause is duplicate free on same block or overwriting of header information.",
    444                            name, addr );
    445         } // if
    446         #endif // __CFA_DEBUG__
    447         size = freeElem->blockSize;
    448         return false;
    449 } // headers
    450 
    451 
    452 static inline void * extend( size_t size ) with ( heapManager ) {
    453         lock( extlock __cfaabi_dbg_ctx2 );
    454         ptrdiff_t rem = heapRemaining - size;
    455         if ( rem < 0 ) {
    456                 // If the size requested is bigger than the current remaining storage, increase the size of the heap.
    457 
    458                 size_t increase = libCeiling( size > heapExpand ? size : heapExpand, libAlign() );
    459                 if ( sbrk( increase ) == (void *)-1 ) {
    460                         unlock( extlock );
    461                         errno = ENOMEM;
    462                         return 0p;
    463                 } // if
    464                 #ifdef __STATISTICS__
    465                 sbrk_calls += 1;
    466                 sbrk_storage += increase;
    467                 #endif // __STATISTICS__
    468                 #ifdef __CFA_DEBUG__
    469                 // Set new memory to garbage so subsequent uninitialized usages might fail.
    470                 memset( (char *)heapEnd + heapRemaining, '\377', increase );
    471                 #endif // __CFA_DEBUG__
    472                 rem = heapRemaining + increase - size;
    473         } // if
    474 
    475         HeapManager.Storage * block = (HeapManager.Storage *)heapEnd;
    476         heapRemaining = rem;
    477         heapEnd = (char *)heapEnd + size;
    478         unlock( extlock );
    479         return block;
    480 } // extend
    481 
    482 
    483537static inline void * doMalloc( size_t size ) with ( heapManager ) {
    484538        HeapManager.Storage * block;                                            // pointer to new block of storage
     
    487541        // along with the block and is a multiple of the alignment size.
    488542
    489   if ( unlikely( size > ~0ul - sizeof(HeapManager.Storage) ) ) return 0p;
    490543        size_t tsize = size + sizeof(HeapManager.Storage);
    491544        if ( likely( tsize < mmapStart ) ) {                            // small size => sbrk
     
    520573                block = freeElem->freeList.pop();
    521574                #endif // SPINLOCK
    522                 if ( unlikely( block == 0p ) ) {                                // no free block ?
     575                if ( unlikely( block == 0 ) ) {                                 // no free block ?
    523576                        #if defined( SPINLOCK )
    524577                        unlock( freeElem->lock );
     
    529582
    530583                        block = (HeapManager.Storage *)extend( tsize ); // mutual exclusion on call
    531   if ( unlikely( block == 0p ) ) return 0p;
    532                 #if defined( SPINLOCK )
     584  if ( unlikely( block == 0 ) ) return 0;
     585                        #if defined( SPINLOCK )
    533586                } else {
    534587                        freeElem->freeList = block->header.kind.real.next;
    535588                        unlock( freeElem->lock );
    536                 #endif // SPINLOCK
     589                        #endif // SPINLOCK
    537590                } // if
    538591
    539592                block->header.kind.real.home = freeElem;                // pointer back to free list of apropriate size
    540593        } else {                                                                                        // large size => mmap
    541   if ( unlikely( size > ~0ul - pageSize ) ) return 0p;
    542594                tsize = libCeiling( tsize, pageSize );                  // must be multiple of page size
    543595                #ifdef __STATISTICS__
     
    557609        } // if
    558610
    559         void * addr = &(block->data);                                           // adjust off header to user bytes
     611        void * area = &(block->data);                                           // adjust off header to user bytes
    560612
    561613        #ifdef __CFA_DEBUG__
    562         assert( ((uintptr_t)addr & (libAlign() - 1)) == 0 ); // minimum alignment ?
     614        assert( ((uintptr_t)area & (libAlign() - 1)) == 0 ); // minimum alignment ?
    563615        __atomic_add_fetch( &allocFree, tsize, __ATOMIC_SEQ_CST );
    564616        if ( traceHeap() ) {
    565617                enum { BufferSize = 64 };
    566618                char helpText[BufferSize];
    567                 int len = snprintf( helpText, BufferSize, "%p = Malloc( %zu ) (allocated %zu)\n", addr, size, tsize );
    568                 // int len = snprintf( helpText, BufferSize, "Malloc %p %zu\n", addr, size );
    569                 __cfaabi_bits_write( STDERR_FILENO, helpText, len ); // print debug/nodebug
     619                int len = snprintf( helpText, BufferSize, "%p = Malloc( %zu ) (allocated %zu)\n", area, size, tsize );
     620                // int len = snprintf( helpText, BufferSize, "Malloc %p %zu\n", area, size );
     621                __cfaabi_dbg_bits_write( helpText, len );
    570622        } // if
    571623        #endif // __CFA_DEBUG__
    572624
    573         return addr;
     625        return area;
    574626} // doMalloc
    575627
     
    577629static inline void doFree( void * addr ) with ( heapManager ) {
    578630        #ifdef __CFA_DEBUG__
    579         if ( unlikely( heapManager.heapBegin == 0p ) ) {
     631        if ( unlikely( heapManager.heapBegin == 0 ) ) {
    580632                abort( "doFree( %p ) : internal error, called before heap is initialized.", addr );
    581633        } // if
     
    623675                char helpText[BufferSize];
    624676                int len = snprintf( helpText, sizeof(helpText), "Free( %p ) size:%zu\n", addr, size );
    625                 __cfaabi_bits_write( STDERR_FILENO, helpText, len ); // print debug/nodebug
     677                __cfaabi_dbg_bits_write( helpText, len );
    626678        } // if
    627679        #endif // __CFA_DEBUG__
     
    629681
    630682
    631 size_t prtFree( HeapManager & manager ) with ( manager ) {
     683size_t checkFree( HeapManager & manager ) with ( manager ) {
    632684        size_t total = 0;
    633685        #ifdef __STATISTICS__
    634         __cfaabi_bits_acquire();
    635         __cfaabi_bits_print_nolock( STDERR_FILENO, "\nBin lists (bin size : free blocks on list)\n" );
     686        __cfaabi_dbg_bits_acquire();
     687        __cfaabi_dbg_bits_print_nolock( "\nBin lists (bin size : free blocks on list)\n" );
    636688        #endif // __STATISTICS__
    637689        for ( unsigned int i = 0; i < maxBucketsUsed; i += 1 ) {
     
    642694
    643695                #if defined( SPINLOCK )
    644                 for ( HeapManager.Storage * p = freeLists[i].freeList; p != 0p; p = p->header.kind.real.next ) {
     696                for ( HeapManager.Storage * p = freeLists[i].freeList; p != 0; p = p->header.kind.real.next ) {
    645697                #else
    646                 for ( HeapManager.Storage * p = freeLists[i].freeList.top(); p != 0p; p = p->header.kind.real.next.top ) {
     698                for ( HeapManager.Storage * p = freeLists[i].freeList.top(); p != 0; p = p->header.kind.real.next.top ) {
    647699                #endif // SPINLOCK
    648700                        total += size;
     
    653705
    654706                #ifdef __STATISTICS__
    655                 __cfaabi_bits_print_nolock( STDERR_FILENO, "%7zu, %-7u  ", size, N );
    656                 if ( (i + 1) % 8 == 0 ) __cfaabi_bits_print_nolock( STDERR_FILENO, "\n" );
     707                __cfaabi_dbg_bits_print_nolock( "%7zu, %-7u  ", size, N );
     708                if ( (i + 1) % 8 == 0 ) __cfaabi_dbg_bits_print_nolock( "\n" );
    657709                #endif // __STATISTICS__
    658710        } // for
    659711        #ifdef __STATISTICS__
    660         __cfaabi_bits_print_nolock( STDERR_FILENO, "\ntotal free blocks:%zu\n", total );
    661         __cfaabi_bits_release();
     712        __cfaabi_dbg_bits_print_nolock( "\ntotal free blocks:%zu\n", total );
     713        __cfaabi_dbg_bits_release();
    662714        #endif // __STATISTICS__
    663715        return (char *)heapEnd - (char *)heapBegin - total;
    664 } // prtFree
    665 
    666 
    667 static void ?{}( HeapManager & manager ) with ( manager ) {
    668         pageSize = sysconf( _SC_PAGESIZE );
    669 
    670         for ( unsigned int i = 0; i < NoBucketSizes; i += 1 ) { // initialize the free lists
    671                 freeLists[i].blockSize = bucketSizes[i];
    672         } // for
    673 
    674         #ifdef FASTLOOKUP
    675         unsigned int idx = 0;
    676         for ( unsigned int i = 0; i < LookupSizes; i += 1 ) {
    677                 if ( i > bucketSizes[idx] ) idx += 1;
    678                 lookup[i] = idx;
    679         } // for
    680         #endif // FASTLOOKUP
    681 
    682         if ( setMmapStart( default_mmap_start() ) ) {
    683                 abort( "HeapManager : internal error, mmap start initialization failure." );
    684         } // if
    685         heapExpand = default_heap_expansion();
    686 
    687         char * end = (char *)sbrk( 0 );
    688         sbrk( (char *)libCeiling( (long unsigned int)end, libAlign() ) - end ); // move start of heap to multiple of alignment
    689         heapBegin = heapEnd = sbrk( 0 );                                        // get new start point
    690 } // HeapManager
    691 
    692 
    693 static void ^?{}( HeapManager & ) {
    694         #ifdef __STATISTICS__
    695         if ( traceHeapTerm() ) {
    696                 printStats();
    697                 // if ( prtfree() ) prtFree( heapManager, true );
    698         } // if
    699         #endif // __STATISTICS__
    700 } // ~HeapManager
    701 
    702 
    703 static void memory_startup( void ) __attribute__(( constructor( STARTUP_PRIORITY_MEMORY ) ));
    704 void memory_startup( void ) {
    705         #ifdef __CFA_DEBUG__
    706         if ( unlikely( heapBoot ) ) {                                           // check for recursion during system boot
    707                 // DO NOT USE STREAMS AS THEY MAY BE UNAVAILABLE AT THIS POINT.
    708                 abort( "boot() : internal error, recursively invoked during system boot." );
    709         } // if
    710         heapBoot = true;
    711         #endif // __CFA_DEBUG__
    712 
    713         //assert( heapManager.heapBegin != 0 );
    714         //heapManager{};
    715         if ( heapManager.heapBegin == 0p ) heapManager{};
    716 } // memory_startup
    717 
    718 static void memory_shutdown( void ) __attribute__(( destructor( STARTUP_PRIORITY_MEMORY ) ));
    719 void memory_shutdown( void ) {
    720         ^heapManager{};
    721 } // memory_shutdown
     716} // checkFree
    722717
    723718
    724719static inline void * mallocNoStats( size_t size ) {             // necessary for malloc statistics
    725720        //assert( heapManager.heapBegin != 0 );
    726         if ( unlikely( heapManager.heapBegin == 0p ) ) heapManager{}; // called before memory_startup ?
    727         void * addr = doMalloc( size );
    728         if ( unlikely( addr == 0p ) ) errno = ENOMEM;           // POSIX
    729         return addr;
     721        if ( unlikely( heapManager.heapBegin == 0 ) ) heapManager{}; // called before memory_startup ?
     722        void * area = doMalloc( size );
     723        if ( unlikely( area == 0 ) ) errno = ENOMEM;            // POSIX
     724        return area;
    730725} // mallocNoStats
    731 
    732 
    733 static inline void * callocNoStats( size_t noOfElems, size_t elemSize ) {
    734         size_t size = noOfElems * elemSize;
    735         char * addr = (char *)mallocNoStats( size );
    736   if ( unlikely( addr == 0p ) ) return 0p;
    737 
    738         HeapManager.Storage.Header * header;
    739         HeapManager.FreeHeader * freeElem;
    740         size_t bsize, alignment;
    741         bool mapped __attribute__(( unused )) = headers( "calloc", addr, header, freeElem, bsize, alignment );
    742         #ifndef __CFA_DEBUG__
    743         // Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
    744         if ( ! mapped )
    745         #endif // __CFA_DEBUG__
    746                 // Zero entire data space even when > than size => realloc without a new allocation and zero fill works.
    747                 // <-------00000000000000000000000000000000000000000000000000000> bsize (bucket size)
    748                 // `-header`-addr                      `-size
    749                 memset( addr, '\0', bsize - sizeof(HeapManager.Storage) ); // set to zeros
    750 
    751         header->kind.real.blockSize |= 2;                                       // mark as zero filled
    752         return addr;
    753 } // callocNoStats
    754726
    755727
     
    771743        // subtract libAlign() because it is already the minimum alignment
    772744        // add sizeof(Storage) for fake header
    773         char * addr = (char *)mallocNoStats( size + alignment - libAlign() + sizeof(HeapManager.Storage) );
    774   if ( unlikely( addr == 0p ) ) return addr;
     745        // #comment TD : this is the only place that calls doMalloc without calling mallocNoStats, why ?
     746        char * area = (char *)doMalloc( size + alignment - libAlign() + sizeof(HeapManager.Storage) );
     747  if ( unlikely( area == 0 ) ) return area;
    775748
    776749        // address in the block of the "next" alignment address
    777         char * user = (char *)libCeiling( (uintptr_t)(addr + sizeof(HeapManager.Storage)), alignment );
     750        char * user = (char *)libCeiling( (uintptr_t)(area + sizeof(HeapManager.Storage)), alignment );
    778751
    779752        // address of header from malloc
    780         HeapManager.Storage.Header * realHeader = headerAddr( addr );
     753        HeapManager.Storage.Header * realHeader = headerAddr( area );
    781754        // address of fake header * before* the alignment location
    782755        HeapManager.Storage.Header * fakeHeader = headerAddr( user );
     
    788761        return user;
    789762} // memalignNoStats
    790 
    791 
    792 static inline void * cmemalignNoStats( size_t alignment, size_t noOfElems, size_t elemSize ) {
    793         size_t size = noOfElems * elemSize;
    794         char * addr = (char *)memalignNoStats( alignment, size );
    795   if ( unlikely( addr == 0p ) ) return 0p;
    796         HeapManager.Storage.Header * header;
    797         HeapManager.FreeHeader * freeElem;
    798         size_t bsize;
    799         bool mapped __attribute__(( unused )) = headers( "cmemalign", addr, header, freeElem, bsize, alignment );
    800         #ifndef __CFA_DEBUG__
    801         // Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
    802         if ( ! mapped )
    803         #endif // __CFA_DEBUG__
    804                 memset( addr, '\0', dataStorage( bsize, addr, header ) ); // set to zeros
    805         header->kind.real.blockSize |= 2;                               // mark as zero filled
    806 
    807         return addr;
    808 } // cmemalignNoStats
    809763
    810764
     
    820774extern "C" {
    821775        // The malloc() function allocates size bytes and returns a pointer to the allocated memory. The memory is not
    822         // initialized. If size is 0, then malloc() returns either 0p, or a unique pointer value that can later be
     776        // initialized. If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be
    823777        // successfully passed to free().
    824778        void * malloc( size_t size ) {
     
    832786
    833787        // The calloc() function allocates memory for an array of nmemb elements of size bytes each and returns a pointer to
    834         // the allocated memory. The memory is set to zero. If nmemb or size is 0, then calloc() returns either 0p, or a
     788        // the allocated memory. The memory is set to zero. If nmemb or size is 0, then calloc() returns either NULL, or a
    835789        // unique pointer value that can later be successfully passed to free().
    836790        void * calloc( size_t noOfElems, size_t elemSize ) {
     791                size_t size = noOfElems * elemSize;
    837792                #ifdef __STATISTICS__
    838793                __atomic_add_fetch( &calloc_calls, 1, __ATOMIC_SEQ_CST );
    839                 __atomic_add_fetch( &calloc_storage, noOfElems * elemSize, __ATOMIC_SEQ_CST );
    840                 #endif // __STATISTICS__
    841 
    842                 return callocNoStats( noOfElems, elemSize );
     794                __atomic_add_fetch( &calloc_storage, size, __ATOMIC_SEQ_CST );
     795                #endif // __STATISTICS__
     796
     797                char * area = (char *)mallocNoStats( size );
     798          if ( unlikely( area == 0 ) ) return 0;
     799
     800                HeapManager.Storage.Header * header;
     801                HeapManager.FreeHeader * freeElem;
     802                size_t asize, alignment;
     803                bool mapped __attribute__(( unused )) = headers( "calloc", area, header, freeElem, asize, alignment );
     804                #ifndef __CFA_DEBUG__
     805                // Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
     806                if ( ! mapped )
     807                #endif // __CFA_DEBUG__
     808                        memset( area, '\0', asize - sizeof(HeapManager.Storage) ); // set to zeros
     809
     810                header->kind.real.blockSize |= 2;                               // mark as zero filled
     811                return area;
    843812        } // calloc
     813
     814        // #comment TD : Document this function
     815        void * cmemalign( size_t alignment, size_t noOfElems, size_t elemSize ) {
     816                size_t size = noOfElems * elemSize;
     817                #ifdef __STATISTICS__
     818                __atomic_add_fetch( &cmemalign_calls, 1, __ATOMIC_SEQ_CST );
     819                __atomic_add_fetch( &cmemalign_storage, size, __ATOMIC_SEQ_CST );
     820                #endif // __STATISTICS__
     821
     822                char * area = (char *)memalignNoStats( alignment, size );
     823          if ( unlikely( area == 0 ) ) return 0;
     824                HeapManager.Storage.Header * header;
     825                HeapManager.FreeHeader * freeElem;
     826                size_t asize;
     827                bool mapped __attribute__(( unused )) = headers( "cmemalign", area, header, freeElem, asize, alignment );
     828                #ifndef __CFA_DEBUG__
     829                // Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
     830                if ( ! mapped )
     831                        #endif // __CFA_DEBUG__
     832                        memset( area, '\0', asize - ( (char *)area - (char *)header ) ); // set to zeros
     833                header->kind.real.blockSize |= 2;                               // mark as zero filled
     834
     835                return area;
     836        } // cmemalign
    844837
    845838        // The realloc() function changes the size of the memory block pointed to by ptr to size bytes. The contents will be
    846839        // unchanged in the range from the start of the region up to the minimum of the old and new sizes. If the new size
    847         // is larger than the old size, the added memory will not be initialized.  If ptr is 0p, then the call is
    848         // equivalent to malloc(size), for all values of size; if size is equal to zero, and ptr is not 0p, then the call
    849         // is equivalent to free(ptr). Unless ptr is 0p, it must have been returned by an earlier call to malloc(),
     840        // is larger than the old size, the added memory will not be initialized.  If ptr is NULL, then the call is
     841        // equivalent to malloc(size), for all values of size; if size is equal to zero, and ptr is not NULL, then the call
     842        // is equivalent to free(ptr). Unless ptr is NULL, it must have been returned by an earlier call to malloc(),
    850843        // calloc() or realloc(). If the area pointed to was moved, a free(ptr) is done.
    851         void * realloc( void * oaddr, size_t size ) {
     844        void * realloc( void * addr, size_t size ) {
    852845                #ifdef __STATISTICS__
    853846                __atomic_add_fetch( &realloc_calls, 1, __ATOMIC_SEQ_CST );
    854847                #endif // __STATISTICS__
    855848
    856                 // If size is equal to 0, either NULL or a pointer suitable to be passed to free() is returned.
    857           if ( unlikely( size == 0 ) ) { free( oaddr ); return mallocNoStats( size ); } // special cases
    858           if ( unlikely( oaddr == 0p ) ) return mallocNoStats( size );
     849          if ( unlikely( addr == 0 ) ) return mallocNoStats( size ); // special cases
     850          if ( unlikely( size == 0 ) ) { free( addr ); return 0; }
    859851
    860852                HeapManager.Storage.Header * header;
    861853                HeapManager.FreeHeader * freeElem;
    862                 size_t bsize, oalign = 0;
    863                 headers( "realloc", oaddr, header, freeElem, bsize, oalign );
    864 
    865                 size_t odsize = dataStorage( bsize, oaddr, header ); // data storage available in bucket
    866           if ( size <= odsize && odsize <= size * 2 ) { // allow up to 50% wasted storage in smaller size
    867                         // Do not know size of original allocation => cannot do 0 fill for any additional space because do not know
    868                         // where to start filling, i.e., do not overwrite existing values in space.
    869                         //
     854                size_t asize, alignment = 0;
     855                headers( "realloc", addr, header, freeElem, asize, alignment );
     856
     857                size_t usize = asize - ( (char *)addr - (char *)header ); // compute the amount of user storage in the block
     858                if ( usize >= size ) {                                                  // already sufficient storage
    870859                        // This case does not result in a new profiler entry because the previous one still exists and it must match with
    871860                        // the free for this memory.  Hence, this realloc does not appear in the profiler output.
    872                         return oaddr;
     861                        return addr;
    873862                } // if
    874863
     
    877866                #endif // __STATISTICS__
    878867
    879                 // change size and copy old content to new storage
    880 
    881                 void * naddr;
    882                 if ( unlikely( oalign != 0 ) ) {                                // previous request memalign?
    883                         if ( unlikely( header->kind.real.blockSize & 2 ) ) { // previous request zero fill
    884                                 naddr = cmemalignNoStats( oalign, 1, size ); // create new aligned area
    885                         } else {
    886                                 naddr = memalignNoStats( oalign, size ); // create new aligned area
    887                         } // if
     868                void * area;
     869                if ( unlikely( alignment != 0 ) ) {                             // previous request memalign?
     870                        area = memalign( alignment, size );                     // create new aligned area
    888871                } else {
    889                         if ( unlikely( header->kind.real.blockSize & 2 ) ) { // previous request zero fill
    890                                 naddr = callocNoStats( 1, size );               // create new area
    891                         } else {
    892                                 naddr = mallocNoStats( size );                  // create new area
    893                         } // if
     872                        area = mallocNoStats( size );                           // create new area
    894873                } // if
    895           if ( unlikely( naddr == 0p ) ) return 0p;
    896 
    897                 headers( "realloc", naddr, header, freeElem, bsize, oalign );
    898                 size_t ndsize = dataStorage( bsize, naddr, header ); // data storage avilable in bucket
    899                 // To preserve prior fill, the entire bucket must be copied versus the size.
    900                 memcpy( naddr, oaddr, MIN( odsize, ndsize ) );  // copy bytes
    901                 free( oaddr );
    902                 return naddr;
     874          if ( unlikely( area == 0 ) ) return 0;
     875                if ( unlikely( header->kind.real.blockSize & 2 ) ) { // previous request zero fill (calloc/cmemalign) ?
     876                        assert( (header->kind.real.blockSize & 1) == 0 );
     877                        bool mapped __attribute__(( unused )) = headers( "realloc", area, header, freeElem, asize, alignment );
     878                        #ifndef __CFA_DEBUG__
     879                        // Mapped storage is zero filled, but in debug mode mapped memory is scrubbed in doMalloc, so it has to be reset to zero.
     880                        if ( ! mapped )
     881                        #endif // __CFA_DEBUG__
     882                                memset( (char *)area + usize, '\0', asize - ( (char *)area - (char *)header ) - usize ); // zero-fill back part
     883                        header->kind.real.blockSize |= 2;                       // mark new request as zero fill
     884                } // if
     885                memcpy( area, addr, usize );                                    // copy bytes
     886                free( addr );
     887                return area;
    903888        } // realloc
     889
    904890
    905891        // The obsolete function memalign() allocates size bytes and returns a pointer to the allocated memory. The memory
     
    911897                #endif // __STATISTICS__
    912898
    913                 return memalignNoStats( alignment, size );
     899                void * area = memalignNoStats( alignment, size );
     900
     901                return area;
    914902        } // memalign
    915 
    916 
    917         // The cmemalign() function is the same as calloc() with memory alignment.
    918         void * cmemalign( size_t alignment, size_t noOfElems, size_t elemSize ) {
    919                 #ifdef __STATISTICS__
    920                 __atomic_add_fetch( &cmemalign_calls, 1, __ATOMIC_SEQ_CST );
    921                 __atomic_add_fetch( &cmemalign_storage, noOfElems * elemSize, __ATOMIC_SEQ_CST );
    922                 #endif // __STATISTICS__
    923 
    924                 return cmemalignNoStats( alignment, noOfElems, elemSize );
    925         } // cmemalign
    926903
    927904        // The function aligned_alloc() is the same as memalign(), except for the added restriction that size should be a
     
    934911        // The function posix_memalign() allocates size bytes and places the address of the allocated memory in *memptr. The
    935912        // address of the allocated memory will be a multiple of alignment, which must be a power of two and a multiple of
    936         // sizeof(void *). If size is 0, then posix_memalign() returns either 0p, or a unique pointer value that can later
     913        // sizeof(void *). If size is 0, then posix_memalign() returns either NULL, or a unique pointer value that can later
    937914        // be successfully passed to free(3).
    938915        int posix_memalign( void ** memptr, size_t alignment, size_t size ) {
    939916          if ( alignment < sizeof(void *) || ! libPow2( alignment ) ) return EINVAL; // check alignment
    940917                * memptr = memalign( alignment, size );
    941           if ( unlikely( * memptr == 0p ) ) return ENOMEM;
     918          if ( unlikely( * memptr == 0 ) ) return ENOMEM;
    942919                return 0;
    943920        } // posix_memalign
     
    952929        // The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to
    953930        // malloc(), calloc() or realloc().  Otherwise, or if free(ptr) has already been called before, undefined behavior
    954         // occurs. If ptr is 0p, no operation is performed.
     931        // occurs. If ptr is NULL, no operation is performed.
    955932        void free( void * addr ) {
    956933                #ifdef __STATISTICS__
     
    958935                #endif // __STATISTICS__
    959936
    960           if ( unlikely( addr == 0p ) ) {                                       // special case
    961                         // #ifdef __CFA_DEBUG__
    962                         // if ( traceHeap() ) {
    963                         //      #define nullmsg "Free( 0x0 ) size:0\n"
    964                         //      // Do not debug print free( 0p ), as it can cause recursive entry from sprintf.
    965                         //      __cfaabi_dbg_write( nullmsg, sizeof(nullmsg) - 1 );
    966                         // } // if
    967                         // #endif // __CFA_DEBUG__
     937                // #comment TD : To decrease nesting I would but the special case in the
     938                //               else instead, plus it reads more naturally to have the
     939                //               short / normal case instead
     940                if ( unlikely( addr == 0 ) ) {                                  // special case
     941                        #ifdef __CFA_DEBUG__
     942                        if ( traceHeap() ) {
     943                                #define nullmsg "Free( 0x0 ) size:0\n"
     944                                // Do not debug print free( 0 ), as it can cause recursive entry from sprintf.
     945                                __cfaabi_dbg_bits_write( nullmsg, sizeof(nullmsg) - 1 );
     946                        } // if
     947                        #endif // __CFA_DEBUG__
    968948                        return;
    969949                } // exit
     
    972952        } // free
    973953
    974 
    975         // The malloc_alignment() function returns the alignment of the allocation.
     954        // The mallopt() function adjusts parameters that control the behavior of the memory-allocation functions (see
     955        // malloc(3)). The param argument specifies the parameter to be modified, and value specifies the new value for that
     956        // parameter.
     957        int mallopt( int option, int value ) {
     958                choose( option ) {
     959                  case M_TOP_PAD:
     960                        if ( setHeapExpand( value ) ) fallthru default;
     961                  case M_MMAP_THRESHOLD:
     962                        if ( setMmapStart( value ) ) fallthru default;
     963                  default:
     964                        // #comment TD : 1 for unsopported feels wrong
     965                        return 1;                                                                       // success, or unsupported
     966                } // switch
     967                return 0;                                                                               // error
     968        } // mallopt
     969
     970        // The malloc_trim() function attempts to release free memory at the top of the heap (by calling sbrk(2) with a
     971        // suitable argument).
     972        int malloc_trim( size_t ) {
     973                return 0;                                                                               // => impossible to release memory
     974        } // malloc_trim
     975
     976        // The malloc_usable_size() function returns the number of usable bytes in the block pointed to by ptr, a pointer to
     977        // a block of memory allocated by malloc(3) or a related function.
     978        size_t malloc_usable_size( void * addr ) {
     979          if ( unlikely( addr == 0 ) ) return 0;                        // null allocation has 0 size
     980
     981                HeapManager.Storage.Header * header;
     982                HeapManager.FreeHeader * freeElem;
     983                size_t size, alignment;
     984
     985                headers( "malloc_usable_size", addr, header, freeElem, size, alignment );
     986                size_t usize = size - ( (char *)addr - (char *)header ); // compute the amount of user storage in the block
     987                return usize;
     988        } // malloc_usable_size
     989
     990
     991    // The malloc_alignment() function returns the alignment of the allocation.
    976992        size_t malloc_alignment( void * addr ) {
    977           if ( unlikely( addr == 0p ) ) return libAlign();      // minimum alignment
    978                 HeapManager.Storage.Header * header = headerAddr( addr );
     993          if ( unlikely( addr == 0 ) ) return libAlign();       // minimum alignment
     994                HeapManager.Storage.Header * header = (HeapManager.Storage.Header *)( (char *)addr - sizeof(HeapManager.Storage) );
    979995                if ( (header->kind.fake.alignment & 1) == 1 ) { // fake header ?
    980996                        return header->kind.fake.alignment & -2;        // remove flag from value
     
    9851001
    9861002
    987         // The malloc_zero_fill() function returns true if the allocation is zero filled, i.e., initially allocated by calloc().
     1003    // The malloc_zero_fill() function returns true if the allocation is zero filled, i.e., initially allocated by calloc().
    9881004        bool malloc_zero_fill( void * addr ) {
    989           if ( unlikely( addr == 0p ) ) return false;           // null allocation is not zero fill
    990                 HeapManager.Storage.Header * header = headerAddr( addr );
     1005          if ( unlikely( addr == 0 ) ) return false;            // null allocation is not zero fill
     1006
     1007                HeapManager.Storage.Header * header = (HeapManager.Storage.Header *)( (char *)addr - sizeof(HeapManager.Storage) );
    9911008                if ( (header->kind.fake.alignment & 1) == 1 ) { // fake header ?
    9921009                        header = (HeapManager.Storage.Header *)((char *)header - header->kind.fake.offset);
     
    9961013
    9971014
    998         // The malloc_usable_size() function returns the number of usable bytes in the block pointed to by ptr, a pointer to
    999         // a block of memory allocated by malloc(3) or a related function.
    1000         size_t malloc_usable_size( void * addr ) {
    1001           if ( unlikely( addr == 0p ) ) return 0;                       // null allocation has 0 size
    1002                 HeapManager.Storage.Header * header;
    1003                 HeapManager.FreeHeader * freeElem;
    1004                 size_t bsize, alignment;
    1005 
    1006                 headers( "malloc_usable_size", addr, header, freeElem, bsize, alignment );
    1007                 return dataStorage( bsize, addr, header );      // data storage in bucket
    1008         } // malloc_usable_size
    1009 
    1010 
    1011         // The malloc_stats() function prints (on default standard error) statistics about memory allocated by malloc(3) and
    1012         // related functions.
     1015    // The malloc_stats() function prints (on default standard error) statistics about memory allocated by malloc(3) and
     1016    // related functions.
    10131017        void malloc_stats( void ) {
    10141018                #ifdef __STATISTICS__
    10151019                printStats();
    1016                 if ( prtFree() ) prtFree( heapManager );
     1020                if ( checkFree() ) checkFree( heapManager );
    10171021                #endif // __STATISTICS__
    10181022        } // malloc_stats
    10191023
    10201024        // The malloc_stats_fd() function changes the file descripter where malloc_stats() writes the statistics.
    1021         int malloc_stats_fd( int fd __attribute__(( unused )) ) {
     1025        int malloc_stats_fd( int fd ) {
    10221026                #ifdef __STATISTICS__
    10231027                int temp = statfd;
     
    10291033        } // malloc_stats_fd
    10301034
    1031 
    1032         // The mallopt() function adjusts parameters that control the behavior of the memory-allocation functions (see
    1033         // malloc(3)). The param argument specifies the parameter to be modified, and value specifies the new value for that
    1034         // parameter.
    1035         int mallopt( int option, int value ) {
    1036                 choose( option ) {
    1037                   case M_TOP_PAD:
    1038                         if ( setHeapExpand( value ) ) return 1;
    1039                   case M_MMAP_THRESHOLD:
    1040                         if ( setMmapStart( value ) ) return 1;
    1041                 } // switch
    1042                 return 0;                                                                               // error, unsupported
    1043         } // mallopt
    1044 
    1045         // The malloc_trim() function attempts to release free memory at the top of the heap (by calling sbrk(2) with a
    1046         // suitable argument).
    1047         int malloc_trim( size_t ) {
    1048                 return 0;                                                                               // => impossible to release memory
    1049         } // malloc_trim
    1050 
    1051 
    10521035        // The malloc_info() function exports an XML string that describes the current state of the memory-allocation
    10531036        // implementation in the caller.  The string is printed on the file stream stream.  The exported string includes
    10541037        // information about all arenas (see malloc(3)).
    10551038        int malloc_info( int options, FILE * stream ) {
    1056                 if ( options != 0 ) { errno = EINVAL; return -1; }
    10571039                return printStatsXML( stream );
    10581040        } // malloc_info
     
    10641046        // structure is returned as the function result.  (It is the caller's responsibility to free(3) this memory.)
    10651047        void * malloc_get_state( void ) {
    1066                 return 0p;                                                                              // unsupported
     1048                return 0;                                                                               // unsupported
    10671049        } // malloc_get_state
    10681050
     
    10761058
    10771059
    1078 // Must have CFA linkage to overload with C linkage realloc.
    1079 void * realloc( void * oaddr, size_t nalign, size_t size ) {
    1080         #ifdef __STATISTICS__
    1081         __atomic_add_fetch( &realloc_calls, 1, __ATOMIC_SEQ_CST );
    1082         #endif // __STATISTICS__
    1083 
    1084         // If size is equal to 0, either NULL or a pointer suitable to be passed to free() is returned.
    1085   if ( unlikely( size == 0 ) ) { free( oaddr ); return mallocNoStats( size ); } // special cases
    1086   if ( unlikely( oaddr == 0p ) ) return mallocNoStats( size );
    1087 
    1088         if ( unlikely( nalign == 0 ) ) nalign = libAlign();     // reset alignment to minimum
    1089         #ifdef __CFA_DEBUG__
    1090         else
    1091                 checkAlign( nalign );                                                   // check alignment
    1092         #endif // __CFA_DEBUG__
    1093 
    1094         HeapManager.Storage.Header * header;
    1095         HeapManager.FreeHeader * freeElem;
    1096         size_t bsize, oalign = 0;
    1097         headers( "realloc", oaddr, header, freeElem, bsize, oalign );
    1098         size_t odsize = dataStorage( bsize, oaddr, header ); // data storage available in bucket
    1099 
    1100   if ( oalign != 0 && (uintptr_t)oaddr % nalign == 0 ) { // has alignment and just happens to work out
    1101                 headerAddr( oaddr )->kind.fake.alignment = nalign | 1; // update alignment (could be the same)
    1102                 return realloc( oaddr, size );
    1103         } // if
    1104 
    1105         #ifdef __STATISTICS__
    1106         __atomic_add_fetch( &realloc_storage, size, __ATOMIC_SEQ_CST );
    1107         #endif // __STATISTICS__
    1108 
    1109         // change size and copy old content to new storage
    1110 
    1111         void * naddr;
    1112         if ( unlikely( header->kind.real.blockSize & 2 ) ) { // previous request zero fill
    1113                 naddr = cmemalignNoStats( nalign, 1, size );    // create new aligned area
    1114         } else {
    1115                 naddr = memalignNoStats( nalign, size );                // create new aligned area
    1116         } // if
    1117 
    1118         headers( "realloc", naddr, header, freeElem, bsize, oalign );
    1119         size_t ndsize = dataStorage( bsize, naddr, header ); // data storage avilable in bucket
    1120         // To preserve prior fill, the entire bucket must be copied versus the size.
    1121         memcpy( naddr, oaddr, MIN( odsize, ndsize ) );          // copy bytes
    1122         free( oaddr );
    1123         return naddr;
    1124 } // realloc
    1125 
    1126 
    11271060// Local Variables: //
    11281061// tab-width: 4 //
  • libcfa/src/interpose.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed Mar 29 16:10:31 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Feb 17 10:18:53 2020
    13 // Update Count     : 166
     12// Last Modified On : Sun Jul 14 22:57:16 2019
     13// Update Count     : 116
    1414//
    1515
     
    2929#include "bits/signal.hfa"                                                              // sigHandler_?
    3030#include "startup.hfa"                                                                  // STARTUP_PRIORITY_CORE
    31 #include <assert.h>
    3231
    3332//=============================================================================================
     
    4140
    4241typedef void (* generic_fptr_t)(void);
    43 generic_fptr_t interpose_symbol( const char symbol[], const char version[] ) {
     42generic_fptr_t interpose_symbol( const char * symbol, const char * version ) {
    4443        const char * error;
    4544
     
    9695        void __cfaabi_interpose_startup(void)  __attribute__(( constructor( STARTUP_PRIORITY_CORE ) ));
    9796        void __cfaabi_interpose_startup( void ) {
    98                 const char *version = 0p;
     97                const char *version = NULL;
    9998
    10099                preload_libgcc();
     
    106105#pragma GCC diagnostic pop
    107106
    108                 // As a precaution (and necessity), errors that result in termination are delivered on a separate stack because
    109                 // task stacks might be very small (4K) and the signal delivery corrupts memory to the point that a clean
    110                 // shutdown is impossible. Also, when a stack overflow encounters the non-accessible sentinel page (debug only)
    111                 // and generates a segment fault, the signal cannot be delivered on the sentinel page. Finally, calls to abort
    112                 // print a stack trace that uses substantial stack space.
    113 
    114                 #define MINSTKSZ SIGSTKSZ * 8
    115                 static char stack[MINSTKSZ] __attribute__(( aligned (16) ));
    116                 static stack_t ss;
    117 
    118                 ss.ss_sp = stack;
    119                 ss.ss_size = MINSTKSZ;
    120                 ss.ss_flags = 0;
    121                 if ( sigaltstack( &ss, 0p ) == -1 ) {
    122                         abort( "__cfaabi_interpose_startup : internal error, sigaltstack error(%d) %s.", errno, strerror( errno ) );
    123                 } // if
    124 
    125107                // Failure handler
    126                 __cfaabi_sigaction( SIGSEGV, sigHandler_segv, SA_SIGINFO | SA_ONSTACK );
    127                 __cfaabi_sigaction( SIGBUS , sigHandler_segv, SA_SIGINFO | SA_ONSTACK );
    128                 __cfaabi_sigaction( SIGILL , sigHandler_ill , SA_SIGINFO | SA_ONSTACK );
    129                 __cfaabi_sigaction( SIGFPE , sigHandler_fpe , SA_SIGINFO | SA_ONSTACK );
    130                 __cfaabi_sigaction( SIGTERM, sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND ); // one shot handler, return to default
    131                 __cfaabi_sigaction( SIGINT , sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND );
    132                 __cfaabi_sigaction( SIGABRT, sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND );
    133                 __cfaabi_sigaction( SIGHUP , sigHandler_term, SA_SIGINFO | SA_ONSTACK | SA_RESETHAND ); // terminal hangup
     108                __cfaabi_sigaction( SIGSEGV, sigHandler_segv , SA_SIGINFO );
     109                __cfaabi_sigaction( SIGBUS , sigHandler_segv , SA_SIGINFO );
     110                __cfaabi_sigaction( SIGILL , sigHandler_ill  , SA_SIGINFO );
     111                __cfaabi_sigaction( SIGFPE , sigHandler_fpe  , SA_SIGINFO );
     112                __cfaabi_sigaction( SIGABRT, sigHandler_abrt, SA_SIGINFO | SA_RESETHAND);
     113                __cfaabi_sigaction( SIGTERM, sigHandler_term , SA_SIGINFO );
     114                __cfaabi_sigaction( SIGINT , sigHandler_term , SA_SIGINFO );
    134115        }
    135116}
     
    142123void exit( int status, const char fmt[], ... ) __attribute__(( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ ));
    143124void abort( const char fmt[], ... ) __attribute__(( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ ));
    144 void abort( bool signalAbort, const char fmt[], ... ) __attribute__(( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ ));
    145125
    146126extern "C" {
    147127        void abort( void ) __attribute__(( __nothrow__, __leaf__, __noreturn__ )) {
    148                 abort( false, "%s", "" );
     128                abort( NULL );
    149129        }
    150130
     
    152132                va_list argp;
    153133                va_start( argp, fmt );
    154                 abort( false, fmt, argp );
     134                abort( fmt, argp );
    155135                va_end( argp );
    156136        }
     
    161141}
    162142
    163 void * kernel_abort( void ) __attribute__(( __nothrow__, __leaf__, __weak__ )) { return 0p; }
    164 void kernel_abort_msg( void * data, char buffer[], int size ) __attribute__(( __nothrow__, __leaf__, __weak__ )) {}
    165 // See concurrency/kernel.cfa for strong definition used in multi-processor mode.
     143void * kernel_abort    ( void ) __attribute__(( __nothrow__, __leaf__, __weak__ )) { return NULL; }
     144void   kernel_abort_msg( void * data, char * buffer, int size ) __attribute__(( __nothrow__, __leaf__, __weak__ )) {}
    166145int kernel_abort_lastframe( void ) __attribute__(( __nothrow__, __leaf__, __weak__ )) { return 4; }
    167146
    168147enum { abort_text_size = 1024 };
    169148static char abort_text[ abort_text_size ];
    170 
    171 static void __cfaabi_backtrace( int start ) {
    172         enum { Frames = 50, };                                                          // maximum number of stack frames
    173         int last = kernel_abort_lastframe();                            // skip last N stack frames
     149static int abort_lastframe;
     150
     151void exit( int status, const char fmt[], ... ) __attribute__(( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ )) {
     152    va_list args;
     153    va_start( args, fmt );
     154    vfprintf( stderr, fmt, args );
     155    va_end( args );
     156        __cabi_libc.exit( status );
     157}
     158
     159void abort( const char fmt[], ... ) __attribute__(( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )) {
     160        void * kernel_data = kernel_abort();                    // must be done here to lock down kernel
     161        int len;
     162
     163        abort_lastframe = kernel_abort_lastframe();
     164        len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid)
     165        __cfaabi_dbg_bits_write( abort_text, len );
     166
     167        if ( fmt ) {
     168                va_list args;
     169                va_start( args, fmt );
     170
     171                len = vsnprintf( abort_text, abort_text_size, fmt, args );
     172                va_end( args );
     173                __cfaabi_dbg_bits_write( abort_text, len );
     174
     175                if ( fmt[strlen( fmt ) - 1] != '\n' ) {         // add optional newline if missing at the end of the format text
     176                        __cfaabi_dbg_bits_write( "\n", 1 );
     177                }
     178        }
     179
     180        kernel_abort_msg( kernel_data, abort_text, abort_text_size );
     181        __cabi_libc.abort();
     182}
     183
     184static void __cfaabi_backtrace() {
     185        enum {
     186                Frames = 50,                                                                    // maximum number of stack frames
     187                Start = 8,                                                                              // skip first N stack frames
     188        };
    174189
    175190        void * array[Frames];
    176191        size_t size = backtrace( array, Frames );
    177         char ** messages = backtrace_symbols( array, size ); // does not demangle names
    178 
    179         *index( messages[0], '(' ) = '\0';                                      // find executable name
    180         __cfaabi_bits_print_nolock( STDERR_FILENO, "Stack back trace for: %s\n", messages[0]);
    181 
    182         for ( unsigned int i = start; i < size - last && messages != 0p; i += 1 ) {
    183                 char * name = 0p, * offset_begin = 0p, * offset_end = 0p;
    184 
    185                 for ( char * p = messages[i]; *p; p += 1 ) {    // find parantheses and +offset
    186                         //__cfaabi_bits_print_nolock( "X %s\n", p);
     192        char ** messages = backtrace_symbols( array, size );
     193
     194        // find executable name
     195        *index( messages[0], '(' ) = '\0';
     196        __cfaabi_dbg_bits_print_nolock( "Stack back trace for: %s\n", messages[0]);
     197
     198        for ( int i = Start; i < size - abort_lastframe && messages != NULL; i += 1 ) {
     199                char * name = NULL, * offset_begin = NULL, * offset_end = NULL;
     200
     201                for ( char * p = messages[i]; *p; ++p ) {
     202                        //__cfaabi_dbg_bits_print_nolock( "X %s\n", p);
     203                        // find parantheses and +offset
    187204                        if ( *p == '(' ) {
    188205                                name = p;
     
    195212                }
    196213
    197                 // if line contains symbol, print it
    198                 int frameNo = i - start;
     214                // if line contains symbol print it
     215                int frameNo = i - Start;
    199216                if ( name && offset_begin && offset_end && name < offset_begin ) {
    200                         *name++ = '\0';                                                         // delimit strings
     217                        // delimit strings
     218                        *name++ = '\0';
    201219                        *offset_begin++ = '\0';
    202220                        *offset_end++ = '\0';
    203221
    204                         __cfaabi_bits_print_nolock( STDERR_FILENO, "(%i) %s : %s + %s %s\n", frameNo, messages[i], name, offset_begin, offset_end);
     222                        __cfaabi_dbg_bits_print_nolock( "(%i) %s : %s + %s %s\n", frameNo, messages[i], name, offset_begin, offset_end);
    205223                } else {                                                                                // otherwise, print the whole line
    206                         __cfaabi_bits_print_nolock( STDERR_FILENO, "(%i) %s\n", frameNo, messages[i] );
     224                        __cfaabi_dbg_bits_print_nolock( "(%i) %s\n", frameNo, messages[i] );
    207225                }
    208226        }
     
    210228}
    211229
    212 void exit( int status, const char fmt[], ... ) {
    213         va_list args;
    214         va_start( args, fmt );
    215         vfprintf( stderr, fmt, args );
    216         va_end( args );
    217         __cabi_libc.exit( status );
    218 }
    219 
    220 void abort( bool signalAbort, const char fmt[], ... ) {
    221         void * kernel_data = kernel_abort();                            // must be done here to lock down kernel
    222         int len;
    223 
    224         signal( SIGABRT, SIG_DFL );                                                     // prevent final "real" abort from recursing to handler
    225 
    226         len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid)
    227         __cfaabi_bits_write( STDERR_FILENO, abort_text, len );
    228 
    229         assert( fmt );
    230         va_list args;
    231         va_start( args, fmt );
    232 
    233         len = vsnprintf( abort_text, abort_text_size, fmt, args );
    234         va_end( args );
    235         __cfaabi_bits_write( STDERR_FILENO, abort_text, len );
    236 
    237         if ( fmt[strlen( fmt ) - 1] != '\n' ) {                         // add optional newline if missing at the end of the format text
    238                 __cfaabi_dbg_write( "\n", 1 );
    239         } // if
    240         kernel_abort_msg( kernel_data, abort_text, abort_text_size );
    241 
    242         __cfaabi_backtrace( signalAbort ? 4 : 2 );
    243 
    244         __cabi_libc.abort();                                                            // print stack trace in handler
    245 }
    246 
    247 void abort( const char fmt[], ... ) {
    248         va_list args;
    249         va_start( args, fmt );
    250         abort( false, fmt, args );
    251         va_end( args );
    252 }
    253 
    254230void sigHandler_segv( __CFA_SIGPARMS__ ) {
    255                 if ( sfp->si_addr == 0p ) {
    256                         abort( true, "Null pointer (0p) dereference.\n" );
    257                 } else {
    258                         abort( true, "%s at memory location %p.\n"
    259                                    "Possible cause is reading outside the address space or writing to a protected area within the address space with an invalid pointer or subscript.\n",
    260                                    (sig == SIGSEGV ? "Segment fault" : "Bus error"), sfp->si_addr );
    261                 }
     231        abort( "Addressing invalid memory at location %p\n"
     232                        "Possible cause is reading outside the address space or writing to a protected area within the address space with an invalid pointer or subscript.\n",
     233                        sfp->si_addr );
    262234}
    263235
    264236void sigHandler_ill( __CFA_SIGPARMS__ ) {
    265         abort( true, "Executing illegal instruction at location %p.\n"
     237        abort( "Executing illegal instruction at location %p.\n"
    266238                        "Possible cause is stack corruption.\n",
    267239                        sfp->si_addr );
     
    279251          default: msg = "unknown";
    280252        } // choose
    281         abort( true, "Computation error %s at location %p.\n", msg, sfp->si_addr );
     253        abort( "Computation error %s at location %p.\n", msg, sfp->si_addr );
     254}
     255
     256void sigHandler_abrt( __CFA_SIGPARMS__ ) {
     257        __cfaabi_backtrace();
     258
     259        // reset default signal handler
     260        __cfaabi_sigdefault( SIGABRT );
     261
     262        raise( SIGABRT );
    282263}
    283264
    284265void sigHandler_term( __CFA_SIGPARMS__ ) {
    285         abort( true, "Application interrupted by signal: %s.\n", strsignal( sig ) );
     266        abort( "Application stopped by %s signal.", sig == SIGINT ? "an interrupt (SIGINT)" : "a terminate (SIGTERM)" );
    286267}
    287268
  • libcfa/src/iostream.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb 20 15:53:23 2020
    13 // Update Count     : 829
     12// Last Modified On : Sat Jul 13 08:07:59 2019
     13// Update Count     : 821
    1414//
    1515
     
    1919#include <stdio.h>
    2020#include <stdbool.h>                                                                    // true/false
    21 #include <stdint.h>                                                                             // UINT64_MAX
    2221//#include <string.h>                                                                   // strlen, strcmp
    2322extern size_t strlen (const char *__s) __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__pure__)) __attribute__ ((__nonnull__ (1)));
     
    3635forall( dtype ostype | ostream( ostype ) ) {
    3736        ostype & ?|?( ostype & os, zero_t ) {
    38                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     37                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    3938                fmt( os, "%d", 0n );
    4039                return os;
     
    4544
    4645        ostype & ?|?( ostype & os, one_t ) {
    47                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     46                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    4847                fmt( os, "%d", 1n );
    4948                return os;
     
    5453
    5554        ostype & ?|?( ostype & os, bool b ) {
    56                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     55                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    5756                fmt( os, "%s", b ? "true" : "false" );
    5857                return os;
     
    6463        ostype & ?|?( ostype & os, char c ) {
    6564                fmt( os, "%c", c );
    66                 if ( c == '\n' ) $setNL( os, true );
     65                if ( c == '\n' ) setNL( os, true );
    6766                return sepOff( os );
    6867        } // ?|?
     
    7271
    7372        ostype & ?|?( ostype & os, signed char sc ) {
    74                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     73                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    7574                fmt( os, "%hhd", sc );
    7675                return os;
     
    8180
    8281        ostype & ?|?( ostype & os, unsigned char usc ) {
    83                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     82                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    8483                fmt( os, "%hhu", usc );
    8584                return os;
     
    9089
    9190        ostype & ?|?( ostype & os, short int si ) {
    92                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     91                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    9392                fmt( os, "%hd", si );
    9493                return os;
     
    9998
    10099        ostype & ?|?( ostype & os, unsigned short int usi ) {
    101                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     100                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    102101                fmt( os, "%hu", usi );
    103102                return os;
     
    108107
    109108        ostype & ?|?( ostype & os, int i ) {
    110                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     109                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    111110                fmt( os, "%d", i );
    112111                return os;
     
    117116
    118117        ostype & ?|?( ostype & os, unsigned int ui ) {
    119                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     118                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    120119                fmt( os, "%u", ui );
    121120                return os;
     
    126125
    127126        ostype & ?|?( ostype & os, long int li ) {
    128                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     127                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    129128                fmt( os, "%ld", li );
    130129                return os;
     
    135134
    136135        ostype & ?|?( ostype & os, unsigned long int uli ) {
    137                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     136                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    138137                fmt( os, "%lu", uli );
    139138                return os;
     
    144143
    145144        ostype & ?|?( ostype & os, long long int lli ) {
    146                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     145                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    147146                fmt( os, "%lld", lli );
    148147                return os;
     
    153152
    154153        ostype & ?|?( ostype & os, unsigned long long int ulli ) {
    155                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     154                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    156155                fmt( os, "%llu", ulli );
    157156                return os;
     
    160159                (ostype &)(os | ulli); ends( os );
    161160        } // ?|?
    162 
    163 #if defined( __SIZEOF_INT128__ )
    164         //      UINT64_MAX 18_446_744_073_709_551_615_ULL
    165         #define P10_UINT64 10_000_000_000_000_000_000_ULL       // 19 zeroes
    166 
    167         static void base10_128( ostype & os, unsigned int128 val ) {
    168                 if ( val > UINT64_MAX ) {
    169                         base10_128( os, val / P10_UINT64 );                     // recursive
    170                         fmt( os, "%.19lu", (uint64_t)(val % P10_UINT64) );
    171                 } else {
    172                         fmt( os, "%lu", (uint64_t)val );
    173                 } // if
    174         } // base10_128
    175 
    176         static void base10_128( ostype & os, int128 val ) {
    177                 if ( val < 0 ) {
    178                         fmt( os, "-" );                                                         // leading negative sign
    179                         val = -val;
    180                 } // if
    181                 base10_128( os, (unsigned int128)val );                 // print zero/positive value
    182         } // base10_128
    183 
    184         ostype & ?|?( ostype & os, int128 llli ) {
    185                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
    186                 base10_128( os, llli );
    187                 return os;
    188         } // ?|?
    189         void & ?|?( ostype & os, int128 llli ) {
    190                 (ostype &)(os | llli); ends( os );
    191         } // ?|?
    192 
    193         ostype & ?|?( ostype & os, unsigned int128 ullli ) {
    194                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
    195                 base10_128( os, ullli );
    196                 return os;
    197         } // ?|?
    198         void & ?|?( ostype & os, unsigned int128 ullli ) {
    199                 (ostype &)(os | ullli); ends( os );
    200         } // ?|?
    201 #endif // __SIZEOF_INT128__
    202161
    203162        #define PrintWithDP( os, format, val, ... ) \
     
    216175
    217176        ostype & ?|?( ostype & os, float f ) {
    218                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     177                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    219178                PrintWithDP( os, "%g", f );
    220179                return os;
     
    225184
    226185        ostype & ?|?( ostype & os, double d ) {
    227                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     186                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    228187                PrintWithDP( os, "%.*lg", d, DBL_DIG );
    229188                return os;
     
    234193
    235194        ostype & ?|?( ostype & os, long double ld ) {
    236                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     195                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    237196                PrintWithDP( os, "%.*Lg", ld, LDBL_DIG );
    238197                return os;
     
    243202
    244203        ostype & ?|?( ostype & os, float _Complex fc ) {
    245                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     204                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    246205//              os | crealf( fc ) | nonl;
    247206                PrintWithDP( os, "%g", crealf( fc ) );
     
    255214
    256215        ostype & ?|?( ostype & os, double _Complex dc ) {
    257                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     216                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    258217//              os | creal( dc ) | nonl;
    259218                PrintWithDP( os, "%.*lg", creal( dc ), DBL_DIG );
     
    267226
    268227        ostype & ?|?( ostype & os, long double _Complex ldc ) {
    269                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     228                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    270229//              os | creall( ldc ) || nonl;
    271230                PrintWithDP( os, "%.*Lg", creall( ldc ), LDBL_DIG );
     
    278237        } // ?|?
    279238
    280         ostype & ?|?( ostype & os, const char str[] ) {
     239        ostype & ?|?( ostype & os, const char * str ) {
    281240                enum { Open = 1, Close, OpenClose };
    282241                static const unsigned char mask[256] @= {
     
    298257                // first character IS NOT spacing or closing punctuation => add left separator
    299258                unsigned char ch = str[0];                                              // must make unsigned
    300                 if ( $sepPrt( os ) && mask[ ch ] != Close && mask[ ch ] != OpenClose ) {
    301                         fmt( os, "%s", $sepGetCur( os ) );
     259                if ( sepPrt( os ) && mask[ ch ] != Close && mask[ ch ] != OpenClose ) {
     260                        fmt( os, "%s", sepGetCur( os ) );
    302261                } // if
    303262
    304263                // if string starts line, must reset to determine open state because separator is off
    305                 $sepReset( os );                                                                // reset separator
     264                sepReset( os );                                                                 // reset separator
    306265
    307266                // last character IS spacing or opening punctuation => turn off separator for next item
    308267                size_t len = strlen( str );
    309268                ch = str[len - 1];                                                              // must make unsigned
    310                 if ( $sepPrt( os ) && mask[ ch ] != Open && mask[ ch ] != OpenClose ) {
     269                if ( sepPrt( os ) && mask[ ch ] != Open && mask[ ch ] != OpenClose ) {
    311270                        sepOn( os );
    312271                } else {
    313272                        sepOff( os );
    314273                } // if
    315                 if ( ch == '\n' ) $setNL( os, true );                   // check *AFTER* $sepPrt call above as it resets NL flag
     274                if ( ch == '\n' ) setNL( os, true );                    // check *AFTER* sepPrt call above as it resets NL flag
    316275                return write( os, str, len );
    317276        } // ?|?
    318 
    319         void ?|?( ostype & os, const char str[] ) {
     277        void ?|?( ostype & os, const char * str ) {
    320278                (ostype &)(os | str); ends( os );
    321279        } // ?|?
    322280
    323281//      ostype & ?|?( ostype & os, const char16_t * str ) {
    324 //              if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     282//              if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    325283//              fmt( os, "%ls", str );
    326284//              return os;
     
    329287// #if ! ( __ARM_ARCH_ISA_ARM == 1 && __ARM_32BIT_STATE == 1 ) // char32_t == wchar_t => ambiguous
    330288//      ostype & ?|?( ostype & os, const char32_t * str ) {
    331 //              if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     289//              if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    332290//              fmt( os, "%ls", str );
    333291//              return os;
     
    336294
    337295//      ostype & ?|?( ostype & os, const wchar_t * str ) {
    338 //              if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     296//              if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    339297//              fmt( os, "%ls", str );
    340298//              return os;
     
    342300
    343301        ostype & ?|?( ostype & os, const void * p ) {
    344                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     302                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    345303                fmt( os, "%p", p );
    346304                return os;
     
    357315        void ?|?( ostype & os, ostype & (* manip)( ostype & ) ) {
    358316                (ostype &)(manip( os ));
    359                 if ( $getPrt( os ) ) ends( os );                                // something printed ?
    360                 $setPrt( os, false );                                                   // turn off
     317                if ( getPrt( os ) ) ends( os );                                 // something printed ?
     318                setPrt( os, false );                                                    // turn off
    361319        } // ?|?
    362320
     
    371329        ostype & nl( ostype & os ) {
    372330                (ostype &)(os | '\n');
    373                 $setPrt( os, false );                                                   // turn off
    374                 $setNL( os, true );
     331                setPrt( os, false );                                                    // turn off
     332                setNL( os, true );
    375333                flush( os );
    376334                return sepOff( os );                                                    // prepare for next line
     
    378336
    379337        ostype & nonl( ostype & os ) {
    380                 $setPrt( os, false );                                                   // turn off
     338                setPrt( os, false );                                                    // turn off
    381339                return os;
    382340        } // nonl
     
    417375        ostype & ?|?( ostype & os, T arg, Params rest ) {
    418376                (ostype &)(os | arg);                                                   // print first argument
    419                 $sepSetCur( os, sepGetTuple( os ) );                    // switch to tuple separator
     377                sepSetCur( os, sepGetTuple( os ) );                             // switch to tuple separator
    420378                (ostype &)(os | rest);                                                  // print remaining arguments
    421                 $sepSetCur( os, sepGet( os ) );                                 // switch to regular separator
     379                sepSetCur( os, sepGet( os ) );                                  // switch to regular separator
    422380                return os;
    423381        } // ?|?
     
    425383                // (ostype &)(?|?( os, arg, rest )); ends( os );
    426384                (ostype &)(os | arg);                                                   // print first argument
    427                 $sepSetCur( os, sepGetTuple( os ) );                    // switch to tuple separator
     385                sepSetCur( os, sepGetTuple( os ) );                             // switch to tuple separator
    428386                (ostype &)(os | rest);                                                  // print remaining arguments
    429                 $sepSetCur( os, sepGet( os ) );                                 // switch to regular separator
     387                sepSetCur( os, sepGet( os ) );                                  // switch to regular separator
    430388                ends( os );
    431389        } // ?|?
     
    456414forall( dtype ostype | ostream( ostype ) ) { \
    457415        ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \
    458                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) ); \
     416                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) ); \
    459417\
    460418                if ( f.base == 'b' || f.base == 'B' ) {                 /* bespoke binary format */ \
     
    505463\
    506464                if ( ! f.flags.pc ) {                                                   /* no precision */ \
     465                        /* printf( "%s\n", &fmtstr[star] ); */ \
    507466                        fmtstr[sizeof(IFMTNP)-2] = f.base;                      /* sizeof includes '\0' */ \
    508                         /* printf( "%s %c %c\n", &fmtstr[star], f.base, CODE ); */ \
    509467                        fmt( os, &fmtstr[star], f.wd, f.val ); \
    510468                } else {                                                                                /* precision */ \
    511469                        fmtstr[sizeof(IFMTP)-2] = f.base;                       /* sizeof includes '\0' */ \
    512                         /* printf( "%s %c %c\n", &fmtstr[star], f.base, CODE ); */ \
     470                        /* printf( "%s\n", &fmtstr[star] ); */ \
    513471                        fmt( os, &fmtstr[star], f.wd, f.pc, f.val ); \
    514472                } /* if */ \
     
    528486IntegralFMTImpl( signed long long int, 'd', "%    *ll ", "%    *.*ll " )
    529487IntegralFMTImpl( unsigned long long int, 'u', "%    *ll ", "%    *.*ll " )
    530 
    531 
    532 #if defined( __SIZEOF_INT128__ )
    533 // Default prefix for non-decimal prints is 0b, 0, 0x.
    534 #define IntegralFMTImpl128( T, SIGNED, CODE, IFMTNP, IFMTP ) \
    535 forall( dtype ostype | ostream( ostype ) ) \
    536 static void base10_128( ostype & os, _Ostream_Manip(T) fmt ) { \
    537         if ( fmt.val > UINT64_MAX ) { \
    538                 fmt.val /= P10_UINT64; \
    539                 base10_128( os, fmt ); /* recursive */ \
    540                 _Ostream_Manip(unsigned long long int) fmt2 @= { (uint64_t)(fmt.val % P10_UINT64), 0, 19, 'u', { .all : 0 } }; \
    541                 fmt2.flags.nobsdp = true; \
    542                 printf( "fmt2 %c %lld %d\n", fmt2.base, fmt2.val, fmt2.all );   \
    543                 sepOff( os ); \
    544                 (ostype &)(os | fmt2); \
    545         } else { \
    546                 printf( "fmt %c %lld %d\n", fmt.base, fmt.val, fmt.all ); \
    547                 (ostype &)(os | fmt); \
    548         } /* if */ \
    549 } /* base10_128 */                                                 \
    550 forall( dtype ostype | ostream( ostype ) ) { \
    551         ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \
    552                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) ); \
    553 \
    554                 if ( f.base == 'b' | f.base == 'o' | f.base == 'x' | f.base == 'X' ) { \
    555                         unsigned long long int msig = (unsigned long long int)(f.val >> 64); \
    556                         unsigned long long int lsig = (unsigned long long int)(f.val); \
    557                         _Ostream_Manip(SIGNED long long int) fmt @= { msig, f.wd, f.pc, f.base, { .all : f.all } }; \
    558                         _Ostream_Manip(unsigned long long int) fmt2 @= { lsig, 0, 0, f.base, { .all : 0 } }; \
    559                         if ( msig == 0 ) { \
    560                                 fmt.val = lsig; \
    561                                 (ostype &)(os | fmt); \
    562                         } else { \
    563                                 fmt2.flags.pad0 = fmt2.flags.nobsdp = true;     \
    564                                 if ( f.base == 'b' ) { \
    565                                         if ( f.wd > 64 ) fmt.wd = f.wd - 64; \
    566                                         fmt2.wd = 64; \
    567                                         (ostype &)(os | fmt | "" | fmt2); \
    568                                 } else if ( f.base == 'o' ) { \
    569                                         fmt.val = (unsigned long long int)fmt.val >> 2; \
    570                                         if ( f.wd > 21 ) fmt.wd = f.wd - 21; \
    571                                         fmt2.wd = 1; \
    572                                         fmt2.val = ((msig & 0x3) << 1) + 1; \
    573                                         (ostype &)(os | fmt | "" | fmt2); \
    574                                         sepOff( os ); \
    575                                         fmt2.wd = 21; \
    576                                         fmt2.val = lsig & 0x7fffffffffffffff; \
    577                                         (ostype &)(os | fmt2); \
    578                                 } else { \
    579                                         if ( f.flags.left ) { \
    580                                                 if ( f.wd > 16 ) fmt2.wd = f.wd - 16;   \
    581                                                 fmt.wd = 16;                                                    \
    582                                         } else { \
    583                                                 if ( f.wd > 16 ) fmt.wd = f.wd - 16;    \
    584                                                 fmt2.wd = 16;                                                   \
    585                                         } /* if */ \
    586                                         (ostype &)(os | fmt | "" | fmt2); \
    587                                 } /* if */ \
    588                         } /* if */ \
    589                 } else { \
    590                         base10_128( os, f ); \
    591                 } /* if */ \
    592                 return os; \
    593         } /* ?|? */ \
    594         void ?|?( ostype & os, _Ostream_Manip(T) f ) { (ostype &)(os | f); ends( os ); } \
    595 } // distribution
    596 
    597 IntegralFMTImpl128( int128, signed, 'd', "%    *ll ", "%    *.*ll " )
    598 IntegralFMTImpl128( unsigned int128, unsigned, 'u', "%    *ll ", "%    *.*ll " )
    599 #endif // __SIZEOF_INT128__
    600488
    601489//*********************************** floating point ***********************************
     
    625513forall( dtype ostype | ostream( ostype ) ) { \
    626514        ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \
    627                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) ); \
     515                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) ); \
    628516                char fmtstr[sizeof(DFMTP)];                                             /* sizeof includes '\0' */ \
    629517                if ( ! f.flags.pc ) memcpy( &fmtstr, DFMTNP, sizeof(DFMTNP) ); \
     
    648536                return os; \
    649537        } /* ?|? */ \
    650 \
    651538        void ?|?( ostype & os, _Ostream_Manip(T) f ) { (ostype &)(os | f); ends( os ); } \
    652539} // distribution
     
    668555                } // if
    669556
    670                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     557                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    671558
    672559                #define CFMTNP "% * "
     
    684571                return os;
    685572        } // ?|?
    686 
    687573        void ?|?( ostype & os, _Ostream_Manip(char) f ) { (ostype &)(os | f); ends( os ); }
    688574} // distribution
     
    706592                } // if
    707593
    708                 if ( $sepPrt( os ) ) fmt( os, "%s", $sepGetCur( os ) );
     594                if ( sepPrt( os ) ) fmt( os, "%s", sepGetCur( os ) );
    709595
    710596                #define SFMTNP "% * "
     
    730616                return os;
    731617        } // ?|?
    732 
    733618        void ?|?( ostype & os, _Ostream_Manip(const char *) f ) { (ostype &)(os | f); ends( os ); }
    734619} // distribution
     
    850735        } // ?|?
    851736
    852         // istype & ?|?( istype & is, const char fmt[] ) {
     737        // istype & ?|?( istype & is, const char * fmt ) {
    853738        //      fmt( is, fmt, "" );
    854739        //      return is;
  • libcfa/src/iostream.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb 20 15:30:56 2020
    13 // Update Count     : 337
     12// Last Modified On : Fri Jul 12 12:08:38 2019
     13// Update Count     : 334
    1414//
    1515
     
    2424trait ostream( dtype ostype ) {
    2525        // private
    26         bool $sepPrt( ostype & );                                                       // get separator state (on/off)
    27         void $sepReset( ostype & );                                                     // set separator state to default state
    28         void $sepReset( ostype &, bool );                                       // set separator and default state
    29         const char * $sepGetCur( ostype & );                            // get current separator string
    30         void $sepSetCur( ostype &, const char [] );                     // set current separator string
    31         bool $getNL( ostype & );                                                        // check newline
    32         void $setNL( ostype &, bool );                                          // saw newline
    33         bool $getANL( ostype & );                                                       // get auto newline (on/off)
    34         bool $getPrt( ostype & );                                                       // get fmt called in output cascade
    35         void $setPrt( ostype &, bool );                                         // set fmt called in output cascade
     26        bool sepPrt( ostype & );                                                        // get separator state (on/off)
     27        void sepReset( ostype & );                                                      // set separator state to default state
     28        void sepReset( ostype &, bool );                                        // set separator and default state
     29        const char * sepGetCur( ostype & );                                     // get current separator string
     30        void sepSetCur( ostype &, const char * );                       // set current separator string
     31        bool getNL( ostype & );                                                         // check newline
     32        void setNL( ostype &, bool );                                           // saw newline
     33        bool getANL( ostype & );                                                        // get auto newline (on/off)
     34        bool getPrt( ostype & );                                                        // get fmt called in output cascade
     35        void setPrt( ostype &, bool );                                          // set fmt called in output cascade
    3636        // public
    3737        void sepOn( ostype & );                                                         // turn separator state on
     
    4343
    4444        const char * sepGet( ostype & );                                        // get separator string
    45         void sepSet( ostype &, const char [] );                         // set separator to string (15 character maximum)
     45        void sepSet( ostype &, const char * );                          // set separator to string (15 character maximum)
    4646        const char * sepGetTuple( ostype & );                           // get tuple separator string
    47         void sepSetTuple( ostype &, const char [] );            // set tuple separator to string (15 character maximum)
     47        void sepSetTuple( ostype &, const char * );                     // set tuple separator to string (15 character maximum)
    4848
    4949        void ends( ostype & os );                                                       // end of output statement
    5050        int fail( ostype & );
    5151        int flush( ostype & );
    52         void open( ostype & os, const char name[], const char mode[] );
     52        void open( ostype & os, const char * name, const char * mode );
    5353        void close( ostype & os );
    54         ostype & write( ostype &, const char [], size_t );
     54        ostype & write( ostype &, const char *, size_t );
    5555        int fmt( ostype &, const char format[], ... ) __attribute__(( format(printf, 2, 3) ));
    5656}; // ostream
     
    9898        ostype & ?|?( ostype &, unsigned long long int );
    9999        void ?|?( ostype &, unsigned long long int );
    100 #if defined( __SIZEOF_INT128__ )
    101         ostype & ?|?( ostype &, int128 );
    102         void ?|?( ostype &, int128 );
    103         ostype & ?|?( ostype &, unsigned int128 );
    104         void ?|?( ostype &, unsigned int128 );
    105 #endif // __SIZEOF_INT128__
    106100
    107101        ostype & ?|?( ostype &, float );
     
    119113        void ?|?( ostype &, long double _Complex );
    120114
    121         ostype & ?|?( ostype &, const char [] );
    122         void ?|?( ostype &, const char [] );
     115        ostype & ?|?( ostype &, const char * );
     116        void ?|?( ostype &, const char * );
    123117        // ostype & ?|?( ostype &, const char16_t * );
    124118#if ! ( __ARM_ARCH_ISA_ARM == 1 && __ARM_32BIT_STATE == 1 ) // char32_t == wchar_t => ambiguous
     
    212206IntegralFMTDecl( signed long long int, 'd' )
    213207IntegralFMTDecl( unsigned long long int, 'u' )
    214 #if defined( __SIZEOF_INT128__ )
    215 IntegralFMTDecl( int128, 'd' )
    216 IntegralFMTDecl( unsigned int128, 'u' )
    217 #endif
    218208
    219209//*********************************** floating point ***********************************
     
    266256
    267257static inline {
    268         _Ostream_Manip(const char *) bin( const char s[] ) { return (_Ostream_Manip(const char *))@{ s, 1, 0, 'b', { .all : 0 } }; }
    269         _Ostream_Manip(const char *) oct( const char s[] ) { return (_Ostream_Manip(const char *))@{ s, 1, 0, 'o', { .all : 0 } }; }
    270         _Ostream_Manip(const char *) hex( const char s[] ) { return (_Ostream_Manip(const char *))@{ s, 1, 0, 'x', { .all : 0 } }; }
    271         _Ostream_Manip(const char *) wd( unsigned int w, const char s[] ) { return (_Ostream_Manip(const char *))@{ s, w, 0, 's', { .all : 0 } }; }
    272         _Ostream_Manip(const char *) wd( unsigned int w, unsigned char pc, const char s[] ) { return (_Ostream_Manip(const char *))@{ s, w, pc, 's', { .flags.pc : true } }; }
     258        _Ostream_Manip(const char *) bin( const char * s ) { return (_Ostream_Manip(const char *))@{ s, 1, 0, 'b', { .all : 0 } }; }
     259        _Ostream_Manip(const char *) oct( const char * s ) { return (_Ostream_Manip(const char *))@{ s, 1, 0, 'o', { .all : 0 } }; }
     260        _Ostream_Manip(const char *) hex( const char * s ) { return (_Ostream_Manip(const char *))@{ s, 1, 0, 'x', { .all : 0 } }; }
     261        _Ostream_Manip(const char *) wd( unsigned int w, const char * s ) { return (_Ostream_Manip(const char *))@{ s, w, 0, 's', { .all : 0 } }; }
     262        _Ostream_Manip(const char *) wd( unsigned int w, unsigned char pc, const char * s ) { return (_Ostream_Manip(const char *))@{ s, w, pc, 's', { .flags.pc : true } }; }
    273263        _Ostream_Manip(const char *) & wd( unsigned int w, _Ostream_Manip(const char *) & fmt ) { fmt.wd = w; return fmt; }
    274264        _Ostream_Manip(const char *) & wd( unsigned int w, unsigned char pc, _Ostream_Manip(const char *) & fmt ) { fmt.wd = w; fmt.pc = pc; fmt.flags.pc = true; return fmt; }
     
    291281        int fail( istype & );
    292282        int eof( istype & );
    293         void open( istype & is, const char name[] );
     283        void open( istype & is, const char * name );
    294284        void close( istype & is );
    295285        istype & read( istype &, char *, size_t );
     
    326316        istype & ?|?( istype &, long double _Complex & );
    327317
    328 //      istype & ?|?( istype &, const char [] );
     318//      istype & ?|?( istype &, const char * );
    329319        istype & ?|?( istype &, char * );
    330320
     
    353343static inline {
    354344        _Istream_Cstr skip( unsigned int n ) { return (_Istream_Cstr){ 0p, 0p, n, { .all : 0 } }; }
    355         _Istream_Cstr skip( const char scanset[] ) { return (_Istream_Cstr){ 0p, scanset, -1, { .all : 0 } }; }
    356         _Istream_Cstr incl( const char scanset[], char * s ) { return (_Istream_Cstr){ s, scanset, -1, { .flags.inex : false } }; }
    357         _Istream_Cstr & incl( const char scanset[], _Istream_Cstr & fmt ) { fmt.scanset = scanset; fmt.flags.inex = false; return fmt; }
    358         _Istream_Cstr excl( const char scanset[], char * s ) { return (_Istream_Cstr){ s, scanset, -1, { .flags.inex : true } }; }
    359         _Istream_Cstr & excl( const char scanset[], _Istream_Cstr & fmt ) { fmt.scanset = scanset; fmt.flags.inex = true; return fmt; }
    360         _Istream_Cstr ignore( const char s[] ) { return (_Istream_Cstr)@{ s, 0p, -1, { .flags.ignore : true } }; }
     345        _Istream_Cstr skip( const char * scanset ) { return (_Istream_Cstr){ 0p, scanset, -1, { .all : 0 } }; }
     346        _Istream_Cstr incl( const char * scanset, char * s ) { return (_Istream_Cstr){ s, scanset, -1, { .flags.inex : false } }; }
     347        _Istream_Cstr & incl( const char * scanset, _Istream_Cstr & fmt ) { fmt.scanset = scanset; fmt.flags.inex = false; return fmt; }
     348        _Istream_Cstr excl( const char * scanset, char * s ) { return (_Istream_Cstr){ s, scanset, -1, { .flags.inex : true } }; }
     349        _Istream_Cstr & excl( const char * scanset, _Istream_Cstr & fmt ) { fmt.scanset = scanset; fmt.flags.inex = true; return fmt; }
     350        _Istream_Cstr ignore( const char * s ) { return (_Istream_Cstr)@{ s, 0p, -1, { .flags.ignore : true } }; }
    361351        _Istream_Cstr & ignore( _Istream_Cstr & fmt ) { fmt.flags.ignore = true; return fmt; }
    362         _Istream_Cstr wdi( unsigned int w, char s[] ) { return (_Istream_Cstr)@{ s, 0p, w, { .all : 0 } }; }
     352        _Istream_Cstr wdi( unsigned int w, char * s ) { return (_Istream_Cstr)@{ s, 0p, w, { .all : 0 } }; }
    363353        _Istream_Cstr & wdi( unsigned int w, _Istream_Cstr & fmt ) { fmt.wd = w; return fmt; }
    364354} // distribution
  • libcfa/src/math.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Mon Apr 18 23:37:04 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 10:27:11 2020
    13 // Update Count     : 117
     12// Last Modified On : Fri Jul 13 11:02:15 2018
     13// Update Count     : 116
    1414//
    1515
     
    5151static inline long double fdim( long double x, long double y ) { return fdiml( x, y ); }
    5252
    53 static inline float nan( const char tag[] ) { return nanf( tag ); }
    54 // extern "C" { double nan( const char [] ); }
    55 static inline long double nan( const char tag[] ) { return nanl( tag ); }
     53static inline float nan( const char * tag ) { return nanf( tag ); }
     54// extern "C" { double nan( const char * ); }
     55static inline long double nan( const char * tag ) { return nanl( tag ); }
    5656
    5757//---------------------- Exponential ----------------------
  • libcfa/src/rational.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed Apr  6 17:54:28 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Feb  8 17:56:36 2020
    13 // Update Count     : 187
     12// Last Modified On : Fri Jul 12 18:12:08 2019
     13// Update Count     : 184
    1414//
    1515
     
    5656        } // rational
    5757
    58         void ?{}( Rational(RationalImpl) & r, zero_t ) {
    59                 r{ (RationalImpl){0}, (RationalImpl){1} };
    60         } // rational
    61 
    62         void ?{}( Rational(RationalImpl) & r, one_t ) {
    63                 r{ (RationalImpl){1}, (RationalImpl){1} };
    64         } // rational
    6558
    6659        // getter for numerator/denominator
  • libcfa/src/startup.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Jul 24 16:21:57 2018
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 13:03:18 2020
    13 // Update Count     : 30
     12// Last Modified On : Wed Jul 25 16:42:01 2018
     13// Update Count     : 11
    1414//
    1515
    16 #include <time.h>                                                                               // tzset
    1716#include "startup.hfa"
     17#include <unistd.h>
     18
    1819
    1920extern "C" {
    20     void __cfaabi_appready_startup( void ) __attribute__(( constructor( STARTUP_PRIORITY_APPREADY ) ));
     21    static void __cfaabi_appready_startup( void ) __attribute__(( constructor( STARTUP_PRIORITY_APPREADY ) ));
    2122    void __cfaabi_appready_startup( void ) {
    22                 tzset();                                                                                // initialize time global variables
    2323                #ifdef __CFA_DEBUG__
    2424                extern void heapAppStart();
     
    2727    } // __cfaabi_appready_startup
    2828
    29     void __cfaabi_appready_shutdown( void ) __attribute__(( destructor( STARTUP_PRIORITY_APPREADY ) ));
     29    static void __cfaabi_appready_shutdown( void ) __attribute__(( destructor( STARTUP_PRIORITY_APPREADY ) ));
    3030    void __cfaabi_appready_shutdown( void ) {
    3131                #ifdef __CFA_DEBUG__
     
    4141struct __spinlock_t;
    4242extern "C" {
    43         void __cfaabi_dbg_record(struct __spinlock_t & this, const char prev_name[]) __attribute__(( weak )) {}
     43        void __cfaabi_dbg_record(struct __spinlock_t & this, const char * prev_name) __attribute__(( weak )) {}
    4444}
    4545
  • libcfa/src/stdhdr/assert.h

    r3d5701e r9fb8f01  
    1010// Created On       : Mon Jul  4 23:25:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 12:58:49 2020
    13 // Update Count     : 15
     12// Last Modified On : Mon Jul 31 23:09:32 2017
     13// Update Count     : 13
    1414//
    1515
     
    2727        #define assertf( expr, fmt, ... ) ((expr) ? ((void)0) : __assert_fail_f(__VSTRINGIFY__(expr), __FILE__, __LINE__, __PRETTY_FUNCTION__, fmt, ## __VA_ARGS__ ))
    2828
    29         void __assert_fail_f( const char assertion[], const char file[], unsigned int line, const char function[], const char fmt[], ... ) __attribute__((noreturn, format( printf, 5, 6) ));
     29        void __assert_fail_f( const char *assertion, const char *file, unsigned int line, const char *function, const char *fmt, ... ) __attribute__((noreturn, format( printf, 5, 6) ));
    3030#endif
    3131
  • libcfa/src/stdhdr/bfdlink.h

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Jul 18 07:26:04 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Feb  7 19:05:08 2020
    13 // Update Count     : 6
     12// Last Modified On : Sun Jul 22 13:49:30 2018
     13// Update Count     : 4
    1414//
    1515
    1616// include file uses the CFA keyword "with".
    1717#if ! defined( with )                                                                   // nesting ?
    18 #define with ``with                                                                             // make keyword an identifier
     18#define with `with`                                                                             // make keyword an identifier
    1919#define __CFA_BFDLINK_H__
    2020#endif
  • libcfa/src/stdhdr/hwloc.h

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Jul 18 07:45:00 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Feb  7 19:05:18 2020
    13 // Update Count     : 6
     12// Last Modified On : Sun Jul 22 13:49:58 2018
     13// Update Count     : 4
    1414//
    1515
    1616// include file uses the CFA keyword "thread".
    1717#if ! defined( thread )                                                                 // nesting ?
    18 #define thread ``thread                                                                 // make keyword an identifier
     18#define thread `thread`                                                                 // make keyword an identifier
    1919#define __CFA_HWLOC_H__
    2020#endif
  • libcfa/src/stdhdr/krb5.h

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Jul 18 07:55:44 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Feb  7 19:05:35 2020
    13 // Update Count     : 6
     12// Last Modified On : Sun Jul 22 13:50:24 2018
     13// Update Count     : 4
    1414//
    1515
    1616// include file uses the CFA keyword "enable".
    1717#if ! defined( enable )                                                                 // nesting ?
    18 #define enable ``enable                                                                 // make keyword an identifier
     18#define enable `enable`                                                                 // make keyword an identifier
    1919#define __CFA_KRB5_H__
    2020#endif
  • libcfa/src/stdhdr/math.h

    r3d5701e r9fb8f01  
    1010// Created On       : Mon Jul  4 23:25:26 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Feb  7 19:05:27 2020
    13 // Update Count     : 15
     12// Last Modified On : Thu Feb 22 18:16:07 2018
     13// Update Count     : 13
    1414//
    1515
    1616extern "C" {
    1717#if ! defined( exception )                                                              // nesting ?
    18 #define exception ``exception                                                   // make keyword an identifier
     18#define exception `exception`                                                   // make keyword an identifier
    1919#define __CFA_MATH_H__
    2020#endif
  • libcfa/src/stdhdr/sys/ucontext.h

    r3d5701e r9fb8f01  
    1010// Created On       : Thu Feb  8 23:48:16 2018
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Feb  7 19:05:41 2020
    13 // Update Count     : 6
     12// Last Modified On : Thu Feb  8 23:50:44 2018
     13// Update Count     : 4
    1414//
    1515
    1616#if ! defined( ftype )                                                                  // nesting ?
    17 #define ftype ``ftype                                                                   // make keyword an identifier
     17#define ftype `ftype`                                                                   // make keyword an identifier
    1818#define __CFA_UCONTEXT_H__
    1919#endif
  • libcfa/src/stdlib.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Thu Jan 28 17:10:29 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 08:27:08 2020
    13 // Update Count     : 486
     12// Last Modified On : Mon Jun 24 17:34:44 2019
     13// Update Count     : 462
    1414//
    1515
     
    2121#include <string.h>                                                                             // memcpy, memset
    2222#include <malloc.h>                                                                             // malloc_usable_size
    23 //#include <math.h>                                                                             // fabsf, fabs, fabsl
     23#include <math.h>                                                                               // fabsf, fabs, fabsl
    2424#include <complex.h>                                                                    // _Complex_I
    2525#include <assert.h>
     
    2727//---------------------------------------
    2828
    29 forall( dtype T | sized(T) ) {
    30         T * alloc_set( T ptr[], size_t dim, char fill ) {       // realloc array with fill
    31                 size_t olen = malloc_usable_size( ptr );                // current allocation
    32                 void * nptr = (void *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc
    33                 size_t nlen = malloc_usable_size( nptr );               // new allocation
    34                 if ( nlen > olen ) {                                                    // larger ?
    35                         memset( (char *)nptr + olen, (int)fill, nlen - olen ); // initialize added storage
    36                 } // if
    37                 return (T *)nptr;
    38         } // alloc_set
    39 
    40         T * alloc_align_set( T ptr[], size_t align, char fill ) { // aligned realloc with fill
    41                 size_t olen = malloc_usable_size( ptr );                // current allocation
    42                 void * nptr = (void *)realloc( (void *)ptr, align, sizeof(T) ); // CFA realloc
    43                 // char * nptr = alloc_align( ptr, align );
    44                 size_t nlen = malloc_usable_size( nptr );               // new allocation
    45                 if ( nlen > olen ) {                                                    // larger ?
    46                         memset( (char *)nptr + olen, (int)fill, nlen - olen ); // initialize added storage
    47                 } // if
    48                 return (T *)nptr;
    49         } // alloc_align_set
    50 } // distribution
     29// resize, non-array types
     30forall( dtype T | sized(T) ) T * alloc( T ptr[], size_t dim, char fill ) {
     31        size_t olen = malloc_usable_size( ptr );                        // current allocation
     32    char * nptr = (void *)realloc( (void *)ptr, dim * (size_t)sizeof(T) ); // C realloc
     33        size_t nlen = malloc_usable_size( nptr );                       // new allocation
     34        if ( nlen > olen ) {                                                            // larger ?
     35                memset( nptr + olen, (int)fill, nlen - olen );  // initialize added storage
     36        } //
     37    return (T *)nptr;
     38} // alloc
    5139
    5240// allocation/deallocation and constructor/destructor, non-array types
    5341forall( dtype T | sized(T), ttype Params | { void ?{}( T &, Params ); } )
    5442T * new( Params p ) {
    55         return &(*malloc()){ p };                                                       // run constructor
     43        return &(*malloc()){ p };                                                               // run constructor
    5644} // new
    5745
     
    5947void delete( T * ptr ) {
    6048        if ( ptr ) {                                                                            // ignore null
    61                 ^(*ptr){};                                                                              // run destructor
     49                ^(*ptr){};                                                                                      // run destructor
    6250                free( ptr );
    6351        } // if
     
    6755void delete( T * ptr, Params rest ) {
    6856        if ( ptr ) {                                                                            // ignore null
    69                 ^(*ptr){};                                                                              // run destructor
     57                ^(*ptr){};                                                                                      // run destructor
    7058                free( ptr );
    7159        } // if
     
    10795//---------------------------------------
    10896
    109 float _Complex strto( const char sptr[], char ** eptr ) {
     97float _Complex strto( const char * sptr, char ** eptr ) {
    11098        float re, im;
    11199        char * eeptr;
     
    118106} // strto
    119107
    120 double _Complex strto( const char sptr[], char ** eptr ) {
     108double _Complex strto( const char * sptr, char ** eptr ) {
    121109        double re, im;
    122110        char * eeptr;
     
    129117} // strto
    130118
    131 long double _Complex strto( const char sptr[], char ** eptr ) {
     119long double _Complex strto( const char * sptr, char ** eptr ) {
    132120        long double re, im;
    133121        char * eeptr;
  • libcfa/src/stdlib.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Thu Jan 28 17:12:35 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 08:27:01 2020
    13 // Update Count     : 401
     12// Last Modified On : Tue Jul 23 14:14:59 2019
     13// Update Count     : 373
    1414//
    1515
     
    2525        void * memset( void * dest, int fill, size_t size ); // string.h
    2626        void * memcpy( void * dest, const void * src, size_t size ); // string.h
    27     void * cmemalign( size_t alignment, size_t noOfElems, size_t elemSize ); // CFA heap
     27    void * cmemalign( size_t alignment, size_t noOfElems, size_t elemSize ); // CFA
    2828} // extern "C"
    29 
    30 void * realloc( void * oaddr, size_t nalign, size_t size ); // CFA heap
    3129
    3230//---------------------------------------
     
    5250        } // calloc
    5351
    54         T * realloc( T * ptr, size_t size ) {                           // CFA realloc, eliminate return-type cast
    55                 return (T *)(void *)realloc( (void *)ptr, size ); // C realloc
     52        T * realloc( T * ptr, size_t size ) {
     53                if ( unlikely( ptr == 0 ) ) return malloc();
     54                return (T *)(void *)realloc( (void *)ptr, size );
    5655        } // realloc
    5756
    5857        T * memalign( size_t align ) {
    59                 return (T *)memalign( align, sizeof(T) );               // C memalign
     58                return (T *)memalign( align, sizeof(T) );
    6059        } // memalign
    6160
    62         T * cmemalign( size_t align, size_t dim  ) {
    63                 return (T *)cmemalign( align, dim, sizeof(T) ); // CFA cmemalign
    64         } // cmemalign
    65 
    6661        T * aligned_alloc( size_t align ) {
    67                 return (T *)aligned_alloc( align, sizeof(T) );  // C aligned_alloc
     62                return (T *)aligned_alloc( align, sizeof(T) );
    6863        } // aligned_alloc
    6964
     
    7267        } // posix_memalign
    7368
     69
    7470        // Cforall dynamic allocation
    7571
     
    7874        } // alloc
    7975
     76        T * alloc( char fill ) {
     77                T * ptr;
     78                if ( _Alignof(T) <= libAlign() ) ptr = (T *)(void *)malloc( (size_t)sizeof(T) ); // C malloc
     79                else ptr = (T *)memalign( _Alignof(T), sizeof(T) );
     80                return (T *)memset( ptr, (int)fill, sizeof(T) ); // initialize with fill value
     81        } // alloc
     82
    8083        T * alloc( size_t dim ) {
    81                 if ( _Alignof(T) <= libAlign() ) return (T *)(void *)malloc( dim * (size_t)sizeof(T) );
     84                if ( _Alignof(T) <= libAlign() ) return (T *)(void *)malloc( dim * (size_t)sizeof(T) ); // C malloc
    8285                else return (T *)memalign( _Alignof(T), dim * sizeof(T) );
    8386        } // alloc
    8487
    85         T * alloc( T ptr[], size_t dim ) {                                      // realloc
    86                 return (T *)(void *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc
    87         } // alloc
    88 
    89         T * alloc_set( char fill ) {
    90                 return (T *)memset( (T *)alloc(), (int)fill, sizeof(T) ); // initialize with fill value
    91         } // alloc
    92 
    93         T * alloc_set( T fill ) {
    94                 return (T *)memcpy( (T *)alloc(), &fill, sizeof(T) ); // initialize with fill value
    95         } // alloc
    96 
    97         T * alloc_set( size_t dim, char fill ) {
     88        T * alloc( size_t dim, char fill ) {
    9889                return (T *)memset( (T *)alloc( dim ), (int)fill, dim * sizeof(T) ); // initialize with fill value
    9990        } // alloc
    10091
    101         T * alloc_set( size_t dim, T fill ) {
    102                 T * r = (T *)alloc( dim );
    103                 for ( i; dim ) { memcpy( &r[i], &fill, sizeof(T) ); } // initialize with fill value
    104                 return r;
    105         } // alloc
    106 
    107         T * alloc_set( size_t dim, const T fill[] ) {
    108                 return (T *)memcpy( (T *)alloc( dim ), fill, dim * sizeof(T) ); // initialize with fill value
    109         } // alloc
    110 } // distribution
    111 
    112 forall( dtype T | sized(T) ) {
    113         T * alloc_set( T ptr[], size_t dim, char fill );        // realloc array with fill
    114 } // distribution
    115 
    116 static inline forall( dtype T | sized(T) ) {
    117         T * alloc_align( size_t align ) {
     92        T * alloc( T ptr[], size_t dim ) {
     93                return realloc( ptr, dim * sizeof(T) );
     94        } // alloc
     95} // distribution
     96
     97
     98static inline forall( dtype T | sized(T) ) {
     99        T * align_alloc( size_t align ) {
    118100                return (T *)memalign( align, sizeof(T) );
    119         } // alloc_align
    120 
    121         T * alloc_align( size_t align, size_t dim ) {
     101        } // align_alloc
     102
     103        T * align_alloc( size_t align, char fill ) {
     104                T * ptr = (T *)memalign( align, sizeof(T) );
     105                return (T *)memset( ptr, (int)fill, sizeof(T) );
     106        } // align_alloc
     107
     108        T * align_alloc( size_t align, size_t dim ) {
    122109                return (T *)memalign( align, dim * sizeof(T) );
    123         } // alloc_align
    124 
    125         T * alloc_align( T ptr[], size_t align ) {                      // aligned realloc array
    126                 return (T *)(void *)realloc( (void *)ptr, align, sizeof(T) ); // CFA realloc
    127         } // alloc_align
    128 
    129         T * alloc_align( T ptr[], size_t align, size_t dim ) { // aligned realloc array
    130                 return (T *)(void *)realloc( (void *)ptr, align, dim * sizeof(T) ); // CFA realloc
    131         } // alloc_align
    132 
    133         T * alloc_align_set( size_t align, char fill ) {
    134                 return (T *)memset( (T *)alloc_align( align ), (int)fill, sizeof(T) ); // initialize with fill value
    135         } // alloc_align
    136 
    137         T * alloc_align_set( size_t align, T fill ) {
    138                 return (T *)memcpy( (T *)alloc_align( align ), &fill, sizeof(T) ); // initialize with fill value
    139         } // alloc_align
    140 
    141         T * alloc_align_set( size_t align, size_t dim, char fill ) {
    142                 return (T *)memset( (T *)alloc_align( align, dim ), (int)fill, dim * sizeof(T) ); // initialize with fill value
    143         } // alloc_align
    144 
    145         T * alloc_align_set( size_t align, size_t dim, T fill ) {
    146                 T * r = (T *)alloc_align( align, dim );
    147                 for ( i; dim ) { memcpy( &r[i], &fill, sizeof(T) ); } // initialize with fill value
    148                 return r;
    149         } // alloc_align
    150 
    151         T * alloc_align_set( size_t align, size_t dim, const T fill[] ) {
    152                 return (T *)memcpy( (T *)alloc_align( align, dim ), fill, dim * sizeof(T) );
    153         } // alloc_align
    154 } // distribution
    155 
    156 forall( dtype T | sized(T) ) {
    157         T * alloc_align_set( T ptr[], size_t align, size_t dim, char fill ); // aligned realloc array with fill
    158 } // distribution
     110        } // align_alloc
     111
     112        T * align_alloc( size_t align, size_t dim, char fill ) {
     113                if ( fill == '\0' ) {
     114                        return (T *)cmemalign( align, dim, sizeof(T) );
     115                } else {
     116                        return (T *)memset( (T *)memalign( align, dim * sizeof(T) ), (int)fill, dim * sizeof(T) );
     117                } // if
     118        } // align_alloc
     119} // distribution
     120
     121forall( dtype T | sized(T) ) T * alloc( T ptr[], size_t dim, char fill );
     122
    159123
    160124static inline forall( dtype T | sized(T) ) {
    161125        // data, non-array types
     126
    162127        T * memset( T * dest, char fill ) {
    163128                return (T *)memset( dest, fill, sizeof(T) );
     
    171136static inline forall( dtype T | sized(T) ) {
    172137        // data, array types
     138
    173139        T * amemset( T dest[], char fill, size_t dim ) {
    174140                return (T *)(void *)memset( dest, fill, dim * sizeof(T) ); // C memset
     
    193159
    194160static inline {
    195         int strto( const char sptr[], char ** eptr, int base ) { return (int)strtol( sptr, eptr, base ); }
    196         unsigned int strto( const char sptr[], char ** eptr, int base ) { return (unsigned int)strtoul( sptr, eptr, base ); }
    197         long int strto( const char sptr[], char ** eptr, int base ) { return strtol( sptr, eptr, base ); }
    198         unsigned long int strto( const char sptr[], char ** eptr, int base ) { return strtoul( sptr, eptr, base ); }
    199         long long int strto( const char sptr[], char ** eptr, int base ) { return strtoll( sptr, eptr, base ); }
    200         unsigned long long int strto( const char sptr[], char ** eptr, int base ) { return strtoull( sptr, eptr, base ); }
    201 
    202         float strto( const char sptr[], char ** eptr ) { return strtof( sptr, eptr ); }
    203         double strto( const char sptr[], char ** eptr ) { return strtod( sptr, eptr ); }
    204         long double strto( const char sptr[], char ** eptr ) { return strtold( sptr, eptr ); }
    205 } // distribution
    206 
    207 float _Complex strto( const char sptr[], char ** eptr );
    208 double _Complex strto( const char sptr[], char ** eptr );
    209 long double _Complex strto( const char sptr[], char ** eptr );
     161        int strto( const char * sptr, char ** eptr, int base ) { return (int)strtol( sptr, eptr, base ); }
     162        unsigned int strto( const char * sptr, char ** eptr, int base ) { return (unsigned int)strtoul( sptr, eptr, base ); }
     163        long int strto( const char * sptr, char ** eptr, int base ) { return strtol( sptr, eptr, base ); }
     164        unsigned long int strto( const char * sptr, char ** eptr, int base ) { return strtoul( sptr, eptr, base ); }
     165        long long int strto( const char * sptr, char ** eptr, int base ) { return strtoll( sptr, eptr, base ); }
     166        unsigned long long int strto( const char * sptr, char ** eptr, int base ) { return strtoull( sptr, eptr, base ); }
     167
     168        float strto( const char * sptr, char ** eptr ) { return strtof( sptr, eptr ); }
     169        double strto( const char * sptr, char ** eptr ) { return strtod( sptr, eptr ); }
     170        long double strto( const char * sptr, char ** eptr ) { return strtold( sptr, eptr ); }
     171} // distribution
     172
     173float _Complex strto( const char * sptr, char ** eptr );
     174double _Complex strto( const char * sptr, char ** eptr );
     175long double _Complex strto( const char * sptr, char ** eptr );
    210176
    211177static inline {
    212         int ato( const char sptr[] ) { return (int)strtol( sptr, 0p, 10 ); }
    213         unsigned int ato( const char sptr[] ) { return (unsigned int)strtoul( sptr, 0p, 10 ); }
    214         long int ato( const char sptr[] ) { return strtol( sptr, 0p, 10 ); }
    215         unsigned long int ato( const char sptr[] ) { return strtoul( sptr, 0p, 10 ); }
    216         long long int ato( const char sptr[] ) { return strtoll( sptr, 0p, 10 ); }
    217         unsigned long long int ato( const char sptr[] ) { return strtoull( sptr, 0p, 10 ); }
    218 
    219         float ato( const char sptr[] ) { return strtof( sptr, 0p ); }
    220         double ato( const char sptr[] ) { return strtod( sptr, 0p ); }
    221         long double ato( const char sptr[] ) { return strtold( sptr, 0p ); }
    222 
    223         float _Complex ato( const char sptr[] ) { return strto( sptr, 0p ); }
    224         double _Complex ato( const char sptr[] ) { return strto( sptr, 0p ); }
    225         long double _Complex ato( const char sptr[] ) { return strto( sptr, 0p ); }
     178        int ato( const char * sptr ) { return (int)strtol( sptr, 0, 10 ); }
     179        unsigned int ato( const char * sptr ) { return (unsigned int)strtoul( sptr, 0, 10 ); }
     180        long int ato( const char * sptr ) { return strtol( sptr, 0, 10 ); }
     181        unsigned long int ato( const char * sptr ) { return strtoul( sptr, 0, 10 ); }
     182        long long int ato( const char * sptr ) { return strtoll( sptr, 0, 10 ); }
     183        unsigned long long int ato( const char * sptr ) { return strtoull( sptr, 0, 10 ); }
     184
     185        float ato( const char * sptr ) { return strtof( sptr, 0 ); }
     186        double ato( const char * sptr ) { return strtod( sptr, 0 ); }
     187        long double ato( const char * sptr ) { return strtold( sptr, 0 ); }
     188
     189        float _Complex ato( const char * sptr ) { return strto( sptr, NULL ); }
     190        double _Complex ato( const char * sptr ) { return strto( sptr, NULL ); }
     191        long double _Complex ato( const char * sptr ) { return strto( sptr, NULL ); }
    226192} // distribution
    227193
  • libcfa/src/time.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Mar 27 13:33:14 2018
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 08:24:18 2020
    13 // Update Count     : 70
     12// Last Modified On : Sat Jul 13 08:41:55 2019
     13// Update Count     : 65
    1414//
    1515
     
    3333forall( dtype ostype | ostream( ostype ) ) {
    3434        ostype & ?|?( ostype & os, Duration dur ) with( dur ) {
    35                 (ostype &)(os | tn / TIMEGRAN);                                 // print seconds
    36                 long int ns = (tn < 0 ? -tn : tn) % TIMEGRAN;   // compute nanoseconds
     35                (ostype &)(os | tv / TIMEGRAN);                                 // print seconds
     36                long int ns = (tv < 0 ? -tv : tv) % TIMEGRAN;   // compute nanoseconds
    3737                if ( ns != 0 ) {                                                                // some ?
    3838                        char buf[16];
     
    5252
    5353#ifdef __CFA_DEBUG__
    54 static void tabort( int year, int month, int day, int hour, int min, int sec, int64_t nsec ) {
     54static void tabort( int year, int month, int day, int hour, int min, int sec, int nsec ) {
    5555        abort | "Attempt to create Time( year=" | year | "(>=1970), month=" | month | "(1-12), day=" | day | "(1-31), hour=" | hour | "(0-23), min=" | min | "(0-59), sec=" | sec
    56                   | "(0-60), nsec=" | nsec | "(0-999_999_999), which is not in the range 00:00:00 UTC, January 1, 1970 to 03:14:07 UTC, January 19, 2038, where month and day have 1 origin.";
     56                  | "(0-60), nsec=" | nsec | "(0-999_999_999), which exceeds range 00:00:00 UTC, January 1, 1970 to 03:14:07 UTC, January 19, 2038.";
    5757} // tabort
    5858#endif // __CFA_DEBUG__
    5959
    60 void ?{}( Time & time, int year, int month, int day, int hour, int min, int sec, int64_t nsec ) with( time ) {
     60void ?{}( Time & time, int year, int month, int day, int hour, int min, int sec, int nsec ) with( time ) {
    6161        tm tm;
    6262
    63         // Values can be in any range (+/-) but result must be in the epoch.
     63        tm.tm_isdst = -1;                                                                       // let mktime determine if alternate timezone is in effect
    6464        tm.tm_year = year - 1900;                                                       // mktime uses 1900 as its starting point
    65         // Make month in range 1-12 to match with day.
     65#ifdef __CFA_DEBUG__
     66        if ( month < 1 || 12 < month ) {
     67                tabort( year, month, day, hour, min, sec, nsec );
     68        } // if
     69#endif // __CFA_DEBUG__
    6670        tm.tm_mon = month - 1;                                                          // mktime uses range 0-11
     71#ifdef __CFA_DEBUG__
     72        if ( day < 1 || 31 < day ) {
     73                tabort( year, month, day, hour, min, sec, nsec );
     74        } // if
     75#endif // __CFA_DEBUG__
    6776        tm.tm_mday = day;                                                                       // mktime uses range 1-31
    6877        tm.tm_hour = hour;
    6978        tm.tm_min = min;
    7079        tm.tm_sec = sec;
    71         tm.tm_isdst = -1;                                                                       // let mktime determine if alternate timezone is in effect
    7280        time_t epochsec = mktime( &tm );
    7381#ifdef __CFA_DEBUG__
    74         if ( epochsec <= (time_t)-1 ) {                                         // MUST BE LESS THAN OR EQUAL!
     82        if ( epochsec == (time_t)-1 ) {
    7583                tabort( year, month, day, hour, min, sec, nsec );
    7684        } // if
    7785#endif // __CFA_DEBUG__
    78         tn = (int64_t)(epochsec) * TIMEGRAN + nsec;                     // convert to nanoseconds
     86        tv = (int64_t)(epochsec) * TIMEGRAN + nsec;                     // convert to nanoseconds
    7987#ifdef __CFA_DEBUG__
    80         if ( tn > 2147483647LL * TIMEGRAN ) {                           // between 00:00:00 UTC, January 1, 1970 and 03:14:07 UTC, January 19, 2038.
     88        if ( tv > 2147483647LL * TIMEGRAN ) {                           // between 00:00:00 UTC, January 1, 1970 and 03:14:07 UTC, January 19, 2038.
    8189                tabort( year, month, day, hour, min, sec, nsec );
    8290        } // if
     
    8593
    8694char * yy_mm_dd( Time time, char * buf ) with( time ) {
    87         time_t s = tn / TIMEGRAN;
     95        time_t s = tv / TIMEGRAN;
    8896        tm tm;
    8997        gmtime_r( &s, &tm );                                                            // tm_mon <= 11, tm_mday <= 31
     
    100108
    101109char * mm_dd_yy( Time time, char * buf ) with( time ) {
    102         time_t s = tn / TIMEGRAN;
     110        time_t s = tv / TIMEGRAN;
    103111        tm tm;
    104112        gmtime_r( &s, &tm );                                                            // tm_mon <= 11, tm_mday <= 31
     
    115123
    116124char * dd_mm_yy( Time time, char * buf ) with( time ) {
    117         time_t s = tn / TIMEGRAN;
     125        time_t s = tv / TIMEGRAN;
    118126        tm tm;
    119127        gmtime_r( &s, &tm );                                                            // tm_mon <= 11, tm_mday <= 31
     
    129137} // dd_mm_yy
    130138
    131 size_t strftime( char buf[], size_t size, const char fmt[], Time time ) with( time ) {
    132         time_t s = tn / TIMEGRAN;
     139size_t strftime( char * buf, size_t size, const char * fmt, Time time ) with( time ) {
     140        time_t s = tv / TIMEGRAN;
    133141        tm tm;
    134142        gmtime_r( &s, &tm );
     
    139147        ostype & ?|?( ostype & os, Time time ) with( time ) {
    140148                char buf[32];                                                                   // at least 26
    141                 time_t s = tn / TIMEGRAN;
     149                time_t s = tv / TIMEGRAN;
    142150                ctime_r( &s, (char *)&buf );                                    // 26 characters: "Wed Jun 30 21:49:08 1993\n"
    143151                buf[24] = '\0';                                                                 // remove trailing '\n'
    144                 long int ns = (tn < 0 ? -tn : tn) % TIMEGRAN;   // compute nanoseconds
     152                long int ns = (tv < 0 ? -tv : tv) % TIMEGRAN;   // compute nanoseconds
    145153                if ( ns == 0 ) {                                                                // none ?
    146154                        (ostype &)(os | buf);                                           // print date/time/year
  • libcfa/src/time.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed Mar 14 23:18:57 2018
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 08:24:32 2020
    13 // Update Count     : 654
     12// Last Modified On : Sat Sep 22 12:25:34 2018
     13// Update Count     : 643
    1414//
    1515
     
    3232        Duration ?=?( Duration & dur, __attribute__((unused)) zero_t ) { return dur{ 0 }; }
    3333
    34         Duration +?( Duration rhs ) with( rhs ) { return (Duration)@{ +tn }; }
    35         Duration ?+?( Duration & lhs, Duration rhs ) { return (Duration)@{ lhs.tn + rhs.tn }; }
     34        Duration +?( Duration rhs ) with( rhs ) {       return (Duration)@{ +tv }; }
     35        Duration ?+?( Duration & lhs, Duration rhs ) { return (Duration)@{ lhs.tv + rhs.tv }; }
    3636        Duration ?+=?( Duration & lhs, Duration rhs ) { lhs = lhs + rhs; return lhs; }
    3737
    38         Duration -?( Duration rhs ) with( rhs ) { return (Duration)@{ -tn }; }
    39         Duration ?-?( Duration & lhs, Duration rhs ) { return (Duration)@{ lhs.tn - rhs.tn }; }
     38        Duration -?( Duration rhs ) with( rhs ) { return (Duration)@{ -tv }; }
     39        Duration ?-?( Duration & lhs, Duration rhs ) { return (Duration)@{ lhs.tv - rhs.tv }; }
    4040        Duration ?-=?( Duration & lhs, Duration rhs ) { lhs = lhs - rhs; return lhs; }
    4141
    42         Duration ?*?( Duration lhs, int64_t rhs ) { return (Duration)@{ lhs.tn * rhs }; }
    43         Duration ?*?( int64_t lhs, Duration rhs ) { return (Duration)@{ lhs * rhs.tn }; }
     42        Duration ?*?( Duration lhs, int64_t rhs ) { return (Duration)@{ lhs.tv * rhs }; }
     43        Duration ?*?( int64_t lhs, Duration rhs ) { return (Duration)@{ lhs * rhs.tv }; }
    4444        Duration ?*=?( Duration & lhs, int64_t rhs ) { lhs = lhs * rhs; return lhs; }
    4545
    46         int64_t ?/?( Duration lhs, Duration rhs ) { return lhs.tn / rhs.tn; }
    47         Duration ?/?( Duration lhs, int64_t rhs ) { return (Duration)@{ lhs.tn / rhs }; }
     46        int64_t ?/?( Duration lhs, Duration rhs ) { return lhs.tv / rhs.tv; }
     47        Duration ?/?( Duration lhs, int64_t rhs ) { return (Duration)@{ lhs.tv / rhs }; }
    4848        Duration ?/=?( Duration & lhs, int64_t rhs ) { lhs = lhs / rhs; return lhs; }
    49         double div( Duration lhs, Duration rhs ) { return (double)lhs.tn / (double)rhs.tn; }
    50 
    51         Duration ?%?( Duration lhs, Duration rhs ) { return (Duration)@{ lhs.tn % rhs.tn }; }
     49        double div( Duration lhs, Duration rhs ) { return (double)lhs.tv / (double)rhs.tv; }
     50
     51        Duration ?%?( Duration lhs, Duration rhs ) { return (Duration)@{ lhs.tv % rhs.tv }; }
    5252        Duration ?%=?( Duration & lhs, Duration rhs ) { lhs = lhs % rhs; return lhs; }
    5353
    54         bool ?==?( Duration lhs, Duration rhs ) { return lhs.tn == rhs.tn; }
    55         bool ?!=?( Duration lhs, Duration rhs ) { return lhs.tn != rhs.tn; }
    56         bool ?<? ( Duration lhs, Duration rhs ) { return lhs.tn <  rhs.tn; }
    57         bool ?<=?( Duration lhs, Duration rhs ) { return lhs.tn <= rhs.tn; }
    58         bool ?>? ( Duration lhs, Duration rhs ) { return lhs.tn >  rhs.tn; }
    59         bool ?>=?( Duration lhs, Duration rhs ) { return lhs.tn >= rhs.tn; }
    60 
    61         bool ?==?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn == 0; }
    62         bool ?!=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn != 0; }
    63         bool ?<? ( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn <  0; }
    64         bool ?<=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn <= 0; }
    65         bool ?>? ( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn >  0; }
    66         bool ?>=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tn >= 0; }
    67 
    68         Duration abs( Duration rhs ) { return rhs.tn >= 0 ? rhs : -rhs; }
     54        bool ?==?( Duration lhs, Duration rhs ) { return lhs.tv == rhs.tv; }
     55        bool ?!=?( Duration lhs, Duration rhs ) { return lhs.tv != rhs.tv; }
     56        bool ?<? ( Duration lhs, Duration rhs ) { return lhs.tv <  rhs.tv; }
     57        bool ?<=?( Duration lhs, Duration rhs ) { return lhs.tv <= rhs.tv; }
     58        bool ?>? ( Duration lhs, Duration rhs ) { return lhs.tv >  rhs.tv; }
     59        bool ?>=?( Duration lhs, Duration rhs ) { return lhs.tv >= rhs.tv; }
     60
     61        bool ?==?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tv == 0; }
     62        bool ?!=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tv != 0; }
     63        bool ?<? ( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tv <  0; }
     64        bool ?<=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tv <= 0; }
     65        bool ?>? ( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tv >  0; }
     66        bool ?>=?( Duration lhs, __attribute__((unused)) zero_t ) { return lhs.tv >= 0; }
     67
     68        Duration abs( Duration rhs ) { return rhs.tv >= 0 ? rhs : -rhs; }
    6969
    7070        Duration ?`ns( int64_t nsec ) { return (Duration)@{ nsec }; }
     
    8282        Duration ?`w( double weeks ) { return (Duration)@{ weeks * (7LL * 24LL * 60LL * 60LL * TIMEGRAN) }; }
    8383
    84         int64_t ?`ns( Duration dur ) { return dur.tn; }
    85         int64_t ?`us( Duration dur ) { return dur.tn / (TIMEGRAN / 1_000_000LL); }
    86         int64_t ?`ms( Duration dur ) { return dur.tn / (TIMEGRAN / 1_000LL); }
    87         int64_t ?`s( Duration dur ) { return dur.tn / TIMEGRAN; }
    88         int64_t ?`m( Duration dur ) { return dur.tn / (60LL * TIMEGRAN); }
    89         int64_t ?`h( Duration dur ) { return dur.tn / (60LL * 60LL * TIMEGRAN); }
    90         int64_t ?`d( Duration dur ) { return dur.tn / (24LL * 60LL * 60LL * TIMEGRAN); }
    91         int64_t ?`w( Duration dur ) { return dur.tn / (7LL * 24LL * 60LL * 60LL * TIMEGRAN); }
    92 
    93         Duration max( Duration lhs, Duration rhs ) { return  (lhs.tn < rhs.tn) ? rhs : lhs;}
    94         Duration min( Duration lhs, Duration rhs ) { return !(rhs.tn < lhs.tn) ? lhs : rhs;}
     84        int64_t ?`ns( Duration dur ) { return dur.tv; }
     85        int64_t ?`us( Duration dur ) { return dur.tv / (TIMEGRAN / 1_000_000LL); }
     86        int64_t ?`ms( Duration dur ) { return dur.tv / (TIMEGRAN / 1_000LL); }
     87        int64_t ?`s( Duration dur ) { return dur.tv / TIMEGRAN; }
     88        int64_t ?`m( Duration dur ) { return dur.tv / (60LL * TIMEGRAN); }
     89        int64_t ?`h( Duration dur ) { return dur.tv / (60LL * 60LL * TIMEGRAN); }
     90        int64_t ?`d( Duration dur ) { return dur.tv / (24LL * 60LL * 60LL * TIMEGRAN); }
     91        int64_t ?`w( Duration dur ) { return dur.tv / (7LL * 24LL * 60LL * 60LL * TIMEGRAN); }
     92
     93        Duration max( Duration lhs, Duration rhs ) { return  (lhs.tv < rhs.tv) ? rhs : lhs;}
     94        Duration min( Duration lhs, Duration rhs ) { return !(rhs.tv < lhs.tv) ? lhs : rhs;}
    9595} // distribution
    9696
     
    143143//######################### Time #########################
    144144
    145 void ?{}( Time & time, int year, int month = 1, int day = 1, int hour = 0, int min = 0, int sec = 0, int64_t nsec = 0 );
     145void ?{}( Time & time, int year, int month = 0, int day = 0, int hour = 0, int min = 0, int sec = 0, int nsec = 0 );
    146146static inline {
    147147        Time ?=?( Time & time, __attribute__((unused)) zero_t ) { return time{ 0 }; }
    148148
    149         void ?{}( Time & time, timeval t ) with( time ) { tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * 1000; }
     149        void ?{}( Time & time, timeval t ) with( time ) { tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * 1000; }
    150150        Time ?=?( Time & time, timeval t ) with( time ) {
    151                 tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * (TIMEGRAN / 1_000_000LL);
     151                tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * (TIMEGRAN / 1_000_000LL);
    152152                return time;
    153153        } // ?=?
    154154
    155         void ?{}( Time & time, timespec t ) with( time ) { tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec; }
     155        void ?{}( Time & time, timespec t ) with( time ) { tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec; }
    156156        Time ?=?( Time & time, timespec t ) with( time ) {
    157                 tn = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec;
     157                tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec;
    158158                return time;
    159159        } // ?=?
    160160
    161         Time ?+?( Time & lhs, Duration rhs ) { return (Time)@{ lhs.tn + rhs.tn }; }
     161        Time ?+?( Time & lhs, Duration rhs ) { return (Time)@{ lhs.tv + rhs.tv }; }
    162162        Time ?+?( Duration lhs, Time rhs ) { return rhs + lhs; }
    163163        Time ?+=?( Time & lhs, Duration rhs ) { lhs = lhs + rhs; return lhs; }
    164164
    165         Duration ?-?( Time lhs, Time rhs ) { return (Duration)@{ lhs.tn - rhs.tn }; }
    166         Time ?-?( Time lhs, Duration rhs ) { return (Time)@{ lhs.tn - rhs.tn }; }
     165        Duration ?-?( Time lhs, Time rhs ) { return (Duration)@{ lhs.tv - rhs.tv }; }
     166        Time ?-?( Time lhs, Duration rhs ) { return (Time)@{ lhs.tv - rhs.tv }; }
    167167        Time ?-=?( Time & lhs, Duration rhs ) { lhs = lhs - rhs; return lhs; }
    168         bool ?==?( Time lhs, Time rhs ) { return lhs.tn == rhs.tn; }
    169         bool ?!=?( Time lhs, Time rhs ) { return lhs.tn != rhs.tn; }
    170         bool ?<?( Time lhs, Time rhs ) { return lhs.tn < rhs.tn; }
    171         bool ?<=?( Time lhs, Time rhs ) { return lhs.tn <= rhs.tn; }
    172         bool ?>?( Time lhs, Time rhs ) { return lhs.tn > rhs.tn; }
    173         bool ?>=?( Time lhs, Time rhs ) { return lhs.tn >= rhs.tn; }
    174 
    175         int64_t ?`ns( Time t ) { return t.tn; }
     168        bool ?==?( Time lhs, Time rhs ) { return lhs.tv == rhs.tv; }
     169        bool ?!=?( Time lhs, Time rhs ) { return lhs.tv != rhs.tv; }
     170        bool ?<?( Time lhs, Time rhs ) { return lhs.tv < rhs.tv; }
     171        bool ?<=?( Time lhs, Time rhs ) { return lhs.tv <= rhs.tv; }
     172        bool ?>?( Time lhs, Time rhs ) { return lhs.tv > rhs.tv; }
     173        bool ?>=?( Time lhs, Time rhs ) { return lhs.tv >= rhs.tv; }
    176174} // distribution
    177175
     
    191189} // dmy
    192190
    193 size_t strftime( char buf[], size_t size, const char fmt[], Time time );
     191size_t strftime( char * buf, size_t size, const char * fmt, Time time );
    194192
    195193//------------------------- timeval (cont) -------------------------
    196194
    197195static inline void ?{}( timeval & t, Time time ) with( t, time ) {
    198         tv_sec = tn / TIMEGRAN;                                                         // seconds
    199         tv_usec = tn % TIMEGRAN / (TIMEGRAN / 1_000_000LL);     // microseconds
     196        tv_sec = tv / TIMEGRAN;                                                         // seconds
     197        tv_usec = tv % TIMEGRAN / (TIMEGRAN / 1_000_000LL);     // microseconds
    200198} // ?{}
    201199
     
    203201
    204202static inline void ?{}( timespec & t, Time time ) with( t, time ) {
    205         tv_sec = tn / TIMEGRAN;                                                         // seconds
    206         tv_nsec = tn % TIMEGRAN;                                                        // nanoseconds
     203        tv_sec = tv / TIMEGRAN;                                                         // seconds
     204        tv_nsec = tv % TIMEGRAN;                                                        // nanoseconds
    207205} // ?{}
    208206
  • libcfa/src/time_t.hfa

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Apr 10 14:42:03 2018
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Jan  5 08:22:46 2020
    13 // Update Count     : 7
     12// Last Modified On : Fri Apr 13 07:51:47 2018
     13// Update Count     : 6
    1414//
    1515
     
    2020
    2121struct Duration {                                                                               // private
    22         int64_t tn;                                                                                     // nanoseconds
     22        int64_t tv;                                                                                     // nanoseconds
    2323}; // Duration
    2424
    25 static inline void ?{}( Duration & dur ) with( dur ) { tn = 0; }
    26 static inline void ?{}( Duration & dur, __attribute__((unused)) zero_t ) with( dur ) { tn = 0; }
     25static inline void ?{}( Duration & dur ) with( dur ) { tv = 0; }
     26static inline void ?{}( Duration & dur, __attribute__((unused)) zero_t ) with( dur ) { tv = 0; }
    2727
    2828
     
    3030
    3131struct Time {                                                                                   // private
    32         uint64_t tn;                                                                            // nanoseconds since UNIX epoch
     32        uint64_t tv;                                                                            // nanoseconds since UNIX epoch
    3333}; // Time
    3434
    35 static inline void ?{}( Time & time ) with( time ) { tn = 0; }
    36 static inline void ?{}( Time & time, __attribute__((unused)) zero_t ) with( time ) { tn = 0; }
     35static inline void ?{}( Time & time ) with( time ) { tv = 0; }
     36static inline void ?{}( Time & time, __attribute__((unused)) zero_t ) with( time ) { tv = 0; }
    3737
    3838// Local Variables: //
  • longrun_tests/Makefile.am

    r3d5701e r9fb8f01  
    4242        -I$(abs_top_srcdir)/tests \
    4343        -I$(srcdir) \
    44         -DTEST_$(shell cat .type | tr a-z A-Z)
     44        -DTEST_$(shell cat .type | tr a-z A-Z) \
     45        -in-tree
    4546
    4647TESTS = block coroutine create disjoint enter enter3 processor stack wait yield
  • longrun_tests/Makefile.in

    r3d5701e r9fb8f01  
    348348CCDEPMODE = @CCDEPMODE@
    349349CFACC = @CFACC@
    350 CFACC_INSTALL = @CFACC_INSTALL@
    351350CFACPP = @CFACPP@
    352351CFA_BACKEND_CC = @CFA_BACKEND_CC@
     
    379378FGREP = @FGREP@
    380379GREP = @GREP@
    381 HAS_DISTCC = @HAS_DISTCC@
    382380HOST_FLAGS = @HOST_FLAGS@
    383381INSTALL = @INSTALL@
     
    486484LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
    487485        $(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \
    488         $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS)
     486        $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \
     487        $(AM_CFLAGS) $(CFLAGS)
    489488
    490489AM_V_CFA = $(am__v_CFA_@AM_V@)
     
    492491am__v_CFA_0 = @echo "  CFA     " $@;
    493492am__v_CFA_1 =
     493AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
     494am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
     495am__v_JAVAC_0 = @echo "  JAVAC   " $@;
     496am__v_JAVAC_1 =
     497AM_V_GOC = $(am__v_GOC_@AM_V@)
     498am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
     499am__v_GOC_0 = @echo "  GOC     " $@;
     500am__v_GOC_1 =
    494501UPPCC = u++
    495502UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
     
    498505am__v_UPP_0 = @echo "  UPP     " $@;
    499506am__v_UPP_1 =
    500 AM_V_GOC = $(am__v_GOC_@AM_V@)
    501 am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
    502 am__v_GOC_0 = @echo "  GOC     " $@;
    503 am__v_GOC_1 =
    504 AM_V_PY = $(am__v_PY_@AM_V@)
    505 am__v_PY_ = $(am__v_PY_@AM_DEFAULT_V@)
    506 am__v_PY_0 = @echo "  PYTHON  " $@;
    507 am__v_PY_1 =
    508 AM_V_RUST = $(am__v_RUST_@AM_V@)
    509 am__v_RUST_ = $(am__v_RUST_@AM_DEFAULT_V@)
    510 am__v_RUST_0 = @echo "  RUST    " $@;
    511 am__v_RUST_1 =
    512 AM_V_NODEJS = $(am__v_NODEJS_@AM_V@)
    513 am__v_NODEJS_ = $(am__v_NODEJS_@AM_DEFAULT_V@)
    514 am__v_NODEJS_0 = @echo "  NODEJS  " $@;
    515 am__v_NODEJS_1 =
    516 AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
    517 am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
    518 am__v_JAVAC_0 = @echo "  JAVAC   " $@;
    519 am__v_JAVAC_1 =
    520507repeats = 10
    521508max_time = 600
     
    537524        -I$(abs_top_srcdir)/tests \
    538525        -I$(srcdir) \
    539         -DTEST_$(shell cat .type | tr a-z A-Z)
     526        -DTEST_$(shell cat .type | tr a-z A-Z) \
     527        -in-tree
    540528
    541529TESTS = block coroutine create disjoint enter enter3 processor stack wait yield
  • src/AST/Convert.cpp

    r3d5701e r9fb8f01  
    1010// Created On       : Thu May 09 15::37::05 2019
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec 11 21:39:32 2019
    13 // Update Count     : 33
     12// Last Modified On : Thu Jul 25 22:21:46 2019
     13// Update Count     : 13
    1414//
    1515
     
    245245                auto decl = new StructDecl(
    246246                        node->name,
    247                         (AggregateDecl::Aggregate)node->kind,
     247                        node->kind,
    248248                        get<Attribute>().acceptL( node->attributes ),
    249249                        LinkageSpec::Spec( node->linkage.val )
     
    675675
    676676        const ast::Expr * visit( const ast::KeywordCastExpr * node ) override final {
    677                 AggregateDecl::Aggregate castTarget = (AggregateDecl::Aggregate)node->target;
    678                 assert( AggregateDecl::Generator <= castTarget && castTarget <= AggregateDecl::Thread );
     677                KeywordCastExpr::Target castTarget = KeywordCastExpr::NUMBER_OF_TARGETS;
     678                switch (node->target) {
     679                        case ast::KeywordCastExpr::Coroutine:
     680                                castTarget = KeywordCastExpr::Coroutine;
     681                                break;
     682                        case ast::KeywordCastExpr::Thread:
     683                                castTarget = KeywordCastExpr::Thread;
     684                                break;
     685                        case ast::KeywordCastExpr::Monitor:
     686                                castTarget = KeywordCastExpr::Monitor;
     687                                break;
     688                        default:
     689                                break;
     690                }
     691                assert ( castTarget < KeywordCastExpr::NUMBER_OF_TARGETS );
    679692                auto expr = visitBaseExpr( node,
    680693                        new KeywordCastExpr(
     
    874887                auto expr = visitBaseExpr( node,
    875888                        new AsmExpr(
    876                                 new std::string(node->inout),
     889                                get<Expression>().accept1(node->inout),
    877890                                get<Expression>().accept1(node->constraint),
    878891                                get<Expression>().accept1(node->operand)
     
    12231236                                cv( node ),
    12241237                                node->name,
    1225                                 node->kind == ast::TypeDecl::Ftype,
     1238                                node->kind == ast::TypeVar::Ftype,
    12261239                                get<Attribute>().acceptL( node->attributes )
    12271240                        };
     
    14911504                        old->location,
    14921505                        old->name,
    1493                         (ast::AggregateDecl::Aggregate)old->kind,
     1506                        old->kind,
    14941507                        GET_ACCEPT_V(attributes, Attribute),
    14951508                        { old->linkage.val }
     
    15781591                        { old->storageClasses.val },
    15791592                        GET_ACCEPT_1(base, Type),
    1580                         (ast::TypeDecl::Kind)(unsigned)old->kind,
     1593                        (ast::TypeVar::Kind)(unsigned)old->kind,
    15811594                        old->sized,
    15821595                        GET_ACCEPT_1(init, Type)
     
    20322045        }
    20332046
    2034         virtual void visit( const KeywordCastExpr * old ) override final {
    2035                 ast::AggregateDecl::Aggregate castTarget = (ast::AggregateDecl::Aggregate)old->target;
    2036                 assert( ast::AggregateDecl::Generator <= castTarget && castTarget <= ast::AggregateDecl::Thread );
     2047        virtual void visit( const KeywordCastExpr * old) override final {
     2048                ast::KeywordCastExpr::Target castTarget = ast::KeywordCastExpr::NUMBER_OF_TARGETS;
     2049                switch (old->target) {
     2050                        case KeywordCastExpr::Coroutine:
     2051                                castTarget = ast::KeywordCastExpr::Coroutine;
     2052                                break;
     2053                        case KeywordCastExpr::Thread:
     2054                                castTarget = ast::KeywordCastExpr::Thread;
     2055                                break;
     2056                        case KeywordCastExpr::Monitor:
     2057                                castTarget = ast::KeywordCastExpr::Monitor;
     2058                                break;
     2059                        default:
     2060                                break;
     2061                }
     2062                assert ( castTarget < ast::KeywordCastExpr::NUMBER_OF_TARGETS );
    20372063                this->node = visitBaseExpr( old,
    20382064                        new ast::KeywordCastExpr(
     
    22322258                        new ast::AsmExpr(
    22332259                                old->location,
    2234                                 old->inout,
     2260                                GET_ACCEPT_1(inout, Expr),
    22352261                                GET_ACCEPT_1(constraint, Expr),
    22362262                                GET_ACCEPT_1(operand, Expr)
     
    25612587                        ty = new ast::TypeInstType{
    25622588                                old->name,
    2563                                 old->isFtype ? ast::TypeDecl::Ftype : ast::TypeDecl::Dtype,
     2589                                old->isFtype ? ast::TypeVar::Ftype : ast::TypeVar::Dtype,
    25642590                                cv( old ),
    25652591                                GET_ACCEPT_V( attributes, Attribute )
  • src/AST/Decl.cpp

    r3d5701e r9fb8f01  
    99// Author           : Aaron B. Moss
    1010// Created On       : Thu May 9 10:00:00 2019
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 16:23:15 2019
    13 // Update Count     : 20
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Thu May 9 10:00:00 2019
     13// Update Count     : 1
    1414//
    1515
     
    1818#include <cassert>             // for assert, strict_dynamic_cast
    1919#include <iostream>
     20#include <string>
    2021#include <unordered_map>
    2122
     
    2627#include "Node.hpp"            // for readonly
    2728#include "Type.hpp"            // for readonly
     29#include "Parser/ParseNode.h"  // for DeclarationNode
    2830
    2931namespace ast {
     
    5456// --- TypeDecl
    5557
    56 const char * TypeDecl::typeString() const {
    57         static const char * kindNames[] = { "sized data type", "sized object type", "sized function type", "sized tuple type" };
    58         static_assert( sizeof(kindNames)/sizeof(kindNames[0]) == TypeDecl::NUMBER_OF_KINDS, "typeString: kindNames is out of sync." );
    59         assertf( kind < TypeDecl::NUMBER_OF_KINDS, "TypeDecl kind is out of bounds." );
    60         return sized ? kindNames[ kind ] : &kindNames[ kind ][ sizeof("sized") ]; // sizeof includes '\0'
     58std::string TypeDecl::typeString() const {
     59        static const std::string kindNames[] = { "object type", "function type", "tuple type" };
     60        assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1,
     61                "typeString: kindNames is out of sync." );
     62        assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
     63        return (sized ? "sized " : "") + kindNames[ kind ];
    6164}
    6265
    63 const char * TypeDecl::genTypeString() const {
    64         static const char * kindNames[] = { "dtype", "otype", "ftype", "ttype" };
    65         static_assert( sizeof(kindNames)/sizeof(kindNames[0]) == TypeDecl::NUMBER_OF_KINDS, "genTypeString: kindNames is out of sync." );
    66         assertf( kind < TypeDecl::NUMBER_OF_KINDS, "TypeDecl kind is out of bounds." );
     66std::string TypeDecl::genTypeString() const {
     67        static const std::string kindNames[] = { "dtype", "ftype", "ttype" };
     68        assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1, "genTypeString: kindNames is out of sync." );
     69        assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
    6770        return kindNames[ kind ];
    6871}
     
    7073std::ostream & operator<< ( std::ostream & out, const TypeDecl::Data & data ) {
    7174        return out << data.kind << ", " << data.isComplete;
    72 }
    73 
    74 // --- AggregateDecl
    75 
    76 // These must harmonize with the corresponding AggregateDecl::Aggregate enumerations.
    77 static const char * aggregateNames[] = { "struct", "union", "enum", "exception", "trait", "generator", "coroutine", "monitor", "thread", "NoAggregateName" };
    78 
    79 const char * AggregateDecl::aggrString( AggregateDecl::Aggregate aggr ) {
    80         return aggregateNames[aggr];
    8175}
    8276
  • src/AST/Decl.hpp

    r3d5701e r9fb8f01  
    99// Author           : Aaron B. Moss
    1010// Created On       : Thu May 9 10:00:00 2019
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 17:38:33 2019
    13 // Update Count     : 29
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Thu May 9 10:00:00 2019
     13// Update Count     : 1
    1414//
    1515
     
    2020#include <unordered_map>
    2121#include <vector>
    22 #include <algorithm>
    2322
    2423#include "FunctionSpec.hpp"
     
    2827#include "ParseNode.hpp"
    2928#include "StorageClasses.hpp"
     29#include "TypeVar.hpp"
    3030#include "Visitor.hpp"
    31 #include "Common/utility.h"
    32 #include "Common/SemanticError.h"                                               // error_str
     31#include "Parser/ParseNode.h"  // for DeclarationNode::Aggregate
    3332
    3433// Must be included in *all* AST classes; should be #undef'd at the end of the file
     
    126125        std::vector< ptr<Expr> > withExprs;
    127126
    128         FunctionDecl( const CodeLocation & loc, const std::string & name, FunctionType * type,
     127        FunctionDecl( const CodeLocation & loc, const std::string &name, FunctionType * type,
    129128                CompoundStmt * stmts, Storage::Classes storage = {}, Linkage::Spec linkage = Linkage::C,
    130129                std::vector<ptr<Attribute>>&& attrs = {}, Function::Specs fs = {})
     
    137136        bool has_body() const { return stmts; }
    138137
    139         const DeclWithType * accept( Visitor & v ) const override { return v.visit( this ); }
     138        const DeclWithType * accept( Visitor &v ) const override { return v.visit( this ); }
    140139private:
    141140        FunctionDecl * clone() const override { return new FunctionDecl( *this ); }
     
    155154
    156155        /// Produces a name for the kind of alias
    157         virtual const char * typeString() const = 0;
     156        virtual std::string typeString() const = 0;
    158157
    159158private:
     
    164163/// Cforall type variable: `dtype T`
    165164class TypeDecl final : public NamedTypeDecl {
    166   public:
    167         enum Kind { Dtype, Otype, Ftype, Ttype, NUMBER_OF_KINDS };
    168 
    169         Kind kind;
     165public:
     166        TypeVar::Kind kind;
    170167        bool sized;
    171168        ptr<Type> init;
     
    173170        /// Data extracted from a type decl
    174171        struct Data {
    175                 Kind kind;
     172                TypeVar::Kind kind;
    176173                bool isComplete;
    177174
    178                 Data() : kind( NUMBER_OF_KINDS ), isComplete( false ) {}
     175                Data() : kind( (TypeVar::Kind)-1 ), isComplete( false ) {}
    179176                Data( const TypeDecl * d ) : kind( d->kind ), isComplete( d->sized ) {}
    180                 Data( Kind k, bool c ) : kind( k ), isComplete( c ) {}
     177                Data( TypeVar::Kind k, bool c ) : kind( k ), isComplete( c ) {}
    181178                Data( const Data & d1, const Data & d2 )
    182                         : kind( d1.kind ), isComplete( d1.isComplete || d2.isComplete ) {}
    183 
    184                 bool operator==( const Data & o ) const { return kind == o.kind && isComplete == o.isComplete; }
    185                 bool operator!=( const Data & o ) const { return !(*this == o); }
     179                : kind( d1.kind ), isComplete( d1.isComplete || d2.isComplete ) {}
     180
     181                bool operator== ( const Data & o ) const {
     182                        return kind == o.kind && isComplete == o.isComplete;
     183                }
     184                bool operator!= ( const Data & o ) const { return !(*this == o); }
    186185        };
    187186
    188         TypeDecl( const CodeLocation & loc, const std::string & name, Storage::Classes storage, Type * b,
    189                           Kind k, bool s, Type * i = nullptr )
    190                 : NamedTypeDecl( loc, name, storage, b ), kind( k ), sized( k == Ttype || s ),
    191                 init( i ) {}
    192 
    193         const char * typeString() const override;
     187        TypeDecl( const CodeLocation& loc, const std::string& name, Storage::Classes storage, Type* b,
     188                TypeVar::Kind k, bool s, Type* i = nullptr )
     189        : NamedTypeDecl( loc, name, storage, b ), kind( k ), sized( k == TypeVar::Ttype || s ),
     190          init( i ) {}
     191
     192        std::string typeString() const override;
    194193        /// Produces a name for generated code
    195         const char * genTypeString() const;
     194        std::string genTypeString() const;
    196195
    197196        /// convenience accessor to match Type::isComplete()
     
    199198
    200199        const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
    201   private:
     200private:
    202201        TypeDecl * clone() const override { return new TypeDecl{ *this }; }
    203202        MUTATE_FRIEND
     
    213212        : NamedTypeDecl( loc, name, storage, b, spec ) {}
    214213
    215         const char * typeString() const override { return "typedef"; }
     214        std::string typeString() const override { return "typedef"; }
    216215
    217216        const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
     
    224223class AggregateDecl : public Decl {
    225224public:
    226         enum Aggregate { Struct, Union, Enum, Exception, Trait, Generator, Coroutine, Monitor, Thread, NoAggregate };
    227         static const char * aggrString( Aggregate aggr );
    228 
    229225        std::vector<ptr<Decl>> members;
    230226        std::vector<ptr<TypeDecl>> params;
     
    241237
    242238        /// Produces a name for the kind of aggregate
    243         virtual const char * typeString() const = 0;
     239        virtual std::string typeString() const = 0;
    244240
    245241private:
     
    251247class StructDecl final : public AggregateDecl {
    252248public:
    253         Aggregate kind;
     249        DeclarationNode::Aggregate kind;
    254250
    255251        StructDecl( const CodeLocation& loc, const std::string& name,
    256                 Aggregate kind = Struct,
     252                DeclarationNode::Aggregate kind = DeclarationNode::Struct,
    257253                std::vector<ptr<Attribute>>&& attrs = {}, Linkage::Spec linkage = Linkage::Cforall )
    258254        : AggregateDecl( loc, name, std::move(attrs), linkage ), kind( kind ) {}
    259255
    260         bool is_coroutine() { return kind == Coroutine; }
    261         bool is_monitor() { return kind == Monitor; }
    262         bool is_thread() { return kind == Thread; }
    263 
    264         const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
    265 
    266         const char * typeString() const override { return aggrString( kind ); }
     256        bool is_coroutine() { return kind == DeclarationNode::Coroutine; }
     257        bool is_monitor() { return kind == DeclarationNode::Monitor; }
     258        bool is_thread() { return kind == DeclarationNode::Thread; }
     259
     260        const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
     261
     262        std::string typeString() const override { return "struct"; }
    267263
    268264private:
     
    280276        const Decl * accept( Visitor& v ) const override { return v.visit( this ); }
    281277
    282         const char * typeString() const override { return aggrString( Union ); }
     278        std::string typeString() const override { return "union"; }
    283279
    284280private:
     
    299295        const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
    300296
    301         const char * typeString() const override { return aggrString( Enum ); }
     297        std::string typeString() const override { return "enum"; }
    302298
    303299private:
     
    318314        const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
    319315
    320         const char * typeString() const override { return "trait"; }
     316        std::string typeString() const override { return "trait"; }
    321317
    322318private:
     
    344340        ptr<AsmStmt> stmt;
    345341
    346         AsmDecl( const CodeLocation & loc, AsmStmt * stmt )
     342        AsmDecl( const CodeLocation & loc, AsmStmt *stmt )
    347343        : Decl( loc, "", {}, {} ), stmt(stmt) {}
    348344
    349         const AsmDecl * accept( Visitor & v ) const override { return v.visit( this ); }
    350 private:
    351         AsmDecl * clone() const override { return new AsmDecl( *this ); }
     345        const AsmDecl * accept( Visitor &v ) const override { return v.visit( this ); }
     346private:
     347        AsmDecl *clone() const override { return new AsmDecl( *this ); }
    352348        MUTATE_FRIEND
    353349};
     
    361357        : Decl( loc, "", {}, {} ), cond( condition ), msg( msg ) {}
    362358
    363         const StaticAssertDecl * accept( Visitor & v ) const override { return v.visit( this ); }
     359        const StaticAssertDecl * accept( Visitor &v ) const override { return v.visit( this ); }
    364360private:
    365361        StaticAssertDecl * clone() const override { return new StaticAssertDecl( *this ); }
  • src/AST/Expr.cpp

    r3d5701e r9fb8f01  
    99// Author           : Aaron B. Moss
    1010// Created On       : Wed May 15 17:00:00 2019
    11 // Last Modified By : Peter A. Buhr
     11// Last Modified By : Andrew Beach
    1212// Created On       : Thr Jun 13 13:38:00 2019
    13 // Update Count     : 6
     13// Update Count     : 2
    1414//
    1515
     
    141141// --- KeywordCastExpr
    142142
    143 const char * KeywordCastExpr::targetString() const {
    144         return AggregateDecl::aggrString( target );
     143const std::string & KeywordCastExpr::targetString() const {
     144        static const std::string targetStrs[] = {
     145                "coroutine", "thread", "monitor"
     146        };
     147        static_assert(
     148                (sizeof(targetStrs) / sizeof(targetStrs[0])) == ((unsigned long)NUMBER_OF_TARGETS),
     149                "Each KeywordCastExpr::Target should have a corresponding string representation"
     150        );
     151        return targetStrs[(unsigned long)target];
    145152}
    146153
  • src/AST/Expr.hpp

    r3d5701e r9fb8f01  
    99// Author           : Aaron B. Moss
    1010// Created On       : Fri May 10 10:30:00 2019
    11 // Last Modified By : Peter A. Buhr
     11// Last Modified By : Aaron B. Moss
    1212// Created On       : Fri May 10 10:30:00 2019
    13 // Update Count     : 7
     13// Update Count     : 1
    1414//
    1515
     
    2626#include "Fwd.hpp"        // for UniqueId
    2727#include "Label.hpp"
    28 #include "Decl.hpp"
    2928#include "ParseNode.hpp"
    3029#include "Visitor.hpp"
     
    301300public:
    302301        ptr<Expr> arg;
    303         ast::AggregateDecl::Aggregate target;
    304 
    305         KeywordCastExpr( const CodeLocation & loc, const Expr * a, ast::AggregateDecl::Aggregate t )
     302        enum Target { Coroutine, Thread, Monitor, NUMBER_OF_TARGETS } target;
     303
     304        KeywordCastExpr( const CodeLocation & loc, const Expr * a, Target t )
    306305        : Expr( loc ), arg( a ), target( t ) {}
    307306
    308307        /// Get a name for the target type
    309         const char * targetString() const;
     308        const std::string& targetString() const;
    310309
    311310        const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
     
    557556class AsmExpr final : public Expr {
    558557public:
    559         std::string inout;
     558        ptr<Expr> inout;
    560559        ptr<Expr> constraint;
    561560        ptr<Expr> operand;
    562561
    563         AsmExpr( const CodeLocation & loc, const std::string & io, const Expr * con, const Expr * op )
     562        AsmExpr( const CodeLocation & loc, const Expr * io, const Expr * con, const Expr * op )
    564563        : Expr( loc ), inout( io ), constraint( con ), operand( op ) {}
    565564
  • src/AST/Pass.impl.hpp

    r3d5701e r9fb8f01  
    13001300                        maybe_accept( node, &AsmExpr::result );
    13011301                }
     1302                maybe_accept( node, &AsmExpr::inout      );
    13021303                maybe_accept( node, &AsmExpr::constraint );
    13031304                maybe_accept( node, &AsmExpr::operand    );
  • src/AST/Print.cpp

    r3d5701e r9fb8f01  
    10111011                os << "Asm Expression:" << endl;
    10121012                ++indent;
    1013                 if ( !node->inout.empty() ) os << "[" << node->inout << "] ";
     1013                if ( node->inout ) node->inout->accept( *this );
    10141014                if ( node->constraint ) node->constraint->accept( *this );
    10151015                if ( node->operand ) node->operand->accept( *this );
     
    13591359                preprint( node );
    13601360                os << "instance of type " << node->name
    1361                    << " (" << (node->kind == ast::TypeDecl::Ftype ? "" : "not ") << "function type)";
     1361                   << " (" << (node->kind == ast::TypeVar::Ftype ? "" : "not ") << "function type)";
    13621362                print( node->params );
    13631363
  • src/AST/Type.cpp

    r3d5701e r9fb8f01  
    99// Author           : Aaron B. Moss
    1010// Created On       : Mon May 13 15:00:00 2019
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Dec 15 16:56:28 2019
    13 // Update Count     : 4
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Mon May 13 15:00:00 2019
     13// Update Count     : 1
    1414//
    1515
     
    4848// --- BasicType
    4949
    50 // GENERATED START, DO NOT EDIT
    51 // GENERATED BY BasicTypes-gen.cc
    52 const char * BasicType::typeNames[] = {
     50const char *BasicType::typeNames[] = {
    5351        "_Bool",
    5452        "char",
     
    8886        "_Float128x _Complex",
    8987};
    90 // GENERATED END
     88static_assert(
     89        sizeof(BasicType::typeNames)/sizeof(BasicType::typeNames[0]) == BasicType::NUMBER_OF_BASIC_TYPES,
     90        "Each basic type name should have a corresponding kind enum value"
     91);
    9192
    9293// --- FunctionType
  • src/AST/Type.hpp

    r3d5701e r9fb8f01  
    99// Author           : Aaron B. Moss
    1010// Created On       : Thu May 9 10:00:00 2019
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec 11 21:56:46 2019
    13 // Update Count     : 5
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Thu May 9 10:00:00 2019
     13// Update Count     : 1
    1414//
    1515
     
    2626#include "Fwd.hpp"
    2727#include "Node.hpp"          // for Node, ptr, ptr_base
     28#include "TypeVar.hpp"
    2829#include "Visitor.hpp"
    2930
     
    422423public:
    423424        readonly<TypeDecl> base;
    424         TypeDecl::Kind kind;
     425        TypeVar::Kind kind;
    425426
    426427        TypeInstType( const std::string& n, const TypeDecl * b, CV::Qualifiers q = {},
    427428                std::vector<ptr<Attribute>> && as = {} )
    428429        : ReferenceToType( n, q, std::move(as) ), base( b ), kind( b->kind ) {}
    429         TypeInstType( const std::string& n, TypeDecl::Kind k, CV::Qualifiers q = {},
     430        TypeInstType( const std::string& n, TypeVar::Kind k, CV::Qualifiers q = {},
    430431                std::vector<ptr<Attribute>> && as = {} )
    431432        : ReferenceToType( n, q, std::move(as) ), base(), kind( k ) {}
  • src/AST/TypeEnvironment.cpp

    r3d5701e r9fb8f01  
    99// Author           : Aaron B. Moss
    1010// Created On       : Wed May 29 11:00:00 2019
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec 11 21:49:13 2019
    13 // Update Count     : 4
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Wed May 29 11:00:00 2019
     13// Update Count     : 1
    1414//
    1515
     
    240240                return true;
    241241        } else if ( auto typeInst = dynamic_cast< const TypeInstType * >( type ) ) {
    242                 return typeInst->kind == TypeDecl::Ftype;
     242                return typeInst->kind == TypeVar::Ftype;
    243243        } else return false;
    244244}
     
    248248        bool tyVarCompatible( const TypeDecl::Data & data, const Type * type ) {
    249249                switch ( data.kind ) {
    250                   case TypeDecl::Dtype:
     250                  case TypeVar::Dtype:
    251251                        // to bind to an object type variable, the type must not be a function type.
    252252                        // if the type variable is specified to be a complete type then the incoming
     
    254254                        // xxx - should this also check that type is not a tuple type and that it's not a ttype?
    255255                        return ! isFtype( type ) && ( ! data.isComplete || type->isComplete() );
    256                   case TypeDecl::Ftype:
     256                  case TypeVar::Ftype:
    257257                        return isFtype( type );
    258                   case TypeDecl::Ttype:
     258                  case TypeVar::Ttype:
    259259                        // ttype unifies with any tuple type
    260260                        return dynamic_cast< const TupleType * >( type ) || Tuples::isTtype( type );
  • src/AST/TypeEnvironment.hpp

    r3d5701e r9fb8f01  
    99// Author           : Aaron B. Moss
    1010// Created On       : Wed May 29 11:00:00 2019
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec 11 21:55:54 2019
    13 // Update Count     : 3
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Wed May 29 11:00:00 2019
     13// Update Count     : 1
    1414//
    1515
     
    2828#include "Type.hpp"
    2929#include "TypeSubstitution.hpp"
     30#include "TypeVar.hpp"
    3031#include "Common/Indenter.h"
    3132#include "ResolvExpr/WidenMode.h"
     
    106107        /// Singleton class constructor from substitution
    107108        EqvClass( const std::string & v, const Type * b )
    108         : vars{ v }, bound( b ), allowWidening( false ), data( TypeDecl::Dtype, false ) {}
     109        : vars{ v }, bound( b ), allowWidening( false ), data( TypeVar::Dtype, false ) {}
    109110
    110111        /// Single-var constructor (strips qualifiers from bound type)
  • src/AST/module.mk

    r3d5701e r9fb8f01  
    1010## Author           : Thierry Delisle
    1111## Created On       : Thu May 09 16:05:36 2019
    12 ## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Sat Dec 14 07:29:10 2019
    14 ## Update Count     : 3
     12## Last Modified By :
     13## Last Modified On :
     14## Update Count     :
    1515###############################################################################
    1616
     
    3434        AST/TypeSubstitution.cpp
    3535
     36
     37
    3638SRC += $(SRC_AST)
    3739SRCDEMANGLE += $(SRC_AST)
  • src/BasicTypes-gen.cc

    r3d5701e r9fb8f01  
    273273
    274274
    275         #define TypeH TOP_SRCDIR "src/SynTree/Type.h"
    276         resetInput( file, TypeH, buffer, code, str );
    277 
    278         if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", TypeH );
     275        #define Type TOP_SRCDIR "src/SynTree/Type.h"
     276        resetInput( file, Type, buffer, code, str );
     277
     278        if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", Type );
    279279        start += sizeof( STARTMK );                                                     // includes newline
    280280        code << str.substr( 0, start );
     
    289289        code << "\t";                                                                           // indentation for end marker
    290290
    291         if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", TypeH );
     291        if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", Type );
    292292        code << str.substr( start );
    293293
    294         output( file, TypeH, code );
     294        output( file, Type, code );
    295295        // cout << code.str();
    296296
    297297
    298         #define TypeC TOP_SRCDIR "src/SynTree/Type.cc"
    299         resetInput( file, TypeC, buffer, code, str );
    300 
    301         if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", TypeC );
    302         start += sizeof( STARTMK );                                                     // includes newline
    303         code << str.substr( 0, start );
    304 
    305         code << BYMK << endl;
    306         code << "const char * BasicType::typeNames[] = {" << endl;
    307         for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) {
    308                 code << "\t\"" << graph[r].type << "\"," << endl;
    309         } // for       
    310         code << "};" << endl;
    311 
    312         if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", TypeC );
    313         code << str.substr( start );
    314 
    315         output( file, TypeC, code );
    316         // cout << code.str();
    317 
    318 
    319298        // TEMPORARY DURING CHANGE OVER
    320         #define TypeH_AST TOP_SRCDIR "src/AST/Type.hpp"
    321         resetInput( file, TypeH_AST, buffer, code, str );
    322 
    323         if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", TypeH_AST );
     299        #define TypeAST TOP_SRCDIR "src/AST/Type.hpp"
     300        resetInput( file, TypeAST, buffer, code, str );
     301
     302        if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", TypeAST );
    324303        start += sizeof( STARTMK );                                                     // includes newline
    325304        code << str.substr( 0, start );
     
    334313        code << "\t";                                                                           // indentation for end marker
    335314
    336         if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", TypeH_AST );
     315        if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", TypeAST );
    337316        code << str.substr( start );
    338317
    339         output( file, TypeH_AST, code );
    340         // cout << code.str();
    341 
    342 
    343         #define TypeC_AST TOP_SRCDIR "src/AST/Type.cpp"
    344         resetInput( file, TypeC_AST, buffer, code, str );
    345 
    346         if ( (start = str.find( STARTMK )) == string::npos ) Abort( "start", TypeC_AST );
    347         start += sizeof( STARTMK );                                                     // includes newline
    348         code << str.substr( 0, start );
    349 
    350         code << BYMK << endl;
    351         code << "const char * BasicType::typeNames[] = {" << endl;
    352         for ( int r = 0; r < NUMBER_OF_BASIC_TYPES; r += 1 ) {
    353                 code << "\t\"" << graph[r].type << "\"," << endl;
    354         } // for       
    355         code << "};" << endl;
    356 
    357         if ( (start = str.find( ENDMK, start + 1 )) == string::npos ) Abort( "end", TypeC_AST );
    358         code << str.substr( start );
    359 
    360         output( file, TypeC_AST, code );
     318        output( file, TypeAST, code );
    361319        // cout << code.str();
    362320
  • src/CodeGen/CodeGenerator.cc

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Feb 16 08:32:48 2020
    13 // Update Count     : 532
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thr May  2 10:47:00 2019
     13// Update Count     : 497
    1414//
    1515#include "CodeGenerator.h"
     
    2323#include "InitTweak/InitTweak.h"     // for getPointerBase
    2424#include "OperatorTable.h"           // for OperatorInfo, operatorLookup
    25 #include "SynTree/LinkageSpec.h"     // for Spec, Intrinsic
     25#include "Parser/LinkageSpec.h"      // for Spec, Intrinsic
    2626#include "SynTree/Attribute.h"       // for Attribute
    2727#include "SynTree/BaseSyntaxNode.h"  // for BaseSyntaxNode
     
    3939        int CodeGenerator::tabsize = 4;
    4040
    41         // The kinds of statements that would ideally be followed by whitespace.
     41        // the kinds of statements that would ideally be followed by whitespace
    4242        bool wantSpacing( Statement * stmt) {
    4343                return dynamic_cast< IfStmt * >( stmt ) || dynamic_cast< CompoundStmt * >( stmt ) ||
     
    7878        }
    7979
    80         // Using updateLocation at the beginning of a node and endl within a node should become the method of formating.
     80        /* Using updateLocation at the beginning of a node and endl
     81         * within a node should become the method of formating.
     82         */
    8183        void CodeGenerator::updateLocation( CodeLocation const & to ) {
    8284                // skip if linemarks shouldn't appear or if codelocation is unset
     
    9395                } else {
    9496                        output << "\n# " << to.first_line << " \"" << to.filename
    95                                    << "\"\n" << indent;
     97                               << "\"\n" << indent;
    9698                        currentLocation = to;
    9799                }
     
    129131
    130132        void CodeGenerator::genAttributes( list< Attribute * > & attributes ) {
    131                 if ( attributes.empty() ) return;
     133          if ( attributes.empty() ) return;
    132134                output << "__attribute__ ((";
    133135                for ( list< Attribute * >::iterator attr( attributes.begin() );; ) {
     
    138140                                output << ")";
    139141                        } // if
    140                         if ( ++attr == attributes.end() ) break;
     142                  if ( ++attr == attributes.end() ) break;
    141143                        output << ",";                                                          // separator
    142144                } // for
     
    163165                previsit( (BaseSyntaxNode *)node );
    164166                GuardAction( [this, node](){
    165                                 if ( options.printExprTypes && node->result ) {
    166                                         output << " /* " << genType( node->result, "", options ) << " */ ";
    167                                 }
    168                         } );
     167                        if ( options.printExprTypes && node->result ) {
     168                                output << " /* " << genType( node->result, "", options ) << " */ ";
     169                        }
     170                } );
    169171        }
    170172
     
    196198                // deleted decls should never be used, so don't print them
    197199                if ( objectDecl->isDeleted && options.genC ) return;
    198 
    199                 // gcc allows an empty declarator (no name) for bit-fields and C states: 6.7.2.1 Structure and union specifiers,
    200                 // point 4, page 113: If the (bit field) value is zero, the declaration shall have no declarator.  For anything
    201                 // else, the anonymous name refers to the anonymous object for plan9 inheritance.
    202                 if ( objectDecl->get_name().empty() && options.genC && ! objectDecl->get_bitfieldWidth() ) {
     200                if (objectDecl->get_name().empty() && options.genC ) {
    203201                        // only generate an anonymous name when generating C code, otherwise it clutters the output too much
    204202                        static UniqueName name = { "__anonymous_object" };
    205203                        objectDecl->set_name( name.newName() );
    206                         // Stops unused parameter warnings.
    207                         if ( options.anonymousUnused ) {
    208                                 objectDecl->attributes.push_back( new Attribute( "unused" ) );
    209                         }
     204            // Stops unused parameter warnings.
     205            if ( options.anonymousUnused ) {
     206                objectDecl->attributes.push_back( new Attribute( "unused" ) );
     207            }
    210208                }
    211209
     
    397395                extension( applicationExpr );
    398396                if ( VariableExpr * varExpr = dynamic_cast< VariableExpr* >( applicationExpr->get_function() ) ) {
    399                         const OperatorInfo * opInfo;
    400                         if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && ( opInfo = operatorLookup( varExpr->get_var()->get_name() ) ) ) {
     397                        OperatorInfo opInfo;
     398                        if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( varExpr->get_var()->get_name(), opInfo ) ) {
    401399                                std::list< Expression* >::iterator arg = applicationExpr->get_args().begin();
    402                                 switch ( opInfo->type ) {
     400                                switch ( opInfo.type ) {
    403401                                  case OT_INDEX:
    404402                                        assert( applicationExpr->get_args().size() == 2 );
     
    421419                                                output << "(";
    422420                                                (*arg++)->accept( *visitor );
    423                                                 output << ") /* " << opInfo->inputName << " */";
     421                                                output << ") /* " << opInfo.inputName << " */";
    424422                                        } else if ( applicationExpr->get_args().size() == 2 ) {
    425423                                                // intrinsic two parameter constructors are essentially bitwise assignment
    426424                                                output << "(";
    427425                                                (*arg++)->accept( *visitor );
    428                                                 output << opInfo->symbol;
     426                                                output << opInfo.symbol;
    429427                                                (*arg)->accept( *visitor );
    430                                                 output << ") /* " << opInfo->inputName << " */";
     428                                                output << ") /* " << opInfo.inputName << " */";
    431429                                        } else {
    432430                                                // no constructors with 0 or more than 2 parameters
     
    439437                                        assert( applicationExpr->get_args().size() == 1 );
    440438                                        output << "(";
    441                                         output << opInfo->symbol;
     439                                        output << opInfo.symbol;
    442440                                        (*arg)->accept( *visitor );
    443441                                        output << ")";
     
    448446                                        assert( applicationExpr->get_args().size() == 1 );
    449447                                        (*arg)->accept( *visitor );
    450                                         output << opInfo->symbol;
     448                                        output << opInfo.symbol;
    451449                                        break;
    452450
     
    457455                                        output << "(";
    458456                                        (*arg++)->accept( *visitor );
    459                                         output << opInfo->symbol;
     457                                        output << opInfo.symbol;
    460458                                        (*arg)->accept( *visitor );
    461459                                        output << ")";
     
    484482                extension( untypedExpr );
    485483                if ( NameExpr * nameExpr = dynamic_cast< NameExpr* >( untypedExpr->function ) ) {
    486                         const OperatorInfo * opInfo = operatorLookup( nameExpr->name );
    487                         if ( opInfo ) {
     484                        OperatorInfo opInfo;
     485                        if ( operatorLookup( nameExpr->name, opInfo ) ) {
    488486                                std::list< Expression* >::iterator arg = untypedExpr->args.begin();
    489                                 switch ( opInfo->type ) {
     487                                switch ( opInfo.type ) {
    490488                                  case OT_INDEX:
    491489                                        assert( untypedExpr->args.size() == 2 );
     
    506504                                                output << "(";
    507505                                                (*arg++)->accept( *visitor );
    508                                                 output << ") /* " << opInfo->inputName << " */";
     506                                                output << ") /* " << opInfo.inputName << " */";
    509507                                        } else if ( untypedExpr->get_args().size() == 2 ) {
    510508                                                // intrinsic two parameter constructors are essentially bitwise assignment
    511509                                                output << "(";
    512510                                                (*arg++)->accept( *visitor );
    513                                                 output << opInfo->symbol;
     511                                                output << opInfo.symbol;
    514512                                                (*arg)->accept( *visitor );
    515                                                 output << ") /* " << opInfo->inputName << " */";
     513                                                output << ") /* " << opInfo.inputName << " */";
    516514                                        } else {
    517515                                                // no constructors with 0 or more than 2 parameters
     
    519517                                                output << "(";
    520518                                                (*arg++)->accept( *visitor );
    521                                                 output << opInfo->symbol << "{ ";
     519                                                output << opInfo.symbol << "{ ";
    522520                                                genCommaList( arg, untypedExpr->args.end() );
    523                                                 output << "}) /* " << opInfo->inputName << " */";
     521                                                output << "}) /* " << opInfo.inputName << " */";
    524522                                        } // if
    525523                                        break;
     
    530528                                        assert( untypedExpr->args.size() == 1 );
    531529                                        output << "(";
    532                                         output << opInfo->symbol;
     530                                        output << opInfo.symbol;
    533531                                        (*arg)->accept( *visitor );
    534532                                        output << ")";
     
    539537                                        assert( untypedExpr->args.size() == 1 );
    540538                                        (*arg)->accept( *visitor );
    541                                         output << opInfo->symbol;
     539                                        output << opInfo.symbol;
    542540                                        break;
    543541
     
    547545                                        output << "(";
    548546                                        (*arg++)->accept( *visitor );
    549                                         output << opInfo->symbol;
     547                                        output << opInfo.symbol;
    550548                                        (*arg)->accept( *visitor );
    551549                                        output << ")";
     
    579577        void CodeGenerator::postvisit( NameExpr * nameExpr ) {
    580578                extension( nameExpr );
    581                 const OperatorInfo * opInfo = operatorLookup( nameExpr->name );
    582                 if ( opInfo ) {
    583                         if ( opInfo->type == OT_CONSTANT ) {
    584                                 output << opInfo->symbol;
     579                OperatorInfo opInfo;
     580                if ( operatorLookup( nameExpr->name, opInfo ) ) {
     581                        if ( opInfo.type == OT_CONSTANT ) {
     582                                output << opInfo.symbol;
    585583                        } else {
    586                                 output << opInfo->outputName;
     584                                output << opInfo.outputName;
    587585                        }
    588586                } else {
     
    652650        void CodeGenerator::postvisit( VariableExpr * variableExpr ) {
    653651                extension( variableExpr );
    654                 const OperatorInfo * opInfo;
    655                 if ( variableExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && (opInfo = operatorLookup( variableExpr->get_var()->get_name() )) && opInfo->type == OT_CONSTANT ) {
    656                         output << opInfo->symbol;
     652                OperatorInfo opInfo;
     653                if ( variableExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( variableExpr->get_var()->get_name(), opInfo ) && opInfo.type == OT_CONSTANT ) {
     654                        output << opInfo.symbol;
    657655                } else {
    658656                        output << mangleName( variableExpr->get_var() );
     
    784782
    785783        void CodeGenerator::postvisit( AsmExpr * asmExpr ) {
    786                 if ( !asmExpr->inout.empty() ) {
     784                if ( asmExpr->get_inout() ) {
    787785                        output << "[ ";
    788                         output << asmExpr->inout;
     786                        asmExpr->get_inout()->accept( *visitor );
    789787                        output << " ] ";
    790788                } // if
    791                 asmExpr->constraint->accept( *visitor );
     789                asmExpr->get_constraint()->accept( *visitor );
    792790                output << " ( ";
    793                 asmExpr->operand->accept( *visitor );
     791                asmExpr->get_operand()->accept( *visitor );
    794792                output << " )";
    795793        }
     
    10091007                  case BranchStmt::FallThroughDefault:
    10101008                        assertf( ! options.genC, "fallthru should not reach code generation." );
    1011                         output << "fallthru";
     1009                  output << "fallthru";
    10121010                        break;
    10131011                } // switch
     
    10331031
    10341032                output << ((throwStmt->get_kind() == ThrowStmt::Terminate) ?
    1035                                    "throw" : "throwResume");
     1033                           "throw" : "throwResume");
    10361034                if (throwStmt->get_expr()) {
    10371035                        output << " ";
     
    10481046
    10491047                output << ((stmt->get_kind() == CatchStmt::Terminate) ?
    1050                                    "catch" : "catchResume");
     1048                "catch" : "catchResume");
    10511049                output << "( ";
    10521050                stmt->decl->accept( *visitor );
     
    11851183
    11861184        std::string genName( DeclarationWithType * decl ) {
    1187                 const OperatorInfo * opInfo = operatorLookup( decl->get_name() );
    1188                 if ( opInfo ) {
    1189                         return opInfo->outputName;
     1185                CodeGen::OperatorInfo opInfo;
     1186                if ( operatorLookup( decl->get_name(), opInfo ) ) {
     1187                        return opInfo.outputName;
    11901188                } else {
    11911189                        return decl->get_name();
  • src/CodeGen/CodeGenerator.h

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Feb 16 03:58:31 2020
    13 // Update Count     : 62
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tue Apr 30 12:01:00 2019
     13// Update Count     : 57
    1414//
    1515
     
    2929namespace CodeGen {
    3030        struct CodeGenerator : public WithShortCircuiting, public WithGuards, public WithVisitorRef<CodeGenerator> {
    31                 static int tabsize;
     31          static int tabsize;
    3232
    3333                CodeGenerator( std::ostream &os, bool pretty = false, bool genC = false, bool lineMarks = false, bool printExprTypes = false );
     
    104104                void postvisit( AsmStmt * );
    105105                void postvisit( DirectiveStmt * );
    106                 void postvisit( AsmDecl * );                                    // special: statement in declaration context
     106                void postvisit( AsmDecl * );                            // special: statement in declaration context
    107107                void postvisit( IfStmt * );
    108108                void postvisit( SwitchStmt * );
     
    147147                LabelPrinter printLabels;
    148148                Options options;
    149           public:
     149        public:
    150150                LineEnder endl;
    151           private:
     151        private:
    152152
    153153                CodeLocation currentLocation;
     
    162162        template< class Iterator >
    163163        void CodeGenerator::genCommaList( Iterator begin, Iterator end ) {
    164                 if ( begin == end ) return;
     164          if ( begin == end ) return;
    165165                for ( ;; ) {
    166166                        (*begin++)->accept( *visitor );
    167                         if ( begin == end ) break;
     167                  if ( begin == end ) break;
    168168                        output << ", ";                                                         // separator
    169169                } // for
  • src/CodeGen/FixMain.h

    r3d5701e r9fb8f01  
    1010// Created On       : Thr Jan 12 14:11:09 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Feb 16 03:24:32 2020
    13 // Update Count     : 5
     12// Last Modified On : Fri Jul 21 22:16:59 2017
     13// Update Count     : 1
    1414//
    1515
     
    1919#include <memory>
    2020
    21 #include "SynTree/LinkageSpec.h"
     21#include "Parser/LinkageSpec.h"
    2222
    2323class FunctionDecl;
     
    4242                static std::unique_ptr<FunctionDecl> main_signature;
    4343        };
    44 } // namespace CodeGen
     44};
  • src/CodeGen/FixNames.cc

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:39:14 2019
    13 // Update Count     : 21
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Jun 28 15:26:00 2017
     13// Update Count     : 20
    1414//
    1515
     
    2222#include "Common/SemanticError.h"  // for SemanticError
    2323#include "FixMain.h"               // for FixMain
     24#include "Parser/LinkageSpec.h"    // for Cforall, isMangled
    2425#include "SymTab/Mangler.h"        // for Mangler
    25 #include "SynTree/LinkageSpec.h"   // for Cforall, isMangled
    2626#include "SynTree/Constant.h"      // for Constant
    2727#include "SynTree/Declaration.h"   // for FunctionDecl, ObjectDecl, Declarat...
  • src/CodeGen/GenType.cc

    r3d5701e r9fb8f01  
    335335                        typeString = "_Atomic " + typeString;
    336336                } // if
     337                if ( type->get_lvalue() && ! options.genC ) {
     338                        // when not generating C code, print lvalue for debugging.
     339                        typeString = "lvalue " + typeString;
     340                }
    337341        }
    338342} // namespace CodeGen
  • src/CodeGen/GenType.h

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Feb 16 04:11:40 2020
    13 // Update Count     : 5
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tue Apr 30 11:47:00 2019
     13// Update Count     : 3
    1414//
    1515
     
    2525        std::string genType( Type *type, const std::string &baseString, const Options &options );
    2626        std::string genType( Type *type, const std::string &baseString, bool pretty = false, bool genC = false, bool lineMarks = false );
    27         std::string genPrettyType( Type * type, const std::string & baseString );
     27  std::string genPrettyType( Type * type, const std::string & baseString );
    2828} // namespace CodeGen
    2929
  • src/CodeGen/Generate.cc

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Feb 16 03:01:51 2020
    13 // Update Count     : 9
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Aug 18 15:39:00 2017
     13// Update Count     : 7
    1414//
    1515#include "Generate.h"
     
    2222#include "GenType.h"                 // for genPrettyType
    2323#include "Common/PassVisitor.h"      // for PassVisitor
    24 #include "SynTree/LinkageSpec.h"     // for isBuiltin, isGeneratable
     24#include "Parser/LinkageSpec.h"      // for isBuiltin, isGeneratable
    2525#include "SynTree/BaseSyntaxNode.h"  // for BaseSyntaxNode
    2626#include "SynTree/Declaration.h"     // for Declaration
     
    6464        void generate( BaseSyntaxNode * node, std::ostream & os ) {
    6565                if ( Type * type = dynamic_cast< Type * >( node ) ) {
    66                         os << genPrettyType( type, "" );
     66                        os << CodeGen::genPrettyType( type, "" );
    6767                } else {
    6868                        PassVisitor<CodeGenerator> cgv( os, true, false, false, false );
  • src/CodeGen/OperatorTable.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb 18 15:55:01 2020
    13 // Update Count     : 55
     12// Last Modified On : Sat Jul 15 17:12:22 2017
     13// Update Count     : 15
    1414//
    1515
     
    1717#include <map>        // for map, _Rb_tree_const_iterator, map<>::const_iterator
    1818#include <utility>    // for pair
    19 using namespace std;
    2019
    2120#include "OperatorTable.h"
     
    2322
    2423namespace CodeGen {
    25         const OperatorInfo CodeGen::tableValues[] = {
    26                 // inputName symbol   outputName                     friendlyName                  type
    27                 {       "?[?]",   "",     "_operator_index",             "Index",                      OT_INDEX          },
    28                 {       "?{}",    "=",    "_constructor",                "Constructor",                OT_CTOR           },
    29                 {       "^?{}",   "",     "_destructor",                 "Destructor",                 OT_DTOR           },
    30                 {       "?()",    "",     "_operator_call",              "Call Operator",              OT_CALL           },
    31                 {       "?++",    "++",   "_operator_postincr",          "Postfix Increment",          OT_POSTFIXASSIGN  },
    32                 {       "?--",    "--",   "_operator_postdecr",          "Postfix Decrement",          OT_POSTFIXASSIGN  },
    33                 {       "*?",     "*",    "_operator_deref",             "Dereference",                OT_PREFIX         },
    34                 {       "+?",     "+",    "_operator_unaryplus",         "Plus",                       OT_PREFIX         },
    35                 {       "-?",     "-",    "_operator_unaryminus",        "Minus",                      OT_PREFIX         },
    36                 {       "~?",     "~",    "_operator_bitnot",            "Bitwise Not",                OT_PREFIX         },
    37                 {       "!?",     "!",    "_operator_lognot",            "Logical Not",                OT_PREFIX         },
    38                 {       "++?",    "++",   "_operator_preincr",           "Prefix Increment",           OT_PREFIXASSIGN   },
    39                 {       "--?",    "--",   "_operator_predecr",           "Prefix Decrement",           OT_PREFIXASSIGN   },
    40                 {       "?\\?",   "\\",   "_operator_exponential",       "Exponentiation",             OT_INFIX          },
    41                 {       "?*?",    "*",    "_operator_multiply",          "Multiplication",             OT_INFIX          },
    42                 {       "?/?",    "/",    "_operator_divide",            "Division",                   OT_INFIX          },
    43                 {       "?%?",    "%",    "_operator_modulus",           "Modulo",                     OT_INFIX          },
    44                 {       "?+?",    "+",    "_operator_add",               "Addition",                   OT_INFIX          },
    45                 {       "?-?",    "-",    "_operator_subtract",          "Substraction",               OT_INFIX          },
    46                 {       "?<<?",   "<<",   "_operator_shiftleft",         "Shift Left",                 OT_INFIX          },
    47                 {       "?>>?",   ">>",   "_operator_shiftright",        "Shift Right",                OT_INFIX          },
    48                 {       "?<?",    "<",    "_operator_less",              "Less-than",                  OT_INFIX          },
    49                 {       "?>?",    ">",    "_operator_greater",           "Greater-than",               OT_INFIX          },
    50                 {       "?<=?",   "<=",   "_operator_lessequal",         "Less-than-or-Equal",         OT_INFIX          },
    51                 {       "?>=?",   ">=",   "_operator_greaterequal",      "Greater-than-or-Equal",      OT_INFIX          },
    52                 {       "?==?",   "==",   "_operator_equal",             "Equality",                   OT_INFIX          },
    53                 {       "?!=?",   "!=",   "_operator_notequal",          "Not-Equal",                  OT_INFIX          },
    54                 {       "?&?",    "&",    "_operator_bitand",            "Bitwise And",                OT_INFIX          },
    55                 {       "?^?",    "^",    "_operator_bitxor",            "Bitwise Xor",                OT_INFIX          },
    56                 {       "?|?",    "|",    "_operator_bitor",             "Bitwise Or",                 OT_INFIX          },
    57                 {       "?=?",    "=",    "_operator_assign",            "Assignment",                 OT_INFIXASSIGN    },
    58                 {       "?\\=?",  "\\=",  "_operator_expassign",         "Exponentiation Assignment",  OT_INFIXASSIGN    },
    59                 {       "?*=?",   "*=",   "_operator_multassign",        "Multiplication Assignment",  OT_INFIXASSIGN    },
    60                 {       "?/=?",   "/=",   "_operator_divassign",         "Division Assignment",        OT_INFIXASSIGN    },
    61                 {       "?%=?",   "%=",   "_operator_modassign",         "Modulo Assignment",          OT_INFIXASSIGN    },
    62                 {       "?+=?",   "+=",   "_operator_addassign",         "Addition Assignment",        OT_INFIXASSIGN    },
    63                 {       "?-=?",   "-=",   "_operator_subassign",         "Substrction Assignment",     OT_INFIXASSIGN    },
    64                 {       "?<<=?",  "<<=",  "_operator_shiftleftassign",   "Shift Left Assignment",      OT_INFIXASSIGN    },
    65                 {       "?>>=?",  ">>=",  "_operator_shiftrightassign",  "Shift Right Assignment",     OT_INFIXASSIGN    },
    66                 {       "?&=?",   "&=",   "_operator_bitandassign",      "Bitwise And Assignment",     OT_INFIXASSIGN    },
    67                 {       "?^=?",   "^=",   "_operator_bitxorassign",      "Bitwise Xor Assignment",     OT_INFIXASSIGN    },
    68                 {       "?|=?",   "|=",   "_operator_bitorassign",       "Bitwise Or Assignment",      OT_INFIXASSIGN    },
    69         }; // tableValues
     24        namespace {
     25                const OperatorInfo tableValues[] = {
     26                        {       "?[?]",         "",             "_operator_index",                              OT_INDEX                        },
     27                        {       "?{}",          "=",    "_constructor",                                 OT_CTOR                         },
     28                        {       "^?{}",         "",             "_destructor",                                  OT_DTOR                         },
     29                        {       "?()",          "",             "_operator_call",                               OT_CALL                         },
     30                        {       "?++",          "++",   "_operator_postincr",                   OT_POSTFIXASSIGN        },
     31                        {       "?--",          "--",   "_operator_postdecr",                   OT_POSTFIXASSIGN        },
     32                        {       "*?",           "*",    "_operator_deref",                              OT_PREFIX                       },
     33                        {       "+?",           "+",    "_operator_unaryplus",                  OT_PREFIX                       },
     34                        {       "-?",           "-",    "_operator_unaryminus",                 OT_PREFIX                       },
     35                        {       "~?",           "~",    "_operator_bitnot",                             OT_PREFIX                       },
     36                        {       "!?",           "!",    "_operator_lognot",                             OT_PREFIX                       },
     37                        {       "++?",          "++",   "_operator_preincr",                    OT_PREFIXASSIGN         },
     38                        {       "--?",          "--",   "_operator_predecr",                    OT_PREFIXASSIGN         },
     39                        {       "?\\?",         "\\",   "_operator_exponential",                OT_INFIX                        },
     40                        {       "?*?",          "*",    "_operator_multiply",                   OT_INFIX                        },
     41                        {       "?/?",          "/",    "_operator_divide",                             OT_INFIX                        },
     42                        {       "?%?",          "%",    "_operator_modulus",                    OT_INFIX                        },
     43                        {       "?+?",          "+",    "_operator_add",                                OT_INFIX                        },
     44                        {       "?-?",          "-",    "_operator_subtract",                   OT_INFIX                        },
     45                        {       "?<<?",         "<<",   "_operator_shiftleft",                  OT_INFIX                        },
     46                        {       "?>>?",         ">>",   "_operator_shiftright",                 OT_INFIX                        },
     47                        {       "?<?",          "<",    "_operator_less",                               OT_INFIX                        },
     48                        {       "?>?",          ">",    "_operator_greater",                    OT_INFIX                        },
     49                        {       "?<=?",         "<=",   "_operator_lessequal",                  OT_INFIX                        },
     50                        {       "?>=?",         ">=",   "_operator_greaterequal",               OT_INFIX                        },
     51                        {       "?==?",         "==",   "_operator_equal",                              OT_INFIX                        },
     52                        {       "?!=?",         "!=",   "_operator_notequal",                   OT_INFIX                        },
     53                        {       "?&?",          "&",    "_operator_bitand",                             OT_INFIX                        },
     54                        {       "?^?",          "^",    "_operator_bitxor",                             OT_INFIX                        },
     55                        {       "?|?",          "|",    "_operator_bitor",                              OT_INFIX                        },
     56                        {       "?=?",          "=",    "_operator_assign",                             OT_INFIXASSIGN          },
     57                        {       "?\\=?",        "\\=",  "_operator_expassign",                  OT_INFIXASSIGN          },
     58                        {       "?*=?",         "*=",   "_operator_multassign",                 OT_INFIXASSIGN          },
     59                        {       "?/=?",         "/=",   "_operator_divassign",                  OT_INFIXASSIGN          },
     60                        {       "?%=?",         "%=",   "_operator_modassign",                  OT_INFIXASSIGN          },
     61                        {       "?+=?",         "+=",   "_operator_addassign",                  OT_INFIXASSIGN          },
     62                        {       "?-=?",         "-=",   "_operator_subassign",                  OT_INFIXASSIGN          },
     63                        {       "?<<=?",        "<<=",  "_operator_shiftleftassign",    OT_INFIXASSIGN          },
     64                        {       "?>>=?",        ">>=",  "_operator_shiftrightassign",   OT_INFIXASSIGN          },
     65                        {       "?&=?",         "&=",   "_operator_bitandassign",               OT_INFIXASSIGN          },
     66                        {       "?^=?",         "^=",   "_operator_bitxorassign",               OT_INFIXASSIGN          },
     67                        {       "?|=?",         "|=",   "_operator_bitorassign",                OT_INFIXASSIGN          },
     68                };
    7069
    71         std::map< std::string, OperatorInfo > CodeGen::table;
     70                const int numOps = sizeof( tableValues ) / sizeof( OperatorInfo );
    7271
    73         CodeGen::CodeGen() {
    74                 enum { numOps = sizeof( tableValues ) / sizeof( OperatorInfo ) };
    75                 for ( int i = 0; i < numOps; i += 1 ) {
    76                         table[ tableValues[i].inputName ] = tableValues[i];
    77                 } // for
     72                std::map< std::string, OperatorInfo > table;
     73
     74                void initialize() {
     75                        for ( int i = 0; i < numOps; ++i ) {
     76                                table[ tableValues[i].inputName ] = tableValues[i];
     77                        } // for
     78                }
     79        } // namespace
     80
     81        bool operatorLookup( const std::string & funcName, OperatorInfo & info ) {
     82                static bool init = false;
     83                if ( ! init ) {
     84                        initialize();
     85                } // if
     86
     87                std::map< std::string, OperatorInfo >::const_iterator i = table.find( funcName );
     88                if ( i == table.end() ) {
     89                        if ( isPrefix( funcName, "?`" ) ) {
     90                                // handle literal suffixes, which are user-defined postfix operators
     91                                info.inputName = funcName;
     92                                info.symbol = funcName.substr(2);
     93                                info.outputName = toString( "__operator_literal_", info.symbol );
     94                                info.type = OT_POSTFIX;
     95                                return true;
     96                        }
     97                        return false;
     98                } else {
     99                        info = i->second;
     100                        return true;
     101                } // if
    78102        }
    79103
    80         const OperatorInfo * operatorLookup( const string & funcName ) {
    81                 if ( funcName.find_first_of( "?^*+-!", 0, 1 ) == string::npos ) return nullptr; // prefilter
    82                 const OperatorInfo * ret = &CodeGen::table.find( funcName )->second; // must be in the table
    83                 assert( ret );
    84                 return ret;
     104        bool isOperator( const std::string & funcName ) {
     105                OperatorInfo info;
     106                return operatorLookup( funcName, info );
    85107        }
    86108
    87         bool isOperator( const string & funcName ) {
    88                 return operatorLookup( funcName ) != nullptr;
    89         }
    90 
    91         string operatorFriendlyName( const string & funcName ) {
    92                 const OperatorInfo * info = operatorLookup( funcName );
    93                 if ( info ) return info->friendlyName;
    94                 return "";
    95         }
    96 
    97         bool isConstructor( const string & funcName ) {
    98                 const OperatorInfo * info = operatorLookup( funcName );
    99                 if ( info ) return info->type == OT_CTOR;
     109        /// determines if a given function name is one of the operator types between [begin, end)
     110        template<typename Iterator>
     111        bool isOperatorType( const std::string & funcName, Iterator begin, Iterator end ) {
     112                OperatorInfo info;
     113                if ( operatorLookup( funcName, info ) ) {
     114                        return std::find( begin, end, info.type ) != end;
     115                }
    100116                return false;
    101117        }
    102118
    103         bool isDestructor( const string & funcName ) {
    104                 const OperatorInfo * info = operatorLookup( funcName );
    105                 if ( info ) return info->type == OT_DTOR;
    106                 return false;
     119        bool isConstructor( const std::string & funcName ) {
     120                static OperatorType types[] = { OT_CTOR };
     121                return isOperatorType( funcName, std::begin(types), std::end(types) );
    107122        }
    108123
    109         bool isCtorDtor( const string & funcName ) {
    110                 const OperatorInfo * info = operatorLookup( funcName );
    111                 if ( info ) return info->type <= OT_CONSTRUCTOR;
    112                 return false;
     124        bool isDestructor( const std::string & funcName ) {
     125                static OperatorType types[] = { OT_DTOR };
     126                return isOperatorType( funcName, std::begin(types), std::end(types) );
    113127        }
    114128
    115         bool isAssignment( const string & funcName ) {
    116                 const OperatorInfo * info = operatorLookup( funcName );
    117                 if ( info ) return info->type > OT_CONSTRUCTOR && info->type <= OT_ASSIGNMENT;
    118                 return false;
     129        bool isAssignment( const std::string & funcName ) {
     130                static OperatorType types[] = { OT_PREFIXASSIGN, OT_POSTFIXASSIGN, OT_INFIXASSIGN };
     131                return isOperatorType( funcName, std::begin(types), std::end(types) );
    119132        }
    120133
    121         bool isCtorDtorAssign( const string & funcName ) {
    122                 const OperatorInfo * info = operatorLookup( funcName );
    123                 if ( info ) return info->type <= OT_ASSIGNMENT;
    124                 return false;
     134        bool isCtorDtor( const std::string & funcName ) {
     135                static OperatorType types[] = { OT_CTOR, OT_DTOR };
     136                return isOperatorType( funcName, std::begin(types), std::end(types) );
    125137        }
    126138
    127         CodeGen codegen;                                                                        // initialize singleton package
     139        bool isCtorDtorAssign( const std::string & funcName ) {
     140                static OperatorType types[] = { OT_CTOR, OT_DTOR, OT_PREFIXASSIGN, OT_POSTFIXASSIGN, OT_INFIXASSIGN };
     141                return isOperatorType( funcName, std::begin(types), std::end(types) );
     142        }
    128143} // namespace CodeGen
    129144
    130145// Local Variables: //
    131146// tab-width: 4 //
     147// mode: c++ //
     148// compile-command: "make install" //
    132149// End: //
  • src/CodeGen/OperatorTable.h

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Feb 16 08:13:34 2020
    13 // Update Count     : 26
     12// Last Modified On : Fri Jul 21 22:17:11 2017
     13// Update Count     : 6
    1414//
    1515
     
    1717
    1818#include <string>
    19 #include <map>
    2019
    2120namespace CodeGen {
    2221        enum OperatorType {
     22                OT_INDEX,
    2323                OT_CTOR,
    2424                OT_DTOR,
    25                 OT_CONSTRUCTOR = OT_DTOR,
     25                OT_CALL,
     26                OT_PREFIX,
     27                OT_POSTFIX,
     28                OT_INFIX,
    2629                OT_PREFIXASSIGN,
    2730                OT_POSTFIXASSIGN,
    2831                OT_INFIXASSIGN,
    29                 OT_ASSIGNMENT = OT_INFIXASSIGN,
    30                 OT_CALL,
    31                 OT_PREFIX,
    32                 OT_INFIX,
    33                 OT_POSTFIX,
    34                 OT_INDEX,
    3532                OT_LABELADDRESS,
    3633                OT_CONSTANT
     
    4138                std::string symbol;
    4239                std::string outputName;
    43                 std::string friendlyName;
    4440                OperatorType type;
    4541        };
    4642
    47         class CodeGen {
    48                 friend const OperatorInfo * operatorLookup( const std::string & funcName );
    49 
    50                 static const OperatorInfo tableValues[];
    51                 static std::map< std::string, OperatorInfo > table;
    52           public:
    53                 CodeGen();
    54         }; // CodeGen
    55 
    5643        bool isOperator( const std::string & funcName );
    57         const OperatorInfo * operatorLookup( const std::string & funcName );
    58         std::string operatorFriendlyName( const std::string & funcName );
     44        bool operatorLookup( const std::string & funcName, OperatorInfo & info );
    5945
    6046        bool isConstructor( const std::string & );
  • src/CodeGen/Options.h

    r3d5701e r9fb8f01  
    99// Author           : Andrew Beach
    1010// Created On       : Tue Apr 30 11:36:00 2019
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Feb 15 18:37:06 2020
    13 // Update Count     : 3
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thr May  2 10:45:00 2019
     13// Update Count     : 2
    1414//
    1515
    1616#pragma once
    1717
    18 struct Options {
    19         // External Options: Same thoughout a pass.
    20         bool pretty;
    21         bool genC;
    22         bool lineMarks;
    23         bool printExprTypes;
     18namespace CodeGen {
     19        struct Options {
     20                // External Options: Same thoughout a pass.
     21                bool pretty;
     22                bool genC;
     23                bool lineMarks;
     24                bool printExprTypes;
    2425
    25         // Internal Options: Changed on some recurisive calls.
    26         bool anonymousUnused = false;
     26                // Internal Options: Changed on some recurisive calls.
     27                bool anonymousUnused = false;
    2728
    28         Options(bool pretty, bool genC, bool lineMarks, bool printExprTypes) :
    29                 pretty(pretty), genC(genC), lineMarks(lineMarks), printExprTypes(printExprTypes)
     29                Options(bool pretty, bool genC, bool lineMarks, bool printExprTypes) :
     30                        pretty(pretty), genC(genC), lineMarks(lineMarks), printExprTypes(printExprTypes)
    3031                {}
    31 };
     32        };
     33} // namespace CodeGen
    3234
    3335// Local Variables: //
  • src/CodeGen/module.mk

    r3d5701e r9fb8f01  
    1111## Created On       : Mon Jun  1 17:49:17 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Sat Dec 14 07:29:42 2019
    14 ## Update Count     : 4
     13## Last Modified On : Tue Jun  2 11:17:02 2015
     14## Update Count     : 3
    1515###############################################################################
    1616
     
    2424        CodeGen/OperatorTable.cc
    2525
     26
    2627SRC += $(SRC_CODEGEN) CodeGen/Generate.cc CodeGen/FixNames.cc
    2728SRCDEMANGLE += $(SRC_CODEGEN)
  • src/CodeTools/DeclStats.cc

    r3d5701e r9fb8f01  
    99// Author           : Aaron Moss
    1010// Created On       : Wed Jan 31 16:40:00 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:39:33 2019
    13 // Update Count     : 2
     11// Last Modified By : Aaron Moss
     12// Last Modified On : Wed Jan 31 16:40:00 2016
     13// Update Count     : 1
    1414//
    1515
     
    2626#include "Common/VectorMap.h"      // for VectorMap
    2727#include "GenPoly/GenPoly.h"       // for hasPolyBase
    28 #include "SynTree/LinkageSpec.h"   // for ::NoOfSpecs, Spec
     28#include "Parser/LinkageSpec.h"    // for ::NoOfSpecs, Spec
    2929#include "SynTree/Declaration.h"   // for FunctionDecl, TypeDecl, Declaration
    3030#include "SynTree/Expression.h"    // for UntypedExpr, Expression
  • src/CodeTools/ResolvProtoDump.cc

    r3d5701e r9fb8f01  
    99// Author           : Aaron Moss
    1010// Created On       : Tue Sep 11 09:04:00 2018
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Feb 15 13:50:11 2020
    13 // Update Count     : 3
     11// Last Modified By : Aaron Moss
     12// Last Modified On : Tue Sep 11 09:04:00 2018
     13// Update Count     : 1
    1414//
    1515
     
    182182
    183183                        // replace operator names
    184                         const CodeGen::OperatorInfo * opInfo = CodeGen::operatorLookup( name );
    185                         if ( opInfo ) {
     184                        CodeGen::OperatorInfo info;
     185                        if ( CodeGen::operatorLookup( name, info ) ) {
    186186                                ss << new_prefix(pre, "");
    187                                 op_name( opInfo->outputName, ss );
     187                                op_name( info.outputName, ss );
    188188                                return;
    189189                        }
  • src/Common/Debug.h

    r3d5701e r9fb8f01  
    99// Author           : Rob Schluntz
    1010// Created On       : Fri Sep 1 11:09:14 2017
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:39:42 2019
    13 // Update Count     : 3
     11// Last Modified By : Rob Schluntz
     12// Last Modified On : Fri Sep 1 11:09:36 2017
     13// Update Count     : 2
    1414//
    1515
     
    2121
    2222#include "CodeGen/Generate.h"
    23 #include "SynTree/LinkageSpec.h"
     23#include "Parser/LinkageSpec.h"
    2424#include "SynTree/Declaration.h"
    2525
  • src/Common/PassVisitor.impl.h

    r3d5701e r9fb8f01  
    24522452
    24532453        indexerScopedAccept( node->result    , *this );
     2454        maybeAccept_impl   ( node->inout     , *this );
    24542455        maybeAccept_impl   ( node->constraint, *this );
    24552456        maybeAccept_impl   ( node->operand   , *this );
     
    24632464
    24642465        indexerScopedAccept( node->result    , *this );
     2466        maybeAccept_impl   ( node->inout     , *this );
    24652467        maybeAccept_impl   ( node->constraint, *this );
    24662468        maybeAccept_impl   ( node->operand   , *this );
     
    24752477        indexerScopedMutate( node->env       , *this );
    24762478        indexerScopedMutate( node->result    , *this );
     2479        maybeMutate_impl   ( node->inout     , *this );
    24772480        maybeMutate_impl   ( node->constraint, *this );
    24782481        maybeMutate_impl   ( node->operand   , *this );
     
    33023305        VISIT_START( node );
    33033306
    3304         indexerAddUnion( node->name );
     3307        indexerAddStruct( node->name );
    33053308
    33063309        {
     
    33173320        VISIT_START( node );
    33183321
    3319         indexerAddUnion( node->name );
     3322        indexerAddStruct( node->name );
    33203323
    33213324        {
     
    33323335        MUTATE_START( node );
    33333336
    3334         indexerAddUnion( node->name );
     3337        indexerAddStruct( node->name );
    33353338
    33363339        {
  • src/Common/SemanticError.cc

    r3d5701e r9fb8f01  
    149149// Helpers
    150150namespace ErrorHelpers {
    151         Colors colors = Colors::Auto;
    152 
    153         static inline bool with_colors() {
    154                 return colors == Colors::Auto ? isatty( STDERR_FILENO ) : bool(colors);
    155         }
    156 
    157151        const std::string & error_str() {
    158                 static std::string str = with_colors() ? "\e[31merror:\e[39m " : "error: ";
     152                static std::string str = isatty( STDERR_FILENO ) ? "\e[31merror:\e[39m " : "error: ";
    159153                return str;
    160154        }
    161155
    162156        const std::string & warning_str() {
    163                 static std::string str = with_colors() ? "\e[95mwarning:\e[39m " : "warning: ";
     157                static std::string str = isatty( STDERR_FILENO ) ? "\e[95mwarning:\e[39m " : "warning: ";
    164158                return str;
    165159        }
    166160
    167161        const std::string & bold_ttycode() {
    168                 static std::string str = with_colors() ? "\e[1m" : "";
     162                static std::string str = isatty( STDERR_FILENO ) ? "\e[1m" : "";
    169163                return str;
    170164        }
    171165
    172166        const std::string & reset_font_ttycode() {
    173                 static std::string str = with_colors() ? "\e[0m" : "";
     167                static std::string str = isatty( STDERR_FILENO ) ? "\e[0m" : "";
    174168                return str;
    175169        }
  • src/Common/SemanticError.h

    r3d5701e r9fb8f01  
    4949struct WarningData {
    5050        const char * const name;
     51        const char * const message;
    5152        const Severity default_severity;
    52         const char * const message;
    5353};
    5454
    5555constexpr WarningData WarningFormats[] = {
    56         {"self-assign"            , Severity::Warn    , "self assignment of expression: %s"                          },
    57         {"reference-conversion"   , Severity::Warn    , "rvalue to reference conversion of rvalue: %s"               },
    58         {"qualifiers-zero_t-one_t", Severity::Warn    , "questionable use of type qualifier %s with %s"              },
    59         {"aggregate-forward-decl" , Severity::Warn    , "forward declaration of nested aggregate: %s"                },
    60         {"superfluous-decl"       , Severity::Warn    , "declaration does not allocate storage: %s"                  },
    61         {"gcc-attributes"         , Severity::Warn    , "invalid attribute: %s"                                      },
    62         {"c++-like-copy"          , Severity::Warn    , "Constructor from reference is not a valid copy constructor" },
     56        {"self-assign"            , "self assignment of expression: %s"            , Severity::Warn},
     57        {"reference-conversion"   , "rvalue to reference conversion of rvalue: %s" , Severity::Warn},
     58        {"qualifiers-zero_t-one_t", "questionable use of type qualifier %s with %s", Severity::Warn},
     59        {"aggregate-forward-decl" , "forward declaration of nested aggregate: %s"  , Severity::Warn},
     60        {"superfluous-decl"       , "declaration does not allocate storage: %s"    , Severity::Warn},
     61        {"gcc-attributes"         , "invalid attribute: %s"                        , Severity::Warn},
    6362};
    6463
     
    7069        SuperfluousDecl,
    7170        GccAttributes,
    72         CppCopy,
    7371        NUMBER_OF_WARNINGS, // This MUST be the last warning
    7472};
     
    9997// Helpers
    10098namespace ErrorHelpers {
    101         enum class Colors {
    102                 Never = false,
    103                 Always = true,
    104                 Auto,
    105         };
    106 
    107         extern Colors colors;
    108 
    10999        const std::string & error_str();
    110100        const std::string & warning_str();
  • src/Common/Stats/Time.h

    r3d5701e r9fb8f01  
    99// Author           : Thierry Delisle
    1010// Created On       : Fri Mar 01 15:14:11 2019
    11 // Last Modified By : Andrew Beach
     11// Last Modified By :
    1212// Last Modified On :
    1313// Update Count     :
     
    4141                                f();
    4242                        }
    43 
    44                         template<typename ret_t = void, typename func_t, typename... arg_t>
    45                         inline ret_t TimeCall(
    46                                         const char *, func_t func, arg_t&&... arg) {
    47                                 return func(std::forward<arg_t>(arg)...);
    48                         }
    4943#               else
    5044                        void StartGlobal();
     
    6559                                func();
    6660                        }
    67 
    68                         template<typename ret_t = void, typename func_t, typename... arg_t>
    69                         inline ret_t TimeCall(
    70                                         const char * name, func_t func, arg_t&&... arg) {
    71                                 BlockGuard guard(name);
    72                                 return func(std::forward<arg_t>(arg)...);
    73                         }
    7461#               endif
    7562        }
  • src/Common/utility.h

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb 11 13:00:36 2020
    13 // Update Count     : 50
     12// Last Modified On : Wed Jul 24 14:28:19 2019
     13// Update Count     : 41
    1414//
    1515
     
    2929#include <utility>
    3030#include <vector>
    31 #include <cstring>                                                                              // memcmp
    3231
    3332#include "Common/Indenter.h"
     
    265264}
    266265
    267 // determines if pref is a prefix of str
    268 static inline bool isPrefix( const std::string & str, const std::string & pref, unsigned int start = 0 ) {
     266/// determines if `pref` is a prefix of `str`
     267static inline bool isPrefix( const std::string & str, const std::string & pref ) {
    269268        if ( pref.size() > str.size() ) return false;
    270     return 0 == memcmp( str.c_str() + start, pref.c_str(), pref.size() );
    271         // return prefix == full.substr(0, prefix.size()); // for future, requires c++17
     269        auto its = std::mismatch( pref.begin(), pref.end(), str.begin() );
     270        return its.first == pref.end();
    272271}
    273272
  • src/Concurrency/Keywords.cc

    r3d5701e r9fb8f01  
    1111// Last Modified By :
    1212// Last Modified On :
    13 // Update Count     : 10
     13// Update Count     : 5
    1414//
    1515
     
    2424#include "CodeGen/OperatorTable.h" // for isConstructor
    2525#include "InitTweak/InitTweak.h"   // for getPointerBase
    26 #include "SynTree/LinkageSpec.h"   // for Cforall
     26#include "Parser/LinkageSpec.h"    // for Cforall
    2727#include "SynTree/Constant.h"      // for Constant
    2828#include "SynTree/Declaration.h"   // for StructDecl, FunctionDecl, ObjectDecl
     
    5353          public:
    5454
    55                 ConcurrentSueKeyword( std::string&& type_name, std::string&& field_name, std::string&& getter_name, std::string&& context_error, bool needs_main, AggregateDecl::Aggregate cast_target ) :
     55                ConcurrentSueKeyword( std::string&& type_name, std::string&& field_name, std::string&& getter_name, std::string&& context_error, bool needs_main, KeywordCastExpr::Target cast_target ) :
    5656                  type_name( type_name ), field_name( field_name ), getter_name( getter_name ), context_error( context_error ), needs_main( needs_main ), cast_target( cast_target ) {}
    5757
     
    5959
    6060                Declaration * postmutate( StructDecl * decl );
    61                 DeclarationWithType * postmutate( FunctionDecl * decl );
    6261
    6362                void handle( StructDecl * );
     
    7675                const std::string context_error;
    7776                bool needs_main;
    78                 AggregateDecl::Aggregate cast_target;
    79 
    80                 StructDecl   * type_decl = nullptr;
    81                 FunctionDecl * dtor_decl = nullptr;
     77                KeywordCastExpr::Target cast_target;
     78
     79                StructDecl* type_decl = nullptr;
    8280        };
    8381
     
    8886        //      int data;                                  int data;
    8987        //      a_struct_t more_data;                      a_struct_t more_data;
    90         //                                =>             $thread __thrd_d;
     88        //                                =>             thread_desc __thrd_d;
    9189        // };                                        };
    92         //                                           static inline $thread * get_thread( MyThread * this ) { return &this->__thrd_d; }
     90        //                                           static inline thread_desc * get_thread( MyThread * this ) { return &this->__thrd_d; }
    9391        //
    9492        class ThreadKeyword final : public ConcurrentSueKeyword {
     
    9694
    9795                ThreadKeyword() : ConcurrentSueKeyword(
    98                         "$thread",
     96                        "thread_desc",
    9997                        "__thrd",
    10098                        "get_thread",
    101                         "thread keyword requires threads to be in scope, add #include <thread.hfa>\n",
     99                        "thread keyword requires threads to be in scope, add #include <thread.hfa>",
    102100                        true,
    103                         AggregateDecl::Thread
     101                        KeywordCastExpr::Thread
    104102                )
    105103                {}
     
    120118        //      int data;                                  int data;
    121119        //      a_struct_t more_data;                      a_struct_t more_data;
    122         //                                =>             $coroutine __cor_d;
     120        //                                =>             coroutine_desc __cor_d;
    123121        // };                                        };
    124         //                                           static inline $coroutine * get_coroutine( MyCoroutine * this ) { return &this->__cor_d; }
     122        //                                           static inline coroutine_desc * get_coroutine( MyCoroutine * this ) { return &this->__cor_d; }
    125123        //
    126124        class CoroutineKeyword final : public ConcurrentSueKeyword {
     
    128126
    129127                CoroutineKeyword() : ConcurrentSueKeyword(
    130                         "$coroutine",
     128                        "coroutine_desc",
    131129                        "__cor",
    132130                        "get_coroutine",
    133                         "coroutine keyword requires coroutines to be in scope, add #include <coroutine.hfa>\n",
     131                        "coroutine keyword requires coroutines to be in scope, add #include <coroutine.hfa>",
    134132                        true,
    135                         AggregateDecl::Coroutine
     133                        KeywordCastExpr::Coroutine
    136134                )
    137135                {}
     
    152150        //      int data;                                  int data;
    153151        //      a_struct_t more_data;                      a_struct_t more_data;
    154         //                                =>             $monitor __mon_d;
     152        //                                =>             monitor_desc __mon_d;
    155153        // };                                        };
    156         //                                           static inline $monitor * get_coroutine( MyMonitor * this ) { return &this->__cor_d; }
     154        //                                           static inline monitor_desc * get_coroutine( MyMonitor * this ) { return &this->__cor_d; }
    157155        //
    158156        class MonitorKeyword final : public ConcurrentSueKeyword {
     
    160158
    161159                MonitorKeyword() : ConcurrentSueKeyword(
    162                         "$monitor",
     160                        "monitor_desc",
    163161                        "__mon",
    164162                        "get_monitor",
    165                         "monitor keyword requires monitors to be in scope, add #include <monitor.hfa>\n",
     163                        "monitor keyword requires monitors to be in scope, add #include <monitor.hfa>",
    166164                        false,
    167                         AggregateDecl::Monitor
     165                        KeywordCastExpr::Monitor
    168166                )
    169167                {}
     
    182180        //Handles mutex routines definitions :
    183181        // void foo( A * mutex a, B * mutex b,  int i ) {                  void foo( A * a, B * b,  int i ) {
    184         //                                                                       $monitor * __monitors[] = { get_monitor(a), get_monitor(b) };
     182        //                                                                       monitor_desc * __monitors[] = { get_monitor(a), get_monitor(b) };
    185183        //                                                                       monitor_guard_t __guard = { __monitors, 2 };
    186184        //    /*Some code*/                                       =>           /*Some code*/
     
    221219        //Handles mutex routines definitions :
    222220        // void foo( A * mutex a, B * mutex b,  int i ) {                  void foo( A * a, B * b,  int i ) {
    223         //                                                                       $monitor * __monitors[] = { get_monitor(a), get_monitor(b) };
     221        //                                                                       monitor_desc * __monitors[] = { get_monitor(a), get_monitor(b) };
    224222        //                                                                       monitor_guard_t __guard = { __monitors, 2 };
    225223        //    /*Some code*/                                       =>           /*Some code*/
     
    286284        }
    287285
    288         DeclarationWithType * ConcurrentSueKeyword::postmutate( FunctionDecl * decl ) {
    289                 if( !type_decl ) return decl;
    290                 if( !CodeGen::isDestructor( decl->name ) ) return decl;
    291 
    292                 auto params = decl->type->parameters;
    293                 if( params.size() != 1 ) return decl;
    294 
    295                 auto type = dynamic_cast<ReferenceType*>( params.front()->get_type() );
    296                 if( !type ) return decl;
    297 
    298                 auto stype = dynamic_cast<StructInstType*>( type->base );
    299                 if( !stype ) return decl;
    300                 if( stype->baseStruct != type_decl ) return decl;
    301 
    302                 if( !dtor_decl ) dtor_decl = decl;
    303                 return decl;
    304         }
    305 
    306286        Expression * ConcurrentSueKeyword::postmutate( KeywordCastExpr * cast ) {
    307287                if ( cast_target == cast->target ) {
    308                         // convert (thread &)t to ($thread &)*get_thread(t), etc.
     288                        // convert (thread &)t to (thread_desc &)*get_thread(t), etc.
    309289                        if( !type_decl ) SemanticError( cast, context_error );
    310                         if( !dtor_decl ) SemanticError( cast, context_error );
    311                         assert( cast->result == nullptr );
    312                         cast->set_result( new ReferenceType( noQualifiers, new StructInstType( noQualifiers, type_decl ) ) );
    313                         cast->concrete_target.field  = field_name;
    314                         cast->concrete_target.getter = getter_name;
     290                        Expression * arg = cast->arg;
     291                        cast->arg = nullptr;
     292                        delete cast;
     293                        return new CastExpr(
     294                                UntypedExpr::createDeref(
     295                                        new UntypedExpr( new NameExpr( getter_name ), { arg } )
     296                                ),
     297                                new ReferenceType(
     298                                        noQualifiers,
     299                                        new StructInstType( noQualifiers, type_decl ) )
     300                                );
    315301                }
    316302                return cast;
     
    322308
    323309                if( !type_decl ) SemanticError( decl, context_error );
    324                 if( !dtor_decl ) SemanticError( decl, context_error );
    325310
    326311                FunctionDecl * func = forwardDeclare( decl );
     
    377362                        get_type,
    378363                        nullptr,
    379                         { new Attribute("const") },
     364                        noAttributes,
    380365                        Type::Inline
    381366                );
     
    516501        void MutexKeyword::postvisit(StructDecl* decl) {
    517502
    518                 if( decl->name == "$monitor" && decl->body ) {
     503                if( decl->name == "monitor_desc" && decl->body ) {
    519504                        assert( !monitor_decl );
    520505                        monitor_decl = decl;
     
    612597                );
    613598
    614                 //$monitor * __monitors[] = { get_monitor(a), get_monitor(b) };
     599                //monitor_desc * __monitors[] = { get_monitor(a), get_monitor(b) };
    615600                body->push_front( new DeclStmt( monitors) );
    616601        }
     
    673658                );
    674659
    675                 //$monitor * __monitors[] = { get_monitor(a), get_monitor(b) };
     660                //monitor_desc * __monitors[] = { get_monitor(a), get_monitor(b) };
    676661                body->push_front( new DeclStmt( monitors) );
    677662        }
     
    681666        //=============================================================================================
    682667        void ThreadStarter::previsit( StructDecl * decl ) {
    683                 if( decl->name == "$thread" && decl->body ) {
     668                if( decl->name == "thread_desc" && decl->body ) {
    684669                        assert( !thread_decl );
    685670                        thread_decl = decl;
     
    716701                                new UntypedExpr(
    717702                                        new NameExpr( "__thrd_start" ),
    718                                         { new VariableExpr( param ), new NameExpr("main") }
     703                                        { new VariableExpr( param ) }
    719704                                )
    720705                        )
  • src/Concurrency/Waitfor.cc

    r3d5701e r9fb8f01  
    1111// Last Modified By :
    1212// Last Modified On :
    13 // Update Count     : 12
     13// Update Count     : 7
    1414//
    1515
     
    2323#include "Common/PassVisitor.h"    // for PassVisitor
    2424#include "Common/SemanticError.h"  // for SemanticError
    25 #include "Common/UniqueName.h"     // for UniqueName
    2625#include "Common/utility.h"        // for deleteAll, map_range
    2726#include "CodeGen/OperatorTable.h" // for isConstructor
    2827#include "InitTweak/InitTweak.h"   // for getPointerBase
     28#include "Parser/LinkageSpec.h"    // for Cforall
    2929#include "ResolvExpr/Resolver.h"   // for findVoidExpression
    30 #include "SynTree/LinkageSpec.h"   // for Cforall
    3130#include "SynTree/Constant.h"      // for Constant
    3231#include "SynTree/Declaration.h"   // for StructDecl, FunctionDecl, ObjectDecl
     
    4241void foo() {
    4342        while( true ) {
    44                 when( a < 1 ) waitfor( f : a ) { bar(); }
     43                when( a < 1 ) waitfor( f, a ) { bar(); }
    4544                or timeout( swagl() );
    46                 or waitfor( g : a ) { baz(); }
    47                 or waitfor( ^?{} : a ) { break; }
     45                or waitfor( g, a ) { baz(); }
     46                or waitfor( ^?{}, a ) { break; }
    4847                or waitfor( ^?{} ) { break; }
    4948        }
     
    244243                        decl_mask = decl;
    245244                }
    246                 else if( decl->name == "$monitor" ) {
     245                else if( decl->name == "monitor_desc" ) {
    247246                        assert( !decl_monitor );
    248247                        decl_monitor = decl;
  • src/ControlStruct/ExceptTranslate.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Wed Jun 14 16:49:00 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:40:15 2019
    13 // Update Count     : 12
     12// Last Modified On : Wed Feb 13 18:15:29 2019
     13// Update Count     : 11
    1414//
    1515
     
    2424#include "Common/SemanticError.h"     // for SemanticError
    2525#include "Common/utility.h"           // for CodeLocation
    26 #include "SynTree/LinkageSpec.h"      // for Cforall
     26#include "Parser/LinkageSpec.h"       // for Cforall
    2727#include "SynTree/Attribute.h"        // for Attribute
    2828#include "SynTree/Constant.h"         // for Constant
  • src/ControlStruct/LabelFixer.cc

    r3d5701e r9fb8f01  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Tue Jan 21 10:32:00 2020
    13 // Update Count     : 160
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Mon Mar 11 22:26:02 2019
     13// Update Count     : 159
    1414//
    1515
     
    2121#include "ControlStruct/LabelGenerator.h"  // for LabelGenerator
    2222#include "LabelFixer.h"
    23 #include "MLEMutator.h"                    // for MultiLevelExitMutator
     23#include "MLEMutator.h"                    // for MLEMutator
    2424#include "SynTree/Declaration.h"           // for FunctionDecl
    2525#include "SynTree/Expression.h"            // for NameExpr, Expression, Unty...
     
    4444
    4545        void LabelFixer::postvisit( FunctionDecl * functionDecl ) {
    46                 PassVisitor<MultiLevelExitMutator> mlem( resolveJumps(), generator );
    47                 // We start in the body so we can stop when we hit another FunctionDecl.
    48                 maybeMutate( functionDecl->statements, mlem );
     46                PassVisitor<MLEMutator> mlemut( resolveJumps(), generator );
     47                functionDecl->acceptMutator( mlemut );
    4948        }
    5049
     
    7675
    7776
    78         // Sets the definition of the labelTable entry to be the provided statement for every label in
    79         // the list parameter. Happens for every kind of statement.
     77        // sets the definition of the labelTable entry to be the provided statement for every label in the list
     78        // parameter. Happens for every kind of statement
    8079        Label LabelFixer::setLabelsDef( std::list< Label > & llabel, Statement * definition ) {
    8180                assert( definition != 0 );
    8281                assert( llabel.size() > 0 );
     82
     83                Entry * e = new Entry( definition );
    8384
    8485                for ( std::list< Label >::iterator i = llabel.begin(); i != llabel.end(); i++ ) {
     
    8687                        l.set_statement( definition ); // attach statement to the label to be used later
    8788                        if ( labelTable.find( l ) == labelTable.end() ) {
    88                                 // All labels on this statement need to use the same entry,
    89                                 // so this should only be created once.
     89                                // all labels on this statement need to use the same entry, so this should only be created once
    9090                                // undefined and unused until now, add an entry
    91                                 labelTable[ l ] = new Entry( definition );
     91                                labelTable[ l ] =  e;
    9292                        } else if ( labelTable[ l ]->defined() ) {
    9393                                // defined twice, error
    94                                 SemanticError( l.get_statement()->location,
    95                                         "Duplicate definition of label: " + l.get_name() );
    96                         } else {
     94                                SemanticError( l.get_statement()->location, "Duplicate definition of label: " + l.get_name() );
     95                        }       else {
    9796                                // used previously, but undefined until now -> link with this entry
    98                                 // Question: Is changing objects important?
    9997                                delete labelTable[ l ];
    100                                 labelTable[ l ] = new Entry( definition );
     98                                labelTable[ l ] = e;
    10199                        } // if
    102100                } // for
    103101
    104                 // Produce one of the labels attached to this statement to be temporarily used as the
    105                 // canonical label.
     102                // produce one of the labels attached to this statement to be temporarily used as the canonical label
    106103                return labelTable[ llabel.front() ]->get_label();
    107104        }
  • src/ControlStruct/MLEMutator.cc

    r3d5701e r9fb8f01  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Jan 22 11:50:00 2020
    13 // Update Count     : 223
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu Mar  8 17:08:25 2018
     13// Update Count     : 219
    1414//
    1515
     
    3333
    3434namespace ControlStruct {
    35         MultiLevelExitMutator::~MultiLevelExitMutator() {
     35        MLEMutator::~MLEMutator() {
    3636                delete targetTable;
    3737                targetTable = 0;
    3838        }
    3939        namespace {
    40                 bool isLoop( const MultiLevelExitMutator::Entry & e ) {
    41                         return dynamic_cast< WhileStmt * >( e.get_controlStructure() )
    42                                 || dynamic_cast< ForStmt * >( e.get_controlStructure() );
    43                 }
    44                 bool isSwitch( const MultiLevelExitMutator::Entry & e ) {
    45                         return dynamic_cast< SwitchStmt *>( e.get_controlStructure() );
    46                 }
    47 
    48                 bool isBreakTarget( const MultiLevelExitMutator::Entry & e ) {
    49                         return isLoop( e ) || isSwitch( e )
    50                                 || dynamic_cast< CompoundStmt *>( e.get_controlStructure() );
    51                 }
    52                 bool isContinueTarget( const MultiLevelExitMutator::Entry & e ) {
    53                         return isLoop( e );
    54                 }
    55                 bool isFallthroughTarget( const MultiLevelExitMutator::Entry & e ) {
    56                         return dynamic_cast< CaseStmt *>( e.get_controlStructure() );
    57                 }
    58                 bool isFallthroughDefaultTarget( const MultiLevelExitMutator::Entry & e ) {
    59                         return isSwitch( e );
    60                 }
     40                bool isLoop( const MLEMutator::Entry & e ) { return dynamic_cast< WhileStmt * >( e.get_controlStructure() ) || dynamic_cast< ForStmt * >( e.get_controlStructure() ); }
     41                bool isSwitch( const MLEMutator::Entry & e ) { return dynamic_cast< SwitchStmt *>( e.get_controlStructure() ); }
     42
     43                bool isBreakTarget( const MLEMutator::Entry & e ) { return isLoop( e ) || isSwitch( e ) || dynamic_cast< CompoundStmt *>( e.get_controlStructure() ); }
     44                bool isContinueTarget( const MLEMutator::Entry & e ) { return isLoop( e ); }
     45                bool isFallthroughTarget( const MLEMutator::Entry & e ) { return dynamic_cast< CaseStmt *>( e.get_controlStructure() );; }
     46                bool isFallthroughDefaultTarget( const MLEMutator::Entry & e ) { return isSwitch( e ); }
    6147        } // namespace
    62 
    63         void MultiLevelExitMutator::premutate( FunctionDecl * ) {
    64                 visit_children = false;
    65         }
    6648
    6749        // break labels have to come after the statement they break out of, so mutate a statement, then if they inform us
    6850        // through the breakLabel field tha they need a place to jump to on a break statement, add the break label to the
    6951        // body of statements
    70         void MultiLevelExitMutator::fixBlock( std::list< Statement * > &kids, bool caseClause ) {
     52        void MLEMutator::fixBlock( std::list< Statement * > &kids, bool caseClause ) {
    7153                SemanticErrorException errors;
    7254
     
    9981        }
    10082
    101         void MultiLevelExitMutator::premutate( CompoundStmt *cmpndStmt ) {
     83        void MLEMutator::premutate( CompoundStmt *cmpndStmt ) {
    10284                visit_children = false;
    10385                bool labeledBlock = !(cmpndStmt->labels.empty());
     
    136118                        }
    137119                }
    138                 assertf( false, "Could not find label '%s' on statement %s",
    139                         originalTarget.get_name().c_str(), toString( stmt ).c_str() );
    140         }
    141 
    142 
    143         Statement *MultiLevelExitMutator::postmutate( BranchStmt *branchStmt )
    144                         throw ( SemanticErrorException ) {
     120                assertf( false, "Could not find label '%s' on statement %s", originalTarget.get_name().c_str(), toString( stmt ).c_str() );
     121        }
     122
     123
     124        Statement *MLEMutator::postmutate( BranchStmt *branchStmt ) throw ( SemanticErrorException ) {
    145125                std::string originalTarget = branchStmt->originalTarget;
    146126
     
    250230        }
    251231
    252         Statement *MultiLevelExitMutator::mutateLoop( Statement *bodyLoop, Entry &e ) {
     232        Statement *MLEMutator::mutateLoop( Statement *bodyLoop, Entry &e ) {
     233                // ensure loop body is a block
     234                CompoundStmt *newBody;
     235                if ( ! (newBody = dynamic_cast<CompoundStmt *>( bodyLoop )) ) {
     236                        newBody = new CompoundStmt();
     237                        newBody->get_kids().push_back( bodyLoop );
     238                } // if
     239
    253240                // only generate these when needed
    254                 if( !e.isContUsed() && !e.isBreakUsed() ) return bodyLoop;
    255 
    256                 // ensure loop body is a block
    257                 CompoundStmt * newBody = new CompoundStmt();
    258                 newBody->get_kids().push_back( bodyLoop );
    259241
    260242                if ( e.isContUsed() ) {
     
    273255
    274256        template< typename LoopClass >
    275         void MultiLevelExitMutator::prehandleLoopStmt( LoopClass * loopStmt ) {
     257        void MLEMutator::prehandleLoopStmt( LoopClass * loopStmt ) {
    276258                // remember this as the most recent enclosing loop, then mutate the body of the loop -- this will determine
    277259                // whether brkLabel and contLabel are used with branch statements and will recursively do the same to nested
     
    284266
    285267        template< typename LoopClass >
    286         Statement * MultiLevelExitMutator::posthandleLoopStmt( LoopClass * loopStmt ) {
     268        Statement * MLEMutator::posthandleLoopStmt( LoopClass * loopStmt ) {
    287269                assert( ! enclosingControlStructures.empty() );
    288270                Entry &e = enclosingControlStructures.back();
     
    295277        }
    296278
    297         void MultiLevelExitMutator::premutate( WhileStmt * whileStmt ) {
     279        void MLEMutator::premutate( WhileStmt * whileStmt ) {
    298280                return prehandleLoopStmt( whileStmt );
    299281        }
    300282
    301         void MultiLevelExitMutator::premutate( ForStmt * forStmt ) {
     283        void MLEMutator::premutate( ForStmt * forStmt ) {
    302284                return prehandleLoopStmt( forStmt );
    303285        }
    304286
    305         Statement * MultiLevelExitMutator::postmutate( WhileStmt * whileStmt ) {
     287        Statement * MLEMutator::postmutate( WhileStmt * whileStmt ) {
    306288                return posthandleLoopStmt( whileStmt );
    307289        }
    308290
    309         Statement * MultiLevelExitMutator::postmutate( ForStmt * forStmt ) {
     291        Statement * MLEMutator::postmutate( ForStmt * forStmt ) {
    310292                return posthandleLoopStmt( forStmt );
    311293        }
    312294
    313         void MultiLevelExitMutator::premutate( IfStmt * ifStmt ) {
     295        void MLEMutator::premutate( IfStmt * ifStmt ) {
    314296                // generate a label for breaking out of a labeled if
    315297                bool labeledBlock = !(ifStmt->get_labels().empty());
     
    321303        }
    322304
    323         Statement * MultiLevelExitMutator::postmutate( IfStmt * ifStmt ) {
     305        Statement * MLEMutator::postmutate( IfStmt * ifStmt ) {
    324306                bool labeledBlock = !(ifStmt->get_labels().empty());
    325307                if ( labeledBlock ) {
     
    331313        }
    332314
    333         void MultiLevelExitMutator::premutate( TryStmt * tryStmt ) {
    334                 // generate a label for breaking out of a labeled if
    335                 bool labeledBlock = !(tryStmt->get_labels().empty());
    336                 if ( labeledBlock ) {
    337                         Label brkLabel = generator->newLabel("blockBreak", tryStmt);
    338                         enclosingControlStructures.push_back( Entry( tryStmt, brkLabel ) );
    339                         GuardAction( [this]() { enclosingControlStructures.pop_back(); } );
    340                 } // if
    341         }
    342 
    343         Statement * MultiLevelExitMutator::postmutate( TryStmt * tryStmt ) {
    344                 bool labeledBlock = !(tryStmt->get_labels().empty());
    345                 if ( labeledBlock ) {
    346                         if ( ! enclosingControlStructures.back().useBreakExit().empty() ) {
    347                                 set_breakLabel( enclosingControlStructures.back().useBreakExit() );
    348                         } // if
    349                 } // if
    350                 return tryStmt;
    351         }
    352 
    353         void MultiLevelExitMutator::premutate( FinallyStmt * ) {
    354                 GuardAction([this, old = std::move(enclosingControlStructures)]() {
    355                         enclosingControlStructures = std::move(old);
    356                 });
    357                 enclosingControlStructures = std::list<Entry>();
    358                 GuardValue( inFinally );
    359                 inFinally = true;
    360         }
    361 
    362         void MultiLevelExitMutator::premutate( ReturnStmt *returnStmt ) {
    363                 if ( inFinally ) {
    364                         SemanticError( returnStmt->location, "'return' may not appear in a finally clause" );
    365                 }
    366         }
    367 
    368         void MultiLevelExitMutator::premutate( CaseStmt *caseStmt ) {
     315        void MLEMutator::premutate( CaseStmt *caseStmt ) {
    369316                visit_children = false;
    370317
     
    405352        }
    406353
    407         void MultiLevelExitMutator::premutate( SwitchStmt *switchStmt ) {
     354        void MLEMutator::premutate( SwitchStmt *switchStmt ) {
    408355                // generate a label for breaking out of a labeled switch
    409356                Label brkLabel = generator->newLabel("switchBreak", switchStmt);
     
    431378        }
    432379
    433         Statement * MultiLevelExitMutator::postmutate( SwitchStmt * switchStmt ) {
     380        Statement * MLEMutator::postmutate( SwitchStmt * switchStmt ) {
    434381                Entry &e = enclosingControlStructures.back();
    435382                assert ( e == switchStmt );
  • src/ControlStruct/MLEMutator.h

    r3d5701e r9fb8f01  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Jan 22 11:50:00 2020
    13 // Update Count     : 48
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu Mar  8 16:42:32 2018
     13// Update Count     : 41
    1414//
    1515
     
    3030        class LabelGenerator;
    3131
    32         class MultiLevelExitMutator : public WithVisitorRef<MultiLevelExitMutator>,
    33                         public WithShortCircuiting, public WithGuards {
     32        class MLEMutator : public WithVisitorRef<MLEMutator>, public WithShortCircuiting, public WithGuards {
    3433          public:
    3534                class Entry;
    36                 MultiLevelExitMutator( std::map<Label, Statement *> *t, LabelGenerator *gen = 0 ) :
    37                         targetTable( t ), breakLabel(std::string("")), generator( gen ) {}
    38                 ~MultiLevelExitMutator();
    39 
    40                 void premutate( FunctionDecl * );
     35                MLEMutator( std::map<Label, Statement *> *t, LabelGenerator *gen = 0 ) : targetTable( t ), breakLabel(std::string("")), generator( gen ) {}
     36                ~MLEMutator();
    4137
    4238                void premutate( CompoundStmt *cmpndStmt );
     
    5147                void premutate( SwitchStmt *switchStmt );
    5248                Statement * postmutate( SwitchStmt *switchStmt );
    53                 void premutate( ReturnStmt *returnStmt );
    54                 void premutate( TryStmt *tryStmt );
    55                 Statement * postmutate( TryStmt *tryStmt );
    56                 void premutate( FinallyStmt *finallyStmt );
    5749
    5850                Statement *mutateLoop( Statement *bodyLoop, Entry &e );
     
    8173                        explicit Entry( SwitchStmt *stmt, Label breakExit, Label fallDefaultExit ) :
    8274                                stmt( stmt ), breakExit( breakExit ), fallDefaultExit( fallDefaultExit ) {}
    83 
    84                         explicit Entry( TryStmt *stmt, Label breakExit ) :
    85                                 stmt( stmt ), breakExit( breakExit ) {}
    8675
    8776                        bool operator==( const Statement *other ) { return stmt == other; }
     
    116105                Label breakLabel;
    117106                LabelGenerator *generator;
    118                 bool inFinally = false;
    119107
    120108                template< typename LoopClass >
  • src/ControlStruct/Mutate.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Feb 16 03:22:07 2020
    13 // Update Count     : 10
     12// Last Modified On : Thu Aug  4 11:39:08 2016
     13// Update Count     : 9
    1414//
    1515
     
    3737                mutateAll( translationUnit, formut );
    3838        }
    39 } // namespace ControlStruct
     39} // namespace CodeGen
    4040
    4141// Local Variables: //
  • src/GenPoly/Box.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:40:34 2019
    13 // Update Count     : 347
     12// Last Modified On : Wed Jun 21 15:49:59 2017
     13// Update Count     : 346
    1414//
    1515
     
    3737#include "InitTweak/InitTweak.h"         // for getFunctionName, isAssignment
    3838#include "Lvalue.h"                      // for generalizedLvalue
     39#include "Parser/LinkageSpec.h"          // for C, Spec, Cforall, Intrinsic
    3940#include "ResolvExpr/TypeEnvironment.h"  // for EqvClass
    4041#include "ResolvExpr/typeops.h"          // for typesCompatible
     
    4344#include "SymTab/Indexer.h"              // for Indexer
    4445#include "SymTab/Mangler.h"              // for Mangler
    45 #include "SynTree/LinkageSpec.h"         // for C, Spec, Cforall, Intrinsic
    4646#include "SynTree/Attribute.h"           // for Attribute
    4747#include "SynTree/Constant.h"            // for Constant
     
    837837                                        deref->args.push_back( new CastExpr( new VariableExpr( param ), new PointerType( Type::Qualifiers(), arg->get_type()->clone() ) ) );
    838838                                        deref->result = arg->get_type()->clone();
     839                                        deref->result->set_lvalue( true );
    839840                                        return deref;
    840841                                } // if
  • src/GenPoly/Lvalue.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:14:38 2019
    13 // Update Count     : 7
     12// Last Modified On : Fri Mar 17 09:11:18 2017
     13// Update Count     : 5
    1414//
    1515
     
    1717#include <string>                        // for string
    1818
    19 #include "Common/UniqueName.h"
    2019#include "Common/PassVisitor.h"
    2120#include "GenPoly.h"                     // for isPolyType
     
    2322
    2423#include "InitTweak/InitTweak.h"
     24#include "Parser/LinkageSpec.h"          // for Spec, isBuiltin, Intrinsic
    2525#include "ResolvExpr/TypeEnvironment.h"  // for AssertionSet, OpenVarSet
    2626#include "ResolvExpr/Unify.h"            // for unify
    2727#include "ResolvExpr/typeops.h"
    2828#include "SymTab/Indexer.h"              // for Indexer
    29 #include "SynTree/LinkageSpec.h"         // for Spec, isBuiltin, Intrinsic
    3029#include "SynTree/Declaration.h"         // for Declaration, FunctionDecl
    3130#include "SynTree/Expression.h"          // for Expression, ConditionalExpr
     
    5554                                delete ret->result;
    5655                                ret->result = base->clone();
     56                                ret->result->set_lvalue( true );
    5757                                return ret;
    5858                        } else {
     
    6161                }
    6262
    63                 struct ReferenceConversions final : public WithStmtsToAdd, public WithGuards {
     63                struct ReferenceConversions final : public WithStmtsToAdd {
    6464                        Expression * postmutate( CastExpr * castExpr );
    6565                        Expression * postmutate( AddressExpr * addrExpr );
     
    7272
    7373                struct FixIntrinsicResult final : public WithGuards {
    74                         enum {
    75                                 NoSkip,
    76                                 Skip,
    77                                 SkipInProgress
    78                         } skip = NoSkip;
    79 
    80                         void premutate( AsmExpr * ) { GuardValue( skip ); skip = Skip; }
    81                         void premutate( ApplicationExpr * ) { GuardValue( skip ); skip = (skip == Skip) ? SkipInProgress : NoSkip; }
    82 
    83 
    8474                        Expression * postmutate( ApplicationExpr * appExpr );
    8575                        void premutate( FunctionDecl * funcDecl );
     
    173163
    174164                Expression * FixIntrinsicResult::postmutate( ApplicationExpr * appExpr ) {
    175                         if ( skip != SkipInProgress && isIntrinsicReference( appExpr ) ) {
     165                        if ( isIntrinsicReference( appExpr ) ) {
    176166                                // eliminate reference types from intrinsic applications - now they return lvalues
    177167                                ReferenceType * result = strict_dynamic_cast< ReferenceType * >( appExpr->result );
    178168                                appExpr->result = result->base->clone();
     169                                appExpr->result->set_lvalue( true );
    179170                                if ( ! inIntrinsic ) {
    180171                                        // when not in an intrinsic function, add a cast to
     
    445436                                delete ret->result;
    446437                                ret->result = castExpr->result;
    447                                 assert( ret->get_lvalue() ); // ensure result is lvalue
     438                                ret->result->set_lvalue( true ); // ensure result is lvalue
    448439                                castExpr->env = nullptr;
    449440                                castExpr->arg = nullptr;
  • src/GenPoly/Specialize.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:40:49 2019
    13 // Update Count     : 32
     12// Last Modified On : Thu Mar 16 07:53:59 2017
     13// Update Count     : 31
    1414//
    1515
     
    2727#include "GenPoly.h"                     // for getFunctionType
    2828#include "InitTweak/InitTweak.h"         // for isIntrinsicCallExpr
     29#include "Parser/LinkageSpec.h"          // for C
    2930#include "ResolvExpr/FindOpenVars.h"     // for findOpenVars
    3031#include "ResolvExpr/TypeEnvironment.h"  // for OpenVarSet, AssertionSet
    3132#include "Specialize.h"
    32 #include "SynTree/LinkageSpec.h"         // for C
    3333#include "SynTree/Attribute.h"           // for Attribute
    3434#include "SynTree/Declaration.h"         // for FunctionDecl, DeclarationWit...
  • src/InitTweak/FixGlobalInit.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 04 15:14:56 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:41:10 2019
    13 // Update Count     : 19
     12// Last Modified On : Thu Mar 16 07:53:11 2017
     13// Update Count     : 18
    1414//
    1515
     
    2323#include "Common/UniqueName.h"     // for UniqueName
    2424#include "InitTweak.h"             // for isIntrinsicSingleArgCallStmt
    25 #include "SynTree/LinkageSpec.h"   // for C
     25#include "Parser/LinkageSpec.h"    // for C
    2626#include "SynTree/Attribute.h"     // for Attribute
    2727#include "SynTree/Constant.h"      // for Constant
  • src/InitTweak/FixInit.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Wed Jan 13 16:29:30 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Feb 16 04:17:07 2020
    13 // Update Count     : 82
     12// Last Modified On : Wed Feb 13 18:15:56 2019
     13// Update Count     : 76
    1414//
    1515#include "FixInit.h"
     
    3838#include "GenPoly/GenPoly.h"           // for getFunctionType
    3939#include "InitTweak.h"                 // for getFunctionName, getCallArg
     40#include "Parser/LinkageSpec.h"        // for C, Spec, Cforall, isBuiltin
    4041#include "ResolvExpr/Resolver.h"       // for findVoidExpression
    4142#include "ResolvExpr/typeops.h"        // for typesCompatible
     
    4344#include "SymTab/Indexer.h"            // for Indexer
    4445#include "SymTab/Mangler.h"            // for Mangler
    45 #include "SynTree/LinkageSpec.h"       // for C, Spec, Cforall, isBuiltin
    4646#include "SynTree/Attribute.h"         // for Attribute
    4747#include "SynTree/Constant.h"          // for Constant
     
    745745                }
    746746
    747                 // to prevent warnings ('_unq0' may be used uninitialized in this function),
     747                // to prevent warnings (‘_unq0’ may be used uninitialized in this function),
    748748                // insert an appropriate zero initializer for UniqueExpr temporaries.
    749749                Initializer * makeInit( Type * t ) {
  • src/InitTweak/FixInit.h

    r3d5701e r9fb8f01  
    1010// Created On       : Wed Jan 13 16:29:30 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Feb 16 07:54:50 2020
    13 // Update Count     : 8
     12// Last Modified On : Sat Jul 22 09:31:06 2017
     13// Update Count     : 6
    1414//
    1515
     
    2222
    2323namespace InitTweak {
    24         /// replace constructor initializers with expression statements and unwrap basic C-style initializers
     24  /// replace constructor initializers with expression statements
     25  /// and unwrap basic C-style initializers
    2526        void fix( std::list< Declaration * > & translationUnit, bool inLibrary );
    2627} // namespace
  • src/InitTweak/GenInit.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:15:10 2019
    13 // Update Count     : 184
     12// Last Modified On : Fri Mar 17 09:12:36 2017
     13// Update Count     : 183
    1414//
    1515#include "GenInit.h"
     
    3434#include "GenPoly/ScopedSet.h"         // for ScopedSet, ScopedSet<>::const_iter...
    3535#include "InitTweak.h"                 // for isConstExpr, InitExpander, checkIn...
     36#include "Parser/LinkageSpec.h"        // for isOverridable, C
    3637#include "ResolvExpr/Resolver.h"
    3738#include "SymTab/Autogen.h"            // for genImplicitCall
    3839#include "SymTab/Mangler.h"            // for Mangler
    39 #include "SynTree/LinkageSpec.h"       // for isOverridable, C
    4040#include "SynTree/Declaration.h"       // for ObjectDecl, DeclarationWithType
    4141#include "SynTree/Expression.h"        // for VariableExpr, UntypedExpr, Address...
  • src/InitTweak/InitTweak.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Fri May 13 11:26:36 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:15:52 2019
    13 // Update Count     : 8
     12// Last Modified On : Thu Jul 25 22:21:48 2019
     13// Update Count     : 7
    1414//
    1515
     
    3333#include "GenPoly/GenPoly.h"       // for getFunctionType
    3434#include "InitTweak.h"
     35#include "Parser/LinkageSpec.h"    // for Spec, isBuiltin, Intrinsic
    3536#include "ResolvExpr/typeops.h"    // for typesCompatibleIgnoreQualifiers
    3637#include "SymTab/Autogen.h"
    3738#include "SymTab/Indexer.h"        // for Indexer
    38 #include "SynTree/LinkageSpec.h"   // for Spec, isBuiltin, Intrinsic
    3939#include "SynTree/Attribute.h"     // for Attribute
    4040#include "SynTree/Constant.h"      // for Constant
  • src/MakeLibCfa.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Sat May 16 10:33:33 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Feb 16 03:49:49 2020
    13 // Update Count     : 45
     12// Last Modified On : Sun Feb 17 21:08:09 2019
     13// Update Count     : 41
    1414//
    1515
     
    2323#include "Common/SemanticError.h"   // for SemanticError
    2424#include "Common/UniqueName.h"      // for UniqueName
    25 #include "SynTree/LinkageSpec.h"    // for Spec, Intrinsic, C
     25#include "Parser/LinkageSpec.h"     // for Spec, Intrinsic, C
    2626#include "SynTree/Declaration.h"    // for FunctionDecl, ObjectDecl, Declara...
    2727#include "SynTree/Expression.h"     // for NameExpr, UntypedExpr, VariableExpr
     
    9696
    9797                        FunctionDecl *funcDecl = origFuncDecl->clone();
    98                         const CodeGen::OperatorInfo * opInfo;
    99                         opInfo = CodeGen::operatorLookup( funcDecl->get_name() );
    100                         assert( opInfo );
     98                        CodeGen::OperatorInfo opInfo;
     99                        bool lookResult = CodeGen::operatorLookup( funcDecl->get_name(), opInfo );
     100                        assert( lookResult );
    101101                        assert( ! funcDecl->get_statements() );
    102102                        // build a recursive call - this is okay, as the call will actually be codegen'd using operator syntax
     
    120120
    121121                        Statement * stmt = nullptr;
    122                         switch ( opInfo->type ) {
     122                        switch ( opInfo.type ) {
    123123                          case CodeGen::OT_INDEX:
    124124                          case CodeGen::OT_CALL:
  • src/Makefile.in

    r3d5701e r9fb8f01  
    212212        SymTab/Indexer.$(OBJEXT) SymTab/Mangler.$(OBJEXT) \
    213213        SymTab/ManglerCommon.$(OBJEXT) SymTab/Validate.$(OBJEXT)
    214 am__objects_7 = SynTree/AddressExpr.$(OBJEXT) \
    215         SynTree/AggregateDecl.$(OBJEXT) \
    216         SynTree/ApplicationExpr.$(OBJEXT) SynTree/ArrayType.$(OBJEXT) \
    217         SynTree/AttrType.$(OBJEXT) SynTree/Attribute.$(OBJEXT) \
    218         SynTree/BasicType.$(OBJEXT) SynTree/CommaExpr.$(OBJEXT) \
    219         SynTree/CompoundStmt.$(OBJEXT) SynTree/Constant.$(OBJEXT) \
    220         SynTree/DeclReplacer.$(OBJEXT) SynTree/DeclStmt.$(OBJEXT) \
     214am__objects_7 = SynTree/Type.$(OBJEXT) SynTree/VoidType.$(OBJEXT) \
     215        SynTree/BasicType.$(OBJEXT) SynTree/PointerType.$(OBJEXT) \
     216        SynTree/ArrayType.$(OBJEXT) SynTree/ReferenceType.$(OBJEXT) \
     217        SynTree/FunctionType.$(OBJEXT) \
     218        SynTree/ReferenceToType.$(OBJEXT) SynTree/TupleType.$(OBJEXT) \
     219        SynTree/TypeofType.$(OBJEXT) SynTree/AttrType.$(OBJEXT) \
     220        SynTree/VarArgsType.$(OBJEXT) SynTree/ZeroOneType.$(OBJEXT) \
     221        SynTree/Constant.$(OBJEXT) SynTree/Expression.$(OBJEXT) \
     222        SynTree/TupleExpr.$(OBJEXT) SynTree/CommaExpr.$(OBJEXT) \
     223        SynTree/TypeExpr.$(OBJEXT) SynTree/ApplicationExpr.$(OBJEXT) \
     224        SynTree/AddressExpr.$(OBJEXT) SynTree/Statement.$(OBJEXT) \
     225        SynTree/CompoundStmt.$(OBJEXT) SynTree/DeclStmt.$(OBJEXT) \
    221226        SynTree/Declaration.$(OBJEXT) \
    222227        SynTree/DeclarationWithType.$(OBJEXT) \
    223         SynTree/Expression.$(OBJEXT) SynTree/FunctionDecl.$(OBJEXT) \
    224         SynTree/FunctionType.$(OBJEXT) SynTree/Initializer.$(OBJEXT) \
    225         SynTree/LinkageSpec.$(OBJEXT) SynTree/NamedTypeDecl.$(OBJEXT) \
    226         SynTree/ObjectDecl.$(OBJEXT) SynTree/PointerType.$(OBJEXT) \
    227         SynTree/ReferenceToType.$(OBJEXT) \
    228         SynTree/ReferenceType.$(OBJEXT) SynTree/Statement.$(OBJEXT) \
    229         SynTree/TupleExpr.$(OBJEXT) SynTree/TupleType.$(OBJEXT) \
    230         SynTree/Type.$(OBJEXT) SynTree/TypeDecl.$(OBJEXT) \
    231         SynTree/TypeExpr.$(OBJEXT) SynTree/TypeSubstitution.$(OBJEXT) \
    232         SynTree/TypeofType.$(OBJEXT) SynTree/VarArgsType.$(OBJEXT) \
    233         SynTree/VoidType.$(OBJEXT) SynTree/ZeroOneType.$(OBJEXT)
     228        SynTree/ObjectDecl.$(OBJEXT) SynTree/FunctionDecl.$(OBJEXT) \
     229        SynTree/AggregateDecl.$(OBJEXT) \
     230        SynTree/NamedTypeDecl.$(OBJEXT) SynTree/TypeDecl.$(OBJEXT) \
     231        SynTree/Initializer.$(OBJEXT) \
     232        SynTree/TypeSubstitution.$(OBJEXT) SynTree/Attribute.$(OBJEXT) \
     233        SynTree/DeclReplacer.$(OBJEXT) SynTree/TopLvalue.$(OBJEXT)
    234234am__objects_8 = CompilationState.$(OBJEXT) $(am__objects_1) \
    235235        $(am__objects_2) Concurrency/Keywords.$(OBJEXT) \
    236236        $(am__objects_3) $(am__objects_4) GenPoly/GenPoly.$(OBJEXT) \
    237237        GenPoly/Lvalue.$(OBJEXT) InitTweak/GenInit.$(OBJEXT) \
    238         InitTweak/InitTweak.$(OBJEXT) $(am__objects_5) \
    239         $(am__objects_6) SymTab/Demangle.$(OBJEXT) $(am__objects_7) \
    240         Tuples/TupleAssignment.$(OBJEXT) \
     238        InitTweak/InitTweak.$(OBJEXT) Parser/LinkageSpec.$(OBJEXT) \
     239        $(am__objects_5) $(am__objects_6) SymTab/Demangle.$(OBJEXT) \
     240        $(am__objects_7) Tuples/TupleAssignment.$(OBJEXT) \
    241241        Tuples/TupleExpansion.$(OBJEXT) Tuples/Explode.$(OBJEXT) \
    242242        Tuples/Tuples.$(OBJEXT) Validate/HandleAttributes.$(OBJEXT) \
     
    261261        InitTweak/GenInit.$(OBJEXT) InitTweak/FixInit.$(OBJEXT) \
    262262        InitTweak/FixGlobalInit.$(OBJEXT) \
    263         InitTweak/InitTweak.$(OBJEXT) Parser/DeclarationNode.$(OBJEXT) \
    264         Parser/ExpressionNode.$(OBJEXT) \
    265         Parser/InitializerNode.$(OBJEXT) Parser/ParseNode.$(OBJEXT) \
    266         Parser/StatementNode.$(OBJEXT) Parser/TypeData.$(OBJEXT) \
    267         Parser/TypedefTable.$(OBJEXT) Parser/lex.$(OBJEXT) \
    268         Parser/parser.$(OBJEXT) Parser/parserutility.$(OBJEXT) \
     263        InitTweak/InitTweak.$(OBJEXT) Parser/parser.$(OBJEXT) \
     264        Parser/lex.$(OBJEXT) Parser/TypedefTable.$(OBJEXT) \
     265        Parser/ParseNode.$(OBJEXT) Parser/DeclarationNode.$(OBJEXT) \
     266        Parser/ExpressionNode.$(OBJEXT) Parser/StatementNode.$(OBJEXT) \
     267        Parser/InitializerNode.$(OBJEXT) Parser/TypeData.$(OBJEXT) \
     268        Parser/LinkageSpec.$(OBJEXT) Parser/parserutility.$(OBJEXT) \
    269269        $(am__objects_5) ResolvExpr/AlternativePrinter.$(OBJEXT) \
    270270        $(am__objects_6) $(am__objects_7) \
     
    411411CCDEPMODE = @CCDEPMODE@
    412412CFACC = @CFACC@
    413 CFACC_INSTALL = @CFACC_INSTALL@
    414413CFACPP = @CFACPP@
    415414CFA_BACKEND_CC = @CFA_BACKEND_CC@
     
    442441FGREP = @FGREP@
    443442GREP = @GREP@
    444 HAS_DISTCC = @HAS_DISTCC@
    445443HOST_FLAGS = @HOST_FLAGS@
    446444INSTALL = @INSTALL@
     
    559557        InitTweak/GenInit.cc InitTweak/FixInit.cc \
    560558        InitTweak/FixGlobalInit.cc InitTweak/InitTweak.cc \
    561         Parser/DeclarationNode.cc Parser/ExpressionNode.cc \
    562         Parser/InitializerNode.cc Parser/ParseNode.cc \
    563         Parser/StatementNode.cc Parser/TypeData.cc \
    564         Parser/TypedefTable.cc Parser/lex.ll Parser/parser.yy \
    565         Parser/parserutility.cc $(SRC_RESOLVEXPR) \
    566         ResolvExpr/AlternativePrinter.cc $(SRC_SYMTAB) $(SRC_SYNTREE) \
    567         Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc \
    568         Tuples/Explode.cc Tuples/Tuples.cc \
     559        Parser/parser.yy Parser/lex.ll Parser/TypedefTable.cc \
     560        Parser/ParseNode.cc Parser/DeclarationNode.cc \
     561        Parser/ExpressionNode.cc Parser/StatementNode.cc \
     562        Parser/InitializerNode.cc Parser/TypeData.cc \
     563        Parser/LinkageSpec.cc Parser/parserutility.cc \
     564        $(SRC_RESOLVEXPR) ResolvExpr/AlternativePrinter.cc \
     565        $(SRC_SYMTAB) $(SRC_SYNTREE) Tuples/TupleAssignment.cc \
     566        Tuples/TupleExpansion.cc Tuples/Explode.cc Tuples/Tuples.cc \
    569567        Validate/HandleAttributes.cc Validate/FindSpecialDecls.cc \
    570568        Virtual/ExpandCasts.cc
     
    572570        Concurrency/Keywords.cc $(SRC_COMMON) $(SRC_CONTROLSTRUCT) \
    573571        GenPoly/GenPoly.cc GenPoly/Lvalue.cc InitTweak/GenInit.cc \
    574         InitTweak/InitTweak.cc $(SRC_RESOLVEXPR) $(SRC_SYMTAB) \
    575         SymTab/Demangle.cc $(SRC_SYNTREE) Tuples/TupleAssignment.cc \
    576         Tuples/TupleExpansion.cc Tuples/Explode.cc Tuples/Tuples.cc \
     572        InitTweak/InitTweak.cc Parser/LinkageSpec.cc $(SRC_RESOLVEXPR) \
     573        $(SRC_SYMTAB) SymTab/Demangle.cc $(SRC_SYNTREE) \
     574        Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc \
     575        Tuples/Explode.cc Tuples/Tuples.cc \
    577576        Validate/HandleAttributes.cc Validate/FindSpecialDecls.cc
    578577MAINTAINERCLEANFILES = ${libdir}/${notdir ${cfa_cpplib_PROGRAMS}}
     
    662661
    663662SRC_SYNTREE = \
     663      SynTree/Type.cc \
     664      SynTree/VoidType.cc \
     665      SynTree/BasicType.cc \
     666      SynTree/PointerType.cc \
     667      SynTree/ArrayType.cc \
     668      SynTree/ReferenceType.cc \
     669      SynTree/FunctionType.cc \
     670      SynTree/ReferenceToType.cc \
     671      SynTree/TupleType.cc \
     672      SynTree/TypeofType.cc \
     673      SynTree/AttrType.cc \
     674      SynTree/VarArgsType.cc \
     675      SynTree/ZeroOneType.cc \
     676      SynTree/Constant.cc \
     677      SynTree/Expression.cc \
     678      SynTree/TupleExpr.cc \
     679      SynTree/CommaExpr.cc \
     680      SynTree/TypeExpr.cc \
     681      SynTree/ApplicationExpr.cc \
    664682      SynTree/AddressExpr.cc \
    665       SynTree/AggregateDecl.cc \
    666       SynTree/ApplicationExpr.cc \
    667       SynTree/ArrayType.cc \
    668       SynTree/AttrType.cc \
    669       SynTree/Attribute.cc \
    670       SynTree/BasicType.cc \
    671       SynTree/CommaExpr.cc \
     683      SynTree/Statement.cc \
    672684      SynTree/CompoundStmt.cc \
    673       SynTree/Constant.cc \
    674       SynTree/DeclReplacer.cc \
    675685      SynTree/DeclStmt.cc \
    676686      SynTree/Declaration.cc \
    677687      SynTree/DeclarationWithType.cc \
    678       SynTree/Expression.cc \
     688      SynTree/ObjectDecl.cc \
    679689      SynTree/FunctionDecl.cc \
    680       SynTree/FunctionType.cc \
     690      SynTree/AggregateDecl.cc \
     691      SynTree/NamedTypeDecl.cc \
     692      SynTree/TypeDecl.cc \
    681693      SynTree/Initializer.cc \
    682       SynTree/LinkageSpec.cc \
    683       SynTree/NamedTypeDecl.cc \
    684       SynTree/ObjectDecl.cc \
    685       SynTree/PointerType.cc \
    686       SynTree/ReferenceToType.cc \
    687       SynTree/ReferenceType.cc \
    688       SynTree/Statement.cc \
    689       SynTree/TupleExpr.cc \
    690       SynTree/TupleType.cc \
    691       SynTree/Type.cc \
    692       SynTree/TypeDecl.cc \
    693       SynTree/TypeExpr.cc \
    694694      SynTree/TypeSubstitution.cc \
    695       SynTree/TypeofType.cc \
    696       SynTree/VarArgsType.cc \
    697       SynTree/VoidType.cc \
    698       SynTree/ZeroOneType.cc
     695      SynTree/Attribute.cc \
     696      SynTree/DeclReplacer.cc \
     697      SynTree/TopLvalue.cc
    699698
    700699
     
    869868InitTweak/InitTweak.$(OBJEXT): InitTweak/$(am__dirstamp) \
    870869        InitTweak/$(DEPDIR)/$(am__dirstamp)
     870Parser/$(am__dirstamp):
     871        @$(MKDIR_P) Parser
     872        @: > Parser/$(am__dirstamp)
     873Parser/$(DEPDIR)/$(am__dirstamp):
     874        @$(MKDIR_P) Parser/$(DEPDIR)
     875        @: > Parser/$(DEPDIR)/$(am__dirstamp)
     876Parser/LinkageSpec.$(OBJEXT): Parser/$(am__dirstamp) \
     877        Parser/$(DEPDIR)/$(am__dirstamp)
    871878ResolvExpr/$(am__dirstamp):
    872879        @$(MKDIR_P) ResolvExpr
     
    949956        @$(MKDIR_P) SynTree/$(DEPDIR)
    950957        @: > SynTree/$(DEPDIR)/$(am__dirstamp)
     958SynTree/Type.$(OBJEXT): SynTree/$(am__dirstamp) \
     959        SynTree/$(DEPDIR)/$(am__dirstamp)
     960SynTree/VoidType.$(OBJEXT): SynTree/$(am__dirstamp) \
     961        SynTree/$(DEPDIR)/$(am__dirstamp)
     962SynTree/BasicType.$(OBJEXT): SynTree/$(am__dirstamp) \
     963        SynTree/$(DEPDIR)/$(am__dirstamp)
     964SynTree/PointerType.$(OBJEXT): SynTree/$(am__dirstamp) \
     965        SynTree/$(DEPDIR)/$(am__dirstamp)
     966SynTree/ArrayType.$(OBJEXT): SynTree/$(am__dirstamp) \
     967        SynTree/$(DEPDIR)/$(am__dirstamp)
     968SynTree/ReferenceType.$(OBJEXT): SynTree/$(am__dirstamp) \
     969        SynTree/$(DEPDIR)/$(am__dirstamp)
     970SynTree/FunctionType.$(OBJEXT): SynTree/$(am__dirstamp) \
     971        SynTree/$(DEPDIR)/$(am__dirstamp)
     972SynTree/ReferenceToType.$(OBJEXT): SynTree/$(am__dirstamp) \
     973        SynTree/$(DEPDIR)/$(am__dirstamp)
     974SynTree/TupleType.$(OBJEXT): SynTree/$(am__dirstamp) \
     975        SynTree/$(DEPDIR)/$(am__dirstamp)
     976SynTree/TypeofType.$(OBJEXT): SynTree/$(am__dirstamp) \
     977        SynTree/$(DEPDIR)/$(am__dirstamp)
     978SynTree/AttrType.$(OBJEXT): SynTree/$(am__dirstamp) \
     979        SynTree/$(DEPDIR)/$(am__dirstamp)
     980SynTree/VarArgsType.$(OBJEXT): SynTree/$(am__dirstamp) \
     981        SynTree/$(DEPDIR)/$(am__dirstamp)
     982SynTree/ZeroOneType.$(OBJEXT): SynTree/$(am__dirstamp) \
     983        SynTree/$(DEPDIR)/$(am__dirstamp)
     984SynTree/Constant.$(OBJEXT): SynTree/$(am__dirstamp) \
     985        SynTree/$(DEPDIR)/$(am__dirstamp)
     986SynTree/Expression.$(OBJEXT): SynTree/$(am__dirstamp) \
     987        SynTree/$(DEPDIR)/$(am__dirstamp)
     988SynTree/TupleExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
     989        SynTree/$(DEPDIR)/$(am__dirstamp)
     990SynTree/CommaExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
     991        SynTree/$(DEPDIR)/$(am__dirstamp)
     992SynTree/TypeExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
     993        SynTree/$(DEPDIR)/$(am__dirstamp)
     994SynTree/ApplicationExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
     995        SynTree/$(DEPDIR)/$(am__dirstamp)
    951996SynTree/AddressExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
    952997        SynTree/$(DEPDIR)/$(am__dirstamp)
     998SynTree/Statement.$(OBJEXT): SynTree/$(am__dirstamp) \
     999        SynTree/$(DEPDIR)/$(am__dirstamp)
     1000SynTree/CompoundStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
     1001        SynTree/$(DEPDIR)/$(am__dirstamp)
     1002SynTree/DeclStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
     1003        SynTree/$(DEPDIR)/$(am__dirstamp)
     1004SynTree/Declaration.$(OBJEXT): SynTree/$(am__dirstamp) \
     1005        SynTree/$(DEPDIR)/$(am__dirstamp)
     1006SynTree/DeclarationWithType.$(OBJEXT): SynTree/$(am__dirstamp) \
     1007        SynTree/$(DEPDIR)/$(am__dirstamp)
     1008SynTree/ObjectDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
     1009        SynTree/$(DEPDIR)/$(am__dirstamp)
     1010SynTree/FunctionDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
     1011        SynTree/$(DEPDIR)/$(am__dirstamp)
    9531012SynTree/AggregateDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
    9541013        SynTree/$(DEPDIR)/$(am__dirstamp)
    955 SynTree/ApplicationExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
    956         SynTree/$(DEPDIR)/$(am__dirstamp)
    957 SynTree/ArrayType.$(OBJEXT): SynTree/$(am__dirstamp) \
    958         SynTree/$(DEPDIR)/$(am__dirstamp)
    959 SynTree/AttrType.$(OBJEXT): SynTree/$(am__dirstamp) \
     1014SynTree/NamedTypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
     1015        SynTree/$(DEPDIR)/$(am__dirstamp)
     1016SynTree/TypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
     1017        SynTree/$(DEPDIR)/$(am__dirstamp)
     1018SynTree/Initializer.$(OBJEXT): SynTree/$(am__dirstamp) \
     1019        SynTree/$(DEPDIR)/$(am__dirstamp)
     1020SynTree/TypeSubstitution.$(OBJEXT): SynTree/$(am__dirstamp) \
    9601021        SynTree/$(DEPDIR)/$(am__dirstamp)
    9611022SynTree/Attribute.$(OBJEXT): SynTree/$(am__dirstamp) \
    9621023        SynTree/$(DEPDIR)/$(am__dirstamp)
    963 SynTree/BasicType.$(OBJEXT): SynTree/$(am__dirstamp) \
    964         SynTree/$(DEPDIR)/$(am__dirstamp)
    965 SynTree/CommaExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
    966         SynTree/$(DEPDIR)/$(am__dirstamp)
    967 SynTree/CompoundStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
    968         SynTree/$(DEPDIR)/$(am__dirstamp)
    969 SynTree/Constant.$(OBJEXT): SynTree/$(am__dirstamp) \
    970         SynTree/$(DEPDIR)/$(am__dirstamp)
    9711024SynTree/DeclReplacer.$(OBJEXT): SynTree/$(am__dirstamp) \
    9721025        SynTree/$(DEPDIR)/$(am__dirstamp)
    973 SynTree/DeclStmt.$(OBJEXT): SynTree/$(am__dirstamp) \
    974         SynTree/$(DEPDIR)/$(am__dirstamp)
    975 SynTree/Declaration.$(OBJEXT): SynTree/$(am__dirstamp) \
    976         SynTree/$(DEPDIR)/$(am__dirstamp)
    977 SynTree/DeclarationWithType.$(OBJEXT): SynTree/$(am__dirstamp) \
    978         SynTree/$(DEPDIR)/$(am__dirstamp)
    979 SynTree/Expression.$(OBJEXT): SynTree/$(am__dirstamp) \
    980         SynTree/$(DEPDIR)/$(am__dirstamp)
    981 SynTree/FunctionDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
    982         SynTree/$(DEPDIR)/$(am__dirstamp)
    983 SynTree/FunctionType.$(OBJEXT): SynTree/$(am__dirstamp) \
    984         SynTree/$(DEPDIR)/$(am__dirstamp)
    985 SynTree/Initializer.$(OBJEXT): SynTree/$(am__dirstamp) \
    986         SynTree/$(DEPDIR)/$(am__dirstamp)
    987 SynTree/LinkageSpec.$(OBJEXT): SynTree/$(am__dirstamp) \
    988         SynTree/$(DEPDIR)/$(am__dirstamp)
    989 SynTree/NamedTypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
    990         SynTree/$(DEPDIR)/$(am__dirstamp)
    991 SynTree/ObjectDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
    992         SynTree/$(DEPDIR)/$(am__dirstamp)
    993 SynTree/PointerType.$(OBJEXT): SynTree/$(am__dirstamp) \
    994         SynTree/$(DEPDIR)/$(am__dirstamp)
    995 SynTree/ReferenceToType.$(OBJEXT): SynTree/$(am__dirstamp) \
    996         SynTree/$(DEPDIR)/$(am__dirstamp)
    997 SynTree/ReferenceType.$(OBJEXT): SynTree/$(am__dirstamp) \
    998         SynTree/$(DEPDIR)/$(am__dirstamp)
    999 SynTree/Statement.$(OBJEXT): SynTree/$(am__dirstamp) \
    1000         SynTree/$(DEPDIR)/$(am__dirstamp)
    1001 SynTree/TupleExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
    1002         SynTree/$(DEPDIR)/$(am__dirstamp)
    1003 SynTree/TupleType.$(OBJEXT): SynTree/$(am__dirstamp) \
    1004         SynTree/$(DEPDIR)/$(am__dirstamp)
    1005 SynTree/Type.$(OBJEXT): SynTree/$(am__dirstamp) \
    1006         SynTree/$(DEPDIR)/$(am__dirstamp)
    1007 SynTree/TypeDecl.$(OBJEXT): SynTree/$(am__dirstamp) \
    1008         SynTree/$(DEPDIR)/$(am__dirstamp)
    1009 SynTree/TypeExpr.$(OBJEXT): SynTree/$(am__dirstamp) \
    1010         SynTree/$(DEPDIR)/$(am__dirstamp)
    1011 SynTree/TypeSubstitution.$(OBJEXT): SynTree/$(am__dirstamp) \
    1012         SynTree/$(DEPDIR)/$(am__dirstamp)
    1013 SynTree/TypeofType.$(OBJEXT): SynTree/$(am__dirstamp) \
    1014         SynTree/$(DEPDIR)/$(am__dirstamp)
    1015 SynTree/VarArgsType.$(OBJEXT): SynTree/$(am__dirstamp) \
    1016         SynTree/$(DEPDIR)/$(am__dirstamp)
    1017 SynTree/VoidType.$(OBJEXT): SynTree/$(am__dirstamp) \
    1018         SynTree/$(DEPDIR)/$(am__dirstamp)
    1019 SynTree/ZeroOneType.$(OBJEXT): SynTree/$(am__dirstamp) \
     1026SynTree/TopLvalue.$(OBJEXT): SynTree/$(am__dirstamp) \
    10201027        SynTree/$(DEPDIR)/$(am__dirstamp)
    10211028Tuples/$(am__dirstamp):
     
    11341141InitTweak/FixGlobalInit.$(OBJEXT): InitTweak/$(am__dirstamp) \
    11351142        InitTweak/$(DEPDIR)/$(am__dirstamp)
    1136 Parser/$(am__dirstamp):
    1137         @$(MKDIR_P) Parser
    1138         @: > Parser/$(am__dirstamp)
    1139 Parser/$(DEPDIR)/$(am__dirstamp):
    1140         @$(MKDIR_P) Parser/$(DEPDIR)
    1141         @: > Parser/$(DEPDIR)/$(am__dirstamp)
     1143Parser/parser.hh: Parser/parser.cc
     1144        @if test ! -f $@; then rm -f Parser/parser.cc; else :; fi
     1145        @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) Parser/parser.cc; else :; fi
     1146Parser/parser.$(OBJEXT): Parser/$(am__dirstamp) \
     1147        Parser/$(DEPDIR)/$(am__dirstamp)
     1148Parser/lex.$(OBJEXT): Parser/$(am__dirstamp) \
     1149        Parser/$(DEPDIR)/$(am__dirstamp)
     1150Parser/TypedefTable.$(OBJEXT): Parser/$(am__dirstamp) \
     1151        Parser/$(DEPDIR)/$(am__dirstamp)
     1152Parser/ParseNode.$(OBJEXT): Parser/$(am__dirstamp) \
     1153        Parser/$(DEPDIR)/$(am__dirstamp)
    11421154Parser/DeclarationNode.$(OBJEXT): Parser/$(am__dirstamp) \
    11431155        Parser/$(DEPDIR)/$(am__dirstamp)
    11441156Parser/ExpressionNode.$(OBJEXT): Parser/$(am__dirstamp) \
    11451157        Parser/$(DEPDIR)/$(am__dirstamp)
     1158Parser/StatementNode.$(OBJEXT): Parser/$(am__dirstamp) \
     1159        Parser/$(DEPDIR)/$(am__dirstamp)
    11461160Parser/InitializerNode.$(OBJEXT): Parser/$(am__dirstamp) \
    11471161        Parser/$(DEPDIR)/$(am__dirstamp)
    1148 Parser/ParseNode.$(OBJEXT): Parser/$(am__dirstamp) \
    1149         Parser/$(DEPDIR)/$(am__dirstamp)
    1150 Parser/StatementNode.$(OBJEXT): Parser/$(am__dirstamp) \
    1151         Parser/$(DEPDIR)/$(am__dirstamp)
    11521162Parser/TypeData.$(OBJEXT): Parser/$(am__dirstamp) \
    1153         Parser/$(DEPDIR)/$(am__dirstamp)
    1154 Parser/TypedefTable.$(OBJEXT): Parser/$(am__dirstamp) \
    1155         Parser/$(DEPDIR)/$(am__dirstamp)
    1156 Parser/lex.$(OBJEXT): Parser/$(am__dirstamp) \
    1157         Parser/$(DEPDIR)/$(am__dirstamp)
    1158 Parser/parser.hh: Parser/parser.cc
    1159         @if test ! -f $@; then rm -f Parser/parser.cc; else :; fi
    1160         @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) Parser/parser.cc; else :; fi
    1161 Parser/parser.$(OBJEXT): Parser/$(am__dirstamp) \
    11621163        Parser/$(DEPDIR)/$(am__dirstamp)
    11631164Parser/parserutility.$(OBJEXT): Parser/$(am__dirstamp) \
     
    12701271@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/ExpressionNode.Po@am__quote@
    12711272@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/InitializerNode.Po@am__quote@
     1273@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/LinkageSpec.Po@am__quote@
    12721274@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/ParseNode.Po@am__quote@
    12731275@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/StatementNode.Po@am__quote@
     
    13281330@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/FunctionType.Po@am__quote@
    13291331@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/Initializer.Po@am__quote@
    1330 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/LinkageSpec.Po@am__quote@
    13311332@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/NamedTypeDecl.Po@am__quote@
    13321333@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/ObjectDecl.Po@am__quote@
     
    13351336@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/ReferenceType.Po@am__quote@
    13361337@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/Statement.Po@am__quote@
     1338@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/TopLvalue.Po@am__quote@
    13371339@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/TupleExpr.Po@am__quote@
    13381340@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/TupleType.Po@am__quote@
  • src/Parser/DeclarationNode.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Sat May 16 12:34:05 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Dec 16 15:32:22 2019
    13 // Update Count     : 1133
     12// Last Modified On : Thu Jul 25 22:17:10 2019
     13// Update Count     : 1116
    1414//
    1515
     
    2424#include "Common/UniqueName.h"     // for UniqueName
    2525#include "Common/utility.h"        // for maybeClone, maybeBuild, CodeLocation
     26#include "Parser/LinkageSpec.h"    // for Spec, linkageName, Cforall
    2627#include "Parser/ParseNode.h"      // for DeclarationNode, ExpressionNode
    27 #include "SynTree/LinkageSpec.h"   // for Spec, linkageName, Cforall
    2828#include "SynTree/Attribute.h"     // for Attribute
    2929#include "SynTree/Declaration.h"   // for TypeDecl, ObjectDecl, Declaration
     
    4747const char * DeclarationNode::signednessNames[] = { "signed", "unsigned", "NoSignednessNames" };
    4848const char * DeclarationNode::lengthNames[] = { "short", "long", "long long", "NoLengthNames" };
     49const char * DeclarationNode::aggregateNames[] = { "struct", "union", "trait", "coroutine", "monitor", "thread", "NoAggregateNames" };
     50const char * DeclarationNode::typeClassNames[] = { "otype", "dtype", "ftype", "NoTypeClassNames" };
    4951const char * DeclarationNode::builtinTypeNames[] = { "__builtin_va_list", "__auto_type", "zero_t", "one_t", "NoBuiltinTypeNames" };
    5052
     
    5759
    5860//      variable.name = nullptr;
    59         variable.tyClass = TypeDecl::NUMBER_OF_KINDS;
     61        variable.tyClass = NoTypeClass;
    6062        variable.assertions = nullptr;
    6163        variable.initializer = nullptr;
     
    133135
    134136        if ( linkage != LinkageSpec::Cforall ) {
    135                 os << LinkageSpec::name( linkage ) << " ";
     137                os << LinkageSpec::linkageName( linkage ) << " ";
    136138        } // if
    137139
     
    265267}
    266268
    267 DeclarationNode * DeclarationNode::newAggregate( AggregateDecl::Aggregate kind, const string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body ) {
     269DeclarationNode * DeclarationNode::newAggregate( Aggregate kind, const string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body ) {
    268270        DeclarationNode * newnode = new DeclarationNode;
    269271        newnode->type = new TypeData( TypeData::Aggregate );
     
    311313} // DeclarationNode::newFromTypeGen
    312314
    313 DeclarationNode * DeclarationNode::newTypeParam( TypeDecl::Kind tc, const string * name ) {
     315DeclarationNode * DeclarationNode::newTypeParam( TypeClass tc, const string * name ) {
    314316        DeclarationNode * newnode = new DeclarationNode;
    315317        newnode->type = nullptr;
     
    326328        newnode->type = new TypeData( TypeData::Aggregate );
    327329        newnode->type->aggregate.name = name;
    328         newnode->type->aggregate.kind = AggregateDecl::Trait;
     330        newnode->type->aggregate.kind = Trait;
    329331        newnode->type->aggregate.params = params;
    330332        newnode->type->aggregate.fields = asserts;
     
    336338        newnode->type = new TypeData( TypeData::AggregateInst );
    337339        newnode->type->aggInst.aggregate = new TypeData( TypeData::Aggregate );
    338         newnode->type->aggInst.aggregate->aggregate.kind = AggregateDecl::Trait;
     340        newnode->type->aggInst.aggregate->aggregate.kind = Trait;
    339341        newnode->type->aggInst.aggregate->aggregate.name = name;
    340342        newnode->type->aggInst.params = params;
     
    669671
    670672DeclarationNode * DeclarationNode::addAssertions( DeclarationNode * assertions ) {
    671         if ( variable.tyClass != TypeDecl::NUMBER_OF_KINDS ) {
     673        if ( variable.tyClass != NoTypeClass ) {
    672674                if ( variable.assertions ) {
    673675                        variable.assertions->appendList( assertions );
     
    874876
    875877DeclarationNode * DeclarationNode::addTypeInitializer( DeclarationNode * init ) {
    876         assertf( variable.tyClass != TypeDecl::NUMBER_OF_KINDS, "Called addTypeInitializer on something that isn't a type variable." );
     878        assertf( variable.tyClass != NoTypeClass, "Called addTypeInitializer on something that isn't a type variable." );
    877879        variable.initializer = init;
    878880        return this;
     
    10731075        } // if
    10741076
    1075         if ( variable.tyClass != TypeDecl::NUMBER_OF_KINDS ) {
     1077        if ( variable.tyClass != NoTypeClass ) {
    10761078                // otype is internally converted to dtype + otype parameters
    10771079                static const TypeDecl::Kind kindMap[] = { TypeDecl::Dtype, TypeDecl::Dtype, TypeDecl::Ftype, TypeDecl::Ttype };
    1078                 static_assert( sizeof(kindMap)/sizeof(kindMap[0]) == TypeDecl::NUMBER_OF_KINDS, "DeclarationNode::build: kindMap is out of sync." );
     1080                assertf( sizeof(kindMap)/sizeof(kindMap[0]) == NoTypeClass, "DeclarationNode::build: kindMap is out of sync." );
    10791081                assertf( variable.tyClass < sizeof(kindMap)/sizeof(kindMap[0]), "Variable's tyClass is out of bounds." );
    1080                 TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ], variable.tyClass == TypeDecl::Otype, variable.initializer ? variable.initializer->buildType() : nullptr );
     1082                TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ], variable.tyClass == Otype, variable.initializer ? variable.initializer->buildType() : nullptr );
    10811083                buildList( variable.assertions, ret->get_assertions() );
    10821084                return ret;
  • src/Parser/ExpressionNode.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Sat May 16 13:17:07 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec 18 21:14:58 2019
    13 // Update Count     : 981
     12// Last Modified On : Sun Aug  4 20:57:55 2019
     13// Update Count     : 978
    1414//
    1515
     
    265265        static const BasicType::Kind kind[2][12] = {
    266266                { BasicType::Float, BasicType::Double, BasicType::LongDouble, BasicType::uuFloat80, BasicType::uuFloat128, BasicType::uFloat16, BasicType::uFloat32, BasicType::uFloat32x, BasicType::uFloat64, BasicType::uFloat64x, BasicType::uFloat128, BasicType::uFloat128x },
    267                 { BasicType::FloatComplex, BasicType::DoubleComplex, BasicType::LongDoubleComplex, BasicType::NUMBER_OF_BASIC_TYPES, BasicType::NUMBER_OF_BASIC_TYPES, BasicType::uFloat16Complex, BasicType::uFloat32Complex, BasicType::uFloat32xComplex, BasicType::uFloat64Complex, BasicType::uFloat64xComplex, BasicType::uFloat128Complex, BasicType::uFloat128xComplex },
     267                { BasicType::FloatComplex, BasicType::DoubleComplex, BasicType::LongDoubleComplex, (BasicType::Kind)-1, (BasicType::Kind)-1, BasicType::uFloat16Complex, BasicType::uFloat32Complex, BasicType::uFloat32xComplex, BasicType::uFloat64Complex, BasicType::uFloat64xComplex, BasicType::uFloat128Complex, BasicType::uFloat128xComplex },
    268268        };
    269269
     
    374374
    375375Expression * build_field_name_FLOATING_DECIMALconstant( const string & str ) {
    376         if ( str[str.size() - 1] != '.' ) SemanticError( yylloc, "invalid tuple index " + str );
     376        if ( str[str.size()-1] != '.' ) SemanticError( yylloc, "invalid tuple index " + str );
    377377        Expression * ret = build_constantInteger( *new string( str.substr( 0, str.size()-1 ) ) );
    378378        delete &str;
     
    434434} // build_cast
    435435
    436 Expression * build_keyword_cast( AggregateDecl::Aggregate target, ExpressionNode * expr_node ) {
     436Expression * build_keyword_cast( KeywordCastExpr::Target target, ExpressionNode * expr_node ) {
    437437        return new KeywordCastExpr( maybeMoveBuild< Expression >(expr_node), target );
    438438}
  • src/Parser/ParseNode.h

    r3d5701e r9fb8f01  
    1010// Created On       : Sat May 16 13:28:16 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Feb  7 17:56:02 2020
    13 // Update Count     : 891
     12// Last Modified On : Thu Jul 25 22:17:10 2019
     13// Update Count     : 876
    1414//
    1515
     
    2828#include "Common/UniqueName.h"     // for UniqueName
    2929#include "Common/utility.h"        // for maybeClone, maybeBuild
    30 #include "SynTree/LinkageSpec.h"   // for Spec
    31 #include "SynTree/Declaration.h"   // for Aggregate
     30#include "Parser/LinkageSpec.h"    // for Spec
    3231#include "SynTree/Expression.h"    // for Expression, ConstantExpr (ptr only)
    3332#include "SynTree/Label.h"         // for Label
     
    185184
    186185Expression * build_cast( DeclarationNode * decl_node, ExpressionNode * expr_node );
    187 Expression * build_keyword_cast( AggregateDecl::Aggregate target, ExpressionNode * expr_node );
     186Expression * build_keyword_cast( KeywordCastExpr::Target target, ExpressionNode * expr_node );
    188187Expression * build_virtual_cast( DeclarationNode * decl_node, ExpressionNode * expr_node );
    189188Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member );
     
    218217        enum Length { Short, Long, LongLong, NoLength };
    219218        static const char * lengthNames[];
     219        enum Aggregate { Struct, Union, Exception, Trait, Coroutine, Monitor, Thread, NoAggregate };
     220        static const char * aggregateNames[];
     221        enum TypeClass { Otype, Dtype, Ftype, Ttype, NoTypeClass };
     222        static const char * typeClassNames[];
    220223        enum BuiltinType { Valist, AutoType, Zero, One, NoBuiltinType };
    221224        static const char * builtinTypeNames[];
     
    234237        static DeclarationNode * newQualifiedType( DeclarationNode *, DeclarationNode * );
    235238        static DeclarationNode * newFunction( const std::string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body );
    236         static DeclarationNode * newAggregate( AggregateDecl::Aggregate kind, const std::string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body );
     239        static DeclarationNode * newAggregate( Aggregate kind, const std::string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body );
    237240        static DeclarationNode * newEnum( const std::string * name, DeclarationNode * constants, bool body );
    238241        static DeclarationNode * newEnumConstant( const std::string * name, ExpressionNode * constant );
    239242        static DeclarationNode * newName( const std::string * );
    240243        static DeclarationNode * newFromTypeGen( const std::string *, ExpressionNode * params );
    241         static DeclarationNode * newTypeParam( TypeDecl::Kind, const std::string * );
     244        static DeclarationNode * newTypeParam( TypeClass, const std::string * );
    242245        static DeclarationNode * newTrait( const std::string * name, DeclarationNode * params, DeclarationNode * asserts );
    243246        static DeclarationNode * newTraitUse( const std::string * name, ExpressionNode * params );
     
    309312        struct Variable_t {
    310313//              const std::string * name;
    311                 TypeDecl::Kind tyClass;
     314                DeclarationNode::TypeClass tyClass;
    312315                DeclarationNode * assertions;
    313316                DeclarationNode * initializer;
     
    449452                                * out++ = result;
    450453                        } else {
    451                                 SemanticError( cur->location, "type specifier declaration in forall clause is currently unimplemented." );
     454                                assertf(false, "buildList unknown type");
    452455                        } // if
    453456                } catch( SemanticErrorException & e ) {
  • src/Parser/ParserTypes.h

    r3d5701e r9fb8f01  
    1010// Created On       : Sat Sep 22 08:58:10 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Feb 15 11:04:40 2020
    13 // Update Count     : 351
     12// Last Modified On : Sat Jul 22 09:33:28 2017
     13// Update Count     : 350
    1414//
    1515
     
    2727// current location in the input
    2828extern int yylineno;
    29 extern char * yyfilename;
     29extern char *yyfilename;
    3030
    3131struct Location {
    32     char * file;
     32    char *file;
    3333    int line;
    3434}; // Location
    3535
    3636struct Token {
    37     std::string * str;                                                                  // must be pointer as used in union
     37    std::string *str;                                                                   // must be pointer as used in union
    3838    Location loc;
    3939
  • src/Parser/TypeData.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Sat May 16 15:12:51 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Dec 16 07:56:46 2019
    13 // Update Count     : 662
     12// Last Modified On : Wed Feb 13 18:16:23 2019
     13// Update Count     : 649
    1414//
    1515
     
    6767          case Aggregate:
    6868                // aggregate = new Aggregate_t;
    69                 aggregate.kind = AggregateDecl::NoAggregate;
     69                aggregate.kind = DeclarationNode::NoAggregate;
    7070                aggregate.name = nullptr;
    7171                aggregate.params = nullptr;
     
    345345                break;
    346346          case Aggregate:
    347                 os << AggregateDecl::aggrString( aggregate.kind ) << ' ' << *aggregate.name << endl;
     347                os << DeclarationNode::aggregateNames[ aggregate.kind ] << ' ' << *aggregate.name << endl;
    348348                if ( aggregate.params ) {
    349349                        os << string( indent + 2, ' ' ) << "with type parameters" << endl;
     
    489489        for ( typename ForallList::iterator i = outputList.begin(); i != outputList.end(); ++i, n = (DeclarationNode*)n->get_next() ) {
    490490                TypeDecl * td = static_cast<TypeDecl *>(*i);
    491                 if ( n->variable.tyClass == TypeDecl::Otype ) {
     491                if ( n->variable.tyClass == DeclarationNode::Otype ) {
    492492                        // add assertion parameters to `type' tyvars in reverse order
    493493                        // add dtor:  void ^?{}(T *)
     
    522522        switch ( td->kind ) {
    523523          case TypeData::Unknown:
    524                 // fill in implicit int
    525                 return new BasicType( buildQualifiers( td ), BasicType::SignedInt );
     524                        // fill in implicit int
     525                        return new BasicType( buildQualifiers( td ), BasicType::SignedInt );
    526526          case TypeData::Basic:
    527                 return buildBasicType( td );
     527                        return buildBasicType( td );
    528528          case TypeData::Pointer:
    529                 return buildPointer( td );
     529                        return buildPointer( td );
    530530          case TypeData::Array:
    531                 return buildArray( td );
     531                        return buildArray( td );
    532532          case TypeData::Reference:
    533                 return buildReference( td );
     533                        return buildReference( td );
    534534          case TypeData::Function:
    535                 return buildFunction( td );
     535                        return buildFunction( td );
    536536          case TypeData::AggregateInst:
    537                 return buildAggInst( td );
     537                        return buildAggInst( td );
    538538          case TypeData::EnumConstant:
    539                 // the name gets filled in later -- by SymTab::Validate
    540                 return new EnumInstType( buildQualifiers( td ), "" );
     539                        // the name gets filled in later -- by SymTab::Validate
     540                        return new EnumInstType( buildQualifiers( td ), "" );
    541541          case TypeData::SymbolicInst:
    542                 return buildSymbolicInst( td );
     542                        return buildSymbolicInst( td );
    543543          case TypeData::Tuple:
    544                 return buildTuple( td );
     544                        return buildTuple( td );
    545545          case TypeData::Typeof:
    546546          case TypeData::Basetypeof:
    547                 return buildTypeof( td );
     547                        return buildTypeof( td );
    548548          case TypeData::Builtin:
    549                 switch ( td->builtintype ) {
    550                   case DeclarationNode::Zero:
    551                         return new ZeroType( noQualifiers );
    552                   case DeclarationNode::One:
    553                         return new OneType( noQualifiers );
    554                   default:
    555                         return new VarArgsType( buildQualifiers( td ) );
    556                 } // switch
     549                        if (td->builtintype == DeclarationNode::Zero) {
     550                                return new ZeroType( noQualifiers );
     551                        }
     552                        else if (td->builtintype == DeclarationNode::One) {
     553                                return new OneType( noQualifiers );
     554                        }
     555                        else {
     556                                return new VarArgsType( buildQualifiers( td ) );
     557                        }
    557558          case TypeData::GlobalScope:
    558                 return new GlobalScopeType();
    559           case TypeData::Qualified:
    560                 return new QualifiedType( buildQualifiers( td ), typebuild( td->qualified.parent ), typebuild( td->qualified.child ) );
     559                        return new GlobalScopeType();
     560                case TypeData::Qualified:
     561                        return new QualifiedType( buildQualifiers( td ), typebuild( td->qualified.parent ), typebuild( td->qualified.child ) );
    561562          case TypeData::Symbolic:
    562563          case TypeData::Enum:
    563564          case TypeData::Aggregate:
    564                 assert( false );
     565                        assert( false );
    565566        } // switch
    566567
     
    767768        AggregateDecl * at;
    768769        switch ( td->aggregate.kind ) {
    769           case AggregateDecl::Struct:
    770           case AggregateDecl::Coroutine:
    771           case AggregateDecl::Monitor:
    772           case AggregateDecl::Thread:
     770          case DeclarationNode::Struct:
     771          case DeclarationNode::Coroutine:
     772          case DeclarationNode::Monitor:
     773          case DeclarationNode::Thread:
    773774                at = new StructDecl( *td->aggregate.name, td->aggregate.kind, attributes, linkage );
    774775                buildForall( td->aggregate.params, at->get_parameters() );
    775776                break;
    776           case AggregateDecl::Union:
     777          case DeclarationNode::Union:
    777778                at = new UnionDecl( *td->aggregate.name, attributes, linkage );
    778779                buildForall( td->aggregate.params, at->get_parameters() );
    779780                break;
    780           case AggregateDecl::Trait:
     781          case DeclarationNode::Trait:
    781782                at = new TraitDecl( *td->aggregate.name, attributes, linkage );
    782783                buildList( td->aggregate.params, at->get_parameters() );
     
    808809                          AggregateDecl * typedecl = buildAggregate( type, attributes, linkage );
    809810                          switch ( type->aggregate.kind ) {
    810                                 case AggregateDecl::Struct:
    811                                 case AggregateDecl::Coroutine:
    812                                 case AggregateDecl::Monitor:
    813                                 case AggregateDecl::Thread:
     811                                case DeclarationNode::Struct:
     812                                case DeclarationNode::Coroutine:
     813                                case DeclarationNode::Monitor:
     814                                case DeclarationNode::Thread:
    814815                                  ret = new StructInstType( buildQualifiers( type ), (StructDecl *)typedecl );
    815816                                  break;
    816                                 case AggregateDecl::Union:
     817                                case DeclarationNode::Union:
    817818                                  ret = new UnionInstType( buildQualifiers( type ), (UnionDecl *)typedecl );
    818819                                  break;
    819                                 case AggregateDecl::Trait:
     820                                case DeclarationNode::Trait:
    820821                                  assert( false );
    821822                                  //ret = new TraitInstType( buildQualifiers( type ), (TraitDecl *)typedecl );
     
    826827                  } else {
    827828                          switch ( type->aggregate.kind ) {
    828                                 case AggregateDecl::Struct:
    829                                 case AggregateDecl::Coroutine:
    830                                 case AggregateDecl::Monitor:
    831                                 case AggregateDecl::Thread:
     829                                case DeclarationNode::Struct:
     830                                case DeclarationNode::Coroutine:
     831                                case DeclarationNode::Monitor:
     832                                case DeclarationNode::Thread:
    832833                                  ret = new StructInstType( buildQualifiers( type ), *type->aggregate.name );
    833834                                  break;
    834                                 case AggregateDecl::Union:
     835                                case DeclarationNode::Union:
    835836                                  ret = new UnionInstType( buildQualifiers( type ), *type->aggregate.name );
    836837                                  break;
    837                                 case AggregateDecl::Trait:
     838                                case DeclarationNode::Trait:
    838839                                  ret = new TraitInstType( buildQualifiers( type ), *type->aggregate.name );
    839840                                  break;
     
    862863          case TypeData::Aggregate: {
    863864                  switch ( type->aggregate.kind ) {
    864                         case AggregateDecl::Struct:
    865                         case AggregateDecl::Coroutine:
    866                         case AggregateDecl::Monitor:
    867                         case AggregateDecl::Thread:
     865                        case DeclarationNode::Struct:
     866                        case DeclarationNode::Coroutine:
     867                        case DeclarationNode::Monitor:
     868                        case DeclarationNode::Thread:
    868869                          ret = new StructInstType( buildQualifiers( type ), *type->aggregate.name );
    869870                          break;
    870                         case AggregateDecl::Union:
     871                        case DeclarationNode::Union:
    871872                          ret = new UnionInstType( buildQualifiers( type ), *type->aggregate.name );
    872873                          break;
    873                         case AggregateDecl::Trait:
     874                        case DeclarationNode::Trait:
    874875                          ret = new TraitInstType( buildQualifiers( type ), *type->aggregate.name );
    875876                          break;
  • src/Parser/TypeData.h

    r3d5701e r9fb8f01  
    1010// Created On       : Sat May 16 15:18:36 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:42:35 2019
    13 // Update Count     : 199
     12// Last Modified On : Thu Nov  1 20:56:46 2018
     13// Update Count     : 196
    1414//
    1515
     
    2121
    2222#include "ParseNode.h"           // for DeclarationNode, DeclarationNode::Ag...
    23 #include "SynTree/LinkageSpec.h" // for Spec
     23#include "Parser/LinkageSpec.h" // for Spec
    2424#include "SynTree/Type.h"        // for Type, ReferenceToType (ptr only)
    2525#include "SynTree/SynTree.h"     // for Visitor Nodes
     
    3030
    3131        struct Aggregate_t {
    32                 AggregateDecl::Aggregate kind;
     32                DeclarationNode::Aggregate kind;
    3333                const std::string * name = nullptr;
    3434                DeclarationNode * params = nullptr;
  • src/Parser/TypedefTable.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Sat May 16 15:20:13 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Feb 15 08:06:36 2020
    13 // Update Count     : 259
     12// Last Modified On : Wed Jul 25 15:32:35 2018
     13// Update Count     : 258
    1414//
    1515
     
    4747} // TypedefTable::~TypedefTable
    4848
    49 bool TypedefTable::exists( const string & identifier ) const {
     49bool TypedefTable::exists( const string & identifier ) {
    5050        return kindTable.find( identifier ) != kindTable.end();
    5151} // TypedefTable::exists
    5252
    53 bool TypedefTable::existsCurr( const string & identifier ) const {
     53bool TypedefTable::existsCurr( const string & identifier ) {
    5454        return kindTable.findAt( kindTable.currentScope() - 1, identifier ) != kindTable.end();
    5555} // TypedefTable::exists
  • src/Parser/TypedefTable.h

    r3d5701e r9fb8f01  
    1010// Created On       : Sat May 16 15:24:36 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Feb 15 08:06:37 2020
    13 // Update Count     : 117
     12// Last Modified On : Wed Jul 25 15:33:55 2018
     13// Update Count     : 114
    1414//
    1515
     
    3030        ~TypedefTable();
    3131
    32         bool exists( const std::string & identifier ) const;
    33         bool existsCurr( const std::string & identifier ) const;
     32        bool exists( const std::string & identifier );
     33        bool existsCurr( const std::string & identifier );
    3434        int isKind( const std::string & identifier ) const;
    3535        void makeTypedef( const std::string & name, int kind = TYPEDEFname );
  • src/Parser/lex.ll

    r3d5701e r9fb8f01  
    1010 * Created On       : Sat Sep 22 08:58:10 2001
    1111 * Last Modified By : Peter A. Buhr
    12  * Last Modified On : Sat Feb 15 11:05:50 2020
    13  * Update Count     : 737
     12 * Last Modified On : Sun Aug  4 20:53:47 2019
     13 * Update Count     : 719
    1414 */
    1515
     
    4242#include "ParseNode.h"
    4343#include "TypedefTable.h"
    44 
    45 string * build_postfix_name( string * name );
    4644
    4745char *yyfilename;
     
    332330                                /* identifier */
    333331{identifier}    { IDENTIFIER_RETURN(); }
    334 "``"{identifier} {                                                                              // CFA
    335         yytext[yyleng] = '\0'; yytext += 2;                                     // SKULLDUGGERY: remove backquotes (ok to shorten?)
     332"`"{identifier}"`" {                                                                    // CFA
     333        yytext[yyleng - 1] = '\0'; yytext += 1;                         // SKULLDUGGERY: remove backquotes (ok to shorten?)
    336334        IDENTIFIER_RETURN();
    337335}
     
    434432"?"({op_unary_pre_post}|"()"|"[?]"|"{}") { IDENTIFIER_RETURN(); }
    435433"^?{}"                  { IDENTIFIER_RETURN(); }
    436 "?`"{identifier} {                                                                              // postfix operator
    437         yylval.tok.str = new string( &yytext[2] );                      // remove ?`
    438         yylval.tok.str = build_postfix_name( yylval.tok.str ); // add prefix
    439         RETURN_LOCN( typedefTable.isKind( *yylval.tok.str ) );
    440 }
     434"?`"{identifier} { IDENTIFIER_RETURN(); }                               // postfix operator
    441435"?"{op_binary_over}"?"  { IDENTIFIER_RETURN(); }                // binary
    442436        /*
  • src/Parser/module.mk

    r3d5701e r9fb8f01  
    1111## Created On       : Sat May 16 15:29:09 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Sat Dec 14 07:34:47 2019
    14 ## Update Count     : 107
     13## Last Modified On : Wed Jun 28 21:58:29 2017
     14## Update Count     : 104
    1515###############################################################################
    1616
     
    1919AM_YFLAGS = -d -t -v
    2020
    21 SRC += \
     21SRC += Parser/parser.yy \
     22       Parser/lex.ll \
     23       Parser/TypedefTable.cc \
     24       Parser/ParseNode.cc \
    2225       Parser/DeclarationNode.cc \
    2326       Parser/ExpressionNode.cc \
     27       Parser/StatementNode.cc \
    2428       Parser/InitializerNode.cc \
    25        Parser/ParseNode.cc \
    26        Parser/StatementNode.cc \
    2729       Parser/TypeData.cc \
    28        Parser/TypedefTable.cc \
    29        Parser/lex.ll \
    30        Parser/parser.yy \
     30       Parser/LinkageSpec.cc \
    3131       Parser/parserutility.cc
    3232
     33SRCDEMANGLE += \
     34        Parser/LinkageSpec.cc
     35
     36
    3337MOSTLYCLEANFILES += Parser/lex.cc Parser/parser.cc Parser/parser.hh Parser/parser.output
  • src/Parser/parser.yy

    r3d5701e r9fb8f01  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Feb 21 14:47:29 2020
    13 // Update Count     : 4468
     12// Last Modified On : Sun Aug  4 21:48:23 2019
     13// Update Count     : 4364
    1414//
    1515
     
    5151using namespace std;
    5252
    53 #include "SynTree/Declaration.h"
    5453#include "ParseNode.h"
    5554#include "TypedefTable.h"
    5655#include "TypeData.h"
    57 #include "SynTree/LinkageSpec.h"
     56#include "LinkageSpec.h"
    5857#include "Common/SemanticError.h"                                               // error_str
    5958#include "Common/utility.h"                                                             // for maybeMoveBuild, maybeBuild, CodeLo...
     
    166165} // rebindForall
    167166
    168 string * build_postfix_name( string * name ) {
    169         *name = string("__postfix_func_") + *name;
    170         return name;
     167NameExpr * build_postfix_name( const string * name ) {
     168        NameExpr * new_name = build_varref( new string( "?`" + *name ) );
     169        delete name;
     170        return new_name;
    171171} // build_postfix_name
    172172
     
    210210        } // if
    211211} // forCtrl
     212
    212213
    213214bool forall = false, yyy = false;                                               // aggregate have one or more forall qualifiers ?
     
    236237        ExpressionNode * en;
    237238        DeclarationNode * decl;
    238         AggregateDecl::Aggregate aggKey;
    239         TypeDecl::Kind tclass;
     239        DeclarationNode::Aggregate aggKey;
     240        DeclarationNode::TypeClass tclass;
    240241        StatementNode * sn;
    241242        WaitForStmt * wfs;
     
    322323%type<op> ptrref_operator                               unary_operator                          assignment_operator
    323324%type<en> primary_expression                    postfix_expression                      unary_expression
    324 %type<en> cast_expression_list                  cast_expression                         exponential_expression          multiplicative_expression       additive_expression
     325%type<en> cast_expression                               exponential_expression          multiplicative_expression       additive_expression
    325326%type<en> shift_expression                              relational_expression           equality_expression
    326327%type<en> AND_expression                                exclusive_OR_expression         inclusive_OR_expression
     
    364365%type<decl> abstract_parameter_declaration
    365366
    366 %type<aggKey> aggregate_key aggregate_data aggregate_control
     367%type<aggKey> aggregate_key
    367368%type<decl> aggregate_type aggregate_type_nobody
    368369
     
    578579        | '(' compound_statement ')'                                            // GCC, lambda expression
    579580                { $$ = new ExpressionNode( new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >($2) ) ) ); }
     581        | constant '`' IDENTIFIER                                                       // CFA, postfix call
     582                { $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $3 ) ), $1 ) ); }
     583        | string_literal '`' IDENTIFIER                                         // CFA, postfix call
     584                { $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $3 ) ), new ExpressionNode( $1 ) ) ); }
     585        | IDENTIFIER '`' IDENTIFIER                                                     // CFA, postfix call
     586                { $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $3 ) ), new ExpressionNode( build_varref( $1 ) ) ) ); }
     587        | tuple '`' IDENTIFIER                                                          // CFA, postfix call
     588                { $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $3 ) ), $1 ) ); }
     589        | '(' comma_expression ')' '`' IDENTIFIER                       // CFA, postfix call
     590                { $$ = new ExpressionNode( build_func( new ExpressionNode( build_postfix_name( $5 ) ), $2 ) ); }
    580591        | type_name '.' identifier                                                      // CFA, nested type
    581592                { SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; }
     
    631642        | postfix_expression '(' argument_expression_list ')'
    632643                { $$ = new ExpressionNode( build_func( $1, $3 ) ); }
    633         | postfix_expression '`' identifier                                     // CFA, postfix call
    634                 { $$ = new ExpressionNode( build_func( new ExpressionNode( build_varref( build_postfix_name( $3 ) ) ), $1 ) ); }
    635         | constant '`' identifier                                                       // CFA, postfix call
    636                 { $$ = new ExpressionNode( build_func( new ExpressionNode( build_varref( build_postfix_name( $3 ) ) ), $1 ) ); }
    637         | string_literal '`' identifier                                         // CFA, postfix call
    638                 { $$ = new ExpressionNode( build_func( new ExpressionNode( build_varref( build_postfix_name( $3 ) ) ), new ExpressionNode( $1 ) ) ); }
    639644        | postfix_expression '.' identifier
    640645                { $$ = new ExpressionNode( build_fieldSel( $1, build_varref( $3 ) ) ); }
     
    645650        | postfix_expression '.' '[' field_name_list ']'        // CFA, tuple field selector
    646651                { $$ = new ExpressionNode( build_fieldSel( $1, build_tuple( $4 ) ) ); }
    647         | postfix_expression '.' aggregate_control
    648                 { $$ = new ExpressionNode( build_keyword_cast( $3, $1 ) ); }
    649652        | postfix_expression ARROW identifier
    650653                { $$ = new ExpressionNode( build_pfieldSel( $1, build_varref( $3 ) ) ); }
     
    661664        | '(' type_no_function ')' '@' '{' initializer_list_opt comma_opt '}' // CFA, explicit C compound-literal
    662665                { $$ = new ExpressionNode( build_compoundLiteral( $2, (new InitializerNode( $6, true ))->set_maybeConstructed( false ) ) ); }
    663         | '^' primary_expression '{' argument_expression_list '}' // CFA, destructor call
     666        | '^' primary_expression '{' argument_expression_list '}' // CFA
    664667                {
    665668                        Token fn;
     
    674677        | argument_expression
    675678        | argument_expression_list ',' argument_expression
    676                 { $$ = (ExpressionNode *)($1->set_last( $3 )); }
     679                { $$ = (ExpressionNode *)( $1->set_last( $3 )); }
    677680        ;
    678681
     
    686689field_name_list:                                                                                // CFA, tuple field selector
    687690        field
    688         | field_name_list ',' field                                     { $$ = (ExpressionNode *)($1->set_last( $3 )); }
     691        | field_name_list ',' field                                     { $$ = (ExpressionNode *)$1->set_last( $3 ); }
    689692        ;
    690693
     
    790793        | '(' type_no_function ')' cast_expression
    791794                { $$ = new ExpressionNode( build_cast( $2, $4 ) ); }
    792         | '(' aggregate_control '&' ')' cast_expression         // CFA
    793                 { $$ = new ExpressionNode( build_keyword_cast( $2, $5 ) ); }
     795                // keyword cast cannot be grouped because of reduction in aggregate_key
     796        | '(' GENERATOR '&' ')' cast_expression                         // CFA
     797                { $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Coroutine, $5 ) ); }
     798        | '(' COROUTINE '&' ')' cast_expression                         // CFA
     799                { $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Coroutine, $5 ) ); }
     800        | '(' THREAD '&' ')' cast_expression                            // CFA
     801                { $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Thread, $5 ) ); }
     802        | '(' MONITOR '&' ')' cast_expression                           // CFA
     803                { $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Monitor, $5 ) ); }
    794804                // VIRTUAL cannot be opt because of look ahead issues
    795805        | '(' VIRTUAL ')' cast_expression                                       // CFA
     
    955965                { $$ = new ExpressionNode( build_tuple( (ExpressionNode *)(new ExpressionNode( nullptr ) )->set_last( $3 ) ) ); }
    956966        | '[' push assignment_expression pop ',' tuple_expression_list ']'
    957                 { $$ = new ExpressionNode( build_tuple( (ExpressionNode *)($3->set_last( $6 ) ) )); }
     967                { $$ = new ExpressionNode( build_tuple( (ExpressionNode *)$3->set_last( $6 ) ) ); }
    958968        ;
    959969
     
    961971        assignment_expression_opt
    962972        | tuple_expression_list ',' assignment_expression_opt
    963                 { $$ = (ExpressionNode *)($1->set_last( $3 )); }
     973                { $$ = (ExpressionNode *)$1->set_last( $3 ); }
    964974        ;
    965975
     
    11851195                { $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), new ExpressionNode( build_constantInteger( *new string( "0" ) ) ),
    11861196                                                OperKinds::LThan, $1->clone(), new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
    1187         | '=' comma_expression                                                                  // CFA
    1188                 { $$ = forCtrl( $2, new string( DeclarationNode::anonymous.newName() ), new ExpressionNode( build_constantInteger( *new string( "0" ) ) ),
    1189                                                 OperKinds::LEThan, $2->clone(), new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
    11901197        | comma_expression inclexcl comma_expression            // CFA
    11911198                { $$ = forCtrl( $1, new string( DeclarationNode::anonymous.newName() ), $1->clone(), $2, $3, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
     
    11951202                { $$ = forCtrl( $3, $1, new ExpressionNode( build_constantInteger( *new string( "0" ) ) ),
    11961203                                                OperKinds::LThan, $3->clone(), new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
    1197         | comma_expression ';' '=' comma_expression                             // CFA
    1198                 { $$ = forCtrl( $4, $1, new ExpressionNode( build_constantInteger( *new string( "0" ) ) ),
    1199                                                 OperKinds::LEThan, $4->clone(), new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
    12001204        | comma_expression ';' comma_expression inclexcl comma_expression // CFA
    12011205                { $$ = forCtrl( $3, $1, $3->clone(), $4, $5, new ExpressionNode( build_constantInteger( *new string( "1" ) ) ) ); }
     
    13021306        WAITFOR '(' cast_expression ')'
    13031307                { $$ = $3; }
    1304 //      | WAITFOR '(' cast_expression ',' argument_expression_list ')'
    1305 //              { $$ = (ExpressionNode *)$3->set_last( $5 ); }
    1306         | WAITFOR '(' cast_expression_list ':' argument_expression_list ')'
    1307                 { $$ = (ExpressionNode *)($3->set_last( $5 )); }
    1308         ;
    1309 
    1310 cast_expression_list:
    1311         cast_expression
    1312         | cast_expression_list ',' cast_expression
    1313                 { $$ = (ExpressionNode *)($1->set_last( $3 )); }
     1308        | WAITFOR '(' cast_expression ',' argument_expression_list ')'
     1309                { $$ = (ExpressionNode *)$3->set_last( $5 ); }
    13141310        ;
    13151311
     
    14221418        asm_operand
    14231419        | asm_operands_list ',' asm_operand
    1424                 { $$ = (ExpressionNode *)($1->set_last( $3 )); }
     1420                { $$ = (ExpressionNode *)$1->set_last( $3 ); }
    14251421        ;
    14261422
    14271423asm_operand:                                                                                    // GCC
    14281424        string_literal '(' constant_expression ')'
    1429                 { $$ = new ExpressionNode( new AsmExpr( nullptr, $1, maybeMoveBuild< Expression >( $3 ) ) ); }
    1430         | '[' IDENTIFIER ']' string_literal '(' constant_expression ')'
    1431                 { $$ = new ExpressionNode( new AsmExpr( $2, $4, maybeMoveBuild< Expression >( $6 ) ) ); }
     1425                { $$ = new ExpressionNode( new AsmExpr( maybeMoveBuild< Expression >( (ExpressionNode *)nullptr ), $1, maybeMoveBuild< Expression >( $3 ) ) ); }
     1426        | '[' constant_expression ']' string_literal '(' constant_expression ')'
     1427                { $$ = new ExpressionNode( new AsmExpr( maybeMoveBuild< Expression >( $2 ), $4, maybeMoveBuild< Expression >( $6 ) ) ); }
    14321428        ;
    14331429
     
    14381434                { $$ = new ExpressionNode( $1 ); }
    14391435        | asm_clobbers_list_opt ',' string_literal
    1440                 { $$ = (ExpressionNode *)($1->set_last( new ExpressionNode( $3 ) )); }
     1436                // set_last returns ParseNode *
     1437                { $$ = (ExpressionNode *)$1->set_last( new ExpressionNode( $3 ) ); }
    14411438        ;
    14421439
     
    15891586                // type_specifier can resolve to just TYPEDEFname (e.g., typedef int T; int f( T );). Therefore this must be
    15901587                // flattened to allow lookahead to the '(' without having to reduce identifier_or_type_name.
    1591         cfa_abstract_tuple identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')' attribute_list_opt
     1588        cfa_abstract_tuple identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')'
    15921589                // To obtain LR(1 ), this rule must be factored out from function return type (see cfa_abstract_declarator).
    1593                 { $$ = DeclarationNode::newFunction( $2, $1, $5, 0 )->addQualifiers( $8 ); }
    1594         | cfa_function_return identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')' attribute_list_opt
    1595                 { $$ = DeclarationNode::newFunction( $2, $1, $5, 0 )->addQualifiers( $8 ); }
     1590                { $$ = DeclarationNode::newFunction( $2, $1, $5, 0 ); }
     1591        | cfa_function_return identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')'
     1592                { $$ = DeclarationNode::newFunction( $2, $1, $5, 0 ); }
    15961593        ;
    15971594
     
    20622059
    20632060aggregate_key:
    2064         aggregate_data
    2065         | aggregate_control
    2066         ;
    2067 
    2068 aggregate_data:
    20692061        STRUCT
    2070                 { yyy = true; $$ = AggregateDecl::Struct; }
     2062                { yyy = true; $$ = DeclarationNode::Struct; }
    20712063        | UNION
    2072                 { yyy = true; $$ = AggregateDecl::Union; }
    2073         | EXCEPTION                                                                                     // CFA
    2074                 { yyy = true; $$ = AggregateDecl::Exception; }
    2075         ;
    2076 
    2077 aggregate_control:                                                                              // CFA
    2078         GENERATOR
    2079                 { yyy = true; $$ = AggregateDecl::Coroutine; }
     2064                { yyy = true; $$ = DeclarationNode::Union; }
     2065        | EXCEPTION
     2066                { yyy = true; $$ = DeclarationNode::Exception; }
     2067        | GENERATOR
     2068                { yyy = true; $$ = DeclarationNode::Coroutine; }
    20802069        | COROUTINE
    2081                 { yyy = true; $$ = AggregateDecl::Coroutine; }
     2070                { yyy = true; $$ = DeclarationNode::Coroutine; }
    20822071        | MONITOR
    2083                 { yyy = true; $$ = AggregateDecl::Monitor; }
     2072                { yyy = true; $$ = DeclarationNode::Monitor; }
    20842073        | THREAD
    2085                 { yyy = true; $$ = AggregateDecl::Thread; }
     2074                { yyy = true; $$ = DeclarationNode::Thread; }
    20862075        ;
    20872076
     
    21072096                        distInl( $3 );
    21082097                }
    2109         | INLINE aggregate_control ';'                                          // CFA
    2110                 { SemanticError( yylloc, "INLINE aggregate control currently unimplemented." ); $$ = nullptr; }
    21112098        | typedef_declaration ';'                                                       // CFA
    21122099        | cfa_field_declaring_list ';'                                          // CFA, new style field declaration
     
    23612348        | initializer_list_opt ',' initializer          { $$ = (InitializerNode *)( $1->set_last( $3 ) ); }
    23622349        | initializer_list_opt ',' designation initializer
    2363                 { $$ = (InitializerNode *)($1->set_last( $4->set_designators( $3 ) )); }
     2350                { $$ = (InitializerNode *)( $1->set_last( $4->set_designators( $3 ) ) ); }
    23642351        ;
    23652352
     
    23832370        designator
    23842371        | designator_list designator
    2385                 { $$ = (ExpressionNode *)($1->set_last( $2 )); }
     2372                { $$ = (ExpressionNode *)( $1->set_last( $2 ) ); }
    23862373        //| designator_list designator                                          { $$ = new ExpressionNode( $1, $2 ); }
    23872374        ;
     
    24392426        | type_specifier identifier_parameter_declarator
    24402427        | assertion_list
    2441                 { $$ = DeclarationNode::newTypeParam( TypeDecl::Dtype, new string( DeclarationNode::anonymous.newName() ) )->addAssertions( $1 ); }
     2428                { $$ = DeclarationNode::newTypeParam( DeclarationNode::Dtype, new string( DeclarationNode::anonymous.newName() ) )->addAssertions( $1 ); }
    24422429        ;
    24432430
    24442431type_class:                                                                                             // CFA
    24452432        OTYPE
    2446                 { $$ = TypeDecl::Otype; }
     2433                { $$ = DeclarationNode::Otype; }
    24472434        | DTYPE
    2448                 { $$ = TypeDecl::Dtype; }
     2435                { $$ = DeclarationNode::Dtype; }
    24492436        | FTYPE
    2450                 { $$ = TypeDecl::Ftype; }
     2437                { $$ = DeclarationNode::Ftype; }
    24512438        | TTYPE
    2452                 { $$ = TypeDecl::Ttype; }
     2439                { $$ = DeclarationNode::Ttype; }
    24532440        ;
    24542441
     
    24802467                { SemanticError( yylloc, toString("Expression generic parameters are currently unimplemented: ", $1->build()) ); $$ = nullptr; }
    24812468        | type_list ',' type
    2482                 { $$ = (ExpressionNode *)($1->set_last( new ExpressionNode( new TypeExpr( maybeMoveBuildType( $3 ) ) ) )); }
     2469                { $$ = (ExpressionNode *)( $1->set_last( new ExpressionNode( new TypeExpr( maybeMoveBuildType( $3 ) ) ) ) ); }
    24832470        | type_list ',' assignment_expression
    24842471                { SemanticError( yylloc, toString("Expression generic parameters are currently unimplemented: ", $3->build()) ); $$ = nullptr; }
     
    25912578                {
    25922579                        linkageStack.push( linkage );                           // handle nested extern "C"/"Cforall"
    2593                         linkage = LinkageSpec::update( yylloc, linkage, $2 );
     2580                        linkage = LinkageSpec::linkageUpdate( yylloc, linkage, $2 );
    25942581                }
    25952582          '{' up external_definition_list_opt down '}'
  • src/ResolvExpr/AdjustExprType.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Sat May 16 23:41:42 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec 11 21:43:56 2019
    13 // Update Count     : 6
     12// Last Modified On : Wed Mar  2 17:34:53 2016
     13// Update Count     : 4
    1414//
    1515
     
    133133                        // replace known function-type-variables with pointer-to-function
    134134                        if ( const ast::EqvClass * eqvClass = tenv.lookup( inst->name ) ) {
    135                                 if ( eqvClass->data.kind == ast::TypeDecl::Ftype ) {
     135                                if ( eqvClass->data.kind == ast::TypeVar::Ftype ) {
    136136                                        return new ast::PointerType{ inst };
    137137                                }
    138138                        } else if ( const ast::NamedTypeDecl * ntDecl = symtab.lookupType( inst->name ) ) {
    139139                                if ( auto tyDecl = dynamic_cast< const ast::TypeDecl * >( ntDecl ) ) {
    140                                         if ( tyDecl->kind == ast::TypeDecl::Ftype ) {
     140                                        if ( tyDecl->kind == ast::TypeVar::Ftype ) {
    141141                                                return new ast::PointerType{ inst };
    142142                                        }
  • src/ResolvExpr/AlternativeFinder.cc

    r3d5701e r9fb8f01  
    6969                void postvisit( CastExpr * castExpr );
    7070                void postvisit( VirtualCastExpr * castExpr );
    71                 void postvisit( KeywordCastExpr * castExpr );
    7271                void postvisit( UntypedMemberExpr * memberExpr );
    7372                void postvisit( MemberExpr * memberExpr );
     
    12561255        }
    12571256
    1258         void AlternativeFinder::Finder::postvisit( KeywordCastExpr * castExpr ) {
    1259                 assertf( castExpr->get_result(), "Cast target should have been set in Validate." );
    1260                 auto ref = dynamic_cast<ReferenceType*>(castExpr->get_result());
    1261                 assert(ref);
    1262                 auto inst = dynamic_cast<StructInstType*>(ref->base);
    1263                 assert(inst);
    1264                 auto target = inst->baseStruct;
    1265 
    1266                 AlternativeFinder finder( indexer, env );
    1267 
    1268                 auto pick_alternatives = [target, this](AltList & found, bool expect_ref) {
    1269                         for(auto & alt : found) {
    1270                                 Type * expr = alt.expr->get_result();
    1271                                 if(expect_ref) {
    1272                                         auto res = dynamic_cast<ReferenceType*>(expr);
    1273                                         if(!res) { continue; }
    1274                                         expr = res->base;
    1275                                 }
    1276 
    1277                                 if(auto insttype = dynamic_cast<TypeInstType*>(expr)) {
    1278                                         auto td = alt.env.lookup(insttype->name);
    1279                                         if(!td) { continue; }
    1280                                         expr = td->type;
    1281                                 }
    1282 
    1283                                 if(auto base = dynamic_cast<StructInstType*>(expr)) {
    1284                                         if(base->baseStruct == target) {
    1285                                                 alternatives.push_back(
    1286                                                         std::move(alt)
    1287                                                 );
    1288                                         }
    1289                                 }
    1290                         }
    1291                 };
    1292 
    1293                 try {
    1294                         // Attempt 1 : turn (thread&)X into ($thread&)X.__thrd
    1295                         // Clone is purely for memory management
    1296                         std::unique_ptr<Expression> tech1 { new UntypedMemberExpr(new NameExpr(castExpr->concrete_target.field), castExpr->arg->clone()) };
    1297 
    1298                         // don't prune here, since it's guaranteed all alternatives will have the same type
    1299                         finder.findWithoutPrune( tech1.get() );
    1300                         pick_alternatives(finder.alternatives, false);
    1301 
    1302                         return;
    1303                 } catch(SemanticErrorException & ) {}
    1304 
    1305                 // Fallback : turn (thread&)X into ($thread&)get_thread(X)
    1306                 std::unique_ptr<Expression> fallback { UntypedExpr::createDeref( new UntypedExpr(new NameExpr(castExpr->concrete_target.getter), { castExpr->arg->clone() })) };
    1307                 // don't prune here, since it's guaranteed all alternatives will have the same type
    1308                 finder.findWithoutPrune( fallback.get() );
    1309 
    1310                 pick_alternatives(finder.alternatives, true);
    1311 
    1312                 // Whatever happens here, we have no more fallbacks
    1313         }
    1314 
    13151257        namespace {
    13161258                /// Gets name from untyped member expression (member must be NameExpr)
  • src/ResolvExpr/ConversionCost.cc

    r3d5701e r9fb8f01  
    157157                        if ( typesCompatibleIgnoreQualifiers( src, destAsRef->base, indexer, env ) ) {
    158158                                PRINT( std::cerr << "converting compatible base type" << std::endl; )
     159                                assert( src->get_lvalue() == srcIsLvalue );
    159160                                if ( srcIsLvalue ) {
    160161                                        PRINT(
  • src/ResolvExpr/PtrsCastable.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Sun May 17 11:48:00 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec 11 21:48:33 2019
    13 // Update Count     : 9
     12// Last Modified On : Wed Mar  2 17:36:18 2016
     13// Update Count     : 8
    1414//
    1515
     
    176176                        if ( const ast::NamedTypeDecl * named = symtab.lookupType( inst->name ) ) {
    177177                                if ( auto tyDecl = dynamic_cast< const ast::TypeDecl * >( named ) ) {
    178                                         if ( tyDecl->kind == ast::TypeDecl::Ftype ) {
     178                                        if ( tyDecl->kind == ast::TypeVar::Ftype ) {
    179179                                                return -1;
    180180                                        }
    181181                                }
    182182                        } else if ( const ast::EqvClass * eqvClass = env.lookup( inst->name ) ) {
    183                                 if ( eqvClass->data.kind == ast::TypeDecl::Ftype ) {
     183                                if ( eqvClass->data.kind == ast::TypeVar::Ftype ) {
    184184                                        return -1;
    185185                                }
  • src/ResolvExpr/ResolveAssertions.cc

    r3d5701e r9fb8f01  
    156156                        for ( const auto& assn : x.assns ) {
    157157                                // compute conversion cost from satisfying decl to assertion
     158                                assert( !assn.match.adjType->get_lvalue() );
    158159                                k += computeConversionCost(
    159160                                        assn.match.adjType, assn.decl->get_type(), false, indexer, x.env );
  • src/ResolvExpr/Resolver.cc

    r3d5701e r9fb8f01  
    8484                void previsit( ThrowStmt * throwStmt );
    8585                void previsit( CatchStmt * catchStmt );
    86                 void postvisit( CatchStmt * catchStmt );
    8786                void previsit( WaitForStmt * stmt );
    8887
     
    486485                visit_children = false;
    487486                findVoidExpression( asmExpr->operand, indexer );
     487                if ( asmExpr->get_inout() ) {
     488                        findVoidExpression( asmExpr->inout, indexer );
     489                } // if
    488490        }
    489491
     
    568570
    569571        void Resolver_old::previsit( CatchStmt * catchStmt ) {
    570                 // Until we are very sure this invarent (ifs that move between passes have thenPart)
    571                 // holds, check it. This allows a check for when to decode the mangling.
    572                 if ( IfStmt * ifStmt = dynamic_cast<IfStmt *>( catchStmt->body ) ) {
    573                         assert( ifStmt->thenPart );
    574                 }
    575                 // Encode the catchStmt so the condition can see the declaration.
    576572                if ( catchStmt->cond ) {
    577                         IfStmt * ifStmt = new IfStmt( catchStmt->cond, nullptr, catchStmt->body );
    578                         catchStmt->cond = nullptr;
    579                         catchStmt->body = ifStmt;
    580                 }
    581         }
    582 
    583         void Resolver_old::postvisit( CatchStmt * catchStmt ) {
    584                 // Decode the catchStmt so everything is stored properly.
    585                 IfStmt * ifStmt = dynamic_cast<IfStmt *>( catchStmt->body );
    586                 if ( nullptr != ifStmt && nullptr == ifStmt->thenPart ) {
    587                         assert( ifStmt->condition );
    588                         assert( ifStmt->elsePart );
    589                         catchStmt->cond = ifStmt->condition;
    590                         catchStmt->body = ifStmt->elsePart;
    591                         ifStmt->condition = nullptr;
    592                         ifStmt->elsePart = nullptr;
    593                         delete ifStmt;
     573                        findSingleExpression( catchStmt->cond, new BasicType( noQualifiers, BasicType::Bool ), indexer );
    594574                }
    595575        }
     
    13861366                        asmExpr, &ast::AsmExpr::operand, findVoidExpression( asmExpr->operand, symtab ) );
    13871367
     1368                if ( asmExpr->inout ) {
     1369                        asmExpr = ast::mutate_field(
     1370                                asmExpr, &ast::AsmExpr::inout, findVoidExpression( asmExpr->inout, symtab ) );
     1371                }
     1372
    13881373                return asmExpr;
    13891374        }
     
    14891474
    14901475        const ast::CatchStmt * Resolver_new::previsit( const ast::CatchStmt * catchStmt ) {
    1491                 // TODO: This will need a fix for the decl/cond scoping problem.
    14921476                if ( catchStmt->cond ) {
    14931477                        ast::ptr< ast::Type > boolType = new ast::BasicType{ ast::BasicType::Bool };
  • src/ResolvExpr/Unify.cc

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 12:27:10 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:43:05 2019
    13 // Update Count     : 46
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Mon Jun 18 11:58:00 2018
     13// Update Count     : 43
    1414//
    1515
     
    3232#include "Common/PassVisitor.h"     // for PassVisitor
    3333#include "FindOpenVars.h"           // for findOpenVars
    34 #include "SynTree/LinkageSpec.h"    // for C
     34#include "Parser/LinkageSpec.h"     // for C
    3535#include "SynTree/Constant.h"       // for Constant
    3636#include "SynTree/Declaration.h"    // for TypeDecl, TypeDecl::Data, Declarati...
     
    278278#endif
    279279                        if ( ( common = commonType( type1, type2, widen.first, widen.second, indexer, env, openVars ) ) ) {
    280                                 common->tq = tq1.unify( tq2 );
     280                                common->get_qualifiers() = tq1 | tq2;
    281281#ifdef DEBUG
    282282                                std::cerr << "unifyInexact: common type is ";
     
    295295                                if ( ( tq1 > tq2 || widen.first ) && ( tq2 > tq1 || widen.second ) ) {
    296296                                        common = type1->clone();
    297                                         common->tq = tq1.unify( tq2 );
     297                                        common->get_qualifiers() = tq1 | tq2;
    298298                                        result = true;
    299299                                } else {
     
    302302                        } else {
    303303                                common = type1->clone();
    304                                 common->tq = tq1.unify( tq2 );
     304                                common->get_qualifiers() = tq1 | tq2;
    305305                                result = true;
    306306                        } // if
     
    781781                                if ( const ast::EqvClass * clz = tenv.lookup( typeInst->name ) ) {
    782782                                        // expand ttype parameter into its actual type
    783                                         if ( clz->data.kind == ast::TypeDecl::Ttype && clz->bound ) {
     783                                        if ( clz->data.kind == ast::TypeVar::Ttype && clz->bound ) {
    784784                                                return clz->bound;
    785785                                        }
  • src/SymTab/Autogen.h

    r3d5701e r9fb8f01  
    1010// Created On       : Sun May 17 21:53:34 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 16:38:06 2019
    13 // Update Count     : 16
     12// Last Modified On : Sat Jul 22 09:50:25 2017
     13// Update Count     : 15
    1414//
    1515
     
    3434#include "SynTree/Expression.h"   // for NameExpr, ConstantExpr, UntypedExpr...
    3535#include "SynTree/Type.h"         // for Type, ArrayType, Type::Qualifiers
    36 #include "SynTree/Statement.h"    // for CompoundStmt, DeclStmt, ExprStmt
    3736
    3837class CompoundStmt;
     
    9897                        //   type->get_qualifiers() = Type::Qualifiers();
    9998                        Type * castType = addCast->clone();
    100                         castType->get_qualifiers() -= Type::Qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Atomic );
     99                        castType->get_qualifiers() -= Type::Qualifiers( Type::Lvalue | Type::Const | Type::Volatile | Type::Restrict | Type::Atomic );
    101100                        // castType->set_lvalue( true ); // xxx - might not need this
    102101                        dstParam = new CastExpr( dstParam, new ReferenceType( Type::Qualifiers(), castType ) );
  • src/SymTab/Demangle.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Thu Jul 19 12:52:41 2018
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb 11 15:09:18 2020
    13 // Update Count     : 10
     12// Last Modified On : Tue Jul 30 13:46:33 2019
     13// Update Count     : 3
    1414//
    1515
     
    1919#include "CodeGen/GenType.h"
    2020#include "Common/PassVisitor.h"
    21 #include "Common/utility.h"                                                             // isPrefix
    2221#include "Mangler.h"
    2322#include "SynTree/Type.h"
     
    367366                                // type variable types
    368367                                for (size_t k = 0; k < TypeDecl::NUMBER_OF_KINDS; ++k) {
    369                                         static const std::string typeVariableNames[] = { "DT", "OT", "FT", "TT", };
     368                                        static const std::string typeVariableNames[] = { "DT", "FT", "TT", };
    370369                                        static_assert(
    371370                                                sizeof(typeVariableNames)/sizeof(typeVariableNames[0]) == TypeDecl::NUMBER_OF_KINDS,
     
    417416
    418417                        bool StringView::isPrefix(const std::string & pref) {
    419                                 // if ( pref.size() > str.size()-idx ) return false;
    420                                 // auto its = std::mismatch( pref.begin(), pref.end(), std::next(str.begin(), idx) );
    421                                 // if (its.first == pref.end()) {
    422                                 //      idx += pref.size();
    423                                 //      return true;
    424                                 // }
    425 
    426                                 // This update is untested because there are no tests for this code.
    427                                 if ( ::isPrefix( str, pref, idx ) ) {
     418                                if ( pref.size() > str.size()-idx ) return false;
     419                                auto its = std::mismatch( pref.begin(), pref.end(), std::next(str.begin(), idx) );
     420                                if (its.first == pref.end()) {
    428421                                        idx += pref.size();
    429422                                        return true;
     
    436429                                PRINT( std::cerr << "====== " << str.size() << " " << str << std::endl; )
    437430                                if (str.size() < 2+Encoding::manglePrefix.size()) return false; // +2 for at least _1 suffix
    438                                 if ( ! isPrefix(Encoding::manglePrefix) || ! isdigit(str.back() ) ) return false;
     431                                if (! isPrefix(Encoding::manglePrefix) || ! isdigit(str.back())) return false;
    439432
    440433                                // get name
  • src/SymTab/Indexer.cc

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 21:37:33 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:43:19 2019
    13 // Update Count     : 22
     11// Last Modified By : Aaron B. Moss
     12// Last Modified On : Fri Mar  8 13:55:00 2019
     13// Update Count     : 21
    1414//
    1515
     
    3131#include "InitTweak/InitTweak.h"   // for isConstructor, isCopyFunction, isC...
    3232#include "Mangler.h"               // for Mangler
     33#include "Parser/LinkageSpec.h"    // for isMangled, isOverridable, Spec
    3334#include "ResolvExpr/typeops.h"    // for typesCompatible
    34 #include "SynTree/LinkageSpec.h"   // for isMangled, isOverridable, Spec
    3535#include "SynTree/Constant.h"      // for Constant
    3636#include "SynTree/Declaration.h"   // for DeclarationWithType, FunctionDecl
  • src/SymTab/Mangler.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Sun May 17 21:40:29 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Feb 15 13:55:12 2020
    13 // Update Count     : 33
     12// Last Modified On : Tue Jul 30 13:46:10 2019
     13// Update Count     : 26
    1414//
    1515#include "Mangler.h"
     
    2626#include "Common/SemanticError.h"        // for SemanticError
    2727#include "Common/utility.h"              // for toString
     28#include "Parser/LinkageSpec.h"          // for Spec, isOverridable, AutoGen, Int...
    2829#include "ResolvExpr/TypeEnvironment.h"  // for TypeEnvironment
    29 #include "SynTree/LinkageSpec.h"         // for Spec, isOverridable, AutoGen, Int...
    3030#include "SynTree/Declaration.h"         // for TypeDecl, DeclarationWithType
    3131#include "SynTree/Expression.h"          // for TypeExpr, Expression, operator<<
     
    128128                                } // if
    129129                                mangleName << Encoding::manglePrefix;
    130                                 const CodeGen::OperatorInfo * opInfo = CodeGen::operatorLookup( declaration->get_name() );
    131                                 if ( opInfo ) {
    132                                         mangleName << opInfo->outputName.size() << opInfo->outputName;
     130                                CodeGen::OperatorInfo opInfo;
     131                                if ( operatorLookup( declaration->get_name(), opInfo ) ) {
     132                                        mangleName << opInfo.outputName.size() << opInfo.outputName;
    133133                                } else {
    134134                                        mangleName << declaration->name.size() << declaration->name;
     
    471471                        } // if
    472472                        mangleName << Encoding::manglePrefix;
    473                         const CodeGen::OperatorInfo * opInfo = CodeGen::operatorLookup( decl->name );
    474                         if ( opInfo ) {
    475                                 mangleName << opInfo->outputName.size() << opInfo->outputName;
     473                        CodeGen::OperatorInfo opInfo;
     474                        if ( operatorLookup( decl->name, opInfo ) ) {
     475                                mangleName << opInfo.outputName.size() << opInfo.outputName;
    476476                        } else {
    477477                                mangleName << decl->name.size() << decl->name;
     
    654654                        // aside from the assert false.
    655655                        assertf(false, "Mangler_new should not visit typedecl: %s", toCString(decl));
    656                         assertf( decl->kind < ast::TypeDecl::Kind::NUMBER_OF_KINDS, "Unhandled type variable kind: %d", decl->kind );
     656                        assertf( decl->kind < ast::TypeVar::Kind::NUMBER_OF_KINDS, "Unhandled type variable kind: %d", decl->kind );
    657657                        mangleName << Encoding::typeVariables[ decl->kind ] << ( decl->name.length() ) << decl->name;
    658658                }
     
    674674                                        for ( const ast::TypeDecl * decl : ptype->forall ) {
    675675                                                switch ( decl->kind ) {
    676                                                 case ast::TypeDecl::Kind::Dtype:
     676                                                case ast::TypeVar::Kind::Dtype:
    677677                                                        dcount++;
    678678                                                        break;
    679                                                 case ast::TypeDecl::Kind::Ftype:
     679                                                case ast::TypeVar::Kind::Ftype:
    680680                                                        fcount++;
    681681                                                        break;
    682                                                 case ast::TypeDecl::Kind::Ttype:
     682                                                case ast::TypeVar::Kind::Ttype:
    683683                                                        vcount++;
    684684                                                        break;
  • src/SymTab/ManglerCommon.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Sun May 17 21:44:03 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 14:54:38 2019
    13 // Update Count     : 28
     12// Last Modified On : Thu Feb 14 17:06:37 2019
     13// Update Count     : 26
    1414//
    1515
     
    8888                                { Type::Atomic, "DA" }, // A is array, so need something unique for atmoic. For now, go with multiletter DA
    8989                                { Type::Mutex, "X" },
     90                                { Type::Lvalue, "L" },
    9091                        };
    9192
     
    104105                        const std::string typeVariables[] = {
    105106                                "BD", // dtype
    106                                 "BO", // otype
    107107                                "BF", // ftype
    108108                                "BT", // ttype
  • src/SymTab/Validate.cc

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 21:50:04 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:43:34 2019
    13 // Update Count     : 363
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Aug  7 6:42:00 2019
     13// Update Count     : 360
    1414//
    1515
     
    6969#include "InitTweak/GenInit.h"         // for fixReturnStatements
    7070#include "InitTweak/InitTweak.h"       // for isCtorDtorAssign
     71#include "Parser/LinkageSpec.h"        // for C
    7172#include "ResolvExpr/typeops.h"        // for typesCompatible
    7273#include "ResolvExpr/Resolver.h"       // for findSingleExpression
    7374#include "ResolvExpr/ResolveTypeof.h"  // for resolveTypeof
    7475#include "SymTab/Autogen.h"            // for SizeType
    75 #include "SynTree/LinkageSpec.h"       // for C
    7676#include "SynTree/Attribute.h"         // for noAttributes, Attribute
    7777#include "SynTree/Constant.h"          // for Constant
     
    8181#include "SynTree/Label.h"             // for operator==, Label
    8282#include "SynTree/Mutator.h"           // for Mutator
     83#include "SynTree/TopLvalue.h"         // for assertTopLvalue, clearInnerLvalue
    8384#include "SynTree/Type.h"              // for Type, TypeInstType, EnumInstType
    8485#include "SynTree/TypeSubstitution.h"  // for TypeSubstitution
     
    308309                PassVisitor<FixQualifiedTypes> fixQual;
    309310
     311                assertTopLvalue( translationUnit );
    310312                {
    311313                        Stats::Heap::newPass("validate-A");
    312314                        Stats::Time::BlockGuard guard("validate-A");
    313                         VerifyCtorDtorAssign::verify( translationUnit );  // must happen before autogen, because autogen examines existing ctor/dtors
    314315                        acceptAll( translationUnit, hoistDecls );
    315316                        ReplaceTypedef::replaceTypedef( translationUnit );
     
    317318                        acceptAll( translationUnit, epc ); // must happen before VerifyCtorDtorAssign, because void return objects should not exist; before LinkReferenceToTypes_old because it is an indexer and needs correct types for mangling
    318319                }
     320                assertTopLvalue( translationUnit );
    319321                {
    320322                        Stats::Heap::newPass("validate-B");
    321323                        Stats::Time::BlockGuard guard("validate-B");
     324                        assertTopLvalue( translationUnit );
    322325                        Stats::Time::TimeBlock("Link Reference To Types", [&]() {
    323326                                acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions
    324327                        });
     328                        clearInnerLvalue( translationUnit );
     329                        assertTopLvalue( translationUnit );
    325330                        Stats::Time::TimeBlock("Fix Qualified Types", [&]() {
    326331                                mutateAll( translationUnit, fixQual ); // must happen after LinkReferenceToTypes_old, because aggregate members are accessed
    327332                        });
     333                        assertTopLvalue( translationUnit );
    328334                        Stats::Time::TimeBlock("Hoist Structs", [&]() {
    329335                                HoistStruct::hoistStruct( translationUnit ); // must happen after EliminateTypedef, so that aggregate typedefs occur in the correct order
    330336                        });
     337                        assertTopLvalue( translationUnit );
    331338                        Stats::Time::TimeBlock("Eliminate Typedefs", [&]() {
    332339                                EliminateTypedef::eliminateTypedef( translationUnit ); //
    333340                        });
    334341                }
     342                assertTopLvalue( translationUnit );
    335343                {
    336344                        Stats::Heap::newPass("validate-C");
    337345                        Stats::Time::BlockGuard guard("validate-C");
    338346                        acceptAll( translationUnit, genericParams );  // check as early as possible - can't happen before LinkReferenceToTypes_old
     347                        VerifyCtorDtorAssign::verify( translationUnit );  // must happen before autogen, because autogen examines existing ctor/dtors
    339348                        ReturnChecker::checkFunctionReturns( translationUnit );
    340349                        InitTweak::fixReturnStatements( translationUnit ); // must happen before autogen
    341350                }
     351                assertTopLvalue( translationUnit );
    342352                {
    343353                        Stats::Heap::newPass("validate-D");
    344354                        Stats::Time::BlockGuard guard("validate-D");
     355                        assertTopLvalue( translationUnit );
    345356                        Stats::Time::TimeBlock("Apply Concurrent Keywords", [&]() {
    346357                                Concurrency::applyKeywords( translationUnit );
    347358                        });
     359                        clearInnerLvalue( translationUnit );
     360                        assertTopLvalue( translationUnit );
    348361                        Stats::Time::TimeBlock("Forall Pointer Decay", [&]() {
    349362                                acceptAll( translationUnit, fpd ); // must happen before autogenerateRoutines, after Concurrency::applyKeywords because uniqueIds must be set on declaration before resolution
    350363                        });
     364                        assertTopLvalue( translationUnit );
    351365                        Stats::Time::TimeBlock("Hoist Control Declarations", [&]() {
    352366                                ControlStruct::hoistControlDecls( translationUnit );  // hoist initialization out of for statements; must happen before autogenerateRoutines
    353367                        });
     368                        assertTopLvalue( translationUnit );
    354369                        Stats::Time::TimeBlock("Generate Autogen routines", [&]() {
    355370                                autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecay_old
    356371                        });
    357                 }
     372                        clearInnerLvalue( translationUnit );
     373                }
     374                assertTopLvalue( translationUnit );
    358375                {
    359376                        Stats::Heap::newPass("validate-E");
    360377                        Stats::Time::BlockGuard guard("validate-E");
     378                        assertTopLvalue( translationUnit );
    361379                        Stats::Time::TimeBlock("Implement Mutex Func", [&]() {
    362380                                Concurrency::implementMutexFuncs( translationUnit );
    363381                        });
     382                        clearInnerLvalue( translationUnit );
     383                        assertTopLvalue( translationUnit );
    364384                        Stats::Time::TimeBlock("Implement Thread Start", [&]() {
    365385                                Concurrency::implementThreadStarter( translationUnit );
    366386                        });
     387                        assertTopLvalue( translationUnit );
    367388                        Stats::Time::TimeBlock("Compound Literal", [&]() {
    368389                                mutateAll( translationUnit, compoundliteral );
    369390                        });
     391                        assertTopLvalue( translationUnit );
    370392                        Stats::Time::TimeBlock("Resolve With Expressions", [&]() {
    371393                                ResolvExpr::resolveWithExprs( translationUnit ); // must happen before FixObjectType because user-code is resolved and may contain with variables
    372394                        });
    373                 }
     395                        clearInnerLvalue( translationUnit );
     396                }
     397                assertTopLvalue( translationUnit );
    374398                {
    375399                        Stats::Heap::newPass("validate-F");
    376400                        Stats::Time::BlockGuard guard("validate-F");
    377                         Stats::Time::TimeCall("Fix Object Type",
    378                                 FixObjectType::fix, translationUnit);
    379                         Stats::Time::TimeCall("Array Length",
    380                                 ArrayLength::computeLength, translationUnit);
    381                         Stats::Time::TimeCall("Find Special Declarations",
    382                                 Validate::findSpecialDecls, translationUnit);
    383                         Stats::Time::TimeCall("Fix Label Address",
    384                                 mutateAll<LabelAddressFixer>, translationUnit, labelAddrFixer);
    385                         Stats::Time::TimeCall("Handle Attributes",
    386                                 Validate::handleAttributes, translationUnit);
    387                 }
     401                        assertTopLvalue( translationUnit );
     402                        Stats::Time::TimeBlock("Fix Object Type", [&]() {
     403                                FixObjectType::fix( translationUnit );
     404                        });
     405                        assertTopLvalue( translationUnit );
     406                        Stats::Time::TimeBlock("Array Length", [&]() {
     407                                ArrayLength::computeLength( translationUnit );
     408                        });
     409                        clearInnerLvalue( translationUnit );
     410                        assertTopLvalue( translationUnit );
     411                        Stats::Time::TimeBlock("Find Special Declarations", [&]() {
     412                                Validate::findSpecialDecls( translationUnit );
     413                        });
     414                        assertTopLvalue( translationUnit );
     415                        Stats::Time::TimeBlock("Fix Label Address", [&]() {
     416                                mutateAll( translationUnit, labelAddrFixer );
     417                        });
     418                        assertTopLvalue( translationUnit );
     419                        Stats::Time::TimeBlock("Handle Attributes", [&]() {
     420                                Validate::handleAttributes( translationUnit );
     421                        });
     422                }
     423                assertTopLvalue( translationUnit );
    388424        }
    389425
     
    10441080                Type * designatorType = tyDecl->base->stripDeclarator();
    10451081                if ( StructInstType * aggDecl = dynamic_cast< StructInstType * >( designatorType ) ) {
    1046                         declsToAddBefore.push_back( new StructDecl( aggDecl->name, AggregateDecl::Struct, noAttributes, tyDecl->linkage ) );
     1082                        declsToAddBefore.push_back( new StructDecl( aggDecl->name, DeclarationNode::Struct, noAttributes, tyDecl->linkage ) );
    10471083                } else if ( UnionInstType * aggDecl = dynamic_cast< UnionInstType * >( designatorType ) ) {
    10481084                        declsToAddBefore.push_back( new UnionDecl( aggDecl->name, noAttributes, tyDecl->linkage ) );
     
    11821218                if ( CodeGen::isCtorDtorAssign( funcDecl->get_name() ) ) { // TODO: also check /=, etc.
    11831219                        if ( params.size() == 0 ) {
    1184                                 SemanticError( funcDecl->location, "Constructors, destructors, and assignment functions require at least one parameter." );
     1220                                SemanticError( funcDecl, "Constructors, destructors, and assignment functions require at least one parameter " );
    11851221                        }
    11861222                        ReferenceType * refType = dynamic_cast< ReferenceType * >( params.front()->get_type() );
    11871223                        if ( ! refType ) {
    1188                                 SemanticError( funcDecl->location, "First parameter of a constructor, destructor, or assignment function must be a reference." );
     1224                                SemanticError( funcDecl, "First parameter of a constructor, destructor, or assignment function must be a reference " );
    11891225                        }
    11901226                        if ( CodeGen::isCtorDtor( funcDecl->get_name() ) && returnVals.size() != 0 ) {
    1191                                 if(!returnVals.front()->get_type()->isVoid()) {
    1192                                         SemanticError( funcDecl->location, "Constructors and destructors cannot have explicit return values." );
    1193                                 }
     1227                                SemanticError( funcDecl, "Constructors and destructors cannot have explicit return values " );
    11941228                        }
    11951229                }
     
    13001334        void FixObjectType::previsit( ObjectDecl * objDecl ) {
    13011335                Type * new_type = ResolvExpr::resolveTypeof( objDecl->get_type(), indexer );
     1336                new_type->get_qualifiers() -= Type::Lvalue; // even if typeof is lvalue, variable can never have lvalue-qualified type
    13021337                objDecl->set_type( new_type );
    13031338        }
     
    13051340        void FixObjectType::previsit( FunctionDecl * funcDecl ) {
    13061341                Type * new_type = ResolvExpr::resolveTypeof( funcDecl->type, indexer );
     1342                new_type->get_qualifiers() -= Type::Lvalue; // even if typeof is lvalue, variable can never have lvalue-qualified type
    13071343                funcDecl->set_type( new_type );
    13081344        }
     
    13111347                if ( typeDecl->get_base() ) {
    13121348                        Type * new_type = ResolvExpr::resolveTypeof( typeDecl->get_base(), indexer );
     1349                        new_type->get_qualifiers() -= Type::Lvalue; // even if typeof is lvalue, variable can never have lvalue-qualified type
    13131350                        typeDecl->set_base( new_type );
    13141351                } // if
  • src/SynTree/AddressExpr.cc

    r3d5701e r9fb8f01  
    5353                        } // if
    5454                }
     55                // result of & is never an lvalue
     56                get_result()->set_lvalue( false );
    5557        }
    5658}
  • src/SynTree/AggregateDecl.cc

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 23:56:39 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Dec 16 15:07:20 2019
    13 // Update Count     : 31
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Aug  4 14:22:00 2017
     13// Update Count     : 22
    1414//
    1515
     
    2121#include "Common/utility.h"      // for printAll, cloneAll, deleteAll
    2222#include "Declaration.h"         // for AggregateDecl, TypeDecl, Declaration
    23 #include "Initializer.h"
    24 #include "LinkageSpec.h"         // for Spec, linkageName, Cforall
     23#include "Parser/LinkageSpec.h"  // for Spec, linkageName, Cforall
    2524#include "Type.h"                // for Type, Type::StorageClasses
    2625
    27 
    28 // These must harmonize with the corresponding AggregateDecl::Aggregate enumerations.
    29 static const char * aggregateNames[] = { "struct", "union", "enum", "exception", "trait", "generator", "coroutine", "monitor", "thread", "NoAggregateName" };
    30 
    31 const char * AggregateDecl::aggrString( AggregateDecl::Aggregate aggr ) {
    32         return aggregateNames[aggr];
    33 }
    3426
    3527AggregateDecl::AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes, LinkageSpec::Spec linkage ) : Parent( name, Type::StorageClasses(), linkage ), body( false ), attributes( attributes ) {
     
    5547        os << typeString() << " " << name << ":";
    5648        if ( get_linkage() != LinkageSpec::Cforall ) {
    57                 os << " " << LinkageSpec::name( linkage );
     49                os << " " << LinkageSpec::linkageName( linkage );
    5850        } // if
    5951        os << " with body " << has_body();
     
    8678}
    8779
    88 const char * StructDecl::typeString() const { return aggrString( kind ); }
     80std::string StructDecl::typeString() const { return "struct"; }
    8981
    90 const char * UnionDecl::typeString() const { return aggrString( Union ); }
     82std::string UnionDecl::typeString() const { return "union"; }
    9183
    92 const char * EnumDecl::typeString() const { return aggrString( Enum ); }
     84std::string EnumDecl::typeString() const { return "enum"; }
    9385
    94 const char * TraitDecl::typeString() const { return aggrString( Trait ); }
     86std::string TraitDecl::typeString() const { return "trait"; }
    9587
    9688bool EnumDecl::valueOf( Declaration * enumerator, long long int & value ) {
  • src/SynTree/ApplicationExpr.cc

    r3d5701e r9fb8f01  
    2525#include "Declaration.h"         // for Declaration
    2626#include "Expression.h"          // for ParamEntry, ApplicationExpr, Expression
    27 #include "InitTweak/InitTweak.h" // for getFunction
    2827#include "ResolvExpr/typeops.h"  // for extractResultType
    2928#include "Type.h"                // for Type, PointerType, FunctionType
     
    7877
    7978bool ApplicationExpr::get_lvalue() const {
    80         // from src/GenPoly/Lvalue.cc: isIntrinsicReference
    81         static std::set<std::string> lvalueFunctions = { "*?", "?[?]" };
    82         if ( const DeclarationWithType * func = InitTweak::getFunction( this ) ) {
    83                 return func->linkage == LinkageSpec::Intrinsic && lvalueFunctions.count(func->name);
    84         }
    85         return false;
     79        return result->get_lvalue();
    8680}
    8781
  • src/SynTree/ArrayType.cc

    r3d5701e r9fb8f01  
    2626ArrayType::ArrayType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes )
    2727        : Type( tq, attributes ), base( base ), dimension( dimension ), isVarLen( isVarLen ), isStatic( isStatic ) {
     28        base->set_lvalue( false );
    2829}
    2930
  • src/SynTree/Attribute.h

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Feb 13 21:34:08 2020
    13 // Update Count     : 40
     12// Last Modified On : Sat Jul 22 09:54:14 2017
     13// Update Count     : 39
    1414//
    1515
     
    3838        virtual ~Attribute();
    3939
    40         const std::string & get_name() const { return name; }
     40        std::string get_name() const { return name; }
    4141        void set_name( const std::string & newValue ) { name = newValue; }
    4242        std::list< Expression * > & get_parameters() { return parameters; }
  • src/SynTree/CommaExpr.cc

    r3d5701e r9fb8f01  
    2323CommaExpr::CommaExpr( Expression *arg1, Expression *arg2 )
    2424                : Expression(), arg1( arg1 ), arg2( arg2 ) {
     25        // xxx - result of a comma expression is never an lvalue, so should set lvalue
     26        // to false on all result types. Actually doing this causes some strange things
     27        // to happen in later passes (particularly, Specialize, Lvalue, and Box). This needs to be looked into.
    2528        set_result( maybeClone( arg2->get_result() ) );
     29        // get_type->set_isLvalue( false );
    2630}
    2731
     
    3640
    3741bool CommaExpr::get_lvalue() const {
    38         // This is wrong by C, but the current implementation uses it.
    39         // (ex: Specialize, Lvalue and Box)
    40         return arg2->get_lvalue();
     42        // xxx - as above, shouldn't be an lvalue but that information is used anyways.
     43        return result->get_lvalue();
    4144}
    4245
  • src/SynTree/Declaration.cc

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec 11 16:39:56 2019
    13 // Update Count     : 36
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Aug  9 14:38:00 2017
     13// Update Count     : 25
    1414//
    1515
     
    2424#include "SynTree/Statement.h"       // for AsmStmt
    2525#include "SynTree/SynTree.h"         // for UniqueId
    26 #include "SynTree/Expression.h"
    2726#include "Type.h"                    // for Type, Type::StorageClasses
    2827
    29 // To canonicalize declarations
    3028static UniqueId lastUniqueId = 0;
    3129
  • src/SynTree/Declaration.h

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:11:22 2019
    13 // Update Count     : 157
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thr May  2 10:47:00 2019
     13// Update Count     : 135
    1414//
    1515
     
    2424#include "BaseSyntaxNode.h"      // for BaseSyntaxNode
    2525#include "Mutator.h"             // for Mutator
    26 #include "LinkageSpec.h"         // for Spec, Cforall
     26#include "Parser/LinkageSpec.h"  // for Spec, Cforall
     27#include "Parser/ParseNode.h"    // for DeclarationNode, DeclarationNode::Ag...
    2728#include "SynTree.h"             // for UniqueId
    2829#include "SynTree/Type.h"        // for Type, Type::StorageClasses, Type::Fu...
     
    4344        bool extension = false;
    4445
    45         Declaration( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage );
    46         Declaration( const Declaration & other );
     46        Declaration( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage );
     47        Declaration( const Declaration &other );
    4748        virtual ~Declaration();
    4849
    49         const std::string & get_name() const { return name; }
     50        const std::string &get_name() const { return name; }
    5051        void set_name( std::string newValue ) { name = newValue; }
    5152
     
    5859
    5960        bool get_extension() const { return extension; }
    60         Declaration * set_extension( bool exten ) { extension = exten; return this; }
     61        Declaration *set_extension( bool exten ) { extension = exten; return this; }
    6162
    6263        void fixUniqueId( void );
    63         virtual Declaration * clone() const override = 0;
     64        virtual Declaration *clone() const override = 0;
    6465        virtual void accept( Visitor & v ) override = 0;
    6566        virtual void accept( Visitor & v ) const override = 0;
    66         virtual Declaration * acceptMutator( Mutator & m ) override = 0;
    67         virtual void print( std::ostream & os, Indenter indent = {} ) const override = 0;
    68         virtual void printShort( std::ostream & os, Indenter indent = {} ) const = 0;
     67        virtual Declaration *acceptMutator( Mutator &m ) override = 0;
     68        virtual void print( std::ostream &os, Indenter indent = {} ) const override = 0;
     69        virtual void printShort( std::ostream &os, Indenter indent = {} ) const = 0;
    6970
    7071        UniqueId uniqueId;
     
    8081        int scopeLevel = 0;
    8182
    82         Expression * asmName;
     83        Expression *asmName;
    8384        std::list< Attribute * > attributes;
    8485        bool isDeleted = false;
    8586
    86         DeclarationWithType( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes, Type::FuncSpecifiers fs );
    87         DeclarationWithType( const DeclarationWithType & other );
     87        DeclarationWithType( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes, Type::FuncSpecifiers fs );
     88        DeclarationWithType( const DeclarationWithType &other );
    8889        virtual ~DeclarationWithType();
    8990
     
    9697        DeclarationWithType * set_scopeLevel( int newValue ) { scopeLevel = newValue; return this; }
    9798
    98         Expression * get_asmName() const { return asmName; }
    99         DeclarationWithType * set_asmName( Expression * newValue ) { asmName = newValue; return this; }
     99        Expression *get_asmName() const { return asmName; }
     100        DeclarationWithType * set_asmName( Expression *newValue ) { asmName = newValue; return this; }
    100101
    101102        std::list< Attribute * >& get_attributes() { return attributes; }
     
    105106        //void set_functionSpecifiers( Type::FuncSpecifiers newValue ) { fs = newValue; }
    106107
    107         virtual DeclarationWithType * clone() const override = 0;
    108         virtual DeclarationWithType * acceptMutator( Mutator & m )  override = 0;
     108        virtual DeclarationWithType *clone() const override = 0;
     109        virtual DeclarationWithType *acceptMutator( Mutator &m )  override = 0;
    109110
    110111        virtual Type * get_type() const = 0;
     
    118119        typedef DeclarationWithType Parent;
    119120  public:
    120         Type * type;
    121         Initializer * init;
    122         Expression * bitfieldWidth;
    123 
    124         ObjectDecl( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage, Expression * bitfieldWidth, Type * type, Initializer * init,
     121        Type *type;
     122        Initializer *init;
     123        Expression *bitfieldWidth;
     124
     125        ObjectDecl( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, Expression *bitfieldWidth, Type *type, Initializer *init,
    125126                                const std::list< Attribute * > attributes = std::list< Attribute * >(), Type::FuncSpecifiers fs = Type::FuncSpecifiers() );
    126         ObjectDecl( const ObjectDecl & other );
     127        ObjectDecl( const ObjectDecl &other );
    127128        virtual ~ObjectDecl();
    128129
    129130        virtual Type * get_type() const override { return type; }
    130         virtual void set_type(Type * newType) override { type = newType; }
    131 
    132         Initializer * get_init() const { return init; }
    133         void set_init( Initializer * newValue ) { init = newValue; }
    134 
    135         Expression * get_bitfieldWidth() const { return bitfieldWidth; }
    136         void set_bitfieldWidth( Expression * newValue ) { bitfieldWidth = newValue; }
     131        virtual void set_type(Type *newType) override { type = newType; }
     132
     133        Initializer *get_init() const { return init; }
     134        void set_init( Initializer *newValue ) { init = newValue; }
     135
     136        Expression *get_bitfieldWidth() const { return bitfieldWidth; }
     137        void set_bitfieldWidth( Expression *newValue ) { bitfieldWidth = newValue; }
    137138
    138139        static ObjectDecl * newObject( const std::string & name, Type * type, Initializer * init );
    139140
    140         virtual ObjectDecl * clone() const override { return new ObjectDecl( *this ); }
    141         virtual void accept( Visitor & v ) override { v.visit( this ); }
    142         virtual void accept( Visitor & v ) const override { v.visit( this ); }
    143         virtual DeclarationWithType * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
    144         virtual void print( std::ostream & os, Indenter indent = {} ) const override;
    145         virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
     141        virtual ObjectDecl *clone() const override { return new ObjectDecl( *this ); }
     142        virtual void accept( Visitor & v ) override { v.visit( this ); }
     143        virtual void accept( Visitor & v ) const override { v.visit( this ); }
     144        virtual DeclarationWithType *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
     145        virtual void print( std::ostream &os, Indenter indent = {} ) const override;
     146        virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
    146147};
    147148
     
    149150        typedef DeclarationWithType Parent;
    150151  public:
    151         FunctionType * type;
    152         CompoundStmt * statements;
     152        FunctionType *type;
     153        CompoundStmt *statements;
    153154        std::list< Expression * > withExprs;
    154155
    155         FunctionDecl( const std::string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage, FunctionType * type, CompoundStmt * statements,
     156        FunctionDecl( const std::string &name, Type::StorageClasses scs, LinkageSpec::Spec linkage, FunctionType *type, CompoundStmt *statements,
    156157                                  const std::list< Attribute * > attributes = std::list< Attribute * >(), Type::FuncSpecifiers fs = Type::FuncSpecifiers() );
    157         FunctionDecl( const FunctionDecl & other );
     158        FunctionDecl( const FunctionDecl &other );
    158159        virtual ~FunctionDecl();
    159160
     
    162163
    163164        FunctionType * get_functionType() const { return type; }
    164         void set_functionType( FunctionType * newValue ) { type = newValue; }
    165         CompoundStmt * get_statements() const { return statements; }
    166         void set_statements( CompoundStmt * newValue ) { statements = newValue; }
     165        void set_functionType( FunctionType *newValue ) { type = newValue; }
     166        CompoundStmt *get_statements() const { return statements; }
     167        void set_statements( CompoundStmt *newValue ) { statements = newValue; }
    167168        bool has_body() const { return NULL != statements; }
    168169
    169170        static FunctionDecl * newFunction( const std::string & name, FunctionType * type, CompoundStmt * statements );
    170171
    171         virtual FunctionDecl * clone() const override { return new FunctionDecl( *this ); }
    172         virtual void accept( Visitor & v ) override { v.visit( this ); }
    173         virtual void accept( Visitor & v ) const override { v.visit( this ); }
    174         virtual DeclarationWithType * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
    175         virtual void print( std::ostream & os, Indenter indent = {} ) const override;
    176         virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
     172        virtual FunctionDecl *clone() const override { return new FunctionDecl( *this ); }
     173        virtual void accept( Visitor & v ) override { v.visit( this ); }
     174        virtual void accept( Visitor & v ) const override { v.visit( this ); }
     175        virtual DeclarationWithType *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
     176        virtual void print( std::ostream &os, Indenter indent = {} ) const override;
     177        virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
    177178};
    178179
     
    180181        typedef Declaration Parent;
    181182  public:
    182         Type * base;
    183         std::list< TypeDecl * > parameters;
    184         std::list< DeclarationWithType * > assertions;
    185 
    186         NamedTypeDecl( const std::string & name, Type::StorageClasses scs, Type * type );
    187         NamedTypeDecl( const NamedTypeDecl & other );
     183        Type *base;
     184        std::list< TypeDecl* > parameters;
     185        std::list< DeclarationWithType* > assertions;
     186
     187        NamedTypeDecl( const std::string &name, Type::StorageClasses scs, Type *type );
     188        NamedTypeDecl( const NamedTypeDecl &other );
    188189        virtual ~NamedTypeDecl();
    189190
    190         Type * get_base() const { return base; }
    191         void set_base( Type * newValue ) { base = newValue; }
    192         std::list< TypeDecl* > & get_parameters() { return parameters; }
    193         std::list< DeclarationWithType * >& get_assertions() { return assertions; }
    194 
    195         virtual const char * typeString() const = 0;
    196 
    197         virtual NamedTypeDecl * clone() const override = 0;
    198         virtual void print( std::ostream & os, Indenter indent = {} ) const override;
    199         virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
     191        Type *get_base() const { return base; }
     192        void set_base( Type *newValue ) { base = newValue; }
     193        std::list< TypeDecl* >& get_parameters() { return parameters; }
     194        std::list< DeclarationWithType* >& get_assertions() { return assertions; }
     195
     196        virtual std::string typeString() const = 0;
     197
     198        virtual NamedTypeDecl *clone() const override = 0;
     199        virtual void print( std::ostream &os, Indenter indent = {} ) const override;
     200        virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
    200201};
    201202
     
    203204        typedef NamedTypeDecl Parent;
    204205  public:
    205         enum Kind { Dtype, Otype, Ftype, Ttype, NUMBER_OF_KINDS };
    206 
    207         Kind kind;
     206        enum Kind { Dtype, Ftype, Ttype, NUMBER_OF_KINDS };
     207
     208        Type * init;
    208209        bool sized;
    209         Type * init;
    210210
    211211        /// Data extracted from a type decl
    212212        struct Data {
    213                 Kind kind;
     213                TypeDecl::Kind kind;
    214214                bool isComplete;
    215215
    216                 Data() : kind( NUMBER_OF_KINDS ), isComplete( false ) {}
    217                 Data( const TypeDecl * typeDecl ) : Data( typeDecl->get_kind(), typeDecl->isComplete() ) {}
     216                Data() : kind( (TypeDecl::Kind)-1 ), isComplete( false ) {}
     217                Data( TypeDecl * typeDecl ) : Data( typeDecl->get_kind(), typeDecl->isComplete() ) {}
    218218                Data( Kind kind, bool isComplete ) : kind( kind ), isComplete( isComplete ) {}
    219                 Data( const Data & d1, const Data & d2 )
    220                         : kind( d1.kind ), isComplete( d1.isComplete || d2.isComplete ) {}
    221 
    222                 bool operator==( const Data & other ) const { return kind == other.kind && isComplete == other.isComplete; }
    223                 bool operator!=( const Data & other ) const { return !(*this == other);}
     219                Data( const Data& d1, const Data& d2 )
     220                : kind( d1.kind ), isComplete ( d1.isComplete || d2.isComplete ) {}
     221
     222                bool operator==(const Data & other) const { return kind == other.kind && isComplete == other.isComplete; }
     223                bool operator!=(const Data & other) const { return !(*this == other);}
    224224        };
    225225
    226         TypeDecl( const std::string & name, Type::StorageClasses scs, Type * type, Kind kind, bool sized, Type * init = nullptr );
    227         TypeDecl( const TypeDecl & other );
     226        TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind, bool sized, Type * init = nullptr );
     227        TypeDecl( const TypeDecl &other );
    228228        virtual ~TypeDecl();
    229229
     
    237237        TypeDecl * set_sized( bool newValue ) { sized = newValue; return this; }
    238238
    239         virtual const char * typeString() const override;
    240         virtual const char * genTypeString() const;
    241 
    242         virtual TypeDecl * clone() const override { return new TypeDecl( *this ); }
    243         virtual void accept( Visitor & v ) override { v.visit( this ); }
    244         virtual void accept( Visitor & v ) const override { v.visit( this ); }
    245         virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
    246         virtual void print( std::ostream & os, Indenter indent = {} ) const override;
     239        virtual std::string typeString() const override;
     240        virtual std::string genTypeString() const;
     241
     242        virtual TypeDecl *clone() const override { return new TypeDecl( *this ); }
     243        virtual void accept( Visitor & v ) override { v.visit( this ); }
     244        virtual void accept( Visitor & v ) const override { v.visit( this ); }
     245        virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
     246        virtual void print( std::ostream &os, Indenter indent = {} ) const override;
     247
     248        Kind kind;
    247249};
    248250
     
    250252        typedef NamedTypeDecl Parent;
    251253  public:
    252         TypedefDecl( const std::string & name, CodeLocation location, Type::StorageClasses scs, Type * type, LinkageSpec::Spec spec = LinkageSpec::Cforall )
     254        TypedefDecl( const std::string &name, CodeLocation location, Type::StorageClasses scs, Type *type, LinkageSpec::Spec spec = LinkageSpec::Cforall )
    253255                : Parent( name, scs, type ) { set_linkage( spec ); this->location = location; }
    254256
    255         TypedefDecl( const TypedefDecl & other ) : Parent( other ) {}
    256 
    257         virtual const char * typeString() const override;
    258 
    259         virtual TypedefDecl * clone() const override { return new TypedefDecl( *this ); }
    260         virtual void accept( Visitor & v ) override { v.visit( this ); }
    261         virtual void accept( Visitor & v ) const override { v.visit( this ); }
    262         virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
     257        TypedefDecl( const TypedefDecl &other ) : Parent( other ) {}
     258
     259        virtual std::string typeString() const override;
     260
     261        virtual TypedefDecl *clone() const override { return new TypedefDecl( *this ); }
     262        virtual void accept( Visitor & v ) override { v.visit( this ); }
     263        virtual void accept( Visitor & v ) const override { v.visit( this ); }
     264        virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
    263265  private:
    264266};
     
    267269        typedef Declaration Parent;
    268270  public:
    269         enum Aggregate { Struct, Union, Enum, Exception, Trait, Generator, Coroutine, Monitor, Thread, NoAggregate };
    270         static const char * aggrString( Aggregate aggr );
    271 
    272271        std::list<Declaration*> members;
    273272        std::list<TypeDecl*> parameters;
     
    276275        AggregateDecl * parent = nullptr;
    277276
    278         AggregateDecl( const std::string & name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall );
    279         AggregateDecl( const AggregateDecl & other );
     277        AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall );
     278        AggregateDecl( const AggregateDecl &other );
    280279        virtual ~AggregateDecl();
    281280
     
    289288        AggregateDecl * set_body( bool body ) { AggregateDecl::body = body; return this; }
    290289
    291         virtual void print( std::ostream & os, Indenter indent = {} ) const override final;
    292         virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
     290        virtual void print( std::ostream &os, Indenter indent = {} ) const override final;
     291        virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
    293292  protected:
    294         virtual const char * typeString() const = 0;
     293        virtual std::string typeString() const = 0;
    295294};
    296295
     
    298297        typedef AggregateDecl Parent;
    299298  public:
    300         StructDecl( const std::string & name, Aggregate kind = Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( kind ) {}
    301         StructDecl( const StructDecl & other ) : Parent( other ), kind( other.kind ) {}
    302 
    303         bool is_coroutine() { return kind == Coroutine; }
    304         bool is_monitor() { return kind == Monitor; }
    305         bool is_thread() { return kind == Thread; }
    306 
    307         virtual StructDecl * clone() const override { return new StructDecl( *this ); }
    308         virtual void accept( Visitor & v ) override { v.visit( this ); }
    309         virtual void accept( Visitor & v ) const override { v.visit( this ); }
    310         virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
    311         Aggregate kind;
    312   private:
    313         virtual const char * typeString() const override;
     299        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 ) {}
     300        StructDecl( const StructDecl &other ) : Parent( other ), kind( other.kind ) {}
     301
     302        bool is_coroutine() { return kind == DeclarationNode::Coroutine; }
     303        bool is_monitor() { return kind == DeclarationNode::Monitor; }
     304        bool is_thread() { return kind == DeclarationNode::Thread; }
     305
     306        virtual StructDecl *clone() const override { return new StructDecl( *this ); }
     307        virtual void accept( Visitor & v ) override { v.visit( this ); }
     308        virtual void accept( Visitor & v ) const override { v.visit( this ); }
     309        virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
     310        DeclarationNode::Aggregate kind;
     311  private:
     312        virtual std::string typeString() const override;
    314313};
    315314
     
    317316        typedef AggregateDecl Parent;
    318317  public:
    319         UnionDecl( const std::string & name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
    320         UnionDecl( const UnionDecl & other ) : Parent( other ) {}
    321 
    322         virtual UnionDecl * clone() const override { return new UnionDecl( *this ); }
    323         virtual void accept( Visitor & v ) override { v.visit( this ); }
    324         virtual void accept( Visitor & v ) const override { v.visit( this ); }
    325         virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
    326   private:
    327         virtual const char * typeString() const override;
     318        UnionDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
     319        UnionDecl( const UnionDecl &other ) : Parent( other ) {}
     320
     321        virtual UnionDecl *clone() const override { return new UnionDecl( *this ); }
     322        virtual void accept( Visitor & v ) override { v.visit( this ); }
     323        virtual void accept( Visitor & v ) const override { v.visit( this ); }
     324        virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
     325  private:
     326        virtual std::string typeString() const override;
    328327};
    329328
     
    331330        typedef AggregateDecl Parent;
    332331  public:
    333         EnumDecl( const std::string & name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
    334         EnumDecl( const EnumDecl & other ) : Parent( other ) {}
     332        EnumDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
     333        EnumDecl( const EnumDecl &other ) : Parent( other ) {}
    335334
    336335        bool valueOf( Declaration * enumerator, long long int & value );
    337336
    338         virtual EnumDecl * clone() const override { return new EnumDecl( *this ); }
    339         virtual void accept( Visitor & v ) override { v.visit( this ); }
    340         virtual void accept( Visitor & v ) const override { v.visit( this ); }
    341         virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
     337        virtual EnumDecl *clone() const override { return new EnumDecl( *this ); }
     338        virtual void accept( Visitor & v ) override { v.visit( this ); }
     339        virtual void accept( Visitor & v ) const override { v.visit( this ); }
     340        virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
    342341  private:
    343342        std::unordered_map< std::string, long long int > enumValues;
    344         virtual const char * typeString() const override;
     343        virtual std::string typeString() const override;
    345344};
    346345
     
    348347        typedef AggregateDecl Parent;
    349348  public:
    350         TraitDecl( const std::string & name, const std::list< Attribute * > & attributes, LinkageSpec::Spec linkage ) : Parent( name, attributes, linkage ) {
     349        TraitDecl( const std::string &name, const std::list< Attribute * > & attributes, LinkageSpec::Spec linkage ) : Parent( name, attributes, linkage ) {
    351350                assertf( attributes.empty(), "attribute unsupported for traits" );
    352351        }
    353         TraitDecl( const TraitDecl & other ) : Parent( other ) {}
    354 
    355         virtual TraitDecl * clone() const override { return new TraitDecl( *this ); }
    356         virtual void accept( Visitor & v ) override { v.visit( this ); }
    357         virtual void accept( Visitor & v ) const override { v.visit( this ); }
    358         virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
    359   private:
    360         virtual const char * typeString() const override;
     352        TraitDecl( const TraitDecl &other ) : Parent( other ) {}
     353
     354        virtual TraitDecl *clone() const override { return new TraitDecl( *this ); }
     355        virtual void accept( Visitor & v ) override { v.visit( this ); }
     356        virtual void accept( Visitor & v ) const override { v.visit( this ); }
     357        virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
     358  private:
     359        virtual std::string typeString() const override;
    361360};
    362361
     
    380379class AsmDecl : public Declaration {
    381380  public:
    382         AsmStmt * stmt;
    383 
    384         AsmDecl( AsmStmt * stmt );
    385         AsmDecl( const AsmDecl & other );
     381        AsmStmt *stmt;
     382
     383        AsmDecl( AsmStmt *stmt );
     384        AsmDecl( const AsmDecl &other );
    386385        virtual ~AsmDecl();
    387386
    388         AsmStmt * get_stmt() { return stmt; }
    389         void set_stmt( AsmStmt * newValue ) { stmt = newValue; }
    390 
    391         virtual AsmDecl * clone() const override { return new AsmDecl( *this ); }
    392         virtual void accept( Visitor & v ) override { v.visit( this ); }
    393         virtual void accept( Visitor & v ) const override { v.visit( this ); }
    394         virtual AsmDecl * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
    395         virtual void print( std::ostream & os, Indenter indent = {} ) const override;
    396         virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
     387        AsmStmt *get_stmt() { return stmt; }
     388        void set_stmt( AsmStmt *newValue ) { stmt = newValue; }
     389
     390        virtual AsmDecl *clone() const override { return new AsmDecl( *this ); }
     391        virtual void accept( Visitor & v ) override { v.visit( this ); }
     392        virtual void accept( Visitor & v ) const override { v.visit( this ); }
     393        virtual AsmDecl *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
     394        virtual void print( std::ostream &os, Indenter indent = {} ) const override;
     395        virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
    397396};
    398397
     
    409408        virtual void accept( Visitor & v ) override { v.visit( this ); }
    410409        virtual void accept( Visitor & v ) const override { v.visit( this ); }
    411         virtual StaticAssertDecl * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
    412         virtual void print( std::ostream & os, Indenter indent = {} ) const override;
    413         virtual void printShort( std::ostream & os, Indenter indent = {} ) const override;
     410        virtual StaticAssertDecl * acceptMutator( Mutator &m )  override { return m.mutate( this ); }
     411        virtual void print( std::ostream &os, Indenter indent = {} ) const override;
     412        virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
    414413};
    415414
  • src/SynTree/DeclarationWithType.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:45:16 2019
    13 // Update Count     : 26
     12// Last Modified On : Thu Mar 16 08:34:35 2017
     13// Update Count     : 25
    1414//
    1515
     
    2020#include "Common/utility.h"      // for cloneAll, deleteAll, maybeClone
    2121#include "Declaration.h"         // for DeclarationWithType, Declaration
    22 #include "LinkageSpec.h"         // for Spec
    23 #include "Expression.h"          // for ConstantExpr
     22#include "Parser/LinkageSpec.h"  // for Spec
     23#include "SynTree/Expression.h"  // for ConstantExpr
    2424#include "Type.h"                // for Type, Type::FuncSpecifiers, Type::St...
    2525
  • src/SynTree/Expression.cc

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec 11 07:55:15 2019
    13 // Update Count     : 70
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thr Aug 15 13:43:00 2019
     13// Update Count     : 64
    1414//
    1515
     
    1919#include <iostream>                  // for ostream, operator<<, basic_ostream
    2020#include <list>                      // for list, _List_iterator, list<>::co...
    21 #include <set>                       // for set
    2221
    2322#include "Common/utility.h"          // for maybeClone, cloneAll, deleteAll
     23#include "Declaration.h"             // for ObjectDecl, DeclarationWithType
    2424#include "Expression.h"              // for Expression, ImplicitCopyCtorExpr
    2525#include "InitTweak/InitTweak.h"     // for getCallArg, getPointerBase
     
    6464
    6565bool Expression::get_lvalue() const {
     66        assert( !result->get_lvalue() );
    6667        return false;
    6768}
     
    114115        assert( var->get_type() );
    115116        Type * type = var->get_type()->clone();
     117        type->set_lvalue( true );
    116118
    117119        // xxx - doesn't quite work yet - get different alternatives with the same cost
     
    123125        //      long long int value;
    124126        //      if ( decl->valueOf( var, value ) ) {
    125         //              type->set_lvalue( false ); // Would have to move to get_lvalue.
     127        //              type->set_lvalue( false );
    126128        //      }
    127129        // }
     
    138140
    139141bool VariableExpr::get_lvalue() const {
    140         // It isn't always an lvalue, but it is never an rvalue.
    141         return true;
     142        return result->get_lvalue();
    142143}
    143144
     
    276277
    277278bool CastExpr::get_lvalue() const {
    278         // This is actually wrong by C, but it works with our current set-up.
    279         return arg->get_lvalue();
     279        return result->get_lvalue();
    280280}
    281281
     
    293293}
    294294
    295 KeywordCastExpr::KeywordCastExpr( Expression * arg, AggregateDecl::Aggregate target ) : Expression(), arg(arg), target( target ) {
     295KeywordCastExpr::KeywordCastExpr( Expression * arg, Target target ) : Expression(), arg(arg), target( target ) {
    296296}
    297297
     
    303303}
    304304
    305 const char * KeywordCastExpr::targetString() const {
    306         return AggregateDecl::aggrString( target );
     305const std::string & KeywordCastExpr::targetString() const {
     306        static const std::string targetStrs[] = {
     307                "coroutine", "thread", "monitor"
     308        };
     309        static_assert(
     310                (sizeof(targetStrs) / sizeof(targetStrs[0])) == ((unsigned long)NUMBER_OF_TARGETS),
     311                "Each KeywordCastExpr::Target should have a corresponding string representation"
     312        );
     313        return targetStrs[(unsigned long)target];
    307314}
    308315
     
    353360}
    354361
    355 bool UntypedMemberExpr::get_lvalue() const {
    356         return aggregate->get_lvalue();
    357 }
    358 
    359362void UntypedMemberExpr::print( std::ostream & os, Indenter indent ) const {
    360363        os << "Untyped Member Expression, with field: " << std::endl << indent+1;
     
    375378        sub.apply( res );
    376379        result = res;
     380        result->set_lvalue( true );
    377381        result->get_qualifiers() |= aggregate->result->get_qualifiers();
    378382}
     
    388392
    389393bool MemberExpr::get_lvalue() const {
    390         // This is actually wrong by C, but it works with our current set-up.
     394        assert( result->get_lvalue() );
    391395        return true;
    392396}
     
    423427                        // if references are still allowed in the AST, dereference returns a reference
    424428                        ret->set_result( new ReferenceType( Type::Qualifiers(), ret->get_result() ) );
     429                } else {
     430                        // references have been removed, in which case dereference returns an lvalue of the base type.
     431                        ret->result->set_lvalue( true );
    425432                }
    426433        }
     
    440447
    441448bool UntypedExpr::get_lvalue() const {
    442         // from src/GenPoly/Lvalue.cc: isIntrinsicReference
    443         static std::set<std::string> lvalueFunctions = { "*?", "?[?]" };
    444         std::string fname = InitTweak::getFunctionName( const_cast< UntypedExpr * >( this ) );
    445         return lvalueFunctions.count(fname);
     449        return result->get_lvalue();
    446450}
    447451
     
    506510
    507511bool ConditionalExpr::get_lvalue() const {
    508         return false;
     512        return result->get_lvalue();
    509513}
    510514
     
    519523}
    520524
    521 AsmExpr::AsmExpr( const AsmExpr & other ) : Expression( other ), inout( other.inout ), constraint( maybeClone( other.constraint ) ), operand( maybeClone( other.operand ) ) {}
     525AsmExpr::AsmExpr( const AsmExpr & other ) : Expression( other ), inout( maybeClone( other.inout ) ), constraint( maybeClone( other.constraint ) ), operand( maybeClone( other.operand ) ) {}
    522526
    523527
    524528void AsmExpr::print( std::ostream & os, Indenter indent ) const {
    525529        os << "Asm Expression: " << std::endl;
    526         if ( !inout.empty() ) os <<  "[" << inout << "] ";
     530        if ( inout ) inout->print( os, indent+1 );
    527531        if ( constraint ) constraint->print( os, indent+1 );
    528532        if ( operand ) operand->print( os, indent+1 );
     
    566570
    567571bool ConstructorExpr::get_lvalue() const {
    568         return false;
     572        return result->get_lvalue();
    569573}
    570574
     
    578582CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : initializer( initializer ) {
    579583        assert( type && initializer );
     584        type->set_lvalue( true );
    580585        set_result( type );
    581586}
     
    588593
    589594bool CompoundLiteralExpr::get_lvalue() const {
     595        assert( result->get_lvalue() );
    590596        return true;
    591597}
     
    642648}
    643649bool StmtExpr::get_lvalue() const {
    644         return false;
     650        return result->get_lvalue();
    645651}
    646652void StmtExpr::print( std::ostream & os, Indenter indent ) const {
  • src/SynTree/Expression.h

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec 11 16:50:19 2019
    13 // Update Count     : 60
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thr Aug 15 13:46:00 2019
     13// Update Count     : 54
    1414//
    1515
     
    2828#include "Label.h"                // for Label
    2929#include "Mutator.h"              // for Mutator
    30 #include "Declaration.h"          // for Aggregate
    3130#include "SynTree.h"              // for UniqueId
    3231#include "Visitor.h"              // for Visitor
     
    230229public:
    231230        Expression * arg;
    232         struct Concrete {
    233                 std::string field;
    234                 std::string getter;
    235         };
    236         AggregateDecl::Aggregate target;
    237         Concrete concrete_target;
    238 
    239         KeywordCastExpr( Expression * arg, AggregateDecl::Aggregate target );
     231        enum Target {
     232                Coroutine, Thread, Monitor, NUMBER_OF_TARGETS
     233        } target;
     234
     235        KeywordCastExpr( Expression * arg, Target target );
    240236        KeywordCastExpr( const KeywordCastExpr & other );
    241237        virtual ~KeywordCastExpr();
    242238
    243         const char * targetString() const;
     239        const std::string & targetString() const;
    244240
    245241        virtual KeywordCastExpr * clone() const override { return new KeywordCastExpr( * this ); }
     
    278274        UntypedMemberExpr( const UntypedMemberExpr & other );
    279275        virtual ~UntypedMemberExpr();
    280 
    281         bool get_lvalue() const final;
    282276
    283277        Expression * get_member() const { return member; }
     
    579573class AsmExpr : public Expression {
    580574  public:
    581         std::string inout;
     575        Expression * inout;
    582576        Expression * constraint;
    583577        Expression * operand;
    584578
    585         AsmExpr( const std::string * _inout, Expression * constraint, Expression * operand ) : inout( _inout ? *_inout : "" ), constraint( constraint ), operand( operand ) { delete _inout; }
     579        AsmExpr( Expression * inout, Expression * constraint, Expression * operand ) : inout( inout ), constraint( constraint ), operand( operand ) {}
    586580        AsmExpr( const AsmExpr & other );
    587         virtual ~AsmExpr() { delete constraint; delete operand; };
     581        virtual ~AsmExpr() { delete inout; delete constraint; delete operand; };
     582
     583        Expression * get_inout() const { return inout; }
     584        void set_inout( Expression * newValue ) { inout = newValue; }
     585
     586        Expression * get_constraint() const { return constraint; }
     587        void set_constraint( Expression * newValue ) { constraint = newValue; }
     588
     589        Expression * get_operand() const { return operand; }
     590        void set_operand( Expression * newValue ) { operand = newValue; }
    588591
    589592        virtual AsmExpr * clone() const override { return new AsmExpr( * this ); }
  • src/SynTree/FunctionDecl.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Dec 16 15:11:20 2019
    13 // Update Count     : 77
     12// Last Modified On : Thu Mar 16 08:33:41 2017
     13// Update Count     : 74
    1414//
    1515
     
    2323#include "Common/utility.h"      // for maybeClone, printAll
    2424#include "Declaration.h"         // for FunctionDecl, FunctionDecl::Parent
    25 #include "Expression.h"
    26 #include "LinkageSpec.h"         // for Spec, linkageName, Cforall
     25#include "Parser/LinkageSpec.h"  // for Spec, linkageName, Cforall
    2726#include "Statement.h"           // for CompoundStmt
    2827#include "Type.h"                // for Type, FunctionType, Type::FuncSpecif...
     
    7372        } // if
    7473        if ( linkage != LinkageSpec::Cforall ) {
    75                 os << LinkageSpec::name( linkage ) << " ";
     74                os << LinkageSpec::linkageName( linkage ) << " ";
    7675        } // if
    7776
  • src/SynTree/NamedTypeDecl.cc

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Dec 16 15:11:40 2019
    13 // Update Count     : 17
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Aug  9 13:28:00 2017
     13// Update Count     : 14
    1414//
    1515
     
    2020#include "Common/utility.h"      // for printAll, cloneAll, deleteAll, maybe...
    2121#include "Declaration.h"         // for NamedTypeDecl, DeclarationWithType
    22 #include "LinkageSpec.h"         // for Spec, Cforall, linkageName
     22#include "Parser/LinkageSpec.h"  // for Spec, Cforall, linkageName
    2323#include "Type.h"                // for Type, Type::StorageClasses
    2424
     
    4444
    4545        if ( linkage != LinkageSpec::Cforall ) {
    46                 os << LinkageSpec::name( linkage ) << " ";
     46                os << LinkageSpec::linkageName( linkage ) << " ";
    4747        } // if
    4848        get_storageClasses().print( os );
     
    7878}
    7979
    80 const char * TypedefDecl::typeString() const { return "typedef"; }
     80std::string TypedefDecl::typeString() const { return "typedef"; }
    8181
    8282// Local Variables: //
  • src/SynTree/ObjectDecl.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Dec 16 15:12:03 2019
    13 // Update Count     : 61
     12// Last Modified On : Thu Mar 16 08:34:27 2017
     13// Update Count     : 59
    1414//
    1515
     
    2323#include "Expression.h"          // for Expression
    2424#include "Initializer.h"         // for Initializer
    25 #include "LinkageSpec.h"         // for Spec, linkageName, Cforall
     25#include "Parser/LinkageSpec.h"  // for Spec, linkageName, Cforall
    2626#include "Type.h"                // for Type, Type::StorageClasses, Type::Fu...
    2727
     
    4848
    4949        if ( linkage != LinkageSpec::Cforall ) {
    50                 os << LinkageSpec::name( linkage ) << " ";
     50                os << LinkageSpec::linkageName( linkage ) << " ";
    5151        } // if
    5252
  • src/SynTree/Statement.cc

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Mon Jan 20 16:03:00 2020
    13 // Update Count     : 71
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Sun Sep  3 20:46:44 2017
     13// Update Count     : 68
    1414//
    1515
     
    4646Statement::~Statement() {}
    4747
    48 ExprStmt::ExprStmt( Expression * expr ) : Statement(), expr( expr ) {}
    49 
    50 ExprStmt::ExprStmt( const ExprStmt & other ) : Statement( other ), expr( maybeClone( other.expr ) ) {}
     48ExprStmt::ExprStmt( Expression *expr ) : Statement(), expr( expr ) {}
     49
     50ExprStmt::ExprStmt( const ExprStmt &other ) : Statement( other ), expr( maybeClone( other.expr ) ) {}
    5151
    5252ExprStmt::~ExprStmt() {
     
    5454}
    5555
    56 void ExprStmt::print( std::ostream & os, Indenter indent ) const {
     56void ExprStmt::print( std::ostream &os, Indenter indent ) const {
    5757        os << "Expression Statement:" << endl << indent+1;
    5858        expr->print( os, indent+1 );
     
    6060
    6161
    62 AsmStmt::AsmStmt( bool voltile, Expression * instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels ) : Statement(), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ), gotolabels( gotolabels ) {}
     62AsmStmt::AsmStmt( bool voltile, Expression *instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels ) : Statement(), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ), gotolabels( gotolabels ) {}
    6363
    6464AsmStmt::AsmStmt( const AsmStmt & other ) : Statement( other ), voltile( other.voltile ), instruction( maybeClone( other.instruction ) ), gotolabels( other.gotolabels ) {
     
    7575}
    7676
    77 void AsmStmt::print( std::ostream & os, Indenter indent ) const {
     77void AsmStmt::print( std::ostream &os, Indenter indent ) const {
    7878        os << "Assembler Statement:" << endl;
    7979        os << indent+1 << "instruction: " << endl << indent;
     
    9696DirectiveStmt::DirectiveStmt( const std::string & directive ) : Statement(), directive( directive ) {}
    9797
    98 void DirectiveStmt::print( std::ostream & os, Indenter ) const {
     98void DirectiveStmt::print( std::ostream &os, Indenter ) const {
    9999        os << "GCC Directive:" << directive << endl;
    100100}
    101101
    102102
    103 const char * BranchStmt::brType[] = {
    104         "Goto", "Break", "Continue", "Fall Through", "Fall Through Default",
    105 };
     103const char *BranchStmt::brType[] = { "Goto", "Break", "Continue" };
    106104
    107105BranchStmt::BranchStmt( Label target, Type type ) throw ( SemanticErrorException ) :
     
    113111}
    114112
    115 BranchStmt::BranchStmt( Expression * computedTarget, Type type ) throw ( SemanticErrorException ) :
     113BranchStmt::BranchStmt( Expression *computedTarget, Type type ) throw ( SemanticErrorException ) :
    116114        Statement(), computedTarget( computedTarget ), type( type ) {
    117115        if ( type != BranchStmt::Goto || computedTarget == nullptr ) {
     
    120118}
    121119
    122 void BranchStmt::print( std::ostream & os, Indenter indent ) const {
    123         assert(type < 5);
     120void BranchStmt::print( std::ostream &os, Indenter indent ) const {
    124121        os << "Branch (" << brType[type] << ")" << endl ;
    125122        if ( target != "" ) os << indent+1 << "with target: " << target << endl;
     
    128125}
    129126
    130 ReturnStmt::ReturnStmt( Expression * expr ) : Statement(), expr( expr ) {}
     127ReturnStmt::ReturnStmt( Expression *expr ) : Statement(), expr( expr ) {}
    131128
    132129ReturnStmt::ReturnStmt( const ReturnStmt & other ) : Statement( other ), expr( maybeClone( other.expr ) ) {}
     
    136133}
    137134
    138 void ReturnStmt::print( std::ostream & os, Indenter indent ) const {
     135void ReturnStmt::print( std::ostream &os, Indenter indent ) const {
    139136        os << "Return Statement, returning: ";
    140137        if ( expr != nullptr ) {
     
    145142}
    146143
    147 IfStmt::IfStmt( Expression * condition, Statement * thenPart, Statement * elsePart, std::list<Statement *> initialization ):
     144IfStmt::IfStmt( Expression *condition, Statement *thenPart, Statement *elsePart, std::list<Statement *> initialization ):
    148145        Statement(), condition( condition ), thenPart( thenPart ), elsePart( elsePart ), initialization( initialization ) {}
    149146
     
    160157}
    161158
    162 void IfStmt::print( std::ostream & os, Indenter indent ) const {
     159void IfStmt::print( std::ostream &os, Indenter indent ) const {
    163160        os << "If on condition: " << endl;
    164161        os << indent+1;
     
    179176        thenPart->print( os, indent+1 );
    180177
    181         if ( elsePart != nullptr ) {
     178        if ( elsePart != 0 ) {
    182179                os << indent << "... else: " << endl;
    183180                os << indent+1;
     
    186183}
    187184
    188 SwitchStmt::SwitchStmt( Expression * condition, const std::list<Statement *> & statements ):
     185SwitchStmt::SwitchStmt( Expression * condition, const std::list<Statement *> &statements ):
    189186        Statement(), condition( condition ), statements( statements ) {
    190187}
     
    201198}
    202199
    203 void SwitchStmt::print( std::ostream & os, Indenter indent ) const {
     200void SwitchStmt::print( std::ostream &os, Indenter indent ) const {
    204201        os << "Switch on condition: ";
    205202        condition->print( os );
     
    211208}
    212209
    213 CaseStmt::CaseStmt( Expression * condition, const std::list<Statement *> & statements, bool deflt ) throw ( SemanticErrorException ) :
     210CaseStmt::CaseStmt( Expression *condition, const std::list<Statement *> &statements, bool deflt ) throw ( SemanticErrorException ) :
    214211        Statement(), condition( condition ), stmts( statements ), _isDefault( deflt ) {
    215         if ( isDefault() && condition != nullptr ) SemanticError( condition, "default case with condition: " );
     212        if ( isDefault() && condition != 0 ) SemanticError( condition, "default case with condition: " );
    216213}
    217214
     
    232229}
    233230
    234 void CaseStmt::print( std::ostream & os, Indenter indent ) const {
     231void CaseStmt::print( std::ostream &os, Indenter indent ) const {
    235232        if ( isDefault() ) os << indent << "Default ";
    236233        else {
     
    246243}
    247244
    248 WhileStmt::WhileStmt( Expression * condition, Statement * body, std::list< Statement * > & initialization, bool isDoWhile ):
     245WhileStmt::WhileStmt( Expression *condition, Statement *body, std::list< Statement * > & initialization, bool isDoWhile ):
    249246        Statement(), condition( condition), body( body), initialization( initialization ), isDoWhile( isDoWhile) {
    250247}
     
    259256}
    260257
    261 void WhileStmt::print( std::ostream & os, Indenter indent ) const {
     258void WhileStmt::print( std::ostream &os, Indenter indent ) const {
    262259        os << "While on condition: " << endl ;
    263260        condition->print( os, indent+1 );
     
    265262        os << indent << "... with body: " << endl;
    266263
    267         if ( body != nullptr ) body->print( os, indent+1 );
    268 }
    269 
    270 ForStmt::ForStmt( std::list<Statement *> initialization, Expression * condition, Expression * increment, Statement * body ):
     264        if ( body != 0 ) body->print( os, indent+1 );
     265}
     266
     267ForStmt::ForStmt( std::list<Statement *> initialization, Expression *condition, Expression *increment, Statement *body ):
    271268        Statement(), initialization( initialization ), condition( condition ), increment( increment ), body( body ) {
    272269}
     
    285282}
    286283
    287 void ForStmt::print( std::ostream & os, Indenter indent ) const {
     284void ForStmt::print( std::ostream &os, Indenter indent ) const {
    288285        Statement::print( os, indent ); // print labels
    289286
     
    308305        }
    309306
    310         if ( body != nullptr ) {
     307        if ( body != 0 ) {
    311308                os << "\n" << indent << "... with body: \n" << indent+1;
    312309                body->print( os, indent+1 );
     
    320317}
    321318
    322 ThrowStmt::ThrowStmt( const ThrowStmt & other ) :
     319ThrowStmt::ThrowStmt( const ThrowStmt &other ) :
    323320        Statement ( other ), kind( other.kind ), expr( maybeClone( other.expr ) ), target( maybeClone( other.target ) ) {
    324321}
     
    329326}
    330327
    331 void ThrowStmt::print( std::ostream & os, Indenter indent) const {
     328void ThrowStmt::print( std::ostream &os, Indenter indent) const {
    332329        if ( target ) os << "Non-Local ";
    333330        os << "Throw Statement, raising: ";
     
    339336}
    340337
    341 TryStmt::TryStmt( CompoundStmt * tryBlock, std::list<CatchStmt *> & handlers, FinallyStmt * finallyBlock ) :
     338TryStmt::TryStmt( CompoundStmt *tryBlock, std::list<CatchStmt *> &handlers, FinallyStmt *finallyBlock ) :
    342339        Statement(), block( tryBlock ),  handlers( handlers ), finallyBlock( finallyBlock ) {
    343340}
    344341
    345 TryStmt::TryStmt( const TryStmt & other ) : Statement( other ), block( maybeClone( other.block ) ), finallyBlock( maybeClone( other.finallyBlock ) ) {
     342TryStmt::TryStmt( const TryStmt &other ) : Statement( other ), block( maybeClone( other.block ) ), finallyBlock( maybeClone( other.finallyBlock ) ) {
    346343        cloneAll( other.handlers, handlers );
    347344}
     
    353350}
    354351
    355 void TryStmt::print( std::ostream & os, Indenter indent ) const {
     352void TryStmt::print( std::ostream &os, Indenter indent ) const {
    356353        os << "Try Statement" << endl;
    357354        os << indent << "... with block:" << endl << indent+1;
     
    366363
    367364        // finally block
    368         if ( finallyBlock != nullptr ) {
     365        if ( finallyBlock != 0 ) {
    369366                os << indent << "... and finally:" << endl << indent+1;
    370367                finallyBlock->print( os, indent+1 );
     
    372369}
    373370
    374 CatchStmt::CatchStmt( Kind kind, Declaration * decl, Expression * cond, Statement * body ) :
     371CatchStmt::CatchStmt( Kind kind, Declaration *decl, Expression *cond, Statement *body ) :
    375372        Statement(), kind ( kind ), decl ( decl ), cond ( cond ), body( body ) {
    376373                assertf( decl, "Catch clause must have a declaration." );
     
    386383}
    387384
    388 void CatchStmt::print( std::ostream & os, Indenter indent ) const {
     385void CatchStmt::print( std::ostream &os, Indenter indent ) const {
    389386        os << "Catch " << ((Terminate == kind) ? "Terminate" : "Resume") << " Statement" << endl;
    390387
     
    404401
    405402
    406 FinallyStmt::FinallyStmt( CompoundStmt * block ) : Statement(), block( block ) {
     403FinallyStmt::FinallyStmt( CompoundStmt *block ) : Statement(), block( block ) {
    407404}
    408405
     
    414411}
    415412
    416 void FinallyStmt::print( std::ostream & os, Indenter indent ) const {
     413void FinallyStmt::print( std::ostream &os, Indenter indent ) const {
    417414        os << "Finally Statement" << endl;
    418415        os << indent << "... with block:" << endl << indent+1;
     
    461458}
    462459
    463 void WaitForStmt::print( std::ostream & os, Indenter indent ) const {
     460void WaitForStmt::print( std::ostream &os, Indenter indent ) const {
    464461        os << "Waitfor Statement" << endl;
    465462        indent += 1;
     
    517514}
    518515
    519 void NullStmt::print( std::ostream & os, Indenter indent ) const {
     516void NullStmt::print( std::ostream &os, Indenter indent ) const {
    520517        os << "Null Statement" << endl;
    521518        Statement::print( os, indent );
     
    533530}
    534531
    535 void ImplicitCtorDtorStmt::print( std::ostream & os, Indenter indent ) const {
     532void ImplicitCtorDtorStmt::print( std::ostream &os, Indenter indent ) const {
    536533        os << "Implicit Ctor Dtor Statement" << endl;
    537534        os << indent << "... with Ctor/Dtor: ";
  • src/SynTree/Statement.h

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jan 10 14:13:24 2020
    13 // Update Count     : 85
     12// Last Modified On : Tue Mar 12 09:01:53 2019
     13// Update Count     : 83
    1414//
    1515
     
    257257        Statement * body;
    258258
    259         ForStmt( std::list<Statement *> initialization, Expression * condition = nullptr, Expression * increment = nullptr, Statement * body = nullptr );
     259        ForStmt( std::list<Statement *> initialization, Expression * condition = 0, Expression * increment = 0, Statement * body = 0 );
    260260        ForStmt( const ForStmt & other );
    261261        virtual ~ForStmt();
     
    357357        FinallyStmt * finallyBlock;
    358358
    359         TryStmt( CompoundStmt * tryBlock, std::list<CatchStmt *> & handlers, FinallyStmt * finallyBlock = nullptr );
     359        TryStmt( CompoundStmt * tryBlock, std::list<CatchStmt *> & handlers, FinallyStmt * finallyBlock = 0 );
    360360        TryStmt( const TryStmt & other );
    361361        virtual ~TryStmt();
  • src/SynTree/TupleExpr.cc

    r3d5701e r9fb8f01  
    5858
    5959bool TupleExpr::get_lvalue() const {
    60         return false;
     60        return result->get_lvalue();
    6161}
    6262
     
    7171        assertf( type->size() > index, "TupleIndexExpr index out of bounds: tuple size %d, requested index %d in expr %s", type->size(), index, toString( tuple ).c_str() );
    7272        set_result( (*std::next( type->get_types().begin(), index ))->clone() );
     73        // like MemberExpr, TupleIndexExpr is always an lvalue
     74        get_result()->set_lvalue( true );
    7375}
    7476
     
    8183
    8284bool TupleIndexExpr::get_lvalue() const {
    83         return tuple->get_lvalue();
     85        assert( result->get_lvalue() );
     86        return true;
    8487}
    8588
  • src/SynTree/TupleType.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:44:38 2019
    13 // Update Count     : 4
     12// Last Modified On : Wed Feb  1 17:10:58 2017
     13// Update Count     : 3
    1414//
    1515
     
    2020#include "Declaration.h"         // for Declaration, ObjectDecl
    2121#include "Initializer.h"         // for ListInit
    22 #include "LinkageSpec.h"         // for Cforall
     22#include "Parser/LinkageSpec.h"  // for Cforall
    2323#include "Type.h"                // for TupleType, Type, Type::Qualifiers
    2424
  • src/SynTree/Type.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Dec 15 16:52:37 2019
    13 // Update Count     : 49
     12// Last Modified On : Sun Aug  4 21:05:07 2019
     13// Update Count     : 45
    1414//
    1515#include "Type.h"
     
    2424using namespace std;
    2525
    26 // GENERATED START, DO NOT EDIT
    27 // GENERATED BY BasicTypes-gen.cc
    2826const char * BasicType::typeNames[] = {
    2927        "_Bool",
     
    4745        "float",
    4846        "float _Complex",
     47        //"float _Imaginary",
    4948        "_Float32x",
    5049        "_Float32x _Complex",
     
    5352        "double",
    5453        "double _Complex",
     54        //"double _Imaginary",
    5555        "_Float64x",
    5656        "_Float64x _Complex",
     
    6161        "long double",
    6262        "long double _Complex",
     63        //"long double _Imaginary",
    6364        "_Float128x",
    6465        "_Float128x _Complex",
    6566};
    66 // GENERATED END
     67static_assert(
     68        sizeof(BasicType::typeNames) / sizeof(BasicType::typeNames[0]) == BasicType::NUMBER_OF_BASIC_TYPES,
     69        "Each basic type name should have a corresponding kind enum value"
     70);
    6771
    6872Type::Type( const Qualifiers &tq, const std::list< Attribute * > & attributes ) : tq( tq ), attributes( attributes ) {}
     
    8185const char * Type::FuncSpecifiersNames[] = { "inline", "_Noreturn", "fortran" };
    8286const char * Type::StorageClassesNames[] = { "extern", "static", "auto", "register", "_Thread_local" };
    83 const char * Type::QualifiersNames[] = { "const", "restrict", "volatile", "mutex", "_Atomic" };
     87const char * Type::QualifiersNames[] = { "const", "restrict", "volatile", "lvalue", "mutex", "_Atomic" };
    8488
    8589Type * Type::stripDeclarator() {
  • src/SynTree/Type.h

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Wed Sep  4 09:58:00 2019
    13 // Update Count     : 170
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu Feb 14 17:11:24 2019
     13// Update Count     : 169
    1414//
    1515
     
    102102        }; // StorageClasses
    103103
    104         enum { Const = 1 << 0, Restrict = 1 << 1, Volatile = 1 << 2, Mutex = 1 << 3, Atomic = 1 << 4, NumTypeQualifier = 5 };
     104        enum { Const = 1 << 0, Restrict = 1 << 1, Volatile = 1 << 2, Lvalue = 1 << 3, Mutex = 1 << 4, Atomic = 1 << 5, NumTypeQualifier = 6 };
    105105        static const char * QualifiersNames[];
    106106        union Qualifiers {
    107                 enum { Mask = ~Restrict };
     107                enum { Mask = ~(Restrict | Lvalue) };
    108108                unsigned int val;
    109109                struct {
     
    111111                        bool is_restrict : 1;
    112112                        bool is_volatile : 1;
     113                        bool is_lvalue : 1;
    113114                        bool is_mutex : 1;
    114115                        bool is_atomic : 1;
     
    130131                bool operator>( Qualifiers other ) const { return *this != other && *this >= other; }
    131132                BFCommon( Qualifiers, NumTypeQualifier )
    132 
    133                 Qualifiers unify( Qualifiers const & other ) const {
    134                         int or_flags = Mask & (val | other.val);
    135                         int and_flags = val & other.val;
    136                         return Qualifiers( or_flags | and_flags );
    137                 }
    138133        }; // Qualifiers
    139134
     
    152147        bool get_volatile() const { return tq.is_volatile; }
    153148        bool get_restrict() const { return tq.is_restrict; }
     149        bool get_lvalue() const { return tq.is_lvalue; }
    154150        bool get_mutex() const { return tq.is_mutex; }
    155151        bool get_atomic() const { return tq.is_atomic; }
     
    157153        void set_volatile( bool newValue ) { tq.is_volatile = newValue; }
    158154        void set_restrict( bool newValue ) { tq.is_restrict = newValue; }
     155        void set_lvalue( bool newValue ) { tq.is_lvalue = newValue; }
    159156        void set_mutex( bool newValue ) { tq.is_mutex = newValue; }
    160157        void set_atomic( bool newValue ) { tq.is_atomic = newValue; }
  • src/SynTree/TypeDecl.cc

    r3d5701e r9fb8f01  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 15:26:14 2019
    13 // Update Count     : 21
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Aug  9 14:35:00 2017
     13// Update Count     : 6
    1414//
    1515
     
    2121#include "Type.h"            // for Type, Type::StorageClasses
    2222
    23 TypeDecl::TypeDecl( const std::string & name, Type::StorageClasses scs, Type * type, Kind kind, bool sized, Type * init ) : Parent( name, scs, type ), kind( kind ), sized( kind == Ttype || sized ), init( init ) {
     23TypeDecl::TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind, bool sized, Type * init ) : Parent( name, scs, type ), init( init ), sized( kind == Ttype || sized ), kind( kind ) {
    2424}
    2525
    26 TypeDecl::TypeDecl( const TypeDecl & other ) : Parent( other ), kind( other.kind ), sized( other.sized ), init( maybeClone( other.init ) ) {
     26TypeDecl::TypeDecl( const TypeDecl &other ) : Parent( other ), init( maybeClone( other.init ) ), sized( other.sized ), kind( other.kind ) {
    2727}
    2828
    2929TypeDecl::~TypeDecl() {
    30         delete init;
     30  delete init;
    3131}
    3232
    33 const char * TypeDecl::typeString() const {
    34         static const char * kindNames[] = { "sized data type", "sized object type", "sized function type", "sized tuple type" };
    35         static_assert( sizeof(kindNames)/sizeof(kindNames[0]) == TypeDecl::NUMBER_OF_KINDS, "typeString: kindNames is out of sync." );
    36         assertf( kind < TypeDecl::NUMBER_OF_KINDS, "TypeDecl kind is out of bounds." );
    37         return isComplete() ? kindNames[ kind ] : &kindNames[ kind ][ sizeof("sized") ]; // sizeof includes '\0'
     33std::string TypeDecl::typeString() const {
     34        static const std::string kindNames[] = { "object type", "function type", "tuple type" };
     35        assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1, "typeString: kindNames is out of sync." );
     36        assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
     37        return (isComplete() ? "sized " : "") + kindNames[ kind ];
    3838}
    3939
    40 const char * TypeDecl::genTypeString() const {
    41         static const char * kindNames[] = { "dtype", "otype", "ftype", "ttype" };
    42         static_assert( sizeof(kindNames)/sizeof(kindNames[0]) == TypeDecl::NUMBER_OF_KINDS, "genTypeString: kindNames is out of sync." );
    43         assertf( kind < TypeDecl::NUMBER_OF_KINDS, "TypeDecl kind is out of bounds." );
     40std::string TypeDecl::genTypeString() const {
     41        static const std::string kindNames[] = { "dtype", "ftype", "ttype" };
     42        assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1, "genTypeString: kindNames is out of sync." );
     43        assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
    4444        return kindNames[ kind ];
    4545}
    4646
    4747void TypeDecl::print( std::ostream &os, Indenter indent ) const {
    48         NamedTypeDecl::print( os, indent );
    49         if ( init ) {
    50                 os << std::endl << indent << "with type initializer: ";
    51                 init->print( os, indent + 1 );
    52         } // if
     48  NamedTypeDecl::print( os, indent );
     49  if ( init ) {
     50    os << std::endl << indent << "with type initializer: ";
     51    init->print( os, indent + 1 );
     52  }
    5353}
    5454
     55
    5556std::ostream & operator<<( std::ostream & os, const TypeDecl::Data & data ) {
    56         return os << data.kind << ", " << data.isComplete;
     57  return os << data.kind << ", " << data.isComplete;
    5758}
    5859
  • src/SynTree/module.mk

    r3d5701e r9fb8f01  
    1111## Created On       : Mon Jun  1 17:49:17 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Sat Dec 14 07:26:43 2019
    14 ## Update Count     : 2
     13## Last Modified On : Mon Jun  1 17:54:09 2015
     14## Update Count     : 1
    1515###############################################################################
    1616
    1717SRC_SYNTREE = \
     18      SynTree/Type.cc \
     19      SynTree/VoidType.cc \
     20      SynTree/BasicType.cc \
     21      SynTree/PointerType.cc \
     22      SynTree/ArrayType.cc \
     23      SynTree/ReferenceType.cc \
     24      SynTree/FunctionType.cc \
     25      SynTree/ReferenceToType.cc \
     26      SynTree/TupleType.cc \
     27      SynTree/TypeofType.cc \
     28      SynTree/AttrType.cc \
     29      SynTree/VarArgsType.cc \
     30      SynTree/ZeroOneType.cc \
     31      SynTree/Constant.cc \
     32      SynTree/Expression.cc \
     33      SynTree/TupleExpr.cc \
     34      SynTree/CommaExpr.cc \
     35      SynTree/TypeExpr.cc \
     36      SynTree/ApplicationExpr.cc \
    1837      SynTree/AddressExpr.cc \
    19       SynTree/AggregateDecl.cc \
    20       SynTree/ApplicationExpr.cc \
    21       SynTree/ArrayType.cc \
    22       SynTree/AttrType.cc \
    23       SynTree/Attribute.cc \
    24       SynTree/BasicType.cc \
    25       SynTree/CommaExpr.cc \
     38      SynTree/Statement.cc \
    2639      SynTree/CompoundStmt.cc \
    27       SynTree/Constant.cc \
    28       SynTree/DeclReplacer.cc \
    2940      SynTree/DeclStmt.cc \
    3041      SynTree/Declaration.cc \
    3142      SynTree/DeclarationWithType.cc \
    32       SynTree/Expression.cc \
     43      SynTree/ObjectDecl.cc \
    3344      SynTree/FunctionDecl.cc \
    34       SynTree/FunctionType.cc \
     45      SynTree/AggregateDecl.cc \
     46      SynTree/NamedTypeDecl.cc \
     47      SynTree/TypeDecl.cc \
    3548      SynTree/Initializer.cc \
    36       SynTree/LinkageSpec.cc \
    37       SynTree/NamedTypeDecl.cc \
    38       SynTree/ObjectDecl.cc \
    39       SynTree/PointerType.cc \
    40       SynTree/ReferenceToType.cc \
    41       SynTree/ReferenceType.cc \
    42       SynTree/Statement.cc \
    43       SynTree/TupleExpr.cc \
    44       SynTree/TupleType.cc \
    45       SynTree/Type.cc \
    46       SynTree/TypeDecl.cc \
    47       SynTree/TypeExpr.cc \
    4849      SynTree/TypeSubstitution.cc \
    49       SynTree/TypeofType.cc \
    50       SynTree/VarArgsType.cc \
    51       SynTree/VoidType.cc \
    52       SynTree/ZeroOneType.cc
     50      SynTree/Attribute.cc \
     51      SynTree/DeclReplacer.cc \
     52      SynTree/TopLvalue.cc
    5353
    5454SRC += $(SRC_SYNTREE)
  • src/Tuples/TupleAssignment.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:45:33 2019
    13 // Update Count     : 9
     12// Last Modified On : Fri Mar 17 09:43:03 2017
     13// Update Count     : 8
    1414//
    1515
     
    3434#include "InitTweak/GenInit.h"             // for genCtorInit
    3535#include "InitTweak/InitTweak.h"           // for getPointerBase, isAssignment
     36#include "Parser/LinkageSpec.h"            // for Cforall
    3637#include "ResolvExpr/Alternative.h"        // for AltList, Alternative
    3738#include "ResolvExpr/AlternativeFinder.h"  // for AlternativeFinder, simpleC...
     
    4041#include "ResolvExpr/TypeEnvironment.h"    // for TypeEnvironment
    4142#include "ResolvExpr/typeops.h"            // for combos
    42 #include "SynTree/LinkageSpec.h"           // for Cforall
    4343#include "SynTree/Declaration.h"           // for ObjectDecl
    4444#include "SynTree/Expression.h"            // for Expression, CastExpr, Name...
  • src/Tuples/TupleExpansion.cc

    r3d5701e r9fb8f01  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Dec 13 23:45:51 2019
    13 // Update Count     : 24
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Fri Jul 19 14:39:00 2019
     13// Update Count     : 22
    1414//
    1515
     
    2727#include "Common/utility.h"       // for CodeLocation
    2828#include "InitTweak/InitTweak.h"  // for getFunction
    29 #include "SynTree/LinkageSpec.h"  // for Spec, C, Intrinsic
     29#include "Parser/LinkageSpec.h"   // for Spec, C, Intrinsic
    3030#include "SynTree/Constant.h"     // for Constant
    3131#include "SynTree/Declaration.h"  // for StructDecl, DeclarationWithType
     
    304304                // produce the TupleType which aggregates the types of the exprs
    305305                std::list< Type * > types;
    306                 Type::Qualifiers qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Atomic | Type::Mutex );
     306                Type::Qualifiers qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Lvalue | Type::Atomic | Type::Mutex );
    307307                for ( Expression * expr : exprs ) {
    308308                        assert( expr->get_result() );
     
    361361        const ast::TypeInstType * isTtype( const ast::Type * type ) {
    362362                if ( const ast::TypeInstType * inst = dynamic_cast< const ast::TypeInstType * >( type ) ) {
    363                         if ( inst->base && inst->base->kind == ast::TypeDecl::Ttype ) {
     363                        if ( inst->base && inst->base->kind == ast::TypeVar::Ttype ) {
    364364                                return inst;
    365365                        }
  • src/cfa.make

    r3d5701e r9fb8f01  
     1
     2
    13CFACOMPILE = $(CFACC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) $(AM_CFLAGS) $(CFLAGS)
    24LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
    35        $(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \
    4         $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS)
     6        $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \
     7        $(AM_CFLAGS) $(CFLAGS)
    58
    69AM_V_CFA = $(am__v_CFA_@AM_V@)
     
    1922        $(am__mv) $$depbase.Tpo $$depbase.Plo
    2023
     24AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
     25am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
     26am__v_JAVAC_0 = @echo "  JAVAC   " $@;
     27am__v_JAVAC_1 =
     28
     29AM_V_GOC = $(am__v_GOC_@AM_V@)
     30am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
     31am__v_GOC_0 = @echo "  GOC     " $@;
     32am__v_GOC_1 =
     33
    2134UPPCC = u++
    2235UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
     
    2639am__v_UPP_0 = @echo "  UPP     " $@;
    2740am__v_UPP_1 =
    28 
    29 AM_V_GOC = $(am__v_GOC_@AM_V@)
    30 am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
    31 am__v_GOC_0 = @echo "  GOC     " $@;
    32 am__v_GOC_1 =
    33 
    34 AM_V_PY = $(am__v_PY_@AM_V@)
    35 am__v_PY_ = $(am__v_PY_@AM_DEFAULT_V@)
    36 am__v_PY_0 = @echo "  PYTHON  " $@;
    37 am__v_PY_1 =
    38 
    39 AM_V_RUST = $(am__v_RUST_@AM_V@)
    40 am__v_RUST_ = $(am__v_RUST_@AM_DEFAULT_V@)
    41 am__v_RUST_0 = @echo "  RUST    " $@;
    42 am__v_RUST_1 =
    43 
    44 AM_V_NODEJS = $(am__v_NODEJS_@AM_V@)
    45 am__v_NODEJS_ = $(am__v_NODEJS_@AM_DEFAULT_V@)
    46 am__v_NODEJS_0 = @echo "  NODEJS  " $@;
    47 am__v_NODEJS_1 =
    48 
    49 AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
    50 am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
    51 am__v_JAVAC_0 = @echo "  JAVAC   " $@;
    52 am__v_JAVAC_1 =
  • src/main.cc

    r3d5701e r9fb8f01  
    1010// Created On       : Fri May 15 23:12:02 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Feb  8 08:33:50 2020
    13 // Update Count     : 633
     12// Last Modified On : Fri Aug 23 06:50:08 2019
     13// Update Count     : 607
    1414//
    1515
     
    2020#include <cstdio>                           // for fopen, FILE, fclose, stdin
    2121#include <cstdlib>                          // for exit, free, abort, EXIT_F...
    22 #include <csignal>                          // for signal, SIGABRT, SIGSEGV
     22#include <csignal>                         // for signal, SIGABRT, SIGSEGV
    2323#include <cstring>                          // for index
    2424#include <fstream>                          // for ofstream
     
    2828#include <list>                             // for list
    2929#include <string>                           // for char_traits, operator<<
    30 
    31 using namespace std;
    32 
    3330
    3431#include "CompilationState.h"
     
    5653#include "InitTweak/GenInit.h"              // for genInit
    5754#include "MakeLibCfa.h"                     // for makeLibCfa
     55#include "Parser/LinkageSpec.h"             // for Spec, Cforall, Intrinsic
    5856#include "Parser/ParseNode.h"               // for DeclarationNode, buildList
    5957#include "Parser/TypedefTable.h"            // for TypedefTable
     
    6159#include "ResolvExpr/Resolver.h"            // for resolve
    6260#include "SymTab/Validate.h"                // for validate
    63 #include "SynTree/LinkageSpec.h"            // for Spec, Cforall, Intrinsic
     61#include "SynTree/TopLvalue.h"              // for assertTopLvalue, clearInn...
    6462#include "SynTree/Declaration.h"            // for Declaration
    6563#include "SynTree/Visitor.h"                // for acceptAll
     
    6765#include "Virtual/ExpandCasts.h"            // for expandCasts
    6866
     67
     68using namespace std;
    6969
    7070static void NewPass( const char * const name ) {
     
    9898static bool waiting_for_gdb = false;                                    // flag to set cfa-cpp to wait for gdb on start
    9999
    100 static string PreludeDirector = "";
     100static std::string PreludeDirector = "";
    101101
    102102static void parse_cmdline( int argc, char *argv[] );
     
    105105
    106106static void backtrace( int start ) {                                    // skip first N stack frames
    107         enum { Frames = 50, };                                                          // maximum number of stack frames
     107        enum { Frames = 50 };
    108108        void * array[Frames];
    109         size_t size = ::backtrace( array, Frames );
     109        int size = ::backtrace( array, Frames );
    110110        char ** messages = ::backtrace_symbols( array, size ); // does not demangle names
    111111
     
    114114
    115115        // skip last 2 stack frames after main
    116         for ( unsigned int i = start; i < size - 2 && messages != nullptr; i += 1 ) {
     116        for ( int i = start; i < size - 2 && messages != nullptr; i += 1 ) {
    117117                char * mangled_name = nullptr, * offset_begin = nullptr, * offset_end = nullptr;
    118 
    119                 for ( char * p = messages[i]; *p; p += 1 ) {    // find parantheses and +offset
     118                for ( char *p = messages[i]; *p; ++p ) {        // find parantheses and +offset
    120119                        if ( *p == '(' ) {
    121120                                mangled_name = p;
     
    155154} // backtrace
    156155
    157 #define SIGPARMS int sig __attribute__(( unused )), siginfo_t * sfp __attribute__(( unused )), ucontext_t * cxt __attribute__(( unused ))
    158 
    159 static void Signal( int sig, void (*handler)(SIGPARMS), int flags ) {
    160         struct sigaction act;
    161 
    162         act.sa_sigaction = (void (*)(int, siginfo_t *, void *))handler;
    163         act.sa_flags = flags;
    164 
    165         if ( sigaction( sig, &act, nullptr ) == -1 ) {
    166             cerr << "*CFA runtime error* problem installing signal handler, error(" << errno << ") " << strerror( errno ) << endl;
    167             _exit( EXIT_FAILURE );
    168         } // if
    169 } // Signal
    170 
    171 static void sigSegvBusHandler( SIGPARMS ) {
    172         if ( sfp->si_addr == nullptr ) {
    173                 cerr << "Null pointer (nullptr) dereference." << endl;
    174         } else {
    175                 cerr << (sig == SIGSEGV ? "Segment fault" : "Bus error") << " at memory location " << sfp->si_addr << "." << endl
    176                          << "Possible cause is reading outside the address space or writing to a protected area within the address space with an invalid pointer or subscript." << endl;
    177         } // if
     156static void sigSegvBusHandler( int sig_num ) {
     157        cerr << "*CFA runtime error* program cfa-cpp terminated with "
     158                 <<     (sig_num == SIGSEGV ? "segment fault" : "bus error")
     159                 << "." << endl;
    178160        backtrace( 2 );                                                                         // skip first 2 stack frames
     161        //_exit( EXIT_FAILURE );
    179162        abort();                                                                                        // cause core dump for debugging
    180163} // sigSegvBusHandler
    181164
    182 static void sigFpeHandler( SIGPARMS ) {
    183         const char * msg;
    184 
    185         switch ( sfp->si_code ) {
    186           case FPE_INTDIV: case FPE_FLTDIV: msg = "divide by zero"; break;
    187           case FPE_FLTOVF: msg = "overflow"; break;
    188           case FPE_FLTUND: msg = "underflow"; break;
    189           case FPE_FLTRES: msg = "inexact result"; break;
    190           case FPE_FLTINV: msg = "invalid operation"; break;
    191           default: msg = "unknown";
    192         } // choose
    193         cerr << "Computation error " << msg << " at location " << sfp->si_addr << endl
    194                  << "Possible cause is constant-expression evaluation invalid." << endl;
    195         backtrace( 2 );                                                                         // skip first 2 stack frames
    196         abort();                                                                                        // cause core dump for debugging
    197 } // sigFpeHandler
    198 
    199 static void sigAbortHandler( SIGPARMS ) {
     165static void sigAbortHandler( __attribute__((unused)) int sig_num ) {
    200166        backtrace( 6 );                                                                         // skip first 6 stack frames
    201         Signal( SIGABRT, (void (*)(SIGPARMS))SIG_DFL, SA_SIGINFO );     // reset default signal handler
     167        signal( SIGABRT, SIG_DFL);                                                      // reset default signal handler
    202168        raise( SIGABRT );                                                                       // reraise SIGABRT
    203169} // sigAbortHandler
     
    208174        list< Declaration * > translationUnit;
    209175
    210         Signal( SIGSEGV, sigSegvBusHandler, SA_SIGINFO );
    211         Signal( SIGBUS, sigSegvBusHandler, SA_SIGINFO );
    212         Signal( SIGFPE, sigFpeHandler, SA_SIGINFO );
    213         Signal( SIGABRT, sigAbortHandler, SA_SIGINFO );
    214 
    215         // cout << "main" << endl;
     176        signal( SIGSEGV, sigSegvBusHandler );
     177        signal( SIGBUS, sigSegvBusHandler );
     178        signal( SIGABRT, sigAbortHandler );
     179
     180        // std::cout << "main" << std::endl;
    216181        // for ( int i = 0; i < argc; i += 1 ) {
    217         //      cout << '\t' << argv[i] << endl;
     182        //      std::cout << '\t' << argv[i] << std::endl;
    218183        // } // for
    219184
     
    222187
    223188        if ( waiting_for_gdb ) {
    224                 cerr << "Waiting for gdb" << endl;
    225                 cerr << "run :" << endl;
    226                 cerr << "  gdb attach " << getpid() << endl;
     189                std::cerr << "Waiting for gdb" << std::endl;
     190                std::cerr << "run :" << std::endl;
     191                std::cerr << "  gdb attach " << getpid() << std::endl;
    227192                raise(SIGSTOP);
    228193        } // if
     
    294259                Stats::Time::StopBlock();
    295260
     261                //std::cerr << "Post-Parse Check" << std::endl;
     262                clearInnerLvalue( translationUnit );
     263                assertTopLvalue( translationUnit );
     264
    296265                // add the assignment statement after the initialization of a type parameter
    297266                PASS( "Validate", SymTab::validate( translationUnit, symtabp ) );
     
    312281                } // if
    313282
     283                assertTopLvalue( translationUnit );
    314284                PASS( "Fix Labels", ControlStruct::fixLabels( translationUnit ) );
     285                assertTopLvalue( translationUnit );
    315286                PASS( "Fix Names", CodeGen::fixNames( translationUnit ) );
     287                assertTopLvalue( translationUnit );
    316288                PASS( "Gen Init", InitTweak::genInit( translationUnit ) );
     289                assertTopLvalue( translationUnit );
    317290                PASS( "Expand Member Tuples" , Tuples::expandMemberTuples( translationUnit ) );
     291                assertTopLvalue( translationUnit );
    318292                if ( libcfap ) {
    319293                        // generate the bodies of cfa library functions
     
    339313                } // if
    340314
     315                assertTopLvalue( translationUnit );
     316
    341317                PASS( "Resolve", ResolvExpr::resolve( translationUnit ) );
    342318                if ( exprp ) {
     
    345321                } // if
    346322
     323                clearInnerLvalue( translationUnit );
     324                assertTopLvalue( translationUnit );
     325
    347326                // fix ObjectDecl - replaces ConstructorInit nodes
    348327                PASS( "Fix Init", InitTweak::fix( translationUnit, buildingLibrary() ) );
     328                clearInnerLvalue( translationUnit );
     329                assertTopLvalue( translationUnit );
    349330                if ( ctorinitp ) {
    350331                        dump ( translationUnit );
     
    353334
    354335                PASS( "Expand Unique Expr", Tuples::expandUniqueExpr( translationUnit ) ); // xxx - is this the right place for this? want to expand ASAP so tha, sequent 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
     336                assertTopLvalue( translationUnit );
    355337
    356338                PASS( "Translate EHM" , ControlStruct::translateEHM( translationUnit ) );
     339                assertTopLvalue( translationUnit );
    357340
    358341                PASS( "Gen Waitfor" , Concurrency::generateWaitFor( translationUnit ) );
     342                clearInnerLvalue( translationUnit );
     343                assertTopLvalue( translationUnit );
    359344
    360345                PASS( "Convert Specializations",  GenPoly::convertSpecializations( translationUnit ) ); // needs to happen before tuple types are expanded
     346                clearInnerLvalue( translationUnit );
     347                assertTopLvalue( translationUnit );
    361348
    362349                PASS( "Expand Tuples", Tuples::expandTuples( translationUnit ) ); // xxx - is this the right place for this?
     350                assertTopLvalue( translationUnit );
    363351
    364352                if ( tuplep ) {
     
    368356
    369357                PASS( "Virtual Expand Casts", Virtual::expandCasts( translationUnit ) ); // Must come after translateEHM
     358                assertTopLvalue( translationUnit );
    370359
    371360                PASS( "Instantiate Generics", GenPoly::instantiateGeneric( translationUnit ) );
     
    374363                        return EXIT_SUCCESS;
    375364                } // if
    376 
     365                clearInnerLvalue( translationUnit );
     366                assertTopLvalue( translationUnit );
    377367                PASS( "Convert L-Value", GenPoly::convertLvalue( translationUnit ) );
     368                clearInnerLvalue( translationUnit );
     369                assertTopLvalue( translationUnit );
    378370
    379371                if ( bboxp ) {
     
    382374                } // if
    383375                PASS( "Box", GenPoly::box( translationUnit ) );
     376                clearInnerLvalue( translationUnit );
     377                assertTopLvalue( translationUnit );
    384378
    385379                if ( bcodegenp ) {
     
    393387
    394388                CodeTools::fillLocations( translationUnit );
     389                assertTopLvalue( translationUnit );
    395390                PASS( "Code Gen", CodeGen::generate( translationUnit, *output, ! genproto, prettycodegenp, true, linemarks ) );
    396391
     
    424419                return EXIT_FAILURE;
    425420        } catch ( ... ) {
    426                 exception_ptr eptr = current_exception();
     421                std::exception_ptr eptr = std::current_exception();
    427422                try {
    428423                        if (eptr) {
    429                                 rethrow_exception(eptr);
     424                                std::rethrow_exception(eptr);
    430425                        } else {
    431                                 cerr << "Exception Uncaught and Unknown" << endl;
    432                         } // if
    433                 } catch(const exception& e) {
    434                         cerr << "Uncaught Exception \"" << e.what() << "\"\n";
     426                                std::cerr << "Exception Uncaught and Unknown" << std::endl;
     427                        } // if
     428                } catch(const std::exception& e) {
     429                        std::cerr << "Uncaught Exception \"" << e.what() << "\"\n";
    435430                } // try
    436431                return EXIT_FAILURE;
     
    443438
    444439
    445 static const char optstring[] = ":c:ghlLmNnpP:S:twW:D:";
     440static const char optstring[] = ":hlLmNnpP:S:twW:D:";
    446441
    447442enum { PreludeDir = 128 };
    448443static struct option long_opts[] = {
    449         { "colors", required_argument, nullptr, 'c' },
    450         { "gdb", no_argument, nullptr, 'g' },
    451444        { "help", no_argument, nullptr, 'h' },
    452445        { "libcfa", no_argument, nullptr, 'l' },
     
    460453        { "statistics", required_argument, nullptr, 'S' },
    461454        { "tree", no_argument, nullptr, 't' },
     455        { "gdb", no_argument, nullptr, 'g' },
    462456        { "", no_argument, nullptr, 0 },                                        // -w
    463457        { "", no_argument, nullptr, 0 },                                        // -W
     
    467461
    468462static const char * description[] = {
    469         "diagnostic color: never, always, or auto.",          // -c
    470         "wait for gdb to attach",                             // -g
    471         "print help message",                                 // -h
    472         "generate libcfa.c",                                  // -l
    473         "generate line marks",                                // -L
    474         "do not replace main",                                // -m
    475         "do not generate line marks",                         // -N
    476         "do not read prelude",                                // -n
     463        "print help message",                                                           // -h
     464        "generate libcfa.c",                                                            // -l
     465        "generate line marks",                                                          // -L
     466        "do not replace main",                                                          // -m
     467        "do not generate line marks",                                           // -N
     468        "do not read prelude",                                                          // -n
    477469        "generate prototypes for prelude functions",            // -p
    478         "print",                                              // -P
     470        "print",                                                                                        // -P
    479471        "<directory> prelude directory for debug/nodebug",      // no flag
    480472        "<option-list> enable profiling information:\n          counters,heap,time,all,none", // -S
    481         "building cfa standard lib",                          // -t
    482         "",                                                   // -w
    483         "",                                                   // -W
    484         "",                                                   // -D
     473        "building cfa standard lib",                                                                    // -t
     474        "wait for gdb to attach",                                                                       // -g
     475        "",                                                                                                     // -w
     476        "",                                                                                                     // -W
     477        "",                                                                                                     // -D
    485478}; // description
    486479
     
    550543        while ( (c = getopt_long( argc, argv, optstring, long_opts, nullptr )) != -1 ) {
    551544                switch ( c ) {
    552                   case 'c':                                                                             // diagnostic colors
    553                         if ( strcmp( optarg, "always" ) == 0 ) {
    554                                 ErrorHelpers::colors = ErrorHelpers::Colors::Always;
    555                         } else if ( strcmp( optarg, "never" ) == 0 ) {
    556                                 ErrorHelpers::colors = ErrorHelpers::Colors::Never;
    557                         } else if ( strcmp( optarg, "auto" ) == 0 ) {
    558                                 ErrorHelpers::colors = ErrorHelpers::Colors::Auto;
    559                         } // if
    560                         break;
    561545                  case 'h':                                                                             // help message
    562546                        usage( argv );                                                          // no return
  • tests/.expect/alloc-ERROR.txt

    r3d5701e r9fb8f01  
    1 alloc.cfa:310:1 error: No reasonable alternatives for expression Applying untyped:
     1alloc.cfa:265:1 error: No reasonable alternatives for expression Applying untyped:
    22  Name: ?=?
    33...to:
     
    1919
    2020
    21 alloc.cfa:311:1 error: No reasonable alternatives for expression Applying untyped:
     21alloc.cfa:266:1 error: No reasonable alternatives for expression Applying untyped:
    2222  Name: ?=?
    2323...to:
     
    3939
    4040
    41 alloc.cfa:312:1 error: No reasonable alternatives for expression Applying untyped:
     41alloc.cfa:267:1 error: No reasonable alternatives for expression Applying untyped:
    4242  Name: ?=?
    4343...to:
     
    5050
    5151
    52 alloc.cfa:313:1 error: No reasonable alternatives for expression Applying untyped:
     52alloc.cfa:268:1 error: No reasonable alternatives for expression Applying untyped:
    5353  Name: ?=?
    5454...to:
  • tests/.expect/alloc.txt

    r3d5701e r9fb8f01  
    22CFA malloc 0xdeadbeef
    33CFA alloc 0xdeadbeef
    4 CFA alloc, fill dededede
    5 CFA alloc, fill 3
     4CFA alloc, fill ffffffff
    65
    76C   array calloc, fill 0
     
    1110CFA array alloc, no fill
    12110xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef
    13 CFA array alloc, fill 0xde
    14 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede
    15 CFA array alloc, fill 0xef
    16 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef
    17 CFA array alloc, fill from array
    18 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef, 0xefefefef 0xefefefef,
     12CFA array alloc, fill 0xff
     130xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff
    1914
    20 C realloc
    21 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef
     15C   realloc
     160xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef
    2217CFA realloc
    23 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0xefefefef 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101
     180xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101
    2419
    25 CFA resize array alloc
     20CFA resize alloc
    26210xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef
    2722CFA resize array alloc
     
    2924CFA resize array alloc
    30250xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef
    31 CFA resize array alloc
    32 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede
    33 CFA resize array alloc
    34 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef
    3526CFA resize array alloc, fill
    36 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0xdeadbeef 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0x1010101 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede 0xdededede
     270xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff
     28CFA resize array alloc, fill
     290xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff
     30CFA resize array alloc, fill
     310xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff 0xffffffff
    3732
    3833C   memalign 42 42.5
     
    4035CFA posix_memalign 42 42.5
    4136CFA posix_memalign 42 42.5
    42 CFA alloc_align 42 42.5
    43 CFA alloc_align 42 42.5
    44 CFA alloc_align fill 0xdededede -0x1.ededededededep+494
    45 CFA alloc_align fill 42 42.5
    46 CFA alloc_align 42 42.5
     37CFA aligned_alloc 42 42.5
     38CFA align_alloc 42 42.5
     39CFA align_alloc fill 0xffffffff -nan
    4740
    48 CFA array alloc_align
     41CFA array align_alloc
    494242 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5,
    50 CFA array alloc_align, fill
    51 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494,
    52 CFA array alloc_align, fill
    53 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5,
    54 CFA array alloc_align, fill array
    55 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5,
    56 CFA realloc array alloc_align
    57 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5, 42 42.5,
     43CFA array align_alloc, fill
     440xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan,
    5845
    59 CFA memset 0xdededede -0x1.ededededededep+494
    60 CFA memcpy 0xdededede -0x1.ededededededep+494
     46CFA memset 0xffffffff -nan
     47CFA memcpy 0xffffffff -nan
    6148
    6249CFA array memset
    63 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494,
     500xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan,
    6451CFA array memcpy
    65 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494, 0xdededede -0x1.ededededededep+494,
     520xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan, 0xffffffff -nan,
    6653
    6754CFA new initialize
  • tests/.expect/attributes.x64.txt

    r3d5701e r9fb8f01  
    784784signed int _X4apd7Fi_Fi_i_Fi_i___1(__attribute__ ((unused,unused,unused)) signed int (*__anonymous_object23)(__attribute__ ((unused)) signed int __anonymous_object24), __attribute__ ((unused,unused,unused)) signed int (*__anonymous_object25)(__attribute__ ((unused)) signed int __anonymous_object26));
    785785struct Vad {
    786     __attribute__ ((unused)) signed int :4;
    787     __attribute__ ((unused)) signed int :4;
    788     __attribute__ ((unused,unused)) signed int :6;
     786    __attribute__ ((unused)) signed int __anonymous_object27:4;
     787    __attribute__ ((unused)) signed int __anonymous_object28:4;
     788    __attribute__ ((unused,unused)) signed int __anonymous_object29:6;
    789789};
    790790static inline void _X12_constructorFv_S3Vad_autogen___1(struct Vad *_X4_dstS3Vad_1);
  • tests/.expect/attributes.x86.txt

    r3d5701e r9fb8f01  
    784784signed int _X4apd7Fi_Fi_i_Fi_i___1(__attribute__ ((unused,unused,unused)) signed int (*__anonymous_object23)(__attribute__ ((unused)) signed int __anonymous_object24), __attribute__ ((unused,unused,unused)) signed int (*__anonymous_object25)(__attribute__ ((unused)) signed int __anonymous_object26));
    785785struct Vad {
    786     __attribute__ ((unused)) signed int :4;
    787     __attribute__ ((unused)) signed int :4;
    788     __attribute__ ((unused,unused)) signed int :6;
     786    __attribute__ ((unused)) signed int __anonymous_object27:4;
     787    __attribute__ ((unused)) signed int __anonymous_object28:4;
     788    __attribute__ ((unused,unused)) signed int __anonymous_object29:6;
    789789};
    790790static inline void _X12_constructorFv_S3Vad_autogen___1(struct Vad *_X4_dstS3Vad_1);
  • tests/.expect/gccExtensions.x64.txt

    r3d5701e r9fb8f01  
    1212    asm volatile ( "mov %1, %0\n\t" "add $1, %0" : "=" "r" ( _X3dsti_2 ) :  :  );
    1313    asm volatile ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ) : "r" ( _X3srci_2 ) :  );
    14     asm ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ), "=r" ( _X3srci_2 ) : [ src ] "r" ( _X3dsti_2 ) : "r0" );
     14    asm ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ), "=r" ( _X3srci_2 ) : [ _X3srci_2 ] "r" ( _X3dsti_2 ) : "r0" );
    1515    L2: L1: asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5" :  : "r" ( _X3srci_2 ), "r" ( (&_X3dsti_2) ) : "r5", "memory" : L1, L2 );
    1616    double _Complex _X2c1Cd_2;
  • tests/.expect/gccExtensions.x86.txt

    r3d5701e r9fb8f01  
    1212    asm volatile ( "mov %1, %0\n\t" "add $1, %0" : "=" "r" ( _X3dsti_2 ) :  :  );
    1313    asm volatile ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ) : "r" ( _X3srci_2 ) :  );
    14     asm ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ), "=r" ( _X3srci_2 ) : [ src ] "r" ( _X3dsti_2 ) : "r0" );
     14    asm ( "mov %1, %0\n\t" "add $1, %0" : "=r" ( _X3dsti_2 ), "=r" ( _X3srci_2 ) : [ _X3srci_2 ] "r" ( _X3dsti_2 ) : "r0" );
    1515    L2: L1: asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5" :  : "r" ( _X3srci_2 ), "r" ( (&_X3dsti_2) ) : "r5", "memory" : L1, L2 );
    1616    double _Complex _X2c1Cd_2;
  • tests/.expect/loopctrl.txt

    r3d5701e r9fb8f01  
    66A
    77A A A A A A A A A A
    8 A A A A A A A A A A A
    98B B B B B
    109C C C C C
     
    1312
    14130 1 2 3 4 5 6 7 8 9
    15 0 1 2 3 4 5 6 7 8 9 10
    16141 3 5 7 9
    171510 8 6 4 2
     
    3028N N N N N N N N N N
    31290 1 2 3 4 5 6 7 8 9
    32 0 1 2 3 4 5 6 7 8 9 10
    333010 9 8 7 6 5 4 3 2 1
    3431
  • tests/.expect/nested-types-ERR1.txt

    r3d5701e r9fb8f01  
    1 nested-types.cfa:83:1 error: Use of undefined type T
     1nested-types.cfa:70:1 error: Use of undefined type T
  • tests/.expect/nested-types-ERR2.txt

    r3d5701e r9fb8f01  
    1 nested-types.cfa:86:1 error: Use of undefined global type Z
    2 nested-types.cfa:87:1 error: Qualified type requires an aggregate on the left, but has: signed int
    3 nested-types.cfa:88:1 error: Undefined type in qualified type: Qualified Type:
     1nested-types.cfa:73:1 error: Use of undefined global type Z
     2nested-types.cfa:74:1 error: Qualified type requires an aggregate on the left, but has: signed int
     3nested-types.cfa:75:1 error: Undefined type in qualified type: Qualified Type:
    44  instance of struct S with body 1
    55  instance of type Z (not function type)
  • tests/.expect/rational.txt

    r3d5701e r9fb8f01  
    11constructor
    2 3/1 4/1 0/1 0/1 1/1
     23/1 4/1 0/1
    331/2 5/7
    442/3 -3/2
  • tests/.expect/references.txt

    r3d5701e r9fb8f01  
    36363
    37373 9 { 1., 7. }, [1, 2, 3]
    38 4
    3938Destructing a Y
    4039Destructing a Y
  • tests/.expect/time.txt

    r3d5701e r9fb8f01  
    1818Dividing that by 2 gives 2403.5 seconds
    19194807 seconds is 1 hours, 20 minutes, 7 seconds
    20 2020 Jan  5 14:01:40 (GMT)
    21 1970 Jan  5 14:00:00 (GMT)
    22 1973 Jan  2 06:59:00 (GMT)
  • tests/Makefile.am

    r3d5701e r9fb8f01  
    2424archiveerrors=
    2525
     26INSTALL_FLAGS=-in-tree
    2627DEBUG_FLAGS=-debug -O0
    2728
     
    3435
    3536# applies to both programs
    36 # since automake doesn't have support for CFA we have to
    3737AM_CFLAGS = $(if $(test), 2> $(test), ) \
    3838        -g \
     
    4242        -DIN_DIR="${abs_srcdir}/.in/"
    4343
    44 # get the desired cfa to test
    45 TARGET_CFA = $(if $(filter $(installed),yes), @CFACC_INSTALL@, @CFACC@)
    46 
    47 # adjust CC to current flags
    48 CC = $(if $(DISTCC_CFA_PATH),distcc $(DISTCC_CFA_PATH) ${ARCH_FLAGS},$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
    49 CFACC = $(CC)
    50 
    51 # get local binary for depedencies
    52 CFACCBIN = @CFACC@
    53 
    54 # adjusted CC but without the actual distcc call
    55 CFACCLOCAL = $(if $(DISTCC_CFA_PATH),$(DISTCC_CFA_PATH) ${ARCH_FLAGS},$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
     44AM_CFLAGS += ${DEBUG_FLAGS} ${INSTALL_FLAGS} ${ARCH_FLAGS}
     45CC = @CFACC@
    5646
    5747PRETTY_PATH=mkdir -p $(dir $(abspath ${@})) && cd ${srcdir} &&
     
    6757#----------------------------------------------------------------------------------------------------------------
    6858all-local :
    69         @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} ${quick_test}
     59        @+${TEST_PY} --debug=${debug}  --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} ${quick_test}
    7060
    7161all-tests :
    72         @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program
     62        @+${TEST_PY} --debug=${debug}  --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program
    7363
    7464clean-local :
     
    9787
    9888# Use for all tests, make sure the path are correct and all flags are added
    99 CFACOMPILETEST=$(PRETTY_PATH) $(CFACOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) $($(shell echo "${@}_FLAGSCFA" | sed 's/-\|\//_/g'))
     89CFACOMPILETEST=$(PRETTY_PATH) $(CFACOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) $($(shell echo "${@}_FLAGS" | sed 's/-\|\//_/g'))
     90
     91# Use for tests that either generate an executable, print directyl to stdout or the make command is expected to fail
     92CFATEST_STDOUT=$(CFACOMPILETEST) -o $(abspath ${@})
     93
     94# Use for tests where the make command is expecte to succeed but the expected.txt should be compared to stderr
     95CFATEST_STDERR=$(CFACOMPILETEST) 2> $(abspath ${@})
    10096
    10197#----------------------------------------------------------------------------------------------------------------
    10298
    10399# implicit rule so not all test require a rule
    104 # split into two steps to support compiling remotely using distcc
    105 # don't use distcc to do the linking because distcc doesn't do linking
    106 % : %.cfa $(CFACCBIN)
    107         $(CFACOMPILETEST) -c -o $(abspath ${@}).o
    108         $(CFACCLOCAL) $($(shell echo "${@}_FLAGSLD" | sed 's/-\|\//_/g')) $(abspath ${@}).o -o $(abspath ${@})
     100% : %.cfa $(CFACC)
     101        $(CFATEST_STDOUT)
    109102
    110 # implicit rule for c++ test
    111 # convient for testing the testsuite itself but not actuall used
    112103% : %.cpp
    113104        $(PRETTY_PATH) $(CXXCOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
    114105
    115106#------------------------------------------------------------------------------
    116 # TARGETS WITH CUSTOM FLAGS
     107# TARGET WITH STANDARD RULE BUT CUSTOM FLAGS
    117108#------------------------------------------------------------------------------
    118 # custom libs
    119 gmp_FLAGSLD= -lgmp
     109# Expected failures
     110declarationSpecifier_FLAGS= -CFA -XCFA -p
     111gccExtensions_FLAGS= -CFA -XCFA -p
     112extension_FLAGS= -CFA -XCFA -p
     113attributes_FLAGS= -CFA -XCFA -p
     114functions_FLAGS= -CFA -XCFA -p
     115KRfunctions_FLAGS= -CFA -XCFA -p
     116gmp_FLAGS= -lgmp
    120117
    121118#------------------------------------------------------------------------------
    122 # Generated code
    123 GENERATED_CODE = declarationSpecifier gccExtensions extension attributes functions KRfunctions
    124 $(GENERATED_CODE): % : %.cfa $(CFACCBIN)
    125         $(CFACOMPILETEST) -CFA -XCFA -p -c -fsyntax-only -o $(abspath ${@})
    126 
    127 # Use for tests where the make command is expected to succeed but the expected.txt should be compared to stderr
    128 EXPECT_STDERR = builtins/sync warnings/self-assignment
    129 $(EXPECT_STDERR): % : %.cfa $(CFACCBIN)
    130         $(CFACOMPILETEST) -c -fsyntax-only 2> $(abspath ${@})
     119# Expected failures
     120completeTypeError_FLAGS= -DERR1
    131121
    132122#------------------------------------------------------------------------------
    133123# CUSTOM TARGET
    134124#------------------------------------------------------------------------------
    135 # expected failures
    136 # use custom target since they require a custom define and custom dependencies
    137 alloc-ERROR : alloc.cfa $(CFACCBIN)
    138         $(CFACOMPILETEST) -DERR1 -c -fsyntax-only -o $(abspath ${@})
     125typedefRedef-ERR1: typedefRedef.cfa $(CFACC)
     126        $(CFATEST_STDOUT) -DERR1
    139127
    140 typedefRedef-ERR1 : typedefRedef.cfa $(CFACCBIN)
    141         $(CFACOMPILETEST) -DERR1 -c -fsyntax-only -o $(abspath ${@})
     128alloc-ERROR: alloc.cfa $(CFACC)
     129        $(CFATEST_STDOUT) -DERR1
    142130
    143 nested-types-ERR1 : nested-types.cfa $(CFACCBIN)
    144         $(CFACOMPILETEST) -DERR1 -c -fsyntax-only -o $(abspath ${@})
     131nested-types-ERR1: nested-types.cfa $(CFACC)
     132        $(CFATEST_STDOUT) -DERR1
    145133
    146 nested-types-ERR2 : nested-types.cfa $(CFACCBIN)
    147         $(CFACOMPILETEST) -DERR2 -c -fsyntax-only -o $(abspath ${@})
     134nested-types-ERR2: nested-types.cfa $(CFACC)
     135        $(CFATEST_STDOUT) -DERR2
    148136
    149 raii/memberCtors-ERR1 : raii/memberCtors.cfa $(CFACCBIN)
    150         $(CFACOMPILETEST) -DERR1 -c -fsyntax-only -o $(abspath ${@})
     137raii/dtor-early-exit-ERR1: raii/dtor-early-exit.cfa $(CFACC)
     138        $(CFATEST_STDOUT) -DERR1
    151139
    152 raii/ctor-autogen-ERR1 : raii/ctor-autogen.cfa $(CFACCBIN)
    153         $(CFACOMPILETEST) -DERR1 -c -fsyntax-only -o $(abspath ${@})
     140raii/dtor-early-exit-ERR2: raii/dtor-early-exit.cfa $(CFACC)
     141        $(CFATEST_STDOUT) -DERR2
    154142
    155 raii/dtor-early-exit-ERR1 : raii/dtor-early-exit.cfa $(CFACCBIN)
    156         $(CFACOMPILETEST) -DERR1 -c -fsyntax-only -o $(abspath ${@})
     143raii/memberCtors-ERR1: raii/memberCtors.cfa $(CFACC)
     144        $(CFATEST_STDOUT) -DERR1
    157145
    158 raii/dtor-early-exit-ERR2 : raii/dtor-early-exit.cfa $(CFACCBIN)
    159         $(CFACOMPILETEST) -DERR2 -c -fsyntax-only -o $(abspath ${@})
     146raii/ctor-autogen-ERR1: raii/ctor-autogen.cfa $(CFACC)
     147        $(CFATEST_STDOUT) -DERR1
    160148
    161 #------------------------------------------------------------------------------
    162 # Other targets
     149#builtins
     150builtins/sync: builtins/sync.cfa $(CFACC)
     151        $(CFATEST_STDERR) -fsyntax-only
     152
     153# Warnings
     154warnings/self-assignment: warnings/self-assignment.cfa $(CFACC)
     155        $(CFATEST_STDERR) -fsyntax-only
  • tests/Makefile.in

    r3d5701e r9fb8f01  
    212212AWK = @AWK@
    213213BUILD_IN_TREE_FLAGS = @BUILD_IN_TREE_FLAGS@
    214 
    215 # adjust CC to current flags
    216 CC = $(if $(DISTCC_CFA_PATH),distcc $(DISTCC_CFA_PATH) ${ARCH_FLAGS},$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
     214CC = @CFACC@
    217215CCAS = @CCAS@
    218216CCASDEPMODE = @CCASDEPMODE@
    219217CCASFLAGS = @CCASFLAGS@
    220218CCDEPMODE = @CCDEPMODE@
    221 CFACC = $(CC)
    222 CFACC_INSTALL = @CFACC_INSTALL@
     219CFACC = @CFACC@
    223220CFACPP = @CFACPP@
    224221CFA_BACKEND_CC = @CFA_BACKEND_CC@
     
    251248FGREP = @FGREP@
    252249GREP = @GREP@
    253 HAS_DISTCC = @HAS_DISTCC@
    254250HOST_FLAGS = @HOST_FLAGS@
    255251INSTALL = @INSTALL@
     
    358354LTCFACOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
    359355        $(LIBTOOLFLAGS) --mode=compile $(CFACC) $(DEFS) \
    360         $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(AM_CFLAGS) $(CFAFLAGS) $(CFLAGS)
     356        $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CFAFLAGS) $(CFAFLAGS) \
     357        $(AM_CFLAGS) $(CFLAGS)
    361358
    362359AM_V_CFA = $(am__v_CFA_@AM_V@)
     
    364361am__v_CFA_0 = @echo "  CFA     " $@;
    365362am__v_CFA_1 =
     363AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
     364am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
     365am__v_JAVAC_0 = @echo "  JAVAC   " $@;
     366am__v_JAVAC_1 =
     367AM_V_GOC = $(am__v_GOC_@AM_V@)
     368am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
     369am__v_GOC_0 = @echo "  GOC     " $@;
     370am__v_GOC_1 =
    366371UPPCC = u++
    367372UPPCOMPILE = $(UPPCC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_UPPFLAGS) $(UPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_CFLAGS) $(CFLAGS)
     
    370375am__v_UPP_0 = @echo "  UPP     " $@;
    371376am__v_UPP_1 =
    372 AM_V_GOC = $(am__v_GOC_@AM_V@)
    373 am__v_GOC_ = $(am__v_GOC_@AM_DEFAULT_V@)
    374 am__v_GOC_0 = @echo "  GOC     " $@;
    375 am__v_GOC_1 =
    376 AM_V_PY = $(am__v_PY_@AM_V@)
    377 am__v_PY_ = $(am__v_PY_@AM_DEFAULT_V@)
    378 am__v_PY_0 = @echo "  PYTHON  " $@;
    379 am__v_PY_1 =
    380 AM_V_RUST = $(am__v_RUST_@AM_V@)
    381 am__v_RUST_ = $(am__v_RUST_@AM_DEFAULT_V@)
    382 am__v_RUST_0 = @echo "  RUST    " $@;
    383 am__v_RUST_1 =
    384 AM_V_NODEJS = $(am__v_NODEJS_@AM_V@)
    385 am__v_NODEJS_ = $(am__v_NODEJS_@AM_DEFAULT_V@)
    386 am__v_NODEJS_0 = @echo "  NODEJS  " $@;
    387 am__v_NODEJS_1 =
    388 AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
    389 am__v_JAVAC_ = $(am__v_JAVAC_@AM_DEFAULT_V@)
    390 am__v_JAVAC_0 = @echo "  JAVAC   " $@;
    391 am__v_JAVAC_1 =
    392377debug = yes
    393378installed = no
    394379archiveerrors =
     380INSTALL_FLAGS = -in-tree
    395381DEBUG_FLAGS = -debug -O0
    396382quick_test = avl_test operators numericConstants expression enum array typeof cast raii/dtor-early-exit raii/init_once attributes
     
    400386
    401387# applies to both programs
    402 # since automake doesn't have support for CFA we have to
    403 AM_CFLAGS = $(if $(test), 2> $(test), ) \
    404         -g \
    405         -Wall \
    406         -Wno-unused-function \
    407         -quiet @CFA_FLAGS@ \
    408         -DIN_DIR="${abs_srcdir}/.in/"
    409 
    410 
    411 # get the desired cfa to test
    412 TARGET_CFA = $(if $(filter $(installed),yes), @CFACC_INSTALL@, @CFACC@)
    413 
    414 # get local binary for depedencies
    415 CFACCBIN = @CFACC@
    416 
    417 # adjusted CC but without the actual distcc call
    418 CFACCLOCAL = $(if $(DISTCC_CFA_PATH),$(DISTCC_CFA_PATH) ${ARCH_FLAGS},$(TARGET_CFA) ${DEBUG_FLAGS} ${ARCH_FLAGS})
     388AM_CFLAGS = $(if $(test), 2> $(test), ) -g -Wall -Wno-unused-function \
     389        -quiet @CFA_FLAGS@ -DIN_DIR="${abs_srcdir}/.in/" \
     390        ${DEBUG_FLAGS} ${INSTALL_FLAGS} ${ARCH_FLAGS}
    419391PRETTY_PATH = mkdir -p $(dir $(abspath ${@})) && cd ${srcdir} &&
    420392avl_test_SOURCES = avltree/avl_test.cfa avltree/avl0.cfa avltree/avl1.cfa avltree/avl2.cfa avltree/avl3.cfa avltree/avl4.cfa avltree/avl-private.cfa
     
    425397
    426398# Use for all tests, make sure the path are correct and all flags are added
    427 CFACOMPILETEST = $(PRETTY_PATH) $(CFACOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) $($(shell echo "${@}_FLAGSCFA" | sed 's/-\|\//_/g'))
     399CFACOMPILETEST = $(PRETTY_PATH) $(CFACOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) $($(shell echo "${@}_FLAGS" | sed 's/-\|\//_/g'))
     400
     401# Use for tests that either generate an executable, print directyl to stdout or the make command is expected to fail
     402CFATEST_STDOUT = $(CFACOMPILETEST) -o $(abspath ${@})
     403
     404# Use for tests where the make command is expecte to succeed but the expected.txt should be compared to stderr
     405CFATEST_STDERR = $(CFACOMPILETEST) 2> $(abspath ${@})
    428406
    429407#------------------------------------------------------------------------------
    430 # TARGETS WITH CUSTOM FLAGS
     408# TARGET WITH STANDARD RULE BUT CUSTOM FLAGS
    431409#------------------------------------------------------------------------------
    432 # custom libs
    433 gmp_FLAGSLD = -lgmp
     410# Expected failures
     411declarationSpecifier_FLAGS = -CFA -XCFA -p
     412gccExtensions_FLAGS = -CFA -XCFA -p
     413extension_FLAGS = -CFA -XCFA -p
     414attributes_FLAGS = -CFA -XCFA -p
     415functions_FLAGS = -CFA -XCFA -p
     416KRfunctions_FLAGS = -CFA -XCFA -p
     417gmp_FLAGS = -lgmp
    434418
    435419#------------------------------------------------------------------------------
    436 # Generated code
    437 GENERATED_CODE = declarationSpecifier gccExtensions extension attributes functions KRfunctions
    438 
    439 # Use for tests where the make command is expected to succeed but the expected.txt should be compared to stderr
    440 EXPECT_STDERR = builtins/sync warnings/self-assignment
     420# Expected failures
     421completeTypeError_FLAGS = -DERR1
    441422all: all-am
    442423
     
    790771#----------------------------------------------------------------------------------------------------------------
    791772all-local :
    792         @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} ${quick_test}
     773        @+${TEST_PY} --debug=${debug}  --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} ${quick_test}
    793774
    794775all-tests :
    795         @+${TEST_PY} --debug=${debug} --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program
     776        @+${TEST_PY} --debug=${debug}  --install=${installed} --archive-errors=${archiveerrors} ${concurrent} ${timeouts} --all # '@' => do not echo command (SILENT), '+' => allows recursive make from within python program
    796777
    797778clean-local :
     
    820801
    821802# implicit rule so not all test require a rule
    822 # split into two steps to support compiling remotely using distcc
    823 # don't use distcc to do the linking because distcc doesn't do linking
    824 % : %.cfa $(CFACCBIN)
    825         $(CFACOMPILETEST) -c -o $(abspath ${@}).o
    826         $(CFACCLOCAL) $($(shell echo "${@}_FLAGSLD" | sed 's/-\|\//_/g')) $(abspath ${@}).o -o $(abspath ${@})
    827 
    828 # implicit rule for c++ test
    829 # convient for testing the testsuite itself but not actuall used
     803% : %.cfa $(CFACC)
     804        $(CFATEST_STDOUT)
     805
    830806% : %.cpp
    831807        $(PRETTY_PATH) $(CXXCOMPILE) $(shell realpath --relative-to=${srcdir} ${<}) -o $(abspath ${@})
    832 $(GENERATED_CODE): % : %.cfa $(CFACCBIN)
    833         $(CFACOMPILETEST) -CFA -XCFA -p -c -fsyntax-only -o $(abspath ${@})
    834 $(EXPECT_STDERR): % : %.cfa $(CFACCBIN)
    835         $(CFACOMPILETEST) -c -fsyntax-only 2> $(abspath ${@})
    836808
    837809#------------------------------------------------------------------------------
    838810# CUSTOM TARGET
    839811#------------------------------------------------------------------------------
    840 # expected failures
    841 # use custom target since they require a custom define and custom dependencies
    842 alloc-ERROR : alloc.cfa $(CFACCBIN)
    843         $(CFACOMPILETEST) -DERR1 -c -fsyntax-only -o $(abspath ${@})
    844 
    845 typedefRedef-ERR1 : typedefRedef.cfa $(CFACCBIN)
    846         $(CFACOMPILETEST) -DERR1 -c -fsyntax-only -o $(abspath ${@})
    847 
    848 nested-types-ERR1 : nested-types.cfa $(CFACCBIN)
    849         $(CFACOMPILETEST) -DERR1 -c -fsyntax-only -o $(abspath ${@})
    850 
    851 nested-types-ERR2 : nested-types.cfa $(CFACCBIN)
    852         $(CFACOMPILETEST) -DERR2 -c -fsyntax-only -o $(abspath ${@})
    853 
    854 raii/memberCtors-ERR1 : raii/memberCtors.cfa $(CFACCBIN)
    855         $(CFACOMPILETEST) -DERR1 -c -fsyntax-only -o $(abspath ${@})
    856 
    857 raii/ctor-autogen-ERR1 : raii/ctor-autogen.cfa $(CFACCBIN)
    858         $(CFACOMPILETEST) -DERR1 -c -fsyntax-only -o $(abspath ${@})
    859 
    860 raii/dtor-early-exit-ERR1 : raii/dtor-early-exit.cfa $(CFACCBIN)
    861         $(CFACOMPILETEST) -DERR1 -c -fsyntax-only -o $(abspath ${@})
    862 
    863 raii/dtor-early-exit-ERR2 : raii/dtor-early-exit.cfa $(CFACCBIN)
    864         $(CFACOMPILETEST) -DERR2 -c -fsyntax-only -o $(abspath ${@})
    865 
    866 #------------------------------------------------------------------------------
    867 # Other targets
     812typedefRedef-ERR1: typedefRedef.cfa $(CFACC)
     813        $(CFATEST_STDOUT) -DERR1
     814
     815alloc-ERROR: alloc.cfa $(CFACC)
     816        $(CFATEST_STDOUT) -DERR1
     817
     818nested-types-ERR1: nested-types.cfa $(CFACC)
     819        $(CFATEST_STDOUT) -DERR1
     820
     821nested-types-ERR2: nested-types.cfa $(CFACC)
     822        $(CFATEST_STDOUT) -DERR2
     823
     824raii/dtor-early-exit-ERR1: raii/dtor-early-exit.cfa $(CFACC)
     825        $(CFATEST_STDOUT) -DERR1
     826
     827raii/dtor-early-exit-ERR2: raii/dtor-early-exit.cfa $(CFACC)
     828        $(CFATEST_STDOUT) -DERR2
     829
     830raii/memberCtors-ERR1: raii/memberCtors.cfa $(CFACC)
     831        $(CFATEST_STDOUT) -DERR1
     832
     833raii/ctor-autogen-ERR1: raii/ctor-autogen.cfa $(CFACC)
     834        $(CFATEST_STDOUT) -DERR1
     835
     836#builtins
     837builtins/sync: builtins/sync.cfa $(CFACC)
     838        $(CFATEST_STDERR) -fsyntax-only
     839
     840# Warnings
     841warnings/self-assignment: warnings/self-assignment.cfa $(CFACC)
     842        $(CFATEST_STDERR) -fsyntax-only
    868843
    869844# Tell versions [3.59,3.63) of GNU make to not export all variables.
  • tests/alloc.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed Feb  3 07:56:22 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Feb 16 09:21:13 2020
    13 // Update Count     : 405
     12// Last Modified On : Tue Nov  6 17:50:52 2018
     13// Update Count     : 339
    1414//
    1515
     
    1919#include <stdlib.h>                                                                             // posix_memalign
    2020#include <fstream.hfa>
    21 #include <stdlib.hfa>                                                                   // access C malloc, realloc
     21#include <stdlib.hfa>                                                                           // access C malloc, realloc
    2222
    2323int * foo( int * p, int c ) { return p; }
     
    2727int main( void ) {
    2828        size_t dim = 10;
    29         char fill = '\xde';
    30         int * p, * p1;
     29        char fill = '\xff';
     30        int * p;
    3131
    3232        // allocation, non-array types
    3333
     34        // int & r = malloc();
     35        // r = 0xdeadbeef;
     36        // printf( "C   malloc %#x\n", r );
     37        // free( &r );
     38
    3439        p = (int *)malloc( sizeof(*p) );                                        // C malloc, type unsafe
    3540        *p = 0xdeadbeef;
     
    4752        free( p );
    4853
    49         p = alloc_set( fill );                                                          // CFA alloc, fill
     54        p = alloc( fill );                                  // CFA alloc, fill
    5055        printf( "CFA alloc, fill %08x\n", *p );
    51         free( p );
    52 
    53         p = alloc_set( 3 );                                                                     // CFA alloc, fill
    54         printf( "CFA alloc, fill %d\n", *p );
    5556        free( p );
    5657
     
    7879        free( p );
    7980
    80         p = alloc_set( 2 * dim, fill );                                         // CFA array alloc, fill
     81        p = alloc( 2 * dim, fill );                         // CFA array alloc, fill
    8182        printf( "CFA array alloc, fill %#hhx\n", fill );
    8283        for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
    8384        printf( "\n" );
    84         free( p );
    85 
    86         p = alloc_set( 2 * dim, 0xdeadbeef );                           // CFA array alloc, fill
    87         printf( "CFA array alloc, fill %#hhx\n", 0xdeadbeef );
    88         for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
    89         printf( "\n" );
    9085        // do not free
    9186
    92         p1 = alloc_set( 2 * dim, p );                                           // CFA array alloc, fill
    93         printf( "CFA array alloc, fill from array\n" );
    94         for ( i; 2 * dim ) { printf( "%#x %#x, ", p[i], p1[i] ); }
    95         free( p1 );
    96         printf( "\n" );
    97 
    9887
    9988        // resize, non-array types
     
    10190
    10291        p = (int *)realloc( p, dim * sizeof(*p) );                      // C realloc
    103         printf( "C realloc\n" );
    104         for ( i; dim ) { printf( "%#x ", p[i] ); }
    105         printf( "\n" );
    106         // do not free
     92        for ( i; dim ) { p[i] = 0xdeadbeef; }
     93        printf( "C   realloc\n" );
     94        for ( i; dim ) { printf( "%#x ", p[i] ); }
     95        printf( "\n" );
    10796
    10897        p = realloc( p, 2 * dim * sizeof(*p) );             // CFA realloc
     
    119108        p = alloc( p, dim );                                // CFA resize array alloc
    120109        for ( i; dim ) { p[i] = 0xdeadbeef; }
     110        printf( "CFA resize alloc\n" );
     111        for ( i; dim ) { printf( "%#x ", p[i] ); }
     112        printf( "\n" );
     113
     114        p = alloc( p, 2 * dim );                            // CFA resize array alloc
     115        for ( i; dim ~ 2 * dim ) { p[i] = 0x1010101; }
    121116        printf( "CFA resize array alloc\n" );
    122         for ( i; dim ) { printf( "%#x ", p[i] ); }
    123         printf( "\n" );
    124         // do not free
    125 
    126         p = alloc( p, 2 * dim );                            // CFA resize array alloc
    127         for ( i; dim ~ 2 * dim ) { p[i] = 0x1010101; }          // fill upper part
     117        for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
     118        printf( "\n" );
     119
     120        p = alloc( p, dim );                                // CFA array alloc
    128121        printf( "CFA resize array alloc\n" );
    129         for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
    130         printf( "\n" );
    131         // do not free
    132 
    133         p = alloc( p, dim );                                // CFA resize array alloc
    134         printf( "CFA resize array alloc\n" );
    135         for ( i; dim ) { printf( "%#x ", p[i] ); }
    136         printf( "\n" );
    137         // do not free
    138 
    139         p = alloc_set( p, 3 * dim, fill );                                      // CFA resize array alloc, fill
    140         printf( "CFA resize array alloc\n" );
    141         for ( i; 3 * dim ) { printf( "%#x ", p[i] ); }
    142         printf( "\n" );
    143         // do not free
    144 
    145         p = alloc_set( p, dim, fill );                                          // CFA resize array alloc, fill
    146         printf( "CFA resize array alloc\n" );
    147         for ( i; dim ) { printf( "%#x ", p[i] ); }
    148         printf( "\n" );
    149         // do not free
    150 
    151         p = alloc_set( p, 3 * dim, fill );                                      // CFA resize array alloc, fill
     122        for ( i; dim ) { printf( "%#x ", p[i] ); }
     123        printf( "\n" );
     124
     125        free( p );
     126        p = 0;
     127
     128        p = alloc( p, dim, fill );                          // CFA array alloc, fill
    152129        printf( "CFA resize array alloc, fill\n" );
    153         for ( i; 3 * dim ) { printf( "%#x ", p[i] );; }
     130        for ( i; dim ) { printf( "%#x ", p[i] ); }
     131        printf( "\n" );
     132
     133        p = alloc( p, 2 * dim, fill );                      // CFA array alloc, fill
     134        printf( "CFA resize array alloc, fill\n" );
     135        for ( i; 2 * dim ) { printf( "%#x ", p[i] ); }
     136        printf( "\n" );
     137
     138        p = alloc( p, dim, fill );                          // CFA array alloc, fill
     139        printf( "CFA resize array alloc, fill\n" );
     140        for ( i; dim ) { printf( "%#x ", p[i] );; }
    154141        printf( "\n" );
    155142        free( p );
     
    185172        free( stp );
    186173
    187         stp = &(*alloc_align( Alignment)){ 42, 42.5 };          // CFA alloc_align
    188         assert( (uintptr_t)stp % Alignment == 0 );
    189         printf( "CFA alloc_align %d %g\n", stp->x, stp->y );
    190         free( stp );
    191 
    192         stp = &(*alloc_align( Alignment )){ 42, 42.5 };         // CFA alloc_align
    193         assert( (uintptr_t)stp % Alignment == 0 );
    194         printf( "CFA alloc_align %d %g\n", stp->x, stp->y );
    195         free( stp );
    196 
    197         stp = alloc_align_set( Alignment, fill );                       // CFA memalign, fill
    198         assert( (uintptr_t)stp % Alignment == 0 );
    199         printf( "CFA alloc_align fill %#x %a\n", stp->x, stp->y );
    200         free( stp );
    201 
    202         stp = alloc_align_set( Alignment, (Struct){ 42, 42.5 } ); // CFA memalign, fill
    203         assert( (uintptr_t)stp % Alignment == 0 );
    204         printf( "CFA alloc_align fill %d %g\n", stp->x, stp->y );
    205         // do not free
    206 
    207         stp = &(*alloc_align( stp, 4096 )){ 42, 42.5 };         // CFA realign
    208         assert( (uintptr_t)stp % 4096 == 0 );
    209         printf( "CFA alloc_align %d %g\n", stp->x, stp->y );
     174        stp = &(*aligned_alloc( Alignment )){ 42, 42.5 };     // CFA aligned_alloc
     175        assert( (uintptr_t)stp % Alignment == 0 );
     176        printf( "CFA aligned_alloc %d %g\n", stp->x, stp->y );
     177        free( stp );
     178
     179        stp = &(*align_alloc( Alignment )){ 42, 42.5 };       // CFA align_alloc
     180        assert( (uintptr_t)stp % Alignment == 0 );
     181        printf( "CFA align_alloc %d %g\n", stp->x, stp->y );
     182        free( stp );
     183
     184        stp = align_alloc( Alignment, fill );               // CFA memalign, fill
     185        assert( (uintptr_t)stp % Alignment == 0 );
     186        printf( "CFA align_alloc fill %#x %a\n", stp->x, stp->y );
    210187        free( stp );
    211188
     
    214191        printf( "\n" );
    215192
    216         stp = alloc_align( Alignment, dim );                // CFA array memalign
     193        stp = align_alloc( Alignment, dim );                // CFA array memalign
    217194        assert( (uintptr_t)stp % Alignment == 0 );
    218195        for ( i; dim ) { stp[i] = (Struct){ 42, 42.5 }; }
    219         printf( "CFA array alloc_align\n" );
     196        printf( "CFA array align_alloc\n" );
    220197        for ( i; dim ) { printf( "%d %g, ", stp[i].x, stp[i].y ); }
    221198        printf( "\n" );
    222199        free( stp );
    223200
    224         stp = alloc_align_set( Alignment, dim, fill );          // CFA array memalign, fill
    225         assert( (uintptr_t)stp % Alignment == 0 );
    226         printf( "CFA array alloc_align, fill\n" );
     201        stp = align_alloc( Alignment, dim, fill );          // CFA array memalign, fill
     202        assert( (uintptr_t)stp % Alignment == 0 );
     203        printf( "CFA array align_alloc, fill\n" );
    227204        for ( i; dim ) { printf( "%#x %a, ", stp[i].x, stp[i].y ); }
    228         printf( "\n" );
    229         free( stp );
    230 
    231         stp = alloc_align_set( Alignment, dim, (Struct){ 42, 42.5 } ); // CFA array memalign, fill
    232         assert( (uintptr_t)stp % Alignment == 0 );
    233         printf( "CFA array alloc_align, fill\n" );
    234         for ( i; dim ) { printf( "%d %g, ", stp[i].x, stp[i].y ); }
    235         printf( "\n" );
    236         // do not free
    237 
    238         stp1 = alloc_align_set( Alignment, dim, stp );          // CFA array memalign, fill
    239         assert( (uintptr_t)stp % Alignment == 0 );
    240         printf( "CFA array alloc_align, fill array\n" );
    241         for ( i; dim ) { printf( "%d %g, ", stp1[i].x, stp1[i].y ); }
    242         printf( "\n" );
    243         free( stp1 );
    244 
    245         stp = alloc_align( stp, 4096, dim );                            // CFA aligned realloc array
    246         assert( (uintptr_t)stp % 4096 == 0 );
    247         for ( i; dim ) { stp[i] = (Struct){ 42, 42.5 }; }
    248         printf( "CFA realloc array alloc_align\n" );
    249         for ( i; dim ) { printf( "%d %g, ", stp[i].x, stp[i].y ); }
    250205        printf( "\n" );
    251206        free( stp );
  • tests/builtins/sync.cfa

    r3d5701e r9fb8f01  
    44void foo() {
    55        volatile _Bool * vpB = 0; _Bool vB = 0;
    6         volatile char * vpc = 0; char * rpc = 0; char vc = 0;
    7         volatile short * vps = 0; short * rps = 0; short vs = 0;
    8         volatile int * vpi = 0; int * rpi = 0; int vi = 0;
    9         volatile long int * vpl = 0; long int * rpl = 0; long int vl = 0;
    10         volatile long long int * vpll = 0; long long int * rpll = 0; long long int vll = 0;
    11         #if defined(__SIZEOF_INT128__)
    12         volatile __int128 * vplll = 0; __int128 * rplll = 0; __int128 vlll = 0;
     6        volatile char * vp1 = 0; char * rp1 = 0; char v1 = 0;
     7        volatile short * vp2 = 0; short * rp2 = 0; short v2 = 0;
     8        volatile int * vp4 = 0; int * rp4 = 0; int v4 = 0;
     9        volatile long long int * vp8 = 0; long long int * rp8 = 0; long long int v8 = 0;
     10        #if defined(__SIZEOF_INT128__)
     11        volatile __int128 * vp16 = 0; __int128 * rp16 = 0; __int128 v16 = 0;
    1312        #endif
    1413        struct type * volatile * vpp = 0; struct type ** rpp = 0; struct type * vp = 0;
    1514
    16         { char ret; ret = __sync_fetch_and_add(vpc, vc); }
    17         { short ret; ret = __sync_fetch_and_add(vps, vs); }
    18         { int ret; ret = __sync_fetch_and_add(vpi, vi); }
    19         { long int ret; ret = __sync_fetch_and_add(vpl, vl); }
    20         { long long int ret; ret = __sync_fetch_and_add(vpll, vll); }
    21         #if defined(__SIZEOF_INT128__)
    22         { __int128 ret; ret = __sync_fetch_and_add(vplll, vlll); }
    23         #endif
    24 
    25         { char ret; ret = __sync_fetch_and_sub(vpc, vc); }
    26         { short ret; ret = __sync_fetch_and_sub(vps, vs); }
    27         { int ret; ret = __sync_fetch_and_sub(vpi, vi); }
    28         { long int ret; ret = __sync_fetch_and_sub(vpl, vl); }
    29         { long long int ret; ret = __sync_fetch_and_sub(vpll, vll); }
    30         #if defined(__SIZEOF_INT128__)
    31         { __int128 ret; ret = __sync_fetch_and_sub(vplll, vlll); }
    32         #endif
    33 
    34         { char ret; ret = __sync_fetch_and_or(vpc, vc); }
    35         { short ret; ret = __sync_fetch_and_or(vps, vs); }
    36         { int ret; ret = __sync_fetch_and_or(vpi, vi); }
    37         { long int ret; ret = __sync_fetch_and_or(vpl, vl); }
    38         { long long int ret; ret = __sync_fetch_and_or(vpll, vll); }
    39         #if defined(__SIZEOF_INT128__)
    40         { __int128 ret; ret = __sync_fetch_and_or(vplll, vlll); }
    41         #endif
    42 
    43         { char ret; ret = __sync_fetch_and_and(vpc, vc); }
    44         { short ret; ret = __sync_fetch_and_and(vps, vs); }
    45         { int ret; ret = __sync_fetch_and_and(vpi, vi); }
    46         { long int ret; ret = __sync_fetch_and_and(vpl, vl); }
    47         { long long int ret; ret = __sync_fetch_and_and(vpll, vll); }
    48         #if defined(__SIZEOF_INT128__)
    49         { __int128 ret; ret = __sync_fetch_and_and(vplll, vlll); }
    50         #endif
    51 
    52         { char ret; ret = __sync_fetch_and_xor(vpc, vc); }
    53         { short ret; ret = __sync_fetch_and_xor(vps, vs); }
    54         { int ret; ret = __sync_fetch_and_xor(vpi, vi); }
    55         { long int ret; ret = __sync_fetch_and_xor(vpl, vl); }
    56         { long long int ret; ret = __sync_fetch_and_xor(vpll, vll); }
    57         #if defined(__SIZEOF_INT128__)
    58         { __int128 ret; ret = __sync_fetch_and_xor(vplll, vlll); }
    59         #endif
    60 
    61         { char ret; ret = __sync_fetch_and_nand(vpc, vc); }
    62         { short ret; ret = __sync_fetch_and_nand(vps, vs); }
    63         { int ret; ret = __sync_fetch_and_nand(vpi, vi); }
    64         { long int ret; ret = __sync_fetch_and_nand(vpl, vl); }
    65         { long long int ret; ret = __sync_fetch_and_nand(vpll, vll); }
    66         #if defined(__SIZEOF_INT128__)
    67         { __int128 ret; ret = __sync_fetch_and_nand(vplll, vlll); }
    68         { __int128 ret; ret = __sync_fetch_and_nand_16(vplll, vlll); }
    69         #endif
    70 
    71         { char ret; ret = __sync_add_and_fetch(vpc, vc); }
    72         { short ret; ret = __sync_add_and_fetch(vps, vs); }
    73         { int ret; ret = __sync_add_and_fetch(vpi, vi); }
    74         { long int ret; ret = __sync_add_and_fetch(vpl, vl); }
    75         { long long int ret; ret = __sync_add_and_fetch(vpll, vll); }
    76         #if defined(__SIZEOF_INT128__)
    77         { __int128 ret; ret = __sync_add_and_fetch(vplll, vlll); }
    78         #endif
    79 
    80         { char ret; ret = __sync_sub_and_fetch(vpc, vc); }
    81         { short ret; ret = __sync_sub_and_fetch(vps, vs); }
    82         { int ret; ret = __sync_sub_and_fetch(vpi, vi); }
    83         { long int ret; ret = __sync_sub_and_fetch(vpl, vl); }
    84         { long long int ret; ret = __sync_sub_and_fetch(vpll, vll); }
    85         #if defined(__SIZEOF_INT128__)
    86         { __int128 ret; ret = __sync_sub_and_fetch(vplll, vlll); }
    87         #endif
    88 
    89         { char ret; ret = __sync_or_and_fetch(vpc, vc); }
    90         { short ret; ret = __sync_or_and_fetch(vps, vs); }
    91         { int ret; ret = __sync_or_and_fetch(vpi, vi); }
    92         { long int ret; ret = __sync_or_and_fetch(vpl, vl); }
    93         { long long int ret; ret = __sync_or_and_fetch(vpll, vll); }
    94         #if defined(__SIZEOF_INT128__)
    95         { __int128 ret; ret = __sync_or_and_fetch(vplll, vlll); }
    96         #endif
    97 
    98         { char ret; ret = __sync_and_and_fetch(vpc, vc); }
    99         { short ret; ret = __sync_and_and_fetch(vps, vs); }
    100         { int ret; ret = __sync_and_and_fetch(vpi, vi); }
    101         { long int ret; ret = __sync_and_and_fetch(vpl, vl); }
    102         { long long int ret; ret = __sync_and_and_fetch(vpll, vll); }
    103         #if defined(__SIZEOF_INT128__)
    104         { __int128 ret; ret = __sync_and_and_fetch(vplll, vlll); }
    105         #endif
    106 
    107         { char ret; ret = __sync_xor_and_fetch(vpc, vc); }
    108         { short ret; ret = __sync_xor_and_fetch(vps, vs); }
    109         { int ret; ret = __sync_xor_and_fetch(vpi, vi); }
    110         { long int ret; ret = __sync_xor_and_fetch(vpl, vl); }
    111         { long long int ret; ret = __sync_xor_and_fetch(vpll, vll); }
    112         #if defined(__SIZEOF_INT128__)
    113         { __int128 ret; ret = __sync_xor_and_fetch(vplll, vlll); }
    114         #endif
    115 
    116         { char ret; ret = __sync_nand_and_fetch(vpc, vc); }
    117         { short ret; ret = __sync_nand_and_fetch(vps, vs); }
    118         { int ret; ret = __sync_nand_and_fetch(vpi, vi); }
    119         { long int ret; ret = __sync_nand_and_fetch(vpl, vl); }
    120         { long long int ret; ret = __sync_nand_and_fetch(vpll, vll); }
    121         #if defined(__SIZEOF_INT128__)
    122         { __int128 ret; ret = __sync_nand_and_fetch(vplll, vlll); }
    123         #endif
    124 
    125         { _Bool ret; ret = __sync_bool_compare_and_swap(vpc, vc, vc); }
    126         { _Bool ret; ret = __sync_bool_compare_and_swap(vps, vs, vs); }
    127         { _Bool ret; ret = __sync_bool_compare_and_swap(vpi, vi, vi); }
    128         { _Bool ret; ret = __sync_bool_compare_and_swap(vpl, vl, vl); }
    129         { _Bool ret; ret = __sync_bool_compare_and_swap(vpll, vll, vll); }
    130         #if defined(__SIZEOF_INT128__)
    131         { _Bool ret; ret = __sync_bool_compare_and_swap(vplll, vlll, vlll); }
     15        { char ret; ret = __sync_fetch_and_add(vp1, v1); }
     16        { char ret; ret = __sync_fetch_and_add_1(vp1, v1); }
     17        { short ret; ret = __sync_fetch_and_add(vp2, v2); }
     18        { short ret; ret = __sync_fetch_and_add_2(vp2, v2); }
     19        { int ret; ret = __sync_fetch_and_add(vp4, v4); }
     20        { int ret; ret = __sync_fetch_and_add_4(vp4, v4); }
     21        { long long int ret; ret = __sync_fetch_and_add(vp8, v8); }
     22        { long long int ret; ret = __sync_fetch_and_add_8(vp8, v8); }
     23        #if defined(__SIZEOF_INT128__)
     24        { __int128 ret; ret = __sync_fetch_and_add(vp16, v16); }
     25        { __int128 ret; ret = __sync_fetch_and_add_16(vp16, v16); }
     26        #endif
     27
     28        { char ret; ret = __sync_fetch_and_sub(vp1, v1); }
     29        { char ret; ret = __sync_fetch_and_sub_1(vp1, v1); }
     30        { short ret; ret = __sync_fetch_and_sub(vp2, v2); }
     31        { short ret; ret = __sync_fetch_and_sub_2(vp2, v2); }
     32        { int ret; ret = __sync_fetch_and_sub(vp4, v4); }
     33        { int ret; ret = __sync_fetch_and_sub_4(vp4, v4); }
     34        { long long int ret; ret = __sync_fetch_and_sub(vp8, v8); }
     35        { long long int ret; ret = __sync_fetch_and_sub_8(vp8, v8); }
     36        #if defined(__SIZEOF_INT128__)
     37        { __int128 ret; ret = __sync_fetch_and_sub(vp16, v16); }
     38        { __int128 ret; ret = __sync_fetch_and_sub_16(vp16, v16); }
     39        #endif
     40
     41        { char ret; ret = __sync_fetch_and_or(vp1, v1); }
     42        { char ret; ret = __sync_fetch_and_or_1(vp1, v1); }
     43        { short ret; ret = __sync_fetch_and_or(vp2, v2); }
     44        { short ret; ret = __sync_fetch_and_or_2(vp2, v2); }
     45        { int ret; ret = __sync_fetch_and_or(vp4, v4); }
     46        { int ret; ret = __sync_fetch_and_or_4(vp4, v4); }
     47        { long long int ret; ret = __sync_fetch_and_or(vp8, v8); }
     48        { long long int ret; ret = __sync_fetch_and_or_8(vp8, v8); }
     49        #if defined(__SIZEOF_INT128__)
     50        { __int128 ret; ret = __sync_fetch_and_or(vp16, v16); }
     51        { __int128 ret; ret = __sync_fetch_and_or_16(vp16, v16); }
     52        #endif
     53
     54        { char ret; ret = __sync_fetch_and_and(vp1, v1); }
     55        { char ret; ret = __sync_fetch_and_and_1(vp1, v1); }
     56        { short ret; ret = __sync_fetch_and_and(vp2, v2); }
     57        { short ret; ret = __sync_fetch_and_and_2(vp2, v2); }
     58        { int ret; ret = __sync_fetch_and_and(vp4, v4); }
     59        { int ret; ret = __sync_fetch_and_and_4(vp4, v4); }
     60        { long long int ret; ret = __sync_fetch_and_and(vp8, v8); }
     61        { long long int ret; ret = __sync_fetch_and_and_8(vp8, v8); }
     62        #if defined(__SIZEOF_INT128__)
     63        { __int128 ret; ret = __sync_fetch_and_and(vp16, v16); }
     64        { __int128 ret; ret = __sync_fetch_and_and_16(vp16, v16); }
     65        #endif
     66
     67        { char ret; ret = __sync_fetch_and_xor(vp1, v1); }
     68        { char ret; ret = __sync_fetch_and_xor_1(vp1, v1); }
     69        { short ret; ret = __sync_fetch_and_xor(vp2, v2); }
     70        { short ret; ret = __sync_fetch_and_xor_2(vp2, v2); }
     71        { int ret; ret = __sync_fetch_and_xor(vp4, v4); }
     72        { int ret; ret = __sync_fetch_and_xor_4(vp4, v4); }
     73        { long long int ret; ret = __sync_fetch_and_xor(vp8, v8); }
     74        { long long int ret; ret = __sync_fetch_and_xor_8(vp8, v8); }
     75        #if defined(__SIZEOF_INT128__)
     76        { __int128 ret; ret = __sync_fetch_and_xor(vp16, v16); }
     77        { __int128 ret; ret = __sync_fetch_and_xor_16(vp16, v16); }
     78        #endif
     79
     80        { char ret; ret = __sync_fetch_and_nand(vp1, v1); }
     81        { char ret; ret = __sync_fetch_and_nand_1(vp1, v1); }
     82        { short ret; ret = __sync_fetch_and_nand(vp2, v2); }
     83        { short ret; ret = __sync_fetch_and_nand_2(vp2, v2); }
     84        { int ret; ret = __sync_fetch_and_nand(vp4, v4); }
     85        { int ret; ret = __sync_fetch_and_nand_4(vp4, v4); }
     86        { long long int ret; ret = __sync_fetch_and_nand(vp8, v8); }
     87        { long long int ret; ret = __sync_fetch_and_nand_8(vp8, v8); }
     88        #if defined(__SIZEOF_INT128__)
     89        { __int128 ret; ret = __sync_fetch_and_nand(vp16, v16); }
     90        { __int128 ret; ret = __sync_fetch_and_nand_16(vp16, v16); }
     91        #endif
     92
     93        { char ret; ret = __sync_add_and_fetch(vp1, v1); }
     94        { char ret; ret = __sync_add_and_fetch_1(vp1, v1); }
     95        { short ret; ret = __sync_add_and_fetch(vp2, v2); }
     96        { short ret; ret = __sync_add_and_fetch_2(vp2, v2); }
     97        { int ret; ret = __sync_add_and_fetch(vp4, v4); }
     98        { int ret; ret = __sync_add_and_fetch_4(vp4, v4); }
     99        { long long int ret; ret = __sync_add_and_fetch(vp8, v8); }
     100        { long long int ret; ret = __sync_add_and_fetch_8(vp8, v8); }
     101        #if defined(__SIZEOF_INT128__)
     102        { __int128 ret; ret = __sync_add_and_fetch(vp16, v16); }
     103        { __int128 ret; ret = __sync_add_and_fetch_16(vp16, v16); }
     104        #endif
     105
     106        { char ret; ret = __sync_sub_and_fetch(vp1, v1); }
     107        { char ret; ret = __sync_sub_and_fetch_1(vp1, v1); }
     108        { short ret; ret = __sync_sub_and_fetch(vp2, v2); }
     109        { short ret; ret = __sync_sub_and_fetch_2(vp2, v2); }
     110        { int ret; ret = __sync_sub_and_fetch(vp4, v4); }
     111        { int ret; ret = __sync_sub_and_fetch_4(vp4, v4); }
     112        { long long int ret; ret = __sync_sub_and_fetch(vp8, v8); }
     113        { long long int ret; ret = __sync_sub_and_fetch_8(vp8, v8); }
     114        #if defined(__SIZEOF_INT128__)
     115        { __int128 ret; ret = __sync_sub_and_fetch(vp16, v16); }
     116        { __int128 ret; ret = __sync_sub_and_fetch_16(vp16, v16); }
     117        #endif
     118
     119        { char ret; ret = __sync_or_and_fetch(vp1, v1); }
     120        { char ret; ret = __sync_or_and_fetch_1(vp1, v1); }
     121        { short ret; ret = __sync_or_and_fetch(vp2, v2); }
     122        { short ret; ret = __sync_or_and_fetch_2(vp2, v2); }
     123        { int ret; ret = __sync_or_and_fetch(vp4, v4); }
     124        { int ret; ret = __sync_or_and_fetch_4(vp4, v4); }
     125        { long long int ret; ret = __sync_or_and_fetch(vp8, v8); }
     126        { long long int ret; ret = __sync_or_and_fetch_8(vp8, v8); }
     127        #if defined(__SIZEOF_INT128__)
     128        { __int128 ret; ret = __sync_or_and_fetch(vp16, v16); }
     129        { __int128 ret; ret = __sync_or_and_fetch_16(vp16, v16); }
     130        #endif
     131
     132        { char ret; ret = __sync_and_and_fetch(vp1, v1); }
     133        { char ret; ret = __sync_and_and_fetch_1(vp1, v1); }
     134        { short ret; ret = __sync_and_and_fetch(vp2, v2); }
     135        { short ret; ret = __sync_and_and_fetch_2(vp2, v2); }
     136        { int ret; ret = __sync_and_and_fetch(vp4, v4); }
     137        { int ret; ret = __sync_and_and_fetch_4(vp4, v4); }
     138        { long long int ret; ret = __sync_and_and_fetch(vp8, v8); }
     139        { long long int ret; ret = __sync_and_and_fetch_8(vp8, v8); }
     140        #if defined(__SIZEOF_INT128__)
     141        { __int128 ret; ret = __sync_and_and_fetch(vp16, v16); }
     142        { __int128 ret; ret = __sync_and_and_fetch_16(vp16, v16); }
     143        #endif
     144
     145        { char ret; ret = __sync_xor_and_fetch(vp1, v1); }
     146        { char ret; ret = __sync_xor_and_fetch_1(vp1, v1); }
     147        { short ret; ret = __sync_xor_and_fetch(vp2, v2); }
     148        { short ret; ret = __sync_xor_and_fetch_2(vp2, v2); }
     149        { int ret; ret = __sync_xor_and_fetch(vp4, v4); }
     150        { int ret; ret = __sync_xor_and_fetch_4(vp4, v4); }
     151        { long long int ret; ret = __sync_xor_and_fetch(vp8, v8); }
     152        { long long int ret; ret = __sync_xor_and_fetch_8(vp8, v8); }
     153        #if defined(__SIZEOF_INT128__)
     154        { __int128 ret; ret = __sync_xor_and_fetch(vp16, v16); }
     155        { __int128 ret; ret = __sync_xor_and_fetch_16(vp16, v16); }
     156        #endif
     157
     158        { char ret; ret = __sync_nand_and_fetch(vp1, v1); }
     159        { char ret; ret = __sync_nand_and_fetch_1(vp1, v1); }
     160        { short ret; ret = __sync_nand_and_fetch(vp2, v2); }
     161        { short ret; ret = __sync_nand_and_fetch_2(vp2, v2); }
     162        { int ret; ret = __sync_nand_and_fetch(vp4, v4); }
     163        { int ret; ret = __sync_nand_and_fetch_4(vp4, v4); }
     164        { long long int ret; ret = __sync_nand_and_fetch(vp8, v8); }
     165        { long long int ret; ret = __sync_nand_and_fetch_8(vp8, v8); }
     166        #if defined(__SIZEOF_INT128__)
     167        { __int128 ret; ret = __sync_nand_and_fetch(vp16, v16); }
     168        { __int128 ret; ret = __sync_nand_and_fetch_16(vp16, v16); }
     169        #endif
     170
     171        { _Bool ret; ret = __sync_bool_compare_and_swap(vp1, v1, v1); }
     172        { _Bool ret; ret = __sync_bool_compare_and_swap_1(vp1, v1, v1); }
     173        { _Bool ret; ret = __sync_bool_compare_and_swap(vp2, v2, v2); }
     174        { _Bool ret; ret = __sync_bool_compare_and_swap_2(vp2, v2, v2); }
     175        { _Bool ret; ret = __sync_bool_compare_and_swap(vp4, v4, v4); }
     176        { _Bool ret; ret = __sync_bool_compare_and_swap_4(vp4, v4, v4); }
     177        { _Bool ret; ret = __sync_bool_compare_and_swap(vp8, v8, v8); }
     178        { _Bool ret; ret = __sync_bool_compare_and_swap_8(vp8, v8, v8); }
     179        #if defined(__SIZEOF_INT128__)
     180        { _Bool ret; ret = __sync_bool_compare_and_swap(vp16, v16, v16); }
     181        { _Bool ret; ret = __sync_bool_compare_and_swap_16(vp16, v16,v16); }
    132182        #endif
    133183        { _Bool ret; ret = __sync_bool_compare_and_swap(vpp, vp, vp); }
    134184
    135         { char ret; ret = __sync_val_compare_and_swap(vpc, vc, vc); }
    136         { short ret; ret = __sync_val_compare_and_swap(vps, vs, vs); }
    137         { int ret; ret = __sync_val_compare_and_swap(vpi, vi, vi); }
    138         { long int ret; ret = __sync_val_compare_and_swap(vpl, vl, vl); }
    139         { long long int ret; ret = __sync_val_compare_and_swap(vpll, vll, vll); }
    140         #if defined(__SIZEOF_INT128__)
    141         { __int128 ret; ret = __sync_val_compare_and_swap(vplll, vlll, vlll); }
     185        { char ret; ret = __sync_val_compare_and_swap(vp1, v1, v1); }
     186        { char ret; ret = __sync_val_compare_and_swap_1(vp1, v1, v1); }
     187        { short ret; ret = __sync_val_compare_and_swap(vp2, v2, v2); }
     188        { short ret; ret = __sync_val_compare_and_swap_2(vp2, v2, v2); }
     189        { int ret; ret = __sync_val_compare_and_swap(vp4, v4, v4); }
     190        { int ret; ret = __sync_val_compare_and_swap_4(vp4, v4, v4); }
     191        { long long int ret; ret = __sync_val_compare_and_swap(vp8, v8, v8); }
     192        { long long int ret; ret = __sync_val_compare_and_swap_8(vp8, v8, v8); }
     193        #if defined(__SIZEOF_INT128__)
     194        { __int128 ret; ret = __sync_val_compare_and_swap(vp16, v16, v16); }
     195        { __int128 ret; ret = __sync_val_compare_and_swap_16(vp16, v16,v16); }
    142196        #endif
    143197        { struct type * ret; ret = __sync_val_compare_and_swap(vpp, vp, vp); }
    144198
    145199
    146         { char ret; ret = __sync_lock_test_and_set(vpc, vc); }
    147         { short ret; ret = __sync_lock_test_and_set(vps, vs); }
    148         { int ret; ret = __sync_lock_test_and_set(vpi, vi); }
    149         { long int ret; ret = __sync_lock_test_and_set(vpl, vl); }
    150         { long long int ret; ret = __sync_lock_test_and_set(vpll, vll); }
    151         #if defined(__SIZEOF_INT128__)
    152         { __int128 ret; ret = __sync_lock_test_and_set(vplll, vlll); }
    153         #endif
    154 
    155         { __sync_lock_release(vpc); }
    156         { __sync_lock_release(vps); }
    157         { __sync_lock_release(vpi); }
    158         { __sync_lock_release(vpl); }
    159         { __sync_lock_release(vpll); }
    160         #if defined(__SIZEOF_INT128__)
    161         { __sync_lock_release(vplll); }
     200        { char ret; ret = __sync_lock_test_and_set(vp1, v1); }
     201        { char ret; ret = __sync_lock_test_and_set_1(vp1, v1); }
     202        { short ret; ret = __sync_lock_test_and_set(vp2, v2); }
     203        { short ret; ret = __sync_lock_test_and_set_2(vp2, v2); }
     204        { int ret; ret = __sync_lock_test_and_set(vp4, v4); }
     205        { int ret; ret = __sync_lock_test_and_set_4(vp4, v4); }
     206        { long long int ret; ret = __sync_lock_test_and_set(vp8, v8); }
     207        { long long int ret; ret = __sync_lock_test_and_set_8(vp8, v8); }
     208        #if defined(__SIZEOF_INT128__)
     209        { __int128 ret; ret = __sync_lock_test_and_set(vp16, v16); }
     210        { __int128 ret; ret = __sync_lock_test_and_set_16(vp16, v16); }
     211        #endif
     212
     213        { __sync_lock_release(vp1); }
     214        { __sync_lock_release_1(vp1); }
     215        { __sync_lock_release(vp2); }
     216        { __sync_lock_release_2(vp2); }
     217        { __sync_lock_release(vp4); }
     218        { __sync_lock_release_4(vp4); }
     219        { __sync_lock_release(vp8); }
     220        { __sync_lock_release_8(vp8); }
     221        #if defined(__SIZEOF_INT128__)
     222        { __sync_lock_release(vp16); }
     223        { __sync_lock_release_16(vp16); }
    162224        #endif
    163225
     
    168230
    169231        { _Bool ret; ret = __atomic_test_and_set(vpB, vB); }
    170         { _Bool ret; ret = __atomic_test_and_set(vpc, vc); }
     232        { _Bool ret; ret = __atomic_test_and_set(vp1, v1); }
    171233        { __atomic_clear(vpB, vB); }
    172         { __atomic_clear(vpc, vc); }
    173 
    174         { char ret; ret = __atomic_exchange_n(vpc, vc, __ATOMIC_SEQ_CST); }
    175         { char ret; __atomic_exchange(vpc, &vc, &ret, __ATOMIC_SEQ_CST); }
    176         { short ret; ret = __atomic_exchange_n(vps, vs, __ATOMIC_SEQ_CST); }
    177         { short ret; __atomic_exchange(vps, &vs, &ret, __ATOMIC_SEQ_CST); }
    178         { int ret; ret = __atomic_exchange_n(vpi, vi, __ATOMIC_SEQ_CST); }
    179         { int ret; __atomic_exchange(vpi, &vi, &ret, __ATOMIC_SEQ_CST); }
    180         { long int ret; ret = __atomic_exchange_n(vpl, vl, __ATOMIC_SEQ_CST); }
    181         { long int ret; __atomic_exchange(vpl, &vl, &ret, __ATOMIC_SEQ_CST); }
    182         { long long int ret; ret = __atomic_exchange_n(vpll, vll, __ATOMIC_SEQ_CST); }
    183         { long long int ret; __atomic_exchange(vpll, &vll, &ret, __ATOMIC_SEQ_CST); }
    184         #if defined(__SIZEOF_INT128__)
    185         { __int128 ret; ret = __atomic_exchange_n(vplll, vlll, __ATOMIC_SEQ_CST); }
    186         { __int128 ret; __atomic_exchange(vplll, &vlll, &ret, __ATOMIC_SEQ_CST); }
     234        { __atomic_clear(vp1, v1); }
     235
     236        { char ret; ret = __atomic_exchange_n(vp1, v1, __ATOMIC_SEQ_CST); }
     237        { char ret; ret = __atomic_exchange_1(vp1, v1, __ATOMIC_SEQ_CST); }
     238        { char ret; __atomic_exchange(vp1, &v1, &ret, __ATOMIC_SEQ_CST); }
     239        { short ret; ret = __atomic_exchange_n(vp2, v2, __ATOMIC_SEQ_CST); }
     240        { short ret; ret = __atomic_exchange_2(vp2, v2, __ATOMIC_SEQ_CST); }
     241        { short ret; __atomic_exchange(vp2, &v2, &ret, __ATOMIC_SEQ_CST); }
     242        { int ret; ret = __atomic_exchange_n(vp4, v4, __ATOMIC_SEQ_CST); }
     243        { int ret; ret = __atomic_exchange_4(vp4, v4, __ATOMIC_SEQ_CST); }
     244        { int ret; __atomic_exchange(vp4, &v4, &ret, __ATOMIC_SEQ_CST); }
     245        { long long int ret; ret = __atomic_exchange_n(vp8, v8, __ATOMIC_SEQ_CST); }
     246        { long long int ret; ret = __atomic_exchange_8(vp8, v8, __ATOMIC_SEQ_CST); }
     247        { long long int ret; __atomic_exchange(vp8, &v8, &ret, __ATOMIC_SEQ_CST); }
     248        #if defined(__SIZEOF_INT128__)
     249        { __int128 ret; ret = __atomic_exchange_n(vp16, v16, __ATOMIC_SEQ_CST); }
     250        { __int128 ret; ret = __atomic_exchange_16(vp16, v16, __ATOMIC_SEQ_CST); }
     251        { __int128 ret; __atomic_exchange(vp16, &v16, &ret, __ATOMIC_SEQ_CST); }
    187252        #endif
    188253        { struct type * ret; ret = __atomic_exchange_n(vpp, vp, __ATOMIC_SEQ_CST); }
    189254        { struct type * ret; __atomic_exchange(vpp, &vp, &ret, __ATOMIC_SEQ_CST); }
    190255
    191         { char ret; ret = __atomic_load_n(vpc, __ATOMIC_SEQ_CST); }
    192         { char ret; __atomic_load(vpc, &ret, __ATOMIC_SEQ_CST); }
    193         { short ret; ret = __atomic_load_n(vps, __ATOMIC_SEQ_CST); }
    194         { short ret; __atomic_load(vps, &ret, __ATOMIC_SEQ_CST); }
    195         { int ret; ret = __atomic_load_n(vpi, __ATOMIC_SEQ_CST); }
    196         { int ret; __atomic_load(vpi, &ret, __ATOMIC_SEQ_CST); }
    197         { long int ret; ret = __atomic_load_n(vpl, __ATOMIC_SEQ_CST); }
    198         { long int ret; __atomic_load(vpl, &ret, __ATOMIC_SEQ_CST); }
    199         { long long int ret; ret = __atomic_load_n(vpll, __ATOMIC_SEQ_CST); }
    200         { long long int ret; __atomic_load(vpll, &ret, __ATOMIC_SEQ_CST); }
    201         #if defined(__SIZEOF_INT128__)
    202         { __int128 ret; ret = __atomic_load_n(vplll, __ATOMIC_SEQ_CST); }
    203         { __int128 ret; __atomic_load(vplll, &ret, __ATOMIC_SEQ_CST); }
     256        { char ret; ret = __atomic_load_n(vp1, __ATOMIC_SEQ_CST); }
     257        { char ret; ret = __atomic_load_1(vp1, __ATOMIC_SEQ_CST); }
     258        { char ret; __atomic_load(vp1, &ret, __ATOMIC_SEQ_CST); }
     259        { short ret; ret = __atomic_load_n(vp2, __ATOMIC_SEQ_CST); }
     260        { short ret; ret = __atomic_load_2(vp2, __ATOMIC_SEQ_CST); }
     261        { short ret; __atomic_load(vp2, &ret, __ATOMIC_SEQ_CST); }
     262        { int ret; ret = __atomic_load_n(vp4, __ATOMIC_SEQ_CST); }
     263        { int ret; ret = __atomic_load_4(vp4, __ATOMIC_SEQ_CST); }
     264        { int ret; __atomic_load(vp4, &ret, __ATOMIC_SEQ_CST); }
     265        { long long int ret; ret = __atomic_load_n(vp8, __ATOMIC_SEQ_CST); }
     266        { long long int ret; ret = __atomic_load_8(vp8, __ATOMIC_SEQ_CST); }
     267        { long long int ret; __atomic_load(vp8, &ret, __ATOMIC_SEQ_CST); }
     268        #if defined(__SIZEOF_INT128__)
     269        { __int128 ret; ret = __atomic_load_n(vp16, __ATOMIC_SEQ_CST); }
     270        { __int128 ret; ret = __atomic_load_16(vp16, __ATOMIC_SEQ_CST); }
     271        { __int128 ret; __atomic_load(vp16, &ret, __ATOMIC_SEQ_CST); }
    204272        #endif
    205273        { struct type * ret; ret = __atomic_load_n(vpp, __ATOMIC_SEQ_CST); }
    206274        { struct type * ret; __atomic_load(vpp, &ret, __ATOMIC_SEQ_CST); }
    207275
    208         { _Bool ret; ret = __atomic_compare_exchange_n(vpc, rpc, vc, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
    209         { _Bool ret; ret = __atomic_compare_exchange(vpc, rpc, &vc, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
    210         { _Bool ret; ret = __atomic_compare_exchange_n(vps, rps, vs, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
    211         { _Bool ret; ret = __atomic_compare_exchange(vps, rps, &vs, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
    212         { _Bool ret; ret = __atomic_compare_exchange_n(vpi, rpi, vi, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
    213         { _Bool ret; ret = __atomic_compare_exchange(vpi, rpi, &vi, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
    214         { _Bool ret; ret = __atomic_compare_exchange_n(vpl, rpl, vl, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
    215         { _Bool ret; ret = __atomic_compare_exchange(vpl, rpl, &vl, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
    216         { _Bool ret; ret = __atomic_compare_exchange_n(vpll, rpll, vll, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
    217         { _Bool ret; ret = __atomic_compare_exchange(vpll, rpll, &vll, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
    218         #if defined(__SIZEOF_INT128__)
    219         { _Bool ret; ret = __atomic_compare_exchange_n(vplll, rplll, vlll, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
    220         { _Bool ret; ret = __atomic_compare_exchange(vplll, rplll, &vlll, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     276        { _Bool ret; ret = __atomic_compare_exchange_n(vp1, rp1, v1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     277        { _Bool ret; ret = __atomic_compare_exchange_1(vp1, rp1, v1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     278        { _Bool ret; ret = __atomic_compare_exchange(vp1, rp1, &v1, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     279        { _Bool ret; ret = __atomic_compare_exchange_n(vp2, rp2, v2, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     280        { _Bool ret; ret = __atomic_compare_exchange_2(vp2, rp2, v2, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     281        { _Bool ret; ret = __atomic_compare_exchange(vp2, rp2, &v2, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     282        { _Bool ret; ret = __atomic_compare_exchange_n(vp4, rp4, v4, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     283        { _Bool ret; ret = __atomic_compare_exchange_4(vp4, rp4, v4, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     284        { _Bool ret; ret = __atomic_compare_exchange(vp4, rp4, &v4, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     285        { _Bool ret; ret = __atomic_compare_exchange_n(vp8, rp8, v8, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     286        { _Bool ret; ret = __atomic_compare_exchange_8(vp8, rp8, v8, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     287        { _Bool ret; ret = __atomic_compare_exchange(vp8, rp8, &v8, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     288        #if defined(__SIZEOF_INT128__)
     289        { _Bool ret; ret = __atomic_compare_exchange_n(vp16, rp16, v16, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     290        { _Bool ret; ret = __atomic_compare_exchange_16(vp16, rp16, v16, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
     291        { _Bool ret; ret = __atomic_compare_exchange(vp16, rp16, &v16, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
    221292        #endif
    222293        { _Bool ret; ret = __atomic_compare_exchange_n(vpp, rpp, vp, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
    223294        { _Bool ret; ret = __atomic_compare_exchange(vpp, rpp, &vp, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); }
    224295
    225         { __atomic_store_n(vpc, vc, __ATOMIC_SEQ_CST); }
    226         { __atomic_store(vpc, &vc, __ATOMIC_SEQ_CST); }
    227         { __atomic_store_n(vps, vs, __ATOMIC_SEQ_CST); }
    228         { __atomic_store(vps, &vs, __ATOMIC_SEQ_CST); }
    229         { __atomic_store_n(vpi, vi, __ATOMIC_SEQ_CST); }
    230         { __atomic_store(vpi, &vi, __ATOMIC_SEQ_CST); }
    231         { __atomic_store_n(vpl, vl, __ATOMIC_SEQ_CST); }
    232         { __atomic_store(vpl, &vl, __ATOMIC_SEQ_CST); }
    233         { __atomic_store_n(vpll, vll, __ATOMIC_SEQ_CST); }
    234         { __atomic_store(vpll, &vll, __ATOMIC_SEQ_CST); }
    235         #if defined(__SIZEOF_INT128__)
    236         { __atomic_store_n(vplll, vlll, __ATOMIC_SEQ_CST); }
    237         { __atomic_store(vplll, &vlll, __ATOMIC_SEQ_CST); }
     296        { __atomic_store_n(vp1, v1, __ATOMIC_SEQ_CST); }
     297        { __atomic_store_1(vp1, v1, __ATOMIC_SEQ_CST); }
     298        { __atomic_store(vp1, &v1, __ATOMIC_SEQ_CST); }
     299        { __atomic_store_n(vp2, v2, __ATOMIC_SEQ_CST); }
     300        { __atomic_store_2(vp2, v2, __ATOMIC_SEQ_CST); }
     301        { __atomic_store(vp2, &v2, __ATOMIC_SEQ_CST); }
     302        { __atomic_store_n(vp4, v4, __ATOMIC_SEQ_CST); }
     303        { __atomic_store_4(vp4, v4, __ATOMIC_SEQ_CST); }
     304        { __atomic_store(vp4, &v4, __ATOMIC_SEQ_CST); }
     305        { __atomic_store_n(vp8, v8, __ATOMIC_SEQ_CST); }
     306        { __atomic_store_8(vp8, v8, __ATOMIC_SEQ_CST); }
     307        { __atomic_store(vp8, &v8, __ATOMIC_SEQ_CST); }
     308        #if defined(__SIZEOF_INT128__)
     309        { __atomic_store_n(vp16, v16, __ATOMIC_SEQ_CST); }
     310        { __atomic_store_16(vp16, v16, __ATOMIC_SEQ_CST); }
     311        { __atomic_store(vp16, &v16, __ATOMIC_SEQ_CST); }
    238312        #endif
    239313        { __atomic_store_n(vpp, vp, __ATOMIC_SEQ_CST); }
    240314        { __atomic_store(vpp, &vp, __ATOMIC_SEQ_CST); }
    241315
    242         { char ret; ret = __atomic_add_fetch(vpc, vc, __ATOMIC_SEQ_CST); }
    243         { short ret; ret = __atomic_add_fetch(vps, vs, __ATOMIC_SEQ_CST); }
    244         { int ret; ret = __atomic_add_fetch(vpi, vi, __ATOMIC_SEQ_CST); }
    245         { long int ret; ret = __atomic_add_fetch(vpl, vl, __ATOMIC_SEQ_CST); }
    246         { long long int ret; ret = __atomic_add_fetch(vpll, vll, __ATOMIC_SEQ_CST); }
    247         #if defined(__SIZEOF_INT128__)
    248         { __int128 ret; ret = __atomic_add_fetch(vplll, vlll, __ATOMIC_SEQ_CST); }
    249         #endif
    250 
    251         { char ret; ret = __atomic_sub_fetch(vpc, vc, __ATOMIC_SEQ_CST); }
    252         { short ret; ret = __atomic_sub_fetch(vps, vs, __ATOMIC_SEQ_CST); }
    253         { int ret; ret = __atomic_sub_fetch(vpi, vi, __ATOMIC_SEQ_CST); }
    254         { long int ret; ret = __atomic_sub_fetch(vpl, vl, __ATOMIC_SEQ_CST); }
    255         { long long int ret; ret = __atomic_sub_fetch(vpll, vll, __ATOMIC_SEQ_CST); }
    256         #if defined(__SIZEOF_INT128__)
    257         { __int128 ret; ret = __atomic_sub_fetch(vplll, vlll, __ATOMIC_SEQ_CST); }
    258         #endif
    259 
    260         { char ret; ret = __atomic_and_fetch(vpc, vc, __ATOMIC_SEQ_CST); }
    261         { short ret; ret = __atomic_and_fetch(vps, vs, __ATOMIC_SEQ_CST); }
    262         { int ret; ret = __atomic_and_fetch(vpi, vi, __ATOMIC_SEQ_CST); }
    263         { long int ret; ret = __atomic_and_fetch(vpl, vl, __ATOMIC_SEQ_CST); }
    264         { long long int ret; ret = __atomic_and_fetch(vpll, vll, __ATOMIC_SEQ_CST); }
    265         #if defined(__SIZEOF_INT128__)
    266         { __int128 ret; ret = __atomic_and_fetch(vplll, vlll, __ATOMIC_SEQ_CST); }
    267         #endif
    268 
    269         { char ret; ret = __atomic_nand_fetch(vpc, vc, __ATOMIC_SEQ_CST); }
    270         { short ret; ret = __atomic_nand_fetch(vps, vs, __ATOMIC_SEQ_CST); }
    271         { int ret; ret = __atomic_nand_fetch(vpi, vi, __ATOMIC_SEQ_CST); }
    272         { long int ret; ret = __atomic_nand_fetch(vpl, vl, __ATOMIC_SEQ_CST); }
    273         { long long int ret; ret = __atomic_nand_fetch(vpll, vll, __ATOMIC_SEQ_CST); }
    274         #if defined(__SIZEOF_INT128__)
    275         { __int128 ret; ret = __atomic_nand_fetch(vplll, vlll, __ATOMIC_SEQ_CST); }
    276         #endif
    277 
    278         { char ret; ret = __atomic_xor_fetch(vpc, vc, __ATOMIC_SEQ_CST); }
    279         { short ret; ret = __atomic_xor_fetch(vps, vs, __ATOMIC_SEQ_CST); }
    280         { int ret; ret = __atomic_xor_fetch(vpi, vi, __ATOMIC_SEQ_CST); }
    281         { long int ret; ret = __atomic_xor_fetch(vpl, vl, __ATOMIC_SEQ_CST); }
    282         { long long int ret; ret = __atomic_xor_fetch(vpll, vll, __ATOMIC_SEQ_CST); }
    283         #if defined(__SIZEOF_INT128__)
    284         { __int128 ret; ret = __atomic_xor_fetch(vplll, vlll, __ATOMIC_SEQ_CST); }
    285         #endif
    286 
    287         { char ret; ret = __atomic_or_fetch(vpc, vc, __ATOMIC_SEQ_CST); }
    288         { short ret; ret = __atomic_or_fetch(vps, vs, __ATOMIC_SEQ_CST); }
    289         { int ret; ret = __atomic_or_fetch(vpi, vi, __ATOMIC_SEQ_CST); }
    290         { long int ret; ret = __atomic_or_fetch(vpl, vl, __ATOMIC_SEQ_CST); }
    291         { long long int ret; ret = __atomic_or_fetch(vpll, vll, __ATOMIC_SEQ_CST); }
    292         #if defined(__SIZEOF_INT128__)
    293         { __int128 ret; ret = __atomic_or_fetch(vplll, vlll, __ATOMIC_SEQ_CST); }
    294         #endif
    295 
    296         { char ret; ret = __atomic_fetch_add(vpc, vc, __ATOMIC_SEQ_CST); }
    297         { short ret; ret = __atomic_fetch_add(vps, vs, __ATOMIC_SEQ_CST); }
    298         { int ret; ret = __atomic_fetch_add(vpi, vi, __ATOMIC_SEQ_CST); }
    299         { long int ret; ret = __atomic_fetch_add(vpl, vl, __ATOMIC_SEQ_CST); }
    300         { long long int ret; ret = __atomic_fetch_add(vpll, vll, __ATOMIC_SEQ_CST); }
    301         #if defined(__SIZEOF_INT128__)
    302         { __int128 ret; ret = __atomic_fetch_add(vplll, vlll, __ATOMIC_SEQ_CST); }
    303         #endif
    304 
    305         { char ret; ret = __atomic_fetch_sub(vpc, vc, __ATOMIC_SEQ_CST); }
    306         { short ret; ret = __atomic_fetch_sub(vps, vs, __ATOMIC_SEQ_CST); }
    307         { int ret; ret = __atomic_fetch_sub(vpi, vi, __ATOMIC_SEQ_CST); }
    308         { long int ret; ret = __atomic_fetch_sub(vpl, vl, __ATOMIC_SEQ_CST); }
    309         { long long int ret; ret = __atomic_fetch_sub(vpll, vll, __ATOMIC_SEQ_CST); }
    310         #if defined(__SIZEOF_INT128__)
    311         { __int128 ret; ret = __atomic_fetch_sub(vplll, vlll, __ATOMIC_SEQ_CST); }
    312         #endif
    313 
    314         { char ret; ret = __atomic_fetch_and(vpc, vc, __ATOMIC_SEQ_CST); }
    315         { short ret; ret = __atomic_fetch_and(vps, vs, __ATOMIC_SEQ_CST); }
    316         { int ret; ret = __atomic_fetch_and(vpi, vi, __ATOMIC_SEQ_CST); }
    317         { long int ret; ret = __atomic_fetch_and(vpl, vl, __ATOMIC_SEQ_CST); }
    318         { long long int ret; ret = __atomic_fetch_and(vpll, vll, __ATOMIC_SEQ_CST); }
    319         #if defined(__SIZEOF_INT128__)
    320         { __int128 ret; ret = __atomic_fetch_and(vplll, vlll, __ATOMIC_SEQ_CST); }
    321         #endif
    322 
    323         { char ret; ret = __atomic_fetch_nand(vpc, vc, __ATOMIC_SEQ_CST); }
    324         { short ret; ret = __atomic_fetch_nand(vps, vs, __ATOMIC_SEQ_CST); }
    325         { int ret; ret = __atomic_fetch_nand(vpi, vi, __ATOMIC_SEQ_CST); }
    326         { long int ret; ret = __atomic_fetch_nand(vpl, vl, __ATOMIC_SEQ_CST); }
    327         { long long int ret; ret = __atomic_fetch_nand(vpll, vll, __ATOMIC_SEQ_CST); }
    328         #if defined(__SIZEOF_INT128__)
    329         { __int128 ret; ret = __atomic_fetch_nand(vplll, vlll, __ATOMIC_SEQ_CST); }
    330         #endif
    331 
    332         { char ret; ret = __atomic_fetch_xor(vpc, vc, __ATOMIC_SEQ_CST); }
    333         { short ret; ret = __atomic_fetch_xor(vps, vs, __ATOMIC_SEQ_CST); }
    334         { int ret; ret = __atomic_fetch_xor(vpi, vi, __ATOMIC_SEQ_CST); }
    335         { long int ret; ret = __atomic_fetch_xor(vpl, vl, __ATOMIC_SEQ_CST); }
    336         { long long int ret; ret = __atomic_fetch_xor(vpll, vll, __ATOMIC_SEQ_CST); }
    337         #if defined(__SIZEOF_INT128__)
    338         { __int128 ret; ret = __atomic_fetch_xor(vplll, vlll, __ATOMIC_SEQ_CST); }
    339         #endif
    340 
    341         { char ret; ret = __atomic_fetch_or(vpc, vc, __ATOMIC_SEQ_CST); }
    342         { short ret; ret = __atomic_fetch_or(vps, vs, __ATOMIC_SEQ_CST); }
    343         { int ret; ret = __atomic_fetch_or(vpi, vi, __ATOMIC_SEQ_CST); }
    344         { long int ret; ret = __atomic_fetch_or(vpl, vl, __ATOMIC_SEQ_CST); }
    345         { long long int ret; ret = __atomic_fetch_or(vpll, vll, __ATOMIC_SEQ_CST); }
    346         #if defined(__SIZEOF_INT128__)
    347         { __int128 ret; ret = __atomic_fetch_or(vplll, vlll, __ATOMIC_SEQ_CST); }
    348         #endif
    349 
    350         { _Bool ret; ret = __atomic_always_lock_free(sizeof(int), vpi); }
    351         { _Bool ret; ret = __atomic_is_lock_free(sizeof(int), vpi); }
     316        { char ret; ret = __atomic_add_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
     317        { char ret; ret = __atomic_add_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
     318        { short ret; ret = __atomic_add_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
     319        { short ret; ret = __atomic_add_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
     320        { int ret; ret = __atomic_add_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
     321        { int ret; ret = __atomic_add_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
     322        { long long int ret; ret = __atomic_add_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
     323        { long long int ret; ret = __atomic_add_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
     324        #if defined(__SIZEOF_INT128__)
     325        { __int128 ret; ret = __atomic_add_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
     326        { __int128 ret; ret = __atomic_add_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
     327        #endif
     328
     329        { char ret; ret = __atomic_sub_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
     330        { char ret; ret = __atomic_sub_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
     331        { short ret; ret = __atomic_sub_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
     332        { short ret; ret = __atomic_sub_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
     333        { int ret; ret = __atomic_sub_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
     334        { int ret; ret = __atomic_sub_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
     335        { long long int ret; ret = __atomic_sub_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
     336        { long long int ret; ret = __atomic_sub_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
     337        #if defined(__SIZEOF_INT128__)
     338        { __int128 ret; ret = __atomic_sub_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
     339        { __int128 ret; ret = __atomic_sub_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
     340        #endif
     341
     342        { char ret; ret = __atomic_and_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
     343        { char ret; ret = __atomic_and_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
     344        { short ret; ret = __atomic_and_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
     345        { short ret; ret = __atomic_and_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
     346        { int ret; ret = __atomic_and_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
     347        { int ret; ret = __atomic_and_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
     348        { long long int ret; ret = __atomic_and_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
     349        { long long int ret; ret = __atomic_and_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
     350        #if defined(__SIZEOF_INT128__)
     351        { __int128 ret; ret = __atomic_and_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
     352        { __int128 ret; ret = __atomic_and_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
     353        #endif
     354
     355        { char ret; ret = __atomic_nand_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
     356        { char ret; ret = __atomic_nand_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
     357        { short ret; ret = __atomic_nand_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
     358        { short ret; ret = __atomic_nand_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
     359        { int ret; ret = __atomic_nand_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
     360        { int ret; ret = __atomic_nand_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
     361        { long long int ret; ret = __atomic_nand_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
     362        { long long int ret; ret = __atomic_nand_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
     363        #if defined(__SIZEOF_INT128__)
     364        { __int128 ret; ret = __atomic_nand_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
     365        { __int128 ret; ret = __atomic_nand_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
     366        #endif
     367
     368        { char ret; ret = __atomic_xor_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
     369        { char ret; ret = __atomic_xor_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
     370        { short ret; ret = __atomic_xor_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
     371        { short ret; ret = __atomic_xor_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
     372        { int ret; ret = __atomic_xor_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
     373        { int ret; ret = __atomic_xor_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
     374        { long long int ret; ret = __atomic_xor_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
     375        { long long int ret; ret = __atomic_xor_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
     376        #if defined(__SIZEOF_INT128__)
     377        { __int128 ret; ret = __atomic_xor_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
     378        { __int128 ret; ret = __atomic_xor_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
     379        #endif
     380
     381        { char ret; ret = __atomic_or_fetch(vp1, v1, __ATOMIC_SEQ_CST); }
     382        { char ret; ret = __atomic_or_fetch_1(vp1, v1, __ATOMIC_SEQ_CST); }
     383        { short ret; ret = __atomic_or_fetch(vp2, v2, __ATOMIC_SEQ_CST); }
     384        { short ret; ret = __atomic_or_fetch_2(vp2, v2, __ATOMIC_SEQ_CST); }
     385        { int ret; ret = __atomic_or_fetch(vp4, v4, __ATOMIC_SEQ_CST); }
     386        { int ret; ret = __atomic_or_fetch_4(vp4, v4, __ATOMIC_SEQ_CST); }
     387        { long long int ret; ret = __atomic_or_fetch(vp8, v8, __ATOMIC_SEQ_CST); }
     388        { long long int ret; ret = __atomic_or_fetch_8(vp8, v8, __ATOMIC_SEQ_CST); }
     389        #if defined(__SIZEOF_INT128__)
     390        { __int128 ret; ret = __atomic_or_fetch(vp16, v16, __ATOMIC_SEQ_CST); }
     391        { __int128 ret; ret = __atomic_or_fetch_16(vp16, v16, __ATOMIC_SEQ_CST); }
     392        #endif
     393
     394        { char ret; ret = __atomic_fetch_add(vp1, v1, __ATOMIC_SEQ_CST); }
     395        { char ret; ret = __atomic_fetch_add_1(vp1, v1, __ATOMIC_SEQ_CST); }
     396        { short ret; ret = __atomic_fetch_add(vp2, v2, __ATOMIC_SEQ_CST); }
     397        { short ret; ret = __atomic_fetch_add_2(vp2, v2, __ATOMIC_SEQ_CST); }
     398        { int ret; ret = __atomic_fetch_add(vp4, v4, __ATOMIC_SEQ_CST); }
     399        { int ret; ret = __atomic_fetch_add_4(vp4, v4, __ATOMIC_SEQ_CST); }
     400        { long long int ret; ret = __atomic_fetch_add(vp8, v8, __ATOMIC_SEQ_CST); }
     401        { long long int ret; ret = __atomic_fetch_add_8(vp8, v8, __ATOMIC_SEQ_CST); }
     402        #if defined(__SIZEOF_INT128__)
     403        { __int128 ret; ret = __atomic_fetch_add(vp16, v16, __ATOMIC_SEQ_CST); }
     404        { __int128 ret; ret = __atomic_fetch_add_16(vp16, v16, __ATOMIC_SEQ_CST); }
     405        #endif
     406
     407        { char ret; ret = __atomic_fetch_sub(vp1, v1, __ATOMIC_SEQ_CST); }
     408        { char ret; ret = __atomic_fetch_sub_1(vp1, v1, __ATOMIC_SEQ_CST); }
     409        { short ret; ret = __atomic_fetch_sub(vp2, v2, __ATOMIC_SEQ_CST); }
     410        { short ret; ret = __atomic_fetch_sub_2(vp2, v2, __ATOMIC_SEQ_CST); }
     411        { int ret; ret = __atomic_fetch_sub(vp4, v4, __ATOMIC_SEQ_CST); }
     412        { int ret; ret = __atomic_fetch_sub_4(vp4, v4, __ATOMIC_SEQ_CST); }
     413        { long long int ret; ret = __atomic_fetch_sub(vp8, v8, __ATOMIC_SEQ_CST); }
     414        { long long int ret; ret = __atomic_fetch_sub_8(vp8, v8, __ATOMIC_SEQ_CST); }
     415        #if defined(__SIZEOF_INT128__)
     416        { __int128 ret; ret = __atomic_fetch_sub(vp16, v16, __ATOMIC_SEQ_CST); }
     417        { __int128 ret; ret = __atomic_fetch_sub_16(vp16, v16, __ATOMIC_SEQ_CST); }
     418        #endif
     419
     420        { char ret; ret = __atomic_fetch_and(vp1, v1, __ATOMIC_SEQ_CST); }
     421        { char ret; ret = __atomic_fetch_and_1(vp1, v1, __ATOMIC_SEQ_CST); }
     422        { short ret; ret = __atomic_fetch_and(vp2, v2, __ATOMIC_SEQ_CST); }
     423        { short ret; ret = __atomic_fetch_and_2(vp2, v2, __ATOMIC_SEQ_CST); }
     424        { int ret; ret = __atomic_fetch_and(vp4, v4, __ATOMIC_SEQ_CST); }
     425        { int ret; ret = __atomic_fetch_and_4(vp4, v4, __ATOMIC_SEQ_CST); }
     426        { long long int ret; ret = __atomic_fetch_and(vp8, v8, __ATOMIC_SEQ_CST); }
     427        { long long int ret; ret = __atomic_fetch_and_8(vp8, v8, __ATOMIC_SEQ_CST); }
     428        #if defined(__SIZEOF_INT128__)
     429        { __int128 ret; ret = __atomic_fetch_and(vp16, v16, __ATOMIC_SEQ_CST); }
     430        { __int128 ret; ret = __atomic_fetch_and_16(vp16, v16, __ATOMIC_SEQ_CST); }
     431        #endif
     432
     433        { char ret; ret = __atomic_fetch_nand(vp1, v1, __ATOMIC_SEQ_CST); }
     434        { char ret; ret = __atomic_fetch_nand_1(vp1, v1, __ATOMIC_SEQ_CST); }
     435        { short ret; ret = __atomic_fetch_nand(vp2, v2, __ATOMIC_SEQ_CST); }
     436        { short ret; ret = __atomic_fetch_nand_2(vp2, v2, __ATOMIC_SEQ_CST); }
     437        { int ret; ret = __atomic_fetch_nand(vp4, v4, __ATOMIC_SEQ_CST); }
     438        { int ret; ret = __atomic_fetch_nand_4(vp4, v4, __ATOMIC_SEQ_CST); }
     439        { long long int ret; ret = __atomic_fetch_nand(vp8, v8, __ATOMIC_SEQ_CST); }
     440        { long long int ret; ret = __atomic_fetch_nand_8(vp8, v8, __ATOMIC_SEQ_CST); }
     441        #if defined(__SIZEOF_INT128__)
     442        { __int128 ret; ret = __atomic_fetch_nand(vp16, v16, __ATOMIC_SEQ_CST); }
     443        { __int128 ret; ret = __atomic_fetch_nand_16(vp16, v16, __ATOMIC_SEQ_CST); }
     444        #endif
     445
     446        { char ret; ret = __atomic_fetch_xor(vp1, v1, __ATOMIC_SEQ_CST); }
     447        { char ret; ret = __atomic_fetch_xor_1(vp1, v1, __ATOMIC_SEQ_CST); }
     448        { short ret; ret = __atomic_fetch_xor(vp2, v2, __ATOMIC_SEQ_CST); }
     449        { short ret; ret = __atomic_fetch_xor_2(vp2, v2, __ATOMIC_SEQ_CST); }
     450        { int ret; ret = __atomic_fetch_xor(vp4, v4, __ATOMIC_SEQ_CST); }
     451        { int ret; ret = __atomic_fetch_xor_4(vp4, v4, __ATOMIC_SEQ_CST); }
     452        { long long int ret; ret = __atomic_fetch_xor(vp8, v8, __ATOMIC_SEQ_CST); }
     453        { long long int ret; ret = __atomic_fetch_xor_8(vp8, v8, __ATOMIC_SEQ_CST); }
     454        #if defined(__SIZEOF_INT128__)
     455        { __int128 ret; ret = __atomic_fetch_xor(vp16, v16, __ATOMIC_SEQ_CST); }
     456        { __int128 ret; ret = __atomic_fetch_xor_16(vp16, v16, __ATOMIC_SEQ_CST); }
     457        #endif
     458
     459        { char ret; ret = __atomic_fetch_or(vp1, v1, __ATOMIC_SEQ_CST); }
     460        { char ret; ret = __atomic_fetch_or_1(vp1, v1, __ATOMIC_SEQ_CST); }
     461        { short ret; ret = __atomic_fetch_or(vp2, v2, __ATOMIC_SEQ_CST); }
     462        { short ret; ret = __atomic_fetch_or_2(vp2, v2, __ATOMIC_SEQ_CST); }
     463        { int ret; ret = __atomic_fetch_or(vp4, v4, __ATOMIC_SEQ_CST); }
     464        { int ret; ret = __atomic_fetch_or_4(vp4, v4, __ATOMIC_SEQ_CST); }
     465        { long long int ret; ret = __atomic_fetch_or(vp8, v8, __ATOMIC_SEQ_CST); }
     466        { long long int ret; ret = __atomic_fetch_or_8(vp8, v8, __ATOMIC_SEQ_CST); }
     467        #if defined(__SIZEOF_INT128__)
     468        { __int128 ret; ret = __atomic_fetch_or(vp16, v16, __ATOMIC_SEQ_CST); }
     469        { __int128 ret; ret = __atomic_fetch_or_16(vp16, v16, __ATOMIC_SEQ_CST); }
     470        #endif
     471
     472        { _Bool ret; ret = __atomic_always_lock_free(sizeof(int), vp4); }
     473        { _Bool ret; ret = __atomic_is_lock_free(sizeof(int), vp4); }
    352474        { __atomic_thread_fence(__ATOMIC_SEQ_CST); }
    353475        { __atomic_signal_fence(__ATOMIC_SEQ_CST); }
  • tests/concurrent/examples/.expect/datingService.txt

    r3d5701e r9fb8f01  
     1Girl:17 is dating Boy at 2 with ccode 17
     2 Boy:2 is dating Girl 17 with ccode 17
     3 Boy:14 is dating Girl 5 with ccode 5
     4Girl:5 is dating Boy at 14 with ccode 5
     5 Boy:9 is dating Girl 10 with ccode 10
     6Girl:10 is dating Boy at 9 with ccode 10
     7 Boy:1 is dating Girl 18 with ccode 18
     8Girl:18 is dating Boy at 1 with ccode 18
     9 Boy:16 is dating Girl 3 with ccode 3
     10Girl:3 is dating Boy at 16 with ccode 3
     11 Boy:5 is dating Girl 14 with ccode 14
     12Girl:14 is dating Boy at 5 with ccode 14
     13 Boy:15 is dating Girl 4 with ccode 4
     14Girl:4 is dating Boy at 15 with ccode 4
     15Girl:0 is dating Boy at 19 with ccode 0
     16 Boy:19 is dating Girl 0 with ccode 0
     17Girl:9 is dating Boy at 10 with ccode 9
     18 Boy:10 is dating Girl 9 with ccode 9
     19Girl:11 is dating Boy at 8 with ccode 11
     20 Boy:8 is dating Girl 11 with ccode 11
     21 Boy:12 is dating Girl 7 with ccode 7
     22Girl:7 is dating Boy at 12 with ccode 7
     23 Boy:11 is dating Girl 8 with ccode 8
     24Girl:8 is dating Boy at 11 with ccode 8
     25Girl:16 is dating Boy at 3 with ccode 16
     26 Boy:3 is dating Girl 16 with ccode 16
     27Girl:15 is dating Boy at 4 with ccode 15
     28 Boy:4 is dating Girl 15 with ccode 15
     29Girl:19 is dating Boy at 0 with ccode 19
     30 Boy:0 is dating Girl 19 with ccode 19
     31Girl:2 is dating Boy at 17 with ccode 2
     32 Boy:17 is dating Girl 2 with ccode 2
     33 Boy:13 is dating Girl 6 with ccode 6
     34Girl:6 is dating Boy at 13 with ccode 6
     35 Boy:7 is dating Girl 12 with ccode 12
     36Girl:12 is dating Boy at 7 with ccode 12
     37Girl:13 is dating Boy at 6 with ccode 13
     38 Boy:6 is dating Girl 13 with ccode 13
     39Girl:1 is dating Boy at 18 with ccode 1
     40 Boy:18 is dating Girl 1 with ccode 1
  • tests/concurrent/examples/boundedBufferEXT.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed Apr 18 22:52:12 2018
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jan 16 22:36:34 2020
    13 // Update Count     : 15
     12// Last Modified On : Fri Jun 21 08:19:20 2019
     13// Update Count     : 14
    1414//
    1515
     
    3737
    3838        void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) {
    39                 if ( count == BufferSize ) waitfor( remove : buffer );
     39                if ( count == BufferSize ) waitfor( remove, buffer );
    4040                elements[back] = elem;
    4141                back = ( back + 1 ) % BufferSize;
     
    4444
    4545        T remove( Buffer(T) & mutex buffer ) with( buffer ) {
    46                 if ( count == 0 ) waitfor( insert : buffer );
     46                if ( count == 0 ) waitfor( insert, buffer );
    4747                T elem = elements[front];
    4848                front = ( front + 1 ) % BufferSize;
  • tests/concurrent/examples/boundedBufferTHREAD.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed Apr 18 22:52:12 2018
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jan 16 23:09:43 2020
    13 // Update Count     : 25
     12// Last Modified On : Fri Jun 21 11:50:12 2019
     13// Update Count     : 24
    1414//
    1515
     
    4444        void main( Buffer & buffer ) with( buffer ) {
    4545                for () {
    46                         waitfor( ^?{} : buffer ) {
     46                        waitfor( ^?{}, buffer ) {
    4747                                break;
    48                         } or when ( count != 20 ) waitfor( insert : buffer ) {
     48                        } or when ( count != 20 ) waitfor( insert, buffer ) {
    4949                                back = (back + 1) % 20;
    5050                                count += 1;
    51                         } or when ( count != 0 ) waitfor( remove : buffer ) {
     51                        } or when ( count != 0 ) waitfor( remove, buffer ) {
    5252                                front = (front + 1) % 20;
    5353                                count -= 1;
  • tests/concurrent/examples/datingService.cfa

    r3d5701e r9fb8f01  
    11//
    22// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
    3 //
     3// 
    44// The contents of this file are covered under the licence agreement in the
    55// file "LICENCE" distributed with Cforall.
     
    3535                signal_block( Boys[ccode] );                                    // restart boy to set phone number
    3636        } // if
    37         //sout | "Girl:" | PhoneNo | "is dating Boy at" | BoyPhoneNo | "with ccode" | ccode;
     37        sout | "Girl:" | PhoneNo | "is dating Boy at" | BoyPhoneNo | "with ccode" | ccode;
    3838        return BoyPhoneNo;
    3939} // DatingService girl
     
    4747                signal_block( Girls[ccode] );                                   // restart girl to set phone number
    4848        } // if
    49         //sout | " Boy:" | PhoneNo | "is dating Girl" | GirlPhoneNo | "with ccode" | ccode;
     49        sout | " Boy:" | PhoneNo | "is dating Girl" | GirlPhoneNo | "with ccode" | ccode;
    5050        return GirlPhoneNo;
    5151} // DatingService boy
  • tests/concurrent/examples/gortn.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed Feb 20 08:02:37 2019
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jan 16 22:43:40 2020
    13 // Update Count     : 5
     12// Last Modified On : Fri Jun 21 08:25:03 2019
     13// Update Count     : 4
    1414//
    1515
     
    2626void main( GoRtn & gortn ) with( gortn ) {
    2727        for () {
    28                 waitfor( mem1 : gortn ) sout | i;
    29                 or waitfor( mem2 : gortn ) sout | f;
    30                 or waitfor( mem3 : gortn ) sout | m.i | m.j;
    31                 or waitfor( ^?{} : gortn ) break;
     28                waitfor( mem1, gortn ) sout | i;
     29                or waitfor( mem2, gortn ) sout | f;
     30                or waitfor( mem3, gortn ) sout | m.i | m.j;
     31                or waitfor( ^?{}, gortn ) break;
    3232        }
    3333}
  • tests/concurrent/examples/quickSort.cfa

    r3d5701e r9fb8f01  
    1111// Created On       : Wed Dec  6 12:15:52 2017
    1212// Last Modified By : Peter A. Buhr
    13 // Last Modified On : Wed Feb 12 18:24:47 2020
    14 // Update Count     : 177
     13// Last Modified On : Fri Jun 21 08:27:45 2019
     14// Update Count     : 172
    1515//
    1616
     
    2727
    2828void ?{}( Quicksort & qs, int values[], int size, int depth ) {
    29         qs.[values, low, high, depth] = [values, 0, size, depth];
     29        qs.values = values;  qs.low = 0;  qs.high = size;  qs.depth = depth;
    3030} // Quicksort
    3131
     
    6666                        if ( depth > 0 ) {
    6767                                depth -= 1;
    68                                 Quicksort lqs = { values, low, right, depth }; // concurrently sort lower half
    69                                 Quicksort rqs = { values, left, high, depth }; // concurrently sort upper half
    70                                 // Quicksort lqs = { values, low, right, depth }; // concurrently sort lower half
    71                                 // sort( values, left, high, depth );           // concurrently sort upper half
     68                                Quicksort rqs = { values, low, right, depth }; // concurrently sort upper half
     69                                //Quicksort lqs( values, left, high, depth ); // concurrently sort lower half
     70                                sort( values, left, high, depth );              // concurrently sort lower half
    7271                        } else {
    7372                                sort( values, low, right, 0 );                  // sequentially sort lower half
     
    163162                processor processors[ (1 << depth) - 1 ] __attribute__(( unused )); // create 2^depth-1 kernel threads
    164163
    165                 int * values = alloc( size );                                   // values to be sorted, too large to put on stack
    166                 for ( counter; size ) {                                                 // generate unsorted numbers
     164                int * values = alloc( size );                           // values to be sorted, too large to put on stack
     165                for ( counter; size ) {                                         // generate unsorted numbers
    167166                        values[counter] = size - counter;                       // descending values
    168                 } // for
    169                 for ( i; 200 ) {                                                                // random shuffle a few values
    170                         swap( values[rand() % size], values[rand() % size] );
    171167                } // for
    172168                {
     
    182178} // main
    183179
    184 // for depth in 0 1 2 3 4 5 ; do echo "sort 500000000 values with ${depth} depth" ; time -f "%Uu %Ss %E %Mkb" a.out -t 500000000 ${depth} ; done
    185 
    186180// Local Variables: //
    187181// tab-width: 4 //
  • tests/concurrent/multi-monitor.cfa

    r3d5701e r9fb8f01  
    1111
    1212void increment( monitor_t & mutex p1, monitor_t & mutex p2, int & value ) {
    13         assert(active_thread() == get_monitor(p1)->owner);
    14         assert(active_thread() == get_monitor(p2)->owner);
    1513        value += 1;
    16         assert(active_thread() == get_monitor(p1)->owner);
    17         assert(active_thread() == get_monitor(p2)->owner);
    1814}
    1915
  • tests/concurrent/preempt.cfa

    r3d5701e r9fb8f01  
    3636                if( (counter % 7) == this.value ) {
    3737                        __cfaabi_check_preemption();
    38                         int next = __atomic_add_fetch( &counter, 1, __ATOMIC_SEQ_CST );
     38                        int next = __atomic_add_fetch_4(&counter, 1, __ATOMIC_SEQ_CST);
    3939                        __cfaabi_check_preemption();
    4040                        if( (next % 100) == 0 ) printf("%d\n", (int)next);
  • tests/concurrent/signal/block.cfa

    r3d5701e r9fb8f01  
    3333
    3434monitor global_data_t {
    35         $thread * last_thread;
    36         $thread * last_signaller;
     35        thread_desc * last_thread;
     36        thread_desc * last_signaller;
    3737};
    3838
     
    8282        if( !is_empty( cond ) ) {
    8383
    84                 $thread * next = front( cond );
     84                thread_desc * next = front( cond );
    8585
    8686                if( ! signal_block( cond ) ) {
  • tests/concurrent/signal/wait.cfa

    r3d5701e r9fb8f01  
    9898        }
    9999
    100         __atomic_fetch_sub( &waiter_left, 1,  __ATOMIC_SEQ_CST );
     100        __sync_fetch_and_sub_4( &waiter_left, 1);
    101101}
    102102
     
    109109        }
    110110
    111         __atomic_fetch_sub( &waiter_left, 1,  __ATOMIC_SEQ_CST );
     111        __sync_fetch_and_sub_4( &waiter_left, 1);
    112112}
    113113
     
    120120        }
    121121
    122         __atomic_fetch_sub( &waiter_left, 1,  __ATOMIC_SEQ_CST );
     122        __sync_fetch_and_sub_4( &waiter_left, 1);
    123123}
    124124
     
    131131        }
    132132
    133         __atomic_fetch_sub( &waiter_left, 1,  __ATOMIC_SEQ_CST );
     133        __sync_fetch_and_sub_4( &waiter_left, 1);
    134134}
    135135
  • tests/concurrent/thread.cfa

    r3d5701e r9fb8f01  
    77thread Second { semaphore* lock; };
    88
    9 void ?{}( First  & this, semaphore & lock ) { ((thread&)this){ "Thread 1" }; this.lock = &lock; }
    10 void ?{}( Second & this, semaphore & lock ) { ((thread&)this){ "Thread 2" }; this.lock = &lock; }
     9void ?{}( First  & this, semaphore & lock ) { ((thread&)this){"Thread 1"}; this.lock = &lock; }
     10void ?{}( Second & this, semaphore & lock ) { ((thread&)this){"Thread 2"}; this.lock = &lock; }
    1111
    1212void main(First& this) {
  • tests/concurrent/waitfor/barge.cfa

    r3d5701e r9fb8f01  
    6565                yield(random( 10 ));
    6666                this.state = WAITFOR;
    67                 waitfor(do_call : this) {
     67                waitfor(do_call, this) {
    6868                        sout | i;
    6969                }
  • tests/concurrent/waitfor/dtor.cfa

    r3d5701e r9fb8f01  
    4747        yield(random( 10 ));
    4848        set_state( this, MAIN );
    49         waitfor( ^?{} : this ) {
     49        waitfor( ^?{}, this ) {
    5050                set_state( this, AFTER );
    5151        }
  • tests/concurrent/waitfor/else.cfa

    r3d5701e r9fb8f01  
    1414        sout | "Starting";
    1515
    16         when( false ) waitfor( notcalled : m );
     16        when( false ) waitfor( notcalled, m );
    1717
    1818        sout | "Step" | i++;
    1919
    20         waitfor( notcalled : m ); or else {
     20        waitfor( notcalled, m ); or else {
    2121                sout | "else called";
    2222        }
     
    2424        sout | "Step" | i++;
    2525
    26         when( true ) waitfor( notcalled : m ); or when( true ) else {
     26        when( true ) waitfor( notcalled, m ); or when( true ) else {
    2727                sout | "else called";
    2828        }
     
    3030        sout | "Step" | i++;
    3131
    32         when( false ) waitfor( notcalled : m ); or when( true ) else {
     32        when( false ) waitfor( notcalled, m ); or when( true ) else {
    3333                sout | "else called";
    3434        }
     
    3636        sout | "Step" | i++;
    3737
    38         when( false ) waitfor( notcalled : m ); or when( false ) else {
     38        when( false ) waitfor( notcalled, m ); or when( false ) else {
    3939                sout | "else called";
    4040        }
  • tests/concurrent/waitfor/parse.cfa

    r3d5701e r9fb8f01  
    2424
    2525        //---------------------------------------
    26         waitfor( f1 : a ) {
     26        waitfor( f1, a ) {
    2727                1;
    2828        }
    2929
    3030        //---------------------------------------
    31         waitfor( f1 : a ) {
     31        waitfor( f1, a ) {
    3232                2;
    3333        }
    34         waitfor( f2 : a ) {
     34        waitfor( f2, a ) {
    3535                3;
    3636        }
    3737
    3838        //---------------------------------------
    39         when( 1 < 3 ) waitfor( f2 : a, a ) {
     39        when( 1 < 3 ) waitfor( f2, a, a ) {
    4040                4;
    4141        }
     
    4545
    4646        //---------------------------------------
    47         when( 2 < 3 ) waitfor( f3 : a ) {
     47        when( 2 < 3 ) waitfor( f3, a ) {
    4848                5;
    4949        }
     
    5353
    5454        //---------------------------------------
    55         when( 3 < 3 ) waitfor( f3 : a, a ) {
     55        when( 3 < 3 ) waitfor( f3, a, a ) {
    5656                7;
    5757        }
     
    6464
    6565        //---------------------------------------
    66         when( 6 < 3 ) waitfor( f3 : a, a, a ) {
     66        when( 6 < 3 ) waitfor( f3, a, a, a ) {
    6767                10;
    6868        }
    69         or when( 7 < 3 ) waitfor( f1 : a  ) {
     69        or when( 7 < 3 ) waitfor( f1, a  ) {
    7070                11;
    7171        }
     
    7575
    7676        //---------------------------------------
    77         when( 8 < 3 ) waitfor( f3 : a, a ) {
     77        when( 8 < 3 ) waitfor( f3, a, a ) {
    7878                13;
    7979        }
    80         or waitfor( f1 : a  ) {
     80        or waitfor( f1, a  ) {
    8181                14;
    8282        }
     
    8686
    8787        //---------------------------------------
    88         when( 10 < 3 ) waitfor( f1 : a ) {
     88        when( 10 < 3 ) waitfor( f1, a ) {
    8989                16;
    9090        }
    91         or waitfor( f2 : a, a ) {
     91        or waitfor( f2, a, a ) {
    9292                17;
    9393        }
     
    100100}
    101101
    102 int main() {}
     102int main() {
     103
     104}
  • tests/concurrent/waitfor/parse2.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed Aug 30 17:53:29 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Jan 16 23:13:37 2020
    13 // Update Count     : 6
     12// Last Modified On : Fri Mar 22 13:42:11 2019
     13// Update Count     : 3
    1414//
    1515
     
    2626        }
    2727
    28         waitfor( x : z ) {
     28        waitfor( x, z ) {
    2929        }
    3030
     
    3737        or waitfor( y );
    3838
    39         waitfor( x : z );
     39        waitfor( x, z );
    4040        or waitfor( y );
    4141
     
    4343        or when( true ) waitfor( y );
    4444
    45         when( true ) waitfor( x : z );
     45        when( true ) waitfor( x, z );
    4646        or when( true ) waitfor( y );
    4747
     
    5050        }
    5151
    52         waitfor( x : z ) {
     52        waitfor( x, z ) {
    5353        } or waitfor( y ) {
    5454        }
     
    8080        or else;
    8181
    82         when( true ) waitfor( x : z );
     82        when( true ) waitfor( x, z );
    8383        or else;
    8484
     
    9999        }
    100100
    101         when( true ) waitfor( x : z );
     101        when( true ) waitfor( x, z );
    102102        or else {
    103103        }
     
    115115        or when( true ) else;
    116116
    117         when( true ) waitfor( x : z );
     117        when( true ) waitfor( x, z );
    118118        or when( true ) else;
    119119
     
    134134        }
    135135
    136         when( true ) waitfor( x : z );
     136        when( true ) waitfor( x, z );
    137137        or when( true ) else {
    138138        }
     
    149149        or timeout( 3 );
    150150
    151         waitfor( x : z );
     151        waitfor( x, z );
    152152        or timeout( 3 );
    153153
     
    163163        }
    164164
    165         when( true ) waitfor( x : z ) {
     165        when( true ) waitfor( x, z ) {
    166166        } or timeout( 3 ) {
    167167        }
     
    171171        }
    172172
    173         when( true ) waitfor( x : z ) {
     173        when( true ) waitfor( x, z ) {
    174174        } or when ( true ) timeout( 3 ) {
    175175        }
     
    229229
    230230        int or, timeout;
    231         waitfor( timeout : 7 ) 3;
    232         waitfor( timeout : 7 ) 3; or waitfor( timeout : 7 ) 3;
    233         when( or ) waitfor( or : ) { 4; } or timeout( 1 ) 3;
    234         when( 3 ) waitfor( or : 2 ) 4; or else 4;
    235         when( 3 ) waitfor( or : 3 ) 4; or when( or ) timeout( or ) 4; or when( or ) else timeout;
    236         when( 3 ) waitfor( or : or ) 3; or when( or ) waitfor( or : timeout ) 4; or else 4;
    237         when( 3 ) waitfor( or : or ) 3; or waitfor( or : 9 ) 4; or when( or ) timeout( timeout ) 4;
    238         when( 3 ) waitfor( or : 3 ) 3; or waitfor( or : 7 ) or; or timeout( 1 ) or; or when( 3 ) else or;
     231        waitfor( timeout, 7 ) 3;
     232        waitfor( timeout, 7 ) 3; or waitfor( timeout, 7 ) 3;
     233        when( or ) waitfor( or, ) { 4; } or timeout( 1 ) 3;
     234        when( 3 ) waitfor( or, 2 ) 4; or else 4;
     235        when( 3 ) waitfor( or, 3 ) 4; or when( or ) timeout( or ) 4; or when( or ) else timeout;
     236        when( 3 ) waitfor( or, or ) 3; or when( or ) waitfor( or, timeout ) 4; or else 4;
     237        when( 3 ) waitfor( or, or ) 3; or waitfor( or, 9 ) 4; or when( or ) timeout( timeout ) 4;
     238        when( 3 ) waitfor( or, 3 ) 3; or waitfor( or, 7 ) or; or timeout( 1 ) or; or when( 3 ) else or;
    239239
    240240        // test else selection
  • tests/concurrent/waitfor/recurse.cfa

    r3d5701e r9fb8f01  
    6666
    6767        rand_yield();
    68         waitfor( call4 : this );
     68        waitfor( call4, this );
    6969        rand_yield();
    7070
     
    7878
    7979        rand_yield();
    80         waitfor( call3 : this );
     80        waitfor( call3, this );
    8181        rand_yield();
    8282
     
    9292
    9393        rand_yield();
    94         waitfor( call2 : this );
     94        waitfor( call2, this );
    9595        rand_yield();
    9696
  • tests/concurrent/waitfor/statment.cfa

    r3d5701e r9fb8f01  
    101101
    102102        while( !done ) {
    103                    waitfor( get_index : this );
    104                 or waitfor( call1 : this ) { sout | "Statement"; if( this.last_val != 1 ) { serr | "Incorrect index: expected" | 1 | "got" | this.last_val; } }
    105                 or waitfor( call2 : this ) { sout | "Statement"; if( this.last_val != 2 ) { serr | "Incorrect index: expected" | 2 | "got" | this.last_val; } }
    106                 or waitfor( call3 : this ) { sout | "Statement"; if( this.last_val != 3 ) { serr | "Incorrect index: expected" | 3 | "got" | this.last_val; } }
    107                 or waitfor( call4 : this ) { sout | "Statement"; if( this.last_val != 4 ) { serr | "Incorrect index: expected" | 4 | "got" | this.last_val; } }
    108                 or waitfor( call5 : this ) { sout | "Statement"; if( this.last_val != 5 ) { serr | "Incorrect index: expected" | 5 | "got" | this.last_val; } }
    109                 or waitfor( call6 : this ) { sout | "Statement"; if( this.last_val != 6 ) { serr | "Incorrect index: expected" | 6 | "got" | this.last_val; } }
    110                 or waitfor( call7 : this ) { sout | "Statement"; if( this.last_val != 7 ) { serr | "Incorrect index: expected" | 7 | "got" | this.last_val; } }
     103                   waitfor( get_index, this );
     104                or waitfor( call1, this ) { sout | "Statement"; if( this.last_val != 1 ) { serr | "Incorrect index: expected" | 1 | "got" | this.last_val; } }
     105                or waitfor( call2, this ) { sout | "Statement"; if( this.last_val != 2 ) { serr | "Incorrect index: expected" | 2 | "got" | this.last_val; } }
     106                or waitfor( call3, this ) { sout | "Statement"; if( this.last_val != 3 ) { serr | "Incorrect index: expected" | 3 | "got" | this.last_val; } }
     107                or waitfor( call4, this ) { sout | "Statement"; if( this.last_val != 4 ) { serr | "Incorrect index: expected" | 4 | "got" | this.last_val; } }
     108                or waitfor( call5, this ) { sout | "Statement"; if( this.last_val != 5 ) { serr | "Incorrect index: expected" | 5 | "got" | this.last_val; } }
     109                or waitfor( call6, this ) { sout | "Statement"; if( this.last_val != 6 ) { serr | "Incorrect index: expected" | 6 | "got" | this.last_val; } }
     110                or waitfor( call7, this ) { sout | "Statement"; if( this.last_val != 7 ) { serr | "Incorrect index: expected" | 7 | "got" | this.last_val; } }
    111111
    112112                done = true;
  • tests/concurrent/waitfor/when.cfa

    r3d5701e r9fb8f01  
    5858void arbiter( global_t & mutex this ) {
    5959        for( int i = 0; i < N; i++ ) {
    60                    when( this.last_call == 6 ) waitfor( call1 : this ) { if( this.last_call != 1) { serr | "Expected last_call to be 1 got" | this.last_call; } }
    61                 or when( this.last_call == 1 ) waitfor( call2 : this ) { if( this.last_call != 2) { serr | "Expected last_call to be 2 got" | this.last_call; } }
    62                 or when( this.last_call == 2 ) waitfor( call3 : this ) { if( this.last_call != 3) { serr | "Expected last_call to be 3 got" | this.last_call; } }
    63                 or when( this.last_call == 3 ) waitfor( call4 : this ) { if( this.last_call != 4) { serr | "Expected last_call to be 4 got" | this.last_call; } }
    64                 or when( this.last_call == 4 ) waitfor( call5 : this ) { if( this.last_call != 5) { serr | "Expected last_call to be 5 got" | this.last_call; } }
    65                 or when( this.last_call == 5 ) waitfor( call6 : this ) { if( this.last_call != 6) { serr | "Expected last_call to be 6 got" | this.last_call; } }
     60                   when( this.last_call == 6 ) waitfor( call1, this ) { if( this.last_call != 1) { serr | "Expected last_call to be 1 got" | this.last_call; } }
     61                or when( this.last_call == 1 ) waitfor( call2, this ) { if( this.last_call != 2) { serr | "Expected last_call to be 2 got" | this.last_call; } }
     62                or when( this.last_call == 2 ) waitfor( call3, this ) { if( this.last_call != 3) { serr | "Expected last_call to be 3 got" | this.last_call; } }
     63                or when( this.last_call == 3 ) waitfor( call4, this ) { if( this.last_call != 4) { serr | "Expected last_call to be 4 got" | this.last_call; } }
     64                or when( this.last_call == 4 ) waitfor( call5, this ) { if( this.last_call != 5) { serr | "Expected last_call to be 5 got" | this.last_call; } }
     65                or when( this.last_call == 5 ) waitfor( call6, this ) { if( this.last_call != 6) { serr | "Expected last_call to be 6 got" | this.last_call; } }
    6666
    6767                sout | this.last_call;
  • tests/config.py.in

    r3d5701e r9fb8f01  
    88BUILDDIR = "@abs_builddir@"
    99HOSTARCH = "@host_cpu@"
    10 DISTRIBUTE = @HAS_DISTCC@
  • tests/expression.cfa

    r3d5701e r9fb8f01  
    1 struct S { int i; };
    2 void ?{}( S & s, int i ) { s.i = i; }
    3 int ?`mary( int );
    4 int ?`mary( S );
    5 [int] ?`mary( [int, int] );
    6 int & ?`jane( int & );
    7 int jack( int );
    8 
    91int main() {
    10     int a[3] = { 0, 0, 0 };
    11     S s = { 3 }, * ps = &s;
    12     [int] t = { 3 };
    13     * [int] pt = &t;
    14     int i = 1, j = 2;
     2    struct s { int i; } x, *p = &x;
     3    int i = 3;
    154
    165    // operators
    176
    18     !i;
     7    ! i;
    198    ~i;
    209    +i;
    2110    -i;
    22     *ps;
    23     ++ps;
    24     --ps;
    25     ps++;
    26     ps--;
     11    *p;
     12    ++p;
     13    --p;
     14    p++;
     15    p--;
    2716
    28     i + j;
    29     i - j;
    30     i * j;
     17    i+i;
     18    i-i;
     19    i*i;
    3120
    32     i / j;
    33     i % j;
    34     i ^ j;
    35     i & j;
    36     i | j;
    37     i < j;
    38     i > j;
    39     i = j;
     21    i/i;
     22    i%i;
     23    i^i;
     24    i&i;
     25    i|i;
     26    i<i;
     27    i>i;
     28    i=i;
    4029
    41     i == j;
    42     i != j;
    43     i << j;
    44     i >> j;
    45     i <= j;
    46     i >= j;
    47     i && j;
    48     i || j;
    49     ps->i;
     30    i==i;
     31    i!=i;
     32    i<<i;
     33    i>>i;
     34    i<=i;
     35    i>=i;
     36    i&&i;
     37    i||i;
     38    p->i;
     39    i*=i;
     40    i/=i;
     41    i%=i;
     42    i+=i;
     43    i-=i;
     44    i&=i;
     45    i|=i;
     46    i^=i;
     47    i<<=i;
     48    i>>=i;
    5049
    51     i *= j;
    52     i /= j;
    53     i %= j;
    54     i += j;
    55     i -= j;
    56     i &= j;
    57     i |= j;
    58     i ^= j;
    59     i <<= j;
    60     i >>= j;
    61 
    62     i ? i : j;
    63 
    64     // postfix function call
    65 
    66     (3 + 4)`mary;
    67     ({3 + 4;})`mary;
    68     [3, 4]`mary;
    69     3`mary;
    70     a[0]`mary;
    71     a[0]`mary`mary;
    72     s{0}`mary;
    73     a[3]`jane++;
    74     jack(3)`mary;
    75     s.i`mary;
    76     t.0`mary;
    77     s.[i]`mary;
    78     ps->i`mary;
    79     pt->0`mary;
    80     ps->[i]`mary;
    81     i++`mary;
    82     i--`mary;
    83     (S){2}`mary;
    84     (S)@{2}`mary;
     50    i?i:i;
    8551} // main
  • tests/heap.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Nov  6 17:54:56 2018
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Nov 24 12:34:51 2019
    13 // Update Count     : 28
     12// Last Modified On : Fri Jul 19 08:22:34 2019
     13// Update Count     : 19
    1414//
    1515
     
    3838        enum { NoOfAllocs = 5000, NoOfMmaps = 10 };
    3939        char * locns[NoOfAllocs];
    40         size_t amount;
    41         enum { limit = 64 * 1024 };                                                     // check alignments up to here
     40        int i;
    4241
    4342        // check alloc/free
     
    7574                size_t s = (i + 1) * 20;
    7675                char * area = (char *)malloc( s );
    77                 if ( area == 0p ) abort( "malloc/free out of memory" );
     76                if ( area == 0 ) abort( "malloc/free out of memory" );
    7877                area[0] = '\345'; area[s - 1] = '\345';                 // fill first/last
    7978                area[malloc_usable_size( area ) - 1] = '\345';  // fill ultimate byte
     
    8483                size_t s = i + 1;                                                               // +1 to make initialization simpler
    8584                locns[i] = (char *)malloc( s );
    86                 if ( locns[i] == 0p ) abort( "malloc/free out of memory" );
     85                if ( locns[i] == 0 ) abort( "malloc/free out of memory" );
    8786                locns[i][0] = '\345'; locns[i][s - 1] = '\345'; // fill first/last
    8887                locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
     
    10099                size_t s = i + default_mmap_start();                    // cross over point
    101100                char * area = (char *)malloc( s );
    102                 if ( area == 0p ) abort( "malloc/free out of memory" );
     101                if ( area == 0 ) abort( "malloc/free out of memory" );
    103102                area[0] = '\345'; area[s - 1] = '\345';                 // fill first/last
    104103                area[malloc_usable_size( area ) - 1] = '\345';  // fill ultimate byte
     
    109108                size_t s = i + default_mmap_start();                    // cross over point
    110109                locns[i] = (char *)malloc( s );
    111                 if ( locns[i] == 0p ) abort( "malloc/free out of memory" );
     110                if ( locns[i] == 0 ) abort( "malloc/free out of memory" );
    112111                locns[i][0] = '\345'; locns[i][s - 1] = '\345'; // fill first/last
    113112                locns[i][malloc_usable_size( locns[i] ) - 1] = '\345'; // fill ultimate byte
     
    125124                size_t s = (i + 1) * 20;
    126125                char * area = (char *)calloc( 5, s );
    127                 if ( area == 0p ) abort( "calloc/free out of memory" );
     126                if ( area == 0 ) abort( "calloc/free out of memory" );
    128127                if ( area[0] != '\0' || area[s - 1] != '\0' ||
    129128                         area[malloc_usable_size( area ) - 1] != '\0' ||
     
    137136                size_t s = i + 1;
    138137                locns[i] = (char *)calloc( 5, s );
    139                 if ( locns[i] == 0p ) abort( "calloc/free out of memory" );
     138                if ( locns[i] == 0 ) abort( "calloc/free out of memory" );
    140139                if ( locns[i][0] != '\0' || locns[i][s - 1] != '\0' ||
    141140                         locns[i][malloc_usable_size( locns[i] ) - 1] != '\0' ||
     
    156155                size_t s = i + default_mmap_start();                    // cross over point
    157156                char * area = (char *)calloc( 1, s );
    158                 if ( area == 0p ) abort( "calloc/free out of memory" );
     157                if ( area == 0 ) abort( "calloc/free out of memory" );
    159158                if ( area[0] != '\0' || area[s - 1] != '\0' ) abort( "calloc/free corrupt storage4.1" );
    160159                if ( area[malloc_usable_size( area ) - 1] != '\0' ) abort( "calloc/free corrupt storage4.2" );
     
    168167                size_t s = i + default_mmap_start();                    // cross over point
    169168                locns[i] = (char *)calloc( 1, s );
    170                 if ( locns[i] == 0p ) abort( "calloc/free out of memory" );
     169                if ( locns[i] == 0 ) abort( "calloc/free out of memory" );
    171170                if ( locns[i][0] != '\0' || locns[i][s - 1] != '\0' ||
    172171                         locns[i][malloc_usable_size( locns[i] ) - 1] != '\0' ||
     
    184183        // check memalign/free (sbrk)
    185184
     185        enum { limit = 64 * 1024 };                                                     // check alignments up to here
     186
    186187        for ( a; libAlign() ~= limit ~ a ) {                            // generate powers of 2
    187188                //sout | alignments[a];
    188189                for ( s; 1 ~ NoOfAllocs ) {                                             // allocation of size 0 can return null
    189190                        char * area = (char *)memalign( a, s );
    190                         if ( area == 0p ) abort( "memalign/free out of memory" );
    191                         //sout | i | area;
     191                        if ( area == 0 ) abort( "memalign/free out of memory" );
     192                        //sout | i | " " | area;
    192193                        if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
    193194                                abort( "memalign/free bad alignment : memalign(%d,%d) = %p", (int)a, s, area );
    194195                        } // if
    195                         area[0] = '\345'; area[s - 1] = '\345';         // fill first/last byte
     196                        area[0] = '\345'; area[s - 1] = '\345'; // fill first/last byte
    196197                        area[malloc_usable_size( area ) - 1] = '\345'; // fill ultimate byte
    197198                        free( area );
     
    206207                        size_t s = i + default_mmap_start();            // cross over point
    207208                        char * area = (char *)memalign( a, s );
    208                         if ( area == 0p ) abort( "memalign/free out of memory" );
    209                         //sout | i | area;
     209                        if ( area == 0 ) abort( "memalign/free out of memory" );
     210                        //sout | i | " " | area;
    210211                        if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
    211212                                abort( "memalign/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)s, area );
     
    222223                // initial N byte allocation
    223224                char * area = (char *)calloc( 5, i );
    224                 if ( area == 0p ) abort( "calloc/realloc/free out of memory" );
     225                if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
    225226                if ( area[0] != '\0' || area[i - 1] != '\0' ||
    226227                         area[malloc_usable_size( area ) - 1] != '\0' ||
     
    230231                for ( s; i ~ 256 * 1024 ~ 26 ) {                                // start at initial memory request
    231232                        area = (char *)realloc( area, s );                      // attempt to reuse storage
    232                         if ( area == 0p ) abort( "calloc/realloc/free out of memory" );
     233                        if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
    233234                        if ( area[0] != '\0' || area[s - 1] != '\0' ||
    234235                                 area[malloc_usable_size( area ) - 1] != '\0' ||
     
    244245                size_t s = i + default_mmap_start();                    // cross over point
    245246                char * area = (char *)calloc( 1, s );
    246                 if ( area == 0p ) abort( "calloc/realloc/free out of memory" );
     247                if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
    247248                if ( area[0] != '\0' || area[s - 1] != '\0' ||
    248249                         area[malloc_usable_size( area ) - 1] != '\0' ||
     
    252253                for ( r; i ~ 256 * 1024 ~ 26 ) {                                // start at initial memory request
    253254                        area = (char *)realloc( area, r );                      // attempt to reuse storage
    254                         if ( area == 0p ) abort( "calloc/realloc/free out of memory" );
     255                        if ( area == 0 ) abort( "calloc/realloc/free out of memory" );
    255256                        if ( area[0] != '\0' || area[r - 1] != '\0' ||
    256257                                 area[malloc_usable_size( area ) - 1] != '\0' ||
     
    262263        // check memalign/realloc/free
    263264
    264         amount = 2;
     265        size_t amount = 2;
    265266        for ( a; libAlign() ~= limit ~ a ) {                            // generate powers of 2
    266267                // initial N byte allocation
    267268                char * area = (char *)memalign( a, amount );    // aligned N-byte allocation
    268                 if ( area == 0p ) abort( "memalign/realloc/free out of memory" ); // no storage ?
    269                 //sout | alignments[a] | area;
     269                if ( area == 0 ) abort( "memalign/realloc/free out of memory" ); // no storage ?
     270                //sout | alignments[a] | " " | area;
    270271                if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
    271272                        abort( "memalign/realloc/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)amount, area );
     
    277278                        if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "memalign/realloc/free corrupt storage" );
    278279                        area = (char *)realloc( area, s );                      // attempt to reuse storage
    279                         if ( area == 0p ) abort( "memalign/realloc/free out of memory" ); // no storage ?
    280                         //sout | i | area;
     280                        if ( area == 0 ) abort( "memalign/realloc/free out of memory" ); // no storage ?
     281                        //sout | i | " " | area;
    281282                        if ( (size_t)area % a != 0 ) {                          // check for initial alignment
    282283                                abort( "memalign/realloc/free bad alignment %p", area );
     
    293294                for ( s; 1 ~ limit ) {                                                  // allocation of size 0 can return null
    294295                        char * area = (char *)cmemalign( a, 1, s );
    295                         if ( area == 0p ) abort( "cmemalign/free out of memory" );
    296                         //sout | i | area;
     296                        if ( area == 0 ) abort( "cmemalign/free out of memory" );
     297                        //sout | i | " " | area;
    297298                        if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
    298299                                abort( "cmemalign/free bad alignment : cmemalign(%d,%d) = %p", (int)a, s, area );
     
    312313                // initial N byte allocation
    313314                char * area = (char *)cmemalign( a, 1, amount ); // aligned N-byte allocation
    314                 if ( area == 0p ) abort( "cmemalign/realloc/free out of memory" ); // no storage ?
    315                 //sout | alignments[a] | area;
     315                if ( area == 0 ) abort( "cmemalign/realloc/free out of memory" ); // no storage ?
     316                //sout | alignments[a] | " " | area;
    316317                if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
    317318                        abort( "cmemalign/realloc/free bad alignment : cmemalign(%d,%d) = %p", (int)a, (int)amount, area );
     
    326327                        if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "cmemalign/realloc/free corrupt storage2" );
    327328                        area = (char *)realloc( area, s );                      // attempt to reuse storage
    328                         if ( area == 0p ) abort( "cmemalign/realloc/free out of memory" ); // no storage ?
    329                         //sout | i | area;
     329                        if ( area == 0 ) abort( "cmemalign/realloc/free out of memory" ); // no storage ?
     330                        //sout | i | " " | area;
    330331                        if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
    331332                                abort( "cmemalign/realloc/free bad alignment %p", area );
     
    338339                free( area );
    339340        } // for
    340 
    341         // check memalign/realloc with align/free
    342 
    343         amount = 2;
    344         for ( a; libAlign() ~= limit ~ a ) {                            // generate powers of 2
    345                 // initial N byte allocation
    346                 char * area = (char *)memalign( a, amount );    // aligned N-byte allocation
    347                 if ( area == 0p ) abort( "memalign/realloc with align/free out of memory" ); // no storage ?
    348                 //sout | alignments[a] | area | endl;
    349                 if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
    350                         abort( "memalign/realloc with align/free bad alignment : memalign(%d,%d) = %p", (int)a, (int)amount, area );
    351                 } // if
    352                 area[0] = '\345'; area[amount - 2] = '\345';    // fill first/penultimate byte
    353 
    354                 // Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
    355                 for ( s; amount ~ 256 * 1024 ) {                                // start at initial memory request
    356                         if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "memalign/realloc/free corrupt storage" );
    357                         area = (char *)realloc( area, a * 2, s );       // attempt to reuse storage
    358                         if ( area == 0p ) abort( "memalign/realloc with align/free out of memory" ); // no storage ?
    359                         //sout | i | area | endl;
    360                         if ( (size_t)area % a * 2 != 0 ) {                      // check for initial alignment
    361                                 abort( "memalign/realloc with align/free bad alignment %p", area );
    362                         } // if
    363                         area[s - 1] = '\345';                                           // fill last byte
    364                 } // for
    365                 free( area );
    366         } // for
    367 
    368         // check cmemalign/realloc with align/free
    369 
    370         amount = 2;
    371         for ( size_t a = libAlign() + libAlign(); a <= limit; a += a ) { // generate powers of 2
    372                 // initial N byte allocation
    373                 char *area = (char *)cmemalign( a, 1, amount ); // aligned N-byte allocation
    374                 if ( area == 0p ) abort( "cmemalign/realloc with align/free out of memory" ); // no storage ?
    375                 //sout | alignments[a] | area | endl;
    376                 if ( (size_t)area % a != 0 || malloc_alignment( area ) != a ) { // check for initial alignment
    377                         abort( "cmemalign/realloc with align/free bad alignment : cmemalign(%d,%d) = %p", (int)a, (int)amount, area );
    378                 } // if
    379                 if ( area[0] != '\0' || area[amount - 1] != '\0' ||
    380                          area[malloc_usable_size( area ) - 1] != '\0' ||
    381                          ! malloc_zero_fill( area ) ) abort( "cmemalign/realloc with align/free corrupt storage1" );
    382                 area[0] = '\345'; area[amount - 2] = '\345';    // fill first/penultimate byte
    383 
    384                 // Do not start this loop index at 0 because realloc of 0 bytes frees the storage.
    385                 for ( int s = amount; s < 256 * 1024; s += 1 ) { // start at initial memory request
    386                         if ( area[0] != '\345' || area[s - 2] != '\345' ) abort( "cmemalign/realloc with align/free corrupt storage2" );
    387                         area = (char *)realloc( area, a * 2, s );       // attempt to reuse storage
    388                         if ( area == 0p ) abort( "cmemalign/realloc with align/free out of memory" ); // no storage ?
    389                         //sout | i | area | endl;
    390                         if ( (size_t)area % a * 2 != 0 || malloc_alignment( area ) != a * 2 ) { // check for initial alignment
    391                                 abort( "cmemalign/realloc with align/free bad alignment %p %jd %jd", area, malloc_alignment( area ), a * 2 );
    392                         } // if
    393                         if ( area[s - 1] != '\0' || area[s - 1] != '\0' ||
    394                                  area[malloc_usable_size( area ) - 1] != '\0' ||
    395                                  ! malloc_zero_fill( area ) ) abort( "cmemalign/realloc/free corrupt storage3" );
    396                         area[s - 1] = '\345';                                           // fill last byte
    397                 } // for
    398                 free( area );
    399         } // for
    400 
    401341        //sout | "worker" | thisTask() | "successful completion";
    402342} // Worker main
  • tests/labelledExit.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed Aug 10 07:29:39 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb  5 16:49:48 2020
    13 // Update Count     : 9
     12// Last Modified On : Tue Nov  6 17:57:42 2018
     13// Update Count     : 4
    1414//
    1515
     
    136136        }
    137137
    138         // all nested control options, labelled exits
    139 
    140   Comp: {
    141           Try: try {
    142                   For: for ( ;; ) {
    143                           While: while ( true ) {
    144                                   Do: do {
    145                                           If: if ( true ) {
    146                                                   Switch2: switch ( 3 ) {
    147                                                           case 3:
    148                                                                 break Try;
    149                                                                 break Comp;
    150                                                                 break For;              continue For;
    151                                                                 break While;    continue While;
    152                                                                 break Do;               continue Do;
    153                                                                 break If;
    154                                                                 break Switch2;
    155                                                         } // switch
    156                                                 } // if
    157                                         } while ( true );
    158                                 } // while
    159                         } // for
    160                 } finally {} // always executed
    161         } // compound
    162 
    163138        // computed goto
    164         {
    165                 void *array[] = { &&foo, &&bar, &&hack };
    166           foo: bar: hack:
    167                 &&foo;
    168                 &&bar;
    169                 goto *array[i];
    170         }
     139        // {
     140        //      void *array[] = { &&foo, &&bar, &&hack };
     141        //   foo: bar: hack:
     142        //      &&foo;
     143        //      &&bar;
     144        //      goto *array[i];
     145        // }
    171146
    172147  Q: if ( i > 5 ) {
  • tests/linking/withthreads.cfa

    r3d5701e r9fb8f01  
    3434// Local Variables: //
    3535// tab-width: 4 //
    36 // compile-command: "cfa withthreads.cfa" //
     36// compile-command: "cfa nothreads.cfa" //
    3737// End: //
  • tests/loopctrl.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed Aug  8 18:32:59 2018
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Dec 12 17:55:26 2019
    13 // Update Count     : 108
     12// Last Modified On : Fri Jul 12 12:05:05 2019
     13// Update Count     : 106
    1414//
    1515
     
    4343        for ( 1 ) { sout | "A"; }                                                       sout | nl;
    4444        for ( 10 ) { sout | "A"; }                                                      sout | nl;
    45         for ( = 10 ) { sout | "A"; }                                            sout | nl;
    4645        for ( 1 ~= 10 ~ 2 ) { sout | "B"; }                                     sout | nl;
    4746        for ( 10 -~= 1 ~ 2 ) { sout | "C"; }                            sout | nl;
     
    5049
    5150        for ( i; 10 ) { sout | i; }                                                     sout | nl;
    52         for ( i; = 10 ) { sout | i; }                                           sout | nl;
    5351        for ( i; 1 ~= 10 ~ 2 ) { sout | i; }                            sout | nl;
    5452        for ( i; 10 -~= 1 ~ 2 ) { sout | i; }                           sout | nl;
     
    8987        for ( N ) { sout | "N"; }                                                       sout | nl;
    9088        for ( i; N ) { sout | i; }                                                      sout | nl;
    91         for ( i; = N ) { sout | i; }                                            sout | nl;
    9289        for ( i; N -~ 0 ) { sout | i; }                                         sout | nl | nl;
    9390
  • tests/nested-types.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Mon Jul 9 10:20:03 2018
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 12 18:21:15 2020
    13 // Update Count     : 3
     12// Last Modified On : Tue Nov  6 17:59:40 2018
     13// Update Count     : 2
    1414//
    1515
     
    5050//   double d;
    5151// };
    52 
    53 // struct S {
    54 //     enum C { R, G, B };
    55 //     int i;
    56 //     struct T {
    57 //      int i;
    58 //     };
    59 //     T t;
    60 // };
    61 
    62 // S s;
    63 // S.C c;
    64 // S.T t;
    6552
    6653int main() {
  • tests/pybin/settings.py

    r3d5701e r9fb8f01  
    1414        SRCDIR = os.path.abspath(config.SRCDIR)
    1515        BUILDDIR = os.path.abspath(config.BUILDDIR)
    16         distribute = config.DISTRIBUTE
    1716        os.chdir(testpath)
    1817
     
    8988                self.string = "debug" if value else "no debug"
    9089                self.flags  = """DEBUG_FLAGS=%s""" % ("-debug -O0" if value else "-nodebug -O2")
    91                 self.path   = "debug" if value else "nodebug"
    9290
    9391class Install:
    9492        def __init__(self, value):
    95                 if value:
    96                         distribute = False
    97 
    98                 self.string = "installed" if value else "in tree"
    99                 self.flags  = """installed=%s""" % ("yes" if value else "no")
     93                self.string = "installed" if value else "in-tree"
     94                self.flags  = """INSTALL_FLAGS=%s""" % ("" if value else "-in-tree")
    10095
    10196class Timeouts:
     
    114109def init( options ):
    115110        global arch
    116         global archive
    117         global debug
    118         global distcc
    119111        global dry_run
    120112        global generating
     113        global make
     114        global debug
    121115        global install
    122         global make
     116        global timeout
    123117        global output_width
    124         global timeout
     118        global archive
    125119
     120        dry_run      = options.dry_run
     121        generating   = options.regenerate_expected
     122        make         = ['make']
     123        debug        = Debug(options.debug)
     124        install      = Install(options.install)
    126125        arch         = Architecture(options.arch)
     126        timeout      = Timeouts(options.timeout, options.global_timeout)
     127        output_width = 24
    127128        archive      = os.path.abspath(os.path.join(original_path, options.archive_errors)) if options.archive_errors else None
    128         debug        = Debug(options.debug)
    129         dry_run      = options.dry_run # must be called before tools.config_hash()
    130         distcc       = "DISTCC_CFA_PATH=~/.cfadistcc/%s/cfa" % tools.config_hash()
    131         generating   = options.regenerate_expected
    132         install      = Install(options.install)
    133         make         = ['make']
    134         output_width = 24
    135         timeout      = Timeouts(options.timeout, options.global_timeout)
    136129
    137         # if we distribute, distcc errors will fail tests, use log file for distcc
    138         # don't use "'DISTCC_LOG' not in os.environ" because it can be set to ''
    139         if distribute and not os.environ.get('DISTCC_LOG'):
    140                 os.putenv('DISTCC_LOG', os.path.join(BUILDDIR, 'distcc_error.log'))
    141130
    142131def update_make_cmd(force, jobs):
     
    147136def validate():
    148137        errf = os.path.join(BUILDDIR, ".validate.err")
    149         make_ret, out = tools.make( ".validate", error_file = errf, output_file=subprocess.DEVNULL, error=subprocess.DEVNULL )
     138        make_ret, out = tools.make( ".validate", error_file = errf, output=subprocess.DEVNULL, error=subprocess.DEVNULL )
    150139        if make_ret != 0:
    151140                with open (errf, "r") as myfile:
  • tests/pybin/tools.py

    r3d5701e r9fb8f01  
    2323
    2424# helper functions to run terminal commands
    25 def sh(*cmd, timeout = False, output_file = None, input_file = None, input_text = None, error = subprocess.STDOUT, ignore_dry_run = False):
    26         try:
    27                 cmd = list(cmd)
    28 
    29                 if input_file and input_text:
    30                         return 401, "Cannot use both text and file inputs"
    31 
    32                 # if this is a dry_run, only print the commands that would be ran
    33                 if settings.dry_run and not ignore_dry_run:
    34                         cmd = "{} cmd: {}".format(os.getcwd(), ' '.join(cmd))
    35                         if output_file and not isinstance(output_file, int):
    36                                 cmd += " > "
    37                                 cmd += output_file
    38 
    39                         if error and not isinstance(error, int):
    40                                 cmd += " 2> "
    41                                 cmd += error
    42 
    43                         if input_file and not isinstance(input_file, int) and os.path.isfile(input_file):
    44                                 cmd += " < "
    45                                 cmd += input_file
    46 
    47                         print(cmd)
    48                         return 0, None
    49 
    50                 with contextlib.ExitStack() as onexit:
    51                         # add input redirection if needed
    52                         input_file = openfd(input_file, 'r', onexit, True)
    53 
    54                         # add output redirection if needed
    55                         output_file = openfd(output_file, 'w', onexit, False)
    56 
    57                         # add error redirection if needed
    58                         error = openfd(error, 'w', onexit, False)
    59 
    60                         # run the desired command
    61                         # use with statement to make sure proc is cleaned
    62                         # don't use subprocess.run because we want to send SIGABRT on exit
    63                         with subprocess.Popen(
     25def sh(*cmd, timeout = False, output = None, input = None, error = subprocess.STDOUT):
     26        cmd = list(cmd)
     27
     28        # if this is a dry_run, only print the commands that would be ran
     29        if settings.dry_run :
     30                cmd = "{} cmd: {}".format(os.getcwd(), ' '.join(cmd))
     31                if output and not isinstance(output, int):
     32                        cmd += " > "
     33                        cmd += output
     34
     35                if error and not isinstance(error, int):
     36                        cmd += " 2> "
     37                        cmd += error
     38
     39                if input and not isinstance(input, int) and os.path.isfile(input):
     40                        cmd += " < "
     41                        cmd += input
     42
     43                print(cmd)
     44                return 0, None
     45
     46        with contextlib.ExitStack() as onexit:
     47                # add input redirection if needed
     48                input = openfd(input, 'r', onexit, True)
     49
     50                # add output redirection if needed
     51                output = openfd(output, 'w', onexit, False)
     52
     53                # add error redirection if needed
     54                error = openfd(error, 'w', onexit, False)
     55
     56                # run the desired command
     57                try:
     58                        proc = subprocess.run(
    6459                                cmd,
    65                                 **({'input' : bytes(input_text, encoding='utf-8')} if input_text else {'stdin' : input_file}),
    66                                 stdout  = output_file,
    67                                 stderr  = error
    68                         ) as proc:
    69 
    70                                 try:
    71                                         out, _ = proc.communicate(
    72                                                 timeout = settings.timeout.single if timeout else None
    73                                         )
    74 
    75                                         return proc.returncode, out.decode("utf-8") if out else None
    76                                 except subprocess.TimeoutExpired:
    77                                         proc.send_signal(signal.SIGABRT)
    78                                         proc.communicate()
    79                                         return 124, str(None)
    80 
    81         except Exception as ex:
    82                 print ("Unexpected error: %s" % ex)
    83                 raise
     60                                stdin =input,
     61                                stdout=output,
     62                                stderr=error,
     63                                timeout=settings.timeout.single if timeout else None
     64                        )
     65                        return proc.returncode, proc.stdout.decode("utf-8") if proc.stdout else None
     66                except subprocess.TimeoutExpired:
     67                        return 124, str(None)
    8468
    8569def is_ascii(fname):
     
    9175                return False
    9276
    93         code, out = sh("file %s" % fname, output_file=subprocess.PIPE)
     77        code, out = sh("file %s" % fname, output=subprocess.PIPE)
    9478        if code != 0:
    9579                return False
     
    123107        if isinstance(files, str ): files = [ files ]
    124108        for file in files:
    125                 sh( 'rm', '-f', file, output_file=subprocess.DEVNULL, error=subprocess.DEVNULL )
     109                sh( 'rm', '-f', file, output=subprocess.DEVNULL, error=subprocess.DEVNULL )
    126110
    127111# Create 1 or more directory
     
    131115                p = os.path.normpath( file )
    132116                d = os.path.dirname ( p )
    133                 sh( 'mkdir', '-p', d, output_file=subprocess.DEVNULL, error=subprocess.DEVNULL )
     117                sh( 'mkdir', '-p', d, output=subprocess.DEVNULL, error=subprocess.DEVNULL )
    134118
    135119
     
    154138                lhs,
    155139                rhs,
    156                 output_file=subprocess.PIPE
     140                output=subprocess.PIPE
    157141        )
    158142
    159143# call make
    160 def make(target, *, flags = '', output_file = None, error = None, error_file = None, silent = False):
     144def make(target, *, flags = '', output = None, error = None, error_file = None, silent = False):
    161145        test_param = """test="%s" """ % (error_file) if error_file else None
    162146        cmd = [
     
    167151                settings.debug.flags,
    168152                settings.install.flags,
    169                 settings.distcc if settings.distribute else None,
    170153                flags,
    171154                target
    172155        ]
    173156        cmd = [s for s in cmd if s]
    174         return sh(*cmd, output_file=output_file, error=error)
     157        return sh(*cmd, output=output, error=error)
    175158
    176159def which(program):
    177         fpath, fname = os.path.split(program)
    178         if fpath:
    179                 if is_exe(program):
    180                         return program
    181         else:
    182                 for path in os.environ["PATH"].split(os.pathsep):
    183                         exe_file = os.path.join(path, program)
    184                         if is_exe(exe_file):
    185                                 return exe_file
    186         return None
     160    fpath, fname = os.path.split(program)
     161    if fpath:
     162        if is_exe(program):
     163            return program
     164    else:
     165        for path in os.environ["PATH"].split(os.pathsep):
     166            exe_file = os.path.join(path, program)
     167            if is_exe(exe_file):
     168                return exe_file
     169
     170    return None
    187171
    188172@contextlib.contextmanager
     
    217201# cat one file into the other
    218202def cat(source, dest):
    219         ret, _ = sh("cat", source, output_file=dest)
     203        ret, _ = sh("cat", source, output=dest)
    220204        return ret
    221205
     
    272256                        os.write(int(make_jobs_fds.group(3)), tokens)
    273257                else :
    274                         if settings.distribute:
    275                                 ret, jstr = sh("distcc", "-j", output_file=subprocess.PIPE, ignore_dry_run=True)
    276                                 if ret == 0:
    277                                         options.jobs = int(jstr.strip())
    278                                 else :
    279                                         options.jobs = multiprocessing.cpu_count()
    280                         else:
    281                                 options.jobs = multiprocessing.cpu_count()
     258                        options.jobs = multiprocessing.cpu_count()
    282259        else :
    283260                force = True
     
    297274################################################################################
    298275
    299 # get hash for given configuration
    300 def config_hash():
    301         path = os.path.normpath(os.path.join(
    302                 settings.SRCDIR,
    303         ))
    304 
    305         distcc_hash = os.path.join(settings.SRCDIR, '../tools/build/distcc_hash')
    306         config = "%s-%s" % (settings.arch.target, settings.debug.path)
    307         _, out = sh(distcc_hash, config, output_file=subprocess.PIPE, ignore_dry_run=True)
    308         return out.strip()
    309 
    310 # get pretty string for time of day
    311276def pretty_now():
    312277        ts = time.time()
     
    343308                return 1, "ERR No core dump"
    344309
    345         return sh('gdb', '-n', path, core, '-batch', '-x', cmd, output_file=subprocess.PIPE)
     310        return sh('gdb', '-n', path, core, '-batch', '-x', cmd, output=subprocess.PIPE)
    346311
    347312def core_archive(dst, name, exe):
    348         # Get the core dump
     313        # Get the files to copy
    349314        core = os.path.join(os.getcwd(), "core" )
    350315
    351         # update the path for this test
    352         dst  = os.path.join(dst, name)
     316        # Uncomment if we want timestamps on coredumps
     317        # dst  = os.path.join(dst, "%s_%s" % (name, pretty_now()))
    353318
    354319        # make a directory for this test
    355         # mkdir makes the parent directory only so add a dummy
    356         mkdir(os.path.join(dst, name ))
     320        mkdir(os.path.join(dst, "dir"))
    357321
    358322        # moves the files
     
    364328
    365329class Timed:
    366         def __enter__(self):
    367                 self.start = time.time()
    368                 return self
    369 
    370         def __exit__(self, *args):
    371                 self.end = time.time()
    372                 self.duration = self.end - self.start
     330    def __enter__(self):
     331        self.start = time.time()
     332        return self
     333
     334    def __exit__(self, *args):
     335        self.end = time.time()
     336        self.duration = self.end - self.start
    373337
    374338def timed(src, timeout):
    375339        expire = time.time() + timeout
    376340        i = iter(src)
    377         with contextlib.suppress(StopIteration):
    378                 while True:
    379                         yield i.next(max(expire - time.time(), 0))
     341        while True:
     342                yield i.next(max(expire - time.time(), 0))
  • tests/quotedKeyword.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Feb  7 19:07:07 2020
    13 // Update Count     : 25
     12// Last Modified On : Tue Dec  4 21:45:53 2018
     13// Update Count     : 23
    1414//
    1515
     
    1717
    1818struct {
    19         int ``otype;
    20         int ``struct;
     19        int `otype`;
     20        int `struct`;
    2121} st = { 10, 10 };
    2222
    23 typedef int ``forall;
    24 ``forall xxx = 10;
     23typedef int `forall`;
     24`forall` xxx = 10;
    2525
    26 int ``_Alignas, ``_Alignof, ``__alignof, ``__alignof__, ``asm, ``__asm, ``__asm__, ``_At, ``_Atomic, ``__attribute,
    27         ``__attribute__, ``auto, ``_Bool, ``break, ``case, ``catch, ``catchResume, ``char, ``choose, ``_Complex, ``__complex,
    28         ``__complex__, ``const, ``__const, ``__const__, ``continue, ``default, ``disable, ``do, ``double, ``dtype, ``else,
    29         ``enable, ``enum, ``__extension__, ``extern, ``fallthru, ``finally, ``float, ``__float128, ``for, ``forall, ``fortran,
    30         ``ftype, ``_Generic, ``goto, ``if, ``_Imaginary, ``__imag, ``__imag__, ``inline, ``__inline, ``__inline__, ``int,
    31         ``__int128, ``__label__, ``long, ``lvalue, ``_Noreturn, ``__builtin_offsetof, ``otype, ``register, ``restrict,
    32         ``__restrict, ``__restrict__, ``return, ``short, ``signed, ``__signed, ``__signed__, ``sizeof, ``static,
    33         ``_Static_assert, ``struct, ``switch, ``_Thread_local, ``throw, ``throwResume, ``trait, ``try, ``typedef,
    34         ``typeof, ``__typeof, ``__typeof__, ``union, ``unsigned, ``__builtin_va_list, ``void, ``volatile, ``__volatile,
    35         ``__volatile__, ``while;
     26int `_Alignas`, `_Alignof`, `__alignof`, `__alignof__`, `asm`, `__asm`, `__asm__`, `_At`, `_Atomic`, `__attribute`,
     27        `__attribute__`, `auto`, `_Bool`, `break`, `case`, `catch`, `catchResume`, `char`, `choose`, `_Complex`, `__complex`,
     28        `__complex__`, `const`, `__const`, `__const__`, `continue`, `default`, `disable`, `do`, `double`, `dtype`, `else`,
     29        `enable`, `enum`, `__extension__`, `extern`, `fallthru`, `finally`, `float`, `__float128`, `for`, `forall`, `fortran`,
     30        `ftype`, `_Generic`, `goto`, `if`, `_Imaginary`, `__imag`, `__imag__`, `inline`, `__inline`, `__inline__`, `int`,
     31        `__int128`, `__label__`, `long`, `lvalue`, `_Noreturn`, `__builtin_offsetof`, `otype`, `register`, `restrict`,
     32        `__restrict`, `__restrict__`, `return`, `short`, `signed`, `__signed`, `__signed__`, `sizeof`, `static`,
     33        `_Static_assert`, `struct`, `switch`, `_Thread_local`, `throw`, `throwResume`, `trait`, `try`, `typedef`,
     34        `typeof`, `__typeof`, `__typeof__`, `union`, `unsigned`, `__builtin_va_list`, `void`, `volatile`, `__volatile`,
     35        `__volatile__`, `while`;
    3636
    3737int main() {
    38         int ``if = 0;
    39         ``catch = 1;
    40         st.``otype = 2;
    41         st.``struct = 3;
    42         ``throw = 4;
    43         sout | ``catch + st.``otype + st.``struct + ``throw;
     38        int `if` = 0;
     39        `catch` = 1;
     40        st.`otype` = 2;
     41        st.`struct` = 3;
     42        `throw` = 4;
     43        sout | `catch` + st.`otype` + st.`struct` + `throw`;
    4444}
    4545
  • tests/raii/dtor-early-exit.cfa

    r3d5701e r9fb8f01  
    217217}
    218218
    219 void i() {
    220         // potential loop
    221         for() {
    222                 if(true) continue;
    223                 int t = 0;
    224         }
    225 }
    226 
    227219// TODO: implement __label__ and uncomment these lines
    228220void computedGoto() {
  • tests/rational.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Mon Mar 28 08:43:12 2016
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Feb  8 18:46:23 2020
    13 // Update Count     : 86
     12// Last Modified On : Wed Mar 27 07:37:17 2019
     13// Update Count     : 80
    1414//
    1515
     
    1919#include <fstream.hfa>
    2020
    21 typedef Rational(int) RatInt;
    22 double convert( int i ) { return (double)i; }                   // used by narrow/widen
     21double convert( int i ) { return (double)i; }
    2322int convert( double d ) { return (int)d; }
    2423
    2524int main() {
    2625        sout | "constructor";
    27         RatInt a = { 3 }, b = { 4 }, c, d = 0, e = 1;
    28         sout | a | b | c | d | e;
     26        Rational(int) a = { 3 }, b = { 4 }, c;
     27        sout | a | b | c;
    2928
    30         a = (RatInt){ 4, 8 };
    31         b = (RatInt){ 5, 7 };
     29        a = (Rational(int)){ 4, 8 };
     30        b = (Rational(int)){ 5, 7 };
    3231        sout | a | b;
    33         a = (RatInt){ -2, -3 };
    34         b = (RatInt){ 3, -2 };
     32        a = (Rational(int)){ -2, -3 };
     33        b = (Rational(int)){ 3, -2 };
    3534        sout | a | b;
    36         a = (RatInt){ -2, 3 };
    37         b = (RatInt){ 3, 2 };
     35        a = (Rational(int)){ -2, 3 };
     36        b = (Rational(int)){ 3, 2 };
    3837        sout | a | b;
    3938
    4039        sout | "logical";
    41         a = (RatInt){ -2 };
    42         b = (RatInt){ -3, 2 };
     40        a = (Rational(int)){ -2 };
     41        b = (Rational(int)){ -3, 2 };
    4342        sout | a | b;
    4443//      sout | a == 1; // FIX ME
     
    5958
    6059        sout | "conversion";
    61         a = (RatInt){ 3, 4 };
     60        a = (Rational(int)){ 3, 4 };
    6261        sout | widen( a );
    63         a = (RatInt){ 1, 7 };
     62        a = (Rational(int)){ 1, 7 };
    6463        sout | widen( a );
    65         a = (RatInt){ 355, 113 };
     64        a = (Rational(int)){ 355, 113 };
    6665        sout | widen( a );
    6766        sout | narrow( 0.75, 4 );
     
    7574
    7675        sout | "more tests";
    77         RatInt x = { 1, 2 }, y = { 2 };
     76        Rational(int) x = { 1, 2 }, y = { 2 };
    7877        sout | x - y;
    7978        sout | x > y;
     
    8180        sout | y | denominator( y, -2 ) | y;
    8281
    83         RatInt z = { 0, 5 };
     82        Rational(int) z = { 0, 5 };
    8483        sout | z;
    8584
    8685        sout | x | numerator( x, 0 ) | x;
    8786
    88         x = (RatInt){ 1, MAX } + (RatInt){ 1, MAX };
     87        x = (Rational(int)){ 1, MAX } + (Rational(int)){ 1, MAX };
    8988        sout | x;
    90         x = (RatInt){ 3, MAX } + (RatInt){ 2, MAX };
     89        x = (Rational(int)){ 3, MAX } + (Rational(int)){ 2, MAX };
    9190        sout | x;
    9291
  • tests/references.cfa

    r3d5701e r9fb8f01  
    119119                f( 3, a + b, (S){ 1.0, 7.0 }, (int [3]){ 1, 2, 3 } ); // two rvalue to reference
    120120        }
    121 
    122         {
    123                 int a = 3;
    124                 int *p = &a;
    125                 asm (
    126                         "incl %[p]\n\t"
    127                         : [p] "+m" (*p)
    128                 );
    129                 printf("%d\n", a);
    130         }
    131121}
    132122
  • tests/test.py

    r3d5701e r9fb8f01  
    1010import tempfile
    1111import time
    12 
    13 import os
    14 import psutil
    15 import signal
    1612
    1713################################################################################
     
    147143        # build, skipping to next test on error
    148144        with Timed() as comp_dur:
    149                 make_ret, _ = make( test.target(), output_file=subprocess.DEVNULL, error=out_file, error_file = err_file )
     145                make_ret, _ = make( test.target(), output=subprocess.DEVNULL, error=out_file, error_file = err_file )
    150146
    151147        run_dur = None
    152148        # run everything in a temp directory to make sure core file are handled properly
    153149        with tempdir():
    154                 # if the make command succeeds continue otherwise skip to diff
     150                # if the make command succeds continue otherwise skip to diff
    155151                if success(make_ret):
    156152                        with Timed() as run_dur:
    157153                                if settings.dry_run or is_exe(exe_file):
    158154                                        # run test
    159                                         retcode, _ = sh(exe_file, output_file=out_file, input_file=in_file, timeout=True)
     155                                        retcode, _ = sh(exe_file, output=out_file, input=in_file, timeout=True)
    160156                                else :
    161157                                        # simply cat the result into the output
     
    214210        except KeyboardInterrupt:
    215211                return False, ""
    216         except Exception as ex:
    217                 print("Unexpected error in worker thread: %s" % ex, file=sys.stderr)
     212        except:
     213                print("Unexpected error in worker thread", file=sys.stderr)
    218214                sys.stderr.flush()
    219215                return False, ""
     
    223219def run_tests(tests, jobs) :
    224220        # clean the sandbox from previous commands
    225         make('clean', output_file=subprocess.DEVNULL, error=subprocess.DEVNULL)
    226 
    227         # since python prints stacks by default on a interrupt, redo the interrupt handling to be silent
    228         def worker_init():
    229                 def sig_int(signal_num, frame):
    230                         pass
    231 
    232                 signal.signal(signal.SIGINT, sig_int)
     221        make('clean', output=subprocess.DEVNULL, error=subprocess.DEVNULL)
    233222
    234223        # create the executor for our jobs and handle the signal properly
    235         pool = multiprocessing.Pool(jobs, worker_init)
     224        pool = multiprocessing.Pool(jobs)
    236225
    237226        failed = False
    238 
    239         def stop(x, y):
    240                 print("Tests interrupted by user", file=sys.stderr)
    241                 sys.exit(1)
    242         signal.signal(signal.SIGINT, stop)
    243227
    244228        # for each test to run
     
    276260
    277261        # clean the workspace
    278         make('clean', output_file=subprocess.DEVNULL, error=subprocess.DEVNULL)
     262        make('clean', output=subprocess.DEVNULL, error=subprocess.DEVNULL)
    279263
    280264        return 1 if failed else 0
  • tests/time.cfa

    r3d5701e r9fb8f01  
    1010// Created On       : Tue Mar 27 17:24:56 2018
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Jan  5 18:27:37 2020
    13 // Update Count     : 34
     12// Last Modified On : Thu Dec 20 23:09:21 2018
     13// Update Count     : 23
    1414//
    1515
     
    2020        Duration d1 = 3`h, d2 = 2`s, d3 = 3.375`s, d4 = 12`s, d5 = 1`s + 10_000`ns;
    2121        sout | d1 | d2 | d3 | d4 | d5;
     22        int i;
    2223        d1 = 0;
    2324        sout | d1 | d2 | d3;
     
    3435        sout | t;
    3536        t = t + d1;
    36         sout | t | t`ns;
     37        sout | t | t.tv;
    3738        Time t1 = (timespec){ 104_414, 10_000_000 };
    38         sout | t1 | t1`ns;
    39         sout | t - t  | t + d5 | t`ns;
    40         char buf[64];
     39        sout | t1 | t1.tv;
     40        sout | t - t  | t + d5 | t.tv;
     41        char buf[16];
    4142        sout | "yy/mm/dd" | [t, buf]`ymd | nonl;                        // shared buf => separate calls
    4243        sout | "mm/dd/yy" | mm_dd_yy( t, buf ) | nonl;
     
    4546        sout | "dd/yy/mm" | [t, buf]`dmy;
    4647        Time t2 = { 2001, 7, 4, 0, 0, 1, 0 }, t3 = (timeval){ 994_219_201 };
    47         sout | t2 | t2`ns | nl | t3 | t3`ns;
     48        sout | t2 | t2.tv | nl | t3 | t3.tv;
    4849        sout | nl;
    4950
     
    6263        sout | "Dividing that by 2 gives" | s / 2 | "seconds";
    6364        sout | s | "seconds is" | s`h | "hours," | (s % 1`h)`m | "minutes," | (s % 1`m)`s | "seconds";
    64 
    65     t1 = (Time){ 2020, 1, 5, 9, 0, 0, 100000000000LL };
    66     t2 = (Time){ 1969, 13, 5, 9 };
    67     t3 = (Time){ 1970, 25, 366, 48, 120, -120, 60000000000LL };
    68     strftime( buf, 128, "%Y %b %e %H:%M:%S (GMT)", t1 );
    69     sout | buf;
    70     strftime( buf, 128, "%Y %b %e %H:%M:%S (GMT)", t2 );
    71     sout | buf;
    72     strftime( buf, 128, "%Y %b %e %H:%M:%S (GMT)", t3 );
    73     sout | buf;
    7465} // main
    7566
  • tests/userLiterals.cfa

    r3d5701e r9fb8f01  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // userLiterals.cfa --
     7// user_literals.cfa --
    88//
    99// Author           : Peter A. Buhr
    1010// Created On       : Wed Sep  6 21:40:50 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 19 07:48:45 2020
    13 // Update Count     : 74
     12// Last Modified On : Tue Dec  4 22:03:10 2018
     13// Update Count     : 56
    1414//
    1515
     
    2424int ?`__thingy_( int x ) { sout | "_thingy_" | x; return x; }
    2525
    26 int ?`s( const char * s ) { sout | "s" | s; return 0; }
    27 int ?`m( const char16_t * m ) { sout | "m" | m; return 0;}
    28 int ?`h( const char32_t * h ) { sout | "h" | h; return 0; }
     26int ?`s( const char * s ) { sout | "secs" | s; return 0; }
     27int ?`m( const char16_t * m ) { sout | "mins" | m; return 0;}
     28int ?`h( const char32_t * h ) { sout | "hours" | h; return 0; }
    2929int ?`_A_( const wchar_t * str ) { sout | "_A_" | str; return 0; }
    3030int ?`__thingy_( const char * str ) { sout | "_thingy_" | str; return 0; }
     
    3737        return (Weight){ l.stones + r.stones };
    3838}
    39 ofstream & ?|?( ofstream & os, Weight w ) { return os | wd(1,1, w.stones); }
    40 void ?|?( ofstream & os, Weight w ) { (ofstream)(os | w); ends( os ); }
     39ofstream & ?|?( ofstream & os, Weight w ) { return os | w.stones; }
    4140
    4241Weight ?`st( double w ) { return (Weight){ w }; }               // backquote for user literals
     
    6160        sout | w;
    6261
    63         0`s;
     62//      0`secs;
    6463        1`s;
    6564        23`s;
     
    8382
    8483        "abc"`s;
    85         // FIX ME: requires char16_t, char32_t, and wchar_t be unique types
    86         // u"abc"`m;
    87         // U_"abc"`h;
    88         // L"abc"`_A_;
     84//      u"abc"`m;
     85//      U_"abc"`h;
     86//      L"abc"`_A_;
    8987        u8_"abc"`__thingy_;
    9088} // main
     
    9290// Local Variables: //
    9391// tab-width: 4 //
    94 // compile-command: "cfa userLiterals.cfa" //
     92// compile-command: "cfa user_literals.cfa" //
    9593// End: //
  • tools/Makefile.in

    r3d5701e r9fb8f01  
    208208CCDEPMODE = @CCDEPMODE@
    209209CFACC = @CFACC@
    210 CFACC_INSTALL = @CFACC_INSTALL@
    211210CFACPP = @CFACPP@
    212211CFA_BACKEND_CC = @CFA_BACKEND_CC@
     
    239238FGREP = @FGREP@
    240239GREP = @GREP@
    241 HAS_DISTCC = @HAS_DISTCC@
    242240HOST_FLAGS = @HOST_FLAGS@
    243241INSTALL = @INSTALL@
  • tools/catchsig.c

    r3d5701e r9fb8f01  
    2121        printf("Starting...\n");
    2222        sig(SIGHUP);
    23         sig(SIGINT);
    24         sig(SIGQUIT);
    25         sig(SIGILL);
    26         sig(SIGABRT);
    27         sig(SIGFPE);
    28         sig(SIGSEGV);
    29         sig(SIGPIPE);
    30         sig(SIGALRM);
    31         sig(SIGTERM);
    32         sig(SIGUSR1);
    33         sig(SIGUSR2);
    34         sig(SIGCHLD);
    35         sig(SIGCONT);
    36         sig(SIGTSTP);
    37         sig(SIGTTIN);
    38         sig(SIGTTOU);
     23      sig(SIGINT);
     24      sig(SIGQUIT);
     25      sig(SIGILL);
     26      sig(SIGABRT);
     27      sig(SIGFPE);
     28      sig(SIGSEGV);
     29      sig(SIGPIPE);
     30      sig(SIGALRM);
     31      sig(SIGTERM);
     32      sig(SIGUSR1);
     33      sig(SIGUSR2);
     34      sig(SIGCHLD);
     35      sig(SIGCONT);
     36      sig(SIGTSTP);
     37      sig(SIGTTIN);
     38      sig(SIGTTOU);
    3939        while(1);
    4040        return 0;
  • tools/prettyprinter/Makefile.in

    r3d5701e r9fb8f01  
    237237CCDEPMODE = @CCDEPMODE@
    238238CFACC = @CFACC@
    239 CFACC_INSTALL = @CFACC_INSTALL@
    240239CFACPP = @CFACPP@
    241240CFA_BACKEND_CC = @CFA_BACKEND_CC@
     
    268267FGREP = @FGREP@
    269268GREP = @GREP@
    270 HAS_DISTCC = @HAS_DISTCC@
    271269HOST_FLAGS = @HOST_FLAGS@
    272270INSTALL = @INSTALL@
  • tools/stat.py

    r3d5701e r9fb8f01  
    1717                avg = numpy.mean  (content)
    1818                std = numpy.std   (content)
    19                 print "median {0:.1f} avg {1:.1f} stddev {2:.1f}".format( med, avg, std )
     19                print "median {0:.1f} avg {1:.1f} stddev {2:.2f}".format( med, avg, std )
    2020
    2121
Note: See TracChangeset for help on using the changeset viewer.