glibc/ports
Chris Metcalf fedff58953 tile: support very large shared objects
With gcc 4.8 tilegx has support for -mcmodel=large, to tolerate very
large shared objects.  This option changes the compiler output to
not include direct jump instructions, which have a range of only
2^30, i.e +/- 512MB.  Instead the compiler marshalls the target PCs
into registers and then uses jump- or call-to-register instructions.

For glibc, the upshot is that we need to arrange for a few functions
to tolerate the possibility of a large range between the PC and
the target.  In particular, the crti.S and start.S code needs
to be able to reach from .init to the PLT, as does gmon-start.c.
The elf-init.c code has the reverse problem, needing to call from
libc_nonshared.a (linked at the end of shared objects) back to the
_init section at the beginning.

No other functions in *_nonshared.a need to be built this way, as
they only call the PLT (or potentially each other), but all of that
code is linked at the very end of the shared object.

We don't build the standard -static archives with this option as the
performance cost is high enough and the use case is rare enough that
it doesn't seem worthwhile.  Instead, we would encourage developers
who need the -static model with huge executables to build a private
copy of glibc and configure it with -mcmodel=large.

Note that libc.so et al don't need any changes; the only changes
are for code that is statically linked into user code built with
-mcmodel=large.

For the assembly code, I just rewrote it so that it unconditionally
uses the large model.  To be able to pass -mcmodel=large to
csu/elf-init.c and csu/gmon-start.c, I need to check to see if the
compiler supports that flag, since gcc 4.7 doesn't; I added the
support by creating a small Makefile fragment that just runs the
compiler to check.
2012-11-06 09:48:49 -05:00
..
sysdeps tile: support very large shared objects 2012-11-06 09:48:49 -05:00
ChangeLog Split my last ChangeLog entry into respective arch-specific files 2012-10-02 09:28:18 +05:30
ChangeLog.aix Move all files into ports/ subdirectory in preparation for merge with glibc 2012-07-01 13:06:41 +00:00
ChangeLog.alpha Make fma use of Dekker and Knuth algorithms use round-to-nearest (bug 14796). 2012-11-03 19:48:53 +00:00
ChangeLog.am33 Make fma use of Dekker and Knuth algorithms use round-to-nearest (bug 14796). 2012-11-03 19:48:53 +00:00
ChangeLog.arm Define lll_futex_timed_wait_bitset for ARM. 2012-11-05 22:30:37 +00:00
ChangeLog.cris Move all files into ports/ subdirectory in preparation for merge with glibc 2012-07-01 13:06:41 +00:00
ChangeLog.hppa Fix types of FE_DFL_ENV and FE_NOMASK_ENV (bug 14805). 2012-11-05 13:38:40 +00:00
ChangeLog.ia64 Make fma use of Dekker and Knuth algorithms use round-to-nearest (bug 14796). 2012-11-03 19:48:53 +00:00
ChangeLog.linux-generic [BZ #157] Remove include/stub-tag.h for good. 2012-11-04 19:59:40 +01:00
ChangeLog.m68k Make fma use of Dekker and Knuth algorithms use round-to-nearest (bug 14796). 2012-11-03 19:48:53 +00:00
ChangeLog.mips Define lll_futex_timed_wait_bitset for MIPS. 2012-11-05 22:30:54 +00:00
ChangeLog.powerpc Make fma use of Dekker and Knuth algorithms use round-to-nearest (bug 14796). 2012-11-03 19:48:53 +00:00
ChangeLog.tile tile: support very large shared objects 2012-11-06 09:48:49 -05:00
README Move all files into ports/ subdirectory in preparation for merge with glibc 2012-07-01 13:06:41 +00:00

This is the glibc ports repository, an add-on for the GNU C Library (glibc).
It contains code that is not maintained in the official glibc source tree.

This includes working ports to GNU/Linux on some machine architectures that
are not maintained in the official glibc source tree.  It also includes
some code once used by old libc ports now defunct, which has been abandoned
but may be useful for some future porter to examine.  It may also include
some optimized functions tailored for specific CPU implementations of an
architecture, to be selected using --with-cpu.

The ports repository is cooperatively maintained by volunteers on the
<libc-ports@sourceware.org> mailing list, and housed in a separate
ports git repository.  See
http://www.gnu.org/software/libc/download.html for details on using
git.  To report a bug in code housed in the ports repository, please
go to http://sources.redhat.com/bugzilla/ and file a bug report under
the glibc "ports" component.

An add-on for an individual port can be made from just the sysdeps/
subdirectories containing the port's code.  You may want to include a
README and Banner of your own talking about your port's code in particular,
rather than the generic ones here.

The real source code for any ports is found in the sysdeps/ subdirectories.
These should be exactly what would go into the main libc source tree if you
were to incorporate it directly.  The only exceptions are the files
sysdeps/*/preconfigure and sysdeps/*/preconfigure.in; these are fragments
used by this add-on's configure fragment.  The purpose of these is to set
$base_machine et al when the main libc configure's defaults are not right
for some machine.  Everything else can and should be done from a normal
sysdeps/.../configure fragment that is used only when the configuration
selects that sysdeps subdirectory.  Each port that requires some special
treatment before the sysdeps directory list is calculated, should add a
sysdeps/CPU/preconfigure file; this can either be written by hand or
generated by Autoconf from sysdeps/CPU/preconfigure.in, and follow the
rules for glibc add-on configure fragments.  No preconfigure file should do
anything on an unrelated configuration, so that disparate ports can be put
into a single add-on without interfering with each other.  Files that
would go in scripts/data/ for libc go in data/ in ports.

Like all glibc add-ons, this must be used by specifying the directory in
the --enable-add-ons option when running glibc's configure script.

The GNU C Library is free software.  See the file COPYING.LIB in the
libc repository for copying conditions, and LICENSES for notices about
a few contributions that require these additional notices to be
distributed.  License copyright years may be listed using range
notation, e.g., 2000-2011, indicating that every year in the range,
inclusive, is a copyrightable year that would otherwise be listed
individually.