clang  8.0.0svn
Macros | 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/HeaderSearch.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/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/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 "clang/Basic/Features.def"
Include dependency graph for PPMacroExpansion.cpp:

Go to the source code of this file.

Macros

#define FEATURE(Name, Predicate)   .Case(#Name, Predicate)
 
#define EXTENSION(Name, Predicate)   .Case(#Name, Predicate)
 

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...
 

Macro Definition Documentation

◆ EXTENSION

#define EXTENSION (   Name,
  Predicate 
)    .Case(#Name, Predicate)

◆ FEATURE

#define FEATURE (   Name,
  Predicate 
)    .Case(#Name, Predicate)

Enumeration Type Documentation

◆ Bracket

enum Bracket
Enumerator
Brace 
Paren 

Definition at line 617 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 624 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 1057 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 1254 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 1398 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

◆ 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 1108 of file PPMacroExpansion.cpp.

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

Referenced by isTargetEnvironment().

◆ HasFeature()

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

HasFeature - Return true if we recognize and implement the feature specified by the identifier as a standard language feature.

Definition at line 1091 of file PPMacroExpansion.cpp.

References clang::Default, and clang::Preprocessor::getLangOpts().

Referenced by HasExtension(), hasFeature(), and isTargetEnvironment().

◆ isTargetArch()

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

Implements the __is_target_arch builtin macro.

Definition at line 1410 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 1452 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::CharSourceRange::getEnd(), 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(), llvm::str(), 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 1440 of file PPMacroExpansion.cpp.

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

Referenced by isTargetEnvironment().

◆ isTargetVendor()

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

Implements the __is_target_vendor builtin macro.

Definition at line 1432 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 324 of file PPMacroExpansion.cpp.