Skip to content

Commit 5de0c61

Browse files
committed
Verilog preprocessor: fix include buffering
To prevent scanning beyond an `include directive, we abort read-ahead whenever we see a newline.
1 parent beefd88 commit 5de0c61

File tree

4 files changed

+31
-4
lines changed

4 files changed

+31
-4
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
CORE
2+
include1.v
3+
--preprocess
4+
// Enable multi-line checking
5+
activate-multi-line-match
6+
`line 1 "include1.v" 0
7+
`line 1 "include1b.v" 1
8+
line b 1
9+
line b 2
10+
`line 1 "include1.v" 2
11+
12+
line 2
13+
line 3
14+
^EXIT=0$
15+
^SIGNAL=0$
16+
--
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
`include "include1b.v"
2+
line 2
3+
line 3
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
line b 1
2+
line b 2

src/verilog/verilog_preprocessor_tokenizer.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,19 @@ verilog_preprocessor_tokenizert::verilog_preprocessor_tokenizert(
8888
std::size_t
8989
verilog_preprocessor_tokenizert::yy_input(char *buffer, std::size_t max_size)
9090
{
91-
std::size_t result;
92-
for(result = 0; result < max_size; result++)
91+
std::size_t result = 0;
92+
while(result < max_size)
9393
{
9494
char ch;
9595
if(!in.get(ch))
96-
return result; // eof
97-
buffer[result] = ch;
96+
break; // eof
97+
buffer[result++] = ch;
98+
if(ch == '\n')
99+
{
100+
// We need to abort prematurely to enable
101+
// switching input streams on `include.
102+
break;
103+
}
98104
}
99105
return result;
100106
}

0 commit comments

Comments
 (0)