Path: blob/main/contrib/llvm-project/clang/lib/Lex/PPConditionalDirectiveRecord.cpp
35233 views
//===--- PPConditionalDirectiveRecord.h - Preprocessing Directives-*- C++ -*-=//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file implements the PPConditionalDirectiveRecord class, which maintains9// a record of conditional directive regions.10//11//===----------------------------------------------------------------------===//12#include "clang/Lex/PPConditionalDirectiveRecord.h"13#include "llvm/Support/Capacity.h"1415using namespace clang;1617PPConditionalDirectiveRecord::PPConditionalDirectiveRecord(SourceManager &SM)18: SourceMgr(SM) {19CondDirectiveStack.push_back(SourceLocation());20}2122bool PPConditionalDirectiveRecord::rangeIntersectsConditionalDirective(23SourceRange Range) const {24if (Range.isInvalid())25return false;2627CondDirectiveLocsTy::const_iterator low = llvm::lower_bound(28CondDirectiveLocs, Range.getBegin(), CondDirectiveLoc::Comp(SourceMgr));29if (low == CondDirectiveLocs.end())30return false;3132if (SourceMgr.isBeforeInTranslationUnit(Range.getEnd(), low->getLoc()))33return false;3435CondDirectiveLocsTy::const_iterator36upp = std::upper_bound(low, CondDirectiveLocs.end(),37Range.getEnd(), CondDirectiveLoc::Comp(SourceMgr));38SourceLocation uppRegion;39if (upp != CondDirectiveLocs.end())40uppRegion = upp->getRegionLoc();4142return low->getRegionLoc() != uppRegion;43}4445SourceLocation PPConditionalDirectiveRecord::findConditionalDirectiveRegionLoc(46SourceLocation Loc) const {47if (Loc.isInvalid())48return SourceLocation();49if (CondDirectiveLocs.empty())50return SourceLocation();5152if (SourceMgr.isBeforeInTranslationUnit(CondDirectiveLocs.back().getLoc(),53Loc))54return CondDirectiveStack.back();5556CondDirectiveLocsTy::const_iterator low = llvm::lower_bound(57CondDirectiveLocs, Loc, CondDirectiveLoc::Comp(SourceMgr));58assert(low != CondDirectiveLocs.end());59return low->getRegionLoc();60}6162void PPConditionalDirectiveRecord::addCondDirectiveLoc(63CondDirectiveLoc DirLoc) {64// Ignore directives in system headers.65if (SourceMgr.isInSystemHeader(DirLoc.getLoc()))66return;6768assert(CondDirectiveLocs.empty() ||69SourceMgr.isBeforeInTranslationUnit(CondDirectiveLocs.back().getLoc(),70DirLoc.getLoc()));71CondDirectiveLocs.push_back(DirLoc);72}7374void PPConditionalDirectiveRecord::If(SourceLocation Loc,75SourceRange ConditionRange,76ConditionValueKind ConditionValue) {77addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));78CondDirectiveStack.push_back(Loc);79}8081void PPConditionalDirectiveRecord::Ifdef(SourceLocation Loc,82const Token &MacroNameTok,83const MacroDefinition &MD) {84addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));85CondDirectiveStack.push_back(Loc);86}8788void PPConditionalDirectiveRecord::Ifndef(SourceLocation Loc,89const Token &MacroNameTok,90const MacroDefinition &MD) {91addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));92CondDirectiveStack.push_back(Loc);93}9495void PPConditionalDirectiveRecord::Elif(SourceLocation Loc,96SourceRange ConditionRange,97ConditionValueKind ConditionValue,98SourceLocation IfLoc) {99addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));100CondDirectiveStack.back() = Loc;101}102103void PPConditionalDirectiveRecord::Elifdef(SourceLocation Loc, const Token &,104const MacroDefinition &) {105addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));106CondDirectiveStack.back() = Loc;107}108void PPConditionalDirectiveRecord::Elifdef(SourceLocation Loc, SourceRange,109SourceLocation) {110addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));111CondDirectiveStack.back() = Loc;112}113114void PPConditionalDirectiveRecord::Elifndef(SourceLocation Loc, const Token &,115const MacroDefinition &) {116addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));117CondDirectiveStack.back() = Loc;118}119void PPConditionalDirectiveRecord::Elifndef(SourceLocation Loc, SourceRange,120SourceLocation) {121addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));122CondDirectiveStack.back() = Loc;123}124125void PPConditionalDirectiveRecord::Else(SourceLocation Loc,126SourceLocation IfLoc) {127addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));128CondDirectiveStack.back() = Loc;129}130131void PPConditionalDirectiveRecord::Endif(SourceLocation Loc,132SourceLocation IfLoc) {133addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));134assert(!CondDirectiveStack.empty());135CondDirectiveStack.pop_back();136}137138size_t PPConditionalDirectiveRecord::getTotalMemory() const {139return llvm::capacity_in_bytes(CondDirectiveLocs);140}141142143