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
23namespace clang {
24class ParsedAttr;
25
26class SemaARM : public SemaBase {
27public:
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
73SemaARM::ArmStreamingType getArmStreamingFnType(const FunctionDecl *FD);
74
75} // namespace clang
76
77#endif // LLVM_CLANG_SEMA_SEMAARM_H
78