Changes in / [e7d6968:37b7d95]
- Files:
-
- 3 added
- 6 deleted
- 53 edited
-
Jenkins/FullBuild (modified) (1 diff)
-
Jenkinsfile (modified) (5 diffs)
-
doc/theses/thierry_delisle_PhD/code/readQ_example/thrdlib/cforall.cpp (added)
-
doc/theses/thierry_delisle_PhD/code/readQ_example/thrdlib/cforall.hpp (deleted)
-
doc/theses/thierry_delisle_PhD/code/readQ_example/thrdlib/fibre.cpp (added)
-
doc/theses/thierry_delisle_PhD/code/readQ_example/thrdlib/fibre.hpp (deleted)
-
doc/theses/thierry_delisle_PhD/code/readQ_example/thrdlib/pthread.cpp (added)
-
doc/theses/thierry_delisle_PhD/code/readQ_example/thrdlib/pthread.hpp (deleted)
-
libcfa/prelude/builtins.c (modified) (2 diffs)
-
libcfa/src/concurrency/coroutine.cfa (modified) (4 diffs)
-
libcfa/src/concurrency/coroutine.hfa (modified) (3 diffs)
-
libcfa/src/concurrency/io.cfa (modified) (1 diff)
-
libcfa/src/concurrency/io/call.cfa.in (modified) (1 diff)
-
libcfa/src/concurrency/kernel.cfa (modified) (3 diffs)
-
libcfa/src/concurrency/kernel.hfa (modified) (1 diff)
-
libcfa/src/concurrency/kernel/startup.cfa (modified) (1 diff)
-
libcfa/src/concurrency/kernel_private.hfa (modified) (1 diff)
-
libcfa/src/concurrency/monitor.cfa (modified) (1 diff)
-
libcfa/src/concurrency/snzi.hfa (modified) (1 diff)
-
libcfa/src/exception.h (modified) (3 diffs)
-
libcfa/src/exception.hfa (modified) (7 diffs)
-
libcfa/src/limits.cfa (modified) (2 diffs)
-
libcfa/src/limits.hfa (modified) (2 diffs)
-
src/AST/Expr.cpp (modified) (2 diffs)
-
src/AST/Expr.hpp (modified) (2 diffs)
-
src/AST/Type.cpp (modified) (1 diff)
-
src/AST/Type.hpp (modified) (3 diffs)
-
src/AST/porting.md (modified) (5 diffs)
-
src/Concurrency/Keywords.cc (modified) (6 diffs)
-
src/InitTweak/FixGlobalInit.cc (modified) (1 diff)
-
src/InitTweak/FixInit.cc (modified) (1 diff)
-
src/InitTweak/InitTweak.cc (modified) (1 diff)
-
src/InitTweak/InitTweak.h (modified) (1 diff)
-
src/Parser/DeclarationNode.cc (modified) (5 diffs)
-
src/Parser/parser.yy (modified) (5 diffs)
-
src/SynTree/AggregateDecl.cc (modified) (2 diffs)
-
src/SynTree/Declaration.h (modified) (1 diff)
-
src/SynTree/Expression.h (modified) (2 diffs)
-
src/SynTree/TypeDecl.cc (modified) (2 diffs)
-
src/Virtual/Tables.cc (modified) (5 diffs)
-
src/Virtual/Tables.h (modified) (1 diff)
-
src/main.cc (modified) (3 diffs)
-
tests/.expect/const-init.txt (deleted)
-
tests/.expect/init1-ERROR.txt (deleted)
-
tests/.expect/init1.txt (modified) (1 diff)
-
tests/.expect/limits.txt (modified) (1 diff)
-
tests/Makefile.am (modified) (3 diffs)
-
tests/alloc.cfa (modified) (2 diffs)
-
tests/complex.cfa (modified) (1 diff)
-
tests/const-init.cfa (deleted)
-
tests/errors/.expect/completeType.x64.txt (modified) (1 diff)
-
tests/errors/.expect/completeType.x86.txt (modified) (1 diff)
-
tests/exceptions/cancel/coroutine.cfa (modified) (1 diff)
-
tests/exceptions/conditional.cfa (modified) (1 diff)
-
tests/exceptions/defaults.cfa (modified) (1 diff)
-
tests/exceptions/except-io.hfa (modified) (1 diff)
-
tests/exceptions/trash.cfa (modified) (1 diff)
-
tests/global-monomorph.cfa (modified) (1 diff)
-
tests/init1.cfa (modified) (5 diffs)
-
tests/limits.cfa (modified) (1 diff)
-
tests/poly-d-cycle.cfa (modified) (1 diff)
-
tests/poly-o-cycle.cfa (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
Jenkins/FullBuild
re7d6968 r37b7d95 17 17 18 18 parallel ( 19 gcc_8_x86: { trigger_build( 'gcc-8', 'x86' ) },20 gcc_ 7_x86: { trigger_build( 'gcc-7', 'x86' ) },19 clang_x86: { trigger_build( 'gcc-8', 'x86' ) }, 20 gcc_5_x86: { trigger_build( 'gcc-7', 'x86' ) }, 21 21 gcc_6_x86: { trigger_build( 'gcc-6', 'x86' ) }, 22 22 gcc_9_x64: { trigger_build( 'gcc-9', 'x64' ) }, -
Jenkinsfile
re7d6968 r37b7d95 127 127 } 128 128 129 ast = Settings.NewAST ? "--enable-new-ast" : "--disable-new-ast" 130 131 sh "${SrcDir}/configure CXX=${Settings.Compiler.CXX} CC=${Settings.Compiler.CC} ${Settings.Architecture.flags} AR=gcc-ar RANLIB=gcc-ranlib ${targets} ${ast} --quiet --prefix=${BuildDir}" 129 sh "${SrcDir}/configure CXX=${Settings.Compiler.CXX} CC=${Settings.Compiler.CC} ${Settings.Architecture.flags} AR=gcc-ar RANLIB=gcc-ranlib ${targets} --quiet --prefix=${BuildDir}" 132 130 133 131 // Configure libcfa … … 361 359 public final CC_Desc Compiler 362 360 public final Arch_Desc Architecture 363 public final Boolean NewAST364 361 public final Boolean RunAllTests 365 362 public final Boolean RunBenchmark … … 395 392 break 396 393 case 'clang': 397 this.Compiler = new CC_Desc('clang', 'clang++- 10', 'gcc-9', '-flto=thin -flto-jobs=0')394 this.Compiler = new CC_Desc('clang', 'clang++-6.0', 'gcc-6', '-flto=thin -flto-jobs=0') 398 395 break 399 396 default : … … 413 410 414 411 this.IsSandbox = (branch == "jenkins-sandbox") 415 this.NewAST = param.NewAST416 412 this.RunAllTests = param.RunAllTests 417 413 this.RunBenchmark = param.RunBenchmark … … 474 470 ], \ 475 471 [$class: 'BooleanParameterDefinition', \ 476 description: 'If true, build compiler using new AST', \477 name: 'NewAST', \478 defaultValue: false, \479 ], \480 [$class: 'BooleanParameterDefinition', \481 472 description: 'If false, only the quick test suite is ran', \ 482 473 name: 'RunAllTests', \ 483 474 defaultValue: false, \ 484 ], 475 ], \ 485 476 [$class: 'BooleanParameterDefinition', \ 486 477 description: 'If true, jenkins also runs benchmarks', \ -
libcfa/prelude/builtins.c
re7d6968 r37b7d95 10 10 // Created On : Fri Jul 21 16:21:03 2017 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Oct 9 18:26:19202013 // Update Count : 1 1012 // Last Modified On : Mon Jul 13 21:10:02 2020 13 // Update Count : 109 14 14 // 15 15 … … 94 94 // universal typed pointer constant 95 95 static inline forall( dtype DT ) DT * intptr( uintptr_t addr ) { return (DT *)addr; } 96 static inline forall( ftype FT ) FT * intptr( uintptr_t addr ) { return (FT *)addr; }97 96 98 97 #if defined(__SIZEOF_INT128__) -
libcfa/src/concurrency/coroutine.cfa
re7d6968 r37b7d95 47 47 48 48 //----------------------------------------------------------------------------- 49 FORALL_DATA_INSTANCE(CoroutineCancelled, (dtype coroutine_t), (coroutine_t)) 49 FORALL_DATA_INSTANCE(CoroutineCancelled, 50 (dtype coroutine_t | sized(coroutine_t)), (coroutine_t)) 50 51 51 52 struct __cfaehm_node { … … 58 59 void mark_exception(CoroutineCancelled(T) *) {} 59 60 60 forall(dtype T )61 forall(dtype T | sized(T)) 61 62 void copy(CoroutineCancelled(T) * dst, CoroutineCancelled(T) * src) { 62 63 dst->the_coroutine = src->the_coroutine; … … 76 77 exception_t * except = (exception_t *)(1 + (__cfaehm_node *)desc->cancellation); 77 78 78 // TODO: Remove explitate vtable set once trac#186 is fixed.79 79 CoroutineCancelled(T) except; 80 except.virtual_table = &get_exception_vtable(&except);81 80 except.the_coroutine = &cor; 82 81 except.the_exception = except; … … 92 91 93 92 // minimum feasible stack size in bytes 94 static const size_t MinStackSize = 1000; 93 #define MinStackSize 1000 95 94 extern size_t __page_size; // architecture pagesize HACK, should go in proper runtime singleton 96 95 -
libcfa/src/concurrency/coroutine.hfa
re7d6968 r37b7d95 22 22 //----------------------------------------------------------------------------- 23 23 // Exception thrown from resume when a coroutine stack is cancelled. 24 FORALL_DATA_EXCEPTION(CoroutineCancelled, (dtype coroutine_t), (coroutine_t)) ( 24 // Should not have to be be sized (see trac #196). 25 FORALL_DATA_EXCEPTION(CoroutineCancelled, 26 (dtype coroutine_t | sized(coroutine_t)), (coroutine_t)) ( 25 27 coroutine_t * the_coroutine; 26 28 exception_t * the_exception; … … 28 30 29 31 forall(dtype T) 32 void mark_exception(CoroutineCancelled(T) *); 33 34 forall(dtype T | sized(T)) 30 35 void copy(CoroutineCancelled(T) * dst, CoroutineCancelled(T) * src); 31 36 … … 37 42 // Anything that implements this trait can be resumed. 38 43 // Anything that is resumed is a coroutine. 39 trait is_coroutine(dtype T | IS_RESUMPTION_EXCEPTION(CoroutineCancelled, (T))) { 44 trait is_coroutine(dtype T | sized(T) 45 | is_resumption_exception(CoroutineCancelled(T)) 46 | VTABLE_ASSERTION(CoroutineCancelled, (T))) { 40 47 void main(T & this); 41 48 $coroutine * get_coroutine(T & this); -
libcfa/src/concurrency/io.cfa
re7d6968 r37b7d95 134 134 int ret = 0; 135 135 if( need_sys_to_submit || need_sys_to_complete ) { 136 ret = syscall( __NR_io_uring_enter, ring.fd, to_submit, 0, flags, (sigset_t *)0p, _NSIG / 8);136 ret = syscall( __NR_io_uring_enter, ring.fd, to_submit, 0, flags, 0p, _NSIG / 8); 137 137 if( ret < 0 ) { 138 138 switch((int)errno) { -
libcfa/src/concurrency/io/call.cfa.in
re7d6968 r37b7d95 47 47 #include "kernel/fwd.hfa" 48 48 49 static const __u8 REGULAR_FLAGS = 0 50 #if defined(CFA_HAVE_IOSQE_FIXED_FILE) 51 | IOSQE_FIXED_FILE 52 #endif 53 #if defined(CFA_HAVE_IOSQE_IO_DRAIN) 54 | IOSQE_IO_DRAIN 55 #endif 56 #if defined(CFA_HAVE_IOSQE_ASYNC) 57 | IOSQE_ASYNC 58 #endif 59 ; 60 61 static const __u32 LINK_FLAGS = 0 62 #if defined(CFA_HAVE_IOSQE_IO_LINK) 63 | IOSQE_IO_LINK 64 #endif 65 #if defined(CFA_HAVE_IOSQE_IO_HARDLINK) 66 | IOSQE_IO_HARDLINK 67 #endif 68 ; 69 70 static const __u32 SPLICE_FLAGS = 0 71 #if defined(CFA_HAVE_SPLICE_F_FD_IN_FIXED) 72 | SPLICE_F_FD_IN_FIXED 73 #endif 74 ; 49 #if defined(CFA_HAVE_IOSQE_FIXED_FILE) && defined(CFA_HAVE_IOSQE_IO_DRAIN) && defined(CFA_HAVE_IOSQE_ASYNC) 50 #define REGULAR_FLAGS (IOSQE_FIXED_FILE | IOSQE_IO_DRAIN | IOSQE_ASYNC) 51 #elif defined(CFA_HAVE_IOSQE_FIXED_FILE) && defined(CFA_HAVE_IOSQE_ASYNC) 52 #define REGULAR_FLAGS (IOSQE_FIXED_FILE | IOSQE_ASYNC) 53 #elif defined(CFA_HAVE_IOSQE_FIXED_FILE) && defined(CFA_HAVE_IOSQE_IO_DRAIN) 54 #define REGULAR_FLAGS (IOSQE_FIXED_FILE | IOSQE_IO_DRAIN) 55 #elif defined(CFA_HAVE_IOSQE_IO_DRAIN) && defined(CFA_HAVE_IOSQE_ASYNC) 56 #define REGULAR_FLAGS (IOSQE_IO_DRAIN | IOSQE_ASYNC) 57 #elif defined(CFA_HAVE_IOSQE_FIXED_FILE) 58 #define REGULAR_FLAGS (IOSQE_FIXED_FILE) 59 #elif defined(CFA_HAVE_IOSQE_IO_DRAIN) 60 #define REGULAR_FLAGS (IOSQE_IO_DRAIN) 61 #elif defined(CFA_HAVE_IOSQE_ASYNC) 62 #define REGULAR_FLAGS (IOSQE_ASYNC) 63 #else 64 #define REGULAR_FLAGS (0) 65 #endif 66 67 #if defined(CFA_HAVE_IOSQE_IO_LINK) && defined(CFA_HAVE_IOSQE_IO_HARDLINK) 68 #define LINK_FLAGS (IOSQE_IO_LINK | IOSQE_IO_HARDLINK) 69 #elif defined(CFA_HAVE_IOSQE_IO_LINK) 70 #define LINK_FLAGS (IOSQE_IO_LINK) 71 #elif defined(CFA_HAVE_IOSQE_IO_HARDLINK) 72 #define LINK_FLAGS (IOSQE_IO_HARDLINK) 73 #else 74 #define LINK_FLAGS (0) 75 #endif 76 77 #if defined(CFA_HAVE_SPLICE_F_FD_IN_FIXED) 78 #define SPLICE_FLAGS (SPLICE_F_FD_IN_FIXED) 79 #else 80 #define SPLICE_FLAGS (0) 81 #endif 75 82 76 83 extern [* struct io_uring_sqe, __u32] __submit_alloc( struct __io_data & ring, __u64 data ); -
libcfa/src/concurrency/kernel.cfa
re7d6968 r37b7d95 252 252 /* paranoid */ verify( kernelTLS.this_thread == thrd_dst ); 253 253 /* paranoid */ verify( thrd_dst->context.SP ); 254 /* paranoid */ verify( thrd_dst->state != Halted );255 254 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) < ((uintptr_t)__get_stack(thrd_dst->curr_cor)->base ) || thrd_dst->curr_cor == proc_cor, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too small.\n", thrd_dst ); // add escape condition if we are setting up the processor 256 255 /* paranoid */ verifyf( ((uintptr_t)thrd_dst->context.SP) > ((uintptr_t)__get_stack(thrd_dst->curr_cor)->limit) || thrd_dst->curr_cor == proc_cor, "ERROR : Destination $thread %p has been corrupted.\n StackPointer too large.\n", thrd_dst ); // add escape condition if we are setting up the processor … … 288 287 if(unlikely(thrd_dst->state == Halted)) { 289 288 // The thread has halted, it should never be scheduled/run again 290 // finish the thread 291 __thread_finish( thrd_dst ); 289 // We may need to wake someone up here since 290 unpark( this->destroyer ); 291 this->destroyer = 0p; 292 292 break RUNNING; 293 293 } … … 448 448 } 449 449 450 extern "C" { 451 // Leave the thread monitor 452 // last routine called by a thread. 453 // Should never return 454 void __cfactx_thrd_leave() { 455 $thread * thrd = TL_GET( this_thread ); 456 $monitor * this = &thrd->self_mon; 457 458 // Lock the monitor now 459 lock( this->lock __cfaabi_dbg_ctx2 ); 460 461 disable_interrupts(); 462 463 thrd->state = Halted; 464 465 if( thrd != this->owner || this->recursion != 1) { abort( "Thread internal monitor has unbalanced recursion" ); } 466 467 // Leave the thread 468 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 469 returnToKernel(); 470 abort(); 471 472 // Control flow should never reach here! 473 } 450 // KERNEL ONLY 451 void __leave_thread() { 452 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 453 returnToKernel(); 454 abort(); 474 455 } 475 456 -
libcfa/src/concurrency/kernel.hfa
re7d6968 r37b7d95 79 79 // Handle to pthreads 80 80 pthread_t kernel_thread; 81 82 // RunThread data 83 // Action to do after a thread is ran 84 $thread * destroyer; 81 85 82 86 // Preemption data -
libcfa/src/concurrency/kernel/startup.cfa
re7d6968 r37b7d95 474 474 this.cltr = &_cltr; 475 475 full_proc = true; 476 destroyer = 0p; 476 477 do_terminate = false; 477 478 preemption_alarm = 0p; -
libcfa/src/concurrency/kernel_private.hfa
re7d6968 r37b7d95 39 39 ; 40 40 41 // release/wake-up the following resources42 void __ thread_finish( $thread * thrd);41 //Block current thread and release/wake-up the following resources 42 void __leave_thread() __attribute__((noreturn)); 43 43 44 44 //----------------------------------------------------------------------------- -
libcfa/src/concurrency/monitor.cfa
re7d6968 r37b7d95 281 281 } 282 282 283 void __thread_finish( $thread * thrd ) { 284 $monitor * this = &thrd->self_mon; 285 286 // Lock the monitor now 287 /* paranoid */ verify( this->lock.lock ); 288 /* paranoid */ verifyf( thrd == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", thrd, this->owner, this->recursion, this ); 289 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 290 /* paranoid */ verify( thrd->state == Halted ); 291 /* paranoid */ verify( this->recursion == 1 ); 292 293 // Leaving a recursion level, decrement the counter 294 this->recursion -= 1; 295 this->owner = 0p; 296 297 // Fetch the next thread, can be null 298 $thread * new_owner = next_thread( this ); 299 300 // Release the monitor lock 301 unlock( this->lock ); 302 303 // Unpark the next owner if needed 304 /* paranoid */ verifyf( !new_owner || new_owner == this->owner, "Expected owner to be %p, got %p (m: %p)", new_owner, this->owner, this ); 305 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 306 /* paranoid */ verify( thrd->state == Halted ); 307 unpark( new_owner ); 283 extern "C" { 284 // Leave the thread monitor 285 // last routine called by a thread. 286 // Should never return 287 void __cfactx_thrd_leave() { 288 $thread * thrd = TL_GET( this_thread ); 289 $monitor * this = &thrd->self_mon; 290 291 // Lock the monitor now 292 lock( this->lock __cfaabi_dbg_ctx2 ); 293 294 disable_interrupts(); 295 296 thrd->state = Halted; 297 298 /* paranoid */ verifyf( thrd == this->owner, "Expected owner to be %p, got %p (r: %i, m: %p)", thrd, this->owner, this->recursion, this ); 299 300 // Leaving a recursion level, decrement the counter 301 this->recursion -= 1; 302 303 // If we haven't left the last level of recursion 304 // it must mean there is an error 305 if( this->recursion != 0) { abort( "Thread internal monitor has unbalanced recursion" ); } 306 307 // Fetch the next thread, can be null 308 $thread * new_owner = next_thread( this ); 309 310 // Release the monitor lock 311 unlock( this->lock ); 312 313 // Unpark the next owner if needed 314 /* paranoid */ verifyf( !new_owner || new_owner == this->owner, "Expected owner to be %p, got %p (m: %p)", new_owner, this->owner, this ); 315 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 316 /* paranoid */ verify( ! kernelTLS.this_processor->destroyer ); 317 /* paranoid */ verify( thrd->state == Halted ); 318 319 kernelTLS.this_processor->destroyer = new_owner; 320 321 // Leave the thread 322 __leave_thread(); 323 324 // Control flow should never reach here! 325 } 308 326 } 309 327 -
libcfa/src/concurrency/snzi.hfa
re7d6968 r37b7d95 36 36 static inline void depart( __snzi_node_t & ); 37 37 38 static const int __snzi_half = -1; 38 #define __snzi_half -1 39 39 40 40 //-------------------------------------------------- -
libcfa/src/exception.h
re7d6968 r37b7d95 76 76 // implemented in the .c file either so they all have to be inline. 77 77 78 trait is_exception(dtype exceptT , dtype virtualT) {78 trait is_exception(dtype exceptT) { 79 79 /* The first field must be a pointer to a virtual table. 80 * That virtual table must be a decendent of the base exception virtual tab le.80 * That virtual table must be a decendent of the base exception virtual tab$ 81 81 */ 82 v irtualT const & get_exception_vtable(exceptT *);83 // Always returns the virtual table for this type (associated types hack).82 void mark_exception(exceptT *); 83 // This is never used and should be a no-op. 84 84 }; 85 85 86 trait is_termination_exception(dtype exceptT , dtype virtualT | is_exception(exceptT, virtualT)) {86 trait is_termination_exception(dtype exceptT | is_exception(exceptT)) { 87 87 void defaultTerminationHandler(exceptT &); 88 88 }; 89 89 90 trait is_resumption_exception(dtype exceptT , dtype virtualT | is_exception(exceptT, virtualT)) {90 trait is_resumption_exception(dtype exceptT | is_exception(exceptT)) { 91 91 void defaultResumptionHandler(exceptT &); 92 92 }; 93 93 94 forall(dtype exceptT , dtype virtualT | is_termination_exception(exceptT, virtualT))94 forall(dtype exceptT | is_termination_exception(exceptT)) 95 95 static inline void $throw(exceptT & except) { 96 96 __cfaehm_throw_terminate( … … 100 100 } 101 101 102 forall(dtype exceptT , dtype virtualT | is_resumption_exception(exceptT, virtualT))102 forall(dtype exceptT | is_resumption_exception(exceptT)) 103 103 static inline void $throwResume(exceptT & except) { 104 104 __cfaehm_throw_resume( … … 108 108 } 109 109 110 forall(dtype exceptT , dtype virtualT | is_exception(exceptT, virtualT))110 forall(dtype exceptT | is_exception(exceptT)) 111 111 static inline void cancel_stack(exceptT & except) __attribute__((noreturn)) { 112 112 __cfaehm_cancel_stack( (exception_t *)&except ); 113 113 } 114 114 115 forall(dtype exceptT , dtype virtualT | is_exception(exceptT, virtualT))115 forall(dtype exceptT | is_exception(exceptT)) 116 116 static inline void defaultTerminationHandler(exceptT & except) { 117 117 return cancel_stack( except ); 118 118 } 119 119 120 forall(dtype exceptT , dtype virtualT | is_exception(exceptT, virtualT))120 forall(dtype exceptT | is_exception(exceptT)) 121 121 static inline void defaultResumptionHandler(exceptT & except) { 122 122 throw except; -
libcfa/src/exception.hfa
re7d6968 r37b7d95 95 95 // visible anywhere you use the instantiation of the exception is used. 96 96 #define POLY_VTABLE_DECLARATION(exception_name, ...) \ 97 VTABLE_TYPE(exception_name)(__VA_ARGS__) const & get_exception_vtable(exception_name(__VA_ARGS__) *); \97 void mark_exception(exception_name(__VA_ARGS__) *); \ 98 98 extern VTABLE_TYPE(exception_name)(__VA_ARGS__) VTABLE_NAME(exception_name) 99 99 … … 125 125 #define VTABLE_ASSERTION(exception_name, parameters) \ 126 126 { VTABLE_TYPE(exception_name) parameters VTABLE_NAME(exception_name); } 127 128 // IS_EXCEPTION(exception_name [, (...parameters)])129 // IS_RESUMPTION_EXCEPTION(exception_name [, (parameters...)])130 // IS_TERMINATION_EXCEPTION(exception_name [, (parameters...)])131 // Create an assertion that exception_name, possibly with the qualifing parameters, is the given132 // kind of exception with the standard vtable with the same parameters if applicable.133 #define IS_EXCEPTION(...) _IS_EXCEPTION(is_exception, __VA_ARGS__, , ~)134 #define IS_RESUMPTION_EXCEPTION(...) _IS_EXCEPTION(is_resumption_exception, __VA_ARGS__, , ~)135 #define IS_TERMINATION_EXCEPTION(...) _IS_EXCEPTION(is_termination_exception, __VA_ARGS__, , ~)136 127 137 128 // All internal helper macros begin with an underscore. … … 169 160 170 161 #define _FORALL_CTOR0_DECLARATION(exception_name, assertions, parameters) \ 171 forall(_UNPACK assertions | \ 172 is_exception(exception_name parameters, VTABLE_TYPE(exception_name) parameters)) \ 162 forall(_UNPACK assertions | VTABLE_ASSERTION(exception_name, parameters) ) \ 173 163 void ?{}(exception_name parameters & this) 174 164 175 165 #define _FORALL_CTOR0_INSTANCE(exception_name, assertions, parameters) \ 176 166 _FORALL_CTOR0_DECLARATION(exception_name, assertions, parameters) { \ 177 (this).virtual_table = &get_exception_vtable(&this); \167 VTABLE_INIT(this, exception_name); \ 178 168 } 179 169 … … 195 185 #define _VTABLE_DECLARATION(exception_name, parent_name, ...) \ 196 186 struct exception_name; \ 187 void mark_exception(exception_name *); \ 197 188 VTABLE_TYPE(exception_name); \ 198 VTABLE_TYPE(exception_name) const & get_exception_vtable(exception_name *); \199 189 extern VTABLE_TYPE(exception_name) VTABLE_NAME(exception_name); \ 200 190 VTABLE_TYPE(exception_name) { \ … … 207 197 208 198 #define _VTABLE_INSTANCE(exception_name, parent_name, ...) \ 209 VTABLE_TYPE(exception_name) const & get_exception_vtable(exception_name *) { \ 210 return VTABLE_NAME(exception_name); \ 211 } \ 199 void mark_exception(exception_name *) {} \ 212 200 void _GLUE2(exception_name,_copy)(exception_name * this, exception_name * other) { \ 213 201 *this = *other; \ … … 230 218 231 219 #define _POLY_VTABLE_INSTANCE(exception_name, parent_name, ...) \ 232 extern VTABLE_TYPE(exception_name)(__VA_ARGS__) VTABLE_NAME(exception_name); \ 233 VTABLE_TYPE(exception_name)(__VA_ARGS__) const & get_exception_vtable( \ 234 exception_name(__VA_ARGS__) *) { \ 235 return VTABLE_NAME(exception_name); \ 236 } \ 220 void mark_exception(exception_name(__VA_ARGS__) *) {} \ 237 221 void _GLUE2(exception_name,_copy)( \ 238 222 exception_name(__VA_ARGS__) * this, exception_name(__VA_ARGS__) * other) { \ … … 243 227 _GLUE2(exception_name,_copy), ^?{}, \ 244 228 _CLOSE 245 246 #define _IS_EXCEPTION(kind, exception_name, parameters, ...) \247 kind(exception_name parameters, VTABLE_TYPE(exception_name) parameters) -
libcfa/src/limits.cfa
re7d6968 r37b7d95 10 10 // Created On : Wed Apr 6 18:06:52 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 1 16:22:51 201813 // Update Count : 7 412 // Last Modified On : Wed Sep 30 22:56:32 2020 13 // Update Count : 76 14 14 // 15 15 … … 23 23 // Integral Constants 24 24 25 constsigned char MIN = SCHAR_MIN;26 constunsigned char MIN = 0;27 constshort int MIN = SHRT_MIN;28 constunsigned short int MIN = 0;29 constint MIN = INT_MIN;30 constunsigned int MIN = 0;31 constlong int MIN = LONG_MIN;32 constunsigned long int MIN = 0;33 constlong long int MIN = LLONG_MIN;34 constunsigned long long int MIN = 0;25 signed char MIN = SCHAR_MIN; 26 unsigned char MIN = 0; 27 short int MIN = SHRT_MIN; 28 unsigned short int MIN = 0; 29 int MIN = INT_MIN; 30 unsigned int MIN = 0; 31 long int MIN = LONG_MIN; 32 unsigned long int MIN = 0; 33 long long int MIN = LLONG_MIN; 34 unsigned long long int MIN = 0; 35 35 36 constsigned char MAX = SCHAR_MAX;37 constunsigned char MAX = UCHAR_MAX;38 constshort int MAX = SHRT_MAX;39 constunsigned short int MAX = USHRT_MAX;40 constint MAX = INT_MAX;41 constunsigned int MAX = UINT_MAX;42 constlong int MAX = LONG_MAX;43 constunsigned long int MAX = ULONG_MAX;44 constlong long int MAX = LLONG_MAX;45 constunsigned long long int MAX = ULLONG_MAX;36 signed char MAX = SCHAR_MAX; 37 unsigned char MAX = UCHAR_MAX; 38 short int MAX = SHRT_MAX; 39 unsigned short int MAX = USHRT_MAX; 40 int MAX = INT_MAX; 41 unsigned int MAX = UINT_MAX; 42 long int MAX = LONG_MAX; 43 unsigned long int MAX = ULONG_MAX; 44 long long int MAX = LLONG_MAX; 45 unsigned long long int MAX = ULLONG_MAX; 46 46 47 47 // Floating-Point Constants 48 48 49 constfloat MIN = FLT_MIN;50 constdouble MIN = DBL_MIN;51 constlong double MIN = LDBL_MIN;52 constfloat _Complex MIN = __FLT_MIN__ + __FLT_MIN__ * I;53 constdouble _Complex MIN = DBL_MIN + DBL_MIN * I;54 constlong double _Complex MIN = LDBL_MIN + LDBL_MIN * I;49 float MIN = FLT_MIN; 50 double MIN = DBL_MIN; 51 long double MIN = LDBL_MIN; 52 float _Complex MIN = __FLT_MIN__ + __FLT_MIN__ * I; 53 double _Complex MIN = DBL_MIN + DBL_MIN * I; 54 long double _Complex MIN = LDBL_MIN + LDBL_MIN * I; 55 55 56 constfloat MAX = FLT_MAX;57 constdouble MAX = DBL_MAX;58 constlong double MAX = LDBL_MAX;59 constfloat _Complex MAX = FLT_MAX + FLT_MAX * I;60 constdouble _Complex MAX = DBL_MAX + DBL_MAX * I;61 constlong double _Complex MAX = LDBL_MAX + LDBL_MAX * I;56 float MAX = FLT_MAX; 57 double MAX = DBL_MAX; 58 long double MAX = LDBL_MAX; 59 float _Complex MAX = FLT_MAX + FLT_MAX * I; 60 double _Complex MAX = DBL_MAX + DBL_MAX * I; 61 long double _Complex MAX = LDBL_MAX + LDBL_MAX * I; 62 62 63 const float PI = (float)M_PI;// pi64 const float PI_2 = (float)M_PI_2;// pi / 265 const float PI_4 = (float)M_PI_4;// pi / 466 const float _1_PI = (float)M_1_PI;// 1 / pi67 const float _2_PI = (float)M_2_PI;// 2 / pi68 const float _2_SQRT_PI = (float)M_2_SQRTPI;// 2 / sqrt(pi)63 float PI = (float)M_PI; // pi 64 float PI_2 = (float)M_PI_2; // pi / 2 65 float PI_4 = (float)M_PI_4; // pi / 4 66 float _1_PI = (float)M_1_PI; // 1 / pi 67 float _2_PI = (float)M_2_PI; // 2 / pi 68 float _2_SQRT_PI = (float)M_2_SQRTPI; // 2 / sqrt(pi) 69 69 70 const double PI = M_PI;// pi71 const double PI_2 = M_PI_2;// pi / 272 const double PI_4 = M_PI_4;// pi / 473 const double _1_PI = M_1_PI;// 1 / pi74 const double _2_PI = M_2_PI;// 2 / pi75 const double _2_SQRT_PI = M_2_SQRTPI;// 2 / sqrt(pi)70 double PI = M_PI; // pi 71 double PI_2 = M_PI_2; // pi / 2 72 double PI_4 = M_PI_4; // pi / 4 73 double _1_PI = M_1_PI; // 1 / pi 74 double _2_PI = M_2_PI; // 2 / pi 75 double _2_SQRT_PI = M_2_SQRTPI; // 2 / sqrt(pi) 76 76 77 const long double PI = M_PIl;// pi78 const long double PI_2 = M_PI_2l;// pi / 279 const long double PI_4 = M_PI_4l;// pi / 480 const long double _1_PI = M_1_PIl;// 1 / pi81 const long double _2_PI = M_2_PIl;// 2 / pi82 const long double _2_SQRT_PI = M_2_SQRTPIl;// 2 / sqrt(pi)77 long double PI = M_PIl; // pi 78 long double PI_2 = M_PI_2l; // pi / 2 79 long double PI_4 = M_PI_4l; // pi / 4 80 long double _1_PI = M_1_PIl; // 1 / pi 81 long double _2_PI = M_2_PIl; // 2 / pi 82 long double _2_SQRT_PI = M_2_SQRTPIl; // 2 / sqrt(pi) 83 83 84 const float _Complex PI = (float)M_PI + 0.0_iF;// pi85 const float _Complex PI_2 = (float)M_PI_2 + 0.0_iF;// pi / 286 const float _Complex PI_4 = (float)M_PI_4 + 0.0_iF;// pi / 487 const float _Complex _1_PI = (float)M_1_PI + 0.0_iF;// 1 / pi88 const float _Complex _2_PI = (float)M_2_PI + 0.0_iF;// 2 / pi89 constfloat _Complex _2_SQRT_PI = (float)M_2_SQRTPI + 0.0_iF; // 2 / sqrt(pi)84 float _Complex PI = (float)M_PI + 0.0_iF; // pi 85 float _Complex PI_2 = (float)M_PI_2 + 0.0_iF; // pi / 2 86 float _Complex PI_4 = (float)M_PI_4 + 0.0_iF; // pi / 4 87 float _Complex _1_PI = (float)M_1_PI + 0.0_iF; // 1 / pi 88 float _Complex _2_PI = (float)M_2_PI + 0.0_iF; // 2 / pi 89 float _Complex _2_SQRT_PI = (float)M_2_SQRTPI + 0.0_iF; // 2 / sqrt(pi) 90 90 91 const double _Complex PI = M_PI + 0.0_iD;// pi92 const double _Complex PI_2 = M_PI_2 + 0.0_iD;// pi / 293 const double _Complex PI_4 = M_PI_4 + 0.0_iD;// pi / 494 const double _Complex _1_PI = M_1_PI + 0.0_iD;// 1 / pi95 const double _Complex _2_PI = M_2_PI + 0.0_iD;// 2 / pi96 const double _Complex _2_SQRT_PI = M_2_SQRTPI + 0.0_iD;// 2 / sqrt(pi)91 double _Complex PI = M_PI + 0.0_iD; // pi 92 double _Complex PI_2 = M_PI_2 + 0.0_iD; // pi / 2 93 double _Complex PI_4 = M_PI_4 + 0.0_iD; // pi / 4 94 double _Complex _1_PI = M_1_PI + 0.0_iD; // 1 / pi 95 double _Complex _2_PI = M_2_PI + 0.0_iD; // 2 / pi 96 double _Complex _2_SQRT_PI = M_2_SQRTPI + 0.0_iD; // 2 / sqrt(pi) 97 97 98 const long double _Complex PI = M_PIl + 0.0_iL;// pi99 const long double _Complex PI_2 = M_PI_2l + 0.0_iL;// pi / 2100 const long double _Complex PI_4 = M_PI_4l + 0.0_iL;// pi / 4101 const long double _Complex _1_PI = M_1_PIl + 0.0_iL;// 1 / pi102 const long double _Complex _2_PI = M_2_PIl + 0.0_iL;// 2 / pi103 constlong double _Complex _2_SQRT_PI = M_2_SQRTPIl + 0.0_iL; // 2 / sqrt(pi)98 long double _Complex PI = M_PIl + 0.0_iL; // pi 99 long double _Complex PI_2 = M_PI_2l + 0.0_iL; // pi / 2 100 long double _Complex PI_4 = M_PI_4l + 0.0_iL; // pi / 4 101 long double _Complex _1_PI = M_1_PIl + 0.0_iL; // 1 / pi 102 long double _Complex _2_PI = M_2_PIl + 0.0_iL; // 2 / pi 103 long double _Complex _2_SQRT_PI = M_2_SQRTPIl + 0.0_iL; // 2 / sqrt(pi) 104 104 105 const float E = (float)M_E;// e106 const float LOG2_E = (float)M_LOG2E;// log_2(e)107 const float LOG10_E = (float)M_LOG10E;// log_10(e)108 const float LN_2 = (float)M_LN2;// log_e(2)109 const float LN_10 = (float)M_LN10;// log_e(10)110 const float SQRT_2 = (float)M_SQRT2;// sqrt(2)111 const float _1_SQRT_2 = (float)M_SQRT1_2;// 1 / sqrt(2)105 float E = (float)M_E; // e 106 float LOG2_E = (float)M_LOG2E; // log_2(e) 107 float LOG10_E = (float)M_LOG10E; // log_10(e) 108 float LN_2 = (float)M_LN2; // log_e(2) 109 float LN_10 = (float)M_LN10; // log_e(10) 110 float SQRT_2 = (float)M_SQRT2; // sqrt(2) 111 float _1_SQRT_2 = (float)M_SQRT1_2; // 1 / sqrt(2) 112 112 113 const double E = M_E;// e114 const double LOG2_E = M_LOG2E;// log_2(e)115 const double LOG10_E = M_LOG10E;// log_10(e)116 const double LN_2 = M_LN2;// log_e(2)117 const double LN_10 = M_LN10;// log_e(10)118 const double SQRT_2 = M_SQRT2;// sqrt(2)119 const double _1_SQRT_2 = M_SQRT1_2;// 1 / sqrt(2)113 double E = M_E; // e 114 double LOG2_E = M_LOG2E; // log_2(e) 115 double LOG10_E = M_LOG10E; // log_10(e) 116 double LN_2 = M_LN2; // log_e(2) 117 double LN_10 = M_LN10; // log_e(10) 118 double SQRT_2 = M_SQRT2; // sqrt(2) 119 double _1_SQRT_2 = M_SQRT1_2; // 1 / sqrt(2) 120 120 121 const long double E = M_El;// e122 const long double LOG2_E = M_LOG2El;// log_2(e)123 const long double LOG10_E = M_LOG10El;// log_10(e)124 const long double LN_2 = M_LN2l;// log_e(2)125 const long double LN_10 = M_LN10l;// log_e(10)126 const long double SQRT_2 = M_SQRT2l;// sqrt(2)127 const long double _1_SQRT_2 = M_SQRT1_2l;// 1 / sqrt(2)121 long double E = M_El; // e 122 long double LOG2_E = M_LOG2El; // log_2(e) 123 long double LOG10_E = M_LOG10El; // log_10(e) 124 long double LN_2 = M_LN2l; // log_e(2) 125 long double LN_10 = M_LN10l; // log_e(10) 126 long double SQRT_2 = M_SQRT2l; // sqrt(2) 127 long double _1_SQRT_2 = M_SQRT1_2l; // 1 / sqrt(2) 128 128 129 const float _Complex E = M_E + 0.0_iF;// e130 const float _Complex LOG2_E = M_LOG2E + 0.0_iF;// log_2(e)131 const float _Complex LOG10_E = M_LOG10E + 0.0_iF;// log_10(e)132 const float _Complex LN_2 = M_LN2 + 0.0_iF;// log_e(2)133 const float _Complex LN_10 = M_LN10 + 0.0_iF;// log_e(10)134 const float _Complex SQRT_2 = M_SQRT2 + 0.0_iF;// sqrt(2)135 const float _Complex _1_SQRT_2 = M_SQRT1_2 + 0.0_iF;// 1 / sqrt(2)129 float _Complex E = M_E + 0.0_iF; // e 130 float _Complex LOG2_E = M_LOG2E + 0.0_iF; // log_2(e) 131 float _Complex LOG10_E = M_LOG10E + 0.0_iF; // log_10(e) 132 float _Complex LN_2 = M_LN2 + 0.0_iF; // log_e(2) 133 float _Complex LN_10 = M_LN10 + 0.0_iF; // log_e(10) 134 float _Complex SQRT_2 = M_SQRT2 + 0.0_iF; // sqrt(2) 135 float _Complex _1_SQRT_2 = M_SQRT1_2 + 0.0_iF; // 1 / sqrt(2) 136 136 137 const double _Complex E = M_E + 0.0_iD;// e138 const double _Complex LOG2_E = M_LOG2E + 0.0_iD;// log_2(e)139 const double _Complex LOG10_E = M_LOG10E + 0.0_iD;// log_10(e)140 const double _Complex LN_2 = M_LN2 + 0.0_iD;// log_e(2)141 const double _Complex LN_10 = M_LN10 + 0.0_iD;// log_e(10)142 const double _Complex SQRT_2 = M_SQRT2 + 0.0_iD;// sqrt(2)143 const double _Complex _1_SQRT_2 = M_SQRT1_2 + 0.0_iD;// 1 / sqrt(2)137 double _Complex E = M_E + 0.0_iD; // e 138 double _Complex LOG2_E = M_LOG2E + 0.0_iD; // log_2(e) 139 double _Complex LOG10_E = M_LOG10E + 0.0_iD; // log_10(e) 140 double _Complex LN_2 = M_LN2 + 0.0_iD; // log_e(2) 141 double _Complex LN_10 = M_LN10 + 0.0_iD; // log_e(10) 142 double _Complex SQRT_2 = M_SQRT2 + 0.0_iD; // sqrt(2) 143 double _Complex _1_SQRT_2 = M_SQRT1_2 + 0.0_iD; // 1 / sqrt(2) 144 144 145 const long double _Complex E = M_El + 0.0_iL;// e146 const long double _Complex LOG2_E = M_LOG2El + 0.0_iL;// log_2(e)147 const long double _Complex LOG10_E = M_LOG10El + 0.0_iL;// log_10(e)148 const long double _Complex LN_2 = M_LN2l + 0.0_iL;// log_e(2)149 const long double _Complex LN_10 = M_LN10l + 0.0_iL;// log_e(10)150 const long double _Complex SQRT_2 = M_SQRT2l + 0.0_iL;// sqrt(2)151 const long double _Complex _1_SQRT_2 = M_SQRT1_2l + 0.0_iL;// 1 / sqrt(2)145 long double _Complex E = M_El + 0.0_iL; // e 146 long double _Complex LOG2_E = M_LOG2El + 0.0_iL; // log_2(e) 147 long double _Complex LOG10_E = M_LOG10El + 0.0_iL; // log_10(e) 148 long double _Complex LN_2 = M_LN2l + 0.0_iL; // log_e(2) 149 long double _Complex LN_10 = M_LN10l + 0.0_iL; // log_e(10) 150 long double _Complex SQRT_2 = M_SQRT2l + 0.0_iL; // sqrt(2) 151 long double _Complex _1_SQRT_2 = M_SQRT1_2l + 0.0_iL; // 1 / sqrt(2) 152 152 153 153 // Local Variables: // -
libcfa/src/limits.hfa
re7d6968 r37b7d95 10 10 // Created On : Wed Apr 6 18:06:52 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 1 16:20:54 201813 // Update Count : 1 312 // Last Modified On : Wed Sep 30 22:56:35 2020 13 // Update Count : 15 14 14 // 15 15 … … 18 18 // Integral Constants 19 19 20 extern constsigned char MIN;21 extern constunsigned char MIN;22 extern constshort int MIN;23 extern constunsigned short int MIN;24 extern constint MIN;25 extern constunsigned int MIN;26 extern constlong int MIN;27 extern constunsigned long int MIN;28 extern constlong long int MIN;29 extern constunsigned long long int MIN;20 extern signed char MIN; 21 extern unsigned char MIN; 22 extern short int MIN; 23 extern unsigned short int MIN; 24 extern int MIN; 25 extern unsigned int MIN; 26 extern long int MIN; 27 extern unsigned long int MIN; 28 extern long long int MIN; 29 extern unsigned long long int MIN; 30 30 31 extern constsigned char MAX;32 extern constunsigned char MAX;33 extern constshort int MAX;34 extern constunsigned short int MAX;35 extern constint MAX;36 extern constunsigned int MAX;37 extern constlong int MAX;38 extern constunsigned long int MAX;39 extern constlong long int MAX;40 extern constunsigned long long int MAX;31 extern signed char MAX; 32 extern unsigned char MAX; 33 extern short int MAX; 34 extern unsigned short int MAX; 35 extern int MAX; 36 extern unsigned int MAX; 37 extern long int MAX; 38 extern unsigned long int MAX; 39 extern long long int MAX; 40 extern unsigned long long int MAX; 41 41 42 42 // Floating-Point Constants 43 43 44 extern constfloat MIN;45 extern constdouble MIN;46 extern constlong double MIN;47 extern constfloat _Complex MIN;48 extern constdouble _Complex MIN;49 extern constlong double _Complex MIN;44 extern float MIN; 45 extern double MIN; 46 extern long double MIN; 47 extern float _Complex MIN; 48 extern double _Complex MIN; 49 extern long double _Complex MIN; 50 50 51 extern constfloat MAX;52 extern constdouble MAX;53 extern constlong double MAX;54 extern constfloat _Complex MAX;55 extern constdouble _Complex MAX;56 extern constlong double _Complex MAX;51 extern float MAX; 52 extern double MAX; 53 extern long double MAX; 54 extern float _Complex MAX; 55 extern double _Complex MAX; 56 extern long double _Complex MAX; 57 57 58 extern const float PI;// pi59 extern const float PI_2;// pi / 260 extern const float PI_4;// pi / 461 extern const float _1_PI;// 1 / pi62 extern const float _2_PI;// 2 / pi63 extern const float _2_SQRT_PI;// 2 / sqrt(pi)58 extern float PI; // pi 59 extern float PI_2; // pi / 2 60 extern float PI_4; // pi / 4 61 extern float _1_PI; // 1 / pi 62 extern float _2_PI; // 2 / pi 63 extern float _2_SQRT_PI; // 2 / sqrt(pi) 64 64 65 extern const double PI;// pi66 extern const double PI_2;// pi / 267 extern const double PI_4;// pi / 468 extern const double _1_PI;// 1 / pi69 extern const double _2_PI;// 2 / pi70 extern const double _2_SQRT_PI;// 2 / sqrt(pi)65 extern double PI; // pi 66 extern double PI_2; // pi / 2 67 extern double PI_4; // pi / 4 68 extern double _1_PI; // 1 / pi 69 extern double _2_PI; // 2 / pi 70 extern double _2_SQRT_PI; // 2 / sqrt(pi) 71 71 72 extern const long double PI;// pi73 extern const long double PI_2;// pi / 274 extern const long double PI_4;// pi / 475 extern const long double _1_PI;// 1 / pi76 extern const long double _2_PI;// 2 / pi77 extern const long double _2_SQRT_PI;// 2 / sqrt(pi)72 extern long double PI; // pi 73 extern long double PI_2; // pi / 2 74 extern long double PI_4; // pi / 4 75 extern long double _1_PI; // 1 / pi 76 extern long double _2_PI; // 2 / pi 77 extern long double _2_SQRT_PI; // 2 / sqrt(pi) 78 78 79 extern const float _Complex PI;// pi80 extern const float _Complex PI_2;// pi / 281 extern const float _Complex PI_4;// pi / 482 extern const float _Complex _1_PI;// 1 / pi83 extern const float _Complex _2_PI;// 2 / pi84 extern const float _Complex _2_SQRT_PI;// 2 / sqrt(pi)79 extern float _Complex PI; // pi 80 extern float _Complex PI_2; // pi / 2 81 extern float _Complex PI_4; // pi / 4 82 extern float _Complex _1_PI; // 1 / pi 83 extern float _Complex _2_PI; // 2 / pi 84 extern float _Complex _2_SQRT_PI; // 2 / sqrt(pi) 85 85 86 extern const double _Complex PI;// pi87 extern const double _Complex PI_2;// pi / 288 extern const double _Complex PI_4;// pi / 489 extern const double _Complex _1_PI;// 1 / pi90 extern const double _Complex _2_PI;// 2 / pi91 extern const double _Complex _2_SQRT_PI;// 2 / sqrt(pi)86 extern double _Complex PI; // pi 87 extern double _Complex PI_2; // pi / 2 88 extern double _Complex PI_4; // pi / 4 89 extern double _Complex _1_PI; // 1 / pi 90 extern double _Complex _2_PI; // 2 / pi 91 extern double _Complex _2_SQRT_PI; // 2 / sqrt(pi) 92 92 93 extern const long double _Complex PI;// pi94 extern const long double _Complex PI_2;// pi / 295 extern const long double _Complex PI_4;// pi / 496 extern const long double _Complex _1_PI;// 1 / pi97 extern const long double _Complex _2_PI;// 2 / pi98 extern const long double _Complex _2_SQRT_PI;// 2 / sqrt(pi)93 extern long double _Complex PI; // pi 94 extern long double _Complex PI_2; // pi / 2 95 extern long double _Complex PI_4; // pi / 4 96 extern long double _Complex _1_PI; // 1 / pi 97 extern long double _Complex _2_PI; // 2 / pi 98 extern long double _Complex _2_SQRT_PI; // 2 / sqrt(pi) 99 99 100 extern const float E;// e101 extern const float LOG2_E;// log_2(e)102 extern const float LOG10_E;// log_10(e)103 extern const float LN_2;// log_e(2)104 extern const float LN_10;// log_e(10)105 extern const float SQRT_2;// sqrt(2)106 extern const float _1_SQRT_2;// 1 / sqrt(2)100 extern float E; // e 101 extern float LOG2_E; // log_2(e) 102 extern float LOG10_E; // log_10(e) 103 extern float LN_2; // log_e(2) 104 extern float LN_10; // log_e(10) 105 extern float SQRT_2; // sqrt(2) 106 extern float _1_SQRT_2; // 1 / sqrt(2) 107 107 108 extern const double E;// e109 extern const double LOG2_E;// log_2(e)110 extern const double LOG10_E;// log_10(e)111 extern const double LN_2;// log_e(2)112 extern const double LN_10;// log_e(10)113 extern const double SQRT_2;// sqrt(2)114 extern const double _1_SQRT_2;// 1 / sqrt(2)108 extern double E; // e 109 extern double LOG2_E; // log_2(e) 110 extern double LOG10_E; // log_10(e) 111 extern double LN_2; // log_e(2) 112 extern double LN_10; // log_e(10) 113 extern double SQRT_2; // sqrt(2) 114 extern double _1_SQRT_2; // 1 / sqrt(2) 115 115 116 extern const long double E;// e117 extern const long double LOG2_E;// log_2(e)118 extern const long double LOG10_E;// log_10(e)119 extern const long double LN_2;// log_e(2)120 extern const long double LN_10;// log_e(10)121 extern const long double SQRT_2;// sqrt(2)122 extern const long double _1_SQRT_2;// 1/sqrt(2)116 extern long double E; // e 117 extern long double LOG2_E; // log_2(e) 118 extern long double LOG10_E; // log_10(e) 119 extern long double LN_2; // log_e(2) 120 extern long double LN_10; // log_e(10) 121 extern long double SQRT_2; // sqrt(2) 122 extern long double _1_SQRT_2; // 1/sqrt(2) 123 123 124 extern const float _Complex E;// e125 extern const float _Complex LOG2_E;// log_2(e)126 extern const float _Complex LOG10_E;// log_10(e)127 extern const float _Complex LN_2;// log_e(2)128 extern const float _Complex LN_10;// log_e(10)129 extern const float _Complex SQRT_2;// sqrt(2)130 extern const float _Complex _1_SQRT_2;// 1 / sqrt(2)124 extern float _Complex E; // e 125 extern float _Complex LOG2_E; // log_2(e) 126 extern float _Complex LOG10_E; // log_10(e) 127 extern float _Complex LN_2; // log_e(2) 128 extern float _Complex LN_10; // log_e(10) 129 extern float _Complex SQRT_2; // sqrt(2) 130 extern float _Complex _1_SQRT_2; // 1 / sqrt(2) 131 131 132 extern const double _Complex E;// e133 extern const double _Complex LOG2_E;// log_2(e)134 extern const double _Complex LOG10_E;// log_10(e)135 extern const double _Complex LN_2;// log_e(2)136 extern const double _Complex LN_10;// log_e(10)137 extern const double _Complex SQRT_2;// sqrt(2)138 extern const double _Complex _1_SQRT_2;// 1 / sqrt(2)132 extern double _Complex E; // e 133 extern double _Complex LOG2_E; // log_2(e) 134 extern double _Complex LOG10_E; // log_10(e) 135 extern double _Complex LN_2; // log_e(2) 136 extern double _Complex LN_10; // log_e(10) 137 extern double _Complex SQRT_2; // sqrt(2) 138 extern double _Complex _1_SQRT_2; // 1 / sqrt(2) 139 139 140 extern const long double _Complex E;// e141 extern const long double _Complex LOG2_E;// log_2(e)142 extern const long double _Complex LOG10_E;// log_10(e)143 extern const long double _Complex LN_2;// log_e(2)144 extern const long double _Complex LN_10;// log_e(10)145 extern const long double _Complex SQRT_2;// sqrt(2)146 extern const long double _Complex _1_SQRT_2;// 1 / sqrt(2)140 extern long double _Complex E; // e 141 extern long double _Complex LOG2_E; // log_2(e) 142 extern long double _Complex LOG10_E; // log_10(e) 143 extern long double _Complex LN_2; // log_e(2) 144 extern long double _Complex LN_10; // log_e(10) 145 extern long double _Complex SQRT_2; // sqrt(2) 146 extern long double _Complex _1_SQRT_2; // 1 / sqrt(2) 147 147 148 148 // Local Variables: // -
src/AST/Expr.cpp
re7d6968 r37b7d95 102 102 } 103 103 return ret; 104 }105 106 // --- VariableExpr107 108 VariableExpr::VariableExpr( const CodeLocation & loc )109 : Expr( loc ), var( nullptr ) {}110 111 VariableExpr::VariableExpr( const CodeLocation & loc, const DeclWithType * v )112 : Expr( loc ), var( v ) {113 assert( var );114 assert( var->get_type() );115 result = shallowCopy( var->get_type() );116 }117 118 bool VariableExpr::get_lvalue() const {119 // It isn't always an lvalue, but it is never an rvalue.120 return true;121 }122 123 VariableExpr * VariableExpr::functionPointer(124 const CodeLocation & loc, const FunctionDecl * decl ) {125 // wrap usually-determined result type in a pointer126 VariableExpr * funcExpr = new VariableExpr{ loc, decl };127 funcExpr->result = new PointerType{ funcExpr->result };128 return funcExpr;129 104 } 130 105 … … 263 238 } 264 239 240 // --- VariableExpr 241 242 VariableExpr::VariableExpr( const CodeLocation & loc ) 243 : Expr( loc ), var( nullptr ) {} 244 245 VariableExpr::VariableExpr( const CodeLocation & loc, const DeclWithType * v ) 246 : Expr( loc ), var( v ) { 247 assert( var ); 248 assert( var->get_type() ); 249 result = shallowCopy( var->get_type() ); 250 } 251 252 bool VariableExpr::get_lvalue() const { 253 // It isn't always an lvalue, but it is never an rvalue. 254 return true; 255 } 256 257 VariableExpr * VariableExpr::functionPointer( 258 const CodeLocation & loc, const FunctionDecl * decl ) { 259 // wrap usually-determined result type in a pointer 260 VariableExpr * funcExpr = new VariableExpr{ loc, decl }; 261 funcExpr->result = new PointerType{ funcExpr->result }; 262 return funcExpr; 263 } 264 265 265 // --- ConstantExpr 266 266 -
src/AST/Expr.hpp
re7d6968 r37b7d95 250 250 }; 251 251 252 /// A reference to a named variable.253 class VariableExpr final : public Expr {254 public:255 readonly<DeclWithType> var;256 257 VariableExpr( const CodeLocation & loc );258 VariableExpr( const CodeLocation & loc, const DeclWithType * v );259 260 bool get_lvalue() const final;261 262 /// generates a function pointer for a given function263 static VariableExpr * functionPointer( const CodeLocation & loc, const FunctionDecl * decl );264 265 const Expr * accept( Visitor & v ) const override { return v.visit( this ); }266 private:267 VariableExpr * clone() const override { return new VariableExpr{ *this }; }268 MUTATE_FRIEND269 };270 271 252 /// Address-of expression `&e` 272 253 class AddressExpr final : public Expr { … … 409 390 friend class ::ConverterOldToNew; 410 391 friend class ::ConverterNewToOld; 392 }; 393 394 /// A reference to a named variable. 395 class VariableExpr final : public Expr { 396 public: 397 readonly<DeclWithType> var; 398 399 VariableExpr( const CodeLocation & loc ); 400 VariableExpr( const CodeLocation & loc, const DeclWithType * v ); 401 402 bool get_lvalue() const final; 403 404 /// generates a function pointer for a given function 405 static VariableExpr * functionPointer( const CodeLocation & loc, const FunctionDecl * decl ); 406 407 const Expr * accept( Visitor & v ) const override { return v.visit( this ); } 408 private: 409 VariableExpr * clone() const override { return new VariableExpr{ *this }; } 410 MUTATE_FRIEND 411 411 }; 412 412 -
src/AST/Type.cpp
re7d6968 r37b7d95 157 157 158 158 template<typename decl_t> 159 SueInstType<decl_t>::SueInstType(160 const base_type * b, std::vector<ptr<Expr>> && params,161 CV::Qualifiers q, std::vector<ptr<Attribute>> && as )162 : BaseInstType( b->name, std::move(params), q, std::move(as) ), base( b ) {}163 164 template<typename decl_t>165 159 bool SueInstType<decl_t>::isComplete() const { 166 160 return base ? base->body : false; -
src/AST/Type.hpp
re7d6968 r37b7d95 302 302 class FunctionType final : public ParameterizedType { 303 303 public: 304 // std::vector<ptr<DeclWithType>> returns; 305 // std::vector<ptr<DeclWithType>> params; 306 304 307 std::vector<ptr<Type>> returns; 305 308 std::vector<ptr<Type>> params; … … 342 345 : ParameterizedType(q, std::move(as)), params(), name(n) {} 343 346 344 BaseInstType(345 const std::string& n, std::vector<ptr<Expr>> && params,346 CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} )347 : ParameterizedType(q, std::move(as)), params(std::move(params)), name(n) {}348 349 347 BaseInstType( const BaseInstType & o ); 350 348 … … 371 369 372 370 SueInstType( 373 const base_type * b, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ); 374 375 SueInstType( 376 const base_type * b, std::vector<ptr<Expr>> && params, 377 CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ); 371 const decl_t * b, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} ); 378 372 379 373 bool isComplete() const override; -
src/AST/porting.md
re7d6968 r37b7d95 30 30 * Base nodes now override `const Node * accept( Visitor & v ) const = 0` with, e.g. `const Stmt * accept( Visitor & v ) const override = 0` 31 31 * `PassVisitor` is replaced with `ast::Pass` 32 * Most one shot uses can use `ast::Pass::run` and `ast::Pass::read`.33 34 `WithConstTypeSubstitution`35 * `env` => `typeSubs`36 32 37 33 ## Structural Changes ## … … 150 146 * allows `newObject` as just default settings 151 147 152 `FunctionDecl`153 * `params` and `returns` added.154 * Contain the declarations of the parameters and return variables.155 * Types should match (even be shared with) the fields of `type`.156 157 148 `NamedTypeDecl` 158 149 * `parameters` => `params` … … 163 154 `AggregateDecl` 164 155 * `parameters` => `params` 165 166 `StructDecl`167 * `makeInst` replaced by better constructor on `StructInstType`.168 156 169 157 `Expr` … … 257 245 * **TODO** move `kind`, `typeNames` into code generator 258 246 259 `ReferenceToType` => `BaseInstType`247 `ReferenceToType` 260 248 * deleted `get_baseParameters()` from children 261 249 * replace with `aggr() ? aggr()->params : nullptr` … … 273 261 * `returnVals` => `returns` 274 262 * `parameters` => `params` 275 * Both now just point at types.276 263 * `bool isVarArgs;` => `enum ArgumentFlag { FixedArgs, VariableArgs }; ArgumentFlag isVarArgs;` 277 278 `SueInstType`279 * Template class, with specializations and using to implement some other types:280 * `StructInstType`, `UnionInstType` & `EnumInstType`281 264 282 265 `TypeInstType` -
src/Concurrency/Keywords.cc
re7d6968 r37b7d95 66 66 bool needs_main, AggregateDecl::Aggregate cast_target ) : 67 67 type_name( type_name ), field_name( field_name ), getter_name( getter_name ), 68 context_error( context_error ), exception_name( exception_name ), 69 vtable_name( getVTableName( exception_name ) ), 68 context_error( context_error ), vtable_name( getVTableName( exception_name ) ), 70 69 needs_main( needs_main ), cast_target( cast_target ) {} 71 70 … … 90 89 const std::string getter_name; 91 90 const std::string context_error; 92 const std::string exception_name;93 91 const std::string vtable_name; 94 92 bool needs_main; … … 97 95 StructDecl * type_decl = nullptr; 98 96 FunctionDecl * dtor_decl = nullptr; 99 StructDecl * except_decl = nullptr;100 97 StructDecl * vtable_decl = nullptr; 101 98 }; … … 379 376 else if ( is_target(decl) ) { 380 377 handle( decl ); 381 }382 else if ( !except_decl && exception_name == decl->name && decl->body ) {383 except_decl = decl;384 378 } 385 379 else if ( !vtable_decl && vtable_name == decl->name && decl->body ) { … … 404 398 assert( struct_type ); 405 399 406 std::list< Expression * > poly_args = { new TypeExpr( struct_type->clone() ) }; 407 ObjectDecl * vtable_object = Virtual::makeVtableInstance( 408 vtable_decl->makeInst( poly_args ), struct_type, nullptr ); 409 declsToAddAfter.push_back( vtable_object ); 410 declsToAddAfter.push_back( Virtual::makeGetExceptionFunction( 411 vtable_object, except_decl->makeInst( std::move( poly_args ) ) 412 ) ); 400 declsToAddAfter.push_back( Virtual::makeVtableInstance( vtable_decl, { 401 new TypeExpr( struct_type->clone() ), 402 }, struct_type, nullptr ) ); 413 403 } 414 404 … … 444 434 void ConcurrentSueKeyword::addVtableForward( StructDecl * decl ) { 445 435 if ( vtable_decl ) { 446 std::list< Expression * > poly_args ={436 declsToAddBefore.push_back( Virtual::makeVtableForward( vtable_decl, { 447 437 new TypeExpr( new StructInstType( noQualifiers, decl ) ), 448 }; 449 declsToAddBefore.push_back( Virtual::makeGetExceptionForward( 450 vtable_decl->makeInst( poly_args ), 451 except_decl->makeInst( poly_args ) 452 ) ); 453 declsToAddBefore.push_back( Virtual::makeVtableForward( 454 vtable_decl->makeInst( move( poly_args ) ) ) ); 438 } ) ); 455 439 // Its only an error if we want a vtable and don't have one. 456 440 } else if ( ! vtable_name.empty() ) { -
src/InitTweak/FixGlobalInit.cc
re7d6968 r37b7d95 153 153 } // if 154 154 if ( Statement * ctor = ctorInit->ctor ) { 155 addDataSectonAttribute( objDecl );156 155 initStatements.push_back( ctor ); 157 156 objDecl->init = nullptr; -
src/InitTweak/FixInit.cc
re7d6968 r37b7d95 802 802 if ( Statement * ctor = ctorInit->get_ctor() ) { 803 803 if ( objDecl->get_storageClasses().is_static ) { 804 805 // The ojbect needs to go in the data section, regardless of dtor complexity below.806 // The attribute works, and is meant to apply, both for leaving the static local alone,807 // and for hoisting it out as a static global.808 addDataSectonAttribute( objDecl );809 810 804 // originally wanted to take advantage of gcc nested functions, but 811 805 // we get memory errors with this approach. To remedy this, the static -
src/InitTweak/InitTweak.cc
re7d6968 r37b7d95 1103 1103 return isCopyFunction( decl, "?{}" ); 1104 1104 } 1105 1106 void addDataSectonAttribute( ObjectDecl * objDecl ) {1107 Type *strLitT = new PointerType( Type::Qualifiers( ),1108 new BasicType( Type::Qualifiers( ), BasicType::Char ) );1109 std::list< Expression * > attr_params;1110 attr_params.push_back(1111 new ConstantExpr( Constant( strLitT, "\".data#\"", std::nullopt ) ) );1112 objDecl->attributes.push_back(new Attribute("section", attr_params));1113 }1114 1115 1105 } -
src/InitTweak/InitTweak.h
re7d6968 r37b7d95 108 108 bool isConstExpr( Initializer * init ); 109 109 110 /// Modifies objDecl to have:111 /// __attribute__((section (".data#")))112 /// which makes gcc put the declared variable in the data section,113 /// which is helpful for global constants on newer gcc versions,114 /// so that CFA's generated initialization won't segfault when writing it via a const cast.115 /// The trailing # is an injected assembly comment, to suppress the "a" in116 /// .section .data,"a"117 /// .section .data#,"a"118 /// to avoid assembler warning "ignoring changed section attributes for .data"119 void addDataSectonAttribute( ObjectDecl * objDecl );120 121 110 class InitExpander_old { 122 111 public: -
src/Parser/DeclarationNode.cc
re7d6968 r37b7d95 10 10 // Created On : Sat May 16 12:34:05 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T hu Oct 8 08:03:38202013 // Update Count : 113 512 // Last Modified On : Tue Jun 9 20:26:55 2020 13 // Update Count : 1134 14 14 // 15 15 … … 1016 1016 if ( DeclarationWithType * dwt = dynamic_cast< DeclarationWithType * >( decl ) ) { 1017 1017 dwt->location = cur->location; 1018 * out++ = dwt;1018 * out++ = dwt; 1019 1019 } else if ( StructDecl * agg = dynamic_cast< StructDecl * >( decl ) ) { 1020 1020 // e.g., int foo(struct S) {} … … 1022 1022 auto obj = new ObjectDecl( "", Type::StorageClasses(), linkage, nullptr, inst, nullptr ); 1023 1023 obj->location = cur->location; 1024 * out++ = obj;1024 * out++ = obj; 1025 1025 delete agg; 1026 1026 } else if ( UnionDecl * agg = dynamic_cast< UnionDecl * >( decl ) ) { … … 1029 1029 auto obj = new ObjectDecl( "", Type::StorageClasses(), linkage, nullptr, inst, nullptr ); 1030 1030 obj->location = cur->location; 1031 * out++ = obj;1031 * out++ = obj; 1032 1032 } else if ( EnumDecl * agg = dynamic_cast< EnumDecl * >( decl ) ) { 1033 1033 // e.g., int foo(enum E) {} … … 1035 1035 auto obj = new ObjectDecl( "", Type::StorageClasses(), linkage, nullptr, inst, nullptr ); 1036 1036 obj->location = cur->location; 1037 * out++ = obj;1037 * out++ = obj; 1038 1038 } // if 1039 1039 } catch( SemanticErrorException & e ) { -
src/Parser/parser.yy
re7d6968 r37b7d95 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Oct 9 18:09:09202013 // Update Count : 461 412 // Last Modified On : Tue Oct 6 18:24:18 2020 13 // Update Count : 4610 14 14 // 15 15 … … 204 204 return forCtrl( type, new string( identifier->name ), start, compop, comp, inc ); 205 205 } else { 206 SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed ." ); return nullptr;206 SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed" ); return nullptr; 207 207 } // if 208 208 } else { 209 SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed ." ); return nullptr;209 SemanticError( yylloc, "Expression disallowed. Only loop-index name allowed" ); return nullptr; 210 210 } // if 211 211 } // forCtrl … … 2412 2412 // Overloading: function, data, and operator identifiers may be overloaded. 2413 2413 // 2414 // Type declarations: " otype" is used to generate new types for declaring objects. Similarly, "dtype" is used for object2414 // Type declarations: "type" is used to generate new types for declaring objects. Similarly, "dtype" is used for object 2415 2415 // and incomplete types, and "ftype" is used for function types. Type declarations with initializers provide 2416 2416 // definitions of new types. Type declarations with storage class "extern" provide opaque types. … … 2441 2441 type_class identifier_or_type_name 2442 2442 { typedefTable.addToScope( *$2, TYPEDEFname, "9" ); } 2443 type_initializer_opt assertion_list_opt2443 type_initializer_opt assertion_list_opt 2444 2444 { $$ = DeclarationNode::newTypeParam( $1, $2 )->addTypeInitializer( $4 )->addAssertions( $5 ); } 2445 2445 | type_specifier identifier_parameter_declarator … … 2468 2468 assertion 2469 2469 | assertion_list assertion 2470 { $$ = $1 ->appendList( $2 ); }2470 { $$ = $1 ? $1->appendList( $2 ) : $2; } 2471 2471 ; 2472 2472 -
src/SynTree/AggregateDecl.cc
re7d6968 r37b7d95 21 21 #include "Common/utility.h" // for printAll, cloneAll, deleteAll 22 22 #include "Declaration.h" // for AggregateDecl, TypeDecl, Declaration 23 #include "Expression.h"24 23 #include "Initializer.h" 25 24 #include "LinkageSpec.h" // for Spec, linkageName, Cforall … … 89 88 const char * StructDecl::typeString() const { return aggrString( kind ); } 90 89 91 StructInstType * StructDecl::makeInst( std::list< Expression * > const & new_parameters ) {92 std::list< Expression * > copy_parameters;93 cloneAll( new_parameters, copy_parameters );94 return makeInst( move( copy( copy_parameters ) ) );95 }96 97 StructInstType * StructDecl::makeInst( std::list< Expression * > && new_parameters ) {98 assert( parameters.size() == new_parameters.size() );99 StructInstType * type = new StructInstType( noQualifiers, this );100 type->parameters = std::move( new_parameters );101 return type;102 }103 104 90 const char * UnionDecl::typeString() const { return aggrString( Union ); } 105 91 -
src/SynTree/Declaration.h
re7d6968 r37b7d95 306 306 bool is_thread () { return kind == Thread ; } 307 307 308 // Make a type instance of this declaration.309 StructInstType * makeInst( std::list< Expression * > const & parameters );310 StructInstType * makeInst( std::list< Expression * > && parameters );311 312 308 virtual StructDecl * clone() const override { return new StructDecl( *this ); } 313 309 virtual void accept( Visitor & v ) override { v.visit( this ); } -
src/SynTree/Expression.h
re7d6968 r37b7d95 163 163 }; 164 164 165 /// VariableExpr represents an expression that simply refers to the value of a named variable.166 /// Does not take ownership of var.167 class VariableExpr : public Expression {168 public:169 DeclarationWithType * var;170 171 VariableExpr();172 VariableExpr( DeclarationWithType * var );173 VariableExpr( const VariableExpr & other );174 virtual ~VariableExpr();175 176 bool get_lvalue() const final;177 178 DeclarationWithType * get_var() const { return var; }179 void set_var( DeclarationWithType * newValue ) { var = newValue; }180 181 static VariableExpr * functionPointer( FunctionDecl * decl );182 183 virtual VariableExpr * clone() const override { return new VariableExpr( * this ); }184 virtual void accept( Visitor & v ) override { v.visit( this ); }185 virtual void accept( Visitor & v ) const override { v.visit( this ); }186 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); }187 virtual void print( std::ostream & os, Indenter indent = {} ) const override;188 };189 190 165 // The following classes are used to represent expression types that cannot be converted into 191 166 // function-call format. … … 354 329 }; 355 330 331 /// VariableExpr represents an expression that simply refers to the value of a named variable. 332 /// Does not take ownership of var. 333 class VariableExpr : public Expression { 334 public: 335 DeclarationWithType * var; 336 337 VariableExpr(); 338 VariableExpr( DeclarationWithType * var ); 339 VariableExpr( const VariableExpr & other ); 340 virtual ~VariableExpr(); 341 342 bool get_lvalue() const final; 343 344 DeclarationWithType * get_var() const { return var; } 345 void set_var( DeclarationWithType * newValue ) { var = newValue; } 346 347 static VariableExpr * functionPointer( FunctionDecl * decl ); 348 349 virtual VariableExpr * clone() const override { return new VariableExpr( * this ); } 350 virtual void accept( Visitor & v ) override { v.visit( this ); } 351 virtual void accept( Visitor & v ) const override { v.visit( this ); } 352 virtual Expression * acceptMutator( Mutator & m ) override { return m.mutate( this ); } 353 virtual void print( std::ostream & os, Indenter indent = {} ) const override; 354 }; 355 356 356 /// ConstantExpr represents an expression that simply refers to the value of a constant 357 357 class ConstantExpr : public Expression { -
src/SynTree/TypeDecl.cc
re7d6968 r37b7d95 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Oct 8 18:18:55 202013 // Update Count : 2 212 // Last Modified On : Fri Dec 13 15:26:14 2019 13 // Update Count : 21 14 14 // 15 15 … … 21 21 #include "Type.h" // for Type, Type::StorageClasses 22 22 23 TypeDecl::TypeDecl( const std::string & name, Type::StorageClasses scs, Type * type, Kind kind, bool sized, Type * init ) : 24 Parent( name, scs, type ), kind( kind ), sized( kind == Ttype || sized ), init( init ) { 23 TypeDecl::TypeDecl( const std::string & name, Type::StorageClasses scs, Type * type, Kind kind, bool sized, Type * init ) : Parent( name, scs, type ), kind( kind ), sized( kind == Ttype || sized ), init( init ) { 25 24 } 26 25 -
src/Virtual/Tables.cc
re7d6968 r37b7d95 14 14 // 15 15 16 #include <SynTree/Attribute.h>17 16 #include <SynTree/Declaration.h> 18 17 #include <SynTree/Expression.h> 19 #include <SynTree/Statement.h>20 18 #include <SynTree/Type.h> 21 19 … … 40 38 } 41 39 40 // Fuse base polymorphic declaration and forall arguments into a new type. 41 static StructInstType * vtableInstType( 42 StructDecl * polyDecl, std::list< Expression * > && parameters ) { 43 assert( parameters.size() == polyDecl->parameters.size() ); 44 StructInstType * type = new StructInstType( 45 Type::Qualifiers( /* Type::Const */ ), polyDecl ); 46 type->parameters = std::move( parameters ); 47 return type; 48 } 49 42 50 static ObjectDecl * makeVtableDeclaration( 43 51 StructInstType * type, Initializer * init ) { … … 58 66 59 67 ObjectDecl * makeVtableForward( StructInstType * type ) { 60 assert( type );61 68 return makeVtableDeclaration( type, nullptr ); 62 69 } 63 70 71 ObjectDecl * makeVtableForward( 72 StructDecl * polyDecl, std::list< Expression * > && parameters ) { 73 return makeVtableForward( vtableInstType( polyDecl, std::move( parameters ) ) ); 74 } 75 64 76 ObjectDecl * makeVtableInstance( 65 StructInstType * vtableType, Type * objectType, Initializer * init ) { 66 assert( vtableType ); 67 assert( objectType ); 77 StructInstType * vtableType, Type * vobject_type, Initializer * init ) { 68 78 StructDecl * vtableStruct = vtableType->baseStruct; 69 79 // Build the initialization … … 82 92 new SingleInit( new AddressExpr( new NameExpr( parentInstance ) ) ) ); 83 93 } else if ( std::string( "size" ) == field->name ) { 84 inits.push_back( new SingleInit( new SizeofExpr( objectType->clone() ) ) );94 inits.push_back( new SingleInit( new SizeofExpr( vobject_type->clone() ) ) ); 85 95 } else if ( std::string( "align" ) == field->name ) { 86 inits.push_back( new SingleInit( new AlignofExpr( objectType->clone() ) ) );96 inits.push_back( new SingleInit( new AlignofExpr( vobject_type->clone() ) ) ); 87 97 } else { 88 98 inits.push_back( new SingleInit( new NameExpr( field->name ) ) ); … … 98 108 } 99 109 100 namespace { 101 std::string const functionName = "get_exception_vtable"; 102 } 103 104 FunctionDecl * makeGetExceptionForward( 105 Type * vtableType, Type * exceptType ) { 106 assert( vtableType ); 107 assert( exceptType ); 108 FunctionType * type = new FunctionType( noQualifiers, false ); 109 vtableType->tq.is_const = true; 110 type->returnVals.push_back( new ObjectDecl( 111 "_retvalue", 112 noStorageClasses, 113 LinkageSpec::Cforall, 114 nullptr, 115 new ReferenceType( noQualifiers, vtableType ), 116 nullptr, 117 { new Attribute("unused") } 118 ) ); 119 type->parameters.push_back( new ObjectDecl( 120 "__unused", 121 noStorageClasses, 122 LinkageSpec::Cforall, 123 nullptr, 124 new PointerType( noQualifiers, exceptType ), 125 nullptr, 126 { new Attribute("unused") } 127 ) ); 128 return new FunctionDecl( 129 functionName, 130 noStorageClasses, 131 LinkageSpec::Cforall, 132 type, 133 nullptr 134 ); 135 } 136 137 FunctionDecl * makeGetExceptionFunction( 138 ObjectDecl * vtableInstance, Type * exceptType ) { 139 assert( vtableInstance ); 140 assert( exceptType ); 141 FunctionDecl * func = makeGetExceptionForward( 142 vtableInstance->type->clone(), exceptType ); 143 func->statements = new CompoundStmt( { 144 new ReturnStmt( new VariableExpr( vtableInstance ) ), 145 } ); 146 return func; 110 ObjectDecl * makeVtableInstance( 111 StructDecl * polyDecl, std::list< Expression * > && parameters, 112 Type * vobject, Initializer * init ) { 113 return makeVtableInstance( 114 vtableInstType( polyDecl, std::move( parameters ) ), vobject, init ); 147 115 } 148 116 -
src/Virtual/Tables.h
re7d6968 r37b7d95 27 27 bool isVTableInstanceName( std::string const & name ); 28 28 29 ObjectDecl * makeVtableForward( StructInstType * vtableType ); 30 /* Create a forward declaration of a vtable of the given type. 31 * vtableType node is consumed. 29 /// Converts exceptions into regular structures. 30 //void ( std::list< Declaration * > & translationUnit ); 31 32 ObjectDecl * makeVtableForward( StructInstType * ); 33 ObjectDecl * makeVtableForward( StructDecl *, std::list< Expression * > && ); 34 /* Create a forward definition of a vtable of the given type. 35 * 36 * Instead of the virtual table type you may provide the declaration and all 37 * the forall parameters. 32 38 */ 33 39 34 ObjectDecl * makeVtableInstance( StructInstType * vtableType, Type * objectType, 35 Initializer * init = nullptr ); 40 ObjectDecl * makeVtableInstance( StructInstType *, Type *, Initializer * ); 41 ObjectDecl * makeVtableInstance( 42 StructDecl *, std::list< Expression * > &&, Type *, Initializer * ); 36 43 /* Create an initialized definition of a vtable. 37 * vtableType and init (if provided) nodes are consumed. 38 */ 39 40 // Some special code for how exceptions interact with virtual tables. 41 FunctionDecl * makeGetExceptionForward( Type * vtableType, Type * exceptType ); 42 /* Create a forward declaration of the exception virtual function 43 * linking the vtableType to the exceptType. Both nodes are consumed. 44 */ 45 46 FunctionDecl * makeGetExceptionFunction( 47 ObjectDecl * vtableInstance, Type * exceptType ); 48 /* Create the definition of the exception virtual function. 49 * exceptType node is consumed. 44 * 45 * The parameters are the virtual table type (or the base declaration and the 46 * forall parameters), the object type and optionally an initializer. 47 * 48 * Instead of the virtual table type you may provide the declaration and all 49 * the forall parameters. 50 50 */ 51 51 -
src/main.cc
re7d6968 r37b7d95 9 9 // Author : Peter Buhr and Rob Schluntz 10 10 // Created On : Fri May 15 23:12:02 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T hu Oct 8 18:17:46202013 // Update Count : 63 711 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue May 19 12:03:00 2020 13 // Update Count : 634 14 14 // 15 15 … … 458 458 459 459 460 static const char optstring[] = ":c:ghlLmNnpd OAP:S:twW:D:";460 static const char optstring[] = ":c:ghlLmNnpdP:S:twW:D:"; 461 461 462 462 enum { PreludeDir = 128 }; … … 485 485 486 486 static const char * description[] = { 487 "diagnostic color: never, always, or auto.", // -c488 "wait for gdb to attach", // -g489 "print help message", // -h490 "generate libcfa.c", // -l491 "generate line marks", // -L492 "do not replace main", // -m493 "do not generate line marks", // -N494 "do not read prelude", // -n487 "diagnostic color: never, always, or auto.", // -c 488 "wait for gdb to attach", // -g 489 "print help message", // -h 490 "generate libcfa.c", // -l 491 "generate line marks", // -L 492 "do not replace main", // -m 493 "do not generate line marks", // -N 494 "do not read prelude", // -n 495 495 "generate prototypes for prelude functions", // -p 496 " only print deterministic output",// -d497 "Use the old-ast", // -O498 "Use the new-ast", // -A499 "print", // -P496 "don't print output that isn't deterministic", // -d 497 "Use the old-ast", // -O 498 "Use the new-ast", // -A 499 "print", // -P 500 500 "<directory> prelude directory for debug/nodebug", // no flag 501 501 "<option-list> enable profiling information:\n counters,heap,time,all,none", // -S 502 "building cfa standard lib", // -t503 "", // -w504 "", // -W505 "", // -D502 "building cfa standard lib", // -t 503 "", // -w 504 "", // -W 505 "", // -D 506 506 }; // description 507 507 -
tests/.expect/init1.txt
re7d6968 r37b7d95 1 init1.cfa: In function '_X4mainFi___1': 2 init1.cfa:136:9: note: #pragma message: Compiled 1 error: No reasonable alternatives for expression Untyped Init Expression 2 Name: rx InitAlternative: reference to signed int 3 error: No reasonable alternatives for expression Untyped Init Expression 4 Name: px InitAlternative: pointer to signed int 5 error: No reasonable alternatives for expression Untyped Init Expression 6 Name: crx InitAlternative: reference to float 7 error: No reasonable alternatives for expression Untyped Init Expression 8 Name: cpx InitAlternative: pointer to float 9 init1.cfa:94:1 error: No reasonable alternatives for expression Generated Cast of: 10 Name: rx 11 ... to: 12 reference to signed int 13 init1.cfa:97:1 error: No reasonable alternatives for expression Applying untyped: 14 Name: ?{} 15 ...to: 16 Generated Cast of: 17 Variable Expression: _retval_f_py: pointer to signed int 18 ... to: 19 reference to pointer to signed int 20 Name: px 21 22 init1.cfa:104:1 error: No reasonable alternatives for expression Generated Cast of: 23 Name: crx 24 ... to: 25 reference to float 26 init1.cfa:107:1 error: No reasonable alternatives for expression Applying untyped: 27 Name: ?{} 28 ...to: 29 Generated Cast of: 30 Variable Expression: _retval_f_py2: pointer to float 31 ... to: 32 reference to pointer to float 33 Name: cpx 34 35 init1.cfa:114:1 error: No reasonable alternatives for expression Generated Cast of: 36 Name: s 37 ... to: 38 reference to instance of type T (not function type) 39 init1.cfa:118:1 error: No reasonable alternatives for expression Applying untyped: 40 Name: ?{} 41 ...to: 42 Generated Cast of: 43 Variable Expression: _retval_anycvt: pointer to instance of type T (not function type) 44 ... to: 45 reference to pointer to instance of type T (not function type) 46 Name: s 47 -
tests/.expect/limits.txt
re7d6968 r37b7d95 1 1 limits.cfa: In function '_X4mainFi_iPPKc__1': 2 limits.cfa:15 4:9: note: #pragma message: Compiled2 limits.cfa:151:9: note: #pragma message: Compiled -
tests/Makefile.am
re7d6968 r37b7d95 11 11 ## Created On : Sun May 31 09:08:15 2015 12 12 ## Last Modified By : Peter A. Buhr 13 ## Last Modified On : Fri Oct 9 23:13:07202014 ## Update Count : 8 613 ## Last Modified On : Sun Sep 27 19:01:41 2020 14 ## Update Count : 84 15 15 ############################################################################### 16 16 … … 141 141 142 142 SYNTAX_ONLY_CODE = expression typedefRedef variableDeclarator switch numericConstants identFuncDeclarator forall \ 143 init1limits nested-types stdincludes cast labelledExit array builtins/sync warnings/self-assignment143 limits nested-types stdincludes cast labelledExit array builtins/sync warnings/self-assignment 144 144 $(SYNTAX_ONLY_CODE): % : %.cfa $(CFACCBIN) 145 145 $(CFACOMPILE_SYNTAX) … … 149 149 # use custom target since they require a custom define *and* have a name that doesn't match the file 150 150 alloc-ERROR : alloc.cfa $(CFACCBIN) 151 $(CFACOMPILE_SYNTAX) -DERR1152 -cp $(test) $(abspath ${@})153 154 init1-ERROR : init1.cfa $(CFACCBIN)155 151 $(CFACOMPILE_SYNTAX) -DERR1 156 152 -cp $(test) $(abspath ${@}) -
tests/alloc.cfa
re7d6968 r37b7d95 10 10 // Created On : Wed Feb 3 07:56:22 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Oct 9 23:03:11202013 // Update Count : 43 112 // Last Modified On : Fri Aug 14 16:59:59 2020 13 // Update Count : 430 14 14 // 15 15 … … 362 362 ip = memset( stp, 10 ); 363 363 ip = memcpy( &st1, &st ); 364 #endif // ERR1364 #endif 365 365 } // main 366 366 -
tests/complex.cfa
re7d6968 r37b7d95 14 14 // 15 15 16 #include <stdio.h> 16 17 #include <complex.h> 17 18 #ifdef __CFA__ -
tests/errors/.expect/completeType.x64.txt
re7d6968 r37b7d95 132 132 ?=?: pointer to function 133 133 ... with parameters 134 reference to instance of type _1 10_0_T (not function type)135 instance of type _1 10_0_T (not function type)134 reference to instance of type _109_0_T (not function type) 135 instance of type _109_0_T (not function type) 136 136 ... returning 137 _retval__operator_assign: instance of type _1 10_0_T (not function type)137 _retval__operator_assign: instance of type _109_0_T (not function type) 138 138 ... with attributes: 139 139 Attribute with name: unused -
tests/errors/.expect/completeType.x86.txt
re7d6968 r37b7d95 132 132 ?=?: pointer to function 133 133 ... with parameters 134 reference to instance of type _10 9_0_T (not function type)135 instance of type _10 9_0_T (not function type)134 reference to instance of type _108_0_T (not function type) 135 instance of type _108_0_T (not function type) 136 136 ... returning 137 _retval__operator_assign: instance of type _10 9_0_T (not function type)137 _retval__operator_assign: instance of type _108_0_T (not function type) 138 138 ... with attributes: 139 139 Attribute with name: unused -
tests/exceptions/cancel/coroutine.cfa
re7d6968 r37b7d95 1 1 // Try cancelling a coroutine. 2 2 3 #include <stdio.h> 3 4 #include <coroutine.hfa> 4 5 #include <exception.hfa> -
tests/exceptions/conditional.cfa
re7d6968 r37b7d95 5 5 6 6 #include <exception.hfa> 7 #include <stdio.h> 7 8 8 9 VTABLE_DECLARATION(num_error)( -
tests/exceptions/defaults.cfa
re7d6968 r37b7d95 55 55 56 56 void unhandled_test(void) { 57 forall(dtype T , dtype V | is_exception(T, V))57 forall(dtype T | is_exception(T)) 58 58 void defaultTerminationHandler(T &) { 59 59 throw (unhandled_exception){}; -
tests/exceptions/except-io.hfa
re7d6968 r37b7d95 1 1 // Common tools for the exception tests. 2 3 #include <stdio.h> 2 4 3 5 // Echo when a destructor is run and an area/block is left. -
tests/exceptions/trash.cfa
re7d6968 r37b7d95 2 2 3 3 #include <exception.hfa> 4 #include <stdio.h> 4 5 5 6 TRIVIAL_EXCEPTION(yin); -
tests/global-monomorph.cfa
re7d6968 r37b7d95 1 // Create monomorphic instances of polymorphic types at global scope. 1 // Crea 2 3 #include <stdlib.hfa> 4 #include <stdio.h> 2 5 3 6 forall(dtype T) -
tests/init1.cfa
re7d6968 r37b7d95 9 9 // Author : Michael Brooks 10 10 // Created On : Thu Jul 16 22:00:00 2020 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sun Oct 11 10:26:50 202013 // Update Count : 811 // Last Modified By : Michael Brooks 12 // Last Modified On : Thu Jul 16 22:00:00 2020 13 // Update Count : 1 14 14 // 15 15 … … 41 41 const float * cpx2 = cpx; 42 42 43 // FIX ME: Code gen not producing correct cast.44 #pragma GCC diagnostic push45 #pragma GCC diagnostic ignored "-Wincompatible-pointer-types"46 int (* fp)( int ) = 0p;47 fp = 0p;48 #pragma GCC diagnostic pop49 50 43 // 51 44 // unsound initializations 52 45 // 53 46 54 #ifdef ERR155 47 // mismatched referenced type 56 48 int & ry = rx; … … 60 52 float & ry2 = crx; 61 53 float * py2 = cpx; 62 #endif // ERR163 54 } 64 55 … … 99 90 // 100 91 101 #ifdef ERR1102 92 int & f_ry() { 103 93 float & rx = *0p; … … 129 119 return s; // mismatched referenced type 130 120 } 131 #endif // ERR1132 133 int main() {134 #pragma message( "Compiled" ) // force non-empty .expect file135 } -
tests/limits.cfa
re7d6968 r37b7d95 13 13 // Update Count : 10 14 14 // 15 16 // Note: For testing the ability to load the constants defined in libcfa/src/limits.cfa,17 // see discussion in test const-init.18 15 19 16 #include <limits.hfa> -
tests/poly-d-cycle.cfa
re7d6968 r37b7d95 1 1 // Check that a cycle of polymorphic dtype structures can be instancated. 2 3 #include <stdio.h> 2 4 3 5 forall(dtype T) -
tests/poly-o-cycle.cfa
re7d6968 r37b7d95 1 1 // Check that a cycle of polymorphic otype structures can be instancated. 2 3 #include <stdio.h> 2 4 3 5 forall(otype T)
Note:
See TracChangeset
for help on using the changeset viewer.