forked from OSchip/llvm-project
Move ABIArgInfo into CGFunctionInfo, computed on creation.
- Still have to convert some consumers over. llvm-svn: 63610
This commit is contained in:
parent
12a130bd06
commit
313321ea23
|
@ -10,6 +10,10 @@
|
|||
#ifndef CLANG_CODEGEN_ABIINFO_H
|
||||
#define CLANG_CODEGEN_ABIINFO_H
|
||||
|
||||
namespace llvm {
|
||||
class Type;
|
||||
}
|
||||
|
||||
namespace clang {
|
||||
/* FIXME: All of this stuff should be part of the target interface
|
||||
somehow. It is currently here because it is not clear how to factor
|
||||
|
@ -59,6 +63,8 @@ namespace clang {
|
|||
TypeData(TD),
|
||||
UIntData(0) {}
|
||||
public:
|
||||
ABIArgInfo() : TheKind(Default), TypeData(0), UIntData(0) {}
|
||||
|
||||
static ABIArgInfo getDefault() {
|
||||
return ABIArgInfo(Default);
|
||||
}
|
||||
|
|
|
@ -87,6 +87,9 @@ const CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
|
|||
return getFunctionInfo(ResTy, ArgTys);
|
||||
}
|
||||
|
||||
static ABIArgInfo getABIReturnInfo(QualType Ty, CodeGenTypes &CGT);
|
||||
static ABIArgInfo getABIArgumentInfo(QualType Ty, CodeGenTypes &CGT);
|
||||
|
||||
const CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
|
||||
const llvm::SmallVector<QualType, 16> &ArgTys) {
|
||||
// Lookup or create unique function info.
|
||||
|
@ -98,29 +101,21 @@ const CGFunctionInfo &CodeGenTypes::getFunctionInfo(QualType ResTy,
|
|||
if (FI)
|
||||
return *FI;
|
||||
|
||||
// Construct the function info.
|
||||
FI = new CGFunctionInfo(ResTy, ArgTys);
|
||||
FunctionInfos.InsertNode(FI, InsertPos);
|
||||
|
||||
// Compute ABI information.
|
||||
FI->getReturnInfo() = getABIReturnInfo(ResTy, *this);
|
||||
for (CGFunctionInfo::arg_iterator it = FI->arg_begin(), ie = FI->arg_end();
|
||||
it != ie; ++it)
|
||||
it->info = getABIArgumentInfo(it->type, *this);
|
||||
|
||||
return *FI;
|
||||
}
|
||||
|
||||
/***/
|
||||
|
||||
CGFunctionInfo::CGFunctionInfo(QualType ResTy,
|
||||
const llvm::SmallVector<QualType, 16> &ArgTys) {
|
||||
ArgTypes.push_back(ResTy);
|
||||
ArgTypes.insert(ArgTypes.end(), ArgTys.begin(), ArgTys.end());
|
||||
}
|
||||
|
||||
CGFunctionInfo::arg_iterator CGFunctionInfo::arg_begin() const {
|
||||
return ArgTypes.begin()+1;
|
||||
}
|
||||
|
||||
CGFunctionInfo::arg_iterator CGFunctionInfo::arg_end() const {
|
||||
return ArgTypes.end();
|
||||
}
|
||||
|
||||
/***/
|
||||
|
||||
ABIInfo::~ABIInfo() {}
|
||||
|
||||
/// isEmptyStruct - Return true iff a structure has no non-empty
|
||||
|
@ -721,6 +716,17 @@ static ABIArgInfo getABIArgumentInfo(QualType Ty, CodeGenTypes &CGT) {
|
|||
|
||||
/***/
|
||||
|
||||
CGFunctionInfo::CGFunctionInfo(QualType ResTy,
|
||||
const llvm::SmallVector<QualType, 16> &ArgTys) {
|
||||
NumArgs = ArgTys.size();
|
||||
Args = new ArgInfo[1 + NumArgs];
|
||||
Args[0].type = ResTy;
|
||||
for (unsigned i = 0; i < NumArgs; ++i)
|
||||
Args[1 + i].type = ArgTys[i];
|
||||
}
|
||||
|
||||
/***/
|
||||
|
||||
void CodeGenTypes::GetExpandedTypes(QualType Ty,
|
||||
std::vector<const llvm::Type*> &ArgTys) {
|
||||
const RecordType *RT = Ty->getAsStructureType();
|
||||
|
@ -846,7 +852,7 @@ static void CreateCoercedStore(llvm::Value *Src,
|
|||
uint64_t SrcSize = CGF.CGM.getTargetData().getTypePaddedSize(SrcTy);
|
||||
uint64_t DstSize = CGF.CGM.getTargetData().getTypePaddedSize(DstTy);
|
||||
|
||||
// If store is legal, just bitcase the src pointer.
|
||||
// If store is legal, just bitcast the src pointer.
|
||||
if (SrcSize == DstSize) {
|
||||
llvm::Value *Casted =
|
||||
CGF.Builder.CreateBitCast(DstPtr, llvm::PointerType::getUnqual(SrcTy));
|
||||
|
@ -907,10 +913,10 @@ CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool IsVariadic) {
|
|||
break;
|
||||
}
|
||||
|
||||
for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
|
||||
it != ie; ++it) {
|
||||
ABIArgInfo AI = getABIArgumentInfo(*it, *this);
|
||||
const llvm::Type *Ty = ConvertType(*it);
|
||||
for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
|
||||
ie = FI.arg_end(); it != ie; ++it) {
|
||||
const ABIArgInfo &AI = it->info;
|
||||
const llvm::Type *Ty = ConvertType(it->type);
|
||||
|
||||
switch (AI.getKind()) {
|
||||
case ABIArgInfo::Ignore:
|
||||
|
@ -931,7 +937,7 @@ CodeGenTypes::GetFunctionType(const CGFunctionInfo &FI, bool IsVariadic) {
|
|||
break;
|
||||
|
||||
case ABIArgInfo::Expand:
|
||||
GetExpandedTypes(*it, ArgTys);
|
||||
GetExpandedTypes(it->type, ArgTys);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -988,11 +994,11 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
|
|||
|
||||
if (RetAttrs)
|
||||
PAL.push_back(llvm::AttributeWithIndex::get(0, RetAttrs));
|
||||
for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
|
||||
it != ie; ++it) {
|
||||
QualType ParamType = *it;
|
||||
for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
|
||||
ie = FI.arg_end(); it != ie; ++it) {
|
||||
QualType ParamType = it->type;
|
||||
const ABIArgInfo &AI = it->info;
|
||||
unsigned Attributes = 0;
|
||||
ABIArgInfo AI = getABIArgumentInfo(ParamType, getTypes());
|
||||
|
||||
switch (AI.getKind()) {
|
||||
case ABIArgInfo::StructRet:
|
||||
|
|
|
@ -20,9 +20,13 @@
|
|||
|
||||
#include "CGValue.h"
|
||||
|
||||
// FIXME: Restructure so we don't have to expose so much stuff.
|
||||
#include "ABIInfo.h"
|
||||
|
||||
namespace llvm {
|
||||
class Function;
|
||||
struct AttributeWithIndex;
|
||||
class Function;
|
||||
class Type;
|
||||
class Value;
|
||||
|
||||
template<typename T, unsigned> class SmallVector;
|
||||
|
@ -51,21 +55,35 @@ namespace CodeGen {
|
|||
/// CGFunctionInfo - Class to encapsulate the information about a
|
||||
/// function definition.
|
||||
class CGFunctionInfo : public llvm::FoldingSetNode {
|
||||
llvm::SmallVector<QualType, 16> ArgTypes;
|
||||
struct ArgInfo {
|
||||
QualType type;
|
||||
ABIArgInfo info;
|
||||
};
|
||||
|
||||
unsigned NumArgs;
|
||||
ArgInfo *Args;
|
||||
|
||||
public:
|
||||
typedef llvm::SmallVector<QualType, 16>::const_iterator arg_iterator;
|
||||
typedef const ArgInfo *const_arg_iterator;
|
||||
typedef ArgInfo *arg_iterator;
|
||||
|
||||
CGFunctionInfo(QualType ResTy,
|
||||
const llvm::SmallVector<QualType, 16> &ArgTys);
|
||||
~CGFunctionInfo() { delete[] Args; }
|
||||
|
||||
arg_iterator arg_begin() const;
|
||||
arg_iterator arg_end() const;
|
||||
const_arg_iterator arg_begin() const { return Args + 1; }
|
||||
const_arg_iterator arg_end() const { return Args + 1 + NumArgs; }
|
||||
arg_iterator arg_begin() { return Args + 1; }
|
||||
arg_iterator arg_end() { return Args + 1 + NumArgs; }
|
||||
|
||||
QualType getReturnType() const { return ArgTypes[0]; }
|
||||
QualType getReturnType() const { return Args[0].type; }
|
||||
|
||||
ABIArgInfo &getReturnInfo() { return Args[0].info; }
|
||||
const ABIArgInfo &getReturnInfo() const { return Args[0].info; }
|
||||
|
||||
void Profile(llvm::FoldingSetNodeID &ID) {
|
||||
Profile(ID, getReturnType(), arg_begin(), arg_end());
|
||||
for (arg_iterator it = arg_begin(), ie = arg_end(); it != ie; ++it)
|
||||
it->type.Profile(ID);
|
||||
}
|
||||
template<class Iterator>
|
||||
static void Profile(llvm::FoldingSetNodeID &ID,
|
||||
|
|
Loading…
Reference in New Issue