1 //===------ SemaSystemZ.cpp ------ SystemZ target-specific routines -------===// 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 // 9 // This file implements semantic analysis functions specific to SystemZ. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "clang/Sema/SemaSystemZ.h" 14 #include "clang/Basic/DiagnosticSema.h" 15 #include "clang/Basic/TargetBuiltins.h" 16 #include "clang/Sema/Sema.h" 17 #include "llvm/ADT/APSInt.h" 18 #include <optional> 19 20 namespace clang { 21 22 SemaSystemZ::SemaSystemZ(Sema &S) : SemaBase(S) {} 23 24 bool SemaSystemZ::CheckSystemZBuiltinFunctionCall(unsigned BuiltinID, 25 CallExpr *TheCall) { 26 if (BuiltinID == SystemZ::BI__builtin_tabort) { 27 Expr *Arg = TheCall->getArg(0); 28 if (std::optional<llvm::APSInt> AbortCode = 29 Arg->getIntegerConstantExpr(getASTContext())) 30 if (AbortCode->getSExtValue() >= 0 && AbortCode->getSExtValue() < 256) 31 return Diag(Arg->getBeginLoc(), diag::err_systemz_invalid_tabort_code) 32 << Arg->getSourceRange(); 33 } 34 35 // For intrinsics which take an immediate value as part of the instruction, 36 // range check them here. 37 unsigned i = 0, l = 0, u = 0; 38 switch (BuiltinID) { 39 default: return false; 40 case SystemZ::BI__builtin_s390_lcbb: i = 1; l = 0; u = 15; break; 41 case SystemZ::BI__builtin_s390_veval: 42 case SystemZ::BI__builtin_s390_verimb: 43 case SystemZ::BI__builtin_s390_verimh: 44 case SystemZ::BI__builtin_s390_verimf: 45 case SystemZ::BI__builtin_s390_verimg: i = 3; l = 0; u = 255; break; 46 case SystemZ::BI__builtin_s390_vfaeb: 47 case SystemZ::BI__builtin_s390_vfaeh: 48 case SystemZ::BI__builtin_s390_vfaef: 49 case SystemZ::BI__builtin_s390_vfaebs: 50 case SystemZ::BI__builtin_s390_vfaehs: 51 case SystemZ::BI__builtin_s390_vfaefs: 52 case SystemZ::BI__builtin_s390_vfaezb: 53 case SystemZ::BI__builtin_s390_vfaezh: 54 case SystemZ::BI__builtin_s390_vfaezf: 55 case SystemZ::BI__builtin_s390_vfaezbs: 56 case SystemZ::BI__builtin_s390_vfaezhs: 57 case SystemZ::BI__builtin_s390_vfaezfs: i = 2; l = 0; u = 15; break; 58 case SystemZ::BI__builtin_s390_vfisb: 59 case SystemZ::BI__builtin_s390_vfidb: 60 return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 15) || 61 SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 15); 62 case SystemZ::BI__builtin_s390_vftcisb: 63 case SystemZ::BI__builtin_s390_vftcidb: i = 1; l = 0; u = 4095; break; 64 case SystemZ::BI__builtin_s390_vlbb: i = 1; l = 0; u = 15; break; 65 case SystemZ::BI__builtin_s390_vpdi: i = 2; l = 0; u = 15; break; 66 case SystemZ::BI__builtin_s390_vsldb: i = 2; l = 0; u = 15; break; 67 case SystemZ::BI__builtin_s390_vstrcb: 68 case SystemZ::BI__builtin_s390_vstrch: 69 case SystemZ::BI__builtin_s390_vstrcf: 70 case SystemZ::BI__builtin_s390_vstrczb: 71 case SystemZ::BI__builtin_s390_vstrczh: 72 case SystemZ::BI__builtin_s390_vstrczf: 73 case SystemZ::BI__builtin_s390_vstrcbs: 74 case SystemZ::BI__builtin_s390_vstrchs: 75 case SystemZ::BI__builtin_s390_vstrcfs: 76 case SystemZ::BI__builtin_s390_vstrczbs: 77 case SystemZ::BI__builtin_s390_vstrczhs: 78 case SystemZ::BI__builtin_s390_vstrczfs: i = 3; l = 0; u = 15; break; 79 case SystemZ::BI__builtin_s390_vmslg: i = 3; l = 0; u = 15; break; 80 case SystemZ::BI__builtin_s390_vfminsb: 81 case SystemZ::BI__builtin_s390_vfmaxsb: 82 case SystemZ::BI__builtin_s390_vfmindb: 83 case SystemZ::BI__builtin_s390_vfmaxdb: i = 2; l = 0; u = 15; break; 84 case SystemZ::BI__builtin_s390_vsld: i = 2; l = 0; u = 7; break; 85 case SystemZ::BI__builtin_s390_vsrd: i = 2; l = 0; u = 7; break; 86 case SystemZ::BI__builtin_s390_vclfnhs: 87 case SystemZ::BI__builtin_s390_vclfnls: 88 case SystemZ::BI__builtin_s390_vcfn: 89 case SystemZ::BI__builtin_s390_vcnf: i = 1; l = 0; u = 15; break; 90 case SystemZ::BI__builtin_s390_vcrnfs: i = 2; l = 0; u = 15; break; 91 } 92 return SemaRef.BuiltinConstantArgRange(TheCall, i, l, u); 93 } 94 95 } // namespace clang 96