added --help texts which document most options
authorMatthias Braun <matze@braunis.de>
Mon, 30 May 2011 12:22:34 +0000 (14:22 +0200)
committerMatthias Braun <matze@braunis.de>
Mon, 30 May 2011 12:23:06 +0000 (14:23 +0200)
help.c [new file with mode: 0644]
help.h [new file with mode: 0644]
main.c
warning.c
warning.h

diff --git a/help.c b/help.c
new file mode 100644 (file)
index 0000000..8cc4e5d
--- /dev/null
+++ b/help.c
@@ -0,0 +1,32 @@
+/*
+ * This file is part of cparser.
+ * Copyright (C) 2007-2009 Matthias Braun <matze@braunis.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+#include <stdio.h>
+#include <string.h>
+#include "help.h"
+
+void put_help(const char *option, const char *explanation)
+{
+       printf("\t%-15s  %s\n", option, explanation);
+}
+
+void put_choice(const char *choice, const char *explanation)
+{
+       printf("\t    %-11s  %s\n", choice, explanation);
+}
diff --git a/help.h b/help.h
new file mode 100644 (file)
index 0000000..f5e3885
--- /dev/null
+++ b/help.h
@@ -0,0 +1,33 @@
+/*
+ * This file is part of cparser.
+ * Copyright (C) 2007-2009 Matthias Braun <matze@braunis.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ */
+#ifndef HELP_H
+#define HELP_H
+
+/**
+ * Display information about a commandline option
+ */
+void put_help(const char *option, const char *explanation);
+
+/**
+ * Display a choice value for a multiple-choice option
+ */
+void put_choice(const char *choice, const char *explanation);
+
+#endif
diff --git a/main.c b/main.c
index 9f0bf7b..05df6bf 100644 (file)
--- a/main.c
+++ b/main.c
@@ -79,6 +79,7 @@
 #include "wrappergen/write_jna.h"
 #include "revision.h"
 #include "warning.h"
+#include "help.h"
 #include "mangle.h"
 #include "printer.h"
 
@@ -559,13 +560,198 @@ static void print_cparser_version(void)
             "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n");
 }
 
