Changeset 3e96559


Ignore:
Timestamp:
May 2, 2019, 1:33:07 PM (2 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
arm-eh, cleanup-dtors, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr
Children:
76f7fc7
Parents:
da09ba1
Message:

add --help option for cfa-cpp to show options, and restructure the option handling code

Location:
src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/CompilationState.cc

    rda09ba1 r3e96559  
    99// Author           : Rob Schluntz
    1010// Created On       : Mon Ju1 30 10:47:01 2018
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Mon Ju1 30 10:46:25 2018
    13 // Update Count     : 2
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu May  2 07:46:12 2019
     13// Update Count     : 3
    1414//
    1515
    16 bool
     16int
    1717        astp = false,
    1818        bresolvep = false,
  • src/CompilationState.h

    rda09ba1 r3e96559  
    99// Author           : Rob Schluntz
    1010// Created On       : Mon Ju1 30 10:47:01 2018
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Mon Ju1 30 10:46:25 2018
    13 // Update Count     : 2
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Thu May  2 07:46:12 2019
     13// Update Count     : 3
    1414//
    1515
    1616extern int yydebug;                   // set for -g flag (Grammar)
    17 extern bool
     17extern int
    1818        astp,
    1919        bresolvep,
  • src/main.cc

    rda09ba1 r3e96559  
    77// main.cc --
    88//
    9 // Author           : Richard C. Bilson
     9// Author           : Peter Buhr and Rob Schluntz
    1010// Created On       : Fri May 15 23:12:02 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sat Feb 16 09:14:04 2019
    13 // Update Count     : 500
     12// Last Modified On : Thu May  2 11:09:37 2019
     13// Update Count     : 523
    1414//
    1515
     
    6565using namespace std;
    6666
    67 void NewPass(const char * const name) {
    68         Stats::Heap::newPass(name);
     67static void NewPass( const char * const name ) {
     68        Stats::Heap::newPass( name );
    6969        using namespace Stats::Counters;
    70        
    7170        {
    72                 static auto group = build<CounterGroup>("Pass Visitor");
    73                 auto pass = build<CounterGroup>(name, group);
     71                static auto group = build<CounterGroup>( "Pass Visitor" );
     72                auto pass = build<CounterGroup>( name, group );
    7473                pass_visitor_stats.depth = 0;
    75                 pass_visitor_stats.avg = build<AverageCounter<double>>("Average Depth", pass);
    76                 pass_visitor_stats.max = build<MaxCounter<double>>("Max Depth", pass);
     74                pass_visitor_stats.avg = build<AverageCounter<double>>( "Average Depth", pass );
     75                pass_visitor_stats.max = build<MaxCounter<double>>( "Max Depth", pass );
    7776        }
    78 
    7977        {
    80                 static auto group = build<CounterGroup>("Syntax Node");
    81                 auto pass = build<CounterGroup>(name, group);
    82                 BaseSyntaxNode::new_nodes = build<SimpleCounter>("Allocs", pass);
     78                static auto group = build<CounterGroup>( "Syntax Node" );
     79                auto pass = build<CounterGroup>( name, group );
     80                BaseSyntaxNode::new_nodes = build<SimpleCounter>( "Allocs", pass );
    8381        }
    8482}
    8583
    86 #define PASS(name, pass)                  \
     84#define PASS( name, pass )                  \
    8785        if ( errorp ) { cerr << name << endl; } \
    8886        NewPass(name);                          \
     
    9593DeclarationNode * parseTree = nullptr;                                  // program parse tree
    9694
    97 std::string PreludeDirector = "";
     95static std::string PreludeDirector = "";
    9896
    9997static void parse_cmdline( int argc, char *argv[], const char *& filename );
     
    151149} // backtrace
    152150
    153 void sigSegvBusHandler( int sig_num ) {
     151static void sigSegvBusHandler( int sig_num ) {
    154152        cerr << "*CFA runtime error* program cfa-cpp terminated with "
    155153                 <<     (sig_num == SIGSEGV ? "segment fault" : "bus error")
     
    157155        backtrace( 2 );                                                                         // skip first 2 stack frames
    158156        //_exit( EXIT_FAILURE );
    159         abort();
     157        abort();                                                                                        // cause core dump for debugging
    160158} // sigSegvBusHandler
    161159
    162 void sigAbortHandler( __attribute__((unused)) int sig_num ) {
     160static void sigAbortHandler( __attribute__((unused)) int sig_num ) {
    163161        backtrace( 6 );                                                                         // skip first 6 stack frames
    164162        signal( SIGABRT, SIG_DFL);                                                      // reset default signal handler
     
    240238                        parseTree->printList( cout );
    241239                        delete parseTree;
    242                         return 0;
     240                        return EXIT_SUCCESS;
    243241                } // if
    244242
     
    249247                if ( astp ) {
    250248                        dump( translationUnit );
    251                         return 0;
     249                        return EXIT_SUCCESS;
    252250                } // if
    253251
     
    262260                if ( symtabp ) {
    263261                        deleteAll( translationUnit );
    264                         return 0;
     262                        return EXIT_SUCCESS;
    265263                } // if
    266264
     
    268266                        PassVisitor<ResolvExpr::AlternativePrinter> printer( cout );
    269267                        acceptAll( translationUnit, printer );
    270                         return 0;
     268                        return EXIT_SUCCESS;
    271269                } // if
    272270
    273271                if ( validp ) {
    274272                        dump( translationUnit );
    275                         return 0;
     273                        return EXIT_SUCCESS;
    276274                } // if
    277275
     
    288286                        CodeTools::printDeclStats( translationUnit );
    289287                        deleteAll( translationUnit );
    290                         return 0;
    291                 }
     288                        return EXIT_SUCCESS;
     289                } // if
    292290
    293291                if ( bresolvep ) {
    294292                        dump( translationUnit );
    295                         return 0;
     293                        return EXIT_SUCCESS;
    296294                } // if
    297295
     
    300298                if ( resolvprotop ) {
    301299                        CodeTools::dumpAsResolvProto( translationUnit );
    302                         return 0;
    303                 }
     300                        return EXIT_SUCCESS;
     301                } // if
    304302
    305303                PASS( "Resolve", ResolvExpr::resolve( translationUnit ) );
    306304                if ( exprp ) {
    307305                        dump( translationUnit );
    308                         return 0;
     306                        return EXIT_SUCCESS;
    309307                } // if
    310308
     
    313311                if ( ctorinitp ) {
    314312                        dump ( translationUnit );
    315                         return 0;
     313                        return EXIT_SUCCESS;
    316314                } // if
    317315
     
    328326                if ( tuplep ) {
    329327                        dump( translationUnit );
    330                         return 0;
    331                 }
     328                        return EXIT_SUCCESS;
     329                } // if
    332330
    333331                PASS( "Virtual Expand Casts", Virtual::expandCasts( translationUnit ) ); // Must come after translateEHM
     
    336334                if ( genericsp ) {
    337335                        dump( translationUnit );
    338                         return 0;
    339                 }
     336                        return EXIT_SUCCESS;
     337                } // if
    340338                PASS( "Convert L-Value", GenPoly::convertLvalue( translationUnit ) );
    341339
     
    343341                if ( bboxp ) {
    344342                        dump( translationUnit );
    345                         return 0;
     343                        return EXIT_SUCCESS;
    346344                } // if
    347345                PASS( "Box", GenPoly::box( translationUnit ) );
     
    349347                if ( bcodegenp ) {
    350348                        dump( translationUnit );
    351                         return 0;
    352                 }
     349                        return EXIT_SUCCESS;
     350                } // if
    353351
    354352                if ( optind < argc ) {                                                  // any commands after the flags and input file ? => output file name
     
    373371                        delete output;
    374372                } // if
    375                 return 1;
     373                return EXIT_FAILURE;
    376374        } catch ( UnimplementedError &e ) {
    377375                cout << "Sorry, " << e.get_what() << " is not currently implemented" << endl;
     
    379377                        delete output;
    380378                } // if
    381                 return 1;
     379                return EXIT_FAILURE;
    382380        } catch ( CompilerError &e ) {
    383381                cerr << "Compiler Error: " << e.get_what() << endl;
     
    386384                        delete output;
    387385                } // if
    388                 return 1;
    389         } catch(...) {
     386                return EXIT_FAILURE;
     387        } catch ( ... ) {
    390388                std::exception_ptr eptr = std::current_exception();
    391389                try {
    392390                        if (eptr) {
    393391                                std::rethrow_exception(eptr);
    394                         }
    395                         else {
    396                                 std::cerr << "Exception Uncaught and Unkown" << std::endl;
    397                         }
     392                        } else {
     393                                std::cerr << "Exception Uncaught and Unknown" << std::endl;
     394                        } // if
    398395                } catch(const std::exception& e) {
    399396                        std::cerr << "Uncaught Exception \"" << e.what() << "\"\n";
    400                 }
    401                 return 1;
    402         }// try
     397                } // try
     398                return EXIT_FAILURE;
     399        } // try
    403400
    404401        deleteAll( translationUnit );
    405402        Stats::print();
    406 
    407         return 0;
     403        return EXIT_SUCCESS;
    408404} // main
    409405
    410 void parse_cmdline( int argc, char * argv[], const char *& filename ) {
    411         enum { Ast, Bbox, Bresolver, CtorInitFix, DeclStats, Expr, ExprAlt, Grammar, LibCFA, Linemarks, Nolinemarks, Nopreamble, Parse, PreludeDir, Prototypes, Resolver, ResolvProto, Stats, Symbol, Tree, TupleExpansion, Validate};
    412 
    413         static struct option long_opts[] = {
    414                 { "ast", no_argument, 0, Ast },
    415                 { "before-box", no_argument, 0, Bbox },
    416                 { "before-resolver", no_argument, 0, Bresolver },
    417                 { "ctorinitfix", no_argument, 0, CtorInitFix },
    418                 { "decl-stats", no_argument, 0, DeclStats },
    419                 { "expr", no_argument, 0, Expr },
    420                 { "expralt", no_argument, 0, ExprAlt },
    421                 { "grammar", no_argument, 0, Grammar },
    422                 { "libcfa", no_argument, 0, LibCFA },
    423                 { "line-marks", no_argument, 0, Linemarks },
    424                 { "no-line-marks", no_argument, 0, Nolinemarks },
    425                 { "no-preamble", no_argument, 0, Nopreamble },
    426                 { "parse", no_argument, 0, Parse },
    427                 { "prelude-dir", required_argument, 0, PreludeDir },
    428                 { "no-prototypes", no_argument, 0, Prototypes },
    429                 { "resolver", no_argument, 0, Resolver },
    430                 { "resolv-proto", no_argument, 0, ResolvProto },
    431                 { "stats", required_argument, 0, Stats },
    432                 { "symbol", no_argument, 0, Symbol },
    433                 { "tree", no_argument, 0, Tree },
    434                 { "tuple-expansion", no_argument, 0, TupleExpansion },
    435                 { "validate", no_argument, 0, Validate },
    436                 { 0, 0, 0, 0 }
    437         }; // long_opts
    438         int long_index;
    439 
     406
     407static const char optstring[] = ":abBcCdeEGghlLmNnpP:qrRS:stTvwW:yzZD:F:";
     408
     409static struct option long_opts[] = {
     410        { "ast", no_argument, nullptr, 'a' },
     411        { "before-resolver", no_argument, nullptr, 'b' },
     412        { "box", no_argument, nullptr, 'B' },
     413        { "ctorinitfix", no_argument, nullptr, 'c' },
     414        { "code", no_argument, nullptr, 'C' },
     415        { "decl-stmts", no_argument, nullptr, 'd' },
     416        { "expr", no_argument, nullptr, 'e' },
     417        { "expralt", no_argument, nullptr, 'E' },
     418        { "generics", no_argument, nullptr, 'G' },
     419        { "grammar", no_argument, nullptr, 'g' },
     420        { "help", no_argument, nullptr, 'h' },
     421        { "libcfa", no_argument, nullptr, 'l' },
     422        { "line-marks", no_argument, nullptr, 'L' },
     423        { "no-main", no_argument, 0, 'm' },
     424        { "no-line-marks", no_argument, nullptr, 'N' },
     425        { "no-preamble", no_argument, nullptr, 'n' },
     426        { "prototypes", no_argument, nullptr, 'p' },
     427        { "prelude-dir <directory>", required_argument, nullptr, 'P' },
     428        { "parse-tree", no_argument, nullptr, 'q' },
     429        { "resolver", no_argument, nullptr, 'r' },
     430        { "resolver-proto", no_argument, nullptr, 'R' },
     431        { "statistics <option-list>", required_argument, nullptr, 'S' },
     432        { "symbol", no_argument, nullptr, 's' },
     433        { "tree", no_argument, nullptr, 't' },
     434        { "tuple", no_argument, nullptr, 'T' },
     435        { "validate", no_argument, nullptr, 'v' },
     436        { "", no_argument, nullptr, 0 },                                        // -w
     437        { "", no_argument, nullptr, 0 },                                        // -W
     438        { "dump-ast-on-error", no_argument, nullptr, 'y' },
     439        { "dump-ast-code", no_argument, nullptr, 'z' },
     440        { "prettyprint-codegen", no_argument, nullptr, 'Z' },
     441        { "", no_argument, nullptr, 0 },                                        // -D
     442        { "", no_argument, nullptr, 0 },                                        // -F
     443        { nullptr, 0, nullptr, 0 }
     444}; // long_opts
     445
     446static const char * description[] = {
     447        "dump AST",                                                                                     // -a
     448        "print before resolver step",                                           // -b
     449        "print before box step",                                                        // -B
     450        "print after ctor/dtor are replaced",                           // -c
     451        "print before code generation",                                         // -C
     452        "print declaration statements",                                         // -d
     453        "dump AST after expression analysis",                           // -e
     454        "print alternatives for expressions",                           // -E
     455        "dump AST after instantiate generics",                          // -G
     456        "print bison (parsing) debugging information",          // -g
     457        "help message",                                                                         // -h
     458        "generate libcfa.c",                                                            // -l
     459        "print line marks",                                                                     // -L
     460        "do not replace main",                                                          // -m
     461        "suppress line marks",                                                          // -N
     462        "do not read preamble",                                                         // -n
     463        "generate prototypes for preamble functions",           // -p
     464        "prelude directory for debug/nodebug",                          // -P
     465        "dump parse tree",                                                                      // -q
     466        "print resolver steps",                                                         // -r
     467        "dump resolver-proto instance",                                         // -R
     468        "enable profiling information: counters,heap,time",     // -S
     469        "print symbol table events",                                            // -s
     470        "build in tree",                                                                        // -t
     471        "print after tuple expansion",                                          // -T
     472        "dump AST after declaration validation pass",           // -v
     473        "",                                                                                                     // -w
     474        "",                                                                                                     // -W
     475        "dump AST on error",                                                            // -y
     476        "dump as codegen rather than AST",                                      // -z
     477        "prettyprint during codegen",                                           // -Z
     478        "",                                                                                                     // -D
     479        "",                                                                                                     // -F
     480}; // description
     481
     482static void usage( char *argv[] ) {
     483    cout << "Usage: " << argv[0] << " options are:" << endl;
     484        int i = 0, j = 1;                                                                       // j skips starting colon
     485        for ( ; long_opts[i].name != 0 && optstring[j] != '\0'; i += 1, j += 1 ) {
     486                if ( long_opts[i].name[0] != '\0' ) {                   // hidden option, internal usage only
     487                        cout << "  -" << optstring[j] << ", --" << long_opts[i].name << "  " << description[i] << endl;
     488                } // if
     489                if ( optstring[j+1] == ':' ) j += 1;
     490        } // for
     491        if ( long_opts[i].name != 0 || optstring[j] != '\0' ) assertf( false, "internal error, mismatch of option flags and names\n" );
     492    exit( EXIT_FAILURE );
     493} // usage
     494
     495static void parse_cmdline( int argc, char * argv[], const char *& filename ) {
    440496        opterr = 0;                                                                                     // (global) prevent getopt from printing error messages
    441497
    442498        bool Wsuppress = false, Werror = false;
    443499        int c;
    444         while ( (c = getopt_long( argc, argv, "abBcCdefgGlLmnNpqrRstTvwW:yzZD:F:", long_opts, &long_index )) != -1 ) {
     500        while ( (c = getopt_long( argc, argv, optstring, long_opts, nullptr )) != -1 ) {
    445501                switch ( c ) {
    446                         case Ast:
    447                         case 'a':                                                                               // dump AST
     502                  case 'a':                                                                             // dump AST
    448503                        astp = true;
    449504                        break;
    450                         case Bresolver:
    451                         case 'b':                                                                               // print before resolver steps
     505                  case 'b':                                                                             // print before resolver steps
    452506                        bresolvep = true;
    453507                        break;
    454                         case 'B':                                                                               // print before box steps
     508                  case 'B':                                                                             // print before box steps
    455509                        bboxp = true;
    456510                        break;
    457                         case CtorInitFix:
    458                         case 'c':                                                                               // print after constructors and destructors are replaced
     511                  case 'c':                                                                             // print after ctor/dtor are replaced
    459512                        ctorinitp = true;
    460513                        break;
    461                         case 'C':                                                                               // print before code generation
     514                  case 'C':                                                                             // print before code generation
    462515                        bcodegenp = true;
    463516                        break;
    464                         case DeclStats:
    465                         case 'd':
    466                                 declstatsp = true;
    467                         break;
    468                         case Expr:
    469                         case 'e':                                                                               // dump AST after expression analysis
     517                  case 'd':                                                                             // print declaration statements
     518                        declstatsp = true;
     519                        break;
     520                  case 'e':                                                                             // dump AST after expression analysis
    470521                        exprp = true;
    471522                        break;
    472                         case ExprAlt:
    473                         case 'f':                                                                               // print alternatives for expressions
     523                  case 'E':                                                                             // print alternatives for expressions
    474524                        expraltp = true;
    475525                        break;
    476                         case Grammar:
    477                         case 'g':                                                                               // bison debugging info (grammar rules)
     526                  case 'G':                                                                             // dump AST after instantiate generics
     527                        genericsp = true;
     528                        break;
     529                  case 'g':                                                                             // print bison (parsing) debugging information
    478530                        yydebug = true;
    479531                        break;
    480                         case 'G':                                                                               // dump AST after instantiate generics
    481                         genericsp = true;
    482                         break;
    483                         case LibCFA:
    484                         case 'l':                                                                               // generate libcfa.c
     532                  case 'h':                                                                             // help message
     533                        usage( argv );                                                          // no return
     534                        break;
     535                  case 'l':                                                                             // generate libcfa.c
    485536                        libcfap = true;
    486537                        break;
    487                         case Linemarks:
    488                         case 'L':                                                                               // print lines marks
     538                  case 'L':                                                                             // print line marks
    489539                        linemarks = true;
    490540                        break;
    491                         case Nopreamble:
    492                         case 'n':                                                                               // do not read preamble
     541                  case 'm':                                                                             // do not replace main
     542                        nomainp = true;
     543                        break;
     544                  case 'N':                                                                             // suppress line marks
     545                        linemarks = false;
     546                        break;
     547                  case 'n':                                                                             // do not read preamble
    493548                        nopreludep = true;
    494549                        break;
    495                         case Nolinemarks:
    496                         case 'N':                                                                               // suppress line marks
    497                         linemarks = false;
    498                         break;
    499                         case Prototypes:
    500                         case 'p':                                                                               // generate prototypes for preamble functions
     550                  case 'p':                                                                             // generate prototypes for preamble functions
    501551                        noprotop = true;
    502552                        break;
    503                         case PreludeDir:
    504                                 PreludeDirector = optarg;
    505                         break;
    506                         case 'm':                                                                               // don't replace the main
    507                                 nomainp = true;
    508                         break;
    509                         case Parse:
    510                         case 'q':                                                                               // dump parse tree
     553                  case 'P':                                                                             // prelude directory for debug/nodebug, hidden
     554                        PreludeDirector = optarg;
     555                        break;
     556                  case 'q':                                                                             // dump parse tree
    511557                        parsep = true;
    512558                        break;
    513                         case Resolver:
    514                         case 'r':                                                                               // print resolver steps
     559                  case 'r':                                                                             // print resolver steps
    515560                        resolvep = true;
    516561                        break;
    517                         case 'R':                                                                               // dump resolv-proto instance
     562                  case 'R':                                                                             // dump resolver-proto instance
    518563                        resolvprotop = true;
    519564                        break;
    520                         case Stats:
    521                                 Stats::parse_params(optarg);
    522                         break;
    523                         case Symbol:
    524                         case 's':                                                                               // print symbol table events
     565                  case 'S':                                                                             // enable profiling information, argument comma separated list of names
     566                        Stats::parse_params( optarg );
     567                        break;
     568                  case 's':                                                                             // print symbol table events
    525569                        symtabp = true;
    526570                        break;
    527                         case Tree:
    528                         case 't':                                                                               // build in tree
     571                  case 't':                                                                             // build in tree
    529572                        treep = true;
    530573                        break;
    531                         case TupleExpansion:
    532                         case 'T':                                                                               // print after tuple expansion
     574                  case 'T':                                                                             // print after tuple expansion
    533575                        tuplep = true;
    534576                        break;
    535                         case 'v':                                                                               // dump AST after decl validation pass
     577                  case 'v':                                                                             // dump AST after declaration validation pass
    536578                        validp = true;
    537579                        break;
    538                         case 'w':
     580                  case 'w':                                                                             // suppress all warnings, hidden
    539581                        Wsuppress = true;
    540582                        break;
    541                         case 'W':
     583                  case 'W':                                                                             // coordinate gcc -W with CFA, hidden
    542584                        if ( strcmp( optarg, "all" ) == 0 ) {
    543585                                SemanticWarning_EnableAll();
     
    556598                        } // if
    557599                        break;
    558                         case 'y':                                                                               // dump AST on error
     600                  case 'y':                                                                             // dump AST on error
    559601                        errorp = true;
    560602                        break;
    561                         case 'z':                                                                               // dump as codegen rather than AST
     603                  case 'z':                                                                             // dump as codegen rather than AST
    562604                        codegenp = true;
    563605                        break;
    564                         case 'Z':                                                                       // prettyprint during codegen (i.e. print unmangled names, etc.)
     606                  case 'Z':                                                                             // prettyprint during codegen (i.e. print unmangled names, etc.)
    565607                        prettycodegenp = true;
    566608                        break;
    567                         case 'D':                                                                               // ignore -Dxxx
    568                         break;
    569                         case 'F':                                                                               // source file-name without suffix
     609                  case 'D':                                                                             // ignore -Dxxx, forwarded by cpp, hidden
     610                        break;
     611                  case 'F':                                                                             // source file-name without suffix, hidden
    570612                        filename = optarg;
    571613                        break;
    572                         case '?':
     614                  case '?':                                                                             // unknown option
    573615                        if ( optopt ) {                                                         // short option ?
    574                                 assertf( false, "Unknown option: -%c\n", (char)optopt );
     616                                cout << "Unknown option -" << (char)optopt << endl;
    575617                        } else {
    576                                 assertf( false, "Unknown option: %s\n", argv[optind - 1] );
     618                                cout << "Unknown option " << argv[optind - 1] << endl;
    577619                        } // if
    578                         #if defined(__GNUC__) && __GNUC__ >= 7
    579                                 __attribute__((fallthrough));
    580                         #endif
    581                         default:
    582                         abort();
     620                        goto Default;
     621                  case ':':                                                                             // missing option
     622                        if ( optopt ) {                                                         // short option ?
     623                                cout << "Missing option for -" << (char)optopt << endl;
     624                        } else {
     625                                cout << "Missing option for " << argv[optind - 1] << endl;
     626                        } // if
     627                        goto Default;
     628                  Default:
     629                  default:
     630                        usage( argv );                                                          // no return
    583631                } // switch
    584632        } // while
     
    629677        } else {
    630678                printAll( decls, out );
    631         }
     679        } // if
    632680        deleteAll( translationUnit );
    633681} // dump
Note: See TracChangeset for help on using the changeset viewer.