clang  7.0.0svn
Enumerations | Functions
PPMacroExpansion.cpp File Reference
#include "clang/Basic/Attributes.h"
#include "clang/Basic/FileManager.h"
#include "clang/Basic/IdentifierTable.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/LangOptions.h"
#include "clang/Basic/ObjCRuntime.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Lex/CodeCompletionHandler.h"
#include "clang/Lex/DirectoryLookup.h"
#include "clang/Lex/ExternalPreprocessorSource.h"
#include "clang/Lex/LexDiagnostic.h"
#include "clang/Lex/MacroArgs.h"
#include "clang/Lex/MacroInfo.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/Lex/PreprocessorLexer.h"
#include "clang/Lex/PTHLexer.h"
#include "clang/Lex/Token.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/None.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Config/llvm-config.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstring>
#include <ctime>
#include <string>
#include <tuple>
#include <utility>
Include dependency graph for PPMacroExpansion.cpp:

Go to the source code of this file.

Enumerations

enum  Bracket { Brace, Paren }
 

Functions

static IdentifierInfoRegisterBuiltinMacro (Preprocessor &PP, const char *Name)
 RegisterBuiltinMacro - Register the specified identifier in the identifier table and mark it as a builtin macro to be expanded. More...
 
static bool isTrivialSingleTokenExpansion (const MacroInfo *MI, const IdentifierInfo *MacroIdent, Preprocessor &PP)
 isTrivialSingleTokenExpansion - Return true if MI, which has a single token in its expansion, currently expands to that token literally. More...
 
static bool CheckMatchedBrackets (const SmallVectorImpl< Token > &Tokens)
 CheckMatchedBrackets - Returns true if the braces and parentheses in the token vector are properly nested. More...
 
static bool GenerateNewArgTokens (Preprocessor &PP, SmallVectorImpl< Token > &OldTokens, SmallVectorImpl< Token > &NewTokens, unsigned &NumArgs, SmallVectorImpl< SourceRange > &ParenHints, SmallVectorImpl< SourceRange > &InitLists)
 GenerateNewArgTokens - Returns true if OldTokens can be converted to a new vector of tokens in NewTokens. More...
 
static void ComputeDATE_TIME (SourceLocation &DATELoc, SourceLocation &TIMELoc, Preprocessor &PP)
 ComputeDATE_TIME - Compute the current time, enter it into the specified scratch buffer, then return DATELoc/TIMELoc locations with the position of the identifier tokens inserted. More...
 
static bool HasFeature (const Preprocessor &PP, StringRef Feature)
 HasFeature - Return true if we recognize and implement the feature specified by the identifier as a standard language feature. More...
 
static bool HasExtension (const Preprocessor &PP, StringRef Extension)
 HasExtension - Return true if we recognize and implement the feature specified by the identifier, either as an extension or a standard language feature. More...
 
static bool EvaluateHasIncludeCommon (Token &Tok, IdentifierInfo *II, Preprocessor &PP, const DirectoryLookup *LookupFrom, const FileEntry *LookupFromFile)
 EvaluateHasIncludeCommon - Process a '__has_include("path")' or '__has_include_next("path")' expression. More...
 
static bool EvaluateHasInclude (Token &Tok, IdentifierInfo *II, Preprocessor &PP)
 EvaluateHasInclude - Process a '__has_include("path")' expression. More...
 
static bool EvaluateHasIncludeNext (Token &Tok, IdentifierInfo *II, Preprocessor &PP)
 EvaluateHasIncludeNext - Process '__has_include_next("path")' expression. More...
 
static void EvaluateFeatureLikeBuiltinMacro (llvm::raw_svector_ostream &OS, Token &Tok, IdentifierInfo *II, Preprocessor &PP, llvm::function_ref< int(Token &Tok, bool &HasLexedNextTok)> Op)
 Process single-argument builtin feature-like macros that return integer values. More...
 
static IdentifierInfoExpectFeatureIdentifierInfo (Token &Tok, Preprocessor &PP, signed DiagID)
 Helper function to return the IdentifierInfo structure of a Token or generate a diagnostic if none available. More...
 
static bool isTargetArch (const TargetInfo &TI, const IdentifierInfo *II)
 Implements the __is_target_arch builtin macro. More...
 
static bool isTargetVendor (const TargetInfo &TI, const IdentifierInfo *II)
 Implements the __is_target_vendor builtin macro. More...
 
static bool isTargetOS (const TargetInfo &TI, const IdentifierInfo *II)
 Implements the __is_target_os builtin macro. More...
 
