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
00067
00068
00069
00070 #define USE_STANDARD_TYPES
00071 #include <stdarg.h>
00072 #include <stdlib.h>
00073 #include <unistd.h>
00074 #include <sys/types.h>
00075 #include <signal.h>
00076 #include <string.h>
00077 #if (__GNUC__==2)
00078 extern "C" char *strsignal (int __sig);
00079 #endif
00080 #include <ctype.h>
00081
00082 #if defined(IRIX)
00083 #define _LANGUAGE_C
00084 extern "C" {
00085 #include <sys/fpu.h>
00086 }
00087 #undef _LANGUAGE_C
00088 #include <sys/syssgi.h>
00089 #endif
00090
00091 #if defined(KEY) && defined(linux)
00092 #include <execinfo.h>
00093 #endif
00094
00095 #include <errno.h>
00096 #include <cmplrs/rcodes.h>
00097 #include "defs.h"
00098 #ifdef AWAITING_NEWCOMP
00099 #include "config.h"
00100 #endif
00101 #define IN_ERRORS_C
00102 #include "errors.h"
00103 #undef IN_ERRORS_C
00104 #include "err_host.h"
00105 #include "erglob.h"
00106 #include "file_util.h"
00107 #include "tracing.h"
00108 #include "glob.h"
00109 #include "errdesc.h"
00110 #include "vstring.h"
00111
00112 #ifdef MONGOOSE_BE
00113 #include "wn.h"
00114 #include "wn_map.h"
00115 #include "ir_reader.h"
00116 #endif
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126 INT Min_Error_Severity = ES_ADVISORY;
00127 INT Conformance_Level = ES_IGNORE;
00128
00129
00130 static const char *Compiler_File = NULL;
00131 static INT Compiler_Line = 0;
00132
00133
00134 static FILE *Error_File = NULL;
00135 static const char *Error_File_Name = NULL;
00136
00137
00138 static FILE *Trace_File = NULL;
00139
00140
00141 #ifdef KEY
00142 static char source_file_name[FILENAME_MAX + 1];
00143 #else
00144 static char source_file_name[256];
00145 #endif
00146 static char *Source_File_Name = &source_file_name[0];
00147 static INT Source_Line = ERROR_LINE_UNKNOWN;
00148
00149
00150 static const char *Current_Phase = "<unknown phase>";
00151
00152
00153 static INT Error_Counts[ES_MAX+1];
00154 static INT Error_Count = 0;
00155 static BOOL Phase_Error = FALSE;
00156 static INT Max_Errors = 100;
00157
00158 static BOOL Had_Compiler_Error = FALSE;
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168 typedef struct {
00169 INT level;
00170 char symbol[5];
00171 const char *name;
00172 } SEVERITY_DESCRIPTOR;
00173
00174 static SEVERITY_DESCRIPTOR Severities[] = {
00175 {ES_IGNORE, "??? ", "Ignore"},
00176 {ES_ADVISORY, "--- ", "Advisory"},
00177 {ES_WARNING, "!!! ", "Warning"},
00178 {ES_CONFORMANCE, "!!! ", "Conformance warning"},
00179 {ES_ERRBENIGN, "### ", "Error"},
00180 {ES_ERRPHASE, "### ", "Error"},
00181 {ES_ERRABORT, "### ", "Error"}
00182 };
00183
00184
00185 #define SEV_level(n) (Severities[n].level)
00186 #define SEV_symbol(n) (Severities[n].symbol)
00187 #define SEV_name(n) (Severities[n].name)
00188
00189
00190
00191
00192
00193
00194
00195
00196 #if defined(MONGOOSE_BE) && defined(SHARED_BUILD)
00197 #include "err_host.tab"
00198 #else
00199
00200 static ERROR_DESC_TABLE *Phases = NULL;
00201 static const char **host_errlist = NULL;
00202 #endif
00203
00204 static bool do_traceback = false;
00205
00206
00207 #define Phase_Num(n) (Phases[n].phase)
00208 #define Phase_List(n) (Phases[n].descriptors)
00209 #define Phase_Name(n) (Phases[n].name)
00210
00211 #if !defined(linux) && !defined(__APPLE__) && !defined(BUILD_OS_DARWIN)
00212 extern char *sys_siglist[];
00213 #endif
00214
00215
00216 static char dont_print[RAG_EN_LAST-RAG_EN_FIRST+1];
00217 #define Dont_Print_Warning(i) dont_print[i-RAG_EN_FIRST]
00218
00219 #define Heed_Woff(rag_errnum, severity) \
00220 (Dont_Print_Warning(rag_errnum) && (severity < ES_ERRBENIGN) )
00221
00222 extern void Rag_Handle_Woff_Args(char *wstring);
00223
00224 static void dump_backtrace(FILE *fp = stderr, size_t start_frame = 1)
00225 {
00226 #if defined(KEY) && defined(linux)
00227 const int nframes = 32;
00228 void *buf[nframes];
00229 char **strings;
00230 size_t size;
00231
00232 size = backtrace(buf, nframes);
00233 strings = backtrace_symbols(buf, size);
00234
00235 fprintf(fp, "*** Internal stack backtrace:\n");
00236
00237 for (size_t i = start_frame; i < size; i++) {
00238 fprintf(fp, " %s\n", strings[i]);
00239 }
00240 fflush(fp);
00241 #endif
00242 }
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256 static void
00257 catch_signal (INT sig, INT error_num)
00258 {
00259 signal ( sig, SIG_DFL );
00260
00261 switch (sig) {
00262 #ifndef __MINGW32__
00263 case SIGBUS:
00264 #endif
00265 case SIGSEGV:
00266 if (error_num == ENXIO || error_num == ENOSPC)
00267
00268
00269 Fatal_Error ("I/O error in mmapped object: %s",
00270 strerror(error_num));
00271 }
00272
00273 #ifdef __MINGW32__
00274 fprintf (stderr, "Signal: %s", "caught" );
00275 #else
00276 fprintf (stderr, "Signal: %s", strsignal(sig) );
00277 #endif
00278 fflush ( stderr );
00279 fprintf ( stderr, " in %s phase.\n",
00280 Current_Phase ? Current_Phase : "startup" );
00281
00282 do_traceback = true;
00283
00284 Signal_Cleanup ( sig );
00285 #ifdef __MINGW32__
00286 if ( sig == SIGINT || sig == SIGTERM ) {
00287 raise ( sig);
00288
00289 exit(RC_INTERNAL_ERROR);
00290 }
00291 #else
00292 if ( sig == SIGHUP || sig == SIGINT || sig == SIGTERM ) {
00293 kill ( getpid(), sig);
00294
00295 exit(RC_INTERNAL_ERROR);
00296 }
00297 #endif
00298 signal ( SIGILL, SIG_DFL );
00299 #ifdef __MINGW32__
00300 ErrMsgLine ( EC_Signal, ERROR_LINE_UNKNOWN,
00301 "caught", Current_Phase );
00302 #else
00303 signal ( SIGBUS, SIG_DFL );
00304 ErrMsgLine ( EC_Signal, ERROR_LINE_UNKNOWN,
00305 strsignal(sig), Current_Phase );
00306 #endif
00307
00308 exit(RC_INTERNAL_ERROR);
00309 }
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322 inline static void
00323 setup_signal_handler (int s)
00324 {
00325 if (signal (s, SIG_IGN) != SIG_IGN)
00326 signal (s, reinterpret_cast <void (*)(int)> (catch_signal));
00327 }
00328
00329
00330 void
00331 Handle_Signals ( void )
00332 {
00333 #ifndef __MINGW32__
00334 setup_signal_handler (SIGHUP);
00335 setup_signal_handler (SIGQUIT);
00336 setup_signal_handler (SIGTRAP);
00337 setup_signal_handler (SIGBUS);
00338 #endif
00339 setup_signal_handler (SIGINT);
00340 setup_signal_handler (SIGILL);
00341 setup_signal_handler (SIGIOT);
00342 setup_signal_handler (SIGABRT);
00343 #if defined(IRIX)
00344 setup_signal_handler (SIGEMT);
00345 #endif
00346 setup_signal_handler (SIGFPE);
00347 setup_signal_handler (SIGSEGV);
00348 setup_signal_handler (SIGTERM);
00349 #if defined(IRIX)
00350 syssgi(SGI_SET_FP_PRECISE, 1);
00351 set_fpc_csr(get_fpc_csr() & ~FPCSR_FLUSH_ZERO);
00352 syssgi(SGI_SET_FP_PRESERVE, 1);
00353 #endif
00354 }
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368 void
00369 Set_Error_File ( const char *fname )
00370 {
00371
00372 if ( Error_File ) {
00373 fclose ( Error_File );
00374 Error_File = NULL;
00375 }
00376
00377
00378 Error_File_Name = fname;
00379 if ( Is_File(Error_File_Name) ) {
00380 unlink ( Error_File_Name );
00381 }
00382 }
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395 static BOOL
00396 Init_Error_File (void)
00397 {
00398 if ( Error_File != NULL ) return TRUE;
00399 if ( Error_File_Name != NULL ) {
00400 Error_File = fopen ( Error_File_Name, "a" );
00401 if ( Error_File == NULL ) return FALSE;
00402 if ( Same_File (Error_File, stderr) ) {
00403 fclose ( Error_File );
00404 Error_File = NULL;
00405 Error_File_Name = NULL;
00406 return FALSE;
00407 }
00408 return TRUE;
00409 }
00410 return FALSE;
00411 }
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424 void
00425 Set_Error_Trace ( FILE *stream )
00426 {
00427 if ( Same_File (stream, stderr) )
00428 Trace_File = NULL;
00429 else
00430 Trace_File = stream;
00431 }
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442 void
00443 Set_Error_Source ( const char *filename )
00444 {
00445 if ( filename == NULL ) {
00446 Source_File_Name = NULL;
00447 } else {
00448 Source_File_Name = &source_file_name[0];
00449 #ifdef KEY
00450 strncpy ( Source_File_Name, filename, sizeof source_file_name );
00451 #else
00452 strcpy ( Source_File_Name, filename );
00453 #endif
00454 }
00455 }
00456
00457
00458 #ifdef MONGOOSE_BE
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468 void
00469 Set_Error_Srcpos ( SRCPOS srcpos )
00470 {
00471 const char *fname = NULL;
00472 const char *dname;
00473
00474 Set_Error_Line(Srcpos_To_Line(srcpos));
00475 IR_Srcpos_Filename(srcpos, &fname, &dname);
00476 Set_Error_Source(fname);
00477 }
00478 #endif
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490 void
00491 Set_Error_Line ( INT lineno )
00492 {
00493 Source_Line = lineno;
00494 }
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506 void
00507 Set_Error_Phase ( const char *phase )
00508 {
00509 Current_Phase = phase;
00510 #ifdef BACK_END
00511 if (Get_Trace(TP_MISC, 4)) {
00512 fprintf(stderr, "Entering PU %s phase %s\n",
00513 Cur_PU_Name ? Cur_PU_Name : "(None)", phase);
00514 fprintf(TFile, "Entering PU %s phase %s\n",
00515 Cur_PU_Name ? Cur_PU_Name : "(None)", phase);
00516 }
00517 #endif
00518 switch (phase[0]) {
00519 case 'A':
00520 if (strcmp(phase, "Alias Analysis") == 0)
00521 Set_Current_Phase_Number(TP_ALIAS);
00522 else if (strcmp(phase, "Assembly") == 0)
00523 Set_Current_Phase_Number(TP_EMIT);
00524 break;
00525
00526 case 'C':
00527 if (strcmp(phase, "Code Generation") == 0)
00528 Set_Current_Phase_Number(TP_CGEXP);
00529 break;
00530
00531 case 'H':
00532 if (strcmp(phase, "Hyperblock formation") == 0)
00533 Set_Current_Phase_Number(TP_HBF);
00534 break;
00535 case 'G':
00536 if (strcmp(phase, "Global Live Range Analysis") == 0)
00537 Set_Current_Phase_Number(TP_FIND_GLOB);
00538 else if (strcmp(phase, "Global Code Motion") == 0)
00539 Set_Current_Phase_Number(TP_GCM);
00540 break;
00541
00542 case 'O':
00543 if (strcmp(phase, "Optimizer") == 0)
00544 Set_Current_Phase_Number(TP_WOPT1);
00545 break;
00546
00547 case 'P':
00548 if (strcmp(phase, "Pre-Optimizer") == 0)
00549 Set_Current_Phase_Number(TP_GLOBOPT);
00550 break;
00551
00552 case 'R':
00553 if (strcmp(phase, "Reading IR file") == 0)
00554 Set_Current_Phase_Number(TP_IR_READ);
00555 else if (strcmp(phase, "Reorder Blocks") == 0)
00556 Set_Current_Phase_Number(TP_FLOWOPT);
00557 else if (strcmp(phase, "Register Allocation") == 0)
00558 Set_Current_Phase_Number(TP_GRA);
00559 break;
00560
00561 case 'S':
00562 if (strcmp(phase, "Software Pipelining") == 0)
00563 Set_Current_Phase_Number(TP_SWPIPE);
00564 break;
00565 case 'T':
00566 if (strcmp(phase, "Tree-Height Reduction") == 0)
00567 Set_Current_Phase_Number(TP_THR);
00568 break;
00569 }
00570
00571 }
00572
00573 const char *
00574 Get_Error_Phase ( void )
00575 {
00576 return Current_Phase;
00577 }
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590 BOOL
00591 Get_Error_Count ( INT *ErrCount, INT *WarnCount )
00592 {
00593 *ErrCount = Error_Count;
00594 *WarnCount = Error_Counts[ES_WARNING];
00595 return Phase_Error;
00596 }
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609 void
00610 Init_Error_Handler ( INT Max_Errors_Allowed )
00611 {
00612 INT i;
00613
00614
00615 Max_Errors = Max_Errors_Allowed;
00616 Phase_Error = FALSE;
00617 Error_Count = 0;
00618 for ( i=0; i<=ES_MAX; i++ ) {
00619 Error_Counts[i] = 0;
00620 }
00621
00622
00623 if ( Error_File ) {
00624 fclose ( Error_File );
00625 }
00626 Error_File = NULL;
00627 Error_File_Name = NULL;
00628
00629
00630 Source_File_Name = NULL;
00631 Source_Line = ERROR_LINE_UNKNOWN;
00632 Current_Phase = "<unknown phase>";
00633 }
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644 static ERROR_DESC *
00645 Find_Error_Desc ( INT ecode )
00646 {
00647 INT phase = ecode/1000;
00648 INT i;
00649 ERROR_DESC *edesc;
00650
00651
00652 for ( i=0; Phase_Num(i) != -1; i++ ) {
00653 if ( Phase_Num(i) == phase ) {
00654
00655 for ( edesc = Phase_List(i); ED_code(edesc) != -1; edesc++ ) {
00656 if ( ED_code(edesc) == ecode ) return edesc;
00657 }
00658 break;
00659 }
00660 }
00661
00662
00663 return Find_Error_Desc ( EC_Undef_Code );
00664 }
00665
00666
00667 static FILE *Crash_File;
00668
00669 static BOOL
00670 Init_Crash_Report (void)
00671 {
00672 if (Crash_File != NULL)
00673 return TRUE;
00674
00675 #if defined(VENDOR_OSP)
00676 char *name = getenv("OPEN64_CRASH_REPORT");
00677 #elif defined(VENDOR_SL)
00678 char *name = getenv("SL_CRASH_REPORT");
00679 #else
00680 char *name = getenv("PSC_CRASH_REPORT");
00681 #endif
00682
00683 if (name == NULL)
00684 return FALSE;
00685
00686 if ((Crash_File = fopen(name, "a")) == NULL)
00687 return FALSE;
00688
00689 return TRUE;
00690 }
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704 static void
00705 Emit ( FILE *File,
00706 char *msg,
00707 char *hmsg,
00708 char *emsg,
00709 BOOL report_location )
00710 {
00711 if ( report_location ) {
00712 fputs ( msg, File );
00713 }
00714 fputs ( hmsg, File );
00715 fputs ( emsg, File );
00716 fflush ( File );
00717 if ( do_traceback ) {
00718 dump_backtrace ( File );
00719 }
00720 }
00721
00722 static void
00723 Emit_Message (
00724 char *hmsg,
00725 char *emsg )
00726 {
00727 char msg[1024];
00728 BOOL report_location = FALSE;
00729
00730
00731 if ( Compiler_File != NULL ) {
00732 sprintf ( msg, "\n### Assertion failure at line %d of %s:\n",
00733 Compiler_Line, Compiler_File );
00734 report_location = TRUE;
00735 }
00736
00737
00738 Emit ( stderr, msg, hmsg, emsg, report_location );
00739
00740
00741 if ( Init_Crash_Report() ) {
00742 Emit ( Crash_File, msg, hmsg, emsg, report_location );
00743 }
00744
00745 if ( Compiler_File != NULL ) {
00746 Compiler_File = NULL;
00747 }
00748
00749
00750 if ( Init_Error_File() ) {
00751 Emit ( Error_File, msg, hmsg, emsg, report_location );
00752 }
00753
00754
00755 if ( Trace_File != NULL ) {
00756 Emit ( Trace_File, msg, hmsg, emsg, report_location );
00757 }
00758
00759 if ( do_traceback )
00760 do_traceback = false;
00761 }
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772 static void
00773 ErrMsg_Report_Nonuser ( ERROR_DESC *edesc, INT ecode, INT line,
00774 #ifdef TARG_NVISA
00775
00776
00777
00778
00779
00780 const char *file, const char *dname, va_list vp )
00781 #else
00782 const char *file, va_list vp )
00783 #endif
00784 {
00785 INT dlevel = ED_severity(edesc);
00786 INT mlevel = dlevel;
00787 # define BUFLEN 1024
00788 # define BUFLEN_NONUSER 1024
00789 char hmsg[BUFLEN];
00790 vstring emsg;
00791 INTPS mparm[MAX_ERR_PARMS];
00792
00793
00794 INT loc = 0;
00795 static char buf[BUFLEN_NONUSER];
00796 const char *result;
00797 INT kind;
00798
00799 INT pnum;
00800 INTPS parm;
00801
00802
00803 ++Error_Counts[dlevel];
00804 if ( dlevel >= ES_ERROR ) ++Error_Count;
00805 if ( dlevel >= ES_ERRPHASE) Phase_Error = TRUE;
00806
00807
00808 if ( dlevel == ES_CONFORMANCE ) mlevel = Conformance_Level;
00809
00810
00811 if ( mlevel < Min_Error_Severity ) return;
00812 if (Heed_Woff( ED_rag_errnum(edesc) , mlevel)) return;
00813
00814
00815 if ( ! ED_continuation(edesc) ) {
00816 #ifdef TARG_NVISA
00817 if (dname && *dname) {
00818 loc += sprintf (&hmsg[0], "%s/", dname);
00819 }
00820 loc += sprintf ( &hmsg[loc], "%s(%d): ", file && *file? file: "<input>", line);
00821 loc += sprintf ( &hmsg[loc], "%s%s%s", SEV_symbol(mlevel),
00822 ED_unknown(edesc) ? "Unknown Compiler " :
00823 (ED_compiler(edesc) ? "Compiler " : ""),
00824 SEV_name(mlevel) );
00825 #else
00826 loc = sprintf ( &hmsg[0], "%s%s%s", SEV_symbol(mlevel),
00827 ED_unknown(edesc) ? "Unknown Compiler " :
00828 (ED_compiler(edesc) ? "Compiler " : ""),
00829 SEV_name(mlevel) );
00830 if ( line != ERROR_LINE_UNKNOWN ) {
00831 loc += sprintf ( &hmsg[loc], " at line %d", line );
00832 }
00833 if ( file != NULL && *file != 0 ) {
00834 loc += sprintf ( &hmsg[loc], " in file %s", file );
00835 }
00836 #endif
00837 #ifndef METAKAP
00838 if ( Cur_PU_Name != NULL ) {
00839 INT n = snprintf ( &hmsg[loc], 300, " (user routine '%s')", Cur_PU_Name );
00840 loc += MIN(300, n);
00841 }
00842 if ( ED_compiler(edesc) && Current_Phase != NULL ) {
00843 loc += sprintf ( &hmsg[loc], " during %s phase", Current_Phase );
00844 }
00845 #endif
00846 sprintf ( &hmsg[loc], ":\n" );
00847 } else {
00848 hmsg[0] = 0;
00849 }
00850
00851
00852 loc = 0;
00853 for ( pnum = 0; pnum < MAX_ERR_PARMS; pnum++ ) {
00854
00855
00856 if ( ED_unknown(edesc) ) {
00857 mparm[0] = (INTPS) ecode;
00858 break;
00859 }
00860
00861
00862 if ( pnum >= ED_parms(edesc) ) break;
00863
00864
00865 switch ( kind = ED_kind(edesc,pnum) ) {
00866
00867
00868
00869 case ET_UNKNOWN: mparm[pnum] = 0;
00870 break;
00871
00872 case ET_INT: mparm[pnum] = (INTPS) va_arg ( vp, INTSC );
00873 break;
00874
00875 case ET_INT32: mparm[pnum] = (INTPS) va_arg ( vp, mINT32 );
00876 break;
00877
00878 case ET_INT64:
00879 result = &buf[++loc];
00880 loc += sprintf ( &buf[loc], "%lld",
00881 va_arg(vp,INT64) );
00882 mparm[pnum] = (INTPS) result;
00883 break;
00884
00885 case ET_STRING: mparm[pnum] = (INTPS) va_arg ( vp, char * );
00886 break;
00887
00888 case ET_FLOAT: result = &buf[++loc];
00889 loc += sprintf ( &buf[loc], "%6e",
00890 *(va_arg(vp,float *)) );
00891 mparm[pnum] = (INTPS) result;
00892 break;
00893
00894 case ET_DOUBLE: result = &buf[++loc];
00895 loc += sprintf ( &buf[loc], "%14e",
00896 *(va_arg(vp,double *)) );
00897 mparm[pnum] = (INTPS) result;
00898 break;
00899
00900 case ET_POINTER: result = &buf[++loc];
00901 loc += sprintf ( &buf[loc], "%#8lX",
00902 (INTPS) va_arg(vp,char *) );
00903 mparm[pnum] = (INTPS) result;
00904 break;
00905
00906 case ET_SYSERR: parm = (INTPS) va_arg(vp,int);
00907 if (parm < 0) {
00908 mparm[pnum] = (INTPS) host_errlist[-parm];
00909 } else {
00910 errno = 0;
00911 char *err_str = strerror(parm);
00912
00913 if ( errno == 0 ) {
00914 mparm[pnum] = (INTPS) err_str;
00915 } else {
00916 result = &buf[++loc];
00917 loc += sprintf ( &buf[loc],
00918 "Unix error %ld", parm );
00919 mparm[pnum] = (INTPS) result;
00920 }
00921 }
00922 break;
00923
00924
00925
00926
00927 default: result = Host_Format_Parm ( kind, va_arg(vp,char *) );
00928
00929 ++loc;
00930 strncpy ( &buf[loc], result, BUFLEN_NONUSER-loc );
00931 result = &buf[loc];
00932 loc += strlen (result);
00933 mparm[pnum] = (INTPS) result;
00934 break;
00935 }
00936
00937 }
00938
00939
00940 emsg = vstr_begin(BUFLEN);
00941 emsg = vstr_concat (emsg, SEV_symbol(mlevel));
00942 loc = vstr_sprintf (&emsg, vstr_len(emsg), ED_format(edesc), mparm[0],
00943 mparm[1], mparm[2], mparm[3], mparm[4], mparm[5] );
00944 emsg = vstr_concat (emsg, "\n");
00945
00946
00947 Emit_Message ( hmsg, vstr_str(emsg) );
00948 vstr_end(emsg);
00949
00950 if (ED_compiler(edesc)) Had_Compiler_Error = TRUE;
00951
00952
00953 if ( mlevel >= ES_ERRABORT ) {
00954 Signal_Cleanup( 0 );
00955 #ifdef __MINGW32__
00956 if ( ecode == EC_Signal ) raise ( SIGILL );
00957 #else
00958 if ( ecode == EC_Signal ) kill ( getpid(), SIGILL );
00959 #endif
00960 exit(RC_INTERNAL_ERROR);
00961 }
00962
00963
00964 if ( Error_Count > Max_Errors ) {
00965 ErrMsgLine ( EC_Too_Many, ERROR_LINE_UNKNOWN, Error_Count );
00966
00967 }
00968
00969 return;
00970 }
00971
00972
00973 static void
00974 ErrMsg_Report_User (ERROR_DESC *edesc, INT ecode, INT line,
00975 #ifdef TARG_NVISA
00976 const char *file, const char *dname, va_list vp )
00977 #else
00978 const char *file, va_list vp )
00979 #endif
00980 {
00981 INT dlevel = ED_severity(edesc);
00982 INT mlevel = dlevel;
00983 char hmsg[BUFLEN];
00984 vstring emsg;
00985 INTPS mparm[MAX_ERR_PARMS];
00986
00987
00988 # define BUFLEN_USER 512
00989 INT loc = 0;
00990 static char buf[BUFLEN_USER];
00991 const char *result;
00992 INT kind;
00993
00994 INT pnum;
00995 INTPS parm;
00996
00997
00998 ++Error_Counts[dlevel];
00999 if ( dlevel >= ES_ERROR ) ++Error_Count;
01000 if ( dlevel >= ES_ERRPHASE) Phase_Error = TRUE;
01001
01002
01003 if ( dlevel == ES_CONFORMANCE ) mlevel = Conformance_Level;
01004
01005
01006 if ( mlevel < Min_Error_Severity ) return;
01007 if (Heed_Woff( ED_rag_errnum(edesc) , mlevel)) return;
01008
01009
01010 if ( ! ED_continuation(edesc) ) {
01011 #ifdef TARG_NVISA
01012 if (dname && *dname) {
01013 loc += sprintf (&hmsg[0], "%s/", dname);
01014 }
01015 loc += sprintf ( &hmsg[loc], "%s(%d): ", file && *file? file: "<input>", line);
01016 #else
01017 if ( file != NULL && *file != 0 && line != ERROR_LINE_UNKNOWN ) {
01018 loc = sprintf ( &hmsg[0], "\"%s\", line %d: ", file, line );
01019 }
01020 else if ( file != NULL && *file != 0 ) {
01021 loc = sprintf ( &hmsg[0], "\"%s\": ", file );
01022 }
01023 else if ( line != ERROR_LINE_UNKNOWN ) {
01024 loc = sprintf ( &hmsg[0], "line %d: ", line );
01025 }
01026 else {
01027 loc = 0;
01028 }
01029 #endif
01030 sprintf ( &hmsg[loc], "%s%s: ",
01031 ED_unknown(edesc) ? "unknown compiler "
01032 : (ED_compiler(edesc) ? "compiler " : ""),
01033 SEV_name(mlevel) );
01034 } else {
01035 hmsg[0] = 0;
01036 }
01037
01038 loc = 0;
01039
01040 for ( pnum = 0; pnum < MAX_ERR_PARMS; pnum++ ) {
01041
01042 if ( pnum >= ED_parms(edesc) ) break;
01043
01044
01045 switch ( kind = ED_kind(edesc,pnum) ) {
01046
01047
01048
01049 case ET_UNKNOWN: mparm[pnum] = 0;
01050 break;
01051
01052 case ET_INT: mparm[pnum] = (INTPS) va_arg ( vp, INTSC );
01053 break;
01054
01055 case ET_INT32: mparm[pnum] = (INTPS) va_arg ( vp, mINT32 );
01056 break;
01057
01058 case ET_INT64:
01059 result = &buf[++loc];
01060 loc += sprintf ( &buf[loc], "%lld",
01061 va_arg(vp,INT64) );
01062 mparm[pnum] = (INTPS) result;
01063 break;
01064
01065 case ET_STRING: mparm[pnum] = (INTPS) va_arg ( vp, char * );
01066 break;
01067
01068 case ET_FLOAT: result = &buf[++loc];
01069 loc += sprintf ( &buf[loc], "%6e",
01070 *(va_arg(vp,float *)) );
01071 mparm[pnum] = (INTPS) result;
01072 break;
01073
01074 case ET_DOUBLE: result = &buf[++loc];
01075 loc += sprintf ( &buf[loc], "%14e",
01076 *(va_arg(vp,double *)) );
01077 mparm[pnum] = (INTPS) result;
01078 break;
01079
01080 case ET_POINTER: result = &buf[++loc];
01081 loc += sprintf ( &buf[loc], "%#8lX",
01082 (INTPS) va_arg(vp,char *) );
01083 mparm[pnum] = (INTPS) result;
01084 break;
01085
01086 case ET_SYSERR: parm = (INTPS) va_arg(vp,int);
01087 if (parm < 0) {
01088 mparm[pnum] = (INTPS) host_errlist[-parm];
01089 } else {
01090 errno = 0;
01091 char *err_str = strerror(parm);
01092
01093 if ( errno == 0 ) {
01094 mparm[pnum] = (INTPS) err_str;
01095 } else {
01096 result = &buf[++loc];
01097 loc += sprintf ( &buf[loc],
01098 "Unix error %ld", parm );
01099 mparm[pnum] = (INTPS) result;
01100 }
01101 }
01102 break;
01103
01104
01105
01106
01107 default: result = Host_Format_Parm ( kind, va_arg(vp,char *) );
01108
01109 ++loc;
01110 strncpy ( &buf[loc], result, BUFLEN_USER-loc );
01111 result = &buf[loc];
01112 loc += strlen (result);
01113 mparm[pnum] = (INTPS) result;
01114 break;
01115 }
01116
01117 }
01118
01119
01120 emsg = vstr_begin(512);
01121 loc = vstr_sprintf (&emsg, 0, ED_format(edesc), mparm[0], mparm[1],
01122 mparm[2], mparm[3], mparm[4], mparm[5] );
01123 emsg = vstr_concat (emsg, "\n");
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137 Emit_Message ( hmsg, vstr_str(emsg) );
01138 vstr_end(emsg);
01139
01140 if (ED_compiler(edesc)) Had_Compiler_Error = TRUE;
01141
01142
01143 if ( mlevel >= ES_ERRABORT ) {
01144 Signal_Cleanup( 0 );
01145 #ifdef __MINGW32__
01146 if ( ecode == EC_Signal ) raise ( SIGILL );
01147 #else
01148 if ( ecode == EC_Signal ) kill ( getpid(), SIGILL );
01149 #endif
01150 exit(RC_NORECOVER_USER_ERROR);
01151 }
01152
01153
01154 if ( Error_Count > Max_Errors ) {
01155 ErrMsgLine ( EC_Too_Many, ERROR_LINE_UNKNOWN, Error_Count );
01156
01157 }
01158
01159 return;
01160 }
01161
01162 static void
01163 #ifdef TARG_NVISA
01164 ErrMsg_Report ( INT ecode, INT line, const char *file, const char *dname, va_list vp )
01165 #else
01166 ErrMsg_Report ( INT ecode, INT line, const char *file, va_list vp )
01167 #endif
01168 {
01169 ERROR_DESC *edesc = Find_Error_Desc (ecode);
01170
01171 if ( ED_user(edesc) )
01172 #ifdef TARG_NVISA
01173 ErrMsg_Report_User ( edesc, ecode, line, file, dname, vp );
01174 #else
01175 ErrMsg_Report_User ( edesc, ecode, line, file, vp );
01176 #endif
01177 else
01178 #ifdef TARG_NVISA
01179 ErrMsg_Report_Nonuser ( edesc, ecode, line, file, dname, vp );
01180 #else
01181 ErrMsg_Report_Nonuser ( edesc, ecode, line, file, vp );
01182 #endif
01183 }
01184
01185 #ifdef TARG_NVISA
01186 static void
01187 ErrMsg_Report ( INT ecode, INT line, const char *file, va_list vp )
01188 {
01189 ErrMsg_Report (ecode, line, file, NULL, vp);
01190 }
01191 #endif
01192
01193
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203 void
01204 ErrMsg ( INT ecode, ... )
01205 {
01206 va_list vp;
01207
01208 va_start ( vp, ecode);
01209 ErrMsg_Report ( ecode, Source_Line, Source_File_Name, vp );
01210 va_end ( vp );
01211 }
01212
01213
01214
01215 void
01216 ErrMsgLine ( INT ecode, INT line, ... )
01217 {
01218 va_list vp;
01219
01220 va_start ( vp, line );
01221 ErrMsg_Report ( ecode, line, Source_File_Name, vp );
01222 va_end ( vp );
01223 }
01224
01225
01226 #ifdef MONGOOSE_BE
01227
01228
01229 void
01230 ErrMsgSrcpos ( INT ecode, SRCPOS srcpos, ... )
01231 {
01232 INT32 line = Srcpos_To_Line(srcpos);
01233 const char *fname = NULL;
01234 const char *dname;
01235
01236 va_list vp;
01237 va_start ( vp, srcpos );
01238
01239 IR_Srcpos_Filename(srcpos, &fname, &dname);
01240 #ifdef TARG_NVISA
01241 ErrMsg_Report ( ecode, line, fname, dname, vp );
01242 #else
01243 ErrMsg_Report ( ecode, line, fname, vp );
01244 #endif
01245 va_end ( vp );
01246 }
01247 #endif
01248
01249
01250
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269 void Abort_Compiler_Location (
01270 const char * file_name,
01271 INT line_number )
01272 {
01273 Compiler_File = file_name;
01274 Compiler_Line = line_number;
01275 }
01276
01277
01278
01279
01280
01281
01282
01283
01284
01285
01286 void
01287 Fail_Assertion ( INT ecode, ... )
01288 {
01289 va_list vp;
01290
01291 va_start ( vp, ecode);
01292 do_traceback = true;
01293 ErrMsg_Report ( ecode, Source_Line, Source_File_Name, vp );
01294 va_end ( vp );
01295 }
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309 void
01310 Fail_FmtAssertion ( const char *fmt, ... )
01311 {
01312 va_list vp;
01313
01314 INT dlevel = ES_ERRABORT;
01315 INT mlevel = dlevel;
01316 char hmsg[512], emsg[512];
01317 INT loc;
01318
01319
01320 ++Error_Counts[dlevel];
01321
01322
01323 loc = sprintf ( &hmsg[0], "%s%s%s", SEV_symbol(mlevel),
01324 "Compiler ", SEV_name(mlevel) );
01325 if ( Source_File_Name != NULL && *Source_File_Name != 0 ) {
01326 loc += sprintf ( &hmsg[loc], " in file %s", Source_File_Name );
01327 }
01328 if ( Current_Phase != NULL ) {
01329 loc += sprintf ( &hmsg[loc], " during %s phase", Current_Phase );
01330 }
01331 sprintf ( &hmsg[loc], ":\n" );
01332
01333
01334 va_start ( vp, fmt );
01335 loc = sprintf ( &emsg[0], "%s", SEV_symbol(mlevel) );
01336 loc += vsprintf ( &emsg[loc], fmt, vp );
01337 sprintf ( &emsg[loc], "\n" );
01338 va_end ( vp );
01339
01340
01341 Emit_Message ( hmsg, emsg );
01342
01343
01344 Signal_Cleanup( 0 );
01345 exit(RC_INTERNAL_ERROR);
01346 }
01347
01348
01349
01350
01351
01352
01353
01354
01355
01356
01357
01358
01359
01360
01361
01362 void
01363 Fatal_Error ( const char *fmt, ... )
01364 {
01365 va_list vp;
01366 INT dlevel = ES_ERRABORT;
01367 INT mlevel = dlevel;
01368 char hmsg[512], emsg[512];
01369 INT loc;
01370
01371
01372 ++Error_Counts[dlevel];
01373
01374
01375 loc = sprintf ( &hmsg[0], "%s%s", SEV_symbol(mlevel),
01376 SEV_name(mlevel) );
01377 if ( Source_File_Name != NULL && *Source_File_Name != 0 ) {
01378 loc += sprintf ( &hmsg[loc], " in file %s", Source_File_Name );
01379 }
01380 if ( Current_Phase != NULL ) {
01381 loc += sprintf ( &hmsg[loc], " during %s phase", Current_Phase );
01382 }
01383 sprintf ( &hmsg[loc], ":\n" );
01384
01385
01386 va_start ( vp, fmt );
01387 loc = sprintf ( &emsg[0], "%s", SEV_symbol(mlevel) );
01388 loc += vsprintf ( &emsg[loc], fmt, vp );
01389 sprintf ( &emsg[loc], "\n" );
01390 va_end ( vp );
01391
01392
01393 Emit_Message ( hmsg, emsg );
01394
01395
01396 Signal_Cleanup( 0 );
01397 exit(RC_INTERNAL_ERROR);
01398 }
01399
01400
01401
01402
01403
01404
01405
01406
01407
01408
01409
01410 extern void Rag_Handle_Woff_Args ( char *wstring )
01411 {
01412 INT i=0;
01413 INT inp_size = strlen(wstring);
01414 INT msgnum1, msgnum2;
01415
01416
01417 while ( i < inp_size ) {
01418
01419 if ( isdigit ( wstring[i] ) ) {
01420
01421 msgnum1 = atoi(&wstring[i]);
01422 while ( isdigit ( wstring[++i] ) );
01423
01424 if ((wstring[i] == '-') && isdigit(wstring[++i])) {
01425 msgnum2 = atoi(&wstring[i]);
01426 while ( isdigit ( wstring[++i] ) );
01427 } else {
01428 msgnum2 = msgnum1;
01429 }
01430
01431 msgnum1 = MAX ( msgnum1, RAG_EN_FIRST );
01432 msgnum2 = MIN ( msgnum2, RAG_EN_LAST );
01433
01434 for (; msgnum1 <= msgnum2; msgnum1++)
01435 Dont_Print_Warning(msgnum1) = TRUE;
01436 }
01437
01438
01439 while ( i < inp_size && wstring[i++] != ',' ) {};
01440
01441 }
01442 }
01443
01444 static INT Current_Phase_Number = 0;
01445
01446 void
01447 Set_Current_Phase_Number( INT phase )
01448 {
01449 Current_Phase_Number = phase;
01450 }
01451
01452 INT
01453 Get_Current_Phase_Number( void )
01454 {
01455 return Current_Phase_Number;
01456 }
01457
01458
01459 #if !defined(MONGOOSE_BE) || !defined(SHARED_BUILD)
01460
01461
01462
01463
01464
01465
01466
01467
01468
01469
01470
01471 extern void Set_Error_Tables(
01472 ERROR_DESC_TABLE *edt,
01473 const char *errlist[] )
01474 {
01475 Phases = edt;
01476 host_errlist = errlist;
01477 }
01478 #endif
01479
01480 extern void
01481 Set_Error_Descriptor (INT phase, ERROR_DESC *descriptor)
01482 {
01483 register INT i = 0;
01484
01485 while (Phases[i].phase != -1) {
01486 if (Phases[i].phase == phase) {
01487 Phases[i].descriptors = descriptor;
01488 return;
01489 }
01490 i++;
01491 }
01492
01493 FmtAssert (FALSE, ("Error Phase %d not initialized", phase));
01494 }
01495
01496
01497
01498
01499
01500
01501
01502
01503
01504
01505 #if Is_True_On
01506 #if defined(TARG_SL) || defined(TARG_NVISA)
01507 static BOOL dev_warn_enabled = FALSE;
01508 #else
01509 static BOOL dev_warn_enabled = TRUE;
01510 #endif // TARG_SL
01511 #else
01512 static BOOL dev_warn_enabled = FALSE;
01513 #endif // Is_True_On
01514
01515 extern BOOL
01516 DevWarn_Enabled()
01517 {
01518 return dev_warn_enabled;
01519 }
01520
01521 extern void
01522 DevWarn( const char *fmt, ... )
01523 {
01524 va_list args;
01525
01526
01527 const char *phase_name = (Current_Phase != NULL) ? Current_Phase : "unknown phase";
01528
01529 if ( dev_warn_enabled ) {
01530
01531
01532 va_start ( args, fmt );
01533 fprintf ( stderr, "!!! DevWarn during %s: ", phase_name );
01534 vfprintf ( stderr, fmt, args );
01535 fprintf ( stderr, "\n" );
01536 fflush ( stderr );
01537 va_end(args);
01538 }
01539
01540
01541 if ( Init_Error_File() ) {
01542 va_start ( args, fmt );
01543 fprintf ( Error_File, "!!! DevWarn during %s: ", phase_name );
01544 vfprintf ( Error_File, fmt, args );
01545 fprintf ( Error_File, "\n" );
01546 fflush ( Error_File );
01547 va_end(args);
01548 }
01549
01550
01551 if ( Trace_File != NULL ) {
01552 va_start ( args, fmt );
01553 fprintf ( Trace_File, "!!! DevWarn during %s: ", phase_name );
01554 vfprintf ( Trace_File, fmt, args );
01555 fprintf ( Trace_File, "\n" );
01556 fflush ( Trace_File );
01557 va_end(args);
01558 }
01559
01560 }
01561
01562
01563
01564
01565
01566
01567
01568
01569
01570
01571 typedef struct {
01572 const char *fname;
01573 UINT line;
01574 UINT count;
01575 } LIMIT_STRUCT;
01576
01577 static LIMIT_STRUCT *
01578 DevWarn_limit_search(const char *const src_fname,
01579 const UINT src_line)
01580 {
01581 static LIMIT_STRUCT *dw_ls_buf = NULL;
01582 static UINT dw_ls_buf_siz = 0;
01583 static UINT dw_ls_num = 0;
01584 static LIMIT_STRUCT dummy_ls = { NULL, 0, 0 };
01585 UINT i;
01586
01587 for (i = 0; i < dw_ls_num; i++) {
01588 if (dw_ls_buf[i].line == src_line &&
01589 (dw_ls_buf[i].fname == src_fname ||
01590 (strcmp(dw_ls_buf[i].fname, src_fname) == 0))) {
01591 return dw_ls_buf + i;
01592 }
01593 }
01594
01595
01596
01597
01598 if (dw_ls_num >= dw_ls_buf_siz) {
01599 UINT new_ls_buf_siz;
01600 LIMIT_STRUCT *new_ls_buf;
01601
01602
01603
01604
01605
01606 if (dw_ls_buf_siz == 0) {
01607 new_ls_buf_siz = 1024;
01608 }
01609 else {
01610 new_ls_buf_siz *= 2;
01611 }
01612 new_ls_buf = (LIMIT_STRUCT *)
01613 realloc(dw_ls_buf, new_ls_buf_siz * sizeof(LIMIT_STRUCT));
01614 if (new_ls_buf != NULL) {
01615 dw_ls_buf = new_ls_buf;
01616 dw_ls_buf_siz = new_ls_buf_siz;
01617 }
01618 else {
01619
01620
01621 dummy_ls.count = 0;
01622 return &dummy_ls;
01623 }
01624 }
01625
01626 dw_ls_buf[dw_ls_num].line = src_line;
01627 dw_ls_buf[dw_ls_num].fname = src_fname;
01628 dw_ls_buf[dw_ls_num].count = 0;
01629
01630 return dw_ls_buf + (dw_ls_num++);
01631 }
01632
01633
01634
01635
01636
01637
01638
01639
01640
01641
01642 extern BOOL
01643 Count_Limit_DevWarn(const char *const src_fname,
01644 const UINT src_line,
01645 const UINT limit)
01646 {
01647
01648
01649
01650
01651 if (!(dev_warn_enabled || Init_Error_File() || Trace_File != NULL)) {
01652 return TRUE;
01653 }
01654
01655 LIMIT_STRUCT *s = DevWarn_limit_search(src_fname, src_line);
01656 s->count++;
01657 if (s->count == limit) {
01658 DevWarn("Count limit reached on the following DevWarn:");
01659 }
01660 return s->count <= limit;
01661 }
01662
01663
01664
01665
01666
01667
01668
01669
01670
01671 extern void
01672 DevWarn_Toggle(void)
01673 {
01674 dev_warn_enabled = ! dev_warn_enabled;
01675 }
01676
01677 extern BOOL
01678 Had_Internal_Error (void)
01679 {
01680 return Had_Compiler_Error;
01681 }