mirror of
https://github.com/opnsense/src.git
synced 2026-04-24 07:37:25 -04:00
Update clang to release_39 branch r276489, and resolve conflicts.
This commit is contained in:
commit
e7145dcb9f
648 changed files with 119241 additions and 32856 deletions
|
|
@ -4,7 +4,7 @@ LLVM Release License
|
|||
University of Illinois/NCSA
|
||||
Open Source License
|
||||
|
||||
Copyright (c) 2007-2015 University of Illinois at Urbana-Champaign.
|
||||
Copyright (c) 2007-2016 University of Illinois at Urbana-Champaign.
|
||||
All rights reserved.
|
||||
|
||||
Developed by:
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
* compatible, thus CINDEX_VERSION_MAJOR is expected to remain stable.
|
||||
*/
|
||||
#define CINDEX_VERSION_MAJOR 0
|
||||
#define CINDEX_VERSION_MINOR 32
|
||||
#define CINDEX_VERSION_MINOR 35
|
||||
|
||||
#define CINDEX_VERSION_ENCODE(major, minor) ( \
|
||||
((major) * 10000) \
|
||||
|
|
@ -326,7 +326,7 @@ clang_isFileMultipleIncludeGuarded(CXTranslationUnit tu, CXFile file);
|
|||
*
|
||||
* \param tu the translation unit
|
||||
*
|
||||
* \param file_name the name of the file.
|
||||
* \param file_name the name of the file.
|
||||
*
|
||||
* \returns the file handle for the named file in the translation unit \p tu,
|
||||
* or a NULL file handle if the file was not a part of this translation unit.
|
||||
|
|
@ -1208,7 +1208,18 @@ enum CXTranslationUnit_Flags {
|
|||
* trades runtime on the first parse (serializing the preamble takes time) for
|
||||
* reduced runtime on the second parse (can now reuse the preamble).
|
||||
*/
|
||||
CXTranslationUnit_CreatePreambleOnFirstParse = 0x100
|
||||
CXTranslationUnit_CreatePreambleOnFirstParse = 0x100,
|
||||
|
||||
/**
|
||||
* \brief Do not stop processing when fatal errors are encountered.
|
||||
*
|
||||
* When fatal errors are encountered while parsing a translation unit,
|
||||
* semantic analysis is typically stopped early when compiling code. A common
|
||||
* source for fatal errors are unresolvable include files. For the
|
||||
* purposes of an IDE, this is undesirable behavior and as much information
|
||||
* as possible should be reported. Use this flag to enable this behavior.
|
||||
*/
|
||||
CXTranslationUnit_KeepGoing = 0x200
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -1921,7 +1932,7 @@ enum CXCursorKind {
|
|||
*/
|
||||
CXCursor_CXXDeleteExpr = 135,
|
||||
|
||||
/** \brief A unary expression.
|
||||
/** \brief A unary expression. (noexcept, sizeof, or other traits)
|
||||
*/
|
||||
CXCursor_UnaryExpr = 136,
|
||||
|
||||
|
|
@ -2003,7 +2014,11 @@ enum CXCursorKind {
|
|||
*/
|
||||
CXCursor_OMPArraySectionExpr = 147,
|
||||
|
||||
CXCursor_LastExpr = CXCursor_OMPArraySectionExpr,
|
||||
/** \brief Represents an @available(...) check.
|
||||
*/
|
||||
CXCursor_ObjCAvailabilityCheckExpr = 148,
|
||||
|
||||
CXCursor_LastExpr = CXCursor_ObjCAvailabilityCheckExpr,
|
||||
|
||||
/* Statements */
|
||||
CXCursor_FirstStmt = 200,
|
||||
|
|
@ -2270,11 +2285,47 @@ enum CXCursorKind {
|
|||
*/
|
||||
CXCursor_OMPTaskLoopSimdDirective = 259,
|
||||
|
||||
/** \brief OpenMP distribute directive.
|
||||
/** \brief OpenMP distribute directive.
|
||||
*/
|
||||
CXCursor_OMPDistributeDirective = 260,
|
||||
|
||||
CXCursor_LastStmt = CXCursor_OMPDistributeDirective,
|
||||
/** \brief OpenMP target enter data directive.
|
||||
*/
|
||||
CXCursor_OMPTargetEnterDataDirective = 261,
|
||||
|
||||
/** \brief OpenMP target exit data directive.
|
||||
*/
|
||||
CXCursor_OMPTargetExitDataDirective = 262,
|
||||
|
||||
/** \brief OpenMP target parallel directive.
|
||||
*/
|
||||
CXCursor_OMPTargetParallelDirective = 263,
|
||||
|
||||
/** \brief OpenMP target parallel for directive.
|
||||
*/
|
||||
CXCursor_OMPTargetParallelForDirective = 264,
|
||||
|
||||
/** \brief OpenMP target update directive.
|
||||
*/
|
||||
CXCursor_OMPTargetUpdateDirective = 265,
|
||||
|
||||
/** \brief OpenMP distribute parallel for directive.
|
||||
*/
|
||||
CXCursor_OMPDistributeParallelForDirective = 266,
|
||||
|
||||
/** \brief OpenMP distribute parallel for simd directive.
|
||||
*/
|
||||
CXCursor_OMPDistributeParallelForSimdDirective = 267,
|
||||
|
||||
/** \brief OpenMP distribute simd directive.
|
||||
*/
|
||||
CXCursor_OMPDistributeSimdDirective = 268,
|
||||
|
||||
/** \brief OpenMP target parallel for simd directive.
|
||||
*/
|
||||
CXCursor_OMPTargetParallelForSimdDirective = 269,
|
||||
|
||||
CXCursor_LastStmt = CXCursor_OMPTargetParallelForSimdDirective,
|
||||
|
||||
/**
|
||||
* \brief Cursor that represents the translation unit itself.
|
||||
|
|
@ -2328,8 +2379,12 @@ enum CXCursorKind {
|
|||
*/
|
||||
CXCursor_ModuleImportDecl = 600,
|
||||
CXCursor_TypeAliasTemplateDecl = 601,
|
||||
/**
|
||||
* \brief A static_assert or _Static_assert node
|
||||
*/
|
||||
CXCursor_StaticAssert = 602,
|
||||
CXCursor_FirstExtraDecl = CXCursor_ModuleImportDecl,
|
||||
CXCursor_LastExtraDecl = CXCursor_TypeAliasTemplateDecl,
|
||||
CXCursor_LastExtraDecl = CXCursor_StaticAssert,
|
||||
|
||||
/**
|
||||
* \brief A code completion overload candidate.
|
||||
|
|
@ -2430,6 +2485,11 @@ CINDEX_LINKAGE unsigned clang_isStatement(enum CXCursorKind);
|
|||
*/
|
||||
CINDEX_LINKAGE unsigned clang_isAttribute(enum CXCursorKind);
|
||||
|
||||
/**
|
||||
* \brief Determine whether the given cursor has any attributes.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_Cursor_hasAttrs(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine whether the given cursor kind represents an invalid
|
||||
* cursor.
|
||||
|
|
@ -2526,7 +2586,7 @@ typedef struct CXPlatformAvailability {
|
|||
* \brief A string that describes the platform for which this structure
|
||||
* provides availability information.
|
||||
*
|
||||
* Possible values are "ios" or "macosx".
|
||||
* Possible values are "ios" or "macos".
|
||||
*/
|
||||
CXString Platform;
|
||||
/**
|
||||
|
|
@ -2897,6 +2957,7 @@ enum CXTypeKind {
|
|||
CXType_ObjCId = 27,
|
||||
CXType_ObjCClass = 28,
|
||||
CXType_ObjCSel = 29,
|
||||
CXType_Float128 = 30,
|
||||
CXType_FirstBuiltin = CXType_Void,
|
||||
CXType_LastBuiltin = CXType_ObjCSel,
|
||||
|
||||
|
|
@ -2918,7 +2979,14 @@ enum CXTypeKind {
|
|||
CXType_VariableArray = 115,
|
||||
CXType_DependentSizedArray = 116,
|
||||
CXType_MemberPointer = 117,
|
||||
CXType_Auto = 118
|
||||
CXType_Auto = 118,
|
||||
|
||||
/**
|
||||
* \brief Represents a type that was referred to using an elaborated type keyword.
|
||||
*
|
||||
* E.g., struct S, or via a qualified name, e.g., N::M::type, or both.
|
||||
*/
|
||||
CXType_Elaborated = 119
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -2938,6 +3006,9 @@ enum CXCallingConv {
|
|||
CXCallingConv_X86_64Win64 = 10,
|
||||
CXCallingConv_X86_64SysV = 11,
|
||||
CXCallingConv_X86VectorCall = 12,
|
||||
CXCallingConv_Swift = 13,
|
||||
CXCallingConv_PreserveMost = 14,
|
||||
CXCallingConv_PreserveAll = 15,
|
||||
|
||||
CXCallingConv_Invalid = 100,
|
||||
CXCallingConv_Unexposed = 200
|
||||
|
|
@ -3169,6 +3240,24 @@ CINDEX_LINKAGE CXType clang_getCanonicalType(CXType T);
|
|||
*/
|
||||
CINDEX_LINKAGE unsigned clang_isConstQualifiedType(CXType T);
|
||||
|
||||
/**
|
||||
* \brief Determine whether a CXCursor that is a macro, is
|
||||
* function like.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_Cursor_isMacroFunctionLike(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine whether a CXCursor that is a macro, is a
|
||||
* builtin one.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_Cursor_isMacroBuiltin(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine whether a CXCursor that is a function declaration, is an
|
||||
* inline declaration.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_Cursor_isFunctionInlined(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine whether a CXType has the "volatile" qualifier set,
|
||||
* without looking through typedefs that may have added "volatile" at
|
||||
|
|
@ -3198,6 +3287,11 @@ CINDEX_LINKAGE CXCursor clang_getTypeDeclaration(CXType T);
|
|||
*/
|
||||
CINDEX_LINKAGE CXString clang_getDeclObjCTypeEncoding(CXCursor C);
|
||||
|
||||
/**
|
||||
* Returns the Objective-C type encoding for the specified CXType.
|
||||
*/
|
||||
CINDEX_LINKAGE CXString clang_Type_getObjCEncoding(CXType type);
|
||||
|
||||
/**
|
||||
* \brief Retrieve the spelling of a given CXTypeKind.
|
||||
*/
|
||||
|
|
@ -3281,6 +3375,13 @@ CINDEX_LINKAGE CXType clang_getArrayElementType(CXType T);
|
|||
*/
|
||||
CINDEX_LINKAGE long long clang_getArraySize(CXType T);
|
||||
|
||||
/**
|
||||
* \brief Retrieve the type named by the qualified-id.
|
||||
*
|
||||
* If a non-elaborated type is passed in, an invalid type is returned.
|
||||
*/
|
||||
CINDEX_LINKAGE CXType clang_Type_getNamedType(CXType T);
|
||||
|
||||
/**
|
||||
* \brief List the possible error codes for \c clang_Type_getSizeOf,
|
||||
* \c clang_Type_getAlignOf, \c clang_Type_getOffsetOf and
|
||||
|
|
@ -3612,8 +3713,8 @@ typedef enum CXChildVisitResult
|
|||
* Visits the children of a cursor using the specified block. Behaves
|
||||
* identically to clang_visitChildren() in all other respects.
|
||||
*/
|
||||
unsigned clang_visitChildrenWithBlock(CXCursor parent,
|
||||
CXCursorVisitorBlock block);
|
||||
CINDEX_LINKAGE unsigned clang_visitChildrenWithBlock(CXCursor parent,
|
||||
CXCursorVisitorBlock block);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
|
@ -3834,7 +3935,8 @@ typedef enum {
|
|||
CXObjCPropertyAttr_atomic = 0x100,
|
||||
CXObjCPropertyAttr_weak = 0x200,
|
||||
CXObjCPropertyAttr_strong = 0x400,
|
||||
CXObjCPropertyAttr_unsafe_unretained = 0x800
|
||||
CXObjCPropertyAttr_unsafe_unretained = 0x800,
|
||||
CXObjCPropertyAttr_class = 0x1000
|
||||
} CXObjCPropertyAttrKind;
|
||||
|
||||
/**
|
||||
|
|
@ -4015,11 +4117,36 @@ CXFile clang_Module_getTopLevelHeader(CXTranslationUnit,
|
|||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* \brief Determine if a C++ constructor is a converting constructor.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_CXXConstructor_isConvertingConstructor(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine if a C++ constructor is a copy constructor.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_CXXConstructor_isCopyConstructor(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine if a C++ constructor is the default constructor.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_CXXConstructor_isDefaultConstructor(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine if a C++ constructor is a move constructor.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_CXXConstructor_isMoveConstructor(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine if a C++ field is declared 'mutable'.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_CXXField_isMutable(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine if a C++ method is declared '= default'.
|
||||
*/
|
||||
CINDEX_LINKAGE unsigned clang_CXXMethod_isDefaulted(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Determine if a C++ member function or member function template is
|
||||
* pure virtual.
|
||||
|
|
@ -4900,7 +5027,7 @@ CINDEX_LINKAGE unsigned clang_defaultCodeCompleteOptions(void);
|
|||
* Note that the column should point just after the syntactic construct that
|
||||
* initiated code completion, and not in the middle of a lexical token.
|
||||
*
|
||||
* \param unsaved_files the Tiles that have not yet been saved to disk
|
||||
* \param unsaved_files the Files that have not yet been saved to disk
|
||||
* but may be required for parsing or code completion, including the
|
||||
* contents of those files. The contents and name of these files (as
|
||||
* specified by CXUnsavedFile) are copied when necessary, so the
|
||||
|
|
@ -5077,6 +5204,59 @@ CINDEX_LINKAGE void clang_getInclusions(CXTranslationUnit tu,
|
|||
CXInclusionVisitor visitor,
|
||||
CXClientData client_data);
|
||||
|
||||
typedef enum {
|
||||
CXEval_Int = 1 ,
|
||||
CXEval_Float = 2,
|
||||
CXEval_ObjCStrLiteral = 3,
|
||||
CXEval_StrLiteral = 4,
|
||||
CXEval_CFStr = 5,
|
||||
CXEval_Other = 6,
|
||||
|
||||
CXEval_UnExposed = 0
|
||||
|
||||
} CXEvalResultKind ;
|
||||
|
||||
/**
|
||||
* \brief Evaluation result of a cursor
|
||||
*/
|
||||
typedef void * CXEvalResult;
|
||||
|
||||
/**
|
||||
* \brief If cursor is a statement declaration tries to evaluate the
|
||||
* statement and if its variable, tries to evaluate its initializer,
|
||||
* into its corresponding type.
|
||||
*/
|
||||
CINDEX_LINKAGE CXEvalResult clang_Cursor_Evaluate(CXCursor C);
|
||||
|
||||
/**
|
||||
* \brief Returns the kind of the evaluated result.
|
||||
*/
|
||||
CINDEX_LINKAGE CXEvalResultKind clang_EvalResult_getKind(CXEvalResult E);
|
||||
|
||||
/**
|
||||
* \brief Returns the evaluation result as integer if the
|
||||
* kind is Int.
|
||||
*/
|
||||
CINDEX_LINKAGE int clang_EvalResult_getAsInt(CXEvalResult E);
|
||||
|
||||
/**
|
||||
* \brief Returns the evaluation result as double if the
|
||||
* kind is double.
|
||||
*/
|
||||
CINDEX_LINKAGE double clang_EvalResult_getAsDouble(CXEvalResult E);
|
||||
|
||||
/**
|
||||
* \brief Returns the evaluation result as a constant string if the
|
||||
* kind is other than Int or float. User must not free this pointer,
|
||||
* instead call clang_EvalResult_dispose on the CXEvalResult returned
|
||||
* by clang_Cursor_Evaluate.
|
||||
*/
|
||||
CINDEX_LINKAGE const char* clang_EvalResult_getAsStr(CXEvalResult E);
|
||||
|
||||
/**
|
||||
* \brief Disposes the created Eval memory.
|
||||
*/
|
||||
CINDEX_LINKAGE void clang_EvalResult_dispose(CXEvalResult E);
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
|
@ -5150,7 +5330,7 @@ enum CXVisitorResult {
|
|||
CXVisit_Continue
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
typedef struct CXCursorAndRangeVisitor {
|
||||
void *context;
|
||||
enum CXVisitorResult (*visit)(void *context, CXCursor, CXSourceRange);
|
||||
} CXCursorAndRangeVisitor;
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ protected:
|
|||
bool BeginInvocation(CompilerInstance &CI) override;
|
||||
|
||||
public:
|
||||
CheckAction(FrontendAction *WrappedAction);
|
||||
CheckAction(std::unique_ptr<FrontendAction> WrappedAction);
|
||||
};
|
||||
|
||||
class ModifyAction : public WrapperFrontendAction {
|
||||
|
|
@ -30,7 +30,7 @@ protected:
|
|||
bool BeginInvocation(CompilerInstance &CI) override;
|
||||
|
||||
public:
|
||||
ModifyAction(FrontendAction *WrappedAction);
|
||||
ModifyAction(std::unique_ptr<FrontendAction> WrappedAction);
|
||||
};
|
||||
|
||||
class MigrateSourceAction : public ASTFrontendAction {
|
||||
|
|
@ -49,7 +49,8 @@ protected:
|
|||
bool BeginInvocation(CompilerInstance &CI) override;
|
||||
|
||||
public:
|
||||
MigrateAction(FrontendAction *WrappedAction, StringRef migrateDir,
|
||||
MigrateAction(std::unique_ptr<FrontendAction> WrappedAction,
|
||||
StringRef migrateDir,
|
||||
StringRef plistOut,
|
||||
bool emitPremigrationARCErrors);
|
||||
};
|
||||
|
|
@ -61,8 +62,8 @@ class ObjCMigrateAction : public WrapperFrontendAction {
|
|||
FileRemapper Remapper;
|
||||
CompilerInstance *CompInst;
|
||||
public:
|
||||
ObjCMigrateAction(FrontendAction *WrappedAction, StringRef migrateDir,
|
||||
unsigned migrateAction);
|
||||
ObjCMigrateAction(std::unique_ptr<FrontendAction> WrappedAction,
|
||||
StringRef migrateDir, unsigned migrateAction);
|
||||
|
||||
protected:
|
||||
std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
|
||||
|
|
|
|||
|
|
@ -55,9 +55,9 @@ public:
|
|||
/// \returns true to continue parsing, or false to abort parsing.
|
||||
virtual bool HandleTopLevelDecl(DeclGroupRef D);
|
||||
|
||||
/// \brief This callback is invoked each time an inline method definition is
|
||||
/// completed.
|
||||
virtual void HandleInlineMethodDefinition(CXXMethodDecl *D) {}
|
||||
/// \brief This callback is invoked each time an inline (method or friend)
|
||||
/// function definition in a class is completed.
|
||||
virtual void HandleInlineFunctionDefinition(FunctionDecl *D) {}
|
||||
|
||||
/// HandleInterestingDecl - Handle the specified interesting declaration. This
|
||||
/// is called by the AST reader when deserializing things that might interest
|
||||
|
|
@ -94,21 +94,6 @@ public:
|
|||
/// The default implementation passes it to HandleTopLevelDecl.
|
||||
virtual void HandleImplicitImportDecl(ImportDecl *D);
|
||||
|
||||
/// \brief Handle a pragma that appends to Linker Options. Currently this
|
||||
/// only exists to support Microsoft's #pragma comment(linker, "/foo").
|
||||
virtual void HandleLinkerOptionPragma(llvm::StringRef Opts) {}
|
||||
|
||||
/// \brief Handle a pragma that emits a mismatch identifier and value to the
|
||||
/// object file for the linker to work with. Currently, this only exists to
|
||||
/// support Microsoft's #pragma detect_mismatch.
|
||||
virtual void HandleDetectMismatch(llvm::StringRef Name,
|
||||
llvm::StringRef Value) {}
|
||||
|
||||
/// \brief Handle a dependent library created by a pragma in the source.
|
||||
/// Currently this only exists to support Microsoft's
|
||||
/// #pragma comment(lib, "/foo").
|
||||
virtual void HandleDependentLibrary(llvm::StringRef Lib) {}
|
||||
|
||||
/// CompleteTentativeDefinition - Callback invoked at the end of a translation
|
||||
/// unit to notify the consumer that the given tentative definition should be
|
||||
/// completed.
|
||||
|
|
@ -120,6 +105,10 @@ public:
|
|||
/// modified by the introduction of an implicit zero initializer.
|
||||
virtual void CompleteTentativeDefinition(VarDecl *D) {}
|
||||
|
||||
/// \brief Callback invoked when an MSInheritanceAttr has been attached to a
|
||||
/// CXXRecordDecl.
|
||||
virtual void AssignInheritanceModel(CXXRecordDecl *RD) {}
|
||||
|
||||
/// HandleCXXStaticMemberVarInstantiation - Tell the consumer that this
|
||||
// variable has been instantiated.
|
||||
virtual void HandleCXXStaticMemberVarInstantiation(VarDecl *D) {}
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@
|
|||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/FoldingSet.h"
|
||||
#include "llvm/ADT/IntrusiveRefCntPtr.h"
|
||||
#include "llvm/ADT/MapVector.h"
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/ADT/TinyPtrVector.h"
|
||||
#include "llvm/Support/Allocator.h"
|
||||
|
|
@ -128,6 +129,8 @@ class ASTContext : public RefCountedBase<ASTContext> {
|
|||
llvm::FoldingSet<PackExpansionType> PackExpansionTypes;
|
||||
mutable llvm::FoldingSet<ObjCObjectTypeImpl> ObjCObjectTypes;
|
||||
mutable llvm::FoldingSet<ObjCObjectPointerType> ObjCObjectPointerTypes;
|
||||
mutable llvm::FoldingSet<DependentUnaryTransformType>
|
||||
DependentUnaryTransformTypes;
|
||||
mutable llvm::FoldingSet<AutoType> AutoTypes;
|
||||
mutable llvm::FoldingSet<AtomicType> AtomicTypes;
|
||||
llvm::FoldingSet<AttributedType> AttributedTypes;
|
||||
|
|
@ -212,9 +215,6 @@ class ASTContext : public RefCountedBase<ASTContext> {
|
|||
/// \brief The typedef for the __uint128_t type.
|
||||
mutable TypedefDecl *UInt128Decl;
|
||||
|
||||
/// \brief The typedef for the __float128 stub type.
|
||||
mutable TypeDecl *Float128StubDecl;
|
||||
|
||||
/// \brief The typedef for the target specific predefined
|
||||
/// __builtin_va_list type.
|
||||
mutable TypedefDecl *BuiltinVaListDecl;
|
||||
|
|
@ -243,6 +243,9 @@ class ASTContext : public RefCountedBase<ASTContext> {
|
|||
QualType ObjCClassRedefinitionType;
|
||||
QualType ObjCSelRedefinitionType;
|
||||
|
||||
/// The identifier 'bool'.
|
||||
mutable IdentifierInfo *BoolName = nullptr;
|
||||
|
||||
/// The identifier 'NSObject'.
|
||||
IdentifierInfo *NSObjectName = nullptr;
|
||||
|
||||
|
|
@ -252,9 +255,13 @@ class ASTContext : public RefCountedBase<ASTContext> {
|
|||
/// The identifier '__make_integer_seq'.
|
||||
mutable IdentifierInfo *MakeIntegerSeqName = nullptr;
|
||||
|
||||
/// The identifier '__type_pack_element'.
|
||||
mutable IdentifierInfo *TypePackElementName = nullptr;
|
||||
|
||||
QualType ObjCConstantStringType;
|
||||
mutable RecordDecl *CFConstantStringTypeDecl;
|
||||
|
||||
mutable RecordDecl *CFConstantStringTagDecl;
|
||||
mutable TypedefDecl *CFConstantStringTypeDecl;
|
||||
|
||||
mutable QualType ObjCSuperType;
|
||||
|
||||
QualType ObjCNSStringType;
|
||||
|
|
@ -392,8 +399,8 @@ private:
|
|||
|
||||
/// \brief Side-table of mangling numbers for declarations which rarely
|
||||
/// need them (like static local vars).
|
||||
llvm::DenseMap<const NamedDecl *, unsigned> MangleNumbers;
|
||||
llvm::DenseMap<const VarDecl *, unsigned> StaticLocalNumbers;
|
||||
llvm::MapVector<const NamedDecl *, unsigned> MangleNumbers;
|
||||
llvm::MapVector<const VarDecl *, unsigned> StaticLocalNumbers;
|
||||
|
||||
/// \brief Mapping that stores parameterIndex values for ParmVarDecls when
|
||||
/// that value exceeds the bitfield size of ParmVarDeclBits.ParameterIndex.
|
||||
|
|
@ -406,6 +413,7 @@ private:
|
|||
TranslationUnitDecl *TUDecl;
|
||||
mutable ExternCContextDecl *ExternCContext;
|
||||
mutable BuiltinTemplateDecl *MakeIntegerSeqDecl;
|
||||
mutable BuiltinTemplateDecl *TypePackElementDecl;
|
||||
|
||||
/// \brief The associated SourceManager object.a
|
||||
SourceManager &SourceMgr;
|
||||
|
|
@ -817,6 +825,9 @@ public:
|
|||
overridden_methods_end(const CXXMethodDecl *Method) const;
|
||||
|
||||
unsigned overridden_methods_size(const CXXMethodDecl *Method) const;
|
||||
typedef llvm::iterator_range<overridden_cxx_method_iterator>
|
||||
overridden_method_range;
|
||||
overridden_method_range overridden_methods(const CXXMethodDecl *Method) const;
|
||||
|
||||
/// \brief Note that the given C++ \p Method overrides the given \p
|
||||
/// Overridden method.
|
||||
|
|
@ -876,6 +887,7 @@ public:
|
|||
|
||||
ExternCContextDecl *getExternCContextDecl() const;
|
||||
BuiltinTemplateDecl *getMakeIntegerSeqDecl() const;
|
||||
BuiltinTemplateDecl *getTypePackElementDecl() const;
|
||||
|
||||
// Builtin Types.
|
||||
CanQualType VoidTy;
|
||||
|
|
@ -889,20 +901,19 @@ public:
|
|||
CanQualType SignedCharTy, ShortTy, IntTy, LongTy, LongLongTy, Int128Ty;
|
||||
CanQualType UnsignedCharTy, UnsignedShortTy, UnsignedIntTy, UnsignedLongTy;
|
||||
CanQualType UnsignedLongLongTy, UnsignedInt128Ty;
|
||||
CanQualType FloatTy, DoubleTy, LongDoubleTy;
|
||||
CanQualType FloatTy, DoubleTy, LongDoubleTy, Float128Ty;
|
||||
CanQualType HalfTy; // [OpenCL 6.1.1.1], ARM NEON
|
||||
CanQualType FloatComplexTy, DoubleComplexTy, LongDoubleComplexTy;
|
||||
CanQualType Float128ComplexTy;
|
||||
CanQualType VoidPtrTy, NullPtrTy;
|
||||
CanQualType DependentTy, OverloadTy, BoundMemberTy, UnknownAnyTy;
|
||||
CanQualType BuiltinFnTy;
|
||||
CanQualType PseudoObjectTy, ARCUnbridgedCastTy;
|
||||
CanQualType ObjCBuiltinIdTy, ObjCBuiltinClassTy, ObjCBuiltinSelTy;
|
||||
CanQualType ObjCBuiltinBoolTy;
|
||||
CanQualType OCLImage1dTy, OCLImage1dArrayTy, OCLImage1dBufferTy;
|
||||
CanQualType OCLImage2dTy, OCLImage2dArrayTy, OCLImage2dDepthTy;
|
||||
CanQualType OCLImage2dArrayDepthTy, OCLImage2dMSAATy, OCLImage2dArrayMSAATy;
|
||||
CanQualType OCLImage2dMSAADepthTy, OCLImage2dArrayMSAADepthTy;
|
||||
CanQualType OCLImage3dTy;
|
||||
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
|
||||
CanQualType SingletonId;
|
||||
#include "clang/Basic/OpenCLImageTypes.def"
|
||||
CanQualType OCLSamplerTy, OCLEventTy, OCLClkEventTy;
|
||||
CanQualType OCLQueueTy, OCLNDRangeTy, OCLReserveIDTy;
|
||||
CanQualType OMPArraySectionTy;
|
||||
|
|
@ -966,9 +977,6 @@ public:
|
|||
/// \brief Retrieve the declaration for the 128-bit unsigned integer type.
|
||||
TypedefDecl *getUInt128Decl() const;
|
||||
|
||||
/// \brief Retrieve the declaration for a 128-bit float stub type.
|
||||
TypeDecl *getFloat128StubType() const;
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// Type Constructors
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
|
@ -1229,13 +1237,12 @@ public:
|
|||
TemplateTypeParmDecl *ParmDecl = nullptr) const;
|
||||
|
||||
QualType getTemplateSpecializationType(TemplateName T,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs,
|
||||
ArrayRef<TemplateArgument> Args,
|
||||
QualType Canon = QualType()) const;
|
||||
|
||||
QualType getCanonicalTemplateSpecializationType(TemplateName T,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs) const;
|
||||
QualType
|
||||
getCanonicalTemplateSpecializationType(TemplateName T,
|
||||
ArrayRef<TemplateArgument> Args) const;
|
||||
|
||||
QualType getTemplateSpecializationType(TemplateName T,
|
||||
const TemplateArgumentListInfo &Args,
|
||||
|
|
@ -1260,11 +1267,9 @@ public:
|
|||
NestedNameSpecifier *NNS,
|
||||
const IdentifierInfo *Name,
|
||||
const TemplateArgumentListInfo &Args) const;
|
||||
QualType getDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,
|
||||
NestedNameSpecifier *NNS,
|
||||
const IdentifierInfo *Name,
|
||||
unsigned NumArgs,
|
||||
const TemplateArgument *Args) const;
|
||||
QualType getDependentTemplateSpecializationType(
|
||||
ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS,
|
||||
const IdentifierInfo *Name, ArrayRef<TemplateArgument> Args) const;
|
||||
|
||||
QualType getPackExpansionType(QualType Pattern,
|
||||
Optional<unsigned> NumExpansions);
|
||||
|
|
@ -1381,10 +1386,12 @@ public:
|
|||
/// if it hasn't yet been built.
|
||||
QualType getRawCFConstantStringType() const {
|
||||
if (CFConstantStringTypeDecl)
|
||||
return getTagDeclType(CFConstantStringTypeDecl);
|
||||
return getTypedefType(CFConstantStringTypeDecl);
|
||||
return QualType();
|
||||
}
|
||||
void setCFConstantStringType(QualType T);
|
||||
TypedefDecl *getCFConstantStringDecl() const;
|
||||
RecordDecl *getCFConstantStringTagDecl() const;
|
||||
|
||||
// This setter/getter represents the ObjC type for an NSConstantString.
|
||||
void setObjCConstantStringInterface(ObjCInterfaceDecl *Decl);
|
||||
|
|
@ -1458,12 +1465,25 @@ public:
|
|||
return NSCopyingName;
|
||||
}
|
||||
|
||||
/// Retrieve the identifier 'bool'.
|
||||
IdentifierInfo *getBoolName() const {
|
||||
if (!BoolName)
|
||||
BoolName = &Idents.get("bool");
|
||||
return BoolName;
|
||||
}
|
||||
|
||||
IdentifierInfo *getMakeIntegerSeqName() const {
|
||||
if (!MakeIntegerSeqName)
|
||||
MakeIntegerSeqName = &Idents.get("__make_integer_seq");
|
||||
return MakeIntegerSeqName;
|
||||
}
|
||||
|
||||
IdentifierInfo *getTypePackElementName() const {
|
||||
if (!TypePackElementName)
|
||||
TypePackElementName = &Idents.get("__type_pack_element");
|
||||
return TypePackElementName;
|
||||
}
|
||||
|
||||
/// \brief Retrieve the Objective-C "instancetype" type, if already known;
|
||||
/// otherwise, returns a NULL type;
|
||||
QualType getObjCInstanceType() {
|
||||
|
|
@ -2257,7 +2277,7 @@ public:
|
|||
|
||||
QualType mergeObjCGCQualifiers(QualType, QualType);
|
||||
|
||||
bool FunctionTypesMatchOnNSConsumedAttrs(
|
||||
bool doFunctionTypesMatchOnExtParameterInfos(
|
||||
const FunctionProtoType *FromFunctionType,
|
||||
const FunctionProtoType *ToFunctionType);
|
||||
|
||||
|
|
@ -2508,7 +2528,21 @@ public:
|
|||
/// \brief Returns true if this is an inline-initialized static data member
|
||||
/// which is treated as a definition for MSVC compatibility.
|
||||
bool isMSStaticDataMemberInlineDefinition(const VarDecl *VD) const;
|
||||
|
||||
|
||||
enum class InlineVariableDefinitionKind {
|
||||
None, ///< Not an inline variable.
|
||||
Weak, ///< Weak definition of inline variable.
|
||||
WeakUnknown, ///< Weak for now, might become strong later in this TU.
|
||||
Strong ///< Strong definition.
|
||||
};
|
||||
/// \brief Determine whether a definition of this inline variable should
|
||||
/// be treated as a weak or strong definition. For compatibility with
|
||||
/// C++14 and before, for a constexpr static data member, if there is an
|
||||
/// out-of-line declaration of the member, we may promote it from weak to
|
||||
/// strong.
|
||||
InlineVariableDefinitionKind
|
||||
getInlineVariableDefinitionKind(const VarDecl *VD) const;
|
||||
|
||||
private:
|
||||
const ASTRecordLayout &
|
||||
getObjCLayout(const ObjCInterfaceDecl *D,
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
|
||||
namespace clang {
|
||||
class ASTContext;
|
||||
class CXXCtorInitializer;
|
||||
class Decl;
|
||||
class DeclContext;
|
||||
class DiagnosticsEngine;
|
||||
|
|
@ -204,6 +205,14 @@ namespace clang {
|
|||
/// \returns the equivalent file ID in the source manager of the "to"
|
||||
/// context.
|
||||
FileID Import(FileID);
|
||||
|
||||
/// \brief Import the given C++ constructor initializer from the "from"
|
||||
/// context into the "to" context.
|
||||
///
|
||||
/// \returns the equivalent initializer in the "to" context.
|
||||
CXXCtorInitializer *Import(CXXCtorInitializer *FromInit);
|
||||
|
||||
|
||||
|
||||
/// \brief Import the definition of the given declaration, including all of
|
||||
/// the declarations it contains.
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ namespace clang {
|
|||
class Attr;
|
||||
class ClassTemplateDecl;
|
||||
class ClassTemplateSpecializationDecl;
|
||||
class ConstructorUsingShadowDecl;
|
||||
class CXXDestructorDecl;
|
||||
class CXXRecordDecl;
|
||||
class Decl;
|
||||
|
|
@ -107,6 +108,14 @@ public:
|
|||
/// \param D the declaration marked OpenMP threadprivate.
|
||||
virtual void DeclarationMarkedOpenMPThreadPrivate(const Decl *D) {}
|
||||
|
||||
/// \brief A declaration is marked as OpenMP declaretarget which was not
|
||||
/// previously marked as declaretarget.
|
||||
///
|
||||
/// \param D the declaration marked OpenMP declaretarget.
|
||||
/// \param Attr the added attribute.
|
||||
virtual void DeclarationMarkedOpenMPDeclareTarget(const Decl *D,
|
||||
const Attr *Attr) {}
|
||||
|
||||
/// \brief A definition has been made visible by being redefined locally.
|
||||
///
|
||||
/// \param D The definition that was previously not visible.
|
||||
|
|
|
|||
|
|
@ -62,7 +62,9 @@ public:
|
|||
/// \}
|
||||
|
||||
/// \brief Returns \c true if \c this and \c Other represent the same kind.
|
||||
bool isSame(ASTNodeKind Other) const;
|
||||
bool isSame(ASTNodeKind Other) const {
|
||||
return KindId != NKI_None && KindId == Other.KindId;
|
||||
}
|
||||
|
||||
/// \brief Returns \c true only for the default \c ASTNodeKind()
|
||||
bool isNone() const { return KindId == NKI_None; }
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
#include "clang/AST/Type.h"
|
||||
#include "clang/Basic/AttrKinds.h"
|
||||
#include "clang/Basic/LLVM.h"
|
||||
#include "clang/Basic/OpenMPKinds.h"
|
||||
#include "clang/Basic/Sanitizers.h"
|
||||
#include "clang/Basic/SourceLocation.h"
|
||||
#include "clang/Basic/VersionTuple.h"
|
||||
|
|
@ -50,11 +51,11 @@ protected:
|
|||
/// An index into the spelling list of an
|
||||
/// attribute defined in Attr.td file.
|
||||
unsigned SpellingListIndex : 4;
|
||||
bool Inherited : 1;
|
||||
bool IsPackExpansion : 1;
|
||||
bool Implicit : 1;
|
||||
bool IsLateParsed : 1;
|
||||
bool DuplicatesAllowed : 1;
|
||||
unsigned Inherited : 1;
|
||||
unsigned IsPackExpansion : 1;
|
||||
unsigned Implicit : 1;
|
||||
unsigned IsLateParsed : 1;
|
||||
unsigned DuplicatesAllowed : 1;
|
||||
|
||||
void *operator new(size_t bytes) LLVM_NOEXCEPT {
|
||||
llvm_unreachable("Attrs cannot be allocated with regular 'new'.");
|
||||
|
|
@ -118,6 +119,19 @@ public:
|
|||
bool duplicatesAllowed() const { return DuplicatesAllowed; }
|
||||
};
|
||||
|
||||
class StmtAttr : public Attr {
|
||||
protected:
|
||||
StmtAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex,
|
||||
bool IsLateParsed, bool DuplicatesAllowed)
|
||||
: Attr(AK, R, SpellingListIndex, IsLateParsed, DuplicatesAllowed) {}
|
||||
|
||||
public:
|
||||
static bool classof(const Attr *A) {
|
||||
return A->getKind() >= attr::FirstStmtAttr &&
|
||||
A->getKind() <= attr::LastStmtAttr;
|
||||
}
|
||||
};
|
||||
|
||||
class InheritableAttr : public Attr {
|
||||
protected:
|
||||
InheritableAttr(attr::Kind AK, SourceRange R, unsigned SpellingListIndex,
|
||||
|
|
@ -129,7 +143,8 @@ public:
|
|||
|
||||
// Implement isa/cast/dyncast/etc.
|
||||
static bool classof(const Attr *A) {
|
||||
return A->getKind() <= attr::LAST_INHERITABLE;
|
||||
return A->getKind() >= attr::FirstInheritableAttr &&
|
||||
A->getKind() <= attr::LastInheritableAttr;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -143,12 +158,41 @@ protected:
|
|||
public:
|
||||
// Implement isa/cast/dyncast/etc.
|
||||
static bool classof(const Attr *A) {
|
||||
// Relies on relative order of enum emission with respect to MS inheritance
|
||||
// attrs.
|
||||
return A->getKind() <= attr::LAST_INHERITABLE_PARAM;
|
||||
return A->getKind() >= attr::FirstInheritableParamAttr &&
|
||||
A->getKind() <= attr::LastInheritableParamAttr;
|
||||
}
|
||||
};
|
||||
|
||||
/// A parameter attribute which changes the argument-passing ABI rule
|
||||
/// for the parameter.
|
||||
class ParameterABIAttr : public InheritableParamAttr {
|
||||
protected:
|
||||
ParameterABIAttr(attr::Kind AK, SourceRange R,
|
||||
unsigned SpellingListIndex, bool IsLateParsed,
|
||||
bool DuplicatesAllowed)
|
||||
: InheritableParamAttr(AK, R, SpellingListIndex, IsLateParsed,
|
||||
DuplicatesAllowed) {}
|
||||
|
||||
public:
|
||||
ParameterABI getABI() const {
|
||||
switch (getKind()) {
|
||||
case attr::SwiftContext:
|
||||
return ParameterABI::SwiftContext;
|
||||
case attr::SwiftErrorResult:
|
||||
return ParameterABI::SwiftErrorResult;
|
||||
case attr::SwiftIndirectResult:
|
||||
return ParameterABI::SwiftIndirectResult;
|
||||
default:
|
||||
llvm_unreachable("bad parameter ABI attribute kind");
|
||||
}
|
||||
}
|
||||
|
||||
static bool classof(const Attr *A) {
|
||||
return A->getKind() >= attr::FirstParameterABIAttr &&
|
||||
A->getKind() <= attr::LastParameterABIAttr;
|
||||
}
|
||||
};
|
||||
|
||||
#include "clang/AST/Attrs.inc"
|
||||
|
||||
inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
|
||||
|
|
|
|||
63
contrib/llvm/tools/clang/include/clang/AST/Availability.h
Normal file
63
contrib/llvm/tools/clang/include/clang/AST/Availability.h
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
//===--- Availability.h - Classes for availability --------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This files defines some classes that implement availability checking.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_AST_AVAILABILITY_H
|
||||
#define LLVM_CLANG_AST_AVAILABILITY_H
|
||||
|
||||
#include "clang/Basic/SourceLocation.h"
|
||||
#include "clang/Basic/VersionTuple.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
|
||||
namespace clang {
|
||||
|
||||
/// \brief One specifier in an @available expression.
|
||||
///
|
||||
/// \code
|
||||
/// @available(macos 10.10, *)
|
||||
/// \endcode
|
||||
///
|
||||
/// Here, 'macos 10.10' and '*' both map to an instance of this type.
|
||||
///
|
||||
class AvailabilitySpec {
|
||||
/// Represents the version that this specifier requires. If the host OS
|
||||
/// version is greater than or equal to Version, the @available will evaluate
|
||||
/// to true.
|
||||
VersionTuple Version;
|
||||
|
||||
/// Name of the platform that Version corresponds to.
|
||||
StringRef Platform;
|
||||
|
||||
SourceLocation BeginLoc, EndLoc;
|
||||
|
||||
public:
|
||||
AvailabilitySpec(VersionTuple Version, StringRef Platform,
|
||||
SourceLocation BeginLoc, SourceLocation EndLoc)
|
||||
: Version(Version), Platform(Platform), BeginLoc(BeginLoc),
|
||||
EndLoc(EndLoc) {}
|
||||
|
||||
/// This constructor is used when representing the '*' case.
|
||||
AvailabilitySpec(SourceLocation StarLoc)
|
||||
: BeginLoc(StarLoc), EndLoc(StarLoc) {}
|
||||
|
||||
VersionTuple getVersion() const { return Version; }
|
||||
StringRef getPlatform() const { return Platform; }
|
||||
SourceLocation getBeginLoc() const { return BeginLoc; }
|
||||
SourceLocation getEndLoc() const { return EndLoc; }
|
||||
|
||||
/// Returns true when this represents the '*' case.
|
||||
bool isOtherPlatformSpec() const { return Version.empty(); }
|
||||
};
|
||||
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
|
|
@ -15,13 +15,12 @@
|
|||
#define LLVM_CLANG_AST_BASESUBOBJECT_H
|
||||
|
||||
#include "clang/AST/CharUnits.h"
|
||||
#include "clang/AST/DeclCXX.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/Support/DataTypes.h"
|
||||
#include "llvm/Support/type_traits.h"
|
||||
|
||||
namespace clang {
|
||||
class CXXRecordDecl;
|
||||
|
||||
// BaseSubobject - Uniquely identifies a direct or indirect base class.
|
||||
// Stores both the base class decl and the offset from the most derived class to
|
||||
// the base class. Used for vtable and VTT generation.
|
||||
|
|
|
|||
|
|
@ -133,6 +133,9 @@ FLOATING_TYPE(Double, DoubleTy)
|
|||
// 'long double'
|
||||
FLOATING_TYPE(LongDouble, LongDoubleTy)
|
||||
|
||||
// '__float128'
|
||||
FLOATING_TYPE(Float128, Float128Ty)
|
||||
|
||||
//===- Language-specific types --------------------------------------------===//
|
||||
|
||||
// This is the type of C++0x 'nullptr'.
|
||||
|
|
@ -154,20 +157,6 @@ BUILTIN_TYPE(ObjCClass, ObjCBuiltinClassTy)
|
|||
// type is a typedef of a PointerType to this.
|
||||
BUILTIN_TYPE(ObjCSel, ObjCBuiltinSelTy)
|
||||
|
||||
// OpenCL image types.
|
||||
BUILTIN_TYPE(OCLImage1d, OCLImage1dTy)
|
||||
BUILTIN_TYPE(OCLImage1dArray, OCLImage1dArrayTy)
|
||||
BUILTIN_TYPE(OCLImage1dBuffer, OCLImage1dBufferTy)
|
||||
BUILTIN_TYPE(OCLImage2d, OCLImage2dTy)
|
||||
BUILTIN_TYPE(OCLImage2dArray, OCLImage2dArrayTy)
|
||||
BUILTIN_TYPE(OCLImage2dDepth, OCLImage2dDepthTy)
|
||||
BUILTIN_TYPE(OCLImage2dArrayDepth, OCLImage2dArrayDepthTy)
|
||||
BUILTIN_TYPE(OCLImage2dMSAA, OCLImage2dMSAATy)
|
||||
BUILTIN_TYPE(OCLImage2dArrayMSAA, OCLImage2dArrayMSAATy)
|
||||
BUILTIN_TYPE(OCLImage2dMSAADepth, OCLImage2dMSAADepthTy)
|
||||
BUILTIN_TYPE(OCLImage2dArrayMSAADepth, OCLImage2dArrayMSAADepthTy)
|
||||
BUILTIN_TYPE(OCLImage3d, OCLImage3dTy)
|
||||
|
||||
// OpenCL sampler_t.
|
||||
BUILTIN_TYPE(OCLSampler, OCLSamplerTy)
|
||||
|
||||
|
|
|
|||
|
|
@ -484,6 +484,9 @@ struct CanProxyAdaptor<FunctionProtoType>
|
|||
LLVM_CLANG_CANPROXY_TYPE_ACCESSOR(getReturnType)
|
||||
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(FunctionType::ExtInfo, getExtInfo)
|
||||
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(unsigned, getNumParams)
|
||||
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(bool, hasExtParameterInfos)
|
||||
LLVM_CLANG_CANPROXY_SIMPLE_ACCESSOR(
|
||||
ArrayRef<FunctionProtoType::ExtParameterInfo>, getExtParameterInfos)
|
||||
CanQualType getParamType(unsigned i) const {
|
||||
return CanQualType::CreateUnsafe(this->getTypePtr()->getParamType(i));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ namespace clang {
|
|||
/// Test whether this is a multiple of the other value.
|
||||
///
|
||||
/// Among other things, this promises that
|
||||
/// self.RoundUpToAlignment(N) will just return self.
|
||||
/// self.alignTo(N) will just return self.
|
||||
bool isMultipleOf(CharUnits N) const {
|
||||
return (*this % N) == 0;
|
||||
}
|
||||
|
|
@ -142,9 +142,17 @@ namespace clang {
|
|||
CharUnits operator* (QuantityType N) const {
|
||||
return CharUnits(Quantity * N);
|
||||
}
|
||||
CharUnits &operator*= (QuantityType N) {
|
||||
Quantity *= N;
|
||||
return *this;
|
||||
}
|
||||
CharUnits operator/ (QuantityType N) const {
|
||||
return CharUnits(Quantity / N);
|
||||
}
|
||||
CharUnits &operator/= (QuantityType N) {
|
||||
Quantity /= N;
|
||||
return *this;
|
||||
}
|
||||
QuantityType operator/ (const CharUnits &Other) const {
|
||||
return Quantity / Other.Quantity;
|
||||
}
|
||||
|
|
@ -170,12 +178,11 @@ namespace clang {
|
|||
/// getQuantity - Get the raw integer representation of this quantity.
|
||||
QuantityType getQuantity() const { return Quantity; }
|
||||
|
||||
/// RoundUpToAlignment - Returns the next integer (mod 2**64) that is
|
||||
/// alignTo - Returns the next integer (mod 2**64) that is
|
||||
/// greater than or equal to this quantity and is a multiple of \p Align.
|
||||
/// Align must be non-zero.
|
||||
CharUnits RoundUpToAlignment(const CharUnits &Align) const {
|
||||
return CharUnits(llvm::RoundUpToAlignment(Quantity,
|
||||
Align.Quantity));
|
||||
CharUnits alignTo(const CharUnits &Align) const {
|
||||
return CharUnits(llvm::alignTo(Quantity, Align.Quantity));
|
||||
}
|
||||
|
||||
/// Given that this is a non-zero alignment value, what is the
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
#include "clang/Basic/Linkage.h"
|
||||
#include "clang/Basic/Module.h"
|
||||
#include "clang/Basic/OperatorKinds.h"
|
||||
#include "clang/Basic/PragmaKinds.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
|
|
@ -103,6 +104,73 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
/// \brief Represents a `#pragma comment` line. Always a child of
|
||||
/// TranslationUnitDecl.
|
||||
class PragmaCommentDecl final
|
||||
: public Decl,
|
||||
private llvm::TrailingObjects<PragmaCommentDecl, char> {
|
||||
virtual void anchor();
|
||||
|
||||
PragmaMSCommentKind CommentKind;
|
||||
|
||||
friend TrailingObjects;
|
||||
friend class ASTDeclReader;
|
||||
friend class ASTDeclWriter;
|
||||
|
||||
PragmaCommentDecl(TranslationUnitDecl *TU, SourceLocation CommentLoc,
|
||||
PragmaMSCommentKind CommentKind)
|
||||
: Decl(PragmaComment, TU, CommentLoc), CommentKind(CommentKind) {}
|
||||
|
||||
public:
|
||||
static PragmaCommentDecl *Create(const ASTContext &C, TranslationUnitDecl *DC,
|
||||
SourceLocation CommentLoc,
|
||||
PragmaMSCommentKind CommentKind,
|
||||
StringRef Arg);
|
||||
static PragmaCommentDecl *CreateDeserialized(ASTContext &C, unsigned ID,
|
||||
unsigned ArgSize);
|
||||
|
||||
PragmaMSCommentKind getCommentKind() const { return CommentKind; }
|
||||
|
||||
StringRef getArg() const { return getTrailingObjects<char>(); }
|
||||
|
||||
// Implement isa/cast/dyncast/etc.
|
||||
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
|
||||
static bool classofKind(Kind K) { return K == PragmaComment; }
|
||||
};
|
||||
|
||||
/// \brief Represents a `#pragma detect_mismatch` line. Always a child of
|
||||
/// TranslationUnitDecl.
|
||||
class PragmaDetectMismatchDecl final
|
||||
: public Decl,
|
||||
private llvm::TrailingObjects<PragmaDetectMismatchDecl, char> {
|
||||
virtual void anchor();
|
||||
|
||||
size_t ValueStart;
|
||||
|
||||
friend TrailingObjects;
|
||||
friend class ASTDeclReader;
|
||||
friend class ASTDeclWriter;
|
||||
|
||||
PragmaDetectMismatchDecl(TranslationUnitDecl *TU, SourceLocation Loc,
|
||||
size_t ValueStart)
|
||||
: Decl(PragmaDetectMismatch, TU, Loc), ValueStart(ValueStart) {}
|
||||
|
||||
public:
|
||||
static PragmaDetectMismatchDecl *Create(const ASTContext &C,
|
||||
TranslationUnitDecl *DC,
|
||||
SourceLocation Loc, StringRef Name,
|
||||
StringRef Value);
|
||||
static PragmaDetectMismatchDecl *
|
||||
CreateDeserialized(ASTContext &C, unsigned ID, unsigned NameValueSize);
|
||||
|
||||
StringRef getName() const { return getTrailingObjects<char>(); }
|
||||
StringRef getValue() const { return getTrailingObjects<char>() + ValueStart; }
|
||||
|
||||
// Implement isa/cast/dyncast/etc.
|
||||
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
|
||||
static bool classofKind(Kind K) { return K == PragmaDetectMismatch; }
|
||||
};
|
||||
|
||||
/// \brief Declaration context for names declared as extern "C" in C++. This
|
||||
/// is neither the semantic nor lexical context for such declarations, but is
|
||||
/// used to check for conflicts with other extern "C" declarations. Example:
|
||||
|
|
@ -319,6 +387,7 @@ public:
|
|||
NamedDecl *getUnderlyingDecl() {
|
||||
// Fast-path the common case.
|
||||
if (this->getKind() != UsingShadow &&
|
||||
this->getKind() != ConstructorUsingShadow &&
|
||||
this->getKind() != ObjCCompatibleAlias &&
|
||||
this->getKind() != NamespaceAlias)
|
||||
return this;
|
||||
|
|
@ -813,12 +882,15 @@ protected:
|
|||
/// variable; see isARCPseudoStrong() for details.
|
||||
unsigned ARCPseudoStrong : 1;
|
||||
|
||||
/// \brief Whether this variable is (C++1z) inline.
|
||||
unsigned IsInline : 1;
|
||||
|
||||
/// \brief Whether this variable has (C++1z) inline explicitly specified.
|
||||
unsigned IsInlineSpecified : 1;
|
||||
|
||||
/// \brief Whether this variable is (C++0x) constexpr.
|
||||
unsigned IsConstexpr : 1;
|
||||
|
||||
/// \brief Whether this variable is a (C++ Concepts TS) concept.
|
||||
unsigned IsConcept : 1;
|
||||
|
||||
/// \brief Whether this variable is the implicit variable for a lambda
|
||||
/// init-capture.
|
||||
unsigned IsInitCapture : 1;
|
||||
|
|
@ -1037,9 +1109,6 @@ public:
|
|||
/// definition of a static data member.
|
||||
bool isOutOfLine() const override;
|
||||
|
||||
/// \brief If this is a static data member, find its out-of-line definition.
|
||||
VarDecl *getOutOfLineDefinition();
|
||||
|
||||
/// isFileVarDecl - Returns true for file scoped variable declaration.
|
||||
bool isFileVarDecl() const {
|
||||
Kind K = getKind();
|
||||
|
|
@ -1185,6 +1254,24 @@ public:
|
|||
NonParmVarDeclBits.ARCPseudoStrong = ps;
|
||||
}
|
||||
|
||||
/// Whether this variable is (C++1z) inline.
|
||||
bool isInline() const {
|
||||
return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.IsInline;
|
||||
}
|
||||
bool isInlineSpecified() const {
|
||||
return isa<ParmVarDecl>(this) ? false
|
||||
: NonParmVarDeclBits.IsInlineSpecified;
|
||||
}
|
||||
void setInlineSpecified() {
|
||||
assert(!isa<ParmVarDecl>(this));
|
||||
NonParmVarDeclBits.IsInline = true;
|
||||
NonParmVarDeclBits.IsInlineSpecified = true;
|
||||
}
|
||||
void setImplicitlyInline() {
|
||||
assert(!isa<ParmVarDecl>(this));
|
||||
NonParmVarDeclBits.IsInline = true;
|
||||
}
|
||||
|
||||
/// Whether this variable is (C++11) constexpr.
|
||||
bool isConstexpr() const {
|
||||
return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.IsConstexpr;
|
||||
|
|
@ -1194,15 +1281,6 @@ public:
|
|||
NonParmVarDeclBits.IsConstexpr = IC;
|
||||
}
|
||||
|
||||
/// Whether this variable is (C++ Concepts TS) concept.
|
||||
bool isConcept() const {
|
||||
return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.IsConcept;
|
||||
}
|
||||
void setConcept(bool IC) {
|
||||
assert(!isa<ParmVarDecl>(this));
|
||||
NonParmVarDeclBits.IsConcept = IC;
|
||||
}
|
||||
|
||||
/// Whether this variable is the implicit variable for a lambda init-capture.
|
||||
bool isInitCapture() const {
|
||||
return isa<ParmVarDecl>(this) ? false : NonParmVarDeclBits.IsInitCapture;
|
||||
|
|
@ -1702,6 +1780,17 @@ public:
|
|||
return isDefined(Definition);
|
||||
}
|
||||
|
||||
/// \brief Get the definition for this declaration.
|
||||
FunctionDecl *getDefinition() {
|
||||
const FunctionDecl *Definition;
|
||||
if (isDefined(Definition))
|
||||
return const_cast<FunctionDecl *>(Definition);
|
||||
return nullptr;
|
||||
}
|
||||
const FunctionDecl *getDefinition() const {
|
||||
return const_cast<FunctionDecl *>(this)->getDefinition();
|
||||
}
|
||||
|
||||
/// getBody - Retrieve the body (definition) of the function. The
|
||||
/// function body might be in any of the (re-)declarations of this
|
||||
/// function. The variant that accepts a FunctionDecl pointer will
|
||||
|
|
@ -1896,28 +1985,23 @@ public:
|
|||
|
||||
unsigned getBuiltinID() const;
|
||||
|
||||
// ArrayRef interface to parameters.
|
||||
ArrayRef<ParmVarDecl *> parameters() const {
|
||||
return {ParamInfo, getNumParams()};
|
||||
}
|
||||
MutableArrayRef<ParmVarDecl *> parameters() {
|
||||
return {ParamInfo, getNumParams()};
|
||||
}
|
||||
|
||||
// Iterator access to formal parameters.
|
||||
unsigned param_size() const { return getNumParams(); }
|
||||
typedef ParmVarDecl **param_iterator;
|
||||
typedef ParmVarDecl * const *param_const_iterator;
|
||||
typedef llvm::iterator_range<param_iterator> param_range;
|
||||
typedef llvm::iterator_range<param_const_iterator> param_const_range;
|
||||
|
||||
param_iterator param_begin() { return param_iterator(ParamInfo); }
|
||||
param_iterator param_end() {
|
||||
return param_iterator(ParamInfo + param_size());
|
||||
}
|
||||
param_range params() { return param_range(param_begin(), param_end()); }
|
||||
|
||||
param_const_iterator param_begin() const {
|
||||
return param_const_iterator(ParamInfo);
|
||||
}
|
||||
param_const_iterator param_end() const {
|
||||
return param_const_iterator(ParamInfo + param_size());
|
||||
}
|
||||
param_const_range params() const {
|
||||
return param_const_range(param_begin(), param_end());
|
||||
}
|
||||
typedef MutableArrayRef<ParmVarDecl *>::iterator param_iterator;
|
||||
typedef ArrayRef<ParmVarDecl *>::const_iterator param_const_iterator;
|
||||
bool param_empty() const { return parameters().empty(); }
|
||||
param_iterator param_begin() { return parameters().begin(); }
|
||||
param_iterator param_end() { return parameters().end(); }
|
||||
param_const_iterator param_begin() const { return parameters().begin(); }
|
||||
param_const_iterator param_end() const { return parameters().end(); }
|
||||
size_t param_size() const { return parameters().size(); }
|
||||
|
||||
/// getNumParams - Return the number of parameters this function must have
|
||||
/// based on its FunctionType. This is the length of the ParamInfo array
|
||||
|
|
@ -1936,12 +2020,6 @@ public:
|
|||
setParams(getASTContext(), NewParamInfo);
|
||||
}
|
||||
|
||||
// ArrayRef iterface to parameters.
|
||||
// FIXME: Should one day replace iterator interface.
|
||||
ArrayRef<ParmVarDecl*> parameters() const {
|
||||
return llvm::makeArrayRef(ParamInfo, getNumParams());
|
||||
}
|
||||
|
||||
ArrayRef<NamedDecl *> getDeclsInPrototypeScope() const {
|
||||
return DeclsInPrototypeScope;
|
||||
}
|
||||
|
|
@ -1954,6 +2032,7 @@ public:
|
|||
unsigned getMinRequiredArguments() const;
|
||||
|
||||
QualType getReturnType() const {
|
||||
assert(getType()->getAs<FunctionType>() && "Expected a FunctionType!");
|
||||
return getType()->getAs<FunctionType>()->getReturnType();
|
||||
}
|
||||
|
||||
|
|
@ -1964,15 +2043,20 @@ public:
|
|||
|
||||
/// \brief Determine the type of an expression that calls this function.
|
||||
QualType getCallResultType() const {
|
||||
assert(getType()->getAs<FunctionType>() && "Expected a FunctionType!");
|
||||
return getType()->getAs<FunctionType>()->getCallResultType(getASTContext());
|
||||
}
|
||||
|
||||
/// \brief Returns the WarnUnusedResultAttr that is either declared on this
|
||||
/// function, or its return type declaration.
|
||||
const Attr *getUnusedResultAttr() const;
|
||||
|
||||
/// \brief Returns true if this function or its return type has the
|
||||
/// warn_unused_result attribute. If the return type has the attribute and
|
||||
/// this function is a method of the return type's class, then false will be
|
||||
/// returned to avoid spurious warnings on member methods such as assignment
|
||||
/// operators.
|
||||
bool hasUnusedResultAttr() const;
|
||||
bool hasUnusedResultAttr() const { return getUnusedResultAttr() != nullptr; }
|
||||
|
||||
/// \brief Returns the storage class as written in the source. For the
|
||||
/// computed linkage of symbol, see getLinkage.
|
||||
|
|
@ -2208,7 +2292,7 @@ public:
|
|||
/// represent a member of a struct/union/class.
|
||||
class FieldDecl : public DeclaratorDecl, public Mergeable<FieldDecl> {
|
||||
// FIXME: This can be packed into the bitfields in Decl.
|
||||
bool Mutable : 1;
|
||||
unsigned Mutable : 1;
|
||||
mutable unsigned CachedFieldIndex : 31;
|
||||
|
||||
/// The kinds of value we can store in InitializerOrBitWidth.
|
||||
|
|
@ -2442,34 +2526,33 @@ class IndirectFieldDecl : public ValueDecl,
|
|||
|
||||
IndirectFieldDecl(ASTContext &C, DeclContext *DC, SourceLocation L,
|
||||
DeclarationName N, QualType T,
|
||||
NamedDecl **CH, unsigned CHS);
|
||||
MutableArrayRef<NamedDecl *> CH);
|
||||
|
||||
public:
|
||||
static IndirectFieldDecl *Create(ASTContext &C, DeclContext *DC,
|
||||
SourceLocation L, IdentifierInfo *Id,
|
||||
QualType T, NamedDecl **CH, unsigned CHS);
|
||||
QualType T, llvm::MutableArrayRef<NamedDecl *> CH);
|
||||
|
||||
static IndirectFieldDecl *CreateDeserialized(ASTContext &C, unsigned ID);
|
||||
|
||||
typedef NamedDecl * const *chain_iterator;
|
||||
typedef llvm::iterator_range<chain_iterator> chain_range;
|
||||
|
||||
chain_range chain() const { return chain_range(chain_begin(), chain_end()); }
|
||||
chain_iterator chain_begin() const { return chain_iterator(Chaining); }
|
||||
chain_iterator chain_end() const {
|
||||
return chain_iterator(Chaining + ChainingSize);
|
||||
typedef ArrayRef<NamedDecl *>::const_iterator chain_iterator;
|
||||
|
||||
ArrayRef<NamedDecl *> chain() const {
|
||||
return llvm::makeArrayRef(Chaining, ChainingSize);
|
||||
}
|
||||
chain_iterator chain_begin() const { return chain().begin(); }
|
||||
chain_iterator chain_end() const { return chain().end(); }
|
||||
|
||||
unsigned getChainingSize() const { return ChainingSize; }
|
||||
|
||||
FieldDecl *getAnonField() const {
|
||||
assert(ChainingSize >= 2);
|
||||
return cast<FieldDecl>(Chaining[ChainingSize - 1]);
|
||||
assert(chain().size() >= 2);
|
||||
return cast<FieldDecl>(chain().back());
|
||||
}
|
||||
|
||||
VarDecl *getVarDecl() const {
|
||||
assert(ChainingSize >= 2);
|
||||
return dyn_cast<VarDecl>(*chain_begin());
|
||||
assert(chain().size() >= 2);
|
||||
return dyn_cast<VarDecl>(chain().front());
|
||||
}
|
||||
|
||||
IndirectFieldDecl *getCanonicalDecl() override { return getFirstDecl(); }
|
||||
|
|
@ -2655,20 +2738,20 @@ private:
|
|||
/// IsCompleteDefinition - True if this is a definition ("struct foo
|
||||
/// {};"), false if it is a declaration ("struct foo;"). It is not
|
||||
/// a definition until the definition has been fully processed.
|
||||
bool IsCompleteDefinition : 1;
|
||||
unsigned IsCompleteDefinition : 1;
|
||||
|
||||
protected:
|
||||
/// IsBeingDefined - True if this is currently being defined.
|
||||
bool IsBeingDefined : 1;
|
||||
unsigned IsBeingDefined : 1;
|
||||
|
||||
private:
|
||||
/// IsEmbeddedInDeclarator - True if this tag declaration is
|
||||
/// "embedded" (i.e., defined or declared for the very first time)
|
||||
/// in the syntax of a declarator.
|
||||
bool IsEmbeddedInDeclarator : 1;
|
||||
unsigned IsEmbeddedInDeclarator : 1;
|
||||
|
||||
/// \brief True if this tag is free standing, e.g. "struct foo;".
|
||||
bool IsFreeStanding : 1;
|
||||
unsigned IsFreeStanding : 1;
|
||||
|
||||
protected:
|
||||
// These are used by (and only defined for) EnumDecl.
|
||||
|
|
@ -2677,28 +2760,28 @@ protected:
|
|||
|
||||
/// IsScoped - True if this tag declaration is a scoped enumeration. Only
|
||||
/// possible in C++11 mode.
|
||||
bool IsScoped : 1;
|
||||
unsigned IsScoped : 1;
|
||||
/// IsScopedUsingClassTag - If this tag declaration is a scoped enum,
|
||||
/// then this is true if the scoped enum was declared using the class
|
||||
/// tag, false if it was declared with the struct tag. No meaning is
|
||||
/// associated if this tag declaration is not a scoped enum.
|
||||
bool IsScopedUsingClassTag : 1;
|
||||
unsigned IsScopedUsingClassTag : 1;
|
||||
|
||||
/// IsFixed - True if this is an enumeration with fixed underlying type. Only
|
||||
/// possible in C++11, Microsoft extensions, or Objective C mode.
|
||||
bool IsFixed : 1;
|
||||
unsigned IsFixed : 1;
|
||||
|
||||
/// \brief Indicates whether it is possible for declarations of this kind
|
||||
/// to have an out-of-date definition.
|
||||
///
|
||||
/// This option is only enabled when modules are enabled.
|
||||
bool MayHaveOutOfDateDef : 1;
|
||||
unsigned MayHaveOutOfDateDef : 1;
|
||||
|
||||
/// Has the full definition of this type been required by a use somewhere in
|
||||
/// the TU.
|
||||
bool IsCompleteDefinitionRequired : 1;
|
||||
unsigned IsCompleteDefinitionRequired : 1;
|
||||
private:
|
||||
SourceLocation RBraceLoc;
|
||||
SourceRange BraceRange;
|
||||
|
||||
// A struct representing syntactic qualifier info,
|
||||
// to be used for the (uncommon) case of out-of-line declarations.
|
||||
|
|
@ -2760,8 +2843,8 @@ public:
|
|||
using redeclarable_base::getMostRecentDecl;
|
||||
using redeclarable_base::isFirstDecl;
|
||||
|
||||
SourceLocation getRBraceLoc() const { return RBraceLoc; }
|
||||
void setRBraceLoc(SourceLocation L) { RBraceLoc = L; }
|
||||
SourceRange getBraceRange() const { return BraceRange; }
|
||||
void setBraceRange(SourceRange R) { BraceRange = R; }
|
||||
|
||||
/// getInnerLocStart - Return SourceLocation representing start of source
|
||||
/// range ignoring outer template declarations.
|
||||
|
|
@ -3122,6 +3205,10 @@ public:
|
|||
return isCompleteDefinition() || isFixed();
|
||||
}
|
||||
|
||||
/// \brief Retrieve the enum definition from which this enumeration could
|
||||
/// be instantiated, if it is an instantiation (rather than a non-template).
|
||||
EnumDecl *getTemplateInstantiationPattern() const;
|
||||
|
||||
/// \brief Returns the enumeration (declared within the template)
|
||||
/// from which this enumeration type was instantiated, or NULL if
|
||||
/// this enumeration was not instantiated from any template.
|
||||
|
|
@ -3452,35 +3539,23 @@ public:
|
|||
void setSignatureAsWritten(TypeSourceInfo *Sig) { SignatureAsWritten = Sig; }
|
||||
TypeSourceInfo *getSignatureAsWritten() const { return SignatureAsWritten; }
|
||||
|
||||
// Iterator access to formal parameters.
|
||||
unsigned param_size() const { return getNumParams(); }
|
||||
typedef ParmVarDecl **param_iterator;
|
||||
typedef ParmVarDecl * const *param_const_iterator;
|
||||
typedef llvm::iterator_range<param_iterator> param_range;
|
||||
typedef llvm::iterator_range<param_const_iterator> param_const_range;
|
||||
|
||||
// ArrayRef access to formal parameters.
|
||||
// FIXME: Should eventual replace iterator access.
|
||||
ArrayRef<ParmVarDecl*> parameters() const {
|
||||
return llvm::makeArrayRef(ParamInfo, param_size());
|
||||
ArrayRef<ParmVarDecl *> parameters() const {
|
||||
return {ParamInfo, getNumParams()};
|
||||
}
|
||||
MutableArrayRef<ParmVarDecl *> parameters() {
|
||||
return {ParamInfo, getNumParams()};
|
||||
}
|
||||
|
||||
bool param_empty() const { return NumParams == 0; }
|
||||
param_range params() { return param_range(param_begin(), param_end()); }
|
||||
param_iterator param_begin() { return param_iterator(ParamInfo); }
|
||||
param_iterator param_end() {
|
||||
return param_iterator(ParamInfo + param_size());
|
||||
}
|
||||
|
||||
param_const_range params() const {
|
||||
return param_const_range(param_begin(), param_end());
|
||||
}
|
||||
param_const_iterator param_begin() const {
|
||||
return param_const_iterator(ParamInfo);
|
||||
}
|
||||
param_const_iterator param_end() const {
|
||||
return param_const_iterator(ParamInfo + param_size());
|
||||
}
|
||||
// Iterator access to formal parameters.
|
||||
typedef MutableArrayRef<ParmVarDecl *>::iterator param_iterator;
|
||||
typedef ArrayRef<ParmVarDecl *>::const_iterator param_const_iterator;
|
||||
bool param_empty() const { return parameters().empty(); }
|
||||
param_iterator param_begin() { return parameters().begin(); }
|
||||
param_iterator param_end() { return parameters().end(); }
|
||||
param_const_iterator param_begin() const { return parameters().begin(); }
|
||||
param_const_iterator param_end() const { return parameters().end(); }
|
||||
size_t param_size() const { return parameters().size(); }
|
||||
|
||||
unsigned getNumParams() const { return NumParams; }
|
||||
const ParmVarDecl *getParamDecl(unsigned i) const {
|
||||
|
|
@ -3501,22 +3576,12 @@ public:
|
|||
/// Does not include an entry for 'this'.
|
||||
unsigned getNumCaptures() const { return NumCaptures; }
|
||||
|
||||
typedef const Capture *capture_iterator;
|
||||
typedef const Capture *capture_const_iterator;
|
||||
typedef llvm::iterator_range<capture_iterator> capture_range;
|
||||
typedef llvm::iterator_range<capture_const_iterator> capture_const_range;
|
||||
typedef ArrayRef<Capture>::const_iterator capture_const_iterator;
|
||||
|
||||
capture_range captures() {
|
||||
return capture_range(capture_begin(), capture_end());
|
||||
}
|
||||
capture_const_range captures() const {
|
||||
return capture_const_range(capture_begin(), capture_end());
|
||||
}
|
||||
ArrayRef<Capture> captures() const { return {Captures, NumCaptures}; }
|
||||
|
||||
capture_iterator capture_begin() { return Captures; }
|
||||
capture_iterator capture_end() { return Captures + NumCaptures; }
|
||||
capture_const_iterator capture_begin() const { return Captures; }
|
||||
capture_const_iterator capture_end() const { return Captures + NumCaptures; }
|
||||
capture_const_iterator capture_begin() const { return captures().begin(); }
|
||||
capture_const_iterator capture_end() const { return captures().end(); }
|
||||
|
||||
bool capturesCXXThis() const { return CapturesCXXThis; }
|
||||
bool blockMissingReturnType() const { return BlockMissingReturnType; }
|
||||
|
|
@ -3607,6 +3672,14 @@ public:
|
|||
getParams()[i] = P;
|
||||
}
|
||||
|
||||
// ArrayRef interface to parameters.
|
||||
ArrayRef<ImplicitParamDecl *> parameters() const {
|
||||
return {getParams(), getNumParams()};
|
||||
}
|
||||
MutableArrayRef<ImplicitParamDecl *> parameters() {
|
||||
return {getParams(), getNumParams()};
|
||||
}
|
||||
|
||||
/// \brief Retrieve the parameter containing captured variables.
|
||||
ImplicitParamDecl *getContextParam() const {
|
||||
assert(ContextParam < NumParams);
|
||||
|
|
@ -3627,9 +3700,6 @@ public:
|
|||
/// \brief Retrieve an iterator one past the last parameter decl.
|
||||
param_iterator param_end() const { return getParams() + NumParams; }
|
||||
|
||||
/// \brief Retrieve an iterator range for the parameter declarations.
|
||||
param_range params() const { return param_range(param_begin(), param_end()); }
|
||||
|
||||
// Implement isa/cast/dyncast/etc.
|
||||
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
|
||||
static bool classofKind(Kind K) { return K == Captured; }
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ struct PrintingPolicy;
|
|||
class RecordDecl;
|
||||
class Stmt;
|
||||
class StoredDeclsMap;
|
||||
class TemplateDecl;
|
||||
class TranslationUnitDecl;
|
||||
class UsingDirectiveDecl;
|
||||
}
|
||||
|
|
@ -72,13 +73,10 @@ namespace clang {
|
|||
///
|
||||
/// Note: There are objects tacked on before the *beginning* of Decl
|
||||
/// (and its subclasses) in its Decl::operator new(). Proper alignment
|
||||
/// of all subclasses (not requiring more than DeclObjAlignment) is
|
||||
/// of all subclasses (not requiring more than the alignment of Decl) is
|
||||
/// asserted in DeclBase.cpp.
|
||||
class Decl {
|
||||
class LLVM_ALIGNAS(/*alignof(uint64_t)*/ 8) Decl {
|
||||
public:
|
||||
/// \brief Alignment guaranteed when allocating Decl and any subtypes.
|
||||
enum { DeclObjAlignment = llvm::AlignOf<uint64_t>::Alignment };
|
||||
|
||||
/// \brief Lists the kind of concrete classes of Decl.
|
||||
enum Kind {
|
||||
#define DECL(DERIVED, BASE) DERIVED,
|
||||
|
|
@ -166,7 +164,10 @@ public:
|
|||
/// has been declared outside any function. These act mostly like
|
||||
/// invisible friend declarations, but are also visible to unqualified
|
||||
/// lookup within the scope of the declaring function.
|
||||
IDNS_LocalExtern = 0x0800
|
||||
IDNS_LocalExtern = 0x0800,
|
||||
|
||||
/// This declaration is an OpenMP user defined reduction construction.
|
||||
IDNS_OMPReduction = 0x1000
|
||||
};
|
||||
|
||||
/// ObjCDeclQualifier - 'Qualifiers' written next to the return and
|
||||
|
|
@ -256,7 +257,7 @@ private:
|
|||
SourceLocation Loc;
|
||||
|
||||
/// DeclKind - This indicates which class this is.
|
||||
unsigned DeclKind : 8;
|
||||
unsigned DeclKind : 7;
|
||||
|
||||
/// InvalidDecl - This indicates a semantic error occurred.
|
||||
unsigned InvalidDecl : 1;
|
||||
|
|
@ -296,7 +297,7 @@ protected:
|
|||
unsigned Hidden : 1;
|
||||
|
||||
/// IdentifierNamespace - This specifies what IDNS_* namespace this lives in.
|
||||
unsigned IdentifierNamespace : 12;
|
||||
unsigned IdentifierNamespace : 13;
|
||||
|
||||
/// \brief If 0, we have not computed the linkage of this declaration.
|
||||
/// Otherwise, it is the linkage + 1.
|
||||
|
|
@ -514,8 +515,8 @@ public:
|
|||
bool isImplicit() const { return Implicit; }
|
||||
void setImplicit(bool I = true) { Implicit = I; }
|
||||
|
||||
/// \brief Whether this declaration was used, meaning that a definition
|
||||
/// is required.
|
||||
/// \brief Whether *any* (re-)declaration of the entity was used, meaning that
|
||||
/// a definition is required.
|
||||
///
|
||||
/// \param CheckUsedAttr When true, also consider the "used" attribute
|
||||
/// (in addition to the "used" bit set by \c setUsed()) when determining
|
||||
|
|
@ -525,7 +526,8 @@ public:
|
|||
/// \brief Set whether the declaration is used, in the sense of odr-use.
|
||||
///
|
||||
/// This should only be used immediately after creating a declaration.
|
||||
void setIsUsed() { Used = true; }
|
||||
/// It intentionally doesn't notify any listeners.
|
||||
void setIsUsed() { getCanonicalDecl()->Used = true; }
|
||||
|
||||
/// \brief Mark the declaration used, in the sense of odr-use.
|
||||
///
|
||||
|
|
@ -564,6 +566,13 @@ public:
|
|||
return NextInContextAndBits.getInt() & ModulePrivateFlag;
|
||||
}
|
||||
|
||||
/// Return true if this declaration has an attribute which acts as
|
||||
/// definition of the entity, such as 'alias' or 'ifunc'.
|
||||
bool hasDefiningAttr() const;
|
||||
|
||||
/// Return this declaration's defining attribute if it has one.
|
||||
const Attr *getDefiningAttr() const;
|
||||
|
||||
protected:
|
||||
/// \brief Specify whether this declaration was marked as being private
|
||||
/// to the module in which it was defined.
|
||||
|
|
@ -895,6 +904,10 @@ public:
|
|||
DeclKind == FunctionTemplate;
|
||||
}
|
||||
|
||||
/// \brief If this is a declaration that describes some template, this
|
||||
/// method returns that template declaration.
|
||||
TemplateDecl *getDescribedTemplate() const;
|
||||
|
||||
/// \brief Returns the function itself, or the templated function if this is a
|
||||
/// function template.
|
||||
FunctionDecl *getAsFunction() LLVM_READONLY;
|
||||
|
|
@ -1117,6 +1130,7 @@ public:
|
|||
/// ObjCContainerDecl
|
||||
/// LinkageSpecDecl
|
||||
/// BlockDecl
|
||||
/// OMPDeclareReductionDecl
|
||||
///
|
||||
class DeclContext {
|
||||
/// DeclKind - This indicates which class this is.
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
#ifndef LLVM_CLANG_AST_DECLCXX_H
|
||||
#define LLVM_CLANG_AST_DECLCXX_H
|
||||
|
||||
#include "clang/AST/ASTContext.h"
|
||||
#include "clang/AST/ASTUnresolvedSet.h"
|
||||
#include "clang/AST/Attr.h"
|
||||
#include "clang/AST/Decl.h"
|
||||
|
|
@ -29,6 +30,7 @@ namespace clang {
|
|||
|
||||
class ClassTemplateDecl;
|
||||
class ClassTemplateSpecializationDecl;
|
||||
class ConstructorUsingShadowDecl;
|
||||
class CXXBasePath;
|
||||
class CXXBasePaths;
|
||||
class CXXConstructorDecl;
|
||||
|
|
@ -165,13 +167,13 @@ class CXXBaseSpecifier {
|
|||
SourceLocation EllipsisLoc;
|
||||
|
||||
/// \brief Whether this is a virtual base class or not.
|
||||
bool Virtual : 1;
|
||||
unsigned Virtual : 1;
|
||||
|
||||
/// \brief Whether this is the base of a class (true) or of a struct (false).
|
||||
///
|
||||
/// This determines the mapping from the access specifier as written in the
|
||||
/// source code to the access specifier used for semantic analysis.
|
||||
bool BaseOfClass : 1;
|
||||
unsigned BaseOfClass : 1;
|
||||
|
||||
/// \brief Access specifier as written in the source code (may be AS_none).
|
||||
///
|
||||
|
|
@ -181,7 +183,7 @@ class CXXBaseSpecifier {
|
|||
|
||||
/// \brief Whether the class contains a using declaration
|
||||
/// to inherit the named class's constructors.
|
||||
bool InheritConstructors : 1;
|
||||
unsigned InheritConstructors : 1;
|
||||
|
||||
/// \brief The type of the base class.
|
||||
///
|
||||
|
|
@ -257,30 +259,6 @@ public:
|
|||
TypeSourceInfo *getTypeSourceInfo() const { return BaseTypeInfo; }
|
||||
};
|
||||
|
||||
/// \brief A lazy pointer to the definition data for a declaration.
|
||||
/// FIXME: This is a little CXXRecordDecl-specific that the moment.
|
||||
template<typename Decl, typename T> class LazyDefinitionDataPtr {
|
||||
llvm::PointerUnion<T *, Decl *> DataOrCanonicalDecl;
|
||||
|
||||
LazyDefinitionDataPtr update() {
|
||||
if (Decl *Canon = DataOrCanonicalDecl.template dyn_cast<Decl*>()) {
|
||||
if (Canon->isCanonicalDecl())
|
||||
Canon->getMostRecentDecl();
|
||||
else
|
||||
// Declaration isn't canonical any more;
|
||||
// update it and perform path compression.
|
||||
*this = Canon->getPreviousDecl()->DefinitionData.update();
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
public:
|
||||
LazyDefinitionDataPtr(Decl *Canon) : DataOrCanonicalDecl(Canon) {}
|
||||
LazyDefinitionDataPtr(T *Data) : DataOrCanonicalDecl(Data) {}
|
||||
T *getNotUpdated() { return DataOrCanonicalDecl.template dyn_cast<T*>(); }
|
||||
T *get() { return update().getNotUpdated(); }
|
||||
};
|
||||
|
||||
/// \brief Represents a C++ struct/union/class.
|
||||
class CXXRecordDecl : public RecordDecl {
|
||||
|
||||
|
|
@ -301,30 +279,30 @@ class CXXRecordDecl : public RecordDecl {
|
|||
DefinitionData(CXXRecordDecl *D);
|
||||
|
||||
/// \brief True if this class has any user-declared constructors.
|
||||
bool UserDeclaredConstructor : 1;
|
||||
unsigned UserDeclaredConstructor : 1;
|
||||
|
||||
/// \brief The user-declared special members which this class has.
|
||||
unsigned UserDeclaredSpecialMembers : 6;
|
||||
|
||||
/// \brief True when this class is an aggregate.
|
||||
bool Aggregate : 1;
|
||||
unsigned Aggregate : 1;
|
||||
|
||||
/// \brief True when this class is a POD-type.
|
||||
bool PlainOldData : 1;
|
||||
unsigned PlainOldData : 1;
|
||||
|
||||
/// true when this class is empty for traits purposes,
|
||||
/// i.e. has no data members other than 0-width bit-fields, has no
|
||||
/// virtual function/base, and doesn't inherit from a non-empty
|
||||
/// class. Doesn't take union-ness into account.
|
||||
bool Empty : 1;
|
||||
unsigned Empty : 1;
|
||||
|
||||
/// \brief True when this class is polymorphic, i.e., has at
|
||||
/// least one virtual member or derives from a polymorphic class.
|
||||
bool Polymorphic : 1;
|
||||
unsigned Polymorphic : 1;
|
||||
|
||||
/// \brief True when this class is abstract, i.e., has at least
|
||||
/// one pure virtual function, (that can come from a base class).
|
||||
bool Abstract : 1;
|
||||
unsigned Abstract : 1;
|
||||
|
||||
/// \brief True when this class has standard layout.
|
||||
///
|
||||
|
|
@ -340,58 +318,70 @@ class CXXRecordDecl : public RecordDecl {
|
|||
/// classes with non-static data members, and
|
||||
/// * has no base classes of the same type as the first non-static data
|
||||
/// member.
|
||||
bool IsStandardLayout : 1;
|
||||
unsigned IsStandardLayout : 1;
|
||||
|
||||
/// \brief True when there are no non-empty base classes.
|
||||
///
|
||||
/// This is a helper bit of state used to implement IsStandardLayout more
|
||||
/// efficiently.
|
||||
bool HasNoNonEmptyBases : 1;
|
||||
unsigned HasNoNonEmptyBases : 1;
|
||||
|
||||
/// \brief True when there are private non-static data members.
|
||||
bool HasPrivateFields : 1;
|
||||
unsigned HasPrivateFields : 1;
|
||||
|
||||
/// \brief True when there are protected non-static data members.
|
||||
bool HasProtectedFields : 1;
|
||||
unsigned HasProtectedFields : 1;
|
||||
|
||||
/// \brief True when there are private non-static data members.
|
||||
bool HasPublicFields : 1;
|
||||
unsigned HasPublicFields : 1;
|
||||
|
||||
/// \brief True if this class (or any subobject) has mutable fields.
|
||||
bool HasMutableFields : 1;
|
||||
unsigned HasMutableFields : 1;
|
||||
|
||||
/// \brief True if this class (or any nested anonymous struct or union)
|
||||
/// has variant members.
|
||||
bool HasVariantMembers : 1;
|
||||
unsigned HasVariantMembers : 1;
|
||||
|
||||
/// \brief True if there no non-field members declared by the user.
|
||||
bool HasOnlyCMembers : 1;
|
||||
unsigned HasOnlyCMembers : 1;
|
||||
|
||||
/// \brief True if any field has an in-class initializer, including those
|
||||
/// within anonymous unions or structs.
|
||||
bool HasInClassInitializer : 1;
|
||||
unsigned HasInClassInitializer : 1;
|
||||
|
||||
/// \brief True if any field is of reference type, and does not have an
|
||||
/// in-class initializer.
|
||||
///
|
||||
/// In this case, value-initialization of this class is illegal in C++98
|
||||
/// even if the class has a trivial default constructor.
|
||||
bool HasUninitializedReferenceMember : 1;
|
||||
unsigned HasUninitializedReferenceMember : 1;
|
||||
|
||||
/// \brief True if any non-mutable field whose type doesn't have a user-
|
||||
/// provided default ctor also doesn't have an in-class initializer.
|
||||
unsigned HasUninitializedFields : 1;
|
||||
|
||||
/// \brief True if there are any member using-declarations that inherit
|
||||
/// constructors from a base class.
|
||||
unsigned HasInheritedConstructor : 1;
|
||||
|
||||
/// \brief True if there are any member using-declarations named
|
||||
/// 'operator='.
|
||||
unsigned HasInheritedAssignment : 1;
|
||||
|
||||
/// \brief These flags are \c true if a defaulted corresponding special
|
||||
/// member can't be fully analyzed without performing overload resolution.
|
||||
/// @{
|
||||
bool NeedOverloadResolutionForMoveConstructor : 1;
|
||||
bool NeedOverloadResolutionForMoveAssignment : 1;
|
||||
bool NeedOverloadResolutionForDestructor : 1;
|
||||
unsigned NeedOverloadResolutionForMoveConstructor : 1;
|
||||
unsigned NeedOverloadResolutionForMoveAssignment : 1;
|
||||
unsigned NeedOverloadResolutionForDestructor : 1;
|
||||
/// @}
|
||||
|
||||
/// \brief These flags are \c true if an implicit defaulted corresponding
|
||||
/// special member would be defined as deleted.
|
||||
/// @{
|
||||
bool DefaultedMoveConstructorIsDeleted : 1;
|
||||
bool DefaultedMoveAssignmentIsDeleted : 1;
|
||||
bool DefaultedDestructorIsDeleted : 1;
|
||||
unsigned DefaultedMoveConstructorIsDeleted : 1;
|
||||
unsigned DefaultedMoveAssignmentIsDeleted : 1;
|
||||
unsigned DefaultedDestructorIsDeleted : 1;
|
||||
/// @}
|
||||
|
||||
/// \brief The trivial special members which this class has, per
|
||||
|
|
@ -411,33 +401,37 @@ class CXXRecordDecl : public RecordDecl {
|
|||
unsigned DeclaredNonTrivialSpecialMembers : 6;
|
||||
|
||||
/// \brief True when this class has a destructor with no semantic effect.
|
||||
bool HasIrrelevantDestructor : 1;
|
||||
unsigned HasIrrelevantDestructor : 1;
|
||||
|
||||
/// \brief True when this class has at least one user-declared constexpr
|
||||
/// constructor which is neither the copy nor move constructor.
|
||||
bool HasConstexprNonCopyMoveConstructor : 1;
|
||||
unsigned HasConstexprNonCopyMoveConstructor : 1;
|
||||
|
||||
/// \brief True if this class has a (possibly implicit) defaulted default
|
||||
/// constructor.
|
||||
unsigned HasDefaultedDefaultConstructor : 1;
|
||||
|
||||
/// \brief True if a defaulted default constructor for this class would
|
||||
/// be constexpr.
|
||||
bool DefaultedDefaultConstructorIsConstexpr : 1;
|
||||
unsigned DefaultedDefaultConstructorIsConstexpr : 1;
|
||||
|
||||
/// \brief True if this class has a constexpr default constructor.
|
||||
///
|
||||
/// This is true for either a user-declared constexpr default constructor
|
||||
/// or an implicitly declared constexpr default constructor.
|
||||
bool HasConstexprDefaultConstructor : 1;
|
||||
unsigned HasConstexprDefaultConstructor : 1;
|
||||
|
||||
/// \brief True when this class contains at least one non-static data
|
||||
/// member or base class of non-literal or volatile type.
|
||||
bool HasNonLiteralTypeFieldsOrBases : 1;
|
||||
unsigned HasNonLiteralTypeFieldsOrBases : 1;
|
||||
|
||||
/// \brief True when visible conversion functions are already computed
|
||||
/// and are available.
|
||||
bool ComputedVisibleConversions : 1;
|
||||
unsigned ComputedVisibleConversions : 1;
|
||||
|
||||
/// \brief Whether we have a C++11 user-provided default constructor (not
|
||||
/// explicitly deleted or defaulted).
|
||||
bool UserProvidedDefaultConstructor : 1;
|
||||
unsigned UserProvidedDefaultConstructor : 1;
|
||||
|
||||
/// \brief The special members which have been declared for this class,
|
||||
/// either by the user or implicitly.
|
||||
|
|
@ -445,25 +439,25 @@ class CXXRecordDecl : public RecordDecl {
|
|||
|
||||
/// \brief Whether an implicit copy constructor would have a const-qualified
|
||||
/// parameter.
|
||||
bool ImplicitCopyConstructorHasConstParam : 1;
|
||||
unsigned ImplicitCopyConstructorHasConstParam : 1;
|
||||
|
||||
/// \brief Whether an implicit copy assignment operator would have a
|
||||
/// const-qualified parameter.
|
||||
bool ImplicitCopyAssignmentHasConstParam : 1;
|
||||
unsigned ImplicitCopyAssignmentHasConstParam : 1;
|
||||
|
||||
/// \brief Whether any declared copy constructor has a const-qualified
|
||||
/// parameter.
|
||||
bool HasDeclaredCopyConstructorWithConstParam : 1;
|
||||
unsigned HasDeclaredCopyConstructorWithConstParam : 1;
|
||||
|
||||
/// \brief Whether any declared copy assignment operator has either a
|
||||
/// const-qualified reference parameter or a non-reference parameter.
|
||||
bool HasDeclaredCopyAssignmentWithConstParam : 1;
|
||||
unsigned HasDeclaredCopyAssignmentWithConstParam : 1;
|
||||
|
||||
/// \brief Whether this class describes a C++ lambda.
|
||||
bool IsLambda : 1;
|
||||
unsigned IsLambda : 1;
|
||||
|
||||
/// \brief Whether we are currently parsing base specifiers.
|
||||
bool IsParsingBaseSpecifiers : 1;
|
||||
unsigned IsParsingBaseSpecifiers : 1;
|
||||
|
||||
/// \brief The number of base class specifiers in Bases.
|
||||
unsigned NumBases;
|
||||
|
|
@ -515,16 +509,19 @@ class CXXRecordDecl : public RecordDecl {
|
|||
return getVBasesSlowCase();
|
||||
}
|
||||
|
||||
ArrayRef<CXXBaseSpecifier> bases() const {
|
||||
return llvm::makeArrayRef(getBases(), NumBases);
|
||||
}
|
||||
ArrayRef<CXXBaseSpecifier> vbases() const {
|
||||
return llvm::makeArrayRef(getVBases(), NumVBases);
|
||||
}
|
||||
|
||||
private:
|
||||
CXXBaseSpecifier *getBasesSlowCase() const;
|
||||
CXXBaseSpecifier *getVBasesSlowCase() const;
|
||||
};
|
||||
|
||||
typedef LazyDefinitionDataPtr<CXXRecordDecl, struct DefinitionData>
|
||||
DefinitionDataPtr;
|
||||
friend class LazyDefinitionDataPtr<CXXRecordDecl, struct DefinitionData>;
|
||||
|
||||
mutable DefinitionDataPtr DefinitionData;
|
||||
struct DefinitionData *DefinitionData;
|
||||
|
||||
/// \brief Describes a C++ closure type (generated by a lambda expression).
|
||||
struct LambdaDefinitionData : public DefinitionData {
|
||||
|
|
@ -587,8 +584,14 @@ class CXXRecordDecl : public RecordDecl {
|
|||
|
||||
};
|
||||
|
||||
struct DefinitionData *dataPtr() const {
|
||||
// Complete the redecl chain (if necessary).
|
||||
getMostRecentDecl();
|
||||
return DefinitionData;
|
||||
}
|
||||
|
||||
struct DefinitionData &data() const {
|
||||
auto *DD = DefinitionData.get();
|
||||
auto *DD = dataPtr();
|
||||
assert(DD && "queried property of class with no definition");
|
||||
return *DD;
|
||||
}
|
||||
|
|
@ -596,7 +599,7 @@ class CXXRecordDecl : public RecordDecl {
|
|||
struct LambdaDefinitionData &getLambdaData() const {
|
||||
// No update required: a merged definition cannot change any lambda
|
||||
// properties.
|
||||
auto *DD = DefinitionData.getNotUpdated();
|
||||
auto *DD = DefinitionData;
|
||||
assert(DD && DD->IsLambda && "queried lambda property of non-lambda class");
|
||||
return static_cast<LambdaDefinitionData&>(*DD);
|
||||
}
|
||||
|
|
@ -673,11 +676,13 @@ public:
|
|||
}
|
||||
|
||||
CXXRecordDecl *getDefinition() const {
|
||||
auto *DD = DefinitionData.get();
|
||||
// We only need an update if we don't already know which
|
||||
// declaration is the definition.
|
||||
auto *DD = DefinitionData ? DefinitionData : dataPtr();
|
||||
return DD ? DD->Definition : nullptr;
|
||||
}
|
||||
|
||||
bool hasDefinition() const { return DefinitionData.get(); }
|
||||
bool hasDefinition() const { return DefinitionData || dataPtr(); }
|
||||
|
||||
static CXXRecordDecl *Create(const ASTContext &C, TagKind TK, DeclContext *DC,
|
||||
SourceLocation StartLoc, SourceLocation IdLoc,
|
||||
|
|
@ -1021,7 +1026,7 @@ public:
|
|||
/// \brief Determine whether this class describes a lambda function object.
|
||||
bool isLambda() const {
|
||||
// An update record can't turn a non-lambda into a lambda.
|
||||
auto *DD = DefinitionData.getNotUpdated();
|
||||
auto *DD = DefinitionData;
|
||||
return DD && DD->IsLambda;
|
||||
}
|
||||
|
||||
|
|
@ -1136,9 +1141,10 @@ public:
|
|||
/// \brief Determine whether this is an empty class in the sense of
|
||||
/// (C++11 [meta.unary.prop]).
|
||||
///
|
||||
/// A non-union class is empty iff it has a virtual function, virtual base,
|
||||
/// data member (other than 0-width bit-field) or inherits from a non-empty
|
||||
/// class.
|
||||
/// The CXXRecordDecl is a class type, but not a union type,
|
||||
/// with no non-static data members other than bit-fields of length 0,
|
||||
/// no virtual member functions, no virtual base classes,
|
||||
/// and no base class B for which is_empty<B>::value is false.
|
||||
///
|
||||
/// \note This does NOT include a check for union-ness.
|
||||
bool isEmpty() const { return data().Empty; }
|
||||
|
|
@ -1270,6 +1276,14 @@ public:
|
|||
return !(data().HasTrivialSpecialMembers & SMF_Destructor);
|
||||
}
|
||||
|
||||
/// \brief Determine whether declaring a const variable with this type is ok
|
||||
/// per core issue 253.
|
||||
bool allowConstDefaultInit() const {
|
||||
return !data().HasUninitializedFields ||
|
||||
!(data().HasDefaultedDefaultConstructor ||
|
||||
needsImplicitDefaultConstructor());
|
||||
}
|
||||
|
||||
/// \brief Determine whether this class has a destructor which has no
|
||||
/// semantic effect.
|
||||
///
|
||||
|
|
@ -1285,6 +1299,18 @@ public:
|
|||
return data().HasNonLiteralTypeFieldsOrBases;
|
||||
}
|
||||
|
||||
/// \brief Determine whether this class has a using-declaration that names
|
||||
/// a user-declared base class constructor.
|
||||
bool hasInheritedConstructor() const {
|
||||
return data().HasInheritedConstructor;
|
||||
}
|
||||
|
||||
/// \brief Determine whether this class has a using-declaration that names
|
||||
/// a base class assignment operator.
|
||||
bool hasInheritedAssignment() const {
|
||||
return data().HasInheritedAssignment;
|
||||
}
|
||||
|
||||
/// \brief Determine whether this class is considered trivially copyable per
|
||||
/// (C++11 [class]p6).
|
||||
bool isTriviallyCopyable() const;
|
||||
|
|
@ -1554,6 +1580,14 @@ public:
|
|||
static bool FindOrdinaryMember(const CXXBaseSpecifier *Specifier,
|
||||
CXXBasePath &Path, DeclarationName Name);
|
||||
|
||||
/// \brief Base-class lookup callback that determines whether there exists
|
||||
/// an OpenMP declare reduction member with the given name.
|
||||
///
|
||||
/// This callback can be used with \c lookupInBases() to find members
|
||||
/// of the given name within a C++ class hierarchy.
|
||||
static bool FindOMPReductionMember(const CXXBaseSpecifier *Specifier,
|
||||
CXXBasePath &Path, DeclarationName Name);
|
||||
|
||||
/// \brief Base-class lookup callback that determines whether there exists
|
||||
/// a member with the given name that can be used in a nested-name-specifier.
|
||||
///
|
||||
|
|
@ -1690,6 +1724,7 @@ public:
|
|||
|
||||
friend class ASTDeclReader;
|
||||
friend class ASTDeclWriter;
|
||||
friend class ASTRecordWriter;
|
||||
friend class ASTReader;
|
||||
friend class ASTWriter;
|
||||
};
|
||||
|
|
@ -1795,6 +1830,8 @@ public:
|
|||
method_iterator begin_overridden_methods() const;
|
||||
method_iterator end_overridden_methods() const;
|
||||
unsigned size_overridden_methods() const;
|
||||
typedef ASTContext::overridden_method_range overridden_method_range;
|
||||
overridden_method_range overridden_methods() const;
|
||||
|
||||
/// Returns the parent of this method declaration, which
|
||||
/// is the class in which this method is defined.
|
||||
|
|
@ -1910,15 +1947,15 @@ class CXXCtorInitializer final
|
|||
|
||||
/// \brief If the initializee is a type, whether that type makes this
|
||||
/// a delegating initialization.
|
||||
bool IsDelegating : 1;
|
||||
unsigned IsDelegating : 1;
|
||||
|
||||
/// \brief If the initializer is a base initializer, this keeps track
|
||||
/// of whether the base is virtual or not.
|
||||
bool IsVirtual : 1;
|
||||
unsigned IsVirtual : 1;
|
||||
|
||||
/// \brief Whether or not the initializer is explicitly written
|
||||
/// in the sources.
|
||||
bool IsWritten : 1;
|
||||
unsigned IsWritten : 1;
|
||||
|
||||
/// If IsWritten is true, then this number keeps track of the textual order
|
||||
/// of this initializer in the original sources, counting from 0; otherwise,
|
||||
|
|
@ -2109,8 +2146,7 @@ public:
|
|||
assert(I < getNumArrayIndices() && "Out of bounds member array index");
|
||||
getTrailingObjects<VarDecl *>()[I] = Index;
|
||||
}
|
||||
ArrayRef<VarDecl *> getArrayIndexes() {
|
||||
assert(getNumArrayIndices() != 0 && "Getting indexes for non-array init");
|
||||
ArrayRef<VarDecl *> getArrayIndices() {
|
||||
return llvm::makeArrayRef(getTrailingObjects<VarDecl *>(),
|
||||
getNumArrayIndices());
|
||||
}
|
||||
|
|
@ -2121,6 +2157,23 @@ public:
|
|||
friend TrailingObjects;
|
||||
};
|
||||
|
||||
/// Description of a constructor that was inherited from a base class.
|
||||
class InheritedConstructor {
|
||||
ConstructorUsingShadowDecl *Shadow;
|
||||
CXXConstructorDecl *BaseCtor;
|
||||
|
||||
public:
|
||||
InheritedConstructor() : Shadow(), BaseCtor() {}
|
||||
InheritedConstructor(ConstructorUsingShadowDecl *Shadow,
|
||||
CXXConstructorDecl *BaseCtor)
|
||||
: Shadow(Shadow), BaseCtor(BaseCtor) {}
|
||||
|
||||
explicit operator bool() const { return Shadow; }
|
||||
|
||||
ConstructorUsingShadowDecl *getShadowDecl() const { return Shadow; }
|
||||
CXXConstructorDecl *getConstructor() const { return BaseCtor; }
|
||||
};
|
||||
|
||||
/// \brief Represents a C++ constructor within a class.
|
||||
///
|
||||
/// For example:
|
||||
|
|
@ -2131,40 +2184,51 @@ public:
|
|||
/// explicit X(int); // represented by a CXXConstructorDecl.
|
||||
/// };
|
||||
/// \endcode
|
||||
class CXXConstructorDecl : public CXXMethodDecl {
|
||||
class CXXConstructorDecl final
|
||||
: public CXXMethodDecl,
|
||||
private llvm::TrailingObjects<CXXConstructorDecl, InheritedConstructor> {
|
||||
void anchor() override;
|
||||
/// \brief Whether this constructor declaration has the \c explicit keyword
|
||||
/// specified.
|
||||
bool IsExplicitSpecified : 1;
|
||||
|
||||
/// \name Support for base and member initializers.
|
||||
/// \{
|
||||
/// \brief The arguments used to initialize the base or member.
|
||||
LazyCXXCtorInitializersPtr CtorInitializers;
|
||||
unsigned NumCtorInitializers;
|
||||
unsigned NumCtorInitializers : 30;
|
||||
/// \}
|
||||
|
||||
/// \brief Whether this constructor declaration has the \c explicit keyword
|
||||
/// specified.
|
||||
unsigned IsExplicitSpecified : 1;
|
||||
|
||||
/// \brief Whether this constructor declaration is an implicitly-declared
|
||||
/// inheriting constructor.
|
||||
unsigned IsInheritingConstructor : 1;
|
||||
|
||||
CXXConstructorDecl(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
|
||||
const DeclarationNameInfo &NameInfo,
|
||||
QualType T, TypeSourceInfo *TInfo,
|
||||
bool isExplicitSpecified, bool isInline,
|
||||
bool isImplicitlyDeclared, bool isConstexpr)
|
||||
bool isImplicitlyDeclared, bool isConstexpr,
|
||||
InheritedConstructor Inherited)
|
||||
: CXXMethodDecl(CXXConstructor, C, RD, StartLoc, NameInfo, T, TInfo,
|
||||
SC_None, isInline, isConstexpr, SourceLocation()),
|
||||
IsExplicitSpecified(isExplicitSpecified), CtorInitializers(nullptr),
|
||||
NumCtorInitializers(0) {
|
||||
CtorInitializers(nullptr), NumCtorInitializers(0),
|
||||
IsExplicitSpecified(isExplicitSpecified),
|
||||
IsInheritingConstructor((bool)Inherited) {
|
||||
setImplicit(isImplicitlyDeclared);
|
||||
if (Inherited)
|
||||
*getTrailingObjects<InheritedConstructor>() = Inherited;
|
||||
}
|
||||
|
||||
public:
|
||||
static CXXConstructorDecl *CreateDeserialized(ASTContext &C, unsigned ID);
|
||||
static CXXConstructorDecl *Create(ASTContext &C, CXXRecordDecl *RD,
|
||||
SourceLocation StartLoc,
|
||||
const DeclarationNameInfo &NameInfo,
|
||||
QualType T, TypeSourceInfo *TInfo,
|
||||
bool isExplicit,
|
||||
bool isInline, bool isImplicitlyDeclared,
|
||||
bool isConstexpr);
|
||||
static CXXConstructorDecl *CreateDeserialized(ASTContext &C, unsigned ID,
|
||||
bool InheritsConstructor);
|
||||
static CXXConstructorDecl *
|
||||
Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc,
|
||||
const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo,
|
||||
bool isExplicit, bool isInline, bool isImplicitlyDeclared,
|
||||
bool isConstexpr,
|
||||
InheritedConstructor Inherited = InheritedConstructor());
|
||||
|
||||
/// \brief Determine whether this constructor declaration has the
|
||||
/// \c explicit keyword specified.
|
||||
|
|
@ -2311,11 +2375,15 @@ public:
|
|||
/// an object.
|
||||
bool isSpecializationCopyingObject() const;
|
||||
|
||||
/// \brief Get the constructor that this inheriting constructor is based on.
|
||||
const CXXConstructorDecl *getInheritedConstructor() const;
|
||||
/// \brief Determine whether this is an implicit constructor synthesized to
|
||||
/// model a call to a constructor inherited from a base class.
|
||||
bool isInheritingConstructor() const { return IsInheritingConstructor; }
|
||||
|
||||
/// \brief Set the constructor that this inheriting constructor is based on.
|
||||
void setInheritedConstructor(const CXXConstructorDecl *BaseCtor);
|
||||
/// \brief Get the constructor that this inheriting constructor is based on.
|
||||
InheritedConstructor getInheritedConstructor() const {
|
||||
return IsInheritingConstructor ? *getTrailingObjects<InheritedConstructor>()
|
||||
: InheritedConstructor();
|
||||
}
|
||||
|
||||
CXXConstructorDecl *getCanonicalDecl() override {
|
||||
return cast<CXXConstructorDecl>(FunctionDecl::getCanonicalDecl());
|
||||
|
|
@ -2330,6 +2398,7 @@ public:
|
|||
|
||||
friend class ASTDeclReader;
|
||||
friend class ASTDeclWriter;
|
||||
friend TrailingObjects;
|
||||
};
|
||||
|
||||
/// \brief Represents a C++ destructor within a class.
|
||||
|
|
@ -2774,18 +2843,6 @@ class UsingShadowDecl : public NamedDecl, public Redeclarable<UsingShadowDecl> {
|
|||
NamedDecl *UsingOrNextShadow;
|
||||
friend class UsingDecl;
|
||||
|
||||
UsingShadowDecl(ASTContext &C, DeclContext *DC, SourceLocation Loc,
|
||||
UsingDecl *Using, NamedDecl *Target)
|
||||
: NamedDecl(UsingShadow, DC, Loc, DeclarationName()),
|
||||
redeclarable_base(C), Underlying(Target),
|
||||
UsingOrNextShadow(reinterpret_cast<NamedDecl *>(Using)) {
|
||||
if (Target) {
|
||||
setDeclName(Target->getDeclName());
|
||||
IdentifierNamespace = Target->getIdentifierNamespace();
|
||||
}
|
||||
setImplicit();
|
||||
}
|
||||
|
||||
typedef Redeclarable<UsingShadowDecl> redeclarable_base;
|
||||
UsingShadowDecl *getNextRedeclarationImpl() override {
|
||||
return getNextRedeclaration();
|
||||
|
|
@ -2797,11 +2854,16 @@ class UsingShadowDecl : public NamedDecl, public Redeclarable<UsingShadowDecl> {
|
|||
return getMostRecentDecl();
|
||||
}
|
||||
|
||||
protected:
|
||||
UsingShadowDecl(Kind K, ASTContext &C, DeclContext *DC, SourceLocation Loc,
|
||||
UsingDecl *Using, NamedDecl *Target);
|
||||
UsingShadowDecl(Kind K, ASTContext &C, EmptyShell);
|
||||
|
||||
public:
|
||||
static UsingShadowDecl *Create(ASTContext &C, DeclContext *DC,
|
||||
SourceLocation Loc, UsingDecl *Using,
|
||||
NamedDecl *Target) {
|
||||
return new (C, DC) UsingShadowDecl(C, DC, Loc, Using, Target);
|
||||
return new (C, DC) UsingShadowDecl(UsingShadow, C, DC, Loc, Using, Target);
|
||||
}
|
||||
|
||||
static UsingShadowDecl *CreateDeserialized(ASTContext &C, unsigned ID);
|
||||
|
|
@ -2813,6 +2875,7 @@ public:
|
|||
using redeclarable_base::redecls;
|
||||
using redeclarable_base::getPreviousDecl;
|
||||
using redeclarable_base::getMostRecentDecl;
|
||||
using redeclarable_base::isFirstDecl;
|
||||
|
||||
UsingShadowDecl *getCanonicalDecl() override {
|
||||
return getFirstDecl();
|
||||
|
|
@ -2843,7 +2906,125 @@ public:
|
|||
}
|
||||
|
||||
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
|
||||
static bool classofKind(Kind K) { return K == Decl::UsingShadow; }
|
||||
static bool classofKind(Kind K) {
|
||||
return K == Decl::UsingShadow || K == Decl::ConstructorUsingShadow;
|
||||
}
|
||||
|
||||
friend class ASTDeclReader;
|
||||
friend class ASTDeclWriter;
|
||||
};
|
||||
|
||||
/// \brief Represents a shadow constructor declaration introduced into a
|
||||
/// class by a C++11 using-declaration that names a constructor.
|
||||
///
|
||||
/// For example:
|
||||
/// \code
|
||||
/// struct Base { Base(int); };
|
||||
/// struct Derived {
|
||||
/// using Base::Base; // creates a UsingDecl and a ConstructorUsingShadowDecl
|
||||
/// };
|
||||
/// \endcode
|
||||
class ConstructorUsingShadowDecl final : public UsingShadowDecl {
|
||||
void anchor() override;
|
||||
|
||||
/// \brief If this constructor using declaration inherted the constructor
|
||||
/// from an indirect base class, this is the ConstructorUsingShadowDecl
|
||||
/// in the named direct base class from which the declaration was inherited.
|
||||
ConstructorUsingShadowDecl *NominatedBaseClassShadowDecl;
|
||||
|
||||
/// \brief If this constructor using declaration inherted the constructor
|
||||
/// from an indirect base class, this is the ConstructorUsingShadowDecl
|
||||
/// that will be used to construct the unique direct or virtual base class
|
||||
/// that receives the constructor arguments.
|
||||
ConstructorUsingShadowDecl *ConstructedBaseClassShadowDecl;
|
||||
|
||||
/// \brief \c true if the constructor ultimately named by this using shadow
|
||||
/// declaration is within a virtual base class subobject of the class that
|
||||
/// contains this declaration.
|
||||
unsigned IsVirtual : 1;
|
||||
|
||||
ConstructorUsingShadowDecl(ASTContext &C, DeclContext *DC, SourceLocation Loc,
|
||||
UsingDecl *Using, NamedDecl *Target,
|
||||
bool TargetInVirtualBase)
|
||||
: UsingShadowDecl(ConstructorUsingShadow, C, DC, Loc, Using,
|
||||
Target->getUnderlyingDecl()),
|
||||
NominatedBaseClassShadowDecl(
|
||||
dyn_cast<ConstructorUsingShadowDecl>(Target)),
|
||||
ConstructedBaseClassShadowDecl(NominatedBaseClassShadowDecl),
|
||||
IsVirtual(TargetInVirtualBase) {
|
||||
// If we found a constructor for a non-virtual base class, but it chains to
|
||||
// a constructor for a virtual base, we should directly call the virtual
|
||||
// base constructor instead.
|
||||
// FIXME: This logic belongs in Sema.
|
||||
if (!TargetInVirtualBase && NominatedBaseClassShadowDecl &&
|
||||
NominatedBaseClassShadowDecl->constructsVirtualBase()) {
|
||||
ConstructedBaseClassShadowDecl =
|
||||
NominatedBaseClassShadowDecl->ConstructedBaseClassShadowDecl;
|
||||
IsVirtual = true;
|
||||
}
|
||||
}
|
||||
ConstructorUsingShadowDecl(ASTContext &C, EmptyShell Empty)
|
||||
: UsingShadowDecl(ConstructorUsingShadow, C, Empty) {}
|
||||
|
||||
public:
|
||||
static ConstructorUsingShadowDecl *Create(ASTContext &C, DeclContext *DC,
|
||||
SourceLocation Loc,
|
||||
UsingDecl *Using, NamedDecl *Target,
|
||||
bool IsVirtual);
|
||||
static ConstructorUsingShadowDecl *CreateDeserialized(ASTContext &C,
|
||||
unsigned ID);
|
||||
|
||||
/// Returns the parent of this using shadow declaration, which
|
||||
/// is the class in which this is declared.
|
||||
//@{
|
||||
const CXXRecordDecl *getParent() const {
|
||||
return cast<CXXRecordDecl>(getDeclContext());
|
||||
}
|
||||
CXXRecordDecl *getParent() {
|
||||
return cast<CXXRecordDecl>(getDeclContext());
|
||||
}
|
||||
//@}
|
||||
|
||||
/// \brief Get the inheriting constructor declaration for the direct base
|
||||
/// class from which this using shadow declaration was inherited, if there is
|
||||
/// one. This can be different for each redeclaration of the same shadow decl.
|
||||
ConstructorUsingShadowDecl *getNominatedBaseClassShadowDecl() const {
|
||||
return NominatedBaseClassShadowDecl;
|
||||
}
|
||||
|
||||
/// \brief Get the inheriting constructor declaration for the base class
|
||||
/// for which we don't have an explicit initializer, if there is one.
|
||||
ConstructorUsingShadowDecl *getConstructedBaseClassShadowDecl() const {
|
||||
return ConstructedBaseClassShadowDecl;
|
||||
}
|
||||
|
||||
/// \brief Get the base class that was named in the using declaration. This
|
||||
/// can be different for each redeclaration of this same shadow decl.
|
||||
CXXRecordDecl *getNominatedBaseClass() const;
|
||||
|
||||
/// \brief Get the base class whose constructor or constructor shadow
|
||||
/// declaration is passed the constructor arguments.
|
||||
CXXRecordDecl *getConstructedBaseClass() const {
|
||||
return cast<CXXRecordDecl>((ConstructedBaseClassShadowDecl
|
||||
? ConstructedBaseClassShadowDecl
|
||||
: getTargetDecl())
|
||||
->getDeclContext());
|
||||
}
|
||||
|
||||
/// \brief Returns \c true if the constructed base class is a virtual base
|
||||
/// class subobject of this declaration's class.
|
||||
bool constructsVirtualBase() const {
|
||||
return IsVirtual;
|
||||
}
|
||||
|
||||
/// \brief Get the constructor or constructor template in the derived class
|
||||
/// correspnding to this using shadow declaration, if it has been implicitly
|
||||
/// declared already.
|
||||
CXXConstructorDecl *getConstructor() const;
|
||||
void setConstructor(NamedDecl *Ctor);
|
||||
|
||||
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
|
||||
static bool classofKind(Kind K) { return K == ConstructorUsingShadow; }
|
||||
|
||||
friend class ASTDeclReader;
|
||||
friend class ASTDeclWriter;
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ private:
|
|||
/// True if this 'friend' declaration is unsupported. Eventually we
|
||||
/// will support every possible friend declaration, but for now we
|
||||
/// silently ignore some and set this flag to authorize all access.
|
||||
bool UnsupportedFriend : 1;
|
||||
unsigned UnsupportedFriend : 1;
|
||||
|
||||
// The number of "outer" template parameter lists in non-templatic
|
||||
// (currently unsupported) friend type declarations, such as
|
||||
|
|
|
|||
|
|
@ -351,11 +351,6 @@ public:
|
|||
typedef llvm::iterator_range<param_iterator> param_range;
|
||||
typedef llvm::iterator_range<param_const_iterator> param_const_range;
|
||||
|
||||
param_range params() { return param_range(param_begin(), param_end()); }
|
||||
param_const_range params() const {
|
||||
return param_const_range(param_begin(), param_end());
|
||||
}
|
||||
|
||||
param_const_iterator param_begin() const {
|
||||
return param_const_iterator(getParams());
|
||||
}
|
||||
|
|
@ -689,6 +684,216 @@ public:
|
|||
friend TrailingObjects;
|
||||
};
|
||||
|
||||
enum class ObjCPropertyQueryKind : uint8_t {
|
||||
OBJC_PR_query_unknown = 0x00,
|
||||
OBJC_PR_query_instance,
|
||||
OBJC_PR_query_class
|
||||
};
|
||||
|
||||
/// \brief Represents one property declaration in an Objective-C interface.
|
||||
///
|
||||
/// For example:
|
||||
/// \code{.mm}
|
||||
/// \@property (assign, readwrite) int MyProperty;
|
||||
/// \endcode
|
||||
class ObjCPropertyDecl : public NamedDecl {
|
||||
void anchor() override;
|
||||
public:
|
||||
enum PropertyAttributeKind {
|
||||
OBJC_PR_noattr = 0x00,
|
||||
OBJC_PR_readonly = 0x01,
|
||||
OBJC_PR_getter = 0x02,
|
||||
OBJC_PR_assign = 0x04,
|
||||
OBJC_PR_readwrite = 0x08,
|
||||
OBJC_PR_retain = 0x10,
|
||||
OBJC_PR_copy = 0x20,
|
||||
OBJC_PR_nonatomic = 0x40,
|
||||
OBJC_PR_setter = 0x80,
|
||||
OBJC_PR_atomic = 0x100,
|
||||
OBJC_PR_weak = 0x200,
|
||||
OBJC_PR_strong = 0x400,
|
||||
OBJC_PR_unsafe_unretained = 0x800,
|
||||
/// Indicates that the nullability of the type was spelled with a
|
||||
/// property attribute rather than a type qualifier.
|
||||
OBJC_PR_nullability = 0x1000,
|
||||
OBJC_PR_null_resettable = 0x2000,
|
||||
OBJC_PR_class = 0x4000
|
||||
// Adding a property should change NumPropertyAttrsBits
|
||||
};
|
||||
|
||||
enum {
|
||||
/// \brief Number of bits fitting all the property attributes.
|
||||
NumPropertyAttrsBits = 15
|
||||
};
|
||||
|
||||
enum SetterKind { Assign, Retain, Copy, Weak };
|
||||
enum PropertyControl { None, Required, Optional };
|
||||
private:
|
||||
SourceLocation AtLoc; // location of \@property
|
||||
SourceLocation LParenLoc; // location of '(' starting attribute list or null.
|
||||
QualType DeclType;
|
||||
TypeSourceInfo *DeclTypeSourceInfo;
|
||||
unsigned PropertyAttributes : NumPropertyAttrsBits;
|
||||
unsigned PropertyAttributesAsWritten : NumPropertyAttrsBits;
|
||||
// \@required/\@optional
|
||||
unsigned PropertyImplementation : 2;
|
||||
|
||||
Selector GetterName; // getter name of NULL if no getter
|
||||
Selector SetterName; // setter name of NULL if no setter
|
||||
|
||||
ObjCMethodDecl *GetterMethodDecl; // Declaration of getter instance method
|
||||
ObjCMethodDecl *SetterMethodDecl; // Declaration of setter instance method
|
||||
ObjCIvarDecl *PropertyIvarDecl; // Synthesize ivar for this property
|
||||
|
||||
ObjCPropertyDecl(DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
|
||||
SourceLocation AtLocation, SourceLocation LParenLocation,
|
||||
QualType T, TypeSourceInfo *TSI,
|
||||
PropertyControl propControl)
|
||||
: NamedDecl(ObjCProperty, DC, L, Id), AtLoc(AtLocation),
|
||||
LParenLoc(LParenLocation), DeclType(T), DeclTypeSourceInfo(TSI),
|
||||
PropertyAttributes(OBJC_PR_noattr),
|
||||
PropertyAttributesAsWritten(OBJC_PR_noattr),
|
||||
PropertyImplementation(propControl),
|
||||
GetterName(Selector()),
|
||||
SetterName(Selector()),
|
||||
GetterMethodDecl(nullptr), SetterMethodDecl(nullptr),
|
||||
PropertyIvarDecl(nullptr) {}
|
||||
|
||||
public:
|
||||
static ObjCPropertyDecl *Create(ASTContext &C, DeclContext *DC,
|
||||
SourceLocation L,
|
||||
IdentifierInfo *Id, SourceLocation AtLocation,
|
||||
SourceLocation LParenLocation,
|
||||
QualType T,
|
||||
TypeSourceInfo *TSI,
|
||||
PropertyControl propControl = None);
|
||||
|
||||
static ObjCPropertyDecl *CreateDeserialized(ASTContext &C, unsigned ID);
|
||||
|
||||
SourceLocation getAtLoc() const { return AtLoc; }
|
||||
void setAtLoc(SourceLocation L) { AtLoc = L; }
|
||||
|
||||
SourceLocation getLParenLoc() const { return LParenLoc; }
|
||||
void setLParenLoc(SourceLocation L) { LParenLoc = L; }
|
||||
|
||||
TypeSourceInfo *getTypeSourceInfo() const { return DeclTypeSourceInfo; }
|
||||
|
||||
QualType getType() const { return DeclType; }
|
||||
|
||||
void setType(QualType T, TypeSourceInfo *TSI) {
|
||||
DeclType = T;
|
||||
DeclTypeSourceInfo = TSI;
|
||||
}
|
||||
|
||||
/// Retrieve the type when this property is used with a specific base object
|
||||
/// type.
|
||||
QualType getUsageType(QualType objectType) const;
|
||||
|
||||
PropertyAttributeKind getPropertyAttributes() const {
|
||||
return PropertyAttributeKind(PropertyAttributes);
|
||||
}
|
||||
void setPropertyAttributes(PropertyAttributeKind PRVal) {
|
||||
PropertyAttributes |= PRVal;
|
||||
}
|
||||
void overwritePropertyAttributes(unsigned PRVal) {
|
||||
PropertyAttributes = PRVal;
|
||||
}
|
||||
|
||||
PropertyAttributeKind getPropertyAttributesAsWritten() const {
|
||||
return PropertyAttributeKind(PropertyAttributesAsWritten);
|
||||
}
|
||||
|
||||
void setPropertyAttributesAsWritten(PropertyAttributeKind PRVal) {
|
||||
PropertyAttributesAsWritten = PRVal;
|
||||
}
|
||||
|
||||
// Helper methods for accessing attributes.
|
||||
|
||||
/// isReadOnly - Return true iff the property has a setter.
|
||||
bool isReadOnly() const {
|
||||
return (PropertyAttributes & OBJC_PR_readonly);
|
||||
}
|
||||
|
||||
/// isAtomic - Return true if the property is atomic.
|
||||
bool isAtomic() const {
|
||||
return (PropertyAttributes & OBJC_PR_atomic);
|
||||
}
|
||||
|
||||
/// isRetaining - Return true if the property retains its value.
|
||||
bool isRetaining() const {
|
||||
return (PropertyAttributes &
|
||||
(OBJC_PR_retain | OBJC_PR_strong | OBJC_PR_copy));
|
||||
}
|
||||
|
||||
bool isInstanceProperty() const { return !isClassProperty(); }
|
||||
bool isClassProperty() const { return PropertyAttributes & OBJC_PR_class; }
|
||||
ObjCPropertyQueryKind getQueryKind() const {
|
||||
return isClassProperty() ? ObjCPropertyQueryKind::OBJC_PR_query_class :
|
||||
ObjCPropertyQueryKind::OBJC_PR_query_instance;
|
||||
}
|
||||
static ObjCPropertyQueryKind getQueryKind(bool isClassProperty) {
|
||||
return isClassProperty ? ObjCPropertyQueryKind::OBJC_PR_query_class :
|
||||
ObjCPropertyQueryKind::OBJC_PR_query_instance;
|
||||
}
|
||||
|
||||
/// getSetterKind - Return the method used for doing assignment in
|
||||
/// the property setter. This is only valid if the property has been
|
||||
/// defined to have a setter.
|
||||
SetterKind getSetterKind() const {
|
||||
if (PropertyAttributes & OBJC_PR_strong)
|
||||
return getType()->isBlockPointerType() ? Copy : Retain;
|
||||
if (PropertyAttributes & OBJC_PR_retain)
|
||||
return Retain;
|
||||
if (PropertyAttributes & OBJC_PR_copy)
|
||||
return Copy;
|
||||
if (PropertyAttributes & OBJC_PR_weak)
|
||||
return Weak;
|
||||
return Assign;
|
||||
}
|
||||
|
||||
Selector getGetterName() const { return GetterName; }
|
||||
void setGetterName(Selector Sel) { GetterName = Sel; }
|
||||
|
||||
Selector getSetterName() const { return SetterName; }
|
||||
void setSetterName(Selector Sel) { SetterName = Sel; }
|
||||
|
||||
ObjCMethodDecl *getGetterMethodDecl() const { return GetterMethodDecl; }
|
||||
void setGetterMethodDecl(ObjCMethodDecl *gDecl) { GetterMethodDecl = gDecl; }
|
||||
|
||||
ObjCMethodDecl *getSetterMethodDecl() const { return SetterMethodDecl; }
|
||||
void setSetterMethodDecl(ObjCMethodDecl *gDecl) { SetterMethodDecl = gDecl; }
|
||||
|
||||
// Related to \@optional/\@required declared in \@protocol
|
||||
void setPropertyImplementation(PropertyControl pc) {
|
||||
PropertyImplementation = pc;
|
||||
}
|
||||
PropertyControl getPropertyImplementation() const {
|
||||
return PropertyControl(PropertyImplementation);
|
||||
}
|
||||
|
||||
void setPropertyIvarDecl(ObjCIvarDecl *Ivar) {
|
||||
PropertyIvarDecl = Ivar;
|
||||
}
|
||||
ObjCIvarDecl *getPropertyIvarDecl() const {
|
||||
return PropertyIvarDecl;
|
||||
}
|
||||
|
||||
SourceRange getSourceRange() const override LLVM_READONLY {
|
||||
return SourceRange(AtLoc, getLocation());
|
||||
}
|
||||
|
||||
/// Get the default name of the synthesized ivar.
|
||||
IdentifierInfo *getDefaultSynthIvarName(ASTContext &Ctx) const;
|
||||
|
||||
/// Lookup a property by name in the specified DeclContext.
|
||||
static ObjCPropertyDecl *findPropertyDecl(const DeclContext *DC,
|
||||
const IdentifierInfo *propertyID,
|
||||
ObjCPropertyQueryKind queryKind);
|
||||
|
||||
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
|
||||
static bool classofKind(Kind K) { return K == ObjCProperty; }
|
||||
};
|
||||
|
||||
/// ObjCContainerDecl - Represents a container for method declarations.
|
||||
/// Current sub-classes are ObjCInterfaceDecl, ObjCCategoryDecl,
|
||||
/// ObjCProtocolDecl, and ObjCImplDecl.
|
||||
|
|
@ -708,7 +913,7 @@ public:
|
|||
SourceLocation atStartLoc)
|
||||
: NamedDecl(DK, DC, nameLoc, Id), DeclContext(DK), AtStart(atStartLoc) {}
|
||||
|
||||
// Iterator access to properties.
|
||||
// Iterator access to instance/class properties.
|
||||
typedef specific_decl_iterator<ObjCPropertyDecl> prop_iterator;
|
||||
typedef llvm::iterator_range<specific_decl_iterator<ObjCPropertyDecl>>
|
||||
prop_range;
|
||||
|
|
@ -721,6 +926,36 @@ public:
|
|||
return prop_iterator(decls_end());
|
||||
}
|
||||
|
||||
typedef filtered_decl_iterator<ObjCPropertyDecl,
|
||||
&ObjCPropertyDecl::isInstanceProperty>
|
||||
instprop_iterator;
|
||||
typedef llvm::iterator_range<instprop_iterator> instprop_range;
|
||||
|
||||
instprop_range instance_properties() const {
|
||||
return instprop_range(instprop_begin(), instprop_end());
|
||||
}
|
||||
instprop_iterator instprop_begin() const {
|
||||
return instprop_iterator(decls_begin());
|
||||
}
|
||||
instprop_iterator instprop_end() const {
|
||||
return instprop_iterator(decls_end());
|
||||
}
|
||||
|
||||
typedef filtered_decl_iterator<ObjCPropertyDecl,
|
||||
&ObjCPropertyDecl::isClassProperty>
|
||||
classprop_iterator;
|
||||
typedef llvm::iterator_range<classprop_iterator> classprop_range;
|
||||
|
||||
classprop_range class_properties() const {
|
||||
return classprop_range(classprop_begin(), classprop_end());
|
||||
}
|
||||
classprop_iterator classprop_begin() const {
|
||||
return classprop_iterator(decls_begin());
|
||||
}
|
||||
classprop_iterator classprop_end() const {
|
||||
return classprop_iterator(decls_end());
|
||||
}
|
||||
|
||||
// Iterator access to instance/class methods.
|
||||
typedef specific_decl_iterator<ObjCMethodDecl> method_iterator;
|
||||
typedef llvm::iterator_range<specific_decl_iterator<ObjCMethodDecl>>
|
||||
|
|
@ -780,9 +1015,12 @@ public:
|
|||
ObjCIvarDecl *getIvarDecl(IdentifierInfo *Id) const;
|
||||
|
||||
ObjCPropertyDecl *
|
||||
FindPropertyDeclaration(const IdentifierInfo *PropertyId) const;
|
||||
FindPropertyDeclaration(const IdentifierInfo *PropertyId,
|
||||
ObjCPropertyQueryKind QueryKind) const;
|
||||
|
||||
typedef llvm::DenseMap<IdentifierInfo*, ObjCPropertyDecl*> PropertyMap;
|
||||
typedef llvm::DenseMap<std::pair<IdentifierInfo*,
|
||||
unsigned/*isClassProperty*/>,
|
||||
ObjCPropertyDecl*> PropertyMap;
|
||||
|
||||
typedef llvm::DenseMap<const ObjCProtocolDecl *, ObjCPropertyDecl*>
|
||||
ProtocolPropertyMap;
|
||||
|
|
@ -886,15 +1124,15 @@ class ObjCInterfaceDecl : public ObjCContainerDecl
|
|||
|
||||
/// \brief Indicates that the contents of this Objective-C class will be
|
||||
/// completed by the external AST source when required.
|
||||
mutable bool ExternallyCompleted : 1;
|
||||
mutable unsigned ExternallyCompleted : 1;
|
||||
|
||||
/// \brief Indicates that the ivar cache does not yet include ivars
|
||||
/// declared in the implementation.
|
||||
mutable bool IvarListMissingImplementation : 1;
|
||||
mutable unsigned IvarListMissingImplementation : 1;
|
||||
|
||||
/// Indicates that this interface decl contains at least one initializer
|
||||
/// marked with the 'objc_designated_initializer' attribute.
|
||||
bool HasDesignatedInitializers : 1;
|
||||
unsigned HasDesignatedInitializers : 1;
|
||||
|
||||
enum InheritedDesignatedInitializersState {
|
||||
/// We didn't calculate whether the designated initializers should be
|
||||
|
|
@ -1463,7 +1701,8 @@ public:
|
|||
}
|
||||
|
||||
ObjCPropertyDecl
|
||||
*FindPropertyVisibleInPrimaryClass(IdentifierInfo *PropertyId) const;
|
||||
*FindPropertyVisibleInPrimaryClass(IdentifierInfo *PropertyId,
|
||||
ObjCPropertyQueryKind QueryKind) const;
|
||||
|
||||
void collectPropertiesToImplement(PropertyMap &PM,
|
||||
PropertyDeclOrder &PO) const override;
|
||||
|
|
@ -1529,8 +1768,9 @@ public:
|
|||
/// including in all categories except for category passed
|
||||
/// as argument.
|
||||
ObjCMethodDecl *lookupPropertyAccessor(const Selector Sel,
|
||||
const ObjCCategoryDecl *Cat) const {
|
||||
return lookupMethod(Sel, true/*isInstance*/,
|
||||
const ObjCCategoryDecl *Cat,
|
||||
bool IsClassProperty) const {
|
||||
return lookupMethod(Sel, !IsClassProperty/*isInstance*/,
|
||||
false/*shallowCategoryLookup*/,
|
||||
true /* followsSuper */,
|
||||
Cat);
|
||||
|
|
@ -2099,7 +2339,8 @@ public:
|
|||
|
||||
void addPropertyImplementation(ObjCPropertyImplDecl *property);
|
||||
|
||||
ObjCPropertyImplDecl *FindPropertyImplDecl(IdentifierInfo *propertyId) const;
|
||||
ObjCPropertyImplDecl *FindPropertyImplDecl(IdentifierInfo *propertyId,
|
||||
ObjCPropertyQueryKind queryKind) const;
|
||||
ObjCPropertyImplDecl *FindPropertyImplIvarDecl(IdentifierInfo *ivarId) const;
|
||||
|
||||
// Iterator access to properties.
|
||||
|
|
@ -2407,197 +2648,6 @@ public:
|
|||
|
||||
};
|
||||
|
||||
/// \brief Represents one property declaration in an Objective-C interface.
|
||||
///
|
||||
/// For example:
|
||||
/// \code{.mm}
|
||||
/// \@property (assign, readwrite) int MyProperty;
|
||||
/// \endcode
|
||||
class ObjCPropertyDecl : public NamedDecl {
|
||||
void anchor() override;
|
||||
public:
|
||||
enum PropertyAttributeKind {
|
||||
OBJC_PR_noattr = 0x00,
|
||||
OBJC_PR_readonly = 0x01,
|
||||
OBJC_PR_getter = 0x02,
|
||||
OBJC_PR_assign = 0x04,
|
||||
OBJC_PR_readwrite = 0x08,
|
||||
OBJC_PR_retain = 0x10,
|
||||
OBJC_PR_copy = 0x20,
|
||||
OBJC_PR_nonatomic = 0x40,
|
||||
OBJC_PR_setter = 0x80,
|
||||
OBJC_PR_atomic = 0x100,
|
||||
OBJC_PR_weak = 0x200,
|
||||
OBJC_PR_strong = 0x400,
|
||||
OBJC_PR_unsafe_unretained = 0x800,
|
||||
/// Indicates that the nullability of the type was spelled with a
|
||||
/// property attribute rather than a type qualifier.
|
||||
OBJC_PR_nullability = 0x1000,
|
||||
OBJC_PR_null_resettable = 0x2000
|
||||
// Adding a property should change NumPropertyAttrsBits
|
||||
};
|
||||
|
||||
enum {
|
||||
/// \brief Number of bits fitting all the property attributes.
|
||||
NumPropertyAttrsBits = 14
|
||||
};
|
||||
|
||||
enum SetterKind { Assign, Retain, Copy, Weak };
|
||||
enum PropertyControl { None, Required, Optional };
|
||||
private:
|
||||
SourceLocation AtLoc; // location of \@property
|
||||
SourceLocation LParenLoc; // location of '(' starting attribute list or null.
|
||||
QualType DeclType;
|
||||
TypeSourceInfo *DeclTypeSourceInfo;
|
||||
unsigned PropertyAttributes : NumPropertyAttrsBits;
|
||||
unsigned PropertyAttributesAsWritten : NumPropertyAttrsBits;
|
||||
// \@required/\@optional
|
||||
unsigned PropertyImplementation : 2;
|
||||
|
||||
Selector GetterName; // getter name of NULL if no getter
|
||||
Selector SetterName; // setter name of NULL if no setter
|
||||
|
||||
ObjCMethodDecl *GetterMethodDecl; // Declaration of getter instance method
|
||||
ObjCMethodDecl *SetterMethodDecl; // Declaration of setter instance method
|
||||
ObjCIvarDecl *PropertyIvarDecl; // Synthesize ivar for this property
|
||||
|
||||
ObjCPropertyDecl(DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
|
||||
SourceLocation AtLocation, SourceLocation LParenLocation,
|
||||
QualType T, TypeSourceInfo *TSI,
|
||||
PropertyControl propControl)
|
||||
: NamedDecl(ObjCProperty, DC, L, Id), AtLoc(AtLocation),
|
||||
LParenLoc(LParenLocation), DeclType(T), DeclTypeSourceInfo(TSI),
|
||||
PropertyAttributes(OBJC_PR_noattr),
|
||||
PropertyAttributesAsWritten(OBJC_PR_noattr),
|
||||
PropertyImplementation(propControl),
|
||||
GetterName(Selector()),
|
||||
SetterName(Selector()),
|
||||
GetterMethodDecl(nullptr), SetterMethodDecl(nullptr),
|
||||
PropertyIvarDecl(nullptr) {}
|
||||
|
||||
public:
|
||||
static ObjCPropertyDecl *Create(ASTContext &C, DeclContext *DC,
|
||||
SourceLocation L,
|
||||
IdentifierInfo *Id, SourceLocation AtLocation,
|
||||
SourceLocation LParenLocation,
|
||||
QualType T,
|
||||
TypeSourceInfo *TSI,
|
||||
PropertyControl propControl = None);
|
||||
|
||||
static ObjCPropertyDecl *CreateDeserialized(ASTContext &C, unsigned ID);
|
||||
|
||||
SourceLocation getAtLoc() const { return AtLoc; }
|
||||
void setAtLoc(SourceLocation L) { AtLoc = L; }
|
||||
|
||||
SourceLocation getLParenLoc() const { return LParenLoc; }
|
||||
void setLParenLoc(SourceLocation L) { LParenLoc = L; }
|
||||
|
||||
TypeSourceInfo *getTypeSourceInfo() const { return DeclTypeSourceInfo; }
|
||||
|
||||
QualType getType() const { return DeclType; }
|
||||
|
||||
void setType(QualType T, TypeSourceInfo *TSI) {
|
||||
DeclType = T;
|
||||
DeclTypeSourceInfo = TSI;
|
||||
}
|
||||
|
||||
/// Retrieve the type when this property is used with a specific base object
|
||||
/// type.
|
||||
QualType getUsageType(QualType objectType) const;
|
||||
|
||||
PropertyAttributeKind getPropertyAttributes() const {
|
||||
return PropertyAttributeKind(PropertyAttributes);
|
||||
}
|
||||
void setPropertyAttributes(PropertyAttributeKind PRVal) {
|
||||
PropertyAttributes |= PRVal;
|
||||
}
|
||||
void overwritePropertyAttributes(unsigned PRVal) {
|
||||
PropertyAttributes = PRVal;
|
||||
}
|
||||
|
||||
PropertyAttributeKind getPropertyAttributesAsWritten() const {
|
||||
return PropertyAttributeKind(PropertyAttributesAsWritten);
|
||||
}
|
||||
|
||||
void setPropertyAttributesAsWritten(PropertyAttributeKind PRVal) {
|
||||
PropertyAttributesAsWritten = PRVal;
|
||||
}
|
||||
|
||||
// Helper methods for accessing attributes.
|
||||
|
||||
/// isReadOnly - Return true iff the property has a setter.
|
||||
bool isReadOnly() const {
|
||||
return (PropertyAttributes & OBJC_PR_readonly);
|
||||
}
|
||||
|
||||
/// isAtomic - Return true if the property is atomic.
|
||||
bool isAtomic() const {
|
||||
return (PropertyAttributes & OBJC_PR_atomic);
|
||||
}
|
||||
|
||||
/// isRetaining - Return true if the property retains its value.
|
||||
bool isRetaining() const {
|
||||
return (PropertyAttributes &
|
||||
(OBJC_PR_retain | OBJC_PR_strong | OBJC_PR_copy));
|
||||
}
|
||||
|
||||
/// getSetterKind - Return the method used for doing assignment in
|
||||
/// the property setter. This is only valid if the property has been
|
||||
/// defined to have a setter.
|
||||
SetterKind getSetterKind() const {
|
||||
if (PropertyAttributes & OBJC_PR_strong)
|
||||
return getType()->isBlockPointerType() ? Copy : Retain;
|
||||
if (PropertyAttributes & OBJC_PR_retain)
|
||||
return Retain;
|
||||
if (PropertyAttributes & OBJC_PR_copy)
|
||||
return Copy;
|
||||
if (PropertyAttributes & OBJC_PR_weak)
|
||||
return Weak;
|
||||
return Assign;
|
||||
}
|
||||
|
||||
Selector getGetterName() const { return GetterName; }
|
||||
void setGetterName(Selector Sel) { GetterName = Sel; }
|
||||
|
||||
Selector getSetterName() const { return SetterName; }
|
||||
void setSetterName(Selector Sel) { SetterName = Sel; }
|
||||
|
||||
ObjCMethodDecl *getGetterMethodDecl() const { return GetterMethodDecl; }
|
||||
void setGetterMethodDecl(ObjCMethodDecl *gDecl) { GetterMethodDecl = gDecl; }
|
||||
|
||||
ObjCMethodDecl *getSetterMethodDecl() const { return SetterMethodDecl; }
|
||||
void setSetterMethodDecl(ObjCMethodDecl *gDecl) { SetterMethodDecl = gDecl; }
|
||||
|
||||
// Related to \@optional/\@required declared in \@protocol
|
||||
void setPropertyImplementation(PropertyControl pc) {
|
||||
PropertyImplementation = pc;
|
||||
}
|
||||
PropertyControl getPropertyImplementation() const {
|
||||
return PropertyControl(PropertyImplementation);
|
||||
}
|
||||
|
||||
void setPropertyIvarDecl(ObjCIvarDecl *Ivar) {
|
||||
PropertyIvarDecl = Ivar;
|
||||
}
|
||||
ObjCIvarDecl *getPropertyIvarDecl() const {
|
||||
return PropertyIvarDecl;
|
||||
}
|
||||
|
||||
SourceRange getSourceRange() const override LLVM_READONLY {
|
||||
return SourceRange(AtLoc, getLocation());
|
||||
}
|
||||
|
||||
/// Get the default name of the synthesized ivar.
|
||||
IdentifierInfo *getDefaultSynthIvarName(ASTContext &Ctx) const;
|
||||
|
||||
/// Lookup a property by name in the specified DeclContext.
|
||||
static ObjCPropertyDecl *findPropertyDecl(const DeclContext *DC,
|
||||
const IdentifierInfo *propertyID);
|
||||
|
||||
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
|
||||
static bool classofKind(Kind K) { return K == ObjCProperty; }
|
||||
};
|
||||
|
||||
/// ObjCPropertyImplDecl - Represents implementation declaration of a property
|
||||
/// in a class or category implementation block. For example:
|
||||
/// \@synthesize prop1 = ivar1;
|
||||
|
|
|
|||
|
|
@ -15,11 +15,14 @@
|
|||
#ifndef LLVM_CLANG_AST_DECLOPENMP_H
|
||||
#define LLVM_CLANG_AST_DECLOPENMP_H
|
||||
|
||||
#include "clang/AST/DeclBase.h"
|
||||
#include "clang/AST/Decl.h"
|
||||
#include "clang/AST/Expr.h"
|
||||
#include "clang/AST/ExternalASTSource.h"
|
||||
#include "clang/AST/Type.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/Support/TrailingObjects.h"
|
||||
|
||||
namespace clang {
|
||||
class Expr;
|
||||
|
||||
/// \brief This represents '#pragma omp threadprivate ...' directive.
|
||||
/// For example, in the following, both 'a' and 'A::b' are threadprivate:
|
||||
|
|
@ -86,6 +89,107 @@ public:
|
|||
static bool classofKind(Kind K) { return K == OMPThreadPrivate; }
|
||||
};
|
||||
|
||||
} // end namespace clang
|
||||
/// \brief This represents '#pragma omp declare reduction ...' directive.
|
||||
/// For example, in the following, declared reduction 'foo' for types 'int' and
|
||||
/// 'float':
|
||||
///
|
||||
/// \code
|
||||
/// #pragma omp declare reduction (foo : int,float : omp_out += omp_in) \
|
||||
/// initializer (omp_priv = 0)
|
||||
/// \endcode
|
||||
///
|
||||
/// Here 'omp_out += omp_in' is a combiner and 'omp_priv = 0' is an initializer.
|
||||
class OMPDeclareReductionDecl final : public ValueDecl, public DeclContext {
|
||||
private:
|
||||
friend class ASTDeclReader;
|
||||
/// \brief Combiner for declare reduction construct.
|
||||
Expr *Combiner;
|
||||
/// \brief Initializer for declare reduction construct.
|
||||
Expr *Initializer;
|
||||
/// \brief Reference to the previous declare reduction construct in the same
|
||||
/// scope with the same name. Required for proper templates instantiation if
|
||||
/// the declare reduction construct is declared inside compound statement.
|
||||
LazyDeclPtr PrevDeclInScope;
|
||||
|
||||
virtual void anchor();
|
||||
|
||||
OMPDeclareReductionDecl(Kind DK, DeclContext *DC, SourceLocation L,
|
||||
DeclarationName Name, QualType Ty,
|
||||
OMPDeclareReductionDecl *PrevDeclInScope)
|
||||
: ValueDecl(DK, DC, L, Name, Ty), DeclContext(DK), Combiner(nullptr),
|
||||
Initializer(nullptr), PrevDeclInScope(PrevDeclInScope) {}
|
||||
|
||||
void setPrevDeclInScope(OMPDeclareReductionDecl *Prev) {
|
||||
PrevDeclInScope = Prev;
|
||||
}
|
||||
|
||||
public:
|
||||
/// \brief Create declare reduction node.
|
||||
static OMPDeclareReductionDecl *
|
||||
Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name,
|
||||
QualType T, OMPDeclareReductionDecl *PrevDeclInScope);
|
||||
/// \brief Create deserialized declare reduction node.
|
||||
static OMPDeclareReductionDecl *CreateDeserialized(ASTContext &C,
|
||||
unsigned ID);
|
||||
|
||||
/// \brief Get combiner expression of the declare reduction construct.
|
||||
Expr *getCombiner() { return Combiner; }
|
||||
const Expr *getCombiner() const { return Combiner; }
|
||||
/// \brief Set combiner expression for the declare reduction construct.
|
||||
void setCombiner(Expr *E) { Combiner = E; }
|
||||
|
||||
/// \brief Get initializer expression (if specified) of the declare reduction
|
||||
/// construct.
|
||||
Expr *getInitializer() { return Initializer; }
|
||||
const Expr *getInitializer() const { return Initializer; }
|
||||
/// \brief Set initializer expression for the declare reduction construct.
|
||||
void setInitializer(Expr *E) { Initializer = E; }
|
||||
|
||||
/// \brief Get reference to previous declare reduction construct in the same
|
||||
/// scope with the same name.
|
||||
OMPDeclareReductionDecl *getPrevDeclInScope();
|
||||
const OMPDeclareReductionDecl *getPrevDeclInScope() const;
|
||||
|
||||
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
|
||||
static bool classofKind(Kind K) { return K == OMPDeclareReduction; }
|
||||
static DeclContext *castToDeclContext(const OMPDeclareReductionDecl *D) {
|
||||
return static_cast<DeclContext *>(const_cast<OMPDeclareReductionDecl *>(D));
|
||||
}
|
||||
static OMPDeclareReductionDecl *castFromDeclContext(const DeclContext *DC) {
|
||||
return static_cast<OMPDeclareReductionDecl *>(
|
||||
const_cast<DeclContext *>(DC));
|
||||
}
|
||||
};
|
||||
|
||||
/// Pseudo declaration for capturing expressions. Also is used for capturing of
|
||||
/// non-static data members in non-static member functions.
|
||||
///
|
||||
/// Clang supports capturing of variables only, but OpenMP 4.5 allows to
|
||||
/// privatize non-static members of current class in non-static member
|
||||
/// functions. This pseudo-declaration allows properly handle this kind of
|
||||
/// capture by wrapping captured expression into a variable-like declaration.
|
||||
class OMPCapturedExprDecl final : public VarDecl {
|
||||
friend class ASTDeclReader;
|
||||
void anchor() override;
|
||||
|
||||
OMPCapturedExprDecl(ASTContext &C, DeclContext *DC, IdentifierInfo *Id,
|
||||
QualType Type)
|
||||
: VarDecl(OMPCapturedExpr, C, DC, SourceLocation(), SourceLocation(), Id,
|
||||
Type, nullptr, SC_None) {
|
||||
setImplicit();
|
||||
}
|
||||
|
||||
public:
|
||||
static OMPCapturedExprDecl *Create(ASTContext &C, DeclContext *DC,
|
||||
IdentifierInfo *Id, QualType T);
|
||||
|
||||
static OMPCapturedExprDecl *CreateDeserialized(ASTContext &C, unsigned ID);
|
||||
|
||||
// Implement isa/cast/dyncast/etc.
|
||||
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
|
||||
static bool classofKind(Kind K) { return K == OMPCapturedExpr; }
|
||||
};
|
||||
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
#include "llvm/Support/Compiler.h"
|
||||
#include "llvm/Support/TrailingObjects.h"
|
||||
#include <limits>
|
||||
#include <utility>
|
||||
|
||||
namespace clang {
|
||||
|
||||
|
|
@ -183,7 +184,7 @@ class TemplateArgumentList final
|
|||
|
||||
// Constructs an instance with an internal Argument list, containing
|
||||
// a copy of the Args array. (Called by CreateCopy)
|
||||
TemplateArgumentList(const TemplateArgument *Args, unsigned NumArgs);
|
||||
TemplateArgumentList(ArrayRef<TemplateArgument> Args);
|
||||
|
||||
public:
|
||||
/// \brief Type used to indicate that the template argument list itself is a
|
||||
|
|
@ -193,16 +194,14 @@ public:
|
|||
/// \brief Create a new template argument list that copies the given set of
|
||||
/// template arguments.
|
||||
static TemplateArgumentList *CreateCopy(ASTContext &Context,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs);
|
||||
ArrayRef<TemplateArgument> Args);
|
||||
|
||||
/// \brief Construct a new, temporary template argument list on the stack.
|
||||
///
|
||||
/// The template argument list does not own the template arguments
|
||||
/// provided.
|
||||
explicit TemplateArgumentList(OnStackType, const TemplateArgument *Args,
|
||||
unsigned NumArgs)
|
||||
: Arguments(Args), NumArguments(NumArgs) {}
|
||||
explicit TemplateArgumentList(OnStackType, ArrayRef<TemplateArgument> Args)
|
||||
: Arguments(Args.data()), NumArguments(Args.size()) {}
|
||||
|
||||
/// \brief Produces a shallow copy of the given template argument list.
|
||||
///
|
||||
|
|
@ -332,24 +331,23 @@ class TemplateDecl : public NamedDecl {
|
|||
void anchor() override;
|
||||
protected:
|
||||
// This is probably never used.
|
||||
TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L,
|
||||
DeclarationName Name)
|
||||
: NamedDecl(DK, DC, L, Name), TemplatedDecl(nullptr),
|
||||
TemplateParams(nullptr) {}
|
||||
TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName Name)
|
||||
: NamedDecl(DK, DC, L, Name), TemplatedDecl(nullptr, false),
|
||||
TemplateParams(nullptr) {}
|
||||
|
||||
// Construct a template decl with the given name and parameters.
|
||||
// Used when there is not templated element (tt-params).
|
||||
TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L,
|
||||
DeclarationName Name, TemplateParameterList *Params)
|
||||
: NamedDecl(DK, DC, L, Name), TemplatedDecl(nullptr),
|
||||
TemplateParams(Params) {}
|
||||
TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName Name,
|
||||
TemplateParameterList *Params)
|
||||
: NamedDecl(DK, DC, L, Name), TemplatedDecl(nullptr, false),
|
||||
TemplateParams(Params) {}
|
||||
|
||||
// Construct a template decl with name, parameters, and templated element.
|
||||
TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L,
|
||||
DeclarationName Name, TemplateParameterList *Params,
|
||||
NamedDecl *Decl)
|
||||
: NamedDecl(DK, DC, L, Name), TemplatedDecl(Decl),
|
||||
TemplateParams(Params) { }
|
||||
TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName Name,
|
||||
TemplateParameterList *Params, NamedDecl *Decl)
|
||||
: NamedDecl(DK, DC, L, Name), TemplatedDecl(Decl, false),
|
||||
TemplateParams(Params) {}
|
||||
|
||||
public:
|
||||
/// Get the list of template parameters
|
||||
TemplateParameterList *getTemplateParameters() const {
|
||||
|
|
@ -357,7 +355,7 @@ public:
|
|||
}
|
||||
|
||||
/// Get the underlying, templated declaration.
|
||||
NamedDecl *getTemplatedDecl() const { return TemplatedDecl; }
|
||||
NamedDecl *getTemplatedDecl() const { return TemplatedDecl.getPointer(); }
|
||||
|
||||
// Implement isa/cast/dyncast/etc.
|
||||
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
|
||||
|
|
@ -367,20 +365,30 @@ public:
|
|||
|
||||
SourceRange getSourceRange() const override LLVM_READONLY {
|
||||
return SourceRange(TemplateParams->getTemplateLoc(),
|
||||
TemplatedDecl->getSourceRange().getEnd());
|
||||
TemplatedDecl.getPointer()->getSourceRange().getEnd());
|
||||
}
|
||||
|
||||
/// Whether this is a (C++ Concepts TS) function or variable concept.
|
||||
bool isConcept() const { return TemplatedDecl.getInt(); }
|
||||
void setConcept() { TemplatedDecl.setInt(true); }
|
||||
|
||||
protected:
|
||||
NamedDecl *TemplatedDecl;
|
||||
/// \brief The named declaration from which this template was instantiated.
|
||||
/// (or null).
|
||||
///
|
||||
/// The boolean value will be true to indicate that this template
|
||||
/// (function or variable) is a concept.
|
||||
llvm::PointerIntPair<NamedDecl *, 1, bool> TemplatedDecl;
|
||||
|
||||
TemplateParameterList* TemplateParams;
|
||||
|
||||
public:
|
||||
/// \brief Initialize the underlying templated declaration and
|
||||
/// template parameters.
|
||||
void init(NamedDecl *templatedDecl, TemplateParameterList* templateParams) {
|
||||
assert(!TemplatedDecl && "TemplatedDecl already set!");
|
||||
assert(!TemplatedDecl.getPointer() && "TemplatedDecl already set!");
|
||||
assert(!TemplateParams && "TemplateParams already set!");
|
||||
TemplatedDecl = templatedDecl;
|
||||
TemplatedDecl.setPointer(templatedDecl);
|
||||
TemplateParams = templateParams;
|
||||
}
|
||||
};
|
||||
|
|
@ -481,8 +489,8 @@ public:
|
|||
Profile(llvm::FoldingSetNodeID &ID, ArrayRef<TemplateArgument> TemplateArgs,
|
||||
ASTContext &Context) {
|
||||
ID.AddInteger(TemplateArgs.size());
|
||||
for (unsigned Arg = 0; Arg != TemplateArgs.size(); ++Arg)
|
||||
TemplateArgs[Arg].Profile(ID, Context);
|
||||
for (const TemplateArgument &TemplateArg : TemplateArgs)
|
||||
TemplateArg.Profile(ID, Context);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -889,7 +897,7 @@ public:
|
|||
|
||||
/// Get the underlying function declaration of the template.
|
||||
FunctionDecl *getTemplatedDecl() const {
|
||||
return static_cast<FunctionDecl*>(TemplatedDecl);
|
||||
return static_cast<FunctionDecl *>(TemplatedDecl.getPointer());
|
||||
}
|
||||
|
||||
/// Returns whether this template declaration defines the primary
|
||||
|
|
@ -1171,9 +1179,8 @@ class NonTypeTemplateParmDecl final
|
|||
SourceLocation IdLoc, unsigned D, unsigned P,
|
||||
IdentifierInfo *Id, QualType T,
|
||||
TypeSourceInfo *TInfo,
|
||||
const QualType *ExpandedTypes,
|
||||
unsigned NumExpandedTypes,
|
||||
TypeSourceInfo **ExpandedTInfos);
|
||||
ArrayRef<QualType> ExpandedTypes,
|
||||
ArrayRef<TypeSourceInfo *> ExpandedTInfos);
|
||||
|
||||
friend class ASTDeclReader;
|
||||
friend TrailingObjects;
|
||||
|
|
@ -1187,9 +1194,8 @@ public:
|
|||
static NonTypeTemplateParmDecl *
|
||||
Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
|
||||
SourceLocation IdLoc, unsigned D, unsigned P, IdentifierInfo *Id,
|
||||
QualType T, TypeSourceInfo *TInfo,
|
||||
const QualType *ExpandedTypes, unsigned NumExpandedTypes,
|
||||
TypeSourceInfo **ExpandedTInfos);
|
||||
QualType T, TypeSourceInfo *TInfo, ArrayRef<QualType> ExpandedTypes,
|
||||
ArrayRef<TypeSourceInfo *> ExpandedTInfos);
|
||||
|
||||
static NonTypeTemplateParmDecl *CreateDeserialized(ASTContext &C,
|
||||
unsigned ID);
|
||||
|
|
@ -1352,8 +1358,7 @@ class TemplateTemplateParmDecl final
|
|||
TemplateTemplateParmDecl(DeclContext *DC, SourceLocation L,
|
||||
unsigned D, unsigned P,
|
||||
IdentifierInfo *Id, TemplateParameterList *Params,
|
||||
unsigned NumExpansions,
|
||||
TemplateParameterList * const *Expansions);
|
||||
ArrayRef<TemplateParameterList *> Expansions);
|
||||
|
||||
public:
|
||||
static TemplateTemplateParmDecl *Create(const ASTContext &C, DeclContext *DC,
|
||||
|
|
@ -1480,8 +1485,8 @@ public:
|
|||
};
|
||||
|
||||
/// \brief Represents the builtin template declaration which is used to
|
||||
/// implement __make_integer_seq. It serves no real purpose beyond existing as
|
||||
/// a place to hold template parameters.
|
||||
/// implement __make_integer_seq and other builtin templates. It serves
|
||||
/// no real purpose beyond existing as a place to hold template parameters.
|
||||
class BuiltinTemplateDecl : public TemplateDecl {
|
||||
void anchor() override;
|
||||
|
||||
|
|
@ -1573,8 +1578,7 @@ protected:
|
|||
DeclContext *DC, SourceLocation StartLoc,
|
||||
SourceLocation IdLoc,
|
||||
ClassTemplateDecl *SpecializedTemplate,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs,
|
||||
ArrayRef<TemplateArgument> Args,
|
||||
ClassTemplateSpecializationDecl *PrevDecl);
|
||||
|
||||
explicit ClassTemplateSpecializationDecl(ASTContext &C, Kind DK);
|
||||
|
|
@ -1584,8 +1588,7 @@ public:
|
|||
Create(ASTContext &Context, TagKind TK, DeclContext *DC,
|
||||
SourceLocation StartLoc, SourceLocation IdLoc,
|
||||
ClassTemplateDecl *SpecializedTemplate,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs,
|
||||
ArrayRef<TemplateArgument> Args,
|
||||
ClassTemplateSpecializationDecl *PrevDecl);
|
||||
static ClassTemplateSpecializationDecl *
|
||||
CreateDeserialized(ASTContext &C, unsigned ID);
|
||||
|
|
@ -1762,8 +1765,8 @@ public:
|
|||
Profile(llvm::FoldingSetNodeID &ID, ArrayRef<TemplateArgument> TemplateArgs,
|
||||
ASTContext &Context) {
|
||||
ID.AddInteger(TemplateArgs.size());
|
||||
for (unsigned Arg = 0; Arg != TemplateArgs.size(); ++Arg)
|
||||
TemplateArgs[Arg].Profile(ID, Context);
|
||||
for (const TemplateArgument &TemplateArg : TemplateArgs)
|
||||
TemplateArg.Profile(ID, Context);
|
||||
}
|
||||
|
||||
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
|
||||
|
|
@ -1801,8 +1804,7 @@ class ClassTemplatePartialSpecializationDecl
|
|||
SourceLocation IdLoc,
|
||||
TemplateParameterList *Params,
|
||||
ClassTemplateDecl *SpecializedTemplate,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs,
|
||||
ArrayRef<TemplateArgument> Args,
|
||||
const ASTTemplateArgumentListInfo *ArgsAsWritten,
|
||||
ClassTemplatePartialSpecializationDecl *PrevDecl);
|
||||
|
||||
|
|
@ -1817,8 +1819,7 @@ public:
|
|||
SourceLocation StartLoc, SourceLocation IdLoc,
|
||||
TemplateParameterList *Params,
|
||||
ClassTemplateDecl *SpecializedTemplate,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs,
|
||||
ArrayRef<TemplateArgument> Args,
|
||||
const TemplateArgumentListInfo &ArgInfos,
|
||||
QualType CanonInjectedType,
|
||||
ClassTemplatePartialSpecializationDecl *PrevDecl);
|
||||
|
|
@ -1867,6 +1868,10 @@ public:
|
|||
cast<ClassTemplatePartialSpecializationDecl>(getFirstDecl());
|
||||
return First->InstantiatedFromMember.getPointer();
|
||||
}
|
||||
ClassTemplatePartialSpecializationDecl *
|
||||
getInstantiatedFromMemberTemplate() const {
|
||||
return getInstantiatedFromMember();
|
||||
}
|
||||
|
||||
void setInstantiatedFromMember(
|
||||
ClassTemplatePartialSpecializationDecl *PartialSpec) {
|
||||
|
|
@ -1982,7 +1987,7 @@ public:
|
|||
|
||||
/// \brief Get the underlying class declarations of the template.
|
||||
CXXRecordDecl *getTemplatedDecl() const {
|
||||
return static_cast<CXXRecordDecl *>(TemplatedDecl);
|
||||
return static_cast<CXXRecordDecl *>(TemplatedDecl.getPointer());
|
||||
}
|
||||
|
||||
/// \brief Returns whether this template declaration defines the primary
|
||||
|
|
@ -2154,18 +2159,11 @@ private:
|
|||
// Location of the 'friend' specifier.
|
||||
SourceLocation FriendLoc;
|
||||
|
||||
|
||||
FriendTemplateDecl(DeclContext *DC, SourceLocation Loc,
|
||||
unsigned NParams,
|
||||
TemplateParameterList **Params,
|
||||
FriendUnion Friend,
|
||||
SourceLocation FriendLoc)
|
||||
: Decl(Decl::FriendTemplate, DC, Loc),
|
||||
NumParams(NParams),
|
||||
Params(Params),
|
||||
Friend(Friend),
|
||||
FriendLoc(FriendLoc)
|
||||
{}
|
||||
MutableArrayRef<TemplateParameterList *> Params,
|
||||
FriendUnion Friend, SourceLocation FriendLoc)
|
||||
: Decl(Decl::FriendTemplate, DC, Loc), NumParams(Params.size()),
|
||||
Params(Params.data()), Friend(Friend), FriendLoc(FriendLoc) {}
|
||||
|
||||
FriendTemplateDecl(EmptyShell Empty)
|
||||
: Decl(Decl::FriendTemplate, Empty),
|
||||
|
|
@ -2174,12 +2172,10 @@ private:
|
|||
{}
|
||||
|
||||
public:
|
||||
static FriendTemplateDecl *Create(ASTContext &Context,
|
||||
DeclContext *DC, SourceLocation Loc,
|
||||
unsigned NParams,
|
||||
TemplateParameterList **Params,
|
||||
FriendUnion Friend,
|
||||
SourceLocation FriendLoc);
|
||||
static FriendTemplateDecl *
|
||||
Create(ASTContext &Context, DeclContext *DC, SourceLocation Loc,
|
||||
MutableArrayRef<TemplateParameterList *> Params, FriendUnion Friend,
|
||||
SourceLocation FriendLoc);
|
||||
|
||||
static FriendTemplateDecl *CreateDeserialized(ASTContext &C, unsigned ID);
|
||||
|
||||
|
|
@ -2245,7 +2241,7 @@ protected:
|
|||
public:
|
||||
/// Get the underlying function declaration of the template.
|
||||
TypeAliasDecl *getTemplatedDecl() const {
|
||||
return static_cast<TypeAliasDecl*>(TemplatedDecl);
|
||||
return static_cast<TypeAliasDecl *>(TemplatedDecl.getPointer());
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -2319,9 +2315,9 @@ class ClassScopeFunctionSpecializationDecl : public Decl {
|
|||
ClassScopeFunctionSpecializationDecl(DeclContext *DC, SourceLocation Loc,
|
||||
CXXMethodDecl *FD, bool Args,
|
||||
TemplateArgumentListInfo TemplArgs)
|
||||
: Decl(Decl::ClassScopeFunctionSpecialization, DC, Loc),
|
||||
Specialization(FD), HasExplicitTemplateArgs(Args),
|
||||
TemplateArgs(TemplArgs) {}
|
||||
: Decl(Decl::ClassScopeFunctionSpecialization, DC, Loc),
|
||||
Specialization(FD), HasExplicitTemplateArgs(Args),
|
||||
TemplateArgs(std::move(TemplArgs)) {}
|
||||
|
||||
ClassScopeFunctionSpecializationDecl(EmptyShell Empty)
|
||||
: Decl(Decl::ClassScopeFunctionSpecialization, Empty) {}
|
||||
|
|
@ -2342,7 +2338,7 @@ public:
|
|||
bool HasExplicitTemplateArgs,
|
||||
TemplateArgumentListInfo TemplateArgs) {
|
||||
return new (C, DC) ClassScopeFunctionSpecializationDecl(
|
||||
DC, Loc, FD, HasExplicitTemplateArgs, TemplateArgs);
|
||||
DC, Loc, FD, HasExplicitTemplateArgs, std::move(TemplateArgs));
|
||||
}
|
||||
|
||||
static ClassScopeFunctionSpecializationDecl *
|
||||
|
|
@ -2428,8 +2424,8 @@ protected:
|
|||
SourceLocation StartLoc, SourceLocation IdLoc,
|
||||
VarTemplateDecl *SpecializedTemplate,
|
||||
QualType T, TypeSourceInfo *TInfo,
|
||||
StorageClass S, const TemplateArgument *Args,
|
||||
unsigned NumArgs);
|
||||
StorageClass S,
|
||||
ArrayRef<TemplateArgument> Args);
|
||||
|
||||
explicit VarTemplateSpecializationDecl(Kind DK, ASTContext &Context);
|
||||
|
||||
|
|
@ -2437,8 +2433,8 @@ public:
|
|||
static VarTemplateSpecializationDecl *
|
||||
Create(ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
|
||||
SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T,
|
||||
TypeSourceInfo *TInfo, StorageClass S, const TemplateArgument *Args,
|
||||
unsigned NumArgs);
|
||||
TypeSourceInfo *TInfo, StorageClass S,
|
||||
ArrayRef<TemplateArgument> Args);
|
||||
static VarTemplateSpecializationDecl *CreateDeserialized(ASTContext &C,
|
||||
unsigned ID);
|
||||
|
||||
|
|
@ -2502,17 +2498,11 @@ public:
|
|||
/// it was instantiated.
|
||||
llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *>
|
||||
getInstantiatedFrom() const {
|
||||
if (getSpecializationKind() != TSK_ImplicitInstantiation &&
|
||||
getSpecializationKind() != TSK_ExplicitInstantiationDefinition &&
|
||||
getSpecializationKind() != TSK_ExplicitInstantiationDeclaration)
|
||||
if (!isTemplateInstantiation(getSpecializationKind()))
|
||||
return llvm::PointerUnion<VarTemplateDecl *,
|
||||
VarTemplatePartialSpecializationDecl *>();
|
||||
|
||||
if (SpecializedPartialSpecialization *PartialSpec =
|
||||
SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
|
||||
return PartialSpec->PartialSpecialization;
|
||||
|
||||
return SpecializedTemplate.get<VarTemplateDecl *>();
|
||||
return getSpecializedTemplateOrPartial();
|
||||
}
|
||||
|
||||
/// \brief Retrieve the variable template or variable template partial
|
||||
|
|
@ -2610,8 +2600,8 @@ public:
|
|||
ArrayRef<TemplateArgument> TemplateArgs,
|
||||
ASTContext &Context) {
|
||||
ID.AddInteger(TemplateArgs.size());
|
||||
for (unsigned Arg = 0; Arg != TemplateArgs.size(); ++Arg)
|
||||
TemplateArgs[Arg].Profile(ID, Context);
|
||||
for (const TemplateArgument &TemplateArg : TemplateArgs)
|
||||
TemplateArg.Profile(ID, Context);
|
||||
}
|
||||
|
||||
static bool classof(const Decl *D) { return classofKind(D->getKind()); }
|
||||
|
|
@ -2647,7 +2637,7 @@ class VarTemplatePartialSpecializationDecl
|
|||
ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
|
||||
SourceLocation IdLoc, TemplateParameterList *Params,
|
||||
VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo,
|
||||
StorageClass S, const TemplateArgument *Args, unsigned NumArgs,
|
||||
StorageClass S, ArrayRef<TemplateArgument> Args,
|
||||
const ASTTemplateArgumentListInfo *ArgInfos);
|
||||
|
||||
VarTemplatePartialSpecializationDecl(ASTContext &Context)
|
||||
|
|
@ -2660,8 +2650,8 @@ public:
|
|||
Create(ASTContext &Context, DeclContext *DC, SourceLocation StartLoc,
|
||||
SourceLocation IdLoc, TemplateParameterList *Params,
|
||||
VarTemplateDecl *SpecializedTemplate, QualType T,
|
||||
TypeSourceInfo *TInfo, StorageClass S, const TemplateArgument *Args,
|
||||
unsigned NumArgs, const TemplateArgumentListInfo &ArgInfos);
|
||||
TypeSourceInfo *TInfo, StorageClass S, ArrayRef<TemplateArgument> Args,
|
||||
const TemplateArgumentListInfo &ArgInfos);
|
||||
|
||||
static VarTemplatePartialSpecializationDecl *CreateDeserialized(ASTContext &C,
|
||||
unsigned ID);
|
||||
|
|
@ -2808,7 +2798,7 @@ public:
|
|||
|
||||
/// \brief Get the underlying variable declarations of the template.
|
||||
VarDecl *getTemplatedDecl() const {
|
||||
return static_cast<VarDecl *>(TemplatedDecl);
|
||||
return static_cast<VarDecl *>(TemplatedDecl.getPointer());
|
||||
}
|
||||
|
||||
/// \brief Returns whether this template declaration defines the primary
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ namespace clang {
|
|||
class IdentifierInfo;
|
||||
class MultiKeywordSelector;
|
||||
enum OverloadedOperatorKind : int;
|
||||
struct PrintingPolicy;
|
||||
class QualType;
|
||||
class Type;
|
||||
class TypeSourceInfo;
|
||||
|
|
@ -302,7 +303,9 @@ public:
|
|||
}
|
||||
|
||||
static int compare(DeclarationName LHS, DeclarationName RHS);
|
||||
|
||||
|
||||
void print(raw_ostream &OS, const PrintingPolicy &Policy);
|
||||
|
||||
void dump() const;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#include "llvm/ADT/APSInt.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/Support/AtomicOrdering.h"
|
||||
#include "llvm/Support/Compiler.h"
|
||||
|
||||
namespace clang {
|
||||
|
|
@ -593,6 +594,13 @@ public:
|
|||
bool EvaluateAsInt(llvm::APSInt &Result, const ASTContext &Ctx,
|
||||
SideEffectsKind AllowSideEffects = SE_NoSideEffects) const;
|
||||
|
||||
/// EvaluateAsFloat - Return true if this is a constant which we can fold and
|
||||
/// convert to a floating point value, using any crazy technique that we
|
||||
/// want to.
|
||||
bool
|
||||
EvaluateAsFloat(llvm::APFloat &Result, const ASTContext &Ctx,
|
||||
SideEffectsKind AllowSideEffects = SE_NoSideEffects) const;
|
||||
|
||||
/// isEvaluatable - Call EvaluateAsRValue to see if this expression can be
|
||||
/// constant folded without side-effects, but discard the result.
|
||||
bool isEvaluatable(const ASTContext &Ctx,
|
||||
|
|
@ -847,10 +855,12 @@ public:
|
|||
ExprObjectKind OK = OK_Ordinary,
|
||||
Expr *SourceExpr = nullptr)
|
||||
: Expr(OpaqueValueExprClass, T, VK, OK,
|
||||
T->isDependentType(),
|
||||
T->isDependentType() ||
|
||||
(SourceExpr && SourceExpr->isTypeDependent()),
|
||||
T->isDependentType() ||
|
||||
(SourceExpr && SourceExpr->isValueDependent()),
|
||||
T->isInstantiationDependentType(),
|
||||
T->isInstantiationDependentType() ||
|
||||
(SourceExpr && SourceExpr->isInstantiationDependent()),
|
||||
false),
|
||||
SourceExpr(SourceExpr), Loc(Loc) {
|
||||
}
|
||||
|
|
@ -1110,6 +1120,10 @@ public:
|
|||
return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
|
||||
}
|
||||
|
||||
ArrayRef<TemplateArgumentLoc> template_arguments() const {
|
||||
return {getTemplateArgs(), getNumTemplateArgs()};
|
||||
}
|
||||
|
||||
/// \brief Returns true if this expression refers to a function that
|
||||
/// was resolved from an overloaded set having size greater than 1.
|
||||
bool hadMultipleCandidates() const {
|
||||
|
|
@ -2137,11 +2151,15 @@ class CallExpr : public Expr {
|
|||
unsigned NumArgs;
|
||||
SourceLocation RParenLoc;
|
||||
|
||||
void updateDependenciesFromArg(Expr *Arg);
|
||||
|
||||
protected:
|
||||
// These versions of the constructor are for derived classes.
|
||||
CallExpr(const ASTContext& C, StmtClass SC, Expr *fn, unsigned NumPreArgs,
|
||||
ArrayRef<Expr*> args, QualType t, ExprValueKind VK,
|
||||
SourceLocation rparenloc);
|
||||
CallExpr(const ASTContext &C, StmtClass SC, Expr *fn,
|
||||
ArrayRef<Expr *> preargs, ArrayRef<Expr *> args, QualType t,
|
||||
ExprValueKind VK, SourceLocation rparenloc);
|
||||
CallExpr(const ASTContext &C, StmtClass SC, Expr *fn, ArrayRef<Expr *> args,
|
||||
QualType t, ExprValueKind VK, SourceLocation rparenloc);
|
||||
CallExpr(const ASTContext &C, StmtClass SC, unsigned NumPreArgs,
|
||||
EmptyShell Empty);
|
||||
|
||||
|
|
@ -2477,6 +2495,10 @@ public:
|
|||
return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
|
||||
}
|
||||
|
||||
ArrayRef<TemplateArgumentLoc> template_arguments() const {
|
||||
return {getTemplateArgs(), getNumTemplateArgs()};
|
||||
}
|
||||
|
||||
/// \brief Retrieve the member declaration name info.
|
||||
DeclarationNameInfo getMemberNameInfo() const {
|
||||
return DeclarationNameInfo(MemberDecl->getDeclName(),
|
||||
|
|
@ -3942,7 +3964,7 @@ private:
|
|||
|
||||
/// Whether this designated initializer used the GNU deprecated
|
||||
/// syntax rather than the C99 '=' syntax.
|
||||
bool GNUSyntax : 1;
|
||||
unsigned GNUSyntax : 1;
|
||||
|
||||
/// The number of designators in this initializer expression.
|
||||
unsigned NumDesignators : 15;
|
||||
|
|
@ -3956,11 +3978,10 @@ private:
|
|||
/// expression.
|
||||
Designator *Designators;
|
||||
|
||||
|
||||
DesignatedInitExpr(const ASTContext &C, QualType Ty, unsigned NumDesignators,
|
||||
const Designator *Designators,
|
||||
DesignatedInitExpr(const ASTContext &C, QualType Ty,
|
||||
llvm::ArrayRef<Designator> Designators,
|
||||
SourceLocation EqualOrColonLoc, bool GNUSyntax,
|
||||
ArrayRef<Expr*> IndexExprs, Expr *Init);
|
||||
ArrayRef<Expr *> IndexExprs, Expr *Init);
|
||||
|
||||
explicit DesignatedInitExpr(unsigned NumSubExprs)
|
||||
: Expr(DesignatedInitExprClass, EmptyShell()),
|
||||
|
|
@ -4120,8 +4141,7 @@ public:
|
|||
};
|
||||
|
||||
static DesignatedInitExpr *Create(const ASTContext &C,
|
||||
Designator *Designators,
|
||||
unsigned NumDesignators,
|
||||
llvm::ArrayRef<Designator> Designators,
|
||||
ArrayRef<Expr*> IndexExprs,
|
||||
SourceLocation EqualOrColonLoc,
|
||||
bool GNUSyntax, Expr *Init);
|
||||
|
|
@ -4133,48 +4153,15 @@ public:
|
|||
unsigned size() const { return NumDesignators; }
|
||||
|
||||
// Iterator access to the designators.
|
||||
typedef Designator *designators_iterator;
|
||||
designators_iterator designators_begin() { return Designators; }
|
||||
designators_iterator designators_end() {
|
||||
return Designators + NumDesignators;
|
||||
llvm::MutableArrayRef<Designator> designators() {
|
||||
return {Designators, NumDesignators};
|
||||
}
|
||||
|
||||
typedef const Designator *const_designators_iterator;
|
||||
const_designators_iterator designators_begin() const { return Designators; }
|
||||
const_designators_iterator designators_end() const {
|
||||
return Designators + NumDesignators;
|
||||
llvm::ArrayRef<Designator> designators() const {
|
||||
return {Designators, NumDesignators};
|
||||
}
|
||||
|
||||
typedef llvm::iterator_range<designators_iterator> designators_range;
|
||||
designators_range designators() {
|
||||
return designators_range(designators_begin(), designators_end());
|
||||
}
|
||||
|
||||
typedef llvm::iterator_range<const_designators_iterator>
|
||||
designators_const_range;
|
||||
designators_const_range designators() const {
|
||||
return designators_const_range(designators_begin(), designators_end());
|
||||
}
|
||||
|
||||
typedef std::reverse_iterator<designators_iterator>
|
||||
reverse_designators_iterator;
|
||||
reverse_designators_iterator designators_rbegin() {
|
||||
return reverse_designators_iterator(designators_end());
|
||||
}
|
||||
reverse_designators_iterator designators_rend() {
|
||||
return reverse_designators_iterator(designators_begin());
|
||||
}
|
||||
|
||||
typedef std::reverse_iterator<const_designators_iterator>
|
||||
const_reverse_designators_iterator;
|
||||
const_reverse_designators_iterator designators_rbegin() const {
|
||||
return const_reverse_designators_iterator(designators_end());
|
||||
}
|
||||
const_reverse_designators_iterator designators_rend() const {
|
||||
return const_reverse_designators_iterator(designators_begin());
|
||||
}
|
||||
|
||||
Designator *getDesignator(unsigned Idx) { return &designators_begin()[Idx]; }
|
||||
Designator *getDesignator(unsigned Idx) { return &designators()[Idx]; }
|
||||
|
||||
void setDesignators(const ASTContext &C, const Designator *Desigs,
|
||||
unsigned NumDesigs);
|
||||
|
|
@ -4824,16 +4811,6 @@ public:
|
|||
BI_First = 0
|
||||
};
|
||||
|
||||
// The ABI values for various atomic memory orderings.
|
||||
enum AtomicOrderingKind {
|
||||
AO_ABI_memory_order_relaxed = 0,
|
||||
AO_ABI_memory_order_consume = 1,
|
||||
AO_ABI_memory_order_acquire = 2,
|
||||
AO_ABI_memory_order_release = 3,
|
||||
AO_ABI_memory_order_acq_rel = 4,
|
||||
AO_ABI_memory_order_seq_cst = 5
|
||||
};
|
||||
|
||||
private:
|
||||
enum { PTR, ORDER, VAL1, ORDER_FAIL, VAL2, WEAK, END_EXPR };
|
||||
Stmt* SubExprs[END_EXPR];
|
||||
|
|
@ -4882,9 +4859,12 @@ public:
|
|||
}
|
||||
|
||||
AtomicOp getOp() const { return Op; }
|
||||
unsigned getNumSubExprs() { return NumSubExprs; }
|
||||
unsigned getNumSubExprs() const { return NumSubExprs; }
|
||||
|
||||
Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); }
|
||||
const Expr * const *getSubExprs() const {
|
||||
return reinterpret_cast<Expr * const *>(SubExprs);
|
||||
}
|
||||
|
||||
bool isVolatile() const {
|
||||
return getPtr()->getType()->getPointeeType().isVolatileQualified();
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
#define LLVM_CLANG_AST_EXPRCXX_H
|
||||
|
||||
#include "clang/AST/Decl.h"
|
||||
#include "clang/AST/DeclCXX.h"
|
||||
#include "clang/AST/Expr.h"
|
||||
#include "clang/AST/LambdaCapture.h"
|
||||
#include "clang/AST/TemplateBase.h"
|
||||
|
|
@ -26,9 +27,6 @@
|
|||
|
||||
namespace clang {
|
||||
|
||||
class CXXConstructorDecl;
|
||||
class CXXDestructorDecl;
|
||||
class CXXMethodDecl;
|
||||
class CXXTemporary;
|
||||
class MSPropertyDecl;
|
||||
class TemplateArgumentListInfo;
|
||||
|
|
@ -66,8 +64,7 @@ public:
|
|||
CXXOperatorCallExpr(ASTContext& C, OverloadedOperatorKind Op, Expr *fn,
|
||||
ArrayRef<Expr*> args, QualType t, ExprValueKind VK,
|
||||
SourceLocation operatorloc, bool fpContractable)
|
||||
: CallExpr(C, CXXOperatorCallExprClass, fn, 0, args, t, VK,
|
||||
operatorloc),
|
||||
: CallExpr(C, CXXOperatorCallExprClass, fn, args, t, VK, operatorloc),
|
||||
Operator(Op), FPContractable(fpContractable) {
|
||||
Range = getSourceRangeImpl();
|
||||
}
|
||||
|
|
@ -125,7 +122,7 @@ class CXXMemberCallExpr : public CallExpr {
|
|||
public:
|
||||
CXXMemberCallExpr(ASTContext &C, Expr *fn, ArrayRef<Expr*> args,
|
||||
QualType t, ExprValueKind VK, SourceLocation RP)
|
||||
: CallExpr(C, CXXMemberCallExprClass, fn, 0, args, t, VK, RP) {}
|
||||
: CallExpr(C, CXXMemberCallExprClass, fn, args, t, VK, RP) {}
|
||||
|
||||
CXXMemberCallExpr(ASTContext &C, EmptyShell Empty)
|
||||
: CallExpr(C, CXXMemberCallExprClass, Empty) { }
|
||||
|
|
@ -146,6 +143,14 @@ public:
|
|||
/// FIXME: Returns 0 for member pointer call exprs.
|
||||
CXXRecordDecl *getRecordDecl() const;
|
||||
|
||||
SourceLocation getExprLoc() const LLVM_READONLY {
|
||||
SourceLocation CLoc = getCallee()->getExprLoc();
|
||||
if (CLoc.isValid())
|
||||
return CLoc;
|
||||
|
||||
return getLocStart();
|
||||
}
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == CXXMemberCallExprClass;
|
||||
}
|
||||
|
|
@ -160,9 +165,7 @@ public:
|
|||
CUDAKernelCallExpr(ASTContext &C, Expr *fn, CallExpr *Config,
|
||||
ArrayRef<Expr*> args, QualType t, ExprValueKind VK,
|
||||
SourceLocation RP)
|
||||
: CallExpr(C, CUDAKernelCallExprClass, fn, END_PREARG, args, t, VK, RP) {
|
||||
setConfig(Config);
|
||||
}
|
||||
: CallExpr(C, CUDAKernelCallExprClass, fn, Config, args, t, VK, RP) {}
|
||||
|
||||
CUDAKernelCallExpr(ASTContext &C, EmptyShell Empty)
|
||||
: CallExpr(C, CUDAKernelCallExprClass, END_PREARG, Empty) { }
|
||||
|
|
@ -171,7 +174,20 @@ public:
|
|||
return cast_or_null<CallExpr>(getPreArg(CONFIG));
|
||||
}
|
||||
CallExpr *getConfig() { return cast_or_null<CallExpr>(getPreArg(CONFIG)); }
|
||||
void setConfig(CallExpr *E) { setPreArg(CONFIG, E); }
|
||||
|
||||
/// \brief Sets the kernel configuration expression.
|
||||
///
|
||||
/// Note that this method cannot be called if config has already been set to a
|
||||
/// non-null value.
|
||||
void setConfig(CallExpr *E) {
|
||||
assert(!getConfig() &&
|
||||
"Cannot call setConfig if config is not null");
|
||||
setPreArg(CONFIG, E);
|
||||
setInstantiationDependent(isInstantiationDependent() ||
|
||||
E->isInstantiationDependent());
|
||||
setContainsUnexpandedParameterPack(containsUnexpandedParameterPack() ||
|
||||
E->containsUnexpandedParameterPack());
|
||||
}
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == CUDAKernelCallExprClass;
|
||||
|
|
@ -398,7 +414,7 @@ public:
|
|||
UserDefinedLiteral(const ASTContext &C, Expr *Fn, ArrayRef<Expr*> Args,
|
||||
QualType T, ExprValueKind VK, SourceLocation LitEndLoc,
|
||||
SourceLocation SuffixLoc)
|
||||
: CallExpr(C, UserDefinedLiteralClass, Fn, 0, Args, T, VK, LitEndLoc),
|
||||
: CallExpr(C, UserDefinedLiteralClass, Fn, Args, T, VK, LitEndLoc),
|
||||
UDSuffixLoc(SuffixLoc) {}
|
||||
explicit UserDefinedLiteral(const ASTContext &C, EmptyShell Empty)
|
||||
: CallExpr(C, UserDefinedLiteralClass, Empty) {}
|
||||
|
|
@ -768,22 +784,23 @@ public:
|
|||
class CXXUuidofExpr : public Expr {
|
||||
private:
|
||||
llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand;
|
||||
StringRef UuidStr;
|
||||
SourceRange Range;
|
||||
|
||||
public:
|
||||
CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R)
|
||||
: Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary,
|
||||
false, Operand->getType()->isDependentType(),
|
||||
Operand->getType()->isInstantiationDependentType(),
|
||||
Operand->getType()->containsUnexpandedParameterPack()),
|
||||
Operand(Operand), Range(R) { }
|
||||
CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, StringRef UuidStr,
|
||||
SourceRange R)
|
||||
: Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary, false,
|
||||
Operand->getType()->isDependentType(),
|
||||
Operand->getType()->isInstantiationDependentType(),
|
||||
Operand->getType()->containsUnexpandedParameterPack()),
|
||||
Operand(Operand), UuidStr(UuidStr), Range(R) {}
|
||||
|
||||
CXXUuidofExpr(QualType Ty, Expr *Operand, SourceRange R)
|
||||
: Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary,
|
||||
false, Operand->isTypeDependent(),
|
||||
Operand->isInstantiationDependent(),
|
||||
Operand->containsUnexpandedParameterPack()),
|
||||
Operand(Operand), Range(R) { }
|
||||
CXXUuidofExpr(QualType Ty, Expr *Operand, StringRef UuidStr, SourceRange R)
|
||||
: Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary, false,
|
||||
Operand->isTypeDependent(), Operand->isInstantiationDependent(),
|
||||
Operand->containsUnexpandedParameterPack()),
|
||||
Operand(Operand), UuidStr(UuidStr), Range(R) {}
|
||||
|
||||
CXXUuidofExpr(EmptyShell Empty, bool isExpr)
|
||||
: Expr(CXXUuidofExprClass, Empty) {
|
||||
|
|
@ -820,7 +837,8 @@ public:
|
|||
Operand = E;
|
||||
}
|
||||
|
||||
StringRef getUuidAsStringRef(ASTContext &Context) const;
|
||||
void setUuidStr(StringRef US) { UuidStr = US; }
|
||||
StringRef getUuidStr() const { return UuidStr; }
|
||||
|
||||
SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
|
||||
SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
|
||||
|
|
@ -831,11 +849,6 @@ public:
|
|||
return T->getStmtClass() == CXXUuidofExprClass;
|
||||
}
|
||||
|
||||
/// Grabs __declspec(uuid()) off a type, or returns 0 if we cannot resolve to
|
||||
/// a single GUID.
|
||||
static const UuidAttr *GetUuidAttrOfType(QualType QT,
|
||||
bool *HasMultipleGUIDsPtr = nullptr);
|
||||
|
||||
// Iterators
|
||||
child_range children() {
|
||||
if (isTypeOperand())
|
||||
|
|
@ -1161,18 +1174,21 @@ private:
|
|||
SourceLocation Loc;
|
||||
SourceRange ParenOrBraceRange;
|
||||
unsigned NumArgs : 16;
|
||||
bool Elidable : 1;
|
||||
bool HadMultipleCandidates : 1;
|
||||
bool ListInitialization : 1;
|
||||
bool StdInitListInitialization : 1;
|
||||
bool ZeroInitialization : 1;
|
||||
unsigned Elidable : 1;
|
||||
unsigned HadMultipleCandidates : 1;
|
||||
unsigned ListInitialization : 1;
|
||||
unsigned StdInitListInitialization : 1;
|
||||
unsigned ZeroInitialization : 1;
|
||||
unsigned ConstructKind : 2;
|
||||
Stmt **Args;
|
||||
|
||||
void setConstructor(CXXConstructorDecl *C) { Constructor = C; }
|
||||
|
||||
protected:
|
||||
CXXConstructExpr(const ASTContext &C, StmtClass SC, QualType T,
|
||||
SourceLocation Loc,
|
||||
CXXConstructorDecl *d, bool elidable,
|
||||
CXXConstructorDecl *Ctor,
|
||||
bool Elidable,
|
||||
ArrayRef<Expr *> Args,
|
||||
bool HadMultipleCandidates,
|
||||
bool ListInitialization,
|
||||
|
|
@ -1191,15 +1207,12 @@ protected:
|
|||
public:
|
||||
/// \brief Construct an empty C++ construction expression.
|
||||
explicit CXXConstructExpr(EmptyShell Empty)
|
||||
: Expr(CXXConstructExprClass, Empty), Constructor(nullptr),
|
||||
NumArgs(0), Elidable(false), HadMultipleCandidates(false),
|
||||
ListInitialization(false), ZeroInitialization(false),
|
||||
ConstructKind(0), Args(nullptr)
|
||||
{ }
|
||||
: CXXConstructExpr(CXXConstructExprClass, Empty) {}
|
||||
|
||||
static CXXConstructExpr *Create(const ASTContext &C, QualType T,
|
||||
SourceLocation Loc,
|
||||
CXXConstructorDecl *D, bool Elidable,
|
||||
CXXConstructorDecl *Ctor,
|
||||
bool Elidable,
|
||||
ArrayRef<Expr *> Args,
|
||||
bool HadMultipleCandidates,
|
||||
bool ListInitialization,
|
||||
|
|
@ -1208,8 +1221,8 @@ public:
|
|||
ConstructionKind ConstructKind,
|
||||
SourceRange ParenOrBraceRange);
|
||||
|
||||
/// \brief Get the constructor that this expression will (ultimately) call.
|
||||
CXXConstructorDecl *getConstructor() const { return Constructor; }
|
||||
void setConstructor(CXXConstructorDecl *C) { Constructor = C; }
|
||||
|
||||
SourceLocation getLocation() const { return Loc; }
|
||||
void setLocation(SourceLocation Loc) { this->Loc = Loc; }
|
||||
|
|
@ -1305,6 +1318,73 @@ public:
|
|||
friend class ASTStmtReader;
|
||||
};
|
||||
|
||||
/// \brief Represents a call to an inherited base class constructor from an
|
||||
/// inheriting constructor. This call implicitly forwards the arguments from
|
||||
/// the enclosing context (an inheriting constructor) to the specified inherited
|
||||
/// base class constructor.
|
||||
class CXXInheritedCtorInitExpr : public Expr {
|
||||
private:
|
||||
CXXConstructorDecl *Constructor;
|
||||
|
||||
/// The location of the using declaration.
|
||||
SourceLocation Loc;
|
||||
|
||||
/// Whether this is the construction of a virtual base.
|
||||
unsigned ConstructsVirtualBase : 1;
|
||||
|
||||
/// Whether the constructor is inherited from a virtual base class of the
|
||||
/// class that we construct.
|
||||
unsigned InheritedFromVirtualBase : 1;
|
||||
|
||||
public:
|
||||
/// \brief Construct a C++ inheriting construction expression.
|
||||
CXXInheritedCtorInitExpr(SourceLocation Loc, QualType T,
|
||||
CXXConstructorDecl *Ctor, bool ConstructsVirtualBase,
|
||||
bool InheritedFromVirtualBase)
|
||||
: Expr(CXXInheritedCtorInitExprClass, T, VK_RValue, OK_Ordinary, false,
|
||||
false, false, false),
|
||||
Constructor(Ctor), Loc(Loc),
|
||||
ConstructsVirtualBase(ConstructsVirtualBase),
|
||||
InheritedFromVirtualBase(InheritedFromVirtualBase) {
|
||||
assert(!T->isDependentType());
|
||||
}
|
||||
|
||||
/// \brief Construct an empty C++ inheriting construction expression.
|
||||
explicit CXXInheritedCtorInitExpr(EmptyShell Empty)
|
||||
: Expr(CXXInheritedCtorInitExprClass, Empty), Constructor(nullptr),
|
||||
ConstructsVirtualBase(false), InheritedFromVirtualBase(false) {}
|
||||
|
||||
/// \brief Get the constructor that this expression will call.
|
||||
CXXConstructorDecl *getConstructor() const { return Constructor; }
|
||||
|
||||
/// \brief Determine whether this constructor is actually constructing
|
||||
/// a base class (rather than a complete object).
|
||||
bool constructsVBase() const { return ConstructsVirtualBase; }
|
||||
CXXConstructExpr::ConstructionKind getConstructionKind() const {
|
||||
return ConstructsVirtualBase ? CXXConstructExpr::CK_VirtualBase
|
||||
: CXXConstructExpr::CK_NonVirtualBase;
|
||||
}
|
||||
|
||||
/// \brief Determine whether the inherited constructor is inherited from a
|
||||
/// virtual base of the object we construct. If so, we are not responsible
|
||||
/// for calling the inherited constructor (the complete object constructor
|
||||
/// does that), and so we don't need to pass any arguments.
|
||||
bool inheritedFromVBase() const { return InheritedFromVirtualBase; }
|
||||
|
||||
SourceLocation getLocation() const LLVM_READONLY { return Loc; }
|
||||
SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
|
||||
SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == CXXInheritedCtorInitExprClass;
|
||||
}
|
||||
child_range children() {
|
||||
return child_range(child_iterator(), child_iterator());
|
||||
}
|
||||
|
||||
friend class ASTStmtReader;
|
||||
};
|
||||
|
||||
/// \brief Represents an explicit C++ type conversion that uses "functional"
|
||||
/// notation (C++ [expr.type.conv]).
|
||||
///
|
||||
|
|
@ -1375,7 +1455,8 @@ class CXXTemporaryObjectExpr : public CXXConstructExpr {
|
|||
TypeSourceInfo *Type;
|
||||
|
||||
public:
|
||||
CXXTemporaryObjectExpr(const ASTContext &C, CXXConstructorDecl *Cons,
|
||||
CXXTemporaryObjectExpr(const ASTContext &C,
|
||||
CXXConstructorDecl *Cons,
|
||||
TypeSourceInfo *Type,
|
||||
ArrayRef<Expr *> Args,
|
||||
SourceRange ParenOrBraceRange,
|
||||
|
|
@ -1744,12 +1825,12 @@ class CXXNewExpr : public Expr {
|
|||
SourceRange DirectInitRange;
|
||||
|
||||
/// Was the usage ::new, i.e. is the global new to be used?
|
||||
bool GlobalNew : 1;
|
||||
unsigned GlobalNew : 1;
|
||||
/// Do we allocate an array? If so, the first SubExpr is the size expression.
|
||||
bool Array : 1;
|
||||
unsigned Array : 1;
|
||||
/// If this is an array allocation, does the usual deallocation
|
||||
/// function for the allocated type want to know the allocated size?
|
||||
bool UsualArrayDeleteWantsSize : 1;
|
||||
unsigned UsualArrayDeleteWantsSize : 1;
|
||||
/// The number of placement new arguments.
|
||||
unsigned NumPlacementArgs : 13;
|
||||
/// What kind of initializer do we have? Could be none, parens, or braces.
|
||||
|
|
@ -2348,7 +2429,7 @@ class ExpressionTraitExpr : public Expr {
|
|||
/// \brief The trait. A ExpressionTrait enum in MSVC compatible unsigned.
|
||||
unsigned ET : 31;
|
||||
/// \brief The value of the type trait. Unspecified if dependent.
|
||||
bool Value : 1;
|
||||
unsigned Value : 1;
|
||||
|
||||
/// \brief The location of the type trait keyword.
|
||||
SourceLocation Loc;
|
||||
|
|
@ -2557,6 +2638,10 @@ public:
|
|||
return getTrailingASTTemplateKWAndArgsInfo()->NumTemplateArgs;
|
||||
}
|
||||
|
||||
ArrayRef<TemplateArgumentLoc> template_arguments() const {
|
||||
return {getTemplateArgs(), getNumTemplateArgs()};
|
||||
}
|
||||
|
||||
/// \brief Copies the template arguments into the given structure.
|
||||
void copyTemplateArgumentsInto(TemplateArgumentListInfo &List) const {
|
||||
if (hasExplicitTemplateArgs())
|
||||
|
|
@ -2810,6 +2895,10 @@ public:
|
|||
return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
|
||||
}
|
||||
|
||||
ArrayRef<TemplateArgumentLoc> template_arguments() const {
|
||||
return {getTemplateArgs(), getNumTemplateArgs()};
|
||||
}
|
||||
|
||||
/// Note: getLocStart() is the start of the whole DependentScopeDeclRefExpr,
|
||||
/// and differs from getLocation().getStart().
|
||||
SourceLocation getLocStart() const LLVM_READONLY {
|
||||
|
|
@ -2858,7 +2947,8 @@ private:
|
|||
Stmt *SubExpr;
|
||||
|
||||
ExprWithCleanups(EmptyShell, unsigned NumObjects);
|
||||
ExprWithCleanups(Expr *SubExpr, ArrayRef<CleanupObject> Objects);
|
||||
ExprWithCleanups(Expr *SubExpr, bool CleanupsHaveSideEffects,
|
||||
ArrayRef<CleanupObject> Objects);
|
||||
|
||||
friend TrailingObjects;
|
||||
friend class ASTStmtReader;
|
||||
|
|
@ -2868,6 +2958,7 @@ public:
|
|||
unsigned numObjects);
|
||||
|
||||
static ExprWithCleanups *Create(const ASTContext &C, Expr *subexpr,
|
||||
bool CleanupsHaveSideEffects,
|
||||
ArrayRef<CleanupObject> objects);
|
||||
|
||||
ArrayRef<CleanupObject> getObjects() const {
|
||||
|
|
@ -2884,6 +2975,9 @@ public:
|
|||
|
||||
Expr *getSubExpr() { return cast<Expr>(SubExpr); }
|
||||
const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
|
||||
bool cleanupsHaveSideEffects() const {
|
||||
return ExprWithCleanupsBits.CleanupsHaveSideEffects;
|
||||
}
|
||||
|
||||
/// As with any mutator of the AST, be very careful
|
||||
/// when modifying an existing AST to preserve its invariants.
|
||||
|
|
@ -3220,6 +3314,10 @@ public:
|
|||
return getTrailingObjects<ASTTemplateKWAndArgsInfo>()->NumTemplateArgs;
|
||||
}
|
||||
|
||||
ArrayRef<TemplateArgumentLoc> template_arguments() const {
|
||||
return {getTemplateArgs(), getNumTemplateArgs()};
|
||||
}
|
||||
|
||||
SourceLocation getLocStart() const LLVM_READONLY {
|
||||
if (!isImplicitAccess())
|
||||
return Base->getLocStart();
|
||||
|
|
|
|||
|
|
@ -1562,7 +1562,52 @@ public:
|
|||
return T->getStmtClass() == ObjCBridgedCastExprClass;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/// \brief A runtime availability query.
|
||||
///
|
||||
/// There are 2 ways to spell this node:
|
||||
/// \code
|
||||
/// @available(macos 10.10, ios 8, *); // Objective-C
|
||||
/// __builtin_available(macos 10.10, ios 8, *); // C, C++, and Objective-C
|
||||
/// \endcode
|
||||
///
|
||||
/// Note that we only need to keep track of one \c VersionTuple here, which is
|
||||
/// the one that corresponds to the current deployment target. This is meant to
|
||||
/// be used in the condition of an \c if, but it is also usable as top level
|
||||
/// expressions.
|
||||
///
|
||||
class ObjCAvailabilityCheckExpr : public Expr {
|
||||
VersionTuple VersionToCheck;
|
||||
SourceLocation AtLoc, RParen;
|
||||
|
||||
friend class ASTStmtReader;
|
||||
public:
|
||||
ObjCAvailabilityCheckExpr(VersionTuple VersionToCheck, SourceLocation AtLoc,
|
||||
SourceLocation RParen, QualType Ty)
|
||||
: Expr(ObjCAvailabilityCheckExprClass, Ty, VK_RValue, OK_Ordinary, false,
|
||||
false, false, false),
|
||||
VersionToCheck(VersionToCheck), AtLoc(AtLoc), RParen(RParen) {}
|
||||
|
||||
explicit ObjCAvailabilityCheckExpr(EmptyShell Shell)
|
||||
: Expr(ObjCAvailabilityCheckExprClass, Shell) {}
|
||||
|
||||
SourceLocation getLocStart() const { return AtLoc; }
|
||||
SourceLocation getLocEnd() const { return RParen; }
|
||||
SourceRange getSourceRange() const { return {AtLoc, RParen}; }
|
||||
|
||||
/// \brief This may be '*', in which case this should fold to true.
|
||||
bool hasVersion() const { return !VersionToCheck.empty(); }
|
||||
VersionTuple getVersion() { return VersionToCheck; }
|
||||
|
||||
child_range children() {
|
||||
return child_range(child_iterator(), child_iterator());
|
||||
}
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == ObjCAvailabilityCheckExprClass;
|
||||
}
|
||||
};
|
||||
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ public:
|
|||
void setBase(Expr *E) { SubExprs[BASE] = E; }
|
||||
|
||||
/// \brief Return original type of the base expression for array section.
|
||||
static QualType getBaseOriginalType(Expr *Base);
|
||||
static QualType getBaseOriginalType(const Expr *Base);
|
||||
|
||||
/// \brief Get lower bound of array section.
|
||||
Expr *getLowerBound() { return cast_or_null<Expr>(SubExprs[LOWER_BOUND]); }
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#include "clang/AST/DeclCXX.h"
|
||||
#include "clang/AST/DeclObjC.h"
|
||||
#include "clang/AST/DeclOpenMP.h"
|
||||
#include "clang/Basic/ABI.h"
|
||||
|
||||
namespace clang {
|
||||
|
|
@ -43,6 +44,7 @@ public:
|
|||
GlobalDecl(const BlockDecl *D) { Init(D); }
|
||||
GlobalDecl(const CapturedDecl *D) { Init(D); }
|
||||
GlobalDecl(const ObjCMethodDecl *D) { Init(D); }
|
||||
GlobalDecl(const OMPDeclareReductionDecl *D) { Init(D); }
|
||||
|
||||
GlobalDecl(const CXXConstructorDecl *D, CXXCtorType Type)
|
||||
: Value(D, Type) {}
|
||||
|
|
|
|||
|
|
@ -33,10 +33,22 @@ class LambdaCapture {
|
|||
/// given capture was by-copy.
|
||||
///
|
||||
/// This includes the case of a non-reference init-capture.
|
||||
Capture_ByCopy = 0x02
|
||||
Capture_ByCopy = 0x02,
|
||||
|
||||
/// \brief Flag used by the Capture class to distinguish between a capture
|
||||
/// of '*this' and a capture of a VLA type.
|
||||
Capture_This = 0x04
|
||||
};
|
||||
|
||||
llvm::PointerIntPair<Decl *, 2> DeclAndBits;
|
||||
// Decl could represent:
|
||||
// - a VarDecl* that represents the variable that was captured or the
|
||||
// init-capture.
|
||||
// - or, is a nullptr and Capture_This is set in Bits if this represents a
|
||||
// capture of '*this' by value or reference.
|
||||
// - or, is a nullptr and Capture_This is not set in Bits if this represents
|
||||
// a capture of a VLA type.
|
||||
llvm::PointerIntPair<Decl*, 3> DeclAndBits;
|
||||
|
||||
SourceLocation Loc;
|
||||
SourceLocation EllipsisLoc;
|
||||
|
||||
|
|
@ -69,8 +81,8 @@ public:
|
|||
/// \brief Determine whether this capture handles the C++ \c this
|
||||
/// pointer.
|
||||
bool capturesThis() const {
|
||||
return (DeclAndBits.getPointer() == nullptr) &&
|
||||
!(DeclAndBits.getInt() & Capture_ByCopy);
|
||||
return DeclAndBits.getPointer() == nullptr &&
|
||||
(DeclAndBits.getInt() & Capture_This);
|
||||
}
|
||||
|
||||
/// \brief Determine whether this capture handles a variable.
|
||||
|
|
@ -81,8 +93,8 @@ public:
|
|||
/// \brief Determine whether this captures a variable length array bound
|
||||
/// expression.
|
||||
bool capturesVLAType() const {
|
||||
return (DeclAndBits.getPointer() == nullptr) &&
|
||||
(DeclAndBits.getInt() & Capture_ByCopy);
|
||||
return DeclAndBits.getPointer() == nullptr &&
|
||||
!(DeclAndBits.getInt() & Capture_This);
|
||||
}
|
||||
|
||||
/// \brief Retrieve the declaration of the local variable being
|
||||
|
|
@ -91,13 +103,15 @@ public:
|
|||
/// This operation is only valid if this capture is a variable capture
|
||||
/// (other than a capture of \c this).
|
||||
VarDecl *getCapturedVar() const {
|
||||
assert(capturesVariable() && "No variable available for 'this' capture");
|
||||
return cast<VarDecl>(DeclAndBits.getPointer());
|
||||
assert(capturesVariable() && "No variable available for capture");
|
||||
return static_cast<VarDecl *>(DeclAndBits.getPointer());
|
||||
}
|
||||
|
||||
/// \brief Determine whether this was an implicit capture (not
|
||||
/// written between the square brackets introducing the lambda).
|
||||
bool isImplicit() const { return DeclAndBits.getInt() & Capture_Implicit; }
|
||||
bool isImplicit() const {
|
||||
return DeclAndBits.getInt() & Capture_Implicit;
|
||||
}
|
||||
|
||||
/// \brief Determine whether this was an explicit capture (written
|
||||
/// between the square brackets introducing the lambda).
|
||||
|
|
|
|||
|
|
@ -36,11 +36,10 @@ class LocInfoType : public Type {
|
|||
TypeSourceInfo *DeclInfo;
|
||||
|
||||
LocInfoType(QualType ty, TypeSourceInfo *TInfo)
|
||||
: Type((TypeClass)LocInfo, ty, ty->isDependentType(),
|
||||
ty->isInstantiationDependentType(),
|
||||
ty->isVariablyModifiedType(),
|
||||
ty->containsUnexpandedParameterPack()),
|
||||
DeclInfo(TInfo) {
|
||||
: Type((TypeClass)LocInfo, ty, ty->isDependentType(),
|
||||
ty->isInstantiationDependentType(), ty->isVariablyModifiedType(),
|
||||
ty->containsUnexpandedParameterPack()),
|
||||
DeclInfo(TInfo) {
|
||||
assert(getTypeClass() == (TypeClass)LocInfo && "LocInfo didn't fit in TC?");
|
||||
}
|
||||
friend class Sema;
|
||||
|
|
@ -14,6 +14,7 @@
|
|||
#ifndef LLVM_CLANG_AST_MANGLE_H
|
||||
#define LLVM_CLANG_AST_MANGLE_H
|
||||
|
||||
#include "clang/AST/Decl.h"
|
||||
#include "clang/AST/Type.h"
|
||||
#include "clang/Basic/ABI.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
|
|
@ -123,6 +124,7 @@ public:
|
|||
void mangleBlock(const DeclContext *DC, const BlockDecl *BD,
|
||||
raw_ostream &Out);
|
||||
|
||||
void mangleObjCMethodNameWithoutSize(const ObjCMethodDecl *MD, raw_ostream &);
|
||||
void mangleObjCMethodName(const ObjCMethodDecl *MD, raw_ostream &);
|
||||
|
||||
virtual void mangleStaticGuardVariable(const VarDecl *D, raw_ostream &) = 0;
|
||||
|
|
@ -206,7 +208,8 @@ public:
|
|||
raw_ostream &Out) = 0;
|
||||
|
||||
virtual void mangleCXXThrowInfo(QualType T, bool IsConst, bool IsVolatile,
|
||||
uint32_t NumEntries, raw_ostream &Out) = 0;
|
||||
bool IsUnaligned, uint32_t NumEntries,
|
||||
raw_ostream &Out) = 0;
|
||||
|
||||
virtual void mangleCXXCatchableTypeArray(QualType T, uint32_t NumEntries,
|
||||
raw_ostream &Out) = 0;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
406
contrib/llvm/tools/clang/include/clang/AST/OperationKinds.def
Normal file
406
contrib/llvm/tools/clang/include/clang/AST/OperationKinds.def
Normal file
|
|
@ -0,0 +1,406 @@
|
|||
//===--- OperationKinds.def - Operations Database ---------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file enumerates the different kinds of operations that can be
|
||||
// performed by various expressions.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
/// @file OperationKinds.def
|
||||
///
|
||||
/// In this file, each of the C/C++ operations is enumerated CAST_OPERATION,
|
||||
/// BINARY_OPERATION or UNARY_OPERATION macro, each of which can be specified by
|
||||
/// the code including this file.
|
||||
///
|
||||
/// Macros had one or two arguments:
|
||||
///
|
||||
/// Name: The name of the operation. Name (prefixed with CK_, UO_ or BO_) will
|
||||
/// be the name of the corresponding enumerator (see OperationsKinds.h).
|
||||
///
|
||||
/// Spelling: A string that provides a canonical spelling for the operation.
|
||||
|
||||
#ifndef CAST_OPERATION
|
||||
# define CAST_OPERATION(Name)
|
||||
#endif
|
||||
|
||||
#ifndef BINARY_OPERATION
|
||||
# define BINARY_OPERATION(Name, Spelling)
|
||||
#endif
|
||||
|
||||
#ifndef UNARY_OPERATION
|
||||
# define UNARY_OPERATION(Name, Spelling)
|
||||
#endif
|
||||
|
||||
//===- Cast Operations ---------------------------------------------------===//
|
||||
|
||||
/// CK_Dependent - A conversion which cannot yet be analyzed because
|
||||
/// either the expression or target type is dependent. These are
|
||||
/// created only for explicit casts; dependent ASTs aren't required
|
||||
/// to even approximately type-check.
|
||||
/// (T*) malloc(sizeof(T))
|
||||
/// reinterpret_cast<intptr_t>(A<T>::alloc());
|
||||
CAST_OPERATION(Dependent)
|
||||
|
||||
/// CK_BitCast - A conversion which causes a bit pattern of one type
|
||||
/// to be reinterpreted as a bit pattern of another type. Generally
|
||||
/// the operands must have equivalent size and unrelated types.
|
||||
///
|
||||
/// The pointer conversion char* -> int* is a bitcast. A conversion
|
||||
/// from any pointer type to a C pointer type is a bitcast unless
|
||||
/// it's actually BaseToDerived or DerivedToBase. A conversion to a
|
||||
/// block pointer or ObjC pointer type is a bitcast only if the
|
||||
/// operand has the same type kind; otherwise, it's one of the
|
||||
/// specialized casts below.
|
||||
///
|
||||
/// Vector coercions are bitcasts.
|
||||
CAST_OPERATION(BitCast)
|
||||
|
||||
/// CK_LValueBitCast - A conversion which reinterprets the address of
|
||||
/// an l-value as an l-value of a different kind. Used for
|
||||
/// reinterpret_casts of l-value expressions to reference types.
|
||||
/// bool b; reinterpret_cast<char&>(b) = 'a';
|
||||
CAST_OPERATION(LValueBitCast)
|
||||
|
||||
/// CK_LValueToRValue - A conversion which causes the extraction of
|
||||
/// an r-value from the operand gl-value. The result of an r-value
|
||||
/// conversion is always unqualified.
|
||||
CAST_OPERATION(LValueToRValue)
|
||||
|
||||
/// CK_NoOp - A conversion which does not affect the type other than
|
||||
/// (possibly) adding qualifiers.
|
||||
/// int -> int
|
||||
/// char** -> const char * const *
|
||||
CAST_OPERATION(NoOp)
|
||||
|
||||
/// CK_BaseToDerived - A conversion from a C++ class pointer/reference
|
||||
/// to a derived class pointer/reference.
|
||||
/// B *b = static_cast<B*>(a);
|
||||
CAST_OPERATION(BaseToDerived)
|
||||
|
||||
/// CK_DerivedToBase - A conversion from a C++ class pointer
|
||||
/// to a base class pointer.
|
||||
/// A *a = new B();
|
||||
CAST_OPERATION(DerivedToBase)
|
||||
|
||||
/// CK_UncheckedDerivedToBase - A conversion from a C++ class
|
||||
/// pointer/reference to a base class that can assume that the
|
||||
/// derived pointer is not null.
|
||||
/// const A &a = B();
|
||||
/// b->method_from_a();
|
||||
CAST_OPERATION(UncheckedDerivedToBase)
|
||||
|
||||
/// CK_Dynamic - A C++ dynamic_cast.
|
||||
CAST_OPERATION(Dynamic)
|
||||
|
||||
/// CK_ToUnion - The GCC cast-to-union extension.
|
||||
/// int -> union { int x; float y; }
|
||||
/// float -> union { int x; float y; }
|
||||
CAST_OPERATION(ToUnion)
|
||||
|
||||
/// CK_ArrayToPointerDecay - Array to pointer decay.
|
||||
/// int[10] -> int*
|
||||
/// char[5][6] -> char(*)[6]
|
||||
CAST_OPERATION(ArrayToPointerDecay)
|
||||
|
||||
/// CK_FunctionToPointerDecay - Function to pointer decay.
|
||||
/// void(int) -> void(*)(int)
|
||||
CAST_OPERATION(FunctionToPointerDecay)
|
||||
|
||||
/// CK_NullToPointer - Null pointer constant to pointer, ObjC
|
||||
/// pointer, or block pointer.
|
||||
/// (void*) 0
|
||||
/// void (^block)() = 0;
|
||||
CAST_OPERATION(NullToPointer)
|
||||
|
||||
/// CK_NullToMemberPointer - Null pointer constant to member pointer.
|
||||
/// int A::*mptr = 0;
|
||||
/// int (A::*fptr)(int) = nullptr;
|
||||
CAST_OPERATION(NullToMemberPointer)
|
||||
|
||||
/// CK_BaseToDerivedMemberPointer - Member pointer in base class to
|
||||
/// member pointer in derived class.
|
||||
/// int B::*mptr = &A::member;
|
||||
CAST_OPERATION(BaseToDerivedMemberPointer)
|
||||
|
||||
/// CK_DerivedToBaseMemberPointer - Member pointer in derived class to
|
||||
/// member pointer in base class.
|
||||
/// int A::*mptr = static_cast<int A::*>(&B::member);
|
||||
CAST_OPERATION(DerivedToBaseMemberPointer)
|
||||
|
||||
/// CK_MemberPointerToBoolean - Member pointer to boolean. A check
|
||||
/// against the null member pointer.
|
||||
CAST_OPERATION(MemberPointerToBoolean)
|
||||
|
||||
/// CK_ReinterpretMemberPointer - Reinterpret a member pointer as a
|
||||
/// different kind of member pointer. C++ forbids this from
|
||||
/// crossing between function and object types, but otherwise does
|
||||
/// not restrict it. However, the only operation that is permitted
|
||||
/// on a "punned" member pointer is casting it back to the original
|
||||
/// type, which is required to be a lossless operation (although
|
||||
/// many ABIs do not guarantee this on all possible intermediate types).
|
||||
CAST_OPERATION(ReinterpretMemberPointer)
|
||||
|
||||
/// CK_UserDefinedConversion - Conversion using a user defined type
|
||||
/// conversion function.
|
||||
/// struct A { operator int(); }; int i = int(A());
|
||||
CAST_OPERATION(UserDefinedConversion)
|
||||
|
||||
/// CK_ConstructorConversion - Conversion by constructor.
|
||||
/// struct A { A(int); }; A a = A(10);
|
||||
CAST_OPERATION(ConstructorConversion)
|
||||
|
||||
/// CK_IntegralToPointer - Integral to pointer. A special kind of
|
||||
/// reinterpreting conversion. Applies to normal, ObjC, and block
|
||||
/// pointers.
|
||||
/// (char*) 0x1001aab0
|
||||
/// reinterpret_cast<int*>(0)
|
||||
CAST_OPERATION(IntegralToPointer)
|
||||
|
||||
/// CK_PointerToIntegral - Pointer to integral. A special kind of
|
||||
/// reinterpreting conversion. Applies to normal, ObjC, and block
|
||||
/// pointers.
|
||||
/// (intptr_t) "help!"
|
||||
CAST_OPERATION(PointerToIntegral)
|
||||
|
||||
/// CK_PointerToBoolean - Pointer to boolean conversion. A check
|
||||
/// against null. Applies to normal, ObjC, and block pointers.
|
||||
CAST_OPERATION(PointerToBoolean)
|
||||
|
||||
/// CK_ToVoid - Cast to void, discarding the computed value.
|
||||
/// (void) malloc(2048)
|
||||
CAST_OPERATION(ToVoid)
|
||||
|
||||
/// CK_VectorSplat - A conversion from an arithmetic type to a
|
||||
/// vector of that element type. Fills all elements ("splats") with
|
||||
/// the source value.
|
||||
/// __attribute__((ext_vector_type(4))) int v = 5;
|
||||
CAST_OPERATION(VectorSplat)
|
||||
|
||||
/// CK_IntegralCast - A cast between integral types (other than to
|
||||
/// boolean). Variously a bitcast, a truncation, a sign-extension,
|
||||
/// or a zero-extension.
|
||||
/// long l = 5;
|
||||
/// (unsigned) i
|
||||
CAST_OPERATION(IntegralCast)
|
||||
|
||||
/// CK_IntegralToBoolean - Integral to boolean. A check against zero.
|
||||
/// (bool) i
|
||||
CAST_OPERATION(IntegralToBoolean)
|
||||
|
||||
/// CK_IntegralToFloating - Integral to floating point.
|
||||
/// float f = i;
|
||||
CAST_OPERATION(IntegralToFloating)
|
||||
|
||||
/// CK_FloatingToIntegral - Floating point to integral. Rounds
|
||||
/// towards zero, discarding any fractional component.
|
||||
/// (int) f
|
||||
CAST_OPERATION(FloatingToIntegral)
|
||||
|
||||
/// CK_FloatingToBoolean - Floating point to boolean.
|
||||
/// (bool) f
|
||||
CAST_OPERATION(FloatingToBoolean)
|
||||
|
||||
// CK_BooleanToSignedIntegral - Convert a boolean to -1 or 0 for true and
|
||||
// false, respectively.
|
||||
CAST_OPERATION(BooleanToSignedIntegral)
|
||||
|
||||
/// CK_FloatingCast - Casting between floating types of different size.
|
||||
/// (double) f
|
||||
/// (float) ld
|
||||
CAST_OPERATION(FloatingCast)
|
||||
|
||||
/// CK_CPointerToObjCPointerCast - Casting a C pointer kind to an
|
||||
/// Objective-C pointer.
|
||||
CAST_OPERATION(CPointerToObjCPointerCast)
|
||||
|
||||
/// CK_BlockPointerToObjCPointerCast - Casting a block pointer to an
|
||||
/// ObjC pointer.
|
||||
CAST_OPERATION(BlockPointerToObjCPointerCast)
|
||||
|
||||
/// CK_AnyPointerToBlockPointerCast - Casting any non-block pointer
|
||||
/// to a block pointer. Block-to-block casts are bitcasts.
|
||||
CAST_OPERATION(AnyPointerToBlockPointerCast)
|
||||
|
||||
/// \brief Converting between two Objective-C object types, which
|
||||
/// can occur when performing reference binding to an Objective-C
|
||||
/// object.
|
||||
CAST_OPERATION(ObjCObjectLValueCast)
|
||||
|
||||
/// \brief A conversion of a floating point real to a floating point
|
||||
/// complex of the original type. Injects the value as the real
|
||||
/// component with a zero imaginary component.
|
||||
/// float -> _Complex float
|
||||
CAST_OPERATION(FloatingRealToComplex)
|
||||
|
||||
/// \brief Converts a floating point complex to floating point real
|
||||
/// of the source's element type. Just discards the imaginary
|
||||
/// component.
|
||||
/// _Complex long double -> long double
|
||||
CAST_OPERATION(FloatingComplexToReal)
|
||||
|
||||
/// \brief Converts a floating point complex to bool by comparing
|
||||
/// against 0+0i.
|
||||
CAST_OPERATION(FloatingComplexToBoolean)
|
||||
|
||||
/// \brief Converts between different floating point complex types.
|
||||
/// _Complex float -> _Complex double
|
||||
CAST_OPERATION(FloatingComplexCast)
|
||||
|
||||
/// \brief Converts from a floating complex to an integral complex.
|
||||
/// _Complex float -> _Complex int
|
||||
CAST_OPERATION(FloatingComplexToIntegralComplex)
|
||||
|
||||
/// \brief Converts from an integral real to an integral complex
|
||||
/// whose element type matches the source. Injects the value as
|
||||
/// the real component with a zero imaginary component.
|
||||
/// long -> _Complex long
|
||||
CAST_OPERATION(IntegralRealToComplex)
|
||||
|
||||
/// \brief Converts an integral complex to an integral real of the
|
||||
/// source's element type by discarding the imaginary component.
|
||||
/// _Complex short -> short
|
||||
CAST_OPERATION(IntegralComplexToReal)
|
||||
|
||||
/// \brief Converts an integral complex to bool by comparing against
|
||||
/// 0+0i.
|
||||
CAST_OPERATION(IntegralComplexToBoolean)
|
||||
|
||||
/// \brief Converts between different integral complex types.
|
||||
/// _Complex char -> _Complex long long
|
||||
/// _Complex unsigned int -> _Complex signed int
|
||||
CAST_OPERATION(IntegralComplexCast)
|
||||
|
||||
/// \brief Converts from an integral complex to a floating complex.
|
||||
/// _Complex unsigned -> _Complex float
|
||||
CAST_OPERATION(IntegralComplexToFloatingComplex)
|
||||
|
||||
/// \brief [ARC] Produces a retainable object pointer so that it may
|
||||
/// be consumed, e.g. by being passed to a consuming parameter.
|
||||
/// Calls objc_retain.
|
||||
CAST_OPERATION(ARCProduceObject)
|
||||
|
||||
/// \brief [ARC] Consumes a retainable object pointer that has just
|
||||
/// been produced, e.g. as the return value of a retaining call.
|
||||
/// Enters a cleanup to call objc_release at some indefinite time.
|
||||
CAST_OPERATION(ARCConsumeObject)
|
||||
|
||||
/// \brief [ARC] Reclaim a retainable object pointer object that may
|
||||
/// have been produced and autoreleased as part of a function return
|
||||
/// sequence.
|
||||
CAST_OPERATION(ARCReclaimReturnedObject)
|
||||
|
||||
/// \brief [ARC] Causes a value of block type to be copied to the
|
||||
/// heap, if it is not already there. A number of other operations
|
||||
/// in ARC cause blocks to be copied; this is for cases where that
|
||||
/// would not otherwise be guaranteed, such as when casting to a
|
||||
/// non-block pointer type.
|
||||
CAST_OPERATION(ARCExtendBlockObject)
|
||||
|
||||
/// \brief Converts from _Atomic(T) to T.
|
||||
CAST_OPERATION(AtomicToNonAtomic)
|
||||
/// \brief Converts from T to _Atomic(T).
|
||||
CAST_OPERATION(NonAtomicToAtomic)
|
||||
|
||||
/// \brief Causes a block literal to by copied to the heap and then
|
||||
/// autoreleased.
|
||||
///
|
||||
/// This particular cast kind is used for the conversion from a C++11
|
||||
/// lambda expression to a block pointer.
|
||||
CAST_OPERATION(CopyAndAutoreleaseBlockObject)
|
||||
|
||||
// Convert a builtin function to a function pointer; only allowed in the
|
||||
// callee of a call expression.
|
||||
CAST_OPERATION(BuiltinFnToFnPtr)
|
||||
|
||||
// Convert a zero value for OpenCL event_t initialization.
|
||||
CAST_OPERATION(ZeroToOCLEvent)
|
||||
|
||||
// Convert a pointer to a different address space.
|
||||
CAST_OPERATION(AddressSpaceConversion)
|
||||
|
||||
|
||||
//===- Binary Operations -------------------------------------------------===//
|
||||
// Operators listed in order of precedence.
|
||||
// Note that additions to this should also update the StmtVisitor class.
|
||||
|
||||
// [C++ 5.5] Pointer-to-member operators.
|
||||
BINARY_OPERATION(PtrMemD, ".*")
|
||||
BINARY_OPERATION(PtrMemI, "->*")
|
||||
// [C99 6.5.5] Multiplicative operators.
|
||||
BINARY_OPERATION(Mul, "*")
|
||||
BINARY_OPERATION(Div, "/")
|
||||
BINARY_OPERATION(Rem, "%")
|
||||
// [C99 6.5.6] Additive operators.
|
||||
BINARY_OPERATION(Add, "+")
|
||||
BINARY_OPERATION(Sub, "-")
|
||||
// [C99 6.5.7] Bitwise shift operators.
|
||||
BINARY_OPERATION(Shl, "<<")
|
||||
BINARY_OPERATION(Shr, ">>")
|
||||
// [C99 6.5.8] Relational operators.
|
||||
BINARY_OPERATION(LT, "<")
|
||||
BINARY_OPERATION(GT, ">")
|
||||
BINARY_OPERATION(LE, "<=")
|
||||
BINARY_OPERATION(GE, ">=")
|
||||
// [C99 6.5.9] Equality operators.
|
||||
BINARY_OPERATION(EQ, "==")
|
||||
BINARY_OPERATION(NE, "!=")
|
||||
// [C99 6.5.10] Bitwise AND operator.
|
||||
BINARY_OPERATION(And, "&")
|
||||
// [C99 6.5.11] Bitwise XOR operator.
|
||||
BINARY_OPERATION(Xor, "^")
|
||||
// [C99 6.5.12] Bitwise OR operator.
|
||||
BINARY_OPERATION(Or, "|")
|
||||
// [C99 6.5.13] Logical AND operator.
|
||||
BINARY_OPERATION(LAnd, "&&")
|
||||
// [C99 6.5.14] Logical OR operator.
|
||||
BINARY_OPERATION(LOr, "||")
|
||||
// [C99 6.5.16] Assignment operators.
|
||||
BINARY_OPERATION(Assign, "=")
|
||||
BINARY_OPERATION(MulAssign, "*=")
|
||||
BINARY_OPERATION(DivAssign, "/=")
|
||||
BINARY_OPERATION(RemAssign, "%=")
|
||||
BINARY_OPERATION(AddAssign, "+=")
|
||||
BINARY_OPERATION(SubAssign, "-=")
|
||||
BINARY_OPERATION(ShlAssign, "<<=")
|
||||
BINARY_OPERATION(ShrAssign, ">>=")
|
||||
BINARY_OPERATION(AndAssign, "&=")
|
||||
BINARY_OPERATION(XorAssign, "^=")
|
||||
BINARY_OPERATION(OrAssign, "|=")
|
||||
// [C99 6.5.17] Comma operator.
|
||||
BINARY_OPERATION(Comma, ",")
|
||||
|
||||
|
||||
//===- Unary Operations ---------------------------------------------------===//
|
||||
// Note that additions to this should also update the StmtVisitor class.
|
||||
|
||||
// [C99 6.5.2.4] Postfix increment and decrement
|
||||
UNARY_OPERATION(PostInc, "++")
|
||||
UNARY_OPERATION(PostDec, "--")
|
||||
// [C99 6.5.3.1] Prefix increment and decrement
|
||||
UNARY_OPERATION(PreInc, "++")
|
||||
UNARY_OPERATION(PreDec, "--")
|
||||
// [C99 6.5.3.2] Address and indirection
|
||||
UNARY_OPERATION(AddrOf, "&")
|
||||
UNARY_OPERATION(Deref, "*")
|
||||
// [C99 6.5.3.3] Unary arithmetic
|
||||
UNARY_OPERATION(Plus, "+")
|
||||
UNARY_OPERATION(Minus, "-")
|
||||
UNARY_OPERATION(Not, "~")
|
||||
UNARY_OPERATION(LNot, "!")
|
||||
// "__real expr"/"__imag expr" Extension.
|
||||
UNARY_OPERATION(Real, "__real")
|
||||
UNARY_OPERATION(Imag, "__imag")
|
||||
// __extension__ marker.
|
||||
UNARY_OPERATION(Extension, "__extension__")
|
||||
// [C++ Coroutines] co_await operator
|
||||
UNARY_OPERATION(Coawait, "co_await")
|
||||
|
||||
#undef CAST_OPERATION
|
||||
#undef BINARY_OPERATION
|
||||
#undef UNARY_OPERATION
|
||||
|
|
@ -19,327 +19,20 @@ namespace clang {
|
|||
|
||||
/// CastKind - The kind of operation required for a conversion.
|
||||
enum CastKind {
|
||||
/// CK_Dependent - A conversion which cannot yet be analyzed because
|
||||
/// either the expression or target type is dependent. These are
|
||||
/// created only for explicit casts; dependent ASTs aren't required
|
||||
/// to even approximately type-check.
|
||||
/// (T*) malloc(sizeof(T))
|
||||
/// reinterpret_cast<intptr_t>(A<T>::alloc());
|
||||
CK_Dependent,
|
||||
|
||||
/// CK_BitCast - A conversion which causes a bit pattern of one type
|
||||
/// to be reinterpreted as a bit pattern of another type. Generally
|
||||
/// the operands must have equivalent size and unrelated types.
|
||||
///
|
||||
/// The pointer conversion char* -> int* is a bitcast. A conversion
|
||||
/// from any pointer type to a C pointer type is a bitcast unless
|
||||
/// it's actually BaseToDerived or DerivedToBase. A conversion to a
|
||||
/// block pointer or ObjC pointer type is a bitcast only if the
|
||||
/// operand has the same type kind; otherwise, it's one of the
|
||||
/// specialized casts below.
|
||||
///
|
||||
/// Vector coercions are bitcasts.
|
||||
CK_BitCast,
|
||||
|
||||
/// CK_LValueBitCast - A conversion which reinterprets the address of
|
||||
/// an l-value as an l-value of a different kind. Used for
|
||||
/// reinterpret_casts of l-value expressions to reference types.
|
||||
/// bool b; reinterpret_cast<char&>(b) = 'a';
|
||||
CK_LValueBitCast,
|
||||
|
||||
/// CK_LValueToRValue - A conversion which causes the extraction of
|
||||
/// an r-value from the operand gl-value. The result of an r-value
|
||||
/// conversion is always unqualified.
|
||||
CK_LValueToRValue,
|
||||
|
||||
/// CK_NoOp - A conversion which does not affect the type other than
|
||||
/// (possibly) adding qualifiers.
|
||||
/// int -> int
|
||||
/// char** -> const char * const *
|
||||
CK_NoOp,
|
||||
|
||||
/// CK_BaseToDerived - A conversion from a C++ class pointer/reference
|
||||
/// to a derived class pointer/reference.
|
||||
/// B *b = static_cast<B*>(a);
|
||||
CK_BaseToDerived,
|
||||
|
||||
/// CK_DerivedToBase - A conversion from a C++ class pointer
|
||||
/// to a base class pointer.
|
||||
/// A *a = new B();
|
||||
CK_DerivedToBase,
|
||||
|
||||
/// CK_UncheckedDerivedToBase - A conversion from a C++ class
|
||||
/// pointer/reference to a base class that can assume that the
|
||||
/// derived pointer is not null.
|
||||
/// const A &a = B();
|
||||
/// b->method_from_a();
|
||||
CK_UncheckedDerivedToBase,
|
||||
|
||||
/// CK_Dynamic - A C++ dynamic_cast.
|
||||
CK_Dynamic,
|
||||
|
||||
/// CK_ToUnion - The GCC cast-to-union extension.
|
||||
/// int -> union { int x; float y; }
|
||||
/// float -> union { int x; float y; }
|
||||
CK_ToUnion,
|
||||
|
||||
/// CK_ArrayToPointerDecay - Array to pointer decay.
|
||||
/// int[10] -> int*
|
||||
/// char[5][6] -> char(*)[6]
|
||||
CK_ArrayToPointerDecay,
|
||||
|
||||
/// CK_FunctionToPointerDecay - Function to pointer decay.
|
||||
/// void(int) -> void(*)(int)
|
||||
CK_FunctionToPointerDecay,
|
||||
|
||||
/// CK_NullToPointer - Null pointer constant to pointer, ObjC
|
||||
/// pointer, or block pointer.
|
||||
/// (void*) 0
|
||||
/// void (^block)() = 0;
|
||||
CK_NullToPointer,
|
||||
|
||||
/// CK_NullToMemberPointer - Null pointer constant to member pointer.
|
||||
/// int A::*mptr = 0;
|
||||
/// int (A::*fptr)(int) = nullptr;
|
||||
CK_NullToMemberPointer,
|
||||
|
||||
/// CK_BaseToDerivedMemberPointer - Member pointer in base class to
|
||||
/// member pointer in derived class.
|
||||
/// int B::*mptr = &A::member;
|
||||
CK_BaseToDerivedMemberPointer,
|
||||
|
||||
/// CK_DerivedToBaseMemberPointer - Member pointer in derived class to
|
||||
/// member pointer in base class.
|
||||
/// int A::*mptr = static_cast<int A::*>(&B::member);
|
||||
CK_DerivedToBaseMemberPointer,
|
||||
|
||||
/// CK_MemberPointerToBoolean - Member pointer to boolean. A check
|
||||
/// against the null member pointer.
|
||||
CK_MemberPointerToBoolean,
|
||||
|
||||
/// CK_ReinterpretMemberPointer - Reinterpret a member pointer as a
|
||||
/// different kind of member pointer. C++ forbids this from
|
||||
/// crossing between function and object types, but otherwise does
|
||||
/// not restrict it. However, the only operation that is permitted
|
||||
/// on a "punned" member pointer is casting it back to the original
|
||||
/// type, which is required to be a lossless operation (although
|
||||
/// many ABIs do not guarantee this on all possible intermediate types).
|
||||
CK_ReinterpretMemberPointer,
|
||||
|
||||
/// CK_UserDefinedConversion - Conversion using a user defined type
|
||||
/// conversion function.
|
||||
/// struct A { operator int(); }; int i = int(A());
|
||||
CK_UserDefinedConversion,
|
||||
|
||||
/// CK_ConstructorConversion - Conversion by constructor.
|
||||
/// struct A { A(int); }; A a = A(10);
|
||||
CK_ConstructorConversion,
|
||||
|
||||
/// CK_IntegralToPointer - Integral to pointer. A special kind of
|
||||
/// reinterpreting conversion. Applies to normal, ObjC, and block
|
||||
/// pointers.
|
||||
/// (char*) 0x1001aab0
|
||||
/// reinterpret_cast<int*>(0)
|
||||
CK_IntegralToPointer,
|
||||
|
||||
/// CK_PointerToIntegral - Pointer to integral. A special kind of
|
||||
/// reinterpreting conversion. Applies to normal, ObjC, and block
|
||||
/// pointers.
|
||||
/// (intptr_t) "help!"
|
||||
CK_PointerToIntegral,
|
||||
|
||||
/// CK_PointerToBoolean - Pointer to boolean conversion. A check
|
||||
/// against null. Applies to normal, ObjC, and block pointers.
|
||||
CK_PointerToBoolean,
|
||||
|
||||
/// CK_ToVoid - Cast to void, discarding the computed value.
|
||||
/// (void) malloc(2048)
|
||||
CK_ToVoid,
|
||||
|
||||
/// CK_VectorSplat - A conversion from an arithmetic type to a
|
||||
/// vector of that element type. Fills all elements ("splats") with
|
||||
/// the source value.
|
||||
/// __attribute__((ext_vector_type(4))) int v = 5;
|
||||
CK_VectorSplat,
|
||||
|
||||
/// CK_IntegralCast - A cast between integral types (other than to
|
||||
/// boolean). Variously a bitcast, a truncation, a sign-extension,
|
||||
/// or a zero-extension.
|
||||
/// long l = 5;
|
||||
/// (unsigned) i
|
||||
CK_IntegralCast,
|
||||
|
||||
/// CK_IntegralToBoolean - Integral to boolean. A check against zero.
|
||||
/// (bool) i
|
||||
CK_IntegralToBoolean,
|
||||
|
||||
/// CK_IntegralToFloating - Integral to floating point.
|
||||
/// float f = i;
|
||||
CK_IntegralToFloating,
|
||||
|
||||
/// CK_FloatingToIntegral - Floating point to integral. Rounds
|
||||
/// towards zero, discarding any fractional component.
|
||||
/// (int) f
|
||||
CK_FloatingToIntegral,
|
||||
|
||||
/// CK_FloatingToBoolean - Floating point to boolean.
|
||||
/// (bool) f
|
||||
CK_FloatingToBoolean,
|
||||
|
||||
// CK_BooleanToSignedIntegral - Convert a boolean to -1 or 0 for true and
|
||||
// false, respectively.
|
||||
CK_BooleanToSignedIntegral,
|
||||
|
||||
/// CK_FloatingCast - Casting between floating types of different size.
|
||||
/// (double) f
|
||||
/// (float) ld
|
||||
CK_FloatingCast,
|
||||
|
||||
/// CK_CPointerToObjCPointerCast - Casting a C pointer kind to an
|
||||
/// Objective-C pointer.
|
||||
CK_CPointerToObjCPointerCast,
|
||||
|
||||
/// CK_BlockPointerToObjCPointerCast - Casting a block pointer to an
|
||||
/// ObjC pointer.
|
||||
CK_BlockPointerToObjCPointerCast,
|
||||
|
||||
/// CK_AnyPointerToBlockPointerCast - Casting any non-block pointer
|
||||
/// to a block pointer. Block-to-block casts are bitcasts.
|
||||
CK_AnyPointerToBlockPointerCast,
|
||||
|
||||
/// \brief Converting between two Objective-C object types, which
|
||||
/// can occur when performing reference binding to an Objective-C
|
||||
/// object.
|
||||
CK_ObjCObjectLValueCast,
|
||||
|
||||
/// \brief A conversion of a floating point real to a floating point
|
||||
/// complex of the original type. Injects the value as the real
|
||||
/// component with a zero imaginary component.
|
||||
/// float -> _Complex float
|
||||
CK_FloatingRealToComplex,
|
||||
|
||||
/// \brief Converts a floating point complex to floating point real
|
||||
/// of the source's element type. Just discards the imaginary
|
||||
/// component.
|
||||
/// _Complex long double -> long double
|
||||
CK_FloatingComplexToReal,
|
||||
|
||||
/// \brief Converts a floating point complex to bool by comparing
|
||||
/// against 0+0i.
|
||||
CK_FloatingComplexToBoolean,
|
||||
|
||||
/// \brief Converts between different floating point complex types.
|
||||
/// _Complex float -> _Complex double
|
||||
CK_FloatingComplexCast,
|
||||
|
||||
/// \brief Converts from a floating complex to an integral complex.
|
||||
/// _Complex float -> _Complex int
|
||||
CK_FloatingComplexToIntegralComplex,
|
||||
|
||||
/// \brief Converts from an integral real to an integral complex
|
||||
/// whose element type matches the source. Injects the value as
|
||||
/// the real component with a zero imaginary component.
|
||||
/// long -> _Complex long
|
||||
CK_IntegralRealToComplex,
|
||||
|
||||
/// \brief Converts an integral complex to an integral real of the
|
||||
/// source's element type by discarding the imaginary component.
|
||||
/// _Complex short -> short
|
||||
CK_IntegralComplexToReal,
|
||||
|
||||
/// \brief Converts an integral complex to bool by comparing against
|
||||
/// 0+0i.
|
||||
CK_IntegralComplexToBoolean,
|
||||
|
||||
/// \brief Converts between different integral complex types.
|
||||
/// _Complex char -> _Complex long long
|
||||
/// _Complex unsigned int -> _Complex signed int
|
||||
CK_IntegralComplexCast,
|
||||
|
||||
/// \brief Converts from an integral complex to a floating complex.
|
||||
/// _Complex unsigned -> _Complex float
|
||||
CK_IntegralComplexToFloatingComplex,
|
||||
|
||||
/// \brief [ARC] Produces a retainable object pointer so that it may
|
||||
/// be consumed, e.g. by being passed to a consuming parameter.
|
||||
/// Calls objc_retain.
|
||||
CK_ARCProduceObject,
|
||||
|
||||
/// \brief [ARC] Consumes a retainable object pointer that has just
|
||||
/// been produced, e.g. as the return value of a retaining call.
|
||||
/// Enters a cleanup to call objc_release at some indefinite time.
|
||||
CK_ARCConsumeObject,
|
||||
|
||||
/// \brief [ARC] Reclaim a retainable object pointer object that may
|
||||
/// have been produced and autoreleased as part of a function return
|
||||
/// sequence.
|
||||
CK_ARCReclaimReturnedObject,
|
||||
|
||||
/// \brief [ARC] Causes a value of block type to be copied to the
|
||||
/// heap, if it is not already there. A number of other operations
|
||||
/// in ARC cause blocks to be copied; this is for cases where that
|
||||
/// would not otherwise be guaranteed, such as when casting to a
|
||||
/// non-block pointer type.
|
||||
CK_ARCExtendBlockObject,
|
||||
|
||||
/// \brief Converts from _Atomic(T) to T.
|
||||
CK_AtomicToNonAtomic,
|
||||
/// \brief Converts from T to _Atomic(T).
|
||||
CK_NonAtomicToAtomic,
|
||||
|
||||
/// \brief Causes a block literal to by copied to the heap and then
|
||||
/// autoreleased.
|
||||
///
|
||||
/// This particular cast kind is used for the conversion from a C++11
|
||||
/// lambda expression to a block pointer.
|
||||
CK_CopyAndAutoreleaseBlockObject,
|
||||
|
||||
// Convert a builtin function to a function pointer; only allowed in the
|
||||
// callee of a call expression.
|
||||
CK_BuiltinFnToFnPtr,
|
||||
|
||||
// Convert a zero value for OpenCL event_t initialization.
|
||||
CK_ZeroToOCLEvent,
|
||||
|
||||
// Convert a pointer to a different address space.
|
||||
CK_AddressSpaceConversion
|
||||
#define CAST_OPERATION(Name) CK_##Name,
|
||||
#include "clang/AST/OperationKinds.def"
|
||||
};
|
||||
|
||||
static const CastKind CK_Invalid = static_cast<CastKind>(-1);
|
||||
|
||||
enum BinaryOperatorKind {
|
||||
// Operators listed in order of precedence.
|
||||
// Note that additions to this should also update the StmtVisitor class.
|
||||
BO_PtrMemD, BO_PtrMemI, // [C++ 5.5] Pointer-to-member operators.
|
||||
BO_Mul, BO_Div, BO_Rem, // [C99 6.5.5] Multiplicative operators.
|
||||
BO_Add, BO_Sub, // [C99 6.5.6] Additive operators.
|
||||
BO_Shl, BO_Shr, // [C99 6.5.7] Bitwise shift operators.
|
||||
BO_LT, BO_GT, BO_LE, BO_GE, // [C99 6.5.8] Relational operators.
|
||||
BO_EQ, BO_NE, // [C99 6.5.9] Equality operators.
|
||||
BO_And, // [C99 6.5.10] Bitwise AND operator.
|
||||
BO_Xor, // [C99 6.5.11] Bitwise XOR operator.
|
||||
BO_Or, // [C99 6.5.12] Bitwise OR operator.
|
||||
BO_LAnd, // [C99 6.5.13] Logical AND operator.
|
||||
BO_LOr, // [C99 6.5.14] Logical OR operator.
|
||||
BO_Assign, BO_MulAssign, // [C99 6.5.16] Assignment operators.
|
||||
BO_DivAssign, BO_RemAssign,
|
||||
BO_AddAssign, BO_SubAssign,
|
||||
BO_ShlAssign, BO_ShrAssign,
|
||||
BO_AndAssign, BO_XorAssign,
|
||||
BO_OrAssign,
|
||||
BO_Comma // [C99 6.5.17] Comma operator.
|
||||
#define BINARY_OPERATION(Name, Spelling) BO_##Name,
|
||||
#include "clang/AST/OperationKinds.def"
|
||||
};
|
||||
|
||||
enum UnaryOperatorKind {
|
||||
// Note that additions to this should also update the StmtVisitor class.
|
||||
UO_PostInc, UO_PostDec, // [C99 6.5.2.4] Postfix increment and decrement
|
||||
UO_PreInc, UO_PreDec, // [C99 6.5.3.1] Prefix increment and decrement
|
||||
UO_AddrOf, UO_Deref, // [C99 6.5.3.2] Address and indirection
|
||||
UO_Plus, UO_Minus, // [C99 6.5.3.3] Unary arithmetic
|
||||
UO_Not, UO_LNot, // [C99 6.5.3.3] Unary arithmetic
|
||||
UO_Real, UO_Imag, // "__real expr"/"__imag expr" Extension.
|
||||
UO_Extension, // __extension__ marker.
|
||||
UO_Coawait // [C++ Coroutines] co_await operator
|
||||
#define UNARY_OPERATION(Name, Spelling) UO_##Name,
|
||||
#include "clang/AST/OperationKinds.def"
|
||||
};
|
||||
|
||||
/// \brief The kind of bridging performed by the Objective-C bridge cast.
|
||||
|
|
@ -355,6 +48,6 @@ enum ObjCBridgeCastKind {
|
|||
OBC_BridgeRetained
|
||||
};
|
||||
|
||||
}
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -32,20 +32,35 @@ public:
|
|||
|
||||
/// \brief Describes how types, statements, expressions, and
|
||||
/// declarations should be printed.
|
||||
///
|
||||
/// This type is intended to be small and suitable for passing by value.
|
||||
/// It is very frequently copied.
|
||||
struct PrintingPolicy {
|
||||
/// \brief Create a default printing policy for C.
|
||||
/// \brief Create a default printing policy for the specified language.
|
||||
PrintingPolicy(const LangOptions &LO)
|
||||
: LangOpts(LO), Indentation(2), SuppressSpecifiers(false),
|
||||
SuppressTagKeyword(false), SuppressTag(false), SuppressScope(false),
|
||||
: Indentation(2), SuppressSpecifiers(false),
|
||||
SuppressTagKeyword(LO.CPlusPlus),
|
||||
IncludeTagDefinition(false), SuppressScope(false),
|
||||
SuppressUnwrittenScope(false), SuppressInitializers(false),
|
||||
ConstantArraySizeAsWritten(false), AnonymousTagLocations(true),
|
||||
SuppressStrongLifetime(false), SuppressLifetimeQualifiers(false),
|
||||
Bool(LO.Bool), TerseOutput(false), PolishForDeclaration(false),
|
||||
SuppressTemplateArgsInCXXConstructors(false),
|
||||
Bool(LO.Bool), Restrict(LO.C99),
|
||||
Alignof(LO.CPlusPlus11), UnderscoreAlignof(LO.C11),
|
||||
UseVoidForZeroParams(!LO.CPlusPlus),
|
||||
TerseOutput(false), PolishForDeclaration(false),
|
||||
Half(LO.Half), MSWChar(LO.MicrosoftExt && !LO.WChar),
|
||||
IncludeNewlines(true), MSVCFormatting(false) { }
|
||||
|
||||
/// \brief What language we're printing.
|
||||
LangOptions LangOpts;
|
||||
/// \brief Adjust this printing policy for cases where it's known that
|
||||
/// we're printing C++ code (for instance, if AST dumping reaches a
|
||||
/// C++-only construct). This should not be used if a real LangOptions
|
||||
/// object is available.
|
||||
void adjustForCPlusPlus() {
|
||||
SuppressTagKeyword = true;
|
||||
Bool = true;
|
||||
UseVoidForZeroParams = false;
|
||||
}
|
||||
|
||||
/// \brief The number of spaces to use to indent each line.
|
||||
unsigned Indentation : 8;
|
||||
|
|
@ -76,15 +91,15 @@ struct PrintingPolicy {
|
|||
/// \endcode
|
||||
bool SuppressTagKeyword : 1;
|
||||
|
||||
/// \brief Whether type printing should skip printing the actual tag type.
|
||||
/// \brief When true, include the body of a tag definition.
|
||||
///
|
||||
/// This is used when the caller needs to print a tag definition in front
|
||||
/// of the type, as in constructs like the following:
|
||||
/// This is used to place the definition of a struct
|
||||
/// in the middle of another declaration as with:
|
||||
///
|
||||
/// \code
|
||||
/// typedef struct { int x, y; } Point;
|
||||
/// \endcode
|
||||
bool SuppressTag : 1;
|
||||
bool IncludeTagDefinition : 1;
|
||||
|
||||
/// \brief Suppresses printing of scope specifiers.
|
||||
bool SuppressScope : 1;
|
||||
|
|
@ -136,11 +151,28 @@ struct PrintingPolicy {
|
|||
/// \brief When true, suppress printing of lifetime qualifier in
|
||||
/// ARC.
|
||||
unsigned SuppressLifetimeQualifiers : 1;
|
||||
|
||||
/// \brief Whether we can use 'bool' rather than '_Bool', even if the language
|
||||
/// doesn't actually have 'bool' (because, e.g., it is defined as a macro).
|
||||
|
||||
/// When true, suppresses printing template arguments in names of C++
|
||||
/// constructors.
|
||||
unsigned SuppressTemplateArgsInCXXConstructors : 1;
|
||||
|
||||
/// \brief Whether we can use 'bool' rather than '_Bool' (even if the language
|
||||
/// doesn't actually have 'bool', because, e.g., it is defined as a macro).
|
||||
unsigned Bool : 1;
|
||||
|
||||
/// \brief Whether we can use 'restrict' rather than '__restrict'.
|
||||
unsigned Restrict : 1;
|
||||
|
||||
/// \brief Whether we can use 'alignof' rather than '__alignof'.
|
||||
unsigned Alignof : 1;
|
||||
|
||||
/// \brief Whether we can use '_Alignof' rather than '__alignof'.
|
||||
unsigned UnderscoreAlignof : 1;
|
||||
|
||||
/// \brief Whether we should use '(void)' rather than '()' for a function
|
||||
/// prototype with zero parameters.
|
||||
unsigned UseVoidForZeroParams : 1;
|
||||
|
||||
/// \brief Provide a 'terse' output.
|
||||
///
|
||||
/// For example, in this mode we don't print function bodies, class members,
|
||||
|
|
|
|||
|
|
@ -71,10 +71,7 @@ private:
|
|||
CharUnits RequiredAlignment;
|
||||
|
||||
/// FieldOffsets - Array of field offsets in bits.
|
||||
uint64_t *FieldOffsets;
|
||||
|
||||
// FieldCount - Number of fields.
|
||||
unsigned FieldCount;
|
||||
ASTVector<uint64_t> FieldOffsets;
|
||||
|
||||
/// CXXRecordLayoutInfo - Contains C++ specific layout information.
|
||||
struct CXXRecordLayoutInfo {
|
||||
|
|
@ -104,10 +101,10 @@ private:
|
|||
/// a primary base class.
|
||||
bool HasExtendableVFPtr : 1;
|
||||
|
||||
/// HasZeroSizedSubObject - True if this class contains a zero sized member
|
||||
/// or base or a base with a zero sized member or base. Only used for
|
||||
/// MS-ABI.
|
||||
bool HasZeroSizedSubObject : 1;
|
||||
/// EndsWithZeroSizedObject - True if this class contains a zero sized
|
||||
/// member or base or a base with a zero sized member or base.
|
||||
/// Only used for MS-ABI.
|
||||
bool EndsWithZeroSizedObject : 1;
|
||||
|
||||
/// \brief True if this class is zero sized or first base is zero sized or
|
||||
/// has this property. Only used for MS-ABI.
|
||||
|
|
@ -136,9 +133,8 @@ private:
|
|||
friend class ASTContext;
|
||||
|
||||
ASTRecordLayout(const ASTContext &Ctx, CharUnits size, CharUnits alignment,
|
||||
CharUnits requiredAlignment,
|
||||
CharUnits datasize, const uint64_t *fieldoffsets,
|
||||
unsigned fieldcount);
|
||||
CharUnits requiredAlignment, CharUnits datasize,
|
||||
ArrayRef<uint64_t> fieldoffsets);
|
||||
|
||||
// Constructor for C++ records.
|
||||
typedef CXXRecordLayoutInfo::BaseOffsetsMapTy BaseOffsetsMapTy;
|
||||
|
|
@ -148,13 +144,13 @@ private:
|
|||
bool hasOwnVFPtr, bool hasExtendableVFPtr,
|
||||
CharUnits vbptroffset,
|
||||
CharUnits datasize,
|
||||
const uint64_t *fieldoffsets, unsigned fieldcount,
|
||||
ArrayRef<uint64_t> fieldoffsets,
|
||||
CharUnits nonvirtualsize, CharUnits nonvirtualalignment,
|
||||
CharUnits SizeOfLargestEmptySubobject,
|
||||
const CXXRecordDecl *PrimaryBase,
|
||||
bool IsPrimaryBaseVirtual,
|
||||
const CXXRecordDecl *BaseSharingVBPtr,
|
||||
bool HasZeroSizedSubObject,
|
||||
bool EndsWithZeroSizedObject,
|
||||
bool LeadsWithZeroSizedBase,
|
||||
const BaseOffsetsMapTy& BaseOffsets,
|
||||
const VBaseOffsetsMapTy& VBaseOffsets);
|
||||
|
|
@ -174,12 +170,11 @@ public:
|
|||
CharUnits getSize() const { return Size; }
|
||||
|
||||
/// getFieldCount - Get the number of fields in the layout.
|
||||
unsigned getFieldCount() const { return FieldCount; }
|
||||
unsigned getFieldCount() const { return FieldOffsets.size(); }
|
||||
|
||||
/// getFieldOffset - Get the offset of the given field index, in
|
||||
/// bits.
|
||||
uint64_t getFieldOffset(unsigned FieldNo) const {
|
||||
assert (FieldNo < FieldCount && "Invalid Field No");
|
||||
return FieldOffsets[FieldNo];
|
||||
}
|
||||
|
||||
|
|
@ -283,8 +278,8 @@ public:
|
|||
return RequiredAlignment;
|
||||
}
|
||||
|
||||
bool hasZeroSizedSubObject() const {
|
||||
return CXXInfo && CXXInfo->HasZeroSizedSubObject;
|
||||
bool endsWithZeroSizedObject() const {
|
||||
return CXXInfo && CXXInfo->EndsWithZeroSizedObject;
|
||||
}
|
||||
|
||||
bool leadsWithZeroSizedBase() const {
|
||||
|
|
|
|||
|
|
@ -72,8 +72,8 @@ namespace clang {
|
|||
return false; \
|
||||
} while (0)
|
||||
|
||||
/// \brief A class that does preorder depth-first traversal on the
|
||||
/// entire Clang AST and visits each node.
|
||||
/// \brief A class that does preordor or postorder
|
||||
/// depth-first traversal on the entire Clang AST and visits each node.
|
||||
///
|
||||
/// This class performs three distinct tasks:
|
||||
/// 1. traverse the AST (i.e. go to each node);
|
||||
|
|
@ -133,13 +133,19 @@ namespace clang {
|
|||
/// to return true, in which case all known implicit and explicit
|
||||
/// instantiations will be visited at the same time as the pattern
|
||||
/// from which they were produced.
|
||||
///
|
||||
/// By default, this visitor preorder traverses the AST. If postorder traversal
|
||||
/// is needed, the \c shouldTraversePostOrder method needs to be overriden
|
||||
/// to return \c true.
|
||||
template <typename Derived> class RecursiveASTVisitor {
|
||||
public:
|
||||
/// A queue used for performing data recursion over statements.
|
||||
/// Parameters involving this type are used to implement data
|
||||
/// recursion over Stmts and Exprs within this class, and should
|
||||
/// typically not be explicitly specified by derived classes.
|
||||
typedef SmallVectorImpl<Stmt *> DataRecursionQueue;
|
||||
/// The bool bit indicates whether the statement has been traversed or not.
|
||||
typedef SmallVectorImpl<llvm::PointerIntPair<Stmt *, 1, bool>>
|
||||
DataRecursionQueue;
|
||||
|
||||
/// \brief Return a reference to the derived class.
|
||||
Derived &getDerived() { return *static_cast<Derived *>(this); }
|
||||
|
|
@ -156,6 +162,9 @@ public:
|
|||
/// code, e.g., implicit constructors and destructors.
|
||||
bool shouldVisitImplicitCode() const { return false; }
|
||||
|
||||
/// \brief Return whether this visitor should traverse post-order.
|
||||
bool shouldTraversePostOrder() const { return false; }
|
||||
|
||||
/// \brief Recursively visit a statement or expression, by
|
||||
/// dispatching to Traverse*() based on the argument's dynamic type.
|
||||
///
|
||||
|
|
@ -163,6 +172,18 @@ public:
|
|||
/// otherwise (including when the argument is nullptr).
|
||||
bool TraverseStmt(Stmt *S, DataRecursionQueue *Queue = nullptr);
|
||||
|
||||
/// Invoked before visiting a statement or expression via data recursion.
|
||||
///
|
||||
/// \returns false to skip visiting the node, true otherwise.
|
||||
bool dataTraverseStmtPre(Stmt *S) { return true; }
|
||||
|
||||
/// Invoked after visiting a statement or expression via data recursion.
|
||||
/// This is not invoked if the previously invoked \c dataTraverseStmtPre
|
||||
/// returned false.
|
||||
///
|
||||
/// \returns false if the visitation was terminated early, true otherwise.
|
||||
bool dataTraverseStmtPost(Stmt *S) { return true; }
|
||||
|
||||
/// \brief Recursively visit a type, by dispatching to
|
||||
/// Traverse*Type() based on the argument's getTypeClass() property.
|
||||
///
|
||||
|
|
@ -335,7 +356,7 @@ public:
|
|||
bool TraverseUnary##NAME(UnaryOperator *S, \
|
||||
DataRecursionQueue *Queue = nullptr) { \
|
||||
TRY_TO(WalkUpFromUnary##NAME(S)); \
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getSubExpr()); \
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getSubExpr()); \
|
||||
return true; \
|
||||
} \
|
||||
bool WalkUpFromUnary##NAME(UnaryOperator *S) { \
|
||||
|
|
@ -353,9 +374,10 @@ public:
|
|||
// (they're all opcodes in BinaryOperator) but do have visitors.
|
||||
#define GENERAL_BINOP_FALLBACK(NAME, BINOP_TYPE) \
|
||||
bool TraverseBin##NAME(BINOP_TYPE *S, DataRecursionQueue *Queue = nullptr) { \
|
||||
TRY_TO(WalkUpFromBin##NAME(S)); \
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getLHS()); \
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getRHS()); \
|
||||
if (!getDerived().shouldTraversePostOrder()) \
|
||||
TRY_TO(WalkUpFromBin##NAME(S)); \
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getLHS()); \
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getRHS()); \
|
||||
return true; \
|
||||
} \
|
||||
bool WalkUpFromBin##NAME(BINOP_TYPE *S) { \
|
||||
|
|
@ -480,8 +502,12 @@ private:
|
|||
#include "clang/Basic/OpenMPKinds.def"
|
||||
/// \brief Process clauses with list of variables.
|
||||
template <typename T> bool VisitOMPClauseList(T *Node);
|
||||
/// Process clauses with pre-initis.
|
||||
bool VisitOMPClauseWithPreInit(OMPClauseWithPreInit *Node);
|
||||
bool VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *Node);
|
||||
|
||||
bool dataTraverseNode(Stmt *S, DataRecursionQueue *Queue);
|
||||
bool PostVisitStmt(Stmt *S);
|
||||
};
|
||||
|
||||
template <typename Derived>
|
||||
|
|
@ -539,6 +565,24 @@ bool RecursiveASTVisitor<Derived>::dataTraverseNode(Stmt *S,
|
|||
|
||||
#undef DISPATCH_STMT
|
||||
|
||||
|
||||
template <typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::PostVisitStmt(Stmt *S) {
|
||||
switch (S->getStmtClass()) {
|
||||
case Stmt::NoStmtClass:
|
||||
break;
|
||||
#define ABSTRACT_STMT(STMT)
|
||||
#define STMT(CLASS, PARENT) \
|
||||
case Stmt::CLASS##Class: \
|
||||
TRY_TO(WalkUpFrom##CLASS(static_cast<CLASS *>(S))); break;
|
||||
#include "clang/AST/StmtNodes.inc"
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#undef DISPATCH_STMT
|
||||
|
||||
template <typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::TraverseStmt(Stmt *S,
|
||||
DataRecursionQueue *Queue) {
|
||||
|
|
@ -546,20 +590,35 @@ bool RecursiveASTVisitor<Derived>::TraverseStmt(Stmt *S,
|
|||
return true;
|
||||
|
||||
if (Queue) {
|
||||
Queue->push_back(S);
|
||||
Queue->push_back({S, false});
|
||||
return true;
|
||||
}
|
||||
|
||||
SmallVector<Stmt *, 8> LocalQueue;
|
||||
LocalQueue.push_back(S);
|
||||
SmallVector<llvm::PointerIntPair<Stmt *, 1, bool>, 8> LocalQueue;
|
||||
LocalQueue.push_back({S, false});
|
||||
|
||||
while (!LocalQueue.empty()) {
|
||||
Stmt *CurrS = LocalQueue.pop_back_val();
|
||||
auto &CurrSAndVisited = LocalQueue.back();
|
||||
Stmt *CurrS = CurrSAndVisited.getPointer();
|
||||
bool Visited = CurrSAndVisited.getInt();
|
||||
if (Visited) {
|
||||
LocalQueue.pop_back();
|
||||
TRY_TO(dataTraverseStmtPost(CurrS));
|
||||
if (getDerived().shouldTraversePostOrder()) {
|
||||
TRY_TO(PostVisitStmt(CurrS));
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
size_t N = LocalQueue.size();
|
||||
TRY_TO(dataTraverseNode(CurrS, &LocalQueue));
|
||||
// Process new children in the order they were added.
|
||||
std::reverse(LocalQueue.begin() + N, LocalQueue.end());
|
||||
if (getDerived().dataTraverseStmtPre(CurrS)) {
|
||||
CurrSAndVisited.setInt(true);
|
||||
size_t N = LocalQueue.size();
|
||||
TRY_TO(dataTraverseNode(CurrS, &LocalQueue));
|
||||
// Process new children in the order they were added.
|
||||
std::reverse(LocalQueue.begin() + N, LocalQueue.end());
|
||||
} else {
|
||||
LocalQueue.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
@ -809,6 +868,17 @@ bool RecursiveASTVisitor<Derived>::TraverseConstructorInitializer(
|
|||
|
||||
if (Init->isWritten() || getDerived().shouldVisitImplicitCode())
|
||||
TRY_TO(TraverseStmt(Init->getInit()));
|
||||
|
||||
if (getDerived().shouldVisitImplicitCode())
|
||||
// The braces for this one-line loop are required for MSVC2013. It
|
||||
// refuses to compile
|
||||
// for (int i : int_vec)
|
||||
// do {} while(false);
|
||||
// without braces on the for loop.
|
||||
for (VarDecl *VD : Init->getArrayIndices()) {
|
||||
TRY_TO(TraverseDecl(VD));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -834,8 +904,11 @@ bool RecursiveASTVisitor<Derived>::TraverseLambdaBody(
|
|||
#define DEF_TRAVERSE_TYPE(TYPE, CODE) \
|
||||
template <typename Derived> \
|
||||
bool RecursiveASTVisitor<Derived>::Traverse##TYPE(TYPE *T) { \
|
||||
TRY_TO(WalkUpFrom##TYPE(T)); \
|
||||
if (!getDerived().shouldTraversePostOrder()) \
|
||||
TRY_TO(WalkUpFrom##TYPE(T)); \
|
||||
{ CODE; } \
|
||||
if (getDerived().shouldTraversePostOrder()) \
|
||||
TRY_TO(WalkUpFrom##TYPE(T)); \
|
||||
return true; \
|
||||
}
|
||||
|
||||
|
|
@ -1238,10 +1311,16 @@ bool RecursiveASTVisitor<Derived>::TraverseDeclContextHelper(DeclContext *DC) {
|
|||
#define DEF_TRAVERSE_DECL(DECL, CODE) \
|
||||
template <typename Derived> \
|
||||
bool RecursiveASTVisitor<Derived>::Traverse##DECL(DECL *D) { \
|
||||
TRY_TO(WalkUpFrom##DECL(D)); \
|
||||
bool ShouldVisitChildren = true; \
|
||||
bool ReturnValue = true; \
|
||||
if (!getDerived().shouldTraversePostOrder()) \
|
||||
TRY_TO(WalkUpFrom##DECL(D)); \
|
||||
{ CODE; } \
|
||||
TRY_TO(TraverseDeclContextHelper(dyn_cast<DeclContext>(D))); \
|
||||
return true; \
|
||||
if (ReturnValue && ShouldVisitChildren) \
|
||||
TRY_TO(TraverseDeclContextHelper(dyn_cast<DeclContext>(D))); \
|
||||
if (ReturnValue && getDerived().shouldTraversePostOrder()) \
|
||||
TRY_TO(WalkUpFrom##DECL(D)); \
|
||||
return ReturnValue; \
|
||||
}
|
||||
|
||||
DEF_TRAVERSE_DECL(AccessSpecDecl, {})
|
||||
|
|
@ -1255,18 +1334,12 @@ DEF_TRAVERSE_DECL(BlockDecl, {
|
|||
TRY_TO(TraverseStmt(I.getCopyExpr()));
|
||||
}
|
||||
}
|
||||
// This return statement makes sure the traversal of nodes in
|
||||
// decls_begin()/decls_end() (done in the DEF_TRAVERSE_DECL macro)
|
||||
// is skipped - don't remove it.
|
||||
return true;
|
||||
ShouldVisitChildren = false;
|
||||
})
|
||||
|
||||
DEF_TRAVERSE_DECL(CapturedDecl, {
|
||||
TRY_TO(TraverseStmt(D->getBody()));
|
||||
// This return statement makes sure the traversal of nodes in
|
||||
// decls_begin()/decls_end() (done in the DEF_TRAVERSE_DECL macro)
|
||||
// is skipped - don't remove it.
|
||||
return true;
|
||||
ShouldVisitChildren = false;
|
||||
})
|
||||
|
||||
DEF_TRAVERSE_DECL(EmptyDecl, {})
|
||||
|
|
@ -1325,6 +1398,10 @@ DEF_TRAVERSE_DECL(
|
|||
// D->getAnonymousNamespace().
|
||||
})
|
||||
|
||||
DEF_TRAVERSE_DECL(PragmaCommentDecl, {})
|
||||
|
||||
DEF_TRAVERSE_DECL(PragmaDetectMismatchDecl, {})
|
||||
|
||||
DEF_TRAVERSE_DECL(ExternCContextDecl, {})
|
||||
|
||||
DEF_TRAVERSE_DECL(NamespaceAliasDecl, {
|
||||
|
|
@ -1332,11 +1409,7 @@ DEF_TRAVERSE_DECL(NamespaceAliasDecl, {
|
|||
|
||||
// We shouldn't traverse an aliased namespace, since it will be
|
||||
// defined (and, therefore, traversed) somewhere else.
|
||||
//
|
||||
// This return statement makes sure the traversal of nodes in
|
||||
// decls_begin()/decls_end() (done in the DEF_TRAVERSE_DECL macro)
|
||||
// is skipped - don't remove it.
|
||||
return true;
|
||||
ShouldVisitChildren = false;
|
||||
})
|
||||
|
||||
DEF_TRAVERSE_DECL(LabelDecl, {// There is no code in a LabelDecl.
|
||||
|
|
@ -1385,14 +1458,13 @@ DEF_TRAVERSE_DECL(ObjCMethodDecl, {
|
|||
if (D->getReturnTypeSourceInfo()) {
|
||||
TRY_TO(TraverseTypeLoc(D->getReturnTypeSourceInfo()->getTypeLoc()));
|
||||
}
|
||||
for (ObjCMethodDecl::param_iterator I = D->param_begin(), E = D->param_end();
|
||||
I != E; ++I) {
|
||||
TRY_TO(TraverseDecl(*I));
|
||||
for (ParmVarDecl *Parameter : D->parameters()) {
|
||||
TRY_TO(TraverseDecl(Parameter));
|
||||
}
|
||||
if (D->isThisDeclarationADefinition()) {
|
||||
TRY_TO(TraverseStmt(D->getBody()));
|
||||
}
|
||||
return true;
|
||||
ShouldVisitChildren = false;
|
||||
})
|
||||
|
||||
DEF_TRAVERSE_DECL(ObjCTypeParamDecl, {
|
||||
|
|
@ -1409,7 +1481,7 @@ DEF_TRAVERSE_DECL(ObjCPropertyDecl, {
|
|||
TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
|
||||
else
|
||||
TRY_TO(TraverseType(D->getType()));
|
||||
return true;
|
||||
ShouldVisitChildren = false;
|
||||
})
|
||||
|
||||
DEF_TRAVERSE_DECL(UsingDecl, {
|
||||
|
|
@ -1423,12 +1495,24 @@ DEF_TRAVERSE_DECL(UsingDirectiveDecl, {
|
|||
|
||||
DEF_TRAVERSE_DECL(UsingShadowDecl, {})
|
||||
|
||||
DEF_TRAVERSE_DECL(ConstructorUsingShadowDecl, {})
|
||||
|
||||
DEF_TRAVERSE_DECL(OMPThreadPrivateDecl, {
|
||||
for (auto *I : D->varlists()) {
|
||||
TRY_TO(TraverseStmt(I));
|
||||
}
|
||||
})
|
||||
|
||||
DEF_TRAVERSE_DECL(OMPDeclareReductionDecl, {
|
||||
TRY_TO(TraverseStmt(D->getCombiner()));
|
||||
if (auto *Initializer = D->getInitializer())
|
||||
TRY_TO(TraverseStmt(Initializer));
|
||||
TRY_TO(TraverseType(D->getType()));
|
||||
return true;
|
||||
})
|
||||
|
||||
DEF_TRAVERSE_DECL(OMPCapturedExprDecl, { TRY_TO(TraverseVarHelper(D)); })
|
||||
|
||||
// A helper method for TemplateDecl's children.
|
||||
template <typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::TraverseTemplateParameterListHelper(
|
||||
|
|
@ -1778,10 +1862,9 @@ bool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(FunctionDecl *D) {
|
|||
// if the traverser is visiting implicit code. Parameter variable
|
||||
// declarations do not have valid TypeSourceInfo, so to visit them
|
||||
// we need to traverse the declarations explicitly.
|
||||
for (FunctionDecl::param_const_iterator I = D->param_begin(),
|
||||
E = D->param_end();
|
||||
I != E; ++I)
|
||||
TRY_TO(TraverseDecl(*I));
|
||||
for (ParmVarDecl *Parameter : D->parameters()) {
|
||||
TRY_TO(TraverseDecl(Parameter));
|
||||
}
|
||||
}
|
||||
|
||||
if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(D)) {
|
||||
|
|
@ -1800,19 +1883,22 @@ bool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(FunctionDecl *D) {
|
|||
DEF_TRAVERSE_DECL(FunctionDecl, {
|
||||
// We skip decls_begin/decls_end, which are already covered by
|
||||
// TraverseFunctionHelper().
|
||||
return TraverseFunctionHelper(D);
|
||||
ShouldVisitChildren = false;
|
||||
ReturnValue = TraverseFunctionHelper(D);
|
||||
})
|
||||
|
||||
DEF_TRAVERSE_DECL(CXXMethodDecl, {
|
||||
// We skip decls_begin/decls_end, which are already covered by
|
||||
// TraverseFunctionHelper().
|
||||
return TraverseFunctionHelper(D);
|
||||
ShouldVisitChildren = false;
|
||||
ReturnValue = TraverseFunctionHelper(D);
|
||||
})
|
||||
|
||||
DEF_TRAVERSE_DECL(CXXConstructorDecl, {
|
||||
// We skip decls_begin/decls_end, which are already covered by
|
||||
// TraverseFunctionHelper().
|
||||
return TraverseFunctionHelper(D);
|
||||
ShouldVisitChildren = false;
|
||||
ReturnValue = TraverseFunctionHelper(D);
|
||||
})
|
||||
|
||||
// CXXConversionDecl is the declaration of a type conversion operator.
|
||||
|
|
@ -1820,13 +1906,15 @@ DEF_TRAVERSE_DECL(CXXConstructorDecl, {
|
|||
DEF_TRAVERSE_DECL(CXXConversionDecl, {
|
||||
// We skip decls_begin/decls_end, which are already covered by
|
||||
// TraverseFunctionHelper().
|
||||
return TraverseFunctionHelper(D);
|
||||
ShouldVisitChildren = false;
|
||||
ReturnValue = TraverseFunctionHelper(D);
|
||||
})
|
||||
|
||||
DEF_TRAVERSE_DECL(CXXDestructorDecl, {
|
||||
// We skip decls_begin/decls_end, which are already covered by
|
||||
// TraverseFunctionHelper().
|
||||
return TraverseFunctionHelper(D);
|
||||
ShouldVisitChildren = false;
|
||||
ReturnValue = TraverseFunctionHelper(D);
|
||||
})
|
||||
|
||||
template <typename Derived>
|
||||
|
|
@ -1878,12 +1966,19 @@ DEF_TRAVERSE_DECL(ParmVarDecl, {
|
|||
template <typename Derived> \
|
||||
bool RecursiveASTVisitor<Derived>::Traverse##STMT( \
|
||||
STMT *S, DataRecursionQueue *Queue) { \
|
||||
TRY_TO(WalkUpFrom##STMT(S)); \
|
||||
bool ShouldVisitChildren = true; \
|
||||
bool ReturnValue = true; \
|
||||
if (!getDerived().shouldTraversePostOrder()) \
|
||||
TRY_TO(WalkUpFrom##STMT(S)); \
|
||||
{ CODE; } \
|
||||
for (Stmt *SubStmt : S->children()) { \
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(SubStmt); \
|
||||
if (ShouldVisitChildren) { \
|
||||
for (Stmt *SubStmt : S->children()) { \
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(SubStmt); \
|
||||
} \
|
||||
} \
|
||||
return true; \
|
||||
if (!Queue && ReturnValue && getDerived().shouldTraversePostOrder()) \
|
||||
TRY_TO(WalkUpFrom##STMT(S)); \
|
||||
return ReturnValue; \
|
||||
}
|
||||
|
||||
DEF_TRAVERSE_STMT(GCCAsmStmt, {
|
||||
|
|
@ -1920,7 +2015,7 @@ DEF_TRAVERSE_STMT(DeclStmt, {
|
|||
// initializer]'. The decls above already traverse over the
|
||||
// initializers, so we don't have to do it again (which
|
||||
// children() would do).
|
||||
return true;
|
||||
ShouldVisitChildren = false;
|
||||
})
|
||||
|
||||
// These non-expr stmts (most of them), do not need any action except
|
||||
|
|
@ -1952,7 +2047,7 @@ DEF_TRAVERSE_STMT(CXXForRangeStmt, {
|
|||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getRangeInit());
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getBody());
|
||||
// Visit everything else only if shouldVisitImplicitCode().
|
||||
return true;
|
||||
ShouldVisitChildren = false;
|
||||
}
|
||||
})
|
||||
DEF_TRAVERSE_STMT(MSDependentExistsStmt, {
|
||||
|
|
@ -2029,7 +2124,11 @@ template <typename Derived>
|
|||
bool RecursiveASTVisitor<Derived>::TraverseSynOrSemInitListExpr(
|
||||
InitListExpr *S, DataRecursionQueue *Queue) {
|
||||
if (S) {
|
||||
TRY_TO(WalkUpFromInitListExpr(S));
|
||||
// Skip this if we traverse postorder. We will visit it later
|
||||
// in PostVisitStmt.
|
||||
if (!getDerived().shouldTraversePostOrder())
|
||||
TRY_TO(WalkUpFromInitListExpr(S));
|
||||
|
||||
// All we need are the default actions. FIXME: use a helper function.
|
||||
for (Stmt *SubStmt : S->children()) {
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(SubStmt);
|
||||
|
|
@ -2049,7 +2148,7 @@ DEF_TRAVERSE_STMT(InitListExpr, {
|
|||
S->isSemanticForm() ? S->getSyntacticForm() : S, Queue));
|
||||
TRY_TO(TraverseSynOrSemInitListExpr(
|
||||
S->isSemanticForm() ? S : S->getSemanticForm(), Queue));
|
||||
return true;
|
||||
ShouldVisitChildren = false;
|
||||
})
|
||||
|
||||
// GenericSelectionExpr is a special case because the types and expressions
|
||||
|
|
@ -2062,7 +2161,7 @@ DEF_TRAVERSE_STMT(GenericSelectionExpr, {
|
|||
TRY_TO(TraverseTypeLoc(TS->getTypeLoc()));
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getAssocExpr(i));
|
||||
}
|
||||
return true;
|
||||
ShouldVisitChildren = false;
|
||||
})
|
||||
|
||||
// PseudoObjectExpr is a special case because of the weirdness with
|
||||
|
|
@ -2077,7 +2176,7 @@ DEF_TRAVERSE_STMT(PseudoObjectExpr, {
|
|||
sub = OVE->getSourceExpr();
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(sub);
|
||||
}
|
||||
return true;
|
||||
ShouldVisitChildren = false;
|
||||
})
|
||||
|
||||
DEF_TRAVERSE_STMT(CXXScalarValueInitExpr, {
|
||||
|
|
@ -2181,7 +2280,8 @@ DEF_TRAVERSE_STMT(LambdaExpr, {
|
|||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(NE);
|
||||
}
|
||||
|
||||
return TRAVERSE_STMT_BASE(LambdaBody, LambdaExpr, S, Queue);
|
||||
ReturnValue = TRAVERSE_STMT_BASE(LambdaBody, LambdaExpr, S, Queue);
|
||||
ShouldVisitChildren = false;
|
||||
})
|
||||
|
||||
DEF_TRAVERSE_STMT(CXXUnresolvedConstructExpr, {
|
||||
|
|
@ -2214,6 +2314,7 @@ DEF_TRAVERSE_STMT(CXXDefaultArgExpr, {})
|
|||
DEF_TRAVERSE_STMT(CXXDefaultInitExpr, {})
|
||||
DEF_TRAVERSE_STMT(CXXDeleteExpr, {})
|
||||
DEF_TRAVERSE_STMT(ExprWithCleanups, {})
|
||||
DEF_TRAVERSE_STMT(CXXInheritedCtorInitExpr, {})
|
||||
DEF_TRAVERSE_STMT(CXXNullPtrLiteralExpr, {})
|
||||
DEF_TRAVERSE_STMT(CXXStdInitializerListExpr, {})
|
||||
DEF_TRAVERSE_STMT(CXXPseudoDestructorExpr, {
|
||||
|
|
@ -2251,6 +2352,7 @@ DEF_TRAVERSE_STMT(ObjCIndirectCopyRestoreExpr, {})
|
|||
DEF_TRAVERSE_STMT(ObjCBridgedCastExpr, {
|
||||
TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
|
||||
})
|
||||
DEF_TRAVERSE_STMT(ObjCAvailabilityCheckExpr, {})
|
||||
DEF_TRAVERSE_STMT(ParenExpr, {})
|
||||
DEF_TRAVERSE_STMT(ParenListExpr, {})
|
||||
DEF_TRAVERSE_STMT(PredefinedExpr, {})
|
||||
|
|
@ -2307,25 +2409,25 @@ DEF_TRAVERSE_STMT(AtomicExpr, {})
|
|||
DEF_TRAVERSE_STMT(CoroutineBodyStmt, {
|
||||
if (!getDerived().shouldVisitImplicitCode()) {
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getBody());
|
||||
return true;
|
||||
ShouldVisitChildren = false;
|
||||
}
|
||||
})
|
||||
DEF_TRAVERSE_STMT(CoreturnStmt, {
|
||||
if (!getDerived().shouldVisitImplicitCode()) {
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getOperand());
|
||||
return true;
|
||||
ShouldVisitChildren = false;
|
||||
}
|
||||
})
|
||||
DEF_TRAVERSE_STMT(CoawaitExpr, {
|
||||
if (!getDerived().shouldVisitImplicitCode()) {
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getOperand());
|
||||
return true;
|
||||
ShouldVisitChildren = false;
|
||||
}
|
||||
})
|
||||
DEF_TRAVERSE_STMT(CoyieldExpr, {
|
||||
if (!getDerived().shouldVisitImplicitCode()) {
|
||||
TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getOperand());
|
||||
return true;
|
||||
ShouldVisitChildren = false;
|
||||
}
|
||||
})
|
||||
|
||||
|
|
@ -2433,9 +2535,24 @@ DEF_TRAVERSE_STMT(OMPTargetDirective,
|
|||
DEF_TRAVERSE_STMT(OMPTargetDataDirective,
|
||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||
|
||||
DEF_TRAVERSE_STMT(OMPTargetEnterDataDirective,
|
||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||
|
||||
DEF_TRAVERSE_STMT(OMPTargetExitDataDirective,
|
||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||
|
||||
DEF_TRAVERSE_STMT(OMPTargetParallelDirective,
|
||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||
|
||||
DEF_TRAVERSE_STMT(OMPTargetParallelForDirective,
|
||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||
|
||||
DEF_TRAVERSE_STMT(OMPTeamsDirective,
|
||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||
|
||||
DEF_TRAVERSE_STMT(OMPTargetUpdateDirective,
|
||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||
|
||||
DEF_TRAVERSE_STMT(OMPTaskLoopDirective,
|
||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||
|
||||
|
|
@ -2445,6 +2562,18 @@ DEF_TRAVERSE_STMT(OMPTaskLoopSimdDirective,
|
|||
DEF_TRAVERSE_STMT(OMPDistributeDirective,
|
||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||
|
||||
DEF_TRAVERSE_STMT(OMPDistributeParallelForDirective,
|
||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||
|
||||
DEF_TRAVERSE_STMT(OMPDistributeParallelForSimdDirective,
|
||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||
|
||||
DEF_TRAVERSE_STMT(OMPDistributeSimdDirective,
|
||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||
|
||||
DEF_TRAVERSE_STMT(OMPTargetParallelForSimdDirective,
|
||||
{ TRY_TO(TraverseOMPExecutableDirective(S)); })
|
||||
|
||||
// OpenMP clauses.
|
||||
template <typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::TraverseOMPClause(OMPClause *C) {
|
||||
|
|
@ -2457,12 +2586,28 @@ bool RecursiveASTVisitor<Derived>::TraverseOMPClause(OMPClause *C) {
|
|||
break;
|
||||
#include "clang/Basic/OpenMPKinds.def"
|
||||
case OMPC_threadprivate:
|
||||
case OMPC_uniform:
|
||||
case OMPC_unknown:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::VisitOMPClauseWithPreInit(
|
||||
OMPClauseWithPreInit *Node) {
|
||||
TRY_TO(TraverseStmt(Node->getPreInitStmt()));
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::VisitOMPClauseWithPostUpdate(
|
||||
OMPClauseWithPostUpdate *Node) {
|
||||
TRY_TO(VisitOMPClauseWithPreInit(Node));
|
||||
TRY_TO(TraverseStmt(Node->getPostUpdateExpr()));
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::VisitOMPIfClause(OMPIfClause *C) {
|
||||
TRY_TO(TraverseStmt(C->getCondition()));
|
||||
|
|
@ -2514,8 +2659,8 @@ bool RecursiveASTVisitor<Derived>::VisitOMPProcBindClause(OMPProcBindClause *) {
|
|||
template <typename Derived>
|
||||
bool
|
||||
RecursiveASTVisitor<Derived>::VisitOMPScheduleClause(OMPScheduleClause *C) {
|
||||
TRY_TO(VisitOMPClauseWithPreInit(C));
|
||||
TRY_TO(TraverseStmt(C->getChunkSize()));
|
||||
TRY_TO(TraverseStmt(C->getHelperChunkSize()));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -2603,6 +2748,7 @@ template <typename Derived>
|
|||
bool RecursiveASTVisitor<Derived>::VisitOMPFirstprivateClause(
|
||||
OMPFirstprivateClause *C) {
|
||||
TRY_TO(VisitOMPClauseList(C));
|
||||
TRY_TO(VisitOMPClauseWithPreInit(C));
|
||||
for (auto *E : C->private_copies()) {
|
||||
TRY_TO(TraverseStmt(E));
|
||||
}
|
||||
|
|
@ -2616,6 +2762,7 @@ template <typename Derived>
|
|||
bool RecursiveASTVisitor<Derived>::VisitOMPLastprivateClause(
|
||||
OMPLastprivateClause *C) {
|
||||
TRY_TO(VisitOMPClauseList(C));
|
||||
TRY_TO(VisitOMPClauseWithPostUpdate(C));
|
||||
for (auto *E : C->private_copies()) {
|
||||
TRY_TO(TraverseStmt(E));
|
||||
}
|
||||
|
|
@ -2642,6 +2789,7 @@ bool RecursiveASTVisitor<Derived>::VisitOMPLinearClause(OMPLinearClause *C) {
|
|||
TRY_TO(TraverseStmt(C->getStep()));
|
||||
TRY_TO(TraverseStmt(C->getCalcStep()));
|
||||
TRY_TO(VisitOMPClauseList(C));
|
||||
TRY_TO(VisitOMPClauseWithPostUpdate(C));
|
||||
for (auto *E : C->privates()) {
|
||||
TRY_TO(TraverseStmt(E));
|
||||
}
|
||||
|
|
@ -2701,6 +2849,7 @@ RecursiveASTVisitor<Derived>::VisitOMPReductionClause(OMPReductionClause *C) {
|
|||
TRY_TO(TraverseNestedNameSpecifierLoc(C->getQualifierLoc()));
|
||||
TRY_TO(TraverseDeclarationNameInfo(C->getNameInfo()));
|
||||
TRY_TO(VisitOMPClauseList(C));
|
||||
TRY_TO(VisitOMPClauseWithPostUpdate(C));
|
||||
for (auto *E : C->privates()) {
|
||||
TRY_TO(TraverseStmt(E));
|
||||
}
|
||||
|
|
@ -2781,6 +2930,46 @@ bool RecursiveASTVisitor<Derived>::VisitOMPHintClause(OMPHintClause *C) {
|
|||
return true;
|
||||
}
|
||||
|
||||
template <typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::VisitOMPDistScheduleClause(
|
||||
OMPDistScheduleClause *C) {
|
||||
TRY_TO(VisitOMPClauseWithPreInit(C));
|
||||
TRY_TO(TraverseStmt(C->getChunkSize()));
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename Derived>
|
||||
bool
|
||||
RecursiveASTVisitor<Derived>::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::VisitOMPToClause(OMPToClause *C) {
|
||||
TRY_TO(VisitOMPClauseList(C));
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::VisitOMPFromClause(OMPFromClause *C) {
|
||||
TRY_TO(VisitOMPClauseList(C));
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::VisitOMPUseDevicePtrClause(
|
||||
OMPUseDevicePtrClause *C) {
|
||||
TRY_TO(VisitOMPClauseList(C));
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename Derived>
|
||||
bool RecursiveASTVisitor<Derived>::VisitOMPIsDevicePtrClause(
|
||||
OMPIsDevicePtrClause *C) {
|
||||
TRY_TO(VisitOMPClauseList(C));
|
||||
return true;
|
||||
}
|
||||
|
||||
// FIXME: look at the following tricky-seeming exprs to see if we
|
||||
// need to recurse on anything. These are ones that have methods
|
||||
// returning decls or qualtypes or nestednamespecifier -- though I'm
|
||||
|
|
|
|||
|
|
@ -93,6 +93,13 @@ protected:
|
|||
unsigned NumStmts : 32 - NumStmtBits;
|
||||
};
|
||||
|
||||
class IfStmtBitfields {
|
||||
friend class IfStmt;
|
||||
unsigned : NumStmtBits;
|
||||
|
||||
unsigned IsConstexpr : 1;
|
||||
};
|
||||
|
||||
class ExprBitfields {
|
||||
friend class Expr;
|
||||
friend class DeclRefExpr; // computeDependence
|
||||
|
|
@ -115,6 +122,7 @@ protected:
|
|||
friend class OverloadExpr; // ctor
|
||||
friend class PseudoObjectExpr; // ctor
|
||||
friend class AtomicExpr; // ctor
|
||||
friend class OpaqueValueExpr; // ctor
|
||||
unsigned : NumStmtBits;
|
||||
|
||||
unsigned ValueKind : 2;
|
||||
|
|
@ -191,7 +199,10 @@ protected:
|
|||
|
||||
unsigned : NumExprBits;
|
||||
|
||||
unsigned NumObjects : 32 - NumExprBits;
|
||||
// When false, it must not have side effects.
|
||||
unsigned CleanupsHaveSideEffects : 1;
|
||||
|
||||
unsigned NumObjects : 32 - 1 - NumExprBits;
|
||||
};
|
||||
|
||||
class PseudoObjectExprBitfields {
|
||||
|
|
@ -244,6 +255,7 @@ protected:
|
|||
union {
|
||||
StmtBitfields StmtBits;
|
||||
CompoundStmtBitfields CompoundStmtBits;
|
||||
IfStmtBitfields IfStmtBits;
|
||||
ExprBitfields ExprBits;
|
||||
CharacterLiteralBitfields CharacterLiteralBits;
|
||||
FloatingLiteralBitfields FloatingLiteralBits;
|
||||
|
|
@ -867,14 +879,15 @@ public:
|
|||
/// IfStmt - This represents an if/then/else.
|
||||
///
|
||||
class IfStmt : public Stmt {
|
||||
enum { VAR, COND, THEN, ELSE, END_EXPR };
|
||||
enum { INIT, VAR, COND, THEN, ELSE, END_EXPR };
|
||||
Stmt* SubExprs[END_EXPR];
|
||||
|
||||
SourceLocation IfLoc;
|
||||
SourceLocation ElseLoc;
|
||||
|
||||
public:
|
||||
IfStmt(const ASTContext &C, SourceLocation IL, VarDecl *var, Expr *cond,
|
||||
IfStmt(const ASTContext &C, SourceLocation IL,
|
||||
bool IsConstexpr, Stmt *init, VarDecl *var, Expr *cond,
|
||||
Stmt *then, SourceLocation EL = SourceLocation(),
|
||||
Stmt *elsev = nullptr);
|
||||
|
||||
|
|
@ -898,6 +911,9 @@ public:
|
|||
return reinterpret_cast<DeclStmt*>(SubExprs[VAR]);
|
||||
}
|
||||
|
||||
Stmt *getInit() { return SubExprs[INIT]; }
|
||||
const Stmt *getInit() const { return SubExprs[INIT]; }
|
||||
void setInit(Stmt *S) { SubExprs[INIT] = S; }
|
||||
const Expr *getCond() const { return reinterpret_cast<Expr*>(SubExprs[COND]);}
|
||||
void setCond(Expr *E) { SubExprs[COND] = reinterpret_cast<Stmt *>(E); }
|
||||
const Stmt *getThen() const { return SubExprs[THEN]; }
|
||||
|
|
@ -914,6 +930,9 @@ public:
|
|||
SourceLocation getElseLoc() const { return ElseLoc; }
|
||||
void setElseLoc(SourceLocation L) { ElseLoc = L; }
|
||||
|
||||
bool isConstexpr() const { return IfStmtBits.IsConstexpr; }
|
||||
void setConstexpr(bool C) { IfStmtBits.IsConstexpr = C; }
|
||||
|
||||
SourceLocation getLocStart() const LLVM_READONLY { return IfLoc; }
|
||||
SourceLocation getLocEnd() const LLVM_READONLY {
|
||||
if (SubExprs[ELSE])
|
||||
|
|
@ -937,7 +956,7 @@ public:
|
|||
///
|
||||
class SwitchStmt : public Stmt {
|
||||
SourceLocation SwitchLoc;
|
||||
enum { VAR, COND, BODY, END_EXPR };
|
||||
enum { INIT, VAR, COND, BODY, END_EXPR };
|
||||
Stmt* SubExprs[END_EXPR];
|
||||
// This points to a linked list of case and default statements and, if the
|
||||
// SwitchStmt is a switch on an enum value, records whether all the enum
|
||||
|
|
@ -946,7 +965,7 @@ class SwitchStmt : public Stmt {
|
|||
llvm::PointerIntPair<SwitchCase *, 1, bool> FirstCase;
|
||||
|
||||
public:
|
||||
SwitchStmt(const ASTContext &C, VarDecl *Var, Expr *cond);
|
||||
SwitchStmt(const ASTContext &C, Stmt *Init, VarDecl *Var, Expr *cond);
|
||||
|
||||
/// \brief Build a empty switch statement.
|
||||
explicit SwitchStmt(EmptyShell Empty) : Stmt(SwitchStmtClass, Empty) { }
|
||||
|
|
@ -969,6 +988,9 @@ public:
|
|||
return reinterpret_cast<DeclStmt*>(SubExprs[VAR]);
|
||||
}
|
||||
|
||||
Stmt *getInit() { return SubExprs[INIT]; }
|
||||
const Stmt *getInit() const { return SubExprs[INIT]; }
|
||||
void setInit(Stmt *S) { SubExprs[INIT] = S; }
|
||||
const Expr *getCond() const { return reinterpret_cast<Expr*>(SubExprs[COND]);}
|
||||
const Stmt *getBody() const { return SubExprs[BODY]; }
|
||||
const SwitchCase *getSwitchCaseList() const { return FirstCase.getPointer(); }
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ public:
|
|||
/// can be extracted using getLoopVariable and getRangeInit.
|
||||
class CXXForRangeStmt : public Stmt {
|
||||
SourceLocation ForLoc;
|
||||
enum { RANGE, BEGINEND, COND, INC, LOOPVAR, BODY, END };
|
||||
enum { RANGE, BEGINSTMT, ENDSTMT, COND, INC, LOOPVAR, BODY, END };
|
||||
// SubExprs[RANGE] is an expression or declstmt.
|
||||
// SubExprs[COND] and SubExprs[INC] are expressions.
|
||||
Stmt *SubExprs[END];
|
||||
|
|
@ -137,7 +137,7 @@ class CXXForRangeStmt : public Stmt {
|
|||
|
||||
friend class ASTStmtReader;
|
||||
public:
|
||||
CXXForRangeStmt(DeclStmt *Range, DeclStmt *BeginEnd,
|
||||
CXXForRangeStmt(DeclStmt *Range, DeclStmt *Begin, DeclStmt *End,
|
||||
Expr *Cond, Expr *Inc, DeclStmt *LoopVar, Stmt *Body,
|
||||
SourceLocation FL, SourceLocation CAL, SourceLocation CL,
|
||||
SourceLocation RPL);
|
||||
|
|
@ -152,9 +152,10 @@ public:
|
|||
|
||||
|
||||
DeclStmt *getRangeStmt() { return cast<DeclStmt>(SubExprs[RANGE]); }
|
||||
DeclStmt *getBeginEndStmt() {
|
||||
return cast_or_null<DeclStmt>(SubExprs[BEGINEND]);
|
||||
DeclStmt *getBeginStmt() {
|
||||
return cast_or_null<DeclStmt>(SubExprs[BEGINSTMT]);
|
||||
}
|
||||
DeclStmt *getEndStmt() { return cast_or_null<DeclStmt>(SubExprs[ENDSTMT]); }
|
||||
Expr *getCond() { return cast_or_null<Expr>(SubExprs[COND]); }
|
||||
Expr *getInc() { return cast_or_null<Expr>(SubExprs[INC]); }
|
||||
DeclStmt *getLoopVarStmt() { return cast<DeclStmt>(SubExprs[LOOPVAR]); }
|
||||
|
|
@ -163,8 +164,11 @@ public:
|
|||
const DeclStmt *getRangeStmt() const {
|
||||
return cast<DeclStmt>(SubExprs[RANGE]);
|
||||
}
|
||||
const DeclStmt *getBeginEndStmt() const {
|
||||
return cast_or_null<DeclStmt>(SubExprs[BEGINEND]);
|
||||
const DeclStmt *getBeginStmt() const {
|
||||
return cast_or_null<DeclStmt>(SubExprs[BEGINSTMT]);
|
||||
}
|
||||
const DeclStmt *getEndStmt() const {
|
||||
return cast_or_null<DeclStmt>(SubExprs[ENDSTMT]);
|
||||
}
|
||||
const Expr *getCond() const {
|
||||
return cast_or_null<Expr>(SubExprs[COND]);
|
||||
|
|
@ -179,7 +183,8 @@ public:
|
|||
|
||||
void setRangeInit(Expr *E) { SubExprs[RANGE] = reinterpret_cast<Stmt*>(E); }
|
||||
void setRangeStmt(Stmt *S) { SubExprs[RANGE] = S; }
|
||||
void setBeginEndStmt(Stmt *S) { SubExprs[BEGINEND] = S; }
|
||||
void setBeginStmt(Stmt *S) { SubExprs[BEGINSTMT] = S; }
|
||||
void setEndStmt(Stmt *S) { SubExprs[ENDSTMT] = S; }
|
||||
void setCond(Expr *E) { SubExprs[COND] = reinterpret_cast<Stmt*>(E); }
|
||||
void setInc(Expr *E) { SubExprs[INC] = reinterpret_cast<Stmt*>(E); }
|
||||
void setLoopVarStmt(Stmt *S) { SubExprs[LOOPVAR] = S; }
|
||||
|
|
|
|||
|
|
@ -326,7 +326,7 @@ public:
|
|||
Expr *getThrowExpr() { return reinterpret_cast<Expr*>(Throw); }
|
||||
void setThrowExpr(Stmt *S) { Throw = S; }
|
||||
|
||||
SourceLocation getThrowLoc() { return AtThrowLoc; }
|
||||
SourceLocation getThrowLoc() const LLVM_READONLY { return AtThrowLoc; }
|
||||
void setThrowLoc(SourceLocation Loc) { AtThrowLoc = Loc; }
|
||||
|
||||
SourceLocation getLocStart() const LLVM_READONLY { return AtThrowLoc; }
|
||||
|
|
|
|||
|
|
@ -70,8 +70,7 @@ protected:
|
|||
: Stmt(SC), Kind(K), StartLoc(std::move(StartLoc)),
|
||||
EndLoc(std::move(EndLoc)), NumClauses(NumClauses),
|
||||
NumChildren(NumChildren),
|
||||
ClausesOffset(llvm::RoundUpToAlignment(sizeof(T),
|
||||
llvm::alignOf<OMPClause *>())) {}
|
||||
ClausesOffset(llvm::alignTo(sizeof(T), llvm::alignOf<OMPClause *>())) {}
|
||||
|
||||
/// \brief Sets the list of variables for this clause.
|
||||
///
|
||||
|
|
@ -300,9 +299,11 @@ class OMPLoopDirective : public OMPExecutableDirective {
|
|||
/// This enumeration contains offsets to all the pointers to children
|
||||
/// expressions stored in OMPLoopDirective.
|
||||
/// The first 9 children are nesessary for all the loop directives, and
|
||||
/// the next 7 are specific to the worksharing ones.
|
||||
/// the next 10 are specific to the worksharing ones.
|
||||
/// After the fixed children, three arrays of length CollapsedNum are
|
||||
/// allocated: loop counters, their updates and final values.
|
||||
/// PrevLowerBound and PrevUpperBound are used to communicate blocking
|
||||
/// information in composite constructs which require loop blocking
|
||||
///
|
||||
enum {
|
||||
AssociatedStmtOffset = 0,
|
||||
|
|
@ -313,21 +314,25 @@ class OMPLoopDirective : public OMPExecutableDirective {
|
|||
CondOffset = 5,
|
||||
InitOffset = 6,
|
||||
IncOffset = 7,
|
||||
PreInitsOffset = 8,
|
||||
// The '...End' enumerators do not correspond to child expressions - they
|
||||
// specify the offset to the end (and start of the following counters/
|
||||
// updates/finals arrays).
|
||||
DefaultEnd = 8,
|
||||
DefaultEnd = 9,
|
||||
// The following 7 exprs are used by worksharing loops only.
|
||||
IsLastIterVariableOffset = 8,
|
||||
LowerBoundVariableOffset = 9,
|
||||
UpperBoundVariableOffset = 10,
|
||||
StrideVariableOffset = 11,
|
||||
EnsureUpperBoundOffset = 12,
|
||||
NextLowerBoundOffset = 13,
|
||||
NextUpperBoundOffset = 14,
|
||||
IsLastIterVariableOffset = 9,
|
||||
LowerBoundVariableOffset = 10,
|
||||
UpperBoundVariableOffset = 11,
|
||||
StrideVariableOffset = 12,
|
||||
EnsureUpperBoundOffset = 13,
|
||||
NextLowerBoundOffset = 14,
|
||||
NextUpperBoundOffset = 15,
|
||||
NumIterationsOffset = 16,
|
||||
PrevLowerBoundVariableOffset = 17,
|
||||
PrevUpperBoundVariableOffset = 18,
|
||||
// Offset to the end (and start of the following counters/updates/finals
|
||||
// arrays) for worksharing loop directives.
|
||||
WorksharingEnd = 15,
|
||||
WorksharingEnd = 19,
|
||||
};
|
||||
|
||||
/// \brief Get the counters storage.
|
||||
|
|
@ -423,6 +428,9 @@ protected:
|
|||
}
|
||||
void setInit(Expr *Init) { *std::next(child_begin(), InitOffset) = Init; }
|
||||
void setInc(Expr *Inc) { *std::next(child_begin(), IncOffset) = Inc; }
|
||||
void setPreInits(Stmt *PreInits) {
|
||||
*std::next(child_begin(), PreInitsOffset) = PreInits;
|
||||
}
|
||||
void setIsLastIterVariable(Expr *IL) {
|
||||
assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind()) ||
|
||||
|
|
@ -472,6 +480,27 @@ protected:
|
|||
"expected worksharing loop directive");
|
||||
*std::next(child_begin(), NextUpperBoundOffset) = NUB;
|
||||
}
|
||||
void setNumIterations(Expr *NI) {
|
||||
assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind()) ||
|
||||
isOpenMPDistributeDirective(getDirectiveKind())) &&
|
||||
"expected worksharing loop directive");
|
||||
*std::next(child_begin(), NumIterationsOffset) = NI;
|
||||
}
|
||||
void setPrevLowerBoundVariable(Expr *PrevLB) {
|
||||
assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind()) ||
|
||||
isOpenMPDistributeDirective(getDirectiveKind())) &&
|
||||
"expected worksharing loop directive");
|
||||
*std::next(child_begin(), PrevLowerBoundVariableOffset) = PrevLB;
|
||||
}
|
||||
void setPrevUpperBoundVariable(Expr *PrevUB) {
|
||||
assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind()) ||
|
||||
isOpenMPDistributeDirective(getDirectiveKind())) &&
|
||||
"expected worksharing loop directive");
|
||||
*std::next(child_begin(), PrevUpperBoundVariableOffset) = PrevUB;
|
||||
}
|
||||
void setCounters(ArrayRef<Expr *> A);
|
||||
void setPrivateCounters(ArrayRef<Expr *> A);
|
||||
void setInits(ArrayRef<Expr *> A);
|
||||
|
|
@ -512,6 +541,12 @@ public:
|
|||
Expr *NLB;
|
||||
/// \brief Update of UpperBound for statically sheduled 'omp for' loops.
|
||||
Expr *NUB;
|
||||
/// \brief PreviousLowerBound - local variable passed to runtime in the
|
||||
/// enclosing schedule or null if that does not apply.
|
||||
Expr *PrevLB;
|
||||
/// \brief PreviousUpperBound - local variable passed to runtime in the
|
||||
/// enclosing schedule or null if that does not apply.
|
||||
Expr *PrevUB;
|
||||
/// \brief Counters Loop counters.
|
||||
SmallVector<Expr *, 4> Counters;
|
||||
/// \brief PrivateCounters Loop counters.
|
||||
|
|
@ -522,6 +557,8 @@ public:
|
|||
SmallVector<Expr *, 4> Updates;
|
||||
/// \brief Final loop counter values for GodeGen.
|
||||
SmallVector<Expr *, 4> Finals;
|
||||
/// Init statement for all captured expressions.
|
||||
Stmt *PreInits;
|
||||
|
||||
/// \brief Check if all the expressions are built (does not check the
|
||||
/// worksharing ones).
|
||||
|
|
@ -548,6 +585,9 @@ public:
|
|||
EUB = nullptr;
|
||||
NLB = nullptr;
|
||||
NUB = nullptr;
|
||||
NumIterations = nullptr;
|
||||
PrevLB = nullptr;
|
||||
PrevUB = nullptr;
|
||||
Counters.resize(Size);
|
||||
PrivateCounters.resize(Size);
|
||||
Inits.resize(Size);
|
||||
|
|
@ -560,6 +600,7 @@ public:
|
|||
Updates[i] = nullptr;
|
||||
Finals[i] = nullptr;
|
||||
}
|
||||
PreInits = nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -594,55 +635,90 @@ public:
|
|||
return const_cast<Expr *>(
|
||||
reinterpret_cast<const Expr *>(*std::next(child_begin(), IncOffset)));
|
||||
}
|
||||
const Stmt *getPreInits() const {
|
||||
return *std::next(child_begin(), PreInitsOffset);
|
||||
}
|
||||
Stmt *getPreInits() { return *std::next(child_begin(), PreInitsOffset); }
|
||||
Expr *getIsLastIterVariable() const {
|
||||
assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind())) &&
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind()) ||
|
||||
isOpenMPDistributeDirective(getDirectiveKind())) &&
|
||||
"expected worksharing loop directive");
|
||||
return const_cast<Expr *>(reinterpret_cast<const Expr *>(
|
||||
*std::next(child_begin(), IsLastIterVariableOffset)));
|
||||
}
|
||||
Expr *getLowerBoundVariable() const {
|
||||
assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind())) &&
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind()) ||
|
||||
isOpenMPDistributeDirective(getDirectiveKind())) &&
|
||||
"expected worksharing loop directive");
|
||||
return const_cast<Expr *>(reinterpret_cast<const Expr *>(
|
||||
*std::next(child_begin(), LowerBoundVariableOffset)));
|
||||
}
|
||||
Expr *getUpperBoundVariable() const {
|
||||
assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind())) &&
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind()) ||
|
||||
isOpenMPDistributeDirective(getDirectiveKind())) &&
|
||||
"expected worksharing loop directive");
|
||||
return const_cast<Expr *>(reinterpret_cast<const Expr *>(
|
||||
*std::next(child_begin(), UpperBoundVariableOffset)));
|
||||
}
|
||||
Expr *getStrideVariable() const {
|
||||
assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind())) &&
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind()) ||
|
||||
isOpenMPDistributeDirective(getDirectiveKind())) &&
|
||||
"expected worksharing loop directive");
|
||||
return const_cast<Expr *>(reinterpret_cast<const Expr *>(
|
||||
*std::next(child_begin(), StrideVariableOffset)));
|
||||
}
|
||||
Expr *getEnsureUpperBound() const {
|
||||
assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind())) &&
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind()) ||
|
||||
isOpenMPDistributeDirective(getDirectiveKind())) &&
|
||||
"expected worksharing loop directive");
|
||||
return const_cast<Expr *>(reinterpret_cast<const Expr *>(
|
||||
*std::next(child_begin(), EnsureUpperBoundOffset)));
|
||||
}
|
||||
Expr *getNextLowerBound() const {
|
||||
assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind())) &&
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind()) ||
|
||||
isOpenMPDistributeDirective(getDirectiveKind())) &&
|
||||
"expected worksharing loop directive");
|
||||
return const_cast<Expr *>(reinterpret_cast<const Expr *>(
|
||||
*std::next(child_begin(), NextLowerBoundOffset)));
|
||||
}
|
||||
Expr *getNextUpperBound() const {
|
||||
assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind())) &&
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind()) ||
|
||||
isOpenMPDistributeDirective(getDirectiveKind())) &&
|
||||
"expected worksharing loop directive");
|
||||
return const_cast<Expr *>(reinterpret_cast<const Expr *>(
|
||||
*std::next(child_begin(), NextUpperBoundOffset)));
|
||||
}
|
||||
Expr *getNumIterations() const {
|
||||
assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind()) ||
|
||||
isOpenMPDistributeDirective(getDirectiveKind())) &&
|
||||
"expected worksharing loop directive");
|
||||
return const_cast<Expr *>(reinterpret_cast<const Expr *>(
|
||||
*std::next(child_begin(), NumIterationsOffset)));
|
||||
}
|
||||
Expr *getPrevLowerBoundVariable() const {
|
||||
assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind()) ||
|
||||
isOpenMPDistributeDirective(getDirectiveKind())) &&
|
||||
"expected worksharing loop directive");
|
||||
return const_cast<Expr *>(reinterpret_cast<const Expr *>(
|
||||
*std::next(child_begin(), PrevLowerBoundVariableOffset)));
|
||||
}
|
||||
Expr *getPrevUpperBoundVariable() const {
|
||||
assert((isOpenMPWorksharingDirective(getDirectiveKind()) ||
|
||||
isOpenMPTaskLoopDirective(getDirectiveKind()) ||
|
||||
isOpenMPDistributeDirective(getDirectiveKind())) &&
|
||||
"expected worksharing loop directive");
|
||||
return const_cast<Expr *>(reinterpret_cast<const Expr *>(
|
||||
*std::next(child_begin(), PrevUpperBoundVariableOffset)));
|
||||
}
|
||||
const Stmt *getBody() const {
|
||||
// This relies on the loop form is already checked by Sema.
|
||||
Stmt *Body = getAssociatedStmt()->IgnoreContainers(true);
|
||||
|
|
@ -692,7 +768,12 @@ public:
|
|||
T->getStmtClass() == OMPParallelForSimdDirectiveClass ||
|
||||
T->getStmtClass() == OMPTaskLoopDirectiveClass ||
|
||||
T->getStmtClass() == OMPTaskLoopSimdDirectiveClass ||
|
||||
T->getStmtClass() == OMPDistributeDirectiveClass;
|
||||
T->getStmtClass() == OMPDistributeDirectiveClass ||
|
||||
T->getStmtClass() == OMPTargetParallelForDirectiveClass ||
|
||||
T->getStmtClass() == OMPDistributeParallelForDirectiveClass ||
|
||||
T->getStmtClass() == OMPDistributeParallelForSimdDirectiveClass ||
|
||||
T->getStmtClass() == OMPDistributeSimdDirectiveClass ||
|
||||
T->getStmtClass() == OMPTargetParallelForSimdDirectiveClass;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -2039,6 +2120,264 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
/// \brief This represents '#pragma omp target enter data' directive.
|
||||
///
|
||||
/// \code
|
||||
/// #pragma omp target enter data device(0) if(a) map(b[:])
|
||||
/// \endcode
|
||||
/// In this example directive '#pragma omp target enter data' has clauses
|
||||
/// 'device' with the value '0', 'if' with condition 'a' and 'map' with array
|
||||
/// section 'b[:]'.
|
||||
///
|
||||
class OMPTargetEnterDataDirective : public OMPExecutableDirective {
|
||||
friend class ASTStmtReader;
|
||||
/// \brief Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param NumClauses The number of clauses.
|
||||
///
|
||||
OMPTargetEnterDataDirective(SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPTargetEnterDataDirectiveClass,
|
||||
OMPD_target_enter_data, StartLoc, EndLoc,
|
||||
NumClauses, /*NumChildren=*/0) {}
|
||||
|
||||
/// \brief Build an empty directive.
|
||||
///
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
explicit OMPTargetEnterDataDirective(unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPTargetEnterDataDirectiveClass,
|
||||
OMPD_target_enter_data, SourceLocation(),
|
||||
SourceLocation(), NumClauses,
|
||||
/*NumChildren=*/0) {}
|
||||
|
||||
public:
|
||||
/// \brief Creates directive with a list of \a Clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param Clauses List of clauses.
|
||||
///
|
||||
static OMPTargetEnterDataDirective *Create(const ASTContext &C,
|
||||
SourceLocation StartLoc,
|
||||
SourceLocation EndLoc,
|
||||
ArrayRef<OMPClause *> Clauses);
|
||||
|
||||
/// \brief Creates an empty directive with the place for \a N clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param N The number of clauses.
|
||||
///
|
||||
static OMPTargetEnterDataDirective *CreateEmpty(const ASTContext &C,
|
||||
unsigned N, EmptyShell);
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPTargetEnterDataDirectiveClass;
|
||||
}
|
||||
};
|
||||
|
||||
/// \brief This represents '#pragma omp target exit data' directive.
|
||||
///
|
||||
/// \code
|
||||
/// #pragma omp target exit data device(0) if(a) map(b[:])
|
||||
/// \endcode
|
||||
/// In this example directive '#pragma omp target exit data' has clauses
|
||||
/// 'device' with the value '0', 'if' with condition 'a' and 'map' with array
|
||||
/// section 'b[:]'.
|
||||
///
|
||||
class OMPTargetExitDataDirective : public OMPExecutableDirective {
|
||||
friend class ASTStmtReader;
|
||||
/// \brief Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param NumClauses The number of clauses.
|
||||
///
|
||||
OMPTargetExitDataDirective(SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPTargetExitDataDirectiveClass,
|
||||
OMPD_target_exit_data, StartLoc, EndLoc,
|
||||
NumClauses, /*NumChildren=*/0) {}
|
||||
|
||||
/// \brief Build an empty directive.
|
||||
///
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
explicit OMPTargetExitDataDirective(unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPTargetExitDataDirectiveClass,
|
||||
OMPD_target_exit_data, SourceLocation(),
|
||||
SourceLocation(), NumClauses,
|
||||
/*NumChildren=*/0) {}
|
||||
|
||||
public:
|
||||
/// \brief Creates directive with a list of \a Clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param Clauses List of clauses.
|
||||
///
|
||||
static OMPTargetExitDataDirective *Create(const ASTContext &C,
|
||||
SourceLocation StartLoc,
|
||||
SourceLocation EndLoc,
|
||||
ArrayRef<OMPClause *> Clauses);
|
||||
|
||||
/// \brief Creates an empty directive with the place for \a N clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param N The number of clauses.
|
||||
///
|
||||
static OMPTargetExitDataDirective *CreateEmpty(const ASTContext &C,
|
||||
unsigned N, EmptyShell);
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPTargetExitDataDirectiveClass;
|
||||
}
|
||||
};
|
||||
|
||||
/// \brief This represents '#pragma omp target parallel' directive.
|
||||
///
|
||||
/// \code
|
||||
/// #pragma omp target parallel if(a)
|
||||
/// \endcode
|
||||
/// In this example directive '#pragma omp target parallel' has clause 'if' with
|
||||
/// condition 'a'.
|
||||
///
|
||||
class OMPTargetParallelDirective : public OMPExecutableDirective {
|
||||
friend class ASTStmtReader;
|
||||
/// \brief Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending location of the directive.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
OMPTargetParallelDirective(SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPTargetParallelDirectiveClass,
|
||||
OMPD_target_parallel, StartLoc, EndLoc,
|
||||
NumClauses, /*NumChildren=*/1) {}
|
||||
|
||||
/// \brief Build an empty directive.
|
||||
///
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
explicit OMPTargetParallelDirective(unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPTargetParallelDirectiveClass,
|
||||
OMPD_target_parallel, SourceLocation(),
|
||||
SourceLocation(), NumClauses,
|
||||
/*NumChildren=*/1) {}
|
||||
|
||||
public:
|
||||
/// \brief Creates directive with a list of \a Clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param Clauses List of clauses.
|
||||
/// \param AssociatedStmt Statement, associated with the directive.
|
||||
///
|
||||
static OMPTargetParallelDirective *
|
||||
Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
ArrayRef<OMPClause *> Clauses, Stmt *AssociatedStmt);
|
||||
|
||||
/// \brief Creates an empty directive with the place for \a NumClauses
|
||||
/// clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
static OMPTargetParallelDirective *
|
||||
CreateEmpty(const ASTContext &C, unsigned NumClauses, EmptyShell);
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPTargetParallelDirectiveClass;
|
||||
}
|
||||
};
|
||||
|
||||
/// \brief This represents '#pragma omp target parallel for' directive.
|
||||
///
|
||||
/// \code
|
||||
/// #pragma omp target parallel for private(a,b) reduction(+:c,d)
|
||||
/// \endcode
|
||||
/// In this example directive '#pragma omp target parallel for' has clauses
|
||||
/// 'private' with the variables 'a' and 'b' and 'reduction' with operator '+'
|
||||
/// and variables 'c' and 'd'.
|
||||
///
|
||||
class OMPTargetParallelForDirective : public OMPLoopDirective {
|
||||
friend class ASTStmtReader;
|
||||
|
||||
/// \brief true if current region has inner cancel directive.
|
||||
bool HasCancel;
|
||||
|
||||
/// \brief Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending location of the directive.
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
OMPTargetParallelForDirective(SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned CollapsedNum, unsigned NumClauses)
|
||||
: OMPLoopDirective(this, OMPTargetParallelForDirectiveClass,
|
||||
OMPD_target_parallel_for, StartLoc, EndLoc,
|
||||
CollapsedNum, NumClauses),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Build an empty directive.
|
||||
///
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
explicit OMPTargetParallelForDirective(unsigned CollapsedNum,
|
||||
unsigned NumClauses)
|
||||
: OMPLoopDirective(this, OMPTargetParallelForDirectiveClass,
|
||||
OMPD_target_parallel_for, SourceLocation(),
|
||||
SourceLocation(), CollapsedNum, NumClauses),
|
||||
HasCancel(false) {}
|
||||
|
||||
/// \brief Set cancel state.
|
||||
void setHasCancel(bool Has) { HasCancel = Has; }
|
||||
|
||||
public:
|
||||
/// \brief Creates directive with a list of \a Clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param CollapsedNum Number of collapsed loops.
|
||||
/// \param Clauses List of clauses.
|
||||
/// \param AssociatedStmt Statement, associated with the directive.
|
||||
/// \param Exprs Helper expressions for CodeGen.
|
||||
/// \param HasCancel true if current directive has inner cancel directive.
|
||||
///
|
||||
static OMPTargetParallelForDirective *
|
||||
Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses,
|
||||
Stmt *AssociatedStmt, const HelperExprs &Exprs, bool HasCancel);
|
||||
|
||||
/// \brief Creates an empty directive with the place
|
||||
/// for \a NumClauses clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
static OMPTargetParallelForDirective *CreateEmpty(const ASTContext &C,
|
||||
unsigned NumClauses,
|
||||
unsigned CollapsedNum,
|
||||
EmptyShell);
|
||||
|
||||
/// \brief Return true if current directive has inner cancel directive.
|
||||
bool hasCancel() const { return HasCancel; }
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPTargetParallelForDirectiveClass;
|
||||
}
|
||||
};
|
||||
|
||||
/// \brief This represents '#pragma omp teams' directive.
|
||||
///
|
||||
/// \code
|
||||
|
|
@ -2395,7 +2734,7 @@ public:
|
|||
/// \param Clauses List of clauses.
|
||||
/// \param AssociatedStmt Statement, associated with the directive.
|
||||
/// \param Exprs Helper expressions for CodeGen.
|
||||
///
|
||||
///
|
||||
static OMPDistributeDirective *
|
||||
Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses,
|
||||
|
|
@ -2417,6 +2756,340 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
/// \brief This represents '#pragma omp target update' directive.
|
||||
///
|
||||
/// \code
|
||||
/// #pragma omp target update to(a) from(b) device(1)
|
||||
/// \endcode
|
||||
/// In this example directive '#pragma omp target update' has clause 'to' with
|
||||
/// argument 'a', clause 'from' with argument 'b' and clause 'device' with
|
||||
/// argument '1'.
|
||||
///
|
||||
class OMPTargetUpdateDirective : public OMPExecutableDirective {
|
||||
friend class ASTStmtReader;
|
||||
/// \brief Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param NumClauses The number of clauses.
|
||||
///
|
||||
OMPTargetUpdateDirective(SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPTargetUpdateDirectiveClass,
|
||||
OMPD_target_update, StartLoc, EndLoc, NumClauses,
|
||||
0) {}
|
||||
|
||||
/// \brief Build an empty directive.
|
||||
///
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
explicit OMPTargetUpdateDirective(unsigned NumClauses)
|
||||
: OMPExecutableDirective(this, OMPTargetUpdateDirectiveClass,
|
||||
OMPD_target_update, SourceLocation(),
|
||||
SourceLocation(), NumClauses, 0) {}
|
||||
|
||||
public:
|
||||
/// \brief Creates directive with a list of \a Clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param Clauses List of clauses.
|
||||
///
|
||||
static OMPTargetUpdateDirective *Create(const ASTContext &C,
|
||||
SourceLocation StartLoc,
|
||||
SourceLocation EndLoc,
|
||||
ArrayRef<OMPClause *> Clauses);
|
||||
|
||||
/// \brief Creates an empty directive with the place for \a NumClauses
|
||||
/// clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param NumClauses The number of clauses.
|
||||
///
|
||||
static OMPTargetUpdateDirective *CreateEmpty(const ASTContext &C,
|
||||
unsigned NumClauses, EmptyShell);
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPTargetUpdateDirectiveClass;
|
||||
}
|
||||
};
|
||||
|
||||
/// \brief This represents '#pragma omp distribute parallel for' composite
|
||||
/// directive.
|
||||
///
|
||||
/// \code
|
||||
/// #pragma omp distribute parallel for private(a,b)
|
||||
/// \endcode
|
||||
/// In this example directive '#pragma omp distribute parallel for' has clause
|
||||
/// 'private' with the variables 'a' and 'b'
|
||||
///
|
||||
class OMPDistributeParallelForDirective : public OMPLoopDirective {
|
||||
friend class ASTStmtReader;
|
||||
|
||||
/// \brief Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending location of the directive.
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
OMPDistributeParallelForDirective(SourceLocation StartLoc,
|
||||
SourceLocation EndLoc,
|
||||
unsigned CollapsedNum, unsigned NumClauses)
|
||||
: OMPLoopDirective(this, OMPDistributeParallelForDirectiveClass,
|
||||
OMPD_distribute_parallel_for, StartLoc, EndLoc,
|
||||
CollapsedNum, NumClauses) {}
|
||||
|
||||
/// \brief Build an empty directive.
|
||||
///
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
explicit OMPDistributeParallelForDirective(unsigned CollapsedNum,
|
||||
unsigned NumClauses)
|
||||
: OMPLoopDirective(this, OMPDistributeParallelForDirectiveClass,
|
||||
OMPD_distribute_parallel_for, SourceLocation(),
|
||||
SourceLocation(), CollapsedNum, NumClauses) {}
|
||||
|
||||
public:
|
||||
/// \brief Creates directive with a list of \a Clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param CollapsedNum Number of collapsed loops.
|
||||
/// \param Clauses List of clauses.
|
||||
/// \param AssociatedStmt Statement, associated with the directive.
|
||||
/// \param Exprs Helper expressions for CodeGen.
|
||||
///
|
||||
static OMPDistributeParallelForDirective *
|
||||
Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses,
|
||||
Stmt *AssociatedStmt, const HelperExprs &Exprs);
|
||||
|
||||
/// \brief Creates an empty directive with the place
|
||||
/// for \a NumClauses clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
static OMPDistributeParallelForDirective *CreateEmpty(const ASTContext &C,
|
||||
unsigned NumClauses,
|
||||
unsigned CollapsedNum,
|
||||
EmptyShell);
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPDistributeParallelForDirectiveClass;
|
||||
}
|
||||
};
|
||||
|
||||
/// This represents '#pragma omp distribute parallel for simd' composite
|
||||
/// directive.
|
||||
///
|
||||
/// \code
|
||||
/// #pragma omp distribute parallel for simd private(x)
|
||||
/// \endcode
|
||||
/// In this example directive '#pragma omp distribute parallel for simd' has
|
||||
/// clause 'private' with the variables 'x'
|
||||
///
|
||||
class OMPDistributeParallelForSimdDirective final : public OMPLoopDirective {
|
||||
friend class ASTStmtReader;
|
||||
|
||||
/// Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending location of the directive.
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
OMPDistributeParallelForSimdDirective(SourceLocation StartLoc,
|
||||
SourceLocation EndLoc,
|
||||
unsigned CollapsedNum,
|
||||
unsigned NumClauses)
|
||||
: OMPLoopDirective(this, OMPDistributeParallelForSimdDirectiveClass,
|
||||
OMPD_distribute_parallel_for_simd, StartLoc,
|
||||
EndLoc, CollapsedNum, NumClauses) {}
|
||||
|
||||
/// Build an empty directive.
|
||||
///
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
explicit OMPDistributeParallelForSimdDirective(unsigned CollapsedNum,
|
||||
unsigned NumClauses)
|
||||
: OMPLoopDirective(this, OMPDistributeParallelForSimdDirectiveClass,
|
||||
OMPD_distribute_parallel_for_simd,
|
||||
SourceLocation(), SourceLocation(), CollapsedNum,
|
||||
NumClauses) {}
|
||||
|
||||
public:
|
||||
/// Creates directive with a list of \a Clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param CollapsedNum Number of collapsed loops.
|
||||
/// \param Clauses List of clauses.
|
||||
/// \param AssociatedStmt Statement, associated with the directive.
|
||||
/// \param Exprs Helper expressions for CodeGen.
|
||||
///
|
||||
static OMPDistributeParallelForSimdDirective *Create(
|
||||
const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses,
|
||||
Stmt *AssociatedStmt, const HelperExprs &Exprs);
|
||||
|
||||
/// Creates an empty directive with the place for \a NumClauses clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
static OMPDistributeParallelForSimdDirective *CreateEmpty(
|
||||
const ASTContext &C, unsigned NumClauses, unsigned CollapsedNum,
|
||||
EmptyShell);
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPDistributeParallelForSimdDirectiveClass;
|
||||
}
|
||||
};
|
||||
|
||||
/// This represents '#pragma omp distribute simd' composite directive.
|
||||
///
|
||||
/// \code
|
||||
/// #pragma omp distribute simd private(x)
|
||||
/// \endcode
|
||||
/// In this example directive '#pragma omp distribute simd' has clause
|
||||
/// 'private' with the variables 'x'
|
||||
///
|
||||
class OMPDistributeSimdDirective final : public OMPLoopDirective {
|
||||
friend class ASTStmtReader;
|
||||
|
||||
/// Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending location of the directive.
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
OMPDistributeSimdDirective(SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned CollapsedNum, unsigned NumClauses)
|
||||
: OMPLoopDirective(this, OMPDistributeSimdDirectiveClass,
|
||||
OMPD_distribute_simd, StartLoc, EndLoc, CollapsedNum,
|
||||
NumClauses) {}
|
||||
|
||||
/// Build an empty directive.
|
||||
///
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
explicit OMPDistributeSimdDirective(unsigned CollapsedNum,
|
||||
unsigned NumClauses)
|
||||
: OMPLoopDirective(this, OMPDistributeSimdDirectiveClass,
|
||||
OMPD_distribute_simd, SourceLocation(),
|
||||
SourceLocation(), CollapsedNum, NumClauses) {}
|
||||
|
||||
public:
|
||||
/// Creates directive with a list of \a Clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param CollapsedNum Number of collapsed loops.
|
||||
/// \param Clauses List of clauses.
|
||||
/// \param AssociatedStmt Statement, associated with the directive.
|
||||
/// \param Exprs Helper expressions for CodeGen.
|
||||
///
|
||||
static OMPDistributeSimdDirective *
|
||||
Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses,
|
||||
Stmt *AssociatedStmt, const HelperExprs &Exprs);
|
||||
|
||||
/// Creates an empty directive with the place for \a NumClauses clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
static OMPDistributeSimdDirective *CreateEmpty(const ASTContext &C,
|
||||
unsigned NumClauses,
|
||||
unsigned CollapsedNum,
|
||||
EmptyShell);
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPDistributeSimdDirectiveClass;
|
||||
}
|
||||
};
|
||||
|
||||
/// This represents '#pragma omp target parallel for simd' directive.
|
||||
///
|
||||
/// \code
|
||||
/// #pragma omp target parallel for simd private(a) map(b) safelen(c)
|
||||
/// \endcode
|
||||
/// In this example directive '#pragma omp target parallel for simd' has clauses
|
||||
/// 'private' with the variable 'a', 'map' with the variable 'b' and 'safelen'
|
||||
/// with the variable 'c'.
|
||||
///
|
||||
class OMPTargetParallelForSimdDirective final : public OMPLoopDirective {
|
||||
friend class ASTStmtReader;
|
||||
|
||||
/// Build directive with the given start and end location.
|
||||
///
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending location of the directive.
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
OMPTargetParallelForSimdDirective(SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned CollapsedNum, unsigned NumClauses)
|
||||
: OMPLoopDirective(this, OMPTargetParallelForSimdDirectiveClass,
|
||||
OMPD_target_parallel_for_simd, StartLoc, EndLoc,
|
||||
CollapsedNum, NumClauses) {}
|
||||
|
||||
/// Build an empty directive.
|
||||
///
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
explicit OMPTargetParallelForSimdDirective(unsigned CollapsedNum,
|
||||
unsigned NumClauses)
|
||||
: OMPLoopDirective(this, OMPTargetParallelForSimdDirectiveClass,
|
||||
OMPD_target_parallel_for_simd, SourceLocation(),
|
||||
SourceLocation(), CollapsedNum, NumClauses) {}
|
||||
|
||||
public:
|
||||
/// Creates directive with a list of \a Clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param StartLoc Starting location of the directive kind.
|
||||
/// \param EndLoc Ending Location of the directive.
|
||||
/// \param CollapsedNum Number of collapsed loops.
|
||||
/// \param Clauses List of clauses.
|
||||
/// \param AssociatedStmt Statement, associated with the directive.
|
||||
/// \param Exprs Helper expressions for CodeGen.
|
||||
///
|
||||
static OMPTargetParallelForSimdDirective *
|
||||
Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation EndLoc,
|
||||
unsigned CollapsedNum, ArrayRef<OMPClause *> Clauses,
|
||||
Stmt *AssociatedStmt, const HelperExprs &Exprs);
|
||||
|
||||
/// Creates an empty directive with the place for \a NumClauses clauses.
|
||||
///
|
||||
/// \param C AST context.
|
||||
/// \param CollapsedNum Number of collapsed nested loops.
|
||||
/// \param NumClauses Number of clauses.
|
||||
///
|
||||
static OMPTargetParallelForSimdDirective *CreateEmpty(const ASTContext &C,
|
||||
unsigned NumClauses,
|
||||
unsigned CollapsedNum,
|
||||
EmptyShell);
|
||||
|
||||
static bool classof(const Stmt *T) {
|
||||
return T->getStmtClass() == OMPTargetParallelForSimdDirectiveClass;
|
||||
}
|
||||
};
|
||||
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -354,6 +354,12 @@ public:
|
|||
/// \brief Print this template argument to the given output stream.
|
||||
void print(const PrintingPolicy &Policy, raw_ostream &Out) const;
|
||||
|
||||
/// \brief Debugging aid that dumps the template argument.
|
||||
void dump(raw_ostream &Out) const;
|
||||
|
||||
/// \brief Debugging aid that dumps the template argument to standard error.
|
||||
void dump() const;
|
||||
|
||||
/// \brief Used to insert TemplateArguments into FoldingSets.
|
||||
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) const;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#ifndef LLVM_CLANG_AST_TEMPLATENAME_H
|
||||
#define LLVM_CLANG_AST_TEMPLATENAME_H
|
||||
|
||||
#include "clang/AST/NestedNameSpecifier.h"
|
||||
#include "clang/Basic/LLVM.h"
|
||||
#include "llvm/ADT/FoldingSet.h"
|
||||
#include "llvm/ADT/PointerUnion.h"
|
||||
|
|
|
|||
|
|
@ -111,6 +111,7 @@ namespace clang {
|
|||
/// The collection of all-type qualifiers we support.
|
||||
/// Clang supports five independent qualifiers:
|
||||
/// * C99: const, volatile, and restrict
|
||||
/// * MS: __unaligned
|
||||
/// * Embedded C (TR18037): address spaces
|
||||
/// * Objective C: the GC attributes (none, weak, or strong)
|
||||
class Qualifiers {
|
||||
|
|
@ -152,8 +153,8 @@ public:
|
|||
|
||||
enum {
|
||||
/// The maximum supported address space number.
|
||||
/// 24 bits should be enough for anyone.
|
||||
MaxAddressSpace = 0xffffffu,
|
||||
/// 23 bits should be enough for anyone.
|
||||
MaxAddressSpace = 0x7fffffu,
|
||||
|
||||
/// The width of the "fast" qualifier mask.
|
||||
FastWidth = 3,
|
||||
|
|
@ -214,6 +215,12 @@ public:
|
|||
return Qs;
|
||||
}
|
||||
|
||||
static Qualifiers fromCVRUMask(unsigned CVRU) {
|
||||
Qualifiers Qs;
|
||||
Qs.addCVRUQualifiers(CVRU);
|
||||
return Qs;
|
||||
}
|
||||
|
||||
// Deserialize qualifiers from an opaque representation.
|
||||
static Qualifiers fromOpaqueValue(unsigned opaque) {
|
||||
Qualifiers Qs;
|
||||
|
|
@ -264,6 +271,17 @@ public:
|
|||
assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits");
|
||||
Mask |= mask;
|
||||
}
|
||||
void addCVRUQualifiers(unsigned mask) {
|
||||
assert(!(mask & ~CVRMask & ~UMask) && "bitmask contains non-CVRU bits");
|
||||
Mask |= mask;
|
||||
}
|
||||
|
||||
bool hasUnaligned() const { return Mask & UMask; }
|
||||
void setUnaligned(bool flag) {
|
||||
Mask = (Mask & ~UMask) | (flag ? UMask : 0);
|
||||
}
|
||||
void removeUnaligned() { Mask &= ~UMask; }
|
||||
void addUnaligned() { Mask |= UMask; }
|
||||
|
||||
bool hasObjCGCAttr() const { return Mask & GCAttrMask; }
|
||||
GC getObjCGCAttr() const { return GC((Mask & GCAttrMask) >> GCAttrShift); }
|
||||
|
|
@ -433,7 +451,9 @@ public:
|
|||
// ObjC lifetime qualifiers must match exactly.
|
||||
getObjCLifetime() == other.getObjCLifetime() &&
|
||||
// CVR qualifiers may subset.
|
||||
(((Mask & CVRMask) | (other.Mask & CVRMask)) == (Mask & CVRMask));
|
||||
(((Mask & CVRMask) | (other.Mask & CVRMask)) == (Mask & CVRMask)) &&
|
||||
// U qualifier may superset.
|
||||
(!other.hasUnaligned() || hasUnaligned());
|
||||
}
|
||||
|
||||
/// \brief Determines if these qualifiers compatibly include another set of
|
||||
|
|
@ -501,16 +521,19 @@ public:
|
|||
|
||||
private:
|
||||
|
||||
// bits: |0 1 2|3 .. 4|5 .. 7|8 ... 31|
|
||||
// |C R V|GCAttr|Lifetime|AddressSpace|
|
||||
// bits: |0 1 2|3|4 .. 5|6 .. 8|9 ... 31|
|
||||
// |C R V|U|GCAttr|Lifetime|AddressSpace|
|
||||
uint32_t Mask;
|
||||
|
||||
static const uint32_t GCAttrMask = 0x18;
|
||||
static const uint32_t GCAttrShift = 3;
|
||||
static const uint32_t LifetimeMask = 0xE0;
|
||||
static const uint32_t LifetimeShift = 5;
|
||||
static const uint32_t AddressSpaceMask = ~(CVRMask|GCAttrMask|LifetimeMask);
|
||||
static const uint32_t AddressSpaceShift = 8;
|
||||
static const uint32_t UMask = 0x8;
|
||||
static const uint32_t UShift = 3;
|
||||
static const uint32_t GCAttrMask = 0x30;
|
||||
static const uint32_t GCAttrShift = 4;
|
||||
static const uint32_t LifetimeMask = 0x1C0;
|
||||
static const uint32_t LifetimeShift = 6;
|
||||
static const uint32_t AddressSpaceMask =
|
||||
~(CVRMask | UMask | GCAttrMask | LifetimeMask);
|
||||
static const uint32_t AddressSpaceShift = 9;
|
||||
};
|
||||
|
||||
/// A std::pair-like structure for storing a qualified type split
|
||||
|
|
@ -709,27 +732,27 @@ public:
|
|||
/// applied to this type.
|
||||
unsigned getCVRQualifiers() const;
|
||||
|
||||
bool isConstant(ASTContext& Ctx) const {
|
||||
bool isConstant(const ASTContext& Ctx) const {
|
||||
return QualType::isConstant(*this, Ctx);
|
||||
}
|
||||
|
||||
/// \brief Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
|
||||
bool isPODType(ASTContext &Context) const;
|
||||
bool isPODType(const ASTContext &Context) const;
|
||||
|
||||
/// Return true if this is a POD type according to the rules of the C++98
|
||||
/// standard, regardless of the current compilation's language.
|
||||
bool isCXX98PODType(ASTContext &Context) const;
|
||||
bool isCXX98PODType(const ASTContext &Context) const;
|
||||
|
||||
/// Return true if this is a POD type according to the more relaxed rules
|
||||
/// of the C++11 standard, regardless of the current compilation's language.
|
||||
/// (C++0x [basic.types]p9)
|
||||
bool isCXX11PODType(ASTContext &Context) const;
|
||||
bool isCXX11PODType(const ASTContext &Context) const;
|
||||
|
||||
/// Return true if this is a trivial type per (C++0x [basic.types]p9)
|
||||
bool isTrivialType(ASTContext &Context) const;
|
||||
bool isTrivialType(const ASTContext &Context) const;
|
||||
|
||||
/// Return true if this is a trivially copyable type (C++0x [basic.types]p9)
|
||||
bool isTriviallyCopyableType(ASTContext &Context) const;
|
||||
bool isTriviallyCopyableType(const ASTContext &Context) const;
|
||||
|
||||
// Don't promise in the API that anything besides 'const' can be
|
||||
// easily added.
|
||||
|
|
@ -909,16 +932,19 @@ public:
|
|||
std::string getAsString(const PrintingPolicy &Policy) const;
|
||||
|
||||
void print(raw_ostream &OS, const PrintingPolicy &Policy,
|
||||
const Twine &PlaceHolder = Twine()) const {
|
||||
print(split(), OS, Policy, PlaceHolder);
|
||||
const Twine &PlaceHolder = Twine(),
|
||||
unsigned Indentation = 0) const {
|
||||
print(split(), OS, Policy, PlaceHolder, Indentation);
|
||||
}
|
||||
static void print(SplitQualType split, raw_ostream &OS,
|
||||
const PrintingPolicy &policy, const Twine &PlaceHolder) {
|
||||
return print(split.Ty, split.Quals, OS, policy, PlaceHolder);
|
||||
const PrintingPolicy &policy, const Twine &PlaceHolder,
|
||||
unsigned Indentation = 0) {
|
||||
return print(split.Ty, split.Quals, OS, policy, PlaceHolder, Indentation);
|
||||
}
|
||||
static void print(const Type *ty, Qualifiers qs,
|
||||
raw_ostream &OS, const PrintingPolicy &policy,
|
||||
const Twine &PlaceHolder);
|
||||
const Twine &PlaceHolder,
|
||||
unsigned Indentation = 0);
|
||||
|
||||
void getAsStringInternal(std::string &Str,
|
||||
const PrintingPolicy &Policy) const {
|
||||
|
|
@ -936,21 +962,24 @@ public:
|
|||
const QualType &T;
|
||||
const PrintingPolicy &Policy;
|
||||
const Twine &PlaceHolder;
|
||||
unsigned Indentation;
|
||||
public:
|
||||
StreamedQualTypeHelper(const QualType &T, const PrintingPolicy &Policy,
|
||||
const Twine &PlaceHolder)
|
||||
: T(T), Policy(Policy), PlaceHolder(PlaceHolder) { }
|
||||
const Twine &PlaceHolder, unsigned Indentation)
|
||||
: T(T), Policy(Policy), PlaceHolder(PlaceHolder),
|
||||
Indentation(Indentation) { }
|
||||
|
||||
friend raw_ostream &operator<<(raw_ostream &OS,
|
||||
const StreamedQualTypeHelper &SQT) {
|
||||
SQT.T.print(OS, SQT.Policy, SQT.PlaceHolder);
|
||||
SQT.T.print(OS, SQT.Policy, SQT.PlaceHolder, SQT.Indentation);
|
||||
return OS;
|
||||
}
|
||||
};
|
||||
|
||||
StreamedQualTypeHelper stream(const PrintingPolicy &Policy,
|
||||
const Twine &PlaceHolder = Twine()) const {
|
||||
return StreamedQualTypeHelper(*this, Policy, PlaceHolder);
|
||||
const Twine &PlaceHolder = Twine(),
|
||||
unsigned Indentation = 0) const {
|
||||
return StreamedQualTypeHelper(*this, Policy, PlaceHolder, Indentation);
|
||||
}
|
||||
|
||||
void dump(const char *s) const;
|
||||
|
|
@ -1061,11 +1090,14 @@ public:
|
|||
/// Strip Objective-C "__kindof" types from the given type.
|
||||
QualType stripObjCKindOfType(const ASTContext &ctx) const;
|
||||
|
||||
/// Remove all qualifiers including _Atomic.
|
||||
QualType getAtomicUnqualifiedType() const;
|
||||
|
||||
private:
|
||||
// These methods are implemented in a separate translation unit;
|
||||
// "static"-ize them to avoid creating temporary QualTypes in the
|
||||
// caller.
|
||||
static bool isConstant(QualType T, ASTContext& Ctx);
|
||||
static bool isConstant(QualType T, const ASTContext& Ctx);
|
||||
static QualType getDesugaredType(QualType T, const ASTContext &Context);
|
||||
static SplitQualType getSplitDesugaredType(QualType T);
|
||||
static SplitQualType getSplitUnqualifiedTypeImpl(QualType type);
|
||||
|
|
@ -1353,7 +1385,7 @@ protected:
|
|||
///
|
||||
/// C++ 8.3.5p4: The return type, the parameter type list and the
|
||||
/// cv-qualifier-seq, [...], are part of the function type.
|
||||
unsigned TypeQuals : 3;
|
||||
unsigned TypeQuals : 4;
|
||||
|
||||
/// \brief The ref-qualifier associated with a \c FunctionProtoType.
|
||||
///
|
||||
|
|
@ -1600,7 +1632,7 @@ public:
|
|||
bool isChar16Type() const;
|
||||
bool isChar32Type() const;
|
||||
bool isAnyCharacterType() const;
|
||||
bool isIntegralType(ASTContext &Ctx) const;
|
||||
bool isIntegralType(const ASTContext &Ctx) const;
|
||||
|
||||
/// Determine whether this type is an integral or enumeration type.
|
||||
bool isIntegralOrEnumerationType() const;
|
||||
|
|
@ -1699,18 +1731,9 @@ public:
|
|||
bool isNullPtrType() const; // C++0x nullptr_t
|
||||
bool isAtomicType() const; // C11 _Atomic()
|
||||
|
||||
bool isImage1dT() const; // OpenCL image1d_t
|
||||
bool isImage1dArrayT() const; // OpenCL image1d_array_t
|
||||
bool isImage1dBufferT() const; // OpenCL image1d_buffer_t
|
||||
bool isImage2dT() const; // OpenCL image2d_t
|
||||
bool isImage2dArrayT() const; // OpenCL image2d_array_t
|
||||
bool isImage2dDepthT() const; // OpenCL image_2d_depth_t
|
||||
bool isImage2dArrayDepthT() const; // OpenCL image_2d_array_depth_t
|
||||
bool isImage2dMSAAT() const; // OpenCL image_2d_msaa_t
|
||||
bool isImage2dArrayMSAAT() const; // OpenCL image_2d_array_msaa_t
|
||||
bool isImage2dMSAATDepth() const; // OpenCL image_2d_msaa_depth_t
|
||||
bool isImage2dArrayMSAATDepth() const; // OpenCL image_2d_array_msaa_depth_t
|
||||
bool isImage3dT() const; // OpenCL image3d_t
|
||||
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
|
||||
bool is##Id##Type() const;
|
||||
#include "clang/Basic/OpenCLImageTypes.def"
|
||||
|
||||
bool isImageType() const; // Any OpenCL image type
|
||||
|
||||
|
|
@ -1875,6 +1898,11 @@ public:
|
|||
/// This should never be used when type qualifiers are meaningful.
|
||||
const Type *getArrayElementTypeNoTypeQual() const;
|
||||
|
||||
/// If this is a pointer type, return the pointee type.
|
||||
/// If this is an array type, return the array element type.
|
||||
/// This should never be used when type qualifiers are meaningful.
|
||||
const Type *getPointeeOrArrayElementType() const;
|
||||
|
||||
/// If this is a pointer, ObjC object pointer, or block
|
||||
/// pointer, this returns the respective pointee.
|
||||
QualType getPointeeType() const;
|
||||
|
|
@ -2011,6 +2039,10 @@ template <> inline const Class##Type *Type::castAs() const { \
|
|||
class BuiltinType : public Type {
|
||||
public:
|
||||
enum Kind {
|
||||
// OpenCL image types
|
||||
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Id,
|
||||
#include "clang/Basic/OpenCLImageTypes.def"
|
||||
// All other builtin types
|
||||
#define BUILTIN_TYPE(Id, SingletonId) Id,
|
||||
#define LAST_BUILTIN_TYPE(Id) LastKind = Id
|
||||
#include "clang/AST/BuiltinTypes.def"
|
||||
|
|
@ -2050,7 +2082,7 @@ public:
|
|||
}
|
||||
|
||||
bool isFloatingPoint() const {
|
||||
return getKind() >= Half && getKind() <= LongDouble;
|
||||
return getKind() >= Half && getKind() <= Float128;
|
||||
}
|
||||
|
||||
/// Determines whether the given kind corresponds to a placeholder type.
|
||||
|
|
@ -2499,13 +2531,13 @@ public:
|
|||
|
||||
/// \brief Determine the number of bits required to address a member of
|
||||
// an array with the given element type and number of elements.
|
||||
static unsigned getNumAddressingBits(ASTContext &Context,
|
||||
static unsigned getNumAddressingBits(const ASTContext &Context,
|
||||
QualType ElementType,
|
||||
const llvm::APInt &NumElements);
|
||||
|
||||
/// \brief Determine the maximum number of active bits that an array's size
|
||||
/// can require, which limits the maximum size of the array.
|
||||
static unsigned getMaxSizeBits(ASTContext &Context);
|
||||
static unsigned getMaxSizeBits(const ASTContext &Context);
|
||||
|
||||
void Profile(llvm::FoldingSetNodeID &ID) {
|
||||
Profile(ID, getElementType(), getSize(),
|
||||
|
|
@ -2990,7 +3022,7 @@ public:
|
|||
|
||||
/// \brief Determine the type of an expression that calls a function of
|
||||
/// this type.
|
||||
QualType getCallResultType(ASTContext &Context) const {
|
||||
QualType getCallResultType(const ASTContext &Context) const {
|
||||
return getReturnType().getNonLValueExprType(Context);
|
||||
}
|
||||
|
||||
|
|
@ -3040,6 +3072,74 @@ public:
|
|||
/// type.
|
||||
class FunctionProtoType : public FunctionType, public llvm::FoldingSetNode {
|
||||
public:
|
||||
/// Interesting information about a specific parameter that can't simply
|
||||
/// be reflected in parameter's type.
|
||||
///
|
||||
/// It makes sense to model language features this way when there's some
|
||||
/// sort of parameter-specific override (such as an attribute) that
|
||||
/// affects how the function is called. For example, the ARC ns_consumed
|
||||
/// attribute changes whether a parameter is passed at +0 (the default)
|
||||
/// or +1 (ns_consumed). This must be reflected in the function type,
|
||||
/// but isn't really a change to the parameter type.
|
||||
///
|
||||
/// One serious disadvantage of modelling language features this way is
|
||||
/// that they generally do not work with language features that attempt
|
||||
/// to destructure types. For example, template argument deduction will
|
||||
/// not be able to match a parameter declared as
|
||||
/// T (*)(U)
|
||||
/// against an argument of type
|
||||
/// void (*)(__attribute__((ns_consumed)) id)
|
||||
/// because the substitution of T=void, U=id into the former will
|
||||
/// not produce the latter.
|
||||
class ExtParameterInfo {
|
||||
enum {
|
||||
ABIMask = 0x0F,
|
||||
IsConsumed = 0x10
|
||||
};
|
||||
unsigned char Data;
|
||||
public:
|
||||
ExtParameterInfo() : Data(0) {}
|
||||
|
||||
/// Return the ABI treatment of this parameter.
|
||||
ParameterABI getABI() const {
|
||||
return ParameterABI(Data & ABIMask);
|
||||
}
|
||||
ExtParameterInfo withABI(ParameterABI kind) const {
|
||||
ExtParameterInfo copy = *this;
|
||||
copy.Data = (copy.Data & ~ABIMask) | unsigned(kind);
|
||||
return copy;
|
||||
}
|
||||
|
||||
/// Is this parameter considered "consumed" by Objective-C ARC?
|
||||
/// Consumed parameters must have retainable object type.
|
||||
bool isConsumed() const {
|
||||
return (Data & IsConsumed);
|
||||
}
|
||||
ExtParameterInfo withIsConsumed(bool consumed) const {
|
||||
ExtParameterInfo copy = *this;
|
||||
if (consumed) {
|
||||
copy.Data |= IsConsumed;
|
||||
} else {
|
||||
copy.Data &= ~IsConsumed;
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
|
||||
unsigned char getOpaqueValue() const { return Data; }
|
||||
static ExtParameterInfo getFromOpaqueValue(unsigned char data) {
|
||||
ExtParameterInfo result;
|
||||
result.Data = data;
|
||||
return result;
|
||||
}
|
||||
|
||||
friend bool operator==(ExtParameterInfo lhs, ExtParameterInfo rhs) {
|
||||
return lhs.Data == rhs.Data;
|
||||
}
|
||||
friend bool operator!=(ExtParameterInfo lhs, ExtParameterInfo rhs) {
|
||||
return lhs.Data != rhs.Data;
|
||||
}
|
||||
};
|
||||
|
||||
struct ExceptionSpecInfo {
|
||||
ExceptionSpecInfo()
|
||||
: Type(EST_None), NoexceptExpr(nullptr),
|
||||
|
|
@ -3067,11 +3167,11 @@ public:
|
|||
struct ExtProtoInfo {
|
||||
ExtProtoInfo()
|
||||
: Variadic(false), HasTrailingReturn(false), TypeQuals(0),
|
||||
RefQualifier(RQ_None), ConsumedParameters(nullptr) {}
|
||||
RefQualifier(RQ_None), ExtParameterInfos(nullptr) {}
|
||||
|
||||
ExtProtoInfo(CallingConv CC)
|
||||
: ExtInfo(CC), Variadic(false), HasTrailingReturn(false), TypeQuals(0),
|
||||
RefQualifier(RQ_None), ConsumedParameters(nullptr) {}
|
||||
RefQualifier(RQ_None), ExtParameterInfos(nullptr) {}
|
||||
|
||||
ExtProtoInfo withExceptionSpec(const ExceptionSpecInfo &O) {
|
||||
ExtProtoInfo Result(*this);
|
||||
|
|
@ -3085,7 +3185,7 @@ public:
|
|||
unsigned char TypeQuals;
|
||||
RefQualifierKind RefQualifier;
|
||||
ExceptionSpecInfo ExceptionSpec;
|
||||
const bool *ConsumedParameters;
|
||||
const ExtParameterInfo *ExtParameterInfos;
|
||||
};
|
||||
|
||||
private:
|
||||
|
|
@ -3112,8 +3212,8 @@ private:
|
|||
/// The type of exception specification this function has.
|
||||
unsigned ExceptionSpecType : 4;
|
||||
|
||||
/// Whether this function has any consumed parameters.
|
||||
unsigned HasAnyConsumedParams : 1;
|
||||
/// Whether this function has extended parameter information.
|
||||
unsigned HasExtParameterInfos : 1;
|
||||
|
||||
/// Whether the function is variadic.
|
||||
unsigned Variadic : 1;
|
||||
|
|
@ -3135,25 +3235,36 @@ private:
|
|||
// instantiate this function type's exception specification, and the function
|
||||
// from which it should be instantiated.
|
||||
|
||||
// ConsumedParameters - A variable size array, following Exceptions
|
||||
// and of length NumParams, holding flags indicating which parameters
|
||||
// are consumed. This only appears if HasAnyConsumedParams is true.
|
||||
// ExtParameterInfos - A variable size array, following the exception
|
||||
// specification and of length NumParams, holding an ExtParameterInfo
|
||||
// for each of the parameters. This only appears if HasExtParameterInfos
|
||||
// is true.
|
||||
|
||||
friend class ASTContext; // ASTContext creates these.
|
||||
|
||||
const bool *getConsumedParamsBuffer() const {
|
||||
assert(hasAnyConsumedParams());
|
||||
const ExtParameterInfo *getExtParameterInfosBuffer() const {
|
||||
assert(hasExtParameterInfos());
|
||||
|
||||
// Find the end of the exceptions.
|
||||
Expr *const *eh_end = reinterpret_cast<Expr *const *>(exception_end());
|
||||
if (getExceptionSpecType() == EST_ComputedNoexcept)
|
||||
eh_end += 1; // NoexceptExpr
|
||||
// The memory layout of these types isn't handled here, so
|
||||
// hopefully this is never called for them?
|
||||
assert(getExceptionSpecType() != EST_Uninstantiated &&
|
||||
getExceptionSpecType() != EST_Unevaluated);
|
||||
// Find the end of the exception specification.
|
||||
const char *ptr = reinterpret_cast<const char *>(exception_begin());
|
||||
ptr += getExceptionSpecSize();
|
||||
|
||||
return reinterpret_cast<const bool*>(eh_end);
|
||||
return reinterpret_cast<const ExtParameterInfo *>(ptr);
|
||||
}
|
||||
|
||||
size_t getExceptionSpecSize() const {
|
||||
switch (getExceptionSpecType()) {
|
||||
case EST_None: return 0;
|
||||
case EST_DynamicNone: return 0;
|
||||
case EST_MSAny: return 0;
|
||||
case EST_BasicNoexcept: return 0;
|
||||
case EST_Unparsed: return 0;
|
||||
case EST_Dynamic: return getNumExceptions() * sizeof(QualType);
|
||||
case EST_ComputedNoexcept: return sizeof(Expr*);
|
||||
case EST_Uninstantiated: return 2 * sizeof(FunctionDecl*);
|
||||
case EST_Unevaluated: return sizeof(FunctionDecl*);
|
||||
}
|
||||
llvm_unreachable("bad exception specification kind");
|
||||
}
|
||||
|
||||
public:
|
||||
|
|
@ -3184,8 +3295,8 @@ public:
|
|||
} else if (EPI.ExceptionSpec.Type == EST_Unevaluated) {
|
||||
EPI.ExceptionSpec.SourceDecl = getExceptionSpecDecl();
|
||||
}
|
||||
if (hasAnyConsumedParams())
|
||||
EPI.ConsumedParameters = getConsumedParamsBuffer();
|
||||
if (hasExtParameterInfos())
|
||||
EPI.ExtParameterInfos = getExtParameterInfosBuffer();
|
||||
return EPI;
|
||||
}
|
||||
|
||||
|
|
@ -3300,11 +3411,41 @@ public:
|
|||
return exception_begin() + NumExceptions;
|
||||
}
|
||||
|
||||
bool hasAnyConsumedParams() const { return HasAnyConsumedParams; }
|
||||
/// Is there any interesting extra information for any of the parameters
|
||||
/// of this function type?
|
||||
bool hasExtParameterInfos() const { return HasExtParameterInfos; }
|
||||
ArrayRef<ExtParameterInfo> getExtParameterInfos() const {
|
||||
assert(hasExtParameterInfos());
|
||||
return ArrayRef<ExtParameterInfo>(getExtParameterInfosBuffer(),
|
||||
getNumParams());
|
||||
}
|
||||
/// Return a pointer to the beginning of the array of extra parameter
|
||||
/// information, if present, or else null if none of the parameters
|
||||
/// carry it. This is equivalent to getExtProtoInfo().ExtParameterInfos.
|
||||
const ExtParameterInfo *getExtParameterInfosOrNull() const {
|
||||
if (!hasExtParameterInfos())
|
||||
return nullptr;
|
||||
return getExtParameterInfosBuffer();
|
||||
}
|
||||
|
||||
ExtParameterInfo getExtParameterInfo(unsigned I) const {
|
||||
assert(I < getNumParams() && "parameter index out of range");
|
||||
if (hasExtParameterInfos())
|
||||
return getExtParameterInfosBuffer()[I];
|
||||
return ExtParameterInfo();
|
||||
}
|
||||
|
||||
ParameterABI getParameterABI(unsigned I) const {
|
||||
assert(I < getNumParams() && "parameter index out of range");
|
||||
if (hasExtParameterInfos())
|
||||
return getExtParameterInfosBuffer()[I].getABI();
|
||||
return ParameterABI::Ordinary;
|
||||
}
|
||||
|
||||
bool isParamConsumed(unsigned I) const {
|
||||
assert(I < getNumParams() && "parameter index out of range");
|
||||
if (hasAnyConsumedParams())
|
||||
return getConsumedParamsBuffer()[I];
|
||||
if (hasExtParameterInfos())
|
||||
return getExtParameterInfosBuffer()[I].isConsumed();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -3518,6 +3659,28 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
/// \brief Internal representation of canonical, dependent
|
||||
/// __underlying_type(type) types.
|
||||
///
|
||||
/// This class is used internally by the ASTContext to manage
|
||||
/// canonical, dependent types, only. Clients will only see instances
|
||||
/// of this class via UnaryTransformType nodes.
|
||||
class DependentUnaryTransformType : public UnaryTransformType,
|
||||
public llvm::FoldingSetNode {
|
||||
public:
|
||||
DependentUnaryTransformType(const ASTContext &C, QualType BaseType,
|
||||
UTTKind UKind);
|
||||
void Profile(llvm::FoldingSetNodeID &ID) {
|
||||
Profile(ID, getBaseType(), getUTTKind());
|
||||
}
|
||||
|
||||
static void Profile(llvm::FoldingSetNodeID &ID, QualType BaseType,
|
||||
UTTKind UKind) {
|
||||
ID.AddPointer(BaseType.getAsOpaquePtr());
|
||||
ID.AddInteger((unsigned)UKind);
|
||||
}
|
||||
};
|
||||
|
||||
class TagType : public Type {
|
||||
/// Stores the TagDecl associated with this type. The decl may point to any
|
||||
/// TagDecl that declares the entity.
|
||||
|
|
@ -3626,10 +3789,13 @@ public:
|
|||
attr_stdcall,
|
||||
attr_thiscall,
|
||||
attr_pascal,
|
||||
attr_swiftcall,
|
||||
attr_vectorcall,
|
||||
attr_inteloclbicc,
|
||||
attr_ms_abi,
|
||||
attr_sysv_abi,
|
||||
attr_preserve_most,
|
||||
attr_preserve_all,
|
||||
attr_ptr32,
|
||||
attr_ptr64,
|
||||
attr_sptr,
|
||||
|
|
@ -4002,19 +4168,18 @@ class LLVM_ALIGNAS(/*alignof(uint64_t)*/ 8) TemplateSpecializationType
|
|||
unsigned NumArgs : 31;
|
||||
|
||||
/// Whether this template specialization type is a substituted type alias.
|
||||
bool TypeAlias : 1;
|
||||
unsigned TypeAlias : 1;
|
||||
|
||||
TemplateSpecializationType(TemplateName T,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs, QualType Canon,
|
||||
ArrayRef<TemplateArgument> Args,
|
||||
QualType Canon,
|
||||
QualType Aliased);
|
||||
|
||||
friend class ASTContext; // ASTContext creates these
|
||||
|
||||
public:
|
||||
/// Determine whether any of the given template arguments are dependent.
|
||||
static bool anyDependentTemplateArguments(const TemplateArgumentLoc *Args,
|
||||
unsigned NumArgs,
|
||||
static bool anyDependentTemplateArguments(ArrayRef<TemplateArgumentLoc> Args,
|
||||
bool &InstantiationDependent);
|
||||
|
||||
static bool anyDependentTemplateArguments(const TemplateArgumentListInfo &,
|
||||
|
|
@ -4023,14 +4188,12 @@ public:
|
|||
/// \brief Print a template argument list, including the '<' and '>'
|
||||
/// enclosing the template arguments.
|
||||
static void PrintTemplateArgumentList(raw_ostream &OS,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs,
|
||||
ArrayRef<TemplateArgument> Args,
|
||||
const PrintingPolicy &Policy,
|
||||
bool SkipBrackets = false);
|
||||
|
||||
static void PrintTemplateArgumentList(raw_ostream &OS,
|
||||
const TemplateArgumentLoc *Args,
|
||||
unsigned NumArgs,
|
||||
ArrayRef<TemplateArgumentLoc> Args,
|
||||
const PrintingPolicy &Policy);
|
||||
|
||||
static void PrintTemplateArgumentList(raw_ostream &OS,
|
||||
|
|
@ -4087,20 +4250,23 @@ public:
|
|||
/// \pre \c isArgType(Arg)
|
||||
const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h
|
||||
|
||||
ArrayRef<TemplateArgument> template_arguments() const {
|
||||
return {getArgs(), NumArgs};
|
||||
}
|
||||
|
||||
bool isSugared() const {
|
||||
return !isDependentType() || isCurrentInstantiation() || isTypeAlias();
|
||||
}
|
||||
QualType desugar() const { return getCanonicalTypeInternal(); }
|
||||
|
||||
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) {
|
||||
Profile(ID, Template, getArgs(), NumArgs, Ctx);
|
||||
Profile(ID, Template, template_arguments(), Ctx);
|
||||
if (isTypeAlias())
|
||||
getAliasedType().Profile(ID);
|
||||
}
|
||||
|
||||
static void Profile(llvm::FoldingSetNodeID &ID, TemplateName T,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs,
|
||||
ArrayRef<TemplateArgument> Args,
|
||||
const ASTContext &Context);
|
||||
|
||||
static bool classof(const Type *T) {
|
||||
|
|
@ -4143,6 +4309,8 @@ class InjectedClassNameType : public Type {
|
|||
friend class ASTReader; // FIXME: ASTContext::getInjectedClassNameType is not
|
||||
// currently suitable for AST reading, too much
|
||||
// interdependencies.
|
||||
friend class ASTNodeImporter;
|
||||
|
||||
InjectedClassNameType(CXXRecordDecl *D, QualType TST)
|
||||
: Type(InjectedClassName, QualType(), /*Dependent=*/true,
|
||||
/*InstantiationDependent=*/true,
|
||||
|
|
@ -4402,8 +4570,7 @@ class LLVM_ALIGNAS(/*alignof(uint64_t)*/ 8) DependentTemplateSpecializationType
|
|||
DependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,
|
||||
NestedNameSpecifier *NNS,
|
||||
const IdentifierInfo *Name,
|
||||
unsigned NumArgs,
|
||||
const TemplateArgument *Args,
|
||||
ArrayRef<TemplateArgument> Args,
|
||||
QualType Canon);
|
||||
|
||||
friend class ASTContext; // ASTContext creates these
|
||||
|
|
@ -4422,6 +4589,10 @@ public:
|
|||
|
||||
const TemplateArgument &getArg(unsigned Idx) const; // in TemplateBase.h
|
||||
|
||||
ArrayRef<TemplateArgument> template_arguments() const {
|
||||
return {getArgs(), NumArgs};
|
||||
}
|
||||
|
||||
typedef const TemplateArgument * iterator;
|
||||
iterator begin() const { return getArgs(); }
|
||||
iterator end() const; // inline in TemplateBase.h
|
||||
|
|
@ -4430,7 +4601,7 @@ public:
|
|||
QualType desugar() const { return QualType(this, 0); }
|
||||
|
||||
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) {
|
||||
Profile(ID, Context, getKeyword(), NNS, Name, NumArgs, getArgs());
|
||||
Profile(ID, Context, getKeyword(), NNS, Name, {getArgs(), NumArgs});
|
||||
}
|
||||
|
||||
static void Profile(llvm::FoldingSetNodeID &ID,
|
||||
|
|
@ -4438,8 +4609,7 @@ public:
|
|||
ElaboratedTypeKeyword Keyword,
|
||||
NestedNameSpecifier *Qualifier,
|
||||
const IdentifierInfo *Name,
|
||||
unsigned NumArgs,
|
||||
const TemplateArgument *Args);
|
||||
ArrayRef<TemplateArgument> Args);
|
||||
|
||||
static bool classof(const Type *T) {
|
||||
return T->getTypeClass() == DependentTemplateSpecialization;
|
||||
|
|
@ -5194,7 +5364,8 @@ inline void QualType::removeLocalVolatile() {
|
|||
|
||||
inline void QualType::removeLocalCVRQualifiers(unsigned Mask) {
|
||||
assert(!(Mask & ~Qualifiers::CVRMask) && "mask has non-CVR bits");
|
||||
assert((int)Qualifiers::CVRMask == (int)Qualifiers::FastMask);
|
||||
static_assert((int)Qualifiers::CVRMask == (int)Qualifiers::FastMask,
|
||||
"Fast bits differ from CVR bits!");
|
||||
|
||||
// Fast path: we don't need to touch the slow qualifiers.
|
||||
removeLocalFastQualifiers(Mask);
|
||||
|
|
@ -5230,9 +5401,9 @@ inline FunctionType::ExtInfo getFunctionExtInfo(QualType t) {
|
|||
/// "int". However, it is not more qualified than "const volatile
|
||||
/// int".
|
||||
inline bool QualType::isMoreQualifiedThan(QualType other) const {
|
||||
Qualifiers myQuals = getQualifiers();
|
||||
Qualifiers otherQuals = other.getQualifiers();
|
||||
return (myQuals != otherQuals && myQuals.compatiblyIncludes(otherQuals));
|
||||
Qualifiers MyQuals = getQualifiers();
|
||||
Qualifiers OtherQuals = other.getQualifiers();
|
||||
return (MyQuals != OtherQuals && MyQuals.compatiblyIncludes(OtherQuals));
|
||||
}
|
||||
|
||||
/// Determine whether this type is at last
|
||||
|
|
@ -5240,7 +5411,13 @@ inline bool QualType::isMoreQualifiedThan(QualType other) const {
|
|||
/// int" is at least as qualified as "const int", "volatile int",
|
||||
/// "int", and "const volatile int".
|
||||
inline bool QualType::isAtLeastAsQualifiedAs(QualType other) const {
|
||||
return getQualifiers().compatiblyIncludes(other.getQualifiers());
|
||||
Qualifiers OtherQuals = other.getQualifiers();
|
||||
|
||||
// Ignore __unaligned qualifier if this type is a void.
|
||||
if (getUnqualifiedType()->isVoidType())
|
||||
OtherQuals.removeUnaligned();
|
||||
|
||||
return getQualifiers().compatiblyIncludes(OtherQuals);
|
||||
}
|
||||
|
||||
/// If Type is a reference type (e.g., const
|
||||
|
|
@ -5417,53 +5594,11 @@ inline bool Type::isObjCBuiltinType() const {
|
|||
return isObjCIdType() || isObjCClassType() || isObjCSelType();
|
||||
}
|
||||
|
||||
inline bool Type::isImage1dT() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLImage1d);
|
||||
}
|
||||
|
||||
inline bool Type::isImage1dArrayT() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLImage1dArray);
|
||||
}
|
||||
|
||||
inline bool Type::isImage1dBufferT() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLImage1dBuffer);
|
||||
}
|
||||
|
||||
inline bool Type::isImage2dT() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLImage2d);
|
||||
}
|
||||
|
||||
inline bool Type::isImage2dArrayT() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLImage2dArray);
|
||||
}
|
||||
|
||||
inline bool Type::isImage2dDepthT() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLImage2dDepth);
|
||||
}
|
||||
|
||||
inline bool Type::isImage2dArrayDepthT() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLImage2dArrayDepth);
|
||||
}
|
||||
|
||||
inline bool Type::isImage2dMSAAT() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLImage2dMSAA);
|
||||
}
|
||||
|
||||
inline bool Type::isImage2dArrayMSAAT() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLImage2dArrayMSAA);
|
||||
}
|
||||
|
||||
inline bool Type::isImage2dMSAATDepth() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLImage2dMSAADepth);
|
||||
}
|
||||
|
||||
inline bool Type::isImage2dArrayMSAATDepth() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLImage2dArrayMSAADepth);
|
||||
}
|
||||
|
||||
inline bool Type::isImage3dT() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLImage3d);
|
||||
}
|
||||
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
|
||||
inline bool Type::is##Id##Type() const { \
|
||||
return isSpecificBuiltinType(BuiltinType::Id); \
|
||||
}
|
||||
#include "clang/Basic/OpenCLImageTypes.def"
|
||||
|
||||
inline bool Type::isSamplerT() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLSampler);
|
||||
|
|
@ -5490,11 +5625,10 @@ inline bool Type::isReserveIDT() const {
|
|||
}
|
||||
|
||||
inline bool Type::isImageType() const {
|
||||
return isImage3dT() || isImage2dT() || isImage2dArrayT() ||
|
||||
isImage2dDepthT() || isImage2dArrayDepthT() || isImage2dMSAAT() ||
|
||||
isImage2dArrayMSAAT() || isImage2dMSAATDepth() ||
|
||||
isImage2dArrayMSAATDepth() || isImage1dT() || isImage1dArrayT() ||
|
||||
isImage1dBufferT();
|
||||
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) is##Id##Type() ||
|
||||
return
|
||||
#include "clang/Basic/OpenCLImageTypes.def"
|
||||
0; // end boolean or operation
|
||||
}
|
||||
|
||||
inline bool Type::isPipeType() const {
|
||||
|
|
@ -5644,6 +5778,15 @@ inline const Type *Type::getBaseElementTypeUnsafe() const {
|
|||
return type;
|
||||
}
|
||||
|
||||
inline const Type *Type::getPointeeOrArrayElementType() const {
|
||||
const Type *type = this;
|
||||
if (type->isAnyPointerType())
|
||||
return type->getPointeeType().getTypePtr();
|
||||
else if (type->isArrayType())
|
||||
return type->getBaseElementTypeUnsafe();
|
||||
return type;
|
||||
}
|
||||
|
||||
/// Insertion operator for diagnostics. This allows sending QualType's into a
|
||||
/// diagnostic with <<.
|
||||
inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
|
||||
|
|
|
|||
|
|
@ -254,7 +254,7 @@ public:
|
|||
unsigned align =
|
||||
TypeLoc::getLocalAlignmentForType(QualType(getTypePtr(), 0));
|
||||
uintptr_t dataInt = reinterpret_cast<uintptr_t>(Data);
|
||||
dataInt = llvm::RoundUpToAlignment(dataInt, align);
|
||||
dataInt = llvm::alignTo(dataInt, align);
|
||||
return UnqualTypeLoc(getTypePtr(), reinterpret_cast<void*>(dataInt));
|
||||
}
|
||||
|
||||
|
|
@ -353,7 +353,7 @@ public:
|
|||
unsigned getLocalDataSize() const {
|
||||
unsigned size = sizeof(LocalData);
|
||||
unsigned extraAlign = asDerived()->getExtraLocalDataAlignment();
|
||||
size = llvm::RoundUpToAlignment(size, extraAlign);
|
||||
size = llvm::alignTo(size, extraAlign);
|
||||
size += asDerived()->getExtraLocalDataSize();
|
||||
return size;
|
||||
}
|
||||
|
|
@ -399,14 +399,14 @@ protected:
|
|||
void *getExtraLocalData() const {
|
||||
unsigned size = sizeof(LocalData);
|
||||
unsigned extraAlign = asDerived()->getExtraLocalDataAlignment();
|
||||
size = llvm::RoundUpToAlignment(size, extraAlign);
|
||||
size = llvm::alignTo(size, extraAlign);
|
||||
return reinterpret_cast<char*>(Base::Data) + size;
|
||||
}
|
||||
|
||||
void *getNonLocalData() const {
|
||||
uintptr_t data = reinterpret_cast<uintptr_t>(Base::Data);
|
||||
data += asDerived()->getLocalDataSize();
|
||||
data = llvm::RoundUpToAlignment(data, getNextTypeAlign());
|
||||
data = llvm::alignTo(data, getNextTypeAlign());
|
||||
return reinterpret_cast<void*>(data);
|
||||
}
|
||||
|
||||
|
|
@ -538,7 +538,7 @@ public:
|
|||
bool needsExtraLocalData() const {
|
||||
BuiltinType::Kind bk = getTypePtr()->getKind();
|
||||
return (bk >= BuiltinType::UShort && bk <= BuiltinType::UInt128)
|
||||
|| (bk >= BuiltinType::Short && bk <= BuiltinType::LongDouble)
|
||||
|| (bk >= BuiltinType::Short && bk <= BuiltinType::Float128)
|
||||
|| bk == BuiltinType::UChar
|
||||
|| bk == BuiltinType::SChar;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,8 +59,13 @@ class UnresolvedSetImpl {
|
|||
// UnresolvedSet.
|
||||
private:
|
||||
template <unsigned N> friend class UnresolvedSet;
|
||||
UnresolvedSetImpl() {}
|
||||
UnresolvedSetImpl(const UnresolvedSetImpl &) {}
|
||||
UnresolvedSetImpl() = default;
|
||||
UnresolvedSetImpl(const UnresolvedSetImpl &) = default;
|
||||
UnresolvedSetImpl &operator=(const UnresolvedSetImpl &) = default;
|
||||
|
||||
// FIXME: Switch these to "= default" once MSVC supports generating move ops
|
||||
UnresolvedSetImpl(UnresolvedSetImpl &&) {}
|
||||
UnresolvedSetImpl &operator=(UnresolvedSetImpl &&) { return *this; }
|
||||
|
||||
public:
|
||||
// We don't currently support assignment through this iterator, so we might
|
||||
|
|
|
|||
|
|
@ -241,6 +241,11 @@ match(MatcherT Matcher, const ast_type_traits::DynTypedNode &Node,
|
|||
ASTContext &Context);
|
||||
/// @}
|
||||
|
||||
/// \brief Returns the results of matching \p Matcher on the translation unit of
|
||||
/// \p Context and collects the \c BoundNodes of all callback invocations.
|
||||
template <typename MatcherT>
|
||||
SmallVector<BoundNodes, 1> match(MatcherT Matcher, ASTContext &Context);
|
||||
|
||||
/// \brief Returns the first result of type \c NodeT bound to \p BoundTo.
|
||||
///
|
||||
/// Returns \c NULL if there is no match, or if the matching node cannot be
|
||||
|
|
@ -288,6 +293,16 @@ match(MatcherT Matcher, const NodeT &Node, ASTContext &Context) {
|
|||
return match(Matcher, ast_type_traits::DynTypedNode::create(Node), Context);
|
||||
}
|
||||
|
||||
template <typename MatcherT>
|
||||
SmallVector<BoundNodes, 1>
|
||||
match(MatcherT Matcher, ASTContext &Context) {
|
||||
internal::CollectMatchesCallback Callback;
|
||||
MatchFinder Finder;
|
||||
Finder.addMatcher(Matcher, &Callback);
|
||||
Finder.matchAST(Context);
|
||||
return std::move(Callback.Nodes);
|
||||
}
|
||||
|
||||
} // end namespace ast_matchers
|
||||
} // end namespace clang
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -46,8 +46,9 @@
|
|||
#include "clang/AST/StmtCXX.h"
|
||||
#include "clang/AST/StmtObjC.h"
|
||||
#include "clang/AST/Type.h"
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "llvm/ADT/VariadicFunction.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Support/ManagedStatic.h"
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
|
@ -60,6 +61,62 @@ class BoundNodes;
|
|||
|
||||
namespace internal {
|
||||
|
||||
/// \brief Variadic function object.
|
||||
///
|
||||
/// Most of the functions below that use VariadicFunction could be implemented
|
||||
/// using plain C++11 variadic functions, but the function object allows us to
|
||||
/// capture it on the dynamic matcher registry.
|
||||
template <typename ResultT, typename ArgT,
|
||||
ResultT (*Func)(ArrayRef<const ArgT *>)>
|
||||
struct VariadicFunction {
|
||||
ResultT operator()() const { return Func(None); }
|
||||
|
||||
template <typename... ArgsT>
|
||||
ResultT operator()(const ArgT &Arg1, const ArgsT &... Args) const {
|
||||
return Execute(Arg1, static_cast<const ArgT &>(Args)...);
|
||||
}
|
||||
|
||||
// We also allow calls with an already created array, in case the caller
|
||||
// already had it.
|
||||
ResultT operator()(ArrayRef<ArgT> Args) const {
|
||||
SmallVector<const ArgT*, 8> InnerArgs;
|
||||
for (const ArgT &Arg : Args)
|
||||
InnerArgs.push_back(&Arg);
|
||||
return Func(InnerArgs);
|
||||
}
|
||||
|
||||
private:
|
||||
// Trampoline function to allow for implicit conversions to take place
|
||||
// before we make the array.
|
||||
template <typename... ArgsT> ResultT Execute(const ArgsT &... Args) const {
|
||||
const ArgT *const ArgsArray[] = {&Args...};
|
||||
return Func(ArrayRef<const ArgT *>(ArgsArray, sizeof...(ArgsT)));
|
||||
}
|
||||
};
|
||||
|
||||
/// \brief Unifies obtaining the underlying type of a regular node through
|
||||
/// `getType` and a TypedefNameDecl node through `getUnderlyingType`.
|
||||
inline QualType getUnderlyingType(const Expr &Node) { return Node.getType(); }
|
||||
|
||||
inline QualType getUnderlyingType(const ValueDecl &Node) {
|
||||
return Node.getType();
|
||||
}
|
||||
|
||||
inline QualType getUnderlyingType(const TypedefNameDecl &Node) {
|
||||
return Node.getUnderlyingType();
|
||||
}
|
||||
|
||||
/// \brief Unifies obtaining the FunctionProtoType pointer from both
|
||||
/// FunctionProtoType and FunctionDecl nodes..
|
||||
inline const FunctionProtoType *
|
||||
getFunctionProtoType(const FunctionProtoType &Node) {
|
||||
return &Node;
|
||||
}
|
||||
|
||||
inline const FunctionProtoType *getFunctionProtoType(const FunctionDecl &Node) {
|
||||
return Node.getType()->getAs<FunctionProtoType>();
|
||||
}
|
||||
|
||||
/// \brief Internal version of BoundNodes. Holds all the bound nodes.
|
||||
class BoundNodesMap {
|
||||
public:
|
||||
|
|
@ -420,7 +477,7 @@ public:
|
|||
template <typename From>
|
||||
Matcher(const Matcher<From> &Other,
|
||||
typename std::enable_if<std::is_base_of<From, T>::value &&
|
||||
!std::is_same<From, T>::value>::type * = 0)
|
||||
!std::is_same<From, T>::value>::type * = nullptr)
|
||||
: Implementation(restrictMatcher(Other.Implementation)) {
|
||||
assert(Implementation.getSupportedKind().isSame(
|
||||
ast_type_traits::ASTNodeKind::getFromNodeKind<T>()));
|
||||
|
|
@ -433,7 +490,7 @@ public:
|
|||
Matcher(const Matcher<TypeT> &Other,
|
||||
typename std::enable_if<
|
||||
std::is_same<T, QualType>::value &&
|
||||
std::is_same<TypeT, Type>::value>::type* = 0)
|
||||
std::is_same<TypeT, Type>::value>::type* = nullptr)
|
||||
: Implementation(new TypeToQualType<TypeT>(Other)) {}
|
||||
|
||||
/// \brief Convert \c this into a \c Matcher<T> by applying dyn_cast<> to the
|
||||
|
|
@ -558,32 +615,21 @@ bool matchesFirstInPointerRange(const MatcherT &Matcher, IteratorT Start,
|
|||
return false;
|
||||
}
|
||||
|
||||
// Metafunction to determine if type T has a member called
|
||||
// getDecl.
|
||||
#if defined(_MSC_VER) && !defined(__clang__)
|
||||
// For MSVC, we use a weird nonstandard __if_exists statement, as it
|
||||
// is not standards-conformant enough to properly compile the standard
|
||||
// code below. (At least up through MSVC 2015 require this workaround)
|
||||
template <typename T> struct has_getDecl {
|
||||
__if_exists(T::getDecl) {
|
||||
enum { value = 1 };
|
||||
}
|
||||
__if_not_exists(T::getDecl) {
|
||||
enum { value = 0 };
|
||||
}
|
||||
// Metafunction to determine if type T has a member called getDecl.
|
||||
template <typename Ty>
|
||||
class has_getDecl {
|
||||
typedef char yes[1];
|
||||
typedef char no[2];
|
||||
|
||||
template <typename Inner>
|
||||
static yes& test(Inner *I, decltype(I->getDecl()) * = nullptr);
|
||||
|
||||
template <typename>
|
||||
static no& test(...);
|
||||
|
||||
public:
|
||||
static const bool value = sizeof(test<Ty>(nullptr)) == sizeof(yes);
|
||||
};
|
||||
#else
|
||||
// There is a default template inheriting from "false_type". Then, a
|
||||
// partial specialization inherits from "true_type". However, this
|
||||
// specialization will only exist when the call to getDecl() isn't an
|
||||
// error -- it vanishes by SFINAE when the member doesn't exist.
|
||||
template <typename> struct type_sink_to_void { typedef void type; };
|
||||
template <typename T, typename = void> struct has_getDecl : std::false_type {};
|
||||
template <typename T>
|
||||
struct has_getDecl<
|
||||
T, typename type_sink_to_void<decltype(std::declval<T>().getDecl())>::type>
|
||||
: std::true_type {};
|
||||
#endif
|
||||
|
||||
/// \brief Matches overloaded operators with a specific name.
|
||||
///
|
||||
|
|
@ -626,10 +672,10 @@ private:
|
|||
|
||||
/// \brief Matches named declarations with a specific name.
|
||||
///
|
||||
/// See \c hasName() in ASTMatchers.h for details.
|
||||
/// See \c hasName() and \c hasAnyName() in ASTMatchers.h for details.
|
||||
class HasNameMatcher : public SingleNodeMatcherInterface<NamedDecl> {
|
||||
public:
|
||||
explicit HasNameMatcher(StringRef Name);
|
||||
explicit HasNameMatcher(std::vector<std::string> Names);
|
||||
|
||||
bool matchesNode(const NamedDecl &Node) const override;
|
||||
|
||||
|
|
@ -640,17 +686,29 @@ class HasNameMatcher : public SingleNodeMatcherInterface<NamedDecl> {
|
|||
/// matches.
|
||||
bool matchesNodeUnqualified(const NamedDecl &Node) const;
|
||||
|
||||
/// \brief Full match routine
|
||||
///
|
||||
/// Fast implementation for the simple case of a named declaration at
|
||||
/// namespace or RecordDecl scope.
|
||||
/// It is slower than matchesNodeUnqualified, but faster than
|
||||
/// matchesNodeFullSlow.
|
||||
bool matchesNodeFullFast(const NamedDecl &Node) const;
|
||||
|
||||
/// \brief Full match routine
|
||||
///
|
||||
/// It generates the fully qualified name of the declaration (which is
|
||||
/// expensive) before trying to match.
|
||||
/// It is slower but simple and works on all cases.
|
||||
bool matchesNodeFull(const NamedDecl &Node) const;
|
||||
bool matchesNodeFullSlow(const NamedDecl &Node) const;
|
||||
|
||||
const bool UseUnqualifiedMatch;
|
||||
const std::string Name;
|
||||
const std::vector<std::string> Names;
|
||||
};
|
||||
|
||||
/// \brief Trampoline function to use VariadicFunction<> to construct a
|
||||
/// HasNameMatcher.
|
||||
Matcher<NamedDecl> hasAnyNameFunc(ArrayRef<const StringRef *> NameRefs);
|
||||
|
||||
/// \brief Matches declarations for QualType and CallExpr.
|
||||
///
|
||||
/// Type argument DeclMatcherT is required by PolymorphicMatcherWithParam1 but
|
||||
|
|
@ -737,6 +795,14 @@ private:
|
|||
return matchesDecl(Node.getMemberDecl(), Finder, Builder);
|
||||
}
|
||||
|
||||
/// \brief Extracts the \c LabelDecl a \c AddrLabelExpr refers to and returns
|
||||
/// whether the inner matcher matches on it.
|
||||
bool matchesSpecialized(const AddrLabelExpr &Node,
|
||||
ASTMatchFinder *Finder,
|
||||
BoundNodesTreeBuilder *Builder) const {
|
||||
return matchesDecl(Node.getLabel(), Finder, Builder);
|
||||
}
|
||||
|
||||
/// \brief Returns whether the inner matcher \c Node. Returns false if \c Node
|
||||
/// is \c NULL.
|
||||
bool matchesDecl(const Decl *Node, ASTMatchFinder *Finder,
|
||||
|
|
@ -942,8 +1008,8 @@ typedef TypeList<Decl, Stmt, NestedNameSpecifier, NestedNameSpecifierLoc,
|
|||
|
||||
/// \brief All types that are supported by HasDeclarationMatcher above.
|
||||
typedef TypeList<CallExpr, CXXConstructExpr, DeclRefExpr, EnumType,
|
||||
InjectedClassNameType, LabelStmt, MemberExpr, QualType,
|
||||
RecordType, TagType, TemplateSpecializationType,
|
||||
InjectedClassNameType, LabelStmt, AddrLabelExpr, MemberExpr,
|
||||
QualType, RecordType, TagType, TemplateSpecializationType,
|
||||
TemplateTypeParmType, TypedefType,
|
||||
UnresolvedUsingType> HasDeclarationSupportedTypes;
|
||||
|
||||
|
|
@ -1110,8 +1176,6 @@ public:
|
|||
/// ChildT must be an AST base type.
|
||||
template <typename T, typename ChildT>
|
||||
class HasMatcher : public WrapperMatcherInterface<T> {
|
||||
static_assert(IsBaseType<ChildT>::value,
|
||||
"has only accepts base type matcher");
|
||||
|
||||
public:
|
||||
explicit HasMatcher(const Matcher<ChildT> &ChildMatcher)
|
||||
|
|
@ -1119,10 +1183,9 @@ public:
|
|||
|
||||
bool matches(const T &Node, ASTMatchFinder *Finder,
|
||||
BoundNodesTreeBuilder *Builder) const override {
|
||||
return Finder->matchesChildOf(
|
||||
Node, this->InnerMatcher, Builder,
|
||||
ASTMatchFinder::TK_IgnoreImplicitCastsAndParentheses,
|
||||
ASTMatchFinder::BK_First);
|
||||
return Finder->matchesChildOf(Node, this->InnerMatcher, Builder,
|
||||
ASTMatchFinder::TK_AsIs,
|
||||
ASTMatchFinder::BK_First);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -1385,9 +1448,8 @@ inline bool ValueEqualsMatcher<FloatingLiteral, llvm::APFloat>::matchesNode(
|
|||
/// casted to CXXRecordDecl and all given matchers match.
|
||||
template <typename SourceT, typename TargetT>
|
||||
class VariadicDynCastAllOfMatcher
|
||||
: public llvm::VariadicFunction<
|
||||
BindableMatcher<SourceT>, Matcher<TargetT>,
|
||||
makeDynCastAllOfComposite<SourceT, TargetT> > {
|
||||
: public VariadicFunction<BindableMatcher<SourceT>, Matcher<TargetT>,
|
||||
makeDynCastAllOfComposite<SourceT, TargetT>> {
|
||||
public:
|
||||
VariadicDynCastAllOfMatcher() {}
|
||||
};
|
||||
|
|
@ -1403,9 +1465,9 @@ public:
|
|||
/// \c Matcher<NestedNameSpecifier>.
|
||||
/// The returned matcher matches if all given matchers match.
|
||||
template <typename T>
|
||||
class VariadicAllOfMatcher : public llvm::VariadicFunction<
|
||||
BindableMatcher<T>, Matcher<T>,
|
||||
makeAllOfComposite<T> > {
|
||||
class VariadicAllOfMatcher
|
||||
: public VariadicFunction<BindableMatcher<T>, Matcher<T>,
|
||||
makeAllOfComposite<T>> {
|
||||
public:
|
||||
VariadicAllOfMatcher() {}
|
||||
};
|
||||
|
|
@ -1526,8 +1588,8 @@ public:
|
|||
new MatcherImpl<OuterT>(InnerMatcher, Getter<OuterT>::value()));
|
||||
}
|
||||
|
||||
struct Func : public llvm::VariadicFunction<Self, Matcher<InnerTBase>,
|
||||
&Self::create> {
|
||||
struct Func
|
||||
: public VariadicFunction<Self, Matcher<InnerTBase>, &Self::create> {
|
||||
Func() {}
|
||||
};
|
||||
|
||||
|
|
@ -1584,8 +1646,60 @@ struct NotEqualsBoundNodePredicate {
|
|||
ast_type_traits::DynTypedNode Node;
|
||||
};
|
||||
|
||||
template <typename Ty>
|
||||
struct GetBodyMatcher {
|
||||
static const Stmt *get(const Ty &Node) {
|
||||
return Node.getBody();
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
inline const Stmt *GetBodyMatcher<FunctionDecl>::get(const FunctionDecl &Node) {
|
||||
return Node.doesThisDeclarationHaveABody() ? Node.getBody() : nullptr;
|
||||
}
|
||||
|
||||
template <typename Ty>
|
||||
struct HasSizeMatcher {
|
||||
static bool hasSize(const Ty &Node, unsigned int N) {
|
||||
return Node.getSize() == N;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
inline bool HasSizeMatcher<StringLiteral>::hasSize(
|
||||
const StringLiteral &Node, unsigned int N) {
|
||||
return Node.getLength() == N;
|
||||
}
|
||||
|
||||
template <typename Ty>
|
||||
struct GetSourceExpressionMatcher {
|
||||
static const Expr *get(const Ty &Node) {
|
||||
return Node.getSubExpr();
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
inline const Expr *GetSourceExpressionMatcher<OpaqueValueExpr>::get(
|
||||
const OpaqueValueExpr &Node) {
|
||||
return Node.getSourceExpr();
|
||||
}
|
||||
|
||||
template <typename Ty>
|
||||
struct CompoundStmtMatcher {
|
||||
static const CompoundStmt *get(const Ty &Node) {
|
||||
return &Node;
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
inline const CompoundStmt *
|
||||
CompoundStmtMatcher<StmtExpr>::get(const StmtExpr &Node) {
|
||||
return Node.getSubStmt();
|
||||
}
|
||||
|
||||
|
||||
} // end namespace internal
|
||||
} // end namespace ast_matchers
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
#endif // LLVM_CLANG_ASTMATCHERS_ASTMATCHERSINTERNAL_H
|
||||
|
|
|
|||
|
|
@ -210,11 +210,16 @@ public:
|
|||
unsigned getLength() const {
|
||||
return EndScanList ? EndScanList - Position : 1;
|
||||
}
|
||||
void setEndScanList(const char *pos) { EndScanList = pos; }
|
||||
|
||||
bool isIntArg() const { return (kind >= IntArgBeg && kind <= IntArgEnd) ||
|
||||
kind == FreeBSDrArg || kind == FreeBSDyArg; }
|
||||
bool isUIntArg() const { return kind >= UIntArgBeg && kind <= UIntArgEnd; }
|
||||
bool isAnyIntArg() const { return kind >= IntArgBeg && kind <= UIntArgEnd; }
|
||||
bool isDoubleArg() const {
|
||||
return kind >= DoubleArgBeg && kind <= DoubleArgEnd;
|
||||
}
|
||||
|
||||
const char *toString() const;
|
||||
|
||||
bool isPrintfKind() const { return IsPrintf; }
|
||||
|
|
@ -413,11 +418,6 @@ public:
|
|||
bool isObjCArg() const { return kind >= ObjCBeg && kind <= ObjCEnd; }
|
||||
bool isDoubleArg() const { return kind >= DoubleArgBeg &&
|
||||
kind <= DoubleArgEnd; }
|
||||
unsigned getLength() const {
|
||||
// Conversion specifiers currently only are represented by
|
||||
// single characters, but we be flexible.
|
||||
return 1;
|
||||
}
|
||||
|
||||
static bool classof(const analyze_format_string::ConversionSpecifier *CS) {
|
||||
return CS->isPrintfKind();
|
||||
|
|
@ -546,8 +546,6 @@ public:
|
|||
ScanfConversionSpecifier(const char *pos, Kind k)
|
||||
: ConversionSpecifier(false, pos, k) {}
|
||||
|
||||
void setEndScanList(const char *pos) { EndScanList = pos; }
|
||||
|
||||
static bool classof(const analyze_format_string::ConversionSpecifier *CS) {
|
||||
return !CS->isPrintfKind();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,18 +58,15 @@ private:
|
|||
llvm::BumpPtrAllocator *Allocator;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace til
|
||||
} // end namespace threadSafety
|
||||
} // end namespace clang
|
||||
|
||||
|
||||
inline void *operator new(size_t Sz,
|
||||
clang::threadSafety::til::MemRegionRef &R) {
|
||||
return R.allocate(Sz);
|
||||
}
|
||||
|
||||
|
||||
namespace clang {
|
||||
namespace threadSafety {
|
||||
|
||||
|
|
@ -80,7 +77,6 @@ using clang::SourceLocation;
|
|||
|
||||
namespace til {
|
||||
|
||||
|
||||
// A simple fixed size array class that does not manage its own memory,
|
||||
// suitable for use with bump pointer allocation.
|
||||
template <class T> class SimpleArray {
|
||||
|
|
@ -117,7 +113,6 @@ public:
|
|||
Data = A.allocateT<T>(Ncp);
|
||||
Capacity = Ncp;
|
||||
memcpy(Data, Odata, sizeof(T) * Size);
|
||||
return;
|
||||
}
|
||||
|
||||
// Reserve space for at least N more items.
|
||||
|
|
@ -221,10 +216,8 @@ private:
|
|||
size_t Capacity;
|
||||
};
|
||||
|
||||
|
||||
} // end namespace til
|
||||
|
||||
|
||||
// A copy on write vector.
|
||||
// The vector can be in one of three states:
|
||||
// * invalid -- no operations are permitted.
|
||||
|
|
@ -346,13 +339,11 @@ private:
|
|||
VectorData *Data;
|
||||
};
|
||||
|
||||
|
||||
inline std::ostream& operator<<(std::ostream& ss, const StringRef str) {
|
||||
return ss.write(str.data(), str.size());
|
||||
}
|
||||
|
||||
|
||||
} // end namespace threadSafety
|
||||
} // end namespace clang
|
||||
|
||||
#endif // LLVM_CLANG_THREAD_SAFETY_UTIL_H
|
||||
#endif // LLVM_CLANG_THREAD_SAFETY_UTIL_H
|
||||
|
|
|
|||
|
|
@ -201,6 +201,10 @@ public:
|
|||
}
|
||||
return static_cast<T*>(data);
|
||||
}
|
||||
|
||||
/// Returns true if the root namespace of the given declaration is the 'std'
|
||||
/// C++ namespace.
|
||||
static bool isInStdNamespace(const Decl *D);
|
||||
private:
|
||||
ManagedAnalysis *&getAnalysisImpl(const void* tag);
|
||||
|
||||
|
|
|
|||
|
|
@ -595,6 +595,13 @@ public:
|
|||
return static_cast<const StackFrameContext *>(getData2());
|
||||
}
|
||||
|
||||
/// Returns the entry block in the CFG for the entered function.
|
||||
const CFGBlock *getEntry() const {
|
||||
const StackFrameContext *CalleeCtx = getCalleeContext();
|
||||
const CFG *CalleeCFG = CalleeCtx->getCFG();
|
||||
return &(CalleeCFG->getEntry());
|
||||
}
|
||||
|
||||
private:
|
||||
friend class ProgramPoint;
|
||||
CallEnter() {}
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ namespace LangAS {
|
|||
/// This uses a high starting offset so as not to conflict with any address
|
||||
/// space used by a target.
|
||||
enum ID {
|
||||
Offset = 0xFFFF00,
|
||||
Offset = 0x7FFF00,
|
||||
|
||||
opencl_global = Offset,
|
||||
opencl_local,
|
||||
|
|
|
|||
|
|
@ -82,6 +82,8 @@ def NormalVar : SubsetSubject<Var,
|
|||
S->getKind() != Decl::ImplicitParam &&
|
||||
S->getKind() != Decl::ParmVar &&
|
||||
S->getKind() != Decl::NonTypeTemplateParm}]>;
|
||||
def NonParmVar : SubsetSubject<Var,
|
||||
[{S->getKind() != Decl::ParmVar}]>;
|
||||
def NonBitField : SubsetSubject<Field,
|
||||
[{!S->isBitField()}]>;
|
||||
|
||||
|
|
@ -239,6 +241,8 @@ def MicrosoftExt : LangOpt<"MicrosoftExt">;
|
|||
def Borland : LangOpt<"Borland">;
|
||||
def CUDA : LangOpt<"CUDA">;
|
||||
def COnly : LangOpt<"CPlusPlus", 1>;
|
||||
def OpenCL : LangOpt<"OpenCL">;
|
||||
def RenderScript : LangOpt<"RenderScript">;
|
||||
|
||||
// Defines targets for target-specific attributes. The list of strings should
|
||||
// specify architectures for which the target applies, based off the ArchType
|
||||
|
|
@ -252,6 +256,7 @@ def TargetARM : TargetArch<["arm", "thumb"]>;
|
|||
def TargetMips : TargetArch<["mips", "mipsel"]>;
|
||||
def TargetMSP430 : TargetArch<["msp430"]>;
|
||||
def TargetX86 : TargetArch<["x86"]>;
|
||||
def TargetAnyX86 : TargetArch<["x86", "x86_64"]>;
|
||||
def TargetWindows : TargetArch<["x86", "x86_64", "arm", "thumb"]> {
|
||||
let OSes = ["Win32"];
|
||||
}
|
||||
|
|
@ -310,6 +315,9 @@ class TypeAttr : Attr {
|
|||
let ASTNode = 0;
|
||||
}
|
||||
|
||||
/// A stmt attribute is not processed on a declaration or a type.
|
||||
class StmtAttr : Attr;
|
||||
|
||||
/// An inheritable attribute is inherited by later redeclarations.
|
||||
class InheritableAttr : Attr;
|
||||
|
||||
|
|
@ -337,6 +345,11 @@ class TargetSpecificAttr<TargetArch target> {
|
|||
/// redeclarations, even when it's written on a parameter.
|
||||
class InheritableParamAttr : InheritableAttr;
|
||||
|
||||
/// An attribute which changes the ABI rules for a specific parameter.
|
||||
class ParameterABIAttr : InheritableParamAttr {
|
||||
let Subjects = SubjectList<[ParmVar]>;
|
||||
}
|
||||
|
||||
/// An ignored attribute, which we parse but discard with no checking.
|
||||
class IgnoredAttr : Attr {
|
||||
let Ignored = 1;
|
||||
|
|
@ -349,6 +362,14 @@ class IgnoredAttr : Attr {
|
|||
// Attributes begin here
|
||||
//
|
||||
|
||||
def AbiTag : Attr {
|
||||
let Spellings = [GCC<"abi_tag">];
|
||||
let Args = [VariadicStringArgument<"Tags">];
|
||||
let Subjects = SubjectList<[Struct, Var, Function, Namespace], ErrorDiag,
|
||||
"ExpectedStructClassVariableFunctionOrInlineNamespace">;
|
||||
let Documentation = [AbiTagsDocs];
|
||||
}
|
||||
|
||||
def AddressSpace : TypeAttr {
|
||||
let Spellings = [GNU<"address_space">];
|
||||
let Args = [IntArgument<"AddressSpace">];
|
||||
|
|
@ -407,6 +428,22 @@ def AlwaysInline : InheritableAttr {
|
|||
let Documentation = [Undocumented];
|
||||
}
|
||||
|
||||
def XRayInstrument : InheritableAttr {
|
||||
let Spellings = [GNU<"xray_always_instrument">,
|
||||
CXX11<"clang", "xray_always_instrument">,
|
||||
GNU<"xray_never_instrument">,
|
||||
CXX11<"clang", "xray_never_instrument">];
|
||||
let Subjects = SubjectList<[CXXMethod, ObjCMethod, Function], WarnDiag,
|
||||
"ExpectedFunctionOrMethod">;
|
||||
let Accessors = [Accessor<"alwaysXRayInstrument",
|
||||
[GNU<"xray_always_instrument">,
|
||||
CXX11<"clang", "xray_always_instrument">]>,
|
||||
Accessor<"neverXRayInstrument",
|
||||
[GNU<"xray_never_instrument">,
|
||||
CXX11<"clang", "xray_never_instrument">]>];
|
||||
let Documentation = [XRayDocs];
|
||||
}
|
||||
|
||||
def TLSModel : InheritableAttr {
|
||||
let Spellings = [GCC<"tls_model">];
|
||||
let Subjects = SubjectList<[TLSVar], ErrorDiag, "ExpectedTLSVar">;
|
||||
|
|
@ -426,8 +463,8 @@ def Annotate : InheritableParamAttr {
|
|||
}
|
||||
|
||||
def ARMInterrupt : InheritableAttr, TargetSpecificAttr<TargetARM> {
|
||||
// NOTE: If you add any additional spellings, MSP430Interrupt's and
|
||||
// MipsInterrupt's spellings must match.
|
||||
// NOTE: If you add any additional spellings, MSP430Interrupt's,
|
||||
// MipsInterrupt's and AnyX86Interrupt's spellings must match.
|
||||
let Spellings = [GNU<"interrupt">];
|
||||
let Args = [EnumArgument<"Interrupt", "InterruptType",
|
||||
["IRQ", "FIQ", "SWI", "ABORT", "UNDEF", ""],
|
||||
|
|
@ -449,17 +486,18 @@ def Availability : InheritableAttr {
|
|||
let Spellings = [GNU<"availability">];
|
||||
let Args = [IdentifierArgument<"platform">, VersionArgument<"introduced">,
|
||||
VersionArgument<"deprecated">, VersionArgument<"obsoleted">,
|
||||
BoolArgument<"unavailable">, StringArgument<"message">];
|
||||
BoolArgument<"unavailable">, StringArgument<"message">,
|
||||
BoolArgument<"strict">, StringArgument<"replacement">];
|
||||
let AdditionalMembers =
|
||||
[{static llvm::StringRef getPrettyPlatformName(llvm::StringRef Platform) {
|
||||
return llvm::StringSwitch<llvm::StringRef>(Platform)
|
||||
.Case("android", "Android")
|
||||
.Case("ios", "iOS")
|
||||
.Case("macosx", "OS X")
|
||||
.Case("macos", "macOS")
|
||||
.Case("tvos", "tvOS")
|
||||
.Case("watchos", "watchOS")
|
||||
.Case("ios_app_extension", "iOS (App Extension)")
|
||||
.Case("macosx_app_extension", "OS X (App Extension)")
|
||||
.Case("macos_app_extension", "macOS (App Extension)")
|
||||
.Case("tvos_app_extension", "tvOS (App Extension)")
|
||||
.Case("watchos_app_extension", "watchOS (App Extension)")
|
||||
.Default(llvm::StringRef());
|
||||
|
|
@ -654,20 +692,27 @@ def OpenCLKernel : InheritableAttr {
|
|||
let Documentation = [Undocumented];
|
||||
}
|
||||
|
||||
def OpenCLUnrollHint : InheritableAttr {
|
||||
let Spellings = [GNU<"opencl_unroll_hint">];
|
||||
let Args = [UnsignedArgument<"UnrollHint">];
|
||||
let Documentation = [OpenCLUnrollHintDocs];
|
||||
}
|
||||
|
||||
// This attribute is both a type attribute, and a declaration attribute (for
|
||||
// parameter variables).
|
||||
def OpenCLImageAccess : Attr {
|
||||
def OpenCLAccess : Attr {
|
||||
let Spellings = [Keyword<"__read_only">, Keyword<"read_only">,
|
||||
Keyword<"__write_only">, Keyword<"write_only">,
|
||||
Keyword<"__read_write">, Keyword<"read_write">];
|
||||
let Subjects = SubjectList<[ParmVar], ErrorDiag>;
|
||||
let Subjects = SubjectList<[ParmVar, TypedefName], ErrorDiag,
|
||||
"ExpectedParameterOrTypedef">;
|
||||
let Accessors = [Accessor<"isReadOnly", [Keyword<"__read_only">,
|
||||
Keyword<"read_only">]>,
|
||||
Accessor<"isReadWrite", [Keyword<"__read_write">,
|
||||
Keyword<"read_write">]>,
|
||||
Accessor<"isWriteOnly", [Keyword<"__write_only">,
|
||||
Keyword<"write_only">]>];
|
||||
let Documentation = [Undocumented];
|
||||
let Documentation = [OpenCLAccessDocs];
|
||||
}
|
||||
|
||||
def OpenCLPrivateAddressSpace : TypeAttr {
|
||||
|
|
@ -695,11 +740,29 @@ def OpenCLGenericAddressSpace : TypeAttr {
|
|||
let Documentation = [OpenCLAddressSpaceGenericDocs];
|
||||
}
|
||||
|
||||
def OpenCLNoSVM : Attr {
|
||||
let Spellings = [GNU<"nosvm">];
|
||||
let Subjects = SubjectList<[Var]>;
|
||||
let Documentation = [OpenCLNoSVMDocs];
|
||||
let LangOpts = [OpenCL];
|
||||
let ASTNode = 0;
|
||||
}
|
||||
|
||||
def RenderScriptKernel : Attr {
|
||||
let Spellings = [GNU<"kernel">];
|
||||
let Subjects = SubjectList<[Function]>;
|
||||
let Documentation = [RenderScriptKernelAttributeDocs];
|
||||
let LangOpts = [RenderScript];
|
||||
}
|
||||
|
||||
def Deprecated : InheritableAttr {
|
||||
let Spellings = [GCC<"deprecated">, Declspec<"deprecated">,
|
||||
CXX11<"","deprecated", 201309>];
|
||||
let Args = [StringArgument<"Message", 1>];
|
||||
let Documentation = [Undocumented];
|
||||
let Args = [StringArgument<"Message", 1>,
|
||||
// An optional string argument that enables us to provide a
|
||||
// Fix-It.
|
||||
StringArgument<"Replacement", 1>];
|
||||
let Documentation = [DeprecatedDocs];
|
||||
}
|
||||
|
||||
def Destructor : InheritableAttr {
|
||||
|
|
@ -709,6 +772,12 @@ def Destructor : InheritableAttr {
|
|||
let Documentation = [Undocumented];
|
||||
}
|
||||
|
||||
def EmptyBases : InheritableAttr, TargetSpecificAttr<TargetMicrosoftCXXABI> {
|
||||
let Spellings = [Declspec<"empty_bases">];
|
||||
let Subjects = SubjectList<[CXXRecord]>;
|
||||
let Documentation = [EmptyBasesDocs];
|
||||
}
|
||||
|
||||
def EnableIf : InheritableAttr {
|
||||
let Spellings = [GNU<"enable_if">];
|
||||
let Subjects = SubjectList<[Function]>;
|
||||
|
|
@ -725,8 +794,9 @@ def ExtVectorType : Attr {
|
|||
let Documentation = [Undocumented];
|
||||
}
|
||||
|
||||
def FallThrough : Attr {
|
||||
let Spellings = [CXX11<"clang", "fallthrough">];
|
||||
def FallThrough : StmtAttr {
|
||||
let Spellings = [CXX11<"", "fallthrough", 201603>,
|
||||
CXX11<"clang", "fallthrough">];
|
||||
// let Subjects = [NullStmt];
|
||||
let Documentation = [FallthroughDocs];
|
||||
}
|
||||
|
|
@ -818,12 +888,26 @@ def IBOutletCollection : InheritableAttr {
|
|||
let Documentation = [Undocumented];
|
||||
}
|
||||
|
||||
def IFunc : Attr {
|
||||
let Spellings = [GCC<"ifunc">];
|
||||
let Args = [StringArgument<"Resolver">];
|
||||
let Subjects = SubjectList<[Function]>;
|
||||
let Documentation = [IFuncDocs];
|
||||
}
|
||||
|
||||
def Restrict : InheritableAttr {
|
||||
let Spellings = [Declspec<"restrict">, GCC<"malloc">];
|
||||
let Subjects = SubjectList<[Function]>;
|
||||
let Documentation = [Undocumented];
|
||||
}
|
||||
|
||||
def LayoutVersion : InheritableAttr, TargetSpecificAttr<TargetMicrosoftCXXABI> {
|
||||
let Spellings = [Declspec<"layout_version">];
|
||||
let Args = [UnsignedArgument<"Version">];
|
||||
let Subjects = SubjectList<[CXXRecord]>;
|
||||
let Documentation = [LayoutVersionDocs];
|
||||
}
|
||||
|
||||
def MaxFieldAlignment : InheritableAttr {
|
||||
// This attribute has no spellings as it is only ever created implicitly.
|
||||
let Spellings = [];
|
||||
|
|
@ -845,8 +929,8 @@ def MSABI : InheritableAttr {
|
|||
}
|
||||
|
||||
def MSP430Interrupt : InheritableAttr, TargetSpecificAttr<TargetMSP430> {
|
||||
// NOTE: If you add any additional spellings, ARMInterrupt's and
|
||||
// MipsInterrupt's spellings must match.
|
||||
// NOTE: If you add any additional spellings, ARMInterrupt's, MipsInterrupt's
|
||||
// and AnyX86Interrupt's spellings must match.
|
||||
let Spellings = [GNU<"interrupt">];
|
||||
let Args = [UnsignedArgument<"Number">];
|
||||
let ParseKind = "Interrupt";
|
||||
|
|
@ -861,8 +945,8 @@ def Mips16 : InheritableAttr, TargetSpecificAttr<TargetMips> {
|
|||
}
|
||||
|
||||
def MipsInterrupt : InheritableAttr, TargetSpecificAttr<TargetMips> {
|
||||
// NOTE: If you add any additional spellings, ARMInterrupt's and
|
||||
// MSP430Interrupt's spellings must match.
|
||||
// NOTE: If you add any additional spellings, ARMInterrupt's,
|
||||
// MSP430Interrupt's and AnyX86Interrupt's spellings must match.
|
||||
let Spellings = [GNU<"interrupt">];
|
||||
let Subjects = SubjectList<[Function]>;
|
||||
let Args = [EnumArgument<"Interrupt", "InterruptType",
|
||||
|
|
@ -878,6 +962,8 @@ def MipsInterrupt : InheritableAttr, TargetSpecificAttr<TargetMips> {
|
|||
|
||||
def Mode : Attr {
|
||||
let Spellings = [GCC<"mode">];
|
||||
let Subjects = SubjectList<[Var, Enum, TypedefName, Field], ErrorDiag,
|
||||
"ExpectedVariableEnumFieldOrTypedef">;
|
||||
let Args = [IdentifierArgument<"Mode">];
|
||||
let Documentation = [Undocumented];
|
||||
}
|
||||
|
|
@ -927,7 +1013,9 @@ def NoCommon : InheritableAttr {
|
|||
|
||||
def NoDebug : InheritableAttr {
|
||||
let Spellings = [GCC<"nodebug">];
|
||||
let Documentation = [Undocumented];
|
||||
let Subjects = SubjectList<[FunctionLike, ObjCMethod, NonParmVar], WarnDiag,
|
||||
"ExpectedVariableOrFunction">;
|
||||
let Documentation = [NoDebugDocs];
|
||||
}
|
||||
|
||||
def NoDuplicate : InheritableAttr {
|
||||
|
|
@ -1202,6 +1290,12 @@ def ObjCRuntimeName : Attr {
|
|||
let Documentation = [ObjCRuntimeNameDocs];
|
||||
}
|
||||
|
||||
def ObjCRuntimeVisible : Attr {
|
||||
let Spellings = [GNU<"objc_runtime_visible">];
|
||||
let Subjects = SubjectList<[ObjCInterface], ErrorDiag>;
|
||||
let Documentation = [ObjCRuntimeVisibleDocs];
|
||||
}
|
||||
|
||||
def ObjCBoxable : Attr {
|
||||
let Spellings = [GNU<"objc_boxable">];
|
||||
let Subjects = SubjectList<[Record], ErrorDiag, "ExpectedStructOrUnion">;
|
||||
|
|
@ -1325,6 +1419,27 @@ def StdCall : InheritableAttr {
|
|||
let Documentation = [StdCallDocs];
|
||||
}
|
||||
|
||||
def SwiftCall : InheritableAttr {
|
||||
let Spellings = [GCC<"swiftcall">];
|
||||
// let Subjects = SubjectList<[Function]>;
|
||||
let Documentation = [SwiftCallDocs];
|
||||
}
|
||||
|
||||
def SwiftContext : ParameterABIAttr {
|
||||
let Spellings = [GCC<"swift_context">];
|
||||
let Documentation = [SwiftContextDocs];
|
||||
}
|
||||
|
||||
def SwiftErrorResult : ParameterABIAttr {
|
||||
let Spellings = [GCC<"swift_error_result">];
|
||||
let Documentation = [SwiftErrorResultDocs];
|
||||
}
|
||||
|
||||
def SwiftIndirectResult : ParameterABIAttr {
|
||||
let Spellings = [GCC<"swift_indirect_result">];
|
||||
let Documentation = [SwiftIndirectResultDocs];
|
||||
}
|
||||
|
||||
def SysVABI : InheritableAttr {
|
||||
let Spellings = [GCC<"sysv_abi">];
|
||||
// let Subjects = [Function, ObjCMethod];
|
||||
|
|
@ -1351,6 +1466,16 @@ def Pascal : InheritableAttr {
|
|||
let Documentation = [Undocumented];
|
||||
}
|
||||
|
||||
def PreserveMost : InheritableAttr {
|
||||
let Spellings = [GNU<"preserve_most">];
|
||||
let Documentation = [PreserveMostDocs];
|
||||
}
|
||||
|
||||
def PreserveAll : InheritableAttr {
|
||||
let Spellings = [GNU<"preserve_all">];
|
||||
let Documentation = [PreserveAllDocs];
|
||||
}
|
||||
|
||||
def Target : InheritableAttr {
|
||||
let Spellings = [GCC<"target">];
|
||||
let Args = [StringArgument<"featuresStr">];
|
||||
|
|
@ -1436,11 +1561,11 @@ def ObjCRequiresPropertyDefs : InheritableAttr {
|
|||
}
|
||||
|
||||
def Unused : InheritableAttr {
|
||||
let Spellings = [GCC<"unused">];
|
||||
let Subjects = SubjectList<[Var, ObjCIvar, Type, Label, Field, ObjCMethod,
|
||||
FunctionLike], WarnDiag,
|
||||
"ExpectedVariableFunctionOrLabel">;
|
||||
let Documentation = [Undocumented];
|
||||
let Spellings = [CXX11<"", "maybe_unused", 201603>, GCC<"unused">];
|
||||
let Subjects = SubjectList<[Var, ObjCIvar, Type, Enum, EnumConstant, Label,
|
||||
Field, ObjCMethod, FunctionLike], WarnDiag,
|
||||
"ExpectedForMaybeUnused">;
|
||||
let Documentation = [WarnMaybeUnusedDocs];
|
||||
}
|
||||
|
||||
def Used : InheritableAttr {
|
||||
|
|
@ -1501,11 +1626,12 @@ def WarnUnused : InheritableAttr {
|
|||
}
|
||||
|
||||
def WarnUnusedResult : InheritableAttr {
|
||||
let Spellings = [GCC<"warn_unused_result">,
|
||||
CXX11<"clang", "warn_unused_result">];
|
||||
let Subjects = SubjectList<[ObjCMethod, CXXRecord, FunctionLike], WarnDiag,
|
||||
"ExpectedFunctionMethodOrClass">;
|
||||
let Documentation = [Undocumented];
|
||||
let Spellings = [CXX11<"", "nodiscard", 201603>,
|
||||
CXX11<"clang", "warn_unused_result">,
|
||||
GCC<"warn_unused_result">];
|
||||
let Subjects = SubjectList<[ObjCMethod, Enum, CXXRecord, FunctionLike],
|
||||
WarnDiag, "ExpectedFunctionMethodEnumOrClass">;
|
||||
let Documentation = [WarnUnusedResultsDocs];
|
||||
}
|
||||
|
||||
def Weak : InheritableAttr {
|
||||
|
|
@ -1527,6 +1653,22 @@ def WeakRef : InheritableAttr {
|
|||
let Documentation = [Undocumented];
|
||||
}
|
||||
|
||||
def LTOVisibilityPublic : InheritableAttr {
|
||||
let Spellings = [CXX11<"clang", "lto_visibility_public">];
|
||||
let Subjects = SubjectList<[Record]>;
|
||||
let Documentation = [LTOVisibilityDocs];
|
||||
}
|
||||
|
||||
def AnyX86Interrupt : InheritableAttr, TargetSpecificAttr<TargetAnyX86> {
|
||||
// NOTE: If you add any additional spellings, ARMInterrupt's,
|
||||
// MSP430Interrupt's and MipsInterrupt's spellings must match.
|
||||
let Spellings = [GNU<"interrupt">];
|
||||
let Subjects = SubjectList<[HasFunctionProto]>;
|
||||
let ParseKind = "Interrupt";
|
||||
let HasCustomParsing = 1;
|
||||
let Documentation = [AnyX86InterruptDocs];
|
||||
}
|
||||
|
||||
def X86ForceAlignArgPointer : InheritableAttr, TargetSpecificAttr<TargetX86> {
|
||||
let Spellings = [GNU<"force_align_arg_pointer">];
|
||||
// Technically, this appertains to a FunctionDecl, but the target-specific
|
||||
|
|
@ -1945,14 +2087,14 @@ def MSStruct : InheritableAttr {
|
|||
|
||||
def DLLExport : InheritableAttr, TargetSpecificAttr<TargetWindows> {
|
||||
let Spellings = [Declspec<"dllexport">, GCC<"dllexport">];
|
||||
let Subjects = SubjectList<[Function, Var, CXXRecord]>;
|
||||
let Documentation = [Undocumented];
|
||||
let Subjects = SubjectList<[Function, Var, CXXRecord, ObjCInterface]>;
|
||||
let Documentation = [DLLExportDocs];
|
||||
}
|
||||
|
||||
def DLLImport : InheritableAttr, TargetSpecificAttr<TargetWindows> {
|
||||
let Spellings = [Declspec<"dllimport">, GCC<"dllimport">];
|
||||
let Subjects = SubjectList<[Function, Var, CXXRecord]>;
|
||||
let Documentation = [Undocumented];
|
||||
let Subjects = SubjectList<[Function, Var, CXXRecord, ObjCInterface]>;
|
||||
let Documentation = [DLLImportDocs];
|
||||
}
|
||||
|
||||
def SelectAny : InheritableAttr {
|
||||
|
|
@ -2055,10 +2197,6 @@ def InitSeg : Attr {
|
|||
}];
|
||||
}
|
||||
|
||||
def Unaligned : IgnoredAttr {
|
||||
let Spellings = [Keyword<"__unaligned">];
|
||||
}
|
||||
|
||||
def LoopHint : Attr {
|
||||
/// #pragma clang loop <option> directive
|
||||
/// vectorize: vectorizes loop operations if State == Enable.
|
||||
|
|
@ -2067,6 +2205,7 @@ def LoopHint : Attr {
|
|||
/// interleave_count: interleaves 'Value' loop interations.
|
||||
/// unroll: fully unroll loop if State == Enable.
|
||||
/// unroll_count: unrolls loop 'Value' times.
|
||||
/// distribute: attempt to distribute loop if State == Enable
|
||||
|
||||
/// #pragma unroll <argument> directive
|
||||
/// <no arg>: fully unrolls loop.
|
||||
|
|
@ -2079,9 +2218,9 @@ def LoopHint : Attr {
|
|||
/// State of the loop optimization specified by the spelling.
|
||||
let Args = [EnumArgument<"Option", "OptionType",
|
||||
["vectorize", "vectorize_width", "interleave", "interleave_count",
|
||||
"unroll", "unroll_count"],
|
||||
"unroll", "unroll_count", "distribute"],
|
||||
["Vectorize", "VectorizeWidth", "Interleave", "InterleaveCount",
|
||||
"Unroll", "UnrollCount"]>,
|
||||
"Unroll", "UnrollCount", "Distribute"]>,
|
||||
EnumArgument<"State", "LoopHintState",
|
||||
["enable", "disable", "numeric", "assume_safety", "full"],
|
||||
["Enable", "Disable", "Numeric", "AssumeSafety", "Full"]>,
|
||||
|
|
@ -2096,6 +2235,7 @@ def LoopHint : Attr {
|
|||
case InterleaveCount: return "interleave_count";
|
||||
case Unroll: return "unroll";
|
||||
case UnrollCount: return "unroll_count";
|
||||
case Distribute: return "distribute";
|
||||
}
|
||||
llvm_unreachable("Unhandled LoopHint option.");
|
||||
}
|
||||
|
|
@ -2165,6 +2305,98 @@ def OMPThreadPrivateDecl : InheritableAttr {
|
|||
let Documentation = [Undocumented];
|
||||
}
|
||||
|
||||
def OMPCaptureNoInit : InheritableAttr {
|
||||
// This attribute has no spellings as it is only ever created implicitly.
|
||||
let Spellings = [];
|
||||
let SemaHandler = 0;
|
||||
let Documentation = [Undocumented];
|
||||
}
|
||||
|
||||
def OMPDeclareSimdDecl : Attr {
|
||||
let Spellings = [Pragma<"omp", "declare simd">];
|
||||
let Subjects = SubjectList<[Function]>;
|
||||
let SemaHandler = 0;
|
||||
let HasCustomParsing = 1;
|
||||
let Documentation = [OMPDeclareSimdDocs];
|
||||
let Args = [
|
||||
EnumArgument<"BranchState", "BranchStateTy",
|
||||
[ "", "inbranch", "notinbranch" ],
|
||||
[ "BS_Undefined", "BS_Inbranch", "BS_Notinbranch" ]>,
|
||||
ExprArgument<"Simdlen">, VariadicExprArgument<"Uniforms">,
|
||||
VariadicExprArgument<"Aligneds">, VariadicExprArgument<"Alignments">,
|
||||
VariadicExprArgument<"Linears">, VariadicUnsignedArgument<"Modifiers">,
|
||||
VariadicExprArgument<"Steps">
|
||||
];
|
||||
let AdditionalMembers = [{
|
||||
void printPrettyPragma(raw_ostream & OS, const PrintingPolicy &Policy)
|
||||
const {
|
||||
if (getBranchState() != BS_Undefined)
|
||||
OS << ConvertBranchStateTyToStr(getBranchState()) << " ";
|
||||
if (auto *E = getSimdlen()) {
|
||||
OS << "simdlen(";
|
||||
E->printPretty(OS, nullptr, Policy);
|
||||
OS << ") ";
|
||||
}
|
||||
if (uniforms_size() > 0) {
|
||||
OS << "uniform";
|
||||
StringRef Sep = "(";
|
||||
for (auto *E : uniforms()) {
|
||||
OS << Sep;
|
||||
E->printPretty(OS, nullptr, Policy);
|
||||
Sep = ", ";
|
||||
}
|
||||
OS << ") ";
|
||||
}
|
||||
alignments_iterator NI = alignments_begin();
|
||||
for (auto *E : aligneds()) {
|
||||
OS << "aligned(";
|
||||
E->printPretty(OS, nullptr, Policy);
|
||||
if (*NI) {
|
||||
OS << ": ";
|
||||
(*NI)->printPretty(OS, nullptr, Policy);
|
||||
}
|
||||
OS << ") ";
|
||||
++NI;
|
||||
}
|
||||
steps_iterator I = steps_begin();
|
||||
modifiers_iterator MI = modifiers_begin();
|
||||
for (auto *E : linears()) {
|
||||
OS << "linear(";
|
||||
if (*MI != OMPC_LINEAR_unknown)
|
||||
OS << getOpenMPSimpleClauseTypeName(OMPC_linear, *MI) << "(";
|
||||
E->printPretty(OS, nullptr, Policy);
|
||||
if (*MI != OMPC_LINEAR_unknown)
|
||||
OS << ")";
|
||||
if (*I) {
|
||||
OS << ": ";
|
||||
(*I)->printPretty(OS, nullptr, Policy);
|
||||
}
|
||||
OS << ") ";
|
||||
++I;
|
||||
++MI;
|
||||
}
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
def OMPDeclareTargetDecl : Attr {
|
||||
let Spellings = [Pragma<"omp", "declare target">];
|
||||
let SemaHandler = 0;
|
||||
let Documentation = [OMPDeclareTargetDocs];
|
||||
let Args = [
|
||||
EnumArgument<"MapType", "MapTypeTy",
|
||||
[ "to", "link" ],
|
||||
[ "MT_To", "MT_Link" ]>
|
||||
];
|
||||
let AdditionalMembers = [{
|
||||
void printPrettyPragma(raw_ostream &OS, const PrintingPolicy &Policy) const {
|
||||
// Use fake syntax because it is for testing and debugging purpose only.
|
||||
if (getMapType() != MT_To)
|
||||
OS << ConvertMapTypeTyToStr(getMapType()) << " ";
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
def InternalLinkage : InheritableAttr {
|
||||
let Spellings = [GNU<"internal_linkage">, CXX11<"clang", "internal_linkage">];
|
||||
let Subjects = SubjectList<[Var, Function, CXXRecord]>;
|
||||
|
|
|
|||
|
|
@ -67,6 +67,34 @@ TLS models are mutually exclusive.
|
|||
}];
|
||||
}
|
||||
|
||||
def DLLExportDocs : Documentation {
|
||||
let Category = DocCatVariable;
|
||||
let Content = [{
|
||||
The ``__declspec(dllexport)`` attribute declares a variable, function, or
|
||||
Objective-C interface to be exported from the module. It is available under the
|
||||
``-fdeclspec`` flag for compatibility with various compilers. The primary use
|
||||
is for COFF object files which explicitly specify what interfaces are available
|
||||
for external use. See the dllexport_ documentation on MSDN for more
|
||||
information.
|
||||
|
||||
.. _dllexport: https://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx
|
||||
}];
|
||||
}
|
||||
|
||||
def DLLImportDocs : Documentation {
|
||||
let Category = DocCatVariable;
|
||||
let Content = [{
|
||||
The ``__declspec(dllimport)`` attribute declares a variable, function, or
|
||||
Objective-C interface to be imported from an external module. It is available
|
||||
under the ``-fdeclspec`` flag for compatibility with various compilers. The
|
||||
primary use is for COFF object files which explicitly specify what interfaces
|
||||
are imported from external modules. See the dllimport_ documentation on MSDN
|
||||
for more information.
|
||||
|
||||
.. _dllimport: https://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx
|
||||
}];
|
||||
}
|
||||
|
||||
def ThreadDocs : Documentation {
|
||||
let Category = DocCatVariable;
|
||||
let Content = [{
|
||||
|
|
@ -260,6 +288,55 @@ only a single candidate. In a call to g(1, 1), the call is ambiguous even though
|
|||
not ODR-equivalent.
|
||||
|
||||
Query for this feature with ``__has_attribute(enable_if)``.
|
||||
|
||||
Note that functions with one or more ``enable_if`` attributes may not have
|
||||
their address taken, unless all of the conditions specified by said
|
||||
``enable_if`` are constants that evaluate to ``true``. For example:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
const int TrueConstant = 1;
|
||||
const int FalseConstant = 0;
|
||||
int f(int a) __attribute__((enable_if(a > 0, "")));
|
||||
int g(int a) __attribute__((enable_if(a == 0 || a != 0, "")));
|
||||
int h(int a) __attribute__((enable_if(1, "")));
|
||||
int i(int a) __attribute__((enable_if(TrueConstant, "")));
|
||||
int j(int a) __attribute__((enable_if(FalseConstant, "")));
|
||||
|
||||
void fn() {
|
||||
int (*ptr)(int);
|
||||
ptr = &f; // error: 'a > 0' is not always true
|
||||
ptr = &g; // error: 'a == 0 || a != 0' is not a truthy constant
|
||||
ptr = &h; // OK: 1 is a truthy constant
|
||||
ptr = &i; // OK: 'TrueConstant' is a truthy constant
|
||||
ptr = &j; // error: 'FalseConstant' is a constant, but not truthy
|
||||
}
|
||||
|
||||
Because ``enable_if`` evaluation happens during overload resolution,
|
||||
``enable_if`` may give unintuitive results when used with templates, depending
|
||||
on when overloads are resolved. In the example below, clang will emit a
|
||||
diagnostic about no viable overloads for ``foo`` in ``bar``, but not in ``baz``:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
double foo(int i) __attribute__((enable_if(i > 0, "")));
|
||||
void *foo(int i) __attribute__((enable_if(i <= 0, "")));
|
||||
template <int I>
|
||||
auto bar() { return foo(I); }
|
||||
|
||||
template <typename T>
|
||||
auto baz() { return foo(T::number); }
|
||||
|
||||
struct WithNumber { constexpr static int number = 1; };
|
||||
void callThem() {
|
||||
bar<sizeof(WithNumber)>();
|
||||
baz<WithNumber>();
|
||||
}
|
||||
|
||||
This is because, in ``bar``, ``foo`` is resolved prior to template
|
||||
instantiation, so the value for ``I`` isn't known (thus, both ``enable_if``
|
||||
conditions for ``foo`` fail). However, in ``baz``, ``foo`` is resolved during
|
||||
template instantiation, so the value for ``T::number`` is known.
|
||||
}];
|
||||
}
|
||||
|
||||
|
|
@ -471,6 +548,15 @@ Query for this feature with ``__has_attribute(objc_method_family)``.
|
|||
}];
|
||||
}
|
||||
|
||||
def NoDebugDocs : Documentation {
|
||||
let Category = DocCatVariable;
|
||||
let Content = [{
|
||||
The ``nodebug`` attribute allows you to suppress debugging information for a
|
||||
function or method, or for a variable that is not a parameter or a non-static
|
||||
data member.
|
||||
}];
|
||||
}
|
||||
|
||||
def NoDuplicateDocs : Documentation {
|
||||
let Category = DocCatFunction;
|
||||
let Content = [{
|
||||
|
|
@ -589,6 +675,13 @@ can only be placed before an @protocol or @interface declaration:
|
|||
}];
|
||||
}
|
||||
|
||||
def ObjCRuntimeVisibleDocs : Documentation {
|
||||
let Category = DocCatFunction;
|
||||
let Content = [{
|
||||
This attribute specifies that the Objective-C class to which it applies is visible to the Objective-C runtime but not to the linker. Classes annotated with this attribute cannot be subclassed and cannot have categories defined for them.
|
||||
}];
|
||||
}
|
||||
|
||||
def ObjCBoxableDocs : Documentation {
|
||||
let Category = DocCatFunction;
|
||||
let Content = [{
|
||||
|
|
@ -626,7 +719,7 @@ the function declaration for a hypothetical function ``f``:
|
|||
|
||||
.. code-block:: c++
|
||||
|
||||
void f(void) __attribute__((availability(macosx,introduced=10.4,deprecated=10.6,obsoleted=10.7)));
|
||||
void f(void) __attribute__((availability(macos,introduced=10.4,deprecated=10.6,obsoleted=10.7)));
|
||||
|
||||
The availability attribute states that ``f`` was introduced in Mac OS X 10.4,
|
||||
deprecated in Mac OS X 10.6, and obsoleted in Mac OS X 10.7. This information
|
||||
|
|
@ -661,6 +754,11 @@ message=\ *string-literal*
|
|||
error about use of a deprecated or obsoleted declaration. Useful to direct
|
||||
users to replacement APIs.
|
||||
|
||||
replacement=\ *string-literal*
|
||||
Additional message text that Clang will use to provide Fix-It when emitting
|
||||
a warning about use of a deprecated declaration. The Fix-It will replace
|
||||
the deprecated declaration with the new declaration specified.
|
||||
|
||||
Multiple availability attributes can be placed on a declaration, which may
|
||||
correspond to different platforms. Only the availability attribute with the
|
||||
platform corresponding to the target platform will be used; any others will be
|
||||
|
|
@ -673,9 +771,11 @@ are:
|
|||
the ``-mios-version-min=*version*`` or ``-miphoneos-version-min=*version*``
|
||||
command-line arguments.
|
||||
|
||||
``macosx``
|
||||
``macos``
|
||||
Apple's Mac OS X operating system. The minimum deployment target is
|
||||
specified by the ``-mmacosx-version-min=*version*`` command-line argument.
|
||||
``macosx`` is supported for backward-compatibility reasons, but it is
|
||||
deprecated.
|
||||
|
||||
``tvos``
|
||||
Apple's tvOS operating system. The minimum deployment target is specified by
|
||||
|
|
@ -685,15 +785,21 @@ are:
|
|||
Apple's watchOS operating system. The minimum deployment target is specified by
|
||||
the ``-mwatchos-version-min=*version*`` command-line argument.
|
||||
|
||||
A declaration can be used even when deploying back to a platform version prior
|
||||
to when the declaration was introduced. When this happens, the declaration is
|
||||
`weakly linked
|
||||
A declaration can typically be used even when deploying back to a platform
|
||||
version prior to when the declaration was introduced. When this happens, the
|
||||
declaration is `weakly linked
|
||||
<https://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html>`_,
|
||||
as if the ``weak_import`` attribute were added to the declaration. A
|
||||
weakly-linked declaration may or may not be present a run-time, and a program
|
||||
can determine whether the declaration is present by checking whether the
|
||||
address of that declaration is non-NULL.
|
||||
|
||||
The flag ``strict`` disallows using API when deploying back to a
|
||||
platform version prior to when the declaration was introduced. An
|
||||
attempt to use such API before its introduction causes a hard error.
|
||||
Weakly-linking is almost always a better API choice, since it allows
|
||||
users to query availability at runtime.
|
||||
|
||||
If there are multiple declarations of the same entity, the availability
|
||||
attributes must either match on a per-platform basis or later
|
||||
declarations must not have availability attributes for that
|
||||
|
|
@ -701,33 +807,85 @@ platform. For example:
|
|||
|
||||
.. code-block:: c
|
||||
|
||||
void g(void) __attribute__((availability(macosx,introduced=10.4)));
|
||||
void g(void) __attribute__((availability(macosx,introduced=10.4))); // okay, matches
|
||||
void g(void) __attribute__((availability(macos,introduced=10.4)));
|
||||
void g(void) __attribute__((availability(macos,introduced=10.4))); // okay, matches
|
||||
void g(void) __attribute__((availability(ios,introduced=4.0))); // okay, adds a new platform
|
||||
void g(void); // okay, inherits both macosx and ios availability from above.
|
||||
void g(void) __attribute__((availability(macosx,introduced=10.5))); // error: mismatch
|
||||
void g(void); // okay, inherits both macos and ios availability from above.
|
||||
void g(void) __attribute__((availability(macos,introduced=10.5))); // error: mismatch
|
||||
|
||||
When one method overrides another, the overriding method can be more widely available than the overridden method, e.g.,:
|
||||
|
||||
.. code-block:: objc
|
||||
|
||||
@interface A
|
||||
- (id)method __attribute__((availability(macosx,introduced=10.4)));
|
||||
- (id)method2 __attribute__((availability(macosx,introduced=10.4)));
|
||||
- (id)method __attribute__((availability(macos,introduced=10.4)));
|
||||
- (id)method2 __attribute__((availability(macos,introduced=10.4)));
|
||||
@end
|
||||
|
||||
@interface B : A
|
||||
- (id)method __attribute__((availability(macosx,introduced=10.3))); // okay: method moved into base class later
|
||||
- (id)method __attribute__((availability(macosx,introduced=10.5))); // error: this method was available via the base class in 10.4
|
||||
- (id)method __attribute__((availability(macos,introduced=10.3))); // okay: method moved into base class later
|
||||
- (id)method __attribute__((availability(macos,introduced=10.5))); // error: this method was available via the base class in 10.4
|
||||
@end
|
||||
}];
|
||||
}
|
||||
|
||||
def WarnMaybeUnusedDocs : Documentation {
|
||||
let Category = DocCatVariable;
|
||||
let Heading = "maybe_unused, unused, gnu::unused";
|
||||
let Content = [{
|
||||
When passing the ``-Wunused`` flag to Clang, entities that are unused by the
|
||||
program may be diagnosed. The ``[[maybe_unused]]`` (or
|
||||
``__attribute__((unused))``) attribute can be used to silence such diagnostics
|
||||
when the entity cannot be removed. For instance, a local variable may exist
|
||||
solely for use in an ``assert()`` statement, which makes the local variable
|
||||
unused when ``NDEBUG`` is defined.
|
||||
|
||||
The attribute may be applied to the declaration of a class, a typedef, a
|
||||
variable, a function or method, a function parameter, an enumeration, an
|
||||
enumerator, a non-static data member, or a label.
|
||||
|
||||
.. code-block: c++
|
||||
#include <cassert>
|
||||
|
||||
[[maybe_unused]] void f([[maybe_unused]] bool thing1,
|
||||
[[maybe_unused]] bool thing2) {
|
||||
[[maybe_unused]] bool b = thing1 && thing2;
|
||||
assert(b);
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
||||
def WarnUnusedResultsDocs : Documentation {
|
||||
let Category = DocCatFunction;
|
||||
let Heading = "nodiscard, warn_unused_result, clang::warn_unused_result, gnu::warn_unused_result";
|
||||
let Content = [{
|
||||
Clang supports the ability to diagnose when the results of a function call
|
||||
expression are discarded under suspicious circumstances. A diagnostic is
|
||||
generated when a function or its return type is marked with ``[[nodiscard]]``
|
||||
(or ``__attribute__((warn_unused_result))``) and the function call appears as a
|
||||
potentially-evaluated discarded-value expression that is not explicitly cast to
|
||||
`void`.
|
||||
|
||||
.. code-block: c++
|
||||
struct [[nodiscard]] error_info { /*...*/ };
|
||||
error_info enable_missile_safety_mode();
|
||||
|
||||
void launch_missiles();
|
||||
void test_missiles() {
|
||||
enable_missile_safety_mode(); // diagnoses
|
||||
launch_missiles();
|
||||
}
|
||||
error_info &foo();
|
||||
void f() { foo(); } // Does not diagnose, error_info is a reference.
|
||||
}];
|
||||
}
|
||||
|
||||
def FallthroughDocs : Documentation {
|
||||
let Category = DocCatStmt;
|
||||
let Heading = "fallthrough, clang::fallthrough";
|
||||
let Content = [{
|
||||
The ``clang::fallthrough`` attribute is used along with the
|
||||
``-Wimplicit-fallthrough`` argument to annotate intentional fall-through
|
||||
The ``fallthrough`` (or ``clang::fallthrough``) attribute is used
|
||||
to annotate intentional fall-through
|
||||
between switch labels. It can only be applied to a null statement placed at a
|
||||
point of execution between any statement and the next switch label. It is
|
||||
common to mark these places with a specific comment, but this attribute is
|
||||
|
|
@ -738,6 +896,10 @@ control-flow statements like ``break;``, so it can be placed in most places
|
|||
where ``break;`` can, but only if there are no statements on the execution path
|
||||
between it and the next switch label.
|
||||
|
||||
By default, Clang does not warn on unannotated fallthrough from one ``switch``
|
||||
case to another. Diagnostics on fallthrough without a corresponding annotation
|
||||
can be enabled with the ``-Wimplicit-fallthrough`` argument.
|
||||
|
||||
Here is an example:
|
||||
|
||||
.. code-block:: c++
|
||||
|
|
@ -1421,6 +1583,26 @@ manipulating bits of the enumerator when issuing warnings.
|
|||
}];
|
||||
}
|
||||
|
||||
def EmptyBasesDocs : Documentation {
|
||||
let Category = DocCatType;
|
||||
let Content = [{
|
||||
The empty_bases attribute permits the compiler to utilize the
|
||||
empty-base-optimization more frequently.
|
||||
This attribute only applies to struct, class, and union types.
|
||||
It is only supported when using the Microsoft C++ ABI.
|
||||
}];
|
||||
}
|
||||
|
||||
def LayoutVersionDocs : Documentation {
|
||||
let Category = DocCatType;
|
||||
let Content = [{
|
||||
The layout_version attribute requests that the compiler utilize the class
|
||||
layout rules of a particular compiler version.
|
||||
This attribute only applies to struct, class, and union types.
|
||||
It is only supported when using the Microsoft C++ ABI.
|
||||
}];
|
||||
}
|
||||
|
||||
def MSInheritanceDocs : Documentation {
|
||||
let Category = DocCatType;
|
||||
let Heading = "__single_inhertiance, __multiple_inheritance, __virtual_inheritance";
|
||||
|
|
@ -1562,6 +1744,46 @@ for further details including limitations of the unroll hints.
|
|||
}];
|
||||
}
|
||||
|
||||
def OpenCLUnrollHintDocs : Documentation {
|
||||
let Category = DocCatStmt;
|
||||
let Heading = "__attribute__((opencl_unroll_hint))";
|
||||
let Content = [{
|
||||
The opencl_unroll_hint attribute qualifier can be used to specify that a loop
|
||||
(for, while and do loops) can be unrolled. This attribute qualifier can be
|
||||
used to specify full unrolling or partial unrolling by a specified amount.
|
||||
This is a compiler hint and the compiler may ignore this directive. See
|
||||
`OpenCL v2.0 <https://www.khronos.org/registry/cl/specs/opencl-2.0.pdf>`_
|
||||
s6.11.5 for details.
|
||||
}];
|
||||
}
|
||||
|
||||
def OpenCLAccessDocs : Documentation {
|
||||
let Category = DocCatStmt;
|
||||
let Heading = "__read_only, __write_only, __read_write (read_only, write_only, read_write)";
|
||||
let Content = [{
|
||||
The access qualifiers must be used with image object arguments or pipe arguments
|
||||
to declare if they are being read or written by a kernel or function.
|
||||
|
||||
The read_only/__read_only, write_only/__write_only and read_write/__read_write
|
||||
names are reserved for use as access qualifiers and shall not be used otherwise.
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
kernel void
|
||||
foo (read_only image2d_t imageA,
|
||||
write_only image2d_t imageB) {
|
||||
...
|
||||
}
|
||||
|
||||
In the above example imageA is a read-only 2D image object, and imageB is a
|
||||
write-only 2D image object.
|
||||
|
||||
The read_write (or __read_write) qualifier can not be used with pipe.
|
||||
|
||||
More details can be found in the OpenCL C language Spec v2.0, Section 6.6.
|
||||
}];
|
||||
}
|
||||
|
||||
def DocOpenCLAddressSpaces : DocumentationCategory<"OpenCL Address Spaces"> {
|
||||
let Content = [{
|
||||
The address space qualifier may be used to specify the region of memory that is
|
||||
|
|
@ -1643,6 +1865,17 @@ cannot point to the private address space.
|
|||
}];
|
||||
}
|
||||
|
||||
def OpenCLNoSVMDocs : Documentation {
|
||||
let Category = DocCatVariable;
|
||||
let Content = [{
|
||||
OpenCL 2.0 supports the optional ``__attribute__((nosvm))`` qualifier for
|
||||
pointer variable. It informs the compiler that the pointer does not refer
|
||||
to a shared virtual memory region. See OpenCL v2.0 s6.7.2 for details.
|
||||
|
||||
Since it is not widely used and has been removed from OpenCL 2.1, it is ignored
|
||||
by Clang.
|
||||
}];
|
||||
}
|
||||
def NullabilityDocs : DocumentationCategory<"Nullability Attributes"> {
|
||||
let Content = [{
|
||||
Whether a particular pointer may be "null" is an important concern when working with pointers in the C family of languages. The various nullability attributes indicate whether a particular pointer can be null or not, which makes APIs more expressive and can help static analysis tools identify bugs involving null pointers. Clang supports several kinds of nullability attributes: the ``nonnull`` and ``returns_nonnull`` attributes indicate which function or method parameters and result types can never be null, while nullability type qualifiers indicate which pointer types can be null (``_Nullable``) or cannot be null (``_Nonnull``).
|
||||
|
|
@ -1758,6 +1991,58 @@ arguments, with arbitrary offsets.
|
|||
}];
|
||||
}
|
||||
|
||||
def OMPDeclareSimdDocs : Documentation {
|
||||
let Category = DocCatFunction;
|
||||
let Heading = "#pragma omp declare simd";
|
||||
let Content = [{
|
||||
The `declare simd` construct can be applied to a function to enable the creation
|
||||
of one or more versions that can process multiple arguments using SIMD
|
||||
instructions from a single invocation in a SIMD loop. The `declare simd`
|
||||
directive is a declarative directive. There may be multiple `declare simd`
|
||||
directives for a function. The use of a `declare simd` construct on a function
|
||||
enables the creation of SIMD versions of the associated function that can be
|
||||
used to process multiple arguments from a single invocation from a SIMD loop
|
||||
concurrently.
|
||||
The syntax of the `declare simd` construct is as follows:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
#pragma omp declare simd [clause[[,] clause] ...] new-line
|
||||
[#pragma omp declare simd [clause[[,] clause] ...] new-line]
|
||||
[...]
|
||||
function definition or declaration
|
||||
|
||||
where clause is one of the following:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
simdlen(length)
|
||||
linear(argument-list[:constant-linear-step])
|
||||
aligned(argument-list[:alignment])
|
||||
uniform(argument-list)
|
||||
inbranch
|
||||
notinbranch
|
||||
|
||||
}];
|
||||
}
|
||||
|
||||
def OMPDeclareTargetDocs : Documentation {
|
||||
let Category = DocCatFunction;
|
||||
let Heading = "#pragma omp declare target";
|
||||
let Content = [{
|
||||
The `declare target` directive specifies that variables and functions are mapped
|
||||
to a device for OpenMP offload mechanism.
|
||||
|
||||
The syntax of the declare target directive is as follows:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
#pragma omp declare target new-line
|
||||
declarations-definition-seq
|
||||
#pragma omp end declare target new-line
|
||||
}];
|
||||
}
|
||||
|
||||
def NotTailCalledDocs : Documentation {
|
||||
let Category = DocCatFunction;
|
||||
let Content = [{
|
||||
|
|
@ -1765,7 +2050,7 @@ The ``not_tail_called`` attribute prevents tail-call optimization on statically
|
|||
|
||||
For example, it prevents tail-call optimization in the following case:
|
||||
|
||||
.. code-block: c
|
||||
.. code-block:: c
|
||||
|
||||
int __attribute__((not_tail_called)) foo1(int);
|
||||
|
||||
|
|
@ -1775,7 +2060,7 @@ For example, it prevents tail-call optimization in the following case:
|
|||
|
||||
However, it doesn't prevent tail-call optimization in this case:
|
||||
|
||||
.. code-block: c
|
||||
.. code-block:: c
|
||||
|
||||
int __attribute__((not_tail_called)) foo1(int);
|
||||
|
||||
|
|
@ -1789,7 +2074,7 @@ However, it doesn't prevent tail-call optimization in this case:
|
|||
|
||||
Marking virtual functions as ``not_tail_called`` is an error:
|
||||
|
||||
.. code-block: c++
|
||||
.. code-block:: c++
|
||||
|
||||
class Base {
|
||||
public:
|
||||
|
|
@ -1839,7 +2124,7 @@ For example:
|
|||
|
||||
Marking virtual functions as ``disable_tail_calls`` is legal.
|
||||
|
||||
.. code-block: c++
|
||||
.. code-block:: c++
|
||||
|
||||
int callee(int);
|
||||
|
||||
|
|
@ -1859,3 +2144,349 @@ Marking virtual functions as ``disable_tail_calls`` is legal.
|
|||
|
||||
}];
|
||||
}
|
||||
|
||||
def AnyX86InterruptDocs : Documentation {
|
||||
let Category = DocCatFunction;
|
||||
let Content = [{
|
||||
Clang supports the GNU style ``__attribute__((interrupt))`` attribute on
|
||||
x86/x86-64 targets.The compiler generates function entry and exit sequences
|
||||
suitable for use in an interrupt handler when this attribute is present.
|
||||
The 'IRET' instruction, instead of the 'RET' instruction, is used to return
|
||||
from interrupt or exception handlers. All registers, except for the EFLAGS
|
||||
register which is restored by the 'IRET' instruction, are preserved by the
|
||||
compiler.
|
||||
|
||||
Any interruptible-without-stack-switch code must be compiled with
|
||||
-mno-red-zone since interrupt handlers can and will, because of the
|
||||
hardware design, touch the red zone.
|
||||
|
||||
1. interrupt handler must be declared with a mandatory pointer argument:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
struct interrupt_frame
|
||||
{
|
||||
uword_t ip;
|
||||
uword_t cs;
|
||||
uword_t flags;
|
||||
uword_t sp;
|
||||
uword_t ss;
|
||||
};
|
||||
|
||||
__attribute__ ((interrupt))
|
||||
void f (struct interrupt_frame *frame) {
|
||||
...
|
||||
}
|
||||
|
||||
2. exception handler:
|
||||
|
||||
The exception handler is very similar to the interrupt handler with
|
||||
a different mandatory function signature:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
__attribute__ ((interrupt))
|
||||
void f (struct interrupt_frame *frame, uword_t error_code) {
|
||||
...
|
||||
}
|
||||
|
||||
and compiler pops 'ERROR_CODE' off stack before the 'IRET' instruction.
|
||||
|
||||
The exception handler should only be used for exceptions which push an
|
||||
error code and all other exceptions must use the interrupt handler.
|
||||
The system will crash if the wrong handler is used.
|
||||
}];
|
||||
}
|
||||
|
||||
def SwiftCallDocs : Documentation {
|
||||
let Category = DocCatVariable;
|
||||
let Content = [{
|
||||
The ``swiftcall`` attribute indicates that a function should be called
|
||||
using the Swift calling convention for a function or function pointer.
|
||||
|
||||
The lowering for the Swift calling convention, as described by the Swift
|
||||
ABI documentation, occurs in multiple phases. The first, "high-level"
|
||||
phase breaks down the formal parameters and results into innately direct
|
||||
and indirect components, adds implicit paraameters for the generic
|
||||
signature, and assigns the context and error ABI treatments to parameters
|
||||
where applicable. The second phase breaks down the direct parameters
|
||||
and results from the first phase and assigns them to registers or the
|
||||
stack. The ``swiftcall`` convention only handles this second phase of
|
||||
lowering; the C function type must accurately reflect the results
|
||||
of the first phase, as follows:
|
||||
|
||||
- Results classified as indirect by high-level lowering should be
|
||||
represented as parameters with the ``swift_indirect_result`` attribute.
|
||||
|
||||
- Results classified as direct by high-level lowering should be represented
|
||||
as follows:
|
||||
|
||||
- First, remove any empty direct results.
|
||||
|
||||
- If there are no direct results, the C result type should be ``void``.
|
||||
|
||||
- If there is one direct result, the C result type should be a type with
|
||||
the exact layout of that result type.
|
||||
|
||||
- If there are a multiple direct results, the C result type should be
|
||||
a struct type with the exact layout of a tuple of those results.
|
||||
|
||||
- Parameters classified as indirect by high-level lowering should be
|
||||
represented as parameters of pointer type.
|
||||
|
||||
- Parameters classified as direct by high-level lowering should be
|
||||
omitted if they are empty types; otherwise, they should be represented
|
||||
as a parameter type with a layout exactly matching the layout of the
|
||||
Swift parameter type.
|
||||
|
||||
- The context parameter, if present, should be represented as a trailing
|
||||
parameter with the ``swift_context`` attribute.
|
||||
|
||||
- The error result parameter, if present, should be represented as a
|
||||
trailing parameter (always following a context parameter) with the
|
||||
``swift_error_result`` attribute.
|
||||
|
||||
``swiftcall`` does not support variadic arguments or unprototyped functions.
|
||||
|
||||
The parameter ABI treatment attributes are aspects of the function type.
|
||||
A function type which which applies an ABI treatment attribute to a
|
||||
parameter is a different type from an otherwise-identical function type
|
||||
that does not. A single parameter may not have multiple ABI treatment
|
||||
attributes.
|
||||
|
||||
Support for this feature is target-dependent, although it should be
|
||||
supported on every target that Swift supports. Query for this support
|
||||
with ``__has_attribute(swiftcall)``. This implies support for the
|
||||
``swift_context``, ``swift_error_result``, and ``swift_indirect_result``
|
||||
attributes.
|
||||
}];
|
||||
}
|
||||
|
||||
def SwiftContextDocs : Documentation {
|
||||
let Category = DocCatVariable;
|
||||
let Content = [{
|
||||
The ``swift_context`` attribute marks a parameter of a ``swiftcall``
|
||||
function as having the special context-parameter ABI treatment.
|
||||
|
||||
This treatment generally passes the context value in a special register
|
||||
which is normally callee-preserved.
|
||||
|
||||
A ``swift_context`` parameter must either be the last parameter or must be
|
||||
followed by a ``swift_error_result`` parameter (which itself must always be
|
||||
the last parameter).
|
||||
|
||||
A context parameter must have pointer or reference type.
|
||||
}];
|
||||
}
|
||||
|
||||
def SwiftErrorResultDocs : Documentation {
|
||||
let Category = DocCatVariable;
|
||||
let Content = [{
|
||||
The ``swift_error_result`` attribute marks a parameter of a ``swiftcall``
|
||||
function as having the special error-result ABI treatment.
|
||||
|
||||
This treatment generally passes the underlying error value in and out of
|
||||
the function through a special register which is normally callee-preserved.
|
||||
This is modeled in C by pretending that the register is addressable memory:
|
||||
|
||||
- The caller appears to pass the address of a variable of pointer type.
|
||||
The current value of this variable is copied into the register before
|
||||
the call; if the call returns normally, the value is copied back into the
|
||||
variable.
|
||||
|
||||
- The callee appears to receive the address of a variable. This address
|
||||
is actually a hidden location in its own stack, initialized with the
|
||||
value of the register upon entry. When the function returns normally,
|
||||
the value in that hidden location is written back to the register.
|
||||
|
||||
A ``swift_error_result`` parameter must be the last parameter, and it must be
|
||||
preceded by a ``swift_context`` parameter.
|
||||
|
||||
A ``swift_error_result`` parameter must have type ``T**`` or ``T*&`` for some
|
||||
type T. Note that no qualifiers are permitted on the intermediate level.
|
||||
|
||||
It is undefined behavior if the caller does not pass a pointer or
|
||||
reference to a valid object.
|
||||
|
||||
The standard convention is that the error value itself (that is, the
|
||||
value stored in the apparent argument) will be null upon function entry,
|
||||
but this is not enforced by the ABI.
|
||||
}];
|
||||
}
|
||||
|
||||
def SwiftIndirectResultDocs : Documentation {
|
||||
let Category = DocCatVariable;
|
||||
let Content = [{
|
||||
The ``swift_indirect_result`` attribute marks a parameter of a ``swiftcall``
|
||||
function as having the special indirect-result ABI treatmenet.
|
||||
|
||||
This treatment gives the parameter the target's normal indirect-result
|
||||
ABI treatment, which may involve passing it differently from an ordinary
|
||||
parameter. However, only the first indirect result will receive this
|
||||
treatment. Furthermore, low-level lowering may decide that a direct result
|
||||
must be returned indirectly; if so, this will take priority over the
|
||||
``swift_indirect_result`` parameters.
|
||||
|
||||
A ``swift_indirect_result`` parameter must either be the first parameter or
|
||||
follow another ``swift_indirect_result`` parameter.
|
||||
|
||||
A ``swift_indirect_result`` parameter must have type ``T*`` or ``T&`` for
|
||||
some object type ``T``. If ``T`` is a complete type at the point of
|
||||
definition of a function, it is undefined behavior if the argument
|
||||
value does not point to storage of adequate size and alignment for a
|
||||
value of type ``T``.
|
||||
|
||||
Making indirect results explicit in the signature allows C functions to
|
||||
directly construct objects into them without relying on language
|
||||
optimizations like C++'s named return value optimization (NRVO).
|
||||
}];
|
||||
}
|
||||
|
||||
def AbiTagsDocs : Documentation {
|
||||
let Category = DocCatFunction;
|
||||
let Content = [{
|
||||
The ``abi_tag`` attribute can be applied to a function, variable, class or
|
||||
inline namespace declaration to modify the mangled name of the entity. It gives
|
||||
the ability to distinguish between different versions of the same entity but
|
||||
with different ABI versions supported. For example, a newer version of a class
|
||||
could have a different set of data members and thus have a different size. Using
|
||||
the ``abi_tag`` attribute, it is possible to have different mangled names for
|
||||
a global variable of the class type. Therefor, the old code could keep using
|
||||
the old manged name and the new code will use the new mangled name with tags.
|
||||
}];
|
||||
}
|
||||
|
||||
def PreserveMostDocs : Documentation {
|
||||
let Category = DocCatCallingConvs;
|
||||
let Content = [{
|
||||
On X86-64 and AArch64 targets, this attribute changes the calling convention of
|
||||
a function. The ``preserve_most`` calling convention attempts to make the code
|
||||
in the caller as unintrusive as possible. This convention behaves identically
|
||||
to the ``C`` calling convention on how arguments and return values are passed,
|
||||
but it uses a different set of caller/callee-saved registers. This alleviates
|
||||
the burden of saving and recovering a large register set before and after the
|
||||
call in the caller. If the arguments are passed in callee-saved registers,
|
||||
then they will be preserved by the callee across the call. This doesn't
|
||||
apply for values returned in callee-saved registers.
|
||||
|
||||
- On X86-64 the callee preserves all general purpose registers, except for
|
||||
R11. R11 can be used as a scratch register. Floating-point registers
|
||||
(XMMs/YMMs) are not preserved and need to be saved by the caller.
|
||||
|
||||
The idea behind this convention is to support calls to runtime functions
|
||||
that have a hot path and a cold path. The hot path is usually a small piece
|
||||
of code that doesn't use many registers. The cold path might need to call out to
|
||||
another function and therefore only needs to preserve the caller-saved
|
||||
registers, which haven't already been saved by the caller. The
|
||||
`preserve_most` calling convention is very similar to the ``cold`` calling
|
||||
convention in terms of caller/callee-saved registers, but they are used for
|
||||
different types of function calls. ``coldcc`` is for function calls that are
|
||||
rarely executed, whereas `preserve_most` function calls are intended to be
|
||||
on the hot path and definitely executed a lot. Furthermore ``preserve_most``
|
||||
doesn't prevent the inliner from inlining the function call.
|
||||
|
||||
This calling convention will be used by a future version of the Objective-C
|
||||
runtime and should therefore still be considered experimental at this time.
|
||||
Although this convention was created to optimize certain runtime calls to
|
||||
the Objective-C runtime, it is not limited to this runtime and might be used
|
||||
by other runtimes in the future too. The current implementation only
|
||||
supports X86-64 and AArch64, but the intention is to support more architectures
|
||||
in the future.
|
||||
}];
|
||||
}
|
||||
|
||||
def PreserveAllDocs : Documentation {
|
||||
let Category = DocCatCallingConvs;
|
||||
let Content = [{
|
||||
On X86-64 and AArch64 targets, this attribute changes the calling convention of
|
||||
a function. The ``preserve_all`` calling convention attempts to make the code
|
||||
in the caller even less intrusive than the ``preserve_most`` calling convention.
|
||||
This calling convention also behaves identical to the ``C`` calling convention
|
||||
on how arguments and return values are passed, but it uses a different set of
|
||||
caller/callee-saved registers. This removes the burden of saving and
|
||||
recovering a large register set before and after the call in the caller. If
|
||||
the arguments are passed in callee-saved registers, then they will be
|
||||
preserved by the callee across the call. This doesn't apply for values
|
||||
returned in callee-saved registers.
|
||||
|
||||
- On X86-64 the callee preserves all general purpose registers, except for
|
||||
R11. R11 can be used as a scratch register. Furthermore it also preserves
|
||||
all floating-point registers (XMMs/YMMs).
|
||||
|
||||
The idea behind this convention is to support calls to runtime functions
|
||||
that don't need to call out to any other functions.
|
||||
|
||||
This calling convention, like the ``preserve_most`` calling convention, will be
|
||||
used by a future version of the Objective-C runtime and should be considered
|
||||
experimental at this time.
|
||||
}];
|
||||
}
|
||||
|
||||
def DeprecatedDocs : Documentation {
|
||||
let Category = DocCatFunction;
|
||||
let Content = [{
|
||||
The ``deprecated`` attribute can be applied to a function, a variable, or a
|
||||
type. This is useful when identifying functions, variables, or types that are
|
||||
expected to be removed in a future version of a program.
|
||||
|
||||
Consider the function declaration for a hypothetical function ``f``:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
void f(void) __attribute__((deprecated("message", "replacement")));
|
||||
|
||||
When spelled as `__attribute__((deprecated))`, the deprecated attribute can have
|
||||
two optional string arguments. The first one is the message to display when
|
||||
emitting the warning; the second one enables the compiler to provide a Fix-It
|
||||
to replace the deprecated name with a new name. Otherwise, when spelled as
|
||||
`[[gnu::deprecated]] or [[deprecated]]`, the attribute can have one optional
|
||||
string argument which is the message to display when emitting the warning.
|
||||
}];
|
||||
}
|
||||
|
||||
def IFuncDocs : Documentation {
|
||||
let Category = DocCatFunction;
|
||||
let Content = [{
|
||||
``__attribute__((ifunc("resolver")))`` is used to mark that the address of a declaration should be resolved at runtime by calling a resolver function.
|
||||
|
||||
The symbol name of the resolver function is given in quotes. A function with this name (after mangling) must be defined in the current translation unit; it may be ``static``. The resolver function should take no arguments and return a pointer.
|
||||
|
||||
The ``ifunc`` attribute may only be used on a function declaration. A function declaration with an ``ifunc`` attribute is considered to be a definition of the declared entity. The entity must not have weak linkage; for example, in C++, it cannot be applied to a declaration if a definition at that location would be considered inline.
|
||||
|
||||
Not all targets support this attribute. ELF targets support this attribute when using binutils v2.20.1 or higher and glibc v2.11.1 or higher. Non-ELF targets currently do not support this attribute.
|
||||
}];
|
||||
}
|
||||
|
||||
def LTOVisibilityDocs : Documentation {
|
||||
let Category = DocCatType;
|
||||
let Content = [{
|
||||
See :doc:`LTOVisibility`.
|
||||
}];
|
||||
}
|
||||
|
||||
def RenderScriptKernelAttributeDocs : Documentation {
|
||||
let Category = DocCatFunction;
|
||||
let Content = [{
|
||||
``__attribute__((kernel))`` is used to mark a ``kernel`` function in
|
||||
RenderScript.
|
||||
|
||||
In RenderScript, ``kernel`` functions are used to express data-parallel
|
||||
computations. The RenderScript runtime efficiently parallelizes ``kernel``
|
||||
functions to run on computational resources such as multi-core CPUs and GPUs.
|
||||
See the RenderScript_ documentation for more information.
|
||||
|
||||
.. _RenderScript: https://developer.android.com/guide/topics/renderscript/compute.html
|
||||
}];
|
||||
}
|
||||
|
||||
def XRayDocs : Documentation {
|
||||
let Category = DocCatFunction;
|
||||
let Heading = "xray_always_instrument (clang::xray_always_instrument), xray_never_instrument (clang::xray_never_instrument)";
|
||||
let Content = [{
|
||||
``__attribute__((xray_always_instrument))`` or ``[[clang::xray_always_instrument]]`` is used to mark member functions (in C++), methods (in Objective C), and free functions (in C, C++, and Objective C) to be instrumented with XRay. This will cause the function to always have space at the beginning and exit points to allow for runtime patching.
|
||||
|
||||
Conversely, ``__attribute__((xray_never_instrument))`` or ``[[clang::xray_never_instrument]]`` will inhibit the insertion of these instrumentation points.
|
||||
|
||||
If a function has neither of these attributes, they become subject to the XRay heuristics used to determine whether a function should be instrumented or otherwise.
|
||||
}];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,10 +22,10 @@ namespace attr {
|
|||
// \brief A list of all the recognized kinds of attributes.
|
||||
enum Kind {
|
||||
#define ATTR(X) X,
|
||||
#define LAST_INHERITABLE_ATTR(X) X, LAST_INHERITABLE = X,
|
||||
#define LAST_INHERITABLE_PARAM_ATTR(X) X, LAST_INHERITABLE_PARAM = X,
|
||||
#define ATTR_RANGE(CLASS, FIRST_NAME, LAST_NAME) \
|
||||
First##CLASS = FIRST_NAME, \
|
||||
Last##CLASS = LAST_NAME,
|
||||
#include "clang/Basic/AttrList.inc"
|
||||
NUM_ATTRS
|
||||
};
|
||||
|
||||
} // end namespace attr
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@
|
|||
// Builtin::Context class. Currently we have:
|
||||
// n -> nothrow
|
||||
// r -> noreturn
|
||||
// U -> pure
|
||||
// c -> const
|
||||
// t -> signature is meaningless, use custom typechecking
|
||||
// F -> this is a libc/libm function with a '__builtin_' prefix added.
|
||||
|
|
@ -377,6 +378,11 @@ BUILTIN(__builtin_signbit, "i.", "Fnc")
|
|||
BUILTIN(__builtin_signbitf, "if", "Fnc")
|
||||
BUILTIN(__builtin_signbitl, "iLd", "Fnc")
|
||||
|
||||
// Special FP builtins.
|
||||
BUILTIN(__builtin_canonicalize, "dd", "nc")
|
||||
BUILTIN(__builtin_canonicalizef, "ff", "nc")
|
||||
BUILTIN(__builtin_canonicalizel, "LdLd", "nc")
|
||||
|
||||
// Builtins for arithmetic.
|
||||
BUILTIN(__builtin_clzs , "iUs" , "nc")
|
||||
BUILTIN(__builtin_clz , "iUi" , "nc")
|
||||
|
|
@ -404,6 +410,11 @@ BUILTIN(__builtin_bswap16, "UsUs", "nc")
|
|||
BUILTIN(__builtin_bswap32, "UiUi", "nc")
|
||||
BUILTIN(__builtin_bswap64, "ULLiULLi", "nc")
|
||||
|
||||
BUILTIN(__builtin_bitreverse8, "UcUc", "nc")
|
||||
BUILTIN(__builtin_bitreverse16, "UsUs", "nc")
|
||||
BUILTIN(__builtin_bitreverse32, "UiUi", "nc")
|
||||
BUILTIN(__builtin_bitreverse64, "ULLiULLi", "nc")
|
||||
|
||||
// Random GCC builtins
|
||||
BUILTIN(__builtin_constant_p, "i.", "nctu")
|
||||
BUILTIN(__builtin_classify_type, "i.", "nctu")
|
||||
|
|
@ -456,6 +467,7 @@ BUILTIN(__builtin_eh_return_data_regno, "iIi", "nc")
|
|||
BUILTIN(__builtin_snprintf, "ic*zcC*.", "nFp:2:")
|
||||
BUILTIN(__builtin_vsprintf, "ic*cC*a", "nFP:1:")
|
||||
BUILTIN(__builtin_vsnprintf, "ic*zcC*a", "nFP:2:")
|
||||
BUILTIN(__builtin_thread_pointer, "v*", "nc")
|
||||
|
||||
// GCC exception builtins
|
||||
BUILTIN(__builtin_eh_return, "vzv*", "r") // FIXME: Takes intptr_t, not size_t!
|
||||
|
|
@ -763,6 +775,22 @@ LIBBUILTIN(sscanf, "icC*RcC*R.", "fs:1:", "stdio.h", ALL_LANGUAGES)
|
|||
LIBBUILTIN(vscanf, "icC*Ra", "fS:0:", "stdio.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(vfscanf, "iP*RcC*Ra", "fS:1:", "stdio.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(vsscanf, "icC*RcC*Ra", "fS:1:", "stdio.h", ALL_LANGUAGES)
|
||||
// C99 ctype.h
|
||||
LIBBUILTIN(isalnum, "ii", "fnU", "ctype.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(isalpha, "ii", "fnU", "ctype.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(isblank, "ii", "fnU", "ctype.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(iscntrl, "ii", "fnU", "ctype.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(isdigit, "ii", "fnU", "ctype.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(isgraph, "ii", "fnU", "ctype.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(islower, "ii", "fnU", "ctype.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(isprint, "ii", "fnU", "ctype.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(ispunct, "ii", "fnU", "ctype.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(isspace, "ii", "fnU", "ctype.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(isupper, "ii", "fnU", "ctype.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(isxdigit, "ii", "fnU", "ctype.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(tolower, "ii", "fnU", "ctype.h", ALL_LANGUAGES)
|
||||
LIBBUILTIN(toupper, "ii", "fnU", "ctype.h", ALL_LANGUAGES)
|
||||
|
||||
// C99
|
||||
// In some systems setjmp is a macro that expands to _setjmp. We undefine
|
||||
// it here to avoid having two identical LIBBUILTIN entries.
|
||||
|
|
@ -1252,6 +1280,43 @@ BUILTIN(__builtin___get_unsafe_stack_ptr, "v*", "Fn")
|
|||
BUILTIN(__builtin_nontemporal_store, "v.", "t")
|
||||
BUILTIN(__builtin_nontemporal_load, "v.", "t")
|
||||
|
||||
// OpenCL v2.0 s6.13.16, s9.17.3.5 - Pipe functions.
|
||||
// We need the generic prototype, since the packet type could be anything.
|
||||
LANGBUILTIN(read_pipe, "i.", "tn", OCLC20_LANG)
|
||||
LANGBUILTIN(write_pipe, "i.", "tn", OCLC20_LANG)
|
||||
|
||||
LANGBUILTIN(reserve_read_pipe, "i.", "tn", OCLC20_LANG)
|
||||
LANGBUILTIN(reserve_write_pipe, "i.", "tn", OCLC20_LANG)
|
||||
|
||||
LANGBUILTIN(commit_write_pipe, "v.", "tn", OCLC20_LANG)
|
||||
LANGBUILTIN(commit_read_pipe, "v.", "tn", OCLC20_LANG)
|
||||
|
||||
LANGBUILTIN(sub_group_reserve_read_pipe, "i.", "tn", OCLC20_LANG)
|
||||
LANGBUILTIN(sub_group_reserve_write_pipe, "i.", "tn", OCLC20_LANG)
|
||||
|
||||
LANGBUILTIN(sub_group_commit_read_pipe, "v.", "tn", OCLC20_LANG)
|
||||
LANGBUILTIN(sub_group_commit_write_pipe, "v.", "tn", OCLC20_LANG)
|
||||
|
||||
LANGBUILTIN(work_group_reserve_read_pipe, "i.", "tn", OCLC20_LANG)
|
||||
LANGBUILTIN(work_group_reserve_write_pipe, "i.", "tn", OCLC20_LANG)
|
||||
|
||||
LANGBUILTIN(work_group_commit_read_pipe, "v.", "tn", OCLC20_LANG)
|
||||
LANGBUILTIN(work_group_commit_write_pipe, "v.", "tn", OCLC20_LANG)
|
||||
|
||||
LANGBUILTIN(get_pipe_num_packets, "Ui.", "tn", OCLC20_LANG)
|
||||
LANGBUILTIN(get_pipe_max_packets, "Ui.", "tn", OCLC20_LANG)
|
||||
|
||||
// OpenCL v2.0 s6.13.17 - Enqueue kernel functions.
|
||||
// Custom builtin check allows to perform special check of passed block arguments.
|
||||
LANGBUILTIN(enqueue_kernel, "i.", "tn", OCLC20_LANG)
|
||||
LANGBUILTIN(get_kernel_work_group_size, "i.", "tn", OCLC20_LANG)
|
||||
LANGBUILTIN(get_kernel_preferred_work_group_size_multiple, "i.", "tn", OCLC20_LANG)
|
||||
|
||||
// OpenCL v2.0 s6.13.9 - Address space qualifier functions.
|
||||
LANGBUILTIN(to_global, "v*v*", "tn", OCLC20_LANG)
|
||||
LANGBUILTIN(to_local, "v*v*", "tn", OCLC20_LANG)
|
||||
LANGBUILTIN(to_private, "v*v*", "tn", OCLC20_LANG)
|
||||
|
||||
#undef BUILTIN
|
||||
#undef LIBBUILTIN
|
||||
#undef LANGBUILTIN
|
||||
|
|
|
|||
|
|
@ -31,11 +31,12 @@ class QualType;
|
|||
class LangOptions;
|
||||
|
||||
enum LanguageID {
|
||||
GNU_LANG = 0x1, // builtin requires GNU mode.
|
||||
C_LANG = 0x2, // builtin for c only.
|
||||
CXX_LANG = 0x4, // builtin for cplusplus only.
|
||||
OBJC_LANG = 0x8, // builtin for objective-c and objective-c++
|
||||
MS_LANG = 0x10, // builtin requires MS mode.
|
||||
GNU_LANG = 0x1, // builtin requires GNU mode.
|
||||
C_LANG = 0x2, // builtin for c only.
|
||||
CXX_LANG = 0x4, // builtin for cplusplus only.
|
||||
OBJC_LANG = 0x8, // builtin for objective-c and objective-c++
|
||||
MS_LANG = 0x10, // builtin requires MS mode.
|
||||
OCLC20_LANG = 0x20, // builtin for OpenCL C only.
|
||||
ALL_LANGUAGES = C_LANG | CXX_LANG | OBJC_LANG, // builtin for all languages.
|
||||
ALL_GNU_LANGUAGES = ALL_LANGUAGES | GNU_LANG, // builtin requires GNU mode.
|
||||
ALL_MS_LANGUAGES = ALL_LANGUAGES | MS_LANG // builtin requires MS mode.
|
||||
|
|
@ -88,11 +89,16 @@ public:
|
|||
return getRecord(ID).Type;
|
||||
}
|
||||
|
||||
/// \brief Return true if this function is a target-specific builtin
|
||||
/// \brief Return true if this function is a target-specific builtin.
|
||||
bool isTSBuiltin(unsigned ID) const {
|
||||
return ID >= Builtin::FirstTSBuiltin;
|
||||
}
|
||||
|
||||
/// \brief Return true if this function has no side effects.
|
||||
bool isPure(unsigned ID) const {
|
||||
return strchr(getRecord(ID).Attributes, 'U') != nullptr;
|
||||
}
|
||||
|
||||
/// \brief Return true if this function has no side effects and doesn't
|
||||
/// read memory.
|
||||
bool isConst(unsigned ID) const {
|
||||
|
|
@ -154,7 +160,7 @@ public:
|
|||
/// \brief Completely forget that the given ID was ever considered a builtin,
|
||||
/// e.g., because the user provided a conflicting signature.
|
||||
void forgetBuiltin(unsigned ID, IdentifierTable &Table);
|
||||
|
||||
|
||||
/// \brief If this is a library function that comes from a specific
|
||||
/// header, retrieve that header name.
|
||||
const char *getHeaderName(unsigned ID) const {
|
||||
|
|
@ -213,7 +219,10 @@ private:
|
|||
/// \brief Kinds of BuiltinTemplateDecl.
|
||||
enum BuiltinTemplateKind : int {
|
||||
/// \brief This names the __make_integer_seq BuiltinTemplateDecl.
|
||||
BTK__make_integer_seq
|
||||
BTK__make_integer_seq,
|
||||
|
||||
/// \brief This names the __type_pack_element BuiltinTemplateDecl.
|
||||
BTK__type_pack_element
|
||||
};
|
||||
|
||||
} // end namespace clang
|
||||
|
|
|
|||
|
|
@ -60,6 +60,5 @@ BUILTIN(__builtin_arm_rsrp, "v*cC*", "nc")
|
|||
BUILTIN(__builtin_arm_wsr, "vcC*Ui", "nc")
|
||||
BUILTIN(__builtin_arm_wsr64, "vcC*LUi", "nc")
|
||||
BUILTIN(__builtin_arm_wsrp, "vcC*vC*", "nc")
|
||||
BUILTIN(__builtin_thread_pointer, "v*", "nc")
|
||||
|
||||
#undef BUILTIN
|
||||
|
|
|
|||
|
|
@ -7,30 +7,97 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines the R600-specific builtin function database. Users of this
|
||||
// file must define the BUILTIN macro to make use of this information.
|
||||
// This file defines the AMDGPU-specific builtin function database. Users of
|
||||
// this file must define the BUILTIN macro to make use of this information.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// The format of this database matches clang/Basic/Builtins.def.
|
||||
|
||||
BUILTIN(__builtin_amdgpu_div_scale, "dddbb*", "n")
|
||||
BUILTIN(__builtin_amdgpu_div_scalef, "fffbb*", "n")
|
||||
BUILTIN(__builtin_amdgpu_div_fmas, "ddddb", "nc")
|
||||
BUILTIN(__builtin_amdgpu_div_fmasf, "ffffb", "nc")
|
||||
BUILTIN(__builtin_amdgpu_div_fixup, "dddd", "nc")
|
||||
BUILTIN(__builtin_amdgpu_div_fixupf, "ffff", "nc")
|
||||
BUILTIN(__builtin_amdgpu_trig_preop, "ddi", "nc")
|
||||
BUILTIN(__builtin_amdgpu_trig_preopf, "ffi", "nc")
|
||||
BUILTIN(__builtin_amdgpu_rcp, "dd", "nc")
|
||||
BUILTIN(__builtin_amdgpu_rcpf, "ff", "nc")
|
||||
BUILTIN(__builtin_amdgpu_rsq, "dd", "nc")
|
||||
BUILTIN(__builtin_amdgpu_rsqf, "ff", "nc")
|
||||
BUILTIN(__builtin_amdgpu_rsq_clamped, "dd", "nc")
|
||||
BUILTIN(__builtin_amdgpu_rsq_clampedf, "ff", "nc")
|
||||
BUILTIN(__builtin_amdgpu_ldexp, "ddi", "nc")
|
||||
BUILTIN(__builtin_amdgpu_ldexpf, "ffi", "nc")
|
||||
BUILTIN(__builtin_amdgpu_class, "bdi", "nc")
|
||||
BUILTIN(__builtin_amdgpu_classf, "bfi", "nc")
|
||||
#if defined(BUILTIN) && !defined(TARGET_BUILTIN)
|
||||
# define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BUILTIN(ID, TYPE, ATTRS)
|
||||
#endif
|
||||
//===----------------------------------------------------------------------===//
|
||||
// SI+ only builtins.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
BUILTIN(__builtin_amdgcn_kernarg_segment_ptr, "Uc*2", "nc")
|
||||
BUILTIN(__builtin_amdgcn_implicitarg_ptr, "Uc*2", "nc")
|
||||
|
||||
BUILTIN(__builtin_amdgcn_workgroup_id_x, "Ui", "nc")
|
||||
BUILTIN(__builtin_amdgcn_workgroup_id_y, "Ui", "nc")
|
||||
BUILTIN(__builtin_amdgcn_workgroup_id_z, "Ui", "nc")
|
||||
|
||||
BUILTIN(__builtin_amdgcn_workitem_id_x, "Ui", "nc")
|
||||
BUILTIN(__builtin_amdgcn_workitem_id_y, "Ui", "nc")
|
||||
BUILTIN(__builtin_amdgcn_workitem_id_z, "Ui", "nc")
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Instruction builtins.
|
||||
//===----------------------------------------------------------------------===//
|
||||
BUILTIN(__builtin_amdgcn_s_barrier, "v", "n")
|
||||
BUILTIN(__builtin_amdgcn_div_scale, "dddbb*", "n")
|
||||
BUILTIN(__builtin_amdgcn_div_scalef, "fffbb*", "n")
|
||||
BUILTIN(__builtin_amdgcn_div_fmas, "ddddb", "nc")
|
||||
BUILTIN(__builtin_amdgcn_div_fmasf, "ffffb", "nc")
|
||||
BUILTIN(__builtin_amdgcn_div_fixup, "dddd", "nc")
|
||||
BUILTIN(__builtin_amdgcn_div_fixupf, "ffff", "nc")
|
||||
BUILTIN(__builtin_amdgcn_trig_preop, "ddi", "nc")
|
||||
BUILTIN(__builtin_amdgcn_trig_preopf, "ffi", "nc")
|
||||
BUILTIN(__builtin_amdgcn_rcp, "dd", "nc")
|
||||
BUILTIN(__builtin_amdgcn_rcpf, "ff", "nc")
|
||||
BUILTIN(__builtin_amdgcn_rsq, "dd", "nc")
|
||||
BUILTIN(__builtin_amdgcn_rsqf, "ff", "nc")
|
||||
BUILTIN(__builtin_amdgcn_rsq_clamp, "dd", "nc")
|
||||
BUILTIN(__builtin_amdgcn_rsq_clampf, "ff", "nc")
|
||||
BUILTIN(__builtin_amdgcn_sinf, "ff", "nc")
|
||||
BUILTIN(__builtin_amdgcn_cosf, "ff", "nc")
|
||||
BUILTIN(__builtin_amdgcn_log_clampf, "ff", "nc")
|
||||
BUILTIN(__builtin_amdgcn_ldexp, "ddi", "nc")
|
||||
BUILTIN(__builtin_amdgcn_ldexpf, "ffi", "nc")
|
||||
BUILTIN(__builtin_amdgcn_frexp_mant, "dd", "nc")
|
||||
BUILTIN(__builtin_amdgcn_frexp_mantf, "ff", "nc")
|
||||
BUILTIN(__builtin_amdgcn_frexp_exp, "id", "nc")
|
||||
BUILTIN(__builtin_amdgcn_frexp_expf, "if", "nc")
|
||||
BUILTIN(__builtin_amdgcn_fract, "dd", "nc")
|
||||
BUILTIN(__builtin_amdgcn_fractf, "ff", "nc")
|
||||
BUILTIN(__builtin_amdgcn_lerp, "UiUiUiUi", "nc")
|
||||
BUILTIN(__builtin_amdgcn_class, "bdi", "nc")
|
||||
BUILTIN(__builtin_amdgcn_classf, "bfi", "nc")
|
||||
BUILTIN(__builtin_amdgcn_cubeid, "ffff", "nc")
|
||||
BUILTIN(__builtin_amdgcn_cubesc, "ffff", "nc")
|
||||
BUILTIN(__builtin_amdgcn_cubetc, "ffff", "nc")
|
||||
BUILTIN(__builtin_amdgcn_cubema, "ffff", "nc")
|
||||
BUILTIN(__builtin_amdgcn_s_memtime, "LUi", "n")
|
||||
BUILTIN(__builtin_amdgcn_s_sleep, "vIi", "n")
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// VI+ only builtins.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
TARGET_BUILTIN(__builtin_amdgcn_s_memrealtime, "LUi", "n", "s-memrealtime")
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Special builtins.
|
||||
//===----------------------------------------------------------------------===//
|
||||
BUILTIN(__builtin_amdgcn_read_exec, "LUi", "nc")
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// R600-NI only builtins.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
BUILTIN(__builtin_r600_implicitarg_ptr, "Uc*7", "nc")
|
||||
|
||||
BUILTIN(__builtin_r600_read_tgid_x, "Ui", "nc")
|
||||
BUILTIN(__builtin_r600_read_tgid_y, "Ui", "nc")
|
||||
BUILTIN(__builtin_r600_read_tgid_z, "Ui", "nc")
|
||||
|
||||
BUILTIN(__builtin_r600_read_tidig_x, "Ui", "nc")
|
||||
BUILTIN(__builtin_r600_read_tidig_y, "Ui", "nc")
|
||||
BUILTIN(__builtin_r600_read_tidig_z, "Ui", "nc")
|
||||
|
||||
BUILTIN(__builtin_r600_recipsqrt_ieee, "dd", "nc")
|
||||
BUILTIN(__builtin_r600_recipsqrt_ieeef, "ff", "nc")
|
||||
|
||||
#undef BUILTIN
|
||||
#undef TARGET_BUILTIN
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@
|
|||
|
||||
// In libgcc
|
||||
BUILTIN(__clear_cache, "vv*v*", "i")
|
||||
BUILTIN(__builtin_thread_pointer, "v*", "")
|
||||
|
||||
// Saturating arithmetic
|
||||
BUILTIN(__builtin_arm_qadd, "iii", "nc")
|
||||
|
|
@ -48,14 +47,26 @@ BUILTIN(__builtin_arm_vcvtr_f, "ffi", "nc")
|
|||
BUILTIN(__builtin_arm_vcvtr_d, "fdi", "nc")
|
||||
|
||||
// Coprocessor
|
||||
BUILTIN(__builtin_arm_ldc, "vUIiUIivC*", "")
|
||||
BUILTIN(__builtin_arm_ldcl, "vUIiUIivC*", "")
|
||||
BUILTIN(__builtin_arm_ldc2, "vUIiUIivC*", "")
|
||||
BUILTIN(__builtin_arm_ldc2l, "vUIiUIivC*", "")
|
||||
|
||||
BUILTIN(__builtin_arm_stc, "vUIiUIiv*", "")
|
||||
BUILTIN(__builtin_arm_stcl, "vUIiUIiv*", "")
|
||||
BUILTIN(__builtin_arm_stc2, "vUIiUIiv*", "")
|
||||
BUILTIN(__builtin_arm_stc2l, "vUIiUIiv*", "")
|
||||
|
||||
BUILTIN(__builtin_arm_cdp, "vUIiUIiUIiUIiUIiUIi", "")
|
||||
BUILTIN(__builtin_arm_cdp2, "vUIiUIiUIiUIiUIiUIi", "")
|
||||
BUILTIN(__builtin_arm_mcr, "vUIiUIiUiUIiUIiUIi", "")
|
||||
BUILTIN(__builtin_arm_mcr2, "vUIiUIiUiUIiUIiUIi", "")
|
||||
BUILTIN(__builtin_arm_mrc, "UiUIiUIiUIiUIiUIi", "")
|
||||
BUILTIN(__builtin_arm_mrc2, "UiUIiUIiUIiUIiUIi", "")
|
||||
BUILTIN(__builtin_arm_cdp, "vUiUiUiUiUiUi", "")
|
||||
BUILTIN(__builtin_arm_cdp2, "vUiUiUiUiUiUi", "")
|
||||
BUILTIN(__builtin_arm_mcrr, "vUIiUIiUiUiUIi", "")
|
||||
BUILTIN(__builtin_arm_mcrr2, "vUIiUIiUiUiUIi", "")
|
||||
BUILTIN(__builtin_arm_mcrr, "vUIiUIiLLUiUIi", "")
|
||||
BUILTIN(__builtin_arm_mcrr2, "vUIiUIiLLUiUIi", "")
|
||||
BUILTIN(__builtin_arm_mrrc, "LLUiUIiUIiUIi", "")
|
||||
BUILTIN(__builtin_arm_mrrc2, "LLUiUIiUIiUIi", "")
|
||||
|
||||
// CRC32
|
||||
BUILTIN(__builtin_arm_crc32b, "UiUiUc", "nc")
|
||||
|
|
|
|||
|
|
@ -18,57 +18,78 @@
|
|||
// Make sure you do not overwrite these.
|
||||
|
||||
BUILTIN(__builtin_SI_to_SXTHI_asrh, "ii", "")
|
||||
BUILTIN(__builtin_circ_ldd, "LLi*LLi*LLi*ii", "")
|
||||
BUILTIN(__builtin_brev_ldd, "LLi*LLi*LLi*i", "")
|
||||
BUILTIN(__builtin_brev_ldw, "i*i*i*i", "")
|
||||
BUILTIN(__builtin_brev_ldh, "s*s*s*i", "")
|
||||
BUILTIN(__builtin_brev_lduh, "Us*Us*Us*i", "")
|
||||
BUILTIN(__builtin_brev_ldb, "c*c*c*i", "")
|
||||
BUILTIN(__builtin_brev_ldub, "Uc*Uc*Uc*i", "")
|
||||
BUILTIN(__builtin_circ_ldd, "LLi*LLi*LLi*iIi", "")
|
||||
BUILTIN(__builtin_circ_ldw, "i*i*i*iIi", "")
|
||||
BUILTIN(__builtin_circ_ldh, "s*s*s*iIi", "")
|
||||
BUILTIN(__builtin_circ_lduh, "Us*Us*Us*iIi", "")
|
||||
BUILTIN(__builtin_circ_ldb, "c*c*c*iIi", "")
|
||||
BUILTIN(__builtin_circ_ldub, "Uc*Uc*Uc*iIi", "")
|
||||
BUILTIN(__builtin_brev_std, "LLi*LLi*LLii", "")
|
||||
BUILTIN(__builtin_brev_stw, "i*i*ii", "")
|
||||
BUILTIN(__builtin_brev_sth, "s*s*ii", "")
|
||||
BUILTIN(__builtin_brev_sthhi, "s*s*ii", "")
|
||||
BUILTIN(__builtin_brev_stb, "c*c*ii", "")
|
||||
BUILTIN(__builtin_circ_std, "LLi*LLi*LLiiIi", "")
|
||||
BUILTIN(__builtin_circ_stw, "i*i*iiIi", "")
|
||||
BUILTIN(__builtin_circ_sth, "s*s*iiIi", "")
|
||||
BUILTIN(__builtin_circ_sthhi, "s*s*iiIi", "")
|
||||
BUILTIN(__builtin_circ_stb, "c*c*iiIi", "")
|
||||
|
||||
// The builtins above are not autogenerated from iset.py.
|
||||
// Make sure you do not overwrite these.
|
||||
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpeq,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgt,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgtu,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpeqp,"bLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgtp,"bLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgtup,"bLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpeq,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgt,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgtu,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpeqp,"iLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgtp,"iLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgtup,"iLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_rcmpeqi,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_rcmpneqi,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_rcmpeq,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_rcmpneq,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_bitsset,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_bitsclr,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_nbitsset,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_nbitsclr,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpeqi,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgti,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgtui,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgei,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgeui,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmplt,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpltu,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_bitsclri,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_nbitsclri,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_cmpneqi,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_cmpltei,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_cmplteui,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_cmpneq,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_cmplte,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_cmplteu,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_and,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_or,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_xor,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_andn,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_not,"bi","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_orn,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_and_and,"biii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_and_or,"biii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_or_and,"biii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_or_or,"biii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_and_andn,"biii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_and_orn,"biii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_or_andn,"biii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_or_orn,"biii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_pxfer_map,"bi","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_any8,"bi","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_all8,"bi","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_bitsset,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_bitsclr,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_nbitsset,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_nbitsclr,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpeqi,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgti,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgtui,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgei,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpgeui,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmplt,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_cmpltu,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_bitsclri,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_nbitsclri,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_cmpneqi,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_cmpltei,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_cmplteui,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_cmpneq,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_cmplte,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_cmplteu,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_and,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_or,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_xor,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_andn,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_not,"ii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_orn,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_and_and,"iiii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_and_or,"iiii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_or_and,"iiii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_or_or,"iiii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_and_andn,"iiii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_and_orn,"iiii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_or_andn,"iiii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_or_orn,"iiii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_pxfer_map,"ii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_any8,"ii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_all8,"ii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_vitpack,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_mux,"iiii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_muxii,"iiii","")
|
||||
|
|
@ -76,43 +97,43 @@ BUILTIN(__builtin_HEXAGON_C2_muxir,"iiii","")
|
|||
BUILTIN(__builtin_HEXAGON_C2_muxri,"iiii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_vmux,"LLiiLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_mask,"LLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmpbeq,"bLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpbeqi,"bLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpbeq_any,"bLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmpbgtu,"bLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpbgtui,"bLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpbgt,"bLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpbgti,"bLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpbeq,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpbeqi,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpbgtu,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpbgtui,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpbgt,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpbgti,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmpheq,"bLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmphgt,"bLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmphgtu,"bLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpheqi,"bLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmphgti,"bLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmphgtui,"bLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpheq,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmphgt,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmphgtu,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpheqi,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmphgti,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmphgtui,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmpweq,"bLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmpwgt,"bLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmpwgtu,"bLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpweqi,"bLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpwgti,"bLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpwgtui,"bLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_boundscheck,"biLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_tlbmatch,"bLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmpbeq,"iLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpbeqi,"iLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpbeq_any,"iLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmpbgtu,"iLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpbgtui,"iLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpbgt,"iLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpbgti,"iLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpbeq,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpbeqi,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpbgtu,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpbgtui,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpbgt,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpbgti,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmpheq,"iLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmphgt,"iLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmphgtu,"iLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpheqi,"iLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmphgti,"iLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmphgtui,"iLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpheq,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmphgt,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmphgtu,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmpheqi,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmphgti,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_cmphgtui,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmpweq,"iLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmpwgt,"iLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A2_vcmpwgtu,"iLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpweqi,"iLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpwgti,"iLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_vcmpwgtui,"iLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_boundscheck,"iiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_A4_tlbmatch,"iLLii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_tfrpr,"ii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_tfrrp,"bi","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_fastcorner9,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_fastcorner9_not,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_C2_tfrrp,"ii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_fastcorner9,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_C4_fastcorner9_not,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_M2_mpy_acc_hh_s0,"iiii","")
|
||||
BUILTIN(__builtin_HEXAGON_M2_mpy_acc_hh_s1,"iiii","")
|
||||
BUILTIN(__builtin_HEXAGON_M2_mpy_acc_hl_s0,"iiii","")
|
||||
|
|
@ -620,38 +641,25 @@ BUILTIN(__builtin_HEXAGON_F2_sffma_sc,"ffffi","")
|
|||
BUILTIN(__builtin_HEXAGON_F2_sffms,"ffff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sffma_lib,"ffff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sffms_lib,"ffff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sfcmpeq,"bff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sfcmpgt,"bff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sfcmpge,"bff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sfcmpuo,"bff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sfcmpeq,"iff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sfcmpgt,"iff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sfcmpge,"iff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sfcmpuo,"iff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sfmax,"fff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sfmin,"fff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sfclass,"bfi","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sfclass,"ifi","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sfimm_p,"fi","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sfimm_n,"fi","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sffixupn,"fff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sffixupd,"fff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_sffixupr,"ff","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfadd,"ddd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfsub,"ddd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfmpy,"ddd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dffma,"dddd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dffms,"dddd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dffma_lib,"dddd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dffms_lib,"dddd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dffma_sc,"ddddi","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfmax,"ddd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfmin,"ddd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfcmpeq,"bdd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfcmpgt,"bdd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfcmpge,"bdd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfcmpuo,"bdd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfclass,"bdi","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfcmpeq,"idd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfcmpgt,"idd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfcmpge,"idd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfcmpuo,"idd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfclass,"idi","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfimm_p,"di","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dfimm_n,"di","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dffixupn,"ddd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dffixupd,"ddd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_dffixupr,"dd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_conv_sf2df,"df","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_conv_df2sf,"fd","")
|
||||
BUILTIN(__builtin_HEXAGON_F2_conv_uw2sf,"fi","")
|
||||
|
|
@ -797,13 +805,13 @@ BUILTIN(__builtin_HEXAGON_S2_extractu_rp,"iiLLi","")
|
|||
BUILTIN(__builtin_HEXAGON_S2_insertp_rp,"LLiLLiLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_S4_extractp_rp,"LLiLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_S2_extractup_rp,"LLiLLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_S2_tstbit_i,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_S4_ntstbit_i,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_S2_tstbit_i,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_S4_ntstbit_i,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_S2_setbit_i,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_S2_togglebit_i,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_S2_clrbit_i,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_S2_tstbit_r,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_S4_ntstbit_r,"bii","")
|
||||
BUILTIN(__builtin_HEXAGON_S2_tstbit_r,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_S4_ntstbit_r,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_S2_setbit_r,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_S2_togglebit_r,"iii","")
|
||||
BUILTIN(__builtin_HEXAGON_S2_clrbit_r,"iii","")
|
||||
|
|
@ -875,4 +883,623 @@ BUILTIN(__builtin_HEXAGON_S2_ct1p,"iLLi","")
|
|||
BUILTIN(__builtin_HEXAGON_S2_interleave,"LLiLLi","")
|
||||
BUILTIN(__builtin_HEXAGON_S2_deinterleave,"LLiLLi","")
|
||||
|
||||
BUILTIN(__builtin_HEXAGON_S6_rol_i_r,"iii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_S6_rol_i_p,"LLiLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_S6_rol_i_r_acc,"iiii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_S6_rol_i_p_acc,"LLiLLiLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_S6_rol_i_r_nac,"iiii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_S6_rol_i_p_nac,"LLiLLiLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_S6_rol_i_r_xacc,"iiii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_S6_rol_i_p_xacc,"LLiLLiLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_S6_rol_i_r_and,"iiii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_S6_rol_i_r_or,"iiii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_S6_rol_i_p_and,"LLiLLiLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_S6_rol_i_p_or,"LLiLLiLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_S2_cabacencbin,"LLiLLiLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_valignb,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_valignb_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlalignb,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlalignb_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_valignbi,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_valignbi_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlalignbi,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlalignbi_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vror,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vror_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vunpackub,"V32iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vunpackub_128B,"V64iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vunpackb,"V32iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vunpackb_128B,"V64iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vunpackuh,"V32iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vunpackuh_128B,"V64iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vunpackh,"V32iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vunpackh_128B,"V64iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vunpackob,"V32iV32iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vunpackob_128B,"V64iV64iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vunpackoh,"V32iV32iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vunpackoh_128B,"V64iV64iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackeb,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackeb_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackeh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackeh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackob,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackob_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackoh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackoh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackhub_sat,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackhub_sat_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackhb_sat,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackhb_sat_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackwuh_sat,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackwuh_sat_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackwh_sat,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpackwh_sat_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vzb,"V32iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vzb_128B,"V64iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsb,"V32iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsb_128B,"V64iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vzh,"V32iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vzh_128B,"V64iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsh,"V32iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsh_128B,"V64iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpybus,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpybus_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpybus_acc,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpybus_acc_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpybus_dv,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpybus_dv_128B,"V64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpybus_dv_acc,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpybus_dv_acc_128B,"V64iV64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhb,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhb_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhb_acc,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhb_acc_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhb_dv,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhb_dv_128B,"V64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhb_dv_acc,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhb_dv_acc_128B,"V64iV64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhvsat,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhvsat_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhvsat_acc,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhvsat_acc_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhsat,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhsat_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhsat_acc,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhsat_acc_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhisat,"V16iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhisat_128B,"V32iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhisat_acc,"V16iV16iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhisat_acc_128B,"V32iV32iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhsusat,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhsusat_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhsusat_acc,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhsusat_acc_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhsuisat,"V16iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhsuisat_128B,"V32iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhsuisat_acc,"V16iV16iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdmpyhsuisat_acc_128B,"V32iV32iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vtmpyb,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vtmpyb_128B,"V64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vtmpyb_acc,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vtmpyb_acc_128B,"V64iV64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vtmpybus,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vtmpybus_128B,"V64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vtmpybus_acc,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vtmpybus_acc_128B,"V64iV64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vtmpyhb,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vtmpyhb_128B,"V64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vtmpyhb_acc,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vtmpyhb_acc_128B,"V64iV64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpyub,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpyub_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpyub_acc,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpyub_acc_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpyubv,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpyubv_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpyubv_acc,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpyubv_acc_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybv,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybv_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybv_acc,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybv_acc_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpyubi,"V32iV32iii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpyubi_128B,"V64iV64iii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpyubi_acc,"V32iV32iV32iii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpyubi_acc_128B,"V64iV64iV64iii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybus,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybus_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybus_acc,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybus_acc_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybusi,"V32iV32iii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybusi_128B,"V64iV64iii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybusi_acc,"V32iV32iV32iii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybusi_acc_128B,"V64iV64iV64iii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybusv,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybusv_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybusv_acc,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrmpybusv_acc_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdsaduh,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdsaduh_128B,"V64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdsaduh_acc,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdsaduh_acc_128B,"V64iV64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrsadubi,"V32iV32iii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrsadubi_128B,"V64iV64iii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrsadubi_acc,"V32iV32iV32iii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrsadubi_acc_128B,"V64iV64iV64iii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrw,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrw_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaslw,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaslw_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlsrw,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlsrw_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrwv,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrwv_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaslwv,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaslwv_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlsrwv,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlsrwv_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrh,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrh_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaslh,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaslh_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlsrh,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlsrh_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrhv,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrhv_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaslhv,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaslhv_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlsrhv,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlsrhv_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrwh,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrwh_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrwhsat,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrwhsat_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrwhrndsat,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrwhrndsat_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrwuhsat,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrwuhsat_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vroundwh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vroundwh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vroundwuh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vroundwuh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrhubsat,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrhubsat_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrhubrndsat,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrhubrndsat_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrhbrndsat,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrhbrndsat_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vroundhb,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vroundhb_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vroundhub,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vroundhub_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaslw_acc,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaslw_acc_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrw_acc,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vasrw_acc_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddb,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddb_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubb,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubb_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddb_dv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddb_dv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubb_dv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubb_dv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddh_dv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddh_dv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubh_dv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubh_dv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddw,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddw_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubw,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubw_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddw_dv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddw_dv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubw_dv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubw_dv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddubsat,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddubsat_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddubsat_dv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddubsat_dv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsububsat,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsububsat_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsububsat_dv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsububsat_dv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vadduhsat,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vadduhsat_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vadduhsat_dv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vadduhsat_dv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubuhsat,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubuhsat_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubuhsat_dv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubuhsat_dv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddhsat,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddhsat_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddhsat_dv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddhsat_dv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubhsat,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubhsat_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubhsat_dv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubhsat_dv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddwsat,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddwsat_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddwsat_dv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddwsat_dv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubwsat,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubwsat_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubwsat_dv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubwsat_dv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavgub,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavgub_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavgubrnd,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavgubrnd_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavguh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavguh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavguhrnd,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavguhrnd_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavgh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavgh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavghrnd,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavghrnd_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vnavgh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vnavgh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavgw,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavgw_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavgwrnd,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vavgwrnd_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vnavgw,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vnavgw_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsdiffub,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsdiffub_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsdiffuh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsdiffuh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsdiffh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsdiffh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsdiffw,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsdiffw_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vnavgub,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vnavgub_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddubh,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddubh_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsububh,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsububh_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddhw,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddhw_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubhw,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubhw_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vadduhw,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vadduhw_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubuhw,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubuhw_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vd0,"V16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vd0_128B,"V32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddbq,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddbq_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubbq,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubbq_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddbnq,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddbnq_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubbnq,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubbnq_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddhq,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddhq_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubhq,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubhq_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddhnq,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddhnq_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubhnq,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubhnq_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddwq,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddwq_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubwq,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubwq_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddwnq,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vaddwnq_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubwnq,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsubwnq_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsh,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsh_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsh_sat,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsh_sat_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsw,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsw_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsw_sat,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vabsw_sat_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpybv,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpybv_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpybv_acc,"V32iV32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpybv_acc_128B,"V64iV64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyubv,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyubv_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyubv_acc,"V32iV32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyubv_acc_128B,"V64iV64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpybusv,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpybusv_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpybusv_acc,"V32iV32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpybusv_acc_128B,"V64iV64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpabusv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpabusv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpabuuv,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpabuuv_128B,"V64iV64iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhv,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhv_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhv_acc,"V32iV32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhv_acc_128B,"V64iV64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyuhv,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyuhv_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyuhv_acc,"V32iV32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyuhv_acc_128B,"V64iV64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhvsrs,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhvsrs_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhus,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhus_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhus_acc,"V32iV32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhus_acc_128B,"V64iV64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyih,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyih_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyih_acc,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyih_acc_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyewuh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyewuh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyowh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyowh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyowh_rnd,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyowh_rnd_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyowh_sacc,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyowh_sacc_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyowh_rnd_sacc,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyowh_rnd_sacc_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyieoh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyieoh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiewuh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiewuh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiowh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiowh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiewh_acc,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiewh_acc_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiewuh_acc,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiewuh_acc_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyub,"V32iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyub_128B,"V64iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyub_acc,"V32iV32iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyub_acc_128B,"V64iV64iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpybus,"V32iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpybus_128B,"V64iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpybus_acc,"V32iV32iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpybus_acc_128B,"V64iV64iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpabus,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpabus_128B,"V64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpabus_acc,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpabus_acc_128B,"V64iV64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpahb,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpahb_128B,"V64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpahb_acc,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpahb_acc_128B,"V64iV64iV64ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyh,"V32iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyh_128B,"V64iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhsat_acc,"V32iV32iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhsat_acc_128B,"V64iV64iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhss,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhss_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhsrs,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyhsrs_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyuh,"V32iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyuh_128B,"V64iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyuh_acc,"V32iV32iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyuh_acc_128B,"V64iV64iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyihb,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyihb_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyihb_acc,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyihb_acc_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiwb,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiwb_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiwb_acc,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiwb_acc_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiwh,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiwh_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiwh_acc,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmpyiwh_acc_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vand,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vand_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vor,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vor_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vxor,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vxor_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vnot,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vnot_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vandqrt,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vandqrt_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vandqrt_acc,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vandqrt_acc_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vandvrt,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vandvrt_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vandvrt_acc,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vandvrt_acc_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtw,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtw_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtw_and,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtw_and_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtw_or,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtw_or_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtw_xor,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtw_xor_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqw,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqw_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqw_and,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqw_and_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqw_or,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqw_or_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqw_xor,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqw_xor_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgth,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgth_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgth_and,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgth_and_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgth_or,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgth_or_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgth_xor,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgth_xor_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqh_and,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqh_and_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqh_or,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqh_or_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqh_xor,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqh_xor_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtb,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtb_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtb_and,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtb_and_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtb_or,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtb_or_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtb_xor,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtb_xor_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqb,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqb_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqb_and,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqb_and_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqb_or,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqb_or_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqb_xor,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_veqb_xor_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuw,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuw_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuw_and,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuw_and_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuw_or,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuw_or_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuw_xor,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuw_xor_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuh_and,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuh_and_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuh_or,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuh_or_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuh_xor,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtuh_xor_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtub,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtub_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtub_and,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtub_and_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtub_or,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtub_or_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtub_xor,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vgtub_xor_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_pred_or,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_pred_or_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_pred_and,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_pred_and_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_pred_not,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_pred_not_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_pred_xor,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_pred_xor_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_pred_and_n,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_pred_and_n_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_pred_or_n,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_pred_or_n_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_pred_scalar2,"V16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_pred_scalar2_128B,"V32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmux,"V16iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmux_128B,"V32iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vswap,"V32iV16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vswap_128B,"V64iV32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmaxub,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmaxub_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vminub,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vminub_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmaxuh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmaxuh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vminuh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vminuh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmaxh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmaxh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vminh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vminh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmaxw,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vmaxw_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vminw,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vminw_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsathub,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsathub_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsatwh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vsatwh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshuffeb,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshuffeb_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshuffob,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshuffob_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshufeh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshufeh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshufoh,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshufoh_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshuffvdd,"V32iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshuffvdd_128B,"V64iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdealvdd,"V32iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdealvdd_128B,"V64iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshufoeh,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshufoeh_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshufoeb,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshufoeb_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdealh,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdealh_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdealb,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdealb_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdealb4w,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdealb4w_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshuffh,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshuffh_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshuffb,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vshuffb_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_extractw,"iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_extractw_128B,"iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vinsertwr,"V16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vinsertwr_128B,"V32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_lvsplatw,"V16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_lvsplatw_128B,"V32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vassign,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vassign_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vcombine,"V32iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vcombine_128B,"V64iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutb,"V16iV16iLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutb_128B,"V32iV32iLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutb_acc,"V16iV16iV16iLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutb_acc_128B,"V32iV32iV32iLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutb_dv,"V32iV32iLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutb_dv_128B,"V64iV64iLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutb_dv_acc,"V32iV32iV32iLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutb_dv_acc_128B,"V64iV64iV64iLLii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdelta,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vdelta_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrdelta,"V16iV16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vrdelta_128B,"V32iV32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vcl0w,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vcl0w_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vcl0h,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vcl0h_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vnormamtw,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vnormamtw_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vnormamth,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vnormamth_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpopcounth,"V16iV16i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vpopcounth_128B,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutvvb,"V16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutvvb_128B,"V32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutvvb_oracc,"V16iV16iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutvvb_oracc_128B,"V32iV32iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutvwh,"V32iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutvwh_128B,"V64iV32iV32ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutvwh_oracc,"V32iV32iV16iV16ii","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vlutvwh_oracc_128B,"V64iV64iV32iV32ii","v:60:")
|
||||
|
||||
BUILTIN(__builtin_HEXAGON_V6_hi,"V16iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_lo,"V16iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_hi_128B,"V32iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_lo_128B,"V32iV64i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vassignp,"V32iV32i","v:60:")
|
||||
BUILTIN(__builtin_HEXAGON_V6_vassignp_128B,"V64iV64i","v:60:")
|
||||
|
||||
#undef BUILTIN
|
||||
|
|
|
|||
|
|
@ -14,53 +14,50 @@
|
|||
|
||||
// The format of this database matches clang/Basic/Builtins.def.
|
||||
|
||||
// Builtins retained from previous PTX back-end
|
||||
BUILTIN(__builtin_ptx_read_tid_x, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_tid_y, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_tid_z, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_tid_w, "i", "nc")
|
||||
// Special Registers
|
||||
|
||||
BUILTIN(__builtin_ptx_read_ntid_x, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_ntid_y, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_ntid_z, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_ntid_w, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_tid_x, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_tid_y, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_tid_z, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_tid_w, "i", "nc")
|
||||
|
||||
BUILTIN(__builtin_ptx_read_ctaid_x, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_ctaid_y, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_ctaid_z, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_ctaid_w, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_ntid_x, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_ntid_y, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_ntid_z, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_ntid_w, "i", "nc")
|
||||
|
||||
BUILTIN(__builtin_ptx_read_nctaid_x, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_nctaid_y, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_nctaid_z, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_nctaid_w, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_ctaid_x, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_ctaid_y, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_ctaid_z, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_ctaid_w, "i", "nc")
|
||||
|
||||
BUILTIN(__builtin_ptx_read_laneid, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_warpid, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_nwarpid, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_nctaid_x, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_nctaid_y, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_nctaid_z, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_nctaid_w, "i", "nc")
|
||||
|
||||
BUILTIN(__builtin_ptx_read_smid, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_nsmid, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_gridid, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_laneid, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_warpid, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_nwarpid, "i", "nc")
|
||||
|
||||
BUILTIN(__builtin_ptx_read_lanemask_eq, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_lanemask_le, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_lanemask_lt, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_lanemask_ge, "i", "nc")
|
||||
BUILTIN(__builtin_ptx_read_lanemask_gt, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_smid, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_nsmid, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_gridid, "i", "nc")
|
||||
|
||||
BUILTIN(__builtin_ptx_read_clock, "i", "n")
|
||||
BUILTIN(__builtin_ptx_read_clock64, "LLi", "n")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_lanemask_eq, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_lanemask_le, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_lanemask_lt, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_lanemask_ge, "i", "nc")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_lanemask_gt, "i", "nc")
|
||||
|
||||
BUILTIN(__builtin_ptx_read_pm0, "i", "n")
|
||||
BUILTIN(__builtin_ptx_read_pm1, "i", "n")
|
||||
BUILTIN(__builtin_ptx_read_pm2, "i", "n")
|
||||
BUILTIN(__builtin_ptx_read_pm3, "i", "n")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_clock, "i", "n")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_clock64, "LLi", "n")
|
||||
|
||||
BUILTIN(__builtin_ptx_bar_sync, "vi", "n")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_pm0, "i", "n")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_pm1, "i", "n")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_pm2, "i", "n")
|
||||
BUILTIN(__nvvm_read_ptx_sreg_pm3, "i", "n")
|
||||
|
||||
|
||||
// Builtins exposed as part of NVVM
|
||||
// MISC
|
||||
|
||||
BUILTIN(__nvvm_clz_i, "ii", "")
|
||||
|
|
@ -397,10 +394,21 @@ BUILTIN(__nvvm_bitcast_d2ll, "LLid", "")
|
|||
// Sync
|
||||
|
||||
BUILTIN(__syncthreads, "v", "")
|
||||
BUILTIN(__nvvm_bar0, "v", "")
|
||||
BUILTIN(__nvvm_bar0_popc, "ii", "")
|
||||
BUILTIN(__nvvm_bar0_and, "ii", "")
|
||||
BUILTIN(__nvvm_bar0_or, "ii", "")
|
||||
BUILTIN(__nvvm_bar_sync, "vi", "n")
|
||||
|
||||
// Shuffle
|
||||
|
||||
BUILTIN(__nvvm_shfl_down_i32, "iiii", "")
|
||||
BUILTIN(__nvvm_shfl_down_f32, "ffii", "")
|
||||
BUILTIN(__nvvm_shfl_up_i32, "iiii", "")
|
||||
BUILTIN(__nvvm_shfl_up_f32, "ffii", "")
|
||||
BUILTIN(__nvvm_shfl_bfly_i32, "iiii", "")
|
||||
BUILTIN(__nvvm_shfl_bfly_f32, "ffii", "")
|
||||
BUILTIN(__nvvm_shfl_idx_i32, "iiii", "")
|
||||
BUILTIN(__nvvm_shfl_idx_f32, "ffii", "")
|
||||
|
||||
// Membar
|
||||
|
||||
|
|
@ -566,4 +574,40 @@ BUILTIN(__nvvm_atom_cas_gen_ll, "LLiLLiD*LLiLLi", "n")
|
|||
BUILTIN(__nvvm_compiler_error, "vcC*4", "n")
|
||||
BUILTIN(__nvvm_compiler_warn, "vcC*4", "n")
|
||||
|
||||
// __ldg. This is not implemented as a builtin by nvcc.
|
||||
BUILTIN(__nvvm_ldg_c, "ccC*", "")
|
||||
BUILTIN(__nvvm_ldg_s, "ssC*", "")
|
||||
BUILTIN(__nvvm_ldg_i, "iiC*", "")
|
||||
BUILTIN(__nvvm_ldg_l, "LiLiC*", "")
|
||||
BUILTIN(__nvvm_ldg_ll, "LLiLLiC*", "")
|
||||
|
||||
BUILTIN(__nvvm_ldg_uc, "UcUcC*", "")
|
||||
BUILTIN(__nvvm_ldg_us, "UsUsC*", "")
|
||||
BUILTIN(__nvvm_ldg_ui, "UiUiC*", "")
|
||||
BUILTIN(__nvvm_ldg_ul, "ULiULiC*", "")
|
||||
BUILTIN(__nvvm_ldg_ull, "ULLiULLiC*", "")
|
||||
|
||||
BUILTIN(__nvvm_ldg_f, "ffC*", "")
|
||||
BUILTIN(__nvvm_ldg_d, "ddC*", "")
|
||||
|
||||
BUILTIN(__nvvm_ldg_c2, "E2cE2cC*", "")
|
||||
BUILTIN(__nvvm_ldg_c4, "E4cE4cC*", "")
|
||||
BUILTIN(__nvvm_ldg_s2, "E2sE2sC*", "")
|
||||
BUILTIN(__nvvm_ldg_s4, "E4sE4sC*", "")
|
||||
BUILTIN(__nvvm_ldg_i2, "E2iE2iC*", "")
|
||||
BUILTIN(__nvvm_ldg_i4, "E4iE4iC*", "")
|
||||
BUILTIN(__nvvm_ldg_ll2, "E2LLiE2LLiC*", "")
|
||||
|
||||
BUILTIN(__nvvm_ldg_uc2, "E2UcE2UcC*", "")
|
||||
BUILTIN(__nvvm_ldg_uc4, "E4UcE4UcC*", "")
|
||||
BUILTIN(__nvvm_ldg_us2, "E2UsE2UsC*", "")
|
||||
BUILTIN(__nvvm_ldg_us4, "E4UsE4UsC*", "")
|
||||
BUILTIN(__nvvm_ldg_ui2, "E2UiE2UiC*", "")
|
||||
BUILTIN(__nvvm_ldg_ui4, "E4UiE4UiC*", "")
|
||||
BUILTIN(__nvvm_ldg_ull2, "E2ULLiE2ULLiC*", "")
|
||||
|
||||
BUILTIN(__nvvm_ldg_f2, "E2fE2fC*", "")
|
||||
BUILTIN(__nvvm_ldg_f4, "E4fE4fC*", "")
|
||||
BUILTIN(__nvvm_ldg_d2, "E2dE2dC*", "")
|
||||
|
||||
#undef BUILTIN
|
||||
|
|
|
|||
|
|
@ -336,6 +336,9 @@ BUILTIN(__builtin_vsx_xxleqv, "V4UiV4UiV4Ui", "")
|
|||
BUILTIN(__builtin_vsx_xvcpsgndp, "V2dV2dV2d", "")
|
||||
BUILTIN(__builtin_vsx_xvcpsgnsp, "V4fV4fV4f", "")
|
||||
|
||||
BUILTIN(__builtin_vsx_xvabssp, "V4fV4f", "")
|
||||
BUILTIN(__builtin_vsx_xvabsdp, "V2dV2d", "")
|
||||
|
||||
// HTM builtins
|
||||
BUILTIN(__builtin_tbegin, "UiUIi", "")
|
||||
BUILTIN(__builtin_tend, "UiUIi", "")
|
||||
|
|
|
|||
|
|
@ -14,239 +14,244 @@
|
|||
|
||||
// The format of this database matches clang/Basic/Builtins.def.
|
||||
|
||||
#if defined(BUILTIN) && !defined(TARGET_BUILTIN)
|
||||
# define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BUILTIN(ID, TYPE, ATTRS)
|
||||
#endif
|
||||
|
||||
// Transactional-memory intrinsics
|
||||
BUILTIN(__builtin_tbegin, "iv*", "j")
|
||||
BUILTIN(__builtin_tbegin_nofloat, "iv*", "j")
|
||||
BUILTIN(__builtin_tbeginc, "v", "nj")
|
||||
BUILTIN(__builtin_tabort, "vi", "r")
|
||||
BUILTIN(__builtin_tend, "i", "n")
|
||||
BUILTIN(__builtin_tx_nesting_depth, "i", "nc")
|
||||
BUILTIN(__builtin_tx_assist, "vi", "n")
|
||||
BUILTIN(__builtin_non_tx_store, "vULi*ULi", "")
|
||||
TARGET_BUILTIN(__builtin_tbegin, "iv*", "j", "transactional-execution")
|
||||
TARGET_BUILTIN(__builtin_tbegin_nofloat, "iv*", "j", "transactional-execution")
|
||||
TARGET_BUILTIN(__builtin_tbeginc, "v", "nj", "transactional-execution")
|
||||
TARGET_BUILTIN(__builtin_tabort, "vi", "r", "transactional-execution")
|
||||
TARGET_BUILTIN(__builtin_tend, "i", "n", "transactional-execution")
|
||||
TARGET_BUILTIN(__builtin_tx_nesting_depth, "i", "nc", "transactional-execution")
|
||||
TARGET_BUILTIN(__builtin_tx_assist, "vi", "n", "transactional-execution")
|
||||
TARGET_BUILTIN(__builtin_non_tx_store, "vULi*ULi", "", "transactional-execution")
|
||||
|
||||
// Vector intrinsics.
|
||||
// These all map directly to z instructions, except that some variants ending
|
||||
// in "s" have a final "int *" that receives the post-instruction CC value.
|
||||
|
||||
// Vector support instructions (chapter 21 of the PoP)
|
||||
BUILTIN(__builtin_s390_lcbb, "UivC*Ii", "nc")
|
||||
BUILTIN(__builtin_s390_vlbb, "V16ScvC*Ii", "")
|
||||
BUILTIN(__builtin_s390_vll, "V16ScUivC*", "")
|
||||
BUILTIN(__builtin_s390_vstl, "vV16ScUiv*", "")
|
||||
BUILTIN(__builtin_s390_vperm, "V16UcV16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vpdi, "V2ULLiV2ULLiV2ULLiIi", "nc")
|
||||
BUILTIN(__builtin_s390_vpksh, "V16ScV8SsV8Ss", "nc")
|
||||
BUILTIN(__builtin_s390_vpkshs, "V16ScV8SsV8Ssi*", "nc")
|
||||
BUILTIN(__builtin_s390_vpksf, "V8SsV4SiV4Si", "nc")
|
||||
BUILTIN(__builtin_s390_vpksfs, "V8SsV4SiV4Sii*", "nc")
|
||||
BUILTIN(__builtin_s390_vpksg, "V4SiV2SLLiV2SLLi", "nc")
|
||||
BUILTIN(__builtin_s390_vpksgs, "V4SiV2SLLiV2SLLii*", "nc")
|
||||
BUILTIN(__builtin_s390_vpklsh, "V16UcV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vpklshs, "V16UcV8UsV8Usi*", "nc")
|
||||
BUILTIN(__builtin_s390_vpklsf, "V8UsV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vpklsfs, "V8UsV4UiV4Uii*", "nc")
|
||||
BUILTIN(__builtin_s390_vpklsg, "V4UiV2ULLiV2ULLi", "nc")
|
||||
BUILTIN(__builtin_s390_vpklsgs, "V4UiV2ULLiV2ULLii*", "nc")
|
||||
BUILTIN(__builtin_s390_vuphb, "V8SsV16Sc", "nc")
|
||||
BUILTIN(__builtin_s390_vuphh, "V4SiV8Ss", "nc")
|
||||
BUILTIN(__builtin_s390_vuphf, "V2SLLiV4Si", "nc")
|
||||
BUILTIN(__builtin_s390_vuplb, "V8SsV16Sc", "nc")
|
||||
BUILTIN(__builtin_s390_vuplhw, "V4SiV8Ss", "nc")
|
||||
BUILTIN(__builtin_s390_vuplf, "V2SLLiV4Si", "nc")
|
||||
BUILTIN(__builtin_s390_vuplhb, "V8UsV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vuplhh, "V4UiV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vuplhf, "V2ULLiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vupllb, "V8UsV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vupllh, "V4UiV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vupllf, "V2ULLiV4Ui", "nc")
|
||||
TARGET_BUILTIN(__builtin_s390_lcbb, "UivC*Ii", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vlbb, "V16ScvC*Ii", "", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vll, "V16ScUivC*", "", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vstl, "vV16ScUiv*", "", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vperm, "V16UcV16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpdi, "V2ULLiV2ULLiV2ULLiIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpksh, "V16ScV8SsV8Ss", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpkshs, "V16ScV8SsV8Ssi*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpksf, "V8SsV4SiV4Si", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpksfs, "V8SsV4SiV4Sii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpksg, "V4SiV2SLLiV2SLLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpksgs, "V4SiV2SLLiV2SLLii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpklsh, "V16UcV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpklshs, "V16UcV8UsV8Usi*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpklsf, "V8UsV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpklsfs, "V8UsV4UiV4Uii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpklsg, "V4UiV2ULLiV2ULLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpklsgs, "V4UiV2ULLiV2ULLii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vuphb, "V8SsV16Sc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vuphh, "V4SiV8Ss", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vuphf, "V2SLLiV4Si", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vuplb, "V8SsV16Sc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vuplhw, "V4SiV8Ss", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vuplf, "V2SLLiV4Si", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vuplhb, "V8UsV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vuplhh, "V4UiV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vuplhf, "V2ULLiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vupllb, "V8UsV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vupllh, "V4UiV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vupllf, "V2ULLiV4Ui", "nc", "vector")
|
||||
|
||||
// Vector integer instructions (chapter 22 of the PoP)
|
||||
BUILTIN(__builtin_s390_vaq, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vacq, "V16UcV16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vaccb, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vacch, "V8UsV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vaccf, "V4UiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vaccg, "V2ULLiV2ULLiV2ULLi", "nc")
|
||||
BUILTIN(__builtin_s390_vaccq, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vacccq, "V16UcV16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vavgb, "V16ScV16ScV16Sc", "nc")
|
||||
BUILTIN(__builtin_s390_vavgh, "V8SsV8SsV8Ss", "nc")
|
||||
BUILTIN(__builtin_s390_vavgf, "V4SiV4SiV4Si", "nc")
|
||||
BUILTIN(__builtin_s390_vavgg, "V2SLLiV2SLLiV2SLLi", "nc")
|
||||
BUILTIN(__builtin_s390_vavglb, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vavglh, "V8UsV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vavglf, "V4UiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vavglg, "V2ULLiV2ULLiV2ULLi", "nc")
|
||||
BUILTIN(__builtin_s390_vceqbs, "V16ScV16ScV16Sci*", "nc")
|
||||
BUILTIN(__builtin_s390_vceqhs, "V8SsV8SsV8Ssi*", "nc")
|
||||
BUILTIN(__builtin_s390_vceqfs, "V4SiV4SiV4Sii*", "nc")
|
||||
BUILTIN(__builtin_s390_vceqgs, "V2SLLiV2SLLiV2SLLii*", "nc")
|
||||
BUILTIN(__builtin_s390_vchbs, "V16ScV16ScV16Sci*", "nc")
|
||||
BUILTIN(__builtin_s390_vchhs, "V8SsV8SsV8Ssi*", "nc")
|
||||
BUILTIN(__builtin_s390_vchfs, "V4SiV4SiV4Sii*", "nc")
|
||||
BUILTIN(__builtin_s390_vchgs, "V2SLLiV2SLLiV2SLLii*", "nc")
|
||||
BUILTIN(__builtin_s390_vchlbs, "V16ScV16UcV16Uci*", "nc")
|
||||
BUILTIN(__builtin_s390_vchlhs, "V8SsV8UsV8Usi*", "nc")
|
||||
BUILTIN(__builtin_s390_vchlfs, "V4SiV4UiV4Uii*", "nc")
|
||||
BUILTIN(__builtin_s390_vchlgs, "V2SLLiV2ULLiV2ULLii*", "nc")
|
||||
BUILTIN(__builtin_s390_vcksm, "V4UiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vclzb, "V16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vclzh, "V8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vclzf, "V4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vclzg, "V2ULLiV2ULLi", "nc")
|
||||
BUILTIN(__builtin_s390_vctzb, "V16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vctzh, "V8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vctzf, "V4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vctzg, "V2ULLiV2ULLi", "nc")
|
||||
BUILTIN(__builtin_s390_verimb, "V16UcV16UcV16UcV16UcIi", "nc")
|
||||
BUILTIN(__builtin_s390_verimh, "V8UsV8UsV8UsV8UsIi", "nc")
|
||||
BUILTIN(__builtin_s390_verimf, "V4UiV4UiV4UiV4UiIi", "nc")
|
||||
BUILTIN(__builtin_s390_verimg, "V2ULLiV2ULLiV2ULLiV2ULLiIi", "nc")
|
||||
BUILTIN(__builtin_s390_verllb, "V16UcV16UcUi", "nc")
|
||||
BUILTIN(__builtin_s390_verllh, "V8UsV8UsUi", "nc")
|
||||
BUILTIN(__builtin_s390_verllf, "V4UiV4UiUi", "nc")
|
||||
BUILTIN(__builtin_s390_verllg, "V2ULLiV2ULLiUi", "nc")
|
||||
BUILTIN(__builtin_s390_verllvb, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_verllvh, "V8UsV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_verllvf, "V4UiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_verllvg, "V2ULLiV2ULLiV2ULLi", "nc")
|
||||
BUILTIN(__builtin_s390_vgfmb, "V8UsV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vgfmh, "V4UiV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vgfmf, "V2ULLiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vgfmg, "V16UcV2ULLiV2ULLi", "nc")
|
||||
BUILTIN(__builtin_s390_vgfmab, "V8UsV16UcV16UcV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vgfmah, "V4UiV8UsV8UsV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vgfmaf, "V2ULLiV4UiV4UiV2ULLi", "nc")
|
||||
BUILTIN(__builtin_s390_vgfmag, "V16UcV2ULLiV2ULLiV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vmahb, "V16ScV16ScV16ScV16Sc", "nc")
|
||||
BUILTIN(__builtin_s390_vmahh, "V8SsV8SsV8SsV8Ss", "nc")
|
||||
BUILTIN(__builtin_s390_vmahf, "V4SiV4SiV4SiV4Si", "nc")
|
||||
BUILTIN(__builtin_s390_vmalhb, "V16UcV16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vmalhh, "V8UsV8UsV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vmalhf, "V4UiV4UiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vmaeb, "V8SsV16ScV16ScV8Ss", "nc")
|
||||
BUILTIN(__builtin_s390_vmaeh, "V4SiV8SsV8SsV4Si", "nc")
|
||||
BUILTIN(__builtin_s390_vmaef, "V2SLLiV4SiV4SiV2SLLi", "nc")
|
||||
BUILTIN(__builtin_s390_vmaleb, "V8UsV16UcV16UcV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vmaleh, "V4UiV8UsV8UsV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vmalef, "V2ULLiV4UiV4UiV2ULLi", "nc")
|
||||
BUILTIN(__builtin_s390_vmaob, "V8SsV16ScV16ScV8Ss", "nc")
|
||||
BUILTIN(__builtin_s390_vmaoh, "V4SiV8SsV8SsV4Si", "nc")
|
||||
BUILTIN(__builtin_s390_vmaof, "V2SLLiV4SiV4SiV2SLLi", "nc")
|
||||
BUILTIN(__builtin_s390_vmalob, "V8UsV16UcV16UcV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vmaloh, "V4UiV8UsV8UsV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vmalof, "V2ULLiV4UiV4UiV2ULLi", "nc")
|
||||
BUILTIN(__builtin_s390_vmhb, "V16ScV16ScV16Sc", "nc")
|
||||
BUILTIN(__builtin_s390_vmhh, "V8SsV8SsV8Ss", "nc")
|
||||
BUILTIN(__builtin_s390_vmhf, "V4SiV4SiV4Si", "nc")
|
||||
BUILTIN(__builtin_s390_vmlhb, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vmlhh, "V8UsV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vmlhf, "V4UiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vmeb, "V8SsV16ScV16Sc", "nc")
|
||||
BUILTIN(__builtin_s390_vmeh, "V4SiV8SsV8Ss", "nc")
|
||||
BUILTIN(__builtin_s390_vmef, "V2SLLiV4SiV4Si", "nc")
|
||||
BUILTIN(__builtin_s390_vmleb, "V8UsV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vmleh, "V4UiV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vmlef, "V2ULLiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vmob, "V8SsV16ScV16Sc", "nc")
|
||||
BUILTIN(__builtin_s390_vmoh, "V4SiV8SsV8Ss", "nc")
|
||||
BUILTIN(__builtin_s390_vmof, "V2SLLiV4SiV4Si", "nc")
|
||||
BUILTIN(__builtin_s390_vmlob, "V8UsV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vmloh, "V4UiV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vmlof, "V2ULLiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vpopctb, "V16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vpopcth, "V8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vpopctf, "V4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vpopctg, "V2ULLiV2ULLi", "nc")
|
||||
BUILTIN(__builtin_s390_vsq, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vsbcbiq, "V16UcV16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vsbiq, "V16UcV16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vscbib, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vscbih, "V8UsV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vscbif, "V4UiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vscbig, "V2ULLiV2ULLiV2ULLi", "nc")
|
||||
BUILTIN(__builtin_s390_vscbiq, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vsl, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vslb, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vsldb, "V16UcV16UcV16UcIi", "nc")
|
||||
BUILTIN(__builtin_s390_vsra, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vsrab, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vsrl, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vsrlb, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vsumb, "V4UiV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vsumh, "V4UiV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vsumgh, "V2ULLiV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vsumgf, "V2ULLiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vsumqf, "V16UcV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vsumqg, "V16UcV2ULLiV2ULLi", "nc")
|
||||
BUILTIN(__builtin_s390_vtm, "iV16UcV16Uc", "nc")
|
||||
TARGET_BUILTIN(__builtin_s390_vaq, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vacq, "V16UcV16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vaccb, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vacch, "V8UsV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vaccf, "V4UiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vaccg, "V2ULLiV2ULLiV2ULLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vaccq, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vacccq, "V16UcV16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vavgb, "V16ScV16ScV16Sc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vavgh, "V8SsV8SsV8Ss", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vavgf, "V4SiV4SiV4Si", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vavgg, "V2SLLiV2SLLiV2SLLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vavglb, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vavglh, "V8UsV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vavglf, "V4UiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vavglg, "V2ULLiV2ULLiV2ULLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vceqbs, "V16ScV16ScV16Sci*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vceqhs, "V8SsV8SsV8Ssi*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vceqfs, "V4SiV4SiV4Sii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vceqgs, "V2SLLiV2SLLiV2SLLii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vchbs, "V16ScV16ScV16Sci*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vchhs, "V8SsV8SsV8Ssi*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vchfs, "V4SiV4SiV4Sii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vchgs, "V2SLLiV2SLLiV2SLLii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vchlbs, "V16ScV16UcV16Uci*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vchlhs, "V8SsV8UsV8Usi*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vchlfs, "V4SiV4UiV4Uii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vchlgs, "V2SLLiV2ULLiV2ULLii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vcksm, "V4UiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vclzb, "V16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vclzh, "V8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vclzf, "V4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vclzg, "V2ULLiV2ULLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vctzb, "V16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vctzh, "V8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vctzf, "V4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vctzg, "V2ULLiV2ULLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_verimb, "V16UcV16UcV16UcV16UcIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_verimh, "V8UsV8UsV8UsV8UsIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_verimf, "V4UiV4UiV4UiV4UiIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_verimg, "V2ULLiV2ULLiV2ULLiV2ULLiIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_verllb, "V16UcV16UcUi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_verllh, "V8UsV8UsUi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_verllf, "V4UiV4UiUi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_verllg, "V2ULLiV2ULLiUi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_verllvb, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_verllvh, "V8UsV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_verllvf, "V4UiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_verllvg, "V2ULLiV2ULLiV2ULLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vgfmb, "V8UsV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vgfmh, "V4UiV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vgfmf, "V2ULLiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vgfmg, "V16UcV2ULLiV2ULLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vgfmab, "V8UsV16UcV16UcV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vgfmah, "V4UiV8UsV8UsV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vgfmaf, "V2ULLiV4UiV4UiV2ULLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vgfmag, "V16UcV2ULLiV2ULLiV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmahb, "V16ScV16ScV16ScV16Sc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmahh, "V8SsV8SsV8SsV8Ss", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmahf, "V4SiV4SiV4SiV4Si", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmalhb, "V16UcV16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmalhh, "V8UsV8UsV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmalhf, "V4UiV4UiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmaeb, "V8SsV16ScV16ScV8Ss", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmaeh, "V4SiV8SsV8SsV4Si", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmaef, "V2SLLiV4SiV4SiV2SLLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmaleb, "V8UsV16UcV16UcV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmaleh, "V4UiV8UsV8UsV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmalef, "V2ULLiV4UiV4UiV2ULLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmaob, "V8SsV16ScV16ScV8Ss", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmaoh, "V4SiV8SsV8SsV4Si", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmaof, "V2SLLiV4SiV4SiV2SLLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmalob, "V8UsV16UcV16UcV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmaloh, "V4UiV8UsV8UsV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmalof, "V2ULLiV4UiV4UiV2ULLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmhb, "V16ScV16ScV16Sc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmhh, "V8SsV8SsV8Ss", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmhf, "V4SiV4SiV4Si", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmlhb, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmlhh, "V8UsV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmlhf, "V4UiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmeb, "V8SsV16ScV16Sc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmeh, "V4SiV8SsV8Ss", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmef, "V2SLLiV4SiV4Si", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmleb, "V8UsV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmleh, "V4UiV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmlef, "V2ULLiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmob, "V8SsV16ScV16Sc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmoh, "V4SiV8SsV8Ss", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmof, "V2SLLiV4SiV4Si", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmlob, "V8UsV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmloh, "V4UiV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vmlof, "V2ULLiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpopctb, "V16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpopcth, "V8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpopctf, "V4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vpopctg, "V2ULLiV2ULLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsq, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsbcbiq, "V16UcV16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsbiq, "V16UcV16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vscbib, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vscbih, "V8UsV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vscbif, "V4UiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vscbig, "V2ULLiV2ULLiV2ULLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vscbiq, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsl, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vslb, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsldb, "V16UcV16UcV16UcIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsra, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsrab, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsrl, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsrlb, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsumb, "V4UiV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsumh, "V4UiV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsumgh, "V2ULLiV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsumgf, "V2ULLiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsumqf, "V16UcV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vsumqg, "V16UcV2ULLiV2ULLi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vtm, "iV16UcV16Uc", "nc", "vector")
|
||||
|
||||
// Vector string instructions (chapter 23 of the PoP)
|
||||
BUILTIN(__builtin_s390_vfaeb, "V16UcV16UcV16UcIi", "nc")
|
||||
BUILTIN(__builtin_s390_vfaebs, "V16UcV16UcV16UcIii*", "nc")
|
||||
BUILTIN(__builtin_s390_vfaeh, "V8UsV8UsV8UsIi", "nc")
|
||||
BUILTIN(__builtin_s390_vfaehs, "V8UsV8UsV8UsIii*", "nc")
|
||||
BUILTIN(__builtin_s390_vfaef, "V4UiV4UiV4UiIi", "nc")
|
||||
BUILTIN(__builtin_s390_vfaefs, "V4UiV4UiV4UiIii*", "nc")
|
||||
BUILTIN(__builtin_s390_vfaezb, "V16UcV16UcV16UcIi", "nc")
|
||||
BUILTIN(__builtin_s390_vfaezbs, "V16UcV16UcV16UcIii*", "nc")
|
||||
BUILTIN(__builtin_s390_vfaezh, "V8UsV8UsV8UsIi", "nc")
|
||||
BUILTIN(__builtin_s390_vfaezhs, "V8UsV8UsV8UsIii*", "nc")
|
||||
BUILTIN(__builtin_s390_vfaezf, "V4UiV4UiV4UiIi", "nc")
|
||||
BUILTIN(__builtin_s390_vfaezfs, "V4UiV4UiV4UiIii*", "nc")
|
||||
BUILTIN(__builtin_s390_vfeeb, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vfeebs, "V16UcV16UcV16Uci*", "nc")
|
||||
BUILTIN(__builtin_s390_vfeeh, "V8UsV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vfeehs, "V8UsV8UsV8Usi*", "nc")
|
||||
BUILTIN(__builtin_s390_vfeef, "V4UiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vfeefs, "V4UiV4UiV4Uii*", "nc")
|
||||
BUILTIN(__builtin_s390_vfeezb, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vfeezbs, "V16UcV16UcV16Uci*", "nc")
|
||||
BUILTIN(__builtin_s390_vfeezh, "V8UsV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vfeezhs, "V8UsV8UsV8Usi*", "nc")
|
||||
BUILTIN(__builtin_s390_vfeezf, "V4UiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vfeezfs, "V4UiV4UiV4Uii*", "nc")
|
||||
BUILTIN(__builtin_s390_vfeneb, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vfenebs, "V16UcV16UcV16Uci*", "nc")
|
||||
BUILTIN(__builtin_s390_vfeneh, "V8UsV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vfenehs, "V8UsV8UsV8Usi*", "nc")
|
||||
BUILTIN(__builtin_s390_vfenef, "V4UiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vfenefs, "V4UiV4UiV4Uii*", "nc")
|
||||
BUILTIN(__builtin_s390_vfenezb, "V16UcV16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vfenezbs, "V16UcV16UcV16Uci*", "nc")
|
||||
BUILTIN(__builtin_s390_vfenezh, "V8UsV8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vfenezhs, "V8UsV8UsV8Usi*", "nc")
|
||||
BUILTIN(__builtin_s390_vfenezf, "V4UiV4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vfenezfs, "V4UiV4UiV4Uii*", "nc")
|
||||
BUILTIN(__builtin_s390_vistrb, "V16UcV16Uc", "nc")
|
||||
BUILTIN(__builtin_s390_vistrbs, "V16UcV16Uci*", "nc")
|
||||
BUILTIN(__builtin_s390_vistrh, "V8UsV8Us", "nc")
|
||||
BUILTIN(__builtin_s390_vistrhs, "V8UsV8Usi*", "nc")
|
||||
BUILTIN(__builtin_s390_vistrf, "V4UiV4Ui", "nc")
|
||||
BUILTIN(__builtin_s390_vistrfs, "V4UiV4Uii*", "nc")
|
||||
BUILTIN(__builtin_s390_vstrcb, "V16UcV16UcV16UcV16UcIi", "nc")
|
||||
BUILTIN(__builtin_s390_vstrcbs, "V16UcV16UcV16UcV16UcIii*", "nc")
|
||||
BUILTIN(__builtin_s390_vstrch, "V8UsV8UsV8UsV8UsIi", "nc")
|
||||
BUILTIN(__builtin_s390_vstrchs, "V8UsV8UsV8UsV8UsIii*", "nc")
|
||||
BUILTIN(__builtin_s390_vstrcf, "V4UiV4UiV4UiV4UiIi", "nc")
|
||||
BUILTIN(__builtin_s390_vstrcfs, "V4UiV4UiV4UiV4UiIii*", "nc")
|
||||
BUILTIN(__builtin_s390_vstrczb, "V16UcV16UcV16UcV16UcIi", "nc")
|
||||
BUILTIN(__builtin_s390_vstrczbs, "V16UcV16UcV16UcV16UcIii*", "nc")
|
||||
BUILTIN(__builtin_s390_vstrczh, "V8UsV8UsV8UsV8UsIi", "nc")
|
||||
BUILTIN(__builtin_s390_vstrczhs, "V8UsV8UsV8UsV8UsIii*", "nc")
|
||||
BUILTIN(__builtin_s390_vstrczf, "V4UiV4UiV4UiV4UiIi", "nc")
|
||||
BUILTIN(__builtin_s390_vstrczfs, "V4UiV4UiV4UiV4UiIii*", "nc")
|
||||
TARGET_BUILTIN(__builtin_s390_vfaeb, "V16UcV16UcV16UcIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfaebs, "V16UcV16UcV16UcIii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfaeh, "V8UsV8UsV8UsIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfaehs, "V8UsV8UsV8UsIii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfaef, "V4UiV4UiV4UiIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfaefs, "V4UiV4UiV4UiIii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfaezb, "V16UcV16UcV16UcIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfaezbs, "V16UcV16UcV16UcIii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfaezh, "V8UsV8UsV8UsIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfaezhs, "V8UsV8UsV8UsIii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfaezf, "V4UiV4UiV4UiIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfaezfs, "V4UiV4UiV4UiIii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfeeb, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfeebs, "V16UcV16UcV16Uci*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfeeh, "V8UsV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfeehs, "V8UsV8UsV8Usi*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfeef, "V4UiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfeefs, "V4UiV4UiV4Uii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfeezb, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfeezbs, "V16UcV16UcV16Uci*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfeezh, "V8UsV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfeezhs, "V8UsV8UsV8Usi*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfeezf, "V4UiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfeezfs, "V4UiV4UiV4Uii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfeneb, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfenebs, "V16UcV16UcV16Uci*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfeneh, "V8UsV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfenehs, "V8UsV8UsV8Usi*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfenef, "V4UiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfenefs, "V4UiV4UiV4Uii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfenezb, "V16UcV16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfenezbs, "V16UcV16UcV16Uci*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfenezh, "V8UsV8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfenezhs, "V8UsV8UsV8Usi*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfenezf, "V4UiV4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfenezfs, "V4UiV4UiV4Uii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vistrb, "V16UcV16Uc", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vistrbs, "V16UcV16Uci*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vistrh, "V8UsV8Us", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vistrhs, "V8UsV8Usi*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vistrf, "V4UiV4Ui", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vistrfs, "V4UiV4Uii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vstrcb, "V16UcV16UcV16UcV16UcIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vstrcbs, "V16UcV16UcV16UcV16UcIii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vstrch, "V8UsV8UsV8UsV8UsIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vstrchs, "V8UsV8UsV8UsV8UsIii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vstrcf, "V4UiV4UiV4UiV4UiIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vstrcfs, "V4UiV4UiV4UiV4UiIii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vstrczb, "V16UcV16UcV16UcV16UcIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vstrczbs, "V16UcV16UcV16UcV16UcIii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vstrczh, "V8UsV8UsV8UsV8UsIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vstrczhs, "V8UsV8UsV8UsV8UsIii*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vstrczf, "V4UiV4UiV4UiV4UiIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vstrczfs, "V4UiV4UiV4UiV4UiIii*", "nc", "vector")
|
||||
|
||||
// Vector floating-point instructions (chapter 24 of the PoP)
|
||||
BUILTIN(__builtin_s390_vfcedbs, "V2SLLiV2dV2di*", "nc")
|
||||
BUILTIN(__builtin_s390_vfchdbs, "V2SLLiV2dV2di*", "nc")
|
||||
BUILTIN(__builtin_s390_vfchedbs, "V2SLLiV2dV2di*", "nc")
|
||||
BUILTIN(__builtin_s390_vfidb, "V2dV2dIiIi", "nc")
|
||||
BUILTIN(__builtin_s390_vflndb, "V2dV2d", "nc")
|
||||
BUILTIN(__builtin_s390_vflpdb, "V2dV2d", "nc")
|
||||
BUILTIN(__builtin_s390_vfmadb, "V2dV2dV2dV2d", "nc")
|
||||
BUILTIN(__builtin_s390_vfmsdb, "V2dV2dV2dV2d", "nc")
|
||||
BUILTIN(__builtin_s390_vfsqdb, "V2dV2d", "nc")
|
||||
BUILTIN(__builtin_s390_vftcidb, "V2SLLiV2dIii*", "nc")
|
||||
TARGET_BUILTIN(__builtin_s390_vfcedbs, "V2SLLiV2dV2di*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfchdbs, "V2SLLiV2dV2di*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfchedbs, "V2SLLiV2dV2di*", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfidb, "V2dV2dIiIi", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vflndb, "V2dV2d", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vflpdb, "V2dV2d", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfmadb, "V2dV2dV2dV2d", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfmsdb, "V2dV2dV2dV2d", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vfsqdb, "V2dV2d", "nc", "vector")
|
||||
TARGET_BUILTIN(__builtin_s390_vftcidb, "V2SLLiV2dIii*", "nc", "vector")
|
||||
|
||||
#undef BUILTIN
|
||||
#undef TARGET_BUILTIN
|
||||
|
|
|
|||
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
// The format of this database matches clang/Basic/Builtins.def.
|
||||
|
||||
// Note that memory_size is not "c" (readnone) because it must be sequenced with
|
||||
// Note that current_memory is not "c" (readnone) because it must be sequenced with
|
||||
// respect to grow_memory calls.
|
||||
BUILTIN(__builtin_wasm_memory_size, "z", "n")
|
||||
BUILTIN(__builtin_wasm_current_memory, "z", "n")
|
||||
BUILTIN(__builtin_wasm_grow_memory, "vz", "n")
|
||||
|
||||
#undef BUILTIN
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
77
contrib/llvm/tools/clang/include/clang/Basic/Cuda.h
Normal file
77
contrib/llvm/tools/clang/include/clang/Basic/Cuda.h
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
//===--- Cuda.h - Utilities for compiling CUDA code ------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_BASIC_CUDA_H
|
||||
#define LLVM_CLANG_BASIC_CUDA_H
|
||||
|
||||
namespace llvm {
|
||||
class StringRef;
|
||||
} // namespace llvm
|
||||
|
||||
namespace clang {
|
||||
|
||||
enum class CudaVersion {
|
||||
UNKNOWN,
|
||||
CUDA_70,
|
||||
CUDA_75,
|
||||
CUDA_80,
|
||||
};
|
||||
const char *CudaVersionToString(CudaVersion V);
|
||||
|
||||
// No string -> CudaVersion conversion function because there's no canonical
|
||||
// spelling of the various CUDA versions.
|
||||
|
||||
enum class CudaArch {
|
||||
UNKNOWN,
|
||||
SM_20,
|
||||
SM_21,
|
||||
SM_30,
|
||||
SM_32,
|
||||
SM_35,
|
||||
SM_37,
|
||||
SM_50,
|
||||
SM_52,
|
||||
SM_53,
|
||||
SM_60,
|
||||
SM_61,
|
||||
SM_62,
|
||||
};
|
||||
const char *CudaArchToString(CudaArch A);
|
||||
|
||||
// The input should have the form "sm_20".
|
||||
CudaArch StringToCudaArch(llvm::StringRef S);
|
||||
|
||||
enum class CudaVirtualArch {
|
||||
UNKNOWN,
|
||||
COMPUTE_20,
|
||||
COMPUTE_30,
|
||||
COMPUTE_32,
|
||||
COMPUTE_35,
|
||||
COMPUTE_37,
|
||||
COMPUTE_50,
|
||||
COMPUTE_52,
|
||||
COMPUTE_53,
|
||||
COMPUTE_60,
|
||||
COMPUTE_61,
|
||||
COMPUTE_62,
|
||||
};
|
||||
const char *CudaVirtualArchToString(CudaVirtualArch A);
|
||||
|
||||
// The input should have the form "compute_20".
|
||||
CudaVirtualArch StringToCudaVirtualArch(llvm::StringRef S);
|
||||
|
||||
/// Get the compute_xx corresponding to an sm_yy.
|
||||
CudaVirtualArch VirtualArchForCudaArch(CudaArch A);
|
||||
|
||||
/// Get the earliest CudaVersion that supports the given CudaArch.
|
||||
CudaVersion MinVersionForCudaArch(CudaArch A);
|
||||
|
||||
} // namespace clang
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
//===--- DebugInfoOptions.h - Debug Info Emission Types ---------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_BASIC_DEBUGINFOOPTIONS_H
|
||||
#define LLVM_CLANG_BASIC_DEBUGINFOOPTIONS_H
|
||||
|
||||
namespace clang {
|
||||
namespace codegenoptions {
|
||||
|
||||
enum DebugInfoKind {
|
||||
NoDebugInfo, /// Don't generate debug info.
|
||||
LocTrackingOnly, /// Emit location information but do not generate
|
||||
/// debug info in the output. This is useful in
|
||||
/// cases where the backend wants to track source
|
||||
/// locations for instructions without actually
|
||||
/// emitting debug info for them (e.g., when -Rpass
|
||||
/// is used).
|
||||
DebugLineTablesOnly, /// Emit only debug info necessary for generating
|
||||
/// line number tables (-gline-tables-only).
|
||||
LimitedDebugInfo, /// Limit generated debug info to reduce size
|
||||
/// (-fno-standalone-debug). This emits
|
||||
/// forward decls for types that could be
|
||||
/// replaced with forward decls in the source
|
||||
/// code. For dynamic C++ classes type info
|
||||
/// is only emitted int the module that
|
||||
/// contains the classe's vtable.
|
||||
FullDebugInfo /// Generate complete debug info.
|
||||
};
|
||||
|
||||
} // end namespace codegenoptions
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
|
|
@ -11,6 +11,8 @@ class DDecl<Decl base, bit abstract = 0> : Decl<abstract> {
|
|||
class DeclContext { }
|
||||
|
||||
def TranslationUnit : Decl, DeclContext;
|
||||
def PragmaComment : Decl;
|
||||
def PragmaDetectMismatch : Decl;
|
||||
def ExternCContext : Decl, DeclContext;
|
||||
def Named : Decl<1>;
|
||||
def Namespace : DDecl<Named>, DeclContext;
|
||||
|
|
@ -35,6 +37,7 @@ def Named : Decl<1>;
|
|||
def EnumConstant : DDecl<Value>;
|
||||
def UnresolvedUsingValue : DDecl<Value>;
|
||||
def IndirectField : DDecl<Value>;
|
||||
def OMPDeclareReduction : DDecl<Value>, DeclContext;
|
||||
def Declarator : DDecl<Value, 1>;
|
||||
def Field : DDecl<Declarator>;
|
||||
def ObjCIvar : DDecl<Field>;
|
||||
|
|
@ -51,6 +54,7 @@ def Named : Decl<1>;
|
|||
: DDecl<VarTemplateSpecialization>;
|
||||
def ImplicitParam : DDecl<Var>;
|
||||
def ParmVar : DDecl<Var>;
|
||||
def OMPCapturedExpr : DDecl<Var>;
|
||||
def NonTypeTemplateParm : DDecl<Declarator>;
|
||||
def Template : DDecl<Named, 1>;
|
||||
def RedeclarableTemplate : DDecl<Template, 1>;
|
||||
|
|
@ -62,6 +66,7 @@ def Named : Decl<1>;
|
|||
def BuiltinTemplate : DDecl<Template>;
|
||||
def Using : DDecl<Named>;
|
||||
def UsingShadow : DDecl<Named>;
|
||||
def ConstructorUsingShadow : DDecl<UsingShadow>;
|
||||
def ObjCMethod : DDecl<Named>, DeclContext;
|
||||
def ObjCContainer : DDecl<Named, 1>, DeclContext;
|
||||
def ObjCCategory : DDecl<ObjCContainer>;
|
||||
|
|
|
|||
|
|
@ -173,6 +173,7 @@ private:
|
|||
bool WarningsAsErrors; // Treat warnings like errors.
|
||||
bool EnableAllWarnings; // Enable all warnings.
|
||||
bool ErrorsAsFatal; // Treat errors like fatal errors.
|
||||
bool FatalsAsError; // Treat fatal errors like errors.
|
||||
bool SuppressSystemWarnings; // Suppress warnings in system headers.
|
||||
bool SuppressAllDiagnostics; // Suppress all diagnostics.
|
||||
bool ElideType; // Elide common types of templates.
|
||||
|
|
@ -455,6 +456,12 @@ public:
|
|||
void setErrorsAsFatal(bool Val) { ErrorsAsFatal = Val; }
|
||||
bool getErrorsAsFatal() const { return ErrorsAsFatal; }
|
||||
|
||||
/// \brief When set to true, any fatal error reported is made an error.
|
||||
///
|
||||
/// This setting takes precedence over the setErrorsAsFatal setting above.
|
||||
void setFatalsAsError(bool Val) { FatalsAsError = Val; }
|
||||
bool getFatalsAsError() const { return FatalsAsError; }
|
||||
|
||||
/// \brief When set to true mask warnings that come from system headers.
|
||||
void setSuppressSystemWarnings(bool Val) { SuppressSystemWarnings = Val; }
|
||||
bool getSuppressSystemWarnings() const { return SuppressSystemWarnings; }
|
||||
|
|
@ -1065,10 +1072,10 @@ inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
|
|||
// so that we only match those arguments that are (statically) DeclContexts;
|
||||
// other arguments that derive from DeclContext (e.g., RecordDecls) will not
|
||||
// match.
|
||||
template<typename T>
|
||||
inline
|
||||
typename std::enable_if<std::is_same<T, DeclContext>::value,
|
||||
const DiagnosticBuilder &>::type
|
||||
template <typename T>
|
||||
inline typename std::enable_if<
|
||||
std::is_same<typename std::remove_const<T>::type, DeclContext>::value,
|
||||
const DiagnosticBuilder &>::type
|
||||
operator<<(const DiagnosticBuilder &DB, T *DC) {
|
||||
DB.AddTaggedVal(reinterpret_cast<intptr_t>(DC),
|
||||
DiagnosticsEngine::ak_declcontext);
|
||||
|
|
|
|||
|
|
@ -26,6 +26,9 @@ def note_constexpr_lshift_discards : Note<"signed left shift discards bits">;
|
|||
def note_constexpr_invalid_function : Note<
|
||||
"%select{non-constexpr|undefined}0 %select{function|constructor}1 %2 cannot "
|
||||
"be used in a constant expression">;
|
||||
def note_constexpr_invalid_inhctor : Note<
|
||||
"constructor inherited from base class %0 cannot be used in a "
|
||||
"constant expression; derived class cannot be implicitly initialized">;
|
||||
def note_constexpr_no_return : Note<
|
||||
"control reached end of constexpr function">;
|
||||
def note_constexpr_virtual_call : Note<
|
||||
|
|
@ -141,6 +144,8 @@ def note_constexpr_calls_suppressed : Note<
|
|||
"(skipping %0 call%s0 in backtrace; use -fconstexpr-backtrace-limit=0 to "
|
||||
"see all)">;
|
||||
def note_constexpr_call_here : Note<"in call to '%0'">;
|
||||
def note_constexpr_inherited_ctor_call_here : Note<
|
||||
"in implicit initialization for inherited constructor of %0">;
|
||||
def note_constexpr_baa_insufficient_alignment : Note<
|
||||
"%select{alignment of|offset of the aligned pointer from}0 the base pointee "
|
||||
"object (%1 %plural{1:byte|:bytes}1) is %select{less than|not a multiple of}0 the "
|
||||
|
|
@ -153,6 +158,12 @@ def warn_integer_constant_overflow : Warning<
|
|||
"overflow in expression; result is %0 with type %1">,
|
||||
InGroup<DiagGroup<"integer-overflow">>;
|
||||
|
||||
// This is a temporary diagnostic, and shall be removed once our
|
||||
// implementation is complete, and like the preceding constexpr notes belongs
|
||||
// in Sema.
|
||||
def note_unimplemented_constexpr_lambda_feature_ast : Note<
|
||||
"unimplemented constexpr lambda feature: %0 (coming soon!)">;
|
||||
|
||||
// inline asm related.
|
||||
let CategoryName = "Inline Assembly Issue" in {
|
||||
def err_asm_invalid_escape : Error<
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ def err_module_unavailable : Error<
|
|||
def err_module_header_missing : Error<
|
||||
"%select{|umbrella }0header '%1' not found">;
|
||||
def err_module_lock_failure : Error<
|
||||
"could not acquire lock file for module '%0'">, DefaultFatal;
|
||||
"could not acquire lock file for module '%0': %1">, DefaultFatal;
|
||||
def err_module_lock_timeout : Error<
|
||||
"timed out waiting to acquire lock file for module '%0'">, DefaultFatal;
|
||||
def err_module_cycle : Error<"cyclic dependency in module '%0': %1">,
|
||||
|
|
@ -157,6 +157,8 @@ def ext_old_implicitly_unsigned_long_cxx : ExtWarn<
|
|||
"this literal will %select{have type 'long long'|be ill-formed}0 "
|
||||
"in C++11 onwards">,
|
||||
InGroup<CXX11Compat>;
|
||||
def ext_clang_enable_if : Extension<"'enable_if' is a clang extension">,
|
||||
InGroup<GccCompat>;
|
||||
|
||||
// SEH
|
||||
def err_seh_expected_handler : Error<
|
||||
|
|
@ -178,6 +180,9 @@ def err_target_unknown_triple : Error<
|
|||
"unknown target triple '%0', please use -triple or -arch">;
|
||||
def err_target_unknown_cpu : Error<"unknown target CPU '%0'">;
|
||||
def err_target_unknown_abi : Error<"unknown target ABI '%0'">;
|
||||
def err_target_unsupported_abi : Error<"ABI '%0' is not supported on CPU '%1'">;
|
||||
def err_target_unsupported_abi_for_triple : Error<
|
||||
"ABI '%0' is not supported for '%1'">;
|
||||
def err_target_unknown_fpmath : Error<"unknown FP unit '%0'">;
|
||||
def err_target_unsupported_fpmath : Error<
|
||||
"the '%0' unit is not supported with this instruction set">;
|
||||
|
|
|
|||
|
|
@ -23,10 +23,19 @@ def err_drv_unknown_language : Error<"language not recognized: '%0'">;
|
|||
def err_drv_invalid_arch_name : Error<
|
||||
"invalid arch name '%0'">;
|
||||
def err_drv_cuda_bad_gpu_arch : Error<"Unsupported CUDA gpu architecture: %0">;
|
||||
def err_drv_no_cuda_installation : Error<
|
||||
"cannot find CUDA installation. Provide its path via --cuda-path, or pass "
|
||||
"-nocudainc to build without CUDA includes.">;
|
||||
def err_drv_cuda_version_too_low : Error<
|
||||
"GPU arch %1 requires CUDA version at least %3, but installation at %0 is %2. "
|
||||
"Use --cuda-path to specify a different CUDA install, or pass "
|
||||
"--no-cuda-version-check.">;
|
||||
def err_drv_invalid_thread_model_for_target : Error<
|
||||
"invalid thread model '%0' in '%1' for this target">;
|
||||
def err_drv_invalid_linker_name : Error<
|
||||
"invalid linker name in argument '%0'">;
|
||||
def err_drv_invalid_pgo_instrumentor : Error<
|
||||
"invalid PGO instrumentor in argument '%0'">;
|
||||
def err_drv_invalid_rtlib_name : Error<
|
||||
"invalid runtime library name in argument '%0'">;
|
||||
def err_drv_unsupported_rtlib_for_platform : Error<
|
||||
|
|
@ -93,6 +102,23 @@ def err_target_unsupported_arch
|
|||
def err_drv_I_dash_not_supported : Error<
|
||||
"'%0' not supported, please use -iquote instead">;
|
||||
def err_drv_unknown_argument : Error<"unknown argument: '%0'">;
|
||||
def warn_drv_unknown_argument_clang_cl : Warning<
|
||||
"unknown argument ignored in clang-cl: '%0'">,
|
||||
InGroup<UnknownArgument>;
|
||||
|
||||
def warn_drv_ycyu_no_arg_clang_cl : Warning<
|
||||
"support for '%0' without a filename not implemented yet; flag ignored">,
|
||||
InGroup<ClangClPch>;
|
||||
def warn_drv_ycyu_different_arg_clang_cl : Warning<
|
||||
"support for '/Yc' and '/Yu' with different filenames not implemented yet; flags ignored">,
|
||||
InGroup<ClangClPch>;
|
||||
def warn_drv_ycyu_no_fi_arg_clang_cl : Warning<
|
||||
"support for '%0' without a corresponding /FI flag not implemented yet; flag ignored">,
|
||||
InGroup<ClangClPch>;
|
||||
def warn_drv_yc_multiple_inputs_clang_cl : Warning<
|
||||
"support for '/Yc' with more than one source file not implemented yet; flag ignored">,
|
||||
InGroup<ClangClPch>;
|
||||
|
||||
def err_drv_invalid_value : Error<"invalid value '%1' in '%0'">;
|
||||
def err_drv_invalid_int_value : Error<"invalid integral value '%1' in '%0'">;
|
||||
def err_drv_invalid_remap_file : Error<
|
||||
|
|
@ -127,6 +153,10 @@ def err_drv_no_neon_modifier : Error<"[no]neon is not accepted as modifier, plea
|
|||
def err_drv_invalid_omp_target : Error<"OpenMP target is invalid: '%0'">;
|
||||
def err_drv_omp_host_ir_file_not_found : Error<
|
||||
"The provided host compiler IR file '%0' is required to generate code for OpenMP target regions but cannot be found.">;
|
||||
def err_drv_omp_host_target_not_supported : Error<
|
||||
"The target '%0' is not a supported OpenMP host target.">;
|
||||
def err_drv_bitcode_unsupported_on_toolchain : Error<
|
||||
"-fembed-bitcode is not supported on versions of iOS prior to 6.0">;
|
||||
|
||||
def warn_O4_is_O3 : Warning<"-O4 is equivalent to -O3">, InGroup<Deprecated>;
|
||||
def warn_drv_lto_libpath : Warning<"libLTO.dylib relative to clang installed dir not found; using 'ld' default search path instead">,
|
||||
|
|
@ -172,6 +202,8 @@ def warn_drv_pch_not_first_include : Warning<
|
|||
"precompiled header '%0' was ignored because '%1' is not first '-include'">;
|
||||
def warn_missing_sysroot : Warning<"no such sysroot directory: '%0'">,
|
||||
InGroup<DiagGroup<"missing-sysroot">>;
|
||||
def warn_incompatible_sysroot : Warning<"using sysroot for '%0' but targeting '%1'">,
|
||||
InGroup<DiagGroup<"incompatible-sysroot">>;
|
||||
def warn_debug_compression_unavailable : Warning<"cannot compress debug sections (zlib not installed)">,
|
||||
InGroup<DiagGroup<"debug-compression-unavailable">>;
|
||||
def warn_drv_enabling_rtti_with_exceptions : Warning<
|
||||
|
|
@ -210,6 +242,9 @@ def warn_target_unsupported_nan2008 : Warning<
|
|||
def warn_target_unsupported_nanlegacy : Warning<
|
||||
"ignoring '-mnan=legacy' option because the '%0' architecture does not support it">,
|
||||
InGroup<UnsupportedNan>;
|
||||
def warn_target_unsupported_compact_branches : Warning<
|
||||
"ignoring '-mcompact-branches=' option because the '%0' architecture does not"
|
||||
" support it">, InGroup<UnsupportedCB>;
|
||||
|
||||
def warn_drv_unable_to_find_directory_expected : Warning<
|
||||
"unable to find %0 directory, expected to be in '%1'">,
|
||||
|
|
@ -220,7 +255,7 @@ def warn_drv_ps4_force_pic : Warning<
|
|||
InGroup<OptionIgnored>;
|
||||
|
||||
def warn_drv_ps4_sdk_dir : Warning<
|
||||
"environment variable SCE_PS4_SDK_DIR is set, but points to invalid or nonexistent directory '%0'">,
|
||||
"environment variable SCE_ORBIS_SDK_DIR is set, but points to invalid or nonexistent directory '%0'">,
|
||||
InGroup<InvalidOrNonExistentDirectory>;
|
||||
|
||||
def err_drv_unsupported_linker : Error<"unsupported value '%0' for -linker option">;
|
||||
|
|
|
|||
|
|
@ -58,8 +58,10 @@ def remark_fe_backend_optimization_remark_analysis_aliasing : Remark<"%0; "
|
|||
BackendInfo, InGroup<BackendOptimizationRemarkAnalysis>;
|
||||
def warn_fe_backend_optimization_failure : Warning<"%0">, BackendInfo,
|
||||
InGroup<BackendOptimizationFailure>, DefaultWarn;
|
||||
def note_fe_backend_optimization_remark_invalid_loc : Note<"could "
|
||||
"not determine the original source location for %0:%1:%2">;
|
||||
def note_fe_backend_invalid_loc : Note<"could "
|
||||
"not determine the original source location for %0:%1:%2">, BackendInfo;
|
||||
|
||||
def err_fe_backend_unsupported : Error<"%0">, BackendInfo;
|
||||
|
||||
def remark_sanitize_address_insert_extra_padding_accepted : Remark<
|
||||
"-fsanitize-address-field-padding applied to %0">, ShowInSystemHeader,
|
||||
|
|
@ -208,12 +210,11 @@ def err_test_module_file_extension_version : Error<
|
|||
"test module file extension '%0' has different version (%1.%2) than expected "
|
||||
"(%3.%4)">;
|
||||
|
||||
def err_conflicting_module_names : Error<
|
||||
"conflicting module names specified: '-fmodule-name=%0' and "
|
||||
"'-fmodule-implementation-of %1'">;
|
||||
|
||||
def err_missing_vfs_overlay_file : Error<
|
||||
"virtual filesystem overlay file '%0' not found">, DefaultFatal;
|
||||
def err_invalid_vfs_overlay : Error<
|
||||
"invalid virtual filesystem overlay file '%0'">, DefaultFatal;
|
||||
}
|
||||
|
||||
def warn_option_invalid_ocl_version : Warning<
|
||||
"OpenCL version %0 does not support the option '%1'">, InGroup<Deprecated>;
|
||||
}
|
||||
|
|
@ -46,10 +46,17 @@ def BoolConversion : DiagGroup<"bool-conversion", [PointerBoolConversion,
|
|||
UndefinedBoolConversion]>;
|
||||
def IntConversion : DiagGroup<"int-conversion">;
|
||||
def EnumConversion : DiagGroup<"enum-conversion">;
|
||||
def FloatConversion : DiagGroup<"float-conversion">;
|
||||
|
||||
def FloatOverflowConversion : DiagGroup<"float-overflow-conversion">;
|
||||
def FloatZeroConversion : DiagGroup<"float-zero-conversion">;
|
||||
def FloatConversion :
|
||||
DiagGroup<"float-conversion", [FloatOverflowConversion,
|
||||
FloatZeroConversion]>;
|
||||
|
||||
def DoublePromotion : DiagGroup<"double-promotion">;
|
||||
def EnumTooLarge : DiagGroup<"enum-too-large">;
|
||||
def UnsupportedNan : DiagGroup<"unsupported-nan">;
|
||||
def UnsupportedCB : DiagGroup<"unsupported-cb">;
|
||||
def NonLiteralNullConversion : DiagGroup<"non-literal-null-conversion">;
|
||||
def NullConversion : DiagGroup<"null-conversion">;
|
||||
def ImplicitConversionFloatingPointToBool :
|
||||
|
|
@ -75,6 +82,8 @@ def : DiagGroup<"ctor-dtor-privacy">;
|
|||
def GNUDesignator : DiagGroup<"gnu-designator">;
|
||||
def GNUStringLiteralOperatorTemplate :
|
||||
DiagGroup<"gnu-string-literal-operator-template">;
|
||||
def UndefinedVarTemplate : DiagGroup<"undefined-var-template">;
|
||||
def UndefinedFuncTemplate : DiagGroup<"undefined-func-template">;
|
||||
|
||||
def DeleteIncomplete : DiagGroup<"delete-incomplete">;
|
||||
def DeleteNonVirtualDtor : DiagGroup<"delete-non-virtual-dtor">;
|
||||
|
|
@ -87,6 +96,7 @@ def DeprecatedAttributes : DiagGroup<"deprecated-attributes">;
|
|||
def DeprecatedDeclarations : DiagGroup<"deprecated-declarations">;
|
||||
def UnavailableDeclarations : DiagGroup<"unavailable-declarations">;
|
||||
def PartialAvailability : DiagGroup<"partial-availability">;
|
||||
def UnguardedAvailability : DiagGroup<"unguarded-availability">;
|
||||
def DeprecatedImplementations :DiagGroup<"deprecated-implementations">;
|
||||
def DeprecatedIncrementBool : DiagGroup<"deprecated-increment-bool">;
|
||||
def DeprecatedRegister : DiagGroup<"deprecated-register">;
|
||||
|
|
@ -204,6 +214,7 @@ def OverloadedShiftOpParentheses: DiagGroup<"overloaded-shift-op-parentheses">;
|
|||
def DanglingElse: DiagGroup<"dangling-else">;
|
||||
def DanglingField : DiagGroup<"dangling-field">;
|
||||
def DistributedObjectModifiers : DiagGroup<"distributed-object-modifiers">;
|
||||
def ExpansionToDefined : DiagGroup<"expansion-to-defined">;
|
||||
def FlagEnum : DiagGroup<"flag-enum">;
|
||||
def IncrementBool : DiagGroup<"increment-bool", [DeprecatedIncrementBool]>;
|
||||
def InfiniteRecursion : DiagGroup<"infinite-recursion">;
|
||||
|
|
@ -283,8 +294,6 @@ def : DiagGroup<"overflow">;
|
|||
def ForwardClassReceiver : DiagGroup<"receiver-forward-class">;
|
||||
def MethodAccess : DiagGroup<"objc-method-access">;
|
||||
def ObjCReceiver : DiagGroup<"receiver-expr">;
|
||||
// FIXME: Remove this when Xcode removes the warning setting.
|
||||
def : DiagGroup<"receiver-is-weak">;
|
||||
def OperatorNewReturnsNull : DiagGroup<"new-returns-null">;
|
||||
def OverlengthStrings : DiagGroup<"overlength-strings">;
|
||||
def OverloadedVirtual : DiagGroup<"overloaded-virtual">;
|
||||
|
|
@ -330,7 +339,16 @@ def SelfMove : DiagGroup<"self-move">;
|
|||
def SemiBeforeMethodBody : DiagGroup<"semicolon-before-method-body">;
|
||||
def Sentinel : DiagGroup<"sentinel">;
|
||||
def MissingMethodReturnType : DiagGroup<"missing-method-return-type">;
|
||||
def Shadow : DiagGroup<"shadow">;
|
||||
|
||||
def ShadowFieldInConstructorModified : DiagGroup<"shadow-field-in-constructor-modified">;
|
||||
def ShadowFieldInConstructor : DiagGroup<"shadow-field-in-constructor",
|
||||
[ShadowFieldInConstructorModified]>;
|
||||
|
||||
// -Wshadow-all is a catch-all for all shadowing. -Wshadow is just the
|
||||
// shadowing that we think is unsafe.
|
||||
def Shadow : DiagGroup<"shadow", [ShadowFieldInConstructorModified]>;
|
||||
def ShadowAll : DiagGroup<"shadow-all", [Shadow, ShadowFieldInConstructor]>;
|
||||
|
||||
def Shorten64To32 : DiagGroup<"shorten-64-to-32">;
|
||||
def : DiagGroup<"sign-promo">;
|
||||
def SignCompare : DiagGroup<"sign-compare">;
|
||||
|
|
@ -756,6 +774,7 @@ def MicrosoftEnumValue : DiagGroup<"microsoft-enum-value">;
|
|||
def MicrosoftDefaultArgRedefinition :
|
||||
DiagGroup<"microsoft-default-arg-redefinition">;
|
||||
def MicrosoftTemplate : DiagGroup<"microsoft-template">;
|
||||
def MicrosoftInconsistentDllImport : DiagGroup<"inconsistent-dllimport">;
|
||||
def MicrosoftRedeclareStatic : DiagGroup<"microsoft-redeclare-static">;
|
||||
def MicrosoftEnumForwardReference :
|
||||
DiagGroup<"microsoft-enum-forward-reference">;
|
||||
|
|
@ -782,7 +801,10 @@ def Microsoft : DiagGroup<"microsoft",
|
|||
MicrosoftRedeclareStatic, MicrosoftEnumForwardReference, MicrosoftGoto,
|
||||
MicrosoftFlexibleArray, MicrosoftExtraQualification, MicrosoftCast,
|
||||
MicrosoftConstInit, MicrosoftVoidPseudoDtor, MicrosoftAnonTag,
|
||||
MicrosoftCommentPaste, MicrosoftEndOfFile]>;
|
||||
MicrosoftCommentPaste, MicrosoftEndOfFile,
|
||||
MicrosoftInconsistentDllImport]>;
|
||||
|
||||
def ClangClPch : DiagGroup<"clang-cl-pch">;
|
||||
|
||||
def ObjCNonUnifiedException : DiagGroup<"objc-nonunified-exceptions">;
|
||||
|
||||
|
|
@ -816,6 +838,7 @@ def ASM : DiagGroup<"asm", [
|
|||
def SourceUsesOpenMP : DiagGroup<"source-uses-openmp">;
|
||||
def OpenMPClauses : DiagGroup<"openmp-clauses">;
|
||||
def OpenMPLoopForm : DiagGroup<"openmp-loop-form">;
|
||||
def OpenMPTarget : DiagGroup<"openmp-target">;
|
||||
|
||||
// Backend warnings.
|
||||
def BackendInlineAsm : DiagGroup<"inline-asm">;
|
||||
|
|
@ -847,3 +870,5 @@ def FutureCompat : DiagGroup<"future-compat">;
|
|||
def InvalidOrNonExistentDirectory : DiagGroup<"invalid-or-nonexistent-directory">;
|
||||
|
||||
def OptionIgnored : DiagGroup<"option-ignored">;
|
||||
|
||||
def UnknownArgument : DiagGroup<"unknown-argument">;
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ namespace clang {
|
|||
DIAG_START_AST = DIAG_START_PARSE + 500,
|
||||
DIAG_START_COMMENT = DIAG_START_AST + 110,
|
||||
DIAG_START_SEMA = DIAG_START_COMMENT + 100,
|
||||
DIAG_START_ANALYSIS = DIAG_START_SEMA + 3000,
|
||||
DIAG_START_ANALYSIS = DIAG_START_SEMA + 3500,
|
||||
DIAG_UPPER_LIMIT = DIAG_START_ANALYSIS + 100
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -175,10 +175,17 @@ def err_multichar_utf_character_literal : Error<
|
|||
def err_exponent_has_no_digits : Error<"exponent has no digits">;
|
||||
def ext_imaginary_constant : Extension<
|
||||
"imaginary constants are a GNU extension">, InGroup<GNUImaginaryConstant>;
|
||||
def err_hexconstant_requires: Error<
|
||||
"hexadecimal floating constants require %select{an exponent|a significand}0">;
|
||||
def ext_hexconstant_invalid : Extension<
|
||||
def err_hex_constant_requires : Error<
|
||||
"hexadecimal floating %select{constant|literal}0 requires "
|
||||
"%select{an exponent|a significand}1">;
|
||||
def ext_hex_constant_invalid : Extension<
|
||||
"hexadecimal floating constants are a C99 feature">, InGroup<C99>;
|
||||
def ext_hex_literal_invalid : Extension<
|
||||
"hexadecimal floating literals are a C++1z feature">, InGroup<CXX1z>;
|
||||
def warn_cxx1z_hex_literal : Warning<
|
||||
"hexidecimal floating literals are incompatible with "
|
||||
"C++ standards before C++1z">,
|
||||
InGroup<CXXPre1zCompatPedantic>, DefaultIgnore;
|
||||
def ext_binary_literal : Extension<
|
||||
"binary integer literals are a GNU extension">, InGroup<GNUBinaryLiteral>;
|
||||
def ext_binary_literal_cxx14 : Extension<
|
||||
|
|
@ -267,6 +274,14 @@ def ext_missing_whitespace_after_macro_name : ExtWarn<
|
|||
"whitespace required after macro name">;
|
||||
def warn_missing_whitespace_after_macro_name : Warning<
|
||||
"whitespace recommended after macro name">;
|
||||
|
||||
class NonportablePath : Warning<
|
||||
"non-portable path to file '%0'; specified path differs in case from file"
|
||||
" name on disk">;
|
||||
def pp_nonportable_path : NonportablePath,
|
||||
InGroup<DiagGroup<"nonportable-include-path">>;
|
||||
def pp_nonportable_system_path : NonportablePath, DefaultIgnore,
|
||||
InGroup<DiagGroup<"nonportable-system-include-path">>;
|
||||
|
||||
def pp_pragma_once_in_main_file : Warning<"#pragma once in main file">,
|
||||
InGroup<DiagGroup<"pragma-once-outside-header">>;
|
||||
|
|
@ -380,7 +395,7 @@ def err_pp_expected_comma_in_arg_list : Error<
|
|||
def err_pp_duplicate_name_in_arg_list : Error<
|
||||
"duplicate macro parameter name %0">;
|
||||
def err_pp_stringize_not_parameter : Error<
|
||||
"'#' is not followed by a macro parameter">;
|
||||
"'%select{#|#@}0' is not followed by a macro parameter">;
|
||||
def err_pp_malformed_ident : Error<"invalid #ident directive">;
|
||||
def err_pp_unterminated_conditional : Error<
|
||||
"unterminated conditional directive">;
|
||||
|
|
@ -394,6 +409,7 @@ def err_pp_expected_rparen : Error<"expected ')' in preprocessor expression">;
|
|||
def err_pp_expected_eol : Error<
|
||||
"expected end of line in preprocessor expression">;
|
||||
def err_pp_expected_after : Error<"missing %1 after %0">;
|
||||
def err_pp_nested_paren : Error<"nested parentheses not permitted in %0">;
|
||||
def err_pp_colon_without_question : Error<"':' without preceding '?'">;
|
||||
def err_pp_division_by_zero : Error<
|
||||
"division by zero in preprocessor expression">;
|
||||
|
|
@ -401,6 +417,8 @@ def err_pp_remainder_by_zero : Error<
|
|||
"remainder by zero in preprocessor expression">;
|
||||
def err_pp_expr_bad_token_binop : Error<
|
||||
"token is not a valid binary operator in a preprocessor subexpression">;
|
||||
def err_pp_expr_bad_token_lparen : Error<
|
||||
"function-like macro %0 is not defined">;
|
||||
def err_pp_expr_bad_token_start_expr : Error<
|
||||
"invalid token at start of a preprocessor expression">;
|
||||
def err_pp_invalid_poison : Error<"can only poison identifier tokens">;
|
||||
|
|
@ -409,8 +427,6 @@ def err_pp_used_poisoned_id : Error<"attempt to use a poisoned identifier">;
|
|||
def err_feature_check_malformed : Error<
|
||||
"builtin feature check macro requires a parenthesized identifier">;
|
||||
|
||||
def err_warning_check_malformed : Error<
|
||||
"builtin warning check macro requires a parenthesized string">;
|
||||
def warn_has_warning_invalid_option :
|
||||
ExtWarn<"__has_warning expected option name (e.g. \"-Wundef\")">,
|
||||
InGroup<MalformedWarningCheck>;
|
||||
|
|
@ -658,6 +674,13 @@ def warn_header_guard : Warning<
|
|||
def note_header_guard : Note<
|
||||
"%0 is defined here; did you mean %1?">;
|
||||
|
||||
def warn_defined_in_object_type_macro : Warning<
|
||||
"macro expansion producing 'defined' has undefined behavior">,
|
||||
InGroup<ExpansionToDefined>;
|
||||
def warn_defined_in_function_type_macro : Extension<
|
||||
"macro expansion producing 'defined' has undefined behavior">,
|
||||
InGroup<ExpansionToDefined>;
|
||||
|
||||
let CategoryName = "Nullability Issue" in {
|
||||
|
||||
def err_pp_assume_nonnull_syntax : Error<"expected 'begin' or 'end'">;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@ def err_msasm_unable_to_create_target : Error<
|
|||
"MS-style inline assembly is not available: %0">;
|
||||
def err_gnu_inline_asm_disabled : Error<
|
||||
"GNU-style inline assembly is disabled">;
|
||||
def err_asm_goto_not_supported_yet : Error<
|
||||
"'asm goto' constructs are not supported yet">;
|
||||
}
|
||||
|
||||
let CategoryName = "Parse Issue" in {
|
||||
|
|
@ -510,6 +512,11 @@ def err_function_is_not_record : Error<
|
|||
"unexpected %0 in function call; perhaps remove the %0?">;
|
||||
def err_super_in_using_declaration : Error<
|
||||
"'__super' cannot be used with a using declaration">;
|
||||
def ext_constexpr_if : ExtWarn<
|
||||
"constexpr if is a C++1z extension">, InGroup<CXX1z>;
|
||||
def warn_cxx14_compat_constexpr_if : Warning<
|
||||
"constexpr if is incompatible with C++ standards before C++1z">,
|
||||
DefaultIgnore, InGroup<CXXPre1zCompat>;
|
||||
|
||||
// C++ derived classes
|
||||
def err_dup_virtual : Error<"duplicate 'virtual' in base specifier">;
|
||||
|
|
@ -553,6 +560,14 @@ def err_cxx11_attribute_forbids_ellipsis : Error<
|
|||
"attribute '%0' cannot be used as an attribute pack">;
|
||||
def err_cxx11_attribute_repeated : Error<
|
||||
"attribute %0 cannot appear multiple times in an attribute specifier">;
|
||||
def warn_cxx14_compat_using_attribute_ns : Warning<
|
||||
"default scope specifier for attributes is incompatible with C++ standards "
|
||||
"before C++1z">, InGroup<CXXPre1zCompat>, DefaultIgnore;
|
||||
def ext_using_attribute_ns : ExtWarn<
|
||||
"default scope specifier for attributes is a C++1z extension">,
|
||||
InGroup<CXX1z>;
|
||||
def err_using_attribute_ns_conflict : Error<
|
||||
"attribute with scope specifier cannot follow default scope specifier">;
|
||||
def err_attributes_not_allowed : Error<"an attribute list cannot appear here">;
|
||||
def err_l_square_l_square_not_attribute : Error<
|
||||
"C++11 only allows consecutive left square brackets when "
|
||||
|
|
@ -765,7 +780,19 @@ def warn_cxx98_compat_lambda : Warning<
|
|||
InGroup<CXX98Compat>, DefaultIgnore;
|
||||
def err_lambda_missing_parens : Error<
|
||||
"lambda requires '()' before %select{'mutable'|return type|"
|
||||
"attribute specifier}0">;
|
||||
"attribute specifier|'constexpr'}0">;
|
||||
def err_lambda_decl_specifier_repeated : Error<
|
||||
"%select{'mutable'|'constexpr'}0 cannot appear multiple times in a lambda declarator">;
|
||||
// C++1z lambda expressions
|
||||
def err_expected_star_this_capture : Error<
|
||||
"expected 'this' following '*' in lambda capture list">;
|
||||
|
||||
// C++1z constexpr lambda expressions
|
||||
def warn_cxx14_compat_constexpr_on_lambda : Warning<
|
||||
"constexpr on lambda expressions is incompatible with C++ standards before C++1z">,
|
||||
InGroup<CXXPre1zCompat>, DefaultIgnore;
|
||||
def ext_constexpr_on_lambda_cxx1z : ExtWarn<
|
||||
"'constexpr' on lambda expressions is a C++1z extension">, InGroup<CXX1z>;
|
||||
|
||||
// Availability attribute
|
||||
def err_expected_version : Error<
|
||||
|
|
@ -776,7 +803,7 @@ def warn_expected_consistent_version_separator : Warning<
|
|||
def err_zero_version : Error<
|
||||
"version number must have non-zero major, minor, or sub-minor version">;
|
||||
def err_availability_expected_platform : Error<
|
||||
"expected a platform name, e.g., 'macosx'">;
|
||||
"expected a platform name, e.g., 'macos'">;
|
||||
|
||||
// objc_bridge_related attribute
|
||||
def err_objcbridge_related_expected_related_class : Error<
|
||||
|
|
@ -796,6 +823,21 @@ def warn_availability_and_unavailable : Warning<
|
|||
"'unavailable' availability overrides all other availability information">,
|
||||
InGroup<Availability>;
|
||||
|
||||
// @available(...)
|
||||
def err_avail_query_expected_condition : Error<
|
||||
"expected an availability condition here">;
|
||||
def err_avail_query_expected_platform_name : Error<
|
||||
"expected a platform name here">;
|
||||
|
||||
def err_avail_query_unrecognized_platform_name : Error<
|
||||
"unrecognized platform name %0">;
|
||||
def err_availability_query_wildcard_required: Error<
|
||||
"must handle potential future platforms with '*'">;
|
||||
def err_availability_query_repeated_platform: Error<
|
||||
"version for '%0' already specified">;
|
||||
def err_availability_query_repeated_star : Error<
|
||||
"'*' query has already been specified">;
|
||||
|
||||
// Type safety attributes
|
||||
def err_type_safety_unknown_flag : Error<
|
||||
"invalid comparison flag %0; use 'layout_compatible' or 'must_be_null'">;
|
||||
|
|
@ -902,6 +944,9 @@ def err_pragma_optimize_invalid_argument : Error<
|
|||
def err_pragma_optimize_extra_argument : Error<
|
||||
"unexpected extra argument '%0' to '#pragma clang optimize'">;
|
||||
|
||||
def err_opencl_unroll_hint_on_non_loop : Error<
|
||||
"OpenCL only supports 'opencl_unroll_hint' attribute on for, while, and do statements">;
|
||||
|
||||
// OpenCL EXTENSION pragma (OpenCL 1.1 [9.1])
|
||||
def warn_pragma_expected_colon : Warning<
|
||||
"missing ':' after %0 - ignoring">, InGroup<IgnoredPragmas>;
|
||||
|
|
@ -909,10 +954,16 @@ def warn_pragma_expected_enable_disable : Warning<
|
|||
"expected 'enable' or 'disable' - ignoring">, InGroup<IgnoredPragmas>;
|
||||
def warn_pragma_unknown_extension : Warning<
|
||||
"unknown OpenCL extension %0 - ignoring">, InGroup<IgnoredPragmas>;
|
||||
def warn_pragma_unsupported_extension : Warning<
|
||||
"unsupported OpenCL extension %0 - ignoring">, InGroup<IgnoredPragmas>;
|
||||
def warn_pragma_extension_is_core : Warning<
|
||||
"OpenCL extension %0 is core feature or supported optional core feature - ignoring">, InGroup<DiagGroup<"pedantic-core-features">>, DefaultIgnore;
|
||||
|
||||
// OpenCL error
|
||||
// OpenCL errors.
|
||||
def err_opencl_taking_function_address_parser : Error<
|
||||
"taking address of function is not allowed">;
|
||||
def err_opencl_logical_exclusive_or : Error<
|
||||
"^^ is a reserved operator in OpenCL">;
|
||||
|
||||
// OpenMP support.
|
||||
def warn_pragma_omp_ignored : Warning<
|
||||
|
|
@ -934,22 +985,32 @@ def err_omp_immediate_directive : Error<
|
|||
"'#pragma omp %0' %select{|with '%2' clause }1cannot be an immediate substatement">;
|
||||
def err_omp_expected_identifier_for_critical : Error<
|
||||
"expected identifier specifying the name of the 'omp critical' directive">;
|
||||
def err_omp_expected_reduction_identifier : Error<
|
||||
"expected identifier or one of the following operators: '+', '-', '*', '&', '|', '^', '&&', or '||'">;
|
||||
def err_omp_decl_in_declare_simd : Error<
|
||||
"function declaration is expected after 'declare simd' directive">;
|
||||
def err_omp_unknown_map_type : Error<
|
||||
"incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'">;
|
||||
def err_omp_unknown_map_type_modifier : Error<
|
||||
"incorrect map type modifier, expected 'always'">;
|
||||
def err_omp_map_type_missing : Error<
|
||||
"missing map type">;
|
||||
def err_omp_declare_simd_inbranch_notinbranch : Error<
|
||||
"unexpected '%0' clause, '%1' is specified already">;
|
||||
def err_expected_end_declare_target : Error<
|
||||
"expected '#pragma omp end declare target'">;
|
||||
def err_omp_declare_target_unexpected_clause: Error<
|
||||
"unexpected '%0' clause, only 'to' or 'link' clauses expected">;
|
||||
|
||||
// Pragma loop support.
|
||||
def err_pragma_loop_missing_argument : Error<
|
||||
"missing argument; expected %select{an integer value|"
|
||||
"'enable', %select{'assume_safety'|'full'}1 or 'disable'}0">;
|
||||
"'enable'%select{|, 'full'}1%select{|, 'assume_safety'}2 or 'disable'}0">;
|
||||
def err_pragma_loop_invalid_option : Error<
|
||||
"%select{invalid|missing}0 option%select{ %1|}0; expected vectorize, "
|
||||
"vectorize_width, interleave, interleave_count, unroll, or unroll_count">;
|
||||
"vectorize_width, interleave, interleave_count, unroll, unroll_count, or distribute">;
|
||||
def err_pragma_invalid_keyword : Error<
|
||||
"invalid argument; expected 'enable', %select{'assume_safety'|'full'}0 or 'disable'">;
|
||||
"invalid argument; expected 'enable'%select{|, 'full'}0%select{|, 'assume_safety'}1 or 'disable'">;
|
||||
|
||||
// Pragma unroll support.
|
||||
def warn_pragma_unroll_cuda_value_in_parens : Warning<
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -52,6 +52,7 @@ public:
|
|||
/// descriptor for the file.
|
||||
class FileEntry {
|
||||
const char *Name; // Name of the file.
|
||||
std::string RealPathName; // Real path to the file; could be empty.
|
||||
off_t Size; // File size in bytes.
|
||||
time_t ModTime; // Modification time of file.
|
||||
const DirectoryEntry *Dir; // Directory file lives in.
|
||||
|
|
@ -82,6 +83,7 @@ public:
|
|||
}
|
||||
|
||||
const char *getName() const { return Name; }
|
||||
StringRef tryGetRealPathName() const { return RealPathName; }
|
||||
bool isValid() const { return IsValid; }
|
||||
off_t getSize() const { return Size; }
|
||||
unsigned getUID() const { return UID; }
|
||||
|
|
|
|||
|
|
@ -62,6 +62,9 @@ class IdentifierInfo {
|
|||
// partially) from an AST file.
|
||||
bool ChangedAfterLoad : 1; // True if identifier has changed from the
|
||||
// definition loaded from an AST file.
|
||||
bool FEChangedAfterLoad : 1; // True if identifier's frontend information
|
||||
// has changed from the definition loaded
|
||||
// from an AST file.
|
||||
bool RevertedTokenID : 1; // True if revertTokenIDToIdentifier was
|
||||
// called.
|
||||
bool OutOfDate : 1; // True if there may be additional
|
||||
|
|
@ -69,7 +72,7 @@ class IdentifierInfo {
|
|||
// stored externally.
|
||||
bool IsModulesImport : 1; // True if this is the 'import' contextual
|
||||
// keyword.
|
||||
// 30 bit left in 64-bit word.
|
||||
// 29 bit left in 64-bit word.
|
||||
|
||||
void *FETokenInfo; // Managed by the language front-end.
|
||||
llvm::StringMapEntry<IdentifierInfo*> *Entry;
|
||||
|
|
@ -303,6 +306,18 @@ public:
|
|||
ChangedAfterLoad = true;
|
||||
}
|
||||
|
||||
/// \brief Determine whether the frontend token information for this
|
||||
/// identifier has changed since it was loaded from an AST file.
|
||||
bool hasFETokenInfoChangedSinceDeserialization() const {
|
||||
return FEChangedAfterLoad;
|
||||
}
|
||||
|
||||
/// \brief Note that the frontend token information for this identifier has
|
||||
/// changed since it was loaded from an AST file.
|
||||
void setFETokenInfoChangedSinceDeserialization() {
|
||||
FEChangedAfterLoad = true;
|
||||
}
|
||||
|
||||
/// \brief Determine whether the information for this identifier is out of
|
||||
/// date with respect to the external source.
|
||||
bool isOutOfDate() const { return OutOfDate; }
|
||||
|
|
|
|||
|
|
@ -32,7 +32,8 @@ enum LambdaCaptureDefault {
|
|||
/// by reference. C++1y also allows "init-capture", where the initializer
|
||||
/// is an expression.
|
||||
enum LambdaCaptureKind {
|
||||
LCK_This, ///< Capturing the \c this pointer
|
||||
LCK_This, ///< Capturing the \c *this object by reference
|
||||
LCK_StarThis, /// < Capturing the \c *this object by copy
|
||||
LCK_ByCopy, ///< Capturing by copy (a.k.a., by value)
|
||||
LCK_ByRef, ///< Capturing by reference
|
||||
LCK_VLAType ///< Capturing variable-length array type
|
||||
|
|
|
|||
|
|
@ -24,11 +24,15 @@
|
|||
//
|
||||
// VALUE_LANGOPT: for options that describe a value rather than a flag.
|
||||
//
|
||||
// BENIGN_ENUM_LANGOPT, COMPATIBLE_ENUM_LANGOPT: combinations of the above.
|
||||
// BENIGN_ENUM_LANGOPT, COMPATIBLE_ENUM_LANGOPT,
|
||||
// BENIGN_VALUE_LANGOPT, COMPATIBLE_VALUE_LANGOPT: combinations of the above.
|
||||
//
|
||||
// FIXME: Clients should be able to more easily select whether they want
|
||||
// different levels of compatibility versus how to handle different kinds
|
||||
// of option.
|
||||
//
|
||||
// The Description field should be a noun phrase, for instance "frobbing all
|
||||
// widgets" or "C's implicit blintz feature".
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LANGOPT
|
||||
|
|
@ -65,6 +69,16 @@
|
|||
LANGOPT(Name, Bits, Default, Description)
|
||||
#endif
|
||||
|
||||
#ifndef COMPATIBLE_VALUE_LANGOPT
|
||||
# define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \
|
||||
VALUE_LANGOPT(Name, Bits, Default, Description)
|
||||
#endif
|
||||
|
||||
#ifndef BENIGN_VALUE_LANGOPT
|
||||
# define BENIGN_VALUE_LANGOPT(Name, Bits, Default, Description) \
|
||||
COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description)
|
||||
#endif
|
||||
|
||||
// FIXME: A lot of the BENIGN_ options should be COMPATIBLE_ instead.
|
||||
LANGOPT(C99 , 1, 0, "C99")
|
||||
LANGOPT(C11 , 1, 0, "C11")
|
||||
|
|
@ -110,6 +124,7 @@ LANGOPT(Exceptions , 1, 0, "exception handling")
|
|||
LANGOPT(ObjCExceptions , 1, 0, "Objective-C exceptions")
|
||||
LANGOPT(CXXExceptions , 1, 0, "C++ exceptions")
|
||||
LANGOPT(SjLjExceptions , 1, 0, "setjmp-longjump exception handling")
|
||||
LANGOPT(ExternCNoUnwind , 1, 0, "Assume extern C functions don't unwind")
|
||||
LANGOPT(TraditionalCPP , 1, 0, "traditional CPP emulation")
|
||||
LANGOPT(RTTI , 1, 1, "run-time type information")
|
||||
LANGOPT(RTTIData , 1, 1, "emit run-time type information data")
|
||||
|
|
@ -123,31 +138,33 @@ LANGOPT(Coroutines , 1, 0, "C++ coroutines")
|
|||
BENIGN_LANGOPT(ThreadsafeStatics , 1, 1, "thread-safe static initializers")
|
||||
LANGOPT(POSIXThreads , 1, 0, "POSIX thread support")
|
||||
LANGOPT(Blocks , 1, 0, "blocks extension to C")
|
||||
BENIGN_LANGOPT(EmitAllDecls , 1, 0, "support for emitting all declarations")
|
||||
LANGOPT(MathErrno , 1, 1, "errno support for math functions")
|
||||
BENIGN_LANGOPT(HeinousExtensions , 1, 0, "Extensions that we really don't like and may be ripped out at any time")
|
||||
BENIGN_LANGOPT(EmitAllDecls , 1, 0, "emitting all declarations")
|
||||
LANGOPT(MathErrno , 1, 1, "errno in math functions")
|
||||
BENIGN_LANGOPT(HeinousExtensions , 1, 0, "extensions that we really don't like and may be ripped out at any time")
|
||||
LANGOPT(Modules , 1, 0, "modules extension to C")
|
||||
BENIGN_LANGOPT(CompilingModule, 1, 0, "compiling a module interface")
|
||||
COMPATIBLE_LANGOPT(ModulesDeclUse , 1, 0, "require declaration of module uses")
|
||||
LANGOPT(ModulesSearchAll , 1, 1, "search even non-imported modules to find unresolved references")
|
||||
COMPATIBLE_LANGOPT(ModulesStrictDeclUse, 1, 0, "require declaration of module uses and all headers to be in modules")
|
||||
BENIGN_LANGOPT(ModulesErrorRecovery, 1, 1, "automatically import modules as needed when performing error recovery")
|
||||
BENIGN_LANGOPT(ImplicitModules, 1, 1, "build modules that are not specified via -fmodule-file")
|
||||
BENIGN_LANGOPT(ModulesSearchAll , 1, 1, "searching even non-imported modules to find unresolved references")
|
||||
COMPATIBLE_LANGOPT(ModulesStrictDeclUse, 1, 0, "requiring declaration of module uses and all headers to be in modules")
|
||||
BENIGN_LANGOPT(ModulesErrorRecovery, 1, 1, "automatically importing modules as needed when performing error recovery")
|
||||
BENIGN_LANGOPT(ImplicitModules, 1, 1, "building modules that are not specified via -fmodule-file")
|
||||
COMPATIBLE_LANGOPT(ModulesLocalVisibility, 1, 0, "local submodule visibility")
|
||||
COMPATIBLE_LANGOPT(Optimize , 1, 0, "__OPTIMIZE__ predefined macro")
|
||||
COMPATIBLE_LANGOPT(OptimizeSize , 1, 0, "__OPTIMIZE_SIZE__ predefined macro")
|
||||
LANGOPT(Static , 1, 0, "__STATIC__ predefined macro (as opposed to __DYNAMIC__)")
|
||||
COMPATIBLE_LANGOPT(Static , 1, 0, "__STATIC__ predefined macro (as opposed to __DYNAMIC__)")
|
||||
VALUE_LANGOPT(PackStruct , 32, 0,
|
||||
"default struct packing maximum alignment")
|
||||
VALUE_LANGOPT(MaxTypeAlign , 32, 0,
|
||||
"default maximum alignment for types")
|
||||
VALUE_LANGOPT(PICLevel , 2, 0, "__PIC__ level")
|
||||
VALUE_LANGOPT(PIELevel , 2, 0, "__PIE__ level")
|
||||
LANGOPT(GNUInline , 1, 0, "GNU inline semantics")
|
||||
VALUE_LANGOPT(AlignDouble , 1, 0, "Controls if doubles should be aligned to 8 bytes (x86 only)")
|
||||
COMPATIBLE_VALUE_LANGOPT(PICLevel , 2, 0, "__PIC__ level")
|
||||
COMPATIBLE_VALUE_LANGOPT(PIE , 1, 0, "is pie")
|
||||
COMPATIBLE_LANGOPT(GNUInline , 1, 0, "GNU inline semantics")
|
||||
COMPATIBLE_LANGOPT(NoInlineDefine , 1, 0, "__NO_INLINE__ predefined macro")
|
||||
COMPATIBLE_LANGOPT(Deprecated , 1, 0, "__DEPRECATED predefined macro")
|
||||
LANGOPT(FastMath , 1, 0, "__FAST_MATH__ predefined macro")
|
||||
LANGOPT(FiniteMathOnly , 1, 0, "__FINITE_MATH_ONLY__ predefined macro")
|
||||
LANGOPT(UnsafeFPMath , 1, 0, "Unsafe Floating Point Math")
|
||||
COMPATIBLE_LANGOPT(FastMath , 1, 0, "fast FP math optimizations, and __FAST_MATH__ predefined macro")
|
||||
COMPATIBLE_LANGOPT(FiniteMathOnly , 1, 0, "__FINITE_MATH_ONLY__ predefined macro")
|
||||
COMPATIBLE_LANGOPT(UnsafeFPMath , 1, 0, "Unsafe Floating Point Math")
|
||||
|
||||
BENIGN_LANGOPT(ObjCGCBitmapPrint , 1, 0, "printing of GC's bitmap layout for __weak/__strong ivars")
|
||||
|
||||
|
|
@ -155,24 +172,27 @@ BENIGN_LANGOPT(AccessControl , 1, 1, "C++ access control")
|
|||
LANGOPT(CharIsSigned , 1, 1, "signed char")
|
||||
LANGOPT(ShortWChar , 1, 0, "unsigned short wchar_t")
|
||||
ENUM_LANGOPT(MSPointerToMemberRepresentationMethod, PragmaMSPointersToMembersKind, 2, PPTMK_BestCase, "member-pointer representation method")
|
||||
ENUM_LANGOPT(DefaultCallingConv, DefaultCallingConvention, 3, DCC_None, "default calling convention")
|
||||
|
||||
LANGOPT(ShortEnums , 1, 0, "short enum types")
|
||||
|
||||
LANGOPT(OpenCL , 1, 0, "OpenCL")
|
||||
LANGOPT(OpenCLVersion , 32, 0, "OpenCL version")
|
||||
LANGOPT(NativeHalfType , 1, 0, "Native half type support")
|
||||
LANGOPT(NativeHalfArgsAndReturns, 1, 0, "Native half args and returns")
|
||||
LANGOPT(HalfArgsAndReturns, 1, 0, "half args and returns")
|
||||
LANGOPT(CUDA , 1, 0, "CUDA")
|
||||
LANGOPT(OpenMP , 1, 0, "OpenMP support")
|
||||
LANGOPT(OpenMP , 32, 0, "OpenMP support and version of OpenMP (31, 40 or 45)")
|
||||
LANGOPT(OpenMPUseTLS , 1, 0, "Use TLS for threadprivates or runtime calls")
|
||||
LANGOPT(OpenMPIsDevice , 1, 0, "Generate code only for OpenMP target device")
|
||||
LANGOPT(RenderScript , 1, 0, "RenderScript")
|
||||
|
||||
LANGOPT(CUDAIsDevice , 1, 0, "Compiling for CUDA device")
|
||||
LANGOPT(CUDAAllowHostCallsFromHostDevice, 1, 0, "Allow host device functions to call host functions")
|
||||
LANGOPT(CUDADisableTargetCallChecks, 1, 0, "Disable checks for call targets (host, device, etc.)")
|
||||
LANGOPT(CUDATargetOverloads, 1, 0, "Enable function overloads based on CUDA target attributes")
|
||||
LANGOPT(CUDAIsDevice , 1, 0, "compiling for CUDA device")
|
||||
LANGOPT(CUDAAllowVariadicFunctions, 1, 0, "allowing variadic functions in CUDA device code")
|
||||
LANGOPT(CUDAHostDeviceConstexpr, 1, 1, "treating unattributed constexpr functions as __host__ __device__")
|
||||
LANGOPT(CUDADeviceFlushDenormalsToZero, 1, 0, "flushing denormals to zero")
|
||||
LANGOPT(CUDADeviceApproxTranscendentals, 1, 0, "using approximate transcendental functions")
|
||||
|
||||
LANGOPT(AssumeSaneOperatorNew , 1, 1, "implicit __attribute__((malloc)) for C++'s new operators")
|
||||
LANGOPT(SizedDeallocation , 1, 0, "enable sized deallocation functions")
|
||||
LANGOPT(ConceptsTS , 1, 0, "enable C++ Extensions for Concepts")
|
||||
BENIGN_LANGOPT(ElideConstructors , 1, 1, "C++ copy constructor elision")
|
||||
|
|
@ -198,8 +218,7 @@ LANGOPT(ObjCWeak , 1, 0, "Objective-C __weak in ARC and MRC files")
|
|||
LANGOPT(ObjCSubscriptingLegacyRuntime , 1, 0, "Subscripting support in legacy ObjectiveC runtime")
|
||||
LANGOPT(FakeAddressSpaceMap , 1, 0, "OpenCL fake address space map")
|
||||
ENUM_LANGOPT(AddressSpaceMapMangling , AddrSpaceMapMangling, 2, ASMM_Target, "OpenCL address space map mangling mode")
|
||||
|
||||
LANGOPT(MRTD , 1, 0, "-mrtd calling convention")
|
||||
LANGOPT(IncludeDefaultHeader, 1, 0, "Include default header file for OpenCL")
|
||||
BENIGN_LANGOPT(DelayedTemplateParsing , 1, 0, "delayed template parsing")
|
||||
LANGOPT(BlocksRuntimeOptional , 1, 0, "optional blocks runtime")
|
||||
|
||||
|
|
@ -243,4 +262,6 @@ LANGOPT(SanitizeAddressFieldPadding, 2, 0, "controls how aggressive is ASan "
|
|||
#undef COMPATIBLE_ENUM_LANGOPT
|
||||
#undef BENIGN_ENUM_LANGOPT
|
||||
#undef VALUE_LANGOPT
|
||||
#undef COMPATIBLE_VALUE_LANGOPT
|
||||
#undef BENIGN_VALUE_LANGOPT
|
||||
|
||||
|
|
|
|||
|
|
@ -65,6 +65,14 @@ public:
|
|||
PPTMK_FullGeneralityVirtualInheritance
|
||||
};
|
||||
|
||||
enum DefaultCallingConvention {
|
||||
DCC_None,
|
||||
DCC_CDecl,
|
||||
DCC_FastCall,
|
||||
DCC_StdCall,
|
||||
DCC_VectorCall
|
||||
};
|
||||
|
||||
enum AddrSpaceMapMangling { ASMM_Target, ASMM_On, ASMM_Off };
|
||||
|
||||
enum MSVCMajorVersion {
|
||||
|
|
@ -92,14 +100,12 @@ public:
|
|||
/// If none is specified, abort (GCC-compatible behaviour).
|
||||
std::string OverflowHandler;
|
||||
|
||||
/// \brief The name of the current module.
|
||||
/// \brief The name of the current module, of which the main source file
|
||||
/// is a part. If CompilingModule is set, we are compiling the interface
|
||||
/// of this module, otherwise we are compiling an implementation file of
|
||||
/// it.
|
||||
std::string CurrentModule;
|
||||
|
||||
/// \brief The name of the module that the translation unit is an
|
||||
/// implementation of. Prevents semantic imports, but does not otherwise
|
||||
/// treat this as the CurrentModule.
|
||||
std::string ImplementationOfModule;
|
||||
|
||||
/// \brief The names of any features to enable in module 'requires' decls
|
||||
/// in addition to the hard-coded list in Module.cpp and the target features.
|
||||
///
|
||||
|
|
@ -162,18 +168,6 @@ public:
|
|||
fp_contract(LangOpts.DefaultFPContract) {}
|
||||
};
|
||||
|
||||
/// \brief OpenCL volatile options
|
||||
class OpenCLOptions {
|
||||
public:
|
||||
#define OPENCLEXT(nm) unsigned nm : 1;
|
||||
#include "clang/Basic/OpenCLExtensions.def"
|
||||
|
||||
OpenCLOptions() {
|
||||
#define OPENCLEXT(nm) nm = 0;
|
||||
#include "clang/Basic/OpenCLExtensions.def"
|
||||
}
|
||||
};
|
||||
|
||||
/// \brief Describes the kind of translation unit being processed.
|
||||
enum TranslationUnitKind {
|
||||
/// \brief The translation unit is a complete translation unit.
|
||||
|
|
|
|||
|
|
@ -308,6 +308,23 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
/// Is objc_unsafeClaimAutoreleasedReturnValue available?
|
||||
bool hasARCUnsafeClaimAutoreleasedReturnValue() const {
|
||||
switch (getKind()) {
|
||||
case MacOSX:
|
||||
return getVersion() >= VersionTuple(10, 11);
|
||||
case iOS:
|
||||
return getVersion() >= VersionTuple(9);
|
||||
case WatchOS:
|
||||
return getVersion() >= VersionTuple(2);
|
||||
case GNUstep:
|
||||
return false;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// \brief Try to parse an Objective-C runtime specification from the given
|
||||
/// string.
|
||||
///
|
||||
|
|
|
|||
|
|
@ -11,25 +11,71 @@
|
|||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// OpenCL 1.1.
|
||||
OPENCLEXT(cl_khr_fp64)
|
||||
OPENCLEXT(cl_khr_int64_base_atomics)
|
||||
OPENCLEXT(cl_khr_int64_extended_atomics)
|
||||
OPENCLEXT(cl_khr_fp16)
|
||||
OPENCLEXT(cl_khr_gl_sharing)
|
||||
OPENCLEXT(cl_khr_gl_event)
|
||||
OPENCLEXT(cl_khr_d3d10_sharing)
|
||||
OPENCLEXT(cl_khr_global_int32_base_atomics)
|
||||
OPENCLEXT(cl_khr_global_int32_extended_atomics)
|
||||
OPENCLEXT(cl_khr_local_int32_base_atomics)
|
||||
OPENCLEXT(cl_khr_local_int32_extended_atomics)
|
||||
OPENCLEXT(cl_khr_byte_addressable_store)
|
||||
OPENCLEXT(cl_khr_3d_image_writes)
|
||||
// Macro OPENCLEXT or OPENCLEXT_INTERNAL can be defined to enumerate the
|
||||
// OpenCL extensions listed in this file.
|
||||
//
|
||||
// If the extensions are to be enumerated without the supported OpenCL version,
|
||||
// define OPENCLEXT(ext) where ext is the name of the extension.
|
||||
//
|
||||
// If the extensions are to be enumerated with supported OpenCL version,
|
||||
// define OPENCLEXT_INTERNAL(ext, avail, core) where
|
||||
// ext - name of the extension or optional core feature.
|
||||
// avail - minimum OpenCL version supporting it.
|
||||
// core - minimum OpenCL version when the extension becomes optional core
|
||||
// feature or core feature. ~0U indicates not a core feature or an
|
||||
// optional core feature.
|
||||
|
||||
// OpenCL 2.0
|
||||
OPENCLEXT(cl_khr_gl_msaa_sharing)
|
||||
#ifndef OPENCLEXT_INTERNAL
|
||||
#ifndef OPENCLEXT
|
||||
#pragma error "macro OPENCLEXT or OPENCLEXT_INTERNAL is required"
|
||||
#else
|
||||
#define OPENCLEXT_INTERNAL(ext, ...) OPENCLEXT(ext)
|
||||
#endif // OPENCLEXT
|
||||
#endif // OPENCLEXT_INTERNAL
|
||||
|
||||
// OpenCL 1.0.
|
||||
OPENCLEXT_INTERNAL(cl_khr_3d_image_writes, 100, 200)
|
||||
// fprounding mode is special since it is not mentioned beyond 1.0
|
||||
OPENCLEXT_INTERNAL(cl_khr_select_fprounding_mode, 100, 110)
|
||||
OPENCLEXT_INTERNAL(cl_khr_byte_addressable_store, 100, 110)
|
||||
OPENCLEXT_INTERNAL(cl_khr_fp16, 100, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_fp64, 100, 120)
|
||||
OPENCLEXT_INTERNAL(cl_khr_global_int32_base_atomics, 100, 110)
|
||||
OPENCLEXT_INTERNAL(cl_khr_global_int32_extended_atomics, 100, 110)
|
||||
OPENCLEXT_INTERNAL(cl_khr_local_int32_base_atomics, 100, 110)
|
||||
OPENCLEXT_INTERNAL(cl_khr_local_int32_extended_atomics, 100, 110)
|
||||
OPENCLEXT_INTERNAL(cl_khr_int64_base_atomics, 100, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_int64_extended_atomics, 100, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_gl_sharing, 100, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_icd, 100, ~0U)
|
||||
|
||||
// OpenCL 1.1.
|
||||
OPENCLEXT_INTERNAL(cl_khr_gl_event, 110, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_d3d10_sharing, 110, ~0U)
|
||||
|
||||
// OpenCL 1.2.
|
||||
OPENCLEXT_INTERNAL(cl_khr_context_abort, 120, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_d3d11_sharing, 120, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_depth_images, 120, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_dx9_media_sharing, 120, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_image2d_from_buffer, 120, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_initialize_memory, 120, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_gl_depth_images, 120, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_gl_msaa_sharing, 120, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_spir, 120, ~0U)
|
||||
|
||||
// OpenCL 2.0.
|
||||
OPENCLEXT_INTERNAL(cl_khr_egl_event, 200, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_egl_image, 200, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_srgb_image_writes, 200, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_subgroups, 200, ~0U)
|
||||
OPENCLEXT_INTERNAL(cl_khr_terminate_context, 200, ~0U)
|
||||
|
||||
// Clang Extensions.
|
||||
OPENCLEXT(cl_clang_storage_class_specifiers)
|
||||
OPENCLEXT_INTERNAL(cl_clang_storage_class_specifiers, 100, ~0U)
|
||||
|
||||
#undef OPENCLEXT_INTERNAL
|
||||
|
||||
#ifdef OPENCLEXT
|
||||
#undef OPENCLEXT
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -0,0 +1,82 @@
|
|||
//===-- OpenCLImageTypes.def - Metadata about BuiltinTypes ------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
// This file extends builtin types database with OpenCL image singleton types.
|
||||
// Custom code should define one of those two macros:
|
||||
// GENERIC_IMAGE_TYPE(Type, Id) - a generic image with its Id without an
|
||||
// access type
|
||||
// IMAGE_TYPE(Type, Id, SingletonId, AccessType, CGSuffix) - an image type
|
||||
// with given ID, singleton ID access type and a codegen suffix
|
||||
|
||||
#ifdef GENERIC_IMAGE_TYPE
|
||||
|
||||
#define IMAGE_READ_TYPE(Type, Id) GENERIC_IMAGE_TYPE(Type, Id)
|
||||
#define IMAGE_WRITE_TYPE(Type, Id)
|
||||
#define IMAGE_READ_WRITE_TYPE(Type, Id)
|
||||
|
||||
#else
|
||||
|
||||
#ifndef IMAGE_READ_TYPE
|
||||
#define IMAGE_READ_TYPE(Type, Id) \
|
||||
IMAGE_TYPE(Type, Id##RO, Id##ROTy, read_only, ro)
|
||||
#endif
|
||||
#ifndef IMAGE_WRITE_TYPE
|
||||
#define IMAGE_WRITE_TYPE(Type, Id) \
|
||||
IMAGE_TYPE(Type, Id##WO, Id##WOTy, write_only, wo)
|
||||
#endif
|
||||
#ifndef IMAGE_READ_WRITE_TYPE
|
||||
#define IMAGE_READ_WRITE_TYPE(Type, Id) \
|
||||
IMAGE_TYPE(Type, Id##RW, Id##RWTy, read_write, rw)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
IMAGE_READ_TYPE(image1d, OCLImage1d)
|
||||
IMAGE_READ_TYPE(image1d_array, OCLImage1dArray)
|
||||
IMAGE_READ_TYPE(image1d_buffer, OCLImage1dBuffer)
|
||||
IMAGE_READ_TYPE(image2d, OCLImage2d)
|
||||
IMAGE_READ_TYPE(image2d_array, OCLImage2dArray)
|
||||
IMAGE_READ_TYPE(image2d_depth, OCLImage2dDepth)
|
||||
IMAGE_READ_TYPE(image2d_array_depth, OCLImage2dArrayDepth)
|
||||
IMAGE_READ_TYPE(image2d_msaa, OCLImage2dMSAA)
|
||||
IMAGE_READ_TYPE(image2d_array_msaa, OCLImage2dArrayMSAA)
|
||||
IMAGE_READ_TYPE(image2d_msaa_depth, OCLImage2dMSAADepth)
|
||||
IMAGE_READ_TYPE(image2d_array_msaa_depth, OCLImage2dArrayMSAADepth)
|
||||
IMAGE_READ_TYPE(image3d, OCLImage3d)
|
||||
|
||||
IMAGE_WRITE_TYPE(image1d, OCLImage1d)
|
||||
IMAGE_WRITE_TYPE(image1d_array, OCLImage1dArray)
|
||||
IMAGE_WRITE_TYPE(image1d_buffer, OCLImage1dBuffer)
|
||||
IMAGE_WRITE_TYPE(image2d, OCLImage2d)
|
||||
IMAGE_WRITE_TYPE(image2d_array, OCLImage2dArray)
|
||||
IMAGE_WRITE_TYPE(image2d_depth, OCLImage2dDepth)
|
||||
IMAGE_WRITE_TYPE(image2d_array_depth, OCLImage2dArrayDepth)
|
||||
IMAGE_WRITE_TYPE(image2d_msaa, OCLImage2dMSAA)
|
||||
IMAGE_WRITE_TYPE(image2d_array_msaa, OCLImage2dArrayMSAA)
|
||||
IMAGE_WRITE_TYPE(image2d_msaa_depth, OCLImage2dMSAADepth)
|
||||
IMAGE_WRITE_TYPE(image2d_array_msaa_depth, OCLImage2dArrayMSAADepth)
|
||||
IMAGE_WRITE_TYPE(image3d, OCLImage3d)
|
||||
|
||||
IMAGE_READ_WRITE_TYPE(image1d, OCLImage1d)
|
||||
IMAGE_READ_WRITE_TYPE(image1d_array, OCLImage1dArray)
|
||||
IMAGE_READ_WRITE_TYPE(image1d_buffer, OCLImage1dBuffer)
|
||||
IMAGE_READ_WRITE_TYPE(image2d, OCLImage2d)
|
||||
IMAGE_READ_WRITE_TYPE(image2d_array, OCLImage2dArray)
|
||||
IMAGE_READ_WRITE_TYPE(image2d_depth, OCLImage2dDepth)
|
||||
IMAGE_READ_WRITE_TYPE(image2d_array_depth, OCLImage2dArrayDepth)
|
||||
IMAGE_READ_WRITE_TYPE(image2d_msaa, OCLImage2dMSAA)
|
||||
IMAGE_READ_WRITE_TYPE(image2d_array_msaa, OCLImage2dArrayMSAA)
|
||||
IMAGE_READ_WRITE_TYPE(image2d_msaa_depth, OCLImage2dMSAADepth)
|
||||
IMAGE_READ_WRITE_TYPE(image2d_array_msaa_depth, OCLImage2dArrayMSAADepth)
|
||||
IMAGE_READ_WRITE_TYPE(image3d, OCLImage3d)
|
||||
|
||||
#undef IMAGE_TYPE
|
||||
#undef GENERIC_IMAGE_TYPE
|
||||
#undef IMAGE_READ_TYPE
|
||||
#undef IMAGE_WRITE_TYPE
|
||||
#undef IMAGE_READ_WRITE_TYPE
|
||||
68
contrib/llvm/tools/clang/include/clang/Basic/OpenCLOptions.h
Normal file
68
contrib/llvm/tools/clang/include/clang/Basic/OpenCLOptions.h
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
//===--- OpenCLOptions.h ----------------------------------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
///
|
||||
/// \file
|
||||
/// \brief Defines the clang::OpenCLOptions class.
|
||||
///
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_BASIC_OPENCLOPTIONS_H
|
||||
#define LLVM_CLANG_BASIC_OPENCLOPTIONS_H
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace clang {
|
||||
|
||||
/// \brief OpenCL supported extensions and optional core features
|
||||
class OpenCLOptions {
|
||||
public:
|
||||
#define OPENCLEXT(nm) unsigned nm : 1;
|
||||
#include "clang/Basic/OpenCLExtensions.def"
|
||||
|
||||
OpenCLOptions() {
|
||||
#define OPENCLEXT(nm) nm = 0;
|
||||
#include "clang/Basic/OpenCLExtensions.def"
|
||||
}
|
||||
|
||||
// Enable all options.
|
||||
void setAll() {
|
||||
#define OPENCLEXT(nm) nm = 1;
|
||||
#include "clang/Basic/OpenCLExtensions.def"
|
||||
}
|
||||
|
||||
// Is supported with OpenCL version \p OCLVer.
|
||||
#define OPENCLEXT_INTERNAL(Ext, Avail, ...) \
|
||||
bool is_##Ext##_supported(unsigned OCLVer) const { \
|
||||
return Ext && OCLVer >= Avail; \
|
||||
}
|
||||
#include "clang/Basic/OpenCLExtensions.def"
|
||||
|
||||
|
||||
// Is supported OpenCL extension with OpenCL version \p OCLVer.
|
||||
// For supported optional core feature, return false.
|
||||
#define OPENCLEXT_INTERNAL(Ext, Avail, Core) \
|
||||
bool is_##Ext##_supported_extension(unsigned CLVer) const { \
|
||||
return is_##Ext##_supported(CLVer) && (Core == ~0U || CLVer < Core); \
|
||||
}
|
||||
#include "clang/Basic/OpenCLExtensions.def"
|
||||
|
||||
// Is supported OpenCL core features with OpenCL version \p OCLVer.
|
||||
// For supported extension, return false.
|
||||
#define OPENCLEXT_INTERNAL(Ext, Avail, Core) \
|
||||
bool is_##Ext##_supported_core(unsigned CLVer) const { \
|
||||
return is_##Ext##_supported(CLVer) && Core != ~0U && CLVer >= Core; \
|
||||
}
|
||||
#include "clang/Basic/OpenCLExtensions.def"
|
||||
|
||||
};
|
||||
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
|
|
@ -60,6 +60,21 @@
|
|||
#ifndef OPENMP_TARGET_DATA_CLAUSE
|
||||
# define OPENMP_TARGET_DATA_CLAUSE(Name)
|
||||
#endif
|
||||
#ifndef OPENMP_TARGET_ENTER_DATA_CLAUSE
|
||||
#define OPENMP_TARGET_ENTER_DATA_CLAUSE(Name)
|
||||
#endif
|
||||
#ifndef OPENMP_TARGET_EXIT_DATA_CLAUSE
|
||||
#define OPENMP_TARGET_EXIT_DATA_CLAUSE(Name)
|
||||
#endif
|
||||
#ifndef OPENMP_TARGET_PARALLEL_CLAUSE
|
||||
# define OPENMP_TARGET_PARALLEL_CLAUSE(Name)
|
||||
#endif
|
||||
#ifndef OPENMP_TARGET_PARALLEL_FOR_CLAUSE
|
||||
# define OPENMP_TARGET_PARALLEL_FOR_CLAUSE(Name)
|
||||
#endif
|
||||
#ifndef OPENMP_TARGET_UPDATE_CLAUSE
|
||||
# define OPENMP_TARGET_UPDATE_CLAUSE(Name)
|
||||
#endif
|
||||
#ifndef OPENMP_TEAMS_CLAUSE
|
||||
# define OPENMP_TEAMS_CLAUSE(Name)
|
||||
#endif
|
||||
|
|
@ -102,6 +117,27 @@
|
|||
#ifndef OPENMP_MAP_KIND
|
||||
#define OPENMP_MAP_KIND(Name)
|
||||
#endif
|
||||
#ifndef OPENMP_DIST_SCHEDULE_KIND
|
||||
#define OPENMP_DIST_SCHEDULE_KIND(Name)
|
||||
#endif
|
||||
#ifndef OPENMP_DEFAULTMAP_KIND
|
||||
#define OPENMP_DEFAULTMAP_KIND(Name)
|
||||
#endif
|
||||
#ifndef OPENMP_DEFAULTMAP_MODIFIER
|
||||
#define OPENMP_DEFAULTMAP_MODIFIER(Name)
|
||||
#endif
|
||||
#ifndef OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE
|
||||
#define OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(Name)
|
||||
#endif
|
||||
#ifndef OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE
|
||||
#define OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(Name)
|
||||
#endif
|
||||
#ifndef OPENMP_DISTRIBUTE_SIMD_CLAUSE
|
||||
#define OPENMP_DISTRIBUTE_SIMD_CLAUSE(Name)
|
||||
#endif
|
||||
#ifndef OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE
|
||||
#define OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(Name)
|
||||
#endif
|
||||
|
||||
// OpenMP directives.
|
||||
OPENMP_DIRECTIVE(threadprivate)
|
||||
|
|
@ -125,14 +161,27 @@ OPENMP_DIRECTIVE(target)
|
|||
OPENMP_DIRECTIVE(teams)
|
||||
OPENMP_DIRECTIVE(cancel)
|
||||
OPENMP_DIRECTIVE_EXT(target_data, "target data")
|
||||
OPENMP_DIRECTIVE_EXT(target_enter_data, "target enter data")
|
||||
OPENMP_DIRECTIVE_EXT(target_exit_data, "target exit data")
|
||||
OPENMP_DIRECTIVE_EXT(target_parallel, "target parallel")
|
||||
OPENMP_DIRECTIVE_EXT(target_parallel_for, "target parallel for")
|
||||
OPENMP_DIRECTIVE_EXT(target_update, "target update")
|
||||
OPENMP_DIRECTIVE_EXT(parallel_for, "parallel for")
|
||||
OPENMP_DIRECTIVE_EXT(parallel_for_simd, "parallel for simd")
|
||||
OPENMP_DIRECTIVE_EXT(parallel_sections, "parallel sections")
|
||||
OPENMP_DIRECTIVE_EXT(for_simd, "for simd")
|
||||
OPENMP_DIRECTIVE_EXT(cancellation_point, "cancellation point")
|
||||
OPENMP_DIRECTIVE_EXT(declare_reduction, "declare reduction")
|
||||
OPENMP_DIRECTIVE_EXT(declare_simd, "declare simd")
|
||||
OPENMP_DIRECTIVE(taskloop)
|
||||
OPENMP_DIRECTIVE_EXT(taskloop_simd, "taskloop simd")
|
||||
OPENMP_DIRECTIVE(distribute)
|
||||
OPENMP_DIRECTIVE_EXT(declare_target, "declare target")
|
||||
OPENMP_DIRECTIVE_EXT(end_declare_target, "end declare target")
|
||||
OPENMP_DIRECTIVE_EXT(distribute_parallel_for, "distribute parallel for")
|
||||
OPENMP_DIRECTIVE_EXT(distribute_parallel_for_simd, "distribute parallel for simd")
|
||||
OPENMP_DIRECTIVE_EXT(distribute_simd, "distribute simd")
|
||||
OPENMP_DIRECTIVE_EXT(target_parallel_for_simd, "target parallel for simd")
|
||||
|
||||
// OpenMP clauses.
|
||||
OPENMP_CLAUSE(if, OMPIfClause)
|
||||
|
|
@ -175,6 +224,12 @@ OPENMP_CLAUSE(grainsize, OMPGrainsizeClause)
|
|||
OPENMP_CLAUSE(nogroup, OMPNogroupClause)
|
||||
OPENMP_CLAUSE(num_tasks, OMPNumTasksClause)
|
||||
OPENMP_CLAUSE(hint, OMPHintClause)
|
||||
OPENMP_CLAUSE(dist_schedule, OMPDistScheduleClause)
|
||||
OPENMP_CLAUSE(defaultmap, OMPDefaultmapClause)
|
||||
OPENMP_CLAUSE(to, OMPToClause)
|
||||
OPENMP_CLAUSE(from, OMPFromClause)
|
||||
OPENMP_CLAUSE(use_device_ptr, OMPUseDevicePtrClause)
|
||||
OPENMP_CLAUSE(is_device_ptr, OMPIsDevicePtrClause)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'parallel'.
|
||||
OPENMP_PARALLEL_CLAUSE(if)
|
||||
|
|
@ -259,6 +314,12 @@ OPENMP_SCHEDULE_MODIFIER(monotonic)
|
|||
OPENMP_SCHEDULE_MODIFIER(nonmonotonic)
|
||||
OPENMP_SCHEDULE_MODIFIER(simd)
|
||||
|
||||
// Static attributes for 'defaultmap' clause.
|
||||
OPENMP_DEFAULTMAP_KIND(scalar)
|
||||
|
||||
// Modifiers for 'defaultmap' clause.
|
||||
OPENMP_DEFAULTMAP_MODIFIER(tofrom)
|
||||
|
||||
// Static attributes for 'depend' clause.
|
||||
OPENMP_DEPEND_KIND(in)
|
||||
OPENMP_DEPEND_KIND(out)
|
||||
|
|
@ -338,16 +399,82 @@ OPENMP_ATOMIC_CLAUSE(capture)
|
|||
OPENMP_ATOMIC_CLAUSE(seq_cst)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'target'.
|
||||
// TODO More clauses for 'target' directive.
|
||||
OPENMP_TARGET_CLAUSE(if)
|
||||
OPENMP_TARGET_CLAUSE(device)
|
||||
OPENMP_TARGET_CLAUSE(map)
|
||||
OPENMP_TARGET_CLAUSE(private)
|
||||
OPENMP_TARGET_CLAUSE(nowait)
|
||||
OPENMP_TARGET_CLAUSE(depend)
|
||||
OPENMP_TARGET_CLAUSE(defaultmap)
|
||||
OPENMP_TARGET_CLAUSE(firstprivate)
|
||||
OPENMP_TARGET_CLAUSE(is_device_ptr)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'target data'.
|
||||
// TODO More clauses for 'target data' directive.
|
||||
OPENMP_TARGET_DATA_CLAUSE(if)
|
||||
OPENMP_TARGET_DATA_CLAUSE(device)
|
||||
OPENMP_TARGET_DATA_CLAUSE(map)
|
||||
OPENMP_TARGET_DATA_CLAUSE(use_device_ptr)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'target enter data'.
|
||||
OPENMP_TARGET_ENTER_DATA_CLAUSE(if)
|
||||
OPENMP_TARGET_ENTER_DATA_CLAUSE(device)
|
||||
OPENMP_TARGET_ENTER_DATA_CLAUSE(map)
|
||||
OPENMP_TARGET_ENTER_DATA_CLAUSE(nowait)
|
||||
OPENMP_TARGET_ENTER_DATA_CLAUSE(depend)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'target exit data'.
|
||||
OPENMP_TARGET_EXIT_DATA_CLAUSE(if)
|
||||
OPENMP_TARGET_EXIT_DATA_CLAUSE(device)
|
||||
OPENMP_TARGET_EXIT_DATA_CLAUSE(map)
|
||||
OPENMP_TARGET_EXIT_DATA_CLAUSE(nowait)
|
||||
OPENMP_TARGET_EXIT_DATA_CLAUSE(depend)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'target parallel'.
|
||||
// TODO: add target clauses 'is_device_ptr'
|
||||
OPENMP_TARGET_PARALLEL_CLAUSE(if)
|
||||
OPENMP_TARGET_PARALLEL_CLAUSE(device)
|
||||
OPENMP_TARGET_PARALLEL_CLAUSE(map)
|
||||
OPENMP_TARGET_PARALLEL_CLAUSE(private)
|
||||
OPENMP_TARGET_PARALLEL_CLAUSE(firstprivate)
|
||||
OPENMP_TARGET_PARALLEL_CLAUSE(nowait)
|
||||
OPENMP_TARGET_PARALLEL_CLAUSE(depend)
|
||||
OPENMP_TARGET_PARALLEL_CLAUSE(defaultmap)
|
||||
OPENMP_TARGET_PARALLEL_CLAUSE(num_threads)
|
||||
OPENMP_TARGET_PARALLEL_CLAUSE(default)
|
||||
OPENMP_TARGET_PARALLEL_CLAUSE(proc_bind)
|
||||
OPENMP_TARGET_PARALLEL_CLAUSE(shared)
|
||||
OPENMP_TARGET_PARALLEL_CLAUSE(reduction)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'target parallel for'.
|
||||
// TODO: add target clauses 'is_device_ptr'
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(if)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(device)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(map)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(private)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(firstprivate)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(lastprivate)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(nowait)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(depend)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(defaultmap)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(num_threads)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(default)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(proc_bind)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(shared)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(reduction)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(collapse)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(schedule)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(ordered)
|
||||
OPENMP_TARGET_PARALLEL_FOR_CLAUSE(linear)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'target update'.
|
||||
// TODO More clauses for 'target update' directive.
|
||||
OPENMP_TARGET_UPDATE_CLAUSE(if)
|
||||
OPENMP_TARGET_UPDATE_CLAUSE(device)
|
||||
OPENMP_TARGET_UPDATE_CLAUSE(to)
|
||||
OPENMP_TARGET_UPDATE_CLAUSE(from)
|
||||
OPENMP_TARGET_UPDATE_CLAUSE(nowait)
|
||||
OPENMP_TARGET_UPDATE_CLAUSE(depend)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'teams'.
|
||||
// TODO More clauses for 'teams' directive.
|
||||
|
|
@ -418,6 +545,80 @@ OPENMP_DISTRIBUTE_CLAUSE(private)
|
|||
OPENMP_DISTRIBUTE_CLAUSE(firstprivate)
|
||||
OPENMP_DISTRIBUTE_CLAUSE(lastprivate)
|
||||
OPENMP_DISTRIBUTE_CLAUSE(collapse)
|
||||
OPENMP_DISTRIBUTE_CLAUSE(dist_schedule)
|
||||
|
||||
// Static attributes for 'dist_schedule' clause.
|
||||
OPENMP_DIST_SCHEDULE_KIND(static)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'distribute parallel for'
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(firstprivate)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(lastprivate)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(collapse)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(dist_schedule)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(if)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(num_threads)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(default)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(proc_bind)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(private)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(shared)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(reduction)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(copyin)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE(schedule)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'distribute parallel for simd'
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(firstprivate)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(lastprivate)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(collapse)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(dist_schedule)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(if)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(num_threads)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(default)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(proc_bind)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(private)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(shared)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(reduction)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(copyin)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(schedule)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(linear)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(aligned)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(safelen)
|
||||
OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE(simdlen)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'distribute simd'
|
||||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(private)
|
||||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(firstprivate)
|
||||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(lastprivate)
|
||||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(collapse)
|
||||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(dist_schedule)
|
||||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(linear)
|
||||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(aligned)
|
||||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(safelen)
|
||||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(simdlen)
|
||||
OPENMP_DISTRIBUTE_SIMD_CLAUSE(reduction)
|
||||
|
||||
// Clauses allowed for OpenMP directive 'target parallel for simd'.
|
||||
// TODO: add target clauses 'is_device_ptr'
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(if)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(device)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(map)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(private)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(firstprivate)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(lastprivate)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(nowait)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(depend)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(defaultmap)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(num_threads)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(default)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(proc_bind)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(shared)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(reduction)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(collapse)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(schedule)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(ordered)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(linear)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(safelen)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(simdlen)
|
||||
OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE(aligned)
|
||||
|
||||
#undef OPENMP_TASKLOOP_SIMD_CLAUSE
|
||||
#undef OPENMP_TASKLOOP_CLAUSE
|
||||
|
|
@ -443,9 +644,21 @@ OPENMP_DISTRIBUTE_CLAUSE(collapse)
|
|||
#undef OPENMP_ATOMIC_CLAUSE
|
||||
#undef OPENMP_TARGET_CLAUSE
|
||||
#undef OPENMP_TARGET_DATA_CLAUSE
|
||||
#undef OPENMP_TARGET_ENTER_DATA_CLAUSE
|
||||
#undef OPENMP_TARGET_EXIT_DATA_CLAUSE
|
||||
#undef OPENMP_TARGET_PARALLEL_CLAUSE
|
||||
#undef OPENMP_TARGET_PARALLEL_FOR_CLAUSE
|
||||
#undef OPENMP_TEAMS_CLAUSE
|
||||
#undef OPENMP_SIMD_CLAUSE
|
||||
#undef OPENMP_FOR_CLAUSE
|
||||
#undef OPENMP_FOR_SIMD_CLAUSE
|
||||
#undef OPENMP_MAP_KIND
|
||||
#undef OPENMP_DISTRIBUTE_CLAUSE
|
||||
#undef OPENMP_DIST_SCHEDULE_KIND
|
||||
#undef OPENMP_DEFAULTMAP_KIND
|
||||
#undef OPENMP_DEFAULTMAP_MODIFIER
|
||||
#undef OPENMP_TARGET_UPDATE_CLAUSE
|
||||
#undef OPENMP_DISTRIBUTE_PARALLEL_FOR_CLAUSE
|
||||
#undef OPENMP_DISTRIBUTE_PARALLEL_FOR_SIMD_CLAUSE
|
||||
#undef OPENMP_DISTRIBUTE_SIMD_CLAUSE
|
||||
#undef OPENMP_TARGET_PARALLEL_FOR_SIMD_CLAUSE
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ enum OpenMPClauseKind {
|
|||
OMPC_##Name,
|
||||
#include "clang/Basic/OpenMPKinds.def"
|
||||
OMPC_threadprivate,
|
||||
OMPC_uniform,
|
||||
OMPC_unknown
|
||||
};
|
||||
|
||||
|
|
@ -95,6 +96,37 @@ enum OpenMPMapClauseKind {
|
|||
OMPC_MAP_unknown
|
||||
};
|
||||
|
||||
/// \brief OpenMP attributes for 'dist_schedule' clause.
|
||||
enum OpenMPDistScheduleClauseKind {
|
||||
#define OPENMP_DIST_SCHEDULE_KIND(Name) OMPC_DIST_SCHEDULE_##Name,
|
||||
#include "clang/Basic/OpenMPKinds.def"
|
||||
OMPC_DIST_SCHEDULE_unknown
|
||||
};
|
||||
|
||||
/// \brief OpenMP attributes for 'defaultmap' clause.
|
||||
enum OpenMPDefaultmapClauseKind {
|
||||
#define OPENMP_DEFAULTMAP_KIND(Name) \
|
||||
OMPC_DEFAULTMAP_##Name,
|
||||
#include "clang/Basic/OpenMPKinds.def"
|
||||
OMPC_DEFAULTMAP_unknown
|
||||
};
|
||||
|
||||
/// \brief OpenMP modifiers for 'defaultmap' clause.
|
||||
enum OpenMPDefaultmapClauseModifier {
|
||||
OMPC_DEFAULTMAP_MODIFIER_unknown = OMPC_DEFAULTMAP_unknown,
|
||||
#define OPENMP_DEFAULTMAP_MODIFIER(Name) \
|
||||
OMPC_DEFAULTMAP_MODIFIER_##Name,
|
||||
#include "clang/Basic/OpenMPKinds.def"
|
||||
OMPC_DEFAULTMAP_MODIFIER_last
|
||||
};
|
||||
|
||||
/// Scheduling data for loop-based OpenMP directives.
|
||||
struct OpenMPScheduleTy final {
|
||||
OpenMPScheduleClauseKind Schedule = OMPC_SCHEDULE_unknown;
|
||||
OpenMPScheduleClauseModifier M1 = OMPC_SCHEDULE_MODIFIER_unknown;
|
||||
OpenMPScheduleClauseModifier M2 = OMPC_SCHEDULE_MODIFIER_unknown;
|
||||
};
|
||||
|
||||
OpenMPDirectiveKind getOpenMPDirectiveKind(llvm::StringRef Str);
|
||||
const char *getOpenMPDirectiveName(OpenMPDirectiveKind Kind);
|
||||
|
||||
|
|
@ -132,11 +164,20 @@ bool isOpenMPTaskLoopDirective(OpenMPDirectiveKind DKind);
|
|||
/// parallel', otherwise - false.
|
||||
bool isOpenMPParallelDirective(OpenMPDirectiveKind DKind);
|
||||
|
||||
/// \brief Checks if the specified directive is a target-kind directive.
|
||||
/// \brief Checks if the specified directive is a target code offload directive.
|
||||
/// \param DKind Specified directive.
|
||||
/// \return true - the directive is a target-like directive like 'omp target',
|
||||
/// \return true - the directive is a target code offload directive like
|
||||
/// 'omp target', 'omp target parallel', 'omp target xxx'
|
||||
/// otherwise - false.
|
||||
bool isOpenMPTargetDirective(OpenMPDirectiveKind DKind);
|
||||
bool isOpenMPTargetExecutionDirective(OpenMPDirectiveKind DKind);
|
||||
|
||||
/// \brief Checks if the specified directive is a target data offload directive.
|
||||
/// \param DKind Specified directive.
|
||||
/// \return true - the directive is a target data offload directive like
|
||||
/// 'omp target data', 'omp target update', 'omp target enter data',
|
||||
/// 'omp target exit data'
|
||||
/// otherwise - false.
|
||||
bool isOpenMPTargetDataManagementDirective(OpenMPDirectiveKind DKind);
|
||||
|
||||
/// \brief Checks if the specified directive is a teams-kind directive.
|
||||
/// \param DKind Specified directive.
|
||||
|
|
@ -169,6 +210,14 @@ bool isOpenMPPrivate(OpenMPClauseKind Kind);
|
|||
/// \return true - the clause is a threadprivate clause, otherwise - false.
|
||||
bool isOpenMPThreadPrivate(OpenMPClauseKind Kind);
|
||||
|
||||
/// Checks if the specified directive kind is one of tasking directives - task,
|
||||
/// taskloop or taksloop simd.
|
||||
bool isOpenMPTaskingDirective(OpenMPDirectiveKind Kind);
|
||||
|
||||
/// Checks if the specified directive kind is one of the composite or combined
|
||||
/// directives that need loop bound sharing across loops outlined in nested
|
||||
/// functions
|
||||
bool isOpenMPLoopBoundSharingDirective(OpenMPDirectiveKind Kind);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
31
contrib/llvm/tools/clang/include/clang/Basic/PragmaKinds.h
Normal file
31
contrib/llvm/tools/clang/include/clang/Basic/PragmaKinds.h
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
//===--- PragmaKinds.h - #pragma comment() kinds ---------------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_BASIC_PRAGMA_KINDS_H
|
||||
#define LLVM_CLANG_BASIC_PRAGMA_KINDS_H
|
||||
|
||||
namespace clang {
|
||||
|
||||
enum PragmaMSCommentKind {
|
||||
PCK_Unknown,
|
||||
PCK_Linker, // #pragma comment(linker, ...)
|
||||
PCK_Lib, // #pragma comment(lib, ...)
|
||||
PCK_Compiler, // #pragma comment(compiler, ...)
|
||||
PCK_ExeStr, // #pragma comment(exestr, ...)
|
||||
PCK_User // #pragma comment(user, ...)
|
||||
};
|
||||
|
||||
enum PragmaMSStructKind {
|
||||
PMSST_OFF, // #pragms ms_struct off
|
||||
PMSST_ON // #pragms ms_struct on
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -114,6 +114,13 @@ SANITIZER_GROUP("integer", Integer,
|
|||
SANITIZER("local-bounds", LocalBounds)
|
||||
SANITIZER_GROUP("bounds", Bounds, ArrayBounds | LocalBounds)
|
||||
|
||||
// EfficiencySanitizer
|
||||
SANITIZER("efficiency-cache-frag", EfficiencyCacheFrag)
|
||||
SANITIZER("efficiency-working-set", EfficiencyWorkingSet)
|
||||
// Meta-group only used internally.
|
||||
SANITIZER_GROUP("efficiency-all", Efficiency,
|
||||
EfficiencyCacheFrag | EfficiencyWorkingSet)
|
||||
|
||||
// Magic group, containing all sanitizers. For example, "-fno-sanitize=all"
|
||||
// can be used to disable all the sanitizers.
|
||||
SANITIZER_GROUP("all", All, ~0ULL)
|
||||
|
|
|
|||
|
|
@ -46,8 +46,6 @@ enum SanitizerOrdinal : uint64_t {
|
|||
}
|
||||
|
||||
struct SanitizerSet {
|
||||
SanitizerSet() : Mask(0) {}
|
||||
|
||||
/// \brief Check if a certain (single) sanitizer is enabled.
|
||||
bool has(SanitizerMask K) const {
|
||||
assert(llvm::isPowerOf2_64(K));
|
||||
|
|
@ -70,7 +68,7 @@ struct SanitizerSet {
|
|||
bool empty() const { return Mask == 0; }
|
||||
|
||||
/// \brief Bitmask of enabled sanitizers.
|
||||
SanitizerMask Mask;
|
||||
SanitizerMask Mask = 0;
|
||||
};
|
||||
|
||||
/// Parse a single value from a -fsanitize= or -fno-sanitize= value list.
|
||||
|
|
|
|||
|
|
@ -373,22 +373,22 @@ public:
|
|||
/// \brief Return the presumed filename of this location.
|
||||
///
|
||||
/// This can be affected by \#line etc.
|
||||
const char *getFilename() const { return Filename; }
|
||||
const char *getFilename() const { assert(isValid()); return Filename; }
|
||||
|
||||
/// \brief Return the presumed line number of this location.
|
||||
///
|
||||
/// This can be affected by \#line etc.
|
||||
unsigned getLine() const { return Line; }
|
||||
unsigned getLine() const { assert(isValid()); return Line; }
|
||||
|
||||
/// \brief Return the presumed column number of this location.
|
||||
///
|
||||
/// This cannot be affected by \#line, but is packaged here for convenience.
|
||||
unsigned getColumn() const { return Col; }
|
||||
unsigned getColumn() const { assert(isValid()); return Col; }
|
||||
|
||||
/// \brief Return the presumed include location of this location.
|
||||
///
|
||||
/// This can be affected by GNU linemarker directives.
|
||||
SourceLocation getIncludeLoc() const { return IncludeLoc; }
|
||||
SourceLocation getIncludeLoc() const { assert(isValid()); return IncludeLoc; }
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -61,7 +61,6 @@ class SourceManager;
|
|||
class FileManager;
|
||||
class FileEntry;
|
||||
class LineTableInfo;
|
||||
class LangOptions;
|
||||
class ASTWriter;
|
||||
class ASTReader;
|
||||
|
||||
|
|
@ -798,6 +797,15 @@ public:
|
|||
IncludeLoc, FileCharacter, LoadedID, LoadedOffset);
|
||||
}
|
||||
|
||||
/// \brief Get the FileID for \p SourceFile if it exists. Otherwise, create a
|
||||
/// new FileID for the \p SourceFile.
|
||||
FileID getOrCreateFileID(const FileEntry *SourceFile,
|
||||
SrcMgr::CharacteristicKind FileCharacter) {
|
||||
FileID ID = translateFile(SourceFile);
|
||||
return ID.isValid() ? ID : createFileID(SourceFile, SourceLocation(),
|
||||
FileCharacter);
|
||||
}
|
||||
|
||||
/// \brief Return a new SourceLocation that encodes the
|
||||
/// fact that a token from SpellingLoc should actually be referenced from
|
||||
/// ExpansionLoc, and that it represents the expansion of a macro argument
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ namespace clang {
|
|||
TST_half, // OpenCL half, ARM NEON __fp16
|
||||
TST_float,
|
||||
TST_double,
|
||||
TST_float128,
|
||||
TST_bool, // _Bool
|
||||
TST_decimal32, // _Decimal32
|
||||
TST_decimal64, // _Decimal64
|
||||
|
|
@ -73,16 +74,18 @@ namespace clang {
|
|||
TST_auto_type, // __auto_type extension
|
||||
TST_unknown_anytype, // __unknown_anytype extension
|
||||
TST_atomic, // C11 _Atomic
|
||||
TST_error // erroneous type
|
||||
#define GENERIC_IMAGE_TYPE(ImgType, Id) TST_##ImgType##_t, // OpenCL image types
|
||||
#include "clang/Basic/OpenCLImageTypes.def"
|
||||
TST_error // erroneous type
|
||||
};
|
||||
|
||||
|
||||
/// \brief Structure that packs information about the type specifiers that
|
||||
/// were written in a particular type specifier sequence.
|
||||
struct WrittenBuiltinSpecs {
|
||||
/*DeclSpec::TST*/ unsigned Type : 5;
|
||||
/*DeclSpec::TSS*/ unsigned Sign : 2;
|
||||
/*DeclSpec::TSW*/ unsigned Width : 2;
|
||||
bool ModeAttr : 1;
|
||||
unsigned ModeAttr : 1;
|
||||
};
|
||||
|
||||
/// \brief A C++ access specifier (public, private, protected), plus the
|
||||
|
|
@ -238,7 +241,10 @@ namespace clang {
|
|||
CC_AAPCS_VFP, // __attribute__((pcs("aapcs-vfp")))
|
||||
CC_IntelOclBicc, // __attribute__((intel_ocl_bicc))
|
||||
CC_SpirFunction, // default for OpenCL functions on SPIR target
|
||||
CC_SpirKernel // inferred for OpenCL kernels on SPIR target
|
||||
CC_OpenCLKernel, // inferred for OpenCL kernels
|
||||
CC_Swift, // __attribute__((swiftcall))
|
||||
CC_PreserveMost, // __attribute__((preserve_most))
|
||||
CC_PreserveAll, // __attribute__((preserve_all))
|
||||
};
|
||||
|
||||
/// \brief Checks whether the given calling convention supports variadic
|
||||
|
|
@ -251,7 +257,8 @@ namespace clang {
|
|||
case CC_X86Pascal:
|
||||
case CC_X86VectorCall:
|
||||
case CC_SpirFunction:
|
||||
case CC_SpirKernel:
|
||||
case CC_OpenCLKernel:
|
||||
case CC_Swift:
|
||||
return false;
|
||||
default:
|
||||
return true;
|
||||
|
|
@ -283,6 +290,28 @@ namespace clang {
|
|||
/// Retrieve the spelling of the given nullability kind.
|
||||
llvm::StringRef getNullabilitySpelling(NullabilityKind kind,
|
||||
bool isContextSensitive = false);
|
||||
|
||||
/// \brief Kinds of parameter ABI.
|
||||
enum class ParameterABI {
|
||||
/// This parameter uses ordinary ABI rules for its type.
|
||||
Ordinary,
|
||||
|
||||
/// This parameter (which must have pointer type) is a Swift
|
||||
/// indirect result parameter.
|
||||
SwiftIndirectResult,
|
||||
|
||||
/// This parameter (which must have pointer-to-pointer type) uses
|
||||
/// the special Swift error-result ABI treatment. There can be at
|
||||
/// most one parameter on a given function that uses this treatment.
|
||||
SwiftErrorResult,
|
||||
|
||||
/// This parameter (which must have pointer type) uses the special
|
||||
/// Swift context-pointer ABI treatment. There can be at
|
||||
/// most one parameter on a given function that uses this treatment.
|
||||
SwiftContext
|
||||
};
|
||||
|
||||
llvm::StringRef getParameterABISpelling(ParameterABI kind);
|
||||
} // end namespace clang
|
||||
|
||||
#endif // LLVM_CLANG_BASIC_SPECIFIERS_H
|
||||
|
|
|
|||
|
|
@ -126,6 +126,7 @@ def ArrayTypeTraitExpr : DStmt<Expr>;
|
|||
def ExpressionTraitExpr : DStmt<Expr>;
|
||||
def DependentScopeDeclRefExpr : DStmt<Expr>;
|
||||
def CXXConstructExpr : DStmt<Expr>;
|
||||
def CXXInheritedCtorInitExpr : DStmt<Expr>;
|
||||
def CXXBindTemporaryExpr : DStmt<Expr>;
|
||||
def ExprWithCleanups : DStmt<Expr>;
|
||||
def CXXTemporaryObjectExpr : DStmt<CXXConstructExpr>;
|
||||
|
|
@ -164,6 +165,7 @@ def ObjCIsaExpr : DStmt<Expr>;
|
|||
def ObjCIndirectCopyRestoreExpr : DStmt<Expr>;
|
||||
def ObjCBoolLiteralExpr : DStmt<Expr>;
|
||||
def ObjCSubscriptRefExpr : DStmt<Expr>;
|
||||
def ObjCAvailabilityCheckExpr : DStmt<Expr>;
|
||||
|
||||
// Obj-C ARC Expressions.
|
||||
def ObjCBridgedCastExpr : DStmt<ExplicitCastExpr>;
|
||||
|
|
@ -216,9 +218,18 @@ def OMPOrderedDirective : DStmt<OMPExecutableDirective>;
|
|||
def OMPAtomicDirective : DStmt<OMPExecutableDirective>;
|
||||
def OMPTargetDirective : DStmt<OMPExecutableDirective>;
|
||||
def OMPTargetDataDirective : DStmt<OMPExecutableDirective>;
|
||||
def OMPTargetEnterDataDirective : DStmt<OMPExecutableDirective>;
|
||||
def OMPTargetExitDataDirective : DStmt<OMPExecutableDirective>;
|
||||
def OMPTargetParallelDirective : DStmt<OMPExecutableDirective>;
|
||||
def OMPTargetParallelForDirective : DStmt<OMPExecutableDirective>;
|
||||
def OMPTargetUpdateDirective : DStmt<OMPExecutableDirective>;
|
||||
def OMPTeamsDirective : DStmt<OMPExecutableDirective>;
|
||||
def OMPCancellationPointDirective : DStmt<OMPExecutableDirective>;
|
||||
def OMPCancelDirective : DStmt<OMPExecutableDirective>;
|
||||
def OMPTaskLoopDirective : DStmt<OMPLoopDirective>;
|
||||
def OMPTaskLoopSimdDirective : DStmt<OMPLoopDirective>;
|
||||
def OMPDistributeDirective : DStmt<OMPLoopDirective>;
|
||||
def OMPDistributeParallelForDirective : DStmt<OMPLoopDirective>;
|
||||
def OMPDistributeParallelForSimdDirective : DStmt<OMPLoopDirective>;
|
||||
def OMPDistributeSimdDirective : DStmt<OMPLoopDirective>;
|
||||
def OMPTargetParallelForSimdDirective : DStmt<OMPLoopDirective>;
|
||||
|
|
|
|||
|
|
@ -239,7 +239,7 @@ public:
|
|||
/// \brief Can an out-of-line inline function serve as a key function?
|
||||
///
|
||||
/// This flag is only useful in ABIs where type data (for example,
|
||||
/// v-tables and type_info objects) are emitted only after processing
|
||||
/// vtables and type_info objects) are emitted only after processing
|
||||
/// the definition of a special "key" virtual function. (This is safe
|
||||
/// because the ODR requires that every virtual function be defined
|
||||
/// somewhere in a program.) This usually permits such data to be
|
||||
|
|
|
|||
|
|
@ -21,13 +21,14 @@
|
|||
#include "clang/Basic/TargetCXXABI.h"
|
||||
#include "clang/Basic/TargetOptions.h"
|
||||
#include "clang/Basic/VersionTuple.h"
|
||||
#include "llvm/ADT/IntrusiveRefCntPtr.h"
|
||||
#include "llvm/ADT/APInt.h"
|
||||
#include "llvm/ADT/IntrusiveRefCntPtr.h"
|
||||
#include "llvm/ADT/SmallSet.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include "llvm/ADT/StringRef.h"
|
||||
#include "llvm/ADT/StringSwitch.h"
|
||||
#include "llvm/ADT/Triple.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/Support/DataTypes.h"
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
|
|
@ -57,13 +58,14 @@ protected:
|
|||
bool BigEndian;
|
||||
bool TLSSupported;
|
||||
bool NoAsmVariants; // True if {|} are normal characters.
|
||||
bool HasFloat128;
|
||||
unsigned char PointerWidth, PointerAlign;
|
||||
unsigned char BoolWidth, BoolAlign;
|
||||
unsigned char IntWidth, IntAlign;
|
||||
unsigned char HalfWidth, HalfAlign;
|
||||
unsigned char FloatWidth, FloatAlign;
|
||||
unsigned char DoubleWidth, DoubleAlign;
|
||||
unsigned char LongDoubleWidth, LongDoubleAlign;
|
||||
unsigned char LongDoubleWidth, LongDoubleAlign, Float128Align;
|
||||
unsigned char LargeArrayMinWidth, LargeArrayAlign;
|
||||
unsigned char LongWidth, LongAlign;
|
||||
unsigned char LongLongWidth, LongLongAlign;
|
||||
|
|
@ -74,11 +76,10 @@ protected:
|
|||
unsigned short MaxVectorAlign;
|
||||
unsigned short MaxTLSAlign;
|
||||
unsigned short SimdDefaultAlign;
|
||||
const char *DataLayoutString;
|
||||
const char *UserLabelPrefix;
|
||||
std::unique_ptr<llvm::DataLayout> DataLayout;
|
||||
const char *MCountName;
|
||||
const llvm::fltSemantics *HalfFormat, *FloatFormat, *DoubleFormat,
|
||||
*LongDoubleFormat;
|
||||
*LongDoubleFormat, *Float128Format;
|
||||
unsigned char RegParmMax, SSERegParmMax;
|
||||
TargetCXXABI TheCXXABI;
|
||||
const LangAS::Map *AddrSpaceMap;
|
||||
|
|
@ -95,6 +96,10 @@ protected:
|
|||
// TargetInfo Constructor. Default initializes all fields.
|
||||
TargetInfo(const llvm::Triple &T);
|
||||
|
||||
void resetDataLayout(StringRef DL) {
|
||||
DataLayout.reset(new llvm::DataLayout(DL));
|
||||
}
|
||||
|
||||
public:
|
||||
/// \brief Construct a target for the given options.
|
||||
///
|
||||
|
|
@ -132,7 +137,8 @@ public:
|
|||
NoFloat = 255,
|
||||
Float = 0,
|
||||
Double,
|
||||
LongDouble
|
||||
LongDouble,
|
||||
Float128
|
||||
};
|
||||
|
||||
/// \brief The different kinds of __builtin_va_list types defined by
|
||||
|
|
@ -202,6 +208,9 @@ protected:
|
|||
/// zero-length bitfield.
|
||||
unsigned UseZeroLengthBitfieldAlignment : 1;
|
||||
|
||||
/// \brief Whether explicit bit field alignment attributes are honored.
|
||||
unsigned UseExplicitBitFieldAlignment : 1;
|
||||
|
||||
/// If non-zero, specifies a fixed alignment value for bitfields that follow
|
||||
/// zero length bitfield, regardless of the zero length bitfield type.
|
||||
unsigned ZeroLengthBitfieldBoundary;
|
||||
|
|
@ -320,6 +329,9 @@ public:
|
|||
return getPointerWidth(0) >= 64;
|
||||
} // FIXME
|
||||
|
||||
/// \brief Determine whether the __float128 type is supported on this target.
|
||||
virtual bool hasFloat128Type() const { return HasFloat128; }
|
||||
|
||||
/// \brief Return the alignment that is suitable for storing any
|
||||
/// object with a fundamental alignment requirement.
|
||||
unsigned getSuitableAlign() const { return SuitableAlign; }
|
||||
|
|
@ -372,6 +384,14 @@ public:
|
|||
return *LongDoubleFormat;
|
||||
}
|
||||
|
||||
/// getFloat128Width/Align/Format - Return the size/align/format of
|
||||
/// '__float128'.
|
||||
unsigned getFloat128Width() const { return 128; }
|
||||
unsigned getFloat128Align() const { return Float128Align; }
|
||||
const llvm::fltSemantics &getFloat128Format() const {
|
||||
return *Float128Format;
|
||||
}
|
||||
|
||||
/// \brief Return true if the 'long double' type should be mangled like
|
||||
/// __float128.
|
||||
virtual bool useFloat128ManglingForLongDouble() const { return false; }
|
||||
|
|
@ -407,30 +427,37 @@ public:
|
|||
/// types for the given target.
|
||||
unsigned getSimdDefaultAlign() const { return SimdDefaultAlign; }
|
||||
|
||||
/// Return the alignment (in bits) of the thrown exception object. This is
|
||||
/// only meaningful for targets that allocate C++ exceptions in a system
|
||||
/// runtime, such as those using the Itanium C++ ABI.
|
||||
virtual unsigned getExnObjectAlignment() const {
|
||||
// Itanium says that an _Unwind_Exception has to be "double-word"
|
||||
// aligned (and thus the end of it is also so-aligned), meaning 16
|
||||
// bytes. Of course, that was written for the actual Itanium,
|
||||
// which is a 64-bit platform. Classically, the ABI doesn't really
|
||||
// specify the alignment on other platforms, but in practice
|
||||
// libUnwind declares the struct with __attribute__((aligned)), so
|
||||
// we assume that alignment here. (It's generally 16 bytes, but
|
||||
// some targets overwrite it.)
|
||||
return getDefaultAlignForAttributeAligned();
|
||||
}
|
||||
|
||||
/// \brief Return the size of intmax_t and uintmax_t for this target, in bits.
|
||||
unsigned getIntMaxTWidth() const {
|
||||
return getTypeWidth(IntMaxType);
|
||||
}
|
||||
|
||||
// Return the size of unwind_word for this target.
|
||||
unsigned getUnwindWordWidth() const { return getPointerWidth(0); }
|
||||
virtual unsigned getUnwindWordWidth() const { return getPointerWidth(0); }
|
||||
|
||||
/// \brief Return the "preferred" register width on this target.
|
||||
unsigned getRegisterWidth() const {
|
||||
virtual unsigned getRegisterWidth() const {
|
||||
// Currently we assume the register width on the target matches the pointer
|
||||
// width, we can introduce a new variable for this if/when some target wants
|
||||
// it.
|
||||
return PointerWidth;
|
||||
}
|
||||
|
||||
/// \brief Returns the default value of the __USER_LABEL_PREFIX__ macro,
|
||||
/// which is the prefix given to user symbols by default.
|
||||
///
|
||||
/// On most platforms this is "_", but it is "" on some, and "." on others.
|
||||
const char *getUserLabelPrefix() const {
|
||||
return UserLabelPrefix;
|
||||
}
|
||||
|
||||
/// \brief Returns the name of the mcount instrumentation function.
|
||||
const char *getMCountName() const {
|
||||
return MCountName;
|
||||
|
|
@ -466,6 +493,12 @@ public:
|
|||
return ZeroLengthBitfieldBoundary;
|
||||
}
|
||||
|
||||
/// \brief Check whether explicit bitfield alignment attributes should be
|
||||
// honored, as in "__attribute__((aligned(2))) int b : 1;".
|
||||
bool useExplicitBitFieldAlignment() const {
|
||||
return UseExplicitBitFieldAlignment;
|
||||
}
|
||||
|
||||
/// \brief Check whether this target support '\#pragma options align=mac68k'.
|
||||
bool hasAlignMac68kSupport() const {
|
||||
return HasAlignMac68kSupport;
|
||||
|
|
@ -712,9 +745,9 @@ public:
|
|||
return Triple;
|
||||
}
|
||||
|
||||
const char *getDataLayoutString() const {
|
||||
assert(DataLayoutString && "Uninitialized DataLayoutString!");
|
||||
return DataLayoutString;
|
||||
const llvm::DataLayout &getDataLayout() const {
|
||||
assert(DataLayout && "Uninitialized DataLayout!");
|
||||
return *DataLayout;
|
||||
}
|
||||
|
||||
struct GCCRegAlias {
|
||||
|
|
@ -868,6 +901,8 @@ public:
|
|||
|
||||
/// \brief Return the register number that __builtin_eh_return_regno would
|
||||
/// return with the specified argument.
|
||||
/// This corresponds with TargetLowering's getExceptionPointerRegister
|
||||
/// and getExceptionSelectorRegister in the backend.
|
||||
virtual int getEHDataRegisterNumber(unsigned RegNo) const {
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -931,6 +966,27 @@ public:
|
|||
return false;
|
||||
}
|
||||
|
||||
/// \brief Whether target allows to overalign ABI-specified prefered alignment
|
||||
virtual bool allowsLargerPreferedTypeAlignment() const { return true; }
|
||||
|
||||
/// \brief Set supported OpenCL extensions and optional core features.
|
||||
virtual void setSupportedOpenCLOpts() {}
|
||||
|
||||
/// \brief Get supported OpenCL extensions and optional core features.
|
||||
OpenCLOptions &getSupportedOpenCLOpts() {
|
||||
return getTargetOpts().SupportedOpenCLOptions;
|
||||
}
|
||||
|
||||
/// \brief Get const supported OpenCL extensions and optional core features.
|
||||
const OpenCLOptions &getSupportedOpenCLOpts() const {
|
||||
return getTargetOpts().SupportedOpenCLOptions;
|
||||
}
|
||||
|
||||
/// \brief Check the target is valid after it is fully initialized.
|
||||
virtual bool validateTarget(DiagnosticsEngine &Diags) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual uint64_t getPointerWidthV(unsigned AddrSpace) const {
|
||||
return PointerWidth;
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue