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.