[llvm] r360670 - TableGen: support #ifndef in addition to #ifdef.
Tim Northover via llvm-commits
llvm-commits at lists.llvm.org
Tue May 14 06:04:26 PDT 2019
Author: tnorthover
Date: Tue May 14 06:04:25 2019
New Revision: 360670
URL: http://llvm.org/viewvc/llvm-project?rev=360670&view=rev
Log:
TableGen: support #ifndef in addition to #ifdef.
TableGen has a limited preprocessor, which only really supports
easier.
Added:
llvm/trunk/test/TableGen/prep-ifndef-diag-1.td
llvm/trunk/test/TableGen/prep-ifndef-diag-2.td
llvm/trunk/test/TableGen/prep-ifndef.td
Modified:
llvm/trunk/lib/TableGen/TGLexer.cpp
llvm/trunk/lib/TableGen/TGLexer.h
llvm/trunk/test/TableGen/prep-diag5.td
Modified: llvm/trunk/lib/TableGen/TGLexer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TableGen/TGLexer.cpp?rev=360670&r1=360669&r2=360670&view=diff
==============================================================================
--- llvm/trunk/lib/TableGen/TGLexer.cpp (original)
+++ llvm/trunk/lib/TableGen/TGLexer.cpp Tue May 14 06:04:25 2019
@@ -36,6 +36,7 @@ struct {
const char *Word;
} PreprocessorDirs[] = {
{ tgtok::Ifdef, "ifdef" },
+ { tgtok::Ifndef, "ifndef" },
{ tgtok::Else, "else" },
{ tgtok::Endif, "endif" },
{ tgtok::Define, "define" }
@@ -676,21 +677,28 @@ tgtok::TokKind TGLexer::lexPreprocessor(
PrintFatalError("lexPreprocessor() called for unknown "
"preprocessor directive");
- if (Kind == tgtok::Ifdef) {
+ if (Kind == tgtok::Ifdef || Kind == tgtok::Ifndef) {
StringRef MacroName = prepLexMacroName();
+ StringRef IfTokName = Kind == tgtok::Ifdef ? "#ifdef" : "#ifndef";
if (MacroName.empty())
- return ReturnError(TokStart, "Expected macro name after #ifdef");
+ return ReturnError(TokStart, "Expected macro name after " + IfTokName);
bool MacroIsDefined = DefinedMacros.count(MacroName) != 0;
+ // Canonicalize ifndef to 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.
PrepIncludeStack.back()->push_back(
{Kind, MacroIsDefined, SMLoc::getFromPointer(TokStart)});
if (!prepSkipDirectiveEnd())
- return ReturnError(CurPtr,
- "Only comments are supported after #ifdef NAME");
+ return ReturnError(CurPtr, "Only comments are supported after " +
+ IfTokName + " NAME");
// If we were not processing tokens before this #ifdef,
// then just return back to the lines skipping code.
@@ -714,7 +722,7 @@ tgtok::TokKind TGLexer::lexPreprocessor(
// Check if this #else is correct before calling prepSkipDirectiveEnd(),
// which will move CurPtr away from the beginning of #else.
if (PrepIncludeStack.back()->empty())
- return ReturnError(TokStart, "#else without #ifdef");
+ return ReturnError(TokStart, "#else without #ifdef or #ifndef");
PreprocessorControlDesc IfdefEntry = PrepIncludeStack.back()->back();
Modified: llvm/trunk/lib/TableGen/TGLexer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TableGen/TGLexer.h?rev=360670&r1=360669&r2=360670&view=diff
==============================================================================
--- llvm/trunk/lib/TableGen/TGLexer.h (original)
+++ llvm/trunk/lib/TableGen/TGLexer.h Tue May 14 06:04:25 2019
@@ -65,7 +65,7 @@ namespace tgtok {
// Preprocessing tokens for internal usage by the lexer.
// They are never returned as a result of Lex().
- Ifdef, Else, Endif, Define
+ Ifdef, Ifndef, Else, Endif, Define
};
}
Modified: llvm/trunk/test/TableGen/prep-diag5.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/TableGen/prep-diag5.td?rev=360670&r1=360669&r2=360670&view=diff
==============================================================================
--- llvm/trunk/test/TableGen/prep-diag5.td (original)
+++ llvm/trunk/test/TableGen/prep-diag5.td Tue May 14 06:04:25 2019
@@ -1,6 +1,6 @@
// RUN: not llvm-tblgen -I %p %s 2>&1 | FileCheck %s
-// CHECK: error: #else without #ifdef
+// CHECK: error: #else without #ifdef or #ifndef
#else
#else
#endif
Added: llvm/trunk/test/TableGen/prep-ifndef-diag-1.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/TableGen/prep-ifndef-diag-1.td?rev=360670&view=auto
==============================================================================
--- llvm/trunk/test/TableGen/prep-ifndef-diag-1.td (added)
+++ llvm/trunk/test/TableGen/prep-ifndef-diag-1.td Tue May 14 06:04:25 2019
@@ -0,0 +1,4 @@
+// RUN: not llvm-tblgen %s 2>&1 | FileCheck %s
+
+// CHECK: error: Expected macro name after #ifndef
+#ifndef 1
Added: llvm/trunk/test/TableGen/prep-ifndef-diag-2.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/TableGen/prep-ifndef-diag-2.td?rev=360670&view=auto
==============================================================================
--- llvm/trunk/test/TableGen/prep-ifndef-diag-2.td (added)
+++ llvm/trunk/test/TableGen/prep-ifndef-diag-2.td Tue May 14 06:04:25 2019
@@ -0,0 +1,4 @@
+// RUN: not llvm-tblgen %s 2>&1 | FileCheck %s
+
+// CHECK: error: Only comments are supported after #ifndef NAME
+#ifndef MACRO 42
Added: llvm/trunk/test/TableGen/prep-ifndef.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/TableGen/prep-ifndef.td?rev=360670&view=auto
==============================================================================
--- llvm/trunk/test/TableGen/prep-ifndef.td (added)
+++ llvm/trunk/test/TableGen/prep-ifndef.td Tue May 14 06:04:25 2019
@@ -0,0 +1,10 @@
+// RUN: llvm-tblgen %s -DMACRO | FileCheck %s
+// RUN: llvm-tblgen %s | FileCheck %s --check-prefix=CHECK-NOMACRO
+
+#ifndef MACRO
+// CHECK-NOMACRO: def nomacro
+def nomacro;
+#else
+// CHECK: def macro
+def macro;
+#endif
More information about the llvm-commits
mailing list