Changes in / [f704974:ae151cf]
- Files:
-
- 7 added
- 5 deleted
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
Jenkins/FullBuild
rf704974 rae151cf 18 18 19 19 parallel ( 20 gcc_08_x86_new: { trigger_build( 'gcc-10', 'x86' ) },21 gcc_07_x86_new: { trigger_build( 'gcc-9', 'x86' ) },22 gcc_10_x64_new: { trigger_build( 'gcc-10', 'x64' ) },23 gcc_09_x64_new: { trigger_build( 'gcc-9', 'x64' ) },24 gcc_08_x64_new: { trigger_build( 'gcc-8', 'x64' ) },25 gcc_07_x64_new: { trigger_build( 'gcc-7', 'x64' ) },26 gcc_06_x64_new: { trigger_build( 'gcc-6', 'x64' ) },27 clang_x64_new: { trigger_build( 'clang', 'x64' ) },20 gcc_08_x86_new: { trigger_build( 'gcc-10', 'x86', false ) }, 21 gcc_07_x86_new: { trigger_build( 'gcc-9', 'x86', false ) }, 22 gcc_10_x64_new: { trigger_build( 'gcc-10', 'x64', false ) }, 23 gcc_09_x64_new: { trigger_build( 'gcc-9', 'x64', false ) }, 24 gcc_08_x64_new: { trigger_build( 'gcc-8', 'x64', false ) }, 25 gcc_07_x64_new: { trigger_build( 'gcc-7', 'x64', false ) }, 26 gcc_06_x64_new: { trigger_build( 'gcc-6', 'x64', false ) }, 27 clang_x64_new: { trigger_build( 'clang', 'x64', true ) }, 28 28 ) 29 29 } … … 67 67 //=========================================================================================================== 68 68 69 def trigger_build(String cc, String arch ) {69 def trigger_build(String cc, String arch, boolean doc) { 70 70 // Randomly delay the builds by a random amount to avoid hitting the SC server to hard 71 71 sleep(time: 5 * Math.random(), unit:"MINUTES") … … 92 92 [$class: 'BooleanParameterValue', \ 93 93 name: 'BuildDocumentation', \ 94 value: true], \94 value: doc], \ 95 95 [$class: 'BooleanParameterValue', \ 96 96 name: 'Publish', \ -
libcfa/src/assert.cfa
rf704974 rae151cf 25 25 26 26 #define CFA_ASSERT_FMT "Cforall Assertion error \"%s\" from program \"%s\" in \"%s\" at line %d in file \"%s\"" 27 #define CFA_WARNING_FMT "Cforall Assertion warning \"%s\" from program \"%s\" in \"%s\" at line %d in file \"%s\"" 27 28 28 29 // called by macro assert in assert.h … … 48 49 abort(); 49 50 } 51 52 // called by macro warnf 53 // would be cool to remove libcfa_public but it's needed for libcfathread 54 void __assert_warn_f( const char assertion[], const char file[], unsigned int line, const char function[], const char fmt[], ... ) libcfa_public { 55 __cfaabi_bits_acquire(); 56 __cfaabi_bits_print_nolock( STDERR_FILENO, CFA_WARNING_FMT ": ", assertion, __progname, function, line, file ); 57 58 va_list args; 59 va_start( args, fmt ); 60 __cfaabi_bits_print_vararg( STDERR_FILENO, fmt, args ); 61 va_end( args ); 62 63 __cfaabi_bits_print_nolock( STDERR_FILENO, "\n" ); 64 __cfaabi_bits_release(); 65 } 50 66 } 51 67 -
libcfa/src/concurrency/alarm.cfa
rf704974 rae151cf 55 55 this.period = period; 56 56 this.thrd = thrd; 57 this. timeval= __kernel_get_time() + alarm;57 this.deadline = __kernel_get_time() + alarm; 58 58 set = false; 59 59 type = User; … … 64 64 this.period = period; 65 65 this.proc = proc; 66 this. timeval= __kernel_get_time() + alarm;66 this.deadline = __kernel_get_time() + alarm; 67 67 set = false; 68 68 type = Kernel; … … 72 72 this.initial = alarm; 73 73 this.period = period; 74 this. timeval= __kernel_get_time() + alarm;74 this.deadline = __kernel_get_time() + alarm; 75 75 set = false; 76 76 type = Callback; … … 85 85 void insert( alarm_list_t * this, alarm_node_t * n ) { 86 86 alarm_node_t * it = & (*this)`first; 87 while( it && (n-> timeval > it->timeval) ) {87 while( it && (n->deadline > it->deadline) ) { 88 88 it = & (*it)`next; 89 89 } … … 116 116 117 117 Time curr = __kernel_get_time(); 118 __cfadbg_print_safe( preemption, " KERNEL: alarm inserting %p (%lu -> %lu).\n", this, curr.tn, this-> timeval.tn );118 __cfadbg_print_safe( preemption, " KERNEL: alarm inserting %p (%lu -> %lu).\n", this, curr.tn, this->deadline.tn ); 119 119 insert( &alarms, this ); 120 __kernel_set_timer( this-> timeval- curr);120 __kernel_set_timer( this->deadline - curr); 121 121 this->set = true; 122 122 } -
libcfa/src/concurrency/alarm.hfa
rf704974 rae151cf 57 57 }; 58 58 59 Time timeval;// actual time at which the alarm goes off59 Time deadline; // actual time at which the alarm goes off 60 60 enum alarm_type type; // true if this is not a user defined alarm 61 61 bool set :1; // whether or not the alarm has be registered -
libcfa/src/concurrency/io.cfa
rf704974 rae151cf 201 201 __atomic_unlock(&ctx->cq.lock); 202 202 203 touch_tsc( cltr->sched.io.tscs, ctx->cq.id, ts_prev, ts_next );203 touch_tsc( cltr->sched.io.tscs, ctx->cq.id, ts_prev, ts_next, false ); 204 204 205 205 return true; 206 206 } 207 207 208 bool __cfa_io_drain( processor * proc ) {208 bool __cfa_io_drain( struct processor * proc ) { 209 209 bool local = false; 210 210 bool remote = false; … … 243 243 /* paranoid */ verify( io.tscs[target].t.tv != ULLONG_MAX ); 244 244 HELP: if(target < ctxs_count) { 245 const unsigned long long cutoff = calc_cutoff(ctsc, ctx->cq.id, ctxs_count, io.data, io.tscs, __shard_factor.io );246 const unsigned long long age = moving_average(ctsc, io.tscs[target].t.tv, io.tscs[target].t.ma );245 const unsigned long long cutoff = calc_cutoff(ctsc, ctx->cq.id, ctxs_count, io.data, io.tscs, __shard_factor.io, false); 246 const unsigned long long age = moving_average(ctsc, io.tscs[target].t.tv, io.tscs[target].t.ma, false); 247 247 __cfadbg_print_safe(io, "Kernel I/O: Help attempt on %u from %u, age %'llu vs cutoff %'llu, %s\n", target, ctx->cq.id, age, cutoff, age > cutoff ? "yes" : "no"); 248 248 if(age <= cutoff) break HELP; … … 273 273 } 274 274 275 bool __cfa_io_flush( processor * proc ) {275 bool __cfa_io_flush( struct processor * proc ) { 276 276 /* paranoid */ verify( ! __preemption_enabled() ); 277 277 /* paranoid */ verify( proc ); … … 353 353 354 354 disable_interrupts(); 355 processor * proc = __cfaabi_tls.this_processor;355 struct processor * proc = __cfaabi_tls.this_processor; 356 356 io_context$ * ctx = proc->io.ctx; 357 357 /* paranoid */ verify( __cfaabi_tls.this_processor ); … … 433 433 disable_interrupts(); 434 434 __STATS__( true, if(!lazy) io.submit.eagr += 1; ) 435 processor * proc = __cfaabi_tls.this_processor;435 struct processor * proc = __cfaabi_tls.this_processor; 436 436 io_context$ * ctx = proc->io.ctx; 437 437 /* paranoid */ verify( __cfaabi_tls.this_processor ); … … 641 641 642 642 #if defined(CFA_WITH_IO_URING_IDLE) 643 bool __kernel_read( processor * proc, io_future_t & future, iovec & iov, int fd) {643 bool __kernel_read(struct processor * proc, io_future_t & future, iovec & iov, int fd) { 644 644 io_context$ * ctx = proc->io.ctx; 645 645 /* paranoid */ verify( ! __preemption_enabled() ); … … 692 692 } 693 693 694 void __cfa_io_idle( processor * proc ) {694 void __cfa_io_idle( struct processor * proc ) { 695 695 iovec iov; 696 696 __atomic_acquire( &proc->io.ctx->cq.lock ); -
libcfa/src/concurrency/io/types.hfa
rf704974 rae151cf 127 127 struct __attribute__((aligned(64))) io_context$ { 128 128 io_arbiter$ * arbiter; 129 processor * proc;129 struct processor * proc; 130 130 131 131 __outstanding_io_queue ext_sq; -
libcfa/src/concurrency/kernel/cluster.cfa
rf704974 rae151cf 254 254 } 255 255 256 static void assign_list(unsigned & valrq, unsigned & valio, dlist( processor) & list, unsigned count) {257 processor * it = &list`first;256 static void assign_list(unsigned & valrq, unsigned & valio, dlist(struct processor) & list, unsigned count) { 257 struct processor * it = &list`first; 258 258 for(unsigned i = 0; i < count; i++) { 259 259 /* paranoid */ verifyf( it, "Unexpected null iterator, at index %u of %u\n", i, count); … … 278 278 279 279 #if defined(CFA_HAVE_LINUX_IO_URING_H) 280 static void assign_io(io_context$ ** data, size_t count, dlist( processor) & list) {281 processor * it = &list`first;280 static void assign_io(io_context$ ** data, size_t count, dlist(struct processor) & list) { 281 struct processor * it = &list`first; 282 282 while(it) { 283 283 /* paranoid */ verifyf( it, "Unexpected null iterator\n"); -
libcfa/src/concurrency/kernel/cluster.hfa
rf704974 rae151cf 21 21 #include <limits.h> 22 22 23 #include "clock.hfa" 24 23 25 //----------------------------------------------------------------------- 24 26 // Calc moving average based on existing average, before and current time. 25 static inline unsigned long long moving_average(unsigned long long currtsc, unsigned long long instsc, unsigned long long old_avg) { 26 /* paranoid */ verifyf( old_avg < 15000000000000, "Suspiciously large previous average: %'llu (%llx)\n", old_avg, old_avg ); 27 static inline unsigned long long moving_average(unsigned long long currtsc, unsigned long long instsc, unsigned long long old_avg, bool strict) { 28 (void)strict; // disable the warning around the fact this is unused in release. 29 /* paranoid */ warnf( !strict || old_avg < 33_000_000_000, "Suspiciously large previous average: %'llu (%llx), %'ldms \n", old_avg, old_avg, program()`ms ); 27 30 28 31 const unsigned long long new_val = currtsc > instsc ? currtsc - instsc : 0; … … 31 34 const unsigned long long old_weight = total_weight - new_weight; 32 35 const unsigned long long ret = ((new_weight * new_val) + (old_weight * old_avg)) / total_weight; 36 37 /* paranoid */ warnf( !strict || ret < 33_000_000_000, "Suspiciously large new average after %'ldms cputime: %'llu (%llx) from %'llu-%'llu (%'llu, %'llu) and %'llu\n", program()`ms, ret, ret, currtsc, instsc, new_val, new_val / 1000000, old_avg ); 33 38 return ret; 34 39 } 35 40 36 static inline void touch_tsc(__timestamp_t * tscs, size_t idx, unsigned long long ts_prev, unsigned long long ts_next ) {41 static inline void touch_tsc(__timestamp_t * tscs, size_t idx, unsigned long long ts_prev, unsigned long long ts_next, bool strict) { 37 42 if (ts_next == ULLONG_MAX) return; 38 43 unsigned long long now = rdtscl(); 39 44 unsigned long long pma = __atomic_load_n(&tscs[ idx ].t.ma, __ATOMIC_RELAXED); 40 45 __atomic_store_n(&tscs[ idx ].t.tv, ts_next, __ATOMIC_RELAXED); 41 __atomic_store_n(&tscs[ idx ].t.ma, moving_average(now, ts_prev, pma ), __ATOMIC_RELAXED);46 __atomic_store_n(&tscs[ idx ].t.ma, moving_average(now, ts_prev, pma, strict), __ATOMIC_RELAXED); 42 47 } 43 48 … … 51 56 Data_t * data, 52 57 __timestamp_t * tscs, 53 const unsigned shard_factor 58 const unsigned shard_factor, 59 bool strict 54 60 ) { 55 61 unsigned start = procid; … … 59 65 if(ptsc != ULLONG_MAX) { 60 66 /* paranoid */ verify( start + i < count ); 61 unsigned long long tsc = moving_average(ctsc, ptsc, tscs[start + i].t.ma );67 unsigned long long tsc = moving_average(ctsc, ptsc, tscs[start + i].t.ma, strict); 62 68 if(tsc > max) max = tsc; 63 69 } -
libcfa/src/concurrency/preemption.cfa
rf704974 rae151cf 104 104 static inline alarm_node_t * get_expired( alarm_list_t * alarms, Time currtime ) { 105 105 if( ! & (*alarms)`first ) return 0p; // If no alarms return null 106 if( (*alarms)`first. timeval>= currtime ) return 0p; // If alarms head not expired return null106 if( (*alarms)`first.deadline >= currtime ) return 0p; // If alarms head not expired return null 107 107 return pop(alarms); // Otherwise just pop head 108 108 } … … 140 140 if( period > 0 ) { 141 141 __cfadbg_print_buffer_local( preemption, " KERNEL: alarm period is %lu.\n", period`ns ); 142 node-> timeval= currtime + period; // Alarm is periodic, add currtime to it (used cached current time)142 node->deadline = currtime + period; // Alarm is periodic, add currtime to it (used cached current time) 143 143 insert( alarms, node ); // Reinsert the node for the next time it triggers 144 144 } … … 147 147 // If there are still alarms pending, reset the timer 148 148 if( & (*alarms)`first ) { 149 Duration delta = (*alarms)`first. timeval- currtime;149 Duration delta = (*alarms)`first.deadline - currtime; 150 150 __kernel_set_timer( delta ); 151 151 } -
libcfa/src/concurrency/ready_queue.cfa
rf704974 rae151cf 62 62 //----------------------------------------------------------------------- 63 63 __attribute__((hot)) void push(struct cluster * cltr, struct thread$ * thrd, unpark_hint hint) with (cltr->sched) { 64 processor * const proc = kernelTLS().this_processor;64 struct processor * const proc = kernelTLS().this_processor; 65 65 const bool external = (!proc) || (cltr != proc->cltr); 66 66 const bool remote = hint == UNPARK_REMOTE; … … 116 116 /* paranoid */ verify( kernelTLS().this_processor->rdq.id < lanes_count ); 117 117 118 processor * const proc = kernelTLS().this_processor;118 struct processor * const proc = kernelTLS().this_processor; 119 119 unsigned this = proc->rdq.id; 120 120 /* paranoid */ verify( this < lanes_count ); … … 139 139 /* paranoid */ verify( readyQ.tscs[target].t.tv != ULLONG_MAX ); 140 140 if(target < lanes_count) { 141 const unsigned long long cutoff = calc_cutoff(ctsc, proc->rdq.id, lanes_count, cltr->sched.readyQ.data, cltr->sched.readyQ.tscs, __shard_factor.readyq );142 const unsigned long long age = moving_average(ctsc, readyQ.tscs[target].t.tv, readyQ.tscs[target].t.ma );141 const unsigned long long cutoff = calc_cutoff(ctsc, proc->rdq.id, lanes_count, cltr->sched.readyQ.data, cltr->sched.readyQ.tscs, __shard_factor.readyq, true); 142 const unsigned long long age = moving_average(ctsc, readyQ.tscs[target].t.tv, readyQ.tscs[target].t.ma, false); 143 143 __cfadbg_print_safe(ready_queue, "Kernel : Help attempt on %u from %u, age %'llu vs cutoff %'llu, %s\n", target, this, age, cutoff, age > cutoff ? "yes" : "no"); 144 144 if(age > cutoff) { … … 214 214 __STATS( stats.success++; ) 215 215 216 touch_tsc(readyQ.tscs, w, ts_prev, ts_next );216 touch_tsc(readyQ.tscs, w, ts_prev, ts_next, true); 217 217 218 218 thrd->preferred = w / __shard_factor.readyq; -
libcfa/src/stdhdr/assert.h
rf704974 rae151cf 27 27 #define assertf( expr, fmt, ... ) ((expr) ? ((void)0) : __assert_fail_f(__VSTRINGIFY__(expr), __FILE__, __LINE__, __PRETTY_FUNCTION__, fmt, ## __VA_ARGS__ )) 28 28 29 void __assert_warn_f( const char assertion[], const char file[], unsigned int line, const char function[], const char fmt[], ... ) __attribute__((format( printf, 5, 6) )); 29 30 void __assert_fail_f( const char assertion[], const char file[], unsigned int line, const char function[], const char fmt[], ... ) __attribute__((noreturn, format( printf, 5, 6) )); 30 31 #endif 31 32 32 33 #if !defined(NDEBUG) && (defined(__CFA_DEBUG__) || defined(__CFA_VERIFY__)) 34 #define __CFA_WITH_VERIFY__ 33 35 #define verify(x) assert(x) 34 36 #define verifyf(x, ...) assertf(x, __VA_ARGS__) 35 37 #define verifyfail(...) 36 #define __CFA_WITH_VERIFY__38 #define warnf( expr, fmt, ... ) ({ static bool check_once##__LINE__ = false; if( false == check_once##__LINE__ && false == (expr)) { check_once##__LINE__ = true; __assert_warn_f(__VSTRINGIFY__(expr), __FILE__, __LINE__, __PRETTY_FUNCTION__, fmt, ## __VA_ARGS__ ); } }) 37 39 #else 38 40 #define verify(x) 39 41 #define verifyf(x, ...) 40 42 #define verifyfail(...) 43 #define warnf( expr, fmt, ... ) 41 44 #endif 42 45 -
src/Tuples/TupleExpansionNew.cpp
rf704974 rae151cf 10 10 // Created On : Mon Aug 23 15:36:09 2021 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue Sep 20 16:17:00 202213 // Update Count : 412 // Last Modified On : Mon Sep 26 10:25:00 2022 13 // Update Count : 5 14 14 // 15 15 … … 30 30 struct UniqueExprExpander final : public ast::WithDeclsToAdd<> { 31 31 const ast::Expr * postvisit( const ast::UniqueExpr * unqExpr ); 32 std::map< int, ast::ptr<ast::Expr> > decls; // not vector, because order added may not be increasing order 32 // Not a vector, because they may not be adding in increasing order. 33 std::map< int, ast::ptr<ast::Expr> > decls; 34 }; 35 36 /// Replaces Tuple Assign & Index Expressions, and Tuple Types. 37 struct TupleMainExpander final : 38 public ast::WithCodeLocation, 39 public ast::WithDeclsToAdd<>, 40 public ast::WithGuards, 41 public ast::WithVisitorRef<TupleMainExpander> { 42 ast::Expr const * postvisit( ast::TupleAssignExpr const * expr ); 43 44 void previsit( ast::CompoundStmt const * ); 45 ast::Expr const * postvisit( ast::Expr const * expr ); 46 ast::Type const * postvisit( ast::TupleType const * type ); 47 48 ast::Expr const * postvisit( ast::TupleIndexExpr const * expr ); 49 private: 50 ScopedMap< int, ast::StructDecl const * > typeMap; 51 }; 52 53 struct TupleExprExpander final { 54 ast::Expr const * postvisit( ast::TupleExpr const * expr ); 33 55 }; 34 56 … … 100 122 } 101 123 102 /// Replaces Tuple Assign & Index Expressions, and Tuple Types. 103 struct TupleMainExpander final : 104 public ast::WithCodeLocation, 105 public ast::WithDeclsToAdd<>, 106 public ast::WithGuards, 107 public ast::WithVisitorRef<TupleMainExpander> { 108 ast::Expr const * postvisit( ast::TupleAssignExpr const * expr ) { 109 // Just move the env on the new top level expression. 110 return ast::mutate_field( expr->stmtExpr.get(), 111 &ast::TupleAssignExpr::env, expr->env.get() ); 112 } 113 114 void previsit( ast::CompoundStmt const * ) { 115 GuardScope( typeMap ); 116 } 117 118 ast::Expr const * postvisit( ast::Expr const * expr ) { 119 if ( nullptr == expr->env ) { 120 return expr; 121 } 122 // TypeSubstitutions are never visited in the new Pass template, 123 // so it is done manually here, where all types have to be replaced. 124 return ast::mutate_field( expr, &ast::Expr::env, 125 expr->env->accept( *visitor ) ); 126 } 127 128 ast::Type const * postvisit( ast::TupleType const * type ) { 129 assert( location ); 130 unsigned tupleSize = type->size(); 131 if ( !typeMap.count( tupleSize ) ) { 132 ast::StructDecl * decl = new ast::StructDecl( *location, 133 toString( "_tuple", tupleSize, "_" ) 124 // Handles expansion of tuple assignment. 125 ast::Expr const * TupleMainExpander::postvisit( 126 ast::TupleAssignExpr const * expr ) { 127 // Just move the env on the new top level expression. 128 return ast::mutate_field( expr->stmtExpr.get(), 129 &ast::TupleAssignExpr::env, expr->env.get() ); 130 } 131 132 // Context information for tuple type expansion. 133 void TupleMainExpander::previsit( ast::CompoundStmt const * ) { 134 GuardScope( typeMap ); 135 } 136 137 // Make sure types in a TypeSubstitution are expanded. 138 ast::Expr const * TupleMainExpander::postvisit( ast::Expr const * expr ) { 139 if ( nullptr == expr->env ) { 140 return expr; 141 } 142 return ast::mutate_field( expr, &ast::Expr::env, 143 expr->env->accept( *visitor ) ); 144 } 145 146 // Create a generic tuple structure of a given size. 147 ast::StructDecl * createTupleStruct( 148 unsigned int tupleSize, CodeLocation const & location ) { 149 ast::StructDecl * decl = new ast::StructDecl( location, 150 toString( "_tuple", tupleSize, "_" ) 151 ); 152 decl->body = true; 153 154 for ( size_t i = 0 ; i < tupleSize ; ++i ) { 155 ast::TypeDecl * typeParam = new ast::TypeDecl( location, 156 toString( "tuple_param_", tupleSize, "_", i ), 157 ast::Storage::Classes(), 158 nullptr, 159 ast::TypeDecl::Dtype, 160 true 134 161 ); 135 decl->body = true; 136 137 for ( size_t i = 0 ; i < tupleSize ; ++i ) { 138 ast::TypeDecl * typeParam = new ast::TypeDecl( *location, 139 toString( "tuple_param_", tupleSize, "_", i ), 140 ast::Storage::Classes(), 141 nullptr, 142 ast::TypeDecl::Dtype, 143 true 144 ); 145 ast::ObjectDecl * member = new ast::ObjectDecl( *location, 146 toString( "field_", i ), 147 new ast::TypeInstType( typeParam ) 148 ); 149 decl->params.push_back( typeParam ); 150 decl->members.push_back( member ); 151 } 152 153 // Empty structures are not standard C. Add a dummy field to 154 // empty tuples to silence warnings when a compound literal 155 // `_tuple0_` is created. 156 if ( tupleSize == 0 ) { 157 decl->members.push_back( 158 new ast::ObjectDecl( *location, 159 "dummy", 160 new ast::BasicType( ast::BasicType::SignedInt ), 161 nullptr, 162 ast::Storage::Classes(), 163 // Does this have to be a C linkage? 164 ast::Linkage::C 165 ) 166 ); 167 } 168 typeMap[tupleSize] = decl; 169 declsToAddBefore.push_back( decl ); 170 } 171 172 ast::StructDecl const * decl = typeMap[ tupleSize ]; 173 ast::StructInstType * newType = 174 new ast::StructInstType( decl, type->qualifiers ); 175 for ( auto pair : group_iterate( type->types, decl->params ) ) { 176 ast::Type const * t = std::get<0>( pair ); 177 newType->params.push_back( 178 new ast::TypeExpr( *location, ast::deepCopy( t ) ) ); 179 } 180 return newType; 181 } 182 183 ast::Expr const * postvisit( ast::TupleIndexExpr const * expr ) { 184 CodeLocation const & location = expr->location; 185 ast::Expr const * tuple = expr->tuple.get(); 186 assert( tuple ); 187 unsigned int index = expr->index; 188 ast::TypeSubstitution const * env = expr->env.get(); 189 190 if ( auto tupleExpr = dynamic_cast<ast::TupleExpr const *>( tuple ) ) { 191 // Optimization: If it is a definitely pure tuple expr, 192 // then it can reduce to the only relevant component. 193 if ( !maybeImpureIgnoreUnique( tupleExpr ) ) { 194 assert( index < tupleExpr->exprs.size() ); 195 ast::ptr<ast::Expr> const & expr = 196 *std::next( tupleExpr->exprs.begin(), index ); 197 ast::Expr * ret = ast::mutate( expr.get() ); 198 ret->env = env; 199 return ret; 200 } 201 } 202 203 auto type = tuple->result.strict_as<ast::StructInstType>(); 204 ast::StructDecl const * structDecl = type->base; 205 assert( index < structDecl->members.size() ); 206 ast::ptr<ast::Decl> const & member = 207 *std::next( structDecl->members.begin(), index ); 208 ast::MemberExpr * memberExpr = new ast::MemberExpr( location, 209 member.strict_as<ast::DeclWithType>(), tuple ); 210 memberExpr->env = env; 211 return memberExpr; 212 } 213 private: 214 ScopedMap< int, ast::StructDecl const * > typeMap; 215 }; 162 ast::ObjectDecl * member = new ast::ObjectDecl( location, 163 toString( "field_", i ), 164 new ast::TypeInstType( typeParam ) 165 ); 166 decl->params.push_back( typeParam ); 167 decl->members.push_back( member ); 168 } 169 170 // Empty structures are not standard C. Add a dummy field to 171 // empty tuples to silence warnings when a compound literal 172 // `_tuple0_` is created. 173 if ( tupleSize == 0 ) { 174 decl->members.push_back( 175 new ast::ObjectDecl( location, 176 "dummy", 177 new ast::BasicType( ast::BasicType::SignedInt ), 178 nullptr, 179 ast::Storage::Classes(), 180 // Does this have to be a C linkage? 181 ast::Linkage::C 182 ) 183 ); 184 } 185 return decl; 186 } 187 188 ast::Type const * TupleMainExpander::postvisit( ast::TupleType const * type ) { 189 assert( location ); 190 unsigned tupleSize = type->size(); 191 if ( !typeMap.count( tupleSize ) ) { 192 ast::StructDecl * decl = createTupleStruct( tupleSize, *location ); 193 typeMap[tupleSize] = decl; 194 declsToAddBefore.push_back( decl ); 195 } 196 197 ast::StructDecl const * decl = typeMap[ tupleSize ]; 198 ast::StructInstType * newType = 199 new ast::StructInstType( decl, type->qualifiers ); 200 for ( auto pair : group_iterate( type->types, decl->params ) ) { 201 ast::Type const * t = std::get<0>( pair ); 202 newType->params.push_back( 203 new ast::TypeExpr( *location, ast::deepCopy( t ) ) ); 204 } 205 return newType; 206 } 207 208 // Expand a tuple index into a field access in the underlying structure. 209 ast::Expr const * TupleMainExpander::postvisit( 210 ast::TupleIndexExpr const * expr ) { 211 CodeLocation const & location = expr->location; 212 ast::Expr const * tuple = expr->tuple.get(); 213 assert( tuple ); 214 unsigned int index = expr->index; 215 ast::TypeSubstitution const * env = expr->env.get(); 216 217 if ( auto tupleExpr = dynamic_cast<ast::TupleExpr const *>( tuple ) ) { 218 // Optimization: If it is a definitely pure tuple expr, 219 // then it can reduce to the only relevant component. 220 if ( !maybeImpureIgnoreUnique( tupleExpr ) ) { 221 assert( index < tupleExpr->exprs.size() ); 222 ast::ptr<ast::Expr> const & expr = 223 *std::next( tupleExpr->exprs.begin(), index ); 224 ast::Expr * ret = ast::mutate( expr.get() ); 225 ret->env = env; 226 return ret; 227 } 228 } 229 230 auto type = tuple->result.strict_as<ast::StructInstType>(); 231 ast::StructDecl const * structDecl = type->base; 232 assert( index < structDecl->members.size() ); 233 ast::ptr<ast::Decl> const & member = 234 *std::next( structDecl->members.begin(), index ); 235 ast::MemberExpr * memberExpr = new ast::MemberExpr( location, 236 member.strict_as<ast::DeclWithType>(), tuple ); 237 memberExpr->env = env; 238 return memberExpr; 239 } 216 240 217 241 ast::Expr const * replaceTupleExpr( … … 249 273 } 250 274 251 struct TupleExprExpander final { 252 ast::Expr const * postvisit( ast::TupleExpr const * expr ) { 253 return replaceTupleExpr( expr->location, 254 expr->result, expr->exprs, expr->env ); 255 } 256 }; 275 ast::Expr const * TupleExprExpander::postvisit( ast::TupleExpr const * expr ) { 276 return replaceTupleExpr( expr->location, 277 expr->result, expr->exprs, expr->env ); 278 } 257 279 258 280 } // namespace -
tests/pybin/tools.py
rf704974 rae151cf 23 23 24 24 # helper functions to run terminal commands 25 def sh(*cmd, timeout = False, output_file = None, input_file = None, input_text = None, error = subprocess.STDOUT, ignore_dry_run = False, pass_fds = [] ):25 def sh(*cmd, timeout = False, output_file = None, input_file = None, input_text = None, error = subprocess.STDOUT, ignore_dry_run = False, pass_fds = [], nice = False): 26 26 try: 27 27 cmd = list(cmd) … … 58 58 error = openfd(error, 'w', onexit, False) 59 59 60 # prepare the parameters to the call 61 popen_kwargs = { 62 'stdout' : output_file, 63 'stderr' : error, 64 'pass_fds': pass_fds, 65 } 66 67 # depending on how we are passing inputs we need to set a different argument to popen 68 if input_text: 69 popen_kwargs['input'] = bytes(input_text, encoding='utf-8') 70 else: 71 popen_kwargs['stdin'] = input_file 72 73 # we might want to nice this so it's not to obnixious to users 74 if nice: 75 popen_kwargs['preexec_fn'] = lambda: os.nice(5) 76 60 77 # run the desired command 61 78 # use with statement to make sure proc is cleaned 62 79 # don't use subprocess.run because we want to send SIGABRT on exit 63 with subprocess.Popen( 64 cmd, 65 **({'input' : bytes(input_text, encoding='utf-8')} if input_text else {'stdin' : input_file}), 66 stdout = output_file, 67 stderr = error, 68 pass_fds = pass_fds 69 ) as proc: 70 80 with subprocess.Popen( cmd, **popen_kwargs ) as proc: 71 81 try: 72 82 out, errout = proc.communicate( -
tests/test.py
rf704974 rae151cf 23 23 24 24 def match_test(path): 25 match = re.search("^%s\/([\w\/\-_]*).expect\/([\w\-_ ]+)(\.[\w\-_]+)?\.txt$" % settings.SRCDIR, path)25 match = re.search("^%s\/([\w\/\-_]*).expect\/([\w\-_\+]+)(\.[\w\-_]+)?\.txt$" % settings.SRCDIR, path) 26 26 if match : 27 27 test = Test() … … 190 190 if settings.dry_run or is_exe(exe_file): 191 191 # run test 192 retcode, _, _ = sh(exe_file, output_file=out_file, input_file=in_file, timeout=True )192 retcode, _, _ = sh(exe_file, output_file=out_file, input_file=in_file, timeout=True, nice=True) 193 193 else : 194 194 # simply cat the result into the output -
tools/gdb/utils-gdb.py
rf704974 rae151cf 159 159 160 160 # if we already saw the root, then go forward 161 my_next = self.curr['_X4link ']['_X4nextPY13__tE_generic__1']161 my_next = self.curr['_X4linkS5dlink_S9processor__1']['_X4nextPY13__tE_generic__1'] 162 162 self.curr = my_next.cast(cfa_t.processor_ptr) 163 163 … … 355 355 )) 356 356 tls = tls_for_proc( processor ) 357 thrd = t ls['_X11this_threadVPS7thread$_1']357 thrd = thread_for_proc( processor ) 358 358 if thrd != 0x0: 359 359 tname = '{} {}'.format(thrd['self_cor']['name'].string(), str(thrd))
Note: See TracChangeset
for help on using the changeset viewer.