[cfe-commits] r42818 - in /cfe/trunk: Driver/DiagChecker.cpp Driver/PrintPreprocessedOutput.cpp Driver/clang.cpp Lex/Lexer.cpp Lex/Preprocessor.cpp Sema/ASTStreamer.cpp include/clang/Lex/Lexer.h include/clang/Lex/Preprocessor.h

Chris Lattner sabre at nondot.org
Tue Oct 9 15:10:18 PDT 2007


Author: lattner
Date: Tue Oct  9 17:10:18 2007
New Revision: 42818

URL: http://llvm.org/viewvc/llvm-project?rev=42818&view=rev
Log:
Make a significant change to invert the control flow handling
predefined macros.  Previously, these were handled by the driver,
now they are handled by the preprocessor.

Some fallout of this:

1. Instead of preprocessing two buffers (the predefines, then the 
   main source file)  we now start preprocessing the main source 
   file and inject the predefines as a "psuedo #include" from the
   main source file.
2. #1 allows us to nuke the Lexer::IsMainFile flag and simplify
   Preprocessor::isInPrimaryFile.
3. The driver doesn't have to know about standard #defines, the
   preprocessor knows, which is nice for people wanting to define
   their own drivers.
4. This allows us to put normal tokens in the predefine buffer,
   for example a definition for __builtin_va_list that is 
   target-specific, and a typedef for id in objc.


Modified:
    cfe/trunk/Driver/DiagChecker.cpp
    cfe/trunk/Driver/PrintPreprocessedOutput.cpp
    cfe/trunk/Driver/clang.cpp
    cfe/trunk/Lex/Lexer.cpp
    cfe/trunk/Lex/Preprocessor.cpp
    cfe/trunk/Sema/ASTStreamer.cpp
    cfe/trunk/include/clang/Lex/Lexer.h
    cfe/trunk/include/clang/Lex/Preprocessor.h

Modified: cfe/trunk/Driver/DiagChecker.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/DiagChecker.cpp?rev=42818&r1=42817&r2=42818&view=diff

==============================================================================
--- cfe/trunk/Driver/DiagChecker.cpp (original)
+++ cfe/trunk/Driver/DiagChecker.cpp Tue Oct  9 17:10:18 2007
@@ -91,7 +91,7 @@
   PP.SetCommentRetentionState(true, true);
 
   // Enter the cave.
-  PP.EnterSourceFile(MainFileID, 0, true);
+  PP.EnterMainSourceFile(MainFileID);
 
   // Turn off all warnings from relexing or preprocessing.
   PP.getDiagnostics().setWarnOnExtensions(false);

Modified: cfe/trunk/Driver/PrintPreprocessedOutput.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/PrintPreprocessedOutput.cpp?rev=42818&r1=42817&r2=42818&view=diff

==============================================================================
--- cfe/trunk/Driver/PrintPreprocessedOutput.cpp (original)
+++ cfe/trunk/Driver/PrintPreprocessedOutput.cpp Tue Oct  9 17:10:18 2007
@@ -534,7 +534,7 @@
   // After we have configured the preprocessor, enter the main file.
   
   // Start parsing the specified input file.
-  PP.EnterSourceFile(MainFileID, 0, true);
+  PP.EnterMainSourceFile(MainFileID);
   
   do {
     PrevTok = Tok;

Modified: cfe/trunk/Driver/clang.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/clang.cpp?rev=42818&r1=42817&r2=42818&view=diff

==============================================================================
--- cfe/trunk/Driver/clang.cpp (original)
+++ cfe/trunk/Driver/clang.cpp Tue Oct  9 17:10:18 2007
@@ -394,76 +394,56 @@
   Buf.push_back('\n');
 }
 
