aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Object/MachOObjectFile.cpp
diff options
context:
space:
mode:
authorAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>2015-06-02 19:34:40 +0000
committerAndrea Di Biagio <Andrea_DiBiagio@sn.scee.net>2015-06-02 19:34:40 +0000
commite7347c67cdb20f0f7af27d9e9fe97121b78d8727 (patch)
tree9876d25df6df771b42099701d1877c697ca362a9 /llvm/lib/Object/MachOObjectFile.cpp
parent17701b592972e1d2add9f9a6549efa8b2952eec7 (diff)
downloadllvm-e7347c67cdb20f0f7af27d9e9fe97121b78d8727.zip
llvm-e7347c67cdb20f0f7af27d9e9fe97121b78d8727.tar.gz
llvm-e7347c67cdb20f0f7af27d9e9fe97121b78d8727.tar.bz2
[x86-64 ABI] Fix for PR23082: an assertion failure when passing/returning a wrapper union in a full YMM register.
This patch fixes an assertion failure in method 'X86_64ABIInfo::GetByteVectorType'. Method 'GetByteVectorType' (in TargetInfo.cpp) is responsible for mapping a QualType 'Ty' (for an argument or return value) to an LLVM IR type that, according to the ABI, must be passed in a XMM/YMM vector register. When selecting the IR vector type, method 'GetByteVectorType' always tries to choose the "best" IR vector type for the 'Ty' in input. In particular, if Ty is a wrapper structure, it keeps unwrapping it until it finds a vector type VTy. That VTy is the "preferred IR type". However, function 'isSingleElementStructure' (used to unwrap structures) does not know how to look through union types. So, before this patch, if Ty was in a nest of wrapper structures with at least two union types, we would have triggered an assertion failure (added at revision 230971). With this patch, if method 'GetByteVectorType' fails to find the preferred vector type, we just return a valid (although potentially 'less friendly') vector type based on the type size. So, rather than asserting on an 'unexpected' 'Ty' in input, we conservatively return vector type <2 x double> if Ty is 16 bytes, or <4 x double> if Ty is 32 bytes. Differential Revision: http://reviews.llvm.org/D10190 llvm-svn: 238861
Diffstat (limited to 'llvm/lib/Object/MachOObjectFile.cpp')
0 files changed, 0 insertions, 0 deletions