Changes in / [bbdb0c6:c4fd4ef]


Ignore:
Files:
1 added
21 deleted
54 edited

Legend:

Unmodified
Added
Removed
  • Jenkinsfile

    rbbdb0c6 rc4fd4ef  
    126126                        }
    127127
    128                         sh "${SrcDir}/configure CXX=${Settings.Compiler.CXX} CC=${Settings.Compiler.CC} ${Settings.Architecture.flags} AR=gcc-ar RANLIB=gcc-ranlib ${targets} --quiet --prefix=${BuildDir}"
     128                        sh "${SrcDir}/configure CXX=${Settings.Compiler.CXX} CC=${Settings.Compiler.CC} ${Settings.Architecture.flags} ${targets} --quiet"
    129129
    130130                        // Configure libcfa
     
    155155                dir (BuildDir) {
    156156                        sh "make -j 8 --no-print-directory -C libcfa/${Settings.Architecture.name}-nodebug"
    157                 }
    158         }
    159 
    160         build_stage('Build : install', true) {
    161                 // Build outside of the src tree to ease cleaning
    162                 dir (BuildDir) {
    163                         sh "make -j 8 --no-print-directory install"
    164157                }
    165158        }
     
    186179                echo "Archiving core dumps"
    187180                dir (BuildDir) {
    188                         archiveArtifacts artifacts: "tests/crashes/**/*,lib/**/lib*.so*", fingerprint: true
     181                        archiveArtifacts artifacts: "tests/crashes/**/*", fingerprint: true
    189182                }
    190183                throw err
     
    332325        public String CXX
    333326        public String CC
    334         public String lto
    335 
    336         CC_Desc(String name, String CXX, String CC, String lto) {
     327
     328        CC_Desc(String name, String CXX, String CC) {
    337329                this.name = name
    338330                this.CXX = CXX
    339                 this.CC  = CC
    340                 this.lto = lto
     331                this.CC = CC
    341332        }
    342333}
     
    373364                switch( param.Compiler ) {
    374365                        case 'gcc-9':
    375                                 this.Compiler = new CC_Desc('gcc-9', 'g++-9', 'gcc-9', '-flto=auto')
     366                                this.Compiler = new CC_Desc('gcc-9', 'g++-9', 'gcc-9')
    376367                        break
    377368                        case 'gcc-8':
    378                                 this.Compiler = new CC_Desc('gcc-8', 'g++-8', 'gcc-8', '-flto=auto')
     369                                this.Compiler = new CC_Desc('gcc-8', 'g++-8', 'gcc-8')
    379370                        break
    380371                        case 'gcc-7':
    381                                 this.Compiler = new CC_Desc('gcc-7', 'g++-7', 'gcc-7', '-flto=auto')
     372                                this.Compiler = new CC_Desc('gcc-7', 'g++-7', 'gcc-7')
    382373                        break
    383374                        case 'gcc-6':
    384                                 this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6', '-flto=auto')
     375                                this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6')
    385376                        break
    386377                        case 'gcc-5':
    387                                 this.Compiler = new CC_Desc('gcc-5', 'g++-5', 'gcc-5', '-flto=auto')
     378                                this.Compiler = new CC_Desc('gcc-5', 'g++-5', 'gcc-5')
    388379                        break
    389380                        case 'gcc-4.9':
    390                                 this.Compiler = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9', '-flto=auto')
     381                                this.Compiler = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9')
    391382                        break
    392383                        case 'clang':
    393                                 this.Compiler = new CC_Desc('clang', 'clang++-6.0', 'gcc-6', '-flto=thin -flto-jobs=0')
     384                                this.Compiler = new CC_Desc('clang', 'clang++-6.0', 'gcc-6')
    394385                        break
    395386                        default :
     
    448439        // prepare the properties
    449440        properties ([                                                                                                   \
    450                 buildDiscarder(logRotator(                                                                              \
    451                         artifactDaysToKeepStr: '',                                                                      \
    452                         artifactNumToKeepStr: '',                                                                       \
    453                         daysToKeepStr: '730',                                                                           \
    454                         numToKeepStr: '1000'                                                                            \
    455                 )),                                                                                                             \
    456441                [$class: 'ParametersDefinitionProperty',                                                                \
    457442                        parameterDefinitions: [                                                                         \
  • benchmark/Makefile.am

    rbbdb0c6 rc4fd4ef  
    1111## Created On       : Sun May 31 09:08:15 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Tue Mar 10 11:41:18 2020
    14 ## Update Count     : 258
     13## Last Modified On : Sat Jan 25 09:20:44 2020
     14## Update Count     : 255
    1515###############################################################################
    1616
     
    108108creation_cfa_coroutine_DURATION = 100000000
    109109creation_cfa_coroutine_eager_DURATION = 10000000
    110 creation_cfa_generator_DURATION = 1000000000
    111110creation_upp_coroutine_DURATION = ${creation_cfa_coroutine_eager_DURATION}
    112111creation_cfa_thread_DURATION = 10000000
  • benchmark/Makefile.in

    rbbdb0c6 rc4fd4ef  
    447447creation_cfa_coroutine_DURATION = 100000000
    448448creation_cfa_coroutine_eager_DURATION = 10000000
    449 creation_cfa_generator_DURATION = 1000000000
    450449creation_upp_coroutine_DURATION = ${creation_cfa_coroutine_eager_DURATION}
    451450creation_cfa_thread_DURATION = 10000000
  • benchmark/creation/cfa_gen.cfa

    rbbdb0c6 rc4fd4ef  
    1 #include "../bench.h"
     1#include "bench.h"
    22
    3 generator G {
     3struct C {
    44        volatile int restart; // ensure compiler does not optimize away all the code
    55};
    6 void ?{}( G & g ) { g.restart = 0; }
    7 void main( G & ) {}
     6void ?{}( C & c ) { c.restart = 0; }
     7void main( C & ) {}
    88
    99int main( int argc, char * argv[] ) {
     
    1111        BENCH(
    1212                for ( times ) {
    13                          G g;
     13                         C c;
    1414                },
    1515                result
  • benchmark/ctxswitch/cfa_cor.cfa

    rbbdb0c6 rc4fd4ef  
    22#include <thread.hfa>
    33
    4 #include "../bench.h"
     4#include "bench.h"
    55
    6 coroutine C {};
     6coroutine C {} c;
    77void main( __attribute__((unused)) C & ) {
    8         for () {
    9                 suspend;
     8        while () {
     9                suspend();
    1010        }
    1111}
    1212int main( int argc, char * argv[] ) {
    13         C c;
    1413        BENCH_START()
    1514        BENCH(
  • benchmark/ctxswitch/cfa_gen.cfa

    rbbdb0c6 rc4fd4ef  
    11#include "../bench.h"
    22
    3 generator G {};
    4 void main( G & ) {
     3typedef struct {
     4        void * next;
     5} C;
     6
     7void comain( C * c ) {
     8        if ( __builtin_expect(c->next != 0, 1) ) goto *(c->next);
     9        c->next = &&s1;
    510        for () {
    6                 suspend;
     11                return;
     12          s1: ;
    713        }
    814}
    915
    1016int main( int argc, char * argv[] ) {
    11         G g;
    1217        BENCH_START()
     18        C c = { 0 };
    1319        BENCH(
    1420                for ( times ) {
    15                         resume( g );
     21                        comain( &c );
    1622                },
    1723                result
  • configure

    rbbdb0c6 rc4fd4ef  
    25572557# don't use the default CFLAGS as they unconditonnaly add -O2
    25582558: ${CFLAGS=""}
    2559 : ${CXXFLAGS=""}
    25602559
    25612560am__api_version='1.15'
  • configure.ac

    rbbdb0c6 rc4fd4ef  
    1414# don't use the default CFLAGS as they unconditonnaly add -O2
    1515: ${CFLAGS=""}
    16 : ${CXXFLAGS=""}
    1716
    1817AM_INIT_AUTOMAKE([subdir-objects])
  • doc/papers/concurrency/Paper.tex

    rbbdb0c6 rc4fd4ef  
    248248}
    249249
    250 \newsavebox{\myboxA}
    251 \newsavebox{\myboxB}
    252 \newsavebox{\myboxC}
    253 \newsavebox{\myboxD}
     250\newbox\myboxA
     251\newbox\myboxB
     252\newbox\myboxC
     253\newbox\myboxD
    254254
    255255\title{\texorpdfstring{Advanced Control-flow and Concurrency in \protect\CFA}{Advanced Control-flow in Cforall}}
     
    29672967\lstset{language=CFA,moredelim=**[is][\color{red}]{@}{@},deletedelim=**[is][]{`}{`}}
    29682968\begin{cfa}[aboveskip=0pt,belowskip=0pt]
    2969 @coroutine@ C {};
    2970 void main( C & ) { for () { @suspend;@ } }
     2969@coroutine@ C {} c;
     2970void main( C & ) { while () { @suspend;@ } }
    29712971int main() { // coroutine test
    2972         C c;
    29732972        BENCH( for ( N ) { @resume( c );@ } )
    29742973        sout | result;
     
    29902989\multicolumn{1}{@{}c}{} & \multicolumn{1}{c}{Median} &\multicolumn{1}{c}{Average} & \multicolumn{1}{c@{}}{Std Dev} \\
    29912990C function                      & 1.8           & 1.8           & 0.0   \\
    2992 \CFA generator          & 1.8           & 2.0           & 0.3   \\
     2991\CFA generator          & 1.8           & 1.8           & 0.1   \\
    29932992\CFA coroutine          & 32.5          & 32.9          & 0.8   \\
    29942993\CFA thread                     & 93.8          & 93.6          & 2.2   \\
  • doc/theses/andrew_beach_MMath/Makefile

    rbbdb0c6 rc4fd4ef  
    55TEXSRC=$(wildcard *.tex)
    66BIBSRC=$(wildcard *.bib)
    7 STYSRC=$(wildcard *.sty)
    8 CLSSRC=$(wildcard *.cls)
    97TEXLIB= .:${BUILD}:
    108BIBLIB= .:../../bibliography
     
    2624all: ${DOC}
    2725
    28 ${BUILD}/${DOC}: ${TEXSRC} ${BIBSRC} ${STYSRC} ${CLSSRC} Makefile | ${BUILD}
     26${BUILD}/${DOC}: ${TEXSRC} ${BIBSRC} Makefile | ${BUILD}
    2927        ${LATEX} ${BASE}
    3028        ${BIBTEX} ${BUILD}/${BASE}
  • doc/theses/andrew_beach_MMath/thesis.tex

    rbbdb0c6 rc4fd4ef  
    1 % Main tex file for thesis document.
    2 \documentclass[digital]{uw-ethesis}
    3 \usepackage{comment}
    4 \usepackage{fullpage}
    5 \setlength{\textheight}{8.75in}
    6 \renewcommand\labelitemi{\footnotesize$\bullet$} % shrink bullet for level 1 itemize
    7 \usepackage{lmodern}                            % bold typewriter font
    8 
    9 \usepackage{listings}                           % format program code
    10 % Default underscore is too low and wide. Cannot use lstlisting "literate" as replacing underscore
    11 % removes it as a variable-name character so keywords in variables are highlighted. MUST APPEAR
    12 % AFTER HYPERREF.
    13 %\DeclareTextCommandDefault{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}
    14 \renewcommand{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}}
    15 % parindent is relative, i.e., toggled on/off in environments like itemize, so store the value for
    16 % use rather than use \parident directly.
    17 \newlength{\parindentlnth}
    18 \setlength{\parindentlnth}{\parindent}
    19 
    20 % CFA programming language, based on ANSI C (with some gcc additions)
    21 \lstdefinelanguage{CFA}[ANSI]{C}{
    22         morekeywords={
    23                 _Alignas, _Alignof, __alignof, __alignof__, asm, __asm, __asm__, __attribute, __attribute__,
    24                 auto, _Bool, catch, catchResume, choose, _Complex, __complex, __complex__, __const, __const__,
    25                 coroutine, disable, dtype, enable, exception, __extension__, fallthrough, fallthru, finally,
    26                 __float80, float80, __float128, float128, forall, ftype, generator, _Generic, _Imaginary, __imag, __imag__,
    27                 inline, __inline, __inline__, __int128, int128, __label__, monitor, mutex, _Noreturn, one_t, or,
    28                 otype, restrict, resume, __restrict, __restrict__, __signed, __signed__, _Static_assert, suspend, thread,
    29                 _Thread_local, throw, throwResume, timeout, trait, try, ttype, typeof, __typeof, __typeof__,
    30                 virtual, __volatile, __volatile__, waitfor, when, with, zero_t},
    31         moredirectives={defined,include_next},
    32         % replace/adjust listing characters that look bad in sanserif
    33         literate={-}{\makebox[1ex][c]{\raisebox{0.5ex}{\rule{0.8ex}{0.1ex}}}}1 {^}{\raisebox{0.6ex}{$\scriptstyle\land\,$}}1
    34                 {~}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}}1 % {`}{\ttfamily\upshape\hspace*{-0.1ex}`}1
    35                 {<}{\textrm{\textless}}1 {>}{\textrm{\textgreater}}1
    36                 {<-}{$\leftarrow$}2 {=>}{$\Rightarrow$}2 {->}{\makebox[1ex][c]{\raisebox{0.5ex}{\rule{0.8ex}{0.075ex}}}\kern-0.2ex{\textrm{\textgreater}}}2,
    37 }
    38 
    39 \lstset{
    40 language=CFA,
    41 columns=fullflexible,
    42 basicstyle=\linespread{0.9}\tt,                 % reduce line spacing and use sanserif font
    43 stringstyle=\tt,                                % use typewriter font
    44 tabsize=5,                                      % N space tabbing
    45 xleftmargin=\parindentlnth,                     % indent code to paragraph indentation
    46 %mathescape=true,                               % LaTeX math escape in CFA code $...$
    47 escapechar=\$,                                  % LaTeX escape in CFA code
    48 keepspaces=true,
    49 showstringspaces=false,                         % do not show spaces with cup
    50 showlines=true,                                 % show blank lines at end of code
    51 aboveskip=4pt,                                  % spacing above/below code block
    52 belowskip=3pt,
    53 moredelim=**[is][\color{red}]{`}{`},
    54 }% lstset
    55 
    56 \lstnewenvironment{cfa}[1][]
    57 {\lstset{#1}}
    58 {}
    59 % inline code @...@
    60 
    61 % Commands used in documenting how to use the template. To remove.
    62 \newcommand{\package}[1]{\textbf{#1}}
    63 \newcommand{\cmmd}[1]{\textbackslash\texttt{#1}}
    64 \newcommand{\href}[1]{#1}
     1% uWaterloo Thesis Template for LaTeX
     2% Last Updated June 14, 2017 by Stephen Carr, IST Client Services
     3% FOR ASSISTANCE, please send mail to rt-IST-CSmathsci@ist.uwaterloo.ca
     4
     5% Effective October 2006, the University of Waterloo
     6% requires electronic thesis submission. See the uWaterloo thesis regulations at
     7% https://uwaterloo.ca/graduate-studies/thesis.
     8
     9% DON'T FORGET TO ADD YOUR OWN NAME AND TITLE in the "hyperref" package
     10% configuration. THIS INFORMATION GETS EMBEDDED IN THE FINAL PDF DOCUMENT.
     11% You can view the information if you view Properties of the PDF document.
     12
     13% Many faculties/departments also require one or more printed
     14% copies. This template attempts to satisfy both types of output.
     15% It is based on the standard "book" document class which provides all
     16% necessary sectioning structures and allows multi-part theses.
     17
     18% DISCLAIMER
     19% To the best of our knowledge, this template satisfies the current uWaterloo
     20% requirements. However, it is your responsibility to assure that you have met
     21% all  requirements of the University and your particular department.
     22% Many thanks for the feedback from many graduates that assisted the
     23% development of this template.
     24
     25% -----------------------------------------------------------------------
     26
     27% By default, output is produced that is geared toward generating a PDF
     28% version optimized for viewing on an electronic display, including
     29% hyperlinks within the PDF.
     30 
     31% E.g. to process a thesis called "mythesis.tex" based on this template, run:
     32
     33% pdflatex mythesis     -- first pass of the pdflatex processor
     34% bibtex mythesis       -- generates bibliography from .bib data file(s)
     35% makeindex         -- should be run only if an index is used
     36% pdflatex mythesis     -- fixes numbering in cross-references,
     37% pdflatex mythesis --   bibliographic references, glossaries, index, etc.
     38
     39% N.B. The "pdftex" program allows graphics in the following formats to be
     40% included with the "\includegraphics" command: PNG, PDF, JPEG, TIFF
     41% Tip 1: Generate your figures and photos in the size you want them to appear
     42% in your thesis, rather than scaling them with \includegraphics options.
     43% Tip 2: Any drawings you do should be in scalable vector graphic formats:
     44% SVG, PNG, WMF, EPS and then converted to PNG or PDF, so they are scalable in
     45% the final PDF as well.
     46% Tip 3: Photographs should be cropped and compressed so as not to be too large.
     47
     48% To create a PDF output that is optimized for double-sided printing:
     49%
     50% 1) comment-out the \documentclass statement in the preamble below, and
     51% un-comment the second \documentclass line.
     52%
     53% 2) change the value assigned below to the boolean variable
     54% "PrintVersion" from "false" to "true".
     55
     56% --------------------- Start of Document Preamble -----------------------
     57
     58% Specify the document class, default style attributes, and page dimensions
     59% For hyperlinked PDF, suitable for viewing on a computer, use this:
     60\documentclass[letterpaper,12pt,titlepage,oneside,final]{book}
     61 
     62% For PDF, suitable for double-sided printing, change the PrintVersion
     63% variable below to "true" and use this \documentclass line instead of the one
     64% above:
     65%\documentclass[letterpaper,12pt,titlepage,openright,twoside,final]{book}
     66
     67% Some LaTeX commands I define for my own nomenclature.
     68% If you have to, it's better to change nomenclature once here than in a
     69% million places throughout your thesis!
     70\newcommand{\package}[1]{\textbf{#1}} % package names in bold text
     71\newcommand{\cmmd}[1]{\textbackslash\texttt{#1}} % command name in tt font
     72\newcommand{\href}[1]{#1} % does nothing, but defines the command so the
     73  % print-optimized version will ignore \href tags (redefined by hyperref pkg).
     74%\newcommand{\texorpdfstring}[2]{#1} % does nothing, but defines the command
     75% Anything defined here may be redefined by packages added below...
     76
     77% This package allows if-then-else control structures.
     78\usepackage{ifthen}
     79\newboolean{PrintVersion}
     80\setboolean{PrintVersion}{false}
     81% CHANGE THIS VALUE TO "true" as necessary, to improve printed results for
     82% hard copies by overriding some options of the hyperref package below.
    6583
    6684% For a nomenclature (optional; available from ctan.org)
     
    6886% Lots of math symbols and environments
    6987\usepackage{amsmath,amssymb,amstext}
    70 % For including graphics, sets the pdftex graphics driver.
     88% For including graphics N.B. pdftex graphics driver
    7189\usepackage[pdftex]{graphicx}
    7290
    73 \usepackage{cfalab}
    74 
    75 \usehyperrefpackage[pdftex,pagebackref=false]{
    76     pdftitle={Exception Handling in CFA},
    77     pdfauthor={Andrew James Beach},
    78     pdfsubject={Programming Languages},
    79     pdfkeywords={exceptions,implementation},
     91% I believe the general index function is covered by the glossaries.
     92% \usepackage{makeidx}
     93% \makeindex
     94
     95% Hyperlinks make it very easy to navigate an electronic document.
     96% In addition, this is where you should specify the thesis title
     97% and author as they appear in the properties of the PDF document.
     98% Use the "hyperref" package
     99% N.B. HYPERREF MUST BE THE LAST PACKAGE LOADED; ADD ADDITIONAL PKGS ABOVE
     100% N.B. pagebackref=true provides links back from the References to the body
     101% text. This can cause trouble for printing.
     102\usepackage[pdftex,pagebackref=false]{hyperref} % with basic options
     103\hypersetup{
     104    plainpages=false,       % needed if Roman numbers in frontpages
     105    unicode=false,          % non-Latin characters in Acrobat’s bookmarks
     106    pdftoolbar=true,        % show Acrobat’s toolbar?
     107    pdfmenubar=true,        % show Acrobat’s menu?
     108    pdffitwindow=false,     % window fit to page when opened
     109    pdfstartview={FitH},    % fits the width of the page to the window
     110    pdftitle={uWaterloo\ LaTeX\ Thesis\ Template},    % title: CHANGE THIS TEXT!
     111%    pdfauthor={Author},    % author: CHANGE THIS TEXT! and uncomment this line
     112%    pdfsubject={Subject},  % subject: CHANGE THIS TEXT! and uncomment this line
     113%    pdfkeywords={keyword1} {key2} {key3}, % list of keywords, and uncomment this line if desired
     114    pdfnewwindow=true,      % links in new window
     115    colorlinks=true,        % false: boxed links; true: colored links
     116    linkcolor=blue,         % color of internal links
     117    citecolor=green,        % color of links to bibliography
     118    filecolor=magenta,      % color of file links
     119    urlcolor=cyan           % color of external links
    80120}
    81 
    82 % The \phantomsection is used to help the hyperref package create links.
    83 
    84 % Maybe only package that should be loaded after the hyperref package.
    85 % From http://ctan.org/pkg/glossaries-extra, extends glossaries which replaces
    86 % glossary and builds off of the makeindex system.
    87 \usepackage[toc,abbreviations]{glossaries-extra}
    88 
     121\ifthenelse{\boolean{PrintVersion}}{
     122  % for improved print quality, override some hyperref options
     123\hypersetup{
     124%    colorlinks,%
     125    citecolor=black,%
     126    filecolor=black,%
     127    linkcolor=black,%
     128    urlcolor=black}
     129}{} % end of ifthenelse (no else)
     130
     131\usepackage[toc,abbreviations]{glossaries-extra} % Exception to the
     132% rule of hyperref being the last add-on package. If glossaries-extra is not
     133% in your LaTeX distribution, get it from CTAN
     134% (http://ctan.org/pkg/glossaries-extra).
     135
     136% Setting up the page margins...
     137% uWaterloo thesis requirements specify a minimum of 1 inch (72pt) margin at
     138% the top, bottom, and outside page edges and a 1.125 in. (81pt) gutter
     139% margin (on binding side). While this is not an issue for electronic
     140% viewing, a PDF may be printed, and so we have the same page layout for
     141% both printed and electronic versions, we leave the gutter margin in.
     142% Set margins to minimum permitted by uWaterloo thesis regulations:
     143\setlength{\marginparwidth}{0pt} % width of margin notes
     144% N.B. If margin notes are used, you must adjust \textwidth, \marginparwidth
     145% and \marginparsep so that the space left between the margin notes and page
     146% edge is less than 15 mm (0.6 in.)
     147% Width of space between body text and margin notes.
     148\setlength{\marginparsep}{0pt}
     149\setlength{\evensidemargin}{0.125in} % Adds 1/8 in. to binding side of all
     150% even-numbered pages when the "twoside" printing option is selected
     151\setlength{\oddsidemargin}{0.125in} % Adds 1/8 in. to the left of all pages
     152% when "oneside" printing is selected, and to the left of all odd-numbered
     153% pages when "twoside" printing is selected
     154% Assuming US letter paper (8.5 in. x 11 in.) and side margins as above.
     155\setlength{\textwidth}{6.375in}
     156\raggedbottom
     157
     158% The following statement specifies the amount of space between paragraphs.
     159% Other reasonable specifications are \bigskipamount and \smallskipamount.
     160\setlength{\parskip}{\medskipamount}
     161
     162% The following statement controls the line spacing.  The default
     163% spacing corresponds to good typographic conventions and only slight
     164% changes (e.g., perhaps "1.2"), if any, should be made.
     165\renewcommand{\baselinestretch}{1} % this is the default line space setting
     166
     167% By default, each chapter will start on a recto (right-hand side)
     168% page.  We also force each section of the front pages to start on
     169% a recto page by inserting \cleardoublepage commands.
     170% In many cases, this will require that the verso page be
     171% blank and, while it should be counted, a page number should not be
     172% printed.  The following statements ensure a page number is not
     173% printed on an otherwise blank verso page.
     174\let\origdoublepage\cleardoublepage
     175\newcommand{\clearemptydoublepage}{%
     176  \clearpage{\pagestyle{empty}\origdoublepage}}
     177\let\cleardoublepage\clearemptydoublepage
     178
     179% Define Glossary terms (This is properly done here, in the preamble.
     180% Could be \input{} from a file...)
    89181% Main glossary entries -- definitions of relevant terminology
    90182\newglossaryentry{computer}
     
    102194type=nomenclature,
    103195name=dingledorf,
    104 description={A person of supposed average intelligence who makes incredibly
    105                brainless misjudgments}
     196description={A person of supposed average intelligence who makes incredibly brainless misjudgments}
    106197}
    107198
    108199% List of Abbreviations (abbreviations are from the glossaries-extra package)
    109 \newabbreviation{aaaaz}{AAAAZ}{American Association of Amature Astronomers
    110                and Zoologists}
     200\newabbreviation{aaaaz}{AAAAZ}{American Association of Amature Astronomers and Zoologists}
    111201
    112202% List of Symbols
     
    117207sort={label},
    118208type=symbols,
    119 description={Random vector: a location in n-dimensional Cartesian space, where
    120                each dimensional component is determined by a random process}
     209description={Random vector: a location in n-dimensional Cartesian space, where each dimensional component is determined by a random process}
    121210}
    122 
    123 % Must be here of cause problems with glossaries-extra.
    124 \lstMakeShortInline$%
    125 
    126 % Generate the glossaries defined above.
     211 
    127212\makeglossaries
    128213
     214%======================================================================
     215%   L O G I C A L    D O C U M E N T -- the content of your thesis
     216%======================================================================
    129217\begin{document}
    130218
     219% For a large document, it is a good idea to divide your thesis
     220% into several files, each one containing one chapter.
     221% To illustrate this idea, the "front pages" (i.e., title page,
     222% declaration, borrowers' page, abstract, acknowledgements,
     223% dedication, table of contents, list of tables, list of figures,
     224% nomenclature) are contained within the file "uw-ethesis-frontpgs.tex" which
     225% is included into the document by the following statement.
    131226%----------------------------------------------------------------------
    132227% FRONT MATERIAL
     
    137232% MAIN BODY
    138233%----------------------------------------------------------------------
    139 \input{unwinding}
    140 
     234% Because this is a short document, and to reduce the number of files
     235% needed for this template, the chapters are not separate
     236% documents as suggested above, but you get the idea. If they were
     237% separate documents, they would each start with the \chapter command, i.e, do
     238% not contain \documentclass or \begin{document} and \end{document} commands.
    141239%======================================================================
    142240\chapter{Introduction}
     
    229327%----------------------------------------------------------------------
    230328
    231 %----------------------------------------------------------------------
    232 % BIBLIOGRAPHY
    233 %----------------------------------------------------------------------
    234 
     329% B I B L I O G R A P H Y
     330% -----------------------
     331
     332% The following statement selects the style to use for references. It controls
     333% the sort order of the entries in the bibliography and also the formatting
     334% for the in-text labels.
     335\bibliographystyle{plain}
     336% This specifies the location of the file containing the bibliographic
     337% information. It assumes you're using BibTeX (if not, why not?).
     338
     339% This is needed if the book class is used, to place the anchor in the correct
     340% page, because the bibliography will start on its own page.
    235341% Use \clearpage instead if the document class uses the "oneside" argument.
    236342\cleardoublepage
     343% With hyperref package, enables hyperlinking from the table of contents to
     344% bibliography
    237345\phantomsection
    238346
    239 % Bibliography setup and creation, renamed to References.
    240 \addcontentsline{toc}{chapter}{\textbf{\bibname}}
    241 \bibliographystyle{plain}
     347% The following statement causes the title "References" to be used for the
     348% bibliography section:
     349\renewcommand*{\bibname}{References}
     350
     351% Add the References to the Table of Contents
     352\addcontentsline{toc}{chapter}{\textbf{References}}
     353
     354% Tip 5: You can create multiple .bib files to organize your references. Just
     355% list them all in the \bibliogaphy command, separated by commas (no spaces).
    242356\bibliography{thesis}
    243357
    244 % Include all uncited entries in the bibliography.
     358% The following statement causes the specified references to be added to the
     359% bibliography even if they were not cited in the text. The asterisk is a
     360% wildcard that causes all entries in the bibliographic database to be
     361% included (optional).
    245362\nocite{*}
    246363
    247 % Begin the appendix, add a title and table of contents entry.
     364% The \appendix statement indicates the beginning of the appendices.
    248365\appendix
     366% Add a title page before the appendices and a line in the Table of Contents
    249367\chapter*{APPENDICES}
    250368\addcontentsline{toc}{chapter}{APPENDICES}
  • doc/theses/thierry_delisle_PhD/comp_II/comp_II.tex

    rbbdb0c6 rc4fd4ef  
    88\usepackage{graphicx}
    99\usepackage{epic,eepic}
     10\usepackage[hidelinks]{hyperref}
    1011\usepackage{glossaries}
    1112\usepackage{textcomp}
    12 \usepackage[hidelinks]{hyperref}
    1313%\usepackage[margin=1in]{geometry}
    1414%\usepackage{float}
     
    151151\begin{table}
    152152        \begin{center}
    153                 \begin{tabular}{|r|l|l|}
    154                         \cline{2-3}
    155                         \multicolumn{1}{r|}{} & \multicolumn{1}{c|}{Many Processors} & \multicolumn{1}{c|}{Few Processors} \\
     153                \begin{tabular}{|c|c|c|}
     154                        \hline
     155                        & Many Processors & Few Processors \\
    156156                        \hline
    157157                        Many Threads & A: good performance & B: good performance \\
     
    260260
    261261
     262\cleardoublepage
     263
    262264% B I B L I O G R A P H Y
    263265% -----------------------------
    264 \cleardoublepage
    265 \phantomsection         % allows hyperref to link to the correct page
    266 \addcontentsline{toc}{section}{\refname}
     266\addcontentsline{toc}{chapter}{Bibliography}
    267267\bibliographystyle{plain}
    268268\bibliography{pl,local}
     269\cleardoublepage
     270\phantomsection         % allows hyperref to link to the correct page
    269271
    270272% G L O S S A R Y
    271273% -----------------------------
     274\addcontentsline{toc}{chapter}{Glossary}
     275\printglossary
    272276\cleardoublepage
    273277\phantomsection         % allows hyperref to link to the correct page
    274 \addcontentsline{toc}{section}{Glossary}
    275 \printglossary
    276278
    277279\end{document}
  • libcfa/prelude/builtins.c

    rbbdb0c6 rc4fd4ef  
    4848void exit( int status, const char fmt[], ... ) __attribute__ (( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ ));
    4949void abort( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ ));
    50 
    51 forall(dtype T)
    52 static inline T & identity(T & i) {
    53         return i;
    54 }
    55 
    56 // generator support
    57 struct $generator {
    58         inline int;
    59 };
    60 
    61 static inline void  ?{}($generator & this) { ((int&)this) = 0; }
    62 static inline void ^?{}($generator &) {}
    63 
    64 trait is_generator(dtype T) {
    65       void main(T & this);
    66       $generator * get_generator(T & this);
    67 };
    68 
    69 forall(dtype T | is_generator(T))
    70 static inline T & resume(T & gen) {
    71         main(gen);
    72         return gen;
    73 }
    7450
    7551// implicit increment, decrement if += defined, and implicit not if != defined
  • libcfa/src/Makefile.am

    rbbdb0c6 rc4fd4ef  
    1111## Created On       : Sun May 31 08:54:01 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Mon Mar 16 18:07:59 2020
    14 ## Update Count     : 242
     13## Last Modified On : Mon Jul 15 22:43:27 2019
     14## Update Count     : 241
    1515###############################################################################
    1616
     
    3939#----------------------------------------------------------------------------------------------------------------
    4040if BUILDLIB
    41 headers_nosrc = bitmanip.hfa math.hfa gmp.hfa time_t.hfa bits/align.hfa bits/containers.hfa bits/defs.hfa bits/debug.hfa bits/locks.hfa
     41headers_nosrc = math.hfa gmp.hfa time_t.hfa bits/align.hfa bits/containers.hfa bits/defs.hfa bits/debug.hfa bits/locks.hfa
    4242headers = fstream.hfa iostream.hfa iterator.hfa limits.hfa rational.hfa time.hfa stdlib.hfa common.hfa \
    4343          containers/maybe.hfa containers/pair.hfa containers/result.hfa containers/vector.hfa
  • libcfa/src/Makefile.in

    rbbdb0c6 rc4fd4ef  
    237237        limits.hfa rational.hfa time.hfa stdlib.hfa common.hfa \
    238238        containers/maybe.hfa containers/pair.hfa containers/result.hfa \
    239         containers/vector.hfa bitmanip.hfa math.hfa gmp.hfa time_t.hfa \
     239        containers/vector.hfa math.hfa gmp.hfa time_t.hfa \
    240240        bits/align.hfa bits/containers.hfa bits/defs.hfa \
    241241        bits/debug.hfa bits/locks.hfa concurrency/coroutine.hfa \
     
    432432am__v_GOC_0 = @echo "  GOC     " $@;
    433433am__v_GOC_1 =
    434 AM_V_PY = $(am__v_PY_@AM_V@)
    435 am__v_PY_ = $(am__v_PY_@AM_DEFAULT_V@)
    436 am__v_PY_0 = @echo "  PYTHON  " $@;
    437 am__v_PY_1 =
    438434AM_V_RUST = $(am__v_RUST_@AM_V@)
    439435am__v_RUST_ = $(am__v_RUST_@AM_DEFAULT_V@)
    440 am__v_RUST_0 = @echo "  RUST    " $@;
     436am__v_RUST_0 = @echo "  RUST     " $@;
    441437am__v_RUST_1 =
    442438AM_V_NODEJS = $(am__v_NODEJS_@AM_V@)
    443439am__v_NODEJS_ = $(am__v_NODEJS_@AM_DEFAULT_V@)
    444 am__v_NODEJS_0 = @echo "  NODEJS  " $@;
     440am__v_NODEJS_0 = @echo "  NODEJS     " $@;
    445441am__v_NODEJS_1 =
    446442AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
     
    461457
    462458#----------------------------------------------------------------------------------------------------------------
    463 @BUILDLIB_TRUE@headers_nosrc = bitmanip.hfa math.hfa gmp.hfa time_t.hfa bits/align.hfa bits/containers.hfa bits/defs.hfa bits/debug.hfa bits/locks.hfa
     459@BUILDLIB_TRUE@headers_nosrc = math.hfa gmp.hfa time_t.hfa bits/align.hfa bits/containers.hfa bits/defs.hfa bits/debug.hfa bits/locks.hfa
    464460@BUILDLIB_FALSE@headers =
    465461@BUILDLIB_TRUE@headers = fstream.hfa iostream.hfa iterator.hfa limits.hfa rational.hfa time.hfa stdlib.hfa common.hfa \
  • libcfa/src/concurrency/coroutine.cfa

    rbbdb0c6 rc4fd4ef  
    208208
    209209                if(cor->state == Primed) {
    210                         __cfactx_suspend();
     210                        suspend();
    211211                }
    212212
  • libcfa/src/concurrency/coroutine.hfa

    rbbdb0c6 rc4fd4ef  
    4646//-----------------------------------------------------------------------------
    4747// Public coroutine API
     48static inline void suspend(void);
     49
     50forall(dtype T | is_coroutine(T))
     51static inline T & resume(T & cor);
     52
    4853forall(dtype T | is_coroutine(T))
    4954void prime(T & cor);
     
    9196
    9297// Suspend implementation inlined for performance
    93 extern "C" {
    94         static inline void __cfactx_suspend(void) {
    95                 // optimization : read TLS once and reuse it
    96                 // Safety note: this is preemption safe since if
    97                 // preemption occurs after this line, the pointer
    98                 // will also migrate which means this value will
    99                 // stay in syn with the TLS
    100                 $coroutine * src = TL_GET( this_thread )->curr_cor;
     98static inline void suspend(void) {
     99        // optimization : read TLS once and reuse it
     100        // Safety note: this is preemption safe since if
     101        // preemption occurs after this line, the pointer
     102        // will also migrate which means this value will
     103        // stay in syn with the TLS
     104        $coroutine * src = TL_GET( this_thread )->curr_cor;
    101105
    102                 assertf( src->last != 0,
    103                         "Attempt to suspend coroutine \"%.256s\" (%p) that has never been resumed.\n"
    104                         "Possible cause is a suspend executed in a member called by a coroutine user rather than by the coroutine main.",
    105                         src->name, src );
    106                 assertf( src->last->state != Halted,
    107                         "Attempt by coroutine \"%.256s\" (%p) to suspend back to terminated coroutine \"%.256s\" (%p).\n"
    108                         "Possible cause is terminated coroutine's main routine has already returned.",
    109                         src->name, src, src->last->name, src->last );
     106        assertf( src->last != 0,
     107                "Attempt to suspend coroutine \"%.256s\" (%p) that has never been resumed.\n"
     108                "Possible cause is a suspend executed in a member called by a coroutine user rather than by the coroutine main.",
     109                src->name, src );
     110        assertf( src->last->state != Halted,
     111                "Attempt by coroutine \"%.256s\" (%p) to suspend back to terminated coroutine \"%.256s\" (%p).\n"
     112                "Possible cause is terminated coroutine's main routine has already returned.",
     113                src->name, src, src->last->name, src->last );
    110114
    111                 $ctx_switch( src, src->last );
    112         }
     115        $ctx_switch( src, src->last );
    113116}
    114117
  • libcfa/src/exception.c

    rbbdb0c6 rc4fd4ef  
    252252}
    253253
     254#pragma GCC push_options
     255#pragma GCC optimize("O0")
     256
    254257// This is our personality routine. For every stack frame annotated with
    255258// ".cfi_personality 0x3,__gcfa_personality_v0" this function will be called twice when unwinding.
     
    410413        return _URC_CONTINUE_UNWIND;
    411414}
    412 
    413 #pragma GCC push_options
    414 #pragma GCC optimize("O0")
    415415
    416416// Try statements are hoisted out see comments for details. While this could probably be unique
  • libcfa/src/interpose.cfa

    rbbdb0c6 rc4fd4ef  
    1010// Created On       : Wed Mar 29 16:10:31 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 13 17:35:37 2020
    13 // Update Count     : 178
     12// Last Modified On : Mon Mar  2 17:37:00 2020
     13// Update Count     : 176
    1414//
    1515
     
    234234
    235235        if ( fmt[strlen( fmt ) - 1] != '\n' ) {                         // add optional newline if missing at the end of the format text
    236                 __cfaabi_bits_write( STDERR_FILENO, "\n", 1 );
     236                __cfaabi_dbg_write( "\n", 1 );
    237237        } // if
    238238        kernel_abort_msg( kernel_data, abort_text, abort_text_size );
  • libcfa/src/iostream.cfa

    rbbdb0c6 rc4fd4ef  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Mar 11 14:35:35 2020
    13 // Update Count     : 860
     12// Last Modified On : Thu Mar  5 15:56:16 2020
     13// Update Count     : 834
    1414//
    1515
     
    534534#define IntegralFMTImpl128( T, SIGNED, CODE, IFMTNP, IFMTP ) \
    535535forall( dtype ostype | ostream( ostype ) ) \
    536 static void base10_128( ostype & os, _Ostream_Manip(T) f ) { \
    537         if ( f.val > UINT64_MAX ) { \
    538                 unsigned long long int lsig = f.val % P10_UINT64; \
    539                 f.val /= P10_UINT64; /* msig */ \
    540                 base10_128( os, f ); /* recursion */ \
    541                 _Ostream_Manip(unsigned long long int) fmt @= { lsig, 0, 19, 'u', { .all : 0 } }; \
    542                 fmt.flags.nobsdp = true; \
    543                 /* printf( "fmt1 %c %lld %d\n", fmt.base, fmt.val, fmt.all ); */ \
     536static void base10_128( ostype & os, _Ostream_Manip(T) fmt ) { \
     537        if ( fmt.val > UINT64_MAX ) { \
     538                base10_128( os, fmt.val / P10_UINT64 ); /* recursive */ \
     539                _Ostream_Manip(unsigned long long int) fmt2 @= { (uint64_t)(fmt.val % P10_UINT64), 0, 19, 'u', { .all : 0 } }; \
     540                fmt2.flags.nobsdp = true; \
     541                printf( "fmt2 %c %lld %d\n", fmt2.base, fmt2.val, fmt2.all );   \
    544542                sepOff( os ); \
    545                 (ostype &)(os | fmt); \
     543                (ostype &)(os | fmt2); \
    546544        } else { \
    547                 /* printf( "fmt2 %c %lld %d\n", f.base, (unsigned long long int)f.val, f.all ); */ \
    548                 _Ostream_Manip(SIGNED long long int) fmt @= { (SIGNED long long int)f.val, f.wd, f.pc, f.base, { .all : f.all } }; \
    549                 (ostype &)(os | fmt); \
     545                printf( "fmt %c %lld %d\n", fmt.base, (unsigned long long int)fmt.val, fmt.all ); \
     546                _Ostream_Manip(SIGNED long long int) x @= { (unsigned long long int)fmt.val, fmt.wd, fmt.pc, fmt.base, { .all : fmt.all } }; \
     547                (ostype &)(os | x); \
    550548        } /* if */ \
    551 } /* base10_128 */ \
     549} /* base10_128 */                                                \
    552550forall( dtype ostype | ostream( ostype ) ) { \
    553551        ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \
     
    566564                                if ( f.base == 'b' | f.base == 'B' ) { \
    567565                                        if ( f.wd > 64 ) fmt.wd = f.wd - 64; \
    568                                         if ( f.flags.pc && f.pc > 64 ) fmt.pc = f.pc - 64; \
    569566                                        fmt2.wd = 64; \
    570567                                        (ostype &)(os | fmt | "" | fmt2); \
     
    572569                                        fmt.val = (unsigned long long int)fmt.val >> 2; \
    573570                                        if ( f.wd > 21 ) fmt.wd = f.wd - 21; \
    574                                         if ( f.flags.pc && f.pc > 21 ) fmt.pc = f.pc - 21; \
    575571                                        fmt2.wd = 1; \
    576572                                        fmt2.val = ((msig & 0x3) << 1) + 1; \
     
    582578                                } else { \
    583579                                        if ( f.flags.left ) { \
    584                                                 if ( f.wd > 16 ) fmt2.wd = f.wd - 16; \
    585                                                 fmt.wd = 16; \
     580                                                if ( f.wd > 16 ) fmt2.wd = f.wd - 16;   \
     581                                                fmt.wd = 16;                                                    \
    586582                                        } else { \
    587                                                 if ( f.wd > 16 ) fmt.wd = f.wd - 16; \
    588                                                 if ( f.flags.pc && f.pc > 16 ) fmt.pc = f.pc - 16; \
    589                                                 fmt2.wd = 16; \
     583                                                if ( f.wd > 16 ) fmt.wd = f.wd - 16;    \
     584                                                fmt2.wd = 16;                                                   \
    590585                                        } /* if */ \
    591586                                        (ostype &)(os | fmt | "" | fmt2); \
     
    593588                        } /* if */ \
    594589                } else { \
    595                         if ( CODE == 'd' ) { \
    596                                 if ( f.val < 0 )  { fmt( os, "-" ); sepOff( os ); f.val = -f.val; f.flags.sign = false; } \
    597                         } /* if */ \
    598590                        base10_128( os, f ); \
    599591                } /* if */ \
  • src/AST/Convert.cpp

    rbbdb0c6 rc4fd4ef  
    493493        }
    494494
    495         const ast::Stmt * visit(const ast::SuspendStmt * node ) override final {
    496                 if ( inCache( node ) ) return nullptr;
    497                 auto stmt = new SuspendStmt();
    498                 stmt->then   = get<CompoundStmt>().accept1( node->then   );
    499                 switch(node->type) {
    500                         case ast::SuspendStmt::None     : stmt->type = SuspendStmt::None     ; break;
    501                         case ast::SuspendStmt::Coroutine: stmt->type = SuspendStmt::Coroutine; break;
    502                         case ast::SuspendStmt::Generator: stmt->type = SuspendStmt::Generator; break;
    503                 }
    504                 return stmtPostamble( stmt, node );
    505         }
    506 
    507495        const ast::Stmt * visit( const ast::WaitForStmt * node ) override final {
    508496                if ( inCache( node ) ) return nullptr;
     
    18711859        }
    18721860
    1873         virtual void visit( const SuspendStmt * old ) override final {
    1874                 if ( inCache( old ) ) return;
    1875                 ast::SuspendStmt::Type type;
    1876                 switch (old->type) {
    1877                         case SuspendStmt::Coroutine: type = ast::SuspendStmt::Coroutine; break;
    1878                         case SuspendStmt::Generator: type = ast::SuspendStmt::Generator; break;
    1879                         case SuspendStmt::None     : type = ast::SuspendStmt::None     ; break;
    1880                         default: abort();
    1881                 }
    1882                 this->node = new ast::SuspendStmt(
    1883                         old->location,
    1884                         GET_ACCEPT_1(then  , CompoundStmt),
    1885                         type,
    1886                         GET_LABELS_V(old->labels)
    1887                 );
    1888                 cache.emplace( old, this->node );
    1889         }
    1890 
    18911861        virtual void visit( const WaitForStmt * old ) override final {
    18921862                if ( inCache( old ) ) return;
  • src/AST/Decl.hpp

    rbbdb0c6 rc4fd4ef  
    259259
    260260        bool is_coroutine() { return kind == Coroutine; }
    261         bool is_generator() { return kind == Generator; }
    262         bool is_monitor  () { return kind == Monitor  ; }
    263         bool is_thread   () { return kind == Thread   ; }
     261        bool is_monitor() { return kind == Monitor; }
     262        bool is_thread() { return kind == Thread; }
    264263
    265264        const Decl * accept( Visitor & v ) const override { return v.visit( this ); }
  • src/AST/Fwd.hpp

    rbbdb0c6 rc4fd4ef  
    5353class CatchStmt;
    5454class FinallyStmt;
    55 class SuspendStmt;
    5655class WaitForStmt;
    5756class WithStmt;
  • src/AST/Pass.hpp

    rbbdb0c6 rc4fd4ef  
    111111        const ast::Stmt *             visit( const ast::CatchStmt            * ) override final;
    112112        const ast::Stmt *             visit( const ast::FinallyStmt          * ) override final;
    113         const ast::Stmt *             visit( const ast::SuspendStmt          * ) override final;
    114113        const ast::Stmt *             visit( const ast::WaitForStmt          * ) override final;
    115114        const ast::Decl *             visit( const ast::WithStmt             * ) override final;
  • src/AST/Pass.impl.hpp

    rbbdb0c6 rc4fd4ef  
    823823
    824824//--------------------------------------------------------------------------
    825 // FinallyStmt
    826 template< typename pass_t >
    827 const ast::Stmt * ast::Pass< pass_t >::visit( const ast::SuspendStmt * node ) {
    828         VISIT_START( node );
    829 
    830         VISIT(
    831                 maybe_accept( node, &SuspendStmt::then   );
    832         )
    833 
    834         VISIT_END( Stmt, node );
    835 }
    836 
    837 //--------------------------------------------------------------------------
    838825// WaitForStmt
    839826template< typename pass_t >
  • src/AST/Print.cpp

    rbbdb0c6 rc4fd4ef  
    674674                safe_print( node->body );
    675675                --indent;
    676 
    677                 return node;
    678         }
    679 
    680         virtual const ast::Stmt * visit( const ast::SuspendStmt * node ) override final {
    681                 os << "Suspend Statement";
    682                 switch (node->type) {
    683                         case ast::SuspendStmt::None     : os << " with implicit target"; break;
    684                         case ast::SuspendStmt::Generator: os << " for generator"; break;
    685                         case ast::SuspendStmt::Coroutine: os << " for coroutine"; break;
    686                 }
    687                 os << endl;
    688 
    689                 ++indent;
    690                 if(node->then) {
    691                         os << indent << " with post statement :" << endl;
    692                         safe_print( node->then );
    693                 }
    694                 ++indent;
    695676
    696677                return node;
  • src/AST/Stmt.hpp

    rbbdb0c6 rc4fd4ef  
    342342};
    343343
    344 /// Suspend statement
    345 class SuspendStmt final : public Stmt {
    346 public:
    347         ptr<CompoundStmt> then;
    348         enum Type { None, Coroutine, Generator } type = None;
    349 
    350         SuspendStmt( const CodeLocation & loc, const CompoundStmt * then, Type type, std::vector<Label> && labels = {} )
    351         : Stmt(loc, std::move(labels)), then(then), type(type) {}
    352 
    353         const Stmt * accept( Visitor & v ) const override { return v.visit( this ); }
    354 private:
    355         SuspendStmt * clone() const override { return new SuspendStmt{ *this }; }
    356         MUTATE_FRIEND
    357 };
    358 
    359344/// Wait for concurrency statement `when (...) waitfor (... , ...) ... timeout(...) ... else ...`
    360345class WaitForStmt final : public Stmt {
  • src/AST/Visitor.hpp

    rbbdb0c6 rc4fd4ef  
    4747    virtual const ast::Stmt *             visit( const ast::CatchStmt            * ) = 0;
    4848    virtual const ast::Stmt *             visit( const ast::FinallyStmt          * ) = 0;
    49     virtual const ast::Stmt *             visit( const ast::SuspendStmt          * ) = 0;
    5049    virtual const ast::Stmt *             visit( const ast::WaitForStmt          * ) = 0;
    5150    virtual const ast::Decl *             visit( const ast::WithStmt             * ) = 0;
  • src/Common/PassVisitor.h

    rbbdb0c6 rc4fd4ef  
    110110        virtual void visit( FinallyStmt * finallyStmt ) override final;
    111111        virtual void visit( const FinallyStmt * finallyStmt ) override final;
    112         virtual void visit( SuspendStmt * suspendStmt ) override final;
    113         virtual void visit( const SuspendStmt * suspendStmt ) override final;
    114112        virtual void visit( WaitForStmt * waitforStmt ) override final;
    115113        virtual void visit( const WaitForStmt * waitforStmt ) override final;
     
    278276        virtual Statement * mutate( CatchStmt * catchStmt ) override final;
    279277        virtual Statement * mutate( FinallyStmt * finallyStmt ) override final;
    280         virtual Statement * mutate( SuspendStmt * suspendStmt ) override final;
    281278        virtual Statement * mutate( WaitForStmt * waitforStmt ) override final;
    282279        virtual Declaration * mutate( WithStmt * withStmt ) override final;
  • src/Common/PassVisitor.impl.h

    rbbdb0c6 rc4fd4ef  
    15221522
    15231523//--------------------------------------------------------------------------
    1524 // SuspendStmt
    1525 template< typename pass_type >
    1526 void PassVisitor< pass_type >::visit( SuspendStmt * node ) {
    1527         VISIT_START( node );
    1528 
    1529         maybeAccept_impl( node->then  , *this );
    1530 
    1531         VISIT_END( node );
    1532 }
    1533 
    1534 template< typename pass_type >
    1535 void PassVisitor< pass_type >::visit( const SuspendStmt * node ) {
    1536         VISIT_START( node );
    1537 
    1538         maybeAccept_impl( node->then  , *this );
    1539 
    1540         VISIT_END( node );
    1541 }
    1542 
    1543 template< typename pass_type >
    1544 Statement * PassVisitor< pass_type >::mutate( SuspendStmt * node ) {
    1545         MUTATE_START( node );
    1546 
    1547         maybeMutate_impl( node->then  , *this );
    1548 
    1549         MUTATE_END( Statement, node );
    1550 }
    1551 
    1552 //--------------------------------------------------------------------------
    15531524// WaitForStmt
    15541525template< typename pass_type >
  • src/Concurrency/Keywords.cc

    rbbdb0c6 rc4fd4ef  
    1616#include "Concurrency/Keywords.h"
    1717
    18 #include <cassert>                        // for assert
    19 #include <string>                         // for string, operator==
    20 
    21 #include "Common/PassVisitor.h"           // for PassVisitor
    22 #include "Common/SemanticError.h"         // for SemanticError
    23 #include "Common/utility.h"               // for deleteAll, map_range
    24 #include "CodeGen/OperatorTable.h"        // for isConstructor
    25 #include "ControlStruct/LabelGenerator.h" // for LebelGenerator
    26 #include "InitTweak/InitTweak.h"          // for getPointerBase
    27 #include "SynTree/LinkageSpec.h"          // for Cforall
    28 #include "SynTree/Constant.h"             // for Constant
    29 #include "SynTree/Declaration.h"          // for StructDecl, FunctionDecl, ObjectDecl
    30 #include "SynTree/Expression.h"           // for VariableExpr, ConstantExpr, Untype...
    31 #include "SynTree/Initializer.h"          // for SingleInit, ListInit, Initializer ...
    32 #include "SynTree/Label.h"                // for Label
    33 #include "SynTree/Statement.h"            // for CompoundStmt, DeclStmt, ExprStmt
    34 #include "SynTree/Type.h"                 // for StructInstType, Type, PointerType
    35 #include "SynTree/Visitor.h"              // for Visitor, acceptAll
     18#include <cassert>                 // for assert
     19#include <string>                  // for string, operator==
     20
     21#include "Common/PassVisitor.h"    // for PassVisitor
     22#include "Common/SemanticError.h"  // for SemanticError
     23#include "Common/utility.h"        // for deleteAll, map_range
     24#include "CodeGen/OperatorTable.h" // for isConstructor
     25#include "InitTweak/InitTweak.h"   // for getPointerBase
     26#include "SynTree/LinkageSpec.h"   // for Cforall
     27#include "SynTree/Constant.h"      // for Constant
     28#include "SynTree/Declaration.h"   // for StructDecl, FunctionDecl, ObjectDecl
     29#include "SynTree/Expression.h"    // for VariableExpr, ConstantExpr, Untype...
     30#include "SynTree/Initializer.h"   // for SingleInit, ListInit, Initializer ...
     31#include "SynTree/Label.h"         // for Label
     32#include "SynTree/Statement.h"     // for CompoundStmt, DeclStmt, ExprStmt
     33#include "SynTree/Type.h"          // for StructInstType, Type, PointerType
     34#include "SynTree/Visitor.h"       // for Visitor, acceptAll
    3635
    3736class Attribute;
     
    148147        };
    149148
    150 
    151 
    152149        //-----------------------------------------------------------------------------
    153150        //Handles monitor type declarations :
     
    183180
    184181        //-----------------------------------------------------------------------------
    185         //Handles generator type declarations :
    186         // generator MyGenerator {                   struct MyGenerator {
    187         //      int data;                                  int data;
    188         //      a_struct_t more_data;                      a_struct_t more_data;
    189         //                                =>             int __gen_next;
    190         // };                                        };
    191         //
    192         class GeneratorKeyword final : public ConcurrentSueKeyword {
    193           public:
    194 
    195                 GeneratorKeyword() : ConcurrentSueKeyword(
    196                         "$generator",
    197                         "__generator_state",
    198                         "get_generator",
    199                         "Unable to find builtin type $generator\n",
    200                         true,
    201                         AggregateDecl::Generator
    202                 )
    203                 {}
    204 
    205                 virtual ~GeneratorKeyword() {}
    206 
    207                 virtual bool is_target( StructDecl * decl ) override final { return decl->is_generator(); }
    208 
    209                 static void implement( std::list< Declaration * > & translationUnit ) {
    210                         PassVisitor< GeneratorKeyword > impl;
    211                         mutateAll( translationUnit, impl );
    212                 }
    213         };
    214 
    215 
    216         //-----------------------------------------------------------------------------
    217         class SuspendKeyword final : public WithStmtsToAdd, public WithGuards {
    218         public:
    219                 SuspendKeyword() = default;
    220                 virtual ~SuspendKeyword() = default;
    221 
    222                 void  premutate( FunctionDecl * );
    223                 DeclarationWithType * postmutate( FunctionDecl * );
    224 
    225                 Statement * postmutate( SuspendStmt * );
    226 
    227                 static void implement( std::list< Declaration * > & translationUnit ) {
    228                         PassVisitor< SuspendKeyword > impl;
    229                         mutateAll( translationUnit, impl );
    230                 }
    231 
    232         private:
    233                 DeclarationWithType * is_main( FunctionDecl * );
    234                 bool is_real_suspend( FunctionDecl * );
    235 
    236                 Statement * make_generator_suspend( SuspendStmt * );
    237                 Statement * make_coroutine_suspend( SuspendStmt * );
    238 
    239                 struct LabelPair {
    240                         Label obj;
    241                         int   idx;
    242                 };
    243 
    244                 LabelPair make_label() {
    245                         labels.push_back( gen.newLabel("generator") );
    246                         return { labels.back(), int(labels.size()) };
    247                 }
    248 
    249                 DeclarationWithType * in_generator = nullptr;
    250                 FunctionDecl * decl_suspend = nullptr;
    251                 std::vector<Label> labels;
    252                 ControlStruct::LabelGenerator & gen = *ControlStruct::LabelGenerator::getGenerator();
    253         };
    254 
    255         //-----------------------------------------------------------------------------
    256182        //Handles mutex routines definitions :
    257183        // void foo( A * mutex a, B * mutex b,  int i ) {                  void foo( A * a, B * b,  int i ) {
     
    325251                CoroutineKeyword        ::implement( translationUnit );
    326252                MonitorKeyword  ::implement( translationUnit );
    327                 GeneratorKeyword  ::implement( translationUnit );
    328                 SuspendKeyword    ::implement( translationUnit );
    329253        }
    330254
     
    522446
    523447                declsToAddAfter.push_back( get_decl );
    524         }
    525 
    526         //=============================================================================================
    527         // Suspend keyword implementation
    528         //=============================================================================================
    529         DeclarationWithType * SuspendKeyword::is_main( FunctionDecl * func) {
    530                 if(func->name != "main") return nullptr;
    531                 if(func->type->parameters.size() != 1) return nullptr;
    532 
    533                 auto param = func->type->parameters.front();
    534 
    535                 auto type  = dynamic_cast<ReferenceType * >(param->get_type());
    536                 if(!type) return nullptr;
    537 
    538                 auto obj   = dynamic_cast<StructInstType *>(type->base);
    539                 if(!obj) return nullptr;
    540 
    541                 if(!obj->baseStruct->is_generator()) return nullptr;
    542 
    543                 return param;
    544         }
    545 
    546         bool SuspendKeyword::is_real_suspend( FunctionDecl * func ) {
    547                 if(isMangled(func->linkage)) return false; // the real suspend isn't mangled
    548                 if(func->name != "__cfactx_suspend") return false; // the real suspend has a specific name
    549                 if(func->type->parameters.size() != 0) return false; // Too many parameters
    550                 if(func->type->returnVals.size() != 0) return false; // Too many return values
    551 
    552                 return true;
    553         }
    554 
    555         void SuspendKeyword::premutate( FunctionDecl * func ) {
    556                 GuardValue(in_generator);
    557                 in_generator = nullptr;
    558 
    559                 // Is this the real suspend?
    560                 if(is_real_suspend(func)) {
    561                         decl_suspend = decl_suspend ? decl_suspend : func;
    562                         return;
    563                 }
    564 
    565                 // Is this the main of a generator?
    566                 auto param = is_main( func );
    567                 if(!param) return;
    568 
    569                 if(func->type->returnVals.size() != 0) SemanticError(func->location, "Generator main must return void");
    570 
    571                 in_generator = param;
    572                 GuardValue(labels);
    573                 labels.clear();
    574         }
    575 
    576         DeclarationWithType * SuspendKeyword::postmutate( FunctionDecl * func ) {
    577                 if( !func->statements ) return func; // Not the actual definition, don't do anything
    578                 if( !in_generator     ) return func; // Not in a generator, don't do anything
    579                 if( labels.empty()    ) return func; // Generator has no states, nothing to do, could throw a warning
    580 
    581                 // This is a generator main, we need to add the following code to the top
    582                 // static void * __generator_labels[] = {&&s0, &&s1, ...};
    583                 // goto * __generator_labels[gen.__generator_state];
    584                 const auto & loc = func->location;
    585 
    586                 const auto first_label = gen.newLabel("generator");
    587 
    588                 // for each label add to declaration
    589                 std::list<Initializer*> inits = { new SingleInit( new LabelAddressExpr( first_label ) ) };
    590                 for(const auto & label : labels) {
    591                         inits.push_back(
    592                                 new SingleInit(
    593                                         new LabelAddressExpr( label )
    594                                 )
    595                         );
    596                 }
    597                 auto init = new ListInit(std::move(inits), noDesignators, true);
    598                 labels.clear();
    599 
    600                 // create decl
    601                 auto decl = new ObjectDecl(
    602                         "__generator_labels",
    603                         Type::StorageClasses( Type::Static ),
    604                         LinkageSpec::AutoGen,
    605                         nullptr,
    606                         new ArrayType(
    607                                 Type::Qualifiers(),
    608                                 new PointerType(
    609                                         Type::Qualifiers(),
    610                                         new VoidType( Type::Qualifiers() )
    611                                 ),
    612                                 nullptr,
    613                                 false, false
    614                         ),
    615                         init
    616                 );
    617 
    618                 // create the goto
    619                 assert(in_generator);
    620 
    621                 auto go_decl = new ObjectDecl(
    622                         "__generator_label",
    623                         noStorageClasses,
    624                         LinkageSpec::AutoGen,
    625                         nullptr,
    626                         new PointerType(
    627                                 Type::Qualifiers(),
    628                                 new VoidType( Type::Qualifiers() )
    629                         ),
    630                         new SingleInit(
    631                                 new UntypedExpr(
    632                                         new NameExpr("?[?]"),
    633                                         {
    634                                                 new NameExpr("__generator_labels"),
    635                                                 new UntypedMemberExpr(
    636                                                         new NameExpr("__generator_state"),
    637                                                         new VariableExpr( in_generator )
    638                                                 )
    639                                         }
    640                                 )
    641                         )
    642                 );
    643                 go_decl->location = loc;
    644 
    645                 auto go = new BranchStmt(
    646                         new VariableExpr( go_decl ),
    647                         BranchStmt::Goto
    648                 );
    649                 go->location = loc;
    650                 go->computedTarget->location = loc;
    651 
    652                 auto noop = new NullStmt({ first_label });
    653                 noop->location = loc;
    654 
    655                 // wrap everything in a nice compound
    656                 auto body = new CompoundStmt({
    657                         new DeclStmt( decl ),
    658                         new DeclStmt( go_decl ),
    659                         go,
    660                         noop,
    661                         func->statements
    662                 });
    663                 body->location   = loc;
    664                 func->statements = body;
    665 
    666                 return func;
    667         }
    668 
    669         Statement * SuspendKeyword::postmutate( SuspendStmt * stmt ) {
    670                 SuspendStmt::Type type = stmt->type;
    671                 if(type == SuspendStmt::None) {
    672                         // This suspend has a implicit target, find it
    673                         type = in_generator ? SuspendStmt::Generator : SuspendStmt::Coroutine;
    674                 }
    675 
    676                 // Check that the target makes sense
    677                 if(!in_generator && type == SuspendStmt::Generator) SemanticError( stmt->location, "'suspend generator' must be used inside main of generator type.");
    678 
    679                 // Act appropriately
    680                 switch(type) {
    681                         case SuspendStmt::Generator: return make_generator_suspend(stmt);
    682                         case SuspendStmt::Coroutine: return make_coroutine_suspend(stmt);
    683                         default: abort();
    684                 }
    685         }
    686 
    687         Statement * SuspendKeyword::make_generator_suspend( SuspendStmt * stmt ) {
    688                 assert(in_generator);
    689                 // Target code is :
    690                 //   gen.__generator_state = X;
    691                 //   { THEN }
    692                 //   return;
    693                 //   __gen_X:;
    694 
    695                 // Save the location and delete the old statement, we only need the location from this point on
    696                 auto loc = stmt->location;
    697 
    698                 // Build the label and get its index
    699                 auto label = make_label();
    700 
    701                 // Create the context saving statement
    702                 auto save = new ExprStmt( new UntypedExpr(
    703                         new NameExpr( "?=?" ),
    704                         {
    705                                 new UntypedMemberExpr(
    706                                         new NameExpr("__generator_state"),
    707                                         new VariableExpr( in_generator )
    708                                 ),
    709                                 new ConstantExpr(
    710                                         Constant::from_int( label.idx )
    711                                 )
    712                         }
    713                 ));
    714                 assert(save->expr);
    715                 save->location = loc;
    716                 stmtsToAddBefore.push_back( save );
    717 
    718                 // if we have a then add it here
    719                 auto then = stmt->then;
    720                 stmt->then = nullptr;
    721                 delete stmt;
    722                 if(then) stmtsToAddBefore.push_back( then );
    723 
    724                 // Create the return statement
    725                 auto ret = new ReturnStmt( nullptr );
    726                 ret->location = loc;
    727                 stmtsToAddBefore.push_back( ret );
    728 
    729                 // Create the null statement with the created label
    730                 auto noop = new NullStmt({ label.obj });
    731                 noop->location = loc;
    732 
    733                 // Return the null statement to take the place of the previous statement
    734                 return noop;
    735         }
    736 
    737         Statement * SuspendKeyword::make_coroutine_suspend( SuspendStmt * stmt ) {
    738                 if(stmt->then) SemanticError( stmt->location, "Compound statement following coroutines is not implemented.");
    739 
    740                 // Save the location and delete the old statement, we only need the location from this point on
    741                 auto loc = stmt->location;
    742                 delete stmt;
    743 
    744                 // Create the call expression
    745                 if(!decl_suspend) SemanticError( loc, "suspend keyword applied to coroutines requires coroutines to be in scope, add #include <coroutine.hfa>\n");
    746                 auto expr = new UntypedExpr( VariableExpr::functionPointer( decl_suspend ) );
    747                 expr->location = loc;
    748 
    749                 // Change this statement into a regular expr
    750                 assert(expr);
    751                 auto nstmt = new ExprStmt( expr );
    752                 nstmt->location = loc;
    753                 return nstmt;
    754         }
    755 
     448
     449                // get_decl->fixUniqueId();
     450        }
    756451
    757452        //=============================================================================================
  • src/Parser/ParseNode.h

    rbbdb0c6 rc4fd4ef  
    428428Statement * build_asm( bool voltile, Expression * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );
    429429Statement * build_directive( std::string * directive );
    430 SuspendStmt * build_suspend( StatementNode *, SuspendStmt::Type = SuspendStmt::None);
    431430WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when );
    432431WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when, WaitForStmt * existing );
  • src/Parser/StatementNode.cc

    rbbdb0c6 rc4fd4ef  
    249249} // build_finally
    250250
    251 SuspendStmt * build_suspend( StatementNode * then, SuspendStmt::Type type ) {
    252         auto node = new SuspendStmt();
    253 
    254         node->type = type;
    255 
    256         std::list< Statement * > stmts;
    257         buildMoveList< Statement, StatementNode >( then, stmts );
    258         if(!stmts.empty()) {
    259                 assert( stmts.size() == 1 );
    260                 node->then = dynamic_cast< CompoundStmt * >( stmts.front() );
    261         }
    262 
    263         return node;
    264 }
    265 
    266251WaitForStmt * build_waitfor( ExpressionNode * targetExpr, StatementNode * stmt, ExpressionNode * when ) {
    267252        auto node = new WaitForStmt();
  • src/Parser/TypeData.cc

    rbbdb0c6 rc4fd4ef  
    769769          case AggregateDecl::Struct:
    770770          case AggregateDecl::Coroutine:
    771           case AggregateDecl::Generator:
    772771          case AggregateDecl::Monitor:
    773772          case AggregateDecl::Thread:
  • src/Parser/lex.ll

    rbbdb0c6 rc4fd4ef  
    6565#define FLOATXX(v) KEYWORD_RETURN(v);
    6666#else
    67 #define FLOATXX(v) IDENTIFIER_RETURN();
     67#define FLOATXX(v) IDENTIFIER_RETURN(); 
    6868#endif // HAVE_KEYWORDS_FLOATXX
    6969
     
    301301_Static_assert  { KEYWORD_RETURN(STATICASSERT); }               // C11
    302302struct                  { KEYWORD_RETURN(STRUCT); }
    303 suspend                 { KEYWORD_RETURN(SUSPEND); }                    // CFA
     303        /* suspend                      { KEYWORD_RETURN(SUSPEND); }                    // CFA */
    304304switch                  { KEYWORD_RETURN(SWITCH); }
    305305thread                  { KEYWORD_RETURN(THREAD); }                             // C11
  • src/Parser/parser.yy

    rbbdb0c6 rc4fd4ef  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar  6 17:26:45 2020
    13 // Update Count     : 4474
     12// Last Modified On : Wed Feb 26 14:27:39 2020
     13// Update Count     : 4472
    1414//
    1515
     
    278278%token OTYPE FTYPE DTYPE TTYPE TRAIT                                    // CFA
    279279%token SIZEOF OFFSETOF
    280 // %token RESUME                                                                        // CFA
    281 %token SUSPEND                                                                  // CFA
     280// %token SUSPEND RESUME                                                                        // CFA
    282281%token ATTRIBUTE EXTENSION                                                              // GCC
    283282%token IF ELSE SWITCH CASE DEFAULT DO WHILE FOR BREAK CONTINUE GOTO RETURN
     
    919918        conditional_expression
    920919        | unary_expression assignment_operator assignment_expression
    921                 {
    922                         if ( $2 == OperKinds::AtAssn ) {
    923                                 SemanticError( yylloc, "C @= assignment is currently unimplemented." ); $$ = nullptr;
    924                         } else {
    925                                 $$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) );
    926                         } // if
    927                 }
     920                { $$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) ); }
    928921        | unary_expression '=' '{' initializer_list_opt comma_opt '}'
    929922                { SemanticError( yylloc, "Initializer assignment is currently unimplemented." ); $$ = nullptr; }
     
    12661259        | RETURN '{' initializer_list_opt comma_opt '}' ';'
    12671260                { SemanticError( yylloc, "Initializer return is currently unimplemented." ); $$ = nullptr; }
    1268         | SUSPEND ';'
    1269                 { $$ = new StatementNode( build_suspend( nullptr ) ); }
    1270         | SUSPEND compound_statement
    1271                 { $$ = new StatementNode( build_suspend( $2 ) ); }
    1272         | SUSPEND COROUTINE ';'
    1273                 { $$ = new StatementNode( build_suspend( nullptr, SuspendStmt::Coroutine ) ); }
    1274         | SUSPEND COROUTINE compound_statement
    1275                 { $$ = new StatementNode( build_suspend( $3, SuspendStmt::Coroutine ) ); }
    1276         | SUSPEND GENERATOR ';'
    1277                 { $$ = new StatementNode( build_suspend( nullptr, SuspendStmt::Generator ) ); }
    1278         | SUSPEND GENERATOR compound_statement
    1279                 { $$ = new StatementNode( build_suspend( $3, SuspendStmt::Generator ) ); }
     1261        // | SUSPEND ';'
     1262        //      { SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
     1263        // | SUSPEND compound_statement ';'
     1264        //      { SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
    12801265        | THROW assignment_expression_opt ';'                           // handles rethrow
    12811266                { $$ = new StatementNode( build_throw( $2 ) ); }
     
    20922077aggregate_control:                                                                              // CFA
    20932078        GENERATOR
    2094                 { yyy = true; $$ = AggregateDecl::Generator; }
     2079                { SemanticError( yylloc, "generator is currently unimplemented." ); $$ = AggregateDecl::NoAggregate; }
    20952080        | MONITOR GENERATOR
    20962081                { SemanticError( yylloc, "monitor generator is currently unimplemented." ); $$ = AggregateDecl::NoAggregate; }
  • src/SynTree/Declaration.h

    rbbdb0c6 rc4fd4ef  
    302302
    303303        bool is_coroutine() { return kind == Coroutine; }
    304         bool is_generator() { return kind == Generator; }
    305         bool is_monitor  () { return kind == Monitor  ; }
    306         bool is_thread   () { return kind == Thread   ; }
     304        bool is_monitor() { return kind == Monitor; }
     305        bool is_thread() { return kind == Thread; }
    307306
    308307        virtual StructDecl * clone() const override { return new StructDecl( *this ); }
  • src/SynTree/Mutator.h

    rbbdb0c6 rc4fd4ef  
    5151        virtual Statement * mutate( CatchStmt * catchStmt ) = 0;
    5252        virtual Statement * mutate( FinallyStmt * catchStmt ) = 0;
    53         virtual Statement * mutate( SuspendStmt * suspendStmt ) = 0;
    5453        virtual Statement * mutate( WaitForStmt * waitforStmt ) = 0;
    5554        virtual Declaration * mutate( WithStmt * withStmt ) = 0;
  • src/SynTree/Statement.cc

    rbbdb0c6 rc4fd4ef  
    420420}
    421421
    422 SuspendStmt::SuspendStmt( const SuspendStmt & other )
    423         : Statement( other )
    424         , then( maybeClone(other.then) )
    425 {}
    426 
    427 SuspendStmt::~SuspendStmt() {
    428         delete then;
    429 }
    430 
    431 void SuspendStmt::print( std::ostream & os, Indenter indent ) const {
    432         os << "Suspend Statement";
    433         switch (type) {
    434                 case None     : os << " with implicit target"; break;
    435                 case Generator: os << " for generator"       ; break;
    436                 case Coroutine: os << " for coroutine"       ; break;
    437         }
    438         os << endl;
    439         indent += 1;
    440 
    441         if(then) {
    442                 os << indent << " with post statement :" << endl;
    443                 then->print( os, indent + 1);
    444         }
    445 }
    446 
    447422WaitForStmt::WaitForStmt() : Statement() {
    448423        timeout.time      = nullptr;
  • src/SynTree/Statement.h

    rbbdb0c6 rc4fd4ef  
    422422};
    423423
    424 class SuspendStmt : public Statement {
    425   public:
    426         CompoundStmt * then = nullptr;
    427         enum Type { None, Coroutine, Generator } type = None;
    428 
    429         SuspendStmt() = default;
    430         SuspendStmt( const SuspendStmt & );
    431         virtual ~SuspendStmt();
    432 
    433         virtual SuspendStmt * clone() const override { return new SuspendStmt( *this ); }
    434         virtual void accept( Visitor & v ) override { v.visit( this ); }
    435         virtual void accept( Visitor & v ) const override { v.visit( this ); }
    436         virtual Statement * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
    437         virtual void print( std::ostream & os, Indenter indent = {} ) const override;
    438 };
    439 
    440424class WaitForStmt : public Statement {
    441425  public:
  • src/SynTree/SynTree.h

    rbbdb0c6 rc4fd4ef  
    5454class CatchStmt;
    5555class FinallyStmt;
    56 class SuspendStmt;
    5756class WaitForStmt;
    5857class WithStmt;
  • src/SynTree/Visitor.h

    rbbdb0c6 rc4fd4ef  
    7878        virtual void visit( FinallyStmt * node ) { visit( const_cast<const FinallyStmt *>(node) ); }
    7979        virtual void visit( const FinallyStmt * finallyStmt ) = 0;
    80         virtual void visit( SuspendStmt * node ) { visit( const_cast<const SuspendStmt *>(node) ); }
    81         virtual void visit( const SuspendStmt * suspendStmt ) = 0;
    8280        virtual void visit( WaitForStmt * node ) { visit( const_cast<const WaitForStmt *>(node) ); }
    8381        virtual void visit( const WaitForStmt * waitforStmt ) = 0;
  • tests/concurrent/coroutineYield.cfa

    rbbdb0c6 rc4fd4ef  
    3333                        sout | "Coroutine 2";
    3434                #endif
    35                 suspend;
     35                suspend();
    3636        }
    3737}
  • tests/coroutine/.expect/fmtLines.txt

    rbbdb0c6 rc4fd4ef  
    4848{                                                         // f  or n  ewli 
    4949ne c  hara  cter  s                                     su 
    50 spen  d;                                        i  f (   fmt. 
    51 ch !  = '\  n' )   bre  ak;      
    52         //   igno  re n  ewli  ne                
    53                 }   // f  or                            so  ut | 
    54  fmt  .ch;                                                      /  / pr 
    55 int   char  acte  r                       } // 
    56  for                    s  out   | "    ";       
    57                                                         /  / pr  int   bloc 
    58 k se  para  tor         } /  / fo 
    59 r               s  out   | nl  ;                                                         
    60                 //   pri  nt g  roup   sep 
    61 arat  or        }   //   for}   //  
    62 main  void   prt  ( Fo  rmat 
    63  & f  mt,   char   ch   ) {   
    64    f  mt.c  h =   ch;      r 
    65 esum  e( f  mt )  ;} /  / pr 
    66 tint   mai  n()   {     Fo  rmat 
    67  fmt  ; ch  ar c  h;    f  or ( 
    68  ;;   ) {               sin   | c  h;            
    69                                                                   // r  ead   one  
    70 char  acte  r       if (   eof 
    71 ( si  n )   ) br  eak;                                   
    72                         /  / eo  f ?            prt  ( fm 
    73 t, c  h );      } /  / fo  r} / 
    74 / ma  in//   Loc  al V  aria 
    75 bles  : //  // t  ab-w  idth 
    76 : 4   ////   com  pile  -com 
    77 mand  : "c  fa f  mtLi  nes. 
    78 cfa"   ///  / En  d: /  /
     50spen  d();                                      if   ( fm 
     51t.ch   !=   '\n'   ) b  reak 
     52;               /  / ig  nore   new  line 
     53                                  } //   for                              sout 
     54 | f  mt.c  h;                                                  //  
     55prin  t ch  arac  ter                   }  
     56// f  or                        sou  t |   "  " 
     57;                                                               //   prin  t bl 
     58ock   sepa  rato  r             }   //  
     59for             sou  t |   nl;                                   
     60                                  // p  rint   gro  up s 
     61epar  ator      } /  / fo  r} / 
     62/ ma  invo  id p  rt(   Form 
     63at &   fmt  , ch  ar c  h )   
     64{      fmt  .ch   = ch  ;    
     65 res  ume(   fmt   );}   //  
     66prti  nt m  ain(  ) {     Form 
     67at f  mt;         char   ch;    for 
     68 ( ;  ; )   {           s  in |   ch; 
     69                                                                                //   rea  d on 
     70e ch  arac  ter     if   ( e 
     71of(   sin   ) )   brea  k;               
     72                                        //   eof   ?            p  rt(  
     73fmt,   ch   );  }   //   for} 
     74 //   main  // L  ocal   Var 
     75iabl  es:   ////   tab  -wid 
     76th:   4 //  // c  ompi  le-c 
     77omma  nd:   "cfa   fmt  Line 
     78s.cf  a" /  ///   End:   //
  • tests/coroutine/.in/fmtLines.txt

    rbbdb0c6 rc4fd4ef  
    3535                        for ( fmt.b = 0; fmt.b < 4; fmt.b += 1 ) {      // blocks of 4 characters
    3636                                for ( ;; ) {                                                    // for newline characters
    37                                         suspend;
     37                                        suspend();
    3838                                        if ( fmt.ch != '\n' ) break;            // ignore newline
    3939                                } // for
  • tests/coroutine/cntparens.cfa

    rbbdb0c6 rc4fd4ef  
    1 //
     1// 
    22// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
    33//
    44// The contents of this file are covered under the licence agreement in the
    55// file "LICENCE" distributed with Cforall.
    6 //
     6// 
    77// cntparens.cfa -- match left/right parenthesis
    8 //
     8// 
    99// Author           : Peter A. Buhr
    1010// Created On       : Sat Apr 20 11:04:45 2019
     
    1212// Last Modified On : Sat Apr 20 11:06:21 2019
    1313// Update Count     : 1
    14 //
     14// 
    1515
    1616#include <fstream.hfa>
     
    2626void main( CntParens & cpns ) with( cpns ) {
    2727        for ( ; ch == '('; cnt += 1 ) {                                         // left parenthesis
    28                 suspend;
     28                suspend();
    2929        }
    3030        for ( ; ch == ')' && cnt > 1; cnt -= 1 ) {                      // right parenthesis
    31                 suspend;
     31                suspend();
    3232        }
    3333        status = ch == ')' ? Match : Error;
    3434} // main
    35 
     35       
    3636void ?{}( CntParens & cpns ) with( cpns ) { status = Cont; cnt = 0; }
    3737
  • tests/coroutine/devicedriver.cfa

    rbbdb0c6 rc4fd4ef  
    1 //
     1// 
    22// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
    33//
    44// The contents of this file are covered under the licence agreement in the
    55// file "LICENCE" distributed with Cforall.
    6 //
    7 // devicedriver.cfa --
    8 //
     6// 
     7// devicedriver.cfa -- 
     8// 
    99// Author           : Peter A. Buhr
    1010// Created On       : Sat Mar 16 15:30:34 2019
     
    1212// Last Modified On : Sat Apr 20 09:07:19 2019
    1313// Update Count     : 90
    14 //
     14// 
    1515
    1616#include <fstream.hfa>
     
    2929
    3030void checkCRC( Driver & d, unsigned int sum ) with( d ) {
    31         suspend;
     31        suspend();
    3232        unsigned short int crc = byte << 8;                                     // sign extension over written
    33         suspend;
     33        suspend();
    3434        // prevent sign extension for signed char
    3535        status = (crc | (unsigned char)byte) == sum ? MSG : ECRC;
     
    4141                status = CONT;
    4242                unsigned int lnth = 0, sum = 0;
    43                 while ( byte != STX ) suspend;
     43                while ( byte != STX ) suspend();
    4444          emsg: for () {
    45                         suspend;
     45                        suspend();
    4646                        choose ( byte ) {                                                       // process byte
    4747                          case STX:
    48                                 status = ESTX; suspend; continue msg;
     48                                status = ESTX; suspend(); continue msg;
    4949                          case ETX:
    5050                                break emsg;
    5151                          case ESC:
    52                                 suspend;
     52                                suspend();
    5353                        } // choose
    5454                        if ( lnth >= MaxMsg ) {                                         // buffer full ?
    55                                 status = ELNTH; suspend; continue msg;
     55                                status = ELNTH; suspend(); continue msg;
    5656                        } // if
    5757                        msg[lnth++] = byte;
     
    6060                msg[lnth] = '\0';                                                               // terminate string
    6161                checkCRC( d, sum );                                                             // refactor CRC check
    62                 suspend;
     62                suspend();
    6363        } // for
    6464} // main
  • tests/coroutine/fibonacci.cfa

    rbbdb0c6 rc4fd4ef  
    2222        int fn1, fn2;                                                                           // retained between resumes
    2323        fn = 0;  fn1 = fn;                                                                      // 1st case
    24         suspend;                                                                                        // restart last resume
     24        suspend();                                                                                      // restart last resume
    2525        fn = 1;  fn2 = fn1;  fn1 = fn;                                          // 2nd case
    26         suspend;                                                                                        // restart last resume
     26        suspend();                                                                                      // restart last resume
    2727        for () {
    2828                fn = fn1 + fn2;  fn2 = fn1;  fn1 = fn;                  // general case
    29                 suspend;                                                                                // restart last resume
     29                suspend();                                                                              // restart last resume
    3030        } // for
    3131}
  • tests/coroutine/fibonacci_1.cfa

    rbbdb0c6 rc4fd4ef  
    1212// Last Modified On : Thu Mar 21 08:10:45 2019
    1313// Update Count     : 25
    14 //
     14// 
    1515
    1616#include <fstream.hfa>
     
    2323        [fn1, fn] = [0, 1];                                                                     // precompute first two states
    2424        for () {
    25                 suspend;                                                                                // restart last resume
     25                suspend();                                                                              // restart last resume
    2626                [fn1, fn] = [fn, fn1 + fn];                                             // general case
    2727        } // for
  • tests/coroutine/fmtLines.cfa

    rbbdb0c6 rc4fd4ef  
    2727                        for ( b = 0; b < 4; b += 1 ) {                          // blocks of 4 characters
    2828                                for () {                                                                // for newline characters
    29                                         suspend;
     29                                        suspend();
    3030                                  if ( ch != '\n' ) break;                              // ignore newline
    3131                                } // for
  • tests/coroutine/raii.cfa

    rbbdb0c6 rc4fd4ef  
    3939        Raii raii = { "Coroutine" };
    4040        sout | "Before Suspend";
    41         suspend;
     41        suspend();
    4242        sout | "After Suspend";
    4343}
  • tests/coroutine/runningTotal.cfa

    rbbdb0c6 rc4fd4ef  
    2525void update( RunTotal & rntl, int input ) with( rntl ) { // helper
    2626        total += input;                                                                         // remember between activations
    27         suspend;                                                                                        // inactivate on stack
     27        suspend();                                                                                      // inactivate on stack
    2828}
    2929
  • tests/coroutine/suspend_then.cfa

    rbbdb0c6 rc4fd4ef  
    1515
    1616#include <fstream.hfa>
     17#include <coroutine.hfa>
    1718
    18 generator Fibonacci {
    19         int fn;                                                                         // used for communication
    20         int fn1, fn2;                                                           // retained between resumes
    21 };
     19void then() {
     20        sout | "Then!";
     21}
     22
     23coroutine Fibonacci { int fn; };                                                // used for communication
    2224
    2325void main( Fibonacci & fib ) with( fib ) {                              // called on first resume
     26        int fn1, fn2;                                                           // retained between resumes
    2427        fn = 0;  fn1 = fn;                                                      // 1st case
    25         suspend { sout | "Then!"; }                                             // restart last resume
     28        suspend_then(then);                                                     // restart last resume
    2629        fn = 1;  fn2 = fn1;  fn1 = fn;                                  // 2nd case
    27         suspend { sout | "Then!"; }                                             // restart last resume
     30        suspend_then(then);                                                     // restart last resume
    2831        for () {
    2932                fn = fn1 + fn2;  fn2 = fn1;  fn1 = fn;                  // general case
    30                 suspend { sout | "Then!"; }                                     // restart last resume
     33                suspend_then(then);                                             // restart last resume
    3134        } // for
    3235}
  • tests/errors/.expect/completeType.txt

    rbbdb0c6 rc4fd4ef  
    2727    void
    2828  )
    29   Environment:( _85_4_DT ) -> instance of struct A with body 0 (no widening)
     29  Environment:( _83_4_DT ) -> instance of struct A with body 0 (no widening)
    3030
    3131
     
    5050    void
    5151  )
    52   Environment:( _85_4_DT ) -> instance of struct B with body 1 (no widening)
     52  Environment:( _83_4_DT ) -> instance of struct B with body 1 (no widening)
    5353
    5454
     
    127127          void
    128128        )
    129         Environment:( _104_0_T ) -> instance of type T (not function type) (no widening)
     129        Environment:( _102_0_T ) -> instance of type T (not function type) (no widening)
    130130
    131131      Could not satisfy assertion:
    132132?=?: pointer to function
    133133        ... with parameters
    134           reference to instance of type _104_0_T (not function type)
    135           instance of type _104_0_T (not function type)
     134          reference to instance of type _102_0_T (not function type)
     135          instance of type _102_0_T (not function type)
    136136        ... returning
    137           _retval__operator_assign: instance of type _104_0_T (not function type)
     137          _retval__operator_assign: instance of type _102_0_T (not function type)
    138138          ... with attributes:
    139139            Attribute with name: unused
Note: See TracChangeset for help on using the changeset viewer.