-static void print_help(const char *argv0)
+static void print_help_basic(const char *argv0)
 {
        usage(argv0);
        puts("");
-       puts("\t-fhelp     Display help about firm optimisation options");
-       puts("\t-bhelp     Display help about firm backend options");
-       puts("A big number of gcc flags is also supported");
+       put_help("--help",                   "Display this information");
+       put_help("--version",                "Display compiler version");
+       put_help("--help-parser",            "Display information about parser options");
+       put_help("--help-warnings",          "Display information about warning options");
+       put_help("--help-codegen",           "Display information about code-generation options");
+       put_help("--help-linker",            "Display information about linker options");
+       put_help("--help-language-tools",    "Display information about language tools options");
+       put_help("--help-debug",             "Display information about compiler debugging options");
+       put_help("--help-firm",              "Display information about direct firm options");
+       put_help("--help-all",               "Display information about all options");
+       put_help("-c",                       "Compile and assemble but do not link");
+       put_help("-E",                       "Preprocess only");
+       put_help("-S",                       "Compile but do not assembler or link");
+       put_help("-o",                       "Specify output file");
+       put_help("-v",                       "Verbose output (show invocation of sub-processes)");
+       put_help("-x",                       "Force input language:");
+       put_choice("c",                      "C");
+       put_choice("c++",                    "C++");
+       put_choice("assembler",              "Assembler (no preprocessing)");
+       put_choice("assembler-with-cpp",     "Assembler with preprocessing");
+       put_choice("none",                   "Autodetection");
+       put_help("-pipe",                    "ignored (gcc compatibility)");
+}
+
+static void print_help_preprocessor(void)
+{
+       put_help("-nostdinc",                "Do not search standard system include directories");
+       put_help("-trigraphs",               "Support ISO C trigraphs");
+       put_help("-isystem",                 "");
+       put_help("-include",                 "");
+       put_help("-I PATH",                  "");
+       put_help("-D SYMBOL[=value]",        "");
+       put_help("-U SYMBOL",                "");
+       put_help("-Wp,OPTION",               "pass option directly to preprocessor");
+       put_help("-M",                       "");
+       put_help("-MD",                      "");
+       put_help("-MMD",                     "");
+       put_help("-MM",                      "");
+       put_help("-MP",                      "");
+       put_help("-MT",                      "");
+       put_help("-MQ",                      "");
+       put_help("-MF",                      "");
+}
+
+static void print_help_parser(void)
+{
+       put_help("-finput-charset=CHARSET",  "Select encoding of input files");
+       put_help("-fmessage-length=LEN",     "ignored (gcc compatibility)");
+       put_help("-fshort-wchar",            "wchar_t is unsigned short instead of int");
+       put_help("-funsigned-char",          "char is an unsigned type");
+       put_help("--ms",                     "Enable msvc extensions");
+       put_help("--no-ms",                  "Disable msvc extensions");
+       put_help("--gcc",                    "Enable gcc extensions");
+       put_help("--no-gcc",                 "Disable gcc extensions");
+       put_help("-std=STANDARD",            "Specify language standard:");
+       put_choice("c99",                    "ISO C99 standard");
+       put_choice("c89",                    "ISO C89 standard");
+       put_choice("c9x",                    "deprecated");
+       put_choice("c++",                    "ISO C++ 98");
+       put_choice("c++98",                  "ISO C++ 98");
+       put_choice("gnu99",                  "ISO C99 + GNU extensions (default)");
+       put_choice("gnu89",                  "ISO C89 + GNU extensions");
+       put_choice("gnu9x",                  "deprecated");
+       put_choice("iso9899:1990",           "ISO C89");
+       put_choice("iso9899:199409",         "ISO C90");
+       put_choice("iso9899:1999",           "ISO C99");
+       put_choice("iso9899:199x",           "deprecated");
+       put_help("-pedantic",                "ignored (gcc compatibility)");
+       put_help("-ansi",                    "ignored (gcc compatibility)");
+       put_help("--strict",                 "Enable strict conformance checking");
+}
+
+static void print_help_warnings(void)
+{
+       put_help("-w",                       "disable all warnings");
+       put_help("-W",                       "ignored (gcc compatibility)");
+       put_help("-Wno-trigraphs",           "warn if input contains trigraphs");
+       put_help("-Wundef",                  "Warn if an undefined macro is used in an #if");
+       print_warning_opt_help();
+}
+
+static void print_help_optimisation(void)
+{
+       put_help("-O LEVEL",                 "select optimisation level (0-4)");
+       put_help("-fexpensive-optimizations","ignored (gcc compatibility)");
+}
+
+static void print_help_codegeneration(void)
+{
+       put_help("-g",                       "Generate debug information");
+       put_help("-pg",                      "Instrument code for gnu gprof");
+       put_help("-fomit-frame-pointer",     "Produce code without frame pointer where possible");
+       put_help("-ffreestanding",           "compile in freestanding mode (see ISO C standard)");
+       put_help("-fhosted",                 "compile in hosted (not freestanding) mode");
+       put_help("-fprofile-generate",       "Generate instrumented code to collect profile information");
+       put_help("-fprofile-use",            "Use profile information generated by instrumented binaries");
+       put_help("-pthread",                 "Use pthread threading library");
+       put_help("-fverbose-asm",            "ignored (gcc compatibility)");
+       put_help("-ffast-math",              "ignored (gcc compatibility)");
+       put_help("-fjump-tables",            "ignored (gcc compatibility)");
+       put_help("-fcommon",                 "ignored (gcc compatibility)");
+       put_help("-foptimize-sibling-calls", "ignored (gcc compatibility)");
+       put_help("-falign-loops",            "ignored (gcc compatibility)");
+       put_help("-falign-jumps",            "ignored (gcc compatibility)");
+       put_help("-falign-functions",        "ignored (gcc compatibility)");
+       put_help("-fPIC",                    "ignored (gcc compatibility)");
+       put_help("-mtarget=TARGET",          "Specify target architecture as CPU-manufacturer-OS triple");
+       put_help("-mtriple=TARGET",          "alias for -mtarget (clang compatibility)");
+       put_help("-march=ARCH",              "");
+       put_help("-mtune=ARCH",              "");
+       put_help("-mcpu=CPU",                "");
+       put_help("-mfpmath=",                "");
+       put_help("-mpreferred-stack-boundary=", "");
+       put_help("-mrtd",                    "");
+       put_help("-mregparm=",               "not supported yet");
+       put_help("-msoft-float",             "not supported yet");
+       put_help("-m32",                     "generate 32bit code");
+       put_help("-m64",                     "generate 64bit code");
+       puts("");
+       puts("\tMost of these options can be used with a no- prefix to disable them");
+       puts("\ti.e. -fno-signed-char");
+}
+
+static void print_help_linker(void)
+{
+       put_help("-l LIBRARY",               "");
+       put_help("-L PATH",                  "");
+       put_help("-shared",                  "Produce a shared library");
+       put_help("-static",                  "Produce statically linked binary");
+       put_help("-Wl,OPTION",               "pass option directly to linker");
+}
+
+static void print_help_debug(void)
+{
+       put_help("--lextest",                "Preprocess and tokenize only");
+       put_help("--print-ast",              "Preprocess, parse and print AST");
+       put_help("--print-implicit-cast",    "");
+       put_help("--print-parenthesis",      "");
+       put_help("--benchmark",              "Preprocess and parse, produces no output");
+       put_help("--time",                   "Measure time of compiler passes");
+       put_help("--dump-function func",     "Preprocess, parse and output vcg graph of func");
+       put_help("--export-ir",              "Preprocess, parse and output compiler intermediate representation");
+}
+
+static void print_help_language_tools(void)
+{
+       put_help("--print-fluffy",           "Preprocess, parse and generate declarations for the fluffy language");
+       put_help("--print-jna",              "Preprocess, parse and generate declarations for JNA");
+       put_help("--jna-limit filename",     "");
+       put_help("--jna-libname name",       "");
+}
+
+static void print_help_firm(void)
+{
+       put_help("-bOPTION",                 "directly pass option to libFirm backend");
+       int res = be_parse_arg("help");
+       (void) res;
+       assert(res);
+}
+
+typedef enum {
+       HELP_NONE          = 0,
+       HELP_BASIC         = 1u << 0,
+       HELP_PREPROCESSOR  = 1u << 1,
+       HELP_PARSER        = 1u << 2,
+       HELP_WARNINGS      = 1u << 3,
+       HELP_OPTIMISATION  = 1u << 4,
+       HELP_CODEGEN       = 1u << 5,
+       HELP_LINKER        = 1u << 6,
+       HELP_LANGUAGETOOLS = 1u << 7,
+       HELP_DEBUG         = 1u << 8,
+       HELP_FIRM          = 1u << 9,
+
+       HELP_ALL           = (unsigned)-1
+} help_sections_t;
+
+static void print_help(const char *argv0, help_sections_t sections)
+{
+       if (sections & HELP_BASIC)         print_help_basic(argv0);
+       if (sections & HELP_PREPROCESSOR)  print_help_preprocessor();
+       if (sections & HELP_PARSER)        print_help_parser();
+       if (sections & HELP_WARNINGS)      print_help_warnings();
+       if (sections & HELP_OPTIMISATION)  print_help_optimisation();
+       if (sections & HELP_CODEGEN)       print_help_codegeneration();
+       if (sections & HELP_LINKER)        print_help_linker();
+       if (sections & HELP_LANGUAGETOOLS) print_help_language_tools();
+       if (sections & HELP_DEBUG)         print_help_debug();
+       if (sections & HELP_FIRM)          print_help_firm();
 }
 
 static void set_be_option(const char *arg)
