Such as:

        #line 23 "foo.c"

Having a filename here is quite useful and many other OpenGL implementations
allow this.
---
 src/glsl/ast.h                  |    2 +-
 src/glsl/glsl_lexer.ll          |   56 ++++++++++++++++++++++++++++++---------
 src/glsl/glsl_parser.yy         |    2 +-
 src/glsl/glsl_parser_extras.cpp |    2 +-
 src/glsl/glsl_parser_extras.h   |    4 +--
 5 files changed, 48 insertions(+), 18 deletions(-)

diff --git a/src/glsl/ast.h b/src/glsl/ast.h
index 5074782..7d9ba69 100644
--- a/src/glsl/ast.h
+++ b/src/glsl/ast.h
@@ -116,7 +116,7 @@ public:
     * Source location of the AST node.
     */
    struct {
-      unsigned source;    /**< GLSL source number. */
+      char *source;       /**< GLSL source number. */
       unsigned line;      /**< Line number within the source string. */
       unsigned column;    /**< Column in the line. */
    } location;
diff --git a/src/glsl/glsl_lexer.ll b/src/glsl/glsl_lexer.ll
index ac06fd2..66e6377 100644
--- a/src/glsl/glsl_lexer.ll
+++ b/src/glsl/glsl_lexer.ll
@@ -41,7 +41,7 @@ static int classify_identifier(struct _mesa_glsl_parse_state 
*, const char *);
       yycolumn += yyleng;                                      \
    } while(0);
 
-#define YY_USER_INIT yylineno = 0; yycolumn = 0; yylloc->source = 0;
+#define YY_USER_INIT yylineno = 0; yycolumn = 0; yylloc->source = (char *) "0";
 
 /* A macro for handling reserved words and keywords across language versions.
  *
@@ -160,6 +160,7 @@ INT         ({DEC_INT}|{HEX_INT}|{OCT_INT})
 SPC            [ \t]*
 SPCP           [ \t]+
 HASH           ^{SPC}#{SPC}
+STRING_LITERAL \"(\\.|[^\\"\n])*\"
 %%
 
        /* Make state available to all actions. */
@@ -171,7 +172,12 @@ HASH               ^{SPC}#{SPC}
 {HASH}$                                ;
 {HASH}version                  { BEGIN PP; return VERSION_TOK; }
 {HASH}extension                        { BEGIN PP; return EXTENSION; }
-{HASH}line{SPCP}{INT}{SPCP}{INT}{SPC}$ {
+       /* We subtract 2 from the number in a #line directive because:
+        * 1. yylineno is zero-based, rather than one-based as desired, and
+        * 2. #line gives the line number for the subsequent line of the source,
+        *    and we will increment yylineno before then at the next newline.
+        */
+{HASH}line{SPCP}{INT}{SPCP}{STRING_LITERAL}$ {
                                   /* Eat characters until the first digit is
                                    * encountered
                                    */
@@ -179,13 +185,42 @@ HASH              ^{SPC}#{SPC}
                                   while (!isdigit(*ptr))
                                      ptr++;
 
-                                  /* Subtract two from the line number parsed.
-                                   * 1 because yylineno is zero-based and
-                                   * 2 because #line gives the line number for
-                                   * the subsequent line of the source.
+                                  yylineno = strtol(ptr, &ptr, 0) - 2;
+
+                                  /* Skip space before string. */
+                                  while (isspace(*ptr))
+                                     ptr++;
+
+                                  /* Omit initial and final quotation marks
+                                   * when copying string value.
+                                   */
+                                  yylloc->source =
+                                  ralloc_strndup(state, ptr+1, strlen(ptr)-2);
+                               }
+{HASH}line{SPCP}{INT}{SPCP}{INT}{SPC}$ {
+                                  /* Eat characters until the first digit is
+                                   * encountered
                                    */
+                                  char *ptr = yytext;
+                                  while (!isdigit(*ptr))
+                                     ptr++;
+
                                   yylineno = strtol(ptr, &ptr, 0) - 2;
-                                  yylloc->source = strtol(ptr, NULL, 0);
+
+                                  /* Skip space before source number. */
+                                  while (isspace(*ptr))
+                                     ptr++;
+
+                                  yylloc->source = ralloc_strdup(state, ptr);
+                                  ptr = yylloc->source;
+
+                                  /* Terminate after digits to
+                                   * eliminate any trailing space.
+                                   */
+                                  while (isdigit(*ptr))
+                                     ptr++;
+                                  *ptr = '\0';
+
                                }
 {HASH}line{SPCP}{INT}{SPC}$    {
                                   /* Eat characters until the first digit is
@@ -195,12 +230,7 @@ HASH               ^{SPC}#{SPC}
                                   while (!isdigit(*ptr))
                                      ptr++;
 
-                                  /* Subtract two from the line number parsed.
-                                   * 1 because yylineno is zero-based and
-                                   * 2 because #line gives the line number for
-                                   * the subsequent line of the source.
-                                   */
-                                  yylineno = strtol(ptr, &ptr, 0) - 2;
+                                  yylineno = strtol(ptr, NULL, 0) - 2;
                                }
 ^{SPC}#{SPC}pragma{SPCP}debug{SPC}\({SPC}on{SPC}\) {
                                  BEGIN PP;
diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy
index 0af71e7..ad07d60 100644
--- a/src/glsl/glsl_parser.yy
+++ b/src/glsl/glsl_parser.yy
@@ -50,7 +50,7 @@ static void yyerror(YYLTYPE *loc, _mesa_glsl_parse_state *st, 
const char *msg)
    @$.first_column = 1;
    @$.last_line = 1;
    @$.last_column = 1;
-   @$.source = 0;
+   @$.source = (char *) "0";
 }
 
 %lex-param   {void *scanner}
diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp
index d360892..a4a7985 100644
--- a/src/glsl/glsl_parser_extras.cpp
+++ b/src/glsl/glsl_parser_extras.cpp
@@ -313,7 +313,7 @@ _mesa_glsl_msg(const YYLTYPE *locp, _mesa_glsl_parse_state 
*state,
    /* Get the offset that the new message will be written to. */
    int msg_offset = strlen(state->info_log);
 
-   ralloc_asprintf_append(&state->info_log, "%u:%u(%u): %s: ",
+   ralloc_asprintf_append(&state->info_log, "%s:%u(%u): %s: ",
                                            locp->source,
                                            locp->first_line,
                                            locp->first_column,
diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h
index 2e6bb0b..ed6bc4a 100644
--- a/src/glsl/glsl_parser_extras.h
+++ b/src/glsl/glsl_parser_extras.h
@@ -64,7 +64,7 @@ typedef struct YYLTYPE {
    int first_column;
    int last_line;
    int last_column;
-   unsigned source;
+   char *source;
 } YYLTYPE;
 # define YYLTYPE_IS_DECLARED 1
 # define YYLTYPE_IS_TRIVIAL 1
@@ -298,7 +298,7 @@ do {                                                        
        \
       (Current).first_column = (Current).last_column =         \
         YYRHSLOC(Rhs, 0).last_column;                          \
    }                                                           \
-   (Current).source = 0;                                       \
+   (Current).source = (char *) "0";                            \
 } while (0)
 
 extern void _mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state,
-- 
1.7.10

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to