summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGCall.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-07-01 06:20:47 +0000
committerChris Lattner <sabre@nondot.org>2010-07-01 06:20:47 +0000
commit0e7929f30ca08d09c181552176b31178dda6ce47 (patch)
tree96f0fc1d4bfb5824af6ca0a6c69fecf773941ae8 /clang/lib/CodeGen/CGCall.cpp
parent79046273dd4cbab529bebbefa53b6f8212683b33 (diff)
downloadbcm5719-llvm-0e7929f30ca08d09c181552176b31178dda6ce47.tar.gz
bcm5719-llvm-0e7929f30ca08d09c181552176b31178dda6ce47.zip
fix rdar://8147692 - yet another crash due to my abi work.
llvm-svn: 107387
Diffstat (limited to 'clang/lib/CodeGen/CGCall.cpp')
-rw-r--r--clang/lib/CodeGen/CGCall.cpp23
1 files changed, 16 insertions, 7 deletions
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index 29104424acb..c0c2a472071 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/lib/CodeGen/CGCall.cpp
@@ -251,18 +251,27 @@ const CGFunctionInfo &CodeGenTypes::getFunctionInfo(CanQualType ResTy,
// If this is being called from the guts of the ConvertType loop, make sure
// to call ConvertTypeRecursive so we don't get into issues with cyclic
// pointer type structures.
- const llvm::Type *ArgType;
- if (IsRecursive)
- ArgType = ConvertTypeRecursive(*I);
- else
- ArgType = ConvertType(*I);
- PreferredArgTypes.push_back(ArgType);
+ PreferredArgTypes.push_back(ConvertTypeRecursive(*I));
}
-
+
// Compute ABI information.
getABIInfo().computeInfo(*FI, getContext(), TheModule.getContext(),
PreferredArgTypes.data(), PreferredArgTypes.size());
+ // If this is a top-level call and ConvertTypeRecursive hit unresolved pointer
+ // types, resolve them now. These pointers may point to this function, which
+ // we *just* filled in the FunctionInfo for.
+ if (!IsRecursive && !PointersToResolve.empty()) {
+ // Use PATypeHolder's so that our preferred types don't dangle under
+ // refinement.
+ llvm::SmallVector<llvm::PATypeHolder, 8> Handles(PreferredArgTypes.begin(),
+ PreferredArgTypes.end());
+ HandleLateResolvedPointers();
+ PreferredArgTypes.clear();
+ PreferredArgTypes.append(Handles.begin(), Handles.end());
+ }
+
+
return *FI;
}
OpenPOWER on IntegriCloud