This is the mail archive of the
cygwin
mailing list for the Cygwin project.
Clang is using the wrong memory model
Cygwin Clang is using -mcmodel=medium as default for Win64, according to
my tests, while the right model is -mcmodel=small
Linux Clang with --target=x86_64-pc-cygwin gives the small memory model.
I took this to the LLVM Bugzilla as you asked me to:
https://bugs.llvm.org/show_bug.cgi?id=42983
This gave the following conclusion:
-mcmodel=small does something different when the target is Windows. This
difference appears to be undocumented. The small memory model with a
Linux target puts everything below the 2GB limit so that 32-bit absolute
addresses can be used. The small memory model with a Windows target is
using 32-bit relative addresses instead, which is the correct thing to
do in Windows.
I told the LLVM guy that this difference needs to be documented so that
you can rely on it, but this request has so far been ignored.
He says that you must have modified the source code to change the
default memory model.
The medium memory model gives inefficient code because it uses an extra
instruction to load a 64-bit absolute address into a register before
every access to static data.
I cannot blame you Cygwin people for not using the small memory model as
long as it is undocumented.
I will ask you to please join the discussion at
https://bugs.llvm.org/show_bug.cgi?id=42983 so that we can clarify how
to solve this problem.
On 14/08/2019 07.51, Agner Fog wrote:
It's a difference in memory model.
clang 6.0.0 under ubuntu with --target=x86_64-pc-cygwin gives relative
addresses, unless you specify -mcmodel=large.
Cygwin clang with -mcmodel=small does the right thing: use relative
addresses.
The -mcmodel=small option appears to work differently for Linux and
for Windows targets. I cannot find any documentation of this
difference. See:
https://bugs.llvm.org/show_bug.cgi?id=42983
On 12/08/2019 11.45, falk.tannhauser@free.fr wrote:
References: <578eb489-9391-9009-82ad-676eeb4c1c92@agner.org>
In-Reply-To: <578eb489-9391-9009-82ad-676eeb4c1c92@agner.org>
Could the different behaviour between Cygwin and Linux simply be due
to different Clang versions?
The current version under Cygwin is 5.0.1, while the latest version
available under Linux
appears to be 8.0.1 .
Falk
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple