Changeset 949934e


Ignore:
Timestamp:
Jun 29, 2017, 5:09:37 PM (4 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, resolv-new, with_gc
Children:
1abc5ab
Parents:
2a7b3ca (diff), fe5c01d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:/u/cforall/software/cfa/cfa-cc

Files:
21 added
36 edited
3 moved

Legend:

Unmodified
Added
Removed
  • .gitignore

    r2a7b3ca r949934e  
    3131
    3232src/prelude/builtins.cf
    33 src/prelude/builtins.c
     33src/prelude/gcc-builtins.cf
     34src/prelude/gcc-builtins.c
    3435src/prelude/extras.cf
    3536src/prelude/bootloader.c
    3637src/libcfa/libcfa-prelude.c
    3738
    38 # generated by bison and lex from cfa.yy and lex.ll, respectively
     39# generated by bison and lex from parser.yy and lex.ll
    3940src/Parser/parser.output
    4041src/Parser/lex.cc
     
    4243src/Parser/parser.h
    4344
     45tools/prettyprinter/parser.output
     46tools/prettyprinter/lex.cc
     47tools/prettyprinter/parser.cc
     48tools/prettyprinter/parser.h
     49tools/prettyprinter/pretty
     50tools/pretty
     51
    4452# generated by xfig for user manual
    4553doc/user/Cdecl.tex
  • configure

    r2a7b3ca r949934e  
    62516251
    62526252
    6253 ac_config_files="$ac_config_files Makefile src/driver/Makefile src/Makefile src/benchmark/Makefile src/examples/Makefile src/tests/Makefile src/tests/preempt_longrun/Makefile src/prelude/Makefile src/libcfa/Makefile"
     6253ac_config_files="$ac_config_files Makefile src/driver/Makefile src/Makefile src/benchmark/Makefile src/examples/Makefile src/tests/Makefile src/tests/preempt_longrun/Makefile src/prelude/Makefile src/libcfa/Makefile tools/prettyprinter/Makefile"
    62546254
    62556255
     
    70227022    "src/prelude/Makefile") CONFIG_FILES="$CONFIG_FILES src/prelude/Makefile" ;;
    70237023    "src/libcfa/Makefile") CONFIG_FILES="$CONFIG_FILES src/libcfa/Makefile" ;;
     7024    "tools/prettyprinter/Makefile") CONFIG_FILES="$CONFIG_FILES tools/prettyprinter/Makefile" ;;
    70247025
    70257026  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
  • configure.ac

    r2a7b3ca r949934e  
    238238        src/prelude/Makefile
    239239        src/libcfa/Makefile
     240        tools/prettyprinter/Makefile
    240241        ])
    241242
  • doc/proposals/tagged-struct.txt

    r2a7b3ca r949934e  
    1414say which of the possible values is currently stored in the union. The idea
    1515here is similar, however the possibilities are more open ended.
     16
     17Alternate names include virtual structure and abstract structure.
    1618
    1719
     
    3638their parent's fields to their field list so they can be upcast.
    3739
     40The type field may be public, if it is then it can be accessed through a
     41simple field access "instance.type". The type field would then be able to be
     42used to access the type object, which contains the information for the type.
     43It may just be a pointer to the type object "*instance.type", although a
     44lookup function could also be used.
     45
     46
     47Usage:
     48
     49The central feature for tagged structs is a checked cast between pointer types
     50to the structures. A cast is successful if the true type of the pointed object
     51is of the type being cast to or any of its children, otherwise the cast
     52returns null.
     53
     54The type field should also allow for equality comparison of types.
     55
     56Currently, with only these operations (and similar features) the type field
     57could be hidden and the operations given through helper functions. However
     58if the type object has more complex (or even open ended) information in it
     59than providing direct access becomes very valuable.
     60
    3861
    3962Implemenation:
    4063
    41 Adding to the field list is a simple matter, should be doable during
    42 translation. The type field is just a pointer to a type object. With proper
    43 linking we can create a single unique instance of the type object for each
    44 declared tagged struct. The instance's address is used as an id for the type.
    45 It also holds data about the type, such as its parent's id/a pointer to the
    46 parent type object.
     64Adding to the field list would have to be handled during translation. The
     65simple act of adding declarations should not be difficult, althought it might
     66take a bit of work to find the parent's declarations.
    4767
    48 The type field could be hidden (as best as C can hide it) or it could be
    49 visible to the user with easy access to allow the user to examine the type
    50 object directly.
    51 
    52 Direct access is more useful if the data on the type-objects can change, other
    53 wise the build in function could handle all cases. Perhaps each root object
    54 can specify a type object to use or the type objects are themselves tagged,
    55 although there may not be a base case with the latter.
    56 
    57 In the simplest case the type object is a pointer to the parent type object.
    58 Additional data could be added, such as a name, or a function pointer to the
    59 destructor.
     68Type objects are also simple in to generate, they should just be global
     69(program lifetime) structures. Getting there to be exactly one instance of
     70each allows the pointer to the structure to be used as the type id, and that
     71should be possible to do during linking.
    6072
    6173
     
    94106If unions are declared tagged instead of creating a new tagged type, all
    95107possible values of the union must be of that tagged type or a child type.
     108
     109
     110Custom Type Objects (Extention):
     111
     112Some method to define type objects used within a tree of types. One option is
     113to allow the tree's type object to be specified by the tree root. It would
     114then have to be filled in for each type in the tree, including the root.
     115
     116The only required field is the parent field, a pointer to the type object's
     117type. (This is also the only required field on the tagged structure itself.)
     118
     119A further extention could allow expanding type objects, so child types could
     120append fields to their parent's feild list. They might need their own type
     121objects at that point, or maybe static checks will be enough to see the
     122minimum field list.
  • src/CodeGen/FixNames.cc

    r2a7b3ca r949934e  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jun 21 14:22:59 2017
    13 // Update Count     : 19
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Jun 28 15:26:00 2017
     13// Update Count     : 20
    1414//
    1515
     
    9393        void FixNames::fixDWT( DeclarationWithType *dwt ) {
    9494                if ( dwt->get_name() != "" ) {
    95                         if ( LinkageSpec::isDecoratable( dwt->get_linkage() ) ) {
     95                        if ( LinkageSpec::isMangled( dwt->get_linkage() ) ) {
    9696                                dwt->set_mangleName( SymTab::Mangler::mangle( dwt ) );
    9797                                dwt->set_scopeLevel( scopeLevel );
  • src/ControlStruct/ExceptTranslate.cc

    r2a7b3ca r949934e  
    1010// Created On       : Wed Jun 14 16:49:00 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Thr Jun 22 15:57:00 2017
    13 // Update Count     : 0
     12// Last Modified On : Thr Jun 29 15:18:00 2017
     13// Update Count     : 1
    1414//
    1515
    1616#include "ExceptTranslate.h"
    1717#include "Common/PassVisitor.h"
     18#include "SynTree/Statement.h"
     19#include "SynTree/Declaration.h"
     20#include "SynTree/Expression.h"
     21#include "SynTree/Type.h"
     22#include "SynTree/Attribute.h"
    1823
    1924namespace ControlFlow {
     
    3439
    3540        static void init_func_types() {
    36                 static init_complete = false;
     41                static bool init_complete = false;
    3742                if (init_complete) {
    3843                        return;
    3944                }
    4045                ObjectDecl index_obj(
    41                         "index_t",
     46                        "__handler_index",
    4247                        Type::StorageClasses(),
    4348                        LinkageSpec::Cforall,
     
    4752                );
    4853                ObjectDecl exception_obj(
    49                         "exception_t",
     54                        "__exception_inst",
    5055                        Type::StorageClasses(),
    5156                        LinkageSpec::Cforall,
     
    5560                );
    5661                ObjectDecl bool_obj(
    57                         "bool_t",
     62                        "__ret_bool",
    5863                        Type::StorageClasses(),
    5964                        LinkageSpec::Cforall,
     
    8085                    CatchList& resHandlers ) {
    8186                while ( !allHandlers.empty() ) {
    82                         Statement * stmt = allHandlers.front();
     87                        CatchStmt * stmt = allHandlers.front();
    8388                        allHandlers.pop_front();
    84                         if (CaseStmt::Terminate == stmt->get_kind()) {
     89                        if (CatchStmt::Terminate == stmt->get_kind()) {
    8590                                terHandlers.push_back(stmt);
    8691                        } else {
     
    9297        template<typename T>
    9398        void free_all( std::list<T *> &list ) {
    94                 std::list<T *>::iterator it;
     99                typename std::list<T *>::iterator it;
    95100                for ( it = list.begin() ; it != list.end() ; ++it ) {
    96101                        delete *it;
     
    100105
    101106        void appendDeclStmt( CompoundStmt * block, Declaration * item ) {
    102                 block->push_back(new DeclStmt(no_labels, item));
    103         }
    104 
    105         Expression * nameOf( FunctionDecl * function ) {
    106                 return new VariableExpr( function );
     107                block->push_back(new DeclStmt(noLabels, item));
     108        }
     109
     110        Expression * nameOf( DeclarationWithType * decl ) {
     111                return new VariableExpr( decl );
    107112        }
    108113
     
    111116        Statement * create_terminate_throw( ThrowStmt *throwStmt ) {
    112117                // __throw_terminate( EXPR );
    113                 ApplicationExpr * call = new ApplicationExpr( /* ... */ );
    114                 call->get_args.push_back( throwStmt->get_expr() );
     118                UntypedExpr * call = new UntypedExpr( new NameExpr(
     119                        "__cfaehm__throw_termination" ) );
     120                call->get_args().push_back( throwStmt->get_expr() );
    115121                Statement * result = new ExprStmt( throwStmt->get_labels(), call );
    116122                throwStmt->set_expr( nullptr );
     
    120126        Statement * create_terminate_rethrow( ThrowStmt *throwStmt ) {
    121127                // __rethrow_terminate();
     128                assert( nullptr == throwStmt->get_expr() );
    122129                Statement * result = new ExprStmt(
    123130                        throwStmt->get_labels(),
    124                         new ApplicationExpr( /* ... */ );
     131                        new UntypedExpr( new NameExpr( "__cfaehm__rethrow_termination" ) )
    125132                        );
    126133                delete throwStmt;
     
    129136        Statement * create_resume_throw( ThrowStmt *throwStmt ) {
    130137                // __throw_resume( EXPR );
    131                 ApplicationExpr * call = new ApplicationExpr( /* ... */ );
    132                 call->get_args.push_back( throwStmt->get_expr() );
     138                UntypedExpr * call = new UntypedExpr( new NameExpr(
     139                        "__cfaehm__throw_resumption" ) );
     140                call->get_args().push_back( throwStmt->get_expr() );
    133141                Statement * result = new ExprStmt( throwStmt->get_labels(), call );
    134142                throwStmt->set_expr( nullptr );
     
    140148                Statement * result = new ReturnStmt(
    141149                        throwStmt->get_labels(),
    142                         new ConstantExpr(
    143                                 Constant(
    144                                         new BasicType(
    145                                                 Type::Qualifiers(),
    146                                                 BasicType::Bool
    147                                                 ),
    148                                         "0")
    149                                 )
     150                        new ConstantExpr( Constant::from_bool( false ) )
    150151                        );
    151152                delete throwStmt;
     
    160161                return block;
    161162        }
    162         FunctionDecl * create_try_wrapper( TryStmt *tryStmt ) {
    163                 CompoundStmt * body = base_try->get_block();
    164                 base_try->set_block(nullptr);
    165 
    166                 return new FunctionDecl("try", Type::StorageClasses(),
    167                         LinkageSpec::Cforall, void_func_t, body);
     163        FunctionDecl * create_try_wrapper( CompoundStmt *body ) {
     164
     165                return new FunctionDecl( "try", Type::StorageClasses(),
     166                        LinkageSpec::Cforall, void_func_t.clone(), body );
    168167        }
    169168
    170169        FunctionDecl * create_terminate_catch( CatchList &handlers ) {
    171170                std::list<CaseStmt *> handler_wrappers;
     171
     172                FunctionType *func_type = catch_func_t.clone();
     173                DeclarationWithType * index_obj = func_type->get_parameters().front();
     174        //      DeclarationWithType * except_obj = func_type->get_parameters().back();
    172175
    173176                // Index 1..{number of handlers}
     
    178181                        CatchStmt * handler = *it;
    179182
    180                         std::list<Statement *> core;
    181                         if ( /*the exception is named*/ ) {
    182                                 ObjectDecl * local_except = /* Dynamic case, same */;
    183                                 core->push_back( new DeclStmt( noLabel, local_except ) );
    184                         }
    185                         // Append the provided statement to the handler.
    186                         core->push_back( cur_handler->get_body() );
    187                         // Append return onto the inner block? case stmt list?
    188                         CaseStmt * wrapper = new CaseStmt(
     183                        // INTEGERconstant Version
     184                        // case `index`:
     185                        // {
     186                        //     `handler.body`
     187                        // }
     188                        // return;
     189                        std::list<Statement *> caseBody;
     190                        caseBody.push_back( handler->get_body() );
     191                        handler->set_body( nullptr );
     192                        caseBody.push_back( new ReturnStmt( noLabels, nullptr ) );
     193
     194                        handler_wrappers.push_back( new CaseStmt(
    189195                                noLabels,
    190196                                new ConstantExpr( Constant::from_int( index ) ),
    191                                 core
    192                                 );
    193                         handler_wrappers.push_back(wrapper);
     197                                caseBody
     198                                ) );
    194199                }
    195200                // TODO: Some sort of meaningful error on default perhaps?
     201
     202                std::list<Statement*> stmt_handlers;
     203                while ( !handler_wrappers.empty() ) {
     204                        stmt_handlers.push_back( handler_wrappers.front() );
     205                        handler_wrappers.pop_front();
     206                }
    196207
    197208                SwitchStmt * handler_lookup = new SwitchStmt(
    198209                        noLabels,
    199                         /*parameter 0: index*/,
    200                         handler_wrappers,
    201                         false
     210                        nameOf( index_obj ),
     211                        stmt_handlers
    202212                        );
    203213                CompoundStmt * body = new CompoundStmt( noLabels );
     
    205215
    206216                return new FunctionDecl("catch", Type::StorageClasses(),
    207                         LinkageSpec::Cforall, catch_func_t, body);
     217                        LinkageSpec::Cforall, func_type, body);
    208218        }
    209219
    210220        // Create a single check from a moddified handler.
    211         CompoundStmt *create_single_matcher( CatchStmt * modded_handler ) {
    212                 CompoundStmt * block = new CompoundStmt( noLables );
    213 
    214                 appendDeclStmt( block, modded_handler->get_decl() );
    215 
    216                 // TODO: This is not the actual check.
    217                 LogicalExpr * cond = new ConstantExpr( Constant::from_bool( false ) );
     221        // except_obj is referenced, modded_handler will be freed.
     222        CompoundStmt *create_single_matcher(
     223                        DeclarationWithType * except_obj, CatchStmt * modded_handler ) {
     224                CompoundStmt * block = new CompoundStmt( noLabels );
     225
     226                // INTEGERconstant Version
     227                assert( nullptr == modded_handler->get_decl() );
     228                ConstantExpr * number =
     229                        dynamic_cast<ConstantExpr*>( modded_handler->get_cond() );
     230                assert( number );
     231                modded_handler->set_cond( nullptr );
     232
     233                Expression * cond;
     234                {
     235                        std::list<Expression *> args;
     236                        args.push_back( number );
     237                        args.push_back( nameOf( except_obj ) );
     238                        cond = new UntypedExpr( new NameExpr( "?==?" /*???*/), args );
     239                }
    218240
    219241                if ( modded_handler->get_cond() ) {
    220                         cond = new LogicalExpr( cond, modded_handler->get_cond() )q
     242                        cond = new LogicalExpr( cond, modded_handler->get_cond() );
    221243                }
    222244                block->push_back( new IfStmt( noLabels,
    223                         cond, modded_handler->get_body() );
     245                        cond, modded_handler->get_body(), nullptr ) );
    224246
    225247                modded_handler->set_decl( nullptr );
     
    232254        FunctionDecl * create_terminate_match( CatchList &handlers ) {
    233255                CompoundStmt * body = new CompoundStmt( noLabels );
     256
     257                FunctionType * func_type = match_func_t.clone();
     258                DeclarationWithType * except_obj = func_type->get_parameters().back();
    234259
    235260                // Index 1..{number of handlers}
     
    240265                        CatchStmt * handler = *it;
    241266
    242                         // body should have been taken by create_terminate_catch.
    243                         // assert( nullptr == handler->get_body() );
     267                        // Body should have been taken by create_terminate_catch.
     268                        assert( nullptr == handler->get_body() );
     269
     270                        // Create new body.
    244271                        handler->set_body( new ReturnStmt( noLabels,
    245272                                new ConstantExpr( Constant::from_int( index ) ) ) );
    246273
    247                         body->push_back( create_single_matcher( handler ) );
     274                        // Create the handler.
     275                        body->push_back( create_single_matcher( except_obj, handler ) );
     276                        *it = nullptr;
    248277                }
    249278
    250279                return new FunctionDecl("match", Type::StorageClasses(),
    251                         LinkageSpec::Cforall, match_func_t, body);
    252         }
    253 
    254         Statement * create_terminate_caller(
     280                        LinkageSpec::Cforall, func_type, body);
     281        }
     282
     283        CompoundStmt * create_terminate_caller(
    255284                        FunctionDecl * try_wrapper,
    256285                        FunctionDecl * terminate_catch,
    257286                        FunctionDecl * terminate_match) {
    258287
    259                 ApplicationExpr * caller = new ApplicationExpr( /* ... */ );
    260                 std::list<Expression *>& args = caller.get_args();
     288                UntypedExpr * caller = new UntypedExpr( new NameExpr(
     289                        "__cfaehm__try_terminate" ) );
     290                std::list<Expression *>& args = caller->get_args();
    261291                args.push_back( nameOf( try_wrapper ) );
    262292                args.push_back( nameOf( terminate_catch ) );
    263293                args.push_back( nameOf( terminate_match ) );
    264294
    265                 return new ExprStmt( noLabels, caller );
     295                CompoundStmt * callStmt = new CompoundStmt( noLabels );
     296                callStmt->push_back( new ExprStmt( noLabels, caller ) );
     297                return callStmt;
    266298        }
    267299
    268300        FunctionDecl * create_resume_handler( CatchList &handlers ) {
    269                 CompoundStmt * body = new CompountStmt( noLabels );
     301                CompoundStmt * body = new CompoundStmt( noLabels );
     302
     303                FunctionType * func_type = match_func_t.clone();
     304                DeclarationWithType * except_obj = func_type->get_parameters().back();
    270305
    271306                CatchList::iterator it;
     
    280315                                handling_code->push_back( handler->get_body() );
    281316                        }
    282                         handling_code->push_back( new ReturnStmt( noLabel,
     317                        handling_code->push_back( new ReturnStmt( noLabels,
    283318                                new ConstantExpr( Constant::from_bool( false ) ) ) );
    284319                        handler->set_body( handling_code );
    285320
    286321                        // Create the handler.
    287                         body->push_back( create_single_matcher( handler ) );
     322                        body->push_back( create_single_matcher( except_obj, handler ) );
     323                        *it = nullptr;
    288324                }
    289325
    290326                return new FunctionDecl("handle", Type::StorageClasses(),
    291                         LinkageSpec::Cforall, handle_func_t, body);
    292         }
    293 
    294         Statement * create_resume_wrapper(
     327                        LinkageSpec::Cforall, func_type, body);
     328        }
     329
     330        CompoundStmt * create_resume_wrapper(
     331                        StructDecl * node_decl,
    295332                        Statement * wraps,
    296333                        FunctionDecl * resume_handler ) {
    297334                CompoundStmt * body = new CompoundStmt( noLabels );
    298335
    299                 // struct node = {current top resume handler, call to resume_handler};
    300                 // __attribute__((cleanup( ... )));
    301                 // set top resume handler to node.
    302                 // The wrapped statement.
    303 
    304                 ListInit * node_init;
    305                 {
    306                         std::list<Initializer*> field_inits;
    307                         field_inits.push_back( new SingleInit( /* ... */ ) );
    308                         field_inits.push_back( new SingleInit( nameOf( resume_handler ) ) );
    309                         node_init = new ListInit( field_inits );
    310                 }
     336                // struct __try_resume_node __resume_node
     337                //      __attribute__((cleanup( __cfaehm__try_resume_cleanup )));
     338                // ** unwinding of the stack here could cause problems **
     339                // ** however I don't think that can happen currently **
     340                // __cfaehm__try_resume_setup( &__resume_node, resume_handler );
    311341
    312342                std::list< Attribute * > attributes;
    313343                {
    314344                        std::list< Expression * > attr_params;
    315                         attr_params.push_back( nameOf( /* ... deconstructor ... */ ) );
    316                         attrributes.push_back( new Attribute( "cleanup", attr_params ) );
    317                 }
    318 
    319                 appendDeclStmt( body,
    320                 /**/ ObjectDecl(
    321                         "resume_node",
     345                        attr_params.push_back( new NameExpr(
     346                                "__cfaehm__try_resume_cleanup" ) );
     347                        attributes.push_back( new Attribute( "cleanup", attr_params ) );
     348                }
     349
     350                ObjectDecl * obj = new ObjectDecl(
     351                        "__resume_node",
    322352                        Type::StorageClasses(),
    323353                        LinkageSpec::Cforall,
    324354                        nullptr,
    325                         /* Type* = resume_node */,
    326                         node_init,
     355                        new StructInstType(
     356                                Type::Qualifiers(),
     357                                node_decl
     358                                ),
     359                        nullptr,
    327360                        attributes
    328                         )
    329                 );
     361                        );
     362                appendDeclStmt( body, obj );
     363
     364                UntypedExpr *setup = new UntypedExpr( new NameExpr(
     365                        "__cfaehm__try_resume_setup" ) );
     366                setup->get_args().push_back( nameOf( obj ) );
     367                setup->get_args().push_back( nameOf( resume_handler ) );
     368
     369                body->push_back( new ExprStmt( noLabels, setup ) );
     370
    330371                body->push_back( wraps );
    331372                return body;
     
    333374
    334375        FunctionDecl * create_finally_wrapper( TryStmt * tryStmt ) {
    335                 CompoundStmt * body = tryStmt->get_finally();
     376                FinallyStmt * finally = tryStmt->get_finally();
     377                CompoundStmt * body = finally->get_block();
     378                finally->set_block( nullptr );
     379                delete finally;
    336380                tryStmt->set_finally( nullptr );
    337381
    338382                return new FunctionDecl("finally", Type::StorageClasses(),
    339                         LinkageSpec::Cforall, void_func_t, body);
    340         }
    341 
    342         ObjectDecl * create_finally_hook( FunctionDecl * finally_wrapper ) {
    343                 // struct _cleanup_hook NAME __attribute__((cleanup( ... )));
     383                        LinkageSpec::Cforall, void_func_t.clone(), body);
     384        }
     385
     386        ObjectDecl * create_finally_hook(
     387                        StructDecl * hook_decl, FunctionDecl * finally_wrapper ) {
     388                // struct __cfaehm__cleanup_hook __finally_hook
     389                //      __attribute__((cleanup( finally_wrapper )));
    344390
    345391                // Make Cleanup Attribute.
     
    348394                        std::list< Expression * > attr_params;
    349395                        attr_params.push_back( nameOf( finally_wrapper ) );
    350                         attrributes.push_back( new Attribute( "cleanup", attr_params ) );
    351                 }
    352 
    353                 return ObjectDecl( /* ... */
    354                         const std::string &name "finally_hook",
     396                        attributes.push_back( new Attribute( "cleanup", attr_params ) );
     397                }
     398
     399                return new ObjectDecl(
     400                        "__finally_hook",
    355401                        Type::StorageClasses(),
    356402                        LinkageSpec::Cforall,
    357403                        nullptr,
    358                         /* ... Type * ... */,
     404                        new StructInstType(
     405                                emptyQualifiers,
     406                                hook_decl
     407                                ),
    359408                        nullptr,
    360409                        attributes
     
    363412
    364413
    365         class ExceptionMutatorCore : public WithScoping {
     414        class ExceptionMutatorCore : public WithScopes {
    366415                enum Context { NoHandler, TerHandler, ResHandler };
    367416
     
    370419                // loop, switch or the goto stays within the function.
    371420
    372                 Context curContext;
     421                Context cur_context;
    373422
    374423                // We might not need this, but a unique base for each try block's
     
    377426                //unsigned int try_count = 0;
    378427
     428                StructDecl *node_decl;
     429                StructDecl *hook_decl;
    379430
    380431        public:
    381432                ExceptionMutatorCore() :
    382                         curContext(NoHandler)
     433                        cur_context(NoHandler),
     434                        node_decl(nullptr), hook_decl(nullptr)
    383435                {}
    384436
    385                 void premutate( CatchStmt *tryStmt );
     437                void premutate( CatchStmt *catchStmt );
     438                void premutate( StructDecl *structDecl );
    386439                Statement * postmutate( ThrowStmt *throwStmt );
    387440                Statement * postmutate( TryStmt *tryStmt );
     
    393446                        if ( throwStmt->get_expr() ) {
    394447                                return create_terminate_throw( throwStmt );
    395                         } else if ( TerHandler == curContext ) {
     448                        } else if ( TerHandler == cur_context ) {
    396449                                return create_terminate_rethrow( throwStmt );
    397450                        } else {
    398451                                assertf(false, "Invalid throw in %s at %i\n",
    399                                         throwStmt->location.filename,
     452                                        throwStmt->location.filename.c_str(),
    400453                                        throwStmt->location.linenumber);
    401454                                return nullptr;
     
    404457                        if ( throwStmt->get_expr() ) {
    405458                                return create_resume_throw( throwStmt );
    406                         } else if ( ResHandler == curContext ) {
     459                        } else if ( ResHandler == cur_context ) {
    407460                                return create_resume_rethrow( throwStmt );
    408461                        } else {
    409462                                assertf(false, "Invalid throwResume in %s at %i\n",
    410                                         throwStmt->location.filename,
     463                                        throwStmt->location.filename.c_str(),
    411464                                        throwStmt->location.linenumber);
    412465                                return nullptr;
     
    416469
    417470        Statement * ExceptionMutatorCore::postmutate( TryStmt *tryStmt ) {
     471                assert( node_decl );
     472                assert( hook_decl );
     473
    418474                // Generate a prefix for the function names?
    419475
    420                 CompoundStmt * block = new CompoundStmt();
    421                 Statement * inner = take_try_block( tryStmt );
     476                CompoundStmt * block = new CompoundStmt( noLabels );
     477                CompoundStmt * inner = take_try_block( tryStmt );
    422478
    423479                if ( tryStmt->get_finally() ) {
     
    427483                        appendDeclStmt( block, finally_block );
    428484                        // Create and add the finally cleanup hook.
    429                         appendDeclStmt( block, create_finally_hook( finally_block ) );
    430                 }
    431 
    432                 StatementList termination_handlers;
    433                 StatementList resumption_handlers;
    434                 split( tryStmt->get_handlers(),
     485                        appendDeclStmt( block,
     486                                create_finally_hook( hook_decl, finally_block ) );
     487                }
     488
     489                CatchList termination_handlers;
     490                CatchList resumption_handlers;
     491                split( tryStmt->get_catchers(),
    435492                       termination_handlers, resumption_handlers );
    436493
    437                 if ( resumeption_handlers.size() ) {
     494                if ( resumption_handlers.size() ) {
    438495                        // Define the helper function.
    439496                        FunctionDecl * resume_handler =
     
    441498                        appendDeclStmt( block, resume_handler );
    442499                        // Prepare hooks
    443                         inner = create_resume_wrapper( inner, resume_handler );
     500                        inner = create_resume_wrapper( node_decl, inner, resume_handler );
    444501                }
    445502
     
    462519                block->push_back( inner );
    463520
    464                 free_all( termination_handlers );
    465                 free_all( resumption_handlers );
     521                //free_all( termination_handlers );
     522                //free_all( resumption_handlers );
    466523
    467524                return block;
     
    469526
    470527        void ExceptionMutatorCore::premutate( CatchStmt *catchStmt ) {
    471                 GuardValue( curContext );
    472                 if ( CatchStmt::Termination == catchStmt->get_kind() ) {
    473                         curContext = TerHandler;
     528                GuardValue( cur_context );
     529                if ( CatchStmt::Terminate == catchStmt->get_kind() ) {
     530                        cur_context = TerHandler;
    474531                } else {
    475                         curContext = ResHandler;
    476                 }
     532                        cur_context = ResHandler;
     533                }
     534        }
     535
     536        void ExceptionMutatorCore::premutate( StructDecl *structDecl ) {
     537                if ( !structDecl->has_body() ) {
     538                        // Skip children?
     539                        return;
     540                } else if ( structDecl->get_name() == "__cfaehm__try_resume_node" ) {
     541                        assert( nullptr == node_decl );
     542                        node_decl = structDecl;
     543                } else if ( structDecl->get_name() == "__cfaehm__cleanup_hook" ) {
     544                        assert( nullptr == hook_decl );
     545                        hook_decl = structDecl;
     546                }
     547                // Later we might get the exception type as well.
    477548        }
    478549
    479550    void translateEHM( std::list< Declaration *> & translationUnit ) {
     551                init_func_types();
     552
    480553                PassVisitor<ExceptionMutatorCore> translator;
    481554                for ( Declaration * decl : translationUnit ) {
    482                         decl->mutate( translator );
     555                        decl->acceptMutator( translator );
    483556                }
    484557        }
  • src/ControlStruct/ExceptTranslate.h

    r2a7b3ca r949934e  
    1010// Created On       : Tus Jun 06 10:13:00 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Thr Jun 22 15:57:00 2017
    13 // Update Count     : 0
     12// Last Modified On : Thr Jun 29 15:18:00 2017
     13// Update Count     : 1
    1414//
    1515
    1616#ifndef EXCEPT_TRANSLATE_H
    1717#define EXCEPT_TRANSLATE_H
     18
     19#include <list>
     20#include "SynTree/SynTree.h"
    1821
    1922namespace ControlFlow {
  • src/ControlStruct/module.mk

    r2a7b3ca r949934e  
    1010## Author           : Richard C. Bilson
    1111## Created On       : Mon Jun  1 17:49:17 2015
    12 ## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Thu Aug  4 11:38:06 2016
    14 ## Update Count     : 3
     12## Last Modified By : Andrew Beach
     13## Last Modified On : Wed Jun 28 16:15:00 2017
     14## Update Count     : 4
    1515###############################################################################
    1616
    1717SRC +=  ControlStruct/LabelGenerator.cc \
    1818        ControlStruct/LabelFixer.cc \
    19         ControlStruct/MLEMutator.cc \
     19        ControlStruct/MLEMutator.cc \
    2020        ControlStruct/Mutate.cc \
    21         ControlStruct/ForExprMutator.cc
    22 
     21        ControlStruct/ForExprMutator.cc \
     22        ControlStruct/ExceptTranslate.cc
  • src/Makefile.in

    r2a7b3ca r949934e  
    119119        ControlStruct/driver_cfa_cpp-Mutate.$(OBJEXT) \
    120120        ControlStruct/driver_cfa_cpp-ForExprMutator.$(OBJEXT) \
     121        ControlStruct/driver_cfa_cpp-ExceptTranslate.$(OBJEXT) \
    121122        GenPoly/driver_cfa_cpp-Box.$(OBJEXT) \
    122123        GenPoly/driver_cfa_cpp-GenPoly.$(OBJEXT) \
     
    143144        Parser/driver_cfa_cpp-TypeData.$(OBJEXT) \
    144145        Parser/driver_cfa_cpp-LinkageSpec.$(OBJEXT) \
    145         Parser/driver_cfa_cpp-parseutility.$(OBJEXT) \
     146        Parser/driver_cfa_cpp-parserutility.$(OBJEXT) \
    146147        ResolvExpr/driver_cfa_cpp-AlternativeFinder.$(OBJEXT) \
    147148        ResolvExpr/driver_cfa_cpp-Alternative.$(OBJEXT) \
     
    394395        ControlStruct/LabelGenerator.cc ControlStruct/LabelFixer.cc \
    395396        ControlStruct/MLEMutator.cc ControlStruct/Mutate.cc \
    396         ControlStruct/ForExprMutator.cc GenPoly/Box.cc \
     397        ControlStruct/ForExprMutator.cc \
     398        ControlStruct/ExceptTranslate.cc GenPoly/Box.cc \
    397399        GenPoly/GenPoly.cc GenPoly/PolyMutator.cc \
    398400        GenPoly/ScrubTyVars.cc GenPoly/Lvalue.cc GenPoly/Specialize.cc \
     
    405407        Parser/ExpressionNode.cc Parser/StatementNode.cc \
    406408        Parser/InitializerNode.cc Parser/TypeData.cc \
    407         Parser/LinkageSpec.cc Parser/parseutility.cc \
     409        Parser/LinkageSpec.cc Parser/parserutility.cc \
    408410        ResolvExpr/AlternativeFinder.cc ResolvExpr/Alternative.cc \
    409411        ResolvExpr/Unify.cc ResolvExpr/PtrsAssignable.cc \
     
    594596        ControlStruct/$(am__dirstamp) \
    595597        ControlStruct/$(DEPDIR)/$(am__dirstamp)
     598ControlStruct/driver_cfa_cpp-ExceptTranslate.$(OBJEXT):  \
     599        ControlStruct/$(am__dirstamp) \
     600        ControlStruct/$(DEPDIR)/$(am__dirstamp)
    596601GenPoly/$(am__dirstamp):
    597602        @$(MKDIR_P) GenPoly
     
    663668Parser/driver_cfa_cpp-LinkageSpec.$(OBJEXT): Parser/$(am__dirstamp) \
    664669        Parser/$(DEPDIR)/$(am__dirstamp)
    665 Parser/driver_cfa_cpp-parseutility.$(OBJEXT): Parser/$(am__dirstamp) \
     670Parser/driver_cfa_cpp-parserutility.$(OBJEXT): Parser/$(am__dirstamp) \
    666671        Parser/$(DEPDIR)/$(am__dirstamp)
    667672ResolvExpr/$(am__dirstamp):
     
    853858        -rm -f Common/driver_cfa_cpp-UniqueName.$(OBJEXT)
    854859        -rm -f Concurrency/driver_cfa_cpp-Keywords.$(OBJEXT)
     860        -rm -f ControlStruct/driver_cfa_cpp-ExceptTranslate.$(OBJEXT)
    855861        -rm -f ControlStruct/driver_cfa_cpp-ForExprMutator.$(OBJEXT)
    856862        -rm -f ControlStruct/driver_cfa_cpp-LabelFixer.$(OBJEXT)
     
    882888        -rm -f Parser/driver_cfa_cpp-lex.$(OBJEXT)
    883889        -rm -f Parser/driver_cfa_cpp-parser.$(OBJEXT)
    884         -rm -f Parser/driver_cfa_cpp-parseutility.$(OBJEXT)
     890        -rm -f Parser/driver_cfa_cpp-parserutility.$(OBJEXT)
    885891        -rm -f ResolvExpr/driver_cfa_cpp-AdjustExprType.$(OBJEXT)
    886892        -rm -f ResolvExpr/driver_cfa_cpp-Alternative.$(OBJEXT)
     
    965971@AMDEP_TRUE@@am__include@ @am__quote@Common/$(DEPDIR)/driver_cfa_cpp-UniqueName.Po@am__quote@
    966972@AMDEP_TRUE@@am__include@ @am__quote@Concurrency/$(DEPDIR)/driver_cfa_cpp-Keywords.Po@am__quote@
     973@AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-ExceptTranslate.Po@am__quote@
    967974@AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-ForExprMutator.Po@am__quote@
    968975@AMDEP_TRUE@@am__include@ @am__quote@ControlStruct/$(DEPDIR)/driver_cfa_cpp-LabelFixer.Po@am__quote@
     
    9941001@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-lex.Po@am__quote@
    9951002@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-parser.Po@am__quote@
    996 @AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Po@am__quote@
     1003@AMDEP_TRUE@@am__include@ @am__quote@Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Po@am__quote@
    9971004@AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-AdjustExprType.Po@am__quote@
    9981005@AMDEP_TRUE@@am__include@ @am__quote@ResolvExpr/$(DEPDIR)/driver_cfa_cpp-Alternative.Po@am__quote@
     
    13551362@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ControlStruct/driver_cfa_cpp-ForExprMutator.obj `if test -f 'ControlStruct/ForExprMutator.cc'; then $(CYGPATH_W) 'ControlStruct/ForExprMutator.cc'; else $(CYGPATH_W) '$(srcdir)/ControlStruct/ForExprMutator.cc'; fi`
    13561363
     1364ControlStruct/driver_cfa_cpp-ExceptTranslate.o: ControlStruct/ExceptTranslate.cc
     1365@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ControlStruct/driver_cfa_cpp-ExceptTranslate.o -MD -MP -MF ControlStruct/$(DEPDIR)/driver_cfa_cpp-ExceptTranslate.Tpo -c -o ControlStruct/driver_cfa_cpp-ExceptTranslate.o `test -f 'ControlStruct/ExceptTranslate.cc' || echo '$(srcdir)/'`ControlStruct/ExceptTranslate.cc
     1366@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) ControlStruct/$(DEPDIR)/driver_cfa_cpp-ExceptTranslate.Tpo ControlStruct/$(DEPDIR)/driver_cfa_cpp-ExceptTranslate.Po
     1367@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='ControlStruct/ExceptTranslate.cc' object='ControlStruct/driver_cfa_cpp-ExceptTranslate.o' libtool=no @AMDEPBACKSLASH@
     1368@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1369@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ControlStruct/driver_cfa_cpp-ExceptTranslate.o `test -f 'ControlStruct/ExceptTranslate.cc' || echo '$(srcdir)/'`ControlStruct/ExceptTranslate.cc
     1370
     1371ControlStruct/driver_cfa_cpp-ExceptTranslate.obj: ControlStruct/ExceptTranslate.cc
     1372@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT ControlStruct/driver_cfa_cpp-ExceptTranslate.obj -MD -MP -MF ControlStruct/$(DEPDIR)/driver_cfa_cpp-ExceptTranslate.Tpo -c -o ControlStruct/driver_cfa_cpp-ExceptTranslate.obj `if test -f 'ControlStruct/ExceptTranslate.cc'; then $(CYGPATH_W) 'ControlStruct/ExceptTranslate.cc'; else $(CYGPATH_W) '$(srcdir)/ControlStruct/ExceptTranslate.cc'; fi`
     1373@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) ControlStruct/$(DEPDIR)/driver_cfa_cpp-ExceptTranslate.Tpo ControlStruct/$(DEPDIR)/driver_cfa_cpp-ExceptTranslate.Po
     1374@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='ControlStruct/ExceptTranslate.cc' object='ControlStruct/driver_cfa_cpp-ExceptTranslate.obj' libtool=no @AMDEPBACKSLASH@
     1375@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1376@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o ControlStruct/driver_cfa_cpp-ExceptTranslate.obj `if test -f 'ControlStruct/ExceptTranslate.cc'; then $(CYGPATH_W) 'ControlStruct/ExceptTranslate.cc'; else $(CYGPATH_W) '$(srcdir)/ControlStruct/ExceptTranslate.cc'; fi`
     1377
    13571378GenPoly/driver_cfa_cpp-Box.o: GenPoly/Box.cc
    13581379@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT GenPoly/driver_cfa_cpp-Box.o -MD -MP -MF GenPoly/$(DEPDIR)/driver_cfa_cpp-Box.Tpo -c -o GenPoly/driver_cfa_cpp-Box.o `test -f 'GenPoly/Box.cc' || echo '$(srcdir)/'`GenPoly/Box.cc
     
    16911712@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Parser/driver_cfa_cpp-LinkageSpec.obj `if test -f 'Parser/LinkageSpec.cc'; then $(CYGPATH_W) 'Parser/LinkageSpec.cc'; else $(CYGPATH_W) '$(srcdir)/Parser/LinkageSpec.cc'; fi`
    16921713
    1693 Parser/driver_cfa_cpp-parseutility.o: Parser/parseutility.cc
    1694 @am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/driver_cfa_cpp-parseutility.o -MD -MP -MF Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Tpo -c -o Parser/driver_cfa_cpp-parseutility.o `test -f 'Parser/parseutility.cc' || echo '$(srcdir)/'`Parser/parseutility.cc
    1695 @am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Tpo Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Po
    1696 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Parser/parseutility.cc' object='Parser/driver_cfa_cpp-parseutility.o' libtool=no @AMDEPBACKSLASH@
    1697 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1698 @am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Parser/driver_cfa_cpp-parseutility.o `test -f 'Parser/parseutility.cc' || echo '$(srcdir)/'`Parser/parseutility.cc
    1699 
    1700 Parser/driver_cfa_cpp-parseutility.obj: Parser/parseutility.cc
    1701 @am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/driver_cfa_cpp-parseutility.obj -MD -MP -MF Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Tpo -c -o Parser/driver_cfa_cpp-parseutility.obj `if test -f 'Parser/parseutility.cc'; then $(CYGPATH_W) 'Parser/parseutility.cc'; else $(CYGPATH_W) '$(srcdir)/Parser/parseutility.cc'; fi`
    1702 @am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Tpo Parser/$(DEPDIR)/driver_cfa_cpp-parseutility.Po
    1703 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Parser/parseutility.cc' object='Parser/driver_cfa_cpp-parseutility.obj' libtool=no @AMDEPBACKSLASH@
    1704 @AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
    1705 @am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Parser/driver_cfa_cpp-parseutility.obj `if test -f 'Parser/parseutility.cc'; then $(CYGPATH_W) 'Parser/parseutility.cc'; else $(CYGPATH_W) '$(srcdir)/Parser/parseutility.cc'; fi`
     1714Parser/driver_cfa_cpp-parserutility.o: Parser/parserutility.cc
     1715@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/driver_cfa_cpp-parserutility.o -MD -MP -MF Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Tpo -c -o Parser/driver_cfa_cpp-parserutility.o `test -f 'Parser/parserutility.cc' || echo '$(srcdir)/'`Parser/parserutility.cc
     1716@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Tpo Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Po
     1717@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Parser/parserutility.cc' object='Parser/driver_cfa_cpp-parserutility.o' libtool=no @AMDEPBACKSLASH@
     1718@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1719@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Parser/driver_cfa_cpp-parserutility.o `test -f 'Parser/parserutility.cc' || echo '$(srcdir)/'`Parser/parserutility.cc
     1720
     1721Parser/driver_cfa_cpp-parserutility.obj: Parser/parserutility.cc
     1722@am__fastdepCXX_TRUE@   $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Parser/driver_cfa_cpp-parserutility.obj -MD -MP -MF Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Tpo -c -o Parser/driver_cfa_cpp-parserutility.obj `if test -f 'Parser/parserutility.cc'; then $(CYGPATH_W) 'Parser/parserutility.cc'; else $(CYGPATH_W) '$(srcdir)/Parser/parserutility.cc'; fi`
     1723@am__fastdepCXX_TRUE@   $(AM_V_at)$(am__mv) Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Tpo Parser/$(DEPDIR)/driver_cfa_cpp-parserutility.Po
     1724@AMDEP_TRUE@@am__fastdepCXX_FALSE@      $(AM_V_CXX)source='Parser/parserutility.cc' object='Parser/driver_cfa_cpp-parserutility.obj' libtool=no @AMDEPBACKSLASH@
     1725@AMDEP_TRUE@@am__fastdepCXX_FALSE@      DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
     1726@am__fastdepCXX_FALSE@  $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Parser/driver_cfa_cpp-parserutility.obj `if test -f 'Parser/parserutility.cc'; then $(CYGPATH_W) 'Parser/parserutility.cc'; else $(CYGPATH_W) '$(srcdir)/Parser/parserutility.cc'; fi`
    17061727
    17071728ResolvExpr/driver_cfa_cpp-AlternativeFinder.o: ResolvExpr/AlternativeFinder.cc
  • src/Parser/DeclarationNode.cc

    r2a7b3ca r949934e  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 12:34:05 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 17 15:46:33 2017
    13 // Update Count     : 1018
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Jun 28 15:27:00 2017
     13// Update Count     : 1019
    1414//
    1515
     
    10631063          case TypeData::Enum:
    10641064          case TypeData::Aggregate: {
    1065                   ReferenceToType * ret = buildComAggInst( type, attributes );
     1065                  ReferenceToType * ret = buildComAggInst( type, attributes, linkage );
    10661066                  buildList( type->aggregate.actuals, ret->get_parameters() );
    10671067                  return ret;
  • src/Parser/ExpressionNode.cc

    r2a7b3ca r949934e  
    1010// Created On       : Sat May 16 13:17:07 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jun 21 16:44:46 2017
    13 // Update Count     : 541
     12// Last Modified On : Wed Jun 28 21:08:15 2017
     13// Update Count     : 542
    1414//
    1515
     
    2727#include "SynTree/Declaration.h"
    2828#include "Common/UnimplementedError.h"
    29 #include "parseutility.h"
     29#include "parserutility.h"
    3030#include "Common/utility.h"
    3131
  • src/Parser/LinkageSpec.cc

    r2a7b3ca r949934e  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 13:22:09 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Oct  2 23:16:21 2016
    13 // Update Count     : 23
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Jun 28 11:51:00 2017
     13// Update Count     : 24
    1414//
    1515
     
    2828        } else if ( *spec == "\"C\"" ) {
    2929                return C;
     30        } else if ( *spec == "\"BuiltinC\"" ) {
     31                return BuiltinC;
    3032        } else {
    3133                throw SemanticError( "Invalid linkage specifier " + *spec );
     
    3638        assert( 0 <= linkage && linkage < LinkageSpec::NoOfSpecs );
    3739        static const char *linkageKinds[LinkageSpec::NoOfSpecs] = {
    38                 "intrinsic", "Cforall", "C", "automatically generated", "compiler built-in",
     40                "intrinsic", "Cforall", "C", "automatically generated", "compiler built-in", "cfa built-in", "c built-in",
    3941        };
    4042        return linkageKinds[linkage];
    4143}
    4244
    43 bool LinkageSpec::isDecoratable( Spec spec ) {
     45bool LinkageSpec::isMangled( Spec spec ) {
    4446        assert( 0 <= spec && spec < LinkageSpec::NoOfSpecs );
    4547        static bool decoratable[LinkageSpec::NoOfSpecs] = {
    46                 //      Intrinsic,      Cforall,        C,              AutoGen,        Compiler
     48                //      Intrinsic,      Cforall,        C,              AutoGen,        Compiler,
    4749                        true,           true,           false,  true,           false,
     50                //      Builtin,        BuiltinC,
     51                        true,           false,
    4852        };
    4953        return decoratable[spec];
     
    5357        assert( 0 <= spec && spec < LinkageSpec::NoOfSpecs );
    5458        static bool generatable[LinkageSpec::NoOfSpecs] = {
    55                 //      Intrinsic,      Cforall,        C,              AutoGen,        Compiler
     59                //      Intrinsic,      Cforall,        C,              AutoGen,        Compiler,
    5660                        true,           true,           true,   true,           false,
     61                //      Builtin,        BuiltinC,
     62                        true,           true,
    5763        };
    5864        return generatable[spec];
     
    6268        assert( spec >= 0 && spec < LinkageSpec::NoOfSpecs );
    6369        static bool overridable[LinkageSpec::NoOfSpecs] = {
    64                 //      Intrinsic,      Cforall,        C,              AutoGen,        Compiler
     70                //      Intrinsic,      Cforall,        C,              AutoGen,        Compiler,
    6571                        true,           false,          false,  true,           false,
     72                //      Builtin,        BuiltinC,
     73                        false,          false,
    6674        };
    6775        return overridable[spec];
     
    7179        assert( spec >= 0 && spec < LinkageSpec::NoOfSpecs );
    7280        static bool builtin[LinkageSpec::NoOfSpecs] = {
    73                 //      Intrinsic,      Cforall,        C,              AutoGen,        Compiler
     81                //      Intrinsic,      Cforall,        C,              AutoGen,        Compiler,
    7482                        true,           false,          false,  false,          true,
     83                //      Builtin,        BuiltinC,
     84                        true,           true,
    7585        };
    7686        return builtin[spec];
  • src/Parser/LinkageSpec.h

    r2a7b3ca r949934e  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 13:24:28 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Oct  1 23:03:17 2016
    13 // Update Count     : 11
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Jun 28 11:50:00 2017
     13// Update Count     : 12
    1414//
    1515
     
    2626                AutoGen,                                                                                // built by translator (struct assignment)
    2727                Compiler,                                                                               // gcc internal
     28                Builtin,                                                                                // mangled builtins
     29                BuiltinC,                                                                               // non-mangled builtins
    2830                NoOfSpecs
    2931        };
     
    3234        static std::string linkageName( Spec );
    3335 
    34         static bool isDecoratable( Spec );
     36        static bool isMangled( Spec );
    3537        static bool isGeneratable( Spec );
    3638        static bool isOverridable( Spec );
  • src/Parser/StatementNode.cc

    r2a7b3ca r949934e  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 14:59:41 2015
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Mon Jun 12 13:03:00 2017
    13 // Update Count     : 329
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Wed Jun 28 21:08:37 2017
     13// Update Count     : 330
    1414//
    1515
     
    2121#include "SynTree/Statement.h"
    2222#include "SynTree/Expression.h"
    23 #include "parseutility.h"
     23#include "parserutility.h"
    2424#include "Common/utility.h"
    2525
  • src/Parser/TypeData.cc

    r2a7b3ca r949934e  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 15:12:51 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 17 15:52:43 2017
    13 // Update Count     : 563
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Jun 28 15:28:00 2017
     13// Update Count     : 564
    1414//
    1515
     
    614614} // buildPointer
    615615
    616 AggregateDecl * buildAggregate( const TypeData * td, std::list< Attribute * > attributes ) {
     616AggregateDecl * buildAggregate( const TypeData * td, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) {
    617617        assert( td->kind == TypeData::Aggregate );
    618618        AggregateDecl * at;
     
    622622          case DeclarationNode::Monitor:
    623623          case DeclarationNode::Thread:
    624                 at = new StructDecl( *td->aggregate.name, td->aggregate.kind, attributes );
     624                at = new StructDecl( *td->aggregate.name, td->aggregate.kind, attributes, linkage );
    625625                buildForall( td->aggregate.params, at->get_parameters() );
    626626                break;
     
    643643} // buildAggregate
    644644
    645 ReferenceToType * buildComAggInst( const TypeData * type, std::list< Attribute * > attributes ) {
     645ReferenceToType * buildComAggInst( const TypeData * type, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) {
    646646        switch ( type->kind ) {
    647647          case TypeData::Enum: {
     
    656656                  ReferenceToType * ret;
    657657                  if ( type->aggregate.body ) {
    658                           AggregateDecl * typedecl = buildAggregate( type, attributes );
     658                          AggregateDecl * typedecl = buildAggregate( type, attributes, linkage );
    659659                          switch ( type->aggregate.kind ) {
    660660                                case DeclarationNode::Struct:
     
    802802                return decl->set_asmName( asmName );
    803803        } else if ( td->kind == TypeData::Aggregate ) {
    804                 return buildAggregate( td, attributes );
     804                return buildAggregate( td, attributes, linkage );
    805805        } else if ( td->kind == TypeData::Enum ) {
    806806                return buildEnum( td, attributes );
  • src/Parser/TypeData.h

    r2a7b3ca r949934e  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 15:18:36 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 16 08:32:39 2017
    13 // Update Count     : 185
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Jun 28 15:29:00 2017
     13// Update Count     : 186
    1414//
    1515
     
    102102ArrayType * buildArray( const TypeData * );
    103103AggregateDecl * buildAggregate( const TypeData *, std::list< Attribute * > );
    104 ReferenceToType * buildComAggInst( const TypeData *, std::list< Attribute * > attributes );
     104ReferenceToType * buildComAggInst( const TypeData *, std::list< Attribute * > attributes, LinkageSpec::Spec linkage );
    105105ReferenceToType * buildAggInst( const TypeData * );
    106106TypeDecl * buildVariable( const TypeData * );
  • src/Parser/TypedefTable.h

    r2a7b3ca r949934e  
    1010// Created On       : Sat May 16 15:24:36 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Aug 15 18:25:04 2016
    13 // Update Count     : 28
     12// Last Modified On : Wed Jun 28 21:56:34 2017
     13// Update Count     : 33
    1414//
    1515
     
    2222#include <stack>
    2323
    24 #include "lex.h"
     24#include "parser.hh"
    2525#include "parser.h"
    2626
  • src/Parser/lex.ll

    r2a7b3ca r949934e  
    1010 * Created On       : Sat Sep 22 08:58:10 2001
    1111 * Last Modified By : Peter A. Buhr
    12  * Last Modified On : Tue May 30 22:00:48 2017
    13  * Update Count     : 527
     12 * Last Modified On : Wed Jun 28 21:03:45 2017
     13 * Update Count     : 529
    1414 */
    1515
     
    2727#include <cstdio>                                                                               // FILENAME_MAX
    2828
    29 #include "lex.h"
    30 #include "parser.h"                                                                             // YACC generated definitions based on C++ grammar
    3129#include "ParseNode.h"
    3230#include "TypedefTable.h"
  • src/Parser/module.mk

    r2a7b3ca r949934e  
    1111## Created On       : Sat May 16 15:29:09 2015
    1212## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Tue Aug 16 17:28:34 2016
    14 ## Update Count     : 101
     13## Last Modified On : Wed Jun 28 21:58:29 2017
     14## Update Count     : 104
    1515###############################################################################
    1616
     
    2929       Parser/TypeData.cc \
    3030       Parser/LinkageSpec.cc \
    31        Parser/parseutility.cc
     31       Parser/parserutility.cc
    3232
    3333MAINTAINERCLEANFILES += Parser/parser.output
  • src/Parser/parser.hh

    r2a7b3ca r949934e  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // lex.h --
     7// parser.hh --
    88//
    99// Author           : Peter A. Buhr
    1010// Created On       : Sat Sep 22 08:58:10 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Aug 21 11:28:47 2016
    13 // Update Count     : 347
     12// Last Modified On : Wed Jun 28 22:10:17 2017
     13// Update Count     : 349
    1414//
    1515
    16 #ifndef PARSER_LEX_H
    17 #define PARSER_LEX_H
     16#ifndef PARSER_HH
     17#define PARSER_HH
    1818
    1919int yylex();
     
    4242}; // Token
    4343
    44 #endif // PARSER_LEX_H
     44#endif // PARSER_HH
    4545
    4646// Local Variables: //
  • src/Parser/parser.yy

    r2a7b3ca r949934e  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // cfa.y --
     7// parser.yy --
    88//
    99// Author           : Peter A. Buhr
    1010// Created On       : Sat Sep  1 20:22:55 2001
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Jun 12 12:59:00 2017
    13 // Update Count     : 2402
     12// Last Modified On : Wed Jun 28 22:11:22 2017
     13// Update Count     : 2414
    1414//
    1515
     
    4848#include <cstdio>
    4949#include <stack>
    50 #include "lex.h"
    51 #include "parser.h"
    5250#include "ParseNode.h"
    5351#include "TypedefTable.h"
     
    8886bool forall = false;                                                                    // aggregate have one or more forall qualifiers ?
    8987%}
     88
     89// Types declaration
     90%union
     91{
     92        Token tok;
     93        ParseNode * pn;
     94        ExpressionNode * en;
     95        DeclarationNode * decl;
     96        DeclarationNode::Aggregate aggKey;
     97        DeclarationNode::TypeClass tclass;
     98        StatementNode * sn;
     99        ConstantExpr * constant;
     100        ForCtl * fctl;
     101        LabelNode * label;
     102        InitializerNode * in;
     103        OperKinds op;
     104        std::string * str;
     105        bool flag;
     106}
    90107
    91108//************************* TERMINAL TOKENS ********************************
     
    139156
    140157%token ATassign                                                                                 // @=
    141 
    142 // Types declaration
    143 %union
    144 {
    145         Token tok;
    146         ParseNode * pn;
    147         ExpressionNode * en;
    148         DeclarationNode * decl;
    149         DeclarationNode::Aggregate aggKey;
    150         DeclarationNode::TypeClass tclass;
    151         StatementNode * sn;
    152         ConstantExpr * constant;
    153         ForCtl * fctl;
    154         LabelNode * label;
    155         InitializerNode * in;
    156         OperKinds op;
    157         std::string * str;
    158         bool flag;
    159 }
    160158
    161159%type<tok> identifier  no_attr_identifier  zero_one
     
    959957
    960958handler_clause:
    961         CATCH '(' push push exception_declaration pop ')' compound_statement pop
     959        // TEMPORARY, TEST EXCEPTIONS
     960        CATCH '(' push push INTEGERconstant pop ')' compound_statement pop
     961                { $$ = new StatementNode( build_catch( CatchStmt::Terminate, nullptr, new ExpressionNode( build_constantInteger( *$5 ) ), $8 ) ); }
     962        | handler_clause CATCH '(' push push INTEGERconstant pop ')' compound_statement pop
     963                { $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( CatchStmt::Terminate, nullptr, new ExpressionNode( build_constantInteger( *$6 ) ), $9 ) ) ); }
     964
     965        | CATCH '(' push push exception_declaration pop ')' compound_statement pop
    962966                { $$ = new StatementNode( build_catch( CatchStmt::Terminate, $5, nullptr, $8 ) ); }
    963967        | handler_clause CATCH '(' push push exception_declaration pop ')' compound_statement pop
  • src/Parser/parserutility.cc

    r2a7b3ca r949934e  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // parseutility.cc --
     7// parserutility.cc --
    88//
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 15:30:39 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Jun 21 15:33:41 2017
    13 // Update Count     : 5
     12// Last Modified On : Wed Jun 28 22:11:32 2017
     13// Update Count     : 7
    1414//
    1515
    16 #include "parseutility.h"
     16#include "parserutility.h"
    1717#include "SynTree/Type.h"
    1818#include "SynTree/Expression.h"
  • src/Parser/parserutility.h

    r2a7b3ca r949934e  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // parseutility.h --
     7// parserutility.h --
    88//
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 15:31:46 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat May 16 15:32:58 2015
    13 // Update Count     : 2
     12// Last Modified On : Wed Jun 28 22:11:40 2017
     13// Update Count     : 3
    1414//
    1515
  • src/SymTab/Autogen.cc

    r2a7b3ca r949934e  
    99// Author           : Rob Schluntz
    1010// Created On       : Thu Mar 03 15:45:56 2016
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 17 09:41:08 2017
    13 // Update Count     : 60
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Jun 28 15:30:00 2017
     13// Update Count     : 61
    1414//
    1515
     
    400400        /// generates struct constructors, destructor, and assignment functions
    401401        void makeStructFunctions( StructDecl *aggregateDecl, StructInstType *refType, unsigned int functionNesting, std::list< Declaration * > & declsToAdd, const std::vector< FuncData > & data ) {
     402                // Builtins do not use autogeneration.
     403                if ( aggregateDecl->get_linkage() == LinkageSpec::Builtin ||
     404                         aggregateDecl->get_linkage() == LinkageSpec::BuiltinC ) {
     405                        return;
     406                }
     407
    402408                // Make function polymorphic in same parameters as generic struct, if applicable
    403409                const std::list< TypeDecl* > & typeParams = aggregateDecl->get_parameters(); // List of type variables to be placed on the generated functions
  • src/SymTab/Mangler.cc

    r2a7b3ca r949934e  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 21:40:29 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 17 09:40:01 2017
    13 // Update Count     : 20
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Jun 28 15:31:00 2017
     13// Update Count     : 21
    1414//
    1515
     
    7272                        } else {
    7373                                // if we add another kind of overridable function, this has to change
    74                                 assert( false );
     74                                assert( false && "unknown overrideable linkage" );
    7575                        } // if
    7676                }
  • src/SynTree/AggregateDecl.cc

    r2a7b3ca r949934e  
    99// Author           : Richard C. Bilson
    1010// Created On       : Sun May 17 23:56:39 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Mar 16 07:49:07 2017
    13 // Update Count     : 20
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tus Jun 27 15:30:00 2017
     13// Update Count     : 21
    1414//
    1515
     
    2020
    2121
    22 AggregateDecl::AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes ) : Parent( name, Type::StorageClasses(), LinkageSpec::Cforall ), body( false ), attributes( attributes ) {
     22AggregateDecl::AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes, LinkageSpec::Spec linkage ) : Parent( name, Type::StorageClasses(), linkage ), body( false ), attributes( attributes ) {
    2323}
    2424
  • src/SynTree/Declaration.h

    r2a7b3ca r949934e  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Mar 17 16:05:08 2017
    13 // Update Count     : 121
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tus Jun 27 15:31:00 2017
     13// Update Count     : 122
    1414//
    1515
     
    238238        typedef Declaration Parent;
    239239  public:
    240         AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >() );
     240        AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall );
    241241        AggregateDecl( const AggregateDecl &other );
    242242        virtual ~AggregateDecl();
     
    266266        typedef AggregateDecl Parent;
    267267  public:
    268         StructDecl( const std::string &name, DeclarationNode::Aggregate kind = DeclarationNode::Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >() ) : Parent( name, attributes ), kind( kind ) {}
     268        StructDecl( const std::string &name, DeclarationNode::Aggregate kind = DeclarationNode::Struct, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ), kind( kind ) {}
    269269        StructDecl( const StructDecl &other ) : Parent( other ) {}
    270270
     
    284284        typedef AggregateDecl Parent;
    285285  public:
    286         UnionDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >() ) : Parent( name, attributes ) {}
     286        UnionDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
    287287        UnionDecl( const UnionDecl &other ) : Parent( other ) {}
    288288
     
    297297        typedef AggregateDecl Parent;
    298298  public:
    299         EnumDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >() ) : Parent( name, attributes ) {}
     299        EnumDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall ) : Parent( name, attributes, linkage ) {}
    300300        EnumDecl( const EnumDecl &other ) : Parent( other ) {}
    301301
  • src/libcfa/Makefile.am

    r2a7b3ca r949934e  
    1010## Author           : Peter A. Buhr
    1111## Created On       : Sun May 31 08:54:01 2015
    12 ## Last Modified By : Peter A. Buhr
    13 ## Last Modified On : Sun May 14 21:04:21 2017
    14 ## Update Count     : 214
     12## Last Modified By : Andrew Beach
     13## Last Modified On : Wed Jun 28 15:36:00 2017
     14## Update Count     : 215
    1515###############################################################################
    1616
     
    6464        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
    6565
     66libcfa_a-exception.o : exception.c
     67        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
     68
    6669concurrency/libcfa_d_a-invoke.o : concurrency/invoke.c
     70        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
     71
     72libcfa_d_a-exception.o : exception.c
    6773        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
    6874
     
    7278libcfa_a_CFLAGS = -nodebug -O2
    7379libcfa_d_a_SOURCES = ${libsrc}
    74 libcfa_d_a_CFLAGS = -debug -O0
     80libcfa_d_a_CFLAGS = -debug -O0 #No need for __CFA_DEBUG__ since we pass -debug
    7581
    7682stdhdr = ${shell echo stdhdr/*}
  • src/libcfa/Makefile.in

    r2a7b3ca r949934e  
    332332libcfa_a_CFLAGS = -nodebug -O2
    333333libcfa_d_a_SOURCES = ${libsrc}
    334 libcfa_d_a_CFLAGS = -debug -O0
     334libcfa_d_a_CFLAGS = -debug -O0 #No need for __CFA_DEBUG__ since we pass -debug
    335335stdhdr = ${shell echo stdhdr/*}
    336336cfa_includedir = $(CFA_INCDIR)
     
    14281428        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
    14291429
     1430libcfa_a-exception.o : exception.c
     1431        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -O2 ${EXTRA_FLAGS} -c -o $@ $<
     1432
    14301433concurrency/libcfa_d_a-invoke.o : concurrency/invoke.c
     1434        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
     1435
     1436libcfa_d_a-exception.o : exception.c
    14311437        ${AM_V_CC}@BACKEND_CC@ -DHAVE_CONFIG_H -I. -I../.. -D__CFA_DEBUG__ -O0 ${EXTRA_FLAGS} -c -o $@ $<
    14321438
  • src/main.cc

    r2a7b3ca r949934e  
    1010// Author           : Richard C. Bilson
    1111// Created On       : Fri May 15 23:12:02 2015
    12 // Last Modified By : Andrew Beach
    13 // Last Modified On : Wed May 10 14:45:00 2017
    14 // Update Count     : 437
     12// Last Modified By : Peter A. Buhr
     13// Last Modified On : Thu Jun 29 12:46:50 2017
     14// Update Count     : 441
    1515//
    1616
     
    2525using namespace std;
    2626
    27 #include "Parser/lex.h"
    28 #include "Parser/parser.h"
     27#include "Parser/parser.hh"
    2928#include "Parser/TypedefTable.h"
    3029#include "GenPoly/Lvalue.h"
     
    186185                if ( ! nopreludep ) {                                                   // include gcc builtins
    187186                        // -l is for initial build ONLY and builtins.cf is not in the lib directory so access it here.
    188                         FILE * builtins = fopen( libcfap | treep ? "../prelude/builtins.cf" : CFA_LIBDIR "/builtins.cf", "r" );
    189                         assertf( builtins, "cannot open builtins.cf\n" );
    190                         parse( builtins, LinkageSpec::Compiler );
     187
     188                        // Read to gcc builtins, if not generating the cfa library
     189                        FILE * gcc_builtins = fopen( libcfap | treep ? "../prelude/gcc-builtins.cf" : CFA_LIBDIR "/gcc-builtins.cf", "r" );
     190                        assertf( gcc_builtins, "cannot open gcc-builtins.cf\n" );
     191                        parse( gcc_builtins, LinkageSpec::Compiler );
    191192
    192193                        // read the extra prelude in, if not generating the cfa library
     
    200201                                assertf( prelude, "cannot open prelude.cf\n" );
    201202                                parse( prelude, LinkageSpec::Intrinsic );
     203
     204                                // Read to cfa builtins, if not generating the cfa library
     205                                FILE * builtins = fopen( libcfap | treep ? "../prelude/builtins.cf" : CFA_LIBDIR "/builtins.cf", "r" );
     206                                assertf( builtins, "cannot open builtins.cf\n" );
     207                                parse( builtins, LinkageSpec::Builtin );
    202208                        } // if
    203209                } // if
     
    475481                        break;
    476482                  case '?':
    477                         assertf( false, "Unknown option: '%c'\n", (char)optopt );
     483                        if ( optopt ) {                                                         // short option ?
     484                                assertf( false, "Unknown option: -%c\n", (char)optopt );
     485                        } else {
     486                                assertf( false, "Unknown option: %s\n", argv[optind - 1] );
     487                        } // if
    478488                  default:
    479489                        abort();
  • src/prelude/Makefile.am

    r2a7b3ca r949934e  
    2020# put into lib for now
    2121cfalibdir = ${CFA_LIBDIR}
    22 cfalib_DATA = builtins.cf extras.cf prelude.cf bootloader.c
     22cfalib_DATA = gcc-builtins.cf builtins.cf extras.cf prelude.cf bootloader.c
    2323noinst_DATA = ../libcfa/libcfa-prelude.c
     24
     25$(DEPDIR) :
     26        mkdir $(DEPDIR)
     27
     28$(DEPDIR)/builtins.Po : $(DEPDIR)
     29        touch ${@}
    2430
    2531# create extra forward types/declarations to reduce inclusion of library files
     
    2834
    2935# create forward declarations for gcc builtins
    30 builtins.cf : builtins.c prototypes.sed
     36gcc-builtins.cf : gcc-builtins.c prototypes.sed
    3137        ${AM_V_GEN}@BACKEND_CC@ -E -P $< | sed -f prototypes.sed > $@
    3238
    33 builtins.c : builtins.def prototypes.awk
     39gcc-builtins.c : builtins.def prototypes.awk
    3440        ${AM_V_GEN}@BACKEND_CC@ -E prototypes.c | awk -f prototypes.awk > $@
    3541
     
    3844prototypes.awk :
    3945
    40 ../libcfa/libcfa-prelude.c : prelude.cf extras.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp
     46# create forward declarations for cfa builtins
     47builtins.cf : builtins.c
     48        ${AM_V_GEN}@BACKEND_CC@ -E -P ${<} -o ${@} -MD -MP -MF $(DEPDIR)/builtins.Po
     49        ${AM_V_at}sed -i 's/builtins.o/builtins.cf/g' $(DEPDIR)/builtins.Po
     50
     51include $(DEPDIR)/builtins.Po
     52
     53../libcfa/libcfa-prelude.c : prelude.cf extras.cf gcc-builtins.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp
    4154        ${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -l prelude.cf $@  # use src/cfa-cpp as not in lib until after install
    4255
    43 bootloader.c : bootloader.cf prelude.cf extras.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp
     56bootloader.c : bootloader.cf prelude.cf extras.cf gcc-builtins.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp
    4457        ${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -tpmL bootloader.cf $@  # use src/cfa-cpp as not in lib until after install
    4558
    46 MAINTAINERCLEANFILES = builtins.c builtins.cf extras.cf bootloader.c ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}}
     59maintainer-clean-local :
     60        rm -rf $(DEPDIR)
     61
     62MAINTAINERCLEANFILES = gcc-builtins.c gcc-builtins.cf builtins.cf extras.cf bootloader.c ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}}
  • src/prelude/Makefile.in

    r2a7b3ca r949934e  
    211211# put into lib for now
    212212cfalibdir = ${CFA_LIBDIR}
    213 cfalib_DATA = builtins.cf extras.cf prelude.cf bootloader.c
     213cfalib_DATA = gcc-builtins.cf builtins.cf extras.cf prelude.cf bootloader.c
    214214noinst_DATA = ../libcfa/libcfa-prelude.c
    215 MAINTAINERCLEANFILES = builtins.c builtins.cf extras.cf bootloader.c ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}}
     215MAINTAINERCLEANFILES = gcc-builtins.c gcc-builtins.cf builtins.cf extras.cf bootloader.c ${addprefix ${libdir}/,${cfalib_DATA}} ${addprefix ${libdir}/,${lib_LIBRARIES}}
    216216all: all-am
    217217
     
    390390maintainer-clean: maintainer-clean-am
    391391        -rm -f Makefile
    392 maintainer-clean-am: distclean-am maintainer-clean-generic
     392maintainer-clean-am: distclean-am maintainer-clean-generic \
     393        maintainer-clean-local
    393394
    394395mostlyclean: mostlyclean-am
     
    416417        install-ps install-ps-am install-strip installcheck \
    417418        installcheck-am installdirs maintainer-clean \
    418         maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
    419         pdf-am ps ps-am uninstall uninstall-am uninstall-cfalibDATA
    420 
     419        maintainer-clean-generic maintainer-clean-local mostlyclean \
     420        mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \
     421        uninstall-cfalibDATA
     422
     423
     424$(DEPDIR) :
     425        mkdir $(DEPDIR)
     426
     427$(DEPDIR)/builtins.Po : $(DEPDIR)
     428        touch ${@}
    421429
    422430# create extra forward types/declarations to reduce inclusion of library files
     
    425433
    426434# create forward declarations for gcc builtins
    427 builtins.cf : builtins.c prototypes.sed
     435gcc-builtins.cf : gcc-builtins.c prototypes.sed
    428436        ${AM_V_GEN}@BACKEND_CC@ -E -P $< | sed -f prototypes.sed > $@
    429437
    430 builtins.c : builtins.def prototypes.awk
     438gcc-builtins.c : builtins.def prototypes.awk
    431439        ${AM_V_GEN}@BACKEND_CC@ -E prototypes.c | awk -f prototypes.awk > $@
    432440
     
    435443prototypes.awk :
    436444
    437 ../libcfa/libcfa-prelude.c : prelude.cf extras.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp
     445# create forward declarations for cfa builtins
     446builtins.cf : builtins.c
     447        ${AM_V_GEN}@BACKEND_CC@ -E -P ${<} -o ${@} -MD -MP -MF $(DEPDIR)/builtins.Po
     448        ${AM_V_at}sed -i 's/builtins.o/builtins.cf/g' $(DEPDIR)/builtins.Po
     449
     450include $(DEPDIR)/builtins.Po
     451
     452../libcfa/libcfa-prelude.c : prelude.cf extras.cf gcc-builtins.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp
    438453        ${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -l prelude.cf $@  # use src/cfa-cpp as not in lib until after install
    439454
    440 bootloader.c : bootloader.cf prelude.cf extras.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp
     455bootloader.c : bootloader.cf prelude.cf extras.cf gcc-builtins.cf builtins.cf ${abs_top_srcdir}/src/driver/cfa-cpp
    441456        ${AM_V_GEN}${abs_top_srcdir}/src/driver/cfa-cpp -tpmL bootloader.cf $@  # use src/cfa-cpp as not in lib until after install
     457
     458maintainer-clean-local :
     459        rm -rf $(DEPDIR)
    442460
    443461# Tell versions [3.59,3.63) of GNU make to not export all variables.
  • src/tests/preempt_longrun/Makefile.am

    r2a7b3ca r949934e  
    1616
    1717repeats=10
    18 max_time=10
    19 N=10ul
     18max_time=30
    2019preempt=10_000ul
    2120
    2221REPEAT = ${abs_top_srcdir}/tools/repeat -s
    2322
    24 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -DN=${N} -DPREEMPTION_RATE=${preempt}
     23BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -DPREEMPTION_RATE=${preempt}
    2524CFLAGS = ${BUILD_FLAGS}
    2625CC = @CFA_BINDIR@/@CFA_NAME@
    2726
    28 TESTS = create stack yield
     27TESTS = barge block create disjoint processor stack wait yield
    2928
    3029.INTERMEDIATE: ${TESTS}
  • src/tests/preempt_longrun/Makefile.in

    r2a7b3ca r949934e  
    178178top_srcdir = @top_srcdir@
    179179repeats = 10
    180 max_time = 10
    181 N = 10ul
     180max_time = 30
    182181preempt = 10_000ul
    183182REPEAT = ${abs_top_srcdir}/tools/repeat -s
    184 BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -DN=${N} -DPREEMPTION_RATE=${preempt}
    185 TESTS = create stack yield
     183BUILD_FLAGS = -g -Wall -Wno-unused-function -quiet @CFA_FLAGS@ -debug -O2 -DPREEMPTION_RATE=${preempt}
     184TESTS = barge block create disjoint processor stack wait yield
    186185all: all-am
    187186
  • src/tests/sched-int-block.c

    r2a7b3ca r949934e  
    55#include <thread>
    66
    7 static const unsigned N = 100_000;
     7#ifndef N
     8#define N 100_000
     9#endif
    810
    911enum state_t { WAITED, SIGNAL, BARGE };
  • src/tests/sched-int-disjoint.c

    r2a7b3ca r949934e  
    44#include <thread>
    55
     6#ifndef N
    67#define N 100_000
     8#endif
    79
    810enum state_t { WAIT, SIGNAL, BARGE };
  • src/tests/sched-int-wait.c

    r2a7b3ca r949934e  
    55#include <thread>
    66
    7 static const int N = 10_000;
     7#ifndef N
     8#define N 10_000
     9#endif
    810
    911monitor global_t {};
  • tools/cfa.nanorc

    r2a7b3ca r949934e  
    22## WIP
    33
    4 syntax "cfa" "\.cfa$"
    5 ## No magic
     4syntax "cfa" "\.cfa"
    65
    76# Macros
     
    1918# Control Flow Structures
    2019color brightyellow "\<(if|else|while|do|for|switch|choose|case|default)\>"
    21 ##color brightyellow "\<(try|catch|catchResume|finally)\>"
     20color brightyellow "\<(try|catch|catchResume|finally)\>"
    2221
    2322# Control Flow Statements
    24 color magenta "\<(return|break|continue|fallthru|throw)\>"
     23color magenta "\<(return|break|continue|fallthru|throw|throwResume)\>"
    2524
    2625# Operator Names
     
    4645color brightmagenta "'\\(([0-3]?[0-7]{1,2}))'" "'\\x[0-9A-Fa-f]{1,2}'"
    4746# Strings and Angle Strings
    48 color brightyellow ""([^"]|\\")*"" "<[^[:blank:]=]*>"
     47color yellow ""([^"]|\\")*"" "<[^[:blank:]=]*>"
    4948# Multiline Strings: This regex is VERY expencive and often too strong.
    5049###color brightyellow start=""(\\.|[^"])*\\[[:space:]]*$" end="^(\\.|[^"])*""
  • tools/repeat

    r2a7b3ca r949934e  
    2020for (( i = 0; i < ITERATION; i ++ )); do
    2121        echo -ne "\r$i / $ITERATION"
    22         $@ &
     22        $@ > /dev/null &
    2323        child=$!
    2424        wait "$child"
Note: See TracChangeset for help on using the changeset viewer.