clang: lib/Lex/PPConditionalDirectiveRecord.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

14#include "llvm/Support/Capacity.h"

15

16using namespace clang;

17

22

25 if (Range.isInvalid())

26 return false;

27

28 CondDirectiveLocsTy::const_iterator low = llvm::lower_bound(

30 if (low == CondDirectiveLocs.end())

31 return false;

32

33 if (SourceMgr.isBeforeInTranslationUnit(Range.getEnd(), low->getLoc()))

34 return false;

35

36 CondDirectiveLocsTy::const_iterator

37 upp = std::upper_bound(low, CondDirectiveLocs.end(),

40 if (upp != CondDirectiveLocs.end())

41 uppRegion = upp->getRegionLoc();

42

43 return low->getRegionLoc() != uppRegion;

44}

45

50 if (CondDirectiveLocs.empty())

52

53 if (SourceMgr.isBeforeInTranslationUnit(CondDirectiveLocs.back().getLoc(),

54 Loc))

55 return CondDirectiveStack.back();

56

57 CondDirectiveLocsTy::const_iterator low = llvm::lower_bound(

59 assert(low != CondDirectiveLocs.end());

60 return low->getRegionLoc();

61}

62

63void PPConditionalDirectiveRecord::addCondDirectiveLoc(

64 CondDirectiveLoc DirLoc) {

65

66 if (SourceMgr.isInSystemHeader(DirLoc.getLoc()))

67 return;

68

69 assert(CondDirectiveLocs.empty() ||

70 SourceMgr.isBeforeInTranslationUnit(CondDirectiveLocs.back().getLoc(),

71 DirLoc.getLoc()));

72 CondDirectiveLocs.push_back(DirLoc);

73}

74

75void PPConditionalDirectiveRecord::If(SourceLocation Loc,

77 ConditionValueKind ConditionValue) {

78 addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));

79 CondDirectiveStack.push_back(Loc);

80}

81

82void PPConditionalDirectiveRecord::Ifdef(SourceLocation Loc,

83 const Token &MacroNameTok,

85 addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));

86 CondDirectiveStack.push_back(Loc);

87}

88

89void PPConditionalDirectiveRecord::Ifndef(SourceLocation Loc,

90 const Token &MacroNameTok,

92 addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));

93 CondDirectiveStack.push_back(Loc);

94}

95

96void PPConditionalDirectiveRecord::Elif(SourceLocation Loc,

98 ConditionValueKind ConditionValue,

100 addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));

101 CondDirectiveStack.back() = Loc;

102}

103

104void PPConditionalDirectiveRecord::Elifdef(SourceLocation Loc, const Token &,

106 addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));

107 CondDirectiveStack.back() = Loc;

108}

111 addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));

112 CondDirectiveStack.back() = Loc;

113}

114

115void PPConditionalDirectiveRecord::Elifndef(SourceLocation Loc, const Token &,

117 addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));

118 CondDirectiveStack.back() = Loc;

119}

122 addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));

123 CondDirectiveStack.back() = Loc;

124}

125

126void PPConditionalDirectiveRecord::Else(SourceLocation Loc,

128 addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));

129 CondDirectiveStack.back() = Loc;

130}

131

132void PPConditionalDirectiveRecord::Endif(SourceLocation Loc,

134 addCondDirectiveLoc(CondDirectiveLoc(Loc, CondDirectiveStack.back()));

135 assert(!CondDirectiveStack.empty());

136 CondDirectiveStack.pop_back();

137}

138

140 return llvm::capacity_in_bytes(CondDirectiveLocs);

141}

A description of the current definition of a macro.

size_t getTotalMemory() const

Definition PPConditionalDirectiveRecord.cpp:139

PPConditionalDirectiveRecord(SourceManager &SM)

Construct a new preprocessing record.

Definition PPConditionalDirectiveRecord.cpp:18

bool rangeIntersectsConditionalDirective(SourceRange Range) const

Returns true if the given range intersects with a conditional directive.

Definition PPConditionalDirectiveRecord.cpp:23

SourceLocation findConditionalDirectiveRegionLoc(SourceLocation Loc) const

Definition PPConditionalDirectiveRecord.cpp:46

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.

Token - This structure provides full information about a lexed token.

The JSON file list parser is used to communicate input to InstallAPI.