clang: include/clang/Lex/PreprocessingRecord.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef LLVM_CLANG_LEX_PREPROCESSINGRECORD_H
15#define LLVM_CLANG_LEX_PREPROCESSINGRECORD_H
16
21#include "llvm/ADT/DenseMap.h"
22#include "llvm/ADT/PointerUnion.h"
23#include "llvm/ADT/StringRef.h"
24#include "llvm/ADT/iterator.h"
25#include "llvm/ADT/iterator_range.h"
26#include "llvm/Support/Allocator.h"
27#include "llvm/Support/Compiler.h"
28#include
29#include
30#include
31#include
32#include
33#include
34
36
37class PreprocessingRecord;
38
39}
40
41
43 unsigned alignment = 8) noexcept;
44
45
48
50
51class IdentifierInfo;
52class MacroInfo;
53class SourceManager;
54class Token;
55
56
57
59 public:
60
62
64
65
67
68
69
70
71
73
74
75
77
78
79
83
84 private:
85
87
88
90
91 protected:
93
96
97 public:
98
100
101
102
104
105
106
108
109
110
112 unsigned alignment = 8) noexcept {
113 return ::operator new(bytes, PR, alignment);
114 }
115
116 void *operator new(size_t bytes, void *mem) noexcept { return mem; }
117
119 unsigned alignment) noexcept {
120 return ::operator delete(ptr, PR, alignment);
121 }
122
123 void operator delete(void *, std::size_t) noexcept {}
124 void operator delete(void *, void *) noexcept {}
125
126 private:
127
128 void *operator new(size_t bytes) noexcept;
129 void operator delete(void *data) noexcept;
130 };
131
132
134 public:
137
138
142 }
143 };
144
145
147
149
150 public:
154
155
157
158
160
161
164 }
165 };
166
167
169
170
171 llvm::PointerUnion<IdentifierInfo *, MacroDefinitionRecord *> NameOrDef;
172
173 public:
176 NameOrDef(BuiltinName) {}
177
180 }
181
182
183 bool isBuiltinMacro() const { return isa<IdentifierInfo *>(NameOrDef); }
184
185
189 return cast<IdentifierInfo *>(NameOrDef);
190 }
191
192
193
196 }
197
198
201 }
202 };
203
204
205
207 public:
208
209
211
213
214
216
217
219
220
223
224 private:
225
226
227 StringRef FileName;
228
229
230
231 LLVM_PREFERRED_TYPE(bool)
232 unsigned InQuotes : 1;
233
234
235
236
238 unsigned Kind : 2;
239
240
241
242 LLVM_PREFERRED_TYPE(bool)
243 unsigned ImportedModule : 1;
244
245
247
248 public:
250 StringRef FileName, bool InQuotes, bool ImportedModule,
252
253
255
256
258
259
260
262
263
264
266
267
268
270
271
274 }
275 };
276
277
278
280 public:
282
283
284
285
286
288
289
290
291 virtual std::pair<unsigned, unsigned>
293
294
295
298 return std::nullopt;
299 }
300
301
303 };
304
305
306
307
310
311
312 llvm::BumpPtrAllocator BumpAlloc;
313
314
315
316 std::vector<PreprocessedEntity *> PreprocessedEntities;
317
318
319
320
321
322
323 std::vector<PreprocessedEntity *> LoadedPreprocessedEntities;
324
325
326 std::vector SkippedRanges;
327
328 bool SkippedRangesAllLoaded = true;
329
330
331
332
333
334
335
336
337
338
339 class PPEntityID {
341
342 int ID = 0;
343
344 explicit PPEntityID(int ID) : ID(ID) {}
345
346 public:
347 PPEntityID() = default;
348 };
349
350 static PPEntityID getPPEntityID(unsigned Index, bool isLoaded) {
351 return isLoaded ? PPEntityID(-int(Index)-1) : PPEntityID(Index+1);
352 }
353
354
355 llvm::DenseMap<const MacroInfo *, MacroDefinitionRecord *> MacroDefinitions;
356
357
359
360
362
363
365
366
367
368 unsigned getNumLoadedPreprocessedEntities() const {
369 return LoadedPreprocessedEntities.size();
370 }
371
372
373
374 std::pair<unsigned, unsigned>
375 findLocalPreprocessedEntitiesInRange(SourceRange Range) const;
376 unsigned findBeginLocalPreprocessedEntity(SourceLocation Loc) const;
377 unsigned findEndLocalPreprocessedEntity(SourceLocation Loc) const;
378
379
380
381
382
383 unsigned allocateLoadedEntities(unsigned NumEntities);
384
385
386
387
388
389
390 unsigned allocateSkippedRanges(unsigned NumRanges);
391
392
393 void ensureSkippedRangesLoaded();
394
395
397
398 public:
399
401
402
403 void *Allocate(unsigned Size, unsigned Align = 8) {
404 return BumpAlloc.Allocate(Size, Align);
405 }
406
407
409
411
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430 class iterator : public llvm::iterator_adaptor_base<
431 iterator, int, std::random_access_iterator_tag,
432 PreprocessedEntity *, int, PreprocessedEntity *,
433 PreprocessedEntity *> {
435
437
439 : iterator::iterator_adaptor_base(Position), Self(Self) {}
440
441 public:
443
445 bool isLoaded = this->I < 0;
446 unsigned Index = isLoaded ?
447 Self->LoadedPreprocessedEntities.size() + this->I : this->I;
448 PPEntityID ID = Self->getPPEntityID(Index, isLoaded);
449 return Self->getPreprocessedEntity(ID);
450 }
452 };
453
454
456 return iterator(this, -(int)LoadedPreprocessedEntities.size());
457 }
458
459
461 return iterator(this, PreprocessedEntities.size());
462 }
463
464
467 }
468
469
471 return iterator(this, PreprocessedEntities.size());
472 }
473
474
475
477 unsigned count) {
478 unsigned end = start + count;
479 assert(end <= LoadedPreprocessedEntities.size());
480 return llvm::make_range(
481 iterator(this, int(start) - LoadedPreprocessedEntities.size()),
482 iterator(this, int(end) - LoadedPreprocessedEntities.size()));
483 }
484
485
486
487
488
489 llvm::iterator_range
491
492
493
494
495
496
497
498
500
501
503
504
506
507
510 }
511
512
513
515
516
518 ensureSkippedRangesLoaded();
519 return SkippedRanges;
520 }
521
522 private:
525
532 StringRef FileName, bool IsAngled,
535 StringRef RelativePath,
536 const Module *SuggestedModule, bool ModuleImported,
542
549
550
553
556
559
560
561
562 struct {
565 } CachedRangeQuery;
566
567 std::pair<int, int> getPreprocessedEntitiesInRangeSlow(SourceRange R);
568 };
569
570}
571
573 unsigned alignment) noexcept {
574 return PR.Allocate(bytes, alignment);
575}
576
579 PR.Deallocate(ptr);
580}
581
582#endif
static StringRef bytes(const std::vector< T, Allocator > &v)
enum clang::sema::@1725::IndirectLocalPathEntry::EntryKind Kind
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
llvm::MachO::FileType FileType
Defines the PPCallbacks interface.
Defines the clang::SourceLocation class and associated facilities.
Reads an AST files chain containing the contents of a translation unit.
Writes an AST file containing the contents of a translation unit.
Represents a character-granular source range.
An abstract class that should be subclassed by any external source of preprocessing record entries.
virtual SourceRange ReadSkippedRange(unsigned Index)=0
Read a preallocated skipped range from the external source.
virtual ~ExternalPreprocessingRecordSource()
virtual std::optional< bool > isPreprocessedEntityInFileID(unsigned Index, FileID FID)
Optionally returns true or false if the preallocated preprocessed entity with index Index came from f...
virtual PreprocessedEntity * ReadPreprocessedEntity(unsigned Index)=0
Read a preallocated preprocessed entity from the external source.
virtual std::pair< unsigned, unsigned > findPreprocessedEntitiesInRange(SourceRange Range)=0
Returns a pair of [Begin, End) indices of preallocated preprocessed entities that Range encompasses.
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
Record the location of an inclusion directive, such as an #include or #import statement.
StringRef getFileName() const
Retrieve the included file name as it was written in the source.
InclusionKind getKind() const
Determine what kind of inclusion directive this is.
bool wasInQuotes() const
Determine whether the included file name was written in quotes; otherwise, it was written in angle br...
bool importedModule() const
Determine whether the inclusion directive was automatically turned into a module import.
InclusionKind
The kind of inclusion directives known to the preprocessor.
@ IncludeMacros
A Clang #__include_macros directive.
@ Import
An Objective-C #import directive.
@ IncludeNext
A GNU #include_next directive.
@ Include
An #include directive.
static bool classof(const PreprocessedEntity *PE)
OptionalFileEntryRef getFile() const
Retrieve the file entry for the actual file that was included by this directive.
MacroArgs - An instance of this class captures information about the formal arguments specified to a ...
Record the location of a macro definition.
static bool classof(const PreprocessedEntity *PE)
SourceLocation getLocation() const
Retrieve the location of the macro name in the definition.
MacroDefinitionRecord(const IdentifierInfo *Name, SourceRange Range)
const IdentifierInfo * getName() const
Retrieve the name of the macro being defined.
A description of the current definition of a macro.
Encapsulates changes to the "macros namespace" (the location where the macro name became active,...
Records the location of a macro expansion.
MacroDefinitionRecord * getDefinition() const
The definition of the macro being expanded.
bool isBuiltinMacro() const
True if it is a builtin macro.
const IdentifierInfo * getName() const
The name of the macro being expanded.
static bool classof(const PreprocessedEntity *PE)
MacroExpansion(MacroDefinitionRecord *Definition, SourceRange Range)
MacroExpansion(IdentifierInfo *BuiltinName, SourceRange Range)
Encapsulates the data about a macro definition (e.g.
Describes a module or submodule.
This interface provides a way to observe the actions of the preprocessor as it does its thing.
virtual void Elifndef(SourceLocation Loc, const Token &MacroNameTok, const MacroDefinition &MD)
Hook called whenever an #elifndef branch is taken.
virtual void Elifdef(SourceLocation Loc, const Token &MacroNameTok, const MacroDefinition &MD)
Hook called whenever an #elifdef branch is taken.
Base class that describes a preprocessed entity, which may be a preprocessor directive or macro expan...
EntityKind
The kind of preprocessed entity an object describes.
@ InvalidKind
Indicates a problem trying to load the preprocessed entity.
@ MacroExpansionKind
A macro expansion.
@ LastPreprocessingDirective
bool isInvalid() const
Returns true if there was a problem loading the preprocessed entity.
PreprocessedEntity(EntityKind Kind, SourceRange Range)
EntityKind getKind() const
Retrieve the kind of preprocessed entity stored in this object.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range that covers this entire preprocessed entity.
Records the presence of a preprocessor directive.
PreprocessingDirective(EntityKind Kind, SourceRange Range)
static bool classof(const PreprocessedEntity *PD)
Iteration over the preprocessed entities.
PreprocessedEntity * operator->() const
PreprocessedEntity * operator*() const
A record of the steps taken while preprocessing a source file, including the various preprocessing di...
SourceManager & getSourceManager() const
void Deallocate(void *Ptr)
Deallocate memory in the preprocessing record.
void * Allocate(unsigned Size, unsigned Align=8)
Allocate memory in the preprocessing record.
llvm::iterator_range< iterator > getPreprocessedEntitiesInRange(SourceRange R)
Returns a range of preprocessed entities that source range R encompasses.
iterator end()
End iterator for all preprocessed entities.
ExternalPreprocessingRecordSource * getExternalSource() const
Retrieve the external source for preprocessed entities.
MacroDefinitionRecord * findMacroDefinition(const MacroInfo *MI)
Retrieve the macro definition that corresponds to the given MacroInfo.
PPEntityID addPreprocessedEntity(PreprocessedEntity *Entity)
Add a new preprocessed entity to this record.
llvm::iterator_range< iterator > getIteratorsForLoadedRange(unsigned start, unsigned count)
iterator range for the given range of loaded preprocessed entities.
const std::vector< SourceRange > & getSkippedRanges()
Retrieve all ranges that got skipped while preprocessing.
bool isEntityInFileID(iterator PPEI, FileID FID)
Returns true if the preprocessed entity that PPEI iterator points to is coming from the file FID.
size_t getTotalMemory() const
iterator begin()
Begin iterator for all preprocessed entities.
iterator local_begin()
Begin iterator for local, non-loaded, preprocessed entities.
std::pair< int, int > Result
iterator local_end()
End iterator for local, non-loaded, preprocessed entities.
void SetExternalSource(ExternalPreprocessingRecordSource &Source)
Set the external source for preprocessed entities.
Encodes a location in the source.
This class handles loading and caching of source files into memory.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
Token - This structure provides full information about a lexed token.
@ MacroDefinitionKind
A macro definition.
@ FirstPreprocessingDirective
@ InclusionDirectiveKind
An inclusion directive, such as #include, #import, or #include_next.
CharacteristicKind
Indicates whether a file or directory holds normal user code, system code, or system code which is im...
The JSON file list parser is used to communicate input to InstallAPI.