Changes in / [26d944c:02f4eb8]
- Files:
-
- 8 edited
-
libcfa/src/concurrency/kernel/startup.cfa (modified) (8 diffs)
-
libcfa/src/concurrency/kernel_private.hfa (modified) (3 diffs)
-
src/AST/Pass.impl.hpp (modified) (5 diffs)
-
src/Common/PassVisitor.impl.h (modified) (13 diffs)
-
src/SymTab/Validate.cc (modified) (1 diff)
-
tests/.expect/typedefRedef-ERR1.txt (modified) (1 diff)
-
tests/.expect/typedefRedef.txt (modified) (1 diff)
-
tests/typedefRedef.cfa (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel/startup.cfa
r26d944c r02f4eb8 19 19 // C Includes 20 20 #include <errno.h> // errno 21 #include <signal.h>22 21 #include <string.h> // strerror 23 22 #include <unistd.h> // sysconf 24 25 23 extern "C" { 26 24 #include <limits.h> // PTHREAD_STACK_MIN 27 #include <unistd.h> // syscall28 25 #include <sys/eventfd.h> // eventfd 29 26 #include <sys/mman.h> // mprotect 30 27 #include <sys/resource.h> // getrlimit 31 #include <sys/syscall.h> // __NR_xxx32 28 } 33 29 … … 102 98 extern void __wake_proc(processor *); 103 99 104 #if defined(CFA_HAVE_LINUX_LIBRSEQ)105 // No forward declaration needed106 #define __kernel_rseq_register rseq_register_current_thread107 #define __kernel_rseq_unregister rseq_unregister_current_thread108 #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_register113 #define __kernel_rseq_unregister __kernel_raw_rseq_unregister114 #else115 // No forward declaration needed116 // No initialization needed117 static inline void noop(void) {};118 119 #define __kernel_rseq_register noop120 #define __kernel_rseq_unregister noop121 #endif122 123 100 //----------------------------------------------------------------------------- 124 101 // Kernel storage … … 164 141 #elif defined(CFA_HAVE_LINUX_RSEQ_H) 165 142 extern "Cforall" { 166 __attribute__((aligned(128))) thread_local volatile struct rseq __cfaabi_rseq @= { 167 .cpu_id : RSEQ_CPU_ID_UNINITIALIZED, 168 }; 143 // thread_local volatile struct rseq __cfaabi_rseq; 169 144 } 170 145 #else … … 255 230 256 231 register_tls( mainProcessor ); 257 258 __kernel_rseq_register();259 232 260 233 //initialize the global state variables … … 323 296 mainProcessor->local_data = 0p; 324 297 325 __kernel_rseq_unregister();326 327 298 unregister_tls( mainProcessor ); 328 299 … … 376 347 register_tls( proc ); 377 348 378 __kernel_rseq_register(); 349 #if defined(CFA_HAVE_LINUX_LIBRSEQ) 350 rseq_register_current_thread(); 351 #endif 379 352 380 353 // SKULLDUGGERY: We want to create a context for the processor coroutine … … 416 389 417 390 proc->local_data = 0p; 418 419 __kernel_rseq_unregister();420 391 421 392 unregister_tls( proc ); … … 832 803 } 833 804 #endif 834 835 #if defined(CFA_HAVE_LINUX_LIBRSEQ)836 // No definition needed837 #elif defined(CFA_HAVE_LINUX_RSEQ_H)838 839 #if defined( __x86_64 ) || defined( __i386 )840 #define RSEQ_SIG 0x53053053841 #elif defined( __ARM_ARCH )842 #ifdef __ARMEB__843 #define RSEQ_SIG 0xf3def5e7 /* udf #24035 ; 0x5de3 (ARMv6+) */844 #else845 #define RSEQ_SIG 0xe7f5def3 /* udf #24035 ; 0x5de3 */846 #endif847 #endif848 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 #else888 // No definition needed889 #endif -
libcfa/src/concurrency/kernel_private.hfa
r26d944c r02f4eb8 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 ();71 return rseq_current_cpu_raw(); 72 72 #elif defined(CFA_HAVE_LINUX_RSEQ_H) 73 int r = __cfaabi_rseq.cpu_id; 74 /* paranoid */ verify( r >= 0 ); 75 return r; 73 // return __cfaabi_rseq.cpu_id; 76 74 #else 77 75 return sched_getcpu(); -
src/AST/Pass.impl.hpp
r26d944c r02f4eb8 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 ); 526 maybe_accept( node, &StructDecl::attributes ); 524 maybe_accept( node, &StructDecl::params ); 525 maybe_accept( node, &StructDecl::members ); 527 526 }) 528 527 … … 544 543 VISIT({ 545 544 guard_symtab guard { * this }; 546 maybe_accept( node, &UnionDecl::params ); 547 maybe_accept( node, &UnionDecl::members ); 548 maybe_accept( node, &UnionDecl::attributes ); 545 maybe_accept( node, &UnionDecl::params ); 546 maybe_accept( node, &UnionDecl::members ); 549 547 }) 550 548 … … 564 562 VISIT( 565 563 // unlike structs, traits, and unions, enums inject their members into the global scope 566 maybe_accept( node, &EnumDecl::params ); 567 maybe_accept( node, &EnumDecl::members ); 568 maybe_accept( node, &EnumDecl::attributes ); 564 maybe_accept( node, &EnumDecl::params ); 565 maybe_accept( node, &EnumDecl::members ); 569 566 ) 570 567 … … 580 577 VISIT({ 581 578 guard_symtab guard { *this }; 582 maybe_accept( node, &TraitDecl::params ); 583 maybe_accept( node, &TraitDecl::members ); 584 maybe_accept( node, &TraitDecl::attributes ); 579 maybe_accept( node, &TraitDecl::params ); 580 maybe_accept( node, &TraitDecl::members ); 585 581 }) 586 582 -
src/Common/PassVisitor.impl.h
r26d944c r02f4eb8 636 636 maybeAccept_impl( node->parameters, *this ); 637 637 maybeAccept_impl( node->members , *this ); 638 maybeAccept_impl( node->attributes, *this );639 638 } 640 639 … … 657 656 maybeAccept_impl( node->parameters, *this ); 658 657 maybeAccept_impl( node->members , *this ); 659 maybeAccept_impl( node->attributes, *this );660 658 } 661 659 … … 678 676 maybeMutate_impl( node->parameters, *this ); 679 677 maybeMutate_impl( node->members , *this ); 680 maybeMutate_impl( node->attributes, *this );681 678 } 682 679 … … 700 697 maybeAccept_impl( node->parameters, *this ); 701 698 maybeAccept_impl( node->members , *this ); 702 maybeAccept_impl( node->attributes, *this );703 699 } 704 700 … … 718 714 maybeAccept_impl( node->parameters, *this ); 719 715 maybeAccept_impl( node->members , *this ); 720 maybeAccept_impl( node->attributes, *this );721 716 } 722 717 … … 737 732 maybeMutate_impl( node->parameters, *this ); 738 733 maybeMutate_impl( node->members , *this ); 739 maybeMutate_impl( node->attributes, *this );740 734 } 741 735 … … 756 750 maybeAccept_impl( node->parameters, *this ); 757 751 maybeAccept_impl( node->members , *this ); 758 maybeAccept_impl( node->attributes, *this );759 752 760 753 VISIT_END( node ); … … 770 763 maybeAccept_impl( node->parameters, *this ); 771 764 maybeAccept_impl( node->members , *this ); 772 maybeAccept_impl( node->attributes, *this );773 765 774 766 VISIT_END( node ); … … 784 776 maybeMutate_impl( node->parameters, *this ); 785 777 maybeMutate_impl( node->members , *this ); 786 maybeMutate_impl( node->attributes, *this );787 778 788 779 MUTATE_END( Declaration, node ); … … 799 790 maybeAccept_impl( node->parameters, *this ); 800 791 maybeAccept_impl( node->members , *this ); 801 maybeAccept_impl( node->attributes, *this );802 792 } 803 793 … … 815 805 maybeAccept_impl( node->parameters, *this ); 816 806 maybeAccept_impl( node->members , *this ); 817 maybeAccept_impl( node->attributes, *this );818 807 } 819 808 … … 831 820 maybeMutate_impl( node->parameters, *this ); 832 821 maybeMutate_impl( node->members , *this ); 833 maybeMutate_impl( node->attributes, *this );834 822 } 835 823 … … 3868 3856 3869 3857 //-------------------------------------------------------------------------- 3870 // Constant3858 // Attribute 3871 3859 template< typename pass_type > 3872 3860 void PassVisitor< pass_type >::visit( Constant * node ) { -
src/SymTab/Validate.cc
r26d944c r02f4eb8 1152 1152 GuardScope( typedeclNames ); 1153 1153 mutateAll( aggr->parameters, * visitor ); 1154 mutateAll( aggr->attributes, * visitor );1155 1154 1156 1155 // unroll mutateAll for aggr->members so that implicit typedefs for nested types are added to the aggregate body. -
tests/.expect/typedefRedef-ERR1.txt
r26d944c r02f4eb8 1 typedefRedef.cfa: 75:25: warning: Compiled1 typedefRedef.cfa:69:25: warning: Compiled 2 2 typedefRedef.cfa:4:1 error: Cannot redefine typedef: Foo 3 typedefRedef.cfa: 65:1 error: Cannot redefine typedef: ARR3 typedefRedef.cfa:59:1 error: Cannot redefine typedef: ARR -
tests/.expect/typedefRedef.txt
r26d944c r02f4eb8 1 typedefRedef.cfa: 75:25: warning: Compiled1 typedefRedef.cfa:69:25: warning: Compiled -
tests/typedefRedef.cfa
r26d944c r02f4eb8 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 53 47 // xxx - this doesn't work yet due to parsing problems with generic types 54 48 // #ifdef __CFA__
Note:
See TracChangeset
for help on using the changeset viewer.