@@ -735,12 +921,12 @@ int main(int argc, char **argv)
        setup_target_machine();
 
        /* parse rest of options */
-       standard                   = STANDARD_DEFAULT;
-       unsigned   features_on     = 0;
-       unsigned   features_off    = 0;
-       filetype_t forced_filetype = FILETYPE_AUTODETECT;
-       bool       help_displayed  = false;
-       bool       argument_errors = false;
+                       standard        = STANDARD_DEFAULT;
+       unsigned        features_on     = 0;
+       unsigned        features_off    = 0;
+       filetype_t      forced_filetype = FILETYPE_AUTODETECT;
+       help_sections_t help            = HELP_NONE;
+       bool            argument_errors = false;
        for (int i = 1; i < argc; ++i) {
                const char *arg = argv[i];
                if (arg[0] == '-' && arg[1] != '\0') {
@@ -899,6 +1085,9 @@ int main(int argc, char **argv)
                                                   streq(opt, "align-functions")         ||
                                                   streq(opt, "PIC")) {
                                                fprintf(stderr, "ignoring gcc option '-f%s'\n", orig_opt);
+                                       } else if (streq(opt, "help")) {
+                                               fprintf(stderr, "warning: -fhelp is deprecated\n");
+                                               help |= HELP_FIRM;
                                        } else {
                                                int res = firm_option(orig_opt);
                                                if (res == 0) {
@@ -906,23 +1095,25 @@ int main(int argc, char **argv)
                                                                orig_opt);
                                                        argument_errors = true;
                                                        continue;
-                                               } else if (res == -1) {
-                                                       help_displayed = true;
                                                }
                                        }
                                }
                        } else if (option[0] == 'b') {
                                const char *opt;
                                GET_ARG_AFTER(opt, "-b");
-                               int res = be_parse_arg(opt);
-                               if (res == 0) {
-                                       fprintf(stderr, "error: unknown Firm backend option '-b %s'\n",
-                                               opt);
-                                       argument_errors = true;
-                               } else if (res == -1) {
-                                       help_displayed = true;
-                               } else if (strstart(opt, "isa=")) {
-                                       strncpy(cpu_arch, opt, sizeof(cpu_arch));
+
+                               if (streq(opt, "help")) {
+                                       fprintf(stderr, "warning: -bhelp is deprecated (use --help-firm)\n");
+                                       help |= HELP_FIRM;
+                               } else {
+                                       int res = be_parse_arg(opt);
+                                       if (res == 0) {
+                                               fprintf(stderr, "error: unknown Firm backend option '-b %s'\n",
+                                                               opt);
+                                               argument_errors = true;
+                                       } else if (strstart(opt, "isa=")) {
+                                               strncpy(cpu_arch, opt, sizeof(cpu_arch));
+                                       }
                                }
                        } else if (option[0] == 'W') {
                                if (option[1] == '\0') {
@@ -1116,8 +1307,23 @@ int main(int argc, char **argv)
                                        print_cparser_version();
                                        return EXIT_SUCCESS;
                                } else if (streq(option, "help")) {
-                                       print_help(argv[0]);
-                                       help_displayed = true;
+                                       help |= HELP_BASIC;
+                               } else if (streq(option, "help-parser")) {
+                                       help |= HELP_PARSER;
+                               } else if (streq(option, "help-warnings")) {
+                                       help |= HELP_WARNINGS;
+                               } else if (streq(option, "help-codegen")) {
+                                       help |= HELP_CODEGEN;
+                               } else if (streq(option, "help-linker")) {
+                                       help |= HELP_LINKER;
+                               } else if (streq(option, "help-language-tools")) {
+                                       help |= HELP_LANGUAGETOOLS;
+                               } else if (streq(option, "help-debug")) {
+                                       help |= HELP_DEBUG;
+                               } else if (streq(option, "help-firm")) {
+                                       help |= HELP_FIRM;
+                               } else if (streq(option, "help-all")) {
+                                       help |= HELP_ALL;
                                } else if (streq(option, "dump-function")) {
                                        ++i;
                                        if (i >= argc) {
@@ -1187,7 +1393,8 @@ int main(int argc, char **argv)
                }
        }
 
-       if (help_displayed) {
+       if (help != HELP_NONE) {
+               print_help(argv[0], help);
                return !argument_errors;
        }
 
index 34062c8..9b09d2c 100644 (file)
--- a/warning.c
+++ b/warning.c
@@ -20,6 +20,7 @@
 #include <stdio.h>
 #include <string.h>
 #include "warning.h"
+#include "help.h"
 
 warning_t warning = {
        .other                               = true,
@@ -75,6 +76,65 @@ warning_t warning = {
        .write_strings                       = false
 };
 
+void print_warning_opt_help(void)
+{
+       /* TODO: write explanations */
+       put_help("-Waddress",                       "");
+       put_help("-Wall",                           "");
+       put_help("-Waggregate-return",              "");
+       put_help("-Wattribute",                     "");
+       put_help("-Wcast-qual",                     "");
+       put_help("-Wchar-subscripts",               "");
+       put_help("-Wcomment",                       "");
+       put_help("-Wconversion",                    "");
+       put_help("-Wdeclaration-after-statement",   "");
+       put_help("-Wdeprecated-declarations",       "");
+       put_help("-Wdiv-by-zero",                   "");
+       put_help("-Wempty-statement",               "");
+       put_help("-Werror",                         "warnings are errors");
+       put_help("-Werror-implicit-function-declaration", "");
+       put_help("-Wextra",                         "");
+       put_help("-Wfatal-errors",                  "");
+       put_help("-Wfloat-equal",                   "");
+       put_help("-Wformat",                        "");
+       put_help("-Wimplicit",                      "");
+       put_help("-Wimplicit-function-declaration", "");
+       put_help("-Wimplicit-int",                  "");
+       put_help("-Winit-self",                     "");
+       put_help("-Wlong-long",                     "");
+       put_help("-Wmain",                          "");
+       put_help("-Wmissing-declarations",          "");
+       put_help("-Wmissing-noreturn",              "");
+       put_help("-Wmissing-prototypes",            "");
+       put_help("-Wmultichar",                     "");
+       put_help("-Wnested-externs",                "");
+       put_help("-Wnonnull",                       "");
+       put_help("-Wold-style-definition",          "");
+       put_help("-Wparentheses",                   "");
+       put_help("-Wpacked",                        "");
+       put_help("-Wpadded",                        "");
+       put_help("-Wparentheses",                   "");
+       put_help("-Wpointer-arith",                 "");
+       put_help("-Wredundant-decls",               "");
+       put_help("-Wreturn-type",                   "");
+       put_help("-Wshadow",                        "");
+       put_help("-Wsign-compare",                  "");
+       put_help("-Wstrict-prototypes",             "");
+       put_help("-Wswitch-default",                "");
+       put_help("-Wswitch-enum",                   "");
+       put_help("-Wtraditional",                   "");
+       put_help("-Wuninitialized",                 "");
+       put_help("-Wunknown-pragmas",               "");
+       put_help("-Wunreachable-code",              "");
+       put_help("-Wunused",                        "");
+       put_help("-Wunused-function",               "");
+       put_help("-Wunused-label",                  "");
+       put_help("-Wunused-parameter",              "");
+       put_help("-Wunused-value",                  "");
+       put_help("-Wunused-variable",               "");
+       put_help("-Wwrite-strings",                 "");
+}
+
 void set_warning_opt(const char *const opt)
 {
        const char* s = opt;
index 42ea5db..bdad144 100644 (file)
--- a/warning.h
+++ b/warning.h
@@ -24,6 +24,8 @@
 
 void set_warning_opt(const char *opt);
 
+void print_warning_opt_help(void);
+
 typedef struct warning_t {
        bool other:1;                               /**< Warnings not covered by any option below */