Changes in / [02f4eb8:26d944c]
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel/startup.cfa
r02f4eb8 r26d944c 19 19 // C Includes 20 20 #include <errno.h> // errno 21 #include <signal.h> 21 22 #include <string.h> // strerror 22 23 #include <unistd.h> // sysconf 24 23 25 extern "C" { 24 26 #include <limits.h> // PTHREAD_STACK_MIN 27 #include <unistd.h> // syscall 25 28 #include <sys/eventfd.h> // eventfd 26 29 #include <sys/mman.h> // mprotect 27 30 #include <sys/resource.h> // getrlimit 31 #include <sys/syscall.h> // __NR_xxx 28 32 } 29 33 … … 98 102 extern void __wake_proc(processor *); 99 103 104 #if defined(CFA_HAVE_LINUX_LIBRSEQ) 105 // No forward declaration needed 106 #define __kernel_rseq_register rseq_register_current_thread 107 #define __kernel_rseq_unregister rseq_unregister_current_thread 108 #elif defined(CFA_HAVE_LINUX_RSEQ_H) 109 void __kernel_raw_rseq_register (void); 110 void __kernel_raw_rseq_unregister(void); 111 112 #define __kernel_rseq_register __kernel_raw_rseq_register 113 #define __kernel_rseq_unregister __kernel_raw_rseq_unregister 114 #else 115 // No forward declaration needed 116 // No initialization needed 117 static inline void noop(void) {}; 118 119 #define __kernel_rseq_register noop 120 #define __kernel_rseq_unregister noop 121 #endif 122 100 123 //----------------------------------------------------------------------------- 101 124 // Kernel storage … … 141 164 #elif defined(CFA_HAVE_LINUX_RSEQ_H) 142 165 extern "Cforall" { 143 // thread_local volatile struct rseq __cfaabi_rseq; 166 __attribute__((aligned(128))) thread_local volatile struct rseq __cfaabi_rseq @= { 167 .cpu_id : RSEQ_CPU_ID_UNINITIALIZED, 168 }; 144 169 } 145 170 #else … … 230 255 231 256 register_tls( mainProcessor ); 257 258 __kernel_rseq_register(); 232 259 233 260 //initialize the global state variables … … 296 323 mainProcessor->local_data = 0p; 297 324 325 __kernel_rseq_unregister(); 326 298 327 unregister_tls( mainProcessor ); 299 328 … … 347 376 register_tls( proc ); 348 377 349 #if defined(CFA_HAVE_LINUX_LIBRSEQ) 350 rseq_register_current_thread(); 351 #endif 378 __kernel_rseq_register(); 352 379 353 380 // SKULLDUGGERY: We want to create a context for the processor coroutine … … 389 416 390 417 proc->local_data = 0p; 418 419 __kernel_rseq_unregister(); 391 420 392 421 unregister_tls( proc ); … … 803 832 } 804 833 #endif 834 835 #if defined(CFA_HAVE_LINUX_LIBRSEQ) 836 // No definition needed 837 #elif defined(CFA_HAVE_LINUX_RSEQ_H) 838 839 #if defined( __x86_64 ) || defined( __i386 ) 840 #define RSEQ_SIG 0x53053053 841 #elif defined( __ARM_ARCH ) 842 #ifdef __ARMEB__ 843 #define RSEQ_SIG 0xf3def5e7 /* udf #24035 ; 0x5de3 (ARMv6+) */ 844 #else 845 #define RSEQ_SIG 0xe7f5def3 /* udf #24035 ; 0x5de3 */ 846 #endif 847 #endif 848 849 extern void __disable_interrupts_hard(); 850 extern void __enable_interrupts_hard(); 851 852 void __kernel_raw_rseq_register (void) { 853 /* paranoid */ verify( __cfaabi_rseq.cpu_id == RSEQ_CPU_ID_UNINITIALIZED ); 854 855 // int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), 0, (sigset_t *)0p, _NSIG / 8); 856 int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), 0, RSEQ_SIG); 857 if(ret != 0) { 858 int e = errno; 859 switch(e) { 860 case EINVAL: abort("KERNEL ERROR: rseq register invalid argument"); 861 case ENOSYS: abort("KERNEL ERROR: rseq register no supported"); 862 case EFAULT: abort("KERNEL ERROR: rseq register with invalid argument"); 863 case EBUSY : abort("KERNEL ERROR: rseq register already registered"); 864 case EPERM : abort("KERNEL ERROR: rseq register sig argument on unregistration does not match the signature received on registration"); 865 default: abort("KERNEL ERROR: rseq register unexpected return %d", e); 866 } 867 } 868 } 869 870 void __kernel_raw_rseq_unregister(void) { 871 /* paranoid */ verify( __cfaabi_rseq.cpu_id >= 0 ); 872 873 // int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, (sigset_t *)0p, _NSIG / 8); 874 int ret = syscall(__NR_rseq, &__cfaabi_rseq, sizeof(struct rseq), RSEQ_FLAG_UNREGISTER, RSEQ_SIG); 875 if(ret != 0) { 876 int e = errno; 877 switch(e) { 878 case EINVAL: abort("KERNEL ERROR: rseq unregister invalid argument"); 879 case ENOSYS: abort("KERNEL ERROR: rseq unregister no supported"); 880 case EFAULT: abort("KERNEL ERROR: rseq unregister with invalid argument"); 881 case EBUSY : abort("KERNEL ERROR: rseq unregister already registered"); 882 case EPERM : abort("KERNEL ERROR: rseq unregister sig argument on unregistration does not match the signature received on registration"); 883 default: abort("KERNEL ERROR: rseq unregisteunexpected return %d", e); 884 } 885 } 886 } 887 #else 888 // No definition needed 889 #endif -
libcfa/src/concurrency/kernel_private.hfa
r02f4eb8 r26d944c 30 30 #include <rseq/rseq.h> 31 31 #elif defined(CFA_HAVE_LINUX_RSEQ_H) 32 //#include <linux/rseq.h>32 #include <linux/rseq.h> 33 33 #else 34 34 #ifndef _GNU_SOURCE … … 60 60 #elif defined(CFA_HAVE_LINUX_RSEQ_H) 61 61 extern "Cforall" { 62 //extern __attribute__((aligned(128))) thread_local volatile struct rseq __cfaabi_rseq;62 extern __attribute__((aligned(128))) thread_local volatile struct rseq __cfaabi_rseq; 63 63 } 64 64 #else … … 69 69 /* paranoid */ verify( ! __preemption_enabled() ); 70 70 #if defined(CFA_HAVE_LINUX_LIBRSEQ) 71 return rseq_current_cpu _raw();71 return rseq_current_cpu(); 72 72 #elif defined(CFA_HAVE_LINUX_RSEQ_H) 73 // return __cfaabi_rseq.cpu_id; 73 int r = __cfaabi_rseq.cpu_id; 74 /* paranoid */ verify( r >= 0 ); 75 return r; 74 76 #else 75 77 return sched_getcpu(); -
src/AST/Pass.impl.hpp
r02f4eb8 r26d944c 479 479 guard_symtab guard { *this }; 480 480 // implicit add __func__ identifier as specified in the C manual 6.4.2.2 481 static ast::ptr< ast::ObjectDecl > func{ new ast::ObjectDecl{ 481 static ast::ptr< ast::ObjectDecl > func{ new ast::ObjectDecl{ 482 482 CodeLocation{}, "__func__", 483 483 new ast::ArrayType{ … … 522 522 VISIT({ 523 523 guard_symtab guard { * this }; 524 maybe_accept( node, &StructDecl::params ); 525 maybe_accept( node, &StructDecl::members ); 524 maybe_accept( node, &StructDecl::params ); 525 maybe_accept( node, &StructDecl::members ); 526 maybe_accept( node, &StructDecl::attributes ); 526 527 }) 527 528 … … 543 544 VISIT({ 544 545 guard_symtab guard { * this }; 545 maybe_accept( node, &UnionDecl::params ); 546 maybe_accept( node, &UnionDecl::members ); 546 maybe_accept( node, &UnionDecl::params ); 547 maybe_accept( node, &UnionDecl::members ); 548 maybe_accept( node, &UnionDecl::attributes ); 547 549 }) 548 550 … … 562 564 VISIT( 563 565 // unlike structs, traits, and unions, enums inject their members into the global scope 564 maybe_accept( node, &EnumDecl::params ); 565 maybe_accept( node, &EnumDecl::members ); 566 maybe_accept( node, &EnumDecl::params ); 567 maybe_accept( node, &EnumDecl::members ); 568 maybe_accept( node, &EnumDecl::attributes ); 566 569 ) 567 570 … … 577 580 VISIT({ 578 581 guard_symtab guard { *this }; 579 maybe_accept( node, &TraitDecl::params ); 580 maybe_accept( node, &TraitDecl::members ); 582 maybe_accept( node, &TraitDecl::params ); 583 maybe_accept( node, &TraitDecl::members ); 584 maybe_accept( node, &TraitDecl::attributes ); 581 585 }) 582 586 -
src/Common/PassVisitor.impl.h
r02f4eb8 r26d944c 636 636 maybeAccept_impl( node->parameters, *this ); 637 637 maybeAccept_impl( node->members , *this ); 638 maybeAccept_impl( node->attributes, *this ); 638 639 } 639 640 … … 656 657 maybeAccept_impl( node->parameters, *this ); 657 658 maybeAccept_impl( node->members , *this ); 659 maybeAccept_impl( node->attributes, *this ); 658 660 } 659 661 … … 676 678 maybeMutate_impl( node->parameters, *this ); 677 679 maybeMutate_impl( node->members , *this ); 680 maybeMutate_impl( node->attributes, *this ); 678 681 } 679 682 … … 697 700 maybeAccept_impl( node->parameters, *this ); 698 701 maybeAccept_impl( node->members , *this ); 702 maybeAccept_impl( node->attributes, *this ); 699 703 } 700 704 … … 714 718 maybeAccept_impl( node->parameters, *this ); 715 719 maybeAccept_impl( node->members , *this ); 720 maybeAccept_impl( node->attributes, *this ); 716 721 } 717 722 … … 732 737 maybeMutate_impl( node->parameters, *this ); 733 738 maybeMutate_impl( node->members , *this ); 739 maybeMutate_impl( node->attributes, *this ); 734 740 } 735 741 … … 750 756 maybeAccept_impl( node->parameters, *this ); 751 757 maybeAccept_impl( node->members , *this ); 758 maybeAccept_impl( node->attributes, *this ); 752 759 753 760 VISIT_END( node ); … … 763 770 maybeAccept_impl( node->parameters, *this ); 764 771 maybeAccept_impl( node->members , *this ); 772 maybeAccept_impl( node->attributes, *this ); 765 773 766 774 VISIT_END( node ); … … 776 784 maybeMutate_impl( node->parameters, *this ); 777 785 maybeMutate_impl( node->members , *this ); 786 maybeMutate_impl( node->attributes, *this ); 778 787 779 788 MUTATE_END( Declaration, node ); … … 790 799 maybeAccept_impl( node->parameters, *this ); 791 800 maybeAccept_impl( node->members , *this ); 801 maybeAccept_impl( node->attributes, *this ); 792 802 } 793 803 … … 805 815 maybeAccept_impl( node->parameters, *this ); 806 816 maybeAccept_impl( node->members , *this ); 817 maybeAccept_impl( node->attributes, *this ); 807 818 } 808 819 … … 820 831 maybeMutate_impl( node->parameters, *this ); 821 832 maybeMutate_impl( node->members , *this ); 833 maybeMutate_impl( node->attributes, *this ); 822 834 } 823 835 … … 3856 3868 3857 3869 //-------------------------------------------------------------------------- 3858 // Attribute3870 // Constant 3859 3871 template< typename pass_type > 3860 3872 void PassVisitor< pass_type >::visit( Constant * node ) { -
src/SymTab/Validate.cc
r02f4eb8 r26d944c 1152 1152 GuardScope( typedeclNames ); 1153 1153 mutateAll( aggr->parameters, * visitor ); 1154 mutateAll( aggr->attributes, * visitor ); 1154 1155 1155 1156 // unroll mutateAll for aggr->members so that implicit typedefs for nested types are added to the aggregate body. -
tests/.expect/typedefRedef-ERR1.txt
r02f4eb8 r26d944c 1 typedefRedef.cfa: 69:25: warning: Compiled1 typedefRedef.cfa:75:25: warning: Compiled 2 2 typedefRedef.cfa:4:1 error: Cannot redefine typedef: Foo 3 typedefRedef.cfa: 59:1 error: Cannot redefine typedef: ARR3 typedefRedef.cfa:65:1 error: Cannot redefine typedef: ARR -
tests/.expect/typedefRedef.txt
r02f4eb8 r26d944c 1 typedefRedef.cfa: 69:25: warning: Compiled1 typedefRedef.cfa:75:25: warning: Compiled -
tests/typedefRedef.cfa
r02f4eb8 r26d944c 45 45 typedef int X2; 46 46 47 X2 value __attribute__((aligned(4 * sizeof(X2)))); 48 49 __attribute__((aligned(4 * sizeof(X2)))) struct rseq_cs { 50 int foo; 51 }; 52 47 53 // xxx - this doesn't work yet due to parsing problems with generic types 48 54 // #ifdef __CFA__
Note: See TracChangeset
for help on using the changeset viewer.