xref: /aosp_15_r20/external/clang/lib/CodeGen/ABIInfo.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===----- ABIInfo.h - ABI information access & encapsulation ---*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li 
10*67e74705SXin Li #ifndef LLVM_CLANG_LIB_CODEGEN_ABIINFO_H
11*67e74705SXin Li #define LLVM_CLANG_LIB_CODEGEN_ABIINFO_H
12*67e74705SXin Li 
13*67e74705SXin Li #include "clang/AST/Type.h"
14*67e74705SXin Li #include "llvm/IR/CallingConv.h"
15*67e74705SXin Li #include "llvm/IR/Type.h"
16*67e74705SXin Li 
17*67e74705SXin Li namespace llvm {
18*67e74705SXin Li   class Value;
19*67e74705SXin Li   class LLVMContext;
20*67e74705SXin Li   class DataLayout;
21*67e74705SXin Li   class Type;
22*67e74705SXin Li }
23*67e74705SXin Li 
24*67e74705SXin Li namespace clang {
25*67e74705SXin Li   class ASTContext;
26*67e74705SXin Li   class TargetInfo;
27*67e74705SXin Li 
28*67e74705SXin Li namespace CodeGen {
29*67e74705SXin Li   class ABIArgInfo;
30*67e74705SXin Li   class Address;
31*67e74705SXin Li   class CGCXXABI;
32*67e74705SXin Li   class CGFunctionInfo;
33*67e74705SXin Li   class CodeGenFunction;
34*67e74705SXin Li   class CodeGenTypes;
35*67e74705SXin Li   class SwiftABIInfo;
36*67e74705SXin Li 
37*67e74705SXin Li namespace swiftcall {
38*67e74705SXin Li   class SwiftAggLowering;
39*67e74705SXin Li }
40*67e74705SXin Li 
41*67e74705SXin Li   // FIXME: All of this stuff should be part of the target interface
42*67e74705SXin Li   // somehow. It is currently here because it is not clear how to factor
43*67e74705SXin Li   // the targets to support this, since the Targets currently live in a
44*67e74705SXin Li   // layer below types n'stuff.
45*67e74705SXin Li 
46*67e74705SXin Li 
47*67e74705SXin Li   /// ABIInfo - Target specific hooks for defining how a type should be
48*67e74705SXin Li   /// passed or returned from functions.
49*67e74705SXin Li   class ABIInfo {
50*67e74705SXin Li   public:
51*67e74705SXin Li     CodeGen::CodeGenTypes &CGT;
52*67e74705SXin Li   protected:
53*67e74705SXin Li     llvm::CallingConv::ID RuntimeCC;
54*67e74705SXin Li     llvm::CallingConv::ID BuiltinCC;
55*67e74705SXin Li   public:
ABIInfo(CodeGen::CodeGenTypes & cgt)56*67e74705SXin Li     ABIInfo(CodeGen::CodeGenTypes &cgt)
57*67e74705SXin Li       : CGT(cgt),
58*67e74705SXin Li         RuntimeCC(llvm::CallingConv::C),
59*67e74705SXin Li         BuiltinCC(llvm::CallingConv::C) {}
60*67e74705SXin Li 
61*67e74705SXin Li     virtual ~ABIInfo();
62*67e74705SXin Li 
supportsSwift()63*67e74705SXin Li     virtual bool supportsSwift() const { return false; }
64*67e74705SXin Li 
65*67e74705SXin Li     CodeGen::CGCXXABI &getCXXABI() const;
66*67e74705SXin Li     ASTContext &getContext() const;
67*67e74705SXin Li     llvm::LLVMContext &getVMContext() const;
68*67e74705SXin Li     const llvm::DataLayout &getDataLayout() const;
69*67e74705SXin Li     const TargetInfo &getTarget() const;
70*67e74705SXin Li 
71*67e74705SXin Li     /// Return the calling convention to use for system runtime
72*67e74705SXin Li     /// functions.
getRuntimeCC()73*67e74705SXin Li     llvm::CallingConv::ID getRuntimeCC() const {
74*67e74705SXin Li       return RuntimeCC;
75*67e74705SXin Li     }
76*67e74705SXin Li 
77*67e74705SXin Li     /// Return the calling convention to use for compiler builtins
getBuiltinCC()78*67e74705SXin Li     llvm::CallingConv::ID getBuiltinCC() const {
79*67e74705SXin Li       return BuiltinCC;
80*67e74705SXin Li     }
81*67e74705SXin Li 
82*67e74705SXin Li     virtual void computeInfo(CodeGen::CGFunctionInfo &FI) const = 0;
83*67e74705SXin Li 
84*67e74705SXin Li     /// EmitVAArg - Emit the target dependent code to load a value of
85*67e74705SXin Li     /// \arg Ty from the va_list pointed to by \arg VAListAddr.
86*67e74705SXin Li 
87*67e74705SXin Li     // FIXME: This is a gaping layering violation if we wanted to drop
88*67e74705SXin Li     // the ABI information any lower than CodeGen. Of course, for
89*67e74705SXin Li     // VAArg handling it has to be at this level; there is no way to
90*67e74705SXin Li     // abstract this out.
91*67e74705SXin Li     virtual CodeGen::Address EmitVAArg(CodeGen::CodeGenFunction &CGF,
92*67e74705SXin Li                                        CodeGen::Address VAListAddr,
93*67e74705SXin Li                                        QualType Ty) const = 0;
94*67e74705SXin Li 
95*67e74705SXin Li     bool isAndroid() const;
96*67e74705SXin Li 
97*67e74705SXin Li     /// Emit the target dependent code to load a value of
98*67e74705SXin Li     /// \arg Ty from the \c __builtin_ms_va_list pointed to by \arg VAListAddr.
99*67e74705SXin Li     virtual CodeGen::Address EmitMSVAArg(CodeGen::CodeGenFunction &CGF,
100*67e74705SXin Li                                          CodeGen::Address VAListAddr,
101*67e74705SXin Li                                          QualType Ty) const;
102*67e74705SXin Li 
103*67e74705SXin Li     virtual bool isHomogeneousAggregateBaseType(QualType Ty) const;
104*67e74705SXin Li 
105*67e74705SXin Li     virtual bool isHomogeneousAggregateSmallEnough(const Type *Base,
106*67e74705SXin Li                                                    uint64_t Members) const;
107*67e74705SXin Li 
108*67e74705SXin Li     virtual bool shouldSignExtUnsignedType(QualType Ty) const;
109*67e74705SXin Li 
110*67e74705SXin Li     bool isHomogeneousAggregate(QualType Ty, const Type *&Base,
111*67e74705SXin Li                                 uint64_t &Members) const;
112*67e74705SXin Li 
113*67e74705SXin Li     /// A convenience method to return an indirect ABIArgInfo with an
114*67e74705SXin Li     /// expected alignment equal to the ABI alignment of the given type.
115*67e74705SXin Li     CodeGen::ABIArgInfo
116*67e74705SXin Li     getNaturalAlignIndirect(QualType Ty, bool ByRef = true,
117*67e74705SXin Li                             bool Realign = false,
118*67e74705SXin Li                             llvm::Type *Padding = nullptr) const;
119*67e74705SXin Li 
120*67e74705SXin Li     CodeGen::ABIArgInfo
121*67e74705SXin Li     getNaturalAlignIndirectInReg(QualType Ty, bool Realign = false) const;
122*67e74705SXin Li 
123*67e74705SXin Li 
124*67e74705SXin Li   };
125*67e74705SXin Li 
126*67e74705SXin Li   /// A refining implementation of ABIInfo for targets that support swiftcall.
127*67e74705SXin Li   ///
128*67e74705SXin Li   /// If we find ourselves wanting multiple such refinements, they'll probably
129*67e74705SXin Li   /// be independent refinements, and we should probably find another way
130*67e74705SXin Li   /// to do it than simple inheritance.
131*67e74705SXin Li   class SwiftABIInfo : public ABIInfo {
132*67e74705SXin Li   public:
SwiftABIInfo(CodeGen::CodeGenTypes & cgt)133*67e74705SXin Li     SwiftABIInfo(CodeGen::CodeGenTypes &cgt) : ABIInfo(cgt) {}
134*67e74705SXin Li 
supportsSwift()135*67e74705SXin Li     bool supportsSwift() const final override { return true; }
136*67e74705SXin Li 
137*67e74705SXin Li     virtual bool shouldPassIndirectlyForSwift(CharUnits totalSize,
138*67e74705SXin Li                                               ArrayRef<llvm::Type*> types,
139*67e74705SXin Li                                               bool asReturnValue) const = 0;
140*67e74705SXin Li 
141*67e74705SXin Li     virtual bool isLegalVectorTypeForSwift(CharUnits totalSize,
142*67e74705SXin Li                                            llvm::Type *eltTy,
143*67e74705SXin Li                                            unsigned elts) const;
144*67e74705SXin Li 
classof(const ABIInfo * info)145*67e74705SXin Li     static bool classof(const ABIInfo *info) {
146*67e74705SXin Li       return info->supportsSwift();
147*67e74705SXin Li     }
148*67e74705SXin Li   };
149*67e74705SXin Li 
150*67e74705SXin Li }  // end namespace CodeGen
151*67e74705SXin Li }  // end namespace clang
152*67e74705SXin Li 
153*67e74705SXin Li #endif
154