Commit Graph

27 Commits

Author SHA1 Message Date
pfg
9c8bbe6849 gcc: Add support for Apple's Block extension
Block objects [1] are a C-level syntactic and runtime feature. They
are similar to standard C functions, but in addition to executable
code they may also contain variable bindings to automatic (stack)
or managed (heap) memory. A block can therefore maintain a set of
state (data) that it can use to impact behavior when executed.

This port is based on Apple's GCC 5646 with some bugfixes from
Apple GCC 5666.3. It has some small differences with the support
in clang, which remains the recommended compiler.

Perhaps the most notable difference is that in GCC that __block
is not actually a keyword, but a macro. There will be workaround
for this issue in a near future. Other issues can be consulted in
the clang documentation [2]

For better compatiblity with Apple's GCC and llvm-gcc some related
fixes and features from Apple have been included. Support for the
non-standard nested functions in GCC is now off by default.

No effort was made to update the ObjC support since FreeBSD doesn't
carry ObjC in the base system, but some of the code crept in and
was more difficult to remove than to adjust.

Reference:
[1]
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html
[2]
http://clang.llvm.org/compatibility.html#block-variable-initialization

Obtained from:	Apple GCC 4.2
MFC after:	3 weeks
2014-01-05 00:43:28 +00:00
benl
383b306f0a Fix clang warnings.
Approved by:	philip (mentor)
2011-05-22 22:17:06 +00:00
kan
e2c3cc81d7 Update locally changed files to GCC 4.2.1.
Approved by: re (kensmith)
2007-08-14 03:04:42 +00:00
kan
bc51ca6502 Merge local changes for -mprofiler-epilogue support. 2007-05-19 02:18:38 +00:00
bde
09347a415f Fixed -mprofiler-epilogue. The garbage collector apparently doesn't
understand that non-local variables can never be collected, and when
it collected the static variable for mexitcount_libfunc, gcc aborted
on the next use of this variable.

This quick fix is to reinitialize the variable on every use and depend
on garbage collection recovering the small amount of memory wasted by
this, and not worry by the small amount of time wasted by this.  It
would be better to initialize the variable together with most of the
other libfuncs in optabs.c and depend on whatever magic is there to
prevent its collection, but we initialize it here to avoid taking at
least 2 more files off the vendor branch.
2006-10-25 07:29:22 +00:00
kan
17d0aa6eb2 Merge conflicts for GCC 3.4.4. 2005-06-03 04:02:20 +00:00
kan
49c6fea32a Merge FreeBSD changes into GCC 3.4.2-prerelease.
1.19	Fix -mprofiler-epilogue on i386.
2004-07-28 04:01:01 +00:00
bde
4c0ab24ab7 Quick fix for breakage of non-i386 arches in previous commit. Only
use TARGET_PROFILER_EPILOGUE if it is defined.
2004-01-06 10:38:48 +00:00
kan
3b9942df2e Fix -mprofiler-epilogue on i386. This should be extended to other
architectures in future.

Submitted by:	bde
2004-01-05 22:23:27 +00:00
kan
a084c35ceb No FreeBSD-local changes in these files. 2003-11-07 03:05:29 +00:00
kan
4e7ac24200 FreeBSD uses stock versions of these GCC files. 2003-07-11 04:00:23 +00:00
kan
bb9b382fea Update HEAD with stock GCC 3.2.2 release files. 2003-02-10 05:57:03 +00:00
obrien
1babcc37ec Update HEAD with FSF branch 3.2.1 release files. 2002-12-04 16:35:55 +00:00
obrien
d3c00e65a3 Use pure stock files. 2002-12-04 16:31:48 +00:00
obrien
fa7971ab70 Remove our custom mixed ELF/a.out support. This means the base compiler
now only produce ELF objects.  It also makes us closer to stock GCC, and
simplifies the set of changes we still need from stock GCC on every import.

Applauded by:	peter
Approved by:	re
2002-11-26 18:25:20 +00:00
kan
1685710455 Merge FreeBSD modifications into gcc 3.2.1-prerelease:
1.2 a.out support

