18b54999a831bb195c08541ca995ef0505c96193fMark Lacey//==--- CodeGenABITypes.cpp - Convert Clang types to LLVM types for ABI ----==//
28b54999a831bb195c08541ca995ef0505c96193fMark Lacey//
38b54999a831bb195c08541ca995ef0505c96193fMark Lacey//                     The LLVM Compiler Infrastructure
48b54999a831bb195c08541ca995ef0505c96193fMark Lacey//
58b54999a831bb195c08541ca995ef0505c96193fMark Lacey// This file is distributed under the University of Illinois Open Source
68b54999a831bb195c08541ca995ef0505c96193fMark Lacey// License. See LICENSE.TXT for details.
78b54999a831bb195c08541ca995ef0505c96193fMark Lacey//
88b54999a831bb195c08541ca995ef0505c96193fMark Lacey//===----------------------------------------------------------------------===//
98b54999a831bb195c08541ca995ef0505c96193fMark Lacey//
108b54999a831bb195c08541ca995ef0505c96193fMark Lacey// CodeGenABITypes is a simple interface for getting LLVM types for
118b54999a831bb195c08541ca995ef0505c96193fMark Lacey// the parameters and the return value of a function given the Clang
128b54999a831bb195c08541ca995ef0505c96193fMark Lacey// types.
138b54999a831bb195c08541ca995ef0505c96193fMark Lacey//
148b54999a831bb195c08541ca995ef0505c96193fMark Lacey// The class is implemented as a public wrapper around the private
158b54999a831bb195c08541ca995ef0505c96193fMark Lacey// CodeGenTypes class in lib/CodeGen.
168b54999a831bb195c08541ca995ef0505c96193fMark Lacey//
178b54999a831bb195c08541ca995ef0505c96193fMark Lacey//===----------------------------------------------------------------------===//
188b54999a831bb195c08541ca995ef0505c96193fMark Lacey
198b54999a831bb195c08541ca995ef0505c96193fMark Lacey#include "clang/CodeGen/CodeGenABITypes.h"
208b54999a831bb195c08541ca995ef0505c96193fMark Lacey#include "CodeGenModule.h"
21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/CodeGen/CGFunctionInfo.h"
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Frontend/CodeGenOptions.h"
238b54999a831bb195c08541ca995ef0505c96193fMark Lacey
248b54999a831bb195c08541ca995ef0505c96193fMark Laceyusing namespace clang;
258b54999a831bb195c08541ca995ef0505c96193fMark Laceyusing namespace CodeGen;
268b54999a831bb195c08541ca995ef0505c96193fMark Lacey
278b54999a831bb195c08541ca995ef0505c96193fMark LaceyCodeGenABITypes::CodeGenABITypes(ASTContext &C,
288b54999a831bb195c08541ca995ef0505c96193fMark Lacey                                 llvm::Module &M,
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                 const llvm::DataLayout &TD)
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  : CGO(new CodeGenOptions),
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CGM(new CodeGen::CodeGenModule(C, *CGO, M, TD, C.getDiagnostics())) {
328b54999a831bb195c08541ca995ef0505c96193fMark Lacey}
338b54999a831bb195c08541ca995ef0505c96193fMark Lacey
348b54999a831bb195c08541ca995ef0505c96193fMark LaceyCodeGenABITypes::~CodeGenABITypes()
358b54999a831bb195c08541ca995ef0505c96193fMark Lacey{
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  delete CGO;
378b54999a831bb195c08541ca995ef0505c96193fMark Lacey  delete CGM;
388b54999a831bb195c08541ca995ef0505c96193fMark Lacey}
398b54999a831bb195c08541ca995ef0505c96193fMark Lacey
408b54999a831bb195c08541ca995ef0505c96193fMark Laceyconst CGFunctionInfo &
418b54999a831bb195c08541ca995ef0505c96193fMark LaceyCodeGenABITypes::arrangeObjCMessageSendSignature(const ObjCMethodDecl *MD,
428b54999a831bb195c08541ca995ef0505c96193fMark Lacey                                                 QualType receiverType) {
438b54999a831bb195c08541ca995ef0505c96193fMark Lacey  return CGM->getTypes().arrangeObjCMessageSendSignature(MD, receiverType);
448b54999a831bb195c08541ca995ef0505c96193fMark Lacey}
458b54999a831bb195c08541ca995ef0505c96193fMark Lacey
468b54999a831bb195c08541ca995ef0505c96193fMark Laceyconst CGFunctionInfo &
478b54999a831bb195c08541ca995ef0505c96193fMark LaceyCodeGenABITypes::arrangeFreeFunctionType(CanQual<FunctionProtoType> Ty) {
488b54999a831bb195c08541ca995ef0505c96193fMark Lacey  return CGM->getTypes().arrangeFreeFunctionType(Ty);
498b54999a831bb195c08541ca995ef0505c96193fMark Lacey}
508b54999a831bb195c08541ca995ef0505c96193fMark Lacey
518b54999a831bb195c08541ca995ef0505c96193fMark Laceyconst CGFunctionInfo &
528b54999a831bb195c08541ca995ef0505c96193fMark LaceyCodeGenABITypes::arrangeFreeFunctionType(CanQual<FunctionNoProtoType> Ty) {
538b54999a831bb195c08541ca995ef0505c96193fMark Lacey  return CGM->getTypes().arrangeFreeFunctionType(Ty);
548b54999a831bb195c08541ca995ef0505c96193fMark Lacey}
558b54999a831bb195c08541ca995ef0505c96193fMark Lacey
568b54999a831bb195c08541ca995ef0505c96193fMark Laceyconst CGFunctionInfo &
578b54999a831bb195c08541ca995ef0505c96193fMark LaceyCodeGenABITypes::arrangeCXXMethodType(const CXXRecordDecl *RD,
588b54999a831bb195c08541ca995ef0505c96193fMark Lacey                                      const FunctionProtoType *FTP) {
598b54999a831bb195c08541ca995ef0505c96193fMark Lacey  return CGM->getTypes().arrangeCXXMethodType(RD, FTP);
608b54999a831bb195c08541ca995ef0505c96193fMark Lacey}
618b54999a831bb195c08541ca995ef0505c96193fMark Lacey
628b54999a831bb195c08541ca995ef0505c96193fMark Laceyconst CGFunctionInfo &
63651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesCodeGenABITypes::arrangeFreeFunctionCall(CanQualType returnType,
64ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                         ArrayRef<CanQualType> argTypes,
658b54999a831bb195c08541ca995ef0505c96193fMark Lacey                                         FunctionType::ExtInfo info,
668b54999a831bb195c08541ca995ef0505c96193fMark Lacey                                         RequiredArgs args) {
67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return CGM->getTypes().arrangeLLVMFunctionInfo(
68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      returnType, /*IsInstanceMethod=*/false, argTypes, info, args);
698b54999a831bb195c08541ca995ef0505c96193fMark Lacey}
70