static bool isTargetEnvironment (const TargetInfo &TI, const IdentifierInfo *II)
 Implements the __is_target_environment builtin macro. More...
 

Enumeration Type Documentation

◆ Bracket

enum Bracket
Enumerator
Brace 
Paren 

Definition at line 622 of file PPMacroExpansion.cpp.

Function Documentation

◆ CheckMatchedBrackets()

static bool CheckMatchedBrackets ( const SmallVectorImpl< Token > &  Tokens)
static

CheckMatchedBrackets - Returns true if the braces and parentheses in the token vector are properly nested.

Definition at line 629 of file PPMacroExpansion.cpp.

Referenced by GenerateNewArgTokens().

◆ ComputeDATE_TIME()

static void ComputeDATE_TIME ( SourceLocation DATELoc,
SourceLocation TIMELoc,
Preprocessor PP 
)
static

ComputeDATE_TIME - Compute the current time, enter it into the specified scratch buffer, then return DATELoc/TIMELoc locations with the position of the identifier tokens inserted.

Definition at line 1062 of file PPMacroExpansion.cpp.

References clang::Preprocessor::CreateString(), clang::Token::getLocation(), and clang::Token::startToken().

Referenced by isTargetEnvironment().

◆ EvaluateFeatureLikeBuiltinMacro()

static void EvaluateFeatureLikeBuiltinMacro ( llvm::raw_svector_ostream &  OS,
Token Tok,
IdentifierInfo II,
Preprocessor PP,
llvm::function_ref< int(Token &Tok, bool &HasLexedNextTok)>  Op 
)
static

◆ EvaluateHasInclude()

static bool EvaluateHasInclude ( Token Tok,
IdentifierInfo II,
Preprocessor PP 
)
static

EvaluateHasInclude - Process a '__has_include("path")' expression.

Returns true if successful.

Definition at line 1446 of file PPMacroExpansion.cpp.

References EvaluateHasIncludeCommon().

Referenced by isTargetEnvironment().

◆ EvaluateHasIncludeCommon()

static bool EvaluateHasIncludeCommon ( Token Tok,
IdentifierInfo II,
Preprocessor PP,
const DirectoryLookup LookupFrom,
const FileEntry LookupFromFile 
)
static

◆ EvaluateHasIncludeNext()

static bool EvaluateHasIncludeNext ( Token Tok,
IdentifierInfo II,
Preprocessor PP 
)
static

◆ ExpectFeatureIdentifierInfo()

static IdentifierInfo* ExpectFeatureIdentifierInfo ( Token Tok,
Preprocessor PP,
signed  DiagID 
)
static

Helper function to return the IdentifierInfo structure of a Token or generate a diagnostic if none available.

Definition at line 1590 of file PPMacroExpansion.cpp.

References clang::Preprocessor::Diag(), clang::Token::getIdentifierInfo(), clang::Token::getLocation(), and clang::Token::isAnnotation().

Referenced by isTargetEnvironment().

◆ GenerateNewArgTokens()

static bool GenerateNewArgTokens ( Preprocessor PP,
SmallVectorImpl< Token > &  OldTokens,
SmallVectorImpl< Token > &  NewTokens,
unsigned &  NumArgs,
SmallVectorImpl< SourceRange > &  ParenHints,
SmallVectorImpl< SourceRange > &  InitLists 
)
static

GenerateNewArgTokens - Returns true if OldTokens can be converted to a new vector of tokens in NewTokens.

The new number of arguments will be placed in NumArgs and the ranges which need to surrounded in parentheses will be in ParenHints. Returns false if the token stream cannot be changed. If this is because of an initializer list starting a macro argument, the range of those initializer lists will be place in InitLists.

Definition at line 658 of file PPMacroExpansion.cpp.

References CheckMatchedBrackets().

◆ HasExtension()

static bool HasExtension ( const Preprocessor PP,
StringRef  Extension 
)
static

HasExtension - Return true if we recognize and implement the feature specified by the identifier, either as an extension or a standard language feature.

Definition at line 1285 of file PPMacroExpansion.cpp.

References clang::diag::Error, clang::Preprocessor::getDiagnostics(), clang::DiagnosticsEngine::getExtensionHandlingBehavior(), clang::Preprocessor::getLangOpts(), clang::Preprocessor::getTargetInfo(), HasFeature(), and clang::TargetInfo::isTLSSupported().

Referenced by isTargetEnvironment().

◆ HasFeature()

static bool HasFeature ( const Preprocessor PP,
StringRef  Feature 
)
static

◆ isTargetArch()

static bool isTargetArch ( const TargetInfo TI,
const IdentifierInfo II 
)
static

Implements the __is_target_arch builtin macro.

Definition at line 1602 of file PPMacroExpansion.cpp.

References clang::IdentifierInfo::getName(), and clang::TargetInfo::getTriple().

Referenced by isTargetEnvironment().

◆ isTargetEnvironment()

static bool isTargetEnvironment ( const TargetInfo TI,
const IdentifierInfo II 
)
static

Implements the __is_target_environment builtin macro.

Definition at line 1644 of file PPMacroExpansion.cpp.

References clang::Preprocessor::AdvanceToTokenCharacter(), clang::C, clang::Token::clearFlag(), ComputeDATE_TIME(), clang::SourceManager::createExpansionLoc(), clang::Preprocessor::CreateString(), clang::LangOptions::CurrentModule, clang::CXX, clang::Declspec, Depth, clang::Preprocessor::Diag(), clang::comments::tok::eof, EvaluateFeatureLikeBuiltinMacro(), EvaluateHasInclude(), EvaluateHasIncludeNext(), ExpectFeatureIdentifierInfo(), clang::Preprocessor::FinishLexStringLiteral(), clang::IdentifierInfo::getBuiltinID(), clang::Preprocessor::getCurrentFileLexer(), clang::DiagnosticsEngine::getDiagnosticIDs(), clang::Preprocessor::getDiagnostics(), getDiagnosticsInGroup(), clang::SourceManager::getExpansionRange(), clang::SourceManager::getFileEntryForID(), clang::PreprocessorLexer::getFileID(), clang::PresumedLoc::getFilename(), clang::Token::getIdentifierInfo(), clang::Preprocessor::getIdentifierInfo(), clang::PresumedLoc::getIncludeLoc(), clang::Token::getKind(), clang::Preprocessor::getLangOpts(), clang::Token::getLength(), clang::PresumedLoc::getLine(), clang::Token::getLocation(), clang::Preprocessor::getLocForEndOfToken(), clang::IdentifierInfo::getName(), clang::SourceManager::getPresumedLoc(), clang::Preprocessor::getTargetInfo(), clang::IdentifierInfo::getTokenID(), clang::TargetInfo::getTriple(), clang::GNU, clang::hasAttribute(), HasExtension(), HasFeature(), clang::Token::is(), clang::Token::isAnnotation(), clang::LangOptions::isCompilingModule(), clang::PresumedLoc::isInvalid(), clang::Token::isNot(), clang::Token::isOneOf(), isTargetArch(), isTargetOS(), isTargetVendor(), clang::SourceLocation::isValid(), clang::PresumedLoc::isValid(), clang::Preprocessor::LexNonComment(), clang::Preprocessor::LexUnexpandedToken(), clang::Token::NeedsCleaning, clang::Result, clang::Token::setIdentifierInfo(), clang::Token::setKind(), clang::Token::setLength(), clang::Token::setLocation(), clang::Lexer::Stringify(), clang::format::Tok, and clang::diag::WarningOrError.

◆ isTargetOS()

static bool isTargetOS ( const TargetInfo TI,
const IdentifierInfo II 
)
static

Implements the __is_target_os builtin macro.

Definition at line 1632 of file PPMacroExpansion.cpp.

References clang::IdentifierInfo::getName(), and clang::TargetInfo::getTriple().

Referenced by isTargetEnvironment().

◆ isTargetVendor()

static bool isTargetVendor ( const TargetInfo TI,
const IdentifierInfo II 
)
static

Implements the __is_target_vendor builtin macro.

Definition at line 1624 of file PPMacroExpansion.cpp.

References clang::IdentifierInfo::getName(), and clang::TargetInfo::getTriple().

Referenced by isTargetEnvironment().

◆ isTrivialSingleTokenExpansion()

static bool isTrivialSingleTokenExpansion ( const MacroInfo MI,
const IdentifierInfo MacroIdent,
Preprocessor PP 
)
static

◆ RegisterBuiltinMacro()

static IdentifierInfo* RegisterBuiltinMacro ( Preprocessor PP,
const char *  Name 
)
static

RegisterBuiltinMacro - Register the specified identifier in the identifier table and mark it as a builtin macro to be expanded.

Definition at line 325 of file PPMacroExpansion.cpp.