00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00032 #include <stdio.h>
00033 #include <stdlib.h>
00034
00035 #include <getopt.h>
00036
00037 #include "workaround.h"
00038 #include "mempool.h"
00039 #include "messg.h"
00040 #include "dipa_args.h"
00041 #include "dipa_phase_ctrl.h"
00042
00043 #define DIPA_VERSION "0.0.0.0"
00044 #define DIPA_FULLNAME "Open Runtime IPA"
00045
00046 enum {
00047 OPTID_HELP = 1000,
00048 OPTID_TFILE,
00049 OPTID_OPT_LEVEL0,
00050 OPTID_OPT_LEVEL1,
00051 OPTID_OPT_LEVEL2,
00052 OPTID_OPT_LEVEL3,
00053 OPTID_PHASE_BASE=2000
00054 };
00055
00056
00057 const char *dipa_usage_desc =
00058 "Usage: dipa [options] file...\n\
00059 ";
00060
00061 #define MAX_DIPA_OPTIONS 256
00062
00063 static struct option dipa_options[MAX_DIPA_OPTIONS] = {
00064 {"help", 0, 0, OPTID_HELP},
00065 {"wt", 1, 0, OPTID_TFILE},
00066 {"O0", 0, 0, OPTID_OPT_LEVEL0},
00067 {"O1", 0, 0, OPTID_OPT_LEVEL1},
00068 {"O2", 0, 0, OPTID_OPT_LEVEL2},
00069 {"O3", 0, 0, OPTID_OPT_LEVEL3},
00070 {"noopt", 0, 0, OPTID_OPT_LEVEL3},
00071 {0, 0, 0, 0}
00072 };
00073
00074 void Dipa_Print_Version(void)
00075 {
00076 fprintf(stderr, "%s Version %s\n", DIPA_FULLNAME, DIPA_VERSION);
00077 exit (0);
00078 }
00079
00080 void Dipa_Print_Usage(void)
00081 {
00082 fprintf(stderr, "%s Version %s\n", DIPA_FULLNAME, DIPA_VERSION);
00083 fprintf(stderr, "%s", dipa_usage_desc);
00084 exit (0);
00085 }
00086
00087 void Dipa_add_phase_opt(char *ph_name, INT32 phase_id)
00088 {
00089 INT32 i;
00090
00091 for (i=0; i<MAX_DIPA_OPTIONS-1; i++) {
00092 if (dipa_options[i].name == NULL) {
00093 struct option *ph_opt = &dipa_options[i];
00094 ph_opt->name = ph_name;
00095 ph_opt->has_arg = 1;
00096 ph_opt->flag = 0;
00097 ph_opt->val = OPTID_PHASE_BASE + phase_id;
00098
00099
00100 ph_opt++;
00101 ph_opt->name = NULL;
00102 ph_opt->has_arg = 0;
00103 ph_opt->flag = 0;
00104 ph_opt->val = 0;
00105 return;
00106 }
00107 }
00108 FmtAssert((i < MAX_DIPA_OPTIONS), ("Too many phases\n"));
00109 }
00110
00120 void Dipa_Proc_Options ( INT32 argc, char *argv[])
00121 {
00122 INT32 opt_index, val;
00123 while (1) {
00124 opt_index = 0;
00125
00126
00127 val = getopt_long_only(argc, argv, "-v", dipa_options, &opt_index);
00128 if (val == -1)
00129 break;
00130
00131 if (val >= OPTID_PHASE_BASE) {
00132
00133 if (strcasecmp(optarg, "help") == 0) {
00134 DIPA_Phase_Manager::Get_Phase(val-OPTID_PHASE_BASE)->Help();
00135 exit (0);
00136 }
00137 DIPA_Phase_Manager::Get_Phase(val-OPTID_PHASE_BASE)->Add_Arg(optarg);
00138 continue;
00139 }
00140
00141
00142 switch (val) {
00143 case 1:
00144 printf("Non-option:%s\n", optarg);
00145 DIPA_Phase_Manager::Add_DIPA_File(optarg);
00146 break;
00147
00148 case 'v':
00149 Dipa_Print_Version();
00150 break;
00151
00152 case OPTID_HELP:
00153 Dipa_Print_Usage();
00154 break;
00155 case OPTID_TFILE:
00156 DIPA_Phase_Manager::Init_Trace_File ( optarg );
00157 break;
00158 case OPTID_OPT_LEVEL0:
00159 case OPTID_OPT_LEVEL1:
00160 case OPTID_OPT_LEVEL2:
00161 case OPTID_OPT_LEVEL3:
00162
00163 break;
00164 case '?':
00165 printf("Undefined option:%s\n", argv[optind-1]);
00166 break;
00167 }
00168 if (val == '?')
00169 continue;
00170
00171
00172 if (val != 1) {
00173 DIPA_Phase_Manager::Add_Global_Arg(dipa_options[opt_index].name, optarg);
00174 } else {
00175
00176 DIPA_Phase_Manager::Add_Global_Arg(NULL, optarg);
00177 }
00178 }
00179 }
00180