Index: third_party/yasm/patched-yasm/libyasm/linemap.c |
=================================================================== |
--- third_party/yasm/patched-yasm/libyasm/linemap.c (revision 71129) |
+++ third_party/yasm/patched-yasm/libyasm/linemap.c (working copy) |
@@ -25,7 +25,7 @@ |
* POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include "util.h" |
-/*@unused@*/ RCSID("$Id: linemap.c 1896 2007-07-15 21:54:11Z peter $"); |
+/*@unused@*/ RCSID("$Id: linemap.c 2259 2010-01-03 01:58:23Z peter $"); |
#include "coretype.h" |
#include "hamt.h" |
@@ -80,23 +80,41 @@ |
void |
yasm_linemap_set(yasm_linemap *linemap, const char *filename, |
- unsigned long file_line, unsigned long line_inc) |
+ unsigned long virtual_line, unsigned long file_line, |
+ unsigned long line_inc) |
{ |
char *copy; |
+ unsigned long i; |
int replace = 0; |
- line_mapping *mapping; |
+ line_mapping *mapping = NULL; |
- /* Create a new mapping in the map */ |
- if (linemap->map_size >= linemap->map_allocated) { |
- /* allocate another size bins when full for 2x space */ |
- linemap->map_vector = |
- yasm_xrealloc(linemap->map_vector, 2*linemap->map_allocated |
- *sizeof(line_mapping)); |
- linemap->map_allocated *= 2; |
+ if (virtual_line == 0) { |
+ virtual_line = linemap->current; |
} |
- mapping = &linemap->map_vector[linemap->map_size]; |
- linemap->map_size++; |
+ /* Replace all existing mappings that have line numbers >= this one. */ |
+ for (i = linemap->map_size; i > 0; i--) { |
+ if (linemap->map_vector[i-1].line < virtual_line) { |
+ if (i < linemap->map_size) { |
+ mapping = &linemap->map_vector[i]; |
+ linemap->map_size = i + 1; |
+ } |
+ break; |
+ } |
+ } |
+ |
+ if (mapping == NULL) { |
+ /* Create a new mapping in the map */ |
+ if (linemap->map_size >= linemap->map_allocated) { |
+ /* allocate another size bins when full for 2x space */ |
+ linemap->map_vector = yasm_xrealloc(linemap->map_vector, |
+ 2*linemap->map_allocated*sizeof(line_mapping)); |
+ linemap->map_allocated *= 2; |
+ } |
+ mapping = &linemap->map_vector[linemap->map_size]; |
+ linemap->map_size++; |
+ } |
+ |
/* Fill it */ |
if (!filename) { |
@@ -115,7 +133,7 @@ |
/*@=aliasunique@*/ |
} |
- mapping->line = linemap->current; |
+ mapping->line = virtual_line; |
mapping->file_line = file_line; |
mapping->line_inc = line_inc; |
} |
@@ -128,14 +146,14 @@ |
line_mapping *mapping; |
linemap->current++; |
- yasm_linemap_set(linemap, filename, file_line, 0); |
+ yasm_linemap_set(linemap, filename, 0, file_line, 0); |
mapping = &linemap->map_vector[linemap->map_size-1]; |
line = linemap->current; |
linemap->current++; |
- yasm_linemap_set(linemap, mapping->filename, |
+ yasm_linemap_set(linemap, mapping->filename, 0, |
mapping->file_line + |
mapping->line_inc*(linemap->current-2-mapping->line), |
mapping->line_inc); |
@@ -249,7 +267,7 @@ |
mapping = &linemap->map_vector[vindex]; |
*filename = mapping->filename; |
- *file_line = mapping->file_line + mapping->line_inc*(line-mapping->line); |
+ *file_line = (line ? mapping->file_line + mapping->line_inc*(line-mapping->line) : 0); |
} |
int |