From a09f09c618e9ec9ba8455ffa7f9765b240f0d16d Mon Sep 17 00:00:00 2001 From: Min-Yih Hsu Date: Wed, 30 Aug 2023 11:24:34 -0700 Subject: [PATCH] [TableGen] Fix incorrect handling of nested `#ifndef` directives TableGen's lexer was unable to handle nested #ifndef when the outer `#ifdef` / `#ifndef` scope is subject to skip. This was caused by returning the canonicalized token when it should have returned the original one. Fix #65100. Differential Revision: https://reviews.llvm.org/D159236 --- llvm/lib/TableGen/TGLexer.cpp | 9 ++++----- llvm/test/TableGen/nested_ifdef.inc | 10 ++++++++++ llvm/test/TableGen/nested_ifdef2.inc | 8 ++++++++ llvm/test/TableGen/nested_ifdef_main.td | 11 +++++++++++ 4 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 llvm/test/TableGen/nested_ifdef.inc create mode 100644 llvm/test/TableGen/nested_ifdef2.inc create mode 100644 llvm/test/TableGen/nested_ifdef_main.td diff --git a/llvm/lib/TableGen/TGLexer.cpp b/llvm/lib/TableGen/TGLexer.cpp index 484f840dc4fc..1730f5d88ac5 100644 --- a/llvm/lib/TableGen/TGLexer.cpp +++ b/llvm/lib/TableGen/TGLexer.cpp @@ -723,16 +723,15 @@ tgtok::TokKind TGLexer::lexPreprocessor( bool MacroIsDefined = DefinedMacros.count(MacroName) != 0; - // Canonicalize ifndef to ifdef equivalent - if (Kind == tgtok::Ifndef) { + // Canonicalize ifndef's MacroIsDefined to its ifdef equivalent. + if (Kind == tgtok::Ifndef) MacroIsDefined = !MacroIsDefined; - Kind = tgtok::Ifdef; - } // Regardless of whether we are processing tokens or not, // we put the #ifdef control on stack. + // Note that MacroIsDefined has been canonicalized against ifdef. PrepIncludeStack.back()->push_back( - {Kind, MacroIsDefined, SMLoc::getFromPointer(TokStart)}); + {tgtok::Ifdef, MacroIsDefined, SMLoc::getFromPointer(TokStart)}); if (!prepSkipDirectiveEnd()) return ReturnError(CurPtr, "Only comments are supported after " + diff --git a/llvm/test/TableGen/nested_ifdef.inc b/llvm/test/TableGen/nested_ifdef.inc new file mode 100644 index 000000000000..652ff6931489 --- /dev/null +++ b/llvm/test/TableGen/nested_ifdef.inc @@ -0,0 +1,10 @@ +#ifndef NESTED_IFDEF +#define NESTED_IFDEF + +def foo; + +#ifndef HAHA +def haha; +#endif + +#endif diff --git a/llvm/test/TableGen/nested_ifdef2.inc b/llvm/test/TableGen/nested_ifdef2.inc new file mode 100644 index 000000000000..c3aaa1b06be1 --- /dev/null +++ b/llvm/test/TableGen/nested_ifdef2.inc @@ -0,0 +1,8 @@ +#ifndef NESTED_IFDEF2 +#define NESTED_IFDEF2 + +include "nested_ifdef.inc" + +def bar; + +#endif diff --git a/llvm/test/TableGen/nested_ifdef_main.td b/llvm/test/TableGen/nested_ifdef_main.td new file mode 100644 index 000000000000..b4e30dee90da --- /dev/null +++ b/llvm/test/TableGen/nested_ifdef_main.td @@ -0,0 +1,11 @@ +// RUN: llvm-tblgen -I %p %s | FileCheck %s + +include "nested_ifdef.inc" +include "nested_ifdef2.inc" + +// CHECK: def bar +// CHECK: def foo +// CHECK: def haha +// CHECK: def zoo + +def zoo;