Approved by:	obrien
2002-09-01 21:02:41 +00:00
obrien
b7d19d3348 Merge rev 1.2 (a.out support) into the GCC 3.1 prerelease. 2002-05-09 21:44:15 +00:00
obrien
47aa5e488c Merge rev 1.2 (a.out support) into GCC 3.1-snap. 2002-02-01 19:42:45 +00:00
obrien
b545fa1c7f Merge gcc-2.95.3-test3 changes onto mainline. Bump FreeBSD cc version. 2001-02-17 08:35:00 +00:00
obrien
b2d68729b2 Merge gcc.2.95.3-test1 changes onto mainline 2001-01-03 17:17:01 +00:00
obrien
797ccd6333 Fix conflicts. 2000-05-27 02:43:50 +00:00
obrien
929a892c18 Merge rev 1.2 (a.out support) into GCC 2.95.2. 1999-11-01 18:56:02 +00:00
obrien
be3662861f Merge rev 1.2 (a.out support) into GCC 2.95.1. 1999-10-26 08:53:03 +00:00
obrien
fcdace9ad8 Grrrrr. Put the $FreeBSD$ in a Bad Place. 1999-10-15 21:49:40 +00:00
obrien
eab3fcc626 Merge rev 1.2 (a.out support) into EGCS 1.1.2. 1999-10-15 20:48:35 +00:00
peter
c39aed21a8 First round of changes to support generation of assembler for the old
a.out gas and the binutils gas (elf or a.out) with a single compiler.

This uses other infrastructure not yet committed, in order to support
both a.out and elf it needs to be able to get to both a.out and elf
gas, ld, libs, crt* etc.  So for now, the support is pretty much dormant.

The new freebsd.h file is based on the old freebsd-elf.h file (which has a
long lineage, right back through linux and svr4 files).  The change is
pretty dramatic from a gcc internals standpoint as it overrides a lot of
definitions in order to generate different output based on target mode.
There is potential for screw-ups, so please be on the lookout - gcc's
configuration mechanism wasn't really meant for this kind of thing.
It's believed to compile world etc just fine under both a.out and elf, can
handle global constructors and destructors, handles the differences in
a.out and elf stabs, and what sections things like exceptions go in.

The initial idea came from i386/osfrose.h which is a dual rose/elf format
target.  These two are not as diverse as a.out and elf it would seem.

The cc front-end uses external configuration to determine default object
format (still being thrashed out, so read the source if you want to see
it so far), and has a '-aout' and '-elf' override command line switch.
There are some other internal switches that can be accessed, namely -maout,
-mno-aout, -munderscores and -mnounderscores.  The underscore and local
symbol prefixing rules are controllable seperately to the output format.
(ie: it's possible to generate a.out without the _ prefixes on symbols and
also to generate elf with the _ prefixes.  This isn't quite optimal, but
does seem to work pretty well, except the linkers don't always recognise
the local symbols without their normal names)

The default format is a.out (still), nobody should see any major changes.

With both elf and a.out tools and libraries installed:

[1:26pm]/tmp-223> cc -elf -o hello hello.c
peter@beast[1:27pm]/tmp-224> file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked, not stripped
[1:27pm]/tmp-225> ./hello
hello world!

[1:27pm]/tmp-226> cc -aout -o hello hello.c
[1:27pm]/tmp-227> file hello
hello: FreeBSD/i386 compact demand paged dynamically linked executable not stripped
1:27pm]/tmp-228> ./hello
hello world!

Since my co-conspirators put a lot of effort into this too, I'll add them
so they can share the blame^H^H^H^H^Hglory. :-)

Reviewed by: sos, jdp
1998-03-08 05:29:49 +00:00
peter
d4691e641b Import of unmodified (but trimmed) gcc-2.7.2. The bigger parts of the
non-i386, non-unix, and generatable files have been trimmed, but can easily
be added in later if needed.

gcc-2.7.2.1 will follow shortly, it's a very small delta to this and it's
handy to have both available for reference for such little cost.

The freebsd-specific changes will then be committed, and once the dust has
settled, the bmakefiles will be committed to use this code.
1996-09-18 05:35:50 +00:00