diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp
index 8b7400a..8f6bde4 100644
--- a/lib/CodeGen/CGCall.cpp
+++ b/lib/CodeGen/CGCall.cpp
@@ -23,53 +23,6 @@
 
 /***/
 
-static void 
-constructParamAttrListInternal(const Decl *TargetDecl,
-                               const llvm::SmallVector<QualType, 16> &ArgTypes,
-                               ParamAttrListType &PAL) {
-  unsigned FuncAttrs = 0;
-
-  if (TargetDecl) {
-    if (TargetDecl->getAttr<NoThrowAttr>())
-      FuncAttrs |= llvm::ParamAttr::NoUnwind;
-    if (TargetDecl->getAttr<NoReturnAttr>())
-      FuncAttrs |= llvm::ParamAttr::NoReturn;
-  }
-
-  unsigned Index = 1;
-  if (CodeGenFunction::hasAggregateLLVMType(ArgTypes[0])) {
-    PAL.push_back(llvm::ParamAttrsWithIndex::get(Index, 
-                                                 llvm::ParamAttr::StructRet));
-    ++Index;
-  } else if (ArgTypes[0]->isPromotableIntegerType()) {
-    if (ArgTypes[0]->isSignedIntegerType()) {
-      FuncAttrs |= llvm::ParamAttr::SExt;
-    } else if (ArgTypes[0]->isUnsignedIntegerType()) {
-      FuncAttrs |= llvm::ParamAttr::ZExt;
-    }
-  }
-  if (FuncAttrs)
-    PAL.push_back(llvm::ParamAttrsWithIndex::get(0, FuncAttrs));
-  for (llvm::SmallVector<QualType, 8>::const_iterator i = ArgTypes.begin() + 1,
-         e = ArgTypes.end(); i != e; ++i, ++Index) {
-    QualType ParamType = *i;
-    unsigned ParamAttrs = 0;
-    if (ParamType->isRecordType())
-      ParamAttrs |= llvm::ParamAttr::ByVal;
-    if (ParamType->isPromotableIntegerType()) {
-      if (ParamType->isSignedIntegerType()) {
-        ParamAttrs |= llvm::ParamAttr::SExt;
-      } else if (ParamType->isUnsignedIntegerType()) {
-        ParamAttrs |= llvm::ParamAttr::ZExt;
-      }
-    }
-    if (ParamAttrs)
-      PAL.push_back(llvm::ParamAttrsWithIndex::get(Index, ParamAttrs));
-  }
-}
-
-/***/
-
 // FIXME: Use iterator and sidestep silly type array creation.
 
 CGFunctionInfo::CGFunctionInfo(const FunctionDecl *FD)
@@ -96,23 +49,28 @@
     ArgTypes.push_back((*i)->getType());
 }
 