-static void InitializePredefinedMacros(Preprocessor &PP, 
-                                       std::vector<char> &Buf) {
-  // FIXME: Implement magic like cpp_init_builtins for things like __STDC__
-  // and __DATE__ etc.
-#if 0
-  /* __STDC__ has the value 1 under normal circumstances.
-  However, if (a) we are in a system header, (b) the option
-  stdc_0_in_system_headers is true (set by target config), and
-  (c) we are not in strictly conforming mode, then it has the
-  value 0.  (b) and (c) are already checked in cpp_init_builtins.  */
-  //case BT_STDC:
-    if (cpp_in_system_header (pfile))
-      number = 0;
-    else
-      number = 1;
-    break;
-#endif    
-  // These should all be defined in the preprocessor according to the
-  // current language configuration.
-  DefineBuiltinMacro(Buf, "__STDC__=1");
-  //DefineBuiltinMacro(Buf, "__ASSEMBLER__=1");
-  if (PP.getLangOptions().C99 && !PP.getLangOptions().CPlusPlus)
-    DefineBuiltinMacro(Buf, "__STDC_VERSION__=199901L");
-  else if (0) // STDC94 ?
-    DefineBuiltinMacro(Buf, "__STDC_VERSION__=199409L");
-  
-  DefineBuiltinMacro(Buf, "__STDC_HOSTED__=1");
-  if (PP.getLangOptions().ObjC1)
-    DefineBuiltinMacro(Buf, "__OBJC__=1");
-  if (PP.getLangOptions().ObjC2)
-    DefineBuiltinMacro(Buf, "__OBJC2__=1");
-
-  // Get the target #defines.
-  PP.getTargetInfo().getTargetDefines(Buf);
-  
-  // Compiler set macros.
-  DefineBuiltinMacro(Buf, "__APPLE_CC__=5250");
-  DefineBuiltinMacro(Buf, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__=1030");
-  DefineBuiltinMacro(Buf, "__GNUC_MINOR__=0");
-  DefineBuiltinMacro(Buf, "__GNUC_PATCHLEVEL__=1");
-  DefineBuiltinMacro(Buf, "__GNUC__=4");
-  DefineBuiltinMacro(Buf, "__GXX_ABI_VERSION=1002");
-  DefineBuiltinMacro(Buf, "__VERSION__=\"4.0.1 (Apple Computer, Inc. "
-                     "build 5250)\"");
-
-  // Build configuration options.
-  DefineBuiltinMacro(Buf, "__DYNAMIC__=1");
-  DefineBuiltinMacro(Buf, "__FINITE_MATH_ONLY__=0");
-  DefineBuiltinMacro(Buf, "__NO_INLINE__=1");
-  DefineBuiltinMacro(Buf, "__PIC__=1");
-
-  
-  if (PP.getLangOptions().CPlusPlus) {
-    DefineBuiltinMacro(Buf, "__DEPRECATED=1");
-    DefineBuiltinMacro(Buf, "__EXCEPTIONS=1");
-    DefineBuiltinMacro(Buf, "__GNUG__=4");
-    DefineBuiltinMacro(Buf, "__GXX_WEAK__=1");
-    DefineBuiltinMacro(Buf, "__cplusplus=1");
-    DefineBuiltinMacro(Buf, "__private_extern__=extern");
+
+/// InitializePreprocessor - Initialize the preprocessor getting it and the
+/// environment ready to process a single file. This returns the file ID for the
+/// input file. If a failure happens, it returns 0.
+///
+static unsigned InitializePreprocessor(Preprocessor &PP,
+                                       const std::string &InFile,
+                                       SourceManager &SourceMgr,
+                                       HeaderSearch &HeaderInfo,
+                                       const LangOptions &LangInfo,
+                                       std::vector<char> &PredefineBuffer) {
+  
+  FileManager &FileMgr = HeaderInfo.getFileMgr();
+  
+  // Figure out where to get and map in the main file.
+  unsigned MainFileID = 0;
+  if (InFile != "-") {
+    const FileEntry *File = FileMgr.getFile(InFile);
+    if (File) MainFileID = SourceMgr.createFileID(File, SourceLocation());
+    if (MainFileID == 0) {
+      fprintf(stderr, "Error reading '%s'!\n",InFile.c_str());
+      return 0;
+    }
+  } else {
+    llvm::MemoryBuffer *SB = llvm::MemoryBuffer::getSTDIN();
+    if (SB) MainFileID = SourceMgr.createFileIDForMemBuffer(SB);
+    if (MainFileID == 0) {
+      fprintf(stderr, "Error reading standard input!  Empty?\n");
+      return 0;
+    }
   }
   
-  // FIXME: Should emit a #line directive here.
-
   // Add macros from the command line.
   // FIXME: Should traverse the #define/#undef lists in parallel.
   for (unsigned i = 0, e = D_macros.size(); i != e; ++i)
-    DefineBuiltinMacro(Buf, D_macros[i].c_str());
+    DefineBuiltinMacro(PredefineBuffer, D_macros[i].c_str());
   for (unsigned i = 0, e = U_macros.size(); i != e; ++i)
-    DefineBuiltinMacro(Buf, U_macros[i].c_str(), "#undef ");
+    DefineBuiltinMacro(PredefineBuffer, U_macros[i].c_str(), "#undef ");
+  
+  // FIXME: Read any files specified by -imacros or -include.
+  
+  // Null terminate PredefinedBuffer and add it.
+  PredefineBuffer.push_back(0);
+  PP.setPredefines(&PredefineBuffer[0]);
+  
+  // Once we've read this, we're done.
+  return MainFileID;
 }
+ 
+ 
 
 //===----------------------------------------------------------------------===//
 // Preprocessor include path information.
@@ -712,18 +692,13 @@
 }
 
 
-// Read any files specified by -imacros or -include.
-static void ReadPrologFiles(Preprocessor &PP, std::vector<char> &Buf) {
-  // FIXME: IMPLEMENT
-}
-
 //===----------------------------------------------------------------------===//
 // Basic Parser driver
 //===----------------------------------------------------------------------===//
 
 static void ParseFile(Preprocessor &PP, MinimalAction *PA, unsigned MainFileID){
   Parser P(PP, *PA);
-  PP.EnterSourceFile(MainFileID, 0, true);
+  PP.EnterMainSourceFile(MainFileID);
   
   // Parsing the specified input file.
   P.ParseTranslationUnit();
@@ -734,69 +709,6 @@
 // Main driver
 //===----------------------------------------------------------------------===//
 
-/// InitializePreprocessor - Initialize the preprocessor getting it and the
-/// environment ready to process a single file. This returns the file ID for the
-/// input file. If a failure happens, it returns 0.
-///
-static unsigned InitializePreprocessor(Preprocessor &PP,
-                                       const std::string &InFile,
-                                       SourceManager &SourceMgr,
-                                       HeaderSearch &HeaderInfo,
-                                       const LangOptions &LangInfo,
-                                       std::vector<char> &PrologMacros) {
-  PrologMacros.reserve(4080);
-  
-  FileManager &FileMgr = HeaderInfo.getFileMgr();
-  
-  // Install things like __POWERPC__, __GNUC__, etc into the macro table.
-  InitializePredefinedMacros(PP, PrologMacros);
-  
-  // Read any files specified by -imacros or -include.
-  ReadPrologFiles(PP, PrologMacros);
-  
-  // Figure out where to get and map in the main file.
-  unsigned MainFileID = 0;
-  if (InFile != "-") {
-    const FileEntry *File = FileMgr.getFile(InFile);
-    if (File) MainFileID = SourceMgr.createFileID(File, SourceLocation());
-    if (MainFileID == 0) {
-      fprintf(stderr, "Error reading '%s'!\n",InFile.c_str());
-      return 0;
-    }
-  } else {
-    llvm::MemoryBuffer *SB = llvm::MemoryBuffer::getSTDIN();
-    if (SB) MainFileID = SourceMgr.createFileIDForMemBuffer(SB);
-    if (MainFileID == 0) {
-      fprintf(stderr, "Error reading standard input!  Empty?\n");
-      return 0;
-    }
-  }
-  
-  // Now that we have emitted the predefined macros, #includes, etc into
-  // PrologMacros, preprocess it to populate the initial preprocessor state.
-
-  // Memory buffer must end with a null byte!
-  PrologMacros.push_back(0);
-
-  llvm::MemoryBuffer *SB = 
-    llvm::MemoryBuffer::getMemBuffer(&PrologMacros.front(),&PrologMacros.back(),
-                                     "<predefines>");
-  assert(SB && "Cannot fail to create predefined source buffer");
-  unsigned FileID = SourceMgr.createFileIDForMemBuffer(SB);
-  assert(FileID && "Could not create FileID for predefines?");
-
-  // Start parsing the predefines.
-  PP.EnterSourceFile(FileID, 0);
-
-  // Lex the file, which will read all the macros.
-  Token Tok;
-  PP.Lex(Tok);
-  assert(Tok.is(tok::eof) && "Didn't read entire file!");
-
-  // Once we've read this, we're done.
-  return MainFileID;
-}
-
 /// ProcessInputFile - Process a single input file with the specified state.
 ///
 static void ProcessInputFile(Preprocessor &PP, unsigned MainFileID,
@@ -816,7 +728,7 @@
   case DumpTokens: {                 // Token dump mode.
     Token Tok;
     // Start parsing the specified input file.
-    PP.EnterSourceFile(MainFileID, 0, true);
+    PP.EnterMainSourceFile(MainFileID);
     do {
       PP.Lex(Tok);
       PP.DumpToken(Tok, true);
@@ -828,7 +740,7 @@
   case RunPreprocessorOnly: {        // Just lex as fast as we can, no output.
     Token Tok;
     // Start parsing the specified input file.
-    PP.EnterSourceFile(MainFileID, 0, true);
+    PP.EnterMainSourceFile(MainFileID);
     do {
       PP.Lex(Tok);
     } while (Tok.isNot(tok::eof));
@@ -982,10 +894,10 @@
     Preprocessor PP(Diags, LangInfo, *Target, SourceMgr, HeaderInfo);
     DiagClient->setPreprocessor(PP);
     const std::string &InFile = InputFilenames[i];
-    std::vector<char> PrologMacros;
+    std::vector<char> PredefineBuffer;
     unsigned MainFileID = InitializePreprocessor(PP, InFile, SourceMgr,
                                                  HeaderInfo, LangInfo,
-                                                 PrologMacros);
+                                                 PredefineBuffer);
     
     if (!MainFileID) continue;
 

Modified: cfe/trunk/Lex/Lexer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Lex/Lexer.cpp?rev=42818&r1=42817&r2=42818&view=diff

==============================================================================
--- cfe/trunk/Lex/Lexer.cpp (original)
+++ cfe/trunk/Lex/Lexer.cpp Tue Oct  9 17:10:18 2007
@@ -65,7 +65,6 @@
   const llvm::MemoryBuffer *InputFile = SourceMgr.getBuffer(InputFileID);
       
   Is_PragmaLexer = false;
-  IsMainFile = false;
   InitCharacterInfo();
   
   // BufferStart must always be InputFile->getBufferStart().

Modified: cfe/trunk/Lex/Preprocessor.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Lex/Preprocessor.cpp?rev=42818&r1=42817&r2=42818&view=diff

==============================================================================
--- cfe/trunk/Lex/Preprocessor.cpp (original)
+++ cfe/trunk/Lex/Preprocessor.cpp Tue Oct  9 17:10:18 2007
@@ -73,6 +73,8 @@
   // This gets unpoisoned where it is allowed.
   (Ident__VA_ARGS__ = getIdentifierInfo("__VA_ARGS__"))->setIsPoisoned();
   
+  Predefines = 0;
+  
   // Initialize the pragma handlers.
   PragmaHandlers = new PragmaNamespace(0);
   RegisterBuiltinPragmas();
@@ -311,6 +313,127 @@
 }
 
 
+//===----------------------------------------------------------------------===//
+// Preprocessor Initialization Methods
+//===----------------------------------------------------------------------===//
+
+// Append a #define line to Buf for Macro.  Macro should be of the form XXX,
+// in which case we emit "#define XXX 1" or "XXX=Y z W" in which case we emit
+// "#define XXX Y z W".  To get a #define with no value, use "XXX=".
+static void DefineBuiltinMacro(std::vector<char> &Buf, const char *Macro,
+                               const char *Command = "#define ") {
+  Buf.insert(Buf.end(), Command, Command+strlen(Command));
+  if (const char *Equal = strchr(Macro, '=')) {
+    // Turn the = into ' '.
+    Buf.insert(Buf.end(), Macro, Equal);
+    Buf.push_back(' ');
+    Buf.insert(Buf.end(), Equal+1, Equal+strlen(Equal));
+  } else {
+    // Push "macroname 1".
+    Buf.insert(Buf.end(), Macro, Macro+strlen(Macro));
+    Buf.push_back(' ');
+    Buf.push_back('1');
+  }
+  Buf.push_back('\n');
+}
+
+
+static void InitializePredefinedMacros(Preprocessor &PP, 
+                                       std::vector<char> &Buf) {
+  // FIXME: Implement magic like cpp_init_builtins for things like __STDC__
+  // and __DATE__ etc.
+#if 0
+  /* __STDC__ has the value 1 under normal circumstances.
+  However, if (a) we are in a system header, (b) the option
+  stdc_0_in_system_headers is true (set by target config), and
+  (c) we are not in strictly conforming mode, then it has the
+  value 0.  (b) and (c) are already checked in cpp_init_builtins.  */
+  //case BT_STDC:
+  if (cpp_in_system_header (pfile))
+    number = 0;
+  else
+    number = 1;
+  break;
+#endif    
+  // These should all be defined in the preprocessor according to the
+  // current language configuration.
+  DefineBuiltinMacro(Buf, "__STDC__=1");
+  //DefineBuiltinMacro(Buf, "__ASSEMBLER__=1");
+  if (PP.getLangOptions().C99 && !PP.getLangOptions().CPlusPlus)
+    DefineBuiltinMacro(Buf, "__STDC_VERSION__=199901L");
+  else if (0) // STDC94 ?
+    DefineBuiltinMacro(Buf, "__STDC_VERSION__=199409L");
+  
+  DefineBuiltinMacro(Buf, "__STDC_HOSTED__=1");
+  if (PP.getLangOptions().ObjC1)
+    DefineBuiltinMacro(Buf, "__OBJC__=1");
+  if (PP.getLangOptions().ObjC2)
+    DefineBuiltinMacro(Buf, "__OBJC2__=1");
+  
+  // Get the target #defines.
+  PP.getTargetInfo().getTargetDefines(Buf);
+  
+  // Compiler set macros.
+  DefineBuiltinMacro(Buf, "__APPLE_CC__=5250");
+  DefineBuiltinMacro(Buf, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__=1030");
+  DefineBuiltinMacro(Buf, "__GNUC_MINOR__=0");
+  DefineBuiltinMacro(Buf, "__GNUC_PATCHLEVEL__=1");
+  DefineBuiltinMacro(Buf, "__GNUC__=4");
+  DefineBuiltinMacro(Buf, "__GXX_ABI_VERSION=1002");
+  DefineBuiltinMacro(Buf, "__VERSION__=\"4.0.1 (Apple Computer, Inc. "
+                     "build 5250)\"");
+  
+  // Build configuration options.
+  DefineBuiltinMacro(Buf, "__DYNAMIC__=1");
+  DefineBuiltinMacro(Buf, "__FINITE_MATH_ONLY__=0");
+  DefineBuiltinMacro(Buf, "__NO_INLINE__=1");
+  DefineBuiltinMacro(Buf, "__PIC__=1");
+  
+  
+  if (PP.getLangOptions().CPlusPlus) {
+    DefineBuiltinMacro(Buf, "__DEPRECATED=1");
+    DefineBuiltinMacro(Buf, "__EXCEPTIONS=1");
+    DefineBuiltinMacro(Buf, "__GNUG__=4");
+    DefineBuiltinMacro(Buf, "__GXX_WEAK__=1");
+    DefineBuiltinMacro(Buf, "__cplusplus=1");
+    DefineBuiltinMacro(Buf, "__private_extern__=extern");
+  }
+  
+  // FIXME: Should emit a #line directive here.
+}
+
+
+/// EnterMainSourceFile - Enter the specified FileID as the main source file,
+/// which implicitly adds the builting defines etc.
+void Preprocessor::EnterMainSourceFile(unsigned MainFileID) {
+  // Enter the main file source buffer.
+  EnterSourceFile(MainFileID, 0);
+  
+  
+  std::vector<char> PrologFile;
+  PrologFile.reserve(4080);
+  
+  // Install things like __POWERPC__, __GNUC__, etc into the macro table.
+  InitializePredefinedMacros(*this, PrologFile);
+  
+  // Add on the predefines from the driver.
+  PrologFile.insert(PrologFile.end(), Predefines,Predefines+strlen(Predefines));
+  
+  // Memory buffer must end with a null byte!
+  PrologFile.push_back(0);
+
+  // Now that we have emitted the predefined macros, #includes, etc into
+  // PrologFile, preprocess it to populate the initial preprocessor state.
+  llvm::MemoryBuffer *SB = 
+    llvm::MemoryBuffer::getMemBufferCopy(&PrologFile.front(),&PrologFile.back(),
+                                         "<predefines>");
+  assert(SB && "Cannot fail to create predefined source buffer");
+  unsigned FileID = SourceMgr.createFileIDForMemBuffer(SB);
+  assert(FileID && "Could not create FileID for predefines?");
+  
+  // Start parsing the predefines.
+  EnterSourceFile(FileID, 0);
+}
 
 //===----------------------------------------------------------------------===//
 // Source File Location Methods.
@@ -367,14 +490,17 @@
 /// #include.
 bool Preprocessor::isInPrimaryFile() const {
   if (CurLexer && !CurLexer->Is_PragmaLexer)
-    return CurLexer->isMainFile();
+    return IncludeMacroStack.empty();
   
   // If there are any stacked lexers, we're in a #include.
-  for (unsigned i = 0, e = IncludeMacroStack.size(); i != e; ++i)
+  assert(IncludeMacroStack[0].TheLexer &&
+         !IncludeMacroStack[0].TheLexer->Is_PragmaLexer &&
+         "Top level include stack isn't our primary lexer?");
+  for (unsigned i = 1, e = IncludeMacroStack.size(); i != e; ++i)
     if (IncludeMacroStack[i].TheLexer &&
         !IncludeMacroStack[i].TheLexer->Is_PragmaLexer)
-      return IncludeMacroStack[i].TheLexer->isMainFile();
-  return false;
+      return false;
+  return true;
 }
 
 /// getCurrentLexer - Return the current file lexer being lexed from.  Note
@@ -397,8 +523,7 @@
 /// start lexing tokens from it instead of the current buffer.  Return true
 /// on failure.
 void Preprocessor::EnterSourceFile(unsigned FileID,
-                                   const DirectoryLookup *CurDir,
-                                   bool isMainFile) {
+                                   const DirectoryLookup *CurDir) {
   assert(CurMacroExpander == 0 && "Cannot #include a file inside a macro!");
   ++NumEnteredSourceFiles;
   
@@ -406,7 +531,6 @@
     MaxIncludeStackDepth = IncludeMacroStack.size();
 
   Lexer *TheLexer = new Lexer(SourceLocation::getFileLoc(FileID, 0), *this);
-  if (isMainFile) TheLexer->setIsMainFile();
   EnterSourceFileWithLexer(TheLexer, CurDir);
 }  
   

Modified: cfe/trunk/Sema/ASTStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/ASTStreamer.cpp?rev=42818&r1=42817&r2=42818&view=diff

==============================================================================
--- cfe/trunk/Sema/ASTStreamer.cpp (original)
+++ cfe/trunk/Sema/ASTStreamer.cpp Tue Oct  9 17:10:18 2007
@@ -28,7 +28,7 @@
   public:
     ASTStreamer(Preprocessor &pp, ASTContext &ctxt, unsigned MainFileID)
       : P(pp, *new Sema(pp, ctxt, LastInGroupList)) {
-      pp.EnterSourceFile(MainFileID, 0, true);
+      pp.EnterMainSourceFile(MainFileID);
       
       // Initialize the parser.
       P.Initialize();

Modified: cfe/trunk/include/clang/Lex/Lexer.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Lexer.h?rev=42818&r1=42817&r2=42818&view=diff

==============================================================================
--- cfe/trunk/include/clang/Lex/Lexer.h (original)
+++ cfe/trunk/include/clang/Lex/Lexer.h Tue Oct  9 17:10:18 2007
@@ -39,7 +39,6 @@
   Preprocessor &PP;              // Preprocessor object controlling lexing.
   LangOptions Features;          // Features enabled by this language (cache).
   bool Is_PragmaLexer;           // True if lexer for _Pragma handling.
-  bool IsMainFile;               // True if top-level file.
   
   //===--------------------------------------------------------------------===//
   // Context-specific lexing flags set by the preprocessor.
@@ -112,16 +111,6 @@
   /// from.  Currently this is only used by _Pragma handling.
   SourceLocation getFileLoc() const { return FileLoc; }
   
-  /// setIsMainFile - Mark this lexer as being the lexer for the top-level
-  /// source file.
-  void setIsMainFile() {
-    IsMainFile = true;
-  }
-  
-  /// isMainFile - Return true if this is the top-level file.
-  ///
-  bool isMainFile() const { return IsMainFile; }
-  
   /// Lex - Return the next token in the file.  If this is the end of file, it
   /// return the tok::eof token.  Return true if an error occurred and
   /// compilation should terminate, false if normal.  This implicitly involves

Modified: cfe/trunk/include/clang/Lex/Preprocessor.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Preprocessor.h?rev=42818&r1=42817&r2=42818&view=diff

==============================================================================
--- cfe/trunk/include/clang/Lex/Preprocessor.h (original)
+++ cfe/trunk/include/clang/Lex/Preprocessor.h Tue Oct  9 17:10:18 2007
@@ -129,6 +129,10 @@
   unsigned NumFastMacroExpanded, NumTokenPaste, NumFastTokenPaste;
   unsigned NumSkipped;
   
+  /// Predefines - This pointer, if non-null, are the predefined macros that 
+  /// preprocessor should use from the command line etc.
+  const char *Predefines;
+  
   /// MacroExpanderCache - Cache macro expanders to reduce malloc traffic.
   enum { MacroExpanderCacheSize = 8 };
   unsigned NumCachedMacroExpanders;
@@ -163,10 +167,6 @@
     return CurLexer == L;
   }
   
-  /// isInPrimaryFile - Return true if we're in the top-level file, not in a
-  /// #include.
-  bool isInPrimaryFile() const;
-  
   /// getCurrentLexer - Return the current file lexer being lexed from.  Note
   /// that this ignores any potentially active macro expansions and _Pragma
   /// expansions going on at the time.
@@ -189,6 +189,10 @@
   ///
   void setMacroInfo(IdentifierInfo *II, MacroInfo *MI);
   
+  void setPredefines(const char *P) {
+    Predefines = P;
+  }
+  
   /// getIdentifierInfo - Return information about the specified preprocessor
   /// identifier token.  The version of this method that takes two character
   /// pointers is preferred unless the identifier is already available as a
@@ -207,11 +211,15 @@
   /// pragma line before the pragma string starts, e.g. "STDC" or "GCC".
   void AddPragmaHandler(const char *Namespace, PragmaHandler *Handler);
 
+  /// EnterMainSourceFile - Enter the specified FileID as the main source file,
+  /// which implicitly adds the builting defines etc.
+  void EnterMainSourceFile(unsigned CurFileID);
+  
+  
   /// EnterSourceFile - Add a source file to the top of the include stack and
   /// start lexing tokens from it instead of the current buffer.  If isMainFile
   /// is true, this is the main file for the translation unit.
-  void EnterSourceFile(unsigned CurFileID, const DirectoryLookup *Dir,
-                       bool isMainFile = false);
+  void EnterSourceFile(unsigned CurFileID, const DirectoryLookup *Dir);
 
   /// EnterMacro - Add a Macro to the top of the include stack and start lexing
   /// tokens from it instead of the current buffer.  Args specifies the
@@ -358,7 +366,10 @@
   /// not, emit a diagnostic and consume up until the eom.
   void CheckEndOfDirective(const char *Directive);
 private:
-
+  /// isInPrimaryFile - Return true if we're in the top-level file, not in a
+  /// #include.
+  bool isInPrimaryFile() const;
+  
   /// DiscardUntilEndOfDirective - Read and discard all tokens remaining on the
   /// current line until the tok::eom token is found.
   void DiscardUntilEndOfDirective();





More information about the cfe-commits mailing list