[cfe-commits] r63615 - in /cfe/trunk/lib/CodeGen: ABIInfo.h CGCall.cpp
Daniel Dunbar
daniel at zuster.org
Mon Feb 2 22:17:38 PST 2009
Author: ddunbar
Date: Tue Feb 3 00:17:37 2009
New Revision: 63615
URL: http://llvm.org/viewvc/llvm-project?rev=63615&view=rev
Log:
Add ABIArgInfo::Direct kind, which passes arguments using whatever the
native IRgen type is. This is like Default, but without any extra
semantics (like automatic tweaking of structures or void).
Modified:
cfe/trunk/lib/CodeGen/ABIInfo.h
cfe/trunk/lib/CodeGen/CGCall.cpp
Modified: cfe/trunk/lib/CodeGen/ABIInfo.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ABIInfo.h?rev=63615&r1=63614&r2=63615&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/ABIInfo.h (original)
+++ cfe/trunk/lib/CodeGen/ABIInfo.h Tue Feb 3 00:17:37 2009
@@ -27,6 +27,10 @@
public:
enum Kind {
Default,
+
+ Direct, /// Pass the argument directly using the normal
+ /// converted LLVM type.
+
StructRet, /// Only valid for return values. The return value
/// should be passed through a pointer to a caller
/// allocated location passed as an implicit first
@@ -68,6 +72,9 @@
static ABIArgInfo getDefault() {
return ABIArgInfo(Default);
}
+ static ABIArgInfo getDirect() {
+ return ABIArgInfo(Direct);
+ }
static ABIArgInfo getStructRet() {
return ABIArgInfo(StructRet);
}
@@ -86,6 +93,7 @@
Kind getKind() const { return TheKind; }
bool isDefault() const { return TheKind == Default; }
+ bool isDirect() const { return TheKind == Direct; }
bool isStructRet() const { return TheKind == StructRet; }
bool isIgnore() const { return TheKind == Ignore; }
bool isCoerce() const { return TheKind == Coerce; }
Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=63615&r1=63614&r2=63615&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Tue Feb 3 00:17:37 2009
@@ -897,6 +897,10 @@
}
break;
+ case ABIArgInfo::Direct:
+ ResultType = ConvertType(RetTy);
+ break;
+
case ABIArgInfo::StructRet: {
ResultType = llvm::Type::VoidTy;
const llvm::Type *STy = ConvertType(RetTy);
@@ -933,6 +937,7 @@
break;
case ABIArgInfo::Default:
+ case ABIArgInfo::Direct:
ArgTys.push_back(Ty);
break;
@@ -967,6 +972,7 @@
const ABIArgInfo &RetAI = FI.getReturnInfo();
switch (RetAI.getKind()) {
case ABIArgInfo::Default:
+ case ABIArgInfo::Direct:
if (RetTy->isPromotableIntegerType()) {
if (RetTy->isSignedIntegerType()) {
RetAttrs |= llvm::Attribute::SExt;
@@ -1011,6 +1017,7 @@
break;
case ABIArgInfo::Default:
+ case ABIArgInfo::Direct:
if (ParamType->isPromotableIntegerType()) {
if (ParamType->isSignedIntegerType()) {
Attributes |= llvm::Attribute::SExt;
@@ -1068,7 +1075,8 @@
switch (ArgI.getKind()) {
case ABIArgInfo::ByVal:
- case ABIArgInfo::Default: {
+ case ABIArgInfo::Default:
+ case ABIArgInfo::Direct: {
assert(AI != Fn->arg_end() && "Argument mismatch!");
llvm::Value* V = AI;
if (!getContext().typesAreCompatible(Ty, Arg->getType())) {
@@ -1136,6 +1144,7 @@
break;
case ABIArgInfo::Default:
+ case ABIArgInfo::Direct:
RV = Builder.CreateLoad(ReturnValue);
break;
@@ -1178,6 +1187,7 @@
break;
case ABIArgInfo::Default:
+ case ABIArgInfo::Direct:
case ABIArgInfo::Ignore:
case ABIArgInfo::Coerce:
break;
@@ -1196,6 +1206,7 @@
switch (ArgInfo.getKind()) {
case ABIArgInfo::ByVal: // Default is byval
case ABIArgInfo::Default:
+ case ABIArgInfo::Direct:
if (RV.isScalar()) {
Args.push_back(RV.getScalarVal());
} else if (RV.isComplex()) {
@@ -1245,6 +1256,12 @@
case ABIArgInfo::Default:
return RValue::get(RetTy->isVoidType() ? 0 : CI);
+
+ case ABIArgInfo::Direct:
+ assert((!RetTy->isAnyComplexType() &&
+ CodeGenFunction::hasAggregateLLVMType(RetTy)) &&
+ "FIXME: Implemented return for non-scalar direct types.");
+ return RValue::get(CI);
case ABIArgInfo::Ignore:
if (RetTy->isVoidType())
More information about the cfe-commits
mailing list