-void CGFunctionInfo::constructParamAttrList(ParamAttrListType &PAL) const {
-  constructParamAttrListInternal(TheDecl, ArgTypes, PAL);
+ArgTypeIterator CGFunctionInfo::argtypes_begin() const {
+  return ArgTypes.begin();
+}
+
+ArgTypeIterator CGFunctionInfo::argtypes_end() const {
+  return ArgTypes.end();
 }
 
 /***/
 
-CGCallInfo::CGCallInfo(QualType _ResultType, const CallArgList &_Args)
-  : ResultType(_ResultType),
-    Args(_Args) {
-  ArgTypes.push_back(ResultType);
-  for (CallArgList::const_iterator i = Args.begin(), e = Args.end(); i!=e; ++i)
+CGCallInfo::CGCallInfo(QualType _ResultType, const CallArgList &_Args) {
+  ArgTypes.push_back(_ResultType);
+  for (CallArgList::const_iterator i = _Args.begin(), e = _Args.end(); i!=e; ++i)
     ArgTypes.push_back(i->second);
 }
 
-void CGCallInfo::constructParamAttrList(ParamAttrListType &PAL) const {
-  // FIXME: Provide TargetDecl so nounwind, noreturn, etc, etc get set.
-  constructParamAttrListInternal(0, ArgTypes, PAL);
+ArgTypeIterator CGCallInfo::argtypes_begin() const {
+  return ArgTypes.begin();
+}
+
+ArgTypeIterator CGCallInfo::argtypes_end() const {
+  return ArgTypes.end();
 }
 
 /***/
@@ -121,6 +79,51 @@
   return hasAggregateLLVMType(RetTy);
 }
 
+void CodeGenFunction::ConstructParamAttrList(const Decl *TargetDecl,
+                                             ArgTypeIterator begin,
+                                             ArgTypeIterator end,
+                                             ParamAttrListType &PAL) {
+  unsigned FuncAttrs = 0;
+
+  if (TargetDecl) {
+    if (TargetDecl->getAttr<NoThrowAttr>())
+      FuncAttrs |= llvm::ParamAttr::NoUnwind;
+    if (TargetDecl->getAttr<NoReturnAttr>())
+      FuncAttrs |= llvm::ParamAttr::NoReturn;
+  }
+
+  QualType ResTy = *begin;
+  unsigned Index = 1;
+  if (CodeGenFunction::hasAggregateLLVMType(ResTy)) {
+    PAL.push_back(llvm::ParamAttrsWithIndex::get(Index, 
+                                                 llvm::ParamAttr::StructRet));
+    ++Index;
+  } else if (ResTy->isPromotableIntegerType()) {
+    if (ResTy->isSignedIntegerType()) {
+      FuncAttrs |= llvm::ParamAttr::SExt;
+    } else if (ResTy->isUnsignedIntegerType()) {
+      FuncAttrs |= llvm::ParamAttr::ZExt;
+    }
+  }
+  if (FuncAttrs)
+    PAL.push_back(llvm::ParamAttrsWithIndex::get(0, FuncAttrs));
+  for (++begin; begin != end; ++begin, ++Index) {
+    QualType ParamType = *begin;
+    unsigned ParamAttrs = 0;
+    if (ParamType->isRecordType())
+      ParamAttrs |= llvm::ParamAttr::ByVal;
+    if (ParamType->isPromotableIntegerType()) {
+      if (ParamType->isSignedIntegerType()) {
+        ParamAttrs |= llvm::ParamAttr::SExt;
+      } else if (ParamType->isUnsignedIntegerType()) {
+        ParamAttrs |= llvm::ParamAttr::ZExt;
+      }
+    }
+    if (ParamAttrs)
+      PAL.push_back(llvm::ParamAttrsWithIndex::get(Index, ParamAttrs));
+  }
+}
+
 void CodeGenFunction::EmitFunctionProlog(llvm::Function *Fn,
                                          QualType RetTy, 
                                          const FunctionArgList &Args) {
@@ -198,8 +201,10 @@
   llvm::CallInst *CI = Builder.CreateCall(Callee,&Args[0],&Args[0]+Args.size());
   CGCallInfo CallInfo(ResultType, CallArgs);
 
+  // FIXME: Provide TargetDecl so nounwind, noreturn, etc, etc get set.
   CodeGen::ParamAttrListType ParamAttrList;
-  CallInfo.constructParamAttrList(ParamAttrList);
+  ConstructParamAttrList(0, CallInfo.argtypes_begin(), CallInfo.argtypes_end(),
+                         ParamAttrList);
   CI->setParamAttrs(llvm::PAListPtr::get(ParamAttrList.begin(), 
                                          ParamAttrList.size()));  
 
diff --git a/lib/CodeGen/CGCall.h b/lib/CodeGen/CGCall.h
index efeb6ee..c51c1d0 100644
--- a/lib/CodeGen/CGCall.h
+++ b/lib/CodeGen/CGCall.h
@@ -46,6 +46,10 @@
   /// ParmVarDecl or ImplicitParamDecl.
   typedef llvm::SmallVector<std::pair<const VarDecl*, QualType>, 
                             16> FunctionArgList;
+  
+  // FIXME: This should be a better iterator type so that we can avoid
+  // construction of the ArgTypes smallvectors.
+  typedef llvm::SmallVector<QualType, 16>::const_iterator ArgTypeIterator;
 
   /// CGFunctionInfo - Class to encapsulate the information about a
   /// function definition.
@@ -63,21 +67,20 @@
 
     const Decl* getDecl() const { return TheDecl; }
 
-    void constructParamAttrList(ParamAttrListType &Args) const;
+    ArgTypeIterator argtypes_begin() const;
+    ArgTypeIterator argtypes_end() const;
   };
 
   /// CGCallInfo - Class to encapsulate the arguments and clang types
   /// used in a call.
   class CGCallInfo {
-    QualType ResultType;
-    const CallArgList &Args;
-
     llvm::SmallVector<QualType, 16> ArgTypes;
 
   public:
     CGCallInfo(QualType _ResultType, const CallArgList &Args);
-    
-    void constructParamAttrList(ParamAttrListType &Args) const;
+
+    ArgTypeIterator argtypes_begin() const;
+    ArgTypeIterator argtypes_end() const;
   };
 }  // end namespace CodeGen
 }  // end namespace clang
diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h
index f5eba15..ef7009c 100644
--- a/lib/CodeGen/CodeGenFunction.h
+++ b/lib/CodeGen/CodeGenFunction.h
@@ -140,7 +140,12 @@
 
   /// ReturnTypeUsesSret - Return true iff the given type uses 'sret'
   /// when used as a return type.
-  bool ReturnTypeUsesSret(QualType RetTy);
+  static bool ReturnTypeUsesSret(QualType RetTy);
+
+  static void ConstructParamAttrList(const Decl *TargetDecl,
+                                     const ArgTypeIterator begin,
+                                     const ArgTypeIterator end,
+                                     ParamAttrListType &PAL);
 
   /// EmitFunctionProlog - Emit the target specific LLVM code to load
   /// the arguments for the given function. This is also responsible
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 8f7ae2e..9f7b977 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -214,7 +214,10 @@
 
 static void SetFunctionParamAttrs(const CGFunctionInfo &Info, llvm::Function *F) {
   ParamAttrListType ParamAttrList;
-  Info.constructParamAttrList(ParamAttrList);
+  CodeGenFunction::ConstructParamAttrList(Info.getDecl(),
+                                          Info.argtypes_begin(), 
+                                          Info.argtypes_end(),
+                                          ParamAttrList);
 
   F->setParamAttrs(llvm::PAListPtr::get(ParamAttrList.begin(),
                                         ParamAttrList.size()));
