forked from OSchip/llvm-project
87 lines
3.7 KiB
C++
87 lines
3.7 KiB
C++
//===- PreprocessorTracker.h - Tracks preprocessor activities -*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===--------------------------------------------------------------------===//
|
|
///
|
|
/// \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
|