]> granicus.if.org Git - clang/commitdiff
Speedup ClangToLLVMArgMapping construction. NFC.
authorAlexey Samsonov <vonosmas@gmail.com>
Mon, 29 Sep 2014 20:30:22 +0000 (20:30 +0000)
committerAlexey Samsonov <vonosmas@gmail.com>
Mon, 29 Sep 2014 20:30:22 +0000 (20:30 +0000)
Add a method to calculate the number of arguments given QualType
expnads to. Use this method in ClangToLLVMArgMapping calculation.
This number may be cached in CodeGenTypes for efficiency, if needed.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218623 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCall.cpp

index 5f22d3929f746b08337625c656831e6308fbe8d7..e4da4e1411345bde8f70b15b9100e0525cf93e8c 100644 (file)
@@ -612,6 +612,23 @@ getTypeExpansion(QualType Ty, const ASTContext &Context) {
   return llvm::make_unique<NoExpansion>();
 }
 
+static int getExpansionSize(QualType Ty, const ASTContext &Context) {
+  auto Exp = getTypeExpansion(Ty, Context);
+  if (auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
+    return CAExp->NumElts * getExpansionSize(CAExp->EltTy, Context);
+  }
+  if (auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
+    int Res = 0;
+    for (auto FD : RExp->Fields)
+      Res += getExpansionSize(FD->getType(), Context);
+    return Res;
+  }
+  if (isa<ComplexExpansion>(Exp.get()))
+    return 2;
+  assert(isa<NoExpansion>(Exp.get()));
+  return 1;
+}
+
 void CodeGenTypes::GetExpandedTypes(QualType type,
                      SmallVectorImpl<llvm::Type*> &expandedTypes) {
   auto Exp = getTypeExpansion(type, Context);
@@ -1222,12 +1239,7 @@ void ClangToLLVMArgMapping::construct(CodeGenModule &CGM,
       IRArgs.NumberOfArgs = 0;
       break;
     case ABIArgInfo::Expand: {
-      SmallVector<llvm::Type*, 8> Types;
-      // FIXME: This is rather inefficient. Do we ever actually need to do
-      // anything here? The result should be just reconstructed on the other
-      // side, so extension should be a non-issue.
-      CGM.getTypes().GetExpandedTypes(ArgType, Types);
-      IRArgs.NumberOfArgs = Types.size();
+      IRArgs.NumberOfArgs = getExpansionSize(ArgType, CGM.getContext());
       break;
     }
     }