]> granicus.if.org Git - yasm/commitdiff
Fix cross-reference filename/line number. We were reporting (wrongly) the
authorPeter Johnson <peter@tortall.net>
Thu, 8 Jun 2006 04:10:04 +0000 (04:10 -0000)
committerPeter Johnson <peter@tortall.net>
Thu, 8 Jun 2006 04:10:04 +0000 (04:10 -0000)
virtual line number rather than the physical filename/line number.  This
was broken when the errwarn code was changed and not caught because I didn't
check the errwarn results closely enough for this case.

* nasm-token.re, gas-token.re: Propagate warnings from arch early.
This is a case where we probably want the double-error/warning on a single
line.

* errwarn.h: Add xref filename to yasm_print_error_func, and document all
parameters.
* errwarn.c: Get the physical file/line for xref virtual line.
* yasm.c: Update to match new yasm_print_error_func definition.

* pushf-err.errwarn: Correct test.

svn path=/trunk/yasm/; revision=1556

frontends/yasm/yasm.c
libyasm/errwarn.c
libyasm/errwarn.h
modules/arch/x86/tests/pushf-err.errwarn
modules/parsers/gas/gas-token.re
modules/parsers/nasm/nasm-token.re

index f66e9c2625e9e51558939e38bcb08f7928b802fa..8a638a328350a46ea894936e46ee39d7f6bd6822 100644 (file)
@@ -110,8 +110,9 @@ static /*@exits@*/ void handle_yasm_int_error(const char *file,
 static /*@exits@*/ void handle_yasm_fatal(const char *message, va_list va);
 static const char *handle_yasm_gettext(const char *msgid);
 static void print_yasm_error(const char *filename, unsigned long line,
-                            const char *msg, unsigned long xrefline,
-                            /*@null@*/ const char *xrefmsg);
+                            const char *msg, /*@null@*/ const char *xref_fn,
+                            unsigned long xref_line,
+                            /*@null@*/ const char *xref_msg);
 static void print_yasm_warning(const char *filename, unsigned long line,
                               const char *msg);
 
