]> granicus.if.org Git - clang/commitdiff
Preprocessor: Add support for '#pragma clang __debug crash' and '#pragma clang
authorDaniel Dunbar <daniel@zuster.org>
Wed, 28 Jul 2010 15:40:33 +0000 (15:40 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 28 Jul 2010 15:40:33 +0000 (15:40 +0000)
__debug overflow_stack'.
 - For testing crash reporting stuff... you'd think I could just use some C++
   code but Doug keeps fixing stuff!

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

lib/Lex/Pragma.cpp

index 7bf409405ab138129bd945be4fd0dbef5b01cde5..31d28f1e9c30c811d5f45d0995d0fba2aa58db36 100644 (file)
@@ -582,6 +582,33 @@ struct PragmaDependencyHandler : public PragmaHandler {
   }
 };
 
+struct PragmaDebugHandler : public PragmaHandler {
+  PragmaDebugHandler() : PragmaHandler("__debug") {}
+  virtual void HandlePragma(Preprocessor &PP, Token &DepToken) {
+    Token Tok;
+    PP.LexUnexpandedToken(Tok);
+    if (Tok.isNot(tok::identifier)) {
+      PP.Diag(Tok, diag::warn_pragma_diagnostic_clang_invalid);
+      return;
+    }
+    IdentifierInfo *II = Tok.getIdentifierInfo();
+
+    if (II->isStr("overflow_stack")) {
+      DebugOverflowStack();
+    } else if (II->isStr("crash")) {
+      DebugCrash();
+    }
+  }
+
+  void DebugOverflowStack() {
+    DebugOverflowStack();
+  }
+
+  void DebugCrash() {
+    abort();
+  }
+};
+
 /// PragmaDiagnosticHandler - e.g. '#pragma GCC diagnostic ignored "-Wformat"'
 /// Since clang's diagnostic supports extended functionality beyond GCC's
 /// the constructor takes a clangMode flag to tell it whether or not to allow
@@ -789,6 +816,7 @@ void Preprocessor::RegisterBuiltinPragmas() {
   // #pragma clang ...
   AddPragmaHandler("clang", new PragmaPoisonHandler());
   AddPragmaHandler("clang", new PragmaSystemHeaderHandler());
+  AddPragmaHandler("clang", new PragmaDebugHandler());
   AddPragmaHandler("clang", new PragmaDependencyHandler());
   AddPragmaHandler("clang", new PragmaDiagnosticHandler(true));