diff options
author | Chris Lattner <sabre@nondot.org> | 2010-07-01 06:20:47 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-07-01 06:20:47 +0000 |
commit | 0e7929f30ca08d09c181552176b31178dda6ce47 (patch) | |
tree | 96f0fc1d4bfb5824af6ca0a6c69fecf773941ae8 /clang/lib/CodeGen/CGCall.cpp | |
parent | 79046273dd4cbab529bebbefa53b6f8212683b33 (diff) | |
download | bcm5719-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.cpp | 23 |
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; } |