1//===- TargetInfo.cpp - Target ABI information ----------------------------===//
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 "llvm/ABI/TargetInfo.h"
10
11using namespace llvm::abi;
12
13bool TargetInfo::isAggregateTypeForABI(const Type *Ty) const {
14 // Check for fundamental scalar types.
15 if (Ty->isInteger() || Ty->isFloat() || Ty->isPointer() || Ty->isVector())
16 return false;
17
18 // Everything else is treated as aggregate.
19 return true;
20}
21
22bool TargetInfo::isPromotableInteger(const IntegerType *IT) const {
23 // TODO: The threshold should be the target's int size rather than a
24 // hardcoded 32.
25 unsigned BitWidth = IT->getSizeInBits().getFixedValue();
26 return BitWidth < 32;
27}
28
29ArgInfo TargetInfo::getNaturalAlignIndirect(const Type *Ty, bool ByVal) const {
30 return ArgInfo::getIndirect(Align: Ty->getAlignment(), ByVal);
31}
32
33RecordArgABI TargetInfo::getRecordArgABI(const RecordType *RT) const {
34 if (RT && !RT->canPassInRegisters())
35 return RAA_Indirect;
36 return RAA_Default;
37}
38
39RecordArgABI TargetInfo::getRecordArgABI(const Type *Ty) const {
40 // TODO: When Microsoft ABI is supported, CXX records may need different
41 // handling here (see MicrosoftCXXABI::getRecordArgABI in Clang).
42 const RecordType *RT = dyn_cast<RecordType>(Val: Ty);
43 if (!RT)
44 return RAA_Default;
45 return getRecordArgABI(RT);
46}
47