diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Basic/TokenKinds.def | 2 | ||||
| -rw-r--r-- | clang/include/clang/Lex/PreprocessorLexer.h | 12 | ||||
| -rw-r--r-- | clang/lib/Lex/Lexer.cpp | 22 | ||||
| -rw-r--r-- | clang/lib/Lex/PreprocessorLexer.cpp | 2 | ||||
| -rw-r--r-- | clang/test/Index/Inputs/empty.h | 0 | ||||
| -rw-r--r-- | clang/test/Index/pp-many-includes.c | 208 | ||||
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 2 | 
7 files changed, 2 insertions, 246 deletions
diff --git a/clang/include/clang/Basic/TokenKinds.def b/clang/include/clang/Basic/TokenKinds.def index 704f1d9b326..25e8d5a635c 100644 --- a/clang/include/clang/Basic/TokenKinds.def +++ b/clang/include/clang/Basic/TokenKinds.def @@ -103,8 +103,6 @@ TOK(unknown)             // Not a token.  TOK(eof)                 // End of file.  TOK(eod)                 // End of preprocessing directive (end of line inside a                           // directive). -TOK(included_eof)        // End of included file, only if -                         // PreprocessorLexer::EnableIncludedEOF is true.  TOK(code_completion)     // Code completion marker  TOK(cxx_defaultarg_end)  // C++ default argument end marker diff --git a/clang/include/clang/Lex/PreprocessorLexer.h b/clang/include/clang/Lex/PreprocessorLexer.h index b85729dd08c..20fb8a0c480 100644 --- a/clang/include/clang/Lex/PreprocessorLexer.h +++ b/clang/include/clang/Lex/PreprocessorLexer.h @@ -61,10 +61,6 @@ protected:    /// Note that in raw mode that the PP pointer may be null.    bool LexingRawMode; -  /// \brief When true, if EOF of the current lexer is found, tok::included_eof -  /// is returned instead of continuing lexing higher in the include stack. -  bool EnableIncludedEOF; -    /// \brief A state machine that detects the \#ifndef-wrapping a file    /// idiom for the multiple-include optimization.    MultipleIncludeOpt MIOpt; @@ -83,8 +79,7 @@ protected:      : PP(0), InitialNumSLocEntries(0),        ParsingPreprocessorDirective(false),        ParsingFilename(false), -      LexingRawMode(false), -      EnableIncludedEOF(false) {} +      LexingRawMode(false) {}    virtual ~PreprocessorLexer() {} @@ -152,11 +147,6 @@ public:    /// \brief Return true if this lexer is in raw mode or not.    bool isLexingRawMode() const { return LexingRawMode; } -  /// \brief When true, if EOF of the current lexer is found, tok::included_eof -  /// is returned instead of continuing lexing higher in the include stack. -  /// False is the default behavior. -  void setEnableIncludedEOF(bool Enable) { EnableIncludedEOF = Enable; } -    /// \brief Return the preprocessor object for this lexer.    Preprocessor *getPP() const { return PP; } diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp index 6917645ca4f..bf0883e12a2 100644 --- a/clang/lib/Lex/Lexer.cpp +++ b/clang/lib/Lex/Lexer.cpp @@ -2594,14 +2594,8 @@ LexNextToken:        // Read the PP instance variable into an automatic variable, because        // LexEndOfFile will often delete 'this'.        Preprocessor *PPCache = PP; -      bool EnableIncludedEOFCache = EnableIncludedEOF;        if (LexEndOfFile(Result, CurPtr-1))  // Retreat back into the file.          return;   // Got a token to return. - -      if (EnableIncludedEOFCache) { -        Result.setKind(tok::included_eof); -        return; -      }        assert(PPCache && "Raw buffer::LexEndOfFile should return a token");        return PPCache->Lex(Result);      } @@ -3239,21 +3233,5 @@ HandleDirective:      }      goto LexNextToken;   // GCC isn't tail call eliminating.    } - -  if (PreprocessorLexer *PPLex = PP->getCurrentLexer()) { -    // If we #include something that contributes no tokens at all, return with -    // a tok::included_eof instead of recursively continuing lexing. -    // This avoids a stack overflow with a sequence of many empty #includes. -    PPLex->setEnableIncludedEOF(true); -    PP->Lex(Result); -    if (Result.isNot(tok::included_eof)) { -      if (Result.isNot(tok::eof) && Result.isNot(tok::eod)) -        PPLex->setEnableIncludedEOF(false); -      return; -    } -    if (PP->isCurrentLexer(this)) -      goto LexNextToken; -  } -    return PP->Lex(Result);  } diff --git a/clang/lib/Lex/PreprocessorLexer.cpp b/clang/lib/Lex/PreprocessorLexer.cpp index 390d4c4523b..a64c84d6bbd 100644 --- a/clang/lib/Lex/PreprocessorLexer.cpp +++ b/clang/lib/Lex/PreprocessorLexer.cpp @@ -22,7 +22,7 @@ void PreprocessorLexer::anchor() { }  PreprocessorLexer::PreprocessorLexer(Preprocessor *pp, FileID fid)    : PP(pp), FID(fid), InitialNumSLocEntries(0),      ParsingPreprocessorDirective(false), -    ParsingFilename(false), LexingRawMode(false), EnableIncludedEOF(false) { +    ParsingFilename(false), LexingRawMode(false) {    if (pp)      InitialNumSLocEntries = pp->getSourceManager().local_sloc_entry_size();  } diff --git a/clang/test/Index/Inputs/empty.h b/clang/test/Index/Inputs/empty.h deleted file mode 100644 index e69de29bb2d..00000000000 --- a/clang/test/Index/Inputs/empty.h +++ /dev/null diff --git a/clang/test/Index/pp-many-includes.c b/clang/test/Index/pp-many-includes.c deleted file mode 100644 index 8a53b4fc64a..00000000000 --- a/clang/test/Index/pp-many-includes.c +++ /dev/null @@ -1,208 +0,0 @@ -// RUN: env LIBCLANG_THREAD_SMALLSTACK=1 c-index-test -index-file %s | FileCheck %s - -// rdar://11988695 -// Check that we don't get stack overflow while including a lot of empty includes. - -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" -#include "Inputs/empty.h" - -// CHECK: [indexDeclaration]: kind: function | name: foo -void foo(); diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index bb75db3554b..3a6c408bff1 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -6119,8 +6119,6 @@ namespace clang {  bool RunSafely(llvm::CrashRecoveryContext &CRC,                 void (*Fn)(void*), void *UserData,                 unsigned Size) { -  if (getenv("LIBCLANG_THREAD_SMALLSTACK")) -    Size = 0x10000; // 64K.    if (!Size)      Size = GetSafetyThreadStackSize();    if (Size)  | 

