[cfe-commits] r63610 - in /cfe/trunk/lib/CodeGen: ABIInfo.h CGCall.cpp CGCall.h
Daniel Dunbar
daniel at zuster.org
Mon Feb 2 21:31:23 PST 2009
Author: ddunbar
Date: Mon Feb 2 23:31:23 2009
New Revision: 63610
URL: http://llvm.org/viewvc/llvm-project?rev=63610&view=rev
Log:
Move ABIArgInfo into CGFunctionInfo, computed on creation.
- Still have to convert some consumers over.
Modified:
cfe/trunk/lib/CodeGen/ABIInfo.h
cfe/trunk/lib/CodeGen/CGCall.cpp
cfe/trunk/lib/CodeGen/CGCall.h
Modified: cfe/trunk/lib/CodeGen/ABIInfo.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ABIInfo.h?rev=63610&r1=63609&r2=63610&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/ABIInfo.h (original)
+++ cfe/trunk/lib/CodeGen/ABIInfo.h Mon Feb 2 23:31:23 2009
@@ -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 @@
TypeData(TD),
UIntData(0) {}
public:
+ ABIArgInfo() : TheKind(Default), TypeData(0), UIntData(0) {}
+
static ABIArgInfo getDefault() {
return ABIArgInfo(Default);
}
Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=63610&r1=63609&r2=63610&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Mon Feb 2 23:31:23 2009
@@ -87,6 +87,9 @@
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,25 +101,17 @@
if (FI)
return *FI;
+ // Construct the function info.
FI = new CGFunctionInfo(ResTy, ArgTys);
FunctionInfos.InsertNode(FI, InsertPos);
- return *FI;
-}
-/***/
+ // 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);
-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();
+ return *FI;
}
/***/
@@ -721,6 +716,17 @@
/***/
+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 @@
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 @@
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 @@
break;
case ABIArgInfo::Expand:
- GetExpandedTypes(*it, ArgTys);
+ GetExpandedTypes(it->type, ArgTys);
break;
}
}
@@ -988,11 +994,11 @@
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:
Modified: cfe/trunk/lib/CodeGen/CGCall.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.h?rev=63610&r1=63609&r2=63610&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.h (original)
+++ cfe/trunk/lib/CodeGen/CGCall.h Mon Feb 2 23:31:23 2009
@@ -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 @@
/// 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; }
+
+ 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; }
- arg_iterator arg_begin() const;
- arg_iterator arg_end() const;
+ QualType getReturnType() const { return Args[0].type; }
- QualType getReturnType() const { return ArgTypes[0]; }
+ 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,
More information about the cfe-commits
mailing list