svn commit: r262809 - head/contrib/llvm/tools/clang/lib/CodeGen
Dimitry Andric
dim at FreeBSD.org
Wed Mar 5 22:43:31 UTC 2014
Author: dim
Date: Wed Mar 5 22:43:30 2014
New Revision: 262809
URL: http://svnweb.freebsd.org/changeset/base/262809
Log:
Pull in r203007 from upstream clang trunk:
Don't produce an alias between destructors with different calling conventions.
Fixes pr19007.
(Please note that is an LLVM PR identifier, not a FreeBSD one.)
This should fix Firefox and/or libxul crashes (due to problems with
regparm/stdcall calling conventions) on i386.
Reported by: multiple users on freebsd-current
PR: bin/187103
MFC after: 1 week
Modified:
head/contrib/llvm/tools/clang/lib/CodeGen/CGCXX.cpp
Modified: head/contrib/llvm/tools/clang/lib/CodeGen/CGCXX.cpp
==============================================================================
--- head/contrib/llvm/tools/clang/lib/CodeGen/CGCXX.cpp Wed Mar 5 22:04:30 2014 (r262808)
+++ head/contrib/llvm/tools/clang/lib/CodeGen/CGCXX.cpp Wed Mar 5 22:43:30 2014 (r262809)
@@ -92,7 +92,13 @@ bool CodeGenModule::TryEmitBaseDestructo
if (!ClassLayout.getBaseClassOffset(UniqueBase).isZero())
return true;
+ // Give up if the calling conventions don't match. We could update the call,
+ // but it is probably not worth it.
const CXXDestructorDecl *BaseD = UniqueBase->getDestructor();
+ if (BaseD->getType()->getAs<FunctionType>()->getCallConv() !=
+ D->getType()->getAs<FunctionType>()->getCallConv())
+ return true;
+
return TryEmitDefinitionAsAlias(GlobalDecl(D, Dtor_Base),
GlobalDecl(BaseD, Dtor_Base),
false);
More information about the svn-src-all
mailing list