Fix thunks returning memptrs via sret by emitting also scalar return values directly...
authorHans Wennborg <hans@hanshq.net>
Fri, 7 Dec 2018 08:17:26 +0000 (08:17 +0000)
committerHans Wennborg <hans@hanshq.net>
Fri, 7 Dec 2018 08:17:26 +0000 (08:17 +0000)
commit86aba5eeeee1048ccc5be60c76e35a1ed42d2fe6
tree53d8df5de8579ab85cad34de2eb34c3cf76044e4
parent25d505953a34b526d9985f2e631128069a9c22d7
Fix thunks returning memptrs via sret by emitting also scalar return values directly in sret slot (PR39901)

Thunks that return member pointers via sret are broken due to using temporary
storage for the return value on the stack and then passing that pointer to a
tail call, violating the rule that a tail call can't access allocas in the
caller (see bug).

Since r90526, we put aggregate return values directly in the sret slot, but
this doesn't apply to member pointers which are considered scalar.

Unless I'm missing something subtle, we should be able to always use the sret
slot directly for indirect return values.

Differential revision: https://reviews.llvm.org/D55371

llvm-svn: 348569
clang/lib/CodeGen/CGVTables.cpp
clang/lib/CodeGen/CodeGenFunction.cpp
clang/test/CodeGenCXX/thunk-returning-memptr.cpp [new file with mode: 0644]