Changes in / [5235d49:7770cc8]
- Files:
-
- 11 deleted
- 20 edited
-
driver/as.cc (modified) (3 diffs)
-
example/io/eventfds.c (deleted)
-
example/range_parser.cfa (deleted)
-
libcfa/src/Makefile.am (modified) (1 diff)
-
libcfa/src/algorithms/range_iterator.cfa (deleted)
-
libcfa/src/algorithms/range_iterator.hfa (deleted)
-
libcfa/src/concurrency/io.cfa (modified) (6 diffs)
-
libcfa/src/concurrency/io/setup.cfa (modified) (2 diffs)
-
libcfa/src/concurrency/kernel.cfa (modified) (13 diffs)
-
libcfa/src/concurrency/kernel_private.hfa (modified) (1 diff)
-
libcfa/src/device/cpu.cfa (modified) (15 diffs)
-
libcfa/src/device/cpu.hfa (modified) (1 diff)
-
libcfa/src/stdlib.cfa (modified) (2 diffs)
-
libcfa/src/stdlib.hfa (modified) (4 diffs)
-
src/AST/Expr.cpp (modified) (2 diffs)
-
src/AST/Print.cpp (modified) (1 diff)
-
src/AST/Print.hpp (modified) (2 diffs)
-
src/Concurrency/Keywords.h (modified) (3 diffs)
-
src/Concurrency/KeywordsNew.cpp (deleted)
-
src/Concurrency/module.mk (modified) (1 diff)
-
src/Validate/CompoundLiteral.cpp (deleted)
-
src/Validate/CompoundLiteral.hpp (deleted)
-
src/Validate/module.mk (modified) (1 diff)
-
src/main.cc (modified) (6 diffs)
-
tests/.expect/random.x64.txt (modified) (1 diff)
-
tests/.expect/random.x86.txt (modified) (1 diff)
-
tests/algorithms/.expect/range_test.txt (deleted)
-
tests/algorithms/range_test.cfa (deleted)
-
tests/concurrent/.expect/ctor-check.txt (deleted)
-
tests/concurrent/ctor-check.cfa (deleted)
-
tests/pybin/tools.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
driver/as.cc
r5235d49 r7770cc8 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // as.c -- map assembler file, scan for debug information , then language code, and skip N lines forward to code. If8 // code is C dialect, possibly expand file by one character, and replace with Cforall language code.7 // as.c -- map assembler file, scan for debug information. If found, expand file by one character and insert Cforall 8 // language code on the N line from the start of the debug information. 9 9 // 10 10 // Author : Peter A. Buhr 11 11 // Created On : Wed Aug 1 10:49:42 2018 12 12 // Last Modified By : Peter A. Buhr 13 // Last Modified On : Wed Dec 8 07:56:12 202114 // Update Count : 13613 // Last Modified On : Sat Sep 8 08:40:16 2018 14 // Update Count : 97 15 15 // 16 16 … … 18 18 #include <cstdlib> // exit 19 19 #include <fcntl.h> // open 20 #include <cstring> // strstr, memmove 21 #include <unistd.h> // ftruncate,execvp 22 #include <sys/stat.h> // fstat 20 #include <unistd.h> 21 #include <sys/stat.h> 23 22 #include <sys/mman.h> // mmap 23 #include <string.h> 24 24 25 25 //#define __DEBUG_H__ 26 27 #ifdef __DEBUG_H__ 28 #include <iostream> 29 using namespace std; 30 #endif // __DEBUG_H__ 26 31 27 32 int main( const int argc, const char * argv[] ) { 28 33 #ifdef __DEBUG_H__ 29 34 for ( int i = 0; i < argc; i += 1 ) { 30 fprintf( stderr, "%s\n", argv[i] );35 cerr << argv[i] << endl; 31 36 } // for 32 37 #endif // __DEBUG_H__ … … 43 48 if ( start == (void *)-1 ) { perror( "mmap" ); exit( EXIT_FAILURE ); }; 44 49 45 char * dcursor; 46 if ( (dcursor = strstr( start, ".Ldebug_info0:" ) ) ) { // debug information ? 50 if ( char * cursor = strstr( start, ".Ldebug_info0:" ) ) { // debug information ? 51 // Expand file by one byte to hold 2 character Cforall language code. 52 if ( ftruncate( fd, size + 1 ) ) { perror( "ftruncate" ); exit( EXIT_FAILURE ); }; 47 53 48 if ( char * cursor = strstr( dcursor, ".long\t.LASF" ) ) { // language code ? 49 for ( int i = 0; i < 2; i += 1 ) { // move N (magic) lines forward 50 cursor = strstr( cursor, "\n" ) + 1; 51 } // for 52 cursor -= 2; // backup over "d\n", where d is a hex digit 53 // From elfcpp/dwarf.h in the binutils source tree. 54 // DW_LANG_C89 = 0x1, DW_LANG_C = 0x2, DW_LANG_C99 = 0xc, DW_LANG_C11 = 0x1d 55 if ( *(cursor - 2) == '0' && *(cursor - 1) == 'x' && 56 (*cursor == 'c' || *cursor == '1' || *cursor == '2') ) { // C99/C89/C 57 // Expand file by one byte to hold 2 character Cforall language code. 58 if ( ftruncate( fd, size + 1 ) ) { perror( "ftruncate" ); exit( EXIT_FAILURE ); }; 59 memmove( cursor + 2, cursor + 1, start + size - cursor - 1 ); // move remaining text 1 character right 60 } else if ( *(cursor - 3) == '0' && *(cursor - 2) == 'x' && *(cursor - 1) == '1' && *cursor == 'd' ) { // C11 61 } else { 62 for ( int i = 0; i < 6; i += 1 ) { // move N (magic) lines forward 63 cursor = strstr( cursor, "\n" ) + 1; 64 } // for 65 fprintf( stderr, "*** ERROR *** Invalid C language code found in assembler file: %s\n" 66 "Assembler debug information:\n%.*s", 67 argv[argc - 1], (int)(cursor - dcursor), dcursor ); 68 exit( EXIT_FAILURE ); 69 } // if 54 for ( int i = 0; i < 8; i += 1 ) { // move N (magic) lines forward 55 cursor = strstr( cursor, "\n" ) + 1; 56 } // for 70 57 71 *(cursor - 1) = '2'; // replace C89/C/C99/C11 language code with CFA code 72 *cursor = '5'; 73 } // if 58 cursor -= 2; // backup over "c\n" language value 59 if ( *(cursor - 1) != 'x' ) { fprintf( stderr, "invalid C language code\n" ); exit( EXIT_FAILURE ); }; 60 61 memmove( cursor + 2, cursor + 1, start + size - cursor - 1 ); // move remaining text 1 character right 62 63 *(cursor) = '2'; // replace C language value with CFA 64 *(cursor + 1) = '5'; 74 65 } // if 75 66 -
libcfa/src/Makefile.am
r5235d49 r7770cc8 85 85 time.hfa \ 86 86 bits/weakso_locks.hfa \ 87 algorithms/range_iterator.hfa \88 87 containers/maybe.hfa \ 89 88 containers/pair.hfa \ -
libcfa/src/concurrency/io.cfa
r5235d49 r7770cc8 33 33 #include <sys/syscall.h> 34 34 #include <sys/eventfd.h> 35 #include <sys/uio.h>36 35 37 36 #include <linux/io_uring.h> … … 134 133 } 135 134 136 bool __cfa_io_flush( processor * proc, int min_comp) {135 bool __cfa_io_flush( processor * proc, bool wait ) { 137 136 /* paranoid */ verify( ! __preemption_enabled() ); 138 137 /* paranoid */ verify( proc ); … … 145 144 146 145 __STATS__( true, io.calls.flush++; ) 147 int ret = syscall( __NR_io_uring_enter, ctx.fd, ctx.sq.to_submit, min_comp, min_comp > 0 ? IORING_ENTER_GETEVENTS :0, (sigset_t *)0p, _NSIG / 8);146 int ret = syscall( __NR_io_uring_enter, ctx.fd, ctx.sq.to_submit, wait ? 1 : 0, 0, (sigset_t *)0p, _NSIG / 8); 148 147 if( ret < 0 ) { 149 148 switch((int)errno) { … … 303 302 ctx->proc->io.dirty = true; 304 303 if(sq.to_submit > 30 || !lazy) { 305 __cfa_io_flush( ctx->proc, 0);304 __cfa_io_flush( ctx->proc, false ); 306 305 } 307 306 } … … 503 502 } 504 503 505 #if defined( CFA_WITH_IO_URING_IDLE)506 bool __kernel_read(processor * proc, io_future_t & future, iovec & iov, int fd) {504 #if defined(IO_URING_IDLE) 505 bool __kernel_read(processor * proc, io_future_t & future, char buf[], int fd) { 507 506 $io_context * ctx = proc->io.ctx; 508 507 /* paranoid */ verify( ! __preemption_enabled() ); … … 519 518 __fill( &sqe, 1, &idx, ctx ); 520 519 520 sqe->opcode = IORING_OP_READ; 521 521 sqe->user_data = (uintptr_t)&future; 522 522 sqe->flags = 0; 523 sqe->fd = fd; 523 sqe->ioprio = 0; 524 sqe->fd = 0; 524 525 sqe->off = 0; 525 sqe->ioprio = 0;526 526 sqe->fsync_flags = 0; 527 527 sqe->__pad2[0] = 0; 528 528 sqe->__pad2[1] = 0; 529 529 sqe->__pad2[2] = 0; 530 531 #if defined(CFA_HAVE_IORING_OP_READ) 532 sqe->opcode = IORING_OP_READ; 533 sqe->addr = (uint64_t)iov.iov_base; 534 sqe->len = iov.iov_len; 535 #elif defined(CFA_HAVE_READV) && defined(CFA_HAVE_IORING_OP_READV) 536 sqe->opcode = IORING_OP_READV; 537 sqe->addr = (uintptr_t)&iov; 538 sqe->len = 1; 539 #else 540 #error CFA_WITH_IO_URING_IDLE but none of CFA_HAVE_READV, CFA_HAVE_IORING_OP_READV or CFA_HAVE_IORING_OP_READ defined 541 #endif 530 sqe->addr = (uintptr_t)buf; 531 sqe->len = sizeof(uint64_t); 542 532 543 533 asm volatile("": : :"memory"); -
libcfa/src/concurrency/io/setup.cfa
r5235d49 r7770cc8 32 32 33 33 void __cfa_io_start( processor * proc ) {} 34 bool __cfa_io_flush( processor * proc, int) {}34 bool __cfa_io_flush( processor * proc, bool ) {} 35 35 void __cfa_io_stop ( processor * proc ) {} 36 36 … … 220 220 cq.cqes = (struct io_uring_cqe *)(((intptr_t)cq.ring_ptr) + params.cq_off.cqes); 221 221 222 #if !defined( CFA_WITH_IO_URING_IDLE)222 #if !defined(IO_URING_IDLE) 223 223 // Step 4 : eventfd 224 224 // io_uring_register is so f*cking slow on some machine that it -
libcfa/src/concurrency/kernel.cfa
r5235d49 r7770cc8 27 27 extern "C" { 28 28 #include <sys/eventfd.h> 29 #include <sys/uio.h>30 29 } 31 30 … … 126 125 static void __wake_one(cluster * cltr); 127 126 128 static void idle_sleep(processor * proc, io_future_t & future, iovec & iov);127 static void idle_sleep(processor * proc, io_future_t & future, char buf[]); 129 128 static bool mark_idle (__cluster_proc_list & idles, processor & proc); 130 129 static void mark_awake(__cluster_proc_list & idles, processor & proc); … … 132 131 extern void __cfa_io_start( processor * ); 133 132 extern bool __cfa_io_drain( processor * ); 134 extern bool __cfa_io_flush( processor *, int min_comp);133 extern bool __cfa_io_flush( processor *, bool wait ); 135 134 extern void __cfa_io_stop ( processor * ); 136 135 static inline bool __maybe_io_drain( processor * ); 137 136 138 #if defined( CFA_WITH_IO_URING_IDLE)139 extern bool __kernel_read(processor * proc, io_future_t & future, iovec &, int fd);137 #if defined(IO_URING_IDLE) && defined(CFA_HAVE_LINUX_IO_URING_H) 138 extern bool __kernel_read(processor * proc, io_future_t & future, char buf[], int fd); 140 139 #endif 141 140 … … 172 171 io_future_t future; // used for idle sleep when io_uring is present 173 172 future.self.ptr = 1p; // mark it as already fulfilled so we know if there is a pending request or not 174 eventfd_t idle_val; 175 iovec idle_iovec = { &idle_val, sizeof(idle_val) }; 173 char buf[sizeof(uint64_t)]; 176 174 177 175 __cfa_io_start( this ); … … 208 206 209 207 if( !readyThread ) { 210 __cfa_io_flush( this, 0);208 __cfa_io_flush( this, false ); 211 209 212 210 readyThread = __next_thread_slow( this->cltr ); … … 239 237 } 240 238 241 idle_sleep( this, future, idle_iovec);239 idle_sleep( this, future, buf ); 242 240 243 241 // We were woken up, remove self from idle … … 260 258 261 259 if(this->io.pending && !this->io.dirty) { 262 __cfa_io_flush( this, 0);260 __cfa_io_flush( this, false ); 263 261 } 264 262 … … 276 274 277 275 // If we can't find a thread, might as well flush any outstanding I/O 278 if(this->io.pending) { __cfa_io_flush( this, 0); }276 if(this->io.pending) { __cfa_io_flush( this, false ); } 279 277 280 278 // Spin a little on I/O, just in case … … 371 369 372 370 if(this->io.pending && !this->io.dirty) { 373 __cfa_io_flush( this, 0);371 __cfa_io_flush( this, false ); 374 372 } 375 373 … … 381 379 382 380 __cfadbg_print_safe(runtime_core, "Kernel : core %p stopping\n", this); 383 }384 385 for(int i = 0; !available(future); i++) {386 if(i > 1000) __cfaabi_dbg_write( "ERROR: kernel has bin spinning on a flush after exit loop.\n", 60);387 __cfa_io_flush( this, 1 );388 381 } 389 382 … … 786 779 } 787 780 788 static void idle_sleep(processor * this, io_future_t & future, iovec & iov) {789 #if !defined( CFA_WITH_IO_URING_IDLE)781 static void idle_sleep(processor * this, io_future_t & future, char buf[]) { 782 #if !defined(IO_URING_IDLE) || !defined(CFA_HAVE_LINUX_IO_URING_H) 790 783 #if !defined(__CFA_NO_STATISTICS__) 791 784 if(this->print_halts) { … … 820 813 #endif 821 814 #else 815 #if !defined(CFA_HAVE_IORING_OP_READ) 816 #error this is only implemented if the read is present 817 #endif 822 818 // Do we already have a pending read 823 819 if(available(future)) { … … 825 821 reset(future); 826 822 827 __kernel_read(this, future, iov, this->idle_fd );828 } 829 830 __cfa_io_flush( this, 1);823 __kernel_read(this, future, buf, this->idle_fd ); 824 } 825 826 __cfa_io_flush( this, true ); 831 827 #endif 832 828 } -
libcfa/src/concurrency/kernel_private.hfa
r5235d49 r7770cc8 39 39 } 40 40 41 // Defines whether or not we *want* to use io_uring_enter as the idle_sleep blocking call 42 #define CFA_WANT_IO_URING_IDLE 43 44 // Defines whether or not we *can* use io_uring_enter as the idle_sleep blocking call 45 #if defined(CFA_WANT_IO_URING_IDLE) && defined(CFA_HAVE_LINUX_IO_URING_H) 46 #if defined(CFA_HAVE_IORING_OP_READ) || (defined(CFA_HAVE_READV) && defined(CFA_HAVE_IORING_OP_READV)) 47 #define CFA_WITH_IO_URING_IDLE 48 #endif 49 #endif 41 // #define IO_URING_IDLE 50 42 51 43 //----------------------------------------------------------------------------- -
libcfa/src/device/cpu.cfa
r5235d49 r7770cc8 30 30 #include <fcntl.h> 31 31 } 32 33 #include "algorithms/range_iterator.hfa"34 32 35 33 // search a string for character 'character' but looking atmost at len … … 137 135 count++; 138 136 } 139 int ret = iterate_dir(path, lambda); 140 if(ret == ENOTDIR) return 0; 137 iterate_dir(path, lambda); 141 138 142 139 /* paranoid */ verifyf(count == max + 1, "Inconsistent %s count, counted %d, but max %s was %d", prefix, count, prefix, (int)max); … … 146 143 147 144 // Count number of cpus in the system 148 static [int, const char *]count_cpus(void) {145 static int count_cpus(void) { 149 146 const char * fpath = "/sys/devices/system/cpu/online"; 150 147 int fd = open(fpath, 0, O_RDONLY); … … 162 159 163 160 const char * _; 164 return [read_width(buff, r - 1, &_), strndup(buff, r - 1)]; 161 int cnt = read_width(buff, r - 1, &_); 162 /* paranoid */ verify(cnt == count_prefix_dirs("/sys/devices/system/cpu", "cpu")); 163 return cnt; 165 164 } 166 165 … … 227 226 228 227 struct raw_cache_instance { 229 idx_range_t range; // A text description of the cpus covered230 unsigned width; // The number of cpus covered231 unsigned char level; // the cache level228 idx_range_t range; 229 unsigned width; 230 unsigned char level; 232 231 // FIXME add at least size and type 233 232 }; … … 236 235 static void ^?{}(raw_cache_instance & this) { free(this.range);} 237 236 238 // Returns a 2D array of instances of size [cpu count][cache levels] 239 // where cache level doesn't include instruction caches 240 raw_cache_instance ** build_raw_cache_table(unsigned cpus_c, idx_range_t cpus, unsigned idxs, unsigned cache_levels) 237 raw_cache_instance ** build_raw_cache_table(unsigned cpus, unsigned idxs, unsigned cache_levels) 241 238 { 242 raw_cache_instance ** raw = alloc(cpus_c, '\0'`fill); 243 244 RangeIter rc = { cpus }; 245 while(moveNext(rc)) { 246 unsigned i = rc.com; 239 raw_cache_instance ** raw = alloc(cpus); 240 for(i; cpus) { 247 241 raw[i] = alloc(cache_levels); 248 242 void addcache(unsigned fidx, unsigned char level, idx_range_t range, size_t len) { … … 269 263 270 264 // returns an allocate list of all the different distinct last level caches 271 static [*llc_map_t, size_t cnt] distinct_llcs( idx_range_tcpus, unsigned llc_idx, raw_cache_instance ** raw) {265 static [*llc_map_t, size_t cnt] distinct_llcs(unsigned cpus, unsigned llc_idx, raw_cache_instance ** raw) { 272 266 // Allocate at least one element 273 267 llc_map_t* ranges = alloc(); 274 268 size_t range_cnt = 1; 275 269 276 RangeIter rc = { cpus };277 __attribute__((unused)) bool ret =278 moveNext(rc);279 /* paranoid */ verify( ret );280 /* paranoid */ verify( rc.com >= 0 );281 282 270 // Initialize with element 0 283 ranges->raw = &raw[ rc.com][llc_idx];271 ranges->raw = &raw[0][llc_idx]; 284 272 ranges->count = 0; 285 273 ranges->start = -1u; 286 274 287 275 // Go over all other cpus 288 CPU_LOOP: while(moveNext(rc)) { 289 unsigned i = rc.com; 276 CPU_LOOP: for(i; 1~cpus) { 290 277 // Check if the range is already there 291 278 raw_cache_instance * candidate = &raw[i][llc_idx]; … … 317 304 } 318 305 319 static [[]cpu_pairing_t] get_cpu_pairings(unsigned cpus_c, idx_range_t cpus, raw_cache_instance ** raw, llc_map_t * maps, size_t map_cnt) { 320 cpu_pairing_t * pairings = alloc(cpus_c); 321 322 RangeIter rc = { cpus }; 323 CPU_LOOP: while(moveNext(rc)) { 324 unsigned i = rc.com; 306 static [[]cpu_pairing_t] get_cpu_pairings(unsigned cpus, raw_cache_instance ** raw, llc_map_t * maps, size_t map_cnt) { 307 cpu_pairing_t * pairings = alloc(cpus); 308 309 CPU_LOOP: for(i; cpus) { 325 310 pairings[i].cpu = i; 326 311 idx_range_t want = raw[i][0].range; … … 342 327 extern "C" { 343 328 void __cfaabi_device_startup( void ) { 344 int cpus_c; 345 const char * cpus; 346 [cpus_c, cpus] = count_cpus(); 347 #if defined(__CFA_WITH_VERIFY__) 348 // Verify that the mapping is self consistant. 349 { 350 RangeIter rc = { cpus }; 351 while(moveNext(rc)) { 352 unsigned i = rc.com; 353 verify(cpus_c > i); 354 } 355 } 356 #endif 357 329 int cpus = count_cpus(); 358 330 int idxs = count_cache_indexes(); 359 331 … … 361 333 unsigned cache_levels = 0; 362 334 unsigned llc = 0; 363 if (idxs != 0){335 { 364 336 unsigned char prev = -1u; 365 337 void first(unsigned idx, unsigned char level, const char * map, size_t len) { … … 373 345 374 346 // Read in raw data 375 raw_cache_instance ** raw = build_raw_cache_table(cpus _c, cpus, idxs, cache_levels);347 raw_cache_instance ** raw = build_raw_cache_table(cpus, idxs, cache_levels); 376 348 377 349 // Find number of distinct cache instances … … 390 362 width2 += maps[i].raw->width; 391 363 } 392 verify(width1 == cpus _c);393 verify(width2 == cpus _c);364 verify(width1 == cpus); 365 verify(width2 == cpus); 394 366 } 395 367 #endif 396 368 397 369 // Get mappings from cpu to cache instance 398 cpu_pairing_t * pairings = get_cpu_pairings(cpus _c, cpus, raw, maps, map_cnt);370 cpu_pairing_t * pairings = get_cpu_pairings(cpus, raw, maps, map_cnt); 399 371 400 372 // Sort by cache instance 401 qsort(pairings, cpus _c);373 qsort(pairings, cpus); 402 374 403 375 { 404 376 unsigned it = 0; 405 RangeIter rc = { cpus }; 406 while(moveNext(rc)) { 407 unsigned i = rc.com; 377 for(i; cpus) { 408 378 unsigned llc_id = pairings[i].id; 409 379 if(maps[llc_id].start == -1u) { … … 414 384 } 415 385 } 416 /* paranoid */ verify(it == cpus _c);386 /* paranoid */ verify(it == cpus); 417 387 } 418 388 419 389 // From the mappings build the actual cpu map we want 420 struct cpu_map_entry_t * entries = alloc(cpus_c); 421 for(i; cpus_c) { entries[i].count = 0; } 422 423 RangeIter rc = { cpus }; 424 while(moveNext(rc)) { 425 unsigned i = rc.com; 390 struct cpu_map_entry_t * entries = alloc(cpus); 391 for(i; cpus) { entries[i].count = 0; } 392 for(i; cpus) { 426 393 /* paranoid */ verify(pairings[i].id < map_cnt); 427 394 unsigned c = pairings[i].cpu; … … 439 406 free(pairings); 440 407 441 for(i; cpus _c) {442 if( raw[i] )for(j; cache_levels) {408 for(i; cpus) { 409 for(j; cache_levels) { 443 410 ^(raw[i][j]){}; 444 411 } … … 448 415 449 416 cpu_info.llc_map = entries; 450 cpu_info.hthrd_count = cpus_c; 451 cpu_info.llc_count = map_cnt; 417 cpu_info.hthrd_count = cpus; 452 418 } 453 419 -
libcfa/src/device/cpu.hfa
r5235d49 r7770cc8 23 23 24 24 struct cpu_info_t { 25 // Array of size [hthrd_count]25 // array of size [hthrd_count] 26 26 const cpu_map_entry_t * llc_map; 27 27 28 // Number of _hardware_ threads present in the system28 // Number of _hardware_ threads present in the system 29 29 size_t hthrd_count; 30 31 // Number of distinct last level caches32 size_t llc_count;33 30 }; 34 31 -
libcfa/src/stdlib.cfa
r5235d49 r7770cc8 10 10 // Created On : Thu Jan 28 17:10:29 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Dec 29 15:32:44 202113 // Update Count : 5 1212 // Last Modified On : Thu Nov 12 07:46:09 2020 13 // Update Count : 503 14 14 // 15 15 … … 221 221 //--------------------------------------- 222 222 223 static uint32_t seed = 0; // current seed 224 static thread_local uint32_t state; // random state 225 226 void set_seed( uint32_t seed_ ) { state = seed = seed_; } 227 uint32_t get_seed() { return seed; } 228 229 #define GENERATOR LCG 230 231 inline uint32_t MarsagliaXor( uint32_t & state ) { 232 if ( unlikely( seed == 0 ) ) set_seed( rdtscl() ); 233 else if ( unlikely( state == 0 ) ) state = seed; 234 state ^= state << 6; 235 state ^= state >> 21; 236 state ^= state << 7; 237 return state; 238 } // MarsagliaXor 239 240 inline uint32_t LCG( uint32_t & state ) { // linear congruential generator 241 if ( unlikely( seed == 0 ) ) set_seed( rdtscl() ); 242 else if ( unlikely( state == 0 ) ) state = seed; 243 return state = 36973 * (state & 65535) + (state >> 16); 244 } // LCG 245 246 uint32_t prng( PRNG & prng ) with( prng ) { callcnt += 1; return GENERATOR( state ); } 247 248 uint32_t prng( void ) { return GENERATOR( state ); } 249 250 //--------------------------------------- 251 252 bool threading_enabled( void ) __attribute__(( weak )) { return false; } 223 bool threading_enabled(void) __attribute__((weak)) { 224 return false; 225 } 253 226 254 227 // Local Variables: // -
libcfa/src/stdlib.hfa
r5235d49 r7770cc8 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Dec 29 15:30:58202113 // Update Count : 5 9112 // Last Modified On : Tue Apr 20 21:20:03 2021 13 // Update Count : 575 14 14 // 15 15 … … 169 169 return ret; 170 170 } 171 S_fill(T) ?`fill ( zero_t ) = void; // FIX ME: remove this once ticket 214 is resolved172 S_fill(T) ?`fill ( T * a ) { return (S_fill(T)){ 'T', '0', 0, a }; } // FIX ME: remove this once ticket 214 is resolved173 171 S_fill(T) ?`fill ( char c ) { return (S_fill(T)){ 'c', c }; } 172 S_fill(T) ?`fill ( T * a ) { return (S_fill(T)){ 'T', '0', 0, a }; } 174 173 S_fill(T) ?`fill ( T a[], size_t nmemb ) { return (S_fill(T)){ 'a', '0', nmemb * sizeof(T), a }; } 175 174 … … 363 362 364 363 static inline { 365 long int random( long int l, long int u ) { if ( u < l ) [u, l] = [l, u]; return lrand48() % (u - l + 1) + l; } // [l,u]366 long int random( long int u ) { return random( 0, u - 1); } // [0,u)364 long int random( long int l, long int u ) { if ( u < l ) [u, l] = [l, u]; return lrand48() % (u - l) + l; } // [l,u) 365 long int random( long int u ) { if ( u < 0 ) return random( u, 0 ); else return random( 0, u ); } // [0,u) 367 366 unsigned long int random( void ) { return lrand48(); } 368 367 unsigned long int random( unsigned long int u ) { return lrand48() % u; } // [0,u) 369 unsigned long int random( unsigned long int l, unsigned long int u ) { if ( u < l ) [u, l] = [l, u]; return lrand48() % (u - l + 1) + l; } // [l,u]368 unsigned long int random( unsigned long int l, unsigned long int u ) { if ( u < l ) [u, l] = [l, u]; return lrand48() % (u - l) + l; } // [l,u) 370 369 371 370 char random( void ) { return (unsigned long int)random(); } … … 388 387 //--------------------------------------- 389 388 390 struct PRNG {391 uint32_t callcnt; // call count392 uint32_t seed; // current seed393 uint32_t state; // random state394 }; // PRNG395 396 extern uint32_t prng( PRNG & prng ) __attribute__(( warn_unused_result )); // [0,UINT_MAX]397 static inline {398 void set_seed( PRNG & prng, uint32_t seed_ ) with( prng ) { state = seed = seed_; } // set seed399 void ?{}( PRNG & prng ) { set_seed( prng, rdtscl() ); } // random seed400 void ?{}( PRNG & prng, uint32_t seed ) { set_seed( prng, seed ); } // fixed seed401 uint32_t get_seed( PRNG & prng ) __attribute__(( warn_unused_result )) with( prng ) { return seed; } // get seed402 uint32_t prng( PRNG & prng, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( prng ) % u; } // [0,u)403 uint32_t prng( PRNG & prng, uint32_t l, uint32_t u ) __attribute__(( warn_unused_result )) { return prng( prng, u - l + 1 ) + l; } // [l,u]404 uint32_t calls( PRNG & prng ) __attribute__(( warn_unused_result )) with( prng ) { return callcnt; }405 } // distribution406 407 extern void set_seed( uint32_t seed ); // set per thread seed408 extern uint32_t get_seed(); // get seed409 extern uint32_t prng( void ) __attribute__(( warn_unused_result )); // [0,UINT_MAX]410 static inline {411 uint32_t prng( uint32_t u ) __attribute__(( warn_unused_result ));412 uint32_t prng( uint32_t u ) { return prng() % u; } // [0,u)413 uint32_t prng( uint32_t l, uint32_t u ) __attribute__(( warn_unused_result ));414 uint32_t prng( uint32_t l, uint32_t u ) { return prng( u - l + 1 ) + l; } // [l,u]415 } // distribution416 417 //---------------------------------------418 419 389 extern bool threading_enabled( void ) OPTIONAL_THREAD; 420 390 -
src/AST/Expr.cpp
r5235d49 r7770cc8 9 9 // Author : Aaron B. Moss 10 10 // Created On : Wed May 15 17:00:00 2019 11 // Last Modified By : Andrew Beach12 // Created On : T ue Nov 30 14:23:00 202113 // Update Count : 711 // Last Modified By : Peter A. Buhr 12 // Created On : Thr Jun 13 13:38:00 2019 13 // Update Count : 6 14 14 // 15 15 … … 141 141 /// The type of the address of a type. 142 142 /// Caller is responsible for managing returned memory 143 Type * addrType( const ptr<Type> &type ) {144 if ( auto refType = type.as< ReferenceType >() ) {145 return new ReferenceType ( addrType( refType->base ), refType->qualifiers );143 Type * addrType( const Type * type ) { 144 if ( const ReferenceType * refType = dynamic_cast< const ReferenceType * >( type ) ) { 145 return new ReferenceType{ addrType( refType->base ), refType->qualifiers }; 146 146 } else { 147 return new PointerType ( type );147 return new PointerType{ type }; 148 148 } 149 149 } 150 151 /// The type of the address of an expression. 152 /// Caller is responsible for managing returned memory 153 Type * addrExprType( const CodeLocation & loc, const Expr * arg ) { 154 assert( arg ); 155 // If the expression's type is unknown, the address type is unknown. 156 if ( nullptr == arg->result ) { 157 return nullptr; 158 // An lvalue is transformed directly. 159 } else if ( arg->get_lvalue() ) { 160 return addrType( arg->result ); 161 // Strip a layer of reference to "create" an lvalue expression. 162 } else if ( auto refType = arg->result.as< ReferenceType >() ) { 163 return addrType( refType->base ); 150 } 151 152 AddressExpr::AddressExpr( const CodeLocation & loc, const Expr * a ) : Expr( loc ), arg( a ) { 153 if ( arg->result ) { 154 if ( arg->get_lvalue() ) { 155 // lvalue, retains all levels of reference, and gains a pointer inside the references 156 Type * res = addrType( arg->result ); 157 result = res; 164 158 } else { 165 SemanticError( loc, arg->result.get(), 166 "Attempt to take address of non-lvalue expression: " ); 159 // taking address of non-lvalue, must be a reference, loses one layer of reference 160 if ( const ReferenceType * refType = 161 dynamic_cast< const ReferenceType * >( arg->result.get() ) ) { 162 Type * res = addrType( refType->base ); 163 result = res; 164 } else { 165 SemanticError( loc, arg->result.get(), 166 "Attempt to take address of non-lvalue expression: " ); 167 } 167 168 } 168 169 } 169 170 } 170 171 AddressExpr::AddressExpr( const CodeLocation & loc, const Expr * a ) :172 Expr( loc, addrExprType( loc, a ) ), arg( a )173 {}174 171 175 172 // --- LabelAddressExpr -
src/AST/Print.cpp
r5235d49 r7770cc8 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Print.cpp -- Print an AST (or sub-tree) to a stream.7 // Print.cpp -- 8 8 // 9 9 // Author : Thierry Delisle -
src/AST/Print.hpp
r5235d49 r7770cc8 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Print.hpp -- Print an AST (or sub-tree) to a stream.7 // Print.hpp -- 8 8 // 9 9 // Author : Thierry Delisle … … 35 35 template< typename Coll > 36 36 void printAll( std::ostream & os, const Coll & c, Indenter indent = {} ) { 37 for ( const auto & i : c ) {38 if ( ! i ) continue;39 40 os << indent;41 print( os, i, indent );42 os << std::endl;43 }37 for ( const auto & i : c ) { 38 if ( ! i ) continue; 39 40 os << indent; 41 print( os, i, indent ); 42 os << std::endl; 43 } 44 44 } 45 45 -
src/Concurrency/Keywords.h
r5235d49 r7770cc8 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // Keywords.h -- Implement concurrency constructs from their keywords.7 // Keywords.h -- 8 8 // 9 9 // Author : Thierry Delisle … … 19 19 20 20 class Declaration; 21 namespace ast {22 class TranslationUnit;23 }24 21 25 22 namespace Concurrency { … … 27 24 void implementMutexFuncs( std::list< Declaration * > & translationUnit ); 28 25 void implementThreadStarter( std::list< Declaration * > & translationUnit ); 29 30 /// Implement the sue-like keywords and the suspend keyword.31 void implementKeywords( ast::TranslationUnit & translationUnit );32 /// Implement the mutex parameters and mutex statement.33 void implementMutex( ast::TranslationUnit & translationUnit );34 /// Add the thread starter code to constructors.35 void implementThreadStarter( ast::TranslationUnit & translationUnit );36 26 }; 37 27 -
src/Concurrency/module.mk
r5235d49 r7770cc8 15 15 ############################################################################### 16 16 17 SRC_CONCURRENCY = \ 18 Concurrency/KeywordsNew.cpp \ 19 Concurrency/Keywords.cc 17 SRC += Concurrency/Keywords.cc Concurrency/Keywords.h Concurrency/Waitfor.cc Concurrency/Waitfor.h 18 SRCDEMANGLE += Concurrency/Keywords.cc 20 19 21 SRC += $(SRC_CONCURRENCY) \22 Concurrency/Keywords.h \23 Concurrency/Waitfor.cc \24 Concurrency/Waitfor.h25 26 SRCDEMANGLE += $(SRC_CONCURRENCY)27 -
src/Validate/module.mk
r5235d49 r7770cc8 16 16 17 17 SRC_VALIDATE = \ 18 Validate/CompoundLiteral.cpp \19 Validate/CompoundLiteral.hpp \20 18 Validate/HandleAttributes.cc \ 21 19 Validate/HandleAttributes.h \ -
src/main.cc
r5235d49 r7770cc8 10 10 // Created On : Fri May 15 23:12:02 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue Nov 30 10:25:00 202113 // Update Count : 65 912 // Last Modified On : Fri Nov 12 11:06:00 2021 13 // Update Count : 658 14 14 // 15 15 … … 50 50 #include "Common/UnimplementedError.h" // for UnimplementedError 51 51 #include "Common/utility.h" // for deleteAll, filter, printAll 52 #include "Concurrency/Keywords.h" // for implementMutex, implement...53 52 #include "Concurrency/Waitfor.h" // for generateWaitfor 54 53 #include "ControlStruct/ExceptDecl.h" // for translateExcept … … 74 73 #include "Tuples/Tuples.h" // for expandMemberTuples, expan... 75 74 #include "Validate/FindSpecialDecls.h" // for findGlobalDecls 76 #include "Validate/CompoundLiteral.hpp" // for handleCompoundLiterals77 75 #include "Validate/InitializerLength.hpp" // for setLengthFromInitializer 78 76 #include "Validate/LabelAddressFixer.hpp" // for fixLabelAddresses … … 327 325 PASS( "Validate-C", SymTab::validate_C( translationUnit ) ); 328 326 PASS( "Validate-D", SymTab::validate_D( translationUnit ) ); 327 PASS( "Validate-E", SymTab::validate_E( translationUnit ) ); 329 328 330 329 CodeTools::fillLocations( translationUnit ); … … 339 338 forceFillCodeLocations( transUnit ); 340 339 341 PASS( "Implement Mutex", Concurrency::implementMutex( transUnit ) );342 PASS( "Implement Thread Start", Concurrency::implementThreadStarter( transUnit ) );343 PASS( "Compound Literal", Validate::handleCompoundLiterals( transUnit ) );344 340 PASS( "Set Length From Initializer", Validate::setLengthFromInitializer( transUnit ) ); 345 341 PASS( "Find Global Decls", Validate::findGlobalDecls( transUnit ) ); … … 406 402 translationUnit = convert( move( transUnit ) ); 407 403 } else { 408 PASS( "Validate-E", SymTab::validate_E( translationUnit ) );409 404 PASS( "Validate-F", SymTab::validate_F( translationUnit ) ); 410 405 -
tests/.expect/random.x64.txt
r5235d49 r7770cc8 1 1 õ 2 2 = 3 K 3 V 4 4 -911259971 5 5 6 6 11 6 -4 7 7 1232105397 8 8 0 9 1 19 18 10 10 -914096085 11 11 1 12 20 12 15 13 13 2077092859 14 14 1 15 1 215 11 16 16 0.677254 17 17 0.678106775246139 -
tests/.expect/random.x86.txt
r5235d49 r7770cc8 1 1 õ 2 2 = 3 K 3 V 4 4 -911259971 5 5 6 6 11 6 -4 7 7 1232105397 8 8 0 9 1 19 18 10 10 -914096085 11 11 1 12 20 12 15 13 13 2077092859 14 14 1 15 1 215 11 16 16 0.677254 17 17 0.678106775246139 -
tests/pybin/tools.py
r5235d49 r7770cc8 374 374 375 375 if not os.path.isfile(core): 376 return 1, "ERR No core dump (limit soft: {} hard: {})".format(*resource.getrlimit(resource.RLIMIT_CORE))376 return 1, "ERR No core dump" 377 377 378 378 try:
Note:
See TracChangeset
for help on using the changeset viewer.