Fix preprocessor line directive
The preprocessor line directive did not result in correct debug info when -g was used. Line directives like: #line 1 "filename" should now work.
This commit is contained in:
		
							parent
							
								
									79d439ee4f
								
							
						
					
					
						commit
						ee3fef2ce2
					
				
					 1 changed files with 32 additions and 46 deletions
				
			
		
							
								
								
									
										78
									
								
								tccdbg.c
									
										
									
									
									
								
							
							
						
						
									
										78
									
								
								tccdbg.c
									
										
									
									
									
								
							|  | @ -568,7 +568,7 @@ static void dwarf_line_op(TCCState *s1, unsigned char op) | |||
| 
 | ||||
| static void dwarf_file(TCCState *s1) | ||||
| { | ||||
|     int i; | ||||
|     int i, j; | ||||
|     char *filename; | ||||
| 
 | ||||
|     filename = strrchr(file->filename, '/'); | ||||
|  | @ -580,14 +580,16 @@ static void dwarf_file(TCCState *s1) | |||
| 		    dwarf_line.cur_file = i; | ||||
| 	            return; | ||||
| 		} | ||||
| 	i = 0; | ||||
| 	filename = file->filename; | ||||
|     } | ||||
|     else { | ||||
| 	int j; | ||||
| 	char *undo = filename; | ||||
| 	char *dir = file->filename; | ||||
| 
 | ||||
| 	*filename++ = '\0'; | ||||
|         for (i = 0; i < dwarf_line.dir_size; i++) | ||||
| 	    if (strcmp(dwarf_line.dir_table[i], file->filename) == 0) | ||||
| 	    if (strcmp(dwarf_line.dir_table[i], dir) == 0) { | ||||
| 		for (j = 1; j < dwarf_line.filename_size; j++) | ||||
| 		    if (dwarf_line.filename_table[j].dir_entry == i && | ||||
| 			strcmp(dwarf_line.filename_table[j].name, | ||||
|  | @ -596,8 +598,33 @@ static void dwarf_file(TCCState *s1) | |||
| 		        dwarf_line.cur_file = j; | ||||
| 			return; | ||||
| 		    } | ||||
| 		break; | ||||
| 	    } | ||||
| 	if (i == dwarf_line.dir_size) { | ||||
| 	    dwarf_line.dir_size++; | ||||
| 	    dwarf_line.dir_table =  | ||||
|                 (char **) tcc_realloc(dwarf_line.dir_table, | ||||
|                                       dwarf_line.dir_size * | ||||
|                                       sizeof (char *)); | ||||
|             dwarf_line.dir_table[i] = tcc_strdup(dir); | ||||
| 	} | ||||
| 	*undo = '/'; | ||||
|     } | ||||
|     for (j = 1; j < dwarf_line.filename_size; j++) | ||||
|         if (dwarf_line.filename_table[j].dir_entry == i && | ||||
|             strcmp (dwarf_line.filename_table[j].name, filename) == 0) | ||||
|             break; | ||||
|     if (j == dwarf_line.filename_size) { | ||||
|         dwarf_line.filename_table = | ||||
|             (struct dwarf_filename_struct *) | ||||
|             tcc_realloc(dwarf_line.filename_table, | ||||
|                         (dwarf_line.filename_size + 1) * | ||||
|                         sizeof (struct dwarf_filename_struct)); | ||||
|         dwarf_line.filename_table[dwarf_line.filename_size].dir_entry = i; | ||||
|         dwarf_line.filename_table[dwarf_line.filename_size++].name = | ||||
|             tcc_strdup(filename); | ||||
| 	dwarf_line.cur_file = j; | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
|  | @ -1028,49 +1055,8 @@ ST_FUNC void tcc_debug_bincl(TCCState *s1) | |||
|     if (!s1->do_debug) | ||||
|         return; | ||||
|     if (s1->dwarf) { | ||||
| 	int i, j; | ||||
| 	char *filename = strrchr(file->filename, '/'); | ||||
| 	char *dir; | ||||
| 
 | ||||
| 	if (filename == NULL) { | ||||
| 	    filename = file->filename; | ||||
| 	    i = 0; | ||||
| 	} | ||||
| 	else { | ||||
| 	    char *undo = filename; | ||||
| 
 | ||||
| 	    *filename++ = '\0'; | ||||
| 	    dir = file->filename; | ||||
| 	    for (i = 0; i < dwarf_line.dir_size; i++) | ||||
| 	        if (strcmp (dwarf_line.dir_table[i], dir) == 0) | ||||
| 		    break; | ||||
| 	    if (i == dwarf_line.dir_size) { | ||||
| 	        dwarf_line.dir_size++; | ||||
| 	        dwarf_line.dir_table = | ||||
| 		    (char **) tcc_realloc(dwarf_line.dir_table, | ||||
| 					  dwarf_line.dir_size * | ||||
| 					  sizeof (char *)); | ||||
| 	        dwarf_line.dir_table[i] = tcc_strdup(dir); | ||||
| 	    } | ||||
| 	    *undo = '/'; | ||||
| 	} | ||||
|         if (strcmp(filename, "<command line>")) { | ||||
| 	    for (j = 1; j < dwarf_line.filename_size; j++) | ||||
| 	        if (dwarf_line.filename_table[j].dir_entry == i && | ||||
| 		    strcmp (dwarf_line.filename_table[j].name, filename) == 0) | ||||
| 		    break; | ||||
| 	    if (j == dwarf_line.filename_size) { | ||||
| 	        dwarf_line.filename_table = | ||||
| 		    (struct dwarf_filename_struct *) | ||||
| 		    tcc_realloc(dwarf_line.filename_table, | ||||
| 			        (dwarf_line.filename_size + 1) * | ||||
| 			        sizeof (struct dwarf_filename_struct)); | ||||
| 	        dwarf_line.filename_table[dwarf_line.filename_size].dir_entry = i; | ||||
| 	        dwarf_line.filename_table[dwarf_line.filename_size++].name = | ||||
| 		    tcc_strdup(filename); | ||||
| 	    } | ||||
|         } | ||||
|         dwarf_file(s1); | ||||
|         if (strcmp(file->filename, "<command line>")) | ||||
|             dwarf_file(s1); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue