Bug Summary

File:src/gnu/usr.bin/clang/libclangLex/../../../llvm/llvm/include/llvm/Support/Alignment.h
Warning:line 85, column 47
The result of the left shift is undefined due to shifting by '255', which is greater or equal to the width of type 'uint64_t'

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.0 -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name PPDirectives.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model static -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/gnu/usr.bin/clang/libclangLex/obj -resource-dir /usr/local/lib/clang/13.0.0 -I /usr/src/gnu/usr.bin/clang/libclangLex/../../../llvm/clang/include -I /usr/src/gnu/usr.bin/clang/libclangLex/../../../llvm/llvm/include -I /usr/src/gnu/usr.bin/clang/libclangLex/../include -I /usr/src/gnu/usr.bin/clang/libclangLex/obj -I /usr/src/gnu/usr.bin/clang/libclangLex/obj/../include -D NDEBUG -D __STDC_LIMIT_MACROS -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D LLVM_PREFIX="/usr" -internal-isystem /usr/include/c++/v1 -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-comment -std=c++14 -fdeprecated-macro -fdebug-compilation-dir=/usr/src/gnu/usr.bin/clang/libclangLex/obj -ferror-limit 19 -fvisibility-inlines-hidden -fwrapv -stack-protector 2 -fno-rtti -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/vmm/scan-build/2022-01-12-194120-40624-1 -x c++ /usr/src/gnu/usr.bin/clang/libclangLex/../../../llvm/clang/lib/Lex/PPDirectives.cpp

/usr/src/gnu/usr.bin/clang/libclangLex/../../../llvm/clang/lib/Lex/PPDirectives.cpp

