1 //==--- CodeGenABITypes.cpp - Convert Clang types to LLVM types for ABI ----==//
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 // CodeGenABITypes is a simple interface for getting LLVM types for
10 // the parameters and the return value of a function given the Clang
11 // types.
12 //
13 // The class is implemented as a public wrapper around the private
14 // CodeGenTypes class in lib/CodeGen.
15 //
16 //===----------------------------------------------------------------------===//
17 
18 #include "clang/CodeGen/CodeGenABITypes.h"
19 #include "CGRecordLayout.h"
20 #include "CodeGenModule.h"
21 #include "clang/CodeGen/CGFunctionInfo.h"
22 #include "clang/Lex/HeaderSearchOptions.h"
23 #include "clang/Lex/PreprocessorOptions.h"
24 
25 using namespace clang;
26 using namespace CodeGen;
27 
28 const CGFunctionInfo &
29 CodeGen::arrangeObjCMessageSendSignature(CodeGenModule &CGM,
30                                          const ObjCMethodDecl *MD,
31                                          QualType receiverType) {
32   return CGM.getTypes().arrangeObjCMessageSendSignature(MD, receiverType);
33 }
34 
35 const CGFunctionInfo &
36 CodeGen::arrangeFreeFunctionType(CodeGenModule &CGM,
37                                  CanQual<FunctionProtoType> Ty,
38                                  const FunctionDecl *FD) {
39   return CGM.getTypes().arrangeFreeFunctionType(Ty, FD);
40 }
41 
42 const CGFunctionInfo &
43 CodeGen::arrangeFreeFunctionType(CodeGenModule &CGM,
44                                  CanQual<FunctionNoProtoType> Ty) {
45   return CGM.getTypes().arrangeFreeFunctionType(Ty);
46 }
47 
48 const CGFunctionInfo &
49 CodeGen::arrangeCXXMethodType(CodeGenModule &CGM,
50                               const CXXRecordDecl *RD,
51                               const FunctionProtoType *FTP,
52                               const CXXMethodDecl *MD) {
53   return CGM.getTypes().arrangeCXXMethodType(RD, FTP, MD);
54 }
55 
56 const CGFunctionInfo &
57 CodeGen::arrangeFreeFunctionCall(CodeGenModule &CGM,
58                                  CanQualType returnType,
59                                  ArrayRef<CanQualType> argTypes,
60                                  FunctionType::ExtInfo info,
61                                  RequiredArgs args) {
62   return CGM.getTypes().arrangeLLVMFunctionInfo(
63       returnType, /*IsInstanceMethod=*/false, /*IsChainCall=*/false, argTypes,
64       info, {}, args);
65 }
66 
67 llvm::FunctionType *
68 CodeGen::convertFreeFunctionType(CodeGenModule &CGM, const FunctionDecl *FD) {
69   assert(FD != nullptr && "Expected a non-null function declaration!");
70   llvm::Type *T = CGM.getTypes().ConvertFunctionType(FD->getType(), FD);
71 
72   if (auto FT = dyn_cast<llvm::FunctionType>(T))
73     return FT;
74 
75   return nullptr;
76 }
77 
78 llvm::Type *
79 CodeGen::convertTypeForMemory(CodeGenModule &CGM, QualType T) {
80   return CGM.getTypes().ConvertTypeForMem(T);
81 }
82 
83 unsigned CodeGen::getLLVMFieldNumber(CodeGenModule &CGM,
84                                      const RecordDecl *RD,
85                                      const FieldDecl *FD) {
86   return CGM.getTypes().getCGRecordLayout(RD).getLLVMFieldNo(FD);
87 }
88