Hi, Dodji,
Thanks for looking into this.
The reason a test is missing is that it would need a super large
source file to reproduce the problem. However, if you apply the
attached patch, you can reproduce the problem with attached testcase:
g++ a.cpp -g -S -c -o a.s
in a.s, the linenos are off-by-one.
The root cause is that highest_location-- should not happen when the
header file is not gonna be read. In should_stack file, there is
following check:
/* Skip if the file had a header guard and the macro is defined.
PCH relies on this appearing before the PCH handler below. */
if (file->cmacro && file->cmacro->type == NT_MACRO)
return false;
Thus we should add it back to _cpp_stack_include too.
The problem was hidden when column number is used because
highest_location is updated in linemap_position_for_column. However,
when linemap are too large, it disables columns and do not update the
highest_location.
Dehao
Index: libcpp/line-map.c
===================================================================
--- libcpp/line-map.c (revision 199570)
+++ libcpp/line-map.c (working copy)
@@ -536,7 +536,7 @@ linemap_line_start (struct line_maps *set, linenum
if (add_map)
{
int column_bits;
- if (max_column_hint > 100000 || highest > 0x60000000)
+ if (1 || max_column_hint > 100000 || highest > 0x60000000)
{
/* If the column number is ridiculous or we've allocated a huge
number of source_locations, give up on column numbers. */
@@ -598,7 +598,7 @@ linemap_position_for_column (struct line_maps *set
if (to_column >= set->max_column_hint)
{
- if (r >= 0xC000000 || to_column > 100000)
+ if (1 || r >= 0xC000000 || to_column > 100000)
{
/* Running low on source_locations - disable column numbers. */
return r;
#include "inc_1.h"
#include "inc_2.h"
int main() {
foo();
boo();
return 0;
}
#ifndef _INC_1_H_
#define _INC_1_H_
#include "inc_2.h"
void foo (void);
#endif
#ifndef _INC_2_H_
#define _INC_2_H_
void boo (void);
#endif