1//===--- PPDirectives.cpp - Directive Handling for Preprocessor -----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// Implements # directive processing for the Preprocessor.
11///
12//===----------------------------------------------------------------------===//
13
14#include "clang/Basic/CharInfo.h"
15#include "clang/Basic/FileManager.h"
16#include "clang/Basic/IdentifierTable.h"
17#include "clang/Basic/LangOptions.h"
18#include "clang/Basic/Module.h"
19#include "clang/Basic/SourceLocation.h"
20#include "clang/Basic/SourceManager.h"
21#include "clang/Basic/TokenKinds.h"
22#include "clang/Lex/CodeCompletionHandler.h"
23#include "clang/Lex/HeaderSearch.h"
24#include "clang/Lex/LexDiagnostic.h"
25#include "clang/Lex/LiteralSupport.h"
26#include "clang/Lex/MacroInfo.h"
27#include "clang/Lex/ModuleLoader.h"
28#include "clang/Lex/ModuleMap.h"
29#include "clang/Lex/PPCallbacks.h"
30#include "clang/Lex/Pragma.h"
31#include "clang/Lex/Preprocessor.h"
32#include "clang/Lex/PreprocessorOptions.h"
33#include "clang/Lex/Token.h"
34#include "clang/Lex/VariadicMacroSupport.h"
35#include "llvm/ADT/ArrayRef.h"
36#include "llvm/ADT/ScopeExit.h"
37#include "llvm/ADT/SmallString.h"
38#include "llvm/ADT/SmallVector.h"
39#include "llvm/ADT/STLExtras.h"
40#include "llvm/ADT/StringSwitch.h"
41#include "llvm/ADT/StringRef.h"
42#include "llvm/Support/AlignOf.h"
43#include "llvm/Support/ErrorHandling.h"
44#include "llvm/Support/Path.h"
45#include <algorithm>
46#include <cassert>
47#include <cstring>
48#include <new>
49#include <string>
50#include <utility>
51
52using namespace clang;
53
54//===----------------------------------------------------------------------===//
55// Utility Methods for Preprocessor Directive Handling.
56//===----------------------------------------------------------------------===//
57
58MacroInfo *Preprocessor::AllocateMacroInfo(SourceLocation L) {
59 auto *MIChain = new (BP) MacroInfoChain{L, MIChainHead};
17
Calling 'operator new<llvm::MallocAllocator, 4096UL, 4096UL, 128UL>'
60 MIChainHead = MIChain;
61 return &MIChain->MI;
62}
63
64DefMacroDirective *Preprocessor::AllocateDefMacroDirective(MacroInfo *MI,
65 SourceLocation Loc) {
66 return new (BP) DefMacroDirective(MI, Loc);
67}
68
69UndefMacroDirective *
70Preprocessor::AllocateUndefMacroDirective(SourceLocation UndefLoc) {
71 return new (BP) UndefMacroDirective(UndefLoc);
72}
73
74VisibilityMacroDirective *
75Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,
76 bool isPublic) {
77 return new (BP) VisibilityMacroDirective(Loc, isPublic);
78}
79
80/// Read and discard all tokens remaining on the current line until
81/// the tok::eod token is found.
82SourceRange Preprocessor::DiscardUntilEndOfDirective() {
83 Token Tmp;
84 SourceRange Res;
85
86 LexUnexpandedToken(Tmp);
87 Res.setBegin(Tmp.getLocation());
88 while (Tmp.isNot(tok::eod)) {
89 assert(Tmp.isNot(tok::eof) && "EOF seen while discarding directive tokens")((void)0);
90 LexUnexpandedToken(Tmp);
91 }
92 Res.setEnd(Tmp.getLocation());
93 return Res;
94}
95
96/// Enumerates possible cases of #define/#undef a reserved identifier.
97enum MacroDiag {
98 MD_NoWarn, //> Not a reserved identifier
99 MD_KeywordDef, //> Macro hides keyword, enabled by default
100 MD_ReservedMacro //> #define of #undef reserved id, disabled by default
101};
102
103/// Enumerates possible %select values for the pp_err_elif_after_else and
104/// pp_err_elif_without_if diagnostics.
105enum PPElifDiag {
106 PED_Elif,
107 PED_Elifdef,
108 PED_Elifndef
109};
110
111// The -fmodule-name option tells the compiler to textually include headers in
112// the specified module, meaning clang won't build the specified module. This is
113// useful in a number of situations, for instance, when building a library that
114// vends a module map, one might want to avoid hitting intermediate build
115// products containing the the module map or avoid finding the system installed
116// modulemap for that library.
117static bool isForModuleBuilding(Module *M, StringRef CurrentModule,
118 StringRef ModuleName) {
119 StringRef TopLevelName = M->getTopLevelModuleName();
120
121 // When building framework Foo, we wanna make sure that Foo *and* Foo_Private
122 // are textually included and no modules are built for both.
123 if (M->getTopLevelModule()->IsFramework && CurrentModule == ModuleName &&
124 !CurrentModule.endswith("_Private") && TopLevelName.endswith("_Private"))
125 TopLevelName = TopLevelName.drop_back(8);
126
127 return TopLevelName == CurrentModule;
128}
129
130static MacroDiag shouldWarnOnMacroDef(Preprocessor &PP, IdentifierInfo *II) {
131 const LangOptions &Lang = PP.getLangOpts();
132 if (II->isReserved(Lang) != ReservedIdentifierStatus::NotReserved) {
133 // list from:
134 // - https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_macros.html
135 // - https://docs.microsoft.com/en-us/cpp/c-runtime-library/security-features-in-the-crt?view=msvc-160
136 // - man 7 feature_test_macros
137 // The list must be sorted for correct binary search.
138 static constexpr StringRef ReservedMacro[] = {
139 "_ATFILE_SOURCE",
140 "_BSD_SOURCE",
141 "_CRT_NONSTDC_NO_WARNINGS",
142 "_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES",
143 "_CRT_SECURE_NO_WARNINGS",
144 "_FILE_OFFSET_BITS",
145 "_FORTIFY_SOURCE",
146 "_GLIBCXX_ASSERTIONS",
147 "_GLIBCXX_CONCEPT_CHECKS",
148 "_GLIBCXX_DEBUG",
149 "_GLIBCXX_DEBUG_PEDANTIC",
150 "_GLIBCXX_PARALLEL",
151 "_GLIBCXX_PARALLEL_ASSERTIONS",
152 "_GLIBCXX_SANITIZE_VECTOR",
153 "_GLIBCXX_USE_CXX11_ABI",
154 "_GLIBCXX_USE_DEPRECATED",
155 "_GNU_SOURCE",
156 "_ISOC11_SOURCE",
157 "_ISOC95_SOURCE",
158 "_ISOC99_SOURCE",
159 "_LARGEFILE64_SOURCE",
160 "_POSIX_C_SOURCE",
161 "_REENTRANT",
162 "_SVID_SOURCE",
163 "_THREAD_SAFE",
164 "_XOPEN_SOURCE",
165 "_XOPEN_SOURCE_EXTENDED",
166 "__STDCPP_WANT_MATH_SPEC_FUNCS__",
167 "__STDC_FORMAT_MACROS",
168 };
169 if (std::binary_search(std::begin(ReservedMacro), std::end(ReservedMacro),
170 II->getName()))
171 return MD_NoWarn;
172
173 return MD_ReservedMacro;
174 }
175 StringRef Text = II->getName();
176 if (II->isKeyword(Lang))
177 return MD_KeywordDef;
178 if (Lang.CPlusPlus11 && (Text.equals("override") || Text.equals("final")))
179 return MD_KeywordDef;
180 return MD_NoWarn;
181}
182
183static MacroDiag shouldWarnOnMacroUndef(Preprocessor &PP, IdentifierInfo *II) {
184 const LangOptions &Lang = PP.getLangOpts();
185 // Do not warn on keyword undef. It is generally harmless and widely used.
186 if (II->isReserved(Lang) != ReservedIdentifierStatus::NotReserved)
187 return MD_ReservedMacro;
188 return MD_NoWarn;
189}
190
191// Return true if we want to issue a diagnostic by default if we
192// encounter this name in a #include with the wrong case. For now,
193// this includes the standard C and C++ headers, Posix headers,
194// and Boost headers. Improper case for these #includes is a
195// potential portability issue.
196static bool warnByDefaultOnWrongCase(StringRef Include) {
197 // If the first component of the path is "boost", treat this like a standard header
198 // for the purposes of diagnostics.
199 if (::llvm::sys::path::begin(Include)->equals_insensitive("boost"))
200 return true;
201
202 // "condition_variable" is the longest standard header name at 18 characters.
203 // If the include file name is longer than that, it can't be a standard header.
204 static const size_t MaxStdHeaderNameLen = 18u;
205 if (Include.size() > MaxStdHeaderNameLen)
206 return false;
207
208 // Lowercase and normalize the search string.
209 SmallString<32> LowerInclude{Include};
210 for (char &Ch : LowerInclude) {
211 // In the ASCII range?
212 if (static_cast<unsigned char>(Ch) > 0x7f)
213 return false; // Can't be a standard header
214 // ASCII lowercase:
215 if (Ch >= 'A' && Ch <= 'Z')
216 Ch += 'a' - 'A';
217 // Normalize path separators for comparison purposes.
218 else if (::llvm::sys::path::is_separator(Ch))
219 Ch = '/';
220 }
221
222 // The standard C/C++ and Posix headers
223 return llvm::StringSwitch<bool>(LowerInclude)
224 // C library headers
225 .Cases("assert.h", "complex.h", "ctype.h", "errno.h", "fenv.h", true)
226 .Cases("float.h", "inttypes.h", "iso646.h", "limits.h", "locale.h", true)
227 .Cases("math.h", "setjmp.h", "signal.h", "stdalign.h", "stdarg.h", true)
228 .Cases("stdatomic.h", "stdbool.h", "stddef.h", "stdint.h", "stdio.h", true)
229 .Cases("stdlib.h", "stdnoreturn.h", "string.h", "tgmath.h", "threads.h", true)
230 .Cases("time.h", "uchar.h", "wchar.h", "wctype.h", true)
231
232 // C++ headers for C library facilities
233 .Cases("cassert", "ccomplex", "cctype", "cerrno", "cfenv", true)
234 .Cases("cfloat", "cinttypes", "ciso646", "climits", "clocale", true)
235 .Cases("cmath", "csetjmp", "csignal", "cstdalign", "cstdarg", true)
236 .Cases("cstdbool", "cstddef", "cstdint", "cstdio", "cstdlib", true)
237 .Cases("cstring", "ctgmath", "ctime", "cuchar", "cwchar", true)
238 .Case("cwctype", true)
239
240 // C++ library headers
241 .Cases("algorithm", "fstream", "list", "regex", "thread", true)
242 .Cases("array", "functional", "locale", "scoped_allocator", "tuple", true)
243 .Cases("atomic", "future", "map", "set", "type_traits", true)
244 .Cases("bitset", "initializer_list", "memory", "shared_mutex", "typeindex", true)
245 .Cases("chrono", "iomanip", "mutex", "sstream", "typeinfo", true)
246 .Cases("codecvt", "ios", "new", "stack", "unordered_map", true)
247 .Cases("complex", "iosfwd", "numeric", "stdexcept", "unordered_set", true)
248 .Cases("condition_variable", "iostream", "ostream", "streambuf", "utility", true)
249 .Cases("deque", "istream", "queue", "string", "valarray", true)
250 .Cases("exception", "iterator", "random", "strstream", "vector", true)
251 .Cases("forward_list", "limits", "ratio", "system_error", true)
252
253 // POSIX headers (which aren't also C headers)
254 .Cases("aio.h", "arpa/inet.h", "cpio.h", "dirent.h", "dlfcn.h", true)
255 .Cases("fcntl.h", "fmtmsg.h", "fnmatch.h", "ftw.h", "glob.h", true)
256 .Cases("grp.h", "iconv.h", "langinfo.h", "libgen.h", "monetary.h", true)
257 .Cases("mqueue.h", "ndbm.h", "net/if.h", "netdb.h", "netinet/in.h", true)
258 .Cases("netinet/tcp.h", "nl_types.h", "poll.h", "pthread.h", "pwd.h", true)
259 .Cases("regex.h", "sched.h", "search.h", "semaphore.h", "spawn.h", true)
260 .Cases("strings.h", "stropts.h", "sys/ipc.h", "sys/mman.h", "sys/msg.h", true)
261 .Cases("sys/resource.h", "sys/select.h", "sys/sem.h", "sys/shm.h", "sys/socket.h", true)
262 .Cases("sys/stat.h", "sys/statvfs.h", "sys/time.h", "sys/times.h", "sys/types.h", true)
263 .Cases("sys/uio.h", "sys/un.h", "sys/utsname.h", "sys/wait.h", "syslog.h", true)
264 .Cases("tar.h", "termios.h", "trace.h", "ulimit.h", true)
265 .Cases("unistd.h", "utime.h", "utmpx.h", "wordexp.h", true)
266 .Default(false);
267}
268
269bool Preprocessor::CheckMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
270 bool *ShadowFlag) {
271 // Missing macro name?
272 if (MacroNameTok.is(tok::eod))
273 return Diag(MacroNameTok, diag::err_pp_missing_macro_name);
274
275 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
276 if (!II)
277 return Diag(MacroNameTok, diag::err_pp_macro_not_identifier);
278
279 if (II->isCPlusPlusOperatorKeyword()) {
280 // C++ 2.5p2: Alternative tokens behave the same as its primary token
281 // except for their spellings.
282 Diag(MacroNameTok, getLangOpts().MicrosoftExt
283 ? diag::ext_pp_operator_used_as_macro_name
284 : diag::err_pp_operator_used_as_macro_name)
285 << II << MacroNameTok.getKind();
286 // Allow #defining |and| and friends for Microsoft compatibility or
287 // recovery when legacy C headers are included in C++.
288 }
289
290 if ((isDefineUndef != MU_Other) && II->getPPKeywordID() == tok::pp_defined) {
291 // Error if defining "defined": C99 6.10.8/4, C++ [cpp.predefined]p4.
292 return Diag(MacroNameTok, diag::err_defined_macro_name);
293 }
294
295 if (isDefineUndef == MU_Undef) {
296 auto *MI = getMacroInfo(II);
297 if (MI && MI->isBuiltinMacro()) {
298 // Warn if undefining "__LINE__" and other builtins, per C99 6.10.8/4
299 // and C++ [cpp.predefined]p4], but allow it as an extension.
300 Diag(MacroNameTok, diag::ext_pp_undef_builtin_macro);
301 }
302 }
303
304 // If defining/undefining reserved identifier or a keyword, we need to issue
305 // a warning.
306 SourceLocation MacroNameLoc = MacroNameTok.getLocation();
307 if (ShadowFlag)
308 *ShadowFlag = false;
309 if (!SourceMgr.isInSystemHeader(MacroNameLoc) &&
310 (SourceMgr.getBufferName(MacroNameLoc) != "<built-in>")) {
311 MacroDiag D = MD_NoWarn;
312 if (isDefineUndef == MU_Define) {
313 D = shouldWarnOnMacroDef(*this, II);
314 }
315 else if (isDefineUndef == MU_Undef)
316 D = shouldWarnOnMacroUndef(*this, II);
317 if (D == MD_KeywordDef) {
318 // We do not want to warn on some patterns widely used in configuration
319 // scripts. This requires analyzing next tokens, so do not issue warnings
320 // now, only inform caller.
321 if (ShadowFlag)
322 *ShadowFlag = true;
323 }
324 if (D == MD_ReservedMacro)
325 Diag(MacroNameTok, diag::warn_pp_macro_is_reserved_id);
326 }
327
328 // Okay, we got a good identifier.
329 return false;
330}
331
332/// Lex and validate a macro name, which occurs after a
333/// \#define or \#undef.
334///
335/// This sets the token kind to eod and discards the rest of the macro line if
336/// the macro name is invalid.
337///
338/// \param MacroNameTok Token that is expected to be a macro name.
339/// \param isDefineUndef Context in which macro is used.
340/// \param ShadowFlag Points to a flag that is set if macro shadows a keyword.
341void Preprocessor::ReadMacroName(Token &MacroNameTok, MacroUse isDefineUndef,
342 bool *ShadowFlag) {
343 // Read the token, don't allow macro expansion on it.
344 LexUnexpandedToken(MacroNameTok);
345
346 if (MacroNameTok.is(tok::code_completion)) {
347 if (CodeComplete)
348 CodeComplete->CodeCompleteMacroName(isDefineUndef == MU_Define);
349 setCodeCompletionReached();
350 LexUnexpandedToken(MacroNameTok);
351 }
352
353 if (!CheckMacroName(MacroNameTok, isDefineUndef, ShadowFlag))
354 return;
355
356 // Invalid macro name, read and discard the rest of the line and set the
357 // token kind to tok::eod if necessary.
358 if (MacroNameTok.isNot(tok::eod)) {
359 MacroNameTok.setKind(tok::eod);
360 DiscardUntilEndOfDirective();
361 }
362}
363
364/// Ensure that the next token is a tok::eod token.
365///
366/// If not, emit a diagnostic and consume up until the eod. If EnableMacros is
367/// true, then we consider macros that expand to zero tokens as being ok.
368///
369/// Returns the location of the end of the directive.
370SourceLocation Preprocessor::CheckEndOfDirective(const char *DirType,
371 bool EnableMacros) {
372 Token Tmp;
373 // Lex unexpanded tokens for most directives: macros might expand to zero
374 // tokens, causing us to miss diagnosing invalid lines. Some directives (like
375 // #line) allow empty macros.
376 if (EnableMacros)
377 Lex(Tmp);
378 else
379 LexUnexpandedToken(Tmp);
380
381 // There should be no tokens after the directive, but we allow them as an
382 // extension.
383 while (Tmp.is(tok::comment)) // Skip comments in -C mode.
384 LexUnexpandedToken(Tmp);
385
386 if (Tmp.is(tok::eod))
387 return Tmp.getLocation();
388
389 // Add a fixit in GNU/C99/C++ mode. Don't offer a fixit for strict-C89,
390 // or if this is a macro-style preprocessing directive, because it is more
391 // trouble than it is worth to insert /**/ and check that there is no /**/
392 // in the range also.
393 FixItHint Hint;
394 if ((LangOpts.GNUMode || LangOpts.C99 || LangOpts.CPlusPlus) &&
395 !CurTokenLexer)
396 Hint = FixItHint::CreateInsertion(Tmp.getLocation(),"//");
397 Diag(Tmp, diag::ext_pp_extra_tokens_at_eol) << DirType << Hint;
398 return DiscardUntilEndOfDirective().getEnd();
399}
400
401Optional<unsigned> Preprocessor::getSkippedRangeForExcludedConditionalBlock(
402 SourceLocation HashLoc) {
403 if (!ExcludedConditionalDirectiveSkipMappings)
404 return None;
405 if (!HashLoc.isFileID())
406 return None;
407
408 std::pair<FileID, unsigned> HashFileOffset =
409 SourceMgr.getDecomposedLoc(HashLoc);
410 Optional<llvm::MemoryBufferRef> Buf =
411 SourceMgr.getBufferOrNone(HashFileOffset.first);
412 if (!Buf)
413 return None;
414 auto It =
415 ExcludedConditionalDirectiveSkipMappings->find(Buf->getBufferStart());
416 if (It == ExcludedConditionalDirectiveSkipMappings->end())
417 return None;
418
419 const PreprocessorSkippedRangeMapping &SkippedRanges = *It->getSecond();
420 // Check if the offset of '#' is mapped in the skipped ranges.
421 auto MappingIt = SkippedRanges.find(HashFileOffset.second);
422 if (MappingIt == SkippedRanges.end())
423 return None;
424
425 unsigned BytesToSkip = MappingIt->getSecond();
426 unsigned CurLexerBufferOffset = CurLexer->getCurrentBufferOffset();
427 assert(CurLexerBufferOffset >= HashFileOffset.second &&((void)0)
428 "lexer is before the hash?")((void)0);
429 // Take into account the fact that the lexer has already advanced, so the
430 // number of bytes to skip must be adjusted.
431 unsigned LengthDiff = CurLexerBufferOffset - HashFileOffset.second;
432 assert(BytesToSkip >= LengthDiff && "lexer is after the skipped range?")((void)0);
433 return BytesToSkip - LengthDiff;
434}
435
436/// SkipExcludedConditionalBlock - We just read a \#if or related directive and
437/// decided that the subsequent tokens are in the \#if'd out portion of the
438/// file. Lex the rest of the file, until we see an \#endif. If
439/// FoundNonSkipPortion is true, then we have already emitted code for part of
440/// this \#if directive, so \#else/\#elif blocks should never be entered.
441/// If ElseOk is true, then \#else directives are ok, if not, then we have
442/// already seen one so a \#else directive is a duplicate. When this returns,
443/// the caller can lex the first valid token.
444void Preprocessor::SkipExcludedConditionalBlock(SourceLocation HashTokenLoc,
445 SourceLocation IfTokenLoc,
446 bool FoundNonSkipPortion,
447 bool FoundElse,
448 SourceLocation ElseLoc) {
449 ++NumSkipped;
450 assert(!CurTokenLexer && CurPPLexer && "Lexing a macro, not a file?")((void)0);
451
452 if (PreambleConditionalStack.reachedEOFWhileSkipping())
453 PreambleConditionalStack.clearSkipInfo();
454 else
455 CurPPLexer->pushConditionalLevel(IfTokenLoc, /*isSkipping*/ false,
456 FoundNonSkipPortion, FoundElse);
457
458 // Enter raw mode to disable identifier lookup (and thus macro expansion),
459 // disabling warnings, etc.
460 CurPPLexer->LexingRawMode = true;
461 Token Tok;
462 if (auto SkipLength =
463 getSkippedRangeForExcludedConditionalBlock(HashTokenLoc)) {
464 // Skip to the next '#endif' / '#else' / '#elif'.
465 CurLexer->skipOver(*SkipLength);
466 }
467 SourceLocation endLoc;
468 while (true) {
469 CurLexer->Lex(Tok);
470
471 if (Tok.is(tok::code_completion)) {
472 setCodeCompletionReached();
473 if (CodeComplete)
474 CodeComplete->CodeCompleteInConditionalExclusion();
475 continue;
476 }
477
478 // If this is the end of the buffer, we have an error.
479 if (Tok.is(tok::eof)) {
480 // We don't emit errors for unterminated conditionals here,
481 // Lexer::LexEndOfFile can do that properly.
482 // Just return and let the caller lex after this #include.
483 if (PreambleConditionalStack.isRecording())
484 PreambleConditionalStack.SkipInfo.emplace(
485 HashTokenLoc, IfTokenLoc, FoundNonSkipPortion, FoundElse, ElseLoc);
486 break;
487 }
488
489 // If this token is not a preprocessor directive, just skip it.
490 if (Tok.isNot(tok::hash) || !Tok.isAtStartOfLine())
491 continue;
492
493 // We just parsed a # character at the start of a line, so we're in
494 // directive mode. Tell the lexer this so any newlines we see will be
495 // converted into an EOD token (this terminates the macro).
496 CurPPLexer->ParsingPreprocessorDirective = true;
497 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
498
499
500 // Read the next token, the directive flavor.
501 LexUnexpandedToken(Tok);
502
503 // If this isn't an identifier directive (e.g. is "# 1\n" or "#\n", or
504 // something bogus), skip it.
505 if (Tok.isNot(tok::raw_identifier)) {
506 CurPPLexer->ParsingPreprocessorDirective = false;
507 // Restore comment saving mode.
508 if (CurLexer) CurLexer->resetExtendedTokenMode();
509 continue;
510 }
511
512 // If the first letter isn't i or e, it isn't intesting to us. We know that
513 // this is safe in the face of spelling differences, because there is no way
514 // to spell an i/e in a strange way that is another letter. Skipping this
515 // allows us to avoid looking up the identifier info for #define/#undef and
516 // other common directives.
517 StringRef RI = Tok.getRawIdentifier();
518
519 char FirstChar = RI[0];
520 if (FirstChar >= 'a' && FirstChar <= 'z' &&
521 FirstChar != 'i' && FirstChar != 'e') {
522 CurPPLexer->ParsingPreprocessorDirective = false;
523 // Restore comment saving mode.
524 if (CurLexer) CurLexer->resetExtendedTokenMode();
525 continue;
526 }
527
528 // Get the identifier name without trigraphs or embedded newlines. Note
529 // that we can't use Tok.getIdentifierInfo() because its lookup is disabled
530 // when skipping.
531 char DirectiveBuf[20];
532 StringRef Directive;
533 if (!Tok.needsCleaning() && RI.size() < 20) {
534 Directive = RI;
535 } else {
536 std::string DirectiveStr = getSpelling(Tok);
537 size_t IdLen = DirectiveStr.size();
538 if (IdLen >= 20) {
539 CurPPLexer->ParsingPreprocessorDirective = false;
540 // Restore comment saving mode.
541 if (CurLexer) CurLexer->resetExtendedTokenMode();
542 continue;
543 }
544 memcpy(DirectiveBuf, &DirectiveStr[0], IdLen);
545 Directive = StringRef(DirectiveBuf, IdLen);
546 }
547
548 if (Directive.startswith("if")) {
549 StringRef Sub = Directive.substr(2);
550 if (Sub.empty() || // "if"
551 Sub == "def" || // "ifdef"
552 Sub == "ndef") { // "ifndef"
553 // We know the entire #if/#ifdef/#ifndef block will be skipped, don't
554 // bother parsing the condition.
555 DiscardUntilEndOfDirective();
556 CurPPLexer->pushConditionalLevel(Tok.getLocation(), /*wasskipping*/true,
557 /*foundnonskip*/false,
558 /*foundelse*/false);
559 }
560 } else if (Directive[0] == 'e') {
561 StringRef Sub = Directive.substr(1);
562 if (Sub == "ndif") { // "endif"
563 PPConditionalInfo CondInfo;
564 CondInfo.WasSkipping = true; // Silence bogus warning.
565 bool InCond = CurPPLexer->popConditionalLevel(CondInfo);
566 (void)InCond; // Silence warning in no-asserts mode.
567 assert(!InCond && "Can't be skipping if not in a conditional!")((void)0);
568
569 // If we popped the outermost skipping block, we're done skipping!
570 if (!CondInfo.WasSkipping) {
571 // Restore the value of LexingRawMode so that trailing comments
572 // are handled correctly, if we've reached the outermost block.
573 CurPPLexer->LexingRawMode = false;
574 endLoc = CheckEndOfDirective("endif");
575 CurPPLexer->LexingRawMode = true;
576 if (Callbacks)
577 Callbacks->Endif(Tok.getLocation(), CondInfo.IfLoc);
578 break;
579 } else {
580 DiscardUntilEndOfDirective();
581 }
582 } else if (Sub == "lse") { // "else".
583 // #else directive in a skipping conditional. If not in some other
584 // skipping conditional, and if #else hasn't already been seen, enter it
585 // as a non-skipping conditional.
586 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
587
588 // If this is a #else with a #else before it, report the error.
589 if (CondInfo.FoundElse)
590 Diag(Tok, diag::pp_err_else_after_else);
591
592 // Note that we've seen a #else in this conditional.
593 CondInfo.FoundElse = true;
594
595 // If the conditional is at the top level, and the #if block wasn't
596 // entered, enter the #else block now.
597 if (!CondInfo.WasSkipping && !CondInfo.FoundNonSkip) {
598 CondInfo.FoundNonSkip = true;
599 // Restore the value of LexingRawMode so that trailing comments
600 // are handled correctly.
601 CurPPLexer->LexingRawMode = false;
602 endLoc = CheckEndOfDirective("else");
603 CurPPLexer->LexingRawMode = true;
604 if (Callbacks)
605 Callbacks->Else(Tok.getLocation(), CondInfo.IfLoc);
606 break;
607 } else {
608 DiscardUntilEndOfDirective(); // C99 6.10p4.
609 }
610 } else if (Sub == "lif") { // "elif".
611 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
612
613 // If this is a #elif with a #else before it, report the error.
614 if (CondInfo.FoundElse)
615 Diag(Tok, diag::pp_err_elif_after_else) << PED_Elif;
616
617 // If this is in a skipping block or if we're already handled this #if
618 // block, don't bother parsing the condition.
619 if (CondInfo.WasSkipping || CondInfo.FoundNonSkip) {
620 DiscardUntilEndOfDirective();
621 } else {
622 // Restore the value of LexingRawMode so that identifiers are
623 // looked up, etc, inside the #elif expression.
624 assert(CurPPLexer->LexingRawMode && "We have to be skipping here!")((void)0);
625 CurPPLexer->LexingRawMode = false;
626 IdentifierInfo *IfNDefMacro = nullptr;
627 DirectiveEvalResult DER = EvaluateDirectiveExpression(IfNDefMacro);
628 // Stop if Lexer became invalid after hitting code completion token.
629 if (!CurPPLexer)
630 return;
631 const bool CondValue = DER.Conditional;
632 CurPPLexer->LexingRawMode = true;
633 if (Callbacks) {
634 Callbacks->Elif(
635 Tok.getLocation(), DER.ExprRange,
636 (CondValue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False),
637 CondInfo.IfLoc);
638 }
639 // If this condition is true, enter it!
640 if (CondValue) {
641 CondInfo.FoundNonSkip = true;
642 break;
643 }
644 }
645 } else if (Sub == "lifdef" || // "elifdef"
646 Sub == "lifndef") { // "elifndef"
647 bool IsElifDef = Sub == "lifdef";
648 PPConditionalInfo &CondInfo = CurPPLexer->peekConditionalLevel();
649 Token DirectiveToken = Tok;
650
651 // If this is a #elif with a #else before it, report the error.
652 if (CondInfo.FoundElse)
653 Diag(Tok, diag::pp_err_elif_after_else)
654 << (IsElifDef ? PED_Elifdef : PED_Elifndef);
655
656 // If this is in a skipping block or if we're already handled this #if
657 // block, don't bother parsing the condition.
658 if (CondInfo.WasSkipping || CondInfo.FoundNonSkip) {
659 DiscardUntilEndOfDirective();
660 } else {
661 // Restore the value of LexingRawMode so that identifiers are
662 // looked up, etc, inside the #elif[n]def expression.
663 assert(CurPPLexer->LexingRawMode && "We have to be skipping here!")((void)0);
664 CurPPLexer->LexingRawMode = false;
665 Token MacroNameTok;
666 ReadMacroName(MacroNameTok);
667 CurPPLexer->LexingRawMode = true;
668
669 // If the macro name token is tok::eod, there was an error that was
670 // already reported.
671 if (MacroNameTok.is(tok::eod)) {
672 // Skip code until we get to #endif. This helps with recovery by
673 // not emitting an error when the #endif is reached.
674 continue;
675 }
676
677 CheckEndOfDirective(IsElifDef ? "elifdef" : "elifndef");
678
679 IdentifierInfo *MII = MacroNameTok.getIdentifierInfo();
680 auto MD = getMacroDefinition(MII);
681 MacroInfo *MI = MD.getMacroInfo();
682
683 if (Callbacks) {
684 if (IsElifDef) {
685 Callbacks->Elifdef(DirectiveToken.getLocation(), MacroNameTok,
686 MD);
687 } else {
688 Callbacks->Elifndef(DirectiveToken.getLocation(), MacroNameTok,
689 MD);
690 }
691 }
692 // If this condition is true, enter it!
693 if (static_cast<bool>(MI) == IsElifDef) {
694 CondInfo.FoundNonSkip = true;
695 break;
696 }
697 }
698 }
699 }
700
701 CurPPLexer->ParsingPreprocessorDirective = false;
702 // Restore comment saving mode.
703 if (CurLexer) CurLexer->resetExtendedTokenMode();
704 }
705
706 // Finally, if we are out of the conditional (saw an #endif or ran off the end
707 // of the file, just stop skipping and return to lexing whatever came after
708 // the #if block.
709 CurPPLexer->LexingRawMode = false;
710
711 // The last skipped range isn't actually skipped yet if it's truncated
712 // by the end of the preamble; we'll resume parsing after the preamble.
713 if (Callbacks && (Tok.isNot(tok::eof) || !isRecordingPreamble()))
714 Callbacks->SourceRangeSkipped(
715 SourceRange(HashTokenLoc, endLoc.isValid()
716 ? endLoc
717 : CurPPLexer->getSourceLocation()),
718 Tok.getLocation());
719}
720
721Module *Preprocessor::getModuleForLocation(SourceLocation Loc) {
722 if (!SourceMgr.isInMainFile(Loc)) {
723 // Try to determine the module of the include directive.
724 // FIXME: Look into directly passing the FileEntry from LookupFile instead.
725 FileID IDOfIncl = SourceMgr.getFileID(SourceMgr.getExpansionLoc(Loc));
726 if (const FileEntry *EntryOfIncl = SourceMgr.getFileEntryForID(IDOfIncl)) {
727 // The include comes from an included file.
728 return HeaderInfo.getModuleMap()
729 .findModuleForHeader(EntryOfIncl)
730 .getModule();
731 }
732 }
733
734 // This is either in the main file or not in a file at all. It belongs
735 // to the current module, if there is one.
736 return getLangOpts().CurrentModule.empty()
737 ? nullptr
738 : HeaderInfo.lookupModule(getLangOpts().CurrentModule);
739}
740
741const FileEntry *
742Preprocessor::getHeaderToIncludeForDiagnostics(SourceLocation IncLoc,
743 SourceLocation Loc) {
744 Module *IncM = getModuleForLocation(IncLoc);
745
746 // Walk up through the include stack, looking through textual headers of M
747 // until we hit a non-textual header that we can #include. (We assume textual
748 // headers of a module with non-textual headers aren't meant to be used to
749 // import entities from the module.)
750 auto &SM = getSourceManager();
751 while (!Loc.isInvalid() && !SM.isInMainFile(Loc)) {
752 auto ID = SM.getFileID(SM.getExpansionLoc(Loc));
753 auto *FE = SM.getFileEntryForID(ID);
754 if (!FE)
755 break;
756
757 // We want to find all possible modules that might contain this header, so
758 // search all enclosing directories for module maps and load them.
759 HeaderInfo.hasModuleMap(FE->getName(), /*Root*/ nullptr,
760 SourceMgr.isInSystemHeader(Loc));
761
762 bool InPrivateHeader = false;
763 for (auto Header : HeaderInfo.findAllModulesForHeader(FE)) {
764 if (!Header.isAccessibleFrom(IncM)) {
765 // It's in a private header; we can't #include it.
766 // FIXME: If there's a public header in some module that re-exports it,
767 // then we could suggest including that, but it's not clear that's the
768 // expected way to make this entity visible.
769 InPrivateHeader = true;
770 continue;
771 }
772
773 // We'll suggest including textual headers below if they're
774 // include-guarded.
775 if (Header.getRole() & ModuleMap::TextualHeader)
776 continue;
777
778 // If we have a module import syntax, we shouldn't include a header to
779 // make a particular module visible. Let the caller know they should
780 // suggest an import instead.
781 if (getLangOpts().ObjC || getLangOpts().CPlusPlusModules ||
782 getLangOpts().ModulesTS)
783 return nullptr;
784
785 // If this is an accessible, non-textual header of M's top-level module
786 // that transitively includes the given location and makes the
787 // corresponding module visible, this is the thing to #include.
788 return FE;
789 }
790
791 // FIXME: If we're bailing out due to a private header, we shouldn't suggest
792 // an import either.
793 if (InPrivateHeader)
794 return nullptr;
795
796 // If the header is includable and has an include guard, assume the
797 // intended way to expose its contents is by #include, not by importing a
798 // module that transitively includes it.
799 if (getHeaderSearchInfo().isFileMultipleIncludeGuarded(FE))
800 return FE;
801
802 Loc = SM.getIncludeLoc(ID);
803 }
804
805 return nullptr;
806}
807
808Optional<FileEntryRef> Preprocessor::LookupFile(
809 SourceLocation FilenameLoc, StringRef Filename, bool isAngled,
810 const DirectoryLookup *FromDir, const FileEntry *FromFile,
811 const DirectoryLookup *&CurDir, SmallVectorImpl<char> *SearchPath,
812 SmallVectorImpl<char> *RelativePath,
813 ModuleMap::KnownHeader *SuggestedModule, bool *IsMapped,
814 bool *IsFrameworkFound, bool SkipCache) {
815 Module *RequestingModule = getModuleForLocation(FilenameLoc);
816 bool RequestingModuleIsModuleInterface = !SourceMgr.isInMainFile(FilenameLoc);
817
818 // If the header lookup mechanism may be relative to the current inclusion
819 // stack, record the parent #includes.
820 SmallVector<std::pair<const FileEntry *, const DirectoryEntry *>, 16>
821 Includers;
822 bool BuildSystemModule = false;
823 if (!FromDir && !FromFile) {
824 FileID FID = getCurrentFileLexer()->getFileID();
825 const FileEntry *FileEnt = SourceMgr.getFileEntryForID(FID);
826
827 // If there is no file entry associated with this file, it must be the
828 // predefines buffer or the module includes buffer. Any other file is not
829 // lexed with a normal lexer, so it won't be scanned for preprocessor
830 // directives.
831 //
832 // If we have the predefines buffer, resolve #include references (which come
833 // from the -include command line argument) from the current working
834 // directory instead of relative to the main file.
835 //
836 // If we have the module includes buffer, resolve #include references (which
837 // come from header declarations in the module map) relative to the module
838 // map file.
839 if (!FileEnt) {
840 if (FID == SourceMgr.getMainFileID() && MainFileDir) {
841 Includers.push_back(std::make_pair(nullptr, MainFileDir));
842 BuildSystemModule = getCurrentModule()->IsSystem;
843 } else if ((FileEnt =
844 SourceMgr.getFileEntryForID(SourceMgr.getMainFileID())))
845 Includers.push_back(std::make_pair(FileEnt, *FileMgr.getDirectory(".")));
846 } else {
847 Includers.push_back(std::make_pair(FileEnt, FileEnt->getDir()));
848 }
849
850 // MSVC searches the current include stack from top to bottom for
851 // headers included by quoted include directives.
852 // See: http://msdn.microsoft.com/en-us/library/36k2cdd4.aspx
853 if (LangOpts.MSVCCompat && !isAngled) {
854 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
855 if (IsFileLexer(ISEntry))
856 if ((FileEnt = ISEntry.ThePPLexer->getFileEntry()))
857 Includers.push_back(std::make_pair(FileEnt, FileEnt->getDir()));
858 }
859 }
860 }
861
862 CurDir = CurDirLookup;
863
864 if (FromFile) {
865 // We're supposed to start looking from after a particular file. Search
866 // the include path until we find that file or run out of files.
867 const DirectoryLookup *TmpCurDir = CurDir;
868 const DirectoryLookup *TmpFromDir = nullptr;
869 while (Optional<FileEntryRef> FE = HeaderInfo.LookupFile(
870 Filename, FilenameLoc, isAngled, TmpFromDir, TmpCurDir,
871 Includers, SearchPath, RelativePath, RequestingModule,
872 SuggestedModule, /*IsMapped=*/nullptr,
873 /*IsFrameworkFound=*/nullptr, SkipCache)) {
874 // Keep looking as if this file did a #include_next.
875 TmpFromDir = TmpCurDir;
876 ++TmpFromDir;
877 if (&FE->getFileEntry() == FromFile) {
878 // Found it.
879 FromDir = TmpFromDir;
880 CurDir = TmpCurDir;
881 break;
882 }
883 }
884 }
885
886 // Do a standard file entry lookup.
887 Optional<FileEntryRef> FE = HeaderInfo.LookupFile(
888 Filename, FilenameLoc, isAngled, FromDir, CurDir, Includers, SearchPath,
889 RelativePath, RequestingModule, SuggestedModule, IsMapped,
890 IsFrameworkFound, SkipCache, BuildSystemModule);
891 if (FE) {
892 if (SuggestedModule && !LangOpts.AsmPreprocessor)
893 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
894 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
895 Filename, &FE->getFileEntry());
896 return FE;
897 }
898
899 const FileEntry *CurFileEnt;
900 // Otherwise, see if this is a subframework header. If so, this is relative
901 // to one of the headers on the #include stack. Walk the list of the current
902 // headers on the #include stack and pass them to HeaderInfo.
903 if (IsFileLexer()) {
904 if ((CurFileEnt = CurPPLexer->getFileEntry())) {
905 if (Optional<FileEntryRef> FE = HeaderInfo.LookupSubframeworkHeader(
906 Filename, CurFileEnt, SearchPath, RelativePath, RequestingModule,
907 SuggestedModule)) {
908 if (SuggestedModule && !LangOpts.AsmPreprocessor)
909 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
910 RequestingModule, RequestingModuleIsModuleInterface, FilenameLoc,
911 Filename, &FE->getFileEntry());
912 return FE;
913 }
914 }
915 }
916
917 for (IncludeStackInfo &ISEntry : llvm::reverse(IncludeMacroStack)) {
918 if (IsFileLexer(ISEntry)) {
919 if ((CurFileEnt = ISEntry.ThePPLexer->getFileEntry())) {
920 if (Optional<FileEntryRef> FE = HeaderInfo.LookupSubframeworkHeader(
921 Filename, CurFileEnt, SearchPath, RelativePath,
922 RequestingModule, SuggestedModule)) {
923 if (SuggestedModule && !LangOpts.AsmPreprocessor)
924 HeaderInfo.getModuleMap().diagnoseHeaderInclusion(
925 RequestingModule, RequestingModuleIsModuleInterface,
926 FilenameLoc, Filename, &FE->getFileEntry());
927 return FE;
928 }
929 }
930 }
931 }
932
933 // Otherwise, we really couldn't find the file.
934 return None;
935}
936
937//===----------------------------------------------------------------------===//
938// Preprocessor Directive Handling.
939//===----------------------------------------------------------------------===//
940
941class Preprocessor::ResetMacroExpansionHelper {
942public:
943 ResetMacroExpansionHelper(Preprocessor *pp)
944 : PP(pp), save(pp->DisableMacroExpansion) {
945 if (pp->MacroExpansionInDirectivesOverride)
946 pp->DisableMacroExpansion = false;
947 }
948
949 ~ResetMacroExpansionHelper() {
950 PP->DisableMacroExpansion = save;
951 }
952
953private:
954 Preprocessor *PP;
955 bool save;
956};
957
958/// Process a directive while looking for the through header or a #pragma
959/// hdrstop. The following directives are handled:
960/// #include (to check if it is the through header)
961/// #define (to warn about macros that don't match the PCH)
962/// #pragma (to check for pragma hdrstop).
963/// All other directives are completely discarded.
964void Preprocessor::HandleSkippedDirectiveWhileUsingPCH(Token &Result,
965 SourceLocation HashLoc) {
966 if (const IdentifierInfo *II = Result.getIdentifierInfo()) {
8
Assuming 'II' is non-null
9
Taking true branch
967 if (II->getPPKeywordID() == tok::pp_define) {
10
Assuming the condition is true
11
Taking true branch
968 return HandleDefineDirective(Result,
12
Calling 'Preprocessor::HandleDefineDirective'
969 /*ImmediatelyAfterHeaderGuard=*/false);
970 }
971 if (SkippingUntilPCHThroughHeader &&
972 II->getPPKeywordID() == tok::pp_include) {
973 return HandleIncludeDirective(HashLoc, Result);
974 }
975 if (SkippingUntilPragmaHdrStop && II->getPPKeywordID() == tok::pp_pragma) {
976 Lex(Result);
977 auto *II = Result.getIdentifierInfo();
978 if (II && II->getName() == "hdrstop")
979 return HandlePragmaHdrstop(Result);
980 }
981 }
982 DiscardUntilEndOfDirective();
983}
984
985/// HandleDirective - This callback is invoked when the lexer sees a # token
986/// at the start of a line. This consumes the directive, modifies the
987/// lexer/preprocessor state, and advances the lexer(s) so that the next token
988/// read is the correct one.
989void Preprocessor::HandleDirective(Token &Result) {
990 // FIXME: Traditional: # with whitespace before it not recognized by K&R?
991
992 // We just parsed a # character at the start of a line, so we're in directive
993 // mode. Tell the lexer this so any newlines we see will be converted into an
994 // EOD token (which terminates the directive).
995 CurPPLexer->ParsingPreprocessorDirective = true;
996 if (CurLexer) CurLexer->SetKeepWhitespaceMode(false);
1
Taking false branch
997
998 bool ImmediatelyAfterTopLevelIfndef =
999 CurPPLexer->MIOpt.getImmediatelyAfterTopLevelIfndef();
1000 CurPPLexer->MIOpt.resetImmediatelyAfterTopLevelIfndef();
1001
1002 ++NumDirectives;
1003
1004 // We are about to read a token. For the multiple-include optimization FA to
1005 // work, we have to remember if we had read any tokens *before* this
1006 // pp-directive.
1007 bool ReadAnyTokensBeforeDirective =CurPPLexer->MIOpt.getHasReadAnyTokensVal();
1008
1009 // Save the '#' token in case we need to return it later.
1010 Token SavedHash = Result;
1011
1012 // Read the next token, the directive flavor. This isn't expanded due to
1013 // C99 6.10.3p8.
1014 LexUnexpandedToken(Result);
1015
1016 // C99 6.10.3p11: Is this preprocessor directive in macro invocation? e.g.:
1017 // #define A(x) #x
1018 // A(abc
1019 // #warning blah
1020 // def)
1021 // If so, the user is relying on undefined behavior, emit a diagnostic. Do
1022 // not support this for #include-like directives, since that can result in
1023 // terrible diagnostics, and does not work in GCC.
1024 if (InMacroArgs) {
2
Assuming field 'InMacroArgs' is false
3
Taking false branch
1025 if (IdentifierInfo *II = Result.getIdentifierInfo()) {
1026 switch (II->getPPKeywordID()) {
1027 case tok::pp_include:
1028 case tok::pp_import:
1029 case tok::pp_include_next:
1030 case tok::pp___include_macros:
1031 case tok::pp_pragma:
1032 Diag(Result, diag::err_embedded_directive) << II->getName();
1033 Diag(*ArgMacro, diag::note_macro_expansion_here)
1034 << ArgMacro->getIdentifierInfo();
1035 DiscardUntilEndOfDirective();
1036 return;
1037 default:
1038 break;
1039 }
1040 }
1041 Diag(Result, diag::ext_embedded_directive);
1042 }
1043
1044 // Temporarily enable macro expansion if set so
1045 // and reset to previous state when returning from this function.
1046 ResetMacroExpansionHelper helper(this);
1047
1048 if (SkippingUntilPCHThroughHeader || SkippingUntilPragmaHdrStop)
4
Assuming field 'SkippingUntilPCHThroughHeader' is false
5
Assuming field 'SkippingUntilPragmaHdrStop' is true
6
Taking true branch
1049 return HandleSkippedDirectiveWhileUsingPCH(Result, SavedHash.getLocation());
7
Calling 'Preprocessor::HandleSkippedDirectiveWhileUsingPCH'
1050
1051 switch (Result.getKind()) {
1052 case tok::eod:
1053 return; // null directive.
1054 case tok::code_completion:
1055 setCodeCompletionReached();
1056 if (CodeComplete)
1057 CodeComplete->CodeCompleteDirective(
1058 CurPPLexer->getConditionalStackDepth() > 0);
1059 return;
1060 case tok::numeric_constant: // # 7 GNU line marker directive.
1061 if (getLangOpts().AsmPreprocessor)
1062 break; // # 4 is not a preprocessor directive in .S files.
1063 return HandleDigitDirective(Result);
1064 default:
1065 IdentifierInfo *II = Result.getIdentifierInfo();
1066 if (!II) break; // Not an identifier.
1067
1068 // Ask what the preprocessor keyword ID is.
1069 switch (II->getPPKeywordID()) {
1070 default: break;
1071 // C99 6.10.1 - Conditional Inclusion.
1072 case tok::pp_if:
1073 return HandleIfDirective(Result, SavedHash, ReadAnyTokensBeforeDirective);
1074 case tok::pp_ifdef:
1075 return HandleIfdefDirective(Result, SavedHash, false,
1076 true /*not valid for miopt*/);
1077 case tok::pp_ifndef:
1078 return HandleIfdefDirective(Result, SavedHash, true,
1079 ReadAnyTokensBeforeDirective);
1080 case tok::pp_elif:
1081 case tok::pp_elifdef:
1082 case tok::pp_elifndef:
1083 return HandleElifFamilyDirective(Result, SavedHash, II->getPPKeywordID());
1084
1085 case tok::pp_else:
1086 return HandleElseDirective(Result, SavedHash);
1087 case tok::pp_endif:
1088 return HandleEndifDirective(Result);
1089
1090 // C99 6.10.2 - Source File Inclusion.
1091 case tok::pp_include:
1092 // Handle #include.
1093 return HandleIncludeDirective(SavedHash.getLocation(), Result);
1094 case tok::pp___include_macros:
1095 // Handle -imacros.
1096 return HandleIncludeMacrosDirective(SavedHash.getLocation(), Result);
1097
1098 // C99 6.10.3 - Macro Replacement.
1099 case tok::pp_define:
1100 return HandleDefineDirective(Result, ImmediatelyAfterTopLevelIfndef);
1101 case tok::pp_undef:
1102 return HandleUndefDirective();
1103
1104 // C99 6.10.4 - Line Control.
1105 case tok::pp_line:
1106 return HandleLineDirective();
1107
1108 // C99 6.10.5 - Error Directive.
1109 case tok::pp_error:
1110 return HandleUserDiagnosticDirective(Result, false);
1111
1112 // C99 6.10.6 - Pragma Directive.
1113 case tok::pp_pragma:
1114 return HandlePragmaDirective({PIK_HashPragma, SavedHash.getLocation()});
1115
1116 // GNU Extensions.
1117 case tok::pp_import:
1118 return HandleImportDirective(SavedHash.getLocation(), Result);
1119 case tok::pp_include_next:
1120 return HandleIncludeNextDirective(SavedHash.getLocation(), Result);
1121
1122 case tok::pp_warning:
1123 Diag(Result, diag::ext_pp_warning_directive);
1124 return HandleUserDiagnosticDirective(Result, true);
1125 case tok::pp_ident:
1126 return HandleIdentSCCSDirective(Result);
1127 case tok::pp_sccs:
1128 return HandleIdentSCCSDirective(Result);
1129 case tok::pp_assert:
1130 //isExtension = true; // FIXME: implement #assert
1131 break;
1132 case tok::pp_unassert:
1133 //isExtension = true; // FIXME: implement #unassert
1134 break;
1135
1136 case tok::pp___public_macro:
1137 if (getLangOpts().Modules || getLangOpts().ModulesLocalVisibility)
1138 return HandleMacroPublicDirective(Result);
1139 break;
1140
1141 case tok::pp___private_macro:
1142 if (getLangOpts().Modules || getLangOpts().ModulesLocalVisibility)
1143 return HandleMacroPrivateDirective();
1144 break;
1145 }
1146 break;
1147 }
1148
1149 // If this is a .S file, treat unknown # directives as non-preprocessor
1150 // directives. This is important because # may be a comment or introduce
1151 // various pseudo-ops. Just return the # token and push back the following
1152 // token to be lexed next time.
1153 if (getLangOpts().AsmPreprocessor) {
1154 auto Toks = std::make_unique<Token[]>(2);
1155 // Return the # and the token after it.
1156 Toks[0] = SavedHash;
1157 Toks[1] = Result;
1158
1159 // If the second token is a hashhash token, then we need to translate it to
1160 // unknown so the token lexer doesn't try to perform token pasting.
1161 if (Result.is(tok::hashhash))
1162 Toks[1].setKind(tok::unknown);
1163
1164 // Enter this token stream so that we re-lex the tokens. Make sure to
1165 // enable macro expansion, in case the token after the # is an identifier
1166 // that is expanded.
1167 EnterTokenStream(std::move(Toks), 2, false, /*IsReinject*/false);
1168 return;
1169 }
1170
1171 // If we reached here, the preprocessing token is not valid!
1172 Diag(Result, diag::err_pp_invalid_directive);
1173
1174 // Read the rest of the PP line.
1175 DiscardUntilEndOfDirective();
1176
1177 // Okay, we're done parsing the directive.
1178}
1179
1180/// GetLineValue - Convert a numeric token into an unsigned value, emitting
1181/// Diagnostic DiagID if it is invalid, and returning the value in Val.
1182static bool GetLineValue(Token &DigitTok, unsigned &Val,
1183 unsigned DiagID, Preprocessor &PP,
1184 bool IsGNULineDirective=false) {
1185 if (DigitTok.isNot(tok::numeric_constant)) {
1186 PP.Diag(DigitTok, DiagID);
1187
1188 if (DigitTok.isNot(tok::eod))
1189 PP.DiscardUntilEndOfDirective();
1190 return true;
1191 }
1192
1193 SmallString<64> IntegerBuffer;
1194 IntegerBuffer.resize(DigitTok.getLength());
1195 const char *DigitTokBegin = &IntegerBuffer[0];
1196 bool Invalid = false;
1197 unsigned ActualLength = PP.getSpelling(DigitTok, DigitTokBegin, &Invalid);
1198 if (Invalid)
1199 return true;
1200
1201 // Verify that we have a simple digit-sequence, and compute the value. This
1202 // is always a simple digit string computed in decimal, so we do this manually
1203 // here.
1204 Val = 0;
1205 for (unsigned i = 0; i != ActualLength; ++i) {
1206 // C++1y [lex.fcon]p1:
1207 // Optional separating single quotes in a digit-sequence are ignored
1208 if (DigitTokBegin[i] == '\'')
1209 continue;
1210
1211 if (!isDigit(DigitTokBegin[i])) {
1212 PP.Diag(PP.AdvanceToTokenCharacter(DigitTok.getLocation(), i),
1213 diag::err_pp_line_digit_sequence) << IsGNULineDirective;
1214 PP.DiscardUntilEndOfDirective();
1215 return true;
1216 }
1217
1218 unsigned NextVal = Val*10+(DigitTokBegin[i]-'0');
1219 if (NextVal < Val) { // overflow.
1220 PP.Diag(DigitTok, DiagID);
1221 PP.DiscardUntilEndOfDirective();
1222 return true;
1223 }
1224 Val = NextVal;
1225 }
1226
1227 if (DigitTokBegin[0] == '0' && Val)
1228 PP.Diag(DigitTok.getLocation(), diag::warn_pp_line_decimal)
1229 << IsGNULineDirective;
1230
1231 return false;
1232}
1233
1234/// Handle a \#line directive: C99 6.10.4.
1235///
1236/// The two acceptable forms are:
1237/// \verbatim
1238/// # line digit-sequence
1239/// # line digit-sequence "s-char-sequence"
1240/// \endverbatim
1241void Preprocessor::HandleLineDirective() {
1242 // Read the line # and string argument. Per C99 6.10.4p5, these tokens are
1243 // expanded.
1244 Token DigitTok;
1245 Lex(DigitTok);
1246
1247 // Validate the number and convert it to an unsigned.
1248 unsigned LineNo;
1249 if (GetLineValue(DigitTok, LineNo, diag::err_pp_line_requires_integer,*this))
1250 return;
1251
1252 if (LineNo == 0)
1253 Diag(DigitTok, diag::ext_pp_line_zero);
1254
1255 // Enforce C99 6.10.4p3: "The digit sequence shall not specify ... a
1256 // number greater than 2147483647". C90 requires that the line # be <= 32767.
1257 unsigned LineLimit = 32768U;
1258 if (LangOpts.C99 || LangOpts.CPlusPlus11)
1259 LineLimit = 2147483648U;
1260 if (LineNo >= LineLimit)
1261 Diag(DigitTok, diag::ext_pp_line_too_big) << LineLimit;
1262 else if (LangOpts.CPlusPlus11 && LineNo >= 32768U)
1263 Diag(DigitTok, diag::warn_cxx98_compat_pp_line_too_big);
1264
1265 int FilenameID = -1;
1266 Token StrTok;
1267 Lex(StrTok);
1268
1269 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a
1270 // string followed by eod.
1271 if (StrTok.is(tok::eod))
1272 ; // ok
1273 else if (StrTok.isNot(tok::string_literal)) {
1274 Diag(StrTok, diag::err_pp_line_invalid_filename);
1275 DiscardUntilEndOfDirective();
1276 return;
1277 } else if (StrTok.hasUDSuffix()) {
1278 Diag(StrTok, diag::err_invalid_string_udl);
1279 DiscardUntilEndOfDirective();
1280 return;
1281 } else {
1282 // Parse and validate the string, converting it into a unique ID.
1283 StringLiteralParser Literal(StrTok, *this);
1284 assert(Literal.isAscii() && "Didn't allow wide strings in")((void)0);
1285 if (Literal.hadError) {
1286 DiscardUntilEndOfDirective();
1287 return;
1288 }
1289 if (Literal.Pascal) {
1290 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1291 DiscardUntilEndOfDirective();
1292 return;
1293 }
1294 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
1295
1296 // Verify that there is nothing after the string, other than EOD. Because
1297 // of C99 6.10.4p5, macros that expand to empty tokens are ok.
1298 CheckEndOfDirective("line", true);
1299 }
1300
1301 // Take the file kind of the file containing the #line directive. #line
1302 // directives are often used for generated sources from the same codebase, so
1303 // the new file should generally be classified the same way as the current
1304 // file. This is visible in GCC's pre-processed output, which rewrites #line
1305 // to GNU line markers.
1306 SrcMgr::CharacteristicKind FileKind =
1307 SourceMgr.getFileCharacteristic(DigitTok.getLocation());
1308
1309 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, false,
1310 false, FileKind);
1311
1312 if (Callbacks)
1313 Callbacks->FileChanged(CurPPLexer->getSourceLocation(),
1314 PPCallbacks::RenameFile, FileKind);
1315}
1316
1317/// ReadLineMarkerFlags - Parse and validate any flags at the end of a GNU line
1318/// marker directive.
1319static bool ReadLineMarkerFlags(bool &IsFileEntry, bool &IsFileExit,
1320 SrcMgr::CharacteristicKind &FileKind,
1321 Preprocessor &PP) {
1322 unsigned FlagVal;
1323 Token FlagTok;
1324 PP.Lex(FlagTok);
1325 if (FlagTok.is(tok::eod)) return false;
1326 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
1327 return true;
1328
1329 if (FlagVal == 1) {
1330 IsFileEntry = true;
1331
1332 PP.Lex(FlagTok);
1333 if (FlagTok.is(tok::eod)) return false;
1334 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1335 return true;
1336 } else if (FlagVal == 2) {
1337 IsFileExit = true;
1338
1339 SourceManager &SM = PP.getSourceManager();
1340 // If we are leaving the current presumed file, check to make sure the
1341 // presumed include stack isn't empty!
1342 FileID CurFileID =
1343 SM.getDecomposedExpansionLoc(FlagTok.getLocation()).first;
1344 PresumedLoc PLoc = SM.getPresumedLoc(FlagTok.getLocation());
1345 if (PLoc.isInvalid())
1346 return true;
1347
1348 // If there is no include loc (main file) or if the include loc is in a
1349 // different physical file, then we aren't in a "1" line marker flag region.
1350 SourceLocation IncLoc = PLoc.getIncludeLoc();
1351 if (IncLoc.isInvalid() ||
1352 SM.getDecomposedExpansionLoc(IncLoc).first != CurFileID) {
1353 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_pop);
1354 PP.DiscardUntilEndOfDirective();
1355 return true;
1356 }
1357
1358 PP.Lex(FlagTok);
1359 if (FlagTok.is(tok::eod)) return false;
1360 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag,PP))
1361 return true;
1362 }
1363
1364 // We must have 3 if there are still flags.
1365 if (FlagVal != 3) {
1366 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
1367 PP.DiscardUntilEndOfDirective();
1368 return true;
1369 }
1370
1371 FileKind = SrcMgr::C_System;
1372
1373 PP.Lex(FlagTok);
1374 if (FlagTok.is(tok::eod)) return false;
1375 if (GetLineValue(FlagTok, FlagVal, diag::err_pp_linemarker_invalid_flag, PP))
1376 return true;
1377
1378 // We must have 4 if there is yet another flag.
1379 if (FlagVal != 4) {
1380 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
1381 PP.DiscardUntilEndOfDirective();
1382 return true;
1383 }
1384
1385 FileKind = SrcMgr::C_ExternCSystem;
1386
1387 PP.Lex(FlagTok);
1388 if (FlagTok.is(tok::eod)) return false;
1389
1390 // There are no more valid flags here.
1391 PP.Diag(FlagTok, diag::err_pp_linemarker_invalid_flag);
1392 PP.DiscardUntilEndOfDirective();
1393 return true;
1394}
1395
1396/// HandleDigitDirective - Handle a GNU line marker directive, whose syntax is
1397/// one of the following forms:
1398///
1399/// # 42
1400/// # 42 "file" ('1' | '2')?
1401/// # 42 "file" ('1' | '2')? '3' '4'?
1402///
1403void Preprocessor::HandleDigitDirective(Token &DigitTok) {
1404 // Validate the number and convert it to an unsigned. GNU does not have a
1405 // line # limit other than it fit in 32-bits.
1406 unsigned LineNo;
1407 if (GetLineValue(DigitTok, LineNo, diag::err_pp_linemarker_requires_integer,
1408 *this, true))
1409 return;
1410
1411 Token StrTok;
1412 Lex(StrTok);
1413
1414 bool IsFileEntry = false, IsFileExit = false;
1415 int FilenameID = -1;
1416 SrcMgr::CharacteristicKind FileKind = SrcMgr::C_User;
1417
1418 // If the StrTok is "eod", then it wasn't present. Otherwise, it must be a
1419 // string followed by eod.
1420 if (StrTok.is(tok::eod)) {
1421 // Treat this like "#line NN", which doesn't change file characteristics.
1422 FileKind = SourceMgr.getFileCharacteristic(DigitTok.getLocation());
1423 } else if (StrTok.isNot(tok::string_literal)) {
1424 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1425 DiscardUntilEndOfDirective();
1426 return;
1427 } else if (StrTok.hasUDSuffix()) {
1428 Diag(StrTok, diag::err_invalid_string_udl);
1429 DiscardUntilEndOfDirective();
1430 return;
1431 } else {
1432 // Parse and validate the string, converting it into a unique ID.
1433 StringLiteralParser Literal(StrTok, *this);
1434 assert(Literal.isAscii() && "Didn't allow wide strings in")((void)0);
1435 if (Literal.hadError) {
1436 DiscardUntilEndOfDirective();
1437 return;
1438 }
1439 if (Literal.Pascal) {
1440 Diag(StrTok, diag::err_pp_linemarker_invalid_filename);
1441 DiscardUntilEndOfDirective();
1442 return;
1443 }
1444 FilenameID = SourceMgr.getLineTableFilenameID(Literal.GetString());
1445
1446 // If a filename was present, read any flags that are present.
1447 if (ReadLineMarkerFlags(IsFileEntry, IsFileExit, FileKind, *this))
1448 return;
1449 }
1450
1451 // Create a line note with this information.
1452 SourceMgr.AddLineNote(DigitTok.getLocation(), LineNo, FilenameID, IsFileEntry,
1453 IsFileExit, FileKind);
1454
1455 // If the preprocessor has callbacks installed, notify them of the #line
1456 // change. This is used so that the line marker comes out in -E mode for
1457 // example.
1458 if (Callbacks) {
1459 PPCallbacks::FileChangeReason Reason = PPCallbacks::RenameFile;
1460 if (IsFileEntry)
1461 Reason = PPCallbacks::EnterFile;
1462 else if (IsFileExit)
1463 Reason = PPCallbacks::ExitFile;
1464
1465 Callbacks->FileChanged(CurPPLexer->getSourceLocation(), Reason, FileKind);
1466 }
1467}
1468
1469/// HandleUserDiagnosticDirective - Handle a #warning or #error directive.
1470///
1471void Preprocessor::HandleUserDiagnosticDirective(Token &Tok,
1472 bool isWarning) {
1473 // Read the rest of the line raw. We do this because we don't want macros
1474 // to be expanded and we don't require that the tokens be valid preprocessing
1475 // tokens. For example, this is allowed: "#warning ` 'foo". GCC does
1476 // collapse multiple consecutive white space between tokens, but this isn't
1477 // specified by the standard.
1478 SmallString<128> Message;
1479 CurLexer->ReadToEndOfLine(&Message);
1480
1481 // Find the first non-whitespace character, so that we can make the
1482 // diagnostic more succinct.
1483 StringRef Msg = Message.str().ltrim(' ');
1484
1485 if (isWarning)
1486 Diag(Tok, diag::pp_hash_warning) << Msg;
1487 else
1488 Diag(Tok, diag::err_pp_hash_error) << Msg;
1489}
1490
1491/// HandleIdentSCCSDirective - Handle a #ident/#sccs directive.
1492///
1493void Preprocessor::HandleIdentSCCSDirective(Token &Tok) {
1494 // Yes, this directive is an extension.
1495 Diag(Tok, diag::ext_pp_ident_directive);
1496
1497 // Read the string argument.
1498 Token StrTok;
1499 Lex(StrTok);
1500
1501 // If the token kind isn't a string, it's a malformed directive.
1502 if (StrTok.isNot(tok::string_literal) &&
1503 StrTok.isNot(tok::wide_string_literal)) {
1504 Diag(StrTok, diag::err_pp_malformed_ident);
1505 if (StrTok.isNot(tok::eod))
1506 DiscardUntilEndOfDirective();
1507 return;
1508 }
1509
1510 if (StrTok.hasUDSuffix()) {
1511 Diag(StrTok, diag::err_invalid_string_udl);
1512 DiscardUntilEndOfDirective();
1513 return;
1514 }
1515
1516 // Verify that there is nothing after the string, other than EOD.
1517 CheckEndOfDirective("ident");
1518
1519 if (Callbacks) {
1520 bool Invalid = false;
1521 std::string Str = getSpelling(StrTok, &Invalid);
1522 if (!Invalid)
1523 Callbacks->Ident(Tok.getLocation(), Str);
1524 }
1525}
1526
1527/// Handle a #public directive.
1528void Preprocessor::HandleMacroPublicDirective(Token &Tok) {
1529 Token MacroNameTok;
1530 ReadMacroName(MacroNameTok, MU_Undef);
1531
1532 // Error reading macro name? If so, diagnostic already issued.
1533 if (MacroNameTok.is(tok::eod))
1534 return;
1535
1536 // Check to see if this is the last token on the #__public_macro line.
1537 CheckEndOfDirective("__public_macro");
1538
1539 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
1540 // Okay, we finally have a valid identifier to undef.
1541 MacroDirective *MD = getLocalMacroDirective(II);
1542
1543 // If the macro is not defined, this is an error.
1544 if (!MD) {
1545 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
1546 return;
1547 }
1548
1549 // Note that this macro has now been exported.
1550 appendMacroDirective(II, AllocateVisibilityMacroDirective(
1551 MacroNameTok.getLocation(), /*isPublic=*/true));
1552}
1553
1554/// Handle a #private directive.
1555void Preprocessor::HandleMacroPrivateDirective() {
1556 Token MacroNameTok;
1557 ReadMacroName(MacroNameTok, MU_Undef);
1558
1559 // Error reading macro name? If so, diagnostic already issued.
1560 if (MacroNameTok.is(tok::eod))
1561 return;
1562
1563 // Check to see if this is the last token on the #__private_macro line.
1564 CheckEndOfDirective("__private_macro");
1565
1566 IdentifierInfo *II = MacroNameTok.getIdentifierInfo();
1567 // Okay, we finally have a valid identifier to undef.
1568 MacroDirective *MD = getLocalMacroDirective(II);
1569
1570 // If the macro is not defined, this is an error.
1571 if (!MD) {
1572 Diag(MacroNameTok, diag::err_pp_visibility_non_macro) << II;
1573 return;
1574 }
1575
1576 // Note that this macro has now been marked private.
1577 appendMacroDirective(II, AllocateVisibilityMacroDirective(
1578 MacroNameTok.getLocation(), /*isPublic=*/false));
1579}
1580
1581//===----------------------------------------------------------------------===//
1582// Preprocessor Include Directive Handling.
1583//===----------------------------------------------------------------------===//
1584
1585/// GetIncludeFilenameSpelling - Turn the specified lexer token into a fully
1586/// checked and spelled filename, e.g. as an operand of \#include. This returns
1587/// true if the input filename was in <>'s or false if it were in ""'s. The
1588/// caller is expected to provide a buffer that is large enough to hold the
1589/// spelling of the filename, but is also expected to handle the case when
1590/// this method decides to use a different buffer.
1591bool Preprocessor::GetIncludeFilenameSpelling(SourceLocation Loc,
1592 StringRef &Buffer) {
1593 // Get the text form of the filename.
1594 assert(!Buffer.empty() && "Can't have tokens with empty spellings!")((void)0);
1595
1596 // FIXME: Consider warning on some of the cases described in C11 6.4.7/3 and
1597 // C++20 [lex.header]/2:
1598 //
1599 // If `"`, `'`, `\`, `/*`, or `//` appears in a header-name, then
1600 // in C: behavior is undefined
1601 // in C++: program is conditionally-supported with implementation-defined
1602 // semantics
1603
1604 // Make sure the filename is <x> or "x".
1605 bool isAngled;
1606 if (Buffer[0] == '<') {
1607 if (Buffer.back() != '>') {
1608 Diag(Loc, diag::err_pp_expects_filename);
1609 Buffer = StringRef();
1610 return true;
1611 }
1612 isAngled = true;
1613 } else if (Buffer[0] == '"') {
1614 if (Buffer.back() != '"') {
1615 Diag(Loc, diag::err_pp_expects_filename);
1616 Buffer = StringRef();
1617 return true;
1618 }
1619 isAngled = false;
1620 } else {
1621 Diag(Loc, diag::err_pp_expects_filename);
1622 Buffer = StringRef();
1623 return true;
1624 }
1625
1626 // Diagnose #include "" as invalid.
1627 if (Buffer.size() <= 2) {
1628 Diag(Loc, diag::err_pp_empty_filename);
1629 Buffer = StringRef();
1630 return true;
1631 }
1632
1633 // Skip the brackets.
1634 Buffer = Buffer.substr(1, Buffer.size()-2);
1635 return isAngled;
1636}
1637
1638/// Push a token onto the token stream containing an annotation.
1639void Preprocessor::EnterAnnotationToken(SourceRange Range,
1640 tok::TokenKind Kind,
1641 void *AnnotationVal) {
1642 // FIXME: Produce this as the current token directly, rather than
1643 // allocating a new token for it.
1644 auto Tok = std::make_unique<Token[]>(1);
1645 Tok[0].startToken();
1646 Tok[0].setKind(Kind);
1647 Tok[0].setLocation(Range.getBegin());
1648 Tok[0].setAnnotationEndLoc(Range.getEnd());
1649 Tok[0].setAnnotationValue(AnnotationVal);
1650 EnterTokenStream(std::move(Tok), 1, true, /*IsReinject*/ false);
1651}
1652
1653/// Produce a diagnostic informing the user that a #include or similar
1654/// was implicitly treated as a module import.
1655static void diagnoseAutoModuleImport(
1656 Preprocessor &PP, SourceLocation HashLoc, Token &IncludeTok,
1657 ArrayRef<std::pair<IdentifierInfo *, SourceLocation>> Path,
1658 SourceLocation PathEnd) {
1659 StringRef ImportKeyword;
1660 if (PP.getLangOpts().ObjC)
1661 ImportKeyword = "@import";
1662 else if (PP.getLangOpts().ModulesTS || PP.getLangOpts().CPlusPlusModules)
1663 ImportKeyword = "import";
1664 else
1665 return; // no import syntax available
1666
1667 SmallString<128> PathString;
1668 for (size_t I = 0, N = Path.size(); I != N; ++I) {
1669 if (I)
1670 PathString += '.';
1671 PathString += Path[I].first->getName();
1672 }
1673 int IncludeKind = 0;
1674
1675 switch (IncludeTok.getIdentifierInfo()->getPPKeywordID()) {
1676 case tok::pp_include:
1677 IncludeKind = 0;
1678 break;
1679
1680 case tok::pp_import:
1681 IncludeKind = 1;
1682 break;
1683
1684 case tok::pp_include_next:
1685 IncludeKind = 2;
1686 break;
1687
1688 case tok::pp___include_macros:
1689 IncludeKind = 3;
1690 break;
1691
1692 default:
1693 llvm_unreachable("unknown include directive kind")__builtin_unreachable();
1694 }
1695
1696 CharSourceRange ReplaceRange(SourceRange(HashLoc, PathEnd),
1697 /*IsTokenRange=*/false);
1698 PP.Diag(HashLoc, diag::warn_auto_module_import)
1699 << IncludeKind << PathString
1700 << FixItHint::CreateReplacement(
1701 ReplaceRange, (ImportKeyword + " " + PathString + ";").str());
1702}
1703
1704// Given a vector of path components and a string containing the real
1705// path to the file, build a properly-cased replacement in the vector,
1706// and return true if the replacement should be suggested.
1707static bool trySimplifyPath(SmallVectorImpl<StringRef> &Components,
1708 StringRef RealPathName) {
1709 auto RealPathComponentIter = llvm::sys::path::rbegin(RealPathName);
1710 auto RealPathComponentEnd = llvm::sys::path::rend(RealPathName);
1711 int Cnt = 0;
1712 bool SuggestReplacement = false;
1713 // Below is a best-effort to handle ".." in paths. It is admittedly
1714 // not 100% correct in the presence of symlinks.
1715 for (auto &Component : llvm::reverse(Components)) {
1716 if ("." == Component) {
1717 } else if (".." == Component) {
1718 ++Cnt;
1719 } else if (Cnt) {
1720 --Cnt;
1721 } else if (RealPathComponentIter != RealPathComponentEnd) {
1722 if (Component != *RealPathComponentIter) {
1723 // If these path components differ by more than just case, then we
1724 // may be looking at symlinked paths. Bail on this diagnostic to avoid
1725 // noisy false positives.
1726 SuggestReplacement =
1727 RealPathComponentIter->equals_insensitive(Component);
1728 if (!SuggestReplacement)
1729 break;
1730 Component = *RealPathComponentIter;
1731 }
1732 ++RealPathComponentIter;
1733 }
1734 }
1735 return SuggestReplacement;
1736}
1737
1738bool Preprocessor::checkModuleIsAvailable(const LangOptions &LangOpts,
1739 const TargetInfo &TargetInfo,
1740 DiagnosticsEngine &Diags, Module *M) {
1741 Module::Requirement Requirement;
1742 Module::UnresolvedHeaderDirective MissingHeader;
1743 Module *ShadowingModule = nullptr;
1744 if (M->isAvailable(LangOpts, TargetInfo, Requirement, MissingHeader,
1745 ShadowingModule))
1746 return false;
1747
1748 if (MissingHeader.FileNameLoc.isValid()) {
1749 Diags.Report(MissingHeader.FileNameLoc, diag::err_module_header_missing)
1750 << MissingHeader.IsUmbrella << MissingHeader.FileName;
1751 } else if (ShadowingModule) {
1752 Diags.Report(M->DefinitionLoc, diag::err_module_shadowed) << M->Name;
1753 Diags.Report(ShadowingModule->DefinitionLoc,
1754 diag::note_previous_definition);
1755 } else {
1756 // FIXME: Track the location at which the requirement was specified, and
1757 // use it here.
1758 Diags.Report(M->DefinitionLoc, diag::err_module_unavailable)
1759 << M->getFullModuleName() << Requirement.second << Requirement.first;
1760 }
1761 return true;
1762}
1763
1764/// HandleIncludeDirective - The "\#include" tokens have just been read, read
1765/// the file to be included from the lexer, then include it! This is a common
1766/// routine with functionality shared between \#include, \#include_next and
1767/// \#import. LookupFrom is set when this is a \#include_next directive, it
1768/// specifies the file to start searching from.
1769void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
1770 Token &IncludeTok,
1771 const DirectoryLookup *LookupFrom,
1772 const FileEntry *LookupFromFile) {
1773 Token FilenameTok;
1774 if (LexHeaderName(FilenameTok))
1775 return;
1776
1777 if (FilenameTok.isNot(tok::header_name)) {
1778 Diag(FilenameTok.getLocation(), diag::err_pp_expects_filename);
1779 if (FilenameTok.isNot(tok::eod))
1780 DiscardUntilEndOfDirective();
1781 return;
1782 }
1783
1784 // Verify that there is nothing after the filename, other than EOD. Note
1785 // that we allow macros that expand to nothing after the filename, because
1786 // this falls into the category of "#include pp-tokens new-line" specified
1787 // in C99 6.10.2p4.
1788 SourceLocation EndLoc =
1789 CheckEndOfDirective(IncludeTok.getIdentifierInfo()->getNameStart(), true);
1790
1791 auto Action = HandleHeaderIncludeOrImport(HashLoc, IncludeTok, FilenameTok,
1792 EndLoc, LookupFrom, LookupFromFile);
1793 switch (Action.Kind) {
1794 case ImportAction::None:
1795 case ImportAction::SkippedModuleImport:
1796 break;
1797 case ImportAction::ModuleBegin:
1798 EnterAnnotationToken(SourceRange(HashLoc, EndLoc),
1799 tok::annot_module_begin, Action.ModuleForHeader);
1800 break;
1801 case ImportAction::ModuleImport:
1802 EnterAnnotationToken(SourceRange(HashLoc, EndLoc),
1803 tok::annot_module_include, Action.ModuleForHeader);
1804 break;
1805 case ImportAction::Failure:
1806 assert(TheModuleLoader.HadFatalFailure &&((void)0)
1807 "This should be an early exit only to a fatal error")((void)0);
1808 TheModuleLoader.HadFatalFailure = true;
1809 IncludeTok.setKind(tok::eof);
1810 CurLexer->cutOffLexing();
1811 return;
1812 }
1813}
1814
1815Optional<FileEntryRef> Preprocessor::LookupHeaderIncludeOrImport(
1816 const DirectoryLookup *&CurDir, StringRef& Filename,
1817 SourceLocation FilenameLoc, CharSourceRange FilenameRange,
1818 const Token &FilenameTok, bool &IsFrameworkFound, bool IsImportDecl,
1819 bool &IsMapped, const DirectoryLookup *LookupFrom,
1820 const FileEntry *LookupFromFile, StringRef& LookupFilename,
1821 SmallVectorImpl<char> &RelativePath, SmallVectorImpl<char> &SearchPath,
1822 ModuleMap::KnownHeader &SuggestedModule, bool isAngled) {
1823 Optional<FileEntryRef> File = LookupFile(
1824 FilenameLoc, LookupFilename,
1825 isAngled, LookupFrom, LookupFromFile, CurDir,
1826 Callbacks ? &SearchPath : nullptr, Callbacks ? &RelativePath : nullptr,
1827 &SuggestedModule, &IsMapped, &IsFrameworkFound);
1828 if (File)
1829 return File;
1830
1831 if (Callbacks) {
1832 // Give the clients a chance to recover.
1833 SmallString<128> RecoveryPath;
1834 if (Callbacks->FileNotFound(Filename, RecoveryPath)) {
1835 if (auto DE = FileMgr.getOptionalDirectoryRef(RecoveryPath)) {
1836 // Add the recovery path to the list of search paths.
1837 DirectoryLookup DL(*DE, SrcMgr::C_User, false);
1838 HeaderInfo.AddSearchPath(DL, isAngled);
1839
1840 // Try the lookup again, skipping the cache.
1841 Optional<FileEntryRef> File = LookupFile(
1842 FilenameLoc,
1843 LookupFilename, isAngled,
1844 LookupFrom, LookupFromFile, CurDir, nullptr, nullptr,
1845 &SuggestedModule, &IsMapped, /*IsFrameworkFound=*/nullptr,
1846 /*SkipCache*/ true);
1847 if (File)
1848 return File;
1849 }
1850 }
1851 }
1852
1853 if (SuppressIncludeNotFoundError)
1854 return None;
1855
1856 // If the file could not be located and it was included via angle
1857 // brackets, we can attempt a lookup as though it were a quoted path to
1858 // provide the user with a possible fixit.
1859 if (isAngled) {
1860 Optional<FileEntryRef> File = LookupFile(
1861 FilenameLoc, LookupFilename,
1862 false, LookupFrom, LookupFromFile, CurDir,
1863 Callbacks ? &SearchPath : nullptr, Callbacks ? &RelativePath : nullptr,
1864 &SuggestedModule, &IsMapped,
1865 /*IsFrameworkFound=*/nullptr);
1866 if (File) {
1867 Diag(FilenameTok, diag::err_pp_file_not_found_angled_include_not_fatal)
1868 << Filename << IsImportDecl
1869 << FixItHint::CreateReplacement(FilenameRange,
1870 "\"" + Filename.str() + "\"");
1871 return File;
1872 }
1873 }
1874
1875 // Check for likely typos due to leading or trailing non-isAlphanumeric
1876 // characters
1877 StringRef OriginalFilename = Filename;
1878 if (LangOpts.SpellChecking) {
1879 // A heuristic to correct a typo file name by removing leading and
1880 // trailing non-isAlphanumeric characters.
1881 auto CorrectTypoFilename = [](llvm::StringRef Filename) {
1882 Filename = Filename.drop_until(isAlphanumeric);
1883 while (!Filename.empty() && !isAlphanumeric(Filename.back())) {
1884 Filename = Filename.drop_back();
1885 }
1886 return Filename;
1887 };
1888 StringRef TypoCorrectionName = CorrectTypoFilename(Filename);
1889 StringRef TypoCorrectionLookupName = CorrectTypoFilename(LookupFilename);
1890
1891 Optional<FileEntryRef> File = LookupFile(
1892 FilenameLoc, TypoCorrectionLookupName, isAngled, LookupFrom, LookupFromFile,
1893 CurDir, Callbacks ? &SearchPath : nullptr,
1894 Callbacks ? &RelativePath : nullptr, &SuggestedModule, &IsMapped,
1895 /*IsFrameworkFound=*/nullptr);
1896 if (File) {
1897 auto Hint =
1898 isAngled ? FixItHint::CreateReplacement(
1899 FilenameRange, "<" + TypoCorrectionName.str() + ">")
1900 : FixItHint::CreateReplacement(
1901 FilenameRange, "\"" + TypoCorrectionName.str() + "\"");
1902 Diag(FilenameTok, diag::err_pp_file_not_found_typo_not_fatal)
1903 << OriginalFilename << TypoCorrectionName << Hint;
1904 // We found the file, so set the Filename to the name after typo
1905 // correction.
1906 Filename = TypoCorrectionName;
1907 LookupFilename = TypoCorrectionLookupName;
1908 return File;
1909 }
1910 }
1911
1912 // If the file is still not found, just go with the vanilla diagnostic
1913 assert(!File.hasValue() && "expected missing file")((void)0);
1914 Diag(FilenameTok, diag::err_pp_file_not_found)
1915 << OriginalFilename << FilenameRange;
1916 if (IsFrameworkFound) {
1917 size_t SlashPos = OriginalFilename.find('/');
1918 assert(SlashPos != StringRef::npos &&((void)0)
1919 "Include with framework name should have '/' in the filename")((void)0);
1920 StringRef FrameworkName = OriginalFilename.substr(0, SlashPos);
1921 FrameworkCacheEntry &CacheEntry =
1922 HeaderInfo.LookupFrameworkCache(FrameworkName);
1923 assert(CacheEntry.Directory && "Found framework should be in cache")((void)0);
1924 Diag(FilenameTok, diag::note_pp_framework_without_header)
1925 << OriginalFilename.substr(SlashPos + 1) << FrameworkName
1926 << CacheEntry.Directory->getName();
1927 }
1928
1929 return None;
1930}
1931
1932/// Handle either a #include-like directive or an import declaration that names
1933/// a header file.
1934///
1935/// \param HashLoc The location of the '#' token for an include, or
1936/// SourceLocation() for an import declaration.
1937/// \param IncludeTok The include / include_next / import token.
1938/// \param FilenameTok The header-name token.
1939/// \param EndLoc The location at which any imported macros become visible.
1940/// \param LookupFrom For #include_next, the starting directory for the
1941/// directory lookup.
1942/// \param LookupFromFile For #include_next, the starting file for the directory
1943/// lookup.
1944Preprocessor::ImportAction Preprocessor::HandleHeaderIncludeOrImport(
1945 SourceLocation HashLoc, Token &IncludeTok, Token &FilenameTok,
1946 SourceLocation EndLoc, const DirectoryLookup *LookupFrom,
1947 const FileEntry *LookupFromFile) {
1948 SmallString<128> FilenameBuffer;
1949 StringRef Filename = getSpelling(FilenameTok, FilenameBuffer);
1950 SourceLocation CharEnd = FilenameTok.getEndLoc();
1951
1952 CharSourceRange FilenameRange
1953 = CharSourceRange::getCharRange(FilenameTok.getLocation(), CharEnd);
1954 StringRef OriginalFilename = Filename;
1955 bool isAngled =
1956 GetIncludeFilenameSpelling(FilenameTok.getLocation(), Filename);
1957
1958 // If GetIncludeFilenameSpelling set the start ptr to null, there was an
1959 // error.
1960 if (Filename.empty())
1961 return {ImportAction::None};
1962
1963 bool IsImportDecl = HashLoc.isInvalid();
1964 SourceLocation StartLoc = IsImportDecl ? IncludeTok.getLocation() : HashLoc;
1965
1966 // Complain about attempts to #include files in an audit pragma.
1967 if (PragmaARCCFCodeAuditedInfo.second.isValid()) {
1968 Diag(StartLoc, diag::err_pp_include_in_arc_cf_code_audited) << IsImportDecl;
1969 Diag(PragmaARCCFCodeAuditedInfo.second, diag::note_pragma_entered_here);
1970
1971 // Immediately leave the pragma.
1972 PragmaARCCFCodeAuditedInfo = {nullptr, SourceLocation()};
1973 }
1974
1975 // Complain about attempts to #include files in an assume-nonnull pragma.
1976 if (PragmaAssumeNonNullLoc.isValid()) {
1977 Diag(StartLoc, diag::err_pp_include_in_assume_nonnull) << IsImportDecl;
1978 Diag(PragmaAssumeNonNullLoc, diag::note_pragma_entered_here);
1979
1980 // Immediately leave the pragma.
1981 PragmaAssumeNonNullLoc = SourceLocation();
1982 }
1983
1984 if (HeaderInfo.HasIncludeAliasMap()) {
1985 // Map the filename with the brackets still attached. If the name doesn't
1986 // map to anything, fall back on the filename we've already gotten the
1987 // spelling for.
1988 StringRef NewName = HeaderInfo.MapHeaderToIncludeAlias(OriginalFilename);
1989 if (!NewName.empty())
1990 Filename = NewName;
1991 }
1992
1993 // Search include directories.
1994 bool IsMapped = false;
1995 bool IsFrameworkFound = false;
1996 const DirectoryLookup *CurDir;
1997 SmallString<1024> SearchPath;
1998 SmallString<1024> RelativePath;
1999 // We get the raw path only if we have 'Callbacks' to which we later pass
2000 // the path.
2001 ModuleMap::KnownHeader SuggestedModule;
2002 SourceLocation FilenameLoc = FilenameTok.getLocation();
2003 StringRef LookupFilename = Filename;
2004
2005#ifdef _WIN32
2006 llvm::sys::path::Style BackslashStyle = llvm::sys::path::Style::windows;
2007#else
2008 // Normalize slashes when compiling with -fms-extensions on non-Windows. This
2009 // is unnecessary on Windows since the filesystem there handles backslashes.
2010 SmallString<128> NormalizedPath;
2011 llvm::sys::path::Style BackslashStyle = llvm::sys::path::Style::posix;
2012 if (LangOpts.MicrosoftExt) {
2013 NormalizedPath = Filename.str();
2014 llvm::sys::path::native(NormalizedPath);
2015 LookupFilename = NormalizedPath;
2016 BackslashStyle = llvm::sys::path::Style::windows;
2017 }
2018#endif
2019
2020 Optional<FileEntryRef> File = LookupHeaderIncludeOrImport(
2021 CurDir, Filename, FilenameLoc, FilenameRange, FilenameTok,
2022 IsFrameworkFound, IsImportDecl, IsMapped, LookupFrom, LookupFromFile,
2023 LookupFilename, RelativePath, SearchPath, SuggestedModule, isAngled);
2024
2025 // Record the header's filename for later use.
2026 if (File)
2027 CurLexer->addInclude(OriginalFilename, File->getFileEntry(), FilenameLoc);
2028
2029 if (usingPCHWithThroughHeader() && SkippingUntilPCHThroughHeader) {
2030 if (File && isPCHThroughHeader(&File->getFileEntry()))
2031 SkippingUntilPCHThroughHeader = false;
2032 return {ImportAction::None};
2033 }
2034
2035 // Should we enter the source file? Set to Skip if either the source file is
2036 // known to have no effect beyond its effect on module visibility -- that is,
2037 // if it's got an include guard that is already defined, set to Import if it
2038 // is a modular header we've already built and should import.
2039 enum { Enter, Import, Skip, IncludeLimitReached } Action = Enter;
2040
2041 if (PPOpts->SingleFileParseMode)
2042 Action = IncludeLimitReached;
2043
2044 // If we've reached the max allowed include depth, it is usually due to an
2045 // include cycle. Don't enter already processed files again as it can lead to
2046 // reaching the max allowed include depth again.
2047 if (Action == Enter && HasReachedMaxIncludeDepth && File &&
2048 HeaderInfo.getFileInfo(&File->getFileEntry()).NumIncludes)
2049 Action = IncludeLimitReached;
2050
2051 // Determine whether we should try to import the module for this #include, if
2052 // there is one. Don't do so if precompiled module support is disabled or we
2053 // are processing this module textually (because we're building the module).
2054 if (Action == Enter && File && SuggestedModule && getLangOpts().Modules &&
2055 !isForModuleBuilding(SuggestedModule.getModule(),
2056 getLangOpts().CurrentModule,
2057 getLangOpts().ModuleName)) {
2058 // If this include corresponds to a module but that module is
2059 // unavailable, diagnose the situation and bail out.
2060 // FIXME: Remove this; loadModule does the same check (but produces
2061 // slightly worse diagnostics).
2062 if (checkModuleIsAvailable(getLangOpts(), getTargetInfo(), getDiagnostics(),
2063 SuggestedModule.getModule())) {
2064 Diag(FilenameTok.getLocation(),
2065 diag::note_implicit_top_level_module_import_here)
2066 << SuggestedModule.getModule()->getTopLevelModuleName();
2067 return {ImportAction::None};
2068 }
2069
2070 // Compute the module access path corresponding to this module.
2071 // FIXME: Should we have a second loadModule() overload to avoid this
2072 // extra lookup step?
2073 SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> Path;
2074 for (Module *Mod = SuggestedModule.getModule(); Mod; Mod = Mod->Parent)
2075 Path.push_back(std::make_pair(getIdentifierInfo(Mod->Name),
2076 FilenameTok.getLocation()));
2077 std::reverse(Path.begin(), Path.end());
2078
2079 // Warn that we're replacing the include/import with a module import.
2080 if (!IsImportDecl)
2081 diagnoseAutoModuleImport(*this, StartLoc, IncludeTok, Path, CharEnd);
2082
2083 // Load the module to import its macros. We'll make the declarations
2084 // visible when the parser gets here.
2085 // FIXME: Pass SuggestedModule in here rather than converting it to a path
2086 // and making the module loader convert it back again.
2087 ModuleLoadResult Imported = TheModuleLoader.loadModule(
2088 IncludeTok.getLocation(), Path, Module::Hidden,
2089 /*IsInclusionDirective=*/true);
2090 assert((Imported == nullptr || Imported == SuggestedModule.getModule()) &&((void)0)
2091 "the imported module is different than the suggested one")((void)0);
2092
2093 if (Imported) {
2094 Action = Import;
2095 } else if (Imported.isMissingExpected()) {
2096 // We failed to find a submodule that we assumed would exist (because it
2097 // was in the directory of an umbrella header, for instance), but no
2098 // actual module containing it exists (because the umbrella header is
2099 // incomplete). Treat this as a textual inclusion.
2100 SuggestedModule = ModuleMap::KnownHeader();
2101 } else if (Imported.isConfigMismatch()) {
2102 // On a configuration mismatch, enter the header textually. We still know
2103 // that it's part of the corresponding module.
2104 } else {
2105 // We hit an error processing the import. Bail out.
2106 if (hadModuleLoaderFatalFailure()) {
2107 // With a fatal failure in the module loader, we abort parsing.
2108 Token &Result = IncludeTok;
2109 assert(CurLexer && "#include but no current lexer set!")((void)0);
2110 Result.startToken();
2111 CurLexer->FormTokenWithChars(Result, CurLexer->BufferEnd, tok::eof);
2112 CurLexer->cutOffLexing();
2113 }
2114 return {ImportAction::None};
2115 }
2116 }
2117
2118 // The #included file will be considered to be a system header if either it is
2119 // in a system include directory, or if the #includer is a system include
2120 // header.
2121 SrcMgr::CharacteristicKind FileCharacter =
2122 SourceMgr.getFileCharacteristic(FilenameTok.getLocation());
2123 if (File)
2124 FileCharacter = std::max(HeaderInfo.getFileDirFlavor(&File->getFileEntry()),
2125 FileCharacter);
2126
2127 // If this is a '#import' or an import-declaration, don't re-enter the file.
2128 //
2129 // FIXME: If we have a suggested module for a '#include', and we've already
2130 // visited this file, don't bother entering it again. We know it has no
2131 // further effect.
2132 bool EnterOnce =
2133 IsImportDecl ||
2134 IncludeTok.getIdentifierInfo()->getPPKeywordID() == tok::pp_import;
2135
2136 // Ask HeaderInfo if we should enter this #include file. If not, #including
2137 // this file will have no effect.
2138 if (Action == Enter && File &&
2139 !HeaderInfo.ShouldEnterIncludeFile(*this, &File->getFileEntry(),
2140 EnterOnce, getLangOpts().Modules,
2141 SuggestedModule.getModule())) {
2142 // Even if we've already preprocessed this header once and know that we
2143 // don't need to see its contents again, we still need to import it if it's
2144 // modular because we might not have imported it from this submodule before.
2145 //
2146 // FIXME: We don't do this when compiling a PCH because the AST
2147 // serialization layer can't cope with it. This means we get local
2148 // submodule visibility semantics wrong in that case.
2149 Action = (SuggestedModule && !getLangOpts().CompilingPCH) ? Import : Skip;
2150 }
2151
2152 // Check for circular inclusion of the main file.
2153 // We can't generate a consistent preamble with regard to the conditional
2154 // stack if the main file is included again as due to the preamble bounds
2155 // some directives (e.g. #endif of a header guard) will never be seen.
2156 // Since this will lead to confusing errors, avoid the inclusion.
2157 if (Action == Enter && File && PreambleConditionalStack.isRecording() &&
2158 SourceMgr.isMainFile(File->getFileEntry())) {
2159 Diag(FilenameTok.getLocation(),
2160 diag::err_pp_including_mainfile_in_preamble);
2161 return {ImportAction::None};
2162 }
2163
2164 if (Callbacks && !IsImportDecl) {
2165 // Notify the callback object that we've seen an inclusion directive.
2166 // FIXME: Use a different callback for a pp-import?
2167 Callbacks->InclusionDirective(
2168 HashLoc, IncludeTok, LookupFilename, isAngled, FilenameRange,
2169 File ? &File->getFileEntry() : nullptr, SearchPath, RelativePath,
2170 Action == Import ? SuggestedModule.getModule() : nullptr,
2171 FileCharacter);
2172 if (Action == Skip && File)
2173 Callbacks->FileSkipped(*File, FilenameTok, FileCharacter);
2174 }
2175
2176 if (!File)
2177 return {ImportAction::None};
2178
2179 // If this is a C++20 pp-import declaration, diagnose if we didn't find any
2180 // module corresponding to the named header.
2181 if (IsImportDecl && !SuggestedModule) {
2182 Diag(FilenameTok, diag::err_header_import_not_header_unit)
2183 << OriginalFilename << File->getName();
2184 return {ImportAction::None};
2185 }
2186
2187 // Issue a diagnostic if the name of the file on disk has a different case
2188 // than the one we're about to open.
2189 const bool CheckIncludePathPortability =
2190 !IsMapped && !File->getFileEntry().tryGetRealPathName().empty();
2191
2192 if (CheckIncludePathPortability) {
2193 StringRef Name = LookupFilename;
2194 StringRef NameWithoriginalSlashes = Filename;
2195#if defined(_WIN32)
2196 // Skip UNC prefix if present. (tryGetRealPathName() always
2197 // returns a path with the prefix skipped.)
2198 bool NameWasUNC = Name.consume_front("\\\\?\\");
2199 NameWithoriginalSlashes.consume_front("\\\\?\\");
2200#endif
2201 StringRef RealPathName = File->getFileEntry().tryGetRealPathName();
2202 SmallVector<StringRef, 16> Components(llvm::sys::path::begin(Name),
2203 llvm::sys::path::end(Name));
2204#if defined(_WIN32)
2205 // -Wnonportable-include-path is designed to diagnose includes using
2206 // case even on systems with a case-insensitive file system.
2207 // On Windows, RealPathName always starts with an upper-case drive
2208 // letter for absolute paths, but Name might start with either
2209 // case depending on if `cd c:\foo` or `cd C:\foo` was used in the shell.
2210 // ("foo" will always have on-disk case, no matter which case was
2211 // used in the cd command). To not emit this warning solely for
2212 // the drive letter, whose case is dependent on if `cd` is used
2213 // with upper- or lower-case drive letters, always consider the
2214 // given drive letter case as correct for the purpose of this warning.
2215 SmallString<128> FixedDriveRealPath;
2216 if (llvm::sys::path::is_absolute(Name) &&
2217 llvm::sys::path::is_absolute(RealPathName) &&
2218 toLowercase(Name[0]) == toLowercase(RealPathName[0]) &&
2219 isLowercase(Name[0]) != isLowercase(RealPathName[0])) {
2220 assert(Components.size() >= 3 && "should have drive, backslash, name")((void)0);
2221 assert(Components[0].size() == 2 && "should start with drive")((void)0);
2222 assert(Components[0][1] == ':' && "should have colon")((void)0);
2223 FixedDriveRealPath = (Name.substr(0, 1) + RealPathName.substr(1)).str();
2224 RealPathName = FixedDriveRealPath;
2225 }
2226#endif
2227
2228 if (trySimplifyPath(Components, RealPathName)) {
2229 SmallString<128> Path;
2230 Path.reserve(Name.size()+2);
2231 Path.push_back(isAngled ? '<' : '"');
2232
2233 const auto IsSep = [BackslashStyle](char c) {
2234 return llvm::sys::path::is_separator(c, BackslashStyle);
2235 };
2236
2237 for (auto Component : Components) {
2238 // On POSIX, Components will contain a single '/' as first element
2239 // exactly if Name is an absolute path.
2240 // On Windows, it will contain "C:" followed by '\' for absolute paths.
2241 // The drive letter is optional for absolute paths on Windows, but
2242 // clang currently cannot process absolute paths in #include lines that
2243 // don't have a drive.
2244 // If the first entry in Components is a directory separator,
2245 // then the code at the bottom of this loop that keeps the original
2246 // directory separator style copies it. If the second entry is
2247 // a directory separator (the C:\ case), then that separator already
2248 // got copied when the C: was processed and we want to skip that entry.
2249 if (!(Component.size() == 1 && IsSep(Component[0])))
2250 Path.append(Component);
2251 else if (!Path.empty())
2252 continue;
2253
2254 // Append the separator(s) the user used, or the close quote
2255 if (Path.size() > NameWithoriginalSlashes.size()) {
2256 Path.push_back(isAngled ? '>' : '"');
2257 continue;
2258 }
2259 assert(IsSep(NameWithoriginalSlashes[Path.size()-1]))((void)0);
2260 do
2261 Path.push_back(NameWithoriginalSlashes[Path.size()-1]);
2262 while (Path.size() <= NameWithoriginalSlashes.size() &&
2263 IsSep(NameWithoriginalSlashes[Path.size()-1]));
2264 }
2265
2266#if defined(_WIN32)
2267 // Restore UNC prefix if it was there.
2268 if (NameWasUNC)
2269 Path = (Path.substr(0, 1) + "\\\\?\\" + Path.substr(1)).str();
2270#endif
2271
2272 // For user files and known standard headers, issue a diagnostic.
2273 // For other system headers, don't. They can be controlled separately.
2274 auto DiagId =
2275 (FileCharacter == SrcMgr::C_User || warnByDefaultOnWrongCase(Name))
2276 ? diag::pp_nonportable_path
2277 : diag::pp_nonportable_system_path;
2278 Diag(FilenameTok, DiagId) << Path <<
2279 FixItHint::CreateReplacement(FilenameRange, Path);
2280 }
2281 }
2282
2283 switch (Action) {
2284 case Skip:
2285 // If we don't need to enter the file, stop now.
2286 if (Module *M = SuggestedModule.getModule())
2287 return {ImportAction::SkippedModuleImport, M};
2288 return {ImportAction::None};
2289
2290 case IncludeLimitReached:
2291 // If we reached our include limit and don't want to enter any more files,
2292 // don't go any further.
2293 return {ImportAction::None};
2294
2295 case Import: {
2296 // If this is a module import, make it visible if needed.
2297 Module *M = SuggestedModule.getModule();
2298 assert(M && "no module to import")((void)0);
2299
2300 makeModuleVisible(M, EndLoc);
2301
2302 if (IncludeTok.getIdentifierInfo()->getPPKeywordID() ==
2303 tok::pp___include_macros)
2304 return {ImportAction::None};
2305
2306 return {ImportAction::ModuleImport, M};
2307 }
2308
2309 case Enter:
2310 break;
2311 }
2312
2313 // Check that we don't have infinite #include recursion.
2314 if (IncludeMacroStack.size() == MaxAllowedIncludeStackDepth-1) {
2315 Diag(FilenameTok, diag::err_pp_include_too_deep);
2316 HasReachedMaxIncludeDepth = true;
2317 return {ImportAction::None};
2318 }
2319
2320 // Look up the file, create a File ID for it.
2321 SourceLocation IncludePos = FilenameTok.getLocation();
2322 // If the filename string was the result of macro expansions, set the include
2323 // position on the file where it will be included and after the expansions.
2324 if (IncludePos.isMacroID())
2325 IncludePos = SourceMgr.getExpansionRange(IncludePos).getEnd();
2326 FileID FID = SourceMgr.createFileID(*File, IncludePos, FileCharacter);
2327 if (!FID.isValid()) {
2328 TheModuleLoader.HadFatalFailure = true;
2329 return ImportAction::Failure;
2330 }
2331
2332 // If all is good, enter the new file!
2333 if (EnterSourceFile(FID, CurDir, FilenameTok.getLocation()))
2334 return {ImportAction::None};
2335
2336 // Determine if we're switching to building a new submodule, and which one.
2337 if (auto *M = SuggestedModule.getModule()) {
2338 if (M->getTopLevelModule()->ShadowingModule) {
2339 // We are building a submodule that belongs to a shadowed module. This
2340 // means we find header files in the shadowed module.
2341 Diag(M->DefinitionLoc, diag::err_module_build_shadowed_submodule)
2342 << M->getFullModuleName();
2343 Diag(M->getTopLevelModule()->ShadowingModule->DefinitionLoc,
2344 diag::note_previous_definition);
2345 return {ImportAction::None};
2346 }
2347 // When building a pch, -fmodule-name tells the compiler to textually
2348 // include headers in the specified module. We are not building the
2349 // specified module.
2350 //
2351 // FIXME: This is the wrong way to handle this. We should produce a PCH
2352 // that behaves the same as the header would behave in a compilation using
2353 // that PCH, which means we should enter the submodule. We need to teach
2354 // the AST serialization layer to deal with the resulting AST.
2355 if (getLangOpts().CompilingPCH &&
2356 isForModuleBuilding(M, getLangOpts().CurrentModule,
2357 getLangOpts().ModuleName))
2358 return {ImportAction::None};
2359
2360 assert(!CurLexerSubmodule && "should not have marked this as a module yet")((void)0);
2361 CurLexerSubmodule = M;
2362
2363 // Let the macro handling code know that any future macros are within
2364 // the new submodule.
2365 EnterSubmodule(M, EndLoc, /*ForPragma*/false);
2366
2367 // Let the parser know that any future declarations are within the new
2368 // submodule.
2369 // FIXME: There's no point doing this if we're handling a #__include_macros
2370 // directive.
2371 return {ImportAction::ModuleBegin, M};
2372 }
2373
2374 assert(!IsImportDecl && "failed to diagnose missing module for import decl")((void)0);
2375 return {ImportAction::None};
2376}
2377
2378/// HandleIncludeNextDirective - Implements \#include_next.
2379///
2380void Preprocessor::HandleIncludeNextDirective(SourceLocation HashLoc,
2381 Token &IncludeNextTok) {
2382 Diag(IncludeNextTok, diag::ext_pp_include_next_directive);
2383
2384 // #include_next is like #include, except that we start searching after
2385 // the current found directory. If we can't do this, issue a
2386 // diagnostic.
2387 const DirectoryLookup *Lookup = CurDirLookup;
2388 const FileEntry *LookupFromFile = nullptr;
2389 if (isInPrimaryFile() && LangOpts.IsHeaderFile) {
2390 // If the main file is a header, then it's either for PCH/AST generation,
2391 // or libclang opened it. Either way, handle it as a normal include below
2392 // and do not complain about include_next.
2393 } else if (isInPrimaryFile()) {
2394 Lookup = nullptr;
2395 Diag(IncludeNextTok, diag::pp_include_next_in_primary);
2396 } else if (CurLexerSubmodule) {
2397 // Start looking up in the directory *after* the one in which the current
2398 // file would be found, if any.
2399 assert(CurPPLexer && "#include_next directive in macro?")((void)0);
2400 LookupFromFile = CurPPLexer->getFileEntry();
2401 Lookup = nullptr;
2402 } else if (!Lookup) {
2403 // The current file was not found by walking the include path. Either it
2404 // is the primary file (handled above), or it was found by absolute path,
2405 // or it was found relative to such a file.
2406 // FIXME: Track enough information so we know which case we're in.
2407 Diag(IncludeNextTok, diag::pp_include_next_absolute_path);
2408 } else {
2409 // Start looking up in the next directory.
2410 ++Lookup;
2411 }
2412
2413 return HandleIncludeDirective(HashLoc, IncludeNextTok, Lookup,
2414 LookupFromFile);
2415}
2416
2417/// HandleMicrosoftImportDirective - Implements \#import for Microsoft Mode
2418void Preprocessor::HandleMicrosoftImportDirective(Token &Tok) {
2419 // The Microsoft #import directive takes a type library and generates header
2420 // files from it, and includes those. This is beyond the scope of what clang
2421 // does, so we ignore it and error out. However, #import can optionally have
2422 // trailing attributes that span multiple lines. We're going to eat those
2423 // so we can continue processing from there.
2424 Diag(Tok, diag::err_pp_import_directive_ms );
2425
2426 // Read tokens until we get to the end of the directive. Note that the
2427 // directive can be split over multiple lines using the backslash character.
2428 DiscardUntilEndOfDirective();
2429}
2430
2431/// HandleImportDirective - Implements \#import.
2432///
2433void Preprocessor::HandleImportDirective(SourceLocation HashLoc,
2434 Token &ImportTok) {
2435 if (!LangOpts.ObjC) { // #import is standard for ObjC.
2436 if (LangOpts.MSVCCompat)
2437 return HandleMicrosoftImportDirective(ImportTok);
2438 Diag(ImportTok, diag::ext_pp_import_directive);
2439 }
2440 return HandleIncludeDirective(HashLoc, ImportTok);
2441}
2442
2443/// HandleIncludeMacrosDirective - The -imacros command line option turns into a
2444/// pseudo directive in the predefines buffer. This handles it by sucking all
2445/// tokens through the preprocessor and discarding them (only keeping the side
2446/// effects on the preprocessor).
2447void Preprocessor::HandleIncludeMacrosDirective(SourceLocation HashLoc,
2448 Token &IncludeMacrosTok) {
2449 // This directive should only occur in the predefines buffer. If not, emit an
2450 // error and reject it.
2451 SourceLocation Loc = IncludeMacrosTok.getLocation();
2452 if (SourceMgr.getBufferName(Loc) != "<built-in>") {
2453 Diag(IncludeMacrosTok.getLocation(),
2454 diag::pp_include_macros_out_of_predefines);
2455 DiscardUntilEndOfDirective();
2456 return;
2457 }
2458
2459 // Treat this as a normal #include for checking purposes. If this is
2460 // successful, it will push a new lexer onto the include stack.
2461 HandleIncludeDirective(HashLoc, IncludeMacrosTok);
2462
2463 Token TmpTok;
2464 do {
2465 Lex(TmpTok);
2466 assert(TmpTok.isNot(tok::eof) && "Didn't find end of -imacros!")((void)0);
2467 } while (TmpTok.isNot(tok::hashhash));
2468}
2469
2470//===----------------------------------------------------------------------===//
2471// Preprocessor Macro Directive Handling.
2472//===----------------------------------------------------------------------===//
2473
2474/// ReadMacroParameterList - The ( starting a parameter list of a macro
2475/// definition has just been read. Lex the rest of the parameters and the
2476/// closing ), updating MI with what we learn. Return true if an error occurs
2477/// parsing the param list.
2478bool Preprocessor::ReadMacroParameterList(MacroInfo *MI, Token &Tok) {
2479 SmallVector<IdentifierInfo*, 32> Parameters;
2480
2481 while (true) {
2482 LexUnexpandedToken(Tok);
2483 switch (Tok.getKind()) {
2484 case tok::r_paren:
2485 // Found the end of the parameter list.
2486 if (Parameters.empty()) // #define FOO()
2487 return false;
2488 // Otherwise we have #define FOO(A,)
2489 Diag(Tok, diag::err_pp_expected_ident_in_arg_list);
2490 return true;
2491 case tok::ellipsis: // #define X(... -> C99 varargs
2492 if (!LangOpts.C99)
2493 Diag(Tok, LangOpts.CPlusPlus11 ?
2494 diag::warn_cxx98_compat_variadic_macro :
2495 diag::ext_variadic_macro);
2496
2497 // OpenCL v1.2 s6.9.e: variadic macros are not supported.
2498 if (LangOpts.OpenCL && !LangOpts.OpenCLCPlusPlus) {
2499 Diag(Tok, diag::ext_pp_opencl_variadic_macros);
2500 }
2501
2502 // Lex the token after the identifier.
2503 LexUnexpandedToken(Tok);
2504 if (Tok.isNot(tok::r_paren)) {
2505 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2506 return true;
2507 }
2508 // Add the __VA_ARGS__ identifier as a parameter.
2509 Parameters.push_back(Ident__VA_ARGS__);
2510 MI->setIsC99Varargs();
2511 MI->setParameterList(Parameters, BP);
2512 return false;
2513 case tok::eod: // #define X(
2514 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2515 return true;
2516 default:
2517 // Handle keywords and identifiers here to accept things like
2518 // #define Foo(for) for.
2519 IdentifierInfo *II = Tok.getIdentifierInfo();
2520 if (!II) {
2521 // #define X(1
2522 Diag(Tok, diag::err_pp_invalid_tok_in_arg_list);
2523 return true;
2524 }
2525
2526 // If this is already used as a parameter, it is used multiple times (e.g.
2527 // #define X(A,A.
2528 if (llvm::find(Parameters, II) != Parameters.end()) { // C99 6.10.3p6
2529 Diag(Tok, diag::err_pp_duplicate_name_in_arg_list) << II;
2530 return true;
2531 }
2532
2533 // Add the parameter to the macro info.
2534 Parameters.push_back(II);
2535
2536 // Lex the token after the identifier.
2537 LexUnexpandedToken(Tok);
2538
2539 switch (Tok.getKind()) {
2540 default: // #define X(A B
2541 Diag(Tok, diag::err_pp_expected_comma_in_arg_list);
2542 return true;
2543 case tok::r_paren: // #define X(A)
2544 MI->setParameterList(Parameters, BP);
2545 return false;
2546 case tok::comma: // #define X(A,
2547 break;
2548 case tok::ellipsis: // #define X(A... -> GCC extension
2549 // Diagnose extension.
2550 Diag(Tok, diag::ext_named_variadic_macro);
2551
2552 // Lex the token after the identifier.
2553 LexUnexpandedToken(Tok);
2554 if (Tok.isNot(tok::r_paren)) {
2555 Diag(Tok, diag::err_pp_missing_rparen_in_macro_def);
2556 return true;
2557 }
2558
2559 MI->setIsGNUVarargs();
2560 MI->setParameterList(Parameters, BP);
2561 return false;
2562 }
2563 }
2564 }
2565}
2566
2567static bool isConfigurationPattern(Token &MacroName, MacroInfo *MI,
2568 const LangOptions &LOptions) {
2569 if (MI->getNumTokens() == 1) {
2570 const Token &Value = MI->getReplacementToken(0);
2571
2572 // Macro that is identity, like '#define inline inline' is a valid pattern.
2573 if (MacroName.getKind() == Value.getKind())
2574 return true;
2575
2576 // Macro that maps a keyword to the same keyword decorated with leading/
2577 // trailing underscores is a valid pattern:
2578 // #define inline __inline
2579 // #define inline __inline__
2580 // #define inline _inline (in MS compatibility mode)
2581 StringRef MacroText = MacroName.getIdentifierInfo()->getName();
2582 if (IdentifierInfo *II = Value.getIdentifierInfo()) {
2583 if (!II->isKeyword(LOptions))
2584 return false;
2585 StringRef ValueText = II->getName();
2586 StringRef TrimmedValue = ValueText;
2587 if (!ValueText.startswith("__")) {
2588 if (ValueText.startswith("_"))
2589 TrimmedValue = TrimmedValue.drop_front(1);
2590 else
2591 return false;
2592 } else {
2593 TrimmedValue = TrimmedValue.drop_front(2);
2594 if (TrimmedValue.endswith("__"))
2595 TrimmedValue = TrimmedValue.drop_back(2);
2596 }
2597 return TrimmedValue.equals(MacroText);
2598 } else {
2599 return false;
2600 }
2601 }
2602
2603 // #define inline
2604 return MacroName.isOneOf(tok::kw_extern, tok::kw_inline, tok::kw_static,
2605 tok::kw_const) &&
2606 MI->getNumTokens() == 0;
2607}
2608
2609// ReadOptionalMacroParameterListAndBody - This consumes all (i.e. the
2610// entire line) of the macro's tokens and adds them to MacroInfo, and while
2611// doing so performs certain validity checks including (but not limited to):
2612// - # (stringization) is followed by a macro parameter
2613//
2614// Returns a nullptr if an invalid sequence of tokens is encountered or returns
2615// a pointer to a MacroInfo object.
2616
2617MacroInfo *Preprocessor::ReadOptionalMacroParameterListAndBody(
2618 const Token &MacroNameTok, const bool ImmediatelyAfterHeaderGuard) {
2619
2620 Token LastTok = MacroNameTok;
2621 // Create the new macro.
2622 MacroInfo *const MI = AllocateMacroInfo(MacroNameTok.getLocation());
16
Calling 'Preprocessor::AllocateMacroInfo'
2623
2624 Token Tok;
2625 LexUnexpandedToken(Tok);
2626
2627 // Ensure we consume the rest of the macro body if errors occur.
2628 auto _ = llvm::make_scope_exit([&]() {
2629 // The flag indicates if we are still waiting for 'eod'.
2630 if (CurLexer->ParsingPreprocessorDirective)
2631 DiscardUntilEndOfDirective();
2632 });
2633
2634 // Used to un-poison and then re-poison identifiers of the __VA_ARGS__ ilk
2635 // within their appropriate context.
2636 VariadicMacroScopeGuard VariadicMacroScopeGuard(*this);
2637
2638 // If this is a function-like macro definition, parse the argument list,
2639 // marking each of the identifiers as being used as macro arguments. Also,
2640 // check other constraints on the first token of the macro body.
2641 if (Tok.is(tok::eod)) {
2642 if (ImmediatelyAfterHeaderGuard) {
2643 // Save this macro information since it may part of a header guard.
2644 CurPPLexer->MIOpt.SetDefinedMacro(MacroNameTok.getIdentifierInfo(),
2645 MacroNameTok.getLocation());
2646 }
2647 // If there is no body to this macro, we have no special handling here.
2648 } else if (Tok.hasLeadingSpace()) {
2649 // This is a normal token with leading space. Clear the leading space
2650 // marker on the first token to get proper expansion.
2651 Tok.clearFlag(Token::LeadingSpace);
2652 } else if (Tok.is(tok::l_paren)) {
2653 // This is a function-like macro definition. Read the argument list.
2654 MI->setIsFunctionLike();
2655 if (ReadMacroParameterList(MI, LastTok))
2656 return nullptr;
2657
2658 // If this is a definition of an ISO C/C++ variadic function-like macro (not
2659 // using the GNU named varargs extension) inform our variadic scope guard
2660 // which un-poisons and re-poisons certain identifiers (e.g. __VA_ARGS__)
2661 // allowed only within the definition of a variadic macro.
2662
2663 if (MI->isC99Varargs()) {
2664 VariadicMacroScopeGuard.enterScope();
2665 }
2666
2667 // Read the first token after the arg list for down below.
2668 LexUnexpandedToken(Tok);
2669 } else if (LangOpts.C99 || LangOpts.CPlusPlus11) {
2670 // C99 requires whitespace between the macro definition and the body. Emit
2671 // a diagnostic for something like "#define X+".
2672 Diag(Tok, diag::ext_c99_whitespace_required_after_macro_name);
2673 } else {
2674 // C90 6.8 TC1 says: "In the definition of an object-like macro, if the
2675 // first character of a replacement list is not a character required by
2676 // subclause 5.2.1, then there shall be white-space separation between the
2677 // identifier and the replacement list.". 5.2.1 lists this set:
2678 // "A-Za-z0-9!"#%&'()*+,_./:;<=>?[\]^_{|}~" as well as whitespace, which
2679 // is irrelevant here.
2680 bool isInvalid = false;
2681 if (Tok.is(tok::at)) // @ is not in the list above.
2682 isInvalid = true;
2683 else if (Tok.is(tok::unknown)) {
2684 // If we have an unknown token, it is something strange like "`". Since
2685 // all of valid characters would have lexed into a single character
2686 // token of some sort, we know this is not a valid case.
2687 isInvalid = true;
2688 }
2689 if (isInvalid)
2690 Diag(Tok, diag::ext_missing_whitespace_after_macro_name);
2691 else
2692 Diag(Tok, diag::warn_missing_whitespace_after_macro_name);
2693 }
2694
2695 if (!Tok.is(tok::eod))
2696 LastTok = Tok;
2697
2698 // Read the rest of the macro body.
2699 if (MI->isObjectLike()) {
2700 // Object-like macros are very simple, just read their body.
2701 while (Tok.isNot(tok::eod)) {
2702 LastTok = Tok;
2703 MI->AddTokenToBody(Tok);
2704 // Get the next token of the macro.
2705 LexUnexpandedToken(Tok);
2706 }
2707 } else {
2708 // Otherwise, read the body of a function-like macro. While we are at it,
2709 // check C99 6.10.3.2p1: ensure that # operators are followed by macro
2710 // parameters in function-like macro expansions.
2711
2712 VAOptDefinitionContext VAOCtx(*this);
2713
2714 while (Tok.isNot(tok::eod)) {
2715 LastTok = Tok;
2716
2717 if (!Tok.isOneOf(tok::hash, tok::hashat, tok::hashhash)) {
2718 MI->AddTokenToBody(Tok);
2719
2720 if (VAOCtx.isVAOptToken(Tok)) {
2721 // If we're already within a VAOPT, emit an error.
2722 if (VAOCtx.isInVAOpt()) {
2723 Diag(Tok, diag::err_pp_vaopt_nested_use);
2724 return nullptr;
2725 }
2726 // Ensure VAOPT is followed by a '(' .
2727 LexUnexpandedToken(Tok);
2728 if (Tok.isNot(tok::l_paren)) {
2729 Diag(Tok, diag::err_pp_missing_lparen_in_vaopt_use);
2730 return nullptr;
2731 }
2732 MI->AddTokenToBody(Tok);
2733 VAOCtx.sawVAOptFollowedByOpeningParens(Tok.getLocation());
2734 LexUnexpandedToken(Tok);
2735 if (Tok.is(tok::hashhash)) {
2736 Diag(Tok, diag::err_vaopt_paste_at_start);
2737 return nullptr;
2738 }
2739 continue;
2740 } else if (VAOCtx.isInVAOpt()) {
2741 if (Tok.is(tok::r_paren)) {
2742 if (VAOCtx.sawClosingParen()) {
2743 const unsigned NumTokens = MI->getNumTokens();
2744 assert(NumTokens >= 3 && "Must have seen at least __VA_OPT__( "((void)0)
2745 "and a subsequent tok::r_paren")((void)0);
2746 if (MI->getReplacementToken(NumTokens - 2).is(tok::hashhash)) {
2747 Diag(Tok, diag::err_vaopt_paste_at_end);
2748 return nullptr;
2749 }
2750 }
2751 } else if (Tok.is(tok::l_paren)) {
2752 VAOCtx.sawOpeningParen(Tok.getLocation());
2753 }
2754 }
2755 // Get the next token of the macro.
2756 LexUnexpandedToken(Tok);
2757 continue;
2758 }
2759
2760 // If we're in -traditional mode, then we should ignore stringification
2761 // and token pasting. Mark the tokens as unknown so as not to confuse
2762 // things.
2763 if (getLangOpts().TraditionalCPP) {
2764 Tok.setKind(tok::unknown);
2765 MI->AddTokenToBody(Tok);
2766
2767 // Get the next token of the macro.
2768 LexUnexpandedToken(Tok);
2769 continue;
2770 }
2771
2772 if (Tok.is(tok::hashhash)) {
2773 // If we see token pasting, check if it looks like the gcc comma
2774 // pasting extension. We'll use this information to suppress
2775 // diagnostics later on.
2776
2777 // Get the next token of the macro.
2778 LexUnexpandedToken(Tok);
2779
2780 if (Tok.is(tok::eod)) {
2781 MI->AddTokenToBody(LastTok);
2782 break;
2783 }
2784
2785 unsigned NumTokens = MI->getNumTokens();
2786 if (NumTokens && Tok.getIdentifierInfo() == Ident__VA_ARGS__ &&
2787 MI->getReplacementToken(NumTokens-1).is(tok::comma))
2788 MI->setHasCommaPasting();
2789
2790 // Things look ok, add the '##' token to the macro.
2791 MI->AddTokenToBody(LastTok);
2792 continue;
2793 }
2794
2795 // Our Token is a stringization operator.
2796 // Get the next token of the macro.
2797 LexUnexpandedToken(Tok);
2798
2799 // Check for a valid macro arg identifier or __VA_OPT__.
2800 if (!VAOCtx.isVAOptToken(Tok) &&
2801 (Tok.getIdentifierInfo() == nullptr ||
2802 MI->getParameterNum(Tok.getIdentifierInfo()) == -1)) {
2803
2804 // If this is assembler-with-cpp mode, we accept random gibberish after
2805 // the '#' because '#' is often a comment character. However, change
2806 // the kind of the token to tok::unknown so that the preprocessor isn't
2807 // confused.
2808 if (getLangOpts().AsmPreprocessor && Tok.isNot(tok::eod)) {
2809 LastTok.setKind(tok::unknown);
2810 MI->AddTokenToBody(LastTok);
2811 continue;
2812 } else {
2813 Diag(Tok, diag::err_pp_stringize_not_parameter)
2814 << LastTok.is(tok::hashat);
2815 return nullptr;
2816 }
2817 }
2818
2819 // Things look ok, add the '#' and param name tokens to the macro.
2820 MI->AddTokenToBody(LastTok);
2821
2822 // If the token following '#' is VAOPT, let the next iteration handle it
2823 // and check it for correctness, otherwise add the token and prime the
2824 // loop with the next one.
2825 if (!VAOCtx.isVAOptToken(Tok)) {
2826 MI->AddTokenToBody(Tok);
2827 LastTok = Tok;
2828
2829 // Get the next token of the macro.
2830 LexUnexpandedToken(Tok);
2831 }
2832 }
2833 if (VAOCtx.isInVAOpt()) {
2834 assert(Tok.is(tok::eod) && "Must be at End Of preprocessing Directive")((void)0);
2835 Diag(Tok, diag::err_pp_expected_after)
2836 << LastTok.getKind() << tok::r_paren;
2837 Diag(VAOCtx.getUnmatchedOpeningParenLoc(), diag::note_matching) << tok::l_paren;
2838 return nullptr;
2839 }
2840 }
2841 MI->setDefinitionEndLoc(LastTok.getLocation());
2842 return MI;
2843}
2844/// HandleDefineDirective - Implements \#define. This consumes the entire macro
2845/// line then lets the caller lex the next real token.
2846void Preprocessor::HandleDefineDirective(
2847 Token &DefineTok, const bool ImmediatelyAfterHeaderGuard) {
2848 ++NumDefined;
2849
2850 Token MacroNameTok;
2851 bool MacroShadowsKeyword;
2852 ReadMacroName(MacroNameTok, MU_Define, &MacroShadowsKeyword);
2853
2854 // Error reading macro name? If so, diagnostic already issued.
2855 if (MacroNameTok.is(tok::eod))
13
Taking false branch
2856 return;
2857
2858 // If we are supposed to keep comments in #defines, reenable comment saving
2859 // mode.
2860 if (CurLexer) CurLexer->SetCommentRetentionState(KeepMacroComments);
14
Taking false branch
2861
2862 MacroInfo *const MI = ReadOptionalMacroParameterListAndBody(
15
Calling 'Preprocessor::ReadOptionalMacroParameterListAndBody'
2863 MacroNameTok, ImmediatelyAfterHeaderGuard);
2864
2865 if (!MI) return;
2866
2867 if (MacroShadowsKeyword &&
2868 !isConfigurationPattern(MacroNameTok, MI, getLangOpts())) {
2869 Diag(MacroNameTok, diag::warn_pp_macro_hides_keyword);
2870 }
2871 // Check that there is no paste (##) operator at the beginning or end of the
2872 // replacement list.
2873 unsigned NumTokens = MI->getNumTokens();
2874 if (NumTokens != 0) {
2875 if (MI->getReplacementToken(0).is(tok::hashhash)) {
2876 Diag(MI->getReplacementToken(0), diag::err_paste_at_start);
2877 return;
2878 }
2879 if (MI->getReplacementToken(NumTokens-1).is(tok::hashhash)) {
2880 Diag(MI->getReplacementToken(NumTokens-1), diag::err_paste_at_end);
2881 return;
2882 }
2883 }
2884
2885 // When skipping just warn about macros that do not match.
2886 if (SkippingUntilPCHThroughHeader) {
2887 const MacroInfo *OtherMI = getMacroInfo(MacroNameTok.getIdentifierInfo());
2888 if (!OtherMI || !MI->isIdenticalTo(*OtherMI, *this,
2889 /*Syntactic=*/LangOpts.MicrosoftExt))
2890 Diag(MI->getDefinitionLoc(), diag::warn_pp_macro_def_mismatch_with_pch)
2891 << MacroNameTok.getIdentifierInfo();
2892 // Issue the diagnostic but allow the change if msvc extensions are enabled
2893 if (!LangOpts.MicrosoftExt)
2894 return;
2895 }
2896
2897 // Finally, if this identifier already had a macro defined for it, verify that
2898 // the macro bodies are identical, and issue diagnostics if they are not.
2899 if (const MacroInfo *OtherMI=getMacroInfo(MacroNameTok.getIdentifierInfo())) {
2900 // In Objective-C, ignore attempts to directly redefine the builtin
2901 // definitions of the ownership qualifiers. It's still possible to
2902 // #undef them.
2903 auto isObjCProtectedMacro = [](const IdentifierInfo *II) -> bool {
2904 return II->isStr("__strong") ||
2905 II->isStr("__weak") ||
2906 II->isStr("__unsafe_unretained") ||
2907 II->isStr("__autoreleasing");
2908 };
2909 if (getLangOpts().ObjC &&
2910 SourceMgr.getFileID(OtherMI->getDefinitionLoc())
2911 == getPredefinesFileID() &&
2912 isObjCProtectedMacro(MacroNameTok.getIdentifierInfo())) {
2913 // Warn if it changes the tokens.
2914 if ((!getDiagnostics().getSuppressSystemWarnings() ||
2915 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) &&
2916 !MI->isIdenticalTo(*OtherMI, *this,
2917 /*Syntactic=*/LangOpts.MicrosoftExt)) {
2918 Diag(MI->getDefinitionLoc(), diag::warn_pp_objc_macro_redef_ignored);
2919 }
2920 assert(!OtherMI->isWarnIfUnused())((void)0);
2921 return;
2922 }
2923
2924 // It is very common for system headers to have tons of macro redefinitions
2925 // and for warnings to be disabled in system headers. If this is the case,
2926 // then don't bother calling MacroInfo::isIdenticalTo.
2927 if (!getDiagnostics().getSuppressSystemWarnings() ||
2928 !SourceMgr.isInSystemHeader(DefineTok.getLocation())) {
2929 if (!OtherMI->isUsed() && OtherMI->isWarnIfUnused())
2930 Diag(OtherMI->getDefinitionLoc(), diag::pp_macro_not_used);
2931
2932 // Warn if defining "__LINE__" and other builtins, per C99 6.10.8/4 and
2933 // C++ [cpp.predefined]p4, but allow it as an extension.
2934 if (OtherMI->isBuiltinMacro())
2935 Diag(MacroNameTok, diag::ext_pp_redef_builtin_macro);
2936 // Macros must be identical. This means all tokens and whitespace
2937 // separation must be the same. C99 6.10.3p2.
2938 else if (!OtherMI->isAllowRedefinitionsWithoutWarning() &&
2939 !MI->isIdenticalTo(*OtherMI, *this, /*Syntactic=*/LangOpts.MicrosoftExt)) {
2940 Diag(MI->getDefinitionLoc(), diag::ext_pp_macro_redef)
2941 << MacroNameTok.getIdentifierInfo();
2942 Diag(OtherMI->getDefinitionLoc(), diag::note_previous_definition);
2943 }
2944 }
2945 if (OtherMI->isWarnIfUnused())
2946 WarnUnusedMacroLocs.erase(OtherMI->getDefinitionLoc());
2947 }
2948
2949 DefMacroDirective *MD =
2950 appendDefMacroDirective(MacroNameTok.getIdentifierInfo(), MI);
2951
2952 assert(!MI->isUsed())((void)0);
2953 // If we need warning for not using the macro, add its location in the
2954 // warn-because-unused-macro set. If it gets used it will be removed from set.
2955 if (getSourceManager().isInMainFile(MI->getDefinitionLoc()) &&
2956 !Diags->isIgnored(diag::pp_macro_not_used, MI->getDefinitionLoc()) &&
2957 !MacroExpansionInDirectivesOverride &&
2958 getSourceManager().getFileID(MI->getDefinitionLoc()) !=
2959 getPredefinesFileID()) {
2960 MI->setIsWarnIfUnused(true);
2961 WarnUnusedMacroLocs.insert(MI->getDefinitionLoc());
2962 }
2963
2964 // If the callbacks want to know, tell them about the macro definition.
2965 if (Callbacks)
2966 Callbacks->MacroDefined(MacroNameTok, MD);
2967
2968 // If we're in MS compatibility mode and the macro being defined is the
2969 // assert macro, implicitly add a macro definition for static_assert to work
2970 // around their broken assert.h header file in C. Only do so if there isn't
2971 // already a static_assert macro defined.
2972 if (!getLangOpts().CPlusPlus && getLangOpts().MSVCCompat &&
2973 MacroNameTok.getIdentifierInfo()->isStr("assert") &&
2974 !isMacroDefined("static_assert")) {
2975 MacroInfo *MI = AllocateMacroInfo(SourceLocation());
2976
2977 Token Tok;
2978 Tok.startToken();
2979 Tok.setKind(tok::kw__Static_assert);
2980 Tok.setIdentifierInfo(getIdentifierInfo("_Static_assert"));
2981 MI->AddTokenToBody(Tok);
2982 (void)appendDefMacroDirective(getIdentifierInfo("static_assert"), MI);
2983 }
2984}
2985
2986/// HandleUndefDirective - Implements \#undef.
2987///
2988void Preprocessor::HandleUndefDirective() {
2989 ++NumUndefined;
2990
2991 Token MacroNameTok;
2992 ReadMacroName(MacroNameTok, MU_Undef);
2993
2994 // Error reading macro name? If so, diagnostic already issued.
2995 if (MacroNameTok.is(tok::eod))
2996 return;
2997
2998 // Check to see if this is the last token on the #undef line.
2999 CheckEndOfDirective("undef");
3000
3001 // Okay, we have a valid identifier to undef.
3002 auto *II = MacroNameTok.getIdentifierInfo();
3003 auto MD = getMacroDefinition(II);
3004 UndefMacroDirective *Undef = nullptr;
3005
3006 // If the macro is not defined, this is a noop undef.
3007 if (const MacroInfo *MI = MD.getMacroInfo()) {
3008 if (!MI->isUsed() && MI->isWarnIfUnused())
3009 Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used);
3010
3011 if (MI->isWarnIfUnused())
3012 WarnUnusedMacroLocs.erase(MI->getDefinitionLoc());
3013
3014 Undef = AllocateUndefMacroDirective(MacroNameTok.getLocation());
3015 }
3016
3017 // If the callbacks want to know, tell them about the macro #undef.
3018 // Note: no matter if the macro was defined or not.
3019 if (Callbacks)
3020 Callbacks->MacroUndefined(MacroNameTok, MD, Undef);
3021
3022 if (Undef)
3023 appendMacroDirective(II, Undef);
3024}
3025
3026//===----------------------------------------------------------------------===//
3027// Preprocessor Conditional Directive Handling.
3028//===----------------------------------------------------------------------===//
3029
3030/// HandleIfdefDirective - Implements the \#ifdef/\#ifndef directive. isIfndef
3031/// is true when this is a \#ifndef directive. ReadAnyTokensBeforeDirective is
3032/// true if any tokens have been returned or pp-directives activated before this
3033/// \#ifndef has been lexed.
3034///
3035void Preprocessor::HandleIfdefDirective(Token &Result,
3036 const Token &HashToken,
3037 bool isIfndef,
3038 bool ReadAnyTokensBeforeDirective) {
3039 ++NumIf;
3040 Token DirectiveTok = Result;
3041
3042 Token MacroNameTok;
3043 ReadMacroName(MacroNameTok);
3044
3045 // Error reading macro name? If so, diagnostic already issued.
3046 if (MacroNameTok.is(tok::eod)) {
3047 // Skip code until we get to #endif. This helps with recovery by not
3048 // emitting an error when the #endif is reached.
3049 SkipExcludedConditionalBlock(HashToken.getLocation(),
3050 DirectiveTok.getLocation(),
3051 /*Foundnonskip*/ false, /*FoundElse*/ false);
3052 return;
3053 }
3054
3055 // Check to see if this is the last token on the #if[n]def line.
3056 CheckEndOfDirective(isIfndef ? "ifndef" : "ifdef");
3057
3058 IdentifierInfo *MII = MacroNameTok.getIdentifierInfo();
3059 auto MD = getMacroDefinition(MII);
3060 MacroInfo *MI = MD.getMacroInfo();
3061
3062 if (CurPPLexer->getConditionalStackDepth() == 0) {
3063 // If the start of a top-level #ifdef and if the macro is not defined,
3064 // inform MIOpt that this might be the start of a proper include guard.
3065 // Otherwise it is some other form of unknown conditional which we can't
3066 // handle.
3067 if (!ReadAnyTokensBeforeDirective && !MI) {
3068 assert(isIfndef && "#ifdef shouldn't reach here")((void)0);
3069 CurPPLexer->MIOpt.EnterTopLevelIfndef(MII, MacroNameTok.getLocation());
3070 } else
3071 CurPPLexer->MIOpt.EnterTopLevelConditional();
3072 }
3073
3074 // If there is a macro, process it.
3075 if (MI) // Mark it used.
3076 markMacroAsUsed(MI);
3077
3078 if (Callbacks) {
3079 if (isIfndef)
3080 Callbacks->Ifndef(DirectiveTok.getLocation(), MacroNameTok, MD);
3081 else
3082 Callbacks->Ifdef(DirectiveTok.getLocation(), MacroNameTok, MD);
3083 }
3084
3085 bool RetainExcludedCB = PPOpts->RetainExcludedConditionalBlocks &&
3086 getSourceManager().isInMainFile(DirectiveTok.getLocation());
3087
3088 // Should we include the stuff contained by this directive?
3089 if (PPOpts->SingleFileParseMode && !MI) {
3090 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
3091 // the directive blocks.
3092 CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
3093 /*wasskip*/false, /*foundnonskip*/false,
3094 /*foundelse*/false);
3095 } else if (!MI == isIfndef || RetainExcludedCB) {
3096 // Yes, remember that we are inside a conditional, then lex the next token.
3097 CurPPLexer->pushConditionalLevel(DirectiveTok.getLocation(),
3098 /*wasskip*/false, /*foundnonskip*/true,
3099 /*foundelse*/false);
3100 } else {
3101 // No, skip the contents of this block.
3102 SkipExcludedConditionalBlock(HashToken.getLocation(),
3103 DirectiveTok.getLocation(),
3104 /*Foundnonskip*/ false,
3105 /*FoundElse*/ false);
3106 }
3107}
3108
3109/// HandleIfDirective - Implements the \#if directive.
3110///
3111void Preprocessor::HandleIfDirective(Token &IfToken,
3112 const Token &HashToken,
3113 bool ReadAnyTokensBeforeDirective) {
3114 ++NumIf;
3115
3116 // Parse and evaluate the conditional expression.
3117 IdentifierInfo *IfNDefMacro = nullptr;
3118 const DirectiveEvalResult DER = EvaluateDirectiveExpression(IfNDefMacro);
3119 const bool ConditionalTrue = DER.Conditional;
3120 // Lexer might become invalid if we hit code completion point while evaluating
3121 // expression.
3122 if (!CurPPLexer)
3123 return;
3124
3125 // If this condition is equivalent to #ifndef X, and if this is the first
3126 // directive seen, handle it for the multiple-include optimization.
3127 if (CurPPLexer->getConditionalStackDepth() == 0) {
3128 if (!ReadAnyTokensBeforeDirective && IfNDefMacro && ConditionalTrue)
3129 // FIXME: Pass in the location of the macro name, not the 'if' token.
3130 CurPPLexer->MIOpt.EnterTopLevelIfndef(IfNDefMacro, IfToken.getLocation());
3131 else
3132 CurPPLexer->MIOpt.EnterTopLevelConditional();
3133 }
3134
3135 if (Callbacks)
3136 Callbacks->If(
3137 IfToken.getLocation(), DER.ExprRange,
3138 (ConditionalTrue ? PPCallbacks::CVK_True : PPCallbacks::CVK_False));
3139
3140 bool RetainExcludedCB = PPOpts->RetainExcludedConditionalBlocks &&
3141 getSourceManager().isInMainFile(IfToken.getLocation());
3142
3143 // Should we include the stuff contained by this directive?
3144 if (PPOpts->SingleFileParseMode && DER.IncludedUndefinedIds) {
3145 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
3146 // the directive blocks.
3147 CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
3148 /*foundnonskip*/false, /*foundelse*/false);
3149 } else if (ConditionalTrue || RetainExcludedCB) {
3150 // Yes, remember that we are inside a conditional, then lex the next token.
3151 CurPPLexer->pushConditionalLevel(IfToken.getLocation(), /*wasskip*/false,
3152 /*foundnonskip*/true, /*foundelse*/false);
3153 } else {
3154 // No, skip the contents of this block.
3155 SkipExcludedConditionalBlock(HashToken.getLocation(), IfToken.getLocation(),
3156 /*Foundnonskip*/ false,
3157 /*FoundElse*/ false);
3158 }
3159}
3160
3161/// HandleEndifDirective - Implements the \#endif directive.
3162///
3163void Preprocessor::HandleEndifDirective(Token &EndifToken) {
3164 ++NumEndif;
3165
3166 // Check that this is the whole directive.
3167 CheckEndOfDirective("endif");
3168
3169 PPConditionalInfo CondInfo;
3170 if (CurPPLexer->popConditionalLevel(CondInfo)) {
3171 // No conditionals on the stack: this is an #endif without an #if.
3172 Diag(EndifToken, diag::err_pp_endif_without_if);
3173 return;
3174 }
3175
3176 // If this the end of a top-level #endif, inform MIOpt.
3177 if (CurPPLexer->getConditionalStackDepth() == 0)
3178 CurPPLexer->MIOpt.ExitTopLevelConditional();
3179
3180 assert(!CondInfo.WasSkipping && !CurPPLexer->LexingRawMode &&((void)0)
3181 "This code should only be reachable in the non-skipping case!")((void)0);
3182
3183 if (Callbacks)
3184 Callbacks->Endif(EndifToken.getLocation(), CondInfo.IfLoc);
3185}
3186
3187/// HandleElseDirective - Implements the \#else directive.
3188///
3189void Preprocessor::HandleElseDirective(Token &Result, const Token &HashToken) {
3190 ++NumElse;
3191
3192 // #else directive in a non-skipping conditional... start skipping.
3193 CheckEndOfDirective("else");
3194
3195 PPConditionalInfo CI;
3196 if (CurPPLexer->popConditionalLevel(CI)) {
3197 Diag(Result, diag::pp_err_else_without_if);
3198 return;
3199 }
3200
3201 // If this is a top-level #else, inform the MIOpt.
3202 if (CurPPLexer->getConditionalStackDepth() == 0)
3203 CurPPLexer->MIOpt.EnterTopLevelConditional();
3204
3205 // If this is a #else with a #else before it, report the error.
3206 if (CI.FoundElse) Diag(Result, diag::pp_err_else_after_else);
3207
3208 if (Callbacks)
3209 Callbacks->Else(Result.getLocation(), CI.IfLoc);
3210
3211 bool RetainExcludedCB = PPOpts->RetainExcludedConditionalBlocks &&
3212 getSourceManager().isInMainFile(Result.getLocation());
3213
3214 if ((PPOpts->SingleFileParseMode && !CI.FoundNonSkip) || RetainExcludedCB) {
3215 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
3216 // the directive blocks.
3217 CurPPLexer->pushConditionalLevel(CI.IfLoc, /*wasskip*/false,
3218 /*foundnonskip*/false, /*foundelse*/true);
3219 return;
3220 }
3221
3222 // Finally, skip the rest of the contents of this block.
3223 SkipExcludedConditionalBlock(HashToken.getLocation(), CI.IfLoc,
3224 /*Foundnonskip*/ true,
3225 /*FoundElse*/ true, Result.getLocation());
3226}
3227
3228/// Implements the \#elif, \#elifdef, and \#elifndef directives.
3229void Preprocessor::HandleElifFamilyDirective(Token &ElifToken,
3230 const Token &HashToken,
3231 tok::PPKeywordKind Kind) {
3232 PPElifDiag DirKind = Kind == tok::pp_elif ? PED_Elif
3233 : Kind == tok::pp_elifdef ? PED_Elifdef
3234 : PED_Elifndef;
3235 ++NumElse;
3236
3237 // #elif directive in a non-skipping conditional... start skipping.
3238 // We don't care what the condition is, because we will always skip it (since
3239 // the block immediately before it was included).
3240 SourceRange ConditionRange = DiscardUntilEndOfDirective();
3241
3242 PPConditionalInfo CI;
3243 if (CurPPLexer->popConditionalLevel(CI)) {
3244 Diag(ElifToken, diag::pp_err_elif_without_if) << DirKind;
3245 return;
3246 }
3247
3248 // If this is a top-level #elif, inform the MIOpt.
3249 if (CurPPLexer->getConditionalStackDepth() == 0)
3250 CurPPLexer->MIOpt.EnterTopLevelConditional();
3251
3252 // If this is a #elif with a #else before it, report the error.
3253 if (CI.FoundElse)
3254 Diag(ElifToken, diag::pp_err_elif_after_else) << DirKind;
3255
3256 if (Callbacks) {
3257 switch (Kind) {
3258 case tok::pp_elif:
3259 Callbacks->Elif(ElifToken.getLocation(), ConditionRange,
3260 PPCallbacks::CVK_NotEvaluated, CI.IfLoc);
3261 break;
3262 case tok::pp_elifdef:
3263 Callbacks->Elifdef(ElifToken.getLocation(), ConditionRange, CI.IfLoc);
3264 break;
3265 case tok::pp_elifndef:
3266 Callbacks->Elifndef(ElifToken.getLocation(), ConditionRange, CI.IfLoc);
3267 break;
3268 default:
3269 assert(false && "unexpected directive kind")((void)0);
3270 break;
3271 }
3272 }
3273
3274 bool RetainExcludedCB = PPOpts->RetainExcludedConditionalBlocks &&
3275 getSourceManager().isInMainFile(ElifToken.getLocation());
3276
3277 if ((PPOpts->SingleFileParseMode && !CI.FoundNonSkip) || RetainExcludedCB) {
3278 // In 'single-file-parse mode' undefined identifiers trigger parsing of all
3279 // the directive blocks.
3280 CurPPLexer->pushConditionalLevel(ElifToken.getLocation(), /*wasskip*/false,
3281 /*foundnonskip*/false, /*foundelse*/false);
3282 return;
3283 }
3284
3285 // Finally, skip the rest of the contents of this block.
3286 SkipExcludedConditionalBlock(
3287 HashToken.getLocation(), CI.IfLoc, /*Foundnonskip*/ true,
3288 /*FoundElse*/ CI.FoundElse, ElifToken.getLocation());
3289}

/usr/src/gnu/usr.bin/clang/libclangLex/../../../llvm/llvm/include/llvm/Support/Allocator.h

1//===- Allocator.h - Simple memory allocation abstraction -------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8/// \file
9///
10/// This file defines the BumpPtrAllocator interface. BumpPtrAllocator conforms
11/// to the LLVM "Allocator" concept and is similar to MallocAllocator, but
12/// objects cannot be deallocated. Their lifetime is tied to the lifetime of the
13/// allocator.
14///
15//===----------------------------------------------------------------------===//
16
17#ifndef LLVM_SUPPORT_ALLOCATOR_H
18#define LLVM_SUPPORT_ALLOCATOR_H
19
20#include "llvm/ADT/Optional.h"
21#include "llvm/ADT/SmallVector.h"
22#include "llvm/Support/Alignment.h"
23#include "llvm/Support/AllocatorBase.h"
24#include "llvm/Support/Compiler.h"
25#include "llvm/Support/ErrorHandling.h"
26#include "llvm/Support/MathExtras.h"
27#include "llvm/Support/MemAlloc.h"
28#include <algorithm>
29#include <cassert>
30#include <cstddef>
31#include <cstdint>
32#include <cstdlib>
33#include <iterator>
34#include <type_traits>
35#include <utility>
36
37namespace llvm {
38
39namespace detail {
40
41// We call out to an external function to actually print the message as the
42// printing code uses Allocator.h in its implementation.
43void printBumpPtrAllocatorStats(unsigned NumSlabs, size_t BytesAllocated,
44 size_t TotalMemory);
45
46} // end namespace detail
47
48/// Allocate memory in an ever growing pool, as if by bump-pointer.
49///
50/// This isn't strictly a bump-pointer allocator as it uses backing slabs of
51/// memory rather than relying on a boundless contiguous heap. However, it has
52/// bump-pointer semantics in that it is a monotonically growing pool of memory
53/// where every allocation is found by merely allocating the next N bytes in
54/// the slab, or the next N bytes in the next slab.
55///
56/// Note that this also has a threshold for forcing allocations above a certain
57/// size into their own slab.
58///
59/// The BumpPtrAllocatorImpl template defaults to using a MallocAllocator
60/// object, which wraps malloc, to allocate memory, but it can be changed to
61/// use a custom allocator.
62///
63/// The GrowthDelay specifies after how many allocated slabs the allocator
64/// increases the size of the slabs.
65template <typename AllocatorT = MallocAllocator, size_t SlabSize = 4096,
66 size_t SizeThreshold = SlabSize, size_t GrowthDelay = 128>
67class BumpPtrAllocatorImpl
68 : public AllocatorBase<BumpPtrAllocatorImpl<AllocatorT, SlabSize,
69 SizeThreshold, GrowthDelay>>,
70 private AllocatorT {
71public:
72 static_assert(SizeThreshold <= SlabSize,
73 "The SizeThreshold must be at most the SlabSize to ensure "
74 "that objects larger than a slab go into their own memory "
75 "allocation.");
76 static_assert(GrowthDelay > 0,
77 "GrowthDelay must be at least 1 which already increases the"
78 "slab size after each allocated slab.");
79
80 BumpPtrAllocatorImpl() = default;
81
82 template <typename T>
83 BumpPtrAllocatorImpl(T &&Allocator)
84 : AllocatorT(std::forward<T &&>(Allocator)) {}
85
86 // Manually implement a move constructor as we must clear the old allocator's
87 // slabs as a matter of correctness.
88 BumpPtrAllocatorImpl(BumpPtrAllocatorImpl &&Old)
89 : AllocatorT(static_cast<AllocatorT &&>(Old)), CurPtr(Old.CurPtr),
90 End(Old.End), Slabs(std::move(Old.Slabs)),
91 CustomSizedSlabs(std::move(Old.CustomSizedSlabs)),
92 BytesAllocated(Old.BytesAllocated), RedZoneSize(Old.RedZoneSize) {
93 Old.CurPtr = Old.End = nullptr;
94 Old.BytesAllocated = 0;
95 Old.Slabs.clear();
96 Old.CustomSizedSlabs.clear();
97 }
98
99 ~BumpPtrAllocatorImpl() {
100 DeallocateSlabs(Slabs.begin(), Slabs.end());
101 DeallocateCustomSizedSlabs();
102 }
103
104 BumpPtrAllocatorImpl &operator=(BumpPtrAllocatorImpl &&RHS) {
105 DeallocateSlabs(Slabs.begin(), Slabs.end());
106 DeallocateCustomSizedSlabs();
107
108 CurPtr = RHS.CurPtr;
109 End = RHS.End;
110 BytesAllocated = RHS.BytesAllocated;
111 RedZoneSize = RHS.RedZoneSize;
112 Slabs = std::move(RHS.Slabs);
113 CustomSizedSlabs = std::move(RHS.CustomSizedSlabs);
114 AllocatorT::operator=(static_cast<AllocatorT &&>(RHS));
115
116 RHS.CurPtr = RHS.End = nullptr;
117 RHS.BytesAllocated = 0;
118 RHS.Slabs.clear();
119 RHS.CustomSizedSlabs.clear();
120 return *this;
121 }
122
123 /// Deallocate all but the current slab and reset the current pointer
124 /// to the beginning of it, freeing all memory allocated so far.
125 void Reset() {
126 // Deallocate all but the first slab, and deallocate all custom-sized slabs.
127 DeallocateCustomSizedSlabs();
128 CustomSizedSlabs.clear();
129
130 if (Slabs.empty())
131 return;
132
133 // Reset the state.
134 BytesAllocated = 0;
135 CurPtr = (char *)Slabs.front();
136 End = CurPtr + SlabSize;
137
138 __asan_poison_memory_region(*Slabs.begin(), computeSlabSize(0));
139 DeallocateSlabs(std::next(Slabs.begin()), Slabs.end());
140 Slabs.erase(std::next(Slabs.begin()), Slabs.end());
141 }
142
143 /// Allocate space at the specified alignment.
144 LLVM_ATTRIBUTE_RETURNS_NONNULL__attribute__((returns_nonnull)) LLVM_ATTRIBUTE_RETURNS_NOALIAS__attribute__((__malloc__)) void *
145 Allocate(size_t Size, Align Alignment) {
146 // Keep track of how many bytes we've allocated.
147 BytesAllocated += Size;
148
149 size_t Adjustment = offsetToAlignedAddr(CurPtr, Alignment);
20
Calling 'offsetToAlignedAddr'
150 assert(Adjustment + Size >= Size && "Adjustment + Size must not overflow")((void)0);
151
152 size_t SizeToAllocate = Size;
153#if LLVM_ADDRESS_SANITIZER_BUILD0
154 // Add trailing bytes as a "red zone" under ASan.
155 SizeToAllocate += RedZoneSize;
156#endif
157
158 // Check if we have enough space.
159 if (Adjustment + SizeToAllocate <= size_t(End - CurPtr)) {
160 char *AlignedPtr = CurPtr + Adjustment;
161 CurPtr = AlignedPtr + SizeToAllocate;
162 // Update the allocation point of this memory block in MemorySanitizer.
163 // Without this, MemorySanitizer messages for values originated from here
164 // will point to the allocation of the entire slab.
165 __msan_allocated_memory(AlignedPtr, Size);
166 // Similarly, tell ASan about this space.
167 __asan_unpoison_memory_region(AlignedPtr, Size);
168 return AlignedPtr;
169 }
170
171 // If Size is really big, allocate a separate slab for it.
172 size_t PaddedSize = SizeToAllocate + Alignment.value() - 1;
173 if (PaddedSize > SizeThreshold) {
174 void *NewSlab =
175 AllocatorT::Allocate(PaddedSize, alignof(std::max_align_t));
176 // We own the new slab and don't want anyone reading anyting other than
177 // pieces returned from this method. So poison the whole slab.
178 __asan_poison_memory_region(NewSlab, PaddedSize);
179 CustomSizedSlabs.push_back(std::make_pair(NewSlab, PaddedSize));
180
181 uintptr_t AlignedAddr = alignAddr(NewSlab, Alignment);
182 assert(AlignedAddr + Size <= (uintptr_t)NewSlab + PaddedSize)((void)0);
183 char *AlignedPtr = (char*)AlignedAddr;
184 __msan_allocated_memory(AlignedPtr, Size);
185 __asan_unpoison_memory_region(AlignedPtr, Size);
186 return AlignedPtr;
187 }
188
189 // Otherwise, start a new slab and try again.
190 StartNewSlab();
191 uintptr_t AlignedAddr = alignAddr(CurPtr, Alignment);
192 assert(AlignedAddr + SizeToAllocate <= (uintptr_t)End &&((void)0)
193 "Unable to allocate memory!")((void)0);
194 char *AlignedPtr = (char*)AlignedAddr;
195 CurPtr = AlignedPtr + SizeToAllocate;
196 __msan_allocated_memory(AlignedPtr, Size);
197 __asan_unpoison_memory_region(AlignedPtr, Size);
198 return AlignedPtr;
199 }
200
201 inline LLVM_ATTRIBUTE_RETURNS_NONNULL__attribute__((returns_nonnull)) LLVM_ATTRIBUTE_RETURNS_NOALIAS__attribute__((__malloc__)) void *
202 Allocate(size_t Size, size_t Alignment) {
203 assert(Alignment > 0 && "0-byte alignment is not allowed. Use 1 instead.")((void)0);
204 return Allocate(Size, Align(Alignment));
19
Calling 'BumpPtrAllocatorImpl::Allocate'
205 }
206
207 // Pull in base class overloads.
208 using AllocatorBase<BumpPtrAllocatorImpl>::Allocate;
209
210 // Bump pointer allocators are expected to never free their storage; and
211 // clients expect pointers to remain valid for non-dereferencing uses even
212 // after deallocation.
213 void Deallocate(const void *Ptr, size_t Size, size_t /*Alignment*/) {
214 __asan_poison_memory_region(Ptr, Size);
215 }
216
217 // Pull in base class overloads.
218 using AllocatorBase<BumpPtrAllocatorImpl>::Deallocate;
219
220 size_t GetNumSlabs() const { return Slabs.size() + CustomSizedSlabs.size(); }
221
222 /// \return An index uniquely and reproducibly identifying
223 /// an input pointer \p Ptr in the given allocator.
224 /// The returned value is negative iff the object is inside a custom-size
225 /// slab.
226 /// Returns an empty optional if the pointer is not found in the allocator.
227 llvm::Optional<int64_t> identifyObject(const void *Ptr) {
228 const char *P = static_cast<const char *>(Ptr);
229 int64_t InSlabIdx = 0;
230 for (size_t Idx = 0, E = Slabs.size(); Idx < E; Idx++) {
231 const char *S = static_cast<const char *>(Slabs[Idx]);
232 if (P >= S && P < S + computeSlabSize(Idx))
233 return InSlabIdx + static_cast<int64_t>(P - S);
234 InSlabIdx += static_cast<int64_t>(computeSlabSize(Idx));
235 }
236
237 // Use negative index to denote custom sized slabs.
238 int64_t InCustomSizedSlabIdx = -1;
239 for (size_t Idx = 0, E = CustomSizedSlabs.size(); Idx < E; Idx++) {
240 const char *S = static_cast<const char *>(CustomSizedSlabs[Idx].first);
241 size_t Size = CustomSizedSlabs[Idx].second;
242 if (P >= S && P < S + Size)
243 return InCustomSizedSlabIdx - static_cast<int64_t>(P - S);
244 InCustomSizedSlabIdx -= static_cast<int64_t>(Size);
245 }
246 return None;
247 }
248
249 /// A wrapper around identifyObject that additionally asserts that
250 /// the object is indeed within the allocator.
251 /// \return An index uniquely and reproducibly identifying
252 /// an input pointer \p Ptr in the given allocator.
253 int64_t identifyKnownObject(const void *Ptr) {
254 Optional<int64_t> Out = identifyObject(Ptr);
255 assert(Out && "Wrong allocator used")((void)0);
256 return *Out;
257 }
258
259 /// A wrapper around identifyKnownObject. Accepts type information
260 /// about the object and produces a smaller identifier by relying on
261 /// the alignment information. Note that sub-classes may have different
262 /// alignment, so the most base class should be passed as template parameter
263 /// in order to obtain correct results. For that reason automatic template
264 /// parameter deduction is disabled.
265 /// \return An index uniquely and reproducibly identifying
266 /// an input pointer \p Ptr in the given allocator. This identifier is
267 /// different from the ones produced by identifyObject and
268 /// identifyAlignedObject.
269 template <typename T>
270 int64_t identifyKnownAlignedObject(const void *Ptr) {
271 int64_t Out = identifyKnownObject(Ptr);
272 assert(Out % alignof(T) == 0 && "Wrong alignment information")((void)0);
273 return Out / alignof(T);
274 }
275
276 size_t getTotalMemory() const {
277 size_t TotalMemory = 0;
278 for (auto I = Slabs.begin(), E = Slabs.end(); I != E; ++I)
279 TotalMemory += computeSlabSize(std::distance(Slabs.begin(), I));
280 for (auto &PtrAndSize : CustomSizedSlabs)
281 TotalMemory += PtrAndSize.second;
282 return TotalMemory;
283 }
284
285 size_t getBytesAllocated() const { return BytesAllocated; }
286
287 void setRedZoneSize(size_t NewSize) {
288 RedZoneSize = NewSize;
289 }
290
291 void PrintStats() const {
292 detail::printBumpPtrAllocatorStats(Slabs.size(), BytesAllocated,
293 getTotalMemory());
294 }
295
296private:
297 /// The current pointer into the current slab.
298 ///
299 /// This points to the next free byte in the slab.
300 char *CurPtr = nullptr;
301
302 /// The end of the current slab.
303 char *End = nullptr;
304
305 /// The slabs allocated so far.
306 SmallVector<void *, 4> Slabs;
307
308 /// Custom-sized slabs allocated for too-large allocation requests.
309 SmallVector<std::pair<void *, size_t>, 0> CustomSizedSlabs;
310
311 /// How many bytes we've allocated.
312 ///
313 /// Used so that we can compute how much space was wasted.
314 size_t BytesAllocated = 0;
315
316 /// The number of bytes to put between allocations when running under
317 /// a sanitizer.
318 size_t RedZoneSize = 1;
319
320 static size_t computeSlabSize(unsigned SlabIdx) {
321 // Scale the actual allocated slab size based on the number of slabs
322 // allocated. Every GrowthDelay slabs allocated, we double
323 // the allocated size to reduce allocation frequency, but saturate at
324 // multiplying the slab size by 2^30.
325 return SlabSize *
326 ((size_t)1 << std::min<size_t>(30, SlabIdx / GrowthDelay));
327 }
328
329 /// Allocate a new slab and move the bump pointers over into the new
330 /// slab, modifying CurPtr and End.
331 void StartNewSlab() {
332 size_t AllocatedSlabSize = computeSlabSize(Slabs.size());
333
334 void *NewSlab =
335 AllocatorT::Allocate(AllocatedSlabSize, alignof(std::max_align_t));
336 // We own the new slab and don't want anyone reading anything other than
337 // pieces returned from this method. So poison the whole slab.
338 __asan_poison_memory_region(NewSlab, AllocatedSlabSize);
339
340 Slabs.push_back(NewSlab);
341 CurPtr = (char *)(NewSlab);
342 End = ((char *)NewSlab) + AllocatedSlabSize;
343 }
344
345 /// Deallocate a sequence of slabs.
346 void DeallocateSlabs(SmallVectorImpl<void *>::iterator I,
347 SmallVectorImpl<void *>::iterator E) {
348 for (; I != E; ++I) {
349 size_t AllocatedSlabSize =
350 computeSlabSize(std::distance(Slabs.begin(), I));
351 AllocatorT::Deallocate(*I, AllocatedSlabSize, alignof(std::max_align_t));
352 }
353 }
354
355 /// Deallocate all memory for custom sized slabs.
356 void DeallocateCustomSizedSlabs() {
357 for (auto &PtrAndSize : CustomSizedSlabs) {
358 void *Ptr = PtrAndSize.first;
359 size_t Size = PtrAndSize.second;
360 AllocatorT::Deallocate(Ptr, Size, alignof(std::max_align_t));
361 }
362 }
363
364 template <typename T> friend class SpecificBumpPtrAllocator;
365};
366
367/// The standard BumpPtrAllocator which just uses the default template
368/// parameters.
369typedef BumpPtrAllocatorImpl<> BumpPtrAllocator;
370
371/// A BumpPtrAllocator that allows only elements of a specific type to be
372/// allocated.
373///
374/// This allows calling the destructor in DestroyAll() and when the allocator is
375/// destroyed.
376template <typename T> class SpecificBumpPtrAllocator {
377 BumpPtrAllocator Allocator;
378
379public:
380 SpecificBumpPtrAllocator() {
381 // Because SpecificBumpPtrAllocator walks the memory to call destructors,
382 // it can't have red zones between allocations.
383 Allocator.setRedZoneSize(0);
384 }
385 SpecificBumpPtrAllocator(SpecificBumpPtrAllocator &&Old)
386 : Allocator(std::move(Old.Allocator)) {}
387 ~SpecificBumpPtrAllocator() { DestroyAll(); }
388
389 SpecificBumpPtrAllocator &operator=(SpecificBumpPtrAllocator &&RHS) {
390 Allocator = std::move(RHS.Allocator);
391 return *this;
392 }
393
394 /// Call the destructor of each allocated object and deallocate all but the
395 /// current slab and reset the current pointer to the beginning of it, freeing
396 /// all memory allocated so far.
397 void DestroyAll() {
398 auto DestroyElements = [](char *Begin, char *End) {
399 assert(Begin == (char *)alignAddr(Begin, Align::Of<T>()))((void)0);
400 for (char *Ptr = Begin; Ptr + sizeof(T) <= End; Ptr += sizeof(T))
401 reinterpret_cast<T *>(Ptr)->~T();
402 };
403
404 for (auto I = Allocator.Slabs.begin(), E = Allocator.Slabs.end(); I != E;
405 ++I) {
406 size_t AllocatedSlabSize = BumpPtrAllocator::computeSlabSize(
407 std::distance(Allocator.Slabs.begin(), I));
408 char *Begin = (char *)alignAddr(*I, Align::Of<T>());
409 char *End = *I == Allocator.Slabs.back() ? Allocator.CurPtr
410 : (char *)*I + AllocatedSlabSize;
411
412 DestroyElements(Begin, End);
413 }
414
415 for (auto &PtrAndSize : Allocator.CustomSizedSlabs) {
416 void *Ptr = PtrAndSize.first;
417 size_t Size = PtrAndSize.second;
418 DestroyElements((char *)alignAddr(Ptr, Align::Of<T>()),
419 (char *)Ptr + Size);
420 }
421
422 Allocator.Reset();
423 }
424
425 /// Allocate space for an array of objects without constructing them.
426 T *Allocate(size_t num = 1) { return Allocator.Allocate<T>(num); }
427};
428
429} // end namespace llvm
430
431template <typename AllocatorT, size_t SlabSize, size_t SizeThreshold,
432 size_t GrowthDelay>
433void *
434operator new(size_t Size,
435 llvm::BumpPtrAllocatorImpl<AllocatorT, SlabSize, SizeThreshold,
436 GrowthDelay> &Allocator) {
437 return Allocator.Allocate(Size, std::min((size_t)llvm::NextPowerOf2(Size),
18
Calling 'BumpPtrAllocatorImpl::Allocate'
438 alignof(std::max_align_t)));
439}
440
441template <typename AllocatorT, size_t SlabSize, size_t SizeThreshold,
442 size_t GrowthDelay>
443void operator delete(void *,
444 llvm::BumpPtrAllocatorImpl<AllocatorT, SlabSize,
445 SizeThreshold, GrowthDelay> &) {
446}
447
448#endif // LLVM_SUPPORT_ALLOCATOR_H

