Changeset 97f65d5
- Timestamp:
- Feb 15, 2017, 8:13:49 AM (6 years ago)
- Branches:
- aaron-thesis, arm-eh, 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, resolv-new, with_gc
- Children:
- e6512c8
- Parents:
- aa9ee19 (diff), 3149e7e (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:
-
- 3 added
- 40 edited
Legend:
- Unmodified
- Added
- Removed
-
Jenkinsfile
raa9ee19 r97f65d5 80 80 make_doc() 81 81 } 82 } 83 84 def benchmark() { 85 stage 'Benchmark' 86 87 status_prefix = 'Documentation' 88 89 // sh 'make -C src/benchmark csv-data >> /u/cforall/public_html/perf-history/concurrency.csv' 82 90 } 83 91 … … 183 191 doc_build() 184 192 193 //Run benchmark and save result 194 benchmark() 195 185 196 if( bIsFullBuild ) { 186 197 //Compile using gcc-5 -
src/CodeTools/DeclStats.cc
raa9ee19 r97f65d5 18 18 #include <iostream> 19 19 #include <map> 20 #include <sstream> 20 21 #include <string> 21 22 #include <unordered_map> … … 71 72 return *this; 72 73 } 73 74 /// Update based on a declaration list75 ArgPackStats& operator+= ( std::list<DeclarationWithType*>& decls ) {76 unsigned nn = 0;77 unsigned nn_basic = 0;78 unsigned nn_poly = 0;79 for ( auto decl : decls ) {80 nn += decl->get_type()->size();81 if ( dynamic_cast<BasicType*>( decl->get_type() ) ) ++nn_basic;82 else if ( GenPoly::hasPolyBase( decl->get_type() ) ) ++nn_poly;83 }84 ++n.at( nn );85 ++n_basic.at( nn_basic );86 ++n_poly.at( nn_poly );87 if ( nn > 0 ) {88 ++p_basic[ nn_basic*100/nn ];89 ++p_poly[ nn_poly*100/nn ];90 }91 92 return *this;93 }94 74 }; 95 75 … … 100 80 /// Count of declarations with each name 101 81 std::unordered_map<std::string, unsigned> by_name; 82 /// Count of uses of each basic type 83 std::unordered_map<std::string, unsigned> basic_type_names; 84 /// Count of uses of each non-basic type 85 std::unordered_map<std::string, unsigned> compound_type_names; 102 86 /// Stats for the parameter list 103 87 ArgPackStats params; … … 112 96 ArgPackStats assn_returns; 113 97 114 Stats() : n_decls(0), n_type_params(), by_name(), params(), returns(), n_assns(), assn_params(), assn_returns() {}98 Stats() : n_decls(0), n_type_params(), by_name(), basic_type_names(), compound_type_names(), params(), returns(), n_assns(), assn_params(), assn_returns() {} 115 99 116 100 public: … … 119 103 sum( n_type_params, o.n_type_params ); 120 104 sum( by_name, o.by_name ); 105 sum( basic_type_names, o.basic_type_names ); 106 sum( compound_type_names, o.compound_type_names ); 121 107 sum( params, o.params ); 122 108 sum( returns, o.returns ); … … 133 119 Stats total; 134 120 135 void analyzeFunc( FunctionType* fnTy, ArgPackStats& params, ArgPackStats& returns ) { 136 params += fnTy->get_parameters(); 137 returns += fnTy->get_returnVals(); 121 /// Update arg pack stats based on a declaration list 122 void analyze( Stats& stats, ArgPackStats& pstats, std::list<DeclarationWithType*>& decls ) { 123 unsigned n = 0; 124 unsigned n_basic = 0; 125 unsigned n_poly = 0; 126 for ( auto decl : decls ) { 127 n += decl->get_type()->size(); 128 if ( BasicType* bt = dynamic_cast<BasicType*>( decl->get_type() ) ) { 129 ++n_basic; 130 std::stringstream ss; 131 bt->print( ss ); 132 ++stats.basic_type_names[ ss.str() ]; 133 } else if ( GenPoly::hasPolyBase( decl->get_type() ) ) { 134 ++n_poly; 135 } else { 136 std::stringstream ss; 137 decl->get_type()->print( ss ); 138 ++stats.compound_type_names[ ss.str() ]; 139 } 140 } 141 ++pstats.n.at( n ); 142 ++pstats.n_basic.at( n_basic ); 143 ++pstats.n_poly.at( n_poly ); 144 if ( n > 0 ) { 145 ++pstats.p_basic[ n_basic*100/n ]; 146 ++pstats.p_poly[ n_poly*100/n ]; 147 } 148 } 149 150 void analyzeFunc( FunctionType* fnTy, Stats& stats, ArgPackStats& params, ArgPackStats& returns ) { 151 analyze( stats, params, fnTy->get_parameters() ); 152 analyze( stats, returns, fnTy->get_returnVals() ); 138 153 } 139 154 … … 164 179 assnTy = assnDecl->get_functionType(); 165 180 } 166 if ( assnTy ) analyzeFunc( assnTy, stats .assn_params, stats.assn_returns );181 if ( assnTy ) analyzeFunc( assnTy, stats, stats.assn_params, stats.assn_returns ); 167 182 } 168 183 } … … 171 186 ++stats.by_name[ decl->get_name() ]; 172 187 173 analyzeFunc( fnTy, stats .params, stats.returns );188 analyzeFunc( fnTy, stats, stats.params, stats.returns ); 174 189 } 175 190 … … 266 281 printAll("unique_names", [](const Stats& stats) { return stats.by_name.size(); }); 267 282 printAllSparseHisto("overloads", [](const Stats& stats) { return stats.by_name; }); 283 printAll("basic_type_names", [](const Stats& stats) { return stats.basic_type_names.size(); }); 284 printAllSparseHisto("basic_type_uses", [](const Stats& stats) { return stats.basic_type_names; }); 285 printAll("compound_type_names", [](const Stats& stats) { return stats.compound_type_names.size(); }); 286 printAllSparseHisto("compound_type_uses", [](const Stats& stats) { return stats.compound_type_names; }); 268 287 printAllPack("params", [](const Stats& stats) { return stats.params; }); 269 288 printAllPack("returns", [](const Stats& stats) { return stats.returns; }); -
src/Common/ScopedMap.h
raa9ee19 r97f65d5 230 230 } 231 231 232 /// Finds the given key in the provided scope; returns end() for none such 233 iterator findAt( size_type scope, const Key& key ) { 234 typename Scope::iterator val = scopes[scope].find( key ); 235 if ( val != scopes[scope].end() ) return iterator( scopes, val, scope ); 236 return end(); 237 } 238 const_iterator findAt( size_type scope, const Key& key ) const { 239 return const_iterator( const_cast< ScopedMap< Key, Value >* >(this)->findAt( scope, key ) ); 240 } 241 232 242 /// Finds the given key in the outermost scope inside the given scope where it occurs 233 243 iterator findNext( const_iterator &it, const Key &key ) { -
src/Common/SemanticError.cc
raa9ee19 r97f65d5 22 22 #include "SemanticError.h" 23 23 24 #include <unistd.h> 25 26 inline const std::string& error_str() { 27 static std::string str = isatty( fileno(stderr) ) ? "\e[31merror:\e[39m " : "error: "; 28 return str; 29 } 30 24 31 SemanticError::SemanticError() { 25 32 } 26 33 27 34 SemanticError::SemanticError( std::string error ) { 28 35 append( error ); 29 36 } 30 37 31 38 void SemanticError::append( SemanticError &other ) { 32 39 errors.splice( errors.end(), other.errors ); 33 40 } 34 41 35 42 void SemanticError::append( const std::string & msg ) { 36 errors.push_back( std::string( "Error: ") + msg );43 errors.emplace_back( error_str() + msg ); 37 44 } 38 45 … … 42 49 43 50 void SemanticError::print( std::ostream &os ) { 44 std::copy( errors.begin(), errors.end(), std::ostream_iterator< std::string >( os, "\n" ) ); 51 using std::to_string; 52 for(auto err : errors) { 53 os << to_string( err.location ) << err.description << '\n'; 54 } 55 } 56 57 void SemanticError::set_location( const CodeLocation& location ) { 58 errors.begin()->maybeSet( location ); 45 59 } 46 60 -
src/Common/SemanticError.h
raa9ee19 r97f65d5 23 23 #include <iostream> 24 24 25 #include "utility.h" 26 27 struct error { 28 std::string description; 29 CodeLocation location; 30 31 error() = default; 32 error( const std::string& str ) : description( str ) {} 33 34 void maybeSet( const CodeLocation& location ) { 35 if( this->location.linenumber < 0 ) { 36 this->location = location; 37 } 38 } 39 }; 40 25 41 class SemanticError : public std::exception { 26 42 public: … … 35 51 void print( std::ostream &os ); 36 52 53 void set_location( const CodeLocation& location ); 37 54 // constructs an exception using the given message and the printed 38 55 // representation of the obj (T must have a print method) 39 56 private: 40 std::list< std::string> errors;57 std::list< error > errors; 41 58 }; 42 59 -
src/Common/VectorMap.h
raa9ee19 r97f65d5 38 38 typedef const const_value_type* const_pointer; 39 39 40 class iterator : public std::iterator< std:: bidirectional_iterator_tag,40 class iterator : public std::iterator< std::random_access_iterator_tag, 41 41 value_type, 42 43 44 42 difference_type, 43 pointer, 44 reference > { 45 45 friend class VectorMap; 46 46 friend class const_iterator; … … 74 74 iterator operator-- (int) { iterator tmp = *this; --(*this); return tmp; } 75 75 76 iterator& operator+= (difference_type i) { 77 // SHENANIGANS: same reasons as operator++ 78 new(&data) value_type{ (data.first + i), *(&data.second + i) }; 79 return *this; 80 } 81 82 iterator operator+ (difference_type i) const { iterator tmp = *this; return tmp += i; } 83 84 iterator& operator-= (difference_type i) { 85 // SHENANIGANS: same reasons as operator++ 86 new(&data) value_type{ (data.first - i), *(&data.second - i) }; 87 return *this; 88 } 89 90 iterator operator- (difference_type i) const { iterator tmp = *this; return tmp -= i; } 91 92 difference_type operator- (const iterator& o) const { return data.first - o.data.first; } 93 94 value_type operator[] (difference_type i) const { 95 // SHENANIGANS: same reasons as operator++ 96 return value_type{ (data.first + i), *(&data.second + i) }; 97 } 98 76 99 bool operator== (const iterator& o) const { 77 100 return data.first == o.data.first && &data.second == &o.data.second; 78 101 } 102 79 103 bool operator!= (const iterator& that) const { return !(*this == that); } 104 105 bool operator< (const iterator& o) const { return data.first < o.data.first; } 106 107 bool operator> (const iterator& o) const { return data.first > o.data.first; } 108 109 bool operator<= (const iterator& o) const { return data.first <= o.data.first; } 110 111 bool operator>= (const iterator& o) const { return data.first >= o.data.first; } 80 112 }; 81 113 … … 118 150 const_iterator operator-- (int) { const_iterator tmp = *this; --(*this); return tmp; } 119 151 152 const_iterator& operator+= (difference_type i) { 153 // SHENANIGANS: same reasons as iterator::operator++ 154 new(&data) const_value_type{ (data.first + i), *(&data.second + i) }; 155 return *this; 156 } 157 158 const_iterator operator+ (difference_type i) const { 159 const_iterator tmp = *this; return tmp += i; 160 } 161 162 const_iterator& operator-= (difference_type i) { 163 // SHENANIGANS: same reasons as iterator::operator++ 164 new(&data) const_value_type{ (data.first - i), *(&data.second - i) }; 165 return *this; 166 } 167 168 const_iterator operator- (difference_type i) const { 169 const_iterator tmp = *this; return tmp -= i; 170 } 171 172 difference_type operator- (const const_iterator& o) const { 173 return data.first - o.data.first; 174 } 175 176 const_value_type operator[] (difference_type i) const { 177 // SHENANIGANS: same reasons as iterator::operator++ 178 return const_value_type{ (data.first + i), *(&data.second + i) }; 179 } 180 120 181 bool operator== (const const_iterator& o) const { 121 182 return data.first == o.data.first && &data.second == &o.data.second; 122 183 } 184 123 185 bool operator!= (const const_iterator& that) const { return !(*this == that); } 186 187 bool operator< (const const_iterator& o) const { return data.first < o.data.first; } 188 189 bool operator> (const const_iterator& o) const { return data.first > o.data.first; } 190 191 bool operator<= (const const_iterator& o) const { return data.first <= o.data.first; } 192 193 bool operator>= (const const_iterator& o) const { return data.first >= o.data.first; } 124 194 }; 125 195 … … 163 233 }; 164 234 235 template<typename T> 236 typename VectorMap<T>::iterator operator+ (typename VectorMap<T>::difference_type i, 237 const typename VectorMap<T>::iterator& it) { 238 return it + i; 239 } 240 241 template<typename T> 242 typename VectorMap<T>::const_iterator operator+ (typename VectorMap<T>::difference_type i, 243 const typename VectorMap<T>::const_iterator& it) { 244 return it + i; 245 } 246 165 247 #endif // _VECTORMAP_H 166 248 -
src/Common/utility.h
raa9ee19 r97f65d5 25 25 #include <sstream> 26 26 #include <string> 27 27 28 #include <cassert> 28 29 29 template< typename T > 30 30 static inline T * maybeClone( const T *orig ) { … … 303 303 return group_iterate_t<Args...>(args...); 304 304 } 305 306 struct CodeLocation { 307 int linenumber; 308 std::string filename; 309 310 CodeLocation() 311 : linenumber( -1 ) 312 , filename("") 313 {} 314 315 CodeLocation( const char* filename, int lineno ) 316 : linenumber( lineno ) 317 , filename(filename ? filename : "") 318 {} 319 }; 320 321 inline std::string to_string( const CodeLocation& location ) { 322 return location.linenumber >= 0 ? location.filename + ":" + std::to_string(location.linenumber) + " " : ""; 323 } 305 324 #endif // _UTILITY_H 306 325 -
src/GenPoly/Box.cc
raa9ee19 r97f65d5 236 236 } // if 237 237 } catch( SemanticError &e ) { 238 e.set_location( (*i)->location ); 238 239 errors.append( e ); 239 240 } // try -
src/GenPoly/InstantiateGeneric.cc
raa9ee19 r97f65d5 122 122 /// Adds a value for a (key, typeList) pair to the current scope 123 123 void insert( Key *key, const std::list< TypeExpr* > ¶ms, Value *value ) { 124 instantiations[ key ].push_back( Instantiation( TypeList( params ), value ) ); 124 auto it = instantiations.findAt( instantiations.currentScope(), key ); 125 if ( it == instantiations.end() ) { 126 instantiations.insert( key, ValueList{ Instantiation{ TypeList( params ), value } } ); 127 } else { 128 it->second.push_back( Instantiation{ TypeList( params ), value } ); 129 } 125 130 } 126 131 }; -
src/InitTweak/FixInit.cc
raa9ee19 r97f65d5 313 313 translationUnit.splice( i, fixer.staticDtorDecls ); 314 314 } catch( SemanticError &e ) { 315 e.set_location( (*i)->location ); 315 316 errors.append( e ); 316 317 } // try -
src/Parser/DeclarationNode.cc
raa9ee19 r97f65d5 921 921 Declaration * decl = extr->build(); 922 922 if ( decl ) { 923 decl->location = cur->location; 923 924 * out++ = decl; 924 925 } // if … … 928 929 Declaration * decl = cur->build(); 929 930 if ( decl ) { 931 decl->location = cur->location; 930 932 * out++ = decl; 931 933 } // if 932 934 } catch( SemanticError &e ) { 935 e.set_location( cur->location ); 933 936 errors.append( e ); 934 937 } // try … … 950 953 if ( decl ) { 951 954 if ( DeclarationWithType * dwt = dynamic_cast< DeclarationWithType * >( decl ) ) { 955 dwt->location = cur->location; 952 956 * out++ = dwt; 953 957 } else if ( StructDecl * agg = dynamic_cast< StructDecl * >( decl ) ) { 954 958 StructInstType * inst = new StructInstType( Type::Qualifiers(), agg->get_name() ); 955 * out++ = new ObjectDecl( "", DeclarationNode::NoStorageClass, linkage, nullptr, inst, nullptr ); 959 auto obj = new ObjectDecl( "", DeclarationNode::NoStorageClass, linkage, nullptr, inst, nullptr ); 960 obj->location = cur->location; 961 * out++ = obj; 956 962 delete agg; 957 963 } else if ( UnionDecl * agg = dynamic_cast< UnionDecl * >( decl ) ) { 958 964 UnionInstType * inst = new UnionInstType( Type::Qualifiers(), agg->get_name() ); 959 * out++ = new ObjectDecl( "", DeclarationNode::NoStorageClass, linkage, nullptr, inst, nullptr ); 965 auto obj = new ObjectDecl( "", DeclarationNode::NoStorageClass, linkage, nullptr, inst, nullptr ); 966 obj->location = cur->location; 967 * out++ = obj; 960 968 } // if 961 969 } // if 962 970 } catch( SemanticError &e ) { 971 e.set_location( cur->location ); 963 972 errors.append( e ); 964 973 } // try … … 979 988 * out++ = cur->buildType(); 980 989 } catch( SemanticError &e ) { 990 e.set_location( cur->location ); 981 991 errors.append( e ); 982 992 } // try -
src/Parser/ParseNode.h
raa9ee19 r97f65d5 39 39 //############################################################################## 40 40 41 extern char* yyfilename; 42 extern int yylineno; 43 41 44 class ParseNode { 42 45 public: … … 65 68 ParseNode * next = nullptr; 66 69 std::string * name = nullptr; 70 CodeLocation location = { yyfilename, yylineno }; 67 71 }; // ParseNode 68 72 … … 410 414 while ( cur ) { 411 415 try { 412 // SynTreeType * result = dynamic_cast< SynTreeType * >( maybeBuild< typename std::result_of< decltype(&NodeType::build)(NodeType)>::type >( cur ) );413 416 SynTreeType * result = dynamic_cast< SynTreeType * >( maybeBuild< typename std::pointer_traits< decltype(cur->build())>::element_type >( cur ) ); 414 417 if ( result ) { 418 result->location = cur->location; 415 419 * out++ = result; 416 420 } // if 417 421 } catch( SemanticError &e ) { 422 e.set_location( cur->location ); 418 423 errors.append( e ); 419 424 } // try -
src/ResolvExpr/Resolver.cc
raa9ee19 r97f65d5 86 86 Resolver resolver; 87 87 acceptAll( translationUnit, resolver ); 88 #if 089 resolver.print( cerr );90 for ( std::list< Declaration * >::iterator i = translationUnit.begin(); i != translationUnit.end(); ++i ) {91 (*i)->print( std::cerr );92 (*i)->accept( resolver );93 } // for94 #endif95 88 } 96 89 -
src/SymTab/Validate.cc
raa9ee19 r97f65d5 629 629 } else { 630 630 TypeDeclMap::const_iterator base = typedeclNames.find( typeInst->get_name() ); 631 assert ( base != typedeclNames.end() );631 assertf( base != typedeclNames.end(), "Can't find name %s", typeInst->get_name().c_str() ); 632 632 typeInst->set_baseType( base->second ); 633 633 } // if -
src/SynTree/Declaration.h
raa9ee19 r97f65d5 17 17 #define DECLARATION_H 18 18 19 #include <string> 20 21 #include "BaseSyntaxNode.h" 22 #include "Mutator.h" 23 #include "Visitor.h" 19 24 #include "SynTree.h" 20 #include "Visitor.h"21 #include "Mutator.h"22 25 #include "Parser/LinkageSpec.h" 23 26 #include "Parser/ParseNode.h" 24 #include <string> 25 26 class Declaration { 27 28 class Declaration : public BaseSyntaxNode { 27 29 public: 28 30 Declaration( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage ); -
src/SynTree/Expression.h
raa9ee19 r97f65d5 19 19 #include <map> 20 20 #include <memory> 21 22 #include "BaseSyntaxNode.h" 23 #include "Constant.h" 24 #include "Mutator.h" 21 25 #include "SynTree.h" 22 26 #include "Visitor.h" 23 #include "Mutator.h"24 #include "Constant.h"25 27 #include "Common/UniqueName.h" 26 28 27 29 /// Expression is the root type for all expressions 28 class Expression {30 class Expression : public BaseSyntaxNode{ 29 31 public: 30 32 Expression( Expression * _aname = nullptr ); -
src/SynTree/Initializer.h
raa9ee19 r97f65d5 17 17 #define INITIALIZER_H 18 18 19 #include <cassert> 20 21 #include "BaseSyntaxNode.h" 22 #include "Mutator.h" 19 23 #include "SynTree.h" 24 #include "Type.h" 20 25 #include "Visitor.h" 21 #include "Mutator.h"22 #include "Type.h"23 24 #include <cassert>25 26 26 27 const std::list<Expression*> noDesignators; 27 28 28 29 // Initializer: base class for object initializers (provide default values) 29 class Initializer {30 class Initializer : public BaseSyntaxNode { 30 31 public: 31 32 // Initializer( std::string _name = std::string(""), int _pos = 0 ); -
src/SynTree/Mutator.h
raa9ee19 r97f65d5 139 139 } // if 140 140 } catch( SemanticError &e ) { 141 e.set_location( (*i)->location ); 141 142 errors.append( e ); 142 143 } // try -
src/SynTree/Statement.h
raa9ee19 r97f65d5 17 17 #define STATEMENT_H 18 18 19 #include "BaseSyntaxNode.h" 20 #include "Label.h" 21 #include "Mutator.h" 19 22 #include "SynTree.h" 23 #include "Type.h" 20 24 #include "Visitor.h" 21 #include "Mutator.h"22 25 #include "Common/SemanticError.h" 23 #include "Type.h" 24 #include "Label.h" 25 26 class Statement { 26 27 class Statement : public BaseSyntaxNode { 27 28 public: 28 29 Statement( std::list<Label> labels ); -
src/SynTree/Type.h
raa9ee19 r97f65d5 17 17 #define TYPE_H 18 18 19 #include "BaseSyntaxNode.h" 20 #include "Mutator.h" 19 21 #include "SynTree.h" 20 22 #include "Visitor.h" 21 #include "Mutator.h"22 23 #include "Common/utility.h" 23 24 24 class Type {25 class Type : public BaseSyntaxNode { 25 26 public: 26 27 struct Qualifiers { -
src/SynTree/Visitor.h
raa9ee19 r97f65d5 133 133 } 134 134 } catch( SemanticError &e ) { 135 e.set_location( (*i)->location ); 135 136 errors.append( e ); 136 137 } … … 159 160 } // if 160 161 } catch( SemanticError &e ) { 162 e.set_location( (*i)->location ); 161 163 errors.append( e ); 162 164 } // try -
src/benchmark/Makefile.am
raa9ee19 r97f65d5 44 44 @rm -f ./a.out 45 45 46 csv-data: 47 @${CC} ${AM_CFLAGS} ${CFLAGS} $${ccflags} -nodebug -lrt -quiet -DN=10000000 csv-data.c 48 @./a.out 49 @rm -f ./a.out -
src/benchmark/Makefile.in
raa9ee19 r97f65d5 491 491 @rm -f ./a.out 492 492 493 csv-data: 494 @${CC} ${AM_CFLAGS} ${CFLAGS} $${ccflags} -nodebug -lrt -quiet -DN=10000000 csv-data.c 495 @./a.out 496 @rm -f ./a.out 497 493 498 # Tell versions [3.59,3.63) of GNU make to not export all variables. 494 499 # Otherwise a system limit (for SysV at least) may be exceeded. -
src/libcfa/concurrency/coroutines
raa9ee19 r97f65d5 77 77 "Possible cause is a suspend executed in a member called by a coroutine user rather than by the coroutine main.", 78 78 src->name, src ); 79 assertf( src->last-> notHalted,79 assertf( src->last->state != Halted, 80 80 "Attempt by coroutine \"%.256s\" (%p) to suspend back to terminated coroutine \"%.256s\" (%p).\n" 81 81 "Possible cause is terminated coroutine's main routine has already returned.", … … 98 98 // not resuming self ? 99 99 if ( src != dst ) { 100 assertf( dst-> notHalted ,100 assertf( dst->state != Halted , 101 101 "Attempt by coroutine %.256s (%p) to resume terminated coroutine %.256s (%p).\n" 102 102 "Possible cause is terminated coroutine's main routine has already returned.", … … 116 116 // not resuming self ? 117 117 if ( src != dst ) { 118 assertf( dst-> notHalted ,118 assertf( dst->state != Halted , 119 119 "Attempt by coroutine %.256s (%p) to resume terminated coroutine %.256s (%p).\n" 120 120 "Possible cause is terminated coroutine's main routine has already returned.", -
src/libcfa/concurrency/coroutines.c
raa9ee19 r97f65d5 61 61 62 62 void ?{}(coroutine* this) { 63 this->name = "Anonymous Coroutine"; 64 this->errno_ = 0; 65 this->state = Start; 66 this->notHalted = true; 67 this->starter = NULL; 68 this->last = NULL; 63 this{ "Anonymous Coroutine" }; 69 64 } 70 65 … … 73 68 this->errno_ = 0; 74 69 this->state = Start; 75 this->notHalted = true;76 70 this->starter = NULL; 77 71 this->last = NULL; … … 169 163 this->context = this->base; 170 164 this->top = (char *)this->context + cxtSize; 171 172 LIB_DEBUG_PRINTF("Coroutine : created stack %p\n", this->base);173 165 } 174 166 -
src/libcfa/concurrency/invoke.c
raa9ee19 r97f65d5 48 48 main( this ); 49 49 50 cor->state = Halt; 51 cor->notHalted = false; 50 cor->state = Halted; 52 51 53 52 //Final suspend, should never return -
src/libcfa/concurrency/invoke.h
raa9ee19 r97f65d5 30 30 #define SCHEDULER_CAPACITY 10 31 31 32 struct spinlock { 33 volatile int lock; 34 }; 35 32 36 struct simple_thread_list { 33 37 struct thread * head; 34 38 struct thread ** tail; 39 }; 40 41 struct signal_once { 42 volatile bool condition; 43 struct spinlock lock; 44 struct simple_thread_list blocked; 35 45 }; 36 46 … … 40 50 void append( struct simple_thread_list *, struct thread * ); 41 51 struct thread * pop_head( struct simple_thread_list * ); 52 53 void ?{}(spinlock * this); 54 void ^?{}(spinlock * this); 55 56 void ?{}(signal_once * this); 57 void ^?{}(signal_once * this); 42 58 } 43 59 #endif … … 53 69 }; 54 70 55 enum coroutine_state { Start, Inactive, Active, Halt, Primed };71 enum coroutine_state { Halted, Start, Inactive, Active, Primed }; 56 72 57 73 struct coroutine { … … 60 76 int errno_; // copy of global UNIX variable errno 61 77 enum coroutine_state state; // current execution status for coroutine 62 bool notHalted; // indicate if execuation state is not halted63 64 78 struct coroutine *starter; // first coroutine to resume this one 65 79 struct coroutine *last; // last coroutine to resume this one 66 80 }; 67 81 68 struct simple_lock {69 struct simple_thread_list blocked;70 };71 72 82 struct thread { 73 struct coroutine c; 74 struct si mple_lock lock;75 struct thread * next; 83 struct coroutine c; // coroutine body used to store context 84 struct signal_once terminated;// indicate if execuation state is not halted 85 struct thread * next; // instrusive link field for threads 76 86 }; 77 87 -
src/libcfa/concurrency/kernel
raa9ee19 r97f65d5 9 9 // 10 10 // Author : Thierry Delisle 11 // Created On : Tue Jan 17 12:27:26 201 611 // Created On : Tue Jan 17 12:27:26 2017 12 12 // Last Modified By : Thierry Delisle 13 13 // Last Modified On : -- … … 27 27 28 28 //----------------------------------------------------------------------------- 29 // Locks 30 void lock( spinlock * ); 31 void unlock( spinlock * ); 32 33 void wait( signal_once * ); 34 void signal( signal_once * ); 35 36 //----------------------------------------------------------------------------- 29 37 // Cluster 30 38 struct cluster { 31 39 simple_thread_list ready_queue; 32 // pthread_spinlock_tlock;40 spinlock lock; 33 41 }; 34 42 … … 38 46 //----------------------------------------------------------------------------- 39 47 // Processor 40 enum ProcessorAction { 41 Reschedule, 42 NoAction 48 enum FinishOpCode { No_Action, Release, Schedule, Release_Schedule }; 49 struct FinishAction { 50 FinishOpCode action_code; 51 thread * thrd; 52 spinlock * lock; 43 53 }; 54 static inline void ?{}(FinishAction * this) { 55 this->action_code = No_Action; 56 this->thrd = NULL; 57 this->lock = NULL; 58 } 59 static inline void ^?{}(FinishAction * this) {} 44 60 45 61 struct processor { … … 49 65 thread * current_thread; 50 66 pthread_t kernel_thread; 51 simple_lock lock; 52 volatile bool terminated; 53 ProcessorAction thread_action; 67 68 signal_once terminated; 69 volatile bool is_terminated; 70 71 struct FinishAction finish; 54 72 }; 55 73 … … 57 75 void ?{}(processor * this, cluster * cltr); 58 76 void ^?{}(processor * this); 59 60 61 //-----------------------------------------------------------------------------62 // Locks63 64 void ?{}(simple_lock * this);65 void ^?{}(simple_lock * this);66 67 void lock( simple_lock * );68 void unlock( simple_lock * );69 77 70 78 #endif //KERNEL_H -
src/libcfa/concurrency/kernel.c
raa9ee19 r97f65d5 9 9 // 10 10 // Author : Thierry Delisle 11 // Created On : Tue Jan 17 12:27:26 201 611 // Created On : Tue Jan 17 12:27:26 2017 12 12 // Last Modified By : Thierry Delisle 13 13 // Last Modified On : -- … … 20 20 21 21 //Header 22 #include "kernel "22 #include "kernel_private.h" 23 23 24 24 //C Includes … … 31 31 //CFA Includes 32 32 #include "libhdr.h" 33 #include "threads"34 33 35 34 //Private includes … … 37 36 #include "invoke.h" 38 37 39 static volatile int lock;40 41 void spin_lock( volatile int *lock ) {42 for ( unsigned int i = 1;; i += 1 ) {43 if ( *lock == 0 && __sync_lock_test_and_set_4( lock, 1 ) == 0 ) break;44 }45 }46 47 void spin_unlock( volatile int *lock ) {48 __sync_lock_release_4( lock );49 }50 51 38 //----------------------------------------------------------------------------- 52 39 // Kernel storage 53 struct processorCtx_t {54 processor * proc;55 coroutine c;56 };57 58 DECL_COROUTINE(processorCtx_t);59 60 40 #define KERNEL_STORAGE(T,X) static char X##_storage[sizeof(T)] 61 41 … … 127 107 this->name = "Main Thread"; 128 108 this->errno_ = 0; 129 this->state = Inactive; 130 this->notHalted = true; 109 this->state = Start; 131 110 } 132 111 … … 149 128 } 150 129 151 void start(processor * this);152 153 130 void ?{}(processor * this) { 154 131 this{ systemCluster }; … … 159 136 this->current_coroutine = NULL; 160 137 this->current_thread = NULL; 161 (&this-> lock){};162 this-> terminated = false;138 (&this->terminated){}; 139 this->is_terminated = false; 163 140 164 141 start( this ); … … 169 146 this->current_coroutine = NULL; 170 147 this->current_thread = NULL; 171 (&this-> lock){};172 this-> terminated = false;148 (&this->terminated){}; 149 this->is_terminated = false; 173 150 174 151 this->runner = runner; … … 178 155 179 156 void ^?{}(processor * this) { 180 if( ! this-> terminated ) {157 if( ! this->is_terminated ) { 181 158 LIB_DEBUG_PRINTF("Kernel : core %p signaling termination\n", this); 182 this-> terminated = true;183 lock( &this->lock);159 this->is_terminated = true; 160 wait( &this->terminated ); 184 161 } 185 162 } … … 187 164 void ?{}(cluster * this) { 188 165 ( &this->ready_queue ){}; 189 lock = 0;166 ( &this->lock ){}; 190 167 } 191 168 … … 194 171 } 195 172 196 //----------------------------------------------------------------------------- 197 // Processor running routines 198 void main(processorCtx_t *); 199 thread * nextThread(cluster * this); 200 void scheduleInternal(processor * this, thread * dst); 201 void spin(processor * this, unsigned int * spin_count); 202 void thread_schedule( thread * thrd ); 203 173 //============================================================================================= 174 // Kernel Scheduling logic 175 //============================================================================================= 204 176 //Main of the processor contexts 205 177 void main(processorCtx_t * runner) { … … 207 179 LIB_DEBUG_PRINTF("Kernel : core %p starting\n", this); 208 180 209 fenv_t envp;210 fegetenv( &envp );211 LIB_DEBUG_PRINTF("Kernel : mxcsr %x\n", envp.__mxcsr);212 213 181 thread * readyThread = NULL; 214 for( unsigned int spin_count = 0; ! this-> terminated; spin_count++ ) {215 182 for( unsigned int spin_count = 0; ! this->is_terminated; spin_count++ ) 183 { 216 184 readyThread = nextThread( this->cltr ); 217 185 218 if(readyThread) { 219 scheduleInternal(this, readyThread); 186 if(readyThread) 187 { 188 runThread(this, readyThread); 189 190 //Some actions need to be taken from the kernel 191 finishRunning(this); 192 220 193 spin_count = 0; 221 } else { 194 } 195 else 196 { 222 197 spin(this, &spin_count); 223 198 } … … 225 200 226 201 LIB_DEBUG_PRINTF("Kernel : core %p unlocking thread\n", this); 227 unlock( &this->lock);202 signal( &this->terminated ); 228 203 LIB_DEBUG_PRINTF("Kernel : core %p terminated\n", this); 229 204 } 230 205 231 //Declarations for scheduleInternal 232 extern void ThreadCtxSwitch(coroutine * src, coroutine * dst); 233 234 // scheduleInternal runs a thread by context switching 206 // runThread runs a thread by context switching 235 207 // from the processor coroutine to the target thread 236 void scheduleInternal(processor * this, thread * dst) { 237 this->thread_action = NoAction; 238 239 // coroutine * proc_ctx = get_coroutine(this->ctx); 240 // coroutine * thrd_ctx = get_coroutine(dst); 241 242 // //Update global state 243 // this->current_thread = dst; 244 245 // // Context Switch to the thread 246 // ThreadCtxSwitch(proc_ctx, thrd_ctx); 247 // // when ThreadCtxSwitch returns we are back in the processor coroutine 248 249 coroutine * proc_ctx = get_coroutine(this->runner); 250 coroutine * thrd_ctx = get_coroutine(dst); 251 thrd_ctx->last = proc_ctx; 252 253 // context switch to specified coroutine 254 // Which is now the current_coroutine 255 // LIB_DEBUG_PRINTF("Kernel : switching to ctx %p (from %p, current %p)\n", thrd_ctx, proc_ctx, this->current_coroutine); 256 this->current_thread = dst; 257 this->current_coroutine = thrd_ctx; 258 CtxSwitch( proc_ctx->stack.context, thrd_ctx->stack.context ); 259 this->current_coroutine = proc_ctx; 260 // LIB_DEBUG_PRINTF("Kernel : returned from ctx %p (to %p, current %p)\n", thrd_ctx, proc_ctx, this->current_coroutine); 261 262 // when CtxSwitch returns we are back in the processor coroutine 263 if(this->thread_action == Reschedule) { 264 thread_schedule( dst ); 208 void runThread(processor * this, thread * dst) { 209 coroutine * proc_cor = get_coroutine(this->runner); 210 coroutine * thrd_cor = get_coroutine(dst); 211 212 //Reset the terminating actions here 213 this->finish.action_code = No_Action; 214 215 //Update global state 216 this->current_thread = dst; 217 218 // Context Switch to the thread 219 ThreadCtxSwitch(proc_cor, thrd_cor); 220 // when ThreadCtxSwitch returns we are back in the processor coroutine 221 } 222 223 // Once a thread has finished running, some of 224 // its final actions must be executed from the kernel 225 void finishRunning(processor * this) { 226 if( this->finish.action_code == Release ) { 227 unlock( this->finish.lock ); 228 } 229 else if( this->finish.action_code == Schedule ) { 230 ScheduleThread( this->finish.thrd ); 231 } 232 else if( this->finish.action_code == Release_Schedule ) { 233 unlock( this->finish.lock ); 234 ScheduleThread( this->finish.thrd ); 235 } 236 else { 237 assert(this->finish.action_code == No_Action); 265 238 } 266 239 } … … 301 274 proc_cor_storage.c.state = Active; 302 275 main( &proc_cor_storage ); 303 proc_cor_storage.c.state = Halt; 304 proc_cor_storage.c.notHalted = false; 276 proc_cor_storage.c.state = Halted; 305 277 306 278 // Main routine of the core returned, the core is now fully terminated … … 325 297 //----------------------------------------------------------------------------- 326 298 // Scheduler routines 327 void thread_schedule( thread * thrd ) {299 void ScheduleThread( thread * thrd ) { 328 300 assertf( thrd->next == NULL, "Expected null got %p", thrd->next ); 329 301 330 spin_lock( &lock );302 lock( &systemProcessor->cltr->lock ); 331 303 append( &systemProcessor->cltr->ready_queue, thrd ); 332 spin_unlock( &lock );304 unlock( &systemProcessor->cltr->lock ); 333 305 } 334 306 335 307 thread * nextThread(cluster * this) { 336 spin_lock( &lock );308 lock( &this->lock ); 337 309 thread * head = pop_head( &this->ready_queue ); 338 spin_unlock( &lock );310 unlock( &this->lock ); 339 311 return head; 312 } 313 314 void ScheduleInternal() { 315 suspend(); 316 } 317 318 void ScheduleInternal( spinlock * lock ) { 319 get_this_processor()->finish.action_code = Release; 320 get_this_processor()->finish.lock = lock; 321 suspend(); 322 } 323 324 void ScheduleInternal( thread * thrd ) { 325 get_this_processor()->finish.action_code = Schedule; 326 get_this_processor()->finish.thrd = thrd; 327 suspend(); 328 } 329 330 void ScheduleInternal( spinlock * lock, thread * thrd ) { 331 get_this_processor()->finish.action_code = Release_Schedule; 332 get_this_processor()->finish.lock = lock; 333 get_this_processor()->finish.thrd = thrd; 334 suspend(); 340 335 } 341 336 … … 363 358 // Add the main thread to the ready queue 364 359 // once resume is called on systemProcessor->ctx the mainThread needs to be scheduled like any normal thread 365 thread_schedule(mainThread);360 ScheduleThread(mainThread); 366 361 367 362 //initialize the global state variables … … 387 382 // When its coroutine terminates, it return control to the mainThread 388 383 // which is currently here 389 systemProcessor-> terminated = true;384 systemProcessor->is_terminated = true; 390 385 suspend(); 391 386 … … 406 401 //----------------------------------------------------------------------------- 407 402 // Locks 408 void ?{}( simple_lock * this ) { 409 ( &this->blocked ){}; 410 } 411 412 void ^?{}( simple_lock * this ) { 413 414 } 415 416 void lock( simple_lock * this ) { 403 void ?{}( spinlock * this ) { 404 this->lock = 0; 405 } 406 void ^?{}( spinlock * this ) { 407 408 } 409 410 void lock( spinlock * this ) { 411 for ( unsigned int i = 1;; i += 1 ) { 412 if ( this->lock == 0 && __sync_lock_test_and_set_4( &this->lock, 1 ) == 0 ) break; 413 } 414 } 415 416 void unlock( spinlock * this ) { 417 __sync_lock_release_4( &this->lock ); 418 } 419 420 void ?{}( signal_once * this ) { 421 this->condition = false; 422 } 423 void ^?{}( signal_once * this ) { 424 425 } 426 427 void wait( signal_once * this ) { 428 lock( &this->lock ); 429 if( !this->condition ) { 430 append( &this->blocked, this_thread() ); 431 ScheduleInternal( &this->lock ); 432 lock( &this->lock ); 433 } 434 unlock( &this->lock ); 435 } 436 437 void signal( signal_once * this ) { 438 lock( &this->lock ); 417 439 { 418 spin_lock( &lock ); 419 append( &this->blocked, this_thread() ); 420 spin_unlock( &lock ); 421 } 422 suspend(); 423 } 424 425 void unlock( simple_lock * this ) { 426 thread * it; 427 while( it = pop_head( &this->blocked) ) { 428 thread_schedule( it ); 429 } 440 this->condition = true; 441 442 thread * it; 443 while( it = pop_head( &this->blocked) ) { 444 ScheduleThread( it ); 445 } 446 } 447 unlock( &this->lock ); 430 448 } 431 449 -
src/libcfa/concurrency/threads.c
raa9ee19 r97f65d5 17 17 #include "threads" 18 18 19 #include "kernel "19 #include "kernel_private.h" 20 20 #include "libhdr.h" 21 21 … … 44 44 (&this->c){}; 45 45 this->c.name = "Anonymous Coroutine"; 46 (&this-> lock){};46 (&this->terminated){}; 47 47 this->next = NULL; 48 48 } … … 72 72 //----------------------------------------------------------------------------- 73 73 // Starting and stopping threads 74 extern "C" {75 forall(dtype T | is_thread(T))76 void CtxInvokeThread(T * this);77 }78 79 extern void thread_schedule( thread * );80 81 74 forall( dtype T | is_thread(T) ) 82 75 void start( T* this ) { … … 92 85 CtxSwitch( thrd_c->last->stack.context, thrd_c->stack.context ); 93 86 94 fenv_t envp; 95 fegetenv( &envp ); 96 LIB_DEBUG_PRINTF("Thread : mxcsr %x\n", envp.__mxcsr); 97 LIB_DEBUG_PRINTF("Thread started : %p (t %p, c %p)\n", this, thrd_c, thrd_h); 98 99 thread_schedule(thrd_h); 87 ScheduleThread(thrd_h); 100 88 } 101 89 102 90 forall( dtype T | is_thread(T) ) 103 91 void stop( T* this ) { 104 thread* thrd = get_thread(this); 105 if( thrd->c.notHalted ) { 106 lock( &thrd->lock ); 107 } 92 wait( & get_thread(this)->terminated ); 108 93 } 109 94 110 95 void yield( void ) { 111 get_this_processor()->thread_action = Reschedule; 112 suspend(); 96 ScheduleInternal( get_this_processor()->current_thread ); 113 97 } 114 98 115 99 void ThreadCtxSwitch(coroutine* src, coroutine* dst) { 100 // set state of current coroutine to inactive 101 src->state = Inactive; 102 dst->state = Active; 103 104 //update the last resumer 116 105 dst->last = src; 117 106 118 // set state of current coroutine to inactive 119 src->state = Inactive; 120 121 // set new coroutine that task is executing 107 // set new coroutine that the processor is executing 108 // and context switch to it 122 109 get_this_processor()->current_coroutine = dst; 123 124 // context switch to specified coroutine125 110 CtxSwitch( src->stack.context, dst->stack.context ); 126 // when CtxSwitch returns we are back in the src coroutine111 get_this_processor()->current_coroutine = src; 127 112 128 113 // set state of new coroutine to active 114 dst->state = Inactive; 129 115 src->state = Active; 130 116 } … … 134 120 extern "C" { 135 121 void __thread_signal_termination( thread * this ) { 136 this->c.state = Halt ;137 this->c.notHalted = false;138 unlock( &this->lock );122 this->c.state = Halted; 123 LIB_DEBUG_PRINTF("Thread end : %p\n", this); 124 signal( &this->terminated ); 139 125 } 140 126 } -
src/tests/.expect/castError.txt
raa9ee19 r97f65d5 1 Error: Can't choose between 3 alternatives for expression Cast of:1 castError.c:7 error: Can't choose between 3 alternatives for expression Cast of: 2 2 Name: f 3 3 -
src/tests/.expect/completeTypeError.txt
raa9ee19 r97f65d5 1 Error: No reasonable alternatives for expression Applying untyped:1 completeTypeError.c:34 error: No reasonable alternatives for expression Applying untyped: 2 2 Name: *? 3 3 ...to: … … 5 5 6 6 7 Error: No reasonable alternatives for expression Applying untyped:7 completeTypeError.c:36 error: No reasonable alternatives for expression Applying untyped: 8 8 Name: baz 9 9 ...to: … … 11 11 12 12 13 Error: No reasonable alternatives for expression Applying untyped:13 completeTypeError.c:37 error: No reasonable alternatives for expression Applying untyped: 14 14 Name: quux 15 15 ...to: … … 17 17 18 18 19 Error: No reasonable alternatives for expression Applying untyped:19 completeTypeError.c:58 error: No reasonable alternatives for expression Applying untyped: 20 20 Name: baz 21 21 ...to: … … 23 23 24 24 25 Error: No reasonable alternatives for expression Applying untyped:25 completeTypeError.c:59 error: No reasonable alternatives for expression Applying untyped: 26 26 Name: quux 27 27 ...to: … … 29 29 30 30 31 Error: No reasonable alternatives for expression Applying untyped:31 completeTypeError.c:60 error: No reasonable alternatives for expression Applying untyped: 32 32 Name: *? 33 33 ...to: … … 35 35 36 36 37 Error: No reasonable alternatives for expression Applying untyped:37 completeTypeError.c:72 error: No reasonable alternatives for expression Applying untyped: 38 38 Name: baz 39 39 ...to: -
src/tests/.expect/constant0-1DP.txt
raa9ee19 r97f65d5 1 Error: duplicate object definition for 0: signed int2 Error: duplicate object definition for 0: const signed int3 Error: duplicate object definition for 1: signed int4 Error: duplicate object definition for 1: const signed int5 Error: duplicate object definition for 0: signed int6 Error: duplicate object definition for 1: signed int7 Error: duplicate object definition for 0: signed int8 Error: duplicate object definition for 1: signed int9 Error: duplicate object definition for 0: const signed int10 Error: duplicate object definition for 1: const signed int11 Error: duplicate object definition for 0: const signed int12 Error: duplicate object definition for 1: const signed int13 Error: duplicate object definition for 0: pointer to signed int14 Error: duplicate object definition for 1: pointer to signed int15 Error: duplicate object definition for 0: pointer to signed int16 Error: duplicate object definition for 1: pointer to signed int17 Error: duplicate object definition for 0: pointer to signed int18 Error: duplicate object definition for 1: pointer to signed int19 Error: duplicate object definition for 0: pointer to signed int20 Error: duplicate object definition for 1: pointer to signed int21 Error: duplicate object definition for 0: const pointer to signed int22 Error: duplicate object definition for 1: const pointer to signed int23 Error: duplicate object definition for 0: const pointer to signed int24 Error: duplicate object definition for 1: const pointer to signed int25 Error: duplicate object definition for 0: const pointer to signed int26 Error: duplicate object definition for 1: const pointer to signed int27 Error: duplicate object definition for x: const pointer to pointer to signed int28 Error: duplicate object definition for 0: pointer to pointer to signed int29 Error: duplicate object definition for x: const pointer to pointer to signed int30 Error: duplicate object definition for 0: pointer to pointer to signed int31 Error: duplicate object definition for x: const pointer to pointer to signed int32 Error: duplicate object definition for 0: pointer to pointer to signed int1 constant0-1.c:14 error: duplicate object definition for 0: signed int 2 constant0-1.c:15 error: duplicate object definition for 0: const signed int 3 constant0-1.c:16 error: duplicate object definition for 1: signed int 4 constant0-1.c:17 error: duplicate object definition for 1: const signed int 5 constant0-1.c:18 error: duplicate object definition for 0: signed int 6 constant0-1.c:18 error: duplicate object definition for 1: signed int 7 constant0-1.c:19 error: duplicate object definition for 0: signed int 8 constant0-1.c:19 error: duplicate object definition for 1: signed int 9 constant0-1.c:20 error: duplicate object definition for 0: const signed int 10 constant0-1.c:20 error: duplicate object definition for 1: const signed int 11 constant0-1.c:21 error: duplicate object definition for 0: const signed int 12 constant0-1.c:21 error: duplicate object definition for 1: const signed int 13 constant0-1.c:39 error: duplicate object definition for 0: pointer to signed int 14 constant0-1.c:39 error: duplicate object definition for 1: pointer to signed int 15 constant0-1.c:40 error: duplicate object definition for 0: pointer to signed int 16 constant0-1.c:40 error: duplicate object definition for 1: pointer to signed int 17 constant0-1.c:41 error: duplicate object definition for 0: pointer to signed int 18 constant0-1.c:41 error: duplicate object definition for 1: pointer to signed int 19 constant0-1.c:42 error: duplicate object definition for 0: pointer to signed int 20 constant0-1.c:42 error: duplicate object definition for 1: pointer to signed int 21 constant0-1.c:43 error: duplicate object definition for 0: const pointer to signed int 22 constant0-1.c:43 error: duplicate object definition for 1: const pointer to signed int 23 constant0-1.c:44 error: duplicate object definition for 0: const pointer to signed int 24 constant0-1.c:44 error: duplicate object definition for 1: const pointer to signed int 25 constant0-1.c:45 error: duplicate object definition for 0: const pointer to signed int 26 constant0-1.c:45 error: duplicate object definition for 1: const pointer to signed int 27 constant0-1.c:46 error: duplicate object definition for x: const pointer to pointer to signed int 28 constant0-1.c:46 error: duplicate object definition for 0: pointer to pointer to signed int 29 constant0-1.c:47 error: duplicate object definition for x: const pointer to pointer to signed int 30 constant0-1.c:47 error: duplicate object definition for 0: pointer to pointer to signed int 31 constant0-1.c:50 error: duplicate object definition for x: const pointer to pointer to signed int 32 constant0-1.c:50 error: duplicate object definition for 0: pointer to pointer to signed int 33 33 make: *** [constant0-1DP] Error 1 -
src/tests/.expect/constant0-1NDDP.txt
raa9ee19 r97f65d5 1 Error: duplicate object definition for 0: signed int2 Error: duplicate object definition for 0: const signed int3 Error: duplicate object definition for 1: signed int4 Error: duplicate object definition for 1: const signed int5 Error: duplicate object definition for 0: signed int6 Error: duplicate object definition for 1: signed int7 Error: duplicate object definition for 0: signed int8 Error: duplicate object definition for 1: signed int9 Error: duplicate object definition for 0: const signed int10 Error: duplicate object definition for 1: const signed int11 Error: duplicate object definition for 0: const signed int12 Error: duplicate object definition for 1: const signed int13 Error: duplicate object definition for x: pointer to signed int14 Error: duplicate object definition for 0: pointer to signed int15 Error: duplicate object definition for x: const pointer to signed int16 Error: duplicate object definition for 0: const pointer to signed int1 constant0-1.c:14 error: duplicate object definition for 0: signed int 2 constant0-1.c:15 error: duplicate object definition for 0: const signed int 3 constant0-1.c:16 error: duplicate object definition for 1: signed int 4 constant0-1.c:17 error: duplicate object definition for 1: const signed int 5 constant0-1.c:18 error: duplicate object definition for 0: signed int 6 constant0-1.c:18 error: duplicate object definition for 1: signed int 7 constant0-1.c:19 error: duplicate object definition for 0: signed int 8 constant0-1.c:19 error: duplicate object definition for 1: signed int 9 constant0-1.c:20 error: duplicate object definition for 0: const signed int 10 constant0-1.c:20 error: duplicate object definition for 1: const signed int 11 constant0-1.c:21 error: duplicate object definition for 0: const signed int 12 constant0-1.c:21 error: duplicate object definition for 1: const signed int 13 constant0-1.c:66 error: duplicate object definition for x: pointer to signed int 14 constant0-1.c:66 error: duplicate object definition for 0: pointer to signed int 15 constant0-1.c:67 error: duplicate object definition for x: const pointer to signed int 16 constant0-1.c:67 error: duplicate object definition for 0: const pointer to signed int 17 17 make: *** [constant0-1NDDP] Error 1 -
src/tests/.expect/declarationErrors.txt
raa9ee19 r97f65d5 1 Error: duplicate static in declaration of x1: static const volatile short int1 declarationErrors.c:16 error: duplicate static in declaration of x1: static const volatile short int 2 2 3 Error: conflicting extern & static in declaration of x2: extern const volatile short int3 declarationErrors.c:17 error: conflicting extern & static in declaration of x2: extern const volatile short int 4 4 5 Error: conflicting extern & auto, conflicting extern & static, conflicting extern & static, duplicate extern in declaration of x3: extern const volatile short int5 declarationErrors.c:18 error: conflicting extern & auto, conflicting extern & static, conflicting extern & static, duplicate extern in declaration of x3: extern const volatile short int 6 6 7 Error: duplicate static in declaration of x4: static const volatile instance of const volatile struct __anonymous07 declarationErrors.c:19 error: duplicate static in declaration of x4: static const volatile instance of const volatile struct __anonymous0 8 8 with members 9 9 with body 10 10 11 11 12 Error: duplicate const, duplicate static, duplicate volatile in declaration of x5: static const volatile instance of const volatile struct __anonymous112 declarationErrors.c:20 error: duplicate const, duplicate static, duplicate volatile in declaration of x5: static const volatile instance of const volatile struct __anonymous1 13 13 with members 14 14 with body 15 15 16 16 17 Error: duplicate static in declaration of x6: static const volatile instance of type Int17 declarationErrors.c:22 error: duplicate static in declaration of x6: static const volatile instance of type Int 18 18 19 Error: duplicate const in declaration of f01: static inline function19 declarationErrors.c:24 error: duplicate const in declaration of f01: static inline function 20 20 with no parameters 21 21 returning const volatile int 22 22 23 23 24 Error: duplicate volatile in declaration of f02: static inline function24 declarationErrors.c:25 error: duplicate volatile in declaration of f02: static inline function 25 25 with no parameters 26 26 returning const volatile int 27 27 28 28 29 Error: duplicate const in declaration of f03: static inline function29 declarationErrors.c:26 error: duplicate const in declaration of f03: static inline function 30 30 with no parameters 31 31 returning const volatile int 32 32 33 33 34 Error: duplicate volatile in declaration of f04: static inline function34 declarationErrors.c:27 error: duplicate volatile in declaration of f04: static inline function 35 35 with no parameters 36 36 returning const volatile int 37 37 38 38 39 Error: duplicate const in declaration of f05: static inline function39 declarationErrors.c:28 error: duplicate const in declaration of f05: static inline function 40 40 with no parameters 41 41 returning const volatile int 42 42 43 43 44 Error: duplicate volatile in declaration of f06: static inline function44 declarationErrors.c:29 error: duplicate volatile in declaration of f06: static inline function 45 45 with no parameters 46 46 returning const volatile int 47 47 48 48 49 Error: duplicate const in declaration of f07: static inline function49 declarationErrors.c:30 error: duplicate const in declaration of f07: static inline function 50 50 with no parameters 51 51 returning const volatile int 52 52 53 53 54 Error: duplicate const, duplicate volatile in declaration of f08: static inline function54 declarationErrors.c:31 error: duplicate const, duplicate volatile in declaration of f08: static inline function 55 55 with no parameters 56 56 returning const volatile int 57 57 58 58 59 Error: duplicate const, duplicate volatile in declaration of f09: static inline function59 declarationErrors.c:33 error: duplicate const, duplicate volatile in declaration of f09: static inline function 60 60 with no parameters 61 61 returning const volatile int 62 62 63 63 64 Error: duplicate const, duplicate _Atomic, duplicate _Atomic, duplicate const, duplicate restrict, duplicate volatile in declaration of f09: static inline function64 declarationErrors.c:34 error: duplicate const, duplicate _Atomic, duplicate _Atomic, duplicate const, duplicate restrict, duplicate volatile in declaration of f09: static inline function 65 65 with no parameters 66 66 returning const restrict volatile _Atomic int -
src/tests/.expect/dtor-early-exit-ERR1.txt
raa9ee19 r97f65d5 1 Error: jump to label 'L1' crosses initialization of y Branch (Goto)1 dtor-early-exit.c:142 error: jump to label 'L1' crosses initialization of y Branch (Goto) 2 2 3 3 make: *** [dtor-early-exit-ERR1] Error 1 -
src/tests/.expect/dtor-early-exit-ERR2.txt
raa9ee19 r97f65d5 1 Error: jump to label 'L2' crosses initialization of y Branch (Goto)1 dtor-early-exit.c:142 error: jump to label 'L2' crosses initialization of y Branch (Goto) 2 2 3 3 make: *** [dtor-early-exit-ERR2] Error 1 -
src/tests/.expect/memberCtors-ERR1.txt
raa9ee19 r97f65d5 1 Error: in void ?{}(struct B *b), field a2 used before being constructed1 error: in void ?{}(struct B *b), field a2 used before being constructed 2 2 make: *** [memberCtors-ERR1] Error 1 -
src/tests/.expect/scopeErrors.txt
raa9ee19 r97f65d5 1 Error: duplicate object definition for thisIsAnError: signed int2 Error: duplicate function definition for butThisIsAnError: function1 scopeErrors.c:2 error: duplicate object definition for thisIsAnError: signed int 2 scopeErrors.c:20 error: duplicate function definition for butThisIsAnError: function 3 3 with parameters 4 4 double -
src/tests/thread.c
raa9ee19 r97f65d5 4 4 #include <threads> 5 5 6 struct First { thread t; si mple_lock* lock; };7 struct Second { thread t; si mple_lock* lock; };6 struct First { thread t; signal_once* lock; }; 7 struct Second { thread t; signal_once* lock; }; 8 8 9 9 DECL_THREAD(First); 10 10 DECL_THREAD(Second); 11 11 12 void ?{}( First * this, si mple_lock* lock ) { this->lock = lock; }13 void ?{}( Second * this, si mple_lock* lock ) { this->lock = lock; }12 void ?{}( First * this, signal_once* lock ) { this->lock = lock; } 13 void ?{}( Second * this, signal_once* lock ) { this->lock = lock; } 14 14 15 15 void main(First* this) { … … 18 18 yield(); 19 19 } 20 unlock(this->lock);20 signal(this->lock); 21 21 } 22 22 23 23 void main(Second* this) { 24 lock(this->lock);24 wait(this->lock); 25 25 for(int i = 0; i < 10; i++) { 26 26 sout | "Second : Suspend No." | i + 1 | endl; … … 31 31 32 32 int main(int argc, char* argv[]) { 33 si mple_locklock;33 signal_once lock; 34 34 sout | "User main begin" | endl; 35 35 { 36 //processor p;36 processor p; 37 37 { 38 38 scoped(First) f = { &lock };
Note: See TracChangeset
for help on using the changeset viewer.