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
25using namespace clang;
26using namespace CodeGen;
27
28const CGFunctionInfo &
29CodeGen::arrangeObjCMessageSendSignature(CodeGenModule &CGM,
30                                         const ObjCMethodDecl *MD,
31                                         QualType receiverType) {
32  return CGM.getTypes().arrangeObjCMessageSendSignature(MD, receiverType);
33}
34
35const CGFunctionInfo &
36CodeGen::arrangeFreeFunctionType(CodeGenModule &CGM,
37                                 CanQual<FunctionProtoType> Ty) {
38  return CGM.getTypes().arrangeFreeFunctionType(Ty);
39}
40
41const CGFunctionInfo &
42CodeGen::arrangeFreeFunctionType(CodeGenModule &CGM,
43                                 CanQual<FunctionNoProtoType> Ty) {
44  return CGM.getTypes().arrangeFreeFunctionType(Ty);
45}
46
47const CGFunctionInfo &
48CodeGen::arrangeCXXMethodType(CodeGenModule &CGM,
49                              const CXXRecordDecl *RD,
50                              const FunctionProtoType *FTP,
51                              const CXXMethodDecl *MD) {
52  return CGM.getTypes().arrangeCXXMethodType(RD, FTP, MD);
53}
54
55const CGFunctionInfo &
56CodeGen::arrangeFreeFunctionCall(CodeGenModule &CGM,
57                                 CanQualType returnType,
58                                 ArrayRef<CanQualType> argTypes,
59                                 FunctionType::ExtInfo info,
60                                 RequiredArgs args) {
61  return CGM.getTypes().arrangeLLVMFunctionInfo(
62      returnType, /*instanceMethod=*/false, /*chainCall=*/false, argTypes,
63      info, {}, args);
64}
65
66llvm::FunctionType *
67CodeGen::convertFreeFunctionType(CodeGenModule &CGM, const FunctionDecl *FD) {
68  assert(FD != nullptr && "Expected a non-null function declaration!");
69  llvm::Type *T = CGM.getTypes().ConvertType(FD->getType());
70
71  if (auto FT = dyn_cast<llvm::FunctionType>(T))
72    return FT;
73
74  return nullptr;
75}
76
77llvm::Type *
78CodeGen::convertTypeForMemory(CodeGenModule &CGM, QualType T) {
79  return CGM.getTypes().ConvertTypeForMem(T);
80}
81
82unsigned CodeGen::getLLVMFieldNumber(CodeGenModule &CGM,
83                                     const RecordDecl *RD,
84                                     const FieldDecl *FD) {
85  return CGM.getTypes().getCGRecordLayout(RD).getLLVMFieldNo(FD);
86}
87