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
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 #include <elf.h>
00067 #include <stdio.h>
00068 #include <sys/types.h>
00069 #include <sys/stat.h>
00070 #include <search.h>
00071 #include <string.h>
00072 #include <stdlib.h>
00073 #include <unistd.h>
00074
00075 #include "wn.h"
00076 #include "stab.h"
00077 #include "aux_stab.h"
00078 #include "irbdata.h"
00079 #include "wintrinsic.h"
00080 #include "glob.h"
00081 #include "pu_info.h"
00082 #include "ir_bread.h"
00083 #include "ir_bwrite.h"
00084 #include "file_util.h"
00085 #include "gdar.h"
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 #define MAX_FNAME_LENGTH 256
00096
00097 char filename_in[MAX_FNAME_LENGTH];
00098 char filename_out[MAX_FNAME_LENGTH];
00099 char gdar_filename[MAX_FNAME_LENGTH];
00100 char temp_filename[MAX_FNAME_LENGTH+16];
00101
00102 char *GDAR_File_Name = NULL;
00103 char *Irb_File_Name_out = NULL;
00104
00105 struct stat statbuf;
00106
00107 BOOL gflag = FALSE;
00108 BOOL oflag = FALSE;
00109 BOOL vflag = FALSE;
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 static void
00123 Usage (void)
00124 {
00125 fprintf (stderr,
00126 "USAGE:\n"
00127 "\n"
00128 "\t [-v] [-o <Whirl_File_Name_out>] -g <GDAR_File_Name> <Whirl_File_Name>\n"
00129 "\n"
00130 "The optional -v flag controls verbose trace messages.\n"
00131 "The optional -o flag is used to specify an alternate out file.\n"
00132 "The -g <GDAR_File_Name> is a mandatory command line argument.\n"
00133 "The <Whirl_File_Name> is a mandatory command line argument.\n"
00134 "\n"
00135 );
00136
00137 }
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 static INT32
00153 Get_Irb_File_Name (INT argc, char *argv[])
00154 {
00155
00156 char *fname;
00157 INT32 argidx;
00158 INT32 src_count = 0;
00159
00160 for (argidx = 1; argidx < argc; argidx++)
00161 {
00162
00163 if (argv[argidx][0] == '-' )
00164 {
00165
00166 if (strcmp (argv[argidx], "-o") == 0) {
00167 oflag = TRUE;
00168 fname = argv[++argidx];
00169 if (strlen(fname) > MAX_FNAME_LENGTH)
00170 {
00171 Irb_File_Name_out = strncpy (filename_out, fname, MAX_FNAME_LENGTH);
00172 filename_out[MAX_FNAME_LENGTH] = '\0';
00173 fprintf (stderr,
00174 "WARNING: output filename truncated to "
00175 "(max=%d chars): \"%s\"\n",
00176 MAX_FNAME_LENGTH, fname);
00177 }
00178 else
00179 Irb_File_Name_out = strcpy (filename_out, fname);
00180 } else if (strcmp (argv[argidx], "-g") == 0) {
00181 gflag = TRUE;
00182 fname = argv[++argidx];
00183 if (strlen(fname) > MAX_FNAME_LENGTH)
00184 {
00185 GDAR_File_Name = strncpy (gdar_filename, fname, MAX_FNAME_LENGTH);
00186 gdar_filename[MAX_FNAME_LENGTH] = '\0';
00187 fprintf (stderr,
00188 "WARNING: GDAR filename truncated to "
00189 "(max=%d chars): \"%s\"\n",
00190 MAX_FNAME_LENGTH, fname);
00191 }
00192 else
00193 GDAR_File_Name = strcpy (gdar_filename, fname);
00194 } else if (strcmp (argv[argidx], "-v") == 0) {
00195 vflag = TRUE;
00196 } else {
00197 fprintf (stderr,
00198 "WARNING: unrecognized command option "
00199 "%s\n",
00200 argv[argidx]);
00201 }
00202 }
00203 else if (src_count > 0)
00204 src_count += 1;
00205 else if (src_count == 0)
00206 {
00207
00208 fname = argv[argidx];
00209 if (strlen(fname) > MAX_FNAME_LENGTH)
00210 {
00211 Irb_File_Name = strncpy (filename_in, fname, MAX_FNAME_LENGTH);
00212 filename_in[MAX_FNAME_LENGTH] = '\0';
00213 fprintf (stderr,
00214 "WARNING: input filename truncated to "
00215 "(max=%d chars): \"%s\"\n",
00216 MAX_FNAME_LENGTH, fname);
00217 }
00218 else
00219 Irb_File_Name = strcpy (filename_in, fname);
00220
00221 src_count = 1;
00222 }
00223 }
00224 return src_count;
00225 }
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237 static void
00238 read_pu (PU_Info *pu_tree)
00239 {
00240 PU_Info *pu;
00241
00242 for (pu = pu_tree; pu != NULL; pu = PU_Info_next(pu)) {
00243 Current_PU_Info = pu;
00244 Read_Local_Info (MEM_pu_nz_pool_ptr, pu);
00245
00246 if (PU_Info_child(pu)) {
00247 read_pu (PU_Info_child(pu));
00248 }
00249 }
00250 }
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 static void
00263 write_pu (PU_Info *pu_tree)
00264 {
00265 PU_Info *pu;
00266
00267 for (pu = pu_tree; pu != NULL; pu = PU_Info_next(pu)) {
00268 Current_PU_Info = pu;
00269 Write_PU_Info (pu);
00270 }
00271 }
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283 void
00284 main (INT argc,
00285 char *argv[],
00286 char *envp[])
00287 {
00288 WN *pu;
00289 INT32 inp_file_count;
00290 PU_Info *pu_tree, *current_pu;
00291
00292
00293
00294
00295 MEM_Initialize ();
00296 Init_Error_Handler (10);
00297 Set_Error_Line (ERROR_LINE_UNKNOWN);
00298 Set_Error_Phase ("IR Walker");
00299 Set_Error_File (NULL);
00300
00301 Init_Operator_To_Opcode_Table ();
00302
00303
00304 inp_file_count = Get_Irb_File_Name (argc, argv);
00305 if (inp_file_count == 0)
00306 {
00307 Usage ();
00308 fprintf (stderr, "ERROR: missing input file on command line\n");
00309 }
00310 else if (inp_file_count > 1)
00311 {
00312 Usage ();
00313 fprintf (stderr, "ERROR: too many input files on command line\n");
00314 }
00315 else if (stat (Irb_File_Name, &statbuf) != 0)
00316 {
00317 fprintf (stderr, "ERROR: input file (%s) does not exist\n",
00318 Irb_File_Name);
00319 }
00320 else if (!gflag)
00321 {
00322 Usage ();
00323 fprintf (stderr, "ERROR: missing GDAR file on command line\n");
00324 }
00325 else if (stat (GDAR_File_Name, &statbuf) != 0)
00326 {
00327 fprintf (stderr, "ERROR: GDAR file (%s) does not exist\n",
00328 GDAR_File_Name);
00329 }
00330 else
00331 {
00332
00333
00334 if (!oflag)
00335 (void) strcpy (filename_out, filename_in);
00336 (void) sprintf (temp_filename, "%s$%d", filename_out, (INT32) getpid ());
00337 (void) remove (temp_filename);
00338
00339
00340
00341
00342 (void) Open_Input_Info (Irb_File_Name);
00343 pu_tree = Read_Global_Info (NULL);
00344
00345
00346 (void) Open_Output_Info (temp_filename);
00347
00348
00349 read_pu (pu_tree);
00350
00351
00352 Process_GDAR (GDAR_File_Name, Global_Symtab, &pu_tree);
00353
00354
00355 write_pu (pu_tree);
00356
00357
00358 Write_Global_Info (pu_tree);
00359 Close_Output_Info ();
00360 (void) remove (filename_out);
00361 (void) rename (temp_filename, filename_out);
00362
00363 }
00364
00365 exit (0);
00366 }
00367
00368
00369
00370
00371
00372 void Signal_Cleanup (INT sig) { }
00373
00374 char * Host_Format_Parm (INT kind, MEM_PTR parm) { return NULL; }
00375
00376 INT8 Debug_Level = 0;