1 //===----- SemaARM.h ------- ARM target-specific routines -----*- C++ -*---===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// \file 9 /// This file declares semantic analysis functions specific to ARM. 10 /// 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_SEMA_SEMAARM_H 14 #define LLVM_CLANG_SEMA_SEMAARM_H 15 16 #include "clang/AST/DeclBase.h" 17 #include "clang/AST/Expr.h" 18 #include "clang/Basic/TargetInfo.h" 19 #include "clang/Sema/SemaBase.h" 20 #include "llvm/ADT/SmallVector.h" 21 #include <tuple> 22 23 namespace clang { 24 class ParsedAttr; 25 26 class SemaARM : public SemaBase { 27 public: 28 SemaARM(Sema &S); 29 30 enum ArmStreamingType { 31 ArmNonStreaming, /// Intrinsic is only available in normal mode 32 ArmStreaming, /// Intrinsic is only available in Streaming-SVE mode. 33 ArmStreamingCompatible, /// Intrinsic is available both in normal and 34 /// Streaming-SVE mode. 35 VerifyRuntimeMode /// Intrinsic is available in normal mode with 36 /// SVE flags, or in Streaming-SVE mode with SME 37 /// flags. Do Sema checks for the runtime mode. 38 }; 39 40 bool CheckARMBuiltinExclusiveCall(unsigned BuiltinID, CallExpr *TheCall, 41 unsigned MaxWidth); 42 bool CheckNeonBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, 43 CallExpr *TheCall); 44 bool CheckMVEBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall); 45 bool CheckSVEBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall); 46 bool 47 ParseSVEImmChecks(CallExpr *TheCall, 48 llvm::SmallVector<std::tuple<int, int, int>, 3> &ImmChecks); 49 bool CheckSMEBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall); 50 bool CheckCDEBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, 51 CallExpr *TheCall); 52 bool CheckARMCoprocessorImmediate(const TargetInfo &TI, const Expr *CoprocArg, 53 bool WantCDE); 54 bool CheckARMBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, 55 CallExpr *TheCall); 56 57 bool CheckAArch64BuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, 58 CallExpr *TheCall); 59 bool BuiltinARMSpecialReg(unsigned BuiltinID, CallExpr *TheCall, int ArgNum, 60 unsigned ExpectedFieldNum, bool AllowName); 61 bool BuiltinARMMemoryTaggingCall(unsigned BuiltinID, CallExpr *TheCall); 62 63 bool MveAliasValid(unsigned BuiltinID, StringRef AliasName); 64 bool CdeAliasValid(unsigned BuiltinID, StringRef AliasName); 65 bool SveAliasValid(unsigned BuiltinID, StringRef AliasName); 66 bool SmeAliasValid(unsigned BuiltinID, StringRef AliasName); 67 void handleBuiltinAliasAttr(Decl *D, const ParsedAttr &AL); 68 void handleNewAttr(Decl *D, const ParsedAttr &AL); 69 void handleCmseNSEntryAttr(Decl *D, const ParsedAttr &AL); 70 void handleInterruptAttr(Decl *D, const ParsedAttr &AL); 71 }; 72 73 SemaARM::ArmStreamingType getArmStreamingFnType(const FunctionDecl *FD); 74 75 } // namespace clang 76 77 #endif // LLVM_CLANG_SEMA_SEMAARM_H 78