Author: erichkeane Date: Mon Oct 7 10:28:03 2019 New Revision: 373929 URL: http://llvm.org/viewvc/llvm-project?rev=373929&view=rev Log: Fix Calling Convention through aliases
r369697 changed the behavior of stripPointerCasts to no longer include aliases. However, the code in CGDeclCXX.cpp's createAtExitStub counted on the looking through aliases to properly set the calling convention of a call. The result of the change was that the calling convention mismatch of the call would be replaced with a llvm.trap, causing a runtime crash. Differential Revision: https://reviews.llvm.org/D68584 Added: cfe/trunk/test/CodeGenCXX/call-conv-thru-alias.cpp (with props) Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Modified: cfe/trunk/lib/CodeGen/CGDeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDeclCXX.cpp?rev=373929&r1=373928&r2=373929&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGDeclCXX.cpp (original) +++ cfe/trunk/lib/CodeGen/CGDeclCXX.cpp Mon Oct 7 10:28:03 2019 @@ -248,8 +248,8 @@ llvm::Function *CodeGenFunction::createA llvm::CallInst *call = CGF.Builder.CreateCall(dtor, addr); // Make sure the call and the callee agree on calling convention. - if (llvm::Function *dtorFn = - dyn_cast<llvm::Function>(dtor.getCallee()->stripPointerCasts())) + if (auto *dtorFn = dyn_cast<llvm::Function>( + dtor.getCallee()->stripPointerCastsAndAliases())) call->setCallingConv(dtorFn->getCallingConv()); CGF.FinishFunction(); Added: cfe/trunk/test/CodeGenCXX/call-conv-thru-alias.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/call-conv-thru-alias.cpp?rev=373929&view=auto ============================================================================== --- cfe/trunk/test/CodeGenCXX/call-conv-thru-alias.cpp (added) +++ cfe/trunk/test/CodeGenCXX/call-conv-thru-alias.cpp Mon Oct 7 10:28:03 2019 @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -triple i686-windows-pc -emit-llvm -o - -mconstructor-aliases -O1 -disable-llvm-passes %s | FileCheck %s + +struct Base { virtual ~Base(); }; +struct Derived : Base { + virtual ~Derived(); + static Derived inst; +}; + +Base::~Base(){} +Derived::~Derived(){} +Derived Derived::inst; + +// CHECK: @"??1Derived@@UAE@XZ" = dso_local unnamed_addr alias void (%struct.Derived*), bitcast (void (%struct.Base*)* @"??1Base@@UAE@XZ" to void (%struct.Derived*)*) + +// CHECK: define dso_local x86_thiscallcc void @"??1Base@@UAE@XZ" +// CHECK: define internal void @"??__E?inst@Derived@@2U1@A@@YAXXZ" +// CHECK: call i32 @atexit(void ()* @"??__F?inst@Derived@@2U1@A@@YAXXZ" +// +// CHECK: define internal void @"??__F?inst@Derived@@2U1@A@@YAXXZ" +// CHECK-NEXT: entry: +// CHECK-NEXT: call x86_thiscallcc void @"??1Derived@@UAE@XZ" Propchange: cfe/trunk/test/CodeGenCXX/call-conv-thru-alias.cpp ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cfe/trunk/test/CodeGenCXX/call-conv-thru-alias.cpp ------------------------------------------------------------------------------ svn:keywords = Author Date Id Rev URL Propchange: cfe/trunk/test/CodeGenCXX/call-conv-thru-alias.cpp ------------------------------------------------------------------------------ svn:mime-type = text/plain _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits