Enhance source position implementation.
PATCH 1/1 Enhance source position implementation.
Implemented some print and copy routines. Made empty srcpos objects that will be used later. Protected .h file from multiple #include's. Added srcpos_error() and srcpos_warn().
---
This patch is a refactoring of the yyerror() and yyerrorf(() changes out of my proposed IR patch set back to the current master branch. It should be pretty close to one Gibson's [3/5] patch where he was headed in the same direction. This one anticipates srcpos_warn() too.
BTW, I realize my earlier reply to his [3/5] patch was sort of meant to be in response to his following patch as well. Oh well.
As he was also in favor of this change with his patch set, I'm just going to apply this one straight up.
dtc-parser.y | 29 +++--------- srcpos.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- srcpos.h | 23 +++++++++- 3 files changed, 162 insertions(+), 32 deletions(-)
dtc-parser.y +8 -21
@@ -27,6 +27,7 @@ #include "srcpos.h" extern int yylex(void); +extern void yyerror(char const *s); extern struct boot_info *the_boot_info; extern int treesource_error;
@@ -208,9 +209,11 @@ propdata: if ($6 != 0) if (fseek(file->file, $6, SEEK_SET) != 0) - yyerrorf("Couldn't seek to offset %llu in \"%s\": %s", - (unsigned long long)$6, - $4.val, strerror(errno)); + srcpos_error(&yyloc, + "Couldn't seek to offset %llu in \"%s\": %s", + (unsigned long long)$6, + $4.val, + strerror(errno)); d = data_copy_file(file->file, $8);
@@ -339,26 +342,10 @@ label: %% -void yyerrorf(char const *s, ...) +void yyerror(char const *s) { - const char *fname = srcpos_file ? srcpos_file->name : "<no-file>"; - va_list va; - va_start(va, s); - - if (strcmp(fname, "-") == 0) - fname = "stdin"; - - fprintf(stderr, "%s:%d ", fname, yylloc.first_line); - vfprintf(stderr, s, va); - fprintf(stderr, "\n"); - + srcpos_error(&yylloc, "%s", s); treesource_error = 1; - va_end(va); -} - -void yyerror (char const *s) -{ - yyerrorf("%s", s); } static unsigned long long eval_literal(const char *s, int base, int bits)
srcpos.c +133 -9
170 lines not on this page · raw message
srcpos.h +21 -2
@@ -17,6 +17,9 @@* USA */ +#ifndef _SRCPOS_H_ +#define _SRCPOS_H_ +/* * Augment the standard YYLTYPE with a filenum index into an * array of all opened filenames.
@@ -69,9 +72,14 @@ typedef struct YYLTYPE {while (YYID (0 )) +typedef YYLTYPE srcpos; -extern void yyerror(char const *); -extern void yyerrorf (char const *, ...) __attribute__((format (printf,1 ,2 ))); +/* +* Fictional source position used for IR nodes that are +* created without otherwise knowing a true source position. +* For example,constant definitions from the command line. +*/ +extern srcpos srcpos_empty;extern struct dtc_file *srcpos_file;
@@ -83,3 +91,14 @@ struct search_path {extern struct dtc_file *dtc_open_file (const char *fname,const struct search_path *search);extern void dtc_close_file (struct dtc_file *file); + +extern srcpos *srcpos_copy (srcpos *pos); +extern char *srcpos_string (srcpos *pos); +extern void srcpos_dump (srcpos *pos); + +extern void srcpos_error (srcpos *pos,char const *, ...) + __attribute__((format (printf,2 ,3 ))); +extern void srcpos_warn (srcpos *pos,char const *, ...) + __attribute__((format (printf,2 ,3 ))); + +#endif /* _SRCPOS_H_ */
Signature · 1 line
1.6.0.90.g436ed
A message that is not in the archive (sent off-list or not yet received): 1223066853-5978-1-git-send-email-jdl-CYoMK+44s/[email protected]
Quoted 14 lines · Jon Loeliger
Implemented some print and copy routines. Made empty srcpos objects that will be used later. Protected .h file from multiple #include's. Added
srcpos_error()andsrcpos_warn().Signed-off-by Jon Loeliger <[email protected]>---
This patch is a refactoring of the
yyerror()and yyerrorf(() changes out of my proposed IR patch set back to the current master branch. It should be pretty close to one Gibson's [3/5] patch where he was headed in the same direction. This one anticipatessrcpos_warn()too.
Quoted 6 lines
BTW, I realize my earlier reply to his [3/5] patch was sort of meant to be in response to his following patch as well. Oh well.
As he was also in favor of this change with his patch set, I'm just going to apply this one straight up.
Unfortunately, it differs from my 3/5 in exactly the aspects that prompted me to refactor your srcpos stuff into my series in the first place.
Your srcpos_empty variable and srcpos_copy() and srcpos_dump() routines are not used here, which means they don't belong in this patch - they belong in the patch that actually does something with them.
In fact, srcpos_copy() isn't needed at all. In your IR stuff, the ir_srcpos has exactly the same lifetime as the surrounding ir structure, if you make it an embedded structure rather than a pointer srcpos_copy() disappears.
[snip]
Quoted 2 lines
extern int yylex(void);
+extern voidyyerror(char const *s);
This should be static, not extern, now.
[snip]
srcpos.c line 20
Quoted 9 lines
srcpos.c +1
-0@@ -17,18 +17,40 @@* USA */ +#define _GNU_SOURCE
Sigh. asprintf() is really handy, but dtc is supposed to be portable.
Anyway, it's applied now, so I'll rebase my series on top of this.
Signature · 4 lines
David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson