]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/CodeGen/MacroPPCallbacks.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / lib / CodeGen / MacroPPCallbacks.h
1 //===--- MacroPPCallbacks.h -------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  This file defines implementation for the macro preprocessors callbacks.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_CLANG_LIB_CODEGEN_MACROPPCALLBACKS_H
15 #define LLVM_CLANG_LIB_CODEGEN_MACROPPCALLBACKS_H
16
17 #include "clang/Lex/PPCallbacks.h"
18
19 namespace llvm {
20 class DIMacroFile;
21 class DIMacroNode;
22 }
23 namespace clang {
24 class Preprocessor;
25 class MacroInfo;
26 class CodeGenerator;
27
28 class MacroPPCallbacks : public PPCallbacks {
29   /// A pointer to code generator, where debug info generator can be found.
30   CodeGenerator *Gen;
31
32   /// Preprocessor.
33   Preprocessor &PP;
34
35   /// Location of recent included file, used for line number.
36   SourceLocation LastHashLoc;
37
38   /// Counts current number of command line included files, which were entered
39   /// and were not exited yet.
40   int EnteredCommandLineIncludeFiles = 0;
41
42   enum FileScopeStatus {
43     NoScope = 0,              // Scope is not initialized yet.
44     InitializedScope,         // Main file scope is initialized but not set yet.
45     BuiltinScope,             // <built-in> and <command line> file scopes.
46     CommandLineIncludeScope,  // Included file, from <command line> file, scope.
47     MainFileScope             // Main file scope.
48   };
49   FileScopeStatus Status;
50
51   /// Parent contains all entered files that were not exited yet according to
52   /// the inclusion order.
53   llvm::SmallVector<llvm::DIMacroFile *, 4> Scopes;
54
55   /// Get current DIMacroFile scope.
56   /// \return current DIMacroFile scope or nullptr if there is no such scope.
57   llvm::DIMacroFile *getCurrentScope();
58
59   /// Get current line location or invalid location.
60   /// \param Loc current line location.
61   /// \return current line location \p `Loc`, or invalid location if it's in a
62   ///         skipped file scope.
63   SourceLocation getCorrectLocation(SourceLocation Loc);
64
65   /// Use the passed preprocessor to write the macro name and value from the
66   /// given macro info and identifier info into the given \p `Name` and \p
67   /// `Value` output streams.
68   ///
69   /// \param II Identifier info, used to get the Macro name.
70   /// \param MI Macro info, used to get the Macro argumets and values.
71   /// \param PP Preprocessor.
72   /// \param [out] Name Place holder for returned macro name and arguments.
73   /// \param [out] Value Place holder for returned macro value.
74   static void writeMacroDefinition(const IdentifierInfo &II,
75                                    const MacroInfo &MI, Preprocessor &PP,
76                                    raw_ostream &Name, raw_ostream &Value);
77
78   /// Update current file scope status to next file scope.
79   void updateStatusToNextScope();
80
81   /// Handle the case when entering a file.
82   ///
83   /// \param Loc Indicates the new location.
84   void FileEntered(SourceLocation Loc);
85
86   /// Handle the case when exiting a file.
87   ///
88   /// \param Loc Indicates the new location.
89   void FileExited(SourceLocation Loc);
90
91 public:
92   MacroPPCallbacks(CodeGenerator *Gen, Preprocessor &PP);
93
94   /// Callback invoked whenever a source file is entered or exited.
95   ///
96   /// \param Loc Indicates the new location.
97   /// \param PrevFID the file that was exited if \p Reason is ExitFile.
98   void FileChanged(SourceLocation Loc, FileChangeReason Reason,
99                    SrcMgr::CharacteristicKind FileType,
100                    FileID PrevFID = FileID()) override;
101
102   /// Callback invoked whenever a directive (#xxx) is processed.
103   void InclusionDirective(SourceLocation HashLoc, const Token &IncludeTok,
104                           StringRef FileName, bool IsAngled,
105                           CharSourceRange FilenameRange, const FileEntry *File,
106                           StringRef SearchPath, StringRef RelativePath,
107                           const Module *Imported,
108                           SrcMgr::CharacteristicKind FileType) override;
109
110   /// Hook called whenever a macro definition is seen.
111   void MacroDefined(const Token &MacroNameTok,
112                     const MacroDirective *MD) override;
113
114   /// Hook called whenever a macro \#undef is seen.
115   ///
116   /// MD is released immediately following this callback.
117   void MacroUndefined(const Token &MacroNameTok, const MacroDefinition &MD,
118                       const MacroDirective *Undef) override;
119 };
120
121 } // end namespace clang
122
123 #endif