From 5de0c6180fc5c06f8c189790f0c0bfce5ebcf908 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Mon, 25 Sep 2023 17:34:16 -0700 Subject: [PATCH] Verilog preprocessor: fix include buffering To prevent scanning beyond an `include directive, we abort read-ahead whenever we see a newline. --- regression/verilog/preprocessor/include1.desc | 16 ++++++++++++++++ regression/verilog/preprocessor/include1.v | 3 +++ regression/verilog/preprocessor/include1b.v | 2 ++ src/verilog/verilog_preprocessor_tokenizer.cpp | 14 ++++++++++---- 4 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 regression/verilog/preprocessor/include1.desc create mode 100644 regression/verilog/preprocessor/include1.v create mode 100644 regression/verilog/preprocessor/include1b.v diff --git a/regression/verilog/preprocessor/include1.desc b/regression/verilog/preprocessor/include1.desc new file mode 100644 index 000000000..dca79f457 --- /dev/null +++ b/regression/verilog/preprocessor/include1.desc @@ -0,0 +1,16 @@ +CORE +include1.v +--preprocess +// Enable multi-line checking +activate-multi-line-match +`line 1 "include1.v" 0 +`line 1 "include1b.v" 1 +line b 1 +line b 2 +`line 1 "include1.v" 2 + +line 2 +line 3 +^EXIT=0$ +^SIGNAL=0$ +-- diff --git a/regression/verilog/preprocessor/include1.v b/regression/verilog/preprocessor/include1.v new file mode 100644 index 000000000..b7ee716d9 --- /dev/null +++ b/regression/verilog/preprocessor/include1.v @@ -0,0 +1,3 @@ +`include "include1b.v" +line 2 +line 3 diff --git a/regression/verilog/preprocessor/include1b.v b/regression/verilog/preprocessor/include1b.v new file mode 100644 index 000000000..255fd89de --- /dev/null +++ b/regression/verilog/preprocessor/include1b.v @@ -0,0 +1,2 @@ +line b 1 +line b 2 diff --git a/src/verilog/verilog_preprocessor_tokenizer.cpp b/src/verilog/verilog_preprocessor_tokenizer.cpp index 1e70f1468..e9ae9c5bb 100644 --- a/src/verilog/verilog_preprocessor_tokenizer.cpp +++ b/src/verilog/verilog_preprocessor_tokenizer.cpp @@ -88,13 +88,19 @@ verilog_preprocessor_tokenizert::verilog_preprocessor_tokenizert( std::size_t verilog_preprocessor_tokenizert::yy_input(char *buffer, std::size_t max_size) { - std::size_t result; - for(result = 0; result < max_size; result++) + std::size_t result = 0; + while(result < max_size) { char ch; if(!in.get(ch)) - return result; // eof - buffer[result] = ch; + break; // eof + buffer[result++] = ch; + if(ch == '\n') + { + // We need to abort prematurely to enable + // switching input streams on `include. + break; + } } return result; }