Changes in / [779a4a3:f465f0e]
- Files:
-
- 2 deleted
- 48 edited
-
doc/papers/concurrency/Makefile (modified) (1 diff)
-
doc/papers/general/Makefile (modified) (1 diff)
-
doc/papers/general/Paper.tex (modified) (24 diffs)
-
doc/papers/general/evaluation/c-stack.c (modified) (2 diffs)
-
doc/papers/general/evaluation/c-stack.h (modified) (1 diff)
-
doc/papers/general/evaluation/cfa-stack.c (modified) (3 diffs)
-
doc/papers/general/evaluation/cfa-stack.h (modified) (1 diff)
-
doc/papers/general/evaluation/cpp-stack.hpp (modified) (3 diffs)
-
doc/papers/general/evaluation/cpp-vstack.cpp (modified) (3 diffs)
-
doc/papers/general/evaluation/cpp-vstack.hpp (modified) (1 diff)
-
doc/papers/general/evaluation/timing.dat (modified) (1 diff)
-
doc/papers/general/evaluation/timing.gp (modified) (1 diff)
-
doc/papers/general/evaluation/timing.xlsx (modified) ( previous)
-
doc/refrat/Makefile (modified) (4 diffs)
-
doc/user/Makefile (modified) (3 diffs)
-
src/CodeGen/CodeGenerator.cc (modified) (1 diff)
-
src/CodeGen/CodeGenerator.h (modified) (1 diff)
-
src/Common/Heap.cc (deleted)
-
src/Common/Heap.h (deleted)
-
src/Common/PassVisitor.h (modified) (2 diffs)
-
src/Common/PassVisitor.impl.h (modified) (1 diff)
-
src/Common/SemanticError.cc (modified) (2 diffs)
-
src/Common/SemanticError.h (modified) (4 diffs)
-
src/Common/module.mk (modified) (2 diffs)
-
src/Common/utility.h (modified) (2 diffs)
-
src/Makefile.in (modified) (5 diffs)
-
src/Parser/ParseNode.h (modified) (2 diffs)
-
src/Parser/StatementNode.cc (modified) (3 diffs)
-
src/Parser/lex.ll (modified) (2 diffs)
-
src/Parser/parser.yy (modified) (5 diffs)
-
src/ResolvExpr/AlternativeFinder.cc (modified) (1 diff)
-
src/ResolvExpr/AlternativeFinder.h (modified) (1 diff)
-
src/ResolvExpr/Resolver.cc (modified) (2 diffs)
-
src/SynTree/Mutator.h (modified) (1 diff)
-
src/SynTree/Statement.cc (modified) (1 diff)
-
src/SynTree/Statement.h (modified) (1 diff)
-
src/SynTree/SynTree.h (modified) (1 diff)
-
src/SynTree/Visitor.h (modified) (1 diff)
-
src/benchmark/bench.h (modified) (2 diffs)
-
src/benchmark/ctxswitch/cfa_cor.c (modified) (1 diff)
-
src/driver/Makefile.am (modified) (1 diff)
-
src/driver/Makefile.in (modified) (1 diff)
-
src/driver/cfa.cc (modified) (5 diffs)
-
src/libcfa/concurrency/preemption.c (modified) (1 diff)
-
src/libcfa/concurrency/thread (modified) (1 diff)
-
src/libcfa/interpose.c (modified) (4 diffs)
-
src/main.cc (modified) (10 diffs)
-
src/tests/concurrent/examples/boundedBufferEXT.c (modified) (2 diffs)
-
src/tests/concurrent/examples/boundedBufferINT.c (modified) (2 diffs)
-
src/tests/concurrent/preempt.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
doc/papers/concurrency/Makefile
r779a4a3 rf465f0e 75 75 mkdir -p ${Build} 76 76 77 ${BASE}.out.ps: ${Build}78 ln -fs ${Build}/Paper.out.ps .77 ${BASE}.out.ps: 78 ln -fs build/Paper.out.ps . 79 79 80 80 WileyNJD-AMA.bst: 81 81 ln -fs ../AMA/AMA-stix/ama/WileyNJD-AMA.bst . 82 82 83 %.tex : %.fig ${Build}83 %.tex : %.fig 84 84 fig2dev -L eepic $< > ${Build}/$@ 85 85 86 %.ps : %.fig ${Build}86 %.ps : %.fig 87 87 fig2dev -L ps $< > ${Build}/$@ 88 88 89 %.pstex : %.fig ${Build}89 %.pstex : %.fig 90 90 fig2dev -L pstex $< > ${Build}/$@ 91 91 fig2dev -L pstex_t -p ${Build}/$@ $< > ${Build}/$@_t -
doc/papers/general/Makefile
r779a4a3 rf465f0e 69 69 mkdir -p ${Build} 70 70 71 ${BASE}.out.ps: ${Build}72 ln -fs ${Build}/Paper.out.ps .71 ${BASE}.out.ps: 72 ln -fs build/Paper.out.ps . 73 73 74 74 WileyNJD-AMA.bst: 75 75 ln -fs ../AMA/AMA-stix/ama/WileyNJD-AMA.bst . 76 76 77 ${GRAPHS} : ${Build}timing.gp timing.dat77 ${GRAPHS} : timing.gp timing.dat 78 78 gnuplot -e Build="'${Build}/'" evaluation/timing.gp 79 79 80 %.tex : %.fig ${Build}80 %.tex : %.fig 81 81 fig2dev -L eepic $< > ${Build}/$@ 82 82 83 %.ps : %.fig ${Build}83 %.ps : %.fig 84 84 fig2dev -L ps $< > ${Build}/$@ 85 85 86 %.pstex : %.fig ${Build}86 %.pstex : %.fig 87 87 fig2dev -L pstex $< > ${Build}/$@ 88 88 fig2dev -L pstex_t -p ${Build}/$@ $< > ${Build}/$@_t -
doc/papers/general/Paper.tex
r779a4a3 rf465f0e 228 228 Nevertheless, C, first standardized over thirty years ago, lacks many features that make programming in more modern languages safer and more productive. 229 229 230 \CFA (pronounced ``C-for-all'', and written \CFA or Cforall) is an evolutionary extension of the C programming language that a dds modern language-features to C, while maintaining both source and runtime compatibility with C and a familiar programming model for programmers.230 \CFA (pronounced ``C-for-all'', and written \CFA or Cforall) is an evolutionary extension of the C programming language that aims to add modern language features to C, while maintaining both source and runtime compatibility with C and a familiar programming model for programmers. 231 231 The four key design goals for \CFA~\cite{Bilson03} are: 232 232 (1) The behaviour of standard C code must remain the same when translated by a \CFA compiler as when translated by a C compiler; … … 237 237 \CC is used similarly, but has the disadvantages of multiple legacy design-choices that cannot be updated and active divergence of the language model from C, requiring significant effort and training to incrementally add \CC to a C-based project. 238 238 239 All languages features discussed in this paper are working, except some advanced exception-handling features.240 Not discussed in this paper are the integrated concurrency-constructs and user-level threading-library~\cite{Delisle18}.241 239 \CFA is an \emph{open-source} project implemented as an source-to-source translator from \CFA to the gcc-dialect of C~\cite{GCCExtensions}, allowing it to leverage the portability and code optimizations provided by gcc, meeting goals (1)--(3). 242 240 Ultimately, a compiler is necessary for advanced features and optimal performance. 243 % @plg2[9]% cd cfa-cc/src; cloc ArgTweak CodeGen CodeTools Common Concurrency ControlStruct Designators GenPoly InitTweak MakeLibCfa.cc MakeLibCfa.h Parser ResolvExpr SymTab SynTree Tuples driver prelude main.cc 244 % ------------------------------------------------------------------------------- 245 % Language files blank comment code 246 % ------------------------------------------------------------------------------- 247 % C++ 108 5420 5232 34961 248 % C/C++ Header 86 2379 2450 8464 249 % Teamcenter def 2 115 65 1387 250 % make 5 168 87 1052 251 % C 20 109 403 488 252 % awk 1 12 26 121 253 % sed 1 0 0 6 254 % ------------------------------------------------------------------------------- 255 % SUM: 223 8203 8263 46479 256 % ------------------------------------------------------------------------------- 257 The \CFA translator is 200+ files and 46,000+ lines of code written in C/\CC. 258 Starting with a translator versus a compiler makes it easier and faster to generate and debug C object-code rather than intermediate, assembler or machine code. 259 The translator design is based on the \emph{visitor pattern}, allowing multiple passes over the abstract code-tree, which works well for incrementally adding new feature through additional visitor passes. 260 At the heart of the translator is the type resolver, which handles the polymorphic routine/type overload-resolution. 261 % @plg2[8]% cd cfa-cc/src; cloc libcfa 262 % ------------------------------------------------------------------------------- 263 % Language files blank comment code 264 % ------------------------------------------------------------------------------- 265 % C 35 1256 1240 9116 266 % C/C++ Header 54 358 1106 1198 267 % make 2 201 325 1167 268 % C++ 3 18 17 124 269 % Assembly 3 56 97 111 270 % Bourne Shell 2 2 0 25 271 % awk 1 4 0 22 272 % ------------------------------------------------------------------------------- 273 % SUM: 100 1895 2785 11763 274 % ------------------------------------------------------------------------------- 275 The \CFA runtime system is 100+ files and 11,000+ lines of code, written in \CFA. 276 Currently, the \CFA runtime is the largest \emph{user} of \CFA providing a vehicle to test the language features and implementation. 277 % @plg2[6]% cd cfa-cc/src; cloc tests examples benchmark 278 % ------------------------------------------------------------------------------- 279 % Language files blank comment code 280 % ------------------------------------------------------------------------------- 281 % C 237 12260 2869 23286 282 % make 8 464 245 2838 283 % C/C++ Header 22 225 175 785 284 % Python 5 131 93 420 285 % C++ 10 48 5 201 286 % Lua 2 31 4 126 287 % Java 4 5 0 80 288 % Go 2 11 9 40 289 % ------------------------------------------------------------------------------- 290 % SUM: 290 13175 3400 27776 291 % ------------------------------------------------------------------------------- 292 The \CFA tests are 290+ files and 27,000+ lines of code. 293 The tests illustrate syntactic and semantic features in \CFA, plus a growing number of runtime benchmarks. 294 The tests check for correctness and are used for daily regression testing of commits (3800+). 241 All features discussed in this paper are working, unless otherwise stated as under construction. 295 242 296 243 Finally, it is impossible to describe a programming language without usages before definitions. … … 313 260 There are only two hard things in Computer Science: cache invalidation and \emph{naming things} -- Phil Karlton 314 261 \end{quote} 315 \vspace{-10pt}316 262 C already has a limited form of ad-hoc polymorphism in the form of its basic arithmetic operators, which apply to a variety of different types using identical syntax. 317 263 \CFA extends the built-in operator overloading by allowing users to define overloads for any function, not just operators, and even any variable; … … 408 354 409 355 \CFA has replacement libraries condensing hundreds of existing C functions into tens of \CFA overloaded functions, all without rewriting the actual computations (see Section~\ref{sec:libraries}). 410 For example, it is possible to write a type-safe \CFA wrapper @malloc@ based on the C @malloc@ , where the return type supplies the type/size of the allocation, which is impossible in most type systems.356 For example, it is possible to write a type-safe \CFA wrapper @malloc@ based on the C @malloc@: 411 357 \begin{cfa} 412 358 forall( dtype T | sized(T) ) T * malloc( void ) { return (T *)malloc( sizeof(T) ); } 413 // select type and size from left-hand side 414 int * ip = malloc(); double * dp = malloc(); struct S {...} * sp = malloc(); 415 \end{cfa} 359 int * ip = malloc(); $\C{// select type and size from left-hand side}$ 360 double * dp = malloc(); 361 struct S {...} * sp = malloc(); 362 \end{cfa} 363 where the return type supplies the type/size of the allocation, which is impossible in most type systems. 416 364 417 365 Call-site inferencing and nested functions provide a localized form of inheritance. … … 425 373 } 426 374 \end{cfa} 427 The local version of @?<?@ performs @?>?@ overridingthe built-in @?<?@ so it is passed to @qsort@.375 Within the block, the nested version of @?<?@ performs @?>?@ and this local version overrides the built-in @?<?@ so it is passed to @qsort@. 428 376 Hence, programmers can easily form local environments, adding and modifying appropriate functions, to maximize reuse of other existing functions and types. 429 377 … … 434 382 inline { $\C{// nested distribution block, add forall/inline to declarations}$ 435 383 void push( stack(`T`) & s, `T` value ) ... $\C{// generic operations}$ 384 T pop( stack(`T`) & s ) ... 436 385 } 437 386 } … … 439 388 440 389 441 \vspace*{-2pt}442 390 \subsection{Traits} 443 391 444 392 \CFA provides \newterm{traits} to name a group of type assertions, where the trait name allows specifying the same set of assertions in multiple locations, preventing repetition mistakes at each function declaration: 445 446 393 \begin{cquote} 447 394 \lstDeleteShortInline@% … … 515 462 516 463 517 \vspace*{-2pt}518 464 \section{Generic Types} 519 465 … … 528 474 529 475 \CC, Java, and other languages use \newterm{generic types} to produce type-safe abstract data-types. 530 \CFA generic typesintegrate efficiently and naturally with the existing polymorphic functions, while retaining backwards compatibility with C and providing separate compilation.476 \CFA also implements generic types that integrate efficiently and naturally with the existing polymorphic functions, while retaining backwards compatibility with C and providing separate compilation. 531 477 However, for known concrete parameters, the generic-type definition can be inlined, like \CC templates. 532 478 … … 534 480 \begin{cquote} 535 481 \lstDeleteShortInline@% 536 \begin{tabular}{@{}l |@{\hspace{2\parindentlnth}}l@{}}482 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}l@{}} 537 483 \begin{cfa} 538 484 forall( otype R, otype S ) struct pair { … … 1427 1373 resume( $\emph{alternate-stack}$ ) 1428 1374 \end{cfa} 1429 These overloads of @resume@ raise the specified exception or the currently propagating exception (reresume) at another \CFA coroutine or task ~\cite{Delisle18}.1375 These overloads of @resume@ raise the specified exception or the currently propagating exception (reresume) at another \CFA coroutine or task\footnote{\CFA coroutine and concurrency features are discussed in a separately submitted paper.}~\cite{Delisle18}. 1430 1376 Nonlocal raise is restricted to resumption to provide the exception handler the greatest flexibility because processing the exception does not unwind its stack, allowing it to continue after the handler returns. 1431 1377 … … 2094 2040 2095 2041 2096 \begin{comment}2097 2042 \subsection{Integral Suffixes} 2098 2043 … … 2128 2073 \lstMakeShortInline@% 2129 2074 \end{cquote} 2130 \end{comment}2131 2075 2132 2076 … … 2700 2644 Figure~\ref{fig:eval} and Table~\ref{tab:eval} show the results of running the benchmark in Figure~\ref{fig:BenchmarkTest} and its C, \CC, and \CCV equivalents. 2701 2645 The graph plots the median of 5 consecutive runs of each program, with an initial warm-up run omitted. 2702 All code is compiled at \texttt{-O2} by gcc or g++ 6. 4.0, with all \CC code compiled as \CCfourteen.2646 All code is compiled at \texttt{-O2} by gcc or g++ 6.3.0, with all \CC code compiled as \CCfourteen. 2703 2647 The benchmarks are run on an Ubuntu 16.04 workstation with 16 GB of RAM and a 6-core AMD FX-6300 CPU with 3.5 GHz maximum clock frequency. 2704 2648 … … 2718 2662 & \CT{C} & \CT{\CFA} & \CT{\CC} & \CT{\CCV} \\ \hline 2719 2663 maximum memory usage (MB) & 10,001 & 2,502 & 2,503 & 11,253 \\ 2720 source code size (lines) & 201 & 191 & 125 & 294\\2664 source code size (lines) & 196 & 186 & 125 & 290 \\ 2721 2665 redundant type annotations (lines) & 27 & 0 & 2 & 16 \\ 2722 2666 binary size (KB) & 14 & 257 & 14 & 37 \\ … … 2821 2765 data-parallel features have not yet been added to \CFA, but are easily incorporated within its design, while concurrency primitives similar to those in $\mu$\CC have already been added~\cite{Delisle18}. 2822 2766 Finally, CCured~\cite{Necula02} and Ironclad \CC~\cite{DeLozier13} attempt to provide a more memory-safe C by annotating pointer types with garbage collection information; type-checked polymorphism in \CFA covers several of C's memory-safety issues, but more aggressive approaches such as annotating all pointer types with their nullability or requiring runtime garbage collection are contradictory to \CFA's backwards compatibility goals. 2767 2768 2769 \begin{comment} 2770 \subsection{Control Structures / Declarations / Literals} 2771 2772 Java has default fall through like C/\CC. 2773 Pascal/Ada/Go/Rust do not have default fall through. 2774 \Csharp does not have fall through but still requires a break. 2775 Python uses dictionary mapping. \\ 2776 \CFA choose is like Rust match. 2777 2778 Java has labelled break/continue. \\ 2779 Languages with and without exception handling. 2780 2781 Alternative C declarations. \\ 2782 Different references \\ 2783 Constructors/destructors 2784 2785 0/1 Literals \\ 2786 user defined: D, Objective-C 2787 \end{comment} 2823 2788 2824 2789 … … 2910 2875 } 2911 2876 _Bool stack_empty( const stack * s ) { 2912 return s->head == NULL;2877 return s->head == NULL; 2913 2878 } 2914 2879 void push_stack( stack * s, void * v ) { 2915 node * n = malloc( sizeof(node)); /***/2880 node * n = malloc(sizeof(node)); /***/ 2916 2881 *n = (node){ v, s->head }; /***/ 2917 2882 s->head = n; … … 2943 2908 }; 2944 2909 struct stack { node(T) * head; }; 2945 void ?{}( stack(T) & s, stack(T) t ) { // copy 2910 void ?{}( stack(T) & s ) { (s.head){ 0 }; } 2911 void ?{}( stack(T) & s, stack(T) t ) { 2946 2912 node(T) ** cr = &s.head; 2947 2913 for ( node(T) * nx = t.head; nx; nx = nx->next ) { … … 2957 2923 nx = cr->next; 2958 2924 ^(*cr){}; 2959 free( cr);2925 free(cr); 2960 2926 } 2961 2927 head = 0; 2962 2928 } 2963 2964 2929 \end{cfa} 2965 2930 & 2966 2931 \begin{cfa}[xleftmargin=0pt,aboveskip=0pt,belowskip=0pt] 2967 void ?{}( stack(T) & s ) { (s.head){ 0 }; }2968 2932 void ^?{}( stack(T) & s) { clear( s ); } 2969 2933 stack(T) ?=?( stack(T) & s, stack(T) t ) { … … 2990 2954 } 2991 2955 } 2956 2992 2957 \end{cfa} 2993 2958 \end{tabular} … … 3038 3003 return *this; 3039 3004 } 3040 bool empty() const { 3041 return head == nullptr; 3042 } 3005 bool empty() const { return head == nullptr; } 3043 3006 void push( const T & value ) { 3044 3007 head = new node{ value, head }; /***/ … … 3052 3015 } 3053 3016 }; 3017 3018 3054 3019 3055 3020 \end{cfa} … … 3101 3066 return *this; 3102 3067 } 3103 bool empty() const { 3104 return head == nullptr; 3105 } 3068 bool empty() const { return head == nullptr; } 3106 3069 void push( const object & value ) { 3107 3070 head = new node{ value, head }; /***/ … … 3116 3079 }; 3117 3080 3081 3082 3118 3083 \end{cfa} 3119 3084 \end{tabular} -
doc/papers/general/evaluation/c-stack.c
r779a4a3 rf465f0e 27 27 } 28 28 29 stack new_stack() { 30 return (stack){ NULL }; /***/ 31 } 29 stack new_stack() { return (stack){ NULL }; /***/ } 32 30 33 31 stack * assign_stack( stack * s, const stack * t, … … 39 37 } 40 38 41 _Bool stack_empty( const stack * s ) { 42 return s->head == NULL; 43 } 39 _Bool stack_empty( const stack * s ) { return s->head == NULL; } 44 40 45 41 void push_stack( stack * s, void * v ) { -
doc/papers/general/evaluation/c-stack.h
r779a4a3 rf465f0e 6 6 } stack; 7 7 8 stack new_stack(); 8 9 void copy_stack(stack * dst, const stack * src, void * (* copy)(const void *)); 9 void clear_stack(stack * s, void (*free_el)(void *));10 stack new_stack();11 10 stack * assign_stack( stack * dst, const stack * src, 12 11 void * (* copy_el)(const void *), void (* free_el)(void *)); 12 void clear_stack(stack * s, void (*free_el)(void *)); 13 13 14 14 _Bool stack_empty( const stack * s ); -
doc/papers/general/evaluation/cfa-stack.c
r779a4a3 rf465f0e 8 8 }; 9 9 10 void ?{}( stack(T) & s, stack(T) t ) { // copy 10 void ?{}( stack(T) & s ) { (s.head){ 0 }; } 11 12 void ?{}( stack(T) & s, stack(T) t ) { 11 13 node(T) ** cr = &s.head; 12 14 for ( node(T) * nx = t.head; nx; nx = nx->next ) { … … 18 20 } 19 21 20 void clear( stack(T) & s ) with( s ) { 22 void ^?{}( stack(T) & s) { clear( s ); } 23 24 void clear( stack(T) & s ) with( s ) { 21 25 for ( node(T) * nx = head; nx; ) { 22 26 node(T) * cr = nx; 23 27 nx = cr->next; 24 28 ^(*cr){}; 25 free( cr);29 free(cr); 26 30 } 27 31 head = 0; 28 32 } 29 30 void ?{}( stack(T) & s ) { (s.head){ 0 }; }31 void ^?{}( stack(T) & s) { clear( s ); }32 33 33 34 stack(T) ?=?( stack(T) & s, stack(T) t ) { … … 38 39 } 39 40 40 _Bool empty( const stack(T) & s ) { 41 return s.head == 0; 42 } 41 _Bool empty( const stack(T) & s ) { return s.head == 0; } 43 42 44 43 void push( stack(T) & s, T value ) with( s ) { -
doc/papers/general/evaluation/cfa-stack.h
r779a4a3 rf465f0e 7 7 }; 8 8 9 void ?{}( stack(T) & s ); 9 10 void ?{}( stack(T) & s, stack(T) t ); 11 void ^?{}( stack(T) & s); 10 12 void clear( stack(T) & s ); 11 void ?{}( stack(T) & s );12 void ^?{}( stack(T) & s);13 13 14 14 stack(T) ?=?( stack(T) & s, stack(T) t ); -
doc/papers/general/evaluation/cpp-stack.hpp
r779a4a3 rf465f0e 10 10 node * head; 11 11 12 void copy( const stack<T> & o ) { 13 node ** cr = &head; 14 for ( node * nx = o.head; nx; nx = nx->next ) { 15 *cr = new node{ nx->value }; /***/ 16 cr = &(*cr)->next; 17 } 18 *cr = nullptr; 19 } 12 stack() : head( nullptr ) {} 13 stack( const stack<T> & o ) { copy( o ); } 20 14 21 15 void clear() { … … 28 22 } 29 23 30 stack() : head( nullptr ) {} 31 stack( const stack<T> & o ) { copy( o ); } 24 void copy( const stack<T> & o ) { 25 node ** cr = &head; 26 for ( node * nx = o.head; nx; nx = nx->next ) { 27 *cr = new node{ nx->value }; /***/ 28 cr = &(*cr)->next; 29 } 30 *cr = nullptr; 31 } 32 32 33 ~stack() { clear(); } 33 34 34 stack & operator= ( const stack<T> & o ) {35 stack & operator= ( const stack<T> & o ) { 35 36 if ( this == &o ) return *this; 36 37 clear(); … … 39 40 } 40 41 41 bool empty() const { 42 return head == nullptr; 43 } 42 bool empty() const { return head == nullptr; } 44 43 45 void push( const T & value ) { 46 head = new node{ value, head }; /***/ 47 } 44 void push( const T & value ) { head = new node{ value, head }; /***/ } 48 45 49 46 T pop() { -
doc/papers/general/evaluation/cpp-vstack.cpp
r779a4a3 rf465f0e 3 3 4 4 stack::node::node( const object & v, node * n ) : value( v.new_copy() ), next( n ) {} 5 6 void stack::clear() { 7 for ( node * nx = head; nx; ) { 8 node * cr = nx; 9 nx = cr->next; 10 delete cr; 11 } 12 head = nullptr; 13 } 5 14 6 15 void stack::copy( const stack & o ) { … … 11 20 } 12 21 *cr = nullptr; 13 }14 15 void stack::clear() {16 for ( node * nx = head; nx; ) {17 node * cr = nx;18 nx = cr->next;19 delete cr;20 }21 head = nullptr;22 22 } 23 23 … … 33 33 } 34 34 35 bool stack::empty() const { 36 return head == nullptr; 37 } 35 bool stack::empty() const { return head == nullptr; } 38 36 39 void stack::push( const object & value ) { 40 head = new node{ value, head }; /***/ 41 } 37 void stack::push( const object & value ) { head = new node{ value, head }; /***/ } 42 38 43 39 ptr<object> stack::pop() { -
doc/papers/general/evaluation/cpp-vstack.hpp
r779a4a3 rf465f0e 10 10 node * head; 11 11 12 void clear(); 12 13 void copy( const stack & o ); 13 void clear();14 14 15 15 stack(); -
doc/papers/general/evaluation/timing.dat
r779a4a3 rf465f0e 1 1 "400 million repetitions" "C" "\\CFA{}" "\\CC{}" "\\CC{obj}" 2 "push\nint" 2911 2034 1504 3246 3 "copy\nint" 2953 1622 1526 3075 4 "clear\nint" 1397 754 753 1452 5 "pop\nint" 1446 1203 760 5016 6 "push\npair" 3673 2297 955 6971 7 "copy\npair" 6027 1183 998 7204 8 "clear\npair" 2840 773 748 3511 9 "pop\npair" 3025 5414 813 23867 10 2 "push\nint" 3002 2459 1542 3269 3 "copy\nint" 2985 2057 1539 3083 4 "clear\nint" 1374 827 756 1469 5 "pop\nint" 1416 1221 760 5098 6 "push\npair" 4214 2752 950 6873 7 "copy\npair" 6127 2105 987 7293 8 "clear\npair" 2881 885 751 3460 9 "pop\npair" 3046 5434 822 24962 -
doc/papers/general/evaluation/timing.gp
r779a4a3 rf465f0e 24 24 set yrange [0:10] 25 25 26 set label "2 3.9" at 7.125,10.526 set label "25.0" at 7.125,10.5 27 27 28 28 # set datafile separator "," -
doc/refrat/Makefile
r779a4a3 rf465f0e 34 34 35 35 DOCUMENT = refrat.pdf 36 BASE = ${basename ${DOCUMENT}}37 36 38 37 # Directives # … … 43 42 44 43 clean : 45 @rm -frv ${DOCUMENT} ${ BASE}.ps ${Build}44 @rm -frv ${DOCUMENT} ${basename ${DOCUMENT}}.ps ${Build} 46 45 47 46 # File Dependencies # 48 47 49 ${DOCUMENT} : ${ BASE}.ps48 ${DOCUMENT} : ${basename ${DOCUMENT}}.ps 50 49 ps2pdf $< 51 50 52 ${ BASE}.ps : ${BASE}.dvi51 ${basename ${DOCUMENT}}.ps : ${basename ${DOCUMENT}}.dvi 53 52 dvips ${Build}/$< -o $@ 54 53 55 ${ BASE}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \54 ${basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \ 56 55 ${Macros}/common.tex ${Macros}/lstlang.sty ${Macros}/indexstyle ../bibliography/pl.bib 57 56 # Conditionally create an empty *.ind (index) file for inclusion until makeindex is run. … … 71 70 72 71 predefined : 73 sed -f predefined.sed ${ BASE}.tex > ${basename $@}.cf72 sed -f predefined.sed ${basename ${DOCUMENT}}.tex > ${basename $@}.cf 74 73 75 74 ## Define the default recipes. … … 78 77 mkdir -p ${Build} 79 78 80 %.tex : %.fig ${Build}79 %.tex : %.fig 81 80 fig2dev -L eepic $< > ${Build}/$@ 82 81 83 %.ps : %.fig ${Build}82 %.ps : %.fig 84 83 fig2dev -L ps $< > ${Build}/$@ 85 84 86 %.pstex : %.fig ${Build}85 %.pstex : %.fig 87 86 fig2dev -L pstex $< > ${Build}/$@ 88 87 fig2dev -L pstex_t -p ${Build}/$@ $< > ${Build}/$@_t -
doc/user/Makefile
r779a4a3 rf465f0e 38 38 39 39 DOCUMENT = user.pdf 40 BASE = ${basename ${DOCUMENT}}41 40 42 41 # Directives # … … 47 46 48 47 clean : 49 @rm -frv ${DOCUMENT} ${ BASE}.ps ${Build}48 @rm -frv ${DOCUMENT} ${basename ${DOCUMENT}}.ps ${Build} 50 49 51 50 # File Dependencies # 52 51 53 ${DOCUMENT} : ${ BASE}.ps52 ${DOCUMENT} : ${basename ${DOCUMENT}}.ps 54 53 ps2pdf $< 55 54 56 ${ BASE}.ps : ${BASE}.dvi55 ${basename ${DOCUMENT}}.ps : ${basename ${DOCUMENT}}.dvi 57 56 dvips ${Build}/$< -o $@ 58 57 59 ${ BASE}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \58 ${basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \ 60 59 ${Macros}/common.tex ${Macros}/lstlang.sty ${Macros}/indexstyle ../bibliography/pl.bib 61 60 # Conditionally create an empty *.ind (index) file for inclusion until makeindex is run. … … 79 78 mkdir -p ${Build} 80 79 81 %.tex : %.fig ${Build}80 %.tex : %.fig 82 81 fig2dev -L eepic $< > ${Build}/$@ 83 82 84 %.ps : %.fig ${Build}83 %.ps : %.fig 85 84 fig2dev -L ps $< > ${Build}/$@ 86 85 87 %.pstex : %.fig ${Build}86 %.pstex : %.fig 88 87 fig2dev -L pstex $< > ${Build}/$@ 89 88 fig2dev -L pstex_t -p ${Build}/$@ $< > ${Build}/$@_t -
src/CodeGen/CodeGenerator.cc
r779a4a3 rf465f0e 887 887 if ( asmStmt->get_instruction() ) asmStmt->get_instruction()->accept( *visitor ); 888 888 output << " )" ; 889 }890 891 void CodeGenerator::postvisit( DirectiveStmt * dirStmt ) {892 output << dirStmt->directive;893 889 } 894 890 -
src/CodeGen/CodeGenerator.h
r779a4a3 rf465f0e 99 99 void postvisit( ExprStmt * ); 100 100 void postvisit( AsmStmt * ); 101 void postvisit( DirectiveStmt * );102 101 void postvisit( AsmDecl * ); // special: statement in declaration context 103 102 void postvisit( IfStmt * ); -
src/Common/PassVisitor.h
r779a4a3 rf465f0e 71 71 virtual void visit( ExprStmt * exprStmt ) override final; 72 72 virtual void visit( AsmStmt * asmStmt ) override final; 73 virtual void visit( DirectiveStmt * dirStmt ) override final;74 73 virtual void visit( IfStmt * ifStmt ) override final; 75 74 virtual void visit( WhileStmt * whileStmt ) override final; … … 169 168 virtual Statement * mutate( ExprStmt * exprStmt ) override final; 170 169 virtual Statement * mutate( AsmStmt * asmStmt ) override final; 171 virtual Statement * mutate( DirectiveStmt * dirStmt ) override final;172 170 virtual Statement * mutate( IfStmt * ifStmt ) override final; 173 171 virtual Statement * mutate( WhileStmt * whileStmt ) override final; -
src/Common/PassVisitor.impl.h
r779a4a3 rf465f0e 777 777 778 778 //-------------------------------------------------------------------------- 779 // AsmStmt780 template< typename pass_type >781 void PassVisitor< pass_type >::visit( DirectiveStmt * node ) {782 VISIT_START( node )783 784 VISIT_END( node );785 }786 787 template< typename pass_type >788 Statement * PassVisitor< pass_type >::mutate( DirectiveStmt * node ) {789 MUTATE_START( node );790 791 MUTATE_END( Statement, node );792 }793 794 //--------------------------------------------------------------------------795 779 // IfStmt 796 780 template< typename pass_type > -
src/Common/SemanticError.cc
r779a4a3 rf465f0e 7 7 // SemanticError.cc -- 8 8 // 9 // Author : Thierry Delisle9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed May 2 18:13:37 201813 // Update Count : 812 // Last Modified On : Tue Aug 29 18:17:35 2017 13 // Update Count : 3 14 14 // 15 15 16 16 #include <cstdarg> 17 17 #include <cstdio> // for fileno, stderr 18 #include <cstring>19 18 #include <unistd.h> // for isatty 20 19 #include <iostream> // for basic_ostream, operator<<, ostream 21 20 #include <list> // for list, _List_iterator 22 21 #include <string> // for string, operator<<, operator+, to_string 23 #include <vector>24 22 25 23 #include "Common/utility.h" // for to_string, CodeLocation (ptr only) 26 24 #include "SemanticError.h" 27 25 28 //-----------------------------------------------------------------------------29 // Severity Handling30 std::vector<Severity> & get_severities() {31 static std::vector<Severity> severities;32 if(severities.empty()) {33 severities.reserve((size_t)Warning::NUMBER_OF_WARNINGS);34 for ( const auto w : WarningFormats ) {35 severities.push_back( w.default_severity );36 } // for37 }38 return severities;39 }40 41 void SemanticWarning_SuppressAll() {42 for( auto & s : get_severities() ) {43 s = Severity::Suppress;44 }45 }46 47 void SemanticWarning_EnableAll() {48 for( auto & s : get_severities() ) {49 s = Severity::Warn;50 }51 }52 53 void SemanticWarning_WarningAsError() {54 for( auto & s : get_severities() ) {55 if(s == Severity::Warn) s = Severity::Error;56 }57 }58 59 void SemanticWarning_Set(const char * const name, Severity s) {60 size_t idx = 0;61 for ( const auto & w : WarningFormats ) {62 if ( std::strcmp( name, w.name ) == 0 ) {63 get_severities()[idx] = s;64 break;65 }66 idx++;67 }68 }69 70 //-----------------------------------------------------------------------------71 // Semantic Error72 26 SemanticErrorException::SemanticErrorException( CodeLocation location, std::string error ) { 73 27 append( location, error ); … … 115 69 116 70 void SemanticWarningImpl( CodeLocation location, Warning warning, const char * const fmt, ... ) { 117 Severity severity = get_severities()[(int)warning];71 Severity severity = WarningFormats[(int)warning].severity; 118 72 switch(severity) { 119 73 case Severity::Suppress : -
src/Common/SemanticError.h
r779a4a3 rf465f0e 7 7 // SemanticError.h -- 8 8 // 9 // Author : Thierry Delisle9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed May 2 18:13:15201813 // Update Count : 2912 // Last Modified On : Thu Apr 19 17:52:03 2018 13 // Update Count : 19 14 14 // 15 15 … … 17 17 18 18 #include "ErrorObjects.h" 19 #include <cstring>20 19 21 20 //----------------------------------------------------------------------------- … … 47 46 const char * const name; 48 47 const char * const message; 49 const Severity default_severity;48 mutable Severity severity; 50 49 }; 51 50 52 constexpr WarningData WarningFormats[] = {53 {"self-assign" , "self assignment of expression: %s", Severity::Warn},54 {"reference-conversion" , "rvalue to reference conversion of rvalue: %s", Severity::Warn},51 constexpr const WarningData WarningFormats[] = { 52 {"self-assign" , "self assignment of expression: %s" , Severity::Warn}, 53 {"reference-conversion", "rvalue to reference conversion of rvalue: %s", Severity::Warn}, 55 54 {"qualifiers-zero_t-one_t", "questionable use of type qualifier %s with %s", Severity::Warn}, 56 55 }; … … 72 71 void SemanticWarningImpl (CodeLocation loc, Warning warn, const char * const fmt, ...) __attribute__((format(printf, 3, 4))); 73 72 74 void SemanticWarning_SuppressAll ();75 void SemanticWarning_EnableAll ();76 void SemanticWarning_WarningAsError();77 void SemanticWarning_Set (const char * const name, Severity s);78 79 // SKULLDUGGERY: cfa.cc is built before SemanticError.cc but needs this routine.80 static inline bool SemanticWarning_Exist(const char * const name) {81 for ( const auto & w : WarningFormats ) {82 if ( std::strcmp( name, w.name ) == 0 ) return true;83 }84 return false;85 }86 73 87 74 //----------------------------------------------------------------------------- -
src/Common/module.mk
r779a4a3 rf465f0e 6 6 ## file "LICENCE" distributed with Cforall. 7 7 ## 8 ## module.mk -- 8 ## module.mk -- 9 9 ## 10 10 ## Author : Richard C. Bilson … … 18 18 Common/UniqueName.cc \ 19 19 Common/DebugMalloc.cc \ 20 Common/Assert.cc \ 21 Common/Heap.cc 20 Common/Assert.cc -
src/Common/utility.h
r779a4a3 rf465f0e 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu May 3 12:18:31201813 // Update Count : 3 912 // Last Modified On : Fri Apr 20 22:35:33 2018 13 // Update Count : 38 14 14 // 15 15 … … 441 441 442 442 template<typename T> 443 inline 444 #if __GNUC__ > 4 445 constexpr 446 #endif 447 T ilog2(const T & t) { 448 if(std::is_integral<T>::value) { 443 inline constexpr T ilog2(const T & t) { 444 if ( std::is_integral<T>::value ) { 449 445 const constexpr int r = sizeof(t) * __CHAR_BIT__ - 1; 450 if( sizeof(T) == sizeof(unsigned int) ) return r - __builtin_clz ( t ); 451 if( sizeof(T) == sizeof(unsigned long) ) return r - __builtin_clzl ( t ); 452 if( sizeof(T) == sizeof(unsigned long long) ) return r - __builtin_clzll( t ); 453 } 454 assert(false); 446 if ( sizeof(T) == sizeof(unsigned int ) ) return r - __builtin_clz( t ); 447 if ( sizeof(T) == sizeof(unsigned long) ) return r - __builtin_clzl( t ); 448 if ( sizeof(T) == sizeof(unsigned long long) ) return r - __builtin_clzll( t ); 449 } // if 455 450 return -1; 456 } // ilo g2451 } // ilong2 457 452 458 453 -
src/Makefile.in
r779a4a3 rf465f0e 164 164 Common/driver_cfa_cpp-DebugMalloc.$(OBJEXT) \ 165 165 Common/driver_cfa_cpp-Assert.$(OBJEXT) \ 166 Common/driver_cfa_cpp-Heap.$(OBJEXT) \167 166 ControlStruct/driver_cfa_cpp-LabelGenerator.$(OBJEXT) \ 168 167 ControlStruct/driver_cfa_cpp-LabelFixer.$(OBJEXT) \ … … 487 486 Concurrency/Waitfor.cc Common/SemanticError.cc \ 488 487 Common/UniqueName.cc Common/DebugMalloc.cc Common/Assert.cc \ 489 Co mmon/Heap.cc ControlStruct/LabelGenerator.cc \490 ControlStruct/ LabelFixer.cc ControlStruct/MLEMutator.cc \491 ControlStruct/ Mutate.cc ControlStruct/ForExprMutator.cc \488 ControlStruct/LabelGenerator.cc ControlStruct/LabelFixer.cc \ 489 ControlStruct/MLEMutator.cc ControlStruct/Mutate.cc \ 490 ControlStruct/ForExprMutator.cc \ 492 491 ControlStruct/ExceptTranslate.cc GenPoly/Box.cc \ 493 492 GenPoly/GenPoly.cc GenPoly/ScrubTyVars.cc GenPoly/Lvalue.cc \ … … 673 672 Common/$(DEPDIR)/$(am__dirstamp) 674 673 Common/driver_cfa_cpp-Assert.$(OBJEXT): Common/$(am__dirstamp) \ 675 Common/$(DEPDIR)/$(am__dirstamp)676 Common/driver_cfa_cpp-Heap.$(OBJEXT): Common/$(am__dirstamp) \677 674 Common/$(DEPDIR)/$(am__dirstamp) 678 675 ControlStruct/$(am__dirstamp): … … 976 973 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-Assert.Po@am__quote@ 977 974 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-DebugMalloc.Po@am__quote@ 978 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-Heap.Po@am__quote@979 975 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-SemanticError.Po@am__quote@ 980 976 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-UniqueName.Po@am__quote@ … … 1312 1308 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Common/driver_cfa_cpp-Assert.obj `if test -f 'Common/Assert.cc'; then $(CYGPATH_W) 'Common/Assert.cc'; else $(CYGPATH_W) '$(srcdir)/Common/Assert.cc'; fi` 1313 1309 1314 Common/driver_cfa_cpp-Heap.o: Common/Heap.cc1315 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Common/driver_cfa_cpp-Heap.o -MD -MP -MF Common/$(DEPDIR)/driver_cfa_cpp-Heap.Tpo -c -o Common/driver_cfa_cpp-Heap.o `test -f 'Common/Heap.cc' || echo '$(srcdir)/'`Common/Heap.cc1316 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Common/$(DEPDIR)/driver_cfa_cpp-Heap.Tpo Common/$(DEPDIR)/driver_cfa_cpp-Heap.Po1317 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Common/Heap.cc' object='Common/driver_cfa_cpp-Heap.o' libtool=no @AMDEPBACKSLASH@1318 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@1319 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Common/driver_cfa_cpp-Heap.o `test -f 'Common/Heap.cc' || echo '$(srcdir)/'`Common/Heap.cc1320 1321 Common/driver_cfa_cpp-Heap.obj: Common/Heap.cc1322 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Common/driver_cfa_cpp-Heap.obj -MD -MP -MF Common/$(DEPDIR)/driver_cfa_cpp-Heap.Tpo -c -o Common/driver_cfa_cpp-Heap.obj `if test -f 'Common/Heap.cc'; then $(CYGPATH_W) 'Common/Heap.cc'; else $(CYGPATH_W) '$(srcdir)/Common/Heap.cc'; fi`1323 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Common/$(DEPDIR)/driver_cfa_cpp-Heap.Tpo Common/$(DEPDIR)/driver_cfa_cpp-Heap.Po1324 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='Common/Heap.cc' object='Common/driver_cfa_cpp-Heap.obj' libtool=no @AMDEPBACKSLASH@1325 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@1326 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Common/driver_cfa_cpp-Heap.obj `if test -f 'Common/Heap.cc'; then $(CYGPATH_W) 'Common/Heap.cc'; else $(CYGPATH_W) '$(srcdir)/Common/Heap.cc'; fi`1327 1328 1310 ControlStruct/driver_cfa_cpp-LabelGenerator.o: ControlStruct/LabelGenerator.cc 1329 1311 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ControlStruct/driver_cfa_cpp-LabelGenerator.o -MD -MP -MF ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelGenerator.Tpo -c -o ControlStruct/driver_cfa_cpp-LabelGenerator.o `test -f 'ControlStruct/LabelGenerator.cc' || echo '$(srcdir)/'`ControlStruct/LabelGenerator.cc -
src/Parser/ParseNode.h
r779a4a3 rf465f0e 10 10 // Created On : Sat May 16 13:28:16 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Apr 30 09:19:17201813 // Update Count : 83 112 // Last Modified On : Sun Apr 29 14:04:05 2018 13 // Update Count : 830 14 14 // 15 15 … … 416 416 Statement * build_finally( StatementNode * stmt ); 417 417 Statement * build_compound( StatementNode * first ); 418 Statement * build_asm ( bool voltile, Expression * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );419 Statement * build_dir ective( std::string * directive );418 Statement * build_asmstmt( bool voltile, Expression * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr ); 419 Statement * build_dirstmt( std::string * directive ); 420 420 WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when ); 421 421 WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when, WaitForStmt * existing ); -
src/Parser/StatementNode.cc
r779a4a3 rf465f0e 10 10 // Created On : Sat May 16 14:59:41 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Apr 30 09:21:16201813 // Update Count : 35 412 // Last Modified On : Sun Apr 29 14:21:45 2018 13 // Update Count : 353 14 14 // 15 15 … … 310 310 } 311 311 312 Statement * build_asm ( bool voltile, Expression * instruction, ExpressionNode * output, ExpressionNode * input, ExpressionNode * clobber, LabelNode * gotolabels ) {312 Statement * build_asmstmt( bool voltile, Expression * instruction, ExpressionNode * output, ExpressionNode * input, ExpressionNode * clobber, LabelNode * gotolabels ) { 313 313 std::list< Expression * > out, in; 314 314 std::list< ConstantExpr * > clob; … … 320 320 } 321 321 322 Statement * build_directive( string * directive ) { 323 return new DirectiveStmt( *directive ); 322 Statement * build_dirstmt( string * directive ) { 323 cout << *directive << endl; 324 return nullptr; 324 325 } 325 326 -
src/Parser/lex.ll
r779a4a3 rf465f0e 10 10 * Created On : Sat Sep 22 08:58:10 2001 11 11 * Last Modified By : Peter A. Buhr 12 * Last Modified On : Thu May 3 13:42:40201813 * Update Count : 67 612 * Last Modified On : Sun Apr 29 14:10:49 2018 13 * Update Count : 675 14 14 */ 15 15 … … 174 174 } 175 175 176 /* preprocessor-style directives*/176 /* ignore preprocessor-style directives (for now) */ 177 177 ^{h_white}*"#"[^\n]*"\n" { RETURN_VAL( DIRECTIVE ); } 178 178 -
src/Parser/parser.yy
r779a4a3 rf465f0e 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu May 3 08:20:09201813 // Update Count : 32 2512 // Last Modified On : Sun Apr 29 14:20:17 2018 13 // Update Count : 3206 14 14 // 15 15 … … 877 877 | asm_statement 878 878 | DIRECTIVE 879 { $$ = new StatementNode( build_dir ective( $1 ) ); }879 { $$ = new StatementNode( build_dirstmt( $1 ) ); } 880 880 ; 881 881 … … 1207 1207 asm_statement: 1208 1208 ASM asm_volatile_opt '(' string_literal ')' ';' 1209 { $$ = new StatementNode( build_asm ( $2, $4, 0 ) ); }1209 { $$ = new StatementNode( build_asmstmt( $2, $4, 0 ) ); } 1210 1210 | ASM asm_volatile_opt '(' string_literal ':' asm_operands_opt ')' ';' // remaining GCC 1211 { $$ = new StatementNode( build_asm ( $2, $4, $6 ) ); }1211 { $$ = new StatementNode( build_asmstmt( $2, $4, $6 ) ); } 1212 1212 | ASM asm_volatile_opt '(' string_literal ':' asm_operands_opt ':' asm_operands_opt ')' ';' 1213 { $$ = new StatementNode( build_asm ( $2, $4, $6, $8 ) ); }1213 { $$ = new StatementNode( build_asmstmt( $2, $4, $6, $8 ) ); } 1214 1214 | ASM asm_volatile_opt '(' string_literal ':' asm_operands_opt ':' asm_operands_opt ':' asm_clobbers_list_opt ')' ';' 1215 { $$ = new StatementNode( build_asm ( $2, $4, $6, $8, $10 ) ); }1215 { $$ = new StatementNode( build_asmstmt( $2, $4, $6, $8, $10 ) ); } 1216 1216 | ASM asm_volatile_opt GOTO '(' string_literal ':' ':' asm_operands_opt ':' asm_clobbers_list_opt ':' label_list ')' ';' 1217 { $$ = new StatementNode( build_asm ( $2, $5, 0, $8, $10, $12 ) ); }1217 { $$ = new StatementNode( build_asmstmt( $2, $5, 0, $8, $10, $12 ) ); } 1218 1218 ; 1219 1219 … … 2405 2405 | ASM '(' string_literal ')' ';' // GCC, global assembler statement 2406 2406 { 2407 $$ = DeclarationNode::newAsmStmt( new StatementNode( build_asm ( false, $3, 0 ) ) );2407 $$ = DeclarationNode::newAsmStmt( new StatementNode( build_asmstmt( false, $3, 0 ) ) ); 2408 2408 } 2409 2409 | EXTERN STRINGliteral // C++-style linkage specifier … … 2451 2451 | declaration_qualifier_list type_qualifier_list 2452 2452 { 2453 // forall must be in the type_qualifier_list 2454 if ( $2->type->forall ) xxx = forall = true; // remember generic type 2453 if ( $1->type->forall ) xxx = forall = true; // remember generic type 2455 2454 } 2456 2455 push '{' external_definition_list '}' // CFA, namespace -
src/ResolvExpr/AlternativeFinder.cc
r779a4a3 rf465f0e 459 459 /// Adds type variables to the open variable set and marks their assertions 460 460 void makeUnifiableVars( Type *type, OpenVarSet &unifiableVars, AssertionSet &needAssertions ) { 461 for ( Type::ForallList::const_iterator tyvar = type-> forall.begin(); tyvar != type->forall.end(); ++tyvar ) {461 for ( Type::ForallList::const_iterator tyvar = type->get_forall().begin(); tyvar != type->get_forall().end(); ++tyvar ) { 462 462 unifiableVars[ (*tyvar)->get_name() ] = TypeDecl::Data{ *tyvar }; 463 for ( std::list< DeclarationWithType* >::iterator assert = (*tyvar)-> assertions.begin(); assert != (*tyvar)->assertions.end(); ++assert ) {463 for ( std::list< DeclarationWithType* >::iterator assert = (*tyvar)->get_assertions().begin(); assert != (*tyvar)->get_assertions().end(); ++assert ) { 464 464 needAssertions[ *assert ].isUsed = true; 465 465 } -
src/ResolvExpr/AlternativeFinder.h
r779a4a3 rf465f0e 126 126 void printAlts( const AltList &list, std::ostream &os, unsigned int indentAmt = 0 ); 127 127 128 /// Adds type variables to the open variable set and marks their assertions129 void makeUnifiableVars( Type *type, OpenVarSet &unifiableVars, AssertionSet &needAssertions );130 131 128 template< typename InputIterator > 132 129 void simpleCombineEnvironments( InputIterator begin, InputIterator end, TypeEnvironment &result ) { -
src/ResolvExpr/Resolver.cc
r779a4a3 rf465f0e 544 544 OpenVarSet openVars; 545 545 AssertionSet resultNeed, resultHave; 546 TypeEnvironment resultEnv( func.env ); 547 makeUnifiableVars( function, openVars, resultNeed ); 548 // add all type variables as open variables now so that those not used in the parameter 549 // list are still considered open. 550 resultEnv.add( function->forall ); 546 TypeEnvironment resultEnv; 551 547 552 548 // Load type variables from arguemnts into one shared space … … 587 583 ss << "' to '"; 588 584 arg.expr->get_result()->print( ss ); 589 ss << "' with env '";590 resultEnv.print(ss);591 585 ss << "'\n"; 592 586 SemanticError( function, ss.str() ); -
src/SynTree/Mutator.h
r779a4a3 rf465f0e 39 39 virtual Statement * mutate( ExprStmt * exprStmt ) = 0; 40 40 virtual Statement * mutate( AsmStmt * asmStmt ) = 0; 41 virtual Statement * mutate( DirectiveStmt * dirStmt ) = 0;42 41 virtual Statement * mutate( IfStmt * ifStmt ) = 0; 43 42 virtual Statement * mutate( WhileStmt * whileStmt ) = 0; -
src/SynTree/Statement.cc
r779a4a3 rf465f0e 94 94 95 95 96 DirectiveStmt::DirectiveStmt( const std::string & directive ) : Statement(), directive( directive ) {}97 98 void DirectiveStmt::print( std::ostream &os, Indenter ) const {99 os << "GCC Directive:" << directive << endl;100 }101 102 103 96 const char *BranchStmt::brType[] = { "Goto", "Break", "Continue" }; 104 97 -
src/SynTree/Statement.h
r779a4a3 rf465f0e 126 126 }; 127 127 128 class DirectiveStmt : public Statement {129 public:130 std::string directive;131 132 DirectiveStmt( const std::string & );133 virtual ~DirectiveStmt(){}134 135 virtual DirectiveStmt * clone() const { return new DirectiveStmt( *this ); }136 virtual void accept( Visitor & v ) { v.visit( this ); }137 virtual Statement * acceptMutator( Mutator & m ) { return m.mutate( this ); }138 virtual void print( std::ostream & os, Indenter indent = {} ) const;139 };140 141 128 class IfStmt : public Statement { 142 129 public: -
src/SynTree/SynTree.h
r779a4a3 rf465f0e 44 44 class ExprStmt; 45 45 class AsmStmt; 46 class DirectiveStmt;47 46 class IfStmt; 48 47 class WhileStmt; -
src/SynTree/Visitor.h
r779a4a3 rf465f0e 41 41 virtual void visit( ExprStmt * exprStmt ) = 0; 42 42 virtual void visit( AsmStmt * asmStmt ) = 0; 43 virtual void visit( DirectiveStmt * directiveStmt ) = 0;44 43 virtual void visit( IfStmt * ifStmt ) = 0; 45 44 virtual void visit( WhileStmt * whileStmt ) = 0; -
src/benchmark/bench.h
r779a4a3 rf465f0e 6 6 #include <stdlib.h> 7 7 #include <unistd.h> // sysconf 8 #if ! defined(__cforall) 8 #include <sys/times.h> // times 9 9 #include <time.h> 10 #include <sys/time.h> 11 #else 10 #if defined(__cforall) 12 11 } 13 #include <time>12 //#include <bits/cfatime.h> 14 13 #endif 15 14 16 15 17 static inline unsigned long long int bench_time() {16 static inline unsigned long long int Time() { 18 17 struct timespec ts; 19 18 clock_gettime( … … 42 41 } \ 43 42 long long int StartTime, EndTime; \ 44 StartTime = bench_time();\43 StartTime = Time(); \ 45 44 statement; \ 46 EndTime = bench_time();\45 EndTime = Time(); \ 47 46 unsigned long long int output = \ 48 47 ( EndTime - StartTime ) / n; 49 48 50 #if defined(__cforall) 51 Duration default_preemption() { 49 __cfa_time_t default_preemption() { 52 50 return 0; 53 51 } 54 #endif -
src/benchmark/ctxswitch/cfa_cor.c
r779a4a3 rf465f0e 1 1 #include <stdio.h> 2 #include <kernel>3 2 #include <thread> 4 3 -
src/driver/Makefile.am
r779a4a3 rf465f0e 11 11 ## Created On : Sun May 31 08:49:31 2015 12 12 ## Last Modified By : Peter A. Buhr 13 ## Last Modified On : Mon Apr 30 17:44:17 201814 ## Update Count : 1 113 ## Last Modified On : Fri Oct 28 13:46:06 2016 14 ## Update Count : 10 15 15 ############################################################################### 16 16 17 17 # applies to both programs 18 AM_CXXFLAGS = -Wall -O2 -g -std=c++14 -I${abs_top_srcdir}/src18 AM_CXXFLAGS = -Wall -O2 -g -std=c++14 19 19 if BUILD_NO_LIB 20 20 else -
src/driver/Makefile.in
r779a4a3 rf465f0e 294 294 295 295 # applies to both programs 296 AM_CXXFLAGS = -Wall -O2 -g -std=c++14 -I${abs_top_srcdir}/src\297 $(am__append_ 1) $(am__append_2) $(am__append_3)296 AM_CXXFLAGS = -Wall -O2 -g -std=c++14 $(am__append_1) $(am__append_2) \ 297 $(am__append_3) 298 298 cfa_SOURCES = cfa.cc 299 299 -
src/driver/cfa.cc
r779a4a3 rf465f0e 10 10 // Created On : Tue Aug 20 13:44:49 2002 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed May 2 17:57:43201813 // Update Count : 22412 // Last Modified On : Mon Feb 5 22:05:28 2018 13 // Update Count : 166 14 14 // 15 15 … … 19 19 #include <unistd.h> // execvp 20 20 #include <string> // STL version 21 #include <string.h> // strcmp 22 23 #include "Common/SemanticError.h" 21 24 22 #include "config.h" // configure info 25 23 … … 162 160 args[nargs] = argv[i]; // pass the argument along 163 161 nargs += 1; 164 } else if ( arg == "-w" ) {165 args[nargs] = argv[i]; // pass the argument along166 nargs += 1;167 args[nargs] = ( *new string( string("-D__CFA_FLAG__=") + arg ) ).c_str(); // add the argument for cfa-cpp168 nargs += 1;169 } else if ( prefix( arg, "-W" ) ) { // check before next tests170 if ( arg == "-Werror" || arg == "-Wall" ) {171 args[nargs] = argv[i]; // pass the argument along172 nargs += 1;173 args[nargs] = ( *new string( string("-D__CFA_FLAG__=") + arg ) ).c_str(); // add the argument for cfa-cpp174 nargs += 1;175 } else {176 unsigned int adv = prefix( arg, "-Wno-" ) ? 5 : 2;177 args[nargs] = argv[i]; // conditionally pass the argument along178 const char * warning = argv[i] + adv; // extract warning179 if ( SemanticWarning_Exist( warning ) ) { // replace the argument for cfa-cpp180 args[nargs] = ( *new string( string("-D__CFA_FLAG__=") + arg ) ).c_str();181 } // if182 nargs += 1;183 } // if184 162 } else if ( prefix( arg, "-B" ) ) { 185 163 Bprefix = arg.substr(2); // strip the -B flag … … 269 247 #if ! defined(HAVE_LIBCFA_RELEASE) 270 248 if( !debug ) { 271 cerr << "error: Option -nodebug is unavailable, libcfa was not installed." << endl;249 cerr << "error: Option -nodebug is not available, libcfa was not installed." << endl; 272 250 exit( EXIT_FAILURE ); 273 251 } … … 275 253 #if ! defined(HAVE_LIBCFA_DEBUG) 276 254 if( debug ) { 277 cerr << "error: Option -debug is unavailable, libcfa-d was not installed." << endl;255 cerr << "error: Option -debug is not available, libcfa-d was not installed." << endl; 278 256 exit( EXIT_FAILURE ); 279 257 } -
src/libcfa/concurrency/preemption.c
r779a4a3 rf465f0e 404 404 } 405 405 406 //=============================================================================================407 // Kernel Signal Debug408 //=============================================================================================409 410 void __cfaabi_check_preemption() {411 bool ready = TL_GET( preemption_state ).enabled;412 if(!ready) { abort("Preemption should be ready"); }413 414 sigset_t oldset;415 int ret;416 ret = sigprocmask(0, NULL, &oldset);417 if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); }418 419 ret = sigismember(&oldset, SIGUSR1);420 if(ret < 0) { abort("ERROR sigismember returned %d", ret); }421 422 if(ret == 1) { abort("ERROR SIGUSR1 is disabled"); }423 }424 425 406 // Local Variables: // 426 407 // mode: c // -
src/libcfa/concurrency/thread
r779a4a3 rf465f0e 20 20 21 21 #include "coroutine" 22 #include "kernel"23 22 #include "monitor" 24 23 -
src/libcfa/interpose.c
r779a4a3 rf465f0e 10 10 // Created On : Wed Mar 29 16:10:31 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue May 1 15:05:35201813 // Update Count : 8312 // Last Modified On : Thu Feb 8 16:18:09 2018 13 // Update Count : 75 14 14 // 15 15 … … 95 95 void sigHandler_fpe ( __CFA_SIGPARMS__ ); 96 96 void sigHandler_abort( __CFA_SIGPARMS__ ); 97 void sigHandler_term ( __CFA_SIGPARMS__ );98 97 99 98 struct { … … 115 114 __cfaabi_sigaction( SIGFPE , sigHandler_fpe , SA_SIGINFO ); // Failure handler 116 115 __cfaabi_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler 117 __cfaabi_sigaction( SIGTERM, sigHandler_term , SA_SIGINFO ); // Failure handler118 __cfaabi_sigaction( SIGINT , sigHandler_term , SA_SIGINFO ); // Failure handler119 116 } 120 117 } … … 271 268 } 272 269 273 void sigHandler_term( __CFA_SIGPARMS__ ) {274 abort( "Application stopped by %s signal.", sig == SIGINT ? "an interrupt (SIGINT)" : "a terminate (SIGTERM)" );275 }276 277 270 // Local Variables: // 278 271 // mode: c // -
src/main.cc
r779a4a3 rf465f0e 1 1 2 // 2 3 // Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo … … 10 11 // Created On : Fri May 15 23:12:02 2015 11 12 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed May 2 14:59:02 201813 // Update Count : 4 9013 // Last Modified On : Tue Oct 31 12:22:40 2017 14 // Update Count : 445 14 15 // 15 16 … … 34 35 #include "CodeTools/DeclStats.h" // for printDeclStats 35 36 #include "CodeTools/TrackLoc.h" // for fillLocations 37 #include "Common/PassVisitor.h" 36 38 #include "Common/CompilerError.h" // for CompilerError 37 #include "Common/Heap.h"38 #include "Common/PassVisitor.h"39 39 #include "Common/SemanticError.h" // for SemanticError 40 40 #include "Common/UnimplementedError.h" // for UnimplementedError … … 175 175 signal( SIGABRT, sigAbortHandler ); 176 176 177 // std::cout << "main" << std::endl;178 // for ( int i = 0; i < argc; i += 1 ) {179 // std::cout << '\t' << argv[i] << std::endl;180 // } // for181 182 177 parse_cmdline( argc, argv, filename ); // process command-line arguments 183 178 CodeGen::FixMain::setReplaceMain( !nomainp ); … … 359 354 OPTPRINT( "end" ) 360 355 361 362 356 if ( output != &cout ) { 363 357 delete output; … … 390 384 391 385 deleteAll( translationUnit ); 392 HeapStats::printStats();393 386 return 0; 394 387 } // main … … 423 416 opterr = 0; // (global) prevent getopt from printing error messages 424 417 425 bool Werror = false;426 418 int c; 427 while ( (c = getopt_long( argc, argv, "abBcCdefgGlLmnNpqrstTv wW:yzZD:F:", long_opts, &long_index )) != -1 ) {419 while ( (c = getopt_long( argc, argv, "abBcCdefgGlLmnNpqrstTvyzZD:F:", long_opts, &long_index )) != -1 ) { 428 420 switch ( c ) { 429 421 case Ast: … … 461 453 yydebug = true; 462 454 break; 463 case 'G': // dump AST after instantiate generics455 case 'G': // dump AST after instantiate generics 464 456 genericsp = true; 465 457 break; … … 509 501 case 'v': // dump AST after decl validation pass 510 502 validp = true; 511 break;512 case 'w':513 SemanticWarning_SuppressAll();514 break;515 case 'W':516 if ( strcmp( optarg, "all" ) == 0 ) {517 SemanticWarning_EnableAll();518 } else if ( strcmp( optarg, "error" ) == 0 ) {519 Werror = true;520 } else {521 char * warning = optarg;522 Severity s;523 if ( strncmp( optarg, "no-", 3 ) == 0 ) {524 warning += 3;525 s = Severity::Suppress;526 } else {527 s = Severity::Warn;528 } // if529 SemanticWarning_Set( warning, s );530 } // if531 503 break; 532 504 case 'y': // dump AST on error … … 558 530 } // switch 559 531 } // while 560 561 if ( Werror ) {562 SemanticWarning_WarningAsError();563 } // if564 // for ( const auto w : WarningFormats ) {565 // cout << w.name << ' ' << (int)w.severity << endl;566 // } // for567 532 } // parse_cmdline 568 533 -
src/tests/concurrent/examples/boundedBufferEXT.c
r779a4a3 rf465f0e 8 8 // Created On : Wed Apr 18 22:52:12 2018 9 9 // Last Modified By : Peter A. Buhr 10 // Last Modified On : Wed May 2 16:12:58201811 // Update Count : 710 // Last Modified On : Fri Apr 20 22:25:14 2018 11 // Update Count : 6 12 12 // 13 13 … … 22 22 enum { BufferSize = 50 }; 23 23 24 forall( otype T ) {25 monitor Buffer {26 int front, back, count;27 T elements[BufferSize];28 }; // Buffer 24 forall( otype T ) 25 monitor Buffer { 26 int front, back, count; 27 T elements[BufferSize]; 28 }; 29 29 30 void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; } 30 forall( otype T ) 31 void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; } 31 32 32 int query( Buffer(T) & buffer ) { return buffer.count; } // read-only, no mutual exclusion 33 forall( otype T ) 34 int query( Buffer(T) & buffer ) { return buffer.count; } 33 35 34 T remove( Buffer(T) & mutex buffer ); // forward 36 forall( otype T ) // forward 37 T remove( Buffer(T) & mutex buffer ); 35 38 36 void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) { 37 if ( count == BufferSize ) waitfor( remove, buffer ); 38 elements[back] = elem; 39 back = ( back + 1 ) % BufferSize; 40 count += 1; 41 } // insert 39 forall( otype T ) 40 void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) { 41 if ( count == BufferSize ) waitfor( remove, buffer ); 42 elements[back] = elem; 43 back = ( back + 1 ) % BufferSize; 44 count += 1; 45 } 42 46 43 T remove( Buffer(T) & mutex buffer ) with( buffer ) { 44 if ( count == 0 ) waitfor( insert, buffer ); 45 T elem = elements[front];46 front = ( front + 1 ) % BufferSize;47 count -= 1;48 return elem;49 } // remove47 forall( otype T ) 48 T remove( Buffer(T) & mutex buffer ) with( buffer ) { 49 if ( count == 0 ) waitfor( insert, buffer ); 50 T elem = elements[front]; 51 front = ( front + 1 ) % BufferSize; 52 count -= 1; 53 return elem; 50 54 } 51 55 -
src/tests/concurrent/examples/boundedBufferINT.c
r779a4a3 rf465f0e 8 8 // Created On : Mon Oct 30 12:45:13 2017 9 9 // Last Modified By : Peter A. Buhr 10 // Last Modified On : Thu Apr 26 23:08:17201811 // Update Count : 8210 // Last Modified On : Fri Apr 20 22:18:18 2018 11 // Update Count : 78 12 12 // 13 13 … … 22 22 enum { BufferSize = 50 }; 23 23 24 forall( otype T ) {25 monitor Buffer {26 condition full, empty;27 int front, back, count;28 T elements[BufferSize];29 }; // Buffer 24 forall( otype T ) 25 monitor Buffer { 26 condition full, empty; 27 int front, back, count; 28 T elements[BufferSize]; 29 }; 30 30 31 void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; } 31 forall( otype T ) 32 void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; } 32 33 33 int query( Buffer(T) & buffer ) { return buffer.count; } // read-only, no mutual exclusion 34 forall( otype T ) 35 int query( Buffer(T) & buffer ) { return buffer.count; } 34 36 35 void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) { 36 if ( count == BufferSize ) wait( empty ); 37 elements[back] = elem; 38 back = ( back + 1 ) % BufferSize; 39 count += 1; 40 signal( full ); 41 } // insert 37 forall( otype T ) 38 void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) { 39 if ( count == BufferSize ) wait( empty ); 40 elements[back] = elem; 41 back = ( back + 1 ) % BufferSize; 42 count += 1; 43 signal( full ); 44 } 42 45 43 T remove( Buffer(T) & mutex buffer ) with( buffer ) { 44 if ( count == 0 ) wait( full ); 45 T elem = elements[front];46 front = ( front + 1 ) % BufferSize;47 count -= 1;48 signal( empty );49 return elem;50 } // remove46 forall( otype T ) 47 T remove( Buffer(T) & mutex buffer ) with( buffer ) { 48 if ( count == 0 ) wait( full ); 49 T elem = elements[front]; 50 front = ( front + 1 ) % BufferSize; 51 count -= 1; 52 signal( empty ); 53 return elem; 51 54 } 52 55 -
src/tests/concurrent/preempt.c
r779a4a3 rf465f0e 17 17 #endif 18 18 19 extern void __cfaabi_check_preemption();20 21 19 static volatile int counter = 0; 22 20 … … 31 29 void main(worker_t & this) { 32 30 while(counter < N) { 33 __cfaabi_check_preemption();34 31 if( (counter % 7) == this.value ) { 35 __cfaabi_check_preemption();36 32 int next = __atomic_add_fetch_4(&counter, 1, __ATOMIC_SEQ_CST); 37 __cfaabi_check_preemption();38 33 if( (next % 100) == 0 ) printf("%d\n", (int)next); 39 __cfaabi_check_preemption();40 34 } 41 __cfaabi_check_preemption();42 35 } 43 36 }
Note:
See TracChangeset
for help on using the changeset viewer.