@@ -1188,18 +1189,19 @@ static const char *fmt_noline[2] = {
 
 static void
 print_yasm_error(const char *filename, unsigned long line, const char *msg,
-                unsigned long xrefline, const char *xrefmsg)
+                const char *xref_fn, unsigned long xref_line,
+                const char *xref_msg)
 {
     if (line)
        fprintf(stderr, fmt[ewmsg_style], filename, line, "", msg);
     else
        fprintf(stderr, fmt_noline[ewmsg_style], filename, "", msg);
 
-    if (xrefmsg) {
-       if (xrefline)
-           fprintf(stderr, fmt[ewmsg_style], filename, xrefline, "", xrefmsg);
+    if (xref_fn && xref_msg) {
+       if (xref_line)
+           fprintf(stderr, fmt[ewmsg_style], xref_fn, xref_line, "", xref_msg);
        else
-           fprintf(stderr, fmt_noline[ewmsg_style], filename, "", xrefmsg);
+           fprintf(stderr, fmt_noline[ewmsg_style], xref_fn, "", xref_msg);
     }
 }
 
index 44c73e89629d34357d72f6bf79e89172e288fd9e..b1f94a012a739fdf0e8983e30b2089b832b8f0c2 100644 (file)
@@ -475,14 +475,14 @@ yasm_errwarns_output_all(yasm_errwarns *errwarns, yasm_linemap *lm,
                         yasm_print_warning_func print_warning)
 {
     errwarn_data *we;
-    const char *filename;
-    unsigned long line;
+    const char *filename, *xref_filename;
+    unsigned long line, xref_line;
 
     /* If we're treating warnings as errors, tell the user about it. */
     if (warning_as_error && warning_as_error != 2) {
        print_error("", 0,
                    yasm_gettext_hook(N_("warnings being treated as errors")),
-                   0, NULL);
+                   NULL, 0, NULL);
        warning_as_error = 2;
     }
 
@@ -490,8 +490,15 @@ yasm_errwarns_output_all(yasm_errwarns *errwarns, yasm_linemap *lm,
     SLIST_FOREACH(we, &errwarns->errwarns, link) {
        /* Output error/warning */
        yasm_linemap_lookup(lm, we->line, &filename, &line);
+       if (we->xrefline)
+           yasm_linemap_lookup(lm, we->xrefline, &xref_filename, &xref_line);
+       else {
+           xref_filename = NULL;
+           xref_line = 0;
+       }
        if (we->type == WE_ERROR || we->type == WE_PARSERERROR)
-           print_error(filename, line, we->msg, we->xrefline, we->xrefmsg);
+           print_error(filename, line, we->msg, xref_filename, xref_line,
+                       we->xrefmsg);
        else
            print_warning(filename, line, we->msg);
     }
index 1a9e82f2aeefec6673734259da8acf6307bd70f2..f76d6d249b9a6716346fe893b332d3082f052a1d 100644 (file)
@@ -264,13 +264,17 @@ unsigned int yasm_errwarns_num_errors(yasm_errwarns *errwarns,
                                      int warning_as_error);
 
 /** Print out an error.
- * \param fn   filename of source file
- * \param line line number
- * \param msg  error message
+ * \param fn           filename of source file
+ * \param line         line number
+ * \param msg          error message
+ * \param xref_fn      cross-referenced source filename
+ * \param xref_line    cross-referenced line number
+ * \param xref_msg     cross-referenced error message
  */
 typedef void (*yasm_print_error_func)
     (const char *fn, unsigned long line, const char *msg,
-     unsigned long xrefline, /*@null@*/ const char *xrefmsg);
+     /*@null@*/ const char *xref_fn, unsigned long xref_line,
+     /*@null@*/ const char *xref_msg);
 
 /** Print out a warning.
  * \param fn   filename of source file
index 21e094f365610de06b1047ad9c863d27115a4638..79f3177a81435ebd6f9b5afd8ac8af352cbde507 100644 (file)
@@ -1,10 +1,10 @@
 -:5: warning: `pushfq' is an instruction in 64-bit mode
 -:9: warning: `popfq' is an instruction in 64-bit mode
--:15: redefinition of `pushfq'
--:10: `pushfq' previously defined here
 -:15: warning: `pushfq' is an instruction in 64-bit mode
--:19: redefinition of `popfq'
--:18: `popfq' previously defined here
+-:15: redefinition of `pushfq'
+-:5: `pushfq' previously defined here
 -:19: warning: `popfq' is an instruction in 64-bit mode
+-:19: redefinition of `popfq'
+-:9: `popfq' previously defined here
 -:24: `pushfd' invalid in 64-bit mode
 -:28: `popfd' invalid in 64-bit mode
index 5977b1580063daa9251d0623fdd7daebbef392ec..6edbc4c358a9476c375a7a40f3da206e1ab50f0b 100644 (file)
@@ -471,6 +471,8 @@ scan:
                        s->tok[TOKLEN] = savech;
                }
            }
+           /* Propagate errors in case we got a warning from the arch */
+           yasm_errwarn_propagate(parser_gas->errwarns, cur_line);
            /* Just an identifier, return as such. */
            lvalp->str_val = yasm__xstrndup(TOK, TOKLEN);
            RETURN(ID);
index 4030e0d90dfb525dbcc88c65085b3248e65aaae3..b8f9b135749385b1d7ba99568eed84239058176b 100644 (file)
@@ -410,6 +410,8 @@ scan:
                default:
                    s->tok[TOKLEN] = savech;
            }
+           /* Propagate errors in case we got a warning from the arch */
+           yasm_errwarn_propagate(parser_nasm->errwarns, cur_line);
            /* Just an identifier, return as such. */
            lvalp->str_val = yasm__xstrndup(TOK, TOKLEN);
            RETURN(ID);