https://bugs.llvm.org/show_bug.cgi?id=37807
Bug ID: 37807
Summary: -fsplit-stack problems with split -> nosplit call
Product: libraries
Version: trunk
Hardware: PC
OS: Linux
Status: NEW
Severity: normal
Priority: P
Component: Backend: X86
Assignee: unassignedb...@nondot.org
Reporter: th...@google.com
CC: llvm-bugs@lists.llvm.org
Created attachment 20429
--> https://bugs.llvm.org/attachment.cgi?id=20429&action=edit
tar file containing files to reproduce
Filing this bug on behalf of Cherry Zhang, who gets credit for discovering it.
This is a problem with -fsplit-stack support in LLVM, specifically in how calls
from split-stack code to non-split-stack code are handled. Let's say you have
sources a.c (containing function foo) and b.c (containing function bar), where
- a.c is compiled with -fsplit-stack, and
- b.c is compiled without -fsplit-stack, and
- foo calls bar
- a.o and b.o and linked together into the same load module
What is supposed to happen in this instance (as described in
https://gcc.gnu.org/wiki/SplitStacks) is that the linker picks up on the fact
that there is a "split to nonsplit" call from foo to bar, and during linking,
it fixes up the "check for more stack" sequence in foo to bump up the amount of
space (since 'bar' may use a lot of space).
What we're seeing with LLVM is that if "foo" has no stack frame at all, the
morestack check is omitted from the routine. This results in a linker assert
when linking a.o and b.o together.
I'm attaching a reproducer; unpack the tar file and do "make run" (uses clang
from $PATH):
$ make clean ; make run
rm -f *.o *.so main asm.txt
clang -c -O -fPIC -o main.o main.c
clang -c -fsplit-stack -O -fPIC -o m1.o m1.c
clang -c -O -fPIC -o m2.o m2.c
clang -O -fuse-ld=gold -fPIC -shared m1.o m2.o -o m1.so
/usr/bin/ld.gold: error: m1.o: failed to match split-stack sequence at section
2 offset 0
clang-7: error: linker command failed with exit code 1 (use -v to see
invocation)
makefile:19: recipe for target 'm1.so' failed
make: *** [m1.so] Error 1
Note that the linker error will not be triggered for older versions of clang
(prior to fix for https://bugs.llvm.org/show_bug.cgi?id=34670).
--
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs