Changeset 779a4a3
- Timestamp:
- May 3, 2018, 4:33:19 PM (6 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
- Children:
- f3152ab
- Parents:
- f465f0e (diff), c9d5c4f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 2 added
- 48 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/papers/concurrency/Makefile
rf465f0e r779a4a3 75 75 mkdir -p ${Build} 76 76 77 ${BASE}.out.ps: 78 ln -fs build/Paper.out.ps .77 ${BASE}.out.ps: ${Build} 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 83 %.tex : %.fig ${Build} 84 84 fig2dev -L eepic $< > ${Build}/$@ 85 85 86 %.ps : %.fig 86 %.ps : %.fig ${Build} 87 87 fig2dev -L ps $< > ${Build}/$@ 88 88 89 %.pstex : %.fig 89 %.pstex : %.fig ${Build} 90 90 fig2dev -L pstex $< > ${Build}/$@ 91 91 fig2dev -L pstex_t -p ${Build}/$@ $< > ${Build}/$@_t -
doc/papers/general/Makefile
rf465f0e r779a4a3 69 69 mkdir -p ${Build} 70 70 71 ${BASE}.out.ps: 72 ln -fs build/Paper.out.ps .71 ${BASE}.out.ps: ${Build} 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} : timing.gp timing.dat77 ${GRAPHS} : ${Build} timing.gp timing.dat 78 78 gnuplot -e Build="'${Build}/'" evaluation/timing.gp 79 79 80 %.tex : %.fig 80 %.tex : %.fig ${Build} 81 81 fig2dev -L eepic $< > ${Build}/$@ 82 82 83 %.ps : %.fig 83 %.ps : %.fig ${Build} 84 84 fig2dev -L ps $< > ${Build}/$@ 85 85 86 %.pstex : %.fig 86 %.pstex : %.fig ${Build} 87 87 fig2dev -L pstex $< > ${Build}/$@ 88 88 fig2dev -L pstex_t -p ${Build}/$@ $< > ${Build}/$@_t -
doc/papers/general/Paper.tex
rf465f0e r779a4a3 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 ims to add modern languagefeatures 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 adds 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}. 239 241 \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). 240 242 Ultimately, a compiler is necessary for advanced features and optimal performance. 241 All features discussed in this paper are working, unless otherwise stated as under construction. 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+). 242 295 243 296 Finally, it is impossible to describe a programming language without usages before definitions. … … 260 313 There are only two hard things in Computer Science: cache invalidation and \emph{naming things} -- Phil Karlton 261 314 \end{quote} 315 \vspace{-10pt} 262 316 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. 263 317 \CFA extends the built-in operator overloading by allowing users to define overloads for any function, not just operators, and even any variable; … … 354 408 355 409 \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}). 356 For example, it is possible to write a type-safe \CFA wrapper @malloc@ based on the C @malloc@ :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. 357 411 \begin{cfa} 358 412 forall( dtype T | sized(T) ) T * malloc( void ) { return (T *)malloc( sizeof(T) ); } 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. 413 // select type and size from left-hand side 414 int * ip = malloc(); double * dp = malloc(); struct S {...} * sp = malloc(); 415 \end{cfa} 364 416 365 417 Call-site inferencing and nested functions provide a localized form of inheritance. … … 373 425 } 374 426 \end{cfa} 375 Within the block, the nested version of @?<?@ performs @?>?@ and this local version overridesthe built-in @?<?@ so it is passed to @qsort@.427 The local version of @?<?@ performs @?>?@ overriding the built-in @?<?@ so it is passed to @qsort@. 376 428 Hence, programmers can easily form local environments, adding and modifying appropriate functions, to maximize reuse of other existing functions and types. 377 429 … … 382 434 inline { $\C{// nested distribution block, add forall/inline to declarations}$ 383 435 void push( stack(`T`) & s, `T` value ) ... $\C{// generic operations}$ 384 T pop( stack(`T`) & s ) ...385 436 } 386 437 } … … 388 439 389 440 441 \vspace*{-2pt} 390 442 \subsection{Traits} 391 443 392 444 \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 393 446 \begin{cquote} 394 447 \lstDeleteShortInline@% … … 462 515 463 516 517 \vspace*{-2pt} 464 518 \section{Generic Types} 465 519 … … 474 528 475 529 \CC, Java, and other languages use \newterm{generic types} to produce type-safe abstract data-types. 476 \CFA also implements generic types thatintegrate efficiently and naturally with the existing polymorphic functions, while retaining backwards compatibility with C and providing separate compilation.530 \CFA generic types integrate efficiently and naturally with the existing polymorphic functions, while retaining backwards compatibility with C and providing separate compilation. 477 531 However, for known concrete parameters, the generic-type definition can be inlined, like \CC templates. 478 532 … … 480 534 \begin{cquote} 481 535 \lstDeleteShortInline@% 482 \begin{tabular}{@{}l @{\hspace{2\parindentlnth}}l@{}}536 \begin{tabular}{@{}l|@{\hspace{2\parindentlnth}}l@{}} 483 537 \begin{cfa} 484 538 forall( otype R, otype S ) struct pair { … … 1373 1427 resume( $\emph{alternate-stack}$ ) 1374 1428 \end{cfa} 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}.1429 These overloads of @resume@ raise the specified exception or the currently propagating exception (reresume) at another \CFA coroutine or task~\cite{Delisle18}. 1376 1430 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. 1377 1431 … … 2040 2094 2041 2095 2096 \begin{comment} 2042 2097 \subsection{Integral Suffixes} 2043 2098 … … 2073 2128 \lstMakeShortInline@% 2074 2129 \end{cquote} 2130 \end{comment} 2075 2131 2076 2132 … … 2644 2700 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. 2645 2701 The graph plots the median of 5 consecutive runs of each program, with an initial warm-up run omitted. 2646 All code is compiled at \texttt{-O2} by gcc or g++ 6. 3.0, with all \CC code compiled as \CCfourteen.2702 All code is compiled at \texttt{-O2} by gcc or g++ 6.4.0, with all \CC code compiled as \CCfourteen. 2647 2703 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. 2648 2704 … … 2662 2718 & \CT{C} & \CT{\CFA} & \CT{\CC} & \CT{\CCV} \\ \hline 2663 2719 maximum memory usage (MB) & 10,001 & 2,502 & 2,503 & 11,253 \\ 2664 source code size (lines) & 196 & 186 & 125 & 290\\2720 source code size (lines) & 201 & 191 & 125 & 294 \\ 2665 2721 redundant type annotations (lines) & 27 & 0 & 2 & 16 \\ 2666 2722 binary size (KB) & 14 & 257 & 14 & 37 \\ … … 2765 2821 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}. 2766 2822 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/destructors2784 2785 0/1 Literals \\2786 user defined: D, Objective-C2787 \end{comment}2788 2823 2789 2824 … … 2875 2910 } 2876 2911 _Bool stack_empty( const stack * s ) { 2877 2912 return s->head == NULL; 2878 2913 } 2879 2914 void push_stack( stack * s, void * v ) { 2880 node * n = malloc( sizeof(node)); /***/2915 node * n = malloc( sizeof(node) ); /***/ 2881 2916 *n = (node){ v, s->head }; /***/ 2882 2917 s->head = n; … … 2908 2943 }; 2909 2944 struct stack { node(T) * head; }; 2910 void ?{}( stack(T) & s ) { (s.head){ 0 }; } 2911 void ?{}( stack(T) & s, stack(T) t ) { 2945 void ?{}( stack(T) & s, stack(T) t ) { // copy 2912 2946 node(T) ** cr = &s.head; 2913 2947 for ( node(T) * nx = t.head; nx; nx = nx->next ) { … … 2923 2957 nx = cr->next; 2924 2958 ^(*cr){}; 2925 free( cr);2959 free( cr ); 2926 2960 } 2927 2961 head = 0; 2928 2962 } 2963 2929 2964 \end{cfa} 2930 2965 & 2931 2966 \begin{cfa}[xleftmargin=0pt,aboveskip=0pt,belowskip=0pt] 2967 void ?{}( stack(T) & s ) { (s.head){ 0 }; } 2932 2968 void ^?{}( stack(T) & s) { clear( s ); } 2933 2969 stack(T) ?=?( stack(T) & s, stack(T) t ) { … … 2954 2990 } 2955 2991 } 2956 2957 2992 \end{cfa} 2958 2993 \end{tabular} … … 3003 3038 return *this; 3004 3039 } 3005 bool empty() const { return head == nullptr; } 3040 bool empty() const { 3041 return head == nullptr; 3042 } 3006 3043 void push( const T & value ) { 3007 3044 head = new node{ value, head }; /***/ … … 3015 3052 } 3016 3053 }; 3017 3018 3019 3054 3020 3055 \end{cfa} … … 3066 3101 return *this; 3067 3102 } 3068 bool empty() const { return head == nullptr; } 3103 bool empty() const { 3104 return head == nullptr; 3105 } 3069 3106 void push( const object & value ) { 3070 3107 head = new node{ value, head }; /***/ … … 3079 3116 }; 3080 3117 3081 3082 3083 3118 \end{cfa} 3084 3119 \end{tabular} -
doc/papers/general/evaluation/c-stack.c
rf465f0e r779a4a3 27 27 } 28 28 29 stack new_stack() { return (stack){ NULL }; /***/ } 29 stack new_stack() { 30 return (stack){ NULL }; /***/ 31 } 30 32 31 33 stack * assign_stack( stack * s, const stack * t, … … 37 39 } 38 40 39 _Bool stack_empty( const stack * s ) { return s->head == NULL; } 41 _Bool stack_empty( const stack * s ) { 42 return s->head == NULL; 43 } 40 44 41 45 void push_stack( stack * s, void * v ) { -
doc/papers/general/evaluation/c-stack.h
rf465f0e r779a4a3 6 6 } stack; 7 7 8 void copy_stack(stack * dst, const stack * src, void * (* copy)(const void *)); 9 void clear_stack(stack * s, void (*free_el)(void *)); 8 10 stack new_stack(); 9 void copy_stack(stack * dst, const stack * src, void * (* copy)(const void *));10 11 stack * assign_stack( stack * dst, const stack * src, 11 12 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
rf465f0e r779a4a3 8 8 }; 9 9 10 void ?{}( stack(T) & s ) { (s.head){ 0 }; } 11 12 void ?{}( stack(T) & s, stack(T) t ) { 10 void ?{}( stack(T) & s, stack(T) t ) { // copy 13 11 node(T) ** cr = &s.head; 14 12 for ( node(T) * nx = t.head; nx; nx = nx->next ) { … … 20 18 } 21 19 22 void ^?{}( stack(T) & s) { clear( s ); } 23 24 void clear( stack(T) & s ) with( s ) { 20 void clear( stack(T) & s ) with( s ) { 25 21 for ( node(T) * nx = head; nx; ) { 26 22 node(T) * cr = nx; 27 23 nx = cr->next; 28 24 ^(*cr){}; 29 free( cr);25 free( cr ); 30 26 } 31 27 head = 0; 32 28 } 29 30 void ?{}( stack(T) & s ) { (s.head){ 0 }; } 31 void ^?{}( stack(T) & s) { clear( s ); } 33 32 34 33 stack(T) ?=?( stack(T) & s, stack(T) t ) { … … 39 38 } 40 39 41 _Bool empty( const stack(T) & s ) { return s.head == 0; } 40 _Bool empty( const stack(T) & s ) { 41 return s.head == 0; 42 } 42 43 43 44 void push( stack(T) & s, T value ) with( s ) { -
doc/papers/general/evaluation/cfa-stack.h
rf465f0e r779a4a3 7 7 }; 8 8 9 void ?{}( stack(T) & s, stack(T) t ); 10 void clear( stack(T) & s ); 9 11 void ?{}( stack(T) & s ); 10 void ?{}( stack(T) & s, stack(T) t );11 12 void ^?{}( stack(T) & s); 12 void clear( stack(T) & s );13 13 14 14 stack(T) ?=?( stack(T) & s, stack(T) t ); -
doc/papers/general/evaluation/cpp-stack.hpp
rf465f0e r779a4a3 10 10 node * head; 11 11 12 stack() : head( nullptr ) {} 13 stack( const stack<T> & o ) { copy( o ); } 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 } 14 20 15 21 void clear() { … … 22 28 } 23 29 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 30 stack() : head( nullptr ) {} 31 stack( const stack<T> & o ) { copy( o ); } 33 32 ~stack() { clear(); } 34 33 35 stack & operator= 34 stack & operator=( const stack<T> & o ) { 36 35 if ( this == &o ) return *this; 37 36 clear(); … … 40 39 } 41 40 42 bool empty() const { return head == nullptr; } 41 bool empty() const { 42 return head == nullptr; 43 } 43 44 44 void push( const T & value ) { head = new node{ value, head }; /***/ } 45 void push( const T & value ) { 46 head = new node{ value, head }; /***/ 47 } 45 48 46 49 T pop() { -
doc/papers/general/evaluation/cpp-vstack.cpp
rf465f0e r779a4a3 3 3 4 4 stack::node::node( const object & v, node * n ) : value( v.new_copy() ), next( n ) {} 5 6 void stack::copy( const stack & o ) { 7 node ** cr = &head; 8 for ( node * nx = o.head; nx; nx = nx->next ) { 9 *cr = new node{ *nx->value }; /***/ 10 cr = &(*cr)->next; 11 } 12 *cr = nullptr; 13 } 5 14 6 15 void stack::clear() { … … 11 20 } 12 21 head = nullptr; 13 }14 15 void stack::copy( const stack & o ) {16 node ** cr = &head;17 for ( node * nx = o.head; nx; nx = nx->next ) {18 *cr = new node{ *nx->value }; /***/19 cr = &(*cr)->next;20 }21 *cr = nullptr;22 22 } 23 23 … … 33 33 } 34 34 35 bool stack::empty() const { return head == nullptr; } 35 bool stack::empty() const { 36 return head == nullptr; 37 } 36 38 37 void stack::push( const object & value ) { head = new node{ value, head }; /***/ } 39 void stack::push( const object & value ) { 40 head = new node{ value, head }; /***/ 41 } 38 42 39 43 ptr<object> stack::pop() { -
doc/papers/general/evaluation/cpp-vstack.hpp
rf465f0e r779a4a3 10 10 node * head; 11 11 12 void copy( const stack & o ); 12 13 void clear(); 13 void copy( const stack & o );14 14 15 15 stack(); -
doc/papers/general/evaluation/timing.dat
rf465f0e r779a4a3 1 1 "400 million repetitions" "C" "\\CFA{}" "\\CC{}" "\\CC{obj}" 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 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 -
doc/papers/general/evaluation/timing.gp
rf465f0e r779a4a3 24 24 set yrange [0:10] 25 25 26 set label "2 5.0" at 7.125,10.526 set label "23.9" at 7.125,10.5 27 27 28 28 # set datafile separator "," -
doc/refrat/Makefile
rf465f0e r779a4a3 34 34 35 35 DOCUMENT = refrat.pdf 36 BASE = ${basename ${DOCUMENT}} 36 37 37 38 # Directives # … … 42 43 43 44 clean : 44 @rm -frv ${DOCUMENT} ${ basename ${DOCUMENT}}.ps ${Build}45 @rm -frv ${DOCUMENT} ${BASE}.ps ${Build} 45 46 46 47 # File Dependencies # 47 48 48 ${DOCUMENT} : ${ basename ${DOCUMENT}}.ps49 ${DOCUMENT} : ${BASE}.ps 49 50 ps2pdf $< 50 51 51 ${ basename ${DOCUMENT}}.ps : ${basename ${DOCUMENT}}.dvi52 ${BASE}.ps : ${BASE}.dvi 52 53 dvips ${Build}/$< -o $@ 53 54 54 ${ basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \55 ${BASE}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \ 55 56 ${Macros}/common.tex ${Macros}/lstlang.sty ${Macros}/indexstyle ../bibliography/pl.bib 56 57 # Conditionally create an empty *.ind (index) file for inclusion until makeindex is run. … … 70 71 71 72 predefined : 72 sed -f predefined.sed ${ basename ${DOCUMENT}}.tex > ${basename $@}.cf73 sed -f predefined.sed ${BASE}.tex > ${basename $@}.cf 73 74 74 75 ## Define the default recipes. … … 77 78 mkdir -p ${Build} 78 79 79 %.tex : %.fig 80 %.tex : %.fig ${Build} 80 81 fig2dev -L eepic $< > ${Build}/$@ 81 82 82 %.ps : %.fig 83 %.ps : %.fig ${Build} 83 84 fig2dev -L ps $< > ${Build}/$@ 84 85 85 %.pstex : %.fig 86 %.pstex : %.fig ${Build} 86 87 fig2dev -L pstex $< > ${Build}/$@ 87 88 fig2dev -L pstex_t -p ${Build}/$@ $< > ${Build}/$@_t -
doc/user/Makefile
rf465f0e r779a4a3 38 38 39 39 DOCUMENT = user.pdf 40 BASE = ${basename ${DOCUMENT}} 40 41 41 42 # Directives # … … 46 47 47 48 clean : 48 @rm -frv ${DOCUMENT} ${ basename ${DOCUMENT}}.ps ${Build}49 @rm -frv ${DOCUMENT} ${BASE}.ps ${Build} 49 50 50 51 # File Dependencies # 51 52 52 ${DOCUMENT} : ${ basename ${DOCUMENT}}.ps53 ${DOCUMENT} : ${BASE}.ps 53 54 ps2pdf $< 54 55 55 ${ basename ${DOCUMENT}}.ps : ${basename ${DOCUMENT}}.dvi56 ${BASE}.ps : ${BASE}.dvi 56 57 dvips ${Build}/$< -o $@ 57 58 58 ${ basename ${DOCUMENT}}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \59 ${BASE}.dvi : Makefile ${Build} ${GRAPHS} ${PROGRAMS} ${PICTURES} ${FIGURES} ${SOURCES} \ 59 60 ${Macros}/common.tex ${Macros}/lstlang.sty ${Macros}/indexstyle ../bibliography/pl.bib 60 61 # Conditionally create an empty *.ind (index) file for inclusion until makeindex is run. … … 78 79 mkdir -p ${Build} 79 80 80 %.tex : %.fig 81 %.tex : %.fig ${Build} 81 82 fig2dev -L eepic $< > ${Build}/$@ 82 83 83 %.ps : %.fig 84 %.ps : %.fig ${Build} 84 85 fig2dev -L ps $< > ${Build}/$@ 85 86 86 %.pstex : %.fig 87 %.pstex : %.fig ${Build} 87 88 fig2dev -L pstex $< > ${Build}/$@ 88 89 fig2dev -L pstex_t -p ${Build}/$@ $< > ${Build}/$@_t -
src/CodeGen/CodeGenerator.cc
rf465f0e r779a4a3 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; 889 893 } 890 894 -
src/CodeGen/CodeGenerator.h
rf465f0e r779a4a3 99 99 void postvisit( ExprStmt * ); 100 100 void postvisit( AsmStmt * ); 101 void postvisit( DirectiveStmt * ); 101 102 void postvisit( AsmDecl * ); // special: statement in declaration context 102 103 void postvisit( IfStmt * ); -
src/Common/PassVisitor.h
rf465f0e r779a4a3 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; 73 74 virtual void visit( IfStmt * ifStmt ) override final; 74 75 virtual void visit( WhileStmt * whileStmt ) override final; … … 168 169 virtual Statement * mutate( ExprStmt * exprStmt ) override final; 169 170 virtual Statement * mutate( AsmStmt * asmStmt ) override final; 171 virtual Statement * mutate( DirectiveStmt * dirStmt ) override final; 170 172 virtual Statement * mutate( IfStmt * ifStmt ) override final; 171 173 virtual Statement * mutate( WhileStmt * whileStmt ) override final; -
src/Common/PassVisitor.impl.h
rf465f0e r779a4a3 777 777 778 778 //-------------------------------------------------------------------------- 779 // AsmStmt 780 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 //-------------------------------------------------------------------------- 779 795 // IfStmt 780 796 template< typename pass_type > -
src/Common/SemanticError.cc
rf465f0e r779a4a3 7 7 // SemanticError.cc -- 8 8 // 9 // Author : Richard C. Bilson9 // Author : Thierry Delisle 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Aug 29 18:17:35 201713 // Update Count : 312 // Last Modified On : Wed May 2 18:13:37 2018 13 // Update Count : 8 14 14 // 15 15 16 16 #include <cstdarg> 17 17 #include <cstdio> // for fileno, stderr 18 #include <cstring> 18 19 #include <unistd.h> // for isatty 19 20 #include <iostream> // for basic_ostream, operator<<, ostream 20 21 #include <list> // for list, _List_iterator 21 22 #include <string> // for string, operator<<, operator+, to_string 23 #include <vector> 22 24 23 25 #include "Common/utility.h" // for to_string, CodeLocation (ptr only) 24 26 #include "SemanticError.h" 25 27 28 //----------------------------------------------------------------------------- 29 // Severity Handling 30 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 } // for 37 } 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 Error 26 72 SemanticErrorException::SemanticErrorException( CodeLocation location, std::string error ) { 27 73 append( location, error ); … … 69 115 70 116 void SemanticWarningImpl( CodeLocation location, Warning warning, const char * const fmt, ... ) { 71 Severity severity = WarningFormats[(int)warning].severity;117 Severity severity = get_severities()[(int)warning]; 72 118 switch(severity) { 73 119 case Severity::Suppress : -
src/Common/SemanticError.h
rf465f0e r779a4a3 7 7 // SemanticError.h -- 8 8 // 9 // Author : Richard C. Bilson9 // Author : Thierry Delisle 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Apr 19 17:52:03201813 // Update Count : 1912 // Last Modified On : Wed May 2 18:13:15 2018 13 // Update Count : 29 14 14 // 15 15 … … 17 17 18 18 #include "ErrorObjects.h" 19 #include <cstring> 19 20 20 21 //----------------------------------------------------------------------------- … … 46 47 const char * const name; 47 48 const char * const message; 48 mutable Severityseverity;49 const Severity default_severity; 49 50 }; 50 51 51 constexpr constWarningData WarningFormats[] = {52 {"self-assign" , "self assignment of expression: %s", Severity::Warn},53 {"reference-conversion" , "rvalue to reference conversion of rvalue: %s", Severity::Warn},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}, 54 55 {"qualifiers-zero_t-one_t", "questionable use of type qualifier %s with %s", Severity::Warn}, 55 56 }; … … 71 72 void SemanticWarningImpl (CodeLocation loc, Warning warn, const char * const fmt, ...) __attribute__((format(printf, 3, 4))); 72 73 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 } 73 86 74 87 //----------------------------------------------------------------------------- -
src/Common/module.mk
rf465f0e r779a4a3 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 20 Common/Assert.cc \ 21 Common/Heap.cc -
src/Common/utility.h
rf465f0e r779a4a3 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 20 22:35:33201813 // Update Count : 3 812 // Last Modified On : Thu May 3 12:18:31 2018 13 // Update Count : 39 14 14 // 15 15 … … 441 441 442 442 template<typename T> 443 inline constexpr T ilog2(const T & t) { 444 if ( std::is_integral<T>::value ) { 443 inline 444 #if __GNUC__ > 4 445 constexpr 446 #endif 447 T ilog2(const T & t) { 448 if(std::is_integral<T>::value) { 445 449 const constexpr int r = sizeof(t) * __CHAR_BIT__ - 1; 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 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); 450 455 return -1; 451 } // ilo ng2456 } // ilog2 452 457 453 458 -
src/Makefile.in
rf465f0e r779a4a3 164 164 Common/driver_cfa_cpp-DebugMalloc.$(OBJEXT) \ 165 165 Common/driver_cfa_cpp-Assert.$(OBJEXT) \ 166 Common/driver_cfa_cpp-Heap.$(OBJEXT) \ 166 167 ControlStruct/driver_cfa_cpp-LabelGenerator.$(OBJEXT) \ 167 168 ControlStruct/driver_cfa_cpp-LabelFixer.$(OBJEXT) \ … … 486 487 Concurrency/Waitfor.cc Common/SemanticError.cc \ 487 488 Common/UniqueName.cc Common/DebugMalloc.cc Common/Assert.cc \ 488 Co ntrolStruct/LabelGenerator.cc ControlStruct/LabelFixer.cc \489 ControlStruct/ MLEMutator.cc ControlStruct/Mutate.cc \490 ControlStruct/ ForExprMutator.cc \489 Common/Heap.cc ControlStruct/LabelGenerator.cc \ 490 ControlStruct/LabelFixer.cc ControlStruct/MLEMutator.cc \ 491 ControlStruct/Mutate.cc ControlStruct/ForExprMutator.cc \ 491 492 ControlStruct/ExceptTranslate.cc GenPoly/Box.cc \ 492 493 GenPoly/GenPoly.cc GenPoly/ScrubTyVars.cc GenPoly/Lvalue.cc \ … … 672 673 Common/$(DEPDIR)/$(am__dirstamp) 673 674 Common/driver_cfa_cpp-Assert.$(OBJEXT): Common/$(am__dirstamp) \ 675 Common/$(DEPDIR)/$(am__dirstamp) 676 Common/driver_cfa_cpp-Heap.$(OBJEXT): Common/$(am__dirstamp) \ 674 677 Common/$(DEPDIR)/$(am__dirstamp) 675 678 ControlStruct/$(am__dirstamp): … … 973 976 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-Assert.Po@am__quote@ 974 977 @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@ 975 979 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-SemanticError.Po@am__quote@ 976 980 @AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-UniqueName.Po@am__quote@ … … 1308 1312 @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` 1309 1313 1314 Common/driver_cfa_cpp-Heap.o: Common/Heap.cc 1315 @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.cc 1316 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) Common/$(DEPDIR)/driver_cfa_cpp-Heap.Tpo Common/$(DEPDIR)/driver_cfa_cpp-Heap.Po 1317 @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.cc 1320 1321 Common/driver_cfa_cpp-Heap.obj: Common/Heap.cc 1322 @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.Po 1324 @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 1310 1328 ControlStruct/driver_cfa_cpp-LabelGenerator.o: ControlStruct/LabelGenerator.cc 1311 1329 @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
rf465f0e r779a4a3 10 10 // Created On : Sat May 16 13:28:16 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Apr 29 14:04:05201813 // Update Count : 83 012 // Last Modified On : Mon Apr 30 09:19:17 2018 13 // Update Count : 831 14 14 // 15 15 … … 416 416 Statement * build_finally( StatementNode * stmt ); 417 417 Statement * build_compound( StatementNode * first ); 418 Statement * build_asm stmt( bool voltile, Expression * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );419 Statement * build_dir stmt( std::string * directive );418 Statement * build_asm( bool voltile, Expression * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr ); 419 Statement * build_directive( 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
rf465f0e r779a4a3 10 10 // Created On : Sat May 16 14:59:41 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Apr 29 14:21:45201813 // Update Count : 35 312 // Last Modified On : Mon Apr 30 09:21:16 2018 13 // Update Count : 354 14 14 // 15 15 … … 310 310 } 311 311 312 Statement * build_asm stmt( bool voltile, Expression * instruction, ExpressionNode * output, ExpressionNode * input, ExpressionNode * clobber, LabelNode * gotolabels ) {312 Statement * build_asm( 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_dirstmt( string * directive ) { 323 cout << *directive << endl; 324 return nullptr; 322 Statement * build_directive( string * directive ) { 323 return new DirectiveStmt( *directive ); 325 324 } 326 325 -
src/Parser/lex.ll
rf465f0e r779a4a3 10 10 * Created On : Sat Sep 22 08:58:10 2001 11 11 * Last Modified By : Peter A. Buhr 12 * Last Modified On : Sun Apr 29 14:10:49201813 * Update Count : 67 512 * Last Modified On : Thu May 3 13:42:40 2018 13 * Update Count : 676 14 14 */ 15 15 … … 174 174 } 175 175 176 /* ignore preprocessor-style directives (for now)*/176 /* preprocessor-style directives */ 177 177 ^{h_white}*"#"[^\n]*"\n" { RETURN_VAL( DIRECTIVE ); } 178 178 -
src/Parser/parser.yy
rf465f0e r779a4a3 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Apr 29 14:20:17201813 // Update Count : 32 0612 // Last Modified On : Thu May 3 08:20:09 2018 13 // Update Count : 3225 14 14 // 15 15 … … 877 877 | asm_statement 878 878 | DIRECTIVE 879 { $$ = new StatementNode( build_dir stmt( $1 ) ); }879 { $$ = new StatementNode( build_directive( $1 ) ); } 880 880 ; 881 881 … … 1207 1207 asm_statement: 1208 1208 ASM asm_volatile_opt '(' string_literal ')' ';' 1209 { $$ = new StatementNode( build_asm stmt( $2, $4, 0 ) ); }1209 { $$ = new StatementNode( build_asm( $2, $4, 0 ) ); } 1210 1210 | ASM asm_volatile_opt '(' string_literal ':' asm_operands_opt ')' ';' // remaining GCC 1211 { $$ = new StatementNode( build_asm stmt( $2, $4, $6 ) ); }1211 { $$ = new StatementNode( build_asm( $2, $4, $6 ) ); } 1212 1212 | ASM asm_volatile_opt '(' string_literal ':' asm_operands_opt ':' asm_operands_opt ')' ';' 1213 { $$ = new StatementNode( build_asm stmt( $2, $4, $6, $8 ) ); }1213 { $$ = new StatementNode( build_asm( $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 stmt( $2, $4, $6, $8, $10 ) ); }1215 { $$ = new StatementNode( build_asm( $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 stmt( $2, $5, 0, $8, $10, $12 ) ); }1217 { $$ = new StatementNode( build_asm( $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 stmt( false, $3, 0 ) ) );2407 $$ = DeclarationNode::newAsmStmt( new StatementNode( build_asm( false, $3, 0 ) ) ); 2408 2408 } 2409 2409 | EXTERN STRINGliteral // C++-style linkage specifier … … 2451 2451 | declaration_qualifier_list type_qualifier_list 2452 2452 { 2453 if ( $1->type->forall ) xxx = forall = true; // remember generic type 2453 // forall must be in the type_qualifier_list 2454 if ( $2->type->forall ) xxx = forall = true; // remember generic type 2454 2455 } 2455 2456 push '{' external_definition_list '}' // CFA, namespace -
src/ResolvExpr/AlternativeFinder.cc
rf465f0e r779a4a3 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-> get_forall().begin(); tyvar != type->get_forall().end(); ++tyvar ) {461 for ( Type::ForallList::const_iterator tyvar = type->forall.begin(); tyvar != type->forall.end(); ++tyvar ) { 462 462 unifiableVars[ (*tyvar)->get_name() ] = TypeDecl::Data{ *tyvar }; 463 for ( std::list< DeclarationWithType* >::iterator assert = (*tyvar)-> get_assertions().begin(); assert != (*tyvar)->get_assertions().end(); ++assert ) {463 for ( std::list< DeclarationWithType* >::iterator assert = (*tyvar)->assertions.begin(); assert != (*tyvar)->assertions.end(); ++assert ) { 464 464 needAssertions[ *assert ].isUsed = true; 465 465 } -
src/ResolvExpr/AlternativeFinder.h
rf465f0e r779a4a3 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 assertions 129 void makeUnifiableVars( Type *type, OpenVarSet &unifiableVars, AssertionSet &needAssertions ); 130 128 131 template< typename InputIterator > 129 132 void simpleCombineEnvironments( InputIterator begin, InputIterator end, TypeEnvironment &result ) { -
src/ResolvExpr/Resolver.cc
rf465f0e r779a4a3 544 544 OpenVarSet openVars; 545 545 AssertionSet resultNeed, resultHave; 546 TypeEnvironment resultEnv; 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 ); 547 551 548 552 // Load type variables from arguemnts into one shared space … … 583 587 ss << "' to '"; 584 588 arg.expr->get_result()->print( ss ); 589 ss << "' with env '"; 590 resultEnv.print(ss); 585 591 ss << "'\n"; 586 592 SemanticError( function, ss.str() ); -
src/SynTree/Mutator.h
rf465f0e r779a4a3 39 39 virtual Statement * mutate( ExprStmt * exprStmt ) = 0; 40 40 virtual Statement * mutate( AsmStmt * asmStmt ) = 0; 41 virtual Statement * mutate( DirectiveStmt * dirStmt ) = 0; 41 42 virtual Statement * mutate( IfStmt * ifStmt ) = 0; 42 43 virtual Statement * mutate( WhileStmt * whileStmt ) = 0; -
src/SynTree/Statement.cc
rf465f0e r779a4a3 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 96 103 const char *BranchStmt::brType[] = { "Goto", "Break", "Continue" }; 97 104 -
src/SynTree/Statement.h
rf465f0e r779a4a3 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 128 141 class IfStmt : public Statement { 129 142 public: -
src/SynTree/SynTree.h
rf465f0e r779a4a3 44 44 class ExprStmt; 45 45 class AsmStmt; 46 class DirectiveStmt; 46 47 class IfStmt; 47 48 class WhileStmt; -
src/SynTree/Visitor.h
rf465f0e r779a4a3 41 41 virtual void visit( ExprStmt * exprStmt ) = 0; 42 42 virtual void visit( AsmStmt * asmStmt ) = 0; 43 virtual void visit( DirectiveStmt * directiveStmt ) = 0; 43 44 virtual void visit( IfStmt * ifStmt ) = 0; 44 45 virtual void visit( WhileStmt * whileStmt ) = 0; -
src/benchmark/bench.h
rf465f0e r779a4a3 6 6 #include <stdlib.h> 7 7 #include <unistd.h> // sysconf 8 #include <sys/times.h> // times 8 #if ! defined(__cforall) 9 9 #include <time.h> 10 #if defined(__cforall) 10 #include <sys/time.h> 11 #else 11 12 } 12 //#include <bits/cfatime.h>13 #include <time> 13 14 #endif 14 15 15 16 16 static inline unsigned long long int Time() {17 static inline unsigned long long int bench_time() { 17 18 struct timespec ts; 18 19 clock_gettime( … … 41 42 } \ 42 43 long long int StartTime, EndTime; \ 43 StartTime = Time();\44 StartTime = bench_time(); \ 44 45 statement; \ 45 EndTime = Time();\46 EndTime = bench_time(); \ 46 47 unsigned long long int output = \ 47 48 ( EndTime - StartTime ) / n; 48 49 49 __cfa_time_t default_preemption() { 50 #if defined(__cforall) 51 Duration default_preemption() { 50 52 return 0; 51 53 } 54 #endif -
src/benchmark/ctxswitch/cfa_cor.c
rf465f0e r779a4a3 1 1 #include <stdio.h> 2 #include <kernel> 2 3 #include <thread> 3 4 -
src/driver/Makefile.am
rf465f0e r779a4a3 11 11 ## Created On : Sun May 31 08:49:31 2015 12 12 ## Last Modified By : Peter A. Buhr 13 ## Last Modified On : Fri Oct 28 13:46:06 201614 ## Update Count : 1 013 ## Last Modified On : Mon Apr 30 17:44:17 2018 14 ## Update Count : 11 15 15 ############################################################################### 16 16 17 17 # applies to both programs 18 AM_CXXFLAGS = -Wall -O2 -g -std=c++14 18 AM_CXXFLAGS = -Wall -O2 -g -std=c++14 -I${abs_top_srcdir}/src 19 19 if BUILD_NO_LIB 20 20 else -
src/driver/Makefile.in
rf465f0e r779a4a3 294 294 295 295 # applies to both programs 296 AM_CXXFLAGS = -Wall -O2 -g -std=c++14 $(am__append_1) $(am__append_2)\297 $(am__append_ 3)296 AM_CXXFLAGS = -Wall -O2 -g -std=c++14 -I${abs_top_srcdir}/src \ 297 $(am__append_1) $(am__append_2) $(am__append_3) 298 298 cfa_SOURCES = cfa.cc 299 299 -
src/driver/cfa.cc
rf465f0e r779a4a3 10 10 // Created On : Tue Aug 20 13:44:49 2002 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Feb 5 22:05:28201813 // Update Count : 16612 // Last Modified On : Wed May 2 17:57:43 2018 13 // Update Count : 224 14 14 // 15 15 … … 19 19 #include <unistd.h> // execvp 20 20 #include <string> // STL version 21 21 #include <string.h> // strcmp 22 23 #include "Common/SemanticError.h" 22 24 #include "config.h" // configure info 23 25 … … 160 162 args[nargs] = argv[i]; // pass the argument along 161 163 nargs += 1; 164 } else if ( arg == "-w" ) { 165 args[nargs] = argv[i]; // pass the argument along 166 nargs += 1; 167 args[nargs] = ( *new string( string("-D__CFA_FLAG__=") + arg ) ).c_str(); // add the argument for cfa-cpp 168 nargs += 1; 169 } else if ( prefix( arg, "-W" ) ) { // check before next tests 170 if ( arg == "-Werror" || arg == "-Wall" ) { 171 args[nargs] = argv[i]; // pass the argument along 172 nargs += 1; 173 args[nargs] = ( *new string( string("-D__CFA_FLAG__=") + arg ) ).c_str(); // add the argument for cfa-cpp 174 nargs += 1; 175 } else { 176 unsigned int adv = prefix( arg, "-Wno-" ) ? 5 : 2; 177 args[nargs] = argv[i]; // conditionally pass the argument along 178 const char * warning = argv[i] + adv; // extract warning 179 if ( SemanticWarning_Exist( warning ) ) { // replace the argument for cfa-cpp 180 args[nargs] = ( *new string( string("-D__CFA_FLAG__=") + arg ) ).c_str(); 181 } // if 182 nargs += 1; 183 } // if 162 184 } else if ( prefix( arg, "-B" ) ) { 163 185 Bprefix = arg.substr(2); // strip the -B flag … … 247 269 #if ! defined(HAVE_LIBCFA_RELEASE) 248 270 if( !debug ) { 249 cerr << "error: Option -nodebug is notavailable, libcfa was not installed." << endl;271 cerr << "error: Option -nodebug is unavailable, libcfa was not installed." << endl; 250 272 exit( EXIT_FAILURE ); 251 273 } … … 253 275 #if ! defined(HAVE_LIBCFA_DEBUG) 254 276 if( debug ) { 255 cerr << "error: Option -debug is notavailable, libcfa-d was not installed." << endl;277 cerr << "error: Option -debug is unavailable, libcfa-d was not installed." << endl; 256 278 exit( EXIT_FAILURE ); 257 279 } -
src/libcfa/concurrency/preemption.c
rf465f0e r779a4a3 404 404 } 405 405 406 //============================================================================================= 407 // Kernel Signal Debug 408 //============================================================================================= 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 406 425 // Local Variables: // 407 426 // mode: c // -
src/libcfa/concurrency/thread
rf465f0e r779a4a3 20 20 21 21 #include "coroutine" 22 #include "kernel" 22 23 #include "monitor" 23 24 -
src/libcfa/interpose.c
rf465f0e r779a4a3 10 10 // Created On : Wed Mar 29 16:10:31 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T hu Feb 8 16:18:09201813 // Update Count : 7512 // Last Modified On : Tue May 1 15:05:35 2018 13 // Update Count : 83 14 14 // 15 15 … … 95 95 void sigHandler_fpe ( __CFA_SIGPARMS__ ); 96 96 void sigHandler_abort( __CFA_SIGPARMS__ ); 97 void sigHandler_term ( __CFA_SIGPARMS__ ); 97 98 98 99 struct { … … 114 115 __cfaabi_sigaction( SIGFPE , sigHandler_fpe , SA_SIGINFO ); // Failure handler 115 116 __cfaabi_sigaction( SIGABRT, sigHandler_abort, SA_SIGINFO ); // Failure handler 117 __cfaabi_sigaction( SIGTERM, sigHandler_term , SA_SIGINFO ); // Failure handler 118 __cfaabi_sigaction( SIGINT , sigHandler_term , SA_SIGINFO ); // Failure handler 116 119 } 117 120 } … … 268 271 } 269 272 273 void sigHandler_term( __CFA_SIGPARMS__ ) { 274 abort( "Application stopped by %s signal.", sig == SIGINT ? "an interrupt (SIGINT)" : "a terminate (SIGTERM)" ); 275 } 276 270 277 // Local Variables: // 271 278 // mode: c // -
src/main.cc
rf465f0e r779a4a3 1 2 1 // 3 2 // Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo … … 11 10 // Created On : Fri May 15 23:12:02 2015 12 11 // Last Modified By : Peter A. Buhr 13 // Last Modified On : Tue Oct 31 12:22:40 201714 // Update Count : 4 4512 // Last Modified On : Wed May 2 14:59:02 2018 13 // Update Count : 490 15 14 // 16 15 … … 35 34 #include "CodeTools/DeclStats.h" // for printDeclStats 36 35 #include "CodeTools/TrackLoc.h" // for fillLocations 36 #include "Common/CompilerError.h" // for CompilerError 37 #include "Common/Heap.h" 37 38 #include "Common/PassVisitor.h" 38 #include "Common/CompilerError.h" // for CompilerError39 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 // } // for 181 177 182 parse_cmdline( argc, argv, filename ); // process command-line arguments 178 183 CodeGen::FixMain::setReplaceMain( !nomainp ); … … 354 359 OPTPRINT( "end" ) 355 360 361 356 362 if ( output != &cout ) { 357 363 delete output; … … 384 390 385 391 deleteAll( translationUnit ); 392 HeapStats::printStats(); 386 393 return 0; 387 394 } // main … … 416 423 opterr = 0; // (global) prevent getopt from printing error messages 417 424 425 bool Werror = false; 418 426 int c; 419 while ( (c = getopt_long( argc, argv, "abBcCdefgGlLmnNpqrstTv yzZD:F:", long_opts, &long_index )) != -1 ) {427 while ( (c = getopt_long( argc, argv, "abBcCdefgGlLmnNpqrstTvwW:yzZD:F:", long_opts, &long_index )) != -1 ) { 420 428 switch ( c ) { 421 429 case Ast: … … 453 461 yydebug = true; 454 462 break; 455 case 'G': 463 case 'G': // dump AST after instantiate generics 456 464 genericsp = true; 457 465 break; … … 501 509 case 'v': // dump AST after decl validation pass 502 510 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 } // if 529 SemanticWarning_Set( warning, s ); 530 } // if 503 531 break; 504 532 case 'y': // dump AST on error … … 530 558 } // switch 531 559 } // while 560 561 if ( Werror ) { 562 SemanticWarning_WarningAsError(); 563 } // if 564 // for ( const auto w : WarningFormats ) { 565 // cout << w.name << ' ' << (int)w.severity << endl; 566 // } // for 532 567 } // parse_cmdline 533 568 -
src/tests/concurrent/examples/boundedBufferEXT.c
rf465f0e r779a4a3 8 8 // Created On : Wed Apr 18 22:52:12 2018 9 9 // Last Modified By : Peter A. Buhr 10 // Last Modified On : Fri Apr 20 22:25:14201811 // Update Count : 610 // Last Modified On : Wed May 2 16:12:58 2018 11 // Update Count : 7 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 }; 24 forall( otype T ) { 25 monitor Buffer { 26 int front, back, count; 27 T elements[BufferSize]; 28 }; // Buffer 29 29 30 forall( otype T ) 31 void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; } 30 void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; } 32 31 33 forall( otype T ) 34 int query( Buffer(T) & buffer ) { return buffer.count; } 32 int query( Buffer(T) & buffer ) { return buffer.count; } // read-only, no mutual exclusion 35 33 36 forall( otype T ) // forward 37 T remove( Buffer(T) & mutex buffer ); 34 T remove( Buffer(T) & mutex buffer ); // forward 38 35 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 } 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 46 42 47 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;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 } // remove 54 50 } 55 51 -
src/tests/concurrent/examples/boundedBufferINT.c
rf465f0e r779a4a3 8 8 // Created On : Mon Oct 30 12:45:13 2017 9 9 // Last Modified By : Peter A. Buhr 10 // Last Modified On : Fri Apr 20 22:18:18201811 // Update Count : 7810 // Last Modified On : Thu Apr 26 23:08:17 2018 11 // Update Count : 82 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 }; 24 forall( otype T ) { 25 monitor Buffer { 26 condition full, empty; 27 int front, back, count; 28 T elements[BufferSize]; 29 }; // Buffer 30 30 31 forall( otype T ) 32 void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; } 31 void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; } 33 32 34 forall( otype T ) 35 int query( Buffer(T) & buffer ) { return buffer.count; } 33 int query( Buffer(T) & buffer ) { return buffer.count; } // read-only, no mutual exclusion 36 34 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 } 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 45 42 46 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;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 } // remove 54 51 } 55 52 -
src/tests/concurrent/preempt.c
rf465f0e r779a4a3 17 17 #endif 18 18 19 extern void __cfaabi_check_preemption(); 20 19 21 static volatile int counter = 0; 20 22 … … 29 31 void main(worker_t & this) { 30 32 while(counter < N) { 33 __cfaabi_check_preemption(); 31 34 if( (counter % 7) == this.value ) { 35 __cfaabi_check_preemption(); 32 36 int next = __atomic_add_fetch_4(&counter, 1, __ATOMIC_SEQ_CST); 37 __cfaabi_check_preemption(); 33 38 if( (next % 100) == 0 ) printf("%d\n", (int)next); 39 __cfaabi_check_preemption(); 34 40 } 41 __cfaabi_check_preemption(); 35 42 } 36 43 }
Note: See TracChangeset
for help on using the changeset viewer.