Changes in / [26d944c:02f4eb8]


Ignore:
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/kernel/startup.cfa

    r26d944c r02f4eb8  
    1919// C Includes
    2020#include <errno.h>              // errno
    21 #include <signal.h>
    2221#include <string.h>             // strerror
    2322#include <unistd.h>             // sysconf
    24 
    2523extern "C" {
    2624      #include <limits.h>       // PTHREAD_STACK_MIN
    27         #include <unistd.h>       // syscall
    2825        #include <sys/eventfd.h>  // eventfd
    2926      #include <sys/mman.h>     // mprotect
    3027      #include <sys/resource.h> // getrlimit
    31         #include <sys/syscall.h>  // __NR_xxx
    3228}
    3329
     
    10298extern void __wake_proc(processor *);
    10399
    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 
    123100//-----------------------------------------------------------------------------
    124101// Kernel storage
     
    164141#elif defined(CFA_HAVE_LINUX_RSEQ_H)
    165142        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;
    169144        }
    170145#else
     
    255230
    256231        register_tls( mainProcessor );
    257 
    258         __kernel_rseq_register();
    259232
    260233        //initialize the global state variables
     
    323296        mainProcessor->local_data = 0p;
    324297
    325         __kernel_rseq_unregister();
    326 
    327298        unregister_tls( mainProcessor );
    328299
     
    376347        register_tls( proc );
    377348
    378         __kernel_rseq_register();
     349        #if defined(CFA_HAVE_LINUX_LIBRSEQ)
     350                rseq_register_current_thread();
     351        #endif
    379352
    380353        // SKULLDUGGERY: We want to create a context for the processor coroutine
     
    416389
    417390        proc->local_data = 0p;
    418 
    419         __kernel_rseq_unregister();
    420391
    421392        unregister_tls( proc );
     
    832803}
    833804#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

    r26d944c r02f4eb8  
    3030        #include <rseq/rseq.h>
    3131#elif defined(CFA_HAVE_LINUX_RSEQ_H)
    32         #include <linux/rseq.h>
     32        // #include <linux/rseq.h>
    3333#else
    3434        #ifndef _GNU_SOURCE
     
    6060#elif defined(CFA_HAVE_LINUX_RSEQ_H)
    6161        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;
    6363        }
    6464#else
     
    6969        /* paranoid */ verify( ! __preemption_enabled() );
    7070#if   defined(CFA_HAVE_LINUX_LIBRSEQ)
    71         return rseq_current_cpu();
     71        return rseq_current_cpu_raw();
    7272#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;
    7674#else
    7775        return sched_getcpu();
  • src/AST/Pass.impl.hpp

    r26d944c r02f4eb8  
    479479                        guard_symtab guard { *this };
    480480                        // 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{ 
    482482                                CodeLocation{}, "__func__",
    483483                                new ast::ArrayType{
     
    522522        VISIT({
    523523                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 );
    527526        })
    528527
     
    544543        VISIT({
    545544                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 );
    549547        })
    550548
     
    564562        VISIT(
    565563                // 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 );
    569566        )
    570567
     
    580577        VISIT({
    581578                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 );
    585581        })
    586582
  • src/Common/PassVisitor.impl.h

    r26d944c r02f4eb8  
    636636                maybeAccept_impl( node->parameters, *this );
    637637                maybeAccept_impl( node->members   , *this );
    638                 maybeAccept_impl( node->attributes, *this );
    639638        }
    640639
     
    657656                maybeAccept_impl( node->parameters, *this );
    658657                maybeAccept_impl( node->members   , *this );
    659                 maybeAccept_impl( node->attributes, *this );
    660658        }
    661659
     
    678676                maybeMutate_impl( node->parameters, *this );
    679677                maybeMutate_impl( node->members   , *this );
    680                 maybeMutate_impl( node->attributes, *this );
    681678        }
    682679
     
    700697                maybeAccept_impl( node->parameters, *this );
    701698                maybeAccept_impl( node->members   , *this );
    702                 maybeAccept_impl( node->attributes, *this );
    703699        }
    704700
     
    718714                maybeAccept_impl( node->parameters, *this );
    719715                maybeAccept_impl( node->members   , *this );
    720                 maybeAccept_impl( node->attributes, *this );
    721716        }
    722717
     
    737732                maybeMutate_impl( node->parameters, *this );
    738733                maybeMutate_impl( node->members   , *this );
    739                 maybeMutate_impl( node->attributes, *this );
    740734        }
    741735
     
    756750        maybeAccept_impl( node->parameters, *this );
    757751        maybeAccept_impl( node->members   , *this );
    758         maybeAccept_impl( node->attributes, *this );
    759752
    760753        VISIT_END( node );
     
    770763        maybeAccept_impl( node->parameters, *this );
    771764        maybeAccept_impl( node->members   , *this );
    772         maybeAccept_impl( node->attributes, *this );
    773765
    774766        VISIT_END( node );
     
    784776        maybeMutate_impl( node->parameters, *this );
    785777        maybeMutate_impl( node->members   , *this );
    786         maybeMutate_impl( node->attributes, *this );
    787778
    788779        MUTATE_END( Declaration, node );
     
    799790                maybeAccept_impl( node->parameters, *this );
    800791                maybeAccept_impl( node->members   , *this );
    801                 maybeAccept_impl( node->attributes, *this );
    802792        }
    803793
     
    815805                maybeAccept_impl( node->parameters, *this );
    816806                maybeAccept_impl( node->members   , *this );
    817                 maybeAccept_impl( node->attributes, *this );
    818807        }
    819808
     
    831820                maybeMutate_impl( node->parameters, *this );
    832821                maybeMutate_impl( node->members   , *this );
    833                 maybeMutate_impl( node->attributes, *this );
    834822        }
    835823
     
    38683856
    38693857//--------------------------------------------------------------------------
    3870 // Constant
     3858// Attribute
    38713859template< typename pass_type >
    38723860void PassVisitor< pass_type >::visit( Constant * node ) {
  • src/SymTab/Validate.cc

    r26d944c r02f4eb8  
    11521152                GuardScope( typedeclNames );
    11531153                mutateAll( aggr->parameters, * visitor );
    1154                 mutateAll( aggr->attributes, * visitor );
    11551154
    11561155                // 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: Compiled
     1typedefRedef.cfa:69:25: warning: Compiled
    22typedefRedef.cfa:4:1 error: Cannot redefine typedef: Foo
    3 typedefRedef.cfa:65:1 error: Cannot redefine typedef: ARR
     3typedefRedef.cfa:59:1 error: Cannot redefine typedef: ARR
  • tests/.expect/typedefRedef.txt

    r26d944c r02f4eb8  
    1 typedefRedef.cfa:75:25: warning: Compiled
     1typedefRedef.cfa:69:25: warning: Compiled
  • tests/typedefRedef.cfa

    r26d944c r02f4eb8  
    4545typedef int X2;
    4646
    47 X2 value  __attribute__((aligned(4 * sizeof(X2))));
    48 
    49 __attribute__((aligned(4 * sizeof(X2)))) struct rseq_cs {
    50         int foo;
    51 };
    52 
    5347// xxx - this doesn't work yet due to parsing problems with generic types
    5448// #ifdef __CFA__
Note: See TracChangeset for help on using the changeset viewer.