1 //===- clang/Lex/DependencyDirectivesSourceMinimizer.h - ----------*- C++ -*-// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// This is the interface for minimizing header and source files to the 11 /// minimum necessary preprocessor directives for evaluating includes. It 12 /// reduces the source down to #define, #include, #import, @import, and any 13 /// conditional preprocessor logic that contains one of those. 14 /// 15 //===----------------------------------------------------------------------===// 16 17 #ifndef LLVM_CLANG_LEX_DEPENDENCY_DIRECTIVES_SOURCE_MINIMIZER_H 18 #define LLVM_CLANG_LEX_DEPENDENCY_DIRECTIVES_SOURCE_MINIMIZER_H 19 20 #include "clang/Basic/SourceLocation.h" 21 #include "llvm/ADT/ArrayRef.h" 22 #include "llvm/ADT/SmallVector.h" 23 #include "llvm/ADT/StringRef.h" 24 25 namespace clang { 26 27 class DiagnosticsEngine; 28 29 namespace minimize_source_to_dependency_directives { 30 31 /// Represents the kind of preprocessor directive or a module declaration that 32 /// is tracked by the source minimizer in its token output. 33 enum TokenKind { 34 pp_none, 35 pp_include, 36 pp___include_macros, 37 pp_define, 38 pp_undef, 39 pp_import, 40 pp_pragma_import, 41 pp_pragma_once, 42 pp_include_next, 43 pp_if, 44 pp_ifdef, 45 pp_ifndef, 46 pp_elif, 47 pp_else, 48 pp_endif, 49 decl_at_import, 50 cxx_export_decl, 51 cxx_module_decl, 52 cxx_import_decl, 53 pp_eof, 54 }; 55 56 /// Represents a simplified token that's lexed as part of the source 57 /// minimization. It's used to track the location of various preprocessor 58 /// directives that could potentially have an effect on the depedencies. 59 struct Token { 60 /// The kind of token. 61 TokenKind K = pp_none; 62 63 /// Offset into the output byte stream of where the directive begins. 64 int Offset = -1; 65 TokenToken66 Token(TokenKind K, int Offset) : K(K), Offset(Offset) {} 67 }; 68 69 /// Simplified token range to track the range of a potentially skippable PP 70 /// directive. 71 struct SkippedRange { 72 /// Offset into the output byte stream of where the skipped directive begins. 73 int Offset; 74 75 /// The number of bytes that can be skipped before the preprocessing must 76 /// resume. 77 int Length; 78 }; 79 80 /// Computes the potential source ranges that can be skipped by the preprocessor 81 /// when skipping a directive like #if, #ifdef or #elsif. 82 /// 83 /// \returns false on success, true on error. 84 bool computeSkippedRanges(ArrayRef<Token> Input, 85 llvm::SmallVectorImpl<SkippedRange> &Range); 86 87 } // end namespace minimize_source_to_dependency_directives 88 89 /// Minimize the input down to the preprocessor directives that might have 90 /// an effect on the dependencies for a compilation unit. 91 /// 92 /// This function deletes all non-preprocessor code, and strips anything that 93 /// can't affect what gets included. It canonicalizes whitespace where 94 /// convenient to stabilize the output against formatting changes in the input. 95 /// 96 /// Clears the output vectors at the beginning of the call. 97 /// 98 /// \returns false on success, true on error. If the diagnostic engine is not 99 /// null, an appropriate error is reported using the given input location 100 /// with the offset that corresponds to the minimizer's current buffer offset. 101 bool minimizeSourceToDependencyDirectives( 102 llvm::StringRef Input, llvm::SmallVectorImpl<char> &Output, 103 llvm::SmallVectorImpl<minimize_source_to_dependency_directives::Token> 104 &Tokens, 105 DiagnosticsEngine *Diags = nullptr, 106 SourceLocation InputSourceLoc = SourceLocation()); 107 108 } // end namespace clang 109 110 #endif // LLVM_CLANG_LEX_DEPENDENCY_DIRECTIVES_SOURCE_MINIMIZER_H 111