Changes in / [93d2219:e874605]
- Files:
-
- 2 added
- 22 deleted
- 41 edited
-
benchmark/io/http/worker.hfa (modified) (1 diff)
-
doc/theses/mike_brooks_MMath/programs/hello-md.cfa (modified) (8 diffs)
-
doc/theses/thierry_delisle_PhD/thesis/text/front.tex (modified) (1 diff)
-
libcfa/src/Makefile.am (modified) (3 diffs)
-
libcfa/src/concurrency/clib/cfathread.cfa (modified) (1 diff)
-
libcfa/src/concurrency/invoke.h (modified) (1 diff)
-
libcfa/src/concurrency/io.cfa (modified) (1 diff)
-
libcfa/src/concurrency/io/setup.cfa (modified) (1 diff)
-
libcfa/src/concurrency/kernel.cfa (modified) (2 diffs)
-
libcfa/src/concurrency/kernel.hfa (modified) (3 diffs)
-
libcfa/src/concurrency/kernel/private.hfa (modified) (3 diffs)
-
libcfa/src/concurrency/kernel/startup.cfa (modified) (12 diffs)
-
libcfa/src/concurrency/locks.hfa (modified) (2 diffs)
-
libcfa/src/concurrency/preemption.cfa (modified) (9 diffs)
-
libcfa/src/concurrency/pthread.cfa (deleted)
-
libcfa/src/concurrency/thread.cfa (modified) (2 diffs)
-
libcfa/src/concurrency/thread.hfa (modified) (1 diff)
-
libcfa/src/containers/array.hfa (modified) (11 diffs)
-
libcfa/src/containers/lockfree.hfa (deleted)
-
libcfa/src/containers/queueLockFree.hfa (added)
-
libcfa/src/containers/stackLockFree.hfa (added)
-
libcfa/src/device/cpu.cfa (modified) (1 diff)
-
libcfa/src/heap.cfa (modified) (2 diffs)
-
libcfa/src/interpose.cfa (modified) (4 diffs)
-
libcfa/src/interpose_thread.cfa (deleted)
-
libcfa/src/parseargs.cfa (modified) (4 diffs)
-
libcfa/src/parseargs.hfa (modified) (3 diffs)
-
src/AST/Type.cpp (modified) (2 diffs)
-
src/AST/Type.hpp (modified) (1 diff)
-
src/AST/Vector.hpp (deleted)
-
src/AST/module.mk (modified) (1 diff)
-
src/GenPoly/GenPoly.cc (modified) (5 diffs)
-
src/GenPoly/GenPoly.h (modified) (6 diffs)
-
src/GenPoly/InstantiateGenericNew.cpp (modified) (16 diffs)
-
src/GenPoly/ScrubTyVars.cc (modified) (4 diffs)
-
src/Parser/ParseNode.h (modified) (2 diffs)
-
src/ResolvExpr/SatisfyAssertions.cpp (modified) (1 diff)
-
src/SymTab/Mangler.cc (modified) (4 diffs)
-
src/SymTab/Mangler.h (modified) (4 diffs)
-
src/SynTree/AddressExpr.cc (modified) (1 diff)
-
src/Virtual/ExpandCasts.cc (modified) (2 diffs)
-
tests/array-container/.expect/array-sbscr-types.txt (deleted)
-
tests/array-container/array-basic.cfa (modified) (1 diff)
-
tests/array-container/array-sbscr-types.cfa (deleted)
-
tests/collections/atomic_mpsc.cfa (modified) (1 diff)
-
tests/concurrent/.expect/migrate.txt (deleted)
-
tests/concurrent/migrate.cfa (deleted)
-
tests/concurrent/pthread/.expect/bounded_buffer.txt (deleted)
-
tests/concurrent/pthread/.expect/pthread_attr_test.txt (deleted)
-
tests/concurrent/pthread/.expect/pthread_cond_test.txt (deleted)
-
tests/concurrent/pthread/.expect/pthread_demo_create_join.txt (deleted)
-
tests/concurrent/pthread/.expect/pthread_demo_lock.txt (deleted)
-
tests/concurrent/pthread/.expect/pthread_key_test.txt (deleted)
-
tests/concurrent/pthread/.expect/pthread_once_test.txt (deleted)
-
tests/concurrent/pthread/bounded_buffer.cfa (deleted)
-
tests/concurrent/pthread/pthread_attr_test.cfa (deleted)
-
tests/concurrent/pthread/pthread_cond_test.cfa (deleted)
-
tests/concurrent/pthread/pthread_demo_create_join.cfa (deleted)
-
tests/concurrent/pthread/pthread_demo_lock.cfa (deleted)
-
tests/concurrent/pthread/pthread_key_test.cfa (deleted)
-
tests/concurrent/pthread/pthread_once_test.cfa (deleted)
-
tests/configs/parsebools.cfa (modified) (2 diffs)
-
tests/configs/parsenums.cfa (modified) (2 diffs)
-
tests/configs/usage.cfa (modified) (8 diffs)
-
tests/device/cpu.cfa (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
benchmark/io/http/worker.hfa
r93d2219 re874605 2 2 3 3 #include <iofwd.hfa> 4 #include < containers/lockfree.hfa>4 #include <queueLockFree.hfa> 5 5 #include <thread.hfa> 6 6 -
doc/theses/mike_brooks_MMath/programs/hello-md.cfa
r93d2219 re874605 1 1 #include "array.hfa" 2 3 4 trait ix( C &, E &, ztype(N) ) { 5 E & ?[?]( C &, ptrdiff_t ); 6 void __taglen( tag(C), tag(N) ); 7 }; 8 9 forall( ztype(Zn), ztype(S), Timmed &, Tbase & ) 10 void __taglen( tag(arpk(Zn, S, Timmed, Tbase)), tag(Zn) ) {} 2 11 3 12 … … 29 38 30 39 31 32 33 34 35 36 37 38 39 40 forall( [N] ) 40 forall( ztype( N ) ) 41 41 void print1d_cstyle( array(float, N) & c ); 42 42 43 forall( [N], C & | ar( C, float, N ) )43 forall( C &, ztype( N ) | ix( C, float, N ) ) 44 44 void print1d( C & c ); 45 45 … … 58 58 59 59 60 forall( [N])60 forall( ztype( N ) ) 61 61 void print1d_cstyle( array(float, N) & c ) { 62 for( i; N) {62 for( i; z(N) ) { 63 63 printf("%.1f ", c[i]); 64 64 } … … 78 78 79 79 80 forall( [N], C & | ar( C, float, N ) )80 forall( C &, ztype( N ) | ix( C, float, N ) ) 81 81 void print1d( C & c ) { 82 for( i; N) {82 for( i; z(N) ) { 83 83 printf("%.1f ", c[i]); 84 84 } … … 99 99 100 100 101 void fill( array(float, 5, 7) & a ) {101 void fill( array(float, Z(5), Z(7)) & a ) { 102 102 for ( i; (ptrdiff_t) 5 ) { 103 103 for ( j; 7 ) { 104 a[ i,j] = 1.0 * i + 0.1 * j;105 printf("%.1f ", a[ i,j]);104 a[[i,j]] = 1.0 * i + 0.1 * j; 105 printf("%.1f ", a[[i,j]]); 106 106 } 107 107 printf("\n"); … … 118 118 119 119 120 array( float, 5, 7) a;120 array( float, Z(5), Z(7) ) a; 121 121 fill(a); 122 122 /* … … 148 148 149 149 150 print1d( a[ 2, all] ); // 2.0 2.1 2.2 2.3 2.4 2.5 2.6151 print1d( a[ all, 3] ); // 0.3 1.3 2.3 3.3 4.3150 print1d( a[[ 2, all ]] ); // 2.0 2.1 2.2 2.3 2.4 2.5 2.6 151 print1d( a[[ all, 3 ]] ); // 0.3 1.3 2.3 3.3 4.3 152 152 153 153 154 154 155 print1d_cstyle( a[ 2, all] );155 print1d_cstyle( a[[ 2, all ]] ); 156 156 157 157 … … 161 161 162 162 163 #ifdef SHOW _ERROR_1163 #ifdef SHOWERR1 164 164 165 print1d_cstyle( a[ all, 2] ); // bad165 print1d_cstyle( a[[ all, 2 ]] ); // bad 166 166 167 167 #endif -
doc/theses/thierry_delisle_PhD/thesis/text/front.tex
r93d2219 re874605 161 161 Thanks to Andrew Beach, Michael Brooks, Colby Parsons, Mubeen Zulfiqar, Fangren Yu and Jiada Liang for their work on the \CFA project as well as all the discussions which have helped me concretize the ideas in this thesis. 162 162 163 Finally, I acknowledge that this has been possible thanks to the financial help offered by the David R. Cheriton School of Computer Science , the corporate partnership with Huawei Ltd. and the Natural Sciences and Engineering Research Council.163 Finally, I acknowledge that this has been possible thanks to the financial help offered by the David R. Cheriton School of Computer Science and the corporate partnership with Huawei Ltd. 164 164 \cleardoublepage 165 165 -
libcfa/src/Makefile.am
r93d2219 re874605 62 62 containers/array.hfa \ 63 63 containers/list.hfa \ 64 containers/lockfree.hfa \ 64 containers/queueLockFree.hfa \ 65 containers/stackLockFree.hfa \ 65 66 containers/string_sharectx.hfa \ 66 67 containers/vector2.hfa \ … … 126 127 127 128 thread_libsrc = ${inst_thread_headers_src} ${inst_thread_headers_src:.hfa=.cfa} \ 128 interpose_thread.cfa \129 129 bits/signal.hfa \ 130 130 concurrency/clib/cfathread.cfa \ … … 145 145 concurrency/stats.cfa \ 146 146 concurrency/stats.hfa \ 147 concurrency/stats.hfa \ 148 concurrency/pthread.cfa 147 concurrency/stats.hfa 149 148 150 149 else -
libcfa/src/concurrency/clib/cfathread.cfa
r93d2219 re874605 172 172 173 173 pthread_attr_t attr; 174 if (int ret = __cfaabi_pthread_attr_init(&attr); 0 != ret) {174 if (int ret = pthread_attr_init(&attr); 0 != ret) { 175 175 abort | "failed to create master epoll thread attr: " | ret | strerror(ret); 176 176 } 177 177 178 if (int ret = __cfaabi_pthread_create(&master_poller, &attr, master_epoll, 0p); 0 != ret) {178 if (int ret = pthread_create(&master_poller, &attr, master_epoll, 0p); 0 != ret) { 179 179 abort | "failed to create master epoll thread: " | ret | strerror(ret); 180 180 } -
libcfa/src/concurrency/invoke.h
r93d2219 re874605 214 214 215 215 #if defined( __CFA_WITH_VERIFY__ ) 216 struct processor * volatile executing;217 216 void * canary; 218 217 #endif -
libcfa/src/concurrency/io.cfa
r93d2219 re874605 610 610 if( we ) { 611 611 sigval_t value = { PREEMPT_IO }; 612 __cfaabi_pthread_sigqueue(ctx->proc->kernel_thread, SIGUSR1, value);612 pthread_sigqueue(ctx->proc->kernel_thread, SIGUSR1, value); 613 613 } 614 614 -
libcfa/src/concurrency/io/setup.cfa
r93d2219 re874605 344 344 // iopoll.run = false; 345 345 // sigval val = { 1 }; 346 // __cfaabi_pthread_sigqueue( iopoll.thrd, SIGUSR1, val );346 // pthread_sigqueue( iopoll.thrd, SIGUSR1, val ); 347 347 348 348 // // Make sure all this is done -
libcfa/src/concurrency/kernel.cfa
r93d2219 re874605 321 321 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ) || thrd_dst->curr_cor == proc_cor || thrd_dst->corctx_flag, "ERROR : Destination thread$ %p has been corrupted.\n StackPointer too small.\n", thrd_dst ); // add escape condition if we are setting up the processor 322 322 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit) || thrd_dst->curr_cor == proc_cor || thrd_dst->corctx_flag, "ERROR : Destination thread$ %p has been corrupted.\n StackPointer too large.\n", thrd_dst ); // add escape condition if we are setting up the processor 323 /* paranoid */ verify( __atomic_exchange_n( &thrd_dst->executing, this, __ATOMIC_SEQ_CST) == 0p );324 323 /* paranoid */ verify( 0x0D15EA5E0D15EA5Ep == thrd_dst->canary ); 325 324 … … 333 332 334 333 /* paranoid */ verify( 0x0D15EA5E0D15EA5Ep == thrd_dst->canary ); 335 /* paranoid */ verify( __atomic_exchange_n( &thrd_dst->executing, 0p, __ATOMIC_SEQ_CST) == this );336 334 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit) || thrd_dst->corctx_flag, "ERROR : Destination thread$ %p has been corrupted.\n StackPointer too large.\n", thrd_dst ); 337 335 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ) || thrd_dst->corctx_flag, "ERROR : Destination thread$ %p has been corrupted.\n StackPointer too small.\n", thrd_dst ); 338 /* paranoid */ verify( thrd_dst->state != Halted );339 336 /* paranoid */ verify( thrd_dst->context.SP ); 337 /* paranoid */ verify( thrd_dst->curr_cluster == this->cltr ); 340 338 /* paranoid */ verify( kernelTLS().this_thread == thrd_dst ); 341 339 /* paranoid */ verify( ! __preemption_enabled() ); -
libcfa/src/concurrency/kernel.hfa
r93d2219 re874605 160 160 // P9_EMBEDDED( processor, dlink(processor) ) 161 161 static inline tytagref( dlink(processor), dlink(processor) ) ?`inner( processor & this ) { 162 dlink(processor) & b = this.link;163 tytagref( dlink(processor), dlink(processor) ) result = { b };164 return result;162 dlink(processor) & b = this.link; 163 tytagref( dlink(processor), dlink(processor) ) result = { b }; 164 return result; 165 165 } 166 166 … … 269 269 io_context_params params; 270 270 } io; 271 272 struct {273 struct processor ** procs;274 unsigned cnt;275 } managed;276 271 277 272 #if !defined(__CFA_NO_STATISTICS__) … … 303 298 static inline struct cluster * active_cluster () { return publicTLS_get( this_processor )->cltr; } 304 299 305 // set the number of internal processors306 // these processors are in addition to any explicitly declared processors307 unsigned set_concurrency( cluster & this, unsigned new_count );308 309 300 #if !defined(__CFA_NO_STATISTICS__) 310 301 void print_stats_now( cluster & this, int flags ); -
libcfa/src/concurrency/kernel/private.hfa
r93d2219 re874605 20 20 #endif 21 21 22 #include <signal.h>23 24 22 #include "kernel.hfa" 25 23 #include "thread.hfa" … … 50 48 #endif 51 49 #endif 50 52 51 // #define READYQ_USE_LINEAR_AVG 53 52 #define READYQ_USE_LOGDBL_AVG … … 63 62 #error must pick a scheme for averaging 64 63 #endif 65 66 extern "C" {67 __attribute__((visibility("protected"))) int __cfaabi_pthread_create(pthread_t *_thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);68 __attribute__((visibility("protected"))) int __cfaabi_pthread_join(pthread_t _thread, void **retval);69 __attribute__((visibility("protected"))) pthread_t __cfaabi_pthread_self(void);70 __attribute__((visibility("protected"))) int __cfaabi_pthread_attr_init(pthread_attr_t *attr);71 __attribute__((visibility("protected"))) int __cfaabi_pthread_attr_destroy(pthread_attr_t *attr);72 __attribute__((visibility("protected"))) int __cfaabi_pthread_attr_setstack( pthread_attr_t *attr, void *stackaddr, size_t stacksize );73 __attribute__((visibility("protected"))) int __cfaabi_pthread_attr_getstacksize( const pthread_attr_t *attr, size_t *stacksize );74 __attribute__((visibility("protected"))) int __cfaabi_pthread_sigqueue(pthread_t _thread, int sig, const union sigval value);75 __attribute__((visibility("protected"))) int __cfaabi_pthread_sigmask( int how, const sigset_t *set, sigset_t *oset);76 }77 64 78 65 //----------------------------------------------------------------------------- -
libcfa/src/concurrency/kernel/startup.cfa
r93d2219 re874605 16 16 #define __cforall_thread__ 17 17 #define _GNU_SOURCE 18 19 // #define __CFA_DEBUG_PRINT_RUNTIME_CORE__20 18 21 19 // C Includes … … 224 222 ( this.runner ){}; 225 223 init( this, "Main Processor", *mainCluster, 0p ); 226 kernel_thread = __cfaabi_pthread_self();224 kernel_thread = pthread_self(); 227 225 228 226 runner{ &this }; … … 285 283 } 286 284 287 extern "C"{288 void pthread_delete_kernel_threads_();289 }290 291 292 285 static void __kernel_shutdown(void) { 293 286 if(!cfa_main_returned) return; 294 295 //delete kernel threads for pthread_concurrency296 pthread_delete_kernel_threads_();297 298 287 /* paranoid */ verify( __preemption_enabled() ); 299 288 disable_interrupts(); … … 338 327 339 328 /* paranoid */ verify( this.do_terminate == true ); 340 __cfa dbg_print_safe(runtime_core,"Kernel : destroyed main processor context %p\n", &runner);329 __cfaabi_dbg_print_safe("Kernel : destroyed main processor context %p\n", &runner); 341 330 } 342 331 … … 399 388 (proc->runner){ proc, &info }; 400 389 401 __cfa dbg_print_safe(runtime_core,"Coroutine : created stack %p\n", get_coroutine(proc->runner)->stack.storage);390 __cfaabi_dbg_print_safe("Coroutine : created stack %p\n", get_coroutine(proc->runner)->stack.storage); 402 391 403 392 //Set global state … … 531 520 random_state = __global_random_mask ? __global_random_prime : __global_random_prime ^ rdtscl(); 532 521 #if defined( __CFA_WITH_VERIFY__ ) 533 executing = 0p;534 522 canary = 0x0D15EA5E0D15EA5Ep; 535 523 #endif … … 664 652 io.params = io_params; 665 653 666 managed.procs = 0p;667 managed.cnt = 0;668 669 654 doregister(this); 670 655 … … 682 667 683 668 void ^?{}(cluster & this) libcfa_public { 684 set_concurrency( this, 0 );685 686 669 destroy(this.io.arbiter); 687 670 … … 794 777 pthread_attr_t attr; 795 778 796 check( __cfaabi_pthread_attr_init( &attr ), "pthread_attr_init" ); // initialize attribute779 check( pthread_attr_init( &attr ), "pthread_attr_init" ); // initialize attribute 797 780 798 781 size_t stacksize = max( PTHREAD_STACK_MIN, DEFAULT_STACK_SIZE ); … … 821 804 #endif 822 805 823 check( __cfaabi_pthread_attr_setstack( &attr, stack, stacksize ), "pthread_attr_setstack" );824 check( __cfaabi_pthread_create( pthread, &attr, start, arg ), "pthread_create" );806 check( pthread_attr_setstack( &attr, stack, stacksize ), "pthread_attr_setstack" ); 807 check( pthread_create( pthread, &attr, start, arg ), "pthread_create" ); 825 808 return stack; 826 809 } 827 810 828 811 void __destroy_pthread( pthread_t pthread, void * stack, void ** retval ) { 829 int err = __cfaabi_pthread_join( pthread, retval );812 int err = pthread_join( pthread, retval ); 830 813 if( err != 0 ) abort("KERNEL ERROR: joining pthread %p caused error %s\n", (void*)pthread, strerror(err)); 831 814 … … 833 816 pthread_attr_t attr; 834 817 835 check( __cfaabi_pthread_attr_init( &attr ), "pthread_attr_init" ); // initialize attribute818 check( pthread_attr_init( &attr ), "pthread_attr_init" ); // initialize attribute 836 819 837 820 size_t stacksize; 838 821 // default stack size, normally defined by shell limit 839 check( __cfaabi_pthread_attr_getstacksize( &attr, &stacksize ), "pthread_attr_getstacksize" );822 check( pthread_attr_getstacksize( &attr, &stacksize ), "pthread_attr_getstacksize" ); 840 823 assert( stacksize >= PTHREAD_STACK_MIN ); 841 824 stacksize += __page_size; … … 855 838 } 856 839 857 unsigned set_concurrency( cluster & this, unsigned new ) libcfa_public {858 unsigned old = this.managed.cnt;859 860 __cfadbg_print_safe(runtime_core, "Kernel : resizing cluster from %u to %u\n", old, (unsigned)new);861 862 // Delete all the old unneeded procs863 if(old > new) for(i; (unsigned)new ~ old) {864 __cfadbg_print_safe(runtime_core, "Kernel : destroying %u\n", i);865 delete( this.managed.procs[i] );866 }867 868 // Allocate new array (uses realloc and memcpies the data)869 this.managed.procs = alloc( new, this.managed.procs`realloc );870 this.managed.cnt = new;871 872 // Create the desired new procs873 if(old < new) for(i; old ~ new) {874 __cfadbg_print_safe(runtime_core, "Kernel : constructing %u\n", i);875 (*(this.managed.procs[i] = alloc())){ this };876 }877 878 // return the old count879 return old;880 }881 882 840 #if defined(__CFA_WITH_VERIFY__) 883 841 static bool verify_fwd_bck_rng(void) { -
libcfa/src/concurrency/locks.hfa
r93d2219 re874605 21 21 22 22 #include "bits/weakso_locks.hfa" 23 #include "containers/ lockfree.hfa"23 #include "containers/queueLockFree.hfa" 24 24 #include "containers/list.hfa" 25 25 … … 423 423 } 424 424 425 static inline size_t on_wait(simple_owner_lock & this) with(this) { 425 static inline size_t on_wait(simple_owner_lock & this) with(this) { 426 426 lock( lock __cfaabi_dbg_ctx2 ); 427 427 /* paranoid */ verifyf( owner != 0p, "Attempt to release lock %p that isn't held", &this ); -
libcfa/src/concurrency/preemption.cfa
r93d2219 re874605 352 352 sigset_t oldset; 353 353 int ret; 354 ret = __cfaabi_pthread_sigmask(0, ( const sigset_t * ) 0p, &oldset); // workaround trac#208: cast should be unnecessary354 ret = pthread_sigmask(0, ( const sigset_t * ) 0p, &oldset); // workaround trac#208: cast should be unnecessary 355 355 if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); } 356 356 … … 385 385 sigaddset( &mask, sig ); 386 386 387 if ( __cfaabi_pthread_sigmask( SIG_UNBLOCK, &mask, 0p ) == -1 ) {387 if ( pthread_sigmask( SIG_UNBLOCK, &mask, 0p ) == -1 ) { 388 388 abort( "internal error, pthread_sigmask" ); 389 389 } … … 396 396 sigaddset( &mask, sig ); 397 397 398 if ( __cfaabi_pthread_sigmask( SIG_BLOCK, &mask, 0p ) == -1 ) {398 if ( pthread_sigmask( SIG_BLOCK, &mask, 0p ) == -1 ) { 399 399 abort( "internal error, pthread_sigmask" ); 400 400 } … … 404 404 static void preempt( processor * this ) { 405 405 sigval_t value = { PREEMPT_NORMAL }; 406 __cfaabi_pthread_sigqueue( this->kernel_thread, SIGUSR1, value );406 pthread_sigqueue( this->kernel_thread, SIGUSR1, value ); 407 407 } 408 408 … … 415 415 sigset_t oldset; 416 416 int ret; 417 ret = __cfaabi_pthread_sigmask(0, ( const sigset_t * ) 0p, &oldset); // workaround trac#208: cast should be unnecessary417 ret = pthread_sigmask(0, ( const sigset_t * ) 0p, &oldset); // workaround trac#208: cast should be unnecessary 418 418 if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); } 419 419 … … 434 434 sigset_t oldset; 435 435 int ret; 436 ret = __cfaabi_pthread_sigmask(0, ( const sigset_t * ) 0p, &oldset); // workaround trac#208: cast should be unnecessary436 ret = pthread_sigmask(0, ( const sigset_t * ) 0p, &oldset); // workaround trac#208: cast should be unnecessary 437 437 if(ret != 0) { abort("ERROR sigprocmask returned %d", ret); } 438 438 … … 505 505 sigval val; 506 506 val.sival_int = 0; 507 __cfaabi_pthread_sigqueue( alarm_thread, SIGALRM, val );507 pthread_sigqueue( alarm_thread, SIGALRM, val ); 508 508 509 509 // Wait for the preemption thread to finish … … 579 579 static_assert( sizeof( sigset_t ) == sizeof( cxt->uc_sigmask ), "Expected cxt->uc_sigmask to be of sigset_t" ); 580 580 #endif 581 if ( __cfaabi_pthread_sigmask( SIG_SETMASK, (sigset_t *)&(cxt->uc_sigmask), 0p ) == -1 ) {581 if ( pthread_sigmask( SIG_SETMASK, (sigset_t *)&(cxt->uc_sigmask), 0p ) == -1 ) { 582 582 abort( "internal error, sigprocmask" ); 583 583 } … … 607 607 sigset_t mask; 608 608 sigfillset(&mask); 609 if ( __cfaabi_pthread_sigmask( SIG_BLOCK, &mask, 0p ) == -1 ) {609 if ( pthread_sigmask( SIG_BLOCK, &mask, 0p ) == -1 ) { 610 610 abort( "internal error, pthread_sigmask" ); 611 611 } -
libcfa/src/concurrency/thread.cfa
r93d2219 re874605 50 50 random_state = __global_random_mask ? __global_random_prime : __global_random_prime ^ rdtscl(); 51 51 #if defined( __CFA_WITH_VERIFY__ ) 52 executing = 0p;53 52 canary = 0x0D15EA5E0D15EA5Ep; 54 53 #endif … … 178 177 179 178 //----------------------------------------------------------------------------- 180 bool migrate( thread$ * thrd, struct cluster & cl ) {181 182 monitor$ * tmon = get_monitor(thrd);183 monitor$ * __monitors[] = { tmon };184 monitor_guard_t __guard = { __monitors, 1 };185 186 187 {188 // if nothing needs to be done, return false189 if( thrd->curr_cluster == &cl ) return false;190 191 // are we migrating ourself?192 const bool local = thrd == active_thread();193 194 /* paranoid */ verify( !local || &cl != active_cluster() );195 /* paranoid */ verify( !local || thrd->curr_cluster == active_cluster() );196 /* paranoid */ verify( !local || thrd->curr_cluster == active_processor()->cltr );197 /* paranoid */ verify( local || tmon->signal_stack.top->owner->waiting_thread == thrd );198 /* paranoid */ verify( local || tmon->signal_stack.top );199 200 // make sure we aren't interrupted while doing this201 // not as important if we aren't local202 disable_interrupts();203 204 // actually move the thread205 unregister( thrd->curr_cluster, *thrd );206 thrd->curr_cluster = &cl;207 doregister( thrd->curr_cluster, *thrd );208 209 // restore interrupts210 enable_interrupts();211 212 // if this is the local thread, we are still running on the old cluster213 if(local) yield();214 215 /* paranoid */ verify( !local || &cl == active_cluster() );216 /* paranoid */ verify( !local || thrd->curr_cluster == active_cluster() );217 /* paranoid */ verify( !local || thrd->curr_cluster == active_processor()->cltr );218 /* paranoid */ verify( local || tmon->signal_stack.top );219 /* paranoid */ verify( local || tmon->signal_stack.top->owner->waiting_thread == thrd );220 221 return true;222 }223 }224 225 //-----------------------------------------------------------------------------226 179 #define GENERATOR LCG 227 180 -
libcfa/src/concurrency/thread.hfa
r93d2219 re874605 132 132 133 133 //---------- 134 // misc135 bool migrate( thread$ * thrd, struct cluster & cl );136 137 forall( T & | is_thread(T) )138 static inline bool migrate( T & mutex thrd, struct cluster & cl ) { return migrate( &(thread&)thrd, cl ); }139 140 141 //----------142 134 // prng 143 135 static inline { -
libcfa/src/containers/array.hfa
r93d2219 re874605 1 #pragma once2 3 1 #include <assert.h> 4 2 … … 20 18 // About the choice of integral types offered as subscript overloads: 21 19 // Intent is to cover these use cases: 22 // a[0] // i : zero_t23 // a[1] // i : one_t24 // a[2] // i : int25 20 // float foo( ptrdiff_t i ) { return a[i]; } // i : ptrdiff_t 26 // float foo( size_t i ) { return a[i]; } // i : size_t27 21 // forall( [N] ) ... for( i; N ) { total += a[i]; } // i : typeof( sizeof(42) ) 28 22 // for( i; 5 ) { total += a[i]; } // i : int 29 //30 23 // It gets complicated by: 31 24 // - CFA does overloading on concrete types, like int and unsigned int, not on typedefed … … 34 27 // - Given bug of Trac #247, CFA gives sizeof expressions type unsigned long int, when it 35 28 // should give them type size_t. 36 // 37 // gcc -m32 cfa -m32 given bug gcc -m64 (and cfa)29 // 30 // gcc -m32 cfa -m32 given bug gcc -m64 38 31 // ptrdiff_t int int long int 39 32 // size_t unsigned int unsigned int unsigned long int 40 33 // typeof( sizeof(42) ) unsigned int unsigned long int unsigned long int 41 34 // int int int int 42 //43 // So the solution must support types {zero_t, one_t, int, unsigned int, long int, unsigned long int}44 //45 // The solution cannot rely on implicit conversions (e.g. just have one overload for ptrdiff_t)46 // because assertion satisfaction requires types to match exacly. Both higher-dimensional47 // subscripting and operations on slices use asserted subscript operators. The test case48 // array-container/array-sbscr-cases covers the combinations. Mike beleives that commenting out49 // any of the current overloads leads to one of those cases failing, either on 64- or 32-bit.50 // Mike is open to being shown a smaller set of overloads that still passes the test.51 52 static inline Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, zero_t ) {53 assert( 0 < N );54 return (Timmed &) a.strides[0];55 }56 57 static inline Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, one_t ) {58 assert( 1 < N );59 return (Timmed &) a.strides[1];60 }61 35 62 36 static inline Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, int i ) { 63 assert( i < N );64 return (Timmed &) a.strides[i];65 }66 67 static inline const Timmed & ?[?]( const arpk(N, S, Timmed, Tbase) & a, int i ) {68 37 assert( i < N ); 69 38 return (Timmed &) a.strides[i]; … … 75 44 } 76 45 77 static inline const Timmed & ?[?]( const arpk(N, S, Timmed, Tbase) & a, unsigned int i ) {78 assert( i < N );79 return (Timmed &) a.strides[i];80 }81 82 46 static inline Timmed & ?[?]( arpk(N, S, Timmed, Tbase) & a, long int i ) { 83 assert( i < N );84 return (Timmed &) a.strides[i];85 }86 87 static inline const Timmed & ?[?]( const arpk(N, S, Timmed, Tbase) & a, long int i ) {88 47 assert( i < N ); 89 48 return (Timmed &) a.strides[i]; … … 95 54 } 96 55 97 static inline const Timmed & ?[?]( const arpk(N, S, Timmed, Tbase) & a, unsigned long int i ) {98 assert( i < N );99 return (Timmed &) a.strides[i];100 }101 102 56 static inline size_t ?`len( arpk(N, S, Timmed, Tbase) & a ) { 103 57 return N; 104 58 } 105 106 static inline void __taglen( tag(arpk(N, S, Timmed, Tbase)), tag(N) ) {}107 59 108 60 // workaround #226 (and array relevance thereof demonstrated in mike102/otype-slow-ndims.cfa) … … 131 83 // Make a FOREACH macro 132 84 #define FE_0(WHAT) 133 #define FE_1(WHAT, X) WHAT(X) 85 #define FE_1(WHAT, X) WHAT(X) 134 86 #define FE_2(WHAT, X, ...) WHAT(X)FE_1(WHAT, __VA_ARGS__) 135 87 #define FE_3(WHAT, X, ...) WHAT(X)FE_2(WHAT, __VA_ARGS__) … … 138 90 //... repeat as needed 139 91 140 #define GET_MACRO(_0,_1,_2,_3,_4,_5,NAME,...) NAME 92 #define GET_MACRO(_0,_1,_2,_3,_4,_5,NAME,...) NAME 141 93 #define FOR_EACH(action,...) \ 142 94 GET_MACRO(_0,__VA_ARGS__,FE_5,FE_4,FE_3,FE_2,FE_1,FE_0)(action,__VA_ARGS__) … … 163 115 } 164 116 165 #else 117 #else 166 118 167 119 // Workaround form. Listing all possibilities up to 4 dims. … … 184 136 #endif 185 137 186 // Available for users to work around Trac #265187 // If `a[...0...]` isn't working, try `a[...ix0...]` instead.188 189 #define ix0 ((ptrdiff_t)0)190 191 192 193 138 // 194 139 // Rotation … … 210 155 211 156 // Wrapper 212 externstruct all_t {} all;157 struct all_t {} all; 213 158 forall( [N], S & | sized(S), Te &, result &, Tbase & | { tag(result) enq_( tag(Tbase), tag(N), tag(S), tag(Te) ); } ) 214 159 static inline result & ?[?]( arpk(N, S, Te, Tbase) & this, all_t ) { … … 220 165 // 221 166 222 // desired: 223 // trait ar(A &, Tv &, [N]) { 224 // Tv& ?[?]( A&, zero_t ); 225 // Tv& ?[?]( A&, one_t ); 226 // Tv& ?[?]( A&, int ); 227 // ... 228 // size_t ?`len( A& ); 229 // void __taglen( tag(C), tag(N) ); 230 // }; 231 232 // working around N's not being accepted as arguments to traits 233 234 #define ar(A, Tv, N) { \ 235 Tv& ?[?]( A&, zero_t ); \ 236 Tv& ?[?]( A&, one_t ); \ 237 Tv& ?[?]( A&, int ); \ 238 Tv& ?[?]( A&, unsigned int ); \ 239 Tv& ?[?]( A&, long int ); \ 240 Tv& ?[?]( A&, unsigned long int ); \ 241 size_t ?`len( A& ); \ 242 void __taglen( tag(A), tag(N) ); \ 243 } 167 trait ar(A &, Tv &) { 168 Tv& ?[?]( A&, ptrdiff_t ); 169 size_t ?`len( A& ); 170 }; -
libcfa/src/device/cpu.cfa
r93d2219 re874605 359 359 int idxs = count_cache_indexes(); 360 360 361 // Do we actually have a cache?362 if(idxs == 0) {363 // if not just fake the data structure, it makes things easier.364 cpu_info.hthrd_count = cpus_c;365 cpu_info.llc_count = 0;366 struct cpu_map_entry_t * entries = alloc(cpu_info.hthrd_count);367 for(i; cpu_info.hthrd_count) {368 entries[i].self = i;369 entries[i].start = 0;370 entries[i].count = cpu_info.hthrd_count;371 entries[i].cache = 0;372 }373 cpu_info.llc_map = entries;374 return;375 }376 377 361 // Count actual cache levels 378 362 unsigned cache_levels = 0; 379 363 unsigned llc = 0; 380 381 unsigned char prev = -1u; 382 void first(unsigned idx, unsigned char level, const char * map, size_t len) { 383 /* paranoid */ verifyf(level < prev, "Index %u of cpu 0 has cache levels out of order: %u then %u", idx, (unsigned)prev, (unsigned)level); 384 llc = max(llc, level); 385 prev = level; 386 cache_levels++; 387 } 388 foreach_cacheidx(0, idxs, first); 364 if (idxs != 0) { 365 unsigned char prev = -1u; 366 void first(unsigned idx, unsigned char level, const char * map, size_t len) { 367 /* paranoid */ verifyf(level < prev, "Index %u of cpu 0 has cache levels out of order: %u then %u", idx, (unsigned)prev, (unsigned)level); 368 llc = max(llc, level); 369 prev = level; 370 cache_levels++; 371 } 372 foreach_cacheidx(0, idxs, first); 373 } 389 374 390 375 // Read in raw data -
libcfa/src/heap.cfa
r93d2219 re874605 211 211 #if BUCKETLOCK == SPINLOCK 212 212 #elif BUCKETLOCK == LOCKFREE 213 #include < containers/lockfree.hfa>213 #include <stackLockFree.hfa> 214 214 #else 215 215 #error undefined lock type for bucket lock … … 505 505 freeLists[j].blockSize = bucketSizes[j]; 506 506 } // for 507 507 508 508 heapBuffer = 0p; 509 509 heapReserve = 0; -
libcfa/src/interpose.cfa
r93d2219 re874605 42 42 43 43 typedef void (* generic_fptr_t)(void); 44 static generic_fptr_t do_interpose_symbol( void * library, const char symbol[], const char version[] ) {45 const char * error;46 47 union { generic_fptr_t fptr; void * ptr; } originalFunc;48 49 #if defined( _GNU_SOURCE )50 if ( version ) {51 originalFunc.ptr = dlvsym( library, symbol, version );52 } else {53 originalFunc.ptr = dlsym( library, symbol );54 }55 #else56 originalFunc.ptr = dlsym( library, symbol );57 #endif // _GNU_SOURCE58 59 error = dlerror();60 if ( error ) abort( "interpose_symbol : internal error, %s\n", error );61 62 return originalFunc.fptr;63 }64 65 44 static generic_fptr_t interpose_symbol( const char symbol[], const char version[] ) { 66 45 const char * error; 67 46 68 47 static void * library; 69 static void * pthread_library;70 48 if ( ! library ) { 71 49 #if defined( RTLD_NEXT ) … … 80 58 #endif 81 59 } // if 82 if ( ! pthread_library ) { 83 #if defined( RTLD_NEXT ) 84 pthread_library = RTLD_NEXT; 85 #else 86 // missing RTLD_NEXT => must hard-code library name, assuming libstdc++ 87 pthread_library = dlopen( "libpthread.so", RTLD_LAZY ); 88 error = dlerror(); 89 if ( error ) { 90 abort( "interpose_symbol : failed to open libpthread, %s\n", error ); 91 } 92 #endif 93 } // if 94 95 return do_interpose_symbol(library, symbol, version); 60 61 union { generic_fptr_t fptr; void * ptr; } originalFunc; 62 63 #if defined( _GNU_SOURCE ) 64 if ( version ) { 65 originalFunc.ptr = dlvsym( library, symbol, version ); 66 } else { 67 originalFunc.ptr = dlsym( library, symbol ); 68 } 69 #else 70 originalFunc.ptr = dlsym( library, symbol ); 71 #endif // _GNU_SOURCE 72 73 error = dlerror(); 74 if ( error ) abort( "interpose_symbol : internal error, %s\n", error ); 75 76 return originalFunc.fptr; 96 77 } 97 78 … … 116 97 117 98 extern "C" { 118 void __cfathreadabi_interpose_startup( generic_fptr_t (*do_interpose_symbol)( void * library, const char symbol[], const char version[] ) ) __attribute__((weak));119 99 void __cfaabi_interpose_startup( void ) { 120 100 const char *version = 0p; … … 128 108 INTERPOSE_LIBC( exit , version ); 129 109 #pragma GCC diagnostic pop 130 131 if(__cfathreadabi_interpose_startup) __cfathreadabi_interpose_startup( do_interpose_symbol );132 110 133 111 // As a precaution (and necessity), errors that result in termination are delivered on a separate stack because -
libcfa/src/parseargs.cfa
r93d2219 re874605 50 50 extern char ** cfa_args_envp __attribute__((weak)); 51 51 52 forall([N]) 53 static void usage(char * cmd, const array( cfa_option, N ) & options, const char * usage, FILE * out) __attribute__ ((noreturn)); 52 static void usage(char * cmd, cfa_option options[], size_t opt_count, const char * usage, FILE * out) __attribute__ ((noreturn)); 54 53 //----------------------------------------------------------------------------- 55 54 // checking 56 forall([N]) 57 static void check_args( const array( cfa_option, N ) & options ) { 58 for(i; N) { 59 for(j; N) { 55 static void check_args(cfa_option options[], size_t opt_count) { 56 for(i; opt_count) { 57 for(j; opt_count) { 60 58 if(i == j) continue; 61 59 … … 72 70 //----------------------------------------------------------------------------- 73 71 // Parsing args 74 forall([opt_count]) { 75 void parse_args( const array( cfa_option, opt_count ) & options, const char * usage, char ** & left ) { 76 if( 0p != &cfa_args_argc ) { 77 parse_args(cfa_args_argc, cfa_args_argv, options, usage, left ); 78 } 79 else { 80 char * temp = ""; 81 parse_args(0, &temp, options, usage, left ); 82 } 83 } 84 85 void parse_args( 86 int argc, 87 char * argv[], 88 const array( cfa_option, opt_count ) & options, 89 const char * usage, 90 char ** & left 91 ) { 92 check_args(options); 93 94 int maxv = 'h'; 95 char optstring[(opt_count * 3) + 2] = { '\0' }; 96 { 97 int idx = 0; 98 for(i; opt_count) { 99 if (options[i].short_name) { 100 maxv = max(options[i].short_name, maxv); 101 optstring[idx] = options[i].short_name; 102 idx++; 103 if( ((intptr_t)options[i].parse) != ((intptr_t)parse_settrue) 104 && ((intptr_t)options[i].parse) != ((intptr_t)parse_setfalse) ) { 105 optstring[idx] = ':'; 106 idx++; 107 } 108 } 109 } 110 optstring[idx+0] = 'h'; 111 optstring[idx+1] = '\0'; 112 } 113 114 struct option optarr[opt_count + 2]; 115 { 116 int idx = 0; 117 for(i; opt_count) { 118 if(options[i].long_name) { 119 // we don't have the mutable keyword here, which is really what we would want 120 int & val_ref = (int &)(const int &)options[i].val; 121 val_ref = (options[i].short_name != '\0') ? ((int)options[i].short_name) : ++maxv; 122 123 optarr[idx].name = options[i].long_name; 124 optarr[idx].flag = 0p; 125 optarr[idx].val = options[i].val; 126 if( ((intptr_t)options[i].parse) == ((intptr_t)parse_settrue) 127 || ((intptr_t)options[i].parse) == ((intptr_t)parse_setfalse) ) { 128 optarr[idx].has_arg = no_argument; 129 } else { 130 optarr[idx].has_arg = required_argument; 131 } 72 void parse_args( cfa_option options[], size_t opt_count, const char * usage, char ** & left ) { 73 if( 0p != &cfa_args_argc ) { 74 parse_args(cfa_args_argc, cfa_args_argv, options, opt_count, usage, left ); 75 } 76 else { 77 char * temp = ""; 78 parse_args(0, &temp, options, opt_count, usage, left ); 79 } 80 } 81 82 void parse_args( 83 int argc, 84 char * argv[], 85 cfa_option options[], 86 size_t opt_count, 87 const char * usage, 88 char ** & left 89 ) { 90 check_args(options, opt_count); 91 92 int maxv = 'h'; 93 char optstring[(opt_count * 3) + 2] = { '\0' }; 94 { 95 int idx = 0; 96 for(i; opt_count) { 97 if (options[i].short_name) { 98 maxv = max(options[i].short_name, maxv); 99 optstring[idx] = options[i].short_name; 100 idx++; 101 if( ((intptr_t)options[i].parse) != ((intptr_t)parse_settrue) 102 && ((intptr_t)options[i].parse) != ((intptr_t)parse_setfalse) ) { 103 optstring[idx] = ':'; 132 104 idx++; 133 105 } 134 106 } 135 optarr[idx+0].[name, has_arg, flag, val] = ["help", no_argument, 0, 'h']; 136 optarr[idx+1].[name, has_arg, flag, val] = [0, no_argument, 0, 0]; 137 } 138 139 FILE * out = stderr; 140 NEXT_ARG: 141 for() { 142 int idx = 0; 143 int opt = getopt_long(argc, argv, optstring, optarr, &idx); 144 switch(opt) { 145 case -1: 146 if(&left != 0p) left = argv + optind; 147 return; 148 case 'h': 149 out = stdout; 150 case '?': 151 usage(argv[0], options, usage, out); 152 default: 153 for(i; opt_count) { 154 if(opt == options[i].val) { 155 const char * arg = optarg ? optarg : ""; 156 if( arg[0] == '=' ) { arg++; } 157 // work around for some weird bug 158 void * variable = options[i].variable; 159 bool (*parse_func)(const char *, void * ) = options[i].parse; 160 bool success = parse_func( arg, variable ); 161 if(success) continue NEXT_ARG; 162 163 fprintf(out, "Argument '%s' for option %c could not be parsed\n\n", arg, (char)opt); 164 usage(argv[0], options, usage, out); 165 } 107 } 108 optstring[idx+0] = 'h'; 109 optstring[idx+1] = '\0'; 110 } 111 112 struct option optarr[opt_count + 2]; 113 { 114 int idx = 0; 115 for(i; opt_count) { 116 if(options[i].long_name) { 117 options[i].val = (options[i].short_name != '\0') ? ((int)options[i].short_name) : ++maxv; 118 optarr[idx].name = options[i].long_name; 119 optarr[idx].flag = 0p; 120 optarr[idx].val = options[i].val; 121 if( ((intptr_t)options[i].parse) == ((intptr_t)parse_settrue) 122 || ((intptr_t)options[i].parse) == ((intptr_t)parse_setfalse) ) { 123 optarr[idx].has_arg = no_argument; 124 } else { 125 optarr[idx].has_arg = required_argument; 126 } 127 idx++; 128 } 129 } 130 optarr[idx+0].[name, has_arg, flag, val] = ["help", no_argument, 0, 'h']; 131 optarr[idx+1].[name, has_arg, flag, val] = [0, no_argument, 0, 0]; 132 } 133 134 FILE * out = stderr; 135 NEXT_ARG: 136 for() { 137 int idx = 0; 138 int opt = getopt_long(argc, argv, optstring, optarr, &idx); 139 switch(opt) { 140 case -1: 141 if(&left != 0p) left = argv + optind; 142 return; 143 case 'h': 144 out = stdout; 145 case '?': 146 usage(argv[0], options, opt_count, usage, out); 147 default: 148 for(i; opt_count) { 149 if(opt == options[i].val) { 150 const char * arg = optarg ? optarg : ""; 151 if( arg[0] == '=' ) { arg++; } 152 bool success = options[i].parse( arg, options[i].variable ); 153 if(success) continue NEXT_ARG; 154 155 fprintf(out, "Argument '%s' for option %c could not be parsed\n\n", arg, (char)opt); 156 usage(argv[0], options, opt_count, usage, out); 166 157 } 167 abort("Internal parse arg error\n");168 }169 170 } 158 } 159 abort("Internal parse arg error\n"); 160 } 161 171 162 } 172 163 } … … 231 222 232 223 void print_args_usage(cfa_option options[], size_t opt_count, const char * usage, bool error) __attribute__ ((noreturn)) { 233 const array( cfa_option, opt_count ) & arr = (const array( cfa_option, opt_count ) &) *options; 234 usage(cfa_args_argv[0], arr, usage, error ? stderr : stdout); 224 usage(cfa_args_argv[0], options, opt_count, usage, error ? stderr : stdout); 235 225 } 236 226 237 227 void print_args_usage(int , char * argv[], cfa_option options[], size_t opt_count, const char * usage, bool error) __attribute__ ((noreturn)) { 238 const array( cfa_option, opt_count ) & arr = (const array( cfa_option, opt_count ) &) *options; 239 usage(argv[0], arr, usage, error ? stderr : stdout); 240 } 241 242 forall( [N] ) { 243 void print_args_usage( const array(cfa_option, N ) & options, const char * usage, bool error) { 244 usage(cfa_args_argv[0], options, usage, error ? stderr : stdout); 245 } 246 247 void print_args_usage(int argc, char * argv[], const array( cfa_option, N ) & options, const char * usage, bool error) { 248 usage(argv[0], options, usage, error ? stderr : stdout); 249 } 250 } 251 252 forall([N]) 253 static void usage(char * cmd, const array( cfa_option, N ) & options, const char * help, FILE * out) __attribute__((noreturn)) { 228 usage(argv[0], options, opt_count, usage, error ? stderr : stdout); 229 } 230 231 static void usage(char * cmd, cfa_option options[], size_t opt_count, const char * help, FILE * out) __attribute__((noreturn)) { 254 232 int width = 0; 255 233 { 256 for(i; N) {234 for(i; opt_count) { 257 235 if(options[i].long_name) { 258 236 int w = strlen(options[i].long_name); … … 273 251 fprintf(out, "Usage:\n %s %s\n", cmd, help); 274 252 275 for(i; N) {253 for(i; opt_count) { 276 254 printopt(out, width, max_width, options[i].short_name, options[i].long_name, options[i].help); 277 255 } -
libcfa/src/parseargs.hfa
r93d2219 re874605 16 16 #pragma once 17 17 18 #include <array.hfa>19 20 18 struct cfa_option { 21 int val; // reserved22 char short_name;23 const char * long_name;24 const char * help;25 void * variable;26 bool (*parse)(const char *, void * );19 int val; // reserved 20 char short_name; 21 const char * long_name; 22 const char * help; 23 void * variable; 24 bool (*parse)(const char *, void * ); 27 25 }; 28 26 … … 33 31 forall(T & | { bool parse(const char *, T & ); }) 34 32 static inline void ?{}( cfa_option & this, char short_name, const char * long_name, const char * help, T & variable ) { 35 this.val = 0;36 this.short_name = short_name;37 this.long_name = long_name;38 this.help = help;39 this.variable = (void*)&variable;40 this.parse = (bool (*)(const char *, void * ))parse;33 this.val = 0; 34 this.short_name = short_name; 35 this.long_name = long_name; 36 this.help = help; 37 this.variable = (void*)&variable; 38 this.parse = (bool (*)(const char *, void * ))parse; 41 39 } 42 40 43 41 forall(T &) 44 42 static inline void ?{}( cfa_option & this, char short_name, const char * long_name, const char * help, T & variable, bool (*parse)(const char *, T & )) { 45 this.val = 0;46 this.short_name = short_name;47 this.long_name = long_name;48 this.help = help;49 this.variable = (void*)&variable;50 this.parse = (bool (*)(const char *, void * ))parse;43 this.val = 0; 44 this.short_name = short_name; 45 this.long_name = long_name; 46 this.help = help; 47 this.variable = (void*)&variable; 48 this.parse = (bool (*)(const char *, void * ))parse; 51 49 } 52 50 … … 54 52 void parse_args( int argc, char * argv[], cfa_option options[], size_t opt_count, const char * usage, char ** & left ); 55 53 56 forall( [N] ) {57 void parse_args( const array( cfa_option, N ) & options, const char * usage, char ** & left );58 void parse_args( int argc, char * argv[], const array( cfa_option, N ) & options, const char * usage, char ** & left );59 }60 61 54 void print_args_usage(cfa_option options[], size_t opt_count, const char * usage, bool error) __attribute__ ((noreturn)); 62 55 void print_args_usage(int argc, char * argv[], cfa_option options[], size_t opt_count, const char * usage, bool error) __attribute__ ((noreturn)); 63 64 forall( [N] ) {65 void print_args_usage( const array(cfa_option, N ) & options, const char * usage, bool error) __attribute__ ((noreturn));66 void print_args_usage(int argc, char * argv[], const array( cfa_option, N ) & options, const char * usage, bool error) __attribute__ ((noreturn));67 }68 56 69 57 bool parse_yesno (const char *, bool & ); -
src/AST/Type.cpp
r93d2219 re874605 147 147 // --- TypeInstType 148 148 149 bool TypeInstType::operator==( const TypeInstType & other ) const {150 return base == other.base151 && formal_usage == other.formal_usage152 && expr_id == other.expr_id;153 }154 155 149 TypeInstType::TypeInstType( const TypeDecl * b, 156 150 CV::Qualifiers q, std::vector<ptr<Attribute>> && as ) … … 163 157 164 158 bool TypeInstType::isComplete() const { return base->sized; } 165 166 std::string TypeInstType::TypeEnvKey::typeString() const {167 return std::string("_") + std::to_string(formal_usage)168 + "_" + std::to_string(expr_id) + "_" + base->name;169 }170 171 bool TypeInstType::TypeEnvKey::operator==(172 const TypeInstType::TypeEnvKey & other ) const {173 return base == other.base174 && formal_usage == other.formal_usage175 && expr_id == other.expr_id;176 }177 178 bool TypeInstType::TypeEnvKey::operator<(179 const TypeInstType::TypeEnvKey & other ) const {180 // TypeEnvKey ordering is an arbitrary total ordering.181 // It doesn't mean anything but allows for a sorting.182 if ( base < other.base ) {183 return true;184 } else if ( other.base < base ) {185 return false;186 } else if ( formal_usage < other.formal_usage ) {187 return true;188 } else if ( other.formal_usage < formal_usage ) {189 return false;190 } else {191 return expr_id < other.expr_id;192 }193 }194 159 195 160 // --- TupleType -
src/AST/Type.hpp
r93d2219 re874605 408 408 409 409 TypeEnvKey() = default; 410 TypeEnvKey(const TypeDecl * base, int formal_usage = 0, int expr_id = 0) 411 : base(base), formal_usage(formal_usage), expr_id(expr_id) {} 412 TypeEnvKey(const TypeInstType & inst) 413 : base(inst.base), formal_usage(inst.formal_usage), expr_id(inst.expr_id) {} 414 std::string typeString() const; 415 bool operator==(const TypeEnvKey & other) const; 416 bool operator<(const TypeEnvKey & other) const; 410 TypeEnvKey(const TypeDecl * base, int formal_usage = 0, int expr_id = 0): base(base), formal_usage(formal_usage), expr_id(expr_id) {} 411 TypeEnvKey(const TypeInstType & inst): base(inst.base), formal_usage(inst.formal_usage), expr_id(inst.expr_id) {} 412 std::string typeString() const { return std::string("_") + std::to_string(formal_usage) + "_" + std::to_string(expr_id) + "_" + base->name; } 413 bool operator==(const TypeEnvKey & other) const { return base == other.base && formal_usage == other.formal_usage && expr_id == other.expr_id; } 417 414 }; 418 415 419 bool operator==(const TypeInstType & other) const ;416 bool operator==(const TypeInstType & other) const { return base == other.base && formal_usage == other.formal_usage && expr_id == other.expr_id; } 420 417 421 418 TypeInstType( -
src/AST/module.mk
r93d2219 re874605 67 67 AST/Util.cpp \ 68 68 AST/Util.hpp \ 69 AST/Vector.hpp \70 69 AST/Visitor.hpp 71 70 -
src/GenPoly/GenPoly.cc
r93d2219 re874605 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Oct 24 15:19:00 202213 // Update Count : 1 712 // Last Modified On : Fri Oct 7 15:25:00 2022 13 // Update Count : 16 14 14 // 15 15 … … 194 194 195 195 if ( auto inst = dynamic_cast< const ast::TypeInstType * >( type ) ) { 196 if ( typeVars.find( *inst) != typeVars.end() ) return type;196 if ( typeVars.find( inst->typeString() ) != typeVars.end() ) return type; 197 197 } else if ( auto array = dynamic_cast< const ast::ArrayType * >( type ) ) { 198 198 return isPolyType( array->base, subst ); … … 227 227 228 228 if ( auto inst = dynamic_cast<ast::TypeInstType const *>( type ) ) { 229 auto var = typeVars.find( *inst);229 auto var = typeVars.find( inst->name ); 230 230 if ( var != typeVars.end() && var->second.isComplete ) { 231 231 … … 784 784 785 785 void addToTypeVarMap( const ast::TypeInstType * type, TypeVarMap & typeVars ) { 786 typeVars.insert( *type, ast::TypeDecl::Data( type->base ) );786 typeVars.insert( type->typeString(), ast::TypeDecl::Data( type->base ) ); 787 787 } 788 788 … … 816 816 } 817 817 818 void printTypeVarMap( std::ostream &os, const TypeVarMap & typeVars ) { 819 for ( auto const & pair : typeVars ) { 820 os << pair.first << " (" << pair.second << ") "; 821 } // for 822 os << std::endl; 823 } 824 818 825 } // namespace GenPoly 819 826 -
src/GenPoly/GenPoly.h
r93d2219 re874605 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Oct 24 15:18:00 202213 // Update Count : 1112 // Last Modified On : Fri Oct 7 15:06:00 2022 13 // Update Count : 9 14 14 // 15 15 … … 22 22 #include "AST/Decl.hpp" // for TypeDecl::Data 23 23 #include "AST/Fwd.hpp" // for ApplicationExpr, BaseInstType, Func... 24 #include "AST/Type.hpp" // for TypeInstType::TypeEnvKey25 24 #include "SymTab/Mangler.h" // for Mangler 26 25 #include "SynTree/Declaration.h" // for TypeDecl::Data, AggregateDecl, Type... … … 29 28 namespace GenPoly { 30 29 30 // TODO Via some tricks this works for ast::TypeDecl::Data as well. 31 31 typedef ErasableScopedMap< std::string, TypeDecl::Data > TyVarMap; 32 using TypeVarMap = ErasableScopedMap< ast::TypeInstType::TypeEnvKey, ast::TypeDecl::Data >;32 using TypeVarMap = ErasableScopedMap< std::string, ast::TypeDecl::Data >; 33 33 34 34 /// Replaces a TypeInstType by its referrent in the environment, if applicable 35 35 Type* replaceTypeInst( Type* type, const TypeSubstitution* env ); 36 const ast::Type * replaceTypeInst( const ast::Type *, const ast::TypeSubstitution * );37 36 38 37 /// returns polymorphic type if is polymorphic type, NULL otherwise; will look up substitution in env if provided … … 54 53 /// true iff function has dynamic-layout return type under the type variable map generated from its forall-parameters 55 54 ReferenceToType *isDynRet( FunctionType *function ); 56 const ast::BaseInstType *isDynRet( const ast::FunctionType * func );57 55 58 56 /// A function needs an adapter if it returns a dynamic-layout value or if any of its parameters have dynamic-layout type … … 114 112 /// Prints type variable map 115 113 void printTyVarMap( std::ostream &os, const TyVarMap &tyVarMap ); 114 void printTypeVarMap( std::ostream &os, const TypeVarMap & typeVars ); 116 115 117 116 /// Gets the mangled name of this type; alias for SymTab::Mangler::mangleType(). … … 129 128 /// Gets the name of the layout function for a given aggregate type, given its declaration 130 129 inline std::string layoutofName( AggregateDecl *decl ) { return std::string( "_layoutof_" ) + decl->get_name(); } 131 inline std::string layoutofName( ast::AggregateDecl const * decl ) {132 return std::string( "_layoutof_" ) + decl->name;133 }134 130 135 131 } // namespace GenPoly -
src/GenPoly/InstantiateGenericNew.cpp
r93d2219 re874605 26 26 #include "AST/Pass.hpp" // for Pass, WithGuard, WithShortCi... 27 27 #include "AST/TranslationUnit.hpp" // for TranslationUnit 28 #include "AST/Vector.hpp" // for vector29 28 #include "CodeGen/OperatorTable.h" // for isAssignment 30 29 #include "Common/ScopedMap.h" // for ScopedMap … … 40 39 // Utilities: 41 40 42 using type_vector = ast::vector< ast::TypeExpr>;41 using type_vector = std::vector< ast::ptr< ast::TypeExpr > >; 43 42 44 43 /// Abstracts type equality for a list of parameter types. 45 44 struct TypeList { 46 45 TypeList() : params() {} 47 TypeList( ast::vector< ast::Type> const & params ) :46 TypeList( std::vector< ast::ptr< ast::Type > > const & params ) : 48 47 params( params ) {} 49 TypeList( ast::vector< ast::Type> && params ) :48 TypeList( std::vector< ast::ptr< ast::Type > > && params ) : 50 49 params( std::move( params ) ) {} 51 50 TypeList( TypeList const & that ) : params( that.params ) {} 52 51 TypeList( TypeList && that ) : params( std::move( that.params ) ) {} 53 52 54 TypeList( ast::vector< ast::TypeExpr> const & exprs ) :53 TypeList( std::vector< ast::ptr< ast::TypeExpr > > const & exprs ) : 55 54 params() { 56 55 for ( auto expr : exprs ) { … … 83 82 } 84 83 85 ast::vector<ast::Type> params;84 std::vector<ast::ptr<ast::Type>> params; 86 85 }; 87 86 … … 104 103 /// returns null if no such value exists. 105 104 ast::AggregateDecl const * lookup( 106 ast::AggregateDecl const * key, 107 type_vector const & params ) const { 105 ast::AggregateDecl const * key, type_vector const & params ) const { 108 106 // This type repackaging is used for the helpers. 109 107 ast::ptr<ast::AggregateDecl> ptr = key; … … 152 150 } 153 151 154 bool isDtypeStatic( ast::vector<ast::TypeDecl> const & baseParams ) {152 bool isDtypeStatic( std::vector<ast::ptr<ast::TypeDecl>> const & baseParams ) { 155 153 return std::all_of( baseParams.begin(), baseParams.end(), 156 154 []( ast::TypeDecl const * td ){ return !td->isComplete(); } … … 163 161 /// least one parameter type, and dynamic if there is no concrete instantiation. 164 162 GenericType makeSubstitutions( 165 ast::vector<ast::TypeExpr> & out,166 ast::vector<ast::TypeDecl> const & baseParams,167 ast::vector<ast::Expr> const & params ) {163 std::vector<ast::ptr<ast::TypeExpr>> & out, 164 std::vector<ast::ptr<ast::TypeDecl>> const & baseParams, 165 std::vector<ast::ptr<ast::Expr>> const & params ) { 168 166 GenericType gt = GenericType::dtypeStatic; 169 167 … … 216 214 /// Substitutes types of members according to baseParams => typeSubs, 217 215 /// returning the result in a new vector. 218 ast::vector<ast::Decl> substituteMembers(219 ast::vector<ast::Decl> const & members,220 ast::vector<ast::TypeDecl> const & baseParams,221 ast::vector<ast::TypeExpr> const & typeSubs ) {222 ast::vector<ast::Decl> out;216 std::vector<ast::ptr<ast::Decl>> substituteMembers( 217 std::vector<ast::ptr<ast::Decl>> const & members, 218 std::vector<ast::ptr<ast::TypeDecl>> const & baseParams, 219 std::vector<ast::ptr<ast::TypeExpr>> const & typeSubs ) { 220 std::vector<ast::ptr<ast::Decl>> out; 223 221 ast::TypeSubstitution subs( baseParams, typeSubs ); 224 222 for ( ast::ptr<ast::Decl> const & member : members ) { … … 237 235 /// modifying them in-place. 238 236 void substituteMembersHere( 239 ast::vector<ast::Decl> & members,240 ast::vector<ast::TypeDecl> const & baseParams,241 ast::vector<ast::TypeExpr> const & typeSubs ) {237 std::vector<ast::ptr<ast::Decl>> & members, 238 std::vector<ast::ptr<ast::TypeDecl>> const & baseParams, 239 std::vector<ast::ptr<ast::TypeExpr>> const & typeSubs ) { 242 240 ast::TypeSubstitution subs( baseParams, typeSubs ); 243 241 for ( ast::ptr<ast::Decl> & member : members ) { … … 287 285 288 286 ast::Expr const * fixMemberExpr( 289 ast::vector<ast::TypeDecl> const & baseParams,287 std::vector<ast::ptr<ast::TypeDecl>> const & baseParams, 290 288 ast::MemberExpr const * memberExpr ); 291 289 … … 351 349 352 350 ast::Expr const * FixDtypeStatic::fixMemberExpr( 353 ast::vector<ast::TypeDecl> const & baseParams,351 std::vector<ast::ptr<ast::TypeDecl>> const & baseParams, 354 352 ast::MemberExpr const * memberExpr ) { 355 353 // Need to cast dtype-static member expressions to their actual type … … 463 461 type_vector const & typeSubs, ast::UnionDecl const * decl ); 464 462 465 void replaceParametersWithConcrete( ast::vector<ast::Expr> & params );463 void replaceParametersWithConcrete( std::vector<ast::ptr<ast::Expr>> & params ); 466 464 ast::Type const * replaceWithConcrete( ast::Type const * type, bool doClone ); 467 465 … … 472 470 /// marks it as stripped. 473 471 void stripDtypeParams( ast::AggregateDecl * base, 474 ast::vector<ast::TypeDecl> & baseParams,475 ast::vector<ast::TypeExpr> const & typeSubs );472 std::vector<ast::ptr<ast::TypeDecl>> & baseParams, 473 std::vector<ast::ptr<ast::TypeExpr>> const & typeSubs ); 476 474 }; 477 475 … … 513 511 // and put substitutions in typeSubs. 514 512 assertf( inst->base, "Base data-type has parameters." ); 515 ast::vector<ast::TypeExpr> typeSubs;513 std::vector<ast::ptr<ast::TypeExpr>> typeSubs; 516 514 GenericType gt = makeSubstitutions( typeSubs, inst->base->params, inst->params ); 517 515 switch ( gt ) { … … 572 570 ast::AggregateDecl const * aggr = 573 571 expr->aggregate->result.strict_as<ast::BaseInstType>()->aggr(); 574 ast::vector<ast::Decl> const & members = aggr->members;572 std::vector<ast::ptr<ast::Decl>> const & members = aggr->members; 575 573 auto it = std::find( members.begin(), members.end(), expr->member ); 576 574 memberIndex = std::distance( members.begin(), it ); … … 645 643 646 644 void GenericInstantiator::replaceParametersWithConcrete( 647 ast::vector<ast::Expr> & params ) {645 std::vector<ast::ptr<ast::Expr>> & params ) { 648 646 for ( ast::ptr<ast::Expr> & param : params ) { 649 647 auto paramType = param.as<ast::TypeExpr>(); … … 675 673 void GenericInstantiator::stripDtypeParams( 676 674 ast::AggregateDecl * base, 677 ast::vector<ast::TypeDecl> & baseParams,678 ast::vector<ast::TypeExpr> const & typeSubs ) {675 std::vector<ast::ptr<ast::TypeDecl>> & baseParams, 676 std::vector<ast::ptr<ast::TypeExpr>> const & typeSubs ) { 679 677 substituteMembersHere( base->members, baseParams, typeSubs ); 680 678 -
src/GenPoly/ScrubTyVars.cc
r93d2219 re874605 20 20 #include "GenPoly/ErasableScopedMap.h" // for ErasableScopedMap<>::const_it... 21 21 #include "ScrubTyVars.h" 22 #include "SymTab/Mangler.h" // for mangle Type22 #include "SymTab/Mangler.h" // for mangle, typeMode 23 23 #include "SynTree/Declaration.h" // for TypeDecl, TypeDecl::Data, Typ... 24 24 #include "SynTree/Expression.h" // for Expression (ptr only), NameExpr … … 195 195 } 196 196 197 auto typeVar = typeVars->find( *type );197 auto typeVar = typeVars->find( type->name ); 198 198 if ( typeVar == typeVars->end() ) { 199 199 return type; … … 227 227 if ( dynType ) { 228 228 return new ast::NameExpr( expr->location, 229 sizeofName( Mangle::mangle Type( dynType) ) );229 sizeofName( Mangle::mangle( dynType, Mangle::typeMode() ) ) ); 230 230 } else { 231 231 return expr; … … 237 237 if ( dynType ) { 238 238 return new ast::NameExpr( expr->location, 239 alignofName( Mangle::mangle Type( dynType) ) );239 alignofName( Mangle::mangle( dynType, Mangle::typeMode() ) ) ); 240 240 } else { 241 241 return expr; -
src/Parser/ParseNode.h
r93d2219 re874605 10 10 // Created On : Sat May 16 13:28:16 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Oct 18 1 6:22:15202213 // Update Count : 93 712 // Last Modified On : Tue Oct 18 14:15:37 2022 13 // Update Count : 936 14 14 // 15 15 … … 468 468 cur = dynamic_cast< const NodeType * >( temp ); // should not return nullptr 469 469 if ( ! cur && temp ) { // non-homogeneous nodes ? 470 SemanticError( temp->location, "internal error, non-homogeneous nodes founds in buildList processing." );470 SemanticError( cur->location, "internal error, non-homogeneous nodes founds in buildList processing." ); 471 471 } // if 472 472 } // while -
src/ResolvExpr/SatisfyAssertions.cpp
r93d2219 re874605 268 268 ast::ptr< ast::Type > resType = cand.expr->result; 269 269 cand.env.apply( resType ); 270 return Mangle::mangle Type( resType);270 return Mangle::mangle( resType, Mangle::typeMode() ); 271 271 } 272 272 -
src/SymTab/Mangler.cc
r93d2219 re874605 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:40:29 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Fri Oct 21 16:18:00 202213 // Update Count : 7 511 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jan 11 21:56:06 2021 13 // Update Count : 74 14 14 // 15 15 #include "Mangler.h" … … 418 418 void postvisit( const ast::QualifiedType * qualType ); 419 419 420 /// The result is the current constructed mangled name. 421 std::string result() const { return mangleName; } 420 std::string get_mangleName() { return mangleName; } 422 421 private: 423 422 std::string mangleName; ///< Mangled name being constructed … … 445 444 } // namespace 446 445 446 447 447 std::string mangle( const ast::Node * decl, Mangle::Mode mode ) { 448 return ast::Pass<Mangler_new>::read( decl, mode ); 448 ast::Pass<Mangler_new> mangler( mode ); 449 maybeAccept( decl, mangler ); 450 return mangler.core.get_mangleName(); 449 451 } 450 452 … … 687 689 } // for 688 690 for ( auto & assert : ptype->assertions ) { 689 assertionNames.push_back( ast::Pass<Mangler_new>::read( 690 assert->var.get(), 691 mangleOverridable, typeMode, mangleGenericParams, nextVarNum, varNums ) ); 691 ast::Pass<Mangler_new> sub_mangler( 692 mangleOverridable, typeMode, mangleGenericParams, nextVarNum, varNums ); 693 assert->var->accept( sub_mangler ); 694 assertionNames.push_back( sub_mangler.core.get_mangleName() ); 692 695 acount++; 693 696 } // for -
src/SymTab/Mangler.h
r93d2219 re874605 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 21:44:03 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Thu Oct 27 11:58:00 202213 // Update Count : 1 611 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Jul 22 09:45:30 2017 13 // Update Count : 15 14 14 // 15 15 … … 22 22 23 23 #include "AST/Bitfield.hpp" 24 #include "AST/Fwd.hpp" 24 25 #include "SynTree/SynTree.h" // for Types 25 26 #include "SynTree/Visitor.h" // for Visitor, maybeAccept … … 32 33 // * Currently name compression is not implemented. 33 34 34 namespace ast {35 class Node;36 }37 35 namespace ResolvExpr { 38 36 class TypeEnvironment; … … 103 101 using Mode = bitfield<mangle_flags>; 104 102 105 /// Mangle declaration name. 103 static inline Mode typeMode() { return NoOverrideable | Type; } 104 105 /// Mangle declaration name 106 106 std::string mangle( const ast::Node * decl, Mode mode = {} ); 107 108 /// Most common mangle configuration for types.109 static inline std::string mangleType( const ast::Node * type ) {110 return mangle( type, { NoOverrideable | Type } );111 }112 107 113 108 namespace Encoding { -
src/SynTree/AddressExpr.cc
r93d2219 re874605 50 50 set_result( addrType( refType->base ) ); 51 51 } else { 52 if(!arg->result->location.isSet()) arg->result->location = arg->location;53 52 SemanticError( arg->result, "Attempt to take address of non-lvalue expression: " ); 54 53 } // if -
src/Virtual/ExpandCasts.cc
r93d2219 re874605 295 295 // returns the previous declaration for error messages. 296 296 ast::ObjectDecl const * insert( ast::ObjectDecl const * typeIdDecl ) { 297 std::string mangledName = Mangle::mangleType( typeIdDecl->type ); 297 std::string const & mangledName = 298 Mangle::mangle( typeIdDecl->type, Mangle::typeMode() ); 298 299 ast::ObjectDecl const *& value = instances[ mangledName ]; 299 300 if ( value ) { … … 309 310 310 311 ast::ObjectDecl const * lookup( ast::Type const * typeIdType ) { 311 std::string mangledName = Mangle::mangleType( typeIdType ); 312 std::string const & mangledName = 313 Mangle::mangle( typeIdType, Mangle::typeMode() ); 312 314 auto const it = instances.find( mangledName ); 313 315 return ( instances.end() == it ) ? nullptr : it->second; -
tests/array-container/array-basic.cfa
r93d2219 re874605 78 78 } 79 79 80 forall( [N], A & | ar(A, float, N) )80 forall( A & | ar(A, float) ) 81 81 float total1d_hi( A & a ) { 82 82 float total = 0.0f; 83 for (i; N)83 for (i; a`len) 84 84 total += a[i]; 85 85 return total; -
tests/collections/atomic_mpsc.cfa
r93d2219 re874605 1 1 #include <fstream.hfa> 2 #include < containers/lockfree.hfa>2 #include <queueLockFree.hfa> 3 3 #include <thread.hfa> 4 4 -
tests/configs/parsebools.cfa
r93d2219 re874605 15 15 // 16 16 17 #include <parseargs.hfa> 17 18 #include <fstream.hfa> 18 19 19 20 #include "../meta/fork+exec.hfa" 20 21 // last as a work around to a parse bug22 #include <parseargs.hfa>23 21 24 22 int main(int argc, char * argv[]) { … … 32 30 bool sf = true; 33 31 34 array( cfa_option, 6 ) options; 35 options[0] = (cfa_option){'e', "yesno", "test yes/no", YN, parse_yesno}; 36 options[1] = (cfa_option){'y', "YN", "test yes/no", Yn, parse_yesno}; 37 options[2] = (cfa_option){'n', "yn", "test yes/no", yn, parse_yesno}; 38 options[3] = (cfa_option){'t', "truefalse", "test true/false", tf, parse_truefalse}; 39 options[4] = (cfa_option){'s', "settrue", "test set true", st, parse_settrue}; 40 options[5] = (cfa_option){'u', "setfalse", "test set false", sf, parse_setfalse}; 32 cfa_option options[] = { 33 {'e', "yesno", "test yes/no", YN, parse_yesno}, 34 {'y', "YN", "test yes/no", Yn, parse_yesno}, 35 {'n', "yn", "test yes/no", yn, parse_yesno}, 36 {'t', "truefalse", "test true/false", tf, parse_truefalse}, 37 {'s', "settrue", "test set true", st, parse_settrue}, 38 {'u', "setfalse", "test set false", sf, parse_setfalse}, 39 }; 40 int options_cnt = sizeof(options) / sizeof(cfa_option); 41 41 42 42 char **left; 43 parse_args( options, "[OPTIONS]...\ntesting bool parameters", left);43 parse_args( options, options_cnt, "[OPTIONS]...\ntesting bool parameters", left); 44 44 45 45 sout | "yes/no :" | YN; -
tests/configs/parsenums.cfa
r93d2219 re874605 15 15 // 16 16 17 #include <parseargs.hfa> 17 18 #include <fstream.hfa> 18 19 19 20 #include "../meta/fork+exec.hfa" 20 21 // last as workaround to parser bug22 #include <parseargs.hfa>23 21 24 22 #if __SIZEOF_LONG__ == 4 … … 44 42 45 43 46 array( cfa_option, 5 ) options; 47 options[0] = (cfa_option){ 'i', "int", "test int", i }; 48 options[1] = (cfa_option){ 'u', "unsigned", "test unsigned", u }; 49 options[2] = (cfa_option){ 'l', "unsignedlong", "test unsigned long", ul }; 50 options[3] = (cfa_option){ 'L', "unsignedlonglong", "test unsigned long long", ull }; 51 options[4] = (cfa_option){ 'd', "double", "test double", d }; 44 cfa_option options[] = { 45 { 'i', "int", "test int", i }, 46 { 'u', "unsigned", "test unsigned", u }, 47 { 'l', "unsignedlong", "test unsigned long", ul }, 48 { 'L', "unsignedlonglong", "test unsigned long long", ull }, 49 { 'd', "double", "test double", d }, 50 }; 51 int options_cnt = sizeof(options) / sizeof(cfa_option); 52 52 53 53 char **left; 54 parse_args( options, "[OPTIONS]...\ntesting bool parameters", left);54 parse_args( options, options_cnt, "[OPTIONS]...\ntesting bool parameters", left); 55 55 56 56 sout | "int :" | i; -
tests/configs/usage.cfa
r93d2219 re874605 15 15 // 16 16 17 #include <parseargs.hfa> 17 18 #include <fstream.hfa> 19 18 20 #include "../meta/fork+exec.hfa" 19 #include <parseargs.hfa>20 21 21 22 22 int main() { … … 25 25 sout | "No args, no errors"; 26 26 if(pid_t child = strict_fork(); child == 0) { 27 array( cfa_option, 0 ) opts;28 print_args_usage(1, fake_argv, opts, "Test usage", false);27 cfa_option opts[0]; 28 print_args_usage(1, fake_argv, opts, 0, "Test usage", false); 29 29 } 30 30 else { … … 35 35 sout | "No args, with errors"; 36 36 if(pid_t child = strict_fork(); child == 0) { 37 array( cfa_option, 0 ) opts;38 print_args_usage(1, fake_argv, opts, "Test usage", true);37 cfa_option opts[0]; 38 print_args_usage(1, fake_argv, opts, 0, "Test usage", true); 39 39 } 40 40 else { … … 46 46 if(pid_t child = strict_fork(); child == 0) { 47 47 int a, b, c; 48 array( cfa_option, 3 ) opts; 49 opts[0] = (cfa_option){'a', "", "First arg", a }; 50 opts[1] = (cfa_option){'b', "", "Second arg", b }; 51 opts[2] = (cfa_option){'c', "", "Third arg", c }; 52 print_args_usage(1, fake_argv, opts, "Test usage", false); 48 cfa_option opts[] = { 49 {'a', "", "First arg", a }, 50 {'b', "", "Second arg", b }, 51 {'c', "", "Third arg", c }, 52 }; 53 print_args_usage(1, fake_argv, opts, 3, "Test usage", false); 53 54 } 54 55 else { … … 60 61 if(pid_t child = strict_fork(); child == 0) { 61 62 int a, b, c; 62 array( cfa_option, 3 ) opts; 63 opts[0] = (cfa_option){'\0', "AA", "First arg", a }; 64 opts[1] = (cfa_option){'\0', "BB", "Second arg", b }; 65 opts[2] = (cfa_option){'\0', "CC", "Third arg", c }; 66 print_args_usage(1, fake_argv, opts, "Test usage", false); 63 cfa_option opts[] = { 64 {'\0', "AA", "First arg", a }, 65 {'\0', "BB", "Second arg", b }, 66 {'\0', "CC", "Third arg", c }, 67 }; 68 print_args_usage(1, fake_argv, opts, 3, "Test usage", false); 67 69 } 68 70 else { … … 74 76 if(pid_t child = strict_fork(); child == 0) { 75 77 int a, b, c; 76 array( cfa_option, 3 ) opts; 77 opts[0] = (cfa_option){'a', "", "First arg", a }; 78 opts[1] = (cfa_option){'b', "BBBB", "Second arg", b }; 79 opts[2] = (cfa_option){'\0', "CC", "Third arg", c }; 80 print_args_usage(1, fake_argv, opts, "Test usage", false); 78 cfa_option opts[] = { 79 {'a', "", "First arg", a }, 80 {'b', "BBBB", "Second arg", b }, 81 {'\0', "CC", "Third arg", c }, 82 }; 83 print_args_usage(1, fake_argv, opts, 3, "Test usage", false); 81 84 } 82 85 else { … … 88 91 if(pid_t child = strict_fork(); child == 0) { 89 92 int a, b, c; 90 array( cfa_option, 3 ) opts; 91 opts[0] = (cfa_option){'a', "", "First arg", a }; 92 opts[1] = (cfa_option){'b', "BBBB", "", b }; 93 opts[2] = (cfa_option){'\0', "CC", "Third arg", c }; 94 print_args_usage(1, fake_argv, opts, "Test usage", false); 93 cfa_option opts[] = { 94 {'a', "", "First arg", a }, 95 {'b', "BBBB", "", b }, 96 {'\0', "CC", "Third arg", c }, 97 }; 98 print_args_usage(1, fake_argv, opts, 3, "Test usage", false); 95 99 } 96 100 else { … … 102 106 if(pid_t child = strict_fork(); child == 0) { 103 107 int a, b, c; 104 array( cfa_option, 3 ) opts; 105 opts[0] = (cfa_option){'a', "", "First arg\nThe description has multiple lines,\n...for some reason", a }; 106 opts[1] = (cfa_option){'b', "BBBB", "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", b }; 107 opts[2] = (cfa_option){'\0', "CC", "Third arg", c }; 108 print_args_usage(1, fake_argv, opts, "Test usage", false); 108 cfa_option opts[] = { 109 {'a', "", "First arg\nThe description has multiple lines,\n...for some reason", a }, 110 {'b', "BBBB", "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", b }, 111 {'\0', "CC", "Third arg", c }, 112 }; 113 print_args_usage(1, fake_argv, opts, 3, "Test usage", false); 109 114 } 110 115 else { -
tests/device/cpu.cfa
r93d2219 re874605 117 117 unsigned find_idx() { 118 118 int idxs = count_cache_indexes(); 119 if( 0 == idxs ) return 0;120 119 121 120 unsigned found_level = 0; … … 180 179 unsigned idx = find_idx(); 181 180 // For all procs check mapping is consistent 182 if( idx > 0 )for(cpu_me; cpu_info.hthrd_count) {181 for(cpu_me; cpu_info.hthrd_count) { 183 182 char buf_me[32]; 184 183 size_t len_me = read_cpuidxinfo_into(cpu_me, idx, "shared_cpu_list", buf_me, 32);
Note:
See TracChangeset
for help on using the changeset viewer.