18b54999a831bb195c08541ca995ef0505c96193fMark Lacey//==---- CodeGenABITypes.h - 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// It allows other clients, like LLDB, to determine the LLVM types that are
188b54999a831bb195c08541ca995ef0505c96193fMark Lacey// actually used in function calls, which makes it possible to then determine
198b54999a831bb195c08541ca995ef0505c96193fMark Lacey// the acutal ABI locations (e.g. registers, stack locations, etc.) that
208b54999a831bb195c08541ca995ef0505c96193fMark Lacey// these parameters are stored in.
218b54999a831bb195c08541ca995ef0505c96193fMark Lacey//
228b54999a831bb195c08541ca995ef0505c96193fMark Lacey//===----------------------------------------------------------------------===//
238b54999a831bb195c08541ca995ef0505c96193fMark Lacey
248b54999a831bb195c08541ca995ef0505c96193fMark Lacey#ifndef LLVM_CLANG_CODEGEN_ABITYPES_H
258b54999a831bb195c08541ca995ef0505c96193fMark Lacey#define LLVM_CLANG_CODEGEN_ABITYPES_H
268b54999a831bb195c08541ca995ef0505c96193fMark Lacey
278b54999a831bb195c08541ca995ef0505c96193fMark Lacey#include "clang/AST/CanonicalType.h"
288b54999a831bb195c08541ca995ef0505c96193fMark Lacey#include "clang/AST/Type.h"
298b54999a831bb195c08541ca995ef0505c96193fMark Lacey#include "clang/CodeGen/CGFunctionInfo.h"
308b54999a831bb195c08541ca995ef0505c96193fMark Lacey
318b54999a831bb195c08541ca995ef0505c96193fMark Laceynamespace llvm {
328b54999a831bb195c08541ca995ef0505c96193fMark Lacey  class DataLayout;
338b54999a831bb195c08541ca995ef0505c96193fMark Lacey  class Module;
348b54999a831bb195c08541ca995ef0505c96193fMark Lacey}
358b54999a831bb195c08541ca995ef0505c96193fMark Lacey
368b54999a831bb195c08541ca995ef0505c96193fMark Laceynamespace clang {
378b54999a831bb195c08541ca995ef0505c96193fMark Laceyclass ASTContext;
388b54999a831bb195c08541ca995ef0505c96193fMark Laceyclass CXXRecordDecl;
398b54999a831bb195c08541ca995ef0505c96193fMark Laceyclass CodeGenOptions;
408b54999a831bb195c08541ca995ef0505c96193fMark Laceyclass DiagnosticsEngine;
418b54999a831bb195c08541ca995ef0505c96193fMark Laceyclass ObjCMethodDecl;
428b54999a831bb195c08541ca995ef0505c96193fMark Lacey
438b54999a831bb195c08541ca995ef0505c96193fMark Laceynamespace CodeGen {
448b54999a831bb195c08541ca995ef0505c96193fMark Laceyclass CGFunctionInfo;
458b54999a831bb195c08541ca995ef0505c96193fMark Laceyclass CodeGenModule;
468b54999a831bb195c08541ca995ef0505c96193fMark Lacey
478b54999a831bb195c08541ca995ef0505c96193fMark Laceyclass CodeGenABITypes
488b54999a831bb195c08541ca995ef0505c96193fMark Lacey{
498b54999a831bb195c08541ca995ef0505c96193fMark Laceypublic:
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CodeGenABITypes(ASTContext &C, llvm::Module &M, const llvm::DataLayout &TD);
518b54999a831bb195c08541ca995ef0505c96193fMark Lacey  ~CodeGenABITypes();
528b54999a831bb195c08541ca995ef0505c96193fMark Lacey
538b54999a831bb195c08541ca995ef0505c96193fMark Lacey  /// These methods all forward to methods in the private implementation class
548b54999a831bb195c08541ca995ef0505c96193fMark Lacey  /// CodeGenTypes.
558b54999a831bb195c08541ca995ef0505c96193fMark Lacey
568b54999a831bb195c08541ca995ef0505c96193fMark Lacey  const CGFunctionInfo &arrangeObjCMessageSendSignature(
578b54999a831bb195c08541ca995ef0505c96193fMark Lacey                                                     const ObjCMethodDecl *MD,
588b54999a831bb195c08541ca995ef0505c96193fMark Lacey                                                     QualType receiverType);
598b54999a831bb195c08541ca995ef0505c96193fMark Lacey  const CGFunctionInfo &arrangeFreeFunctionType(
608b54999a831bb195c08541ca995ef0505c96193fMark Lacey                                               CanQual<FunctionProtoType> Ty);
618b54999a831bb195c08541ca995ef0505c96193fMark Lacey  const CGFunctionInfo &arrangeFreeFunctionType(
628b54999a831bb195c08541ca995ef0505c96193fMark Lacey                                             CanQual<FunctionNoProtoType> Ty);
638b54999a831bb195c08541ca995ef0505c96193fMark Lacey  const CGFunctionInfo &arrangeCXXMethodType(const CXXRecordDecl *RD,
648b54999a831bb195c08541ca995ef0505c96193fMark Lacey                                             const FunctionProtoType *FTP);
65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const CGFunctionInfo &arrangeFreeFunctionCall(CanQualType returnType,
66ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                                ArrayRef<CanQualType> argTypes,
67ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                                FunctionType::ExtInfo info,
68ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                                RequiredArgs args);
698b54999a831bb195c08541ca995ef0505c96193fMark Lacey
708b54999a831bb195c08541ca995ef0505c96193fMark Laceyprivate:
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// Default CodeGenOptions object used to initialize the
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// CodeGenModule and otherwise not used. More specifically, it is
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// not used in ABI type generation, so none of the options matter.
74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CodeGenOptions *CGO;
75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// The CodeGenModule we use get to the CodeGenTypes object.
778b54999a831bb195c08541ca995ef0505c96193fMark Lacey  CodeGen::CodeGenModule *CGM;
788b54999a831bb195c08541ca995ef0505c96193fMark Lacey};
798b54999a831bb195c08541ca995ef0505c96193fMark Lacey
808b54999a831bb195c08541ca995ef0505c96193fMark Lacey}  // end namespace CodeGen
818b54999a831bb195c08541ca995ef0505c96193fMark Lacey}  // end namespace clang
828b54999a831bb195c08541ca995ef0505c96193fMark Lacey
838b54999a831bb195c08541ca995ef0505c96193fMark Lacey#endif
84