Changes in / [45c43e5:17fc7a5]
- Files:
-
- 3 deleted
- 24 edited
-
doc/papers/general/Paper.tex (modified) (12 diffs)
-
src/Parser/DeclarationNode.cc (modified) (3 diffs)
-
src/Parser/ParseNode.h (modified) (4 diffs)
-
src/Parser/TypeData.cc (modified) (4 diffs)
-
src/Parser/TypeData.h (modified) (2 diffs)
-
src/Parser/lex.ll (modified) (2 diffs)
-
src/Parser/parser.yy (modified) (13 diffs)
-
src/benchmark/bench.h (modified) (2 diffs)
-
src/libcfa/Makefile.am (modified) (1 diff)
-
src/libcfa/Makefile.in (modified) (2 diffs)
-
src/libcfa/bits/cfatime.h (modified) (2 diffs)
-
src/libcfa/concurrency/coroutine.c (modified) (2 diffs)
-
src/libcfa/concurrency/kernel (modified) (2 diffs)
-
src/libcfa/concurrency/kernel.c (modified) (20 diffs)
-
src/libcfa/concurrency/kernel_private.h (modified) (2 diffs)
-
src/libcfa/concurrency/preemption.c (modified) (8 diffs)
-
src/libcfa/concurrency/preemption.h (modified) (1 diff)
-
src/libcfa/concurrency/thread.c (modified) (1 diff)
-
src/libcfa/exception.c (modified) (10 diffs)
-
src/libcfa/exception.h (modified) (5 diffs)
-
src/libcfa/stdhdr/math.h (modified) (1 diff)
-
src/prelude/builtins.c (modified) (1 diff)
-
src/tests/.expect/counter.txt (deleted)
-
src/tests/counter.c (deleted)
-
tools/Makefile.am (modified) (1 diff)
-
tools/Makefile.in (modified) (6 diffs)
-
tools/busy.c (deleted)
Legend:
- Unmodified
- Added
- Removed
-
doc/papers/general/Paper.tex
r45c43e5 r17fc7a5 41 41 42 42 \newcommand{\Textbf}[2][red]{{\color{#1}{\textbf{#2}}}} 43 %\newcommand{\TODO}[1]{\textbf{TODO}: {\itshape #1}} % TODO included44 \newcommand{\TODO}[1]{} % TODO elided43 \newcommand{\TODO}[1]{\textbf{TODO}: {\itshape #1}} % TODO included 44 %\newcommand{\TODO}[1]{} % TODO elided 45 45 46 46 % Default underscore is too low and wide. Cannot use lstlisting "literate" as replacing underscore … … 117 117 _Alignas, _Alignof, __alignof, __alignof__, asm, __asm, __asm__, _At, __attribute, 118 118 __attribute__, auto, _Bool, catch, catchResume, choose, _Complex, __complex, __complex__, 119 __const, __const__, disable, dtype, enable, exception,__extension__, fallthrough, fallthru,119 __const, __const__, disable, dtype, enable, __extension__, fallthrough, fallthru, 120 120 finally, forall, ftype, _Generic, _Imaginary, inline, __label__, lvalue, _Noreturn, one_t, 121 121 otype, restrict, _Static_assert, throw, throwResume, trait, try, ttype, typeof, __typeof, … … 261 261 The macro wrapping the generic expression imposes some limitations; as an example, it could not implement the example above, because the variables @max@ would collide with the functions @max@. 262 262 Ergonomic limitations of @_Generic@ include the necessity to put a fixed list of supported types in a single place and manually dispatch to appropriate overloads, as well as possible namespace pollution from the functions dispatched to, which must all have distinct names. 263 Though name-overloading removes a major use-case for @_Generic@ expressions, \CFA does implement @_Generic@ for backwards-compatibility purposes. \TODO{actually implement that}264 263 265 264 % http://fanf.livejournal.com/144696.html … … 1357 1356 \subsection{Exception Handling} 1358 1357 1359 The following framework for \CFA exception handling is in place, excluding a run-time type information and dynamic casts. 1360 \CFA provides two forms of exception handling: \newterm{fix-up} and \newterm{recovery} (see Figure~\ref{f:CFAExceptionHandling}). 1358 \CFA provides two forms of exception handling: \newterm{resumption} (fix-up) and \newterm{recovery} (see Figure~\ref{f:CFAExceptionHandling}). 1361 1359 Both mechanisms provide dynamic call to a handler using dynamic name-lookup, where fix-up has dynamic return and recovery has static return from the handler. 1362 \CFA restricts exception types to those defined by aggregate type @ exception@.1360 \CFA restricts exception types to those defined by aggregate type @_Exception@. 1363 1361 The form of the raise dictates the set of handlers examined during propagation: \newterm{resumption propagation} (@resume@) only examines resumption handlers (@catchResume@); \newterm{terminating propagation} (@throw@) only examines termination handlers (@catch@). 1364 1362 If @resume@ or @throw@ have no exception type, it is a reresume/rethrow, meaning the currently exception continues propagation. 1365 If there is no current exception, the reresume/rethrow results in a runtimeerror.1363 If there is no current exception, the reresume/rethrow results in an error. 1366 1364 1367 1365 \begin{figure} … … 1371 1369 \multicolumn{1}{c@{\hspace{\parindentlnth}}}{\textbf{Resumption}} & \multicolumn{1}{c}{\textbf{Recovery}} \\ 1372 1370 \begin{cfa} 1373 ` exception R { int fix; };`1371 `_Exception R { int fix; };` 1374 1372 void f() { 1375 1373 R r; 1376 1374 ... `resume( r );` ... 1377 1375 ... r.fix // control does return here after handler 1378 }1379 1376 `try` { 1380 1377 ... f(); ... … … 1385 1382 & 1386 1383 \begin{cfa} 1387 ` exception T {};`1384 `_Exception T {};` 1388 1385 void f() { 1389 1386 1390 1387 ... `throw( T{} );` ... 1391 1388 // control does NOT return here after handler 1392 }1393 1389 `try` { 1394 1390 ... f(); ... … … 1423 1419 ... write( `datafile`, ... ); ... $\C{// may throw IOError}$ 1424 1420 ... write( `logfile`, ... ); ... 1425 } catch ( IOError err; `err .file== datafile` ) { ... } $\C{// handle datafile error}$1426 catch ( IOError err; `err .file== logfile` ) { ... } $\C{// handle logfile error}$1421 } catch ( IOError err; `err == datafile` ) { ... } $\C{// handle datafile error}$ 1422 catch ( IOError err; `err == logfile` ) { ... } $\C{// handle logfile error}$ 1427 1423 catch ( IOError err ) { ... } $\C{// handler error from other files}$ 1428 1424 \end{cfa} … … 1432 1428 The resumption raise can specify an alternate stack on which to raise an exception, called a \newterm{nonlocal raise}: 1433 1429 \begin{cfa} 1434 resume( $\emph{exception-type}$, $\emph{alternate-stack}$ ) 1435 resume( $\emph{alternate-stack}$ ) 1436 \end{cfa} 1437 These overloads of @resume@ raise the specified exception or the currently propagating exception (reresume) at another coroutine or task~\cite{Delisle18}. 1430 resume [ $\emph{exception-type}$ ] [ _At $\emph{alternate-stack}$ ] ; 1431 \end{cfa} 1432 The @_At@ clause raises the specified exception or the currently propagating exception (reresume) at another coroutine or task~\cite{Delisle18}. 1438 1433 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 handle returns. 1439 1434 … … 1626 1621 \lstMakeShortInline@% 1627 1622 \end{cquote} 1628 Specifiers must appear at the start of a \CFA routine declaration\footnote{\label{StorageClassSpecifier} 1623 Specifiers must appear at the start of a \CFA routine declaration\footnote{\label{StorageClassSpecifier}. 1629 1624 The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.~\cite[\S~6.11.5(1)]{C11}}. 1630 1625 … … 1681 1676 * [ * int, int ] ( int ) jp; $\C{// pointer to routine returning pointer to int and int, with int parameter}$ 1682 1677 \end{cfa} 1683 Note, a routine name cannot be specified:1678 Note, \emph{a routine name cannot be specified}: 1684 1679 \begin{cfa} 1685 1680 * [ int x ] f () fp; $\C{// routine name "f" is disallowed}$ … … 1989 1984 1990 1985 In C, @0@ has the special property that it is the only ``false'' value; by the standard, any value which compares equal to @0@ is false, while any value that compares unequal to @0@ is true. 1991 As such, an expression @x@ in any boolean context (such as the condition of an @if@ or @while@ statement, or the arguments to @&&@, @||@, or @?:@) can be rewritten as @x != 0@ without changing its semantics.1986 As such, an expression @x@ in any boolean context (such as the condition of an @if@ or @while@ statement, or the arguments to an @&&@, @||@, or ternary operator) can be rewritten as @x != 0@ without changing its semantics. 1992 1987 The operator overloading feature of \CFA provides a natural means to implement this truth value comparison for arbitrary types, but the C type system is not precise enough to distinguish an equality comparison with @0@ from an equality comparison with an arbitrary integer or pointer. 1993 To provide this precision, \CFA introduces a new type @zero_t@ as type type of literal @0@ (somewhat analagous to @nullptr_t@ and @nullptr@ in \CCeleven); @zero_t@ can only take the value @0@, but has implicit conversions to the integer and pointer types so that C code involving @0@ continues to work properly.1988 To provide this precision, \CFA introduces a new type @zero_t@ as type type of literal @0@ (somewhat analagous to @nullptr_t@ and @nullptr@ in \CCeleven); @zero_t@ can only take the value @0@, but has implicit conversions to the integer and pointer types so that standard C code involving @0@ continues to work properly. 1994 1989 With this addition, the \CFA compiler rewrites @if (x)@ and similar expressions to @if ((x) != 0)@ or the appropriate analogue, and any type @T@ can be made ``truthy'' by defining an operator overload @int ?!=?(T, zero_t)@. 1995 1990 \CC makes types truthy by adding a conversion to @bool@; prior to the addition of explicit cast operators in \CCeleven this approach had the pitfall of making truthy types transitively convertable to any numeric type; our design for \CFA avoids this issue. … … 2619 2614 \section{Acknowledgments} 2620 2615 2621 The authors would like to recognize the design assistance of Glen Ditchfield, Richard Bilson, and Thierry Delisle on the features described in this paper, and thank Magnus Madsen for feedback in the writing.2616 The authors would like to recognize the design assistance of Glen Ditchfield, Richard Bilson, and Thierry Delisle on the features described in this paper, and thank Magnus Madsen and the three anonymous reviewers for valuable feedback. 2622 2617 %This work is supported in part by a corporate partnership with \grantsponsor{Huawei}{Huawei Ltd.}{http://www.huawei.com}, and Aaron Moss and Peter Buhr are funded by the \grantsponsor{Natural Sciences and Engineering Research Council} of Canada. 2623 2618 % the first author's \grantsponsor{NSERC-PGS}{NSERC PGS D}{http://www.nserc-crsng.gc.ca/Students-Etudiants/PG-CS/BellandPostgrad-BelletSuperieures_eng.asp} scholarship. -
src/Parser/DeclarationNode.cc
r45c43e5 r17fc7a5 10 10 // Created On : Sat May 16 12:34:05 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 22 15:37:17 201813 // Update Count : 103 312 // Last Modified On : Mon Nov 20 09:21:52 2017 13 // Update Count : 1031 14 14 // 15 15 … … 120 120 } // DeclarationNode::clone 121 121 122 bool DeclarationNode::get_hasEllipsis() const { 123 return hasEllipsis; 124 } 125 122 126 void DeclarationNode::print( std::ostream &os, int indent ) const { 123 127 os << string( indent, ' ' ); … … 163 167 } 164 168 165 DeclarationNode * DeclarationNode::newFunction( string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body ) {169 DeclarationNode * DeclarationNode::newFunction( string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body, bool newStyle ) { 166 170 DeclarationNode * newnode = new DeclarationNode; 167 171 newnode->name = name; 168 172 newnode->type = new TypeData( TypeData::Function ); 169 173 newnode->type->function.params = param; 174 newnode->type->function.newStyle = newStyle; 170 175 newnode->type->function.body = body; 171 176 -
src/Parser/ParseNode.h
r45c43e5 r17fc7a5 10 10 // Created On : Sat May 16 13:28:16 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 22 17:49:31 201813 // Update Count : 82 712 // Last Modified On : Mon Nov 27 17:33:35 2017 13 // Update Count : 824 14 14 // 15 15 … … 209 209 enum Length { Short, Long, LongLong, NoLength }; 210 210 static const char * lengthNames[]; 211 enum Aggregate { Struct, Union, Exception,Trait, Coroutine, Monitor, Thread, NoAggregate };211 enum Aggregate { Struct, Union, Trait, Coroutine, Monitor, Thread, NoAggregate }; 212 212 static const char * aggregateNames[]; 213 213 enum TypeClass { Otype, Dtype, Ftype, Ttype, NoTypeClass }; … … 226 226 static DeclarationNode * newForall( DeclarationNode * ); 227 227 static DeclarationNode * newFromTypedef( std::string * ); 228 static DeclarationNode * newFunction( std::string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body );228 static DeclarationNode * newFunction( std::string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body, bool newStyle = false ); 229 229 static DeclarationNode * newAggregate( Aggregate kind, const std::string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body ); 230 230 static DeclarationNode * newEnum( std::string * name, DeclarationNode * constants, bool body ); … … 288 288 Type * buildType() const; 289 289 290 bool get_hasEllipsis() const; 290 291 LinkageSpec::Spec get_linkage() const { return linkage; } 291 292 DeclarationNode * extractAggregate() const; -
src/Parser/TypeData.cc
r45c43e5 r17fc7a5 10 10 // Created On : Sat May 16 15:12:51 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 22 15:49:00 201813 // Update Count : 5 9712 // Last Modified On : Mon Sep 25 18:33:41 2017 13 // Update Count : 587 14 14 // 15 15 … … 54 54 function.oldDeclList = nullptr; 55 55 function.body = nullptr; 56 function.newStyle = false; 56 57 function.withExprs = nullptr; 57 58 break; … … 194 195 newtype->function.oldDeclList = maybeClone( function.oldDeclList ); 195 196 newtype->function.body = maybeClone( function.body ); 197 newtype->function.newStyle = function.newStyle; 196 198 newtype->function.withExprs = maybeClone( function.withExprs ); 197 199 break; … … 879 881 FunctionType * buildFunction( const TypeData * td ) { 880 882 assert( td->kind == TypeData::Function ); 881 FunctionType * ft = new FunctionType( buildQualifiers( td ), ! td->function.params || td->function.params->hasEllipsis ); 883 bool hasEllipsis = td->function.params ? td->function.params->get_hasEllipsis() : true; 884 if ( ! td->function.params ) hasEllipsis = ! td->function.newStyle; 885 FunctionType * ft = new FunctionType( buildQualifiers( td ), hasEllipsis ); 882 886 buildList( td->function.params, ft->get_parameters() ); 883 887 buildForall( td->forall, ft->get_forall() ); -
src/Parser/TypeData.h
r45c43e5 r17fc7a5 10 10 // Created On : Sat May 16 15:18:36 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 22 15:21:23 201813 // Update Count : 19 112 // Last Modified On : Fri Sep 1 23:33:45 2017 13 // Update Count : 190 14 14 // 15 15 … … 64 64 mutable DeclarationNode * oldDeclList; 65 65 StatementNode * body; 66 bool newStyle; 66 67 ExpressionNode * withExprs; // expressions from function's with_clause 67 68 }; -
src/Parser/lex.ll
r45c43e5 r17fc7a5 10 10 * Created On : Sat Sep 22 08:58:10 2001 11 11 * Last Modified By : Peter A. Buhr 12 * Last Modified On : Thu Feb 22 18:11:27 201813 * Update Count : 63 712 * Last Modified On : Wed Oct 25 13:53:56 2017 13 * Update Count : 634 14 14 */ 15 15 … … 232 232 enum { KEYWORD_RETURN(ENUM); } 233 233 __extension__ { KEYWORD_RETURN(EXTENSION); } // GCC 234 exception { KEYWORD_RETURN(EXCEPTION); } // CFA235 234 extern { KEYWORD_RETURN(EXTERN); } 236 235 fallthru { KEYWORD_RETURN(FALLTHRU); } // CFA -
src/Parser/parser.yy
r45c43e5 r17fc7a5 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 22 17:48:54201813 // Update Count : 30 2812 // Last Modified On : Thu Feb 15 17:12:31 2018 13 // Update Count : 3006 14 14 // 15 15 … … 187 187 %token TYPEOF LABEL // GCC 188 188 %token ENUM STRUCT UNION 189 %token EXCEPTION // CFA190 189 %token COROUTINE MONITOR THREAD // CFA 191 190 %token OTYPE FTYPE DTYPE TTYPE TRAIT // CFA … … 315 314 %type<decl> cfa_identifier_parameter_declarator_tuple cfa_identifier_parameter_ptr 316 315 317 %type<decl> cfa_parameter_declaration cfa_parameter_list cfa_parameter_type_list _opt316 %type<decl> cfa_parameter_declaration cfa_parameter_list cfa_parameter_type_list cfa_parameter_type_list_opt 318 317 319 318 %type<decl> cfa_typedef_declaration cfa_variable_declaration cfa_variable_specifier … … 323 322 %type<decl> KR_declaration_list KR_declaration_list_opt 324 323 325 %type<decl> parameter_declaration parameter_list parameter_type_list_opt 324 %type<decl> parameter_declaration parameter_list parameter_type_list 325 %type<decl> parameter_type_list_opt 326 326 327 327 %type<decl> paren_identifier paren_type … … 779 779 | unary_expression assignment_operator assignment_expression 780 780 { $$ = new ExpressionNode( build_binary_val( $2, $1, $3 ) ); } 781 | unary_expression '=' '{' initializer_list comma_opt '}' 782 { throw SemanticError( yylloc, "Initializer assignment is currently unimplemented." ); $$ = nullptr; } // FIX ME781 | unary_expression '=' '{' initializer_list comma_opt '}' // FIX ME 782 { $$ = nullptr; } 783 783 ; 784 784 … … 849 849 | waitfor_statement 850 850 | exception_statement 851 | enable_disable_statement852 { throw SemanticError( yylloc, "enable/disable statement is currently unimplemented." ); $$ = nullptr; } // FIX ME853 851 | asm_statement 854 852 ; … … 1066 1064 | RETURN comma_expression_opt ';' 1067 1065 { $$ = new StatementNode( build_return( $2 ) ); } 1068 | RETURN '{' initializer_list comma_opt '}' 1069 { throw SemanticError( yylloc, "Initializer return is currently unimplemented." ); $$ = nullptr; } // FIX ME1066 | RETURN '{' initializer_list comma_opt '}' // FIX ME 1067 { $$ = nullptr; } 1070 1068 | THROW assignment_expression_opt ';' // handles rethrow 1071 1069 { $$ = new StatementNode( build_throw( $2 ) ); } … … 1195 1193 ; 1196 1194 1197 enable_disable_statement:1198 enable_disable_key identifier_list compound_statement1199 ;1200 1201 enable_disable_key:1202 ENABLE1203 | DISABLE1204 ;1205 1206 1195 asm_statement: 1207 1196 ASM asm_volatile_opt '(' string_literal ')' ';' … … 1403 1392 DeclarationNode * ret = new DeclarationNode; 1404 1393 ret->type = maybeClone( $1->type->base ); 1405 $$ = $1->appendList( DeclarationNode::newFunction( $5, ret, $8, nullptr ) );1394 $$ = $1->appendList( DeclarationNode::newFunction( $5, ret, $8, nullptr, true ) ); 1406 1395 } 1407 1396 ; … … 1433 1422 // To obtain LR(1 ), this rule must be factored out from function return type (see cfa_abstract_declarator). 1434 1423 { 1435 $$ = DeclarationNode::newFunction( $2, $1, $5, 0 );1424 $$ = DeclarationNode::newFunction( $2, $1, $5, 0, true ); 1436 1425 } 1437 1426 | cfa_function_return identifier_or_type_name '(' push cfa_parameter_type_list_opt pop ')' 1438 1427 { 1439 $$ = DeclarationNode::newFunction( $2, $1, $5, 0 );1428 $$ = DeclarationNode::newFunction( $2, $1, $5, 0, true ); 1440 1429 } 1441 1430 ; … … 1892 1881 | UNION 1893 1882 { $$ = DeclarationNode::Union; } 1894 | EXCEPTION1895 { $$ = DeclarationNode::Exception; }1896 1883 | COROUTINE 1897 1884 { $$ = DeclarationNode::Coroutine; } … … 2003 1990 ; 2004 1991 2005 cfa_parameter_type_list_opt: // CFA, abstract + real 1992 // Minimum of one parameter after which ellipsis is allowed only at the end. 1993 1994 cfa_parameter_type_list_opt: // CFA 2006 1995 // empty 2007 { $$ = DeclarationNode::newBasicType( DeclarationNode::Void ); }2008 | ELLIPSIS2009 1996 { $$ = nullptr; } 2010 | cfa_abstract_parameter_list 1997 | cfa_parameter_type_list 1998 ; 1999 2000 cfa_parameter_type_list: // CFA, abstract + real 2001 cfa_abstract_parameter_list 2011 2002 | cfa_parameter_list 2012 2003 | cfa_parameter_list pop ',' push cfa_abstract_parameter_list … … 2039 2030 // empty 2040 2031 { $$ = nullptr; } 2041 | ELLIPSIS 2042 { $$ = nullptr; } 2043 | parameter_list 2032 | parameter_type_list 2033 ; 2034 2035 parameter_type_list: 2036 parameter_list 2044 2037 | parameter_list pop ',' push ELLIPSIS 2045 2038 { $$ = $1->addVarArgs(); } -
src/benchmark/bench.h
r45c43e5 r17fc7a5 10 10 #if defined(__cforall) 11 11 } 12 #include <bits/cfatime.h>13 12 #endif 14 15 13 16 14 static inline unsigned long long int Time() { … … 47 45 ( EndTime - StartTime ) / n; 48 46 49 __cfa_time_t default_preemption() {47 unsigned int default_preemption() { 50 48 return 0; 51 49 } -
src/libcfa/Makefile.am
r45c43e5 r17fc7a5 101 101 gmp \ 102 102 bits/align.h \ 103 bits/cfatime.h \104 103 bits/containers.h \ 105 104 bits/defs.h \ -
src/libcfa/Makefile.in
r45c43e5 r17fc7a5 264 264 concurrency/thread concurrency/kernel concurrency/monitor \ 265 265 ${shell find stdhdr -type f -printf "%p "} math gmp \ 266 bits/align.h bits/c fatime.h bits/containers.h bits/defs.h \267 bits/ debug.h bits/locks.h concurrency/invoke.h266 bits/align.h bits/containers.h bits/defs.h bits/debug.h \ 267 bits/locks.h concurrency/invoke.h 268 268 HEADERS = $(nobase_cfa_include_HEADERS) 269 269 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) … … 437 437 gmp \ 438 438 bits/align.h \ 439 bits/cfatime.h \440 439 bits/containers.h \ 441 440 bits/defs.h \ -
src/libcfa/bits/cfatime.h
r45c43e5 r17fc7a5 48 48 // ctors 49 49 static inline void ?{}( __cfa_time_t & this ) { this.val = 0; } 50 static inline void ?{}( __cfa_time_t & this, const __cfa_time_t & rhs ) { this.val = rhs.val; }51 50 static inline void ?{}( __cfa_time_t & this, zero_t zero ) { this.val = 0; } 52 51 … … 93 92 static inline __cfa_time_t from_us ( uint64_t val ) { __cfa_time_t ret; ret.val = val * 1_000ul; return ret; } 94 93 static inline __cfa_time_t from_ns ( uint64_t val ) { __cfa_time_t ret; ret.val = val * 1ul; return ret; } 95 96 static inline uint64_t to_s ( __cfa_time_t t ) { return t.val / 1_000_000_000ul; }97 static inline uint64_t to_ms ( __cfa_time_t t ) { return t.val / 1_000_000ul; }98 static inline uint64_t to_us ( __cfa_time_t t ) { return t.val / 1_000ul; }99 static inline uint64_t to_ns ( __cfa_time_t t ) { return t.val / 1ul; } -
src/libcfa/concurrency/coroutine.c
r45c43e5 r17fc7a5 99 99 // Wrapper for co 100 100 void CoroutineCtxSwitch(coroutine_desc* src, coroutine_desc* dst) { 101 verify( preemption _state.enabled || this_processor->do_terminate );101 verify( preemption.enabled || this_processor->do_terminate ); 102 102 disable_interrupts(); 103 103 … … 117 117 118 118 enable_interrupts( __cfaabi_dbg_ctx ); 119 verify( preemption _state.enabled || this_processor->do_terminate );119 verify( preemption.enabled || this_processor->do_terminate ); 120 120 } //ctxSwitchDirect 121 121 -
src/libcfa/concurrency/kernel
r45c43e5 r17fc7a5 19 19 20 20 #include "invoke.h" 21 #include "bits/cfatime.h"22 21 23 22 extern "C" { … … 49 48 50 49 // Preemption rate on this cluster 51 __cfa_time_t preemption_rate;50 unsigned long long int preemption; 52 51 }; 53 54 extern __cfa_time_t default_preemption();55 52 56 53 void ?{} (cluster & this); -
src/libcfa/concurrency/kernel.c
r45c43e5 r17fc7a5 60 60 // volatile thread_local unsigned short disable_preempt_count = 1; 61 61 62 volatile thread_local __cfa_kernel_preemption_ state_t preemption_state= { false, false, 1 };62 volatile thread_local __cfa_kernel_preemption_data_t preemption = { false, false, 1 }; 63 63 64 64 //----------------------------------------------------------------------------- … … 180 180 ready_queue_lock{}; 181 181 182 preemption _rate= default_preemption();182 preemption = default_preemption(); 183 183 } 184 184 … … 209 209 if(readyThread) 210 210 { 211 verify( !preemption _state.enabled );211 verify( !preemption.enabled ); 212 212 213 213 runThread(this, readyThread); 214 214 215 verify( !preemption _state.enabled );215 verify( !preemption.enabled ); 216 216 217 217 //Some actions need to be taken from the kernel … … 262 262 void finishRunning(processor * this) with( this->finish ) { 263 263 if( action_code == Release ) { 264 verify( !preemption _state.enabled );264 verify( !preemption.enabled ); 265 265 unlock( *lock ); 266 266 } … … 269 269 } 270 270 else if( action_code == Release_Schedule ) { 271 verify( !preemption _state.enabled );271 verify( !preemption.enabled ); 272 272 unlock( *lock ); 273 273 ScheduleThread( thrd ); 274 274 } 275 275 else if( action_code == Release_Multi ) { 276 verify( !preemption _state.enabled );276 verify( !preemption.enabled ); 277 277 for(int i = 0; i < lock_count; i++) { 278 278 unlock( *locks[i] ); … … 306 306 this_coroutine = NULL; 307 307 this_thread = NULL; 308 preemption _state.enabled = false;309 preemption _state.disable_count = 1;308 preemption.enabled = false; 309 preemption.disable_count = 1; 310 310 // SKULLDUGGERY: We want to create a context for the processor coroutine 311 311 // which is needed for the 2-step context switch. However, there is no reason … … 351 351 coroutine_desc * dst = get_coroutine(*this->runner); 352 352 353 verify( !preemption _state.enabled );353 verify( !preemption.enabled ); 354 354 355 355 create_stack(&dst->stack, dst->stack.size); 356 356 CtxStart(this->runner, CtxInvokeCoroutine); 357 357 358 verify( !preemption _state.enabled );358 verify( !preemption.enabled ); 359 359 360 360 dst->last = src; … … 382 382 src->state = Active; 383 383 384 verify( !preemption _state.enabled );384 verify( !preemption.enabled ); 385 385 } 386 386 … … 392 392 verify( thrd->self_cor.state != Halted ); 393 393 394 verify( !preemption _state.enabled );394 verify( !preemption.enabled ); 395 395 396 396 verifyf( thrd->next == NULL, "Expected null got %p", thrd->next ); … … 402 402 } 403 403 404 verify( !preemption _state.enabled );404 verify( !preemption.enabled ); 405 405 } 406 406 407 407 thread_desc * nextThread(cluster * this) with( *this ) { 408 verify( !preemption _state.enabled );408 verify( !preemption.enabled ); 409 409 lock( ready_queue_lock __cfaabi_dbg_ctx2 ); 410 410 thread_desc * head = pop_head( ready_queue ); 411 411 unlock( ready_queue_lock ); 412 verify( !preemption _state.enabled );412 verify( !preemption.enabled ); 413 413 return head; 414 414 } … … 416 416 void BlockInternal() { 417 417 disable_interrupts(); 418 verify( !preemption _state.enabled );418 verify( !preemption.enabled ); 419 419 returnToKernel(); 420 verify( !preemption _state.enabled );420 verify( !preemption.enabled ); 421 421 enable_interrupts( __cfaabi_dbg_ctx ); 422 422 } … … 427 427 this_processor->finish.lock = lock; 428 428 429 verify( !preemption _state.enabled );429 verify( !preemption.enabled ); 430 430 returnToKernel(); 431 verify( !preemption _state.enabled );431 verify( !preemption.enabled ); 432 432 433 433 enable_interrupts( __cfaabi_dbg_ctx ); … … 439 439 this_processor->finish.thrd = thrd; 440 440 441 verify( !preemption _state.enabled );441 verify( !preemption.enabled ); 442 442 returnToKernel(); 443 verify( !preemption _state.enabled );443 verify( !preemption.enabled ); 444 444 445 445 enable_interrupts( __cfaabi_dbg_ctx ); … … 453 453 this_processor->finish.thrd = thrd; 454 454 455 verify( !preemption _state.enabled );455 verify( !preemption.enabled ); 456 456 returnToKernel(); 457 verify( !preemption _state.enabled );457 verify( !preemption.enabled ); 458 458 459 459 enable_interrupts( __cfaabi_dbg_ctx ); … … 466 466 this_processor->finish.lock_count = count; 467 467 468 verify( !preemption _state.enabled );468 verify( !preemption.enabled ); 469 469 returnToKernel(); 470 verify( !preemption _state.enabled );470 verify( !preemption.enabled ); 471 471 472 472 enable_interrupts( __cfaabi_dbg_ctx ); … … 481 481 this_processor->finish.thrd_count = thrd_count; 482 482 483 verify( !preemption _state.enabled );483 verify( !preemption.enabled ); 484 484 returnToKernel(); 485 verify( !preemption _state.enabled );485 verify( !preemption.enabled ); 486 486 487 487 enable_interrupts( __cfaabi_dbg_ctx ); … … 489 489 490 490 void LeaveThread(__spinlock_t * lock, thread_desc * thrd) { 491 verify( !preemption _state.enabled );491 verify( !preemption.enabled ); 492 492 this_processor->finish.action_code = thrd ? Release_Schedule : Release; 493 493 this_processor->finish.lock = lock; … … 503 503 // Kernel boot procedures 504 504 void kernel_startup(void) { 505 verify( !preemption _state.enabled );505 verify( !preemption.enabled ); 506 506 __cfaabi_dbg_print_safe("Kernel : Starting\n"); 507 507 … … 548 548 __cfaabi_dbg_print_safe("Kernel : Started\n--------------------------------------------------\n\n"); 549 549 550 verify( !preemption _state.enabled );550 verify( !preemption.enabled ); 551 551 enable_interrupts( __cfaabi_dbg_ctx ); 552 verify( preemption _state.enabled );552 verify( preemption.enabled ); 553 553 } 554 554 … … 556 556 __cfaabi_dbg_print_safe("\n--------------------------------------------------\nKernel : Shutting down\n"); 557 557 558 verify( preemption _state.enabled );558 verify( preemption.enabled ); 559 559 disable_interrupts(); 560 verify( !preemption _state.enabled );560 verify( !preemption.enabled ); 561 561 562 562 // SKULLDUGGERY: Notify the mainProcessor it needs to terminates. -
src/libcfa/concurrency/kernel_private.h
r45c43e5 r17fc7a5 78 78 // extern volatile thread_local unsigned short disable_preempt_count; 79 79 80 struct __cfa_kernel_preemption_ state_t {80 struct __cfa_kernel_preemption_data_t { 81 81 bool enabled; 82 82 bool in_progress; … … 84 84 }; 85 85 86 extern volatile thread_local __cfa_kernel_preemption_ state_t preemption_state;86 extern volatile thread_local __cfa_kernel_preemption_data_t preemption; 87 87 88 88 //----------------------------------------------------------------------------- -
src/libcfa/concurrency/preemption.c
r45c43e5 r17fc7a5 23 23 } 24 24 25 #include "bits/cfatime.h"26 25 #include "bits/signal.h" 27 26 28 #if !defined(__CFA_DEFAULT_PREEMPTION__) 29 #define __CFA_DEFAULT_PREEMPTION__ 10 `cfa_ms30 #endif 31 32 __ cfa_time_t default_preemption() __attribute__((weak)) {27 //TODO move to defaults 28 #define __CFA_DEFAULT_PREEMPTION__ 10000 29 30 //TODO move to defaults 31 __attribute__((weak)) unsigned int default_preemption() { 33 32 return __CFA_DEFAULT_PREEMPTION__; 34 33 } … … 150 149 // Disable interrupts by incrementing the counter 151 150 void disable_interrupts() { 152 preemption _state.enabled = false;153 __attribute__((unused)) unsigned short new_val = preemption _state.disable_count + 1;154 preemption _state.disable_count = new_val;151 preemption.enabled = false; 152 __attribute__((unused)) unsigned short new_val = preemption.disable_count + 1; 153 preemption.disable_count = new_val; 155 154 verify( new_val < 65_000u ); // If this triggers someone is disabling interrupts without enabling them 156 155 } … … 162 161 thread_desc * thrd = this_thread; // Cache the thread now since interrupts can start happening after the atomic add 163 162 164 unsigned short prev = preemption _state.disable_count;165 preemption _state.disable_count -= 1;163 unsigned short prev = preemption.disable_count; 164 preemption.disable_count -= 1; 166 165 verify( prev != 0u ); // If this triggers someone is enabled already enabled interruptsverify( prev != 0u ); 167 166 168 167 // Check if we need to prempt the thread because an interrupt was missed 169 168 if( prev == 1 ) { 170 preemption _state.enabled = true;169 preemption.enabled = true; 171 170 if( proc->pending_preemption ) { 172 171 proc->pending_preemption = false; … … 182 181 // Don't execute any pending CtxSwitch even if counter reaches 0 183 182 void enable_interrupts_noPoll() { 184 unsigned short prev = preemption _state.disable_count;185 preemption _state.disable_count -= 1;183 unsigned short prev = preemption.disable_count; 184 preemption.disable_count -= 1; 186 185 verifyf( prev != 0u, "Incremented from %u\n", prev ); // If this triggers someone is enabled already enabled interrupts 187 186 if( prev == 1 ) { 188 preemption _state.enabled = true;187 preemption.enabled = true; 189 188 } 190 189 } … … 236 235 // If false : preemption is unsafe and marked as pending 237 236 static inline bool preemption_ready() { 238 bool ready = preemption _state.enabled && !preemption_state.in_progress; // Check if preemption is safe237 bool ready = preemption.enabled && !preemption.in_progress; // Check if preemption is safe 239 238 this_processor->pending_preemption = !ready; // Adjust the pending flag accordingly 240 239 return ready; … … 251 250 252 251 // Start with preemption disabled until ready 253 preemption _state.enabled = false;254 preemption _state.disable_count = 1;252 preemption.enabled = false; 253 preemption.disable_count = 1; 255 254 256 255 // Initialize the event kernel … … 295 294 this.proc->preemption_alarm = &this.alarm; 296 295 297 update_preemption( this.proc, this.proc->cltr->preemption_rate);296 update_preemption( this.proc, from_us(this.proc->cltr->preemption) ); 298 297 } 299 298 … … 331 330 __cfaabi_dbg_print_buffer_decl( " KERNEL: preempting core %p (%p).\n", this_processor, this_thread); 332 331 333 preemption _state.in_progress = true; // Sync flag : prevent recursive calls to the signal handler332 preemption.in_progress = true; // Sync flag : prevent recursive calls to the signal handler 334 333 signal_unblock( SIGUSR1 ); // We are about to CtxSwitch out of the signal handler, let other handlers in 335 preemption _state.in_progress = false; // Clear the in progress flag334 preemption.in_progress = false; // Clear the in progress flag 336 335 337 336 // Preemption can occur here -
src/libcfa/concurrency/preemption.h
r45c43e5 r17fc7a5 19 19 #include "kernel_private.h" 20 20 21 __attribute__((weak)) unsigned int default_preemption(); 21 22 void kernel_start_preemption(); 22 23 void kernel_stop_preemption(); -
src/libcfa/concurrency/thread.c
r45c43e5 r17fc7a5 98 98 99 99 void yield( void ) { 100 verify( preemption _state.enabled );100 verify( preemption.enabled ); 101 101 BlockInternal( this_thread ); 102 verify( preemption _state.enabled );102 verify( preemption.enabled ); 103 103 } 104 104 -
src/libcfa/exception.c
r45c43e5 r17fc7a5 10 10 // Created On : Mon Jun 26 15:13:00 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Feb 22 18:17:34201813 // Update Count : 1112 // Last Modified On : Fri Feb 9 14:41:55 2018 13 // Update Count : 8 14 14 // 15 15 … … 52 52 struct __cfaabi_ehm__try_resume_node * current_resume; 53 53 54 exception _t* current_exception;54 exception * current_exception; 55 55 int current_handler_index; 56 56 } shared_stack = {NULL, NULL, 0, 0}; … … 71 71 // This macro should be the only thing that needs to change across machines. Used in the personality function, way down 72 72 // in termination. 73 // struct _Unwind_Context * -> _Unwind_Reason_Code(*)(exception _t*)73 // struct _Unwind_Context * -> _Unwind_Reason_Code(*)(exception *) 74 74 #define MATCHER_FROM_CONTEXT(ptr_to_context) \ 75 (*(_Unwind_Reason_Code(**)(exception _t*))(_Unwind_GetCFA(ptr_to_context) + 8))75 (*(_Unwind_Reason_Code(**)(exception*))(_Unwind_GetCFA(ptr_to_context) + 8)) 76 76 77 77 78 78 // RESUMPTION ================================================================ 79 79 80 void __cfaabi_ehm__throw_resume(exception _t* except) {80 void __cfaabi_ehm__throw_resume(exception * except) { 81 81 82 82 __cfaabi_dbg_print_safe("Throwing resumption exception\n"); … … 106 106 107 107 void __cfaabi_ehm__try_resume_setup(struct __cfaabi_ehm__try_resume_node * node, 108 _Bool (*handler)(exception _t* except)) {108 _Bool (*handler)(exception * except)) { 109 109 node->next = shared_stack.top_resume; 110 110 node->handler = handler; … … 126 126 }; 127 127 128 #define NODE_TO_EXCEPT(node) ((exception _t*)(1 + (node)))128 #define NODE_TO_EXCEPT(node) ((exception *)(1 + (node))) 129 129 #define EXCEPT_TO_NODE(except) ((struct __cfaabi_ehm__node *)(except) - 1) 130 130 131 131 // Creates a copy of the indicated exception and sets current_exception to it. 132 static void __cfaabi_ehm__allocate_exception( exception _t* except ) {132 static void __cfaabi_ehm__allocate_exception( exception * except ) { 133 133 struct exception_context_t * context = this_exception_context(); 134 134 … … 151 151 152 152 // Delete the provided exception, unsetting current_exception if relivant. 153 static void __cfaabi_ehm__delete_exception( exception _t* except ) {153 static void __cfaabi_ehm__delete_exception( exception * except ) { 154 154 struct exception_context_t * context = this_exception_context(); 155 155 … … 179 179 // If this isn't a rethrow (*except==0), delete the provided exception. 180 180 void __cfaabi_ehm__cleanup_terminate( void * except ) { 181 if ( *(void**)except ) __cfaabi_ehm__delete_exception( *(exception _t**)except );181 if ( *(void**)except ) __cfaabi_ehm__delete_exception( *(exception**)except ); 182 182 } 183 183 … … 233 233 } 234 234 235 void __cfaabi_ehm__throw_terminate( exception _t* val ) {235 void __cfaabi_ehm__throw_terminate( exception * val ) { 236 236 __cfaabi_dbg_print_safe("Throwing termination exception\n"); 237 237 … … 348 348 // _Unwind_Reason_Code (*matcher)() = (_Unwind_Reason_Code (*)())lsd_info.LPStart + imatcher; 349 349 350 _Unwind_Reason_Code (*matcher)(exception _t*) =350 _Unwind_Reason_Code (*matcher)(exception *) = 351 351 MATCHER_FROM_CONTEXT(context); 352 352 int index = matcher(shared_stack.current_exception); … … 409 409 __attribute__((noinline)) 410 410 void __cfaabi_ehm__try_terminate(void (*try_block)(), 411 void (*catch_block)(int index, exception _t* except),412 __attribute__((unused)) int (*match_block)(exception _t* except)) {411 void (*catch_block)(int index, exception * except), 412 __attribute__((unused)) int (*match_block)(exception * except)) { 413 413 //! volatile int xy = 0; 414 414 //! printf("%p %p %p %p\n", &try_block, &catch_block, &match_block, &xy); -
src/libcfa/exception.h
r45c43e5 r17fc7a5 9 9 // Author : Andrew Beach 10 10 // Created On : Mon Jun 26 15:11:00 2017 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Th u Feb 22 18:11:15 201813 // Update Count : 811 // Last Modified By : Andrew Beach 12 // Last Modified On : Thr Aug 17 15:44:00 2017 13 // Update Count : 6 14 14 // 15 15 … … 22 22 23 23 struct __cfaabi_ehm__base_exception_t; 24 typedef struct __cfaabi_ehm__base_exception_t exception _t;24 typedef struct __cfaabi_ehm__base_exception_t exception; 25 25 struct __cfaabi_ehm__base_exception_t_vtable { 26 26 const struct __cfaabi_ehm__base_exception_t_vtable * parent; … … 39 39 40 40 // Used in throw statement translation. 41 void __cfaabi_ehm__throw_terminate(exception _t* except) __attribute__((noreturn));41 void __cfaabi_ehm__throw_terminate(exception * except) __attribute__((noreturn)); 42 42 void __cfaabi_ehm__rethrow_terminate() __attribute__((noreturn)); 43 void __cfaabi_ehm__throw_resume(exception _t* except);43 void __cfaabi_ehm__throw_resume(exception * except); 44 44 45 45 // Function catches termination exceptions. 46 46 void __cfaabi_ehm__try_terminate( 47 47 void (*try_block)(), 48 void (*catch_block)(int index, exception _t* except),49 int (*match_block)(exception _t* except));48 void (*catch_block)(int index, exception * except), 49 int (*match_block)(exception * except)); 50 50 51 51 // Clean-up the exception in catch blocks. … … 55 55 struct __cfaabi_ehm__try_resume_node { 56 56 struct __cfaabi_ehm__try_resume_node * next; 57 _Bool (*handler)(exception _t* except);57 _Bool (*handler)(exception * except); 58 58 }; 59 59 … … 61 61 void __cfaabi_ehm__try_resume_setup( 62 62 struct __cfaabi_ehm__try_resume_node * node, 63 _Bool (*handler)(exception _t* except));63 _Bool (*handler)(exception * except)); 64 64 void __cfaabi_ehm__try_resume_cleanup( 65 65 struct __cfaabi_ehm__try_resume_node * node); -
src/libcfa/stdhdr/math.h
r45c43e5 r17fc7a5 10 10 // Created On : Mon Jul 4 23:25:26 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T hu Feb 22 18:16:07 201813 // Update Count : 1 312 // Last Modified On : Tue Jul 5 20:38:18 2016 13 // Update Count : 12 14 14 // 15 15 16 16 extern "C" { 17 #if ! defined( exception ) // nesting ?18 #define exception `exception` // make keyword an identifier19 #define __CFA_MATH_H__20 #endif21 22 17 #include_next <math.h> // has internal check for multiple expansion 23 24 #if defined( exception ) && defined( __CFA_MATH_H__ ) // reset only if set25 #undef exception26 #undef __CFA_MATH_H__27 #endif28 18 } // extern "C" 29 19 -
src/prelude/builtins.c
r45c43e5 r17fc7a5 23 23 void exit( int status, const char fmt[], ... ) __attribute__ (( format(printf, 2, 3), __nothrow__, __leaf__, __noreturn__ )); 24 24 void abort ( const char fmt[], ... ) __attribute__ (( format(printf, 1, 2), __nothrow__, __leaf__, __noreturn__ )); 25 26 // increment/decrement unification27 28 static inline forall( dtype T | { T& ?+=?( T&, one_t ); } )29 T& ++? ( T& x ) { return x += 1; }30 31 static inline forall( dtype T | sized(T) | { void ?{}( T&, T ); void ^?{}( T& ); T& ?+=?( T&, one_t ); } )32 T& ?++ ( T& x ) { T tmp = x; x += 1; return tmp; }33 34 static inline forall( dtype T | { T& ?-=?( T&, one_t ); } )35 T& --? ( T& x ) { return x -= 1; }36 37 static inline forall( dtype T | sized(T) | { void ?{}( T&, T ); void ^?{}( T& ); T& ?-=?( T&, one_t ); } )38 T& ?-- ( T& x ) { T tmp = x; x -= 1; return tmp; }39 25 40 26 // exponentiation operator implementation -
tools/Makefile.am
r45c43e5 r17fc7a5 18 18 CFLAGS = -Wall -Wextra -O2 -g 19 19 20 noinst_PROGRAMS = busycatchsig repeat20 noinst_PROGRAMS = catchsig repeat 21 21 22 busy_SOURCES = busy.c23 busy_LDFLAGS = -pthread24 22 catchsig_SOURCES = catchsig.c 25 23 repeat_SOURCES = repeat.c -
tools/Makefile.in
r45c43e5 r17fc7a5 92 92 build_triplet = @build@ 93 93 host_triplet = @host@ 94 noinst_PROGRAMS = busy$(EXEEXT)catchsig$(EXEEXT) repeat$(EXEEXT)94 noinst_PROGRAMS = catchsig$(EXEEXT) repeat$(EXEEXT) 95 95 subdir = tools 96 96 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 … … 104 104 CONFIG_CLEAN_VPATH_FILES = 105 105 PROGRAMS = $(noinst_PROGRAMS) 106 am_busy_OBJECTS = busy.$(OBJEXT)107 busy_OBJECTS = $(am_busy_OBJECTS)108 busy_LDADD = $(LDADD)109 busy_LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(busy_LDFLAGS) $(LDFLAGS) \110 -o $@111 106 am_catchsig_OBJECTS = catchsig.$(OBJEXT) 112 107 catchsig_OBJECTS = $(am_catchsig_OBJECTS) … … 143 138 am__v_CCLD_0 = @echo " CCLD " $@; 144 139 am__v_CCLD_1 = 145 SOURCES = $( busy_SOURCES) $(catchsig_SOURCES) $(repeat_SOURCES)146 DIST_SOURCES = $( busy_SOURCES) $(catchsig_SOURCES) $(repeat_SOURCES)140 SOURCES = $(catchsig_SOURCES) $(repeat_SOURCES) 141 DIST_SOURCES = $(catchsig_SOURCES) $(repeat_SOURCES) 147 142 am__can_run_installinfo = \ 148 143 case $$AM_UPDATE_INFO_DIR in \ … … 291 286 top_builddir = @top_builddir@ 292 287 top_srcdir = @top_srcdir@ 293 busy_SOURCES = busy.c294 busy_LDFLAGS = -pthread295 288 catchsig_SOURCES = catchsig.c 296 289 repeat_SOURCES = repeat.c … … 332 325 -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) 333 326 334 busy$(EXEEXT): $(busy_OBJECTS) $(busy_DEPENDENCIES) $(EXTRA_busy_DEPENDENCIES)335 @rm -f busy$(EXEEXT)336 $(AM_V_CCLD)$(busy_LINK) $(busy_OBJECTS) $(busy_LDADD) $(LIBS)337 338 327 catchsig$(EXEEXT): $(catchsig_OBJECTS) $(catchsig_DEPENDENCIES) $(EXTRA_catchsig_DEPENDENCIES) 339 328 @rm -f catchsig$(EXEEXT) … … 350 339 -rm -f *.tab.c 351 340 352 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/busy.Po@am__quote@353 341 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/catchsig.Po@am__quote@ 354 342 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/repeat.Po@am__quote@
Note:
See TracChangeset
for help on using the changeset viewer.