1//===--- CallUtils.cpp - Shared call emission queries ---------------------===//
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#include "clang/CodeGenUtils/CallUtils.h"
10#include "clang/AST/ExprCXX.h"
11#include "clang/Basic/TargetCXXABI.h"
12
13namespace clang::CodeGenUtils {
14
15CanQual<FunctionProtoType> getFormalType(const CXXMethodDecl *MD) {
16 return MD->getType()
17 ->getCanonicalTypeUnqualified()
18 .getAs<FunctionProtoType>();
19}
20
21llvm::FPClassTest getNoFPClassTestMask(const LangOptions &LangOpts) {
22 llvm::FPClassTest Mask = llvm::fcNone;
23 if (LangOpts.NoHonorInfs)
24 Mask |= llvm::fcInf;
25 if (LangOpts.NoHonorNaNs)
26 Mask |= llvm::fcNan;
27 return Mask;
28}
29
30EvaluationOrder getCallArgEvaluationOrder(const CallExpr *E) {
31 // Note that we allow this to override the order dictated by the calling
32 // convention on the MS ABI, which means that parameter destruction order is
33 // not necessarily reverse construction order.
34 // FIXME: Revisit this based on C++ committee response to unimplementability.
35 const auto *OCE = dyn_cast<CXXOperatorCallExpr>(Val: E);
36 if (!OCE)
37 return EvaluationOrder::Default;
38
39 if (OCE->isAssignmentOp())
40 return EvaluationOrder::ForceRightToLeft;
41
42 switch (OCE->getOperator()) {
43 case OO_LessLess:
44 case OO_GreaterGreater:
45 case OO_AmpAmp:
46 case OO_PipePipe:
47 case OO_Comma:
48 case OO_ArrowStar:
49 return EvaluationOrder::ForceLeftToRight;
50 default:
51 return EvaluationOrder::Default;
52 }
53}
54
55bool shouldEvaluateArgsLeftToRight(EvaluationOrder Order,
56 const TargetCXXABI &ABI) {
57 return ABI.areArgsDestroyedLeftToRightInCallee()
58 ? Order == EvaluationOrder::ForceLeftToRight
59 : Order != EvaluationOrder::ForceRightToLeft;
60}
61
62} // namespace clang::CodeGenUtils
63