summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/TargetInfo.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2011-12-01 04:53:19 +0000
committerEli Friedman <eli.friedman@gmail.com>2011-12-01 04:53:19 +0000
commitf37bd2f2f1dbea7328d4faacd8040399913f44c1 (patch)
tree1b79f69ccce03dcf07f1c1d599815bccfb64526b /clang/lib/CodeGen/TargetInfo.cpp
parentd61887dd0a2b20dd7a013b0fe2c195266407cedb (diff)
downloadbcm5719-llvm-f37bd2f2f1dbea7328d4faacd8040399913f44c1.tar.gz
bcm5719-llvm-f37bd2f2f1dbea7328d4faacd8040399913f44c1.zip
Don't use a varargs convention for calls unprototyped functions where one of the arguments is an AVX vector.
llvm-svn: 145574
Diffstat (limited to 'clang/lib/CodeGen/TargetInfo.cpp')
-rw-r--r--clang/lib/CodeGen/TargetInfo.cpp29
1 files changed, 24 insertions, 5 deletions
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp
index 944eae85d51..77c4c9b07ed 100644
--- a/clang/lib/CodeGen/TargetInfo.cpp
+++ b/clang/lib/CodeGen/TargetInfo.cpp
@@ -98,7 +98,8 @@ unsigned TargetCodeGenInfo::getSizeOfUnwindException() const {
return 32;
}
-bool TargetCodeGenInfo::isNoProtoCallVariadic(CallingConv CC) const {
+bool TargetCodeGenInfo::isNoProtoCallVariadic(
+ const CodeGen::CGFunctionInfo &) const {
// The following conventions are known to require this to be false:
// x86_stdcall
// MIPS
@@ -978,13 +979,31 @@ public:
return X86AdjustInlineAsmType(CGF, Constraint, Ty);
}
- bool isNoProtoCallVariadic(CallingConv CC) const {
+ bool isNoProtoCallVariadic(const CodeGen::CGFunctionInfo &FI) const {
// The default CC on x86-64 sets %al to the number of SSA
// registers used, and GCC sets this when calling an unprototyped
- // function, so we override the default behavior.
- if (CC == CC_Default || CC == CC_C) return true;
+ // function, so we override the default behavior. However, don't do
+ // that when AVX types are involved.
+ if (FI.getCallingConvention() == llvm::CallingConv::C) {
+ bool HasAVXType = false;
+ for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
+ ie = FI.arg_end();
+ it != ie; ++it) {
+ if (it->info.isDirect()) {
+ llvm::Type *Ty = it->info.getCoerceToType();
+ if (llvm::VectorType *VTy = dyn_cast_or_null<llvm::VectorType>(Ty)) {
+ if (VTy->getBitWidth() > 128) {
+ HasAVXType = true;
+ break;
+ }
+ }
+ }
+ }
+ if (!HasAVXType)
+ return true;
+ }
- return TargetCodeGenInfo::isNoProtoCallVariadic(CC);
+ return TargetCodeGenInfo::isNoProtoCallVariadic(FI);
}
};
OpenPOWER on IntegriCloud