88 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===- PreprocessorTracker.h - Tracks preprocessor activities -*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===--------------------------------------------------------------------===//
 | |
| ///
 | |
| /// \file
 | |
| /// \brief Macro expansions and preprocessor conditional consistency checker.
 | |
| ///
 | |
| //===--------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef MODULARIZE_PREPROCESSOR_TRACKER_H
 | |
| #define MODULARIZE_PREPROCESSOR_TRACKER_H
 | |
| 
 | |
| #include "clang/Lex/Preprocessor.h"
 | |
| 
 | |
| namespace Modularize {
 | |
| 
 | |
| /// \brief Preprocessor tracker for modularize.
 | |
| ///
 | |
| /// The PreprocessorTracker class defines an API for
 | |
| /// checking macro expansions and preprocessor conditional expressions
 | |
| /// in a header file for consistency among one or more compilations of
 | |
| /// the header in a #include scenario.  This is for helping a user
 | |
| /// find which macro expansions or conditionals might be problematic with
 | |
| /// respect to using the headers in the modules scenario, because they
 | |
| /// evaluate to different values depending on how or where a header
 | |
| /// is included.
 | |
| ///
 | |
| /// The handlePreprocessorEntry function implementation will register
 | |
| /// a PPCallbacks object in the given Preprocessor object.  The calls to
 | |
| /// the callbacks will collect information about the macro expansions
 | |
| /// and preprocessor conditionals encountered, for later analysis and
 | |
| /// reporting of inconsistencies between runs performed by calls to
 | |
| /// the reportInconsistentMacros and reportInconsistentConditionals
 | |
| /// functions respectively.  The handlePreprocessorExit informs the
 | |
| /// implementation that a preprocessing session is complete, allowing
 | |
| /// it to do any needed compilation completion activities in the checker.
 | |
| class PreprocessorTracker {
 | |
| public:
 | |
|   virtual ~PreprocessorTracker();
 | |
| 
 | |
|   // Handle entering a preprocessing session.
 | |
|   // (Called after a Preprocessor object is created, but before preprocessing.)
 | |
|   virtual void handlePreprocessorEntry(clang::Preprocessor &PP,
 | |
|                                        llvm::StringRef RootHeaderFile) = 0;
 | |
|   // Handle exiting a preprocessing session.
 | |
|   // (Called after preprocessing is complete, but before the Preprocessor
 | |
|   // object is destroyed.)
 | |
|   virtual void handlePreprocessorExit() = 0;
 | |
| 
 | |
|   // Handle include directive.
 | |
|   // This function is called every time an include directive is seen by the
 | |
|   // preprocessor, for the purpose of later checking for 'extern "" {}' or
 | |
|   // "namespace {}" blocks containing #include directives.
 | |
|   virtual void handleIncludeDirective(llvm::StringRef DirectivePath,
 | |
|                                       int DirectiveLine, int DirectiveColumn,
 | |
|                                       llvm::StringRef TargetPath) = 0;
 | |
| 
 | |
|   // Check for include directives within the given source line range.
 | |
|   // Report errors if any found.  Returns true if no include directives
 | |
|   // found in block.
 | |
|   virtual bool checkForIncludesInBlock(clang::Preprocessor &PP,
 | |
|                                        clang::SourceRange BlockSourceRange,
 | |
|                                        const char *BlockIdentifierMessage,
 | |
|                                        llvm::raw_ostream &OS) = 0;
 | |
| 
 | |
|   // Report on inconsistent macro instances.
 | |
|   // Returns true if any mismatches.
 | |
|   virtual bool reportInconsistentMacros(llvm::raw_ostream &OS) = 0;
 | |
| 
 | |
|   // Report on inconsistent conditional directive instances.
 | |
|   // Returns true if any mismatches.
 | |
|   virtual bool reportInconsistentConditionals(llvm::raw_ostream &OS) = 0;
 | |
| 
 | |
|   // Create instance of PreprocessorTracker.
 | |
|   static PreprocessorTracker *create(
 | |
|     llvm::SmallVector<std::string, 32> &Headers,
 | |
|     bool DoBlockCheckHeaderListOnly);
 | |
| };
 | |
| 
 | |
| } // end namespace Modularize
 | |
| 
 | |
| #endif
 |