/usr/src/gnu/usr.bin/clang/libclangLex/../../../llvm/llvm/include/llvm/Support/Alignment.h

1//===-- llvm/Support/Alignment.h - Useful alignment functions ---*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains types to represent alignments.
10// They are instrumented to guarantee some invariants are preserved and prevent
11// invalid manipulations.
12//
13// - Align represents an alignment in bytes, it is always set and always a valid
14// power of two, its minimum value is 1 which means no alignment requirements.
15//
16// - MaybeAlign is an optional type, it may be undefined or set. When it's set
17// you can get the underlying Align type by using the getValue() method.
18//
19//===----------------------------------------------------------------------===//
20
21#ifndef LLVM_SUPPORT_ALIGNMENT_H_
22#define LLVM_SUPPORT_ALIGNMENT_H_
23
24#include "llvm/ADT/Optional.h"
25#include "llvm/Support/MathExtras.h"
26#include <cassert>
27#ifndef NDEBUG1
28#include <string>
29#endif // NDEBUG
30
31namespace llvm {
32
33#define ALIGN_CHECK_ISPOSITIVE(decl) \
34 assert(decl > 0 && (#decl " should be defined"))((void)0)
35
36/// This struct is a compact representation of a valid (non-zero power of two)
37/// alignment.
38/// It is suitable for use as static global constants.
39struct Align {
40private:
41 uint8_t ShiftValue = 0; /// The log2 of the required alignment.
42 /// ShiftValue is less than 64 by construction.
43
44 friend struct MaybeAlign;
45 friend unsigned Log2(Align);
46 friend bool operator==(Align Lhs, Align Rhs);
47 friend bool operator!=(Align Lhs, Align Rhs);
48 friend bool operator<=(Align Lhs, Align Rhs);
49 friend bool operator>=(Align Lhs, Align Rhs);
50 friend bool operator<(Align Lhs, Align Rhs);
51 friend bool operator>(Align Lhs, Align Rhs);
52 friend unsigned encode(struct MaybeAlign A);
53 friend struct MaybeAlign decodeMaybeAlign(unsigned Value);
54
55 /// A trivial type to allow construction of constexpr Align.
56 /// This is currently needed to workaround a bug in GCC 5.3 which prevents
57 /// definition of constexpr assign operators.
58 /// https://stackoverflow.com/questions/46756288/explicitly-defaulted-function-cannot-be-declared-as-constexpr-because-the-implic
59 /// FIXME: Remove this, make all assign operators constexpr and introduce user
60 /// defined literals when we don't have to support GCC 5.3 anymore.
61 /// https://llvm.org/docs/GettingStarted.html#getting-a-modern-host-c-toolchain
62 struct LogValue {
63 uint8_t Log;
64 };
65
66public:
67 /// Default is byte-aligned.
68 constexpr Align() = default;
69 /// Do not perform checks in case of copy/move construct/assign, because the
70 /// checks have been performed when building `Other`.
71 constexpr Align(const Align &Other) = default;
72 constexpr Align(Align &&Other) = default;
73 Align &operator=(const Align &Other) = default;
74 Align &operator=(Align &&Other) = default;
75
76 explicit Align(uint64_t Value) {
77 assert(Value > 0 && "Value must not be 0")((void)0);
78 assert(llvm::isPowerOf2_64(Value) && "Alignment is not a power of 2")((void)0);
79 ShiftValue = Log2_64(Value);
80 assert(ShiftValue < 64 && "Broken invariant")((void)0);
81 }
82
83 /// This is a hole in the type system and should not be abused.
84 /// Needed to interact with C for instance.
85 uint64_t value() const { return uint64_t(1) << ShiftValue; }
25
The result of the left shift is undefined due to shifting by '255', which is greater or equal to the width of type 'uint64_t'
86
87 /// Allow constructions of constexpr Align.
88 template <size_t kValue> constexpr static LogValue Constant() {
89 return LogValue{static_cast<uint8_t>(CTLog2<kValue>())};
90 }
91
92 /// Allow constructions of constexpr Align from types.
93 /// Compile time equivalent to Align(alignof(T)).
94 template <typename T> constexpr static LogValue Of() {
95 return Constant<std::alignment_of<T>::value>();
96 }
97
98 /// Constexpr constructor from LogValue type.
99 constexpr Align(LogValue CA) : ShiftValue(CA.Log) {}
100};
101
102/// Treats the value 0 as a 1, so Align is always at least 1.
103inline Align assumeAligned(uint64_t Value) {
104 return Value ? Align(Value) : Align();
105}
106
107/// This struct is a compact representation of a valid (power of two) or
108/// undefined (0) alignment.
109struct MaybeAlign : public llvm::Optional<Align> {
110private:
111 using UP = llvm::Optional<Align>;
112
113public:
114 /// Default is undefined.
115 MaybeAlign() = default;
116 /// Do not perform checks in case of copy/move construct/assign, because the
117 /// checks have been performed when building `Other`.
118 MaybeAlign(const MaybeAlign &Other) = default;
119 MaybeAlign &operator=(const MaybeAlign &Other) = default;
120 MaybeAlign(MaybeAlign &&Other) = default;
121 MaybeAlign &operator=(MaybeAlign &&Other) = default;
122
123 /// Use llvm::Optional<Align> constructor.
124 using UP::UP;
125
126 explicit MaybeAlign(uint64_t Value) {
127 assert((Value == 0 || llvm::isPowerOf2_64(Value)) &&((void)0)
128 "Alignment is neither 0 nor a power of 2")((void)0);
129 if (Value)
130 emplace(Value);
131 }
132
133 /// For convenience, returns a valid alignment or 1 if undefined.
134 Align valueOrOne() const { return hasValue() ? getValue() : Align(); }
135};
136
137/// Checks that SizeInBytes is a multiple of the alignment.
138inline bool isAligned(Align Lhs, uint64_t SizeInBytes) {
139 return SizeInBytes % Lhs.value() == 0;
140}
141
142/// Checks that Addr is a multiple of the alignment.
143inline bool isAddrAligned(Align Lhs, const void *Addr) {
144 return isAligned(Lhs, reinterpret_cast<uintptr_t>(Addr));
145}
146
147/// Returns a multiple of A needed to store `Size` bytes.
148inline uint64_t alignTo(uint64_t Size, Align A) {
149 const uint64_t Value = A.value();
24
Calling 'Align::value'
150 // The following line is equivalent to `(Size + Value - 1) / Value * Value`.
151
152 // The division followed by a multiplication can be thought of as a right
153 // shift followed by a left shift which zeros out the extra bits produced in
154 // the bump; `~(Value - 1)` is a mask where all those bits being zeroed out
155 // are just zero.
156
157 // Most compilers can generate this code but the pattern may be missed when
158 // multiple functions gets inlined.
159 return (Size + Value - 1) & ~(Value - 1U);
160}
161
162/// If non-zero \p Skew is specified, the return value will be a minimal integer
163/// that is greater than or equal to \p Size and equal to \p A * N + \p Skew for
164/// some integer N. If \p Skew is larger than \p A, its value is adjusted to '\p
165/// Skew mod \p A'.
166///
167/// Examples:
168/// \code
169/// alignTo(5, Align(8), 7) = 7
170/// alignTo(17, Align(8), 1) = 17
171/// alignTo(~0LL, Align(8), 3) = 3
172/// \endcode
173inline uint64_t alignTo(uint64_t Size, Align A, uint64_t Skew) {
174 const uint64_t Value = A.value();
175 Skew %= Value;
176 return ((Size + Value - 1 - Skew) & ~(Value - 1U)) + Skew;
177}
178
179/// Returns a multiple of A needed to store `Size` bytes.
180/// Returns `Size` if current alignment is undefined.
181inline uint64_t alignTo(uint64_t Size, MaybeAlign A) {
182 return A ? alignTo(Size, A.getValue()) : Size;
183}
184
185/// Aligns `Addr` to `Alignment` bytes, rounding up.
186inline uintptr_t alignAddr(const void *Addr, Align Alignment) {
187 uintptr_t ArithAddr = reinterpret_cast<uintptr_t>(Addr);
188 assert(static_cast<uintptr_t>(ArithAddr + Alignment.value() - 1) >=((void)0)
189 ArithAddr &&((void)0)
190 "Overflow")((void)0);
191 return alignTo(ArithAddr, Alignment);
192}
193
194/// Returns the offset to the next integer (mod 2**64) that is greater than
195/// or equal to \p Value and is a multiple of \p Align.
196inline uint64_t offsetToAlignment(uint64_t Value, Align Alignment) {
197 return alignTo(Value, Alignment) - Value;
22
The value 255 is assigned to 'A.ShiftValue'
23
Calling 'alignTo'
198}
199
200/// Returns the necessary adjustment for aligning `Addr` to `Alignment`
201/// bytes, rounding up.
202inline uint64_t offsetToAlignedAddr(const void *Addr, Align Alignment) {
203 return offsetToAlignment(reinterpret_cast<uintptr_t>(Addr), Alignment);
21
Calling 'offsetToAlignment'
204}
205
206/// Returns the log2 of the alignment.
207inline unsigned Log2(Align A) { return A.ShiftValue; }
208
209/// Returns the alignment that satisfies both alignments.
210/// Same semantic as MinAlign.
211inline Align commonAlignment(Align A, Align B) { return std::min(A, B); }
212
213/// Returns the alignment that satisfies both alignments.
214/// Same semantic as MinAlign.
215inline Align commonAlignment(Align A, uint64_t Offset) {
216 return Align(MinAlign(A.value(), Offset));
217}
218
219/// Returns the alignment that satisfies both alignments.
220/// Same semantic as MinAlign.
221inline MaybeAlign commonAlignment(MaybeAlign A, MaybeAlign B) {
222 return A && B ? commonAlignment(*A, *B) : A ? A : B;
223}
224
225/// Returns the alignment that satisfies both alignments.
226/// Same semantic as MinAlign.
227inline MaybeAlign commonAlignment(MaybeAlign A, uint64_t Offset) {
228 return MaybeAlign(MinAlign((*A).value(), Offset));
229}
230
231/// Returns a representation of the alignment that encodes undefined as 0.
232inline unsigned encode(MaybeAlign A) { return A ? A->ShiftValue + 1 : 0; }
233
234/// Dual operation of the encode function above.
235inline MaybeAlign decodeMaybeAlign(unsigned Value) {
236 if (Value == 0)
237 return MaybeAlign();
238 Align Out;
239 Out.ShiftValue = Value - 1;
240 return Out;
241}
242
243/// Returns a representation of the alignment, the encoded value is positive by
244/// definition.
245inline unsigned encode(Align A) { return encode(MaybeAlign(A)); }
246
247/// Comparisons between Align and scalars. Rhs must be positive.
248inline bool operator==(Align Lhs, uint64_t Rhs) {
249 ALIGN_CHECK_ISPOSITIVE(Rhs);
250 return Lhs.value() == Rhs;
251}
252inline bool operator!=(Align Lhs, uint64_t Rhs) {
253 ALIGN_CHECK_ISPOSITIVE(Rhs);
254 return Lhs.value() != Rhs;
255}
256inline bool operator<=(Align Lhs, uint64_t Rhs) {
257 ALIGN_CHECK_ISPOSITIVE(Rhs);
258 return Lhs.value() <= Rhs;
259}
260inline bool operator>=(Align Lhs, uint64_t Rhs) {
261 ALIGN_CHECK_ISPOSITIVE(Rhs);
262 return Lhs.value() >= Rhs;
263}
264inline bool operator<(Align Lhs, uint64_t Rhs) {
265 ALIGN_CHECK_ISPOSITIVE(Rhs);
266 return Lhs.value() < Rhs;
267}
268inline bool operator>(Align Lhs, uint64_t Rhs) {
269 ALIGN_CHECK_ISPOSITIVE(Rhs);
270 return Lhs.value() > Rhs;
271}
272
273/// Comparisons between MaybeAlign and scalars.
274inline bool operator==(MaybeAlign Lhs, uint64_t Rhs) {
275 return Lhs ? (*Lhs).value() == Rhs : Rhs == 0;
276}
277inline bool operator!=(MaybeAlign Lhs, uint64_t Rhs) {
278 return Lhs ? (*Lhs).value() != Rhs : Rhs != 0;
279}
280
281/// Comparisons operators between Align.
282inline bool operator==(Align Lhs, Align Rhs) {
283 return Lhs.ShiftValue == Rhs.ShiftValue;
284}
285inline bool operator!=(Align Lhs, Align Rhs) {
286 return Lhs.ShiftValue != Rhs.ShiftValue;
287}
288inline bool operator<=(Align Lhs, Align Rhs) {
289 return Lhs.ShiftValue <= Rhs.ShiftValue;
290}
291inline bool operator>=(Align Lhs, Align Rhs) {
292 return Lhs.ShiftValue >= Rhs.ShiftValue;
293}
294inline bool operator<(Align Lhs, Align Rhs) {
295 return Lhs.ShiftValue < Rhs.ShiftValue;
296}
297inline bool operator>(Align Lhs, Align Rhs) {
298 return Lhs.ShiftValue > Rhs.ShiftValue;
299}
300
301// Don't allow relational comparisons with MaybeAlign.
302bool operator<=(Align Lhs, MaybeAlign Rhs) = delete;
303bool operator>=(Align Lhs, MaybeAlign Rhs) = delete;
304bool operator<(Align Lhs, MaybeAlign Rhs) = delete;
305bool operator>(Align Lhs, MaybeAlign Rhs) = delete;
306
307bool operator<=(MaybeAlign Lhs, Align Rhs) = delete;
308bool operator>=(MaybeAlign Lhs, Align Rhs) = delete;
309bool operator<(MaybeAlign Lhs, Align Rhs) = delete;
310bool operator>(MaybeAlign Lhs, Align Rhs) = delete;
311
312bool operator<=(MaybeAlign Lhs, MaybeAlign Rhs) = delete;
313bool operator>=(MaybeAlign Lhs, MaybeAlign Rhs) = delete;
314bool operator<(MaybeAlign Lhs, MaybeAlign Rhs) = delete;
315bool operator>(MaybeAlign Lhs, MaybeAlign Rhs) = delete;
316
317inline Align operator*(Align Lhs, uint64_t Rhs) {
318 assert(Rhs > 0 && "Rhs must be positive")((void)0);
319 return Align(Lhs.value() * Rhs);
320}
321
322inline MaybeAlign operator*(MaybeAlign Lhs, uint64_t Rhs) {
323 assert(Rhs > 0 && "Rhs must be positive")((void)0);
324 return Lhs ? Lhs.getValue() * Rhs : MaybeAlign();
325}
326
327inline Align operator/(Align Lhs, uint64_t Divisor) {
328 assert(llvm::isPowerOf2_64(Divisor) &&((void)0)
329 "Divisor must be positive and a power of 2")((void)0);
330 assert(Lhs != 1 && "Can't halve byte alignment")((void)0);
331 return Align(Lhs.value() / Divisor);
332}
333
334inline MaybeAlign operator/(MaybeAlign Lhs, uint64_t Divisor) {
335 assert(llvm::isPowerOf2_64(Divisor) &&((void)0)
336 "Divisor must be positive and a power of 2")((void)0);
337 return Lhs ? Lhs.getValue() / Divisor : MaybeAlign();
338}
339
340inline Align max(MaybeAlign Lhs, Align Rhs) {
341 return Lhs && *Lhs > Rhs ? *Lhs : Rhs;
342}
343
344inline Align max(Align Lhs, MaybeAlign Rhs) {
345 return Rhs && *Rhs > Lhs ? *Rhs : Lhs;
346}
347
348#ifndef NDEBUG1
349// For usage in LLVM_DEBUG macros.
350inline std::string DebugStr(const Align &A) {
351 return std::to_string(A.value());
352}
353// For usage in LLVM_DEBUG macros.
354inline std::string DebugStr(const MaybeAlign &MA) {
355 if (MA)
356 return std::to_string(MA->value());
357 return "None";
358}
359#endif // NDEBUG
360
361#undef ALIGN_CHECK_ISPOSITIVE
362
363} // namespace llvm
364
365#endif // LLVM_SUPPORT_ALIGNMENT_H_