1
- // ===--- DirectiveMap .cpp - Find and strip preprocessor directives - -------===//
1
+ // ===--- DirectiveTree .cpp - Find and strip preprocessor directives -------===//
2
2
//
3
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
4
// See https://llvm.org/LICENSE.txt for license information.
5
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
6
//
7
7
// ===----------------------------------------------------------------------===//
8
8
9
- #include " clang-pseudo/DirectiveMap .h"
9
+ #include " clang-pseudo/DirectiveTree .h"
10
10
#include " clang/Basic/IdentifierTable.h"
11
11
#include " clang/Basic/TokenKinds.h"
12
12
#include " llvm/Support/FormatVariadic.h"
@@ -19,7 +19,7 @@ class DirectiveParser {
19
19
public:
20
20
explicit DirectiveParser (const TokenStream &Code)
21
21
: Code(Code), Tok(&Code.front()) {}
22
- void parse (DirectiveMap *Result) { parse (Result, /* TopLevel=*/ true ); }
22
+ void parse (DirectiveTree *Result) { parse (Result, /* TopLevel=*/ true ); }
23
23
24
24
private:
25
25
// Roles that a directive might take within a conditional block.
@@ -42,10 +42,10 @@ class DirectiveParser {
42
42
}
43
43
}
44
44
45
- // Parses tokens starting at Tok into Map .
46
- // If we reach an End or Else directive that ends Map , returns it.
45
+ // Parses tokens starting at Tok into Tree .
46
+ // If we reach an End or Else directive that ends Tree , returns it.
47
47
// If TopLevel is true, then we do not expect End and always return None.
48
- llvm::Optional<DirectiveMap ::Directive> parse (DirectiveMap *Map ,
48
+ llvm::Optional<DirectiveTree ::Directive> parse (DirectiveTree *Tree ,
49
49
bool TopLevel) {
50
50
auto StartsDirective =
51
51
[&, AllowDirectiveAt ((const Token *)nullptr )]() mutable {
@@ -66,37 +66,37 @@ class DirectiveParser {
66
66
do
67
67
++Tok;
68
68
while (Tok->Kind != tok::eof && !StartsDirective ());
69
- Map ->Chunks .push_back (DirectiveMap ::Code{
69
+ Tree ->Chunks .push_back (DirectiveTree ::Code{
70
70
Token::Range{Code.index (*Start), Code.index (*Tok)}});
71
71
continue ;
72
72
}
73
73
74
74
// We have some kind of directive.
75
- DirectiveMap ::Directive Directive;
75
+ DirectiveTree ::Directive Directive;
76
76
parseDirective (&Directive);
77
77
Cond Kind = classifyDirective (Directive.Kind );
78
78
if (Kind == Cond::If) {
79
79
// #if or similar, starting a nested conditional block.
80
- DirectiveMap ::Conditional Conditional;
80
+ DirectiveTree ::Conditional Conditional;
81
81
Conditional.Branches .emplace_back ();
82
82
Conditional.Branches .back ().first = std::move (Directive);
83
83
parseConditional (&Conditional);
84
- Map ->Chunks .push_back (std::move (Conditional));
84
+ Tree ->Chunks .push_back (std::move (Conditional));
85
85
} else if ((Kind == Cond::Else || Kind == Cond::End) && !TopLevel) {
86
86
// #endif or similar, ending this PStructure scope.
87
87
// (#endif is unexpected at the top level, treat as simple directive).
88
88
return std::move (Directive);
89
89
} else {
90
90
// #define or similar, a simple directive at the current scope.
91
- Map ->Chunks .push_back (std::move (Directive));
91
+ Tree ->Chunks .push_back (std::move (Directive));
92
92
}
93
93
}
94
94
return None;
95
95
}
96
96
97
97
// Parse the rest of a conditional section, after seeing the If directive.
98
98
// Returns after consuming the End directive.
99
- void parseConditional (DirectiveMap ::Conditional *C) {
99
+ void parseConditional (DirectiveTree ::Conditional *C) {
100
100
assert (C->Branches .size () == 1 &&
101
101
C->Branches .front ().second .Chunks .empty () &&
102
102
" Should be ready to parse first branch body" );
@@ -119,7 +119,7 @@ class DirectiveParser {
119
119
}
120
120
121
121
// Parse a directive. Tok is the hash.
122
- void parseDirective (DirectiveMap ::Directive *D) {
122
+ void parseDirective (DirectiveTree ::Directive *D) {
123
123
assert (Tok->Kind == tok::hash);
124
124
125
125
// Directive spans from the hash until the end of line or file.
@@ -143,26 +143,26 @@ class DirectiveParser {
143
143
144
144
} // namespace
145
145
146
- DirectiveMap DirectiveMap ::parse (const TokenStream &Code) {
147
- DirectiveMap Result;
146
+ DirectiveTree DirectiveTree ::parse (const TokenStream &Code) {
147
+ DirectiveTree Result;
148
148
DirectiveParser (Code).parse (&Result);
149
149
return Result;
150
150
}
151
151
152
- static void dump (llvm::raw_ostream &OS, const DirectiveMap &, unsigned Indent);
152
+ static void dump (llvm::raw_ostream &OS, const DirectiveTree &, unsigned Indent);
153
153
static void dump (llvm::raw_ostream &OS,
154
- const DirectiveMap ::Directive &Directive, unsigned Indent,
154
+ const DirectiveTree ::Directive &Directive, unsigned Indent,
155
155
bool Taken = false ) {
156
156
OS.indent (Indent) << llvm::formatv (
157
157
" #{0} ({1} tokens){2}\n " , tok::getPPKeywordSpelling (Directive.Kind ),
158
158
Directive.Tokens .size (), Taken ? " TAKEN" : " " );
159
159
}
160
- static void dump (llvm::raw_ostream &OS, const DirectiveMap ::Code &Code,
160
+ static void dump (llvm::raw_ostream &OS, const DirectiveTree ::Code &Code,
161
161
unsigned Indent) {
162
162
OS.indent (Indent) << llvm::formatv (" code ({0} tokens)\n " , Code.Tokens .size ());
163
163
}
164
164
static void dump (llvm::raw_ostream &OS,
165
- const DirectiveMap ::Conditional &Conditional,
165
+ const DirectiveTree ::Conditional &Conditional,
166
166
unsigned Indent) {
167
167
for (unsigned I = 0 ; I < Conditional.Branches .size (); ++I) {
168
168
const auto &Branch = Conditional.Branches [I];
@@ -172,23 +172,23 @@ static void dump(llvm::raw_ostream &OS,
172
172
dump (OS, Conditional.End , Indent);
173
173
}
174
174
175
- static void dump (llvm::raw_ostream &OS, const DirectiveMap ::Chunk &Chunk,
175
+ static void dump (llvm::raw_ostream &OS, const DirectiveTree ::Chunk &Chunk,
176
176
unsigned Indent) {
177
177
switch (Chunk.kind ()) {
178
- case DirectiveMap ::Chunk::K_Empty:
178
+ case DirectiveTree ::Chunk::K_Empty:
179
179
llvm_unreachable (" invalid chunk" );
180
- case DirectiveMap ::Chunk::K_Code:
181
- return dump (OS, (const DirectiveMap ::Code &)Chunk, Indent);
182
- case DirectiveMap ::Chunk::K_Directive:
183
- return dump (OS, (const DirectiveMap ::Directive &)Chunk, Indent);
184
- case DirectiveMap ::Chunk::K_Conditional:
185
- return dump (OS, (const DirectiveMap ::Conditional &)Chunk, Indent);
180
+ case DirectiveTree ::Chunk::K_Code:
181
+ return dump (OS, (const DirectiveTree ::Code &)Chunk, Indent);
182
+ case DirectiveTree ::Chunk::K_Directive:
183
+ return dump (OS, (const DirectiveTree ::Directive &)Chunk, Indent);
184
+ case DirectiveTree ::Chunk::K_Conditional:
185
+ return dump (OS, (const DirectiveTree ::Conditional &)Chunk, Indent);
186
186
}
187
187
}
188
188
189
- static void dump (llvm::raw_ostream &OS, const DirectiveMap &Map ,
189
+ static void dump (llvm::raw_ostream &OS, const DirectiveTree &Tree ,
190
190
unsigned Indent) {
191
- for (const auto &Chunk : Map .Chunks )
191
+ for (const auto &Chunk : Tree .Chunks )
192
192
dump (OS, Chunk, Indent);
193
193
}
194
194
@@ -198,11 +198,11 @@ static void dump(llvm::raw_ostream &OS, const DirectiveMap &Map,
198
198
dump (OS, T, 0 ); \
199
199
return OS; \
200
200
}
201
- OSTREAM_DUMP (DirectiveMap )
202
- OSTREAM_DUMP (DirectiveMap ::Chunk)
203
- OSTREAM_DUMP (DirectiveMap ::Directive)
204
- OSTREAM_DUMP (DirectiveMap ::Conditional)
205
- OSTREAM_DUMP (DirectiveMap ::Code)
201
+ OSTREAM_DUMP (DirectiveTree )
202
+ OSTREAM_DUMP (DirectiveTree ::Chunk)
203
+ OSTREAM_DUMP (DirectiveTree ::Directive)
204
+ OSTREAM_DUMP (DirectiveTree ::Conditional)
205
+ OSTREAM_DUMP (DirectiveTree ::Code)
206
206
#undef OSTREAM_DUMP
207
207
208
208
namespace {
@@ -223,7 +223,7 @@ class BranchChooser {
223
223
public:
224
224
BranchChooser (const TokenStream &Code) : Code(Code) {}
225
225
226
- void choose (DirectiveMap &M) { walk (M); }
226
+ void choose (DirectiveTree &M) { walk (M); }
227
227
228
228
private:
229
229
// Describes code seen by making particular branch choices. Higher is better.
@@ -246,43 +246,43 @@ class BranchChooser {
246
246
}
247
247
};
248
248
249
- Score walk (DirectiveMap ::Code &C) {
249
+ Score walk (DirectiveTree ::Code &C) {
250
250
Score S;
251
251
for (const Token &T : Code.tokens (C.Tokens ))
252
252
if (T.Kind != tok::comment)
253
253
++S.Tokens ;
254
254
return S;
255
255
}
256
256
257
- Score walk (DirectiveMap ::Directive &D) {
257
+ Score walk (DirectiveTree ::Directive &D) {
258
258
Score S;
259
259
S.Directives = 1 ;
260
260
S.Errors = D.Kind == tok::pp_error;
261
261
return S;
262
262
}
263
263
264
- Score walk (DirectiveMap ::Chunk &C) {
264
+ Score walk (DirectiveTree ::Chunk &C) {
265
265
switch (C.kind ()) {
266
- case DirectiveMap ::Chunk::K_Code:
267
- return walk ((DirectiveMap ::Code &)C);
268
- case DirectiveMap ::Chunk::K_Directive:
269
- return walk ((DirectiveMap ::Directive &)C);
270
- case DirectiveMap ::Chunk::K_Conditional:
271
- return walk ((DirectiveMap ::Conditional &)C);
272
- case DirectiveMap ::Chunk::K_Empty:
266
+ case DirectiveTree ::Chunk::K_Code:
267
+ return walk ((DirectiveTree ::Code &)C);
268
+ case DirectiveTree ::Chunk::K_Directive:
269
+ return walk ((DirectiveTree ::Directive &)C);
270
+ case DirectiveTree ::Chunk::K_Conditional:
271
+ return walk ((DirectiveTree ::Conditional &)C);
272
+ case DirectiveTree ::Chunk::K_Empty:
273
273
break ;
274
274
}
275
275
llvm_unreachable (" bad chunk kind" );
276
276
}
277
277
278
- Score walk (DirectiveMap &M) {
278
+ Score walk (DirectiveTree &M) {
279
279
Score S;
280
- for (DirectiveMap ::Chunk &C : M.Chunks )
280
+ for (DirectiveTree ::Chunk &C : M.Chunks )
281
281
S += walk (C);
282
282
return S;
283
283
}
284
284
285
- Score walk (DirectiveMap ::Conditional &C) {
285
+ Score walk (DirectiveTree ::Conditional &C) {
286
286
Score Best;
287
287
bool MayTakeTrivial = true ;
288
288
bool TookTrivial = false ;
@@ -314,7 +314,7 @@ class BranchChooser {
314
314
315
315
// Return true if the directive starts an always-taken conditional branch,
316
316
// false if the branch is never taken, and None otherwise.
317
- llvm::Optional<bool > isTakenWhenReached (const DirectiveMap ::Directive &Dir) {
317
+ llvm::Optional<bool > isTakenWhenReached (const DirectiveTree ::Directive &Dir) {
318
318
switch (Dir.Kind ) {
319
319
case clang::tok::pp_if:
320
320
case clang::tok::pp_elif:
@@ -343,8 +343,8 @@ class BranchChooser {
343
343
344
344
} // namespace
345
345
346
- void chooseConditionalBranches (DirectiveMap &Map , const TokenStream &Code) {
347
- BranchChooser{Code}.choose (Map );
346
+ void chooseConditionalBranches (DirectiveTree &Tree , const TokenStream &Code) {
347
+ BranchChooser{Code}.choose (Tree );
348
348
}
349
349
350
350
} // namespace pseudo
0 commit comments