]> granicus.if.org Git - llvm/commitdiff
TableGen: support #ifndef in addition to #ifdef.
authorTim Northover <tnorthover@apple.com>
Tue, 14 May 2019 13:04:25 +0000 (13:04 +0000)
committerTim Northover <tnorthover@apple.com>
Tue, 14 May 2019 13:04:25 +0000 (13:04 +0000)
TableGen has a limited preprocessor, which only really supports
easier.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@360670 91177308-0d34-0410-b5e6-96231b3b80d8

lib/TableGen/TGLexer.cpp
lib/TableGen/TGLexer.h
test/TableGen/prep-diag5.td
test/TableGen/prep-ifndef-diag-1.td [new file with mode: 0644]
test/TableGen/prep-ifndef-diag-2.td [new file with mode: 0644]
test/TableGen/prep-ifndef.td [new file with mode: 0644]

index b9420253b2bf93ff31909a3fe269419082f03211..d28c62b3133d34444cd0e93d3ff2d46db596f3cb 100644 (file)
@@ -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();
 
index 4b42d31de533ea508e429a28f54ac2b33f73828a..3085ab2c04785c00379436977462beeba80937ec 100644 (file)
@@ -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
   };
 }
 
index 7dc178bef22d1b1a44c83499d2070658d8972b47..1b9df59acd9bdd3562931c266f47523e12d8b867 100644 (file)
@@ -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
diff --git a/test/TableGen/prep-ifndef-diag-1.td b/test/TableGen/prep-ifndef-diag-1.td
new file mode 100644 (file)
index 0000000..941f2d3
--- /dev/null
@@ -0,0 +1,4 @@
+// RUN: not llvm-tblgen %s 2>&1 | FileCheck %s
+
+// CHECK: error: Expected macro name after #ifndef
+#ifndef 1
diff --git a/test/TableGen/prep-ifndef-diag-2.td b/test/TableGen/prep-ifndef-diag-2.td
new file mode 100644 (file)
index 0000000..7b5f9df
--- /dev/null
@@ -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
diff --git a/test/TableGen/prep-ifndef.td b/test/TableGen/prep-ifndef.td
new file mode 100644 (file)
index 0000000..6e5254f
--- /dev/null
@@ -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