Changes in / [c4fd4ef:bbdb0c6]


Ignore:
Files:
21 added
1 deleted
54 edited

Legend:

Unmodified
Added
Removed
  • Jenkinsfile

    rc4fd4ef rbbdb0c6  
    126126                        }
    127127
    128                         sh "${SrcDir}/configure CXX=${Settings.Compiler.CXX} CC=${Settings.Compiler.CC} ${Settings.Architecture.flags} ${targets} --quiet"
     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}"
    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"
    157164                }
    158165        }
     
    179186                echo "Archiving core dumps"
    180187                dir (BuildDir) {
    181                         archiveArtifacts artifacts: "tests/crashes/**/*", fingerprint: true
     188                        archiveArtifacts artifacts: "tests/crashes/**/*,lib/**/lib*.so*", fingerprint: true
    182189                }
    183190                throw err
     
    325332        public String CXX
    326333        public String CC
    327 
    328         CC_Desc(String name, String CXX, String CC) {
     334        public String lto
     335
     336        CC_Desc(String name, String CXX, String CC, String lto) {
    329337                this.name = name
    330338                this.CXX = CXX
    331                 this.CC = CC
     339                this.CC  = CC
     340                this.lto = lto
    332341        }
    333342}
     
    364373                switch( param.Compiler ) {
    365374                        case 'gcc-9':
    366                                 this.Compiler = new CC_Desc('gcc-9', 'g++-9', 'gcc-9')
     375                                this.Compiler = new CC_Desc('gcc-9', 'g++-9', 'gcc-9', '-flto=auto')
    367376                        break
    368377                        case 'gcc-8':
    369                                 this.Compiler = new CC_Desc('gcc-8', 'g++-8', 'gcc-8')
     378                                this.Compiler = new CC_Desc('gcc-8', 'g++-8', 'gcc-8', '-flto=auto')
    370379                        break
    371380                        case 'gcc-7':
    372                                 this.Compiler = new CC_Desc('gcc-7', 'g++-7', 'gcc-7')
     381                                this.Compiler = new CC_Desc('gcc-7', 'g++-7', 'gcc-7', '-flto=auto')
    373382                        break
    374383                        case 'gcc-6':
    375                                 this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6')
     384                                this.Compiler = new CC_Desc('gcc-6', 'g++-6', 'gcc-6', '-flto=auto')
    376385                        break
    377386                        case 'gcc-5':
    378                                 this.Compiler = new CC_Desc('gcc-5', 'g++-5', 'gcc-5')
     387                                this.Compiler = new CC_Desc('gcc-5', 'g++-5', 'gcc-5', '-flto=auto')
    379388                        break
    380389                        case 'gcc-4.9':
    381                                 this.Compiler = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9')
     390                                this.Compiler = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9', '-flto=auto')
    382391                        break
    383392                        case 'clang':
    384                                 this.Compiler = new CC_Desc('clang', 'clang++-6.0', 'gcc-6')
     393                                this.Compiler = new CC_Desc('clang', 'clang++-6.0', 'gcc-6', '-flto=thin -flto-jobs=0')
    385394                        break
    386395                        default :
     
    439448        // prepare the properties
    440449        properties ([                                                                                                   \
     450                buildDiscarder(logRotator(                                                                              \
     451                        artifactDaysToKeepStr: '',                                                                      \
     452                        artifactNumToKeepStr: '',                                                                       \
     453                        daysToKeepStr: '730',                                                                           \
     454                        numToKeepStr: '1000'                                                                            \
     455                )),                                                                                                             \
    441456                [$class: 'ParametersDefinitionProperty',                                                                \
    442457                        parameterDefinitions: [                                                                         \
  • benchmark/Makefile.am

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

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

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

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

    rc4fd4ef rbbdb0c6  
    11#include "../bench.h"
    22
    3 typedef struct {
    4         void * next;
    5 } C;
    6 
    7 void comain( C * c ) {
    8         if ( __builtin_expect(c->next != 0, 1) ) goto *(c->next);
    9         c->next = &&s1;
     3generator G {};
     4void main( G & ) {
    105        for () {
    11                 return;
    12           s1: ;
     6                suspend;
    137        }
    148}
    159
    1610int main( int argc, char * argv[] ) {
     11        G g;
    1712        BENCH_START()
    18         C c = { 0 };
    1913        BENCH(
    2014                for ( times ) {
    21                         comain( &c );
     15                        resume( g );
    2216                },
    2317                result
  • configure

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

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

    rc4fd4ef rbbdb0c6  
    248248}
    249249
    250 \newbox\myboxA
    251 \newbox\myboxB
    252 \newbox\myboxC
    253 \newbox\myboxD
     250\newsavebox{\myboxA}
     251\newsavebox{\myboxB}
     252\newsavebox{\myboxC}
     253\newsavebox{\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 {} c;
    2970 void main( C & ) { while () { @suspend;@ } }
     2969@coroutine@ C {};
     2970void main( C & ) { for () { @suspend;@ } }
    29712971int main() { // coroutine test
     2972        C c;
    29722973        BENCH( for ( N ) { @resume( c );@ } )
    29732974        sout | result;
     
    29892990\multicolumn{1}{@{}c}{} & \multicolumn{1}{c}{Median} &\multicolumn{1}{c}{Average} & \multicolumn{1}{c@{}}{Std Dev} \\
    29902991C function                      & 1.8           & 1.8           & 0.0   \\
    2991 \CFA generator          & 1.8           & 1.8           & 0.1   \\
     2992\CFA generator          & 1.8           & 2.0           & 0.3   \\
    29922993\CFA coroutine          & 32.5          & 32.9          & 0.8   \\
    29932994\CFA thread                     & 93.8          & 93.6          & 2.2   \\
  • doc/theses/andrew_beach_MMath/Makefile

    rc4fd4ef rbbdb0c6  
    55TEXSRC=$(wildcard *.tex)
    66BIBSRC=$(wildcard *.bib)
     7STYSRC=$(wildcard *.sty)
     8CLSSRC=$(wildcard *.cls)
    79TEXLIB= .:${BUILD}:
    810BIBLIB= .:../../bibliography
     
    2426all: ${DOC}
    2527
    26 ${BUILD}/${DOC}: ${TEXSRC} ${BIBSRC} Makefile | ${BUILD}
     28${BUILD}/${DOC}: ${TEXSRC} ${BIBSRC} ${STYSRC} ${CLSSRC} Makefile | ${BUILD}
    2729        ${LATEX} ${BASE}
    2830        ${BIBTEX} ${BUILD}/${BASE}
  • doc/theses/andrew_beach_MMath/thesis.tex

    rc4fd4ef rbbdb0c6  
    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.
     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{
     40language=CFA,
     41columns=fullflexible,
     42basicstyle=\linespread{0.9}\tt,                 % reduce line spacing and use sanserif font
     43stringstyle=\tt,                                % use typewriter font
     44tabsize=5,                                      % N space tabbing
     45xleftmargin=\parindentlnth,                     % indent code to paragraph indentation
     46%mathescape=true,                               % LaTeX math escape in CFA code $...$
     47escapechar=\$,                                  % LaTeX escape in CFA code
     48keepspaces=true,
     49showstringspaces=false,                         % do not show spaces with cup
     50showlines=true,                                 % show blank lines at end of code
     51aboveskip=4pt,                                  % spacing above/below code block
     52belowskip=3pt,
     53moredelim=**[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}
    8365
    8466% For a nomenclature (optional; available from ctan.org)
     
    8668% Lots of math symbols and environments
    8769\usepackage{amsmath,amssymb,amstext}
    88 % For including graphics N.B. pdftex graphics driver
     70% For including graphics, sets the pdftex graphics driver.
    8971\usepackage[pdftex]{graphicx}
    9072
    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
    120 }
    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...)
     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},
     80}
     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
    18189% Main glossary entries -- definitions of relevant terminology
    18290\newglossaryentry{computer}
     
    194102type=nomenclature,
    195103name=dingledorf,
    196 description={A person of supposed average intelligence who makes incredibly brainless misjudgments}
     104description={A person of supposed average intelligence who makes incredibly
     105               brainless misjudgments}
    197106}
    198107
    199108% List of Abbreviations (abbreviations are from the glossaries-extra package)
    200 \newabbreviation{aaaaz}{AAAAZ}{American Association of Amature Astronomers and Zoologists}
     109\newabbreviation{aaaaz}{AAAAZ}{American Association of Amature Astronomers
     110               and Zoologists}
    201111
    202112% List of Symbols
     
    207117sort={label},
    208118type=symbols,
    209 description={Random vector: a location in n-dimensional Cartesian space, where each dimensional component is determined by a random process}
    210 }
    211  
     119description={Random vector: a location in n-dimensional Cartesian space, where
     120               each dimensional component is determined by a random process}
     121}
     122
     123% Must be here of cause problems with glossaries-extra.
     124\lstMakeShortInline$%
     125
     126% Generate the glossaries defined above.
    212127\makeglossaries
    213128
    214 %======================================================================
    215 %   L O G I C A L    D O C U M E N T -- the content of your thesis
    216 %======================================================================
    217129\begin{document}
    218130
    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.
    226131%----------------------------------------------------------------------
    227132% FRONT MATERIAL
     
    232137% MAIN BODY
    233138%----------------------------------------------------------------------
    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.
     139\input{unwinding}
     140
    239141%======================================================================
    240142\chapter{Introduction}
     
    327229%----------------------------------------------------------------------
    328230
    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.
     231%----------------------------------------------------------------------
     232% BIBLIOGRAPHY
     233%----------------------------------------------------------------------
     234
    341235% Use \clearpage instead if the document class uses the "oneside" argument.
    342236\cleardoublepage
    343 % With hyperref package, enables hyperlinking from the table of contents to
    344 % bibliography
    345237\phantomsection
    346238
    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).
     239% Bibliography setup and creation, renamed to References.
     240\addcontentsline{toc}{chapter}{\textbf{\bibname}}
     241\bibliographystyle{plain}
    356242\bibliography{thesis}
    357243
    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).
     244% Include all uncited entries in the bibliography.
    362245\nocite{*}
    363246
    364 % The \appendix statement indicates the beginning of the appendices.
     247% Begin the appendix, add a title and table of contents entry.
    365248\appendix
    366 % Add a title page before the appendices and a line in the Table of Contents
    367249\chapter*{APPENDICES}
    368250\addcontentsline{toc}{chapter}{APPENDICES}
  • doc/theses/thierry_delisle_PhD/comp_II/comp_II.tex

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

    rc4fd4ef rbbdb0c6  
    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
     51forall(dtype T)
     52static inline T & identity(T & i) {
     53        return i;
     54}
     55
     56// generator support
     57struct $generator {
     58        inline int;
     59};
     60
     61static inline void  ?{}($generator & this) { ((int&)this) = 0; }
     62static inline void ^?{}($generator &) {}
     63
     64trait is_generator(dtype T) {
     65      void main(T & this);
     66      $generator * get_generator(T & this);
     67};
     68
     69forall(dtype T | is_generator(T))
     70static inline T & resume(T & gen) {
     71        main(gen);
     72        return gen;
     73}
    5074
    5175// implicit increment, decrement if += defined, and implicit not if != defined
  • libcfa/src/Makefile.am

    rc4fd4ef rbbdb0c6  
    1111## Created On       : Sun May 31 08:54:01 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Mon Jul 15 22:43:27 2019
    14 ## Update Count     : 241
     13## Last Modified On : Mon Mar 16 18:07:59 2020
     14## Update Count     : 242
    1515###############################################################################
    1616
     
    3939#----------------------------------------------------------------------------------------------------------------
    4040if BUILDLIB
    41 headers_nosrc = math.hfa gmp.hfa time_t.hfa bits/align.hfa bits/containers.hfa bits/defs.hfa bits/debug.hfa bits/locks.hfa
     41headers_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
    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

    rc4fd4ef rbbdb0c6  
    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 math.hfa gmp.hfa time_t.hfa \
     239        containers/vector.hfa bitmanip.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 =
     434AM_V_PY = $(am__v_PY_@AM_V@)
     435am__v_PY_ = $(am__v_PY_@AM_DEFAULT_V@)
     436am__v_PY_0 = @echo "  PYTHON  " $@;
     437am__v_PY_1 =
    434438AM_V_RUST = $(am__v_RUST_@AM_V@)
    435439am__v_RUST_ = $(am__v_RUST_@AM_DEFAULT_V@)
    436 am__v_RUST_0 = @echo "  RUST     " $@;
     440am__v_RUST_0 = @echo "  RUST    " $@;
    437441am__v_RUST_1 =
    438442AM_V_NODEJS = $(am__v_NODEJS_@AM_V@)
    439443am__v_NODEJS_ = $(am__v_NODEJS_@AM_DEFAULT_V@)
    440 am__v_NODEJS_0 = @echo "  NODEJS     " $@;
     444am__v_NODEJS_0 = @echo "  NODEJS  " $@;
    441445am__v_NODEJS_1 =
    442446AM_V_JAVAC = $(am__v_JAVAC_@AM_V@)
     
    457461
    458462#----------------------------------------------------------------------------------------------------------------
    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
     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
    460464@BUILDLIB_FALSE@headers =
    461465@BUILDLIB_TRUE@headers = fstream.hfa iostream.hfa iterator.hfa limits.hfa rational.hfa time.hfa stdlib.hfa common.hfa \
  • libcfa/src/concurrency/coroutine.cfa

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

    rc4fd4ef rbbdb0c6  
    4646//-----------------------------------------------------------------------------
    4747// Public coroutine API
    48 static inline void suspend(void);
    49 
    50 forall(dtype T | is_coroutine(T))
    51 static inline T & resume(T & cor);
    52 
    5348forall(dtype T | is_coroutine(T))
    5449void prime(T & cor);
     
    9691
    9792// Suspend implementation inlined for performance
    98 static 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;
     93extern "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;
    105101
    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 );
     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 );
    114110
    115         $ctx_switch( src, src->last );
     111                $ctx_switch( src, src->last );
     112        }
    116113}
    117114
  • libcfa/src/exception.c

    rc4fd4ef rbbdb0c6  
    252252}
    253253
    254 #pragma GCC push_options
    255 #pragma GCC optimize("O0")
    256 
    257254// This is our personality routine. For every stack frame annotated with
    258255// ".cfi_personality 0x3,__gcfa_personality_v0" this function will be called twice when unwinding.
     
    413410        return _URC_CONTINUE_UNWIND;
    414411}
     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

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

    rc4fd4ef rbbdb0c6  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar  5 15:56:16 2020
    13 // Update Count     : 834
     12// Last Modified On : Wed Mar 11 14:35:35 2020
     13// Update Count     : 860
    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) 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 );   \
     536static 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 ); */ \
    542544                sepOff( os ); \
    543                 (ostype &)(os | fmt2); \
     545                (ostype &)(os | fmt); \
    544546        } else { \
    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); \
     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); \
    548550        } /* if */ \
    549 } /* base10_128 */                                                \
     551} /* base10_128 */ \
    550552forall( dtype ostype | ostream( ostype ) ) { \
    551553        ostype & ?|?( ostype & os, _Ostream_Manip(T) f ) { \
     
    564566                                if ( f.base == 'b' | f.base == 'B' ) { \
    565567                                        if ( f.wd > 64 ) fmt.wd = f.wd - 64; \
     568                                        if ( f.flags.pc && f.pc > 64 ) fmt.pc = f.pc - 64; \
    566569                                        fmt2.wd = 64; \
    567570                                        (ostype &)(os | fmt | "" | fmt2); \
     
    569572                                        fmt.val = (unsigned long long int)fmt.val >> 2; \
    570573                                        if ( f.wd > 21 ) fmt.wd = f.wd - 21; \
     574                                        if ( f.flags.pc && f.pc > 21 ) fmt.pc = f.pc - 21; \
    571575                                        fmt2.wd = 1; \
    572576                                        fmt2.val = ((msig & 0x3) << 1) + 1; \
     
    578582                                } else { \
    579583                                        if ( f.flags.left ) { \
    580                                                 if ( f.wd > 16 ) fmt2.wd = f.wd - 16;   \
    581                                                 fmt.wd = 16;                                                    \
     584                                                if ( f.wd > 16 ) fmt2.wd = f.wd - 16; \
     585                                                fmt.wd = 16; \
    582586                                        } else { \
    583                                                 if ( f.wd > 16 ) fmt.wd = f.wd - 16;    \
    584                                                 fmt2.wd = 16;                                                   \
     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; \
    585590                                        } /* if */ \
    586591                                        (ostype &)(os | fmt | "" | fmt2); \
     
    588593                        } /* if */ \
    589594                } else { \
     595                        if ( CODE == 'd' ) { \
     596                                if ( f.val < 0 )  { fmt( os, "-" ); sepOff( os ); f.val = -f.val; f.flags.sign = false; } \
     597                        } /* if */ \
    590598                        base10_128( os, f ); \
    591599                } /* if */ \
  • src/AST/Convert.cpp

    rc4fd4ef rbbdb0c6  
    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
    495507        const ast::Stmt * visit( const ast::WaitForStmt * node ) override final {
    496508                if ( inCache( node ) ) return nullptr;
     
    18591871        }
    18601872
     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
    18611891        virtual void visit( const WaitForStmt * old ) override final {
    18621892                if ( inCache( old ) ) return;
  • src/AST/Decl.hpp

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

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

    rc4fd4ef rbbdb0c6  
    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;
    113114        const ast::Stmt *             visit( const ast::WaitForStmt          * ) override final;
    114115        const ast::Decl *             visit( const ast::WithStmt             * ) override final;
  • src/AST/Pass.impl.hpp

    rc4fd4ef rbbdb0c6  
    823823
    824824//--------------------------------------------------------------------------
     825// FinallyStmt
     826template< typename pass_t >
     827const 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//--------------------------------------------------------------------------
    825838// WaitForStmt
    826839template< typename pass_t >
  • src/AST/Print.cpp

    rc4fd4ef rbbdb0c6  
    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;
    676695
    677696                return node;
  • src/AST/Stmt.hpp

    rc4fd4ef rbbdb0c6  
    342342};
    343343
     344/// Suspend statement
     345class SuspendStmt final : public Stmt {
     346public:
     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 ); }
     354private:
     355        SuspendStmt * clone() const override { return new SuspendStmt{ *this }; }
     356        MUTATE_FRIEND
     357};
     358
    344359/// Wait for concurrency statement `when (...) waitfor (... , ...) ... timeout(...) ... else ...`
    345360class WaitForStmt final : public Stmt {
  • src/AST/Visitor.hpp

    rc4fd4ef rbbdb0c6  
    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;
    4950    virtual const ast::Stmt *             visit( const ast::WaitForStmt          * ) = 0;
    5051    virtual const ast::Decl *             visit( const ast::WithStmt             * ) = 0;
  • src/Common/PassVisitor.h

    rc4fd4ef rbbdb0c6  
    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;
    112114        virtual void visit( WaitForStmt * waitforStmt ) override final;
    113115        virtual void visit( const WaitForStmt * waitforStmt ) override final;
     
    276278        virtual Statement * mutate( CatchStmt * catchStmt ) override final;
    277279        virtual Statement * mutate( FinallyStmt * finallyStmt ) override final;
     280        virtual Statement * mutate( SuspendStmt * suspendStmt ) override final;
    278281        virtual Statement * mutate( WaitForStmt * waitforStmt ) override final;
    279282        virtual Declaration * mutate( WithStmt * withStmt ) override final;
  • src/Common/PassVisitor.impl.h

    rc4fd4ef rbbdb0c6  
    15221522
    15231523//--------------------------------------------------------------------------
     1524// SuspendStmt
     1525template< typename pass_type >
     1526void PassVisitor< pass_type >::visit( SuspendStmt * node ) {
     1527        VISIT_START( node );
     1528
     1529        maybeAccept_impl( node->then  , *this );
     1530
     1531        VISIT_END( node );
     1532}
     1533
     1534template< typename pass_type >
     1535void 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
     1543template< typename pass_type >
     1544Statement * 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//--------------------------------------------------------------------------
    15241553// WaitForStmt
    15251554template< typename pass_type >
  • src/Concurrency/Keywords.cc

    rc4fd4ef rbbdb0c6  
    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 "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
     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
    3536
    3637class Attribute;
     
    147148        };
    148149
     150
     151
    149152        //-----------------------------------------------------------------------------
    150153        //Handles monitor type declarations :
     
    180183
    181184        //-----------------------------------------------------------------------------
     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        //-----------------------------------------------------------------------------
    182256        //Handles mutex routines definitions :
    183257        // void foo( A * mutex a, B * mutex b,  int i ) {                  void foo( A * a, B * b,  int i ) {
     
    251325                CoroutineKeyword        ::implement( translationUnit );
    252326                MonitorKeyword  ::implement( translationUnit );
     327                GeneratorKeyword  ::implement( translationUnit );
     328                SuspendKeyword    ::implement( translationUnit );
    253329        }
    254330
     
    446522
    447523                declsToAddAfter.push_back( get_decl );
    448 
    449                 // get_decl->fixUniqueId();
    450         }
     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
    451756
    452757        //=============================================================================================
  • src/Parser/ParseNode.h

    rc4fd4ef rbbdb0c6  
    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 );
     430SuspendStmt * build_suspend( StatementNode *, SuspendStmt::Type = SuspendStmt::None);
    430431WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when );
    431432WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when, WaitForStmt * existing );
  • src/Parser/StatementNode.cc

    rc4fd4ef rbbdb0c6  
    249249} // build_finally
    250250
     251SuspendStmt * 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
    251266WaitForStmt * build_waitfor( ExpressionNode * targetExpr, StatementNode * stmt, ExpressionNode * when ) {
    252267        auto node = new WaitForStmt();
  • src/Parser/TypeData.cc

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

    rc4fd4ef rbbdb0c6  
    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 */
     303suspend                 { KEYWORD_RETURN(SUSPEND); }                    // CFA
    304304switch                  { KEYWORD_RETURN(SWITCH); }
    305305thread                  { KEYWORD_RETURN(THREAD); }                             // C11
  • src/Parser/parser.yy

    rc4fd4ef rbbdb0c6  
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Feb 26 14:27:39 2020
    13 // Update Count     : 4472
     12// Last Modified On : Fri Mar  6 17:26:45 2020
     13// Update Count     : 4474
    1414//
    1515
     
    278278%token OTYPE FTYPE DTYPE TTYPE TRAIT                                    // CFA
    279279%token SIZEOF OFFSETOF
    280 // %token SUSPEND RESUME                                                                        // CFA
     280// %token RESUME                                                                        // CFA
     281%token SUSPEND                                                                  // CFA
    281282%token ATTRIBUTE EXTENSION                                                              // GCC
    282283%token IF ELSE SWITCH CASE DEFAULT DO WHILE FOR BREAK CONTINUE GOTO RETURN
     
    918919        conditional_expression
    919920        | unary_expression assignment_operator assignment_expression
    920                 { $$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) ); }
     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                }
    921928        | unary_expression '=' '{' initializer_list_opt comma_opt '}'
    922929                { SemanticError( yylloc, "Initializer assignment is currently unimplemented." ); $$ = nullptr; }
     
    12591266        | RETURN '{' initializer_list_opt comma_opt '}' ';'
    12601267                { SemanticError( yylloc, "Initializer return is currently unimplemented." ); $$ = nullptr; }
    1261         // | SUSPEND ';'
    1262         //      { SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
    1263         // | SUSPEND compound_statement ';'
    1264         //      { SemanticError( yylloc, "Suspend expression 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 ) ); }
    12651280        | THROW assignment_expression_opt ';'                           // handles rethrow
    12661281                { $$ = new StatementNode( build_throw( $2 ) ); }
     
    20772092aggregate_control:                                                                              // CFA
    20782093        GENERATOR
    2079                 { SemanticError( yylloc, "generator is currently unimplemented." ); $$ = AggregateDecl::NoAggregate; }
     2094                { yyy = true; $$ = AggregateDecl::Generator; }
    20802095        | MONITOR GENERATOR
    20812096                { SemanticError( yylloc, "monitor generator is currently unimplemented." ); $$ = AggregateDecl::NoAggregate; }
  • src/SynTree/Declaration.h

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

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

    rc4fd4ef rbbdb0c6  
    420420}
    421421
     422SuspendStmt::SuspendStmt( const SuspendStmt & other )
     423        : Statement( other )
     424        , then( maybeClone(other.then) )
     425{}
     426
     427SuspendStmt::~SuspendStmt() {
     428        delete then;
     429}
     430
     431void 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
    422447WaitForStmt::WaitForStmt() : Statement() {
    423448        timeout.time      = nullptr;
  • src/SynTree/Statement.h

    rc4fd4ef rbbdb0c6  
    422422};
    423423
     424class 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
    424440class WaitForStmt : public Statement {
    425441  public:
  • src/SynTree/SynTree.h

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

    rc4fd4ef rbbdb0c6  
    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;
    8082        virtual void visit( WaitForStmt * node ) { visit( const_cast<const WaitForStmt *>(node) ); }
    8183        virtual void visit( const WaitForStmt * waitforStmt ) = 0;
  • tests/concurrent/coroutineYield.cfa

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

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

    rc4fd4ef rbbdb0c6  
    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

    rc4fd4ef rbbdb0c6  
    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

    rc4fd4ef rbbdb0c6  
    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

    rc4fd4ef rbbdb0c6  
    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

    rc4fd4ef rbbdb0c6  
    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

    rc4fd4ef rbbdb0c6  
    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

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

    rc4fd4ef rbbdb0c6  
    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

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

    rc4fd4ef rbbdb0c6  
    2727    void
    2828  )
    29   Environment:( _83_4_DT ) -> instance of struct A with body 0 (no widening)
     29  Environment:( _85_4_DT ) -> instance of struct A with body 0 (no widening)
    3030
    3131
     
    5050    void
    5151  )
    52   Environment:( _83_4_DT ) -> instance of struct B with body 1 (no widening)
     52  Environment:( _85_4_DT ) -> instance of struct B with body 1 (no widening)
    5353
    5454
     
    127127          void
    128128        )
    129         Environment:( _102_0_T ) -> instance of type T (not function type) (no widening)
     129        Environment:( _104_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 _102_0_T (not function type)
    135           instance of type _102_0_T (not function type)
     134          reference to instance of type _104_0_T (not function type)
     135          instance of type _104_0_T (not function type)
    136136        ... returning
    137           _retval__operator_assign: instance of type _102_0_T (not function type)
     137          _retval__operator_assign: instance of type _104_0_T (not function type)
    138138          ... with attributes:
    139139            Attribute with name: unused
Note: See TracChangeset for help on using the changeset viewer.