summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaymond Danks <raymond@edanks.com>2006-05-31 22:35:20 +0000
committerOpenEmbedded Project <openembedded-devel@lists.openembedded.org>2006-05-31 22:35:20 +0000
commitee362d1f5b993983a60fd5fc413c047ee9894194 (patch)
treed3f62f8b95f9f374dbb6a820617872c1bc825400
parentd784bf8174ba1df53d37149a34d8652911983fdb (diff)
gcc - ${TARGET_PREFIX}gcov are useful for cross code coverage analysis.
Cleanup some errors in packaging when certain files do not exist. Add GCOV_PREFIX* cross-profiling patches. Pass in GFORTRAN_FOR_TARGET for cross builds.
-rw-r--r--packages/gcc/gcc-3.4.3/GCOV_PREFIX_STRIP-cross-profile_3.4.patch385
-rw-r--r--packages/gcc/gcc-3.4.4/GCOV_PREFIX_STRIP-cross-profile_3.4.patch389
-rw-r--r--packages/gcc/gcc-4.0.2/GCOV_PREFIX_STRIP-cross-profile_4.1.patch371
-rw-r--r--packages/gcc/gcc-cross_3.3.3.bb4
-rw-r--r--packages/gcc/gcc-package.inc15
-rw-r--r--packages/gcc/gcc3-build-cross.inc4
-rw-r--r--packages/gcc/gcc3-build.inc1
-rw-r--r--packages/gcc/gcc4-build.inc2
-rw-r--r--packages/gcc/gcc_3.4.3.bb3
-rw-r--r--packages/gcc/gcc_3.4.4.bb3
-rw-r--r--packages/gcc/gcc_4.0.2.bb3
11 files changed, 1160 insertions, 20 deletions
diff --git a/packages/gcc/gcc-3.4.3/GCOV_PREFIX_STRIP-cross-profile_3.4.patch b/packages/gcc/gcc-3.4.3/GCOV_PREFIX_STRIP-cross-profile_3.4.patch
new file mode 100644
index 0000000000..0f1cf2040b
--- /dev/null
+++ b/packages/gcc/gcc-3.4.3/GCOV_PREFIX_STRIP-cross-profile_3.4.patch
@@ -0,0 +1,385 @@
+2005-05-04 Grigory Zagorodnev <grigory.zagorodnev@intel.com>
+ H.J. Lu <hongjiu.lu@intel.com>
+
+
+ Cross-profiling support: relocate .gcda files when
+ running at system other than executable been built on.
+
+
+ * gcov-io.c (gcov_open): When in libgcov library
+ use given data file relocation prefix to build file name.
+ * gcov-io.h (gcov_open): Updated proto to accept
+ data file relocation prefix.
+ * libgcov.c (create_file_directory): New function.
+ (gcov_prefix): New static variable to hold data file
+ relocation prefix.
+ (gcov_version): Use relocation prefix.
+ (gcov_exit): Always try to create directory for output
+ file. Relocate filename at each use.
+ (__gcov_init): Initialize directory relocation prefix
+ if required. Strip off leading directories from
+ the initial filename.
+ * tsystem.h: include filenames.h
+ (DIR_SEPARATOR): Macro copied from system.h.
+ (DIR_SEPARATOR_2): Likewise.
+ * doc/gcov.texi (Cross-profiling): New node documenting
+ cross-profiling management.
+ * doc/invoke.texi (-fprofile-arcs): xref to cross-profiling.
+
+Grigory Zagorodnev
+Intel Corporation
+
+diff -urN gcc-3.4.3.orig/gcc-3.4.3/gcc/doc/gcov.texi gcc-3.4.3/gcc/doc/gcov.texi
+--- gcc-3.4.3.orig/gcc-3.4.3/gcc/doc/gcov.texi 2004-03-14 15:31:20.000000000 -0700
++++ gcc-3.4.3/gcc/doc/gcov.texi 2006-05-08 10:17:54.000000000 -0600
+@@ -42,6 +42,7 @@
+ * Invoking Gcov:: How to use gcov.
+ * Gcov and Optimization:: Using gcov with GCC optimization.
+ * Gcov Data Files:: The files used by gcov.
++* Cross-profiling:: Data files relocation.
+ @end menu
+
+ @node Gcov Intro
+@@ -510,3 +511,36 @@
+ The full details of the file format is specified in @file{gcov-io.h},
+ and functions provided in that header file should be used to access the
+ coverage files.
++
++@node Cross-profiling
++@section Data files relocation to support cross-profiling
++
++Running the program will cause profile output to be generated. For each
++source file compiled with @option{-fprofile-arcs}, an accompanying @file{.gcda}
++file will be placed in the object file directory. That implicitly requires
++running the program at the same system as it was build or having same
++absolute directory structure on the target system (program will try
++to create needed directory structure).
++
++To support cross-profiling, program compiled with @option{-fprofile-arcs}
++performs data file relocation basing on two environment variables:
++
++@itemize @bullet
++@item
++GCOV_PREFIX contains the prefix to add to the absolute paths
++in the object file.
++
++@item
++GCOV_PREFIX_STRIP indicates the how many initial directory names to strip off
++the hardwired absolute paths. Default value is 0.
++@end itemize
++
++For example, if object file @file{/user/build/foo.o} was build with
++@option{-fprofile-arcs}, the final executable will try to create data file
++@file{/user/build/foo.gcda} when running at the target system and will
++fail if corresponding directory does not exists and is not allowed to create.
++
++In this case, manipulating environment variables you can relocate data file
++to the suitable local directory. For our example, setting @samp{GCOV_PREFIX=/target/run}
++and @samp{GCOV_PREFIX_STRIP=1} values will force use of @file{/target/run/build/foo.gcda}
++file name.
+diff -urN gcc-3.4.3.orig/gcc-3.4.3/gcc/doc/invoke.texi gcc-3.4.3/gcc/doc/invoke.texi
+--- gcc-3.4.3.orig/gcc-3.4.3/gcc/doc/invoke.texi 2006-05-08 10:14:43.000000000 -0600
++++ gcc-3.4.3/gcc/doc/invoke.texi 2006-05-08 10:17:54.000000000 -0600
+@@ -3178,6 +3178,7 @@
+ the basename of the source file. In both cases any suffix is removed
+ (e.g. @file{foo.gcda} for input file @file{dir/foo.c}, or
+ @file{dir/foo.gcda} for output file specified as @option{-o dir/foo.o}).
++@xref{Cross-profiling}.
+
+ @itemize
+
+diff -urN gcc-3.4.3.orig/gcc-3.4.3/gcc/gcov-io.c gcc-3.4.3/gcc/gcov-io.c
+--- gcc-3.4.3.orig/gcc-3.4.3/gcc/gcov-io.c 2004-02-25 08:11:19.000000000 -0700
++++ gcc-3.4.3/gcc/gcov-io.c 2006-05-08 10:17:54.000000000 -0600
+@@ -55,13 +55,14 @@
+
+ GCOV_LINKAGE int
+ #if IN_LIBGCOV
+-gcov_open (const char *name)
++gcov_open (const char *prefix, const char *name)
+ #else
+ gcov_open (const char *name, int mode)
+ #endif
+ {
+ #if IN_LIBGCOV
+ const int mode = 0;
++ char *tmp;
+ #endif
+ #if GCOV_LOCKED
+ struct flock s_flock;
+@@ -83,6 +84,14 @@
+ #if !IN_LIBGCOV
+ gcov_var.endian = 0;
+ #endif
++
++#if IN_LIBGCOV
++ /* Build complete filename with prefix */
++ tmp = alloca( strlen(prefix) + strlen(name) + 1);
++ *tmp = '\0';
++ name = strcat( strcat(tmp, prefix), name);
++#endif
++
+ #if GCOV_LOCKED
+ if (mode > 0)
+ fd = open (name, O_RDWR);
+diff -urN gcc-3.4.3.orig/gcc-3.4.3/gcc/gcov-io.h gcc-3.4.3/gcc/gcov-io.h
+--- gcc-3.4.3.orig/gcc-3.4.3/gcc/gcov-io.h 2004-03-21 19:43:11.000000000 -0700
++++ gcc-3.4.3/gcc/gcov-io.h 2006-05-08 10:20:23.000000000 -0600
+@@ -488,7 +488,7 @@
+ functions for writing. Your file may become corrupted if you break
+ these invariants. */
+ #if IN_LIBGCOV
+-GCOV_LINKAGE int gcov_open (const char */*name*/);
++GCOV_LINKAGE int gcov_open (const char */*prefix*/, const char */*name*/);
+ #else
+ GCOV_LINKAGE int gcov_open (const char */*name*/, int /*direction*/);
+ GCOV_LINKAGE int gcov_magic (gcov_unsigned_t, gcov_unsigned_t);
+diff -urN gcc-3.4.3.orig/gcc-3.4.3/gcc/libgcov.c gcc-3.4.3/gcc/libgcov.c
+--- gcc-3.4.3.orig/gcc-3.4.3/gcc/libgcov.c 2004-02-25 08:11:19.000000000 -0700
++++ gcc-3.4.3/gcc/libgcov.c 2006-05-08 10:17:54.000000000 -0600
+@@ -92,6 +92,70 @@
+ object file included in multiple programs. */
+ static gcov_unsigned_t gcov_crc32;
+
++/* Directory prefix to relocate coverage data file names */
++static char *gcov_prefix = 0;
++
++/* Level of dirs to strip off the initial filename to relocate */
++static int gcov_prefix_strip = 0;
++
++static int
++create_file_directory (const char *prefix, const char *filename)
++{
++ char *dname;
++ char sep, *r, *s;
++ size_t plen, flen;
++
++ /* Detect directory separator */
++ s = strrchr (prefix, DIR_SEPARATOR);
++#ifdef DIR_SEPARATOR_2
++ if (! s)
++ s = strrchr (prefix, DIR_SEPARATOR_2);
++#endif
++ if (s)
++ sep = *s;
++ else
++ sep = DIR_SEPARATOR;
++
++ /* join prefix and filename, split path */
++ plen = strlen(prefix);
++ flen = strlen(filename);
++ r = alloca(plen + flen + 1);
++ strncpy(r, prefix, plen);
++ strncpy(r + plen, filename, flen);
++ r[plen + flen] = '\0';
++ s = strrchr(r, sep);
++ if (s)
++ *(s + 1) = '\0';
++
++ if (access (r, F_OK) == 0)
++ return 0;
++
++ /* Skip consecutive separators. */
++ for (dname = r; *dname && *dname == sep; ++dname);
++ while (1)
++ {
++ char *s = strchr (dname, sep);
++ if (s == 0)
++ break;
++ *s = '\0';
++ /* Try to make directory if it doesn't already exist. */
++ if (access (r, F_OK) == -1
++ && mkdir (r, 0755) == -1
++ /* The directory might have been made by another process. */
++ && errno != EEXIST)
++ {
++ *s = sep;
++ fprintf (stderr, "profiling:%s:Cannot create directory\n", r);
++ return -1;
++ };
++ *s = sep;
++ /* Skip consecutive separators. */
++ for (dname = s + 1; *dname && *dname == sep; ++dname)
++ ;
++ }
++ return 0;
++}
++
+ static int
+ gcov_version (struct gcov_info *ptr, gcov_unsigned_t version)
+ {
+@@ -103,8 +167,8 @@
+ GCOV_UNSIGNED2STRING (e, GCOV_VERSION);
+
+ fprintf (stderr,
+- "profiling:%s:Version mismatch - expected %.4s got %.4s\n",
+- ptr->filename, e, v);
++ "profiling:%s%s:Version mismatch - expected %.4s got %.4s\n",
++ gcov_prefix, ptr->filename, e, v);
+ return 0;
+ }
+ return 1;
+@@ -204,9 +268,14 @@
+ fi_stride &= ~(__alignof__ (struct gcov_fn_info) - 1);
+ }
+
+- if (!gcov_open (gi_ptr->filename))
++ if (create_file_directory (gcov_prefix, gi_ptr->filename))
+ {
+- fprintf (stderr, "profiling:%s:Cannot open\n", gi_ptr->filename);
++ fprintf (stderr, "profiling:%s%s:Skip\n", gcov_prefix, gi_ptr->filename);
++ continue;
++ }
++ else if (!gcov_open (gcov_prefix, gi_ptr->filename))
++ {
++ fprintf (stderr, "profiling:%s%s:Cannot open\n", gcov_prefix, gi_ptr->filename);
+ continue;
+ }
+
+@@ -216,8 +285,8 @@
+ /* Merge data from file. */
+ if (tag != GCOV_DATA_MAGIC)
+ {
+- fprintf (stderr, "profiling:%s:Not a gcov data file\n",
+- gi_ptr->filename);
++ fprintf (stderr, "profiling:%s%s:Not a gcov data file\n",
++ gcov_prefix, gi_ptr->filename);
+ read_fatal:;
+ gcov_close ();
+ continue;
+@@ -250,8 +319,8 @@
+ || gcov_read_unsigned () != fi_ptr->checksum)
+ {
+ read_mismatch:;
+- fprintf (stderr, "profiling:%s:Merge mismatch for %s\n",
+- gi_ptr->filename,
++ fprintf (stderr, "profiling:%s%s:Merge mismatch for %s\n",
++ gcov_prefix, gi_ptr->filename,
+ f_ix + 1 ? "function" : "summaries");
+ goto read_fatal;
+ }
+@@ -309,8 +378,8 @@
+ if (!gcov_is_eof ())
+ {
+ read_error:;
+- fprintf (stderr, error < 0 ? "profiling:%s:Overflow merging\n"
+- : "profiling:%s:Error merging\n", gi_ptr->filename);
++ fprintf (stderr, error < 0 ? "profiling:%s%s:Overflow merging\n"
++ : "profiling:%s%s:Error merging\n", gcov_prefix, gi_ptr->filename);
+ goto read_fatal;
+ }
+ rewrite:;
+@@ -357,8 +426,8 @@
+ && (!GCOV_LOCKED || cs_all->runs == cs_prg->runs)
+ && memcmp (cs_all, cs_prg, sizeof (*cs_all)))
+ {
+- fprintf (stderr, "profiling:%s:Invocation mismatch - some data files may have been removed%s",
+- gi_ptr->filename, GCOV_LOCKED
++ fprintf (stderr, "profiling:%s%s:Invocation mismatch - some data files may have been removed%s",
++ gcov_prefix, gi_ptr->filename, GCOV_LOCKED
+ ? "" : " or concurrent update without locking support");
+ all.checksum = ~0u;
+ }
+@@ -418,9 +487,9 @@
+ gcov_write_summary (GCOV_TAG_PROGRAM_SUMMARY, &program);
+ if ((error = gcov_close ()))
+ fprintf (stderr, error < 0 ?
+- "profiling:%s:Overflow writing\n" :
+- "profiling:%s:Error writing\n",
+- gi_ptr->filename);
++ "profiling:%s%s:Overflow writing\n" :
++ "profiling:%s%s:Error writing\n",
++ gcov_prefix, gi_ptr->filename);
+ }
+ }
+
+@@ -430,11 +499,69 @@
+ void
+ __gcov_init (struct gcov_info *info)
+ {
++ /* Save initial filename pointer to calculate CRC. */
++ const char *ptr = info->filename;
++
+ if (!info->version)
+ return;
++
++ /* Initialize directory prefix if requred */
++ if (gcov_prefix == 0)
++ {
++ if ((gcov_prefix = getenv("GCOV_PREFIX")))
++ {
++ char *tmp;
++
++ /* Normalize prefix: take off trailing separator. */
++ tmp = gcov_prefix + strlen(gcov_prefix) - 1;
++ if (IS_DIR_SEPARATOR(*tmp))
++ *tmp = '\0';
++
++ /* Check if the level of dirs to strip off specified */
++ if ((tmp = getenv("GCOV_PREFIX_STRIP")))
++ {
++ gcov_prefix_strip = atoi (tmp);
++ /* Do not consider negative values. */
++ if (gcov_prefix_strip < 0)
++ gcov_prefix_strip = 0;
++ };
++ }
++ else
++ gcov_prefix = (char *) "";
++ };
++
++ /* Strip off leading directories from the initial filename */
++ if (gcov_prefix_strip > 0)
++ {
++ char sep, *s;
++ int level;
++ const char *fname = info->filename;
++
++ /* Detect directory separator */
++ s = strrchr (fname, DIR_SEPARATOR);
++#ifdef DIR_SEPARATOR_2
++ if (! s)
++ s = strrchr (fname, DIR_SEPARATOR_2);
++#endif
++ if (s)
++ sep = *s;
++ else
++ sep = DIR_SEPARATOR;
++
++ /* Skip selected directory levels */
++ for ( level = gcov_prefix_strip; level > 0; level--)
++ if ((s = strchr(fname + 1, sep)))
++ fname = s;
++ else
++ break;
++
++ /* From this point info block refers stripped file name and
++ further operations must add prefix to get complete name.*/
++ info->filename = fname;
++ };
++
+ if (gcov_version (info, info->version))
+ {
+- const char *ptr = info->filename;
+ gcov_unsigned_t crc32 = gcov_crc32;
+
+ do
+diff -urN gcc-3.4.3.orig/gcc-3.4.3/gcc/tsystem.h gcc-3.4.3/gcc/tsystem.h
+--- gcc-3.4.3.orig/gcc-3.4.3/gcc/tsystem.h 2003-11-04 22:17:16.000000000 -0700
++++ gcc-3.4.3/gcc/tsystem.h 2006-05-08 10:17:54.000000000 -0600
+@@ -106,4 +106,15 @@
+ #define NULL 0
+ #endif
+
++/* Filename handling macros. */
++#include "filenames.h"
++
++/* These should be phased out in favor of IS_DIR_SEPARATOR, where possible. */
++#ifndef DIR_SEPARATOR
++# define DIR_SEPARATOR '/'
++# ifdef HAVE_DOS_BASED_FILE_SYSTEM
++# define DIR_SEPARATOR_2 '\\'
++# endif
++#endif
++
+ #endif /* ! GCC_TSYSTEM_H */
diff --git a/packages/gcc/gcc-3.4.4/GCOV_PREFIX_STRIP-cross-profile_3.4.patch b/packages/gcc/gcc-3.4.4/GCOV_PREFIX_STRIP-cross-profile_3.4.patch
new file mode 100644
index 0000000000..701a687e05
--- /dev/null
+++ b/packages/gcc/gcc-3.4.4/GCOV_PREFIX_STRIP-cross-profile_3.4.patch
@@ -0,0 +1,389 @@
+2005-05-04 Grigory Zagorodnev <grigory.zagorodnev@intel.com>
+ H.J. Lu <hongjiu.lu@intel.com>
+
+
+ Cross-profiling support: relocate .gcda files when
+ running at system other than executable been built on.
+
+
+ * gcov-io.c (gcov_open): When in libgcov library
+ use given data file relocation prefix to build file name.
+ * gcov-io.h (gcov_open): Updated proto to accept
+ data file relocation prefix.
+ * libgcov.c (create_file_directory): New function.
+ (gcov_prefix): New static variable to hold data file
+ relocation prefix.
+ (gcov_version): Use relocation prefix.
+ (gcov_exit): Always try to create directory for output
+ file. Relocate filename at each use.
+ (__gcov_init): Initialize directory relocation prefix
+ if required. Strip off leading directories from
+ the initial filename.
+ * tsystem.h: include filenames.h
+ (DIR_SEPARATOR): Macro copied from system.h.
+ (DIR_SEPARATOR_2): Likewise.
+ * doc/gcov.texi (Cross-profiling): New node documenting
+ cross-profiling management.
+ * doc/invoke.texi (-fprofile-arcs): xref to cross-profiling.
+
+Grigory Zagorodnev
+Intel Corporation
+
+--- gcc-3.4/gcc/gcov-io.c.prefix 2004-02-26 13:54:47.000000000 -0800
++++ gcc-3.4/gcc/gcov-io.c 2005-05-04 11:46:01.000000000 -0700
+@@ -55,13 +55,14 @@ static inline gcov_unsigned_t from_file
+
+ GCOV_LINKAGE int
+ #if IN_LIBGCOV
+-gcov_open (const char *name)
++gcov_open (const char *prefix, const char *name)
+ #else
+ gcov_open (const char *name, int mode)
+ #endif
+ {
+ #if IN_LIBGCOV
+ const int mode = 0;
++ char *tmp;
+ #endif
+ #if GCOV_LOCKED
+ struct flock s_flock;
+@@ -83,6 +84,14 @@ gcov_open (const char *name, int mode)
+ #if !IN_LIBGCOV
+ gcov_var.endian = 0;
+ #endif
++
++#if IN_LIBGCOV
++ /* Build complete filename with prefix */
++ tmp = alloca( strlen(prefix) + strlen(name) + 1);
++ *tmp = '\0';
++ name = strcat( strcat(tmp, prefix), name);
++#endif
++
+ #if GCOV_LOCKED
+ if (mode > 0)
+ fd = open (name, O_RDWR);
+--- gcc-3.4/gcc/gcov-io.h.prefix 2005-05-02 15:37:58.000000000 -0700
++++ gcc-3.4/gcc/gcov-io.h 2005-05-04 11:46:01.000000000 -0700
+@@ -502,7 +502,7 @@ GCOV_LINKAGE struct gcov_var
+ functions for writing. Your file may become corrupted if you break
+ these invariants. */
+ #if IN_LIBGCOV
+-GCOV_LINKAGE int gcov_open (const char */*name*/) ATTRIBUTE_HIDDEN;
++GCOV_LINKAGE int gcov_open (const char */*prefix*/, const char */*name*/) ATTRIBUTE_HIDDEN;
+ #else
+ GCOV_LINKAGE int gcov_open (const char */*name*/, int /*direction*/);
+ GCOV_LINKAGE int gcov_magic (gcov_unsigned_t, gcov_unsigned_t);
+--- gcc-3.4/gcc/libgcov.c.prefix 2004-02-26 13:54:47.000000000 -0800
++++ gcc-3.4/gcc/libgcov.c 2005-05-04 12:01:58.000000000 -0700
+@@ -92,6 +92,70 @@ static struct gcov_info *gcov_list;
+ object file included in multiple programs. */
+ static gcov_unsigned_t gcov_crc32;
+
++/* Directory prefix to relocate coverage data file names */
++static char *gcov_prefix = 0;
++
++/* Level of dirs to strip off the initial filename to relocate */
++static int gcov_prefix_strip = 0;
++
++static int
++create_file_directory (const char *prefix, const char *filename)
++{
++ char *dname;
++ char sep, *r, *s;
++ size_t plen, flen;
++
++ /* Detect directory separator */
++ s = strrchr (prefix, DIR_SEPARATOR);
++#ifdef DIR_SEPARATOR_2
++ if (! s)
++ s = strrchr (prefix, DIR_SEPARATOR_2);
++#endif
++ if (s)
++ sep = *s;
++ else
++ sep = DIR_SEPARATOR;
++
++ /* join prefix and filename, split path */
++ plen = strlen(prefix);
++ flen = strlen(filename);
++ r = alloca(plen + flen + 1);
++ strncpy(r, prefix, plen);
++ strncpy(r + plen, filename, flen);
++ r[plen + flen] = '\0';
++ s = strrchr(r, sep);
++ if (s)
++ *(s + 1) = '\0';
++
++ if (access (r, F_OK) == 0)
++ return 0;
++
++ /* Skip consecutive separators. */
++ for (dname = r; *dname && *dname == sep; ++dname);
++ while (1)
++ {
++ char *s = strchr (dname, sep);
++ if (s == 0)
++ break;
++ *s = '\0';
++ /* Try to make directory if it doesn't already exist. */
++ if (access (r, F_OK) == -1
++ && mkdir (r, 0755) == -1
++ /* The directory might have been made by another process. */
++ && errno != EEXIST)
++ {
++ *s = sep;
++ fprintf (stderr, "profiling:%s:Cannot create directory\n", r);
++ return -1;
++ };
++ *s = sep;
++ /* Skip consecutive separators. */
++ for (dname = s + 1; *dname && *dname == sep; ++dname)
++ ;
++ }
++ return 0;
++}
++
+ static int
+ gcov_version (struct gcov_info *ptr, gcov_unsigned_t version)
+ {
+@@ -103,8 +167,8 @@ gcov_version (struct gcov_info *ptr, gco
+ GCOV_UNSIGNED2STRING (e, GCOV_VERSION);
+
+ fprintf (stderr,
+- "profiling:%s:Version mismatch - expected %.4s got %.4s\n",
+- ptr->filename, e, v);
++ "profiling:%s%s:Version mismatch - expected %.4s got %.4s\n",
++ gcov_prefix, ptr->filename, e, v);
+ return 0;
+ }
+ return 1;
+@@ -204,9 +268,14 @@ gcov_exit (void)
+ fi_stride &= ~(__alignof__ (struct gcov_fn_info) - 1);
+ }
+
+- if (!gcov_open (gi_ptr->filename))
++ if (create_file_directory (gcov_prefix, gi_ptr->filename))
+ {
+- fprintf (stderr, "profiling:%s:Cannot open\n", gi_ptr->filename);
++ fprintf (stderr, "profiling:%s%s:Skip\n", gcov_prefix, gi_ptr->filename);
++ continue;
++ }
++ else if (!gcov_open (gcov_prefix, gi_ptr->filename))
++ {
++ fprintf (stderr, "profiling:%s%s:Cannot open\n", gcov_prefix, gi_ptr->filename);
+ continue;
+ }
+
+@@ -216,8 +285,8 @@ gcov_exit (void)
+ /* Merge data from file. */
+ if (tag != GCOV_DATA_MAGIC)
+ {
+- fprintf (stderr, "profiling:%s:Not a gcov data file\n",
+- gi_ptr->filename);
++ fprintf (stderr, "profiling:%s%s:Not a gcov data file\n",
++ gcov_prefix, gi_ptr->filename);
+ read_fatal:;
+ gcov_close ();
+ continue;
+@@ -250,8 +319,8 @@ gcov_exit (void)
+ || gcov_read_unsigned () != fi_ptr->checksum)
+ {
+ read_mismatch:;
+- fprintf (stderr, "profiling:%s:Merge mismatch for %s\n",
+- gi_ptr->filename,
++ fprintf (stderr, "profiling:%s%s:Merge mismatch for %s\n",
++ gcov_prefix, gi_ptr->filename,
+ f_ix + 1 ? "function" : "summaries");
+ goto read_fatal;
+ }
+@@ -309,8 +378,8 @@ gcov_exit (void)
+ if (!gcov_is_eof ())
+ {
+ read_error:;
+- fprintf (stderr, error < 0 ? "profiling:%s:Overflow merging\n"
+- : "profiling:%s:Error merging\n", gi_ptr->filename);
++ fprintf (stderr, error < 0 ? "profiling:%s%s:Overflow merging\n"
++ : "profiling:%s%s:Error merging\n", gcov_prefix, gi_ptr->filename);
+ goto read_fatal;
+ }
+ rewrite:;
+@@ -357,8 +426,8 @@ gcov_exit (void)
+ && (!GCOV_LOCKED || cs_all->runs == cs_prg->runs)
+ && memcmp (cs_all, cs_prg, sizeof (*cs_all)))
+ {
+- fprintf (stderr, "profiling:%s:Invocation mismatch - some data files may have been removed%s",
+- gi_ptr->filename, GCOV_LOCKED
++ fprintf (stderr, "profiling:%s%s:Invocation mismatch - some data files may have been removed%s",
++ gcov_prefix, gi_ptr->filename, GCOV_LOCKED
+ ? "" : " or concurrent update without locking support");
+ all.checksum = ~0u;
+ }
+@@ -418,9 +487,9 @@ gcov_exit (void)
+ gcov_write_summary (GCOV_TAG_PROGRAM_SUMMARY, &program);
+ if ((error = gcov_close ()))
+ fprintf (stderr, error < 0 ?
+- "profiling:%s:Overflow writing\n" :
+- "profiling:%s:Error writing\n",
+- gi_ptr->filename);
++ "profiling:%s%s:Overflow writing\n" :
++ "profiling:%s%s:Error writing\n",
++ gcov_prefix, gi_ptr->filename);
+ }
+ }
+
+@@ -430,11 +499,69 @@ gcov_exit (void)
+ void
+ __gcov_init (struct gcov_info *info)
+ {
++ /* Save initial filename pointer to calculate CRC. */
++ const char *ptr = info->filename;
++
+ if (!info->version)
+ return;
++
++ /* Initialize directory prefix if requred */
++ if (gcov_prefix == 0)
++ {
++ if ((gcov_prefix = getenv("GCOV_PREFIX")))
++ {
++ char *tmp;
++
++ /* Normalize prefix: take off trailing separator. */
++ tmp = gcov_prefix + strlen(gcov_prefix) - 1;
++ if (IS_DIR_SEPARATOR(*tmp))
++ *tmp = '\0';
++
++ /* Check if the level of dirs to strip off specified */
++ if ((tmp = getenv("GCOV_PREFIX_STRIP")))
++ {
++ gcov_prefix_strip = atoi (tmp);
++ /* Do not consider negative values. */
++ if (gcov_prefix_strip < 0)
++ gcov_prefix_strip = 0;
++ };
++ }
++ else
++ gcov_prefix = (char *) "";
++ };
++
++ /* Strip off leading directories from the initial filename */
++ if (gcov_prefix_strip > 0)
++ {
++ char sep, *s;
++ int level;
++ const char *fname = info->filename;
++
++ /* Detect directory separator */
++ s = strrchr (fname, DIR_SEPARATOR);
++#ifdef DIR_SEPARATOR_2
++ if (! s)
++ s = strrchr (fname, DIR_SEPARATOR_2);
++#endif
++ if (s)
++ sep = *s;
++ else
++ sep = DIR_SEPARATOR;
++
++ /* Skip selected directory levels */
++ for ( level = gcov_prefix_strip; level > 0; level--)
++ if ((s = strchr(fname + 1, sep)))
++ fname = s;
++ else
++ break;
++
++ /* From this point info block refers stripped file name and
++ further operations must add prefix to get complete name.*/
++ info->filename = fname;
++ };
++
+ if (gcov_version (info, info->version))
+ {
+- const char *ptr = info->filename;
+ gcov_unsigned_t crc32 = gcov_crc32;
+
+ do
+--- gcc-3.4/gcc/tsystem.h.prefix 2003-11-12 16:07:48.000000000 -0800
++++ gcc-3.4/gcc/tsystem.h 2005-05-04 12:12:08.000000000 -0700
+@@ -106,4 +106,15 @@ extern int errno;
+ #define NULL 0
+ #endif
+
++/* Filename handling macros. */
++#include "filenames.h"
++
++/* These should be phased out in favor of IS_DIR_SEPARATOR, where possible. */
++#ifndef DIR_SEPARATOR
++# define DIR_SEPARATOR '/'
++# ifdef HAVE_DOS_BASED_FILE_SYSTEM
++# define DIR_SEPARATOR_2 '\\'
++# endif
++#endif
++
+ #endif /* ! GCC_TSYSTEM_H */
+Index: gcc-3.4/gcc/doc/gcov.texi
+===================================================================
+RCS file: /cvsroot/gcc/gcc/gcc/doc/gcov.texi,v
+retrieving revision 1.19.4.3
+diff -u -p -r1.19.4.3 gcov.texi
+--- gcc-3.4/gcc/doc/gcov.texi 14 Mar 2004 22:31:20 -0000 1.19.4.3
++++ gcc-3.4/gcc/doc/gcov.texi 4 May 2005 13:44:25 -0000
+@@ -42,6 +42,7 @@ test code coverage in your programs.
+ * Invoking Gcov:: How to use gcov.
+ * Gcov and Optimization:: Using gcov with GCC optimization.
+ * Gcov Data Files:: The files used by gcov.
++* Cross-profiling:: Data files relocation.
+ @end menu
+
+ @node Gcov Intro
+@@ -510,3 +511,36 @@ information.
+ The full details of the file format is specified in @file{gcov-io.h},
+ and functions provided in that header file should be used to access the
+ coverage files.
++
++@node Cross-profiling
++@section Data files relocation to support cross-profiling
++
++Running the program will cause profile output to be generated. For each
++source file compiled with @option{-fprofile-arcs}, an accompanying @file{.gcda}
++file will be placed in the object file directory. That implicitly requires
++running the program at the same system as it was build or having same
++absolute directory structure on the target system (program will try
++to create needed directory structure).
++
++To support cross-profiling, program compiled with @option{-fprofile-arcs}
++performs data file relocation basing on two environment variables:
++
++@itemize @bullet
++@item
++GCOV_PREFIX contains the prefix to add to the absolute paths
++in the object file.
++
++@item
++GCOV_PREFIX_STRIP indicates the how many initial directory names to strip off
++the hardwired absolute paths. Default value is 0.
++@end itemize
++
++For example, if object file @file{/user/build/foo.o} was build with
++@option{-fprofile-arcs}, the final executable will try to create data file
++@file{/user/build/foo.gcda} when running at the target system and will
++fail if corresponding directory does not exists and is not allowed to create.
++
++In this case, manipulating environment variables you can relocate data file
++to the suitable local directory. For our example, setting @samp{GCOV_PREFIX=/target/run}
++and @samp{GCOV_PREFIX_STRIP=1} values will force use of @file{/target/run/build/foo.gcda}
++file name.
+Index: gcc-3.4/gcc/doc/invoke.texi
+===================================================================
+RCS file: /cvsroot/gcc/gcc/gcc/doc/invoke.texi,v
+retrieving revision 1.390.2.40
+diff -u -p -r1.390.2.40 invoke.texi
+--- gcc-3.4/gcc/doc/invoke.texi 22 Apr 2005 06:49:59 -0000 1.390.2.40
++++ gcc-3.4/gcc/doc/invoke.texi 4 May 2005 13:44:25 -0000
+@@ -3158,6 +3158,7 @@ explicitly specified and it is not the f
+ the basename of the source file. In both cases any suffix is removed
+ (e.g. @file{foo.gcda} for input file @file{dir/foo.c}, or
+ @file{dir/foo.gcda} for output file specified as @option{-o dir/foo.o}).
++@xref{Cross-profiling}.
+
+ @itemize
+
diff --git a/packages/gcc/gcc-4.0.2/GCOV_PREFIX_STRIP-cross-profile_4.1.patch b/packages/gcc/gcc-4.0.2/GCOV_PREFIX_STRIP-cross-profile_4.1.patch
new file mode 100644
index 0000000000..92ce00a1e3
--- /dev/null
+++ b/packages/gcc/gcc-4.0.2/GCOV_PREFIX_STRIP-cross-profile_4.1.patch
@@ -0,0 +1,371 @@
+2005-05-04 Grigory Zagorodnev <grigory.zagorodnev@intel.com>
+ H.J. Lu <hongjiu.lu@intel.com>
+
+ * gcov-io.c (gcov_open): When in libgcov library
+ use given data file relocation prefix to build file name.
+ * gcov-io.h (gcov_open): Updated proto to accept
+ data file relocation prefix.
+ * libgcov.c (create_file_directory): New function.
+ (gcov_prefix): New static variable to hold data file
+ relocation prefix.
+ (gcov_version): Use relocation prefix.
+ (gcov_exit): Always try to create directory for output
+ file. Relocate filename at each use.
+ (__gcov_init): Initialize directory relocation prefix
+ if required. Strip off leading directories from
+ the initial filename.
+ * tsystem.h: include filenames.h
+ (DIR_SEPARATOR): Macro copied from system.h.
+ (DIR_SEPARATOR_2): Likewise.
+ * doc/gcov.texi (Cross-profiling): New node documenting
+ cross-profiling management.
+ * doc/invoke.texi (-fprofile-arcs): xref to cross-profiling.
+
+--- gcc-4/gcc/doc/gcov.texi.prefix 2005-03-28 11:56:34.000000000 -0800
++++ gcc-4/gcc/doc/gcov.texi 2005-05-04 15:07:44.000000000 -0700
+@@ -42,6 +42,7 @@ test code coverage in your programs.
+ * Invoking Gcov:: How to use gcov.
+ * Gcov and Optimization:: Using gcov with GCC optimization.
+ * Gcov Data Files:: The files used by gcov.
++* Cross-profiling:: Data files relocation.
+ @end menu
+
+ @node Gcov Intro
+@@ -531,3 +532,36 @@ information.
+ The full details of the file format is specified in @file{gcov-io.h},
+ and functions provided in that header file should be used to access the
+ coverage files.
++
++@node Cross-profiling
++@section Data files relocation to support cross-profiling
++
++Running the program will cause profile output to be generated. For each
++source file compiled with @option{-fprofile-arcs}, an accompanying @file{.gcda}
++file will be placed in the object file directory. That implicitly requires
++running the program at the same system as it was build or having same
++absolute directory structure on the target system (program will try
++to create needed directory structure).
++
++To support cross-profiling, program compiled with @option{-fprofile-arcs}
++performs data file relocation basing on two environment variables:
++
++@itemize @bullet
++@item
++GCOV_PREFIX contains the prefix to add to the absolute paths
++in the object file.
++
++@item
++GCOV_PREFIX_STRIP indicates the how many initial directory names to strip off
++the hardwired absolute paths. Default value is 0.
++@end itemize
++
++For example, if object file @file{/user/build/foo.o} was build with
++@option{-fprofile-arcs}, the final executable will try to create data file
++@file{/user/build/foo.gcda} when running at the target system and will
++fail if corresponding directory does not exists and is not allowed to create.
++
++In this case, manipulating environment variables you can relocate data file
++to the suitable local directory. For our example, setting @samp{GCOV_PREFIX=/target/run}
++and @samp{GCOV_PREFIX_STRIP=1} values will force use of @file{/target/run/build/foo.gcda}
++file name.
+--- gcc-4/gcc/doc/invoke.texi.prefix 2005-05-04 11:21:00.000000000 -0700
++++ gcc-4/gcc/doc/invoke.texi 2005-05-04 15:07:44.000000000 -0700
+@@ -3420,6 +3420,7 @@ explicitly specified and it is not the f
+ the basename of the source file. In both cases any suffix is removed
+ (e.g.@: @file{foo.gcda} for input file @file{dir/foo.c}, or
+ @file{dir/foo.gcda} for output file specified as @option{-o dir/foo.o}).
++@xref{Cross-profiling}.
+
+ @cindex @command{gcov}
+ @item --coverage
+--- gcc-4/gcc/gcov-io.c.prefix 2005-04-28 16:11:30.000000000 -0700
++++ gcc-4/gcc/gcov-io.c 2005-05-04 20:02:35.000000000 -0700
+@@ -55,13 +55,14 @@ static inline gcov_unsigned_t from_file
+
+ GCOV_LINKAGE int
+ #if IN_LIBGCOV
+-gcov_open (const char *name)
++gcov_open (const char *prefix, const char *name)
+ #else
+ gcov_open (const char *name, int mode)
+ #endif
+ {
+ #if IN_LIBGCOV
+ const int mode = 0;
++ char *tmp;
+ #endif
+ #if GCOV_LOCKED
+ struct flock s_flock;
+@@ -82,6 +83,13 @@ gcov_open (const char *name, int mode)
+ #if !IN_LIBGCOV
+ gcov_var.endian = 0;
+ #endif
++
++#if IN_LIBGCOV
++ /* Build complete filename with prefix */
++ tmp = alloca (strlen (prefix) + strlen (name) + 1);
++ name = strcat (strcpy (tmp, prefix), name);
++#endif
++
+ #if GCOV_LOCKED
+ if (mode > 0)
+ fd = open (name, O_RDWR);
+--- gcc-4/gcc/gcov-io.h.prefix 2005-05-02 17:43:08.000000000 -0700
++++ gcc-4/gcc/gcov-io.h 2005-05-04 15:07:44.000000000 -0700
+@@ -515,7 +515,7 @@ GCOV_LINKAGE struct gcov_var
+ functions for writing. Your file may become corrupted if you break
+ these invariants. */
+ #if IN_LIBGCOV
+-GCOV_LINKAGE int gcov_open (const char */*name*/) ATTRIBUTE_HIDDEN;
++GCOV_LINKAGE int gcov_open (const char */*prefix*/, const char */*name*/) ATTRIBUTE_HIDDEN;
+ #else
+ GCOV_LINKAGE int gcov_open (const char */*name*/, int /*direction*/);
+ GCOV_LINKAGE int gcov_magic (gcov_unsigned_t, gcov_unsigned_t);
+--- gcc-4/gcc/libgcov.c.prefix 2005-04-28 16:11:30.000000000 -0700
++++ gcc-4/gcc/libgcov.c 2005-05-04 15:07:44.000000000 -0700
+@@ -92,6 +92,70 @@ static struct gcov_info *gcov_list;
+ object file included in multiple programs. */
+ static gcov_unsigned_t gcov_crc32;
+
++/* Directory prefix to relocate coverage data file names */
++static char *gcov_prefix = 0;
++
++/* Level of dirs to strip off the initial filename to relocate */
++static int gcov_prefix_strip = 0;
++
++static int
++create_file_directory (const char *prefix, const char *filename)
++{
++ char *dname;
++ char sep, *r, *s;
++ size_t plen, flen;
++
++ /* Detect directory separator */
++ s = strrchr (prefix, DIR_SEPARATOR);
++#ifdef DIR_SEPARATOR_2
++ if (! s)
++ s = strrchr (prefix, DIR_SEPARATOR_2);
++#endif
++ if (s)
++ sep = *s;
++ else
++ sep = DIR_SEPARATOR;
++
++ /* join prefix and filename, split path */
++ plen = strlen(prefix);
++ flen = strlen(filename);
++ r = alloca(plen + flen + 1);
++ strncpy(r, prefix, plen);
++ strncpy(r + plen, filename, flen);
++ r[plen + flen] = '\0';
++ s = strrchr(r, sep);
++ if (s)
++ *(s + 1) = '\0';
++
++ if (access (r, F_OK) == 0)
++ return 0;
++
++ /* Skip consecutive separators. */
++ for (dname = r; *dname && *dname == sep; ++dname);
++ while (1)
++ {
++ char *s = strchr (dname, sep);
++ if (s == 0)
++ break;
++ *s = '\0';
++ /* Try to make directory if it doesn't already exist. */
++ if (access (r, F_OK) == -1
++ && mkdir (r, 0755) == -1
++ /* The directory might have been made by another process. */
++ && errno != EEXIST)
++ {
++ *s = sep;
++ fprintf (stderr, "profiling:%s:Cannot create directory\n", r);
++ return -1;
++ };
++ *s = sep;
++ /* Skip consecutive separators. */
++ for (dname = s + 1; *dname && *dname == sep; ++dname)
++ ;
++ }
++ return 0;
++}
++
+ static int
+ gcov_version (struct gcov_info *ptr, gcov_unsigned_t version)
+ {
+@@ -103,8 +167,8 @@ gcov_version (struct gcov_info *ptr, gco
+ GCOV_UNSIGNED2STRING (e, GCOV_VERSION);
+
+ fprintf (stderr,
+- "profiling:%s:Version mismatch - expected %.4s got %.4s\n",
+- ptr->filename, e, v);
++ "profiling:%s%s:Version mismatch - expected %.4s got %.4s\n",
++ gcov_prefix, ptr->filename, e, v);
+ return 0;
+ }
+ return 1;
+@@ -205,9 +269,16 @@ gcov_exit (void)
+ fi_stride &= ~(__alignof__ (struct gcov_fn_info) - 1);
+ }
+
+- if (!gcov_open (gi_ptr->filename))
++ if (create_file_directory (gcov_prefix, gi_ptr->filename))
++ {
++ fprintf (stderr, "profiling:%s%s:Skip\n", gcov_prefix,
++ gi_ptr->filename);
++ continue;
++ }
++ else if (!gcov_open (gcov_prefix, gi_ptr->filename))
+ {
+- fprintf (stderr, "profiling:%s:Cannot open\n", gi_ptr->filename);
++ fprintf (stderr, "profiling:%s%s:Cannot open\n", gcov_prefix,
++ gi_ptr->filename);
+ continue;
+ }
+
+@@ -217,8 +288,8 @@ gcov_exit (void)
+ /* Merge data from file. */
+ if (tag != GCOV_DATA_MAGIC)
+ {
+- fprintf (stderr, "profiling:%s:Not a gcov data file\n",
+- gi_ptr->filename);
++ fprintf (stderr, "profiling:%s%s:Not a gcov data file\n",
++ gcov_prefix, gi_ptr->filename);
+ goto read_fatal;
+ }
+ length = gcov_read_unsigned ();
+@@ -245,8 +316,8 @@ gcov_exit (void)
+ || gcov_read_unsigned () != fi_ptr->checksum)
+ {
+ read_mismatch:;
+- fprintf (stderr, "profiling:%s:Merge mismatch for %s\n",
+- gi_ptr->filename,
++ fprintf (stderr, "profiling:%s%s:Merge mismatch for %s\n",
++ gcov_prefix, gi_ptr->filename,
+ f_ix + 1 ? "function" : "summaries");
+ goto read_fatal;
+ }
+@@ -305,7 +376,8 @@ gcov_exit (void)
+
+ read_error:;
+ fprintf (stderr, error < 0 ? "profiling:%s:Overflow merging\n"
+- : "profiling:%s:Error merging\n", gi_ptr->filename);
++ : "profiling:%s%s:Error merging\n", gcov_prefix,
++ gi_ptr->filename);
+
+ read_fatal:;
+ gcov_close ();
+@@ -355,8 +427,8 @@ gcov_exit (void)
+ && (!GCOV_LOCKED || cs_all->runs == cs_prg->runs)
+ && memcmp (cs_all, cs_prg, sizeof (*cs_all)))
+ {
+- fprintf (stderr, "profiling:%s:Invocation mismatch - some data files may have been removed%s",
+- gi_ptr->filename, GCOV_LOCKED
++ fprintf (stderr, "profiling:%s%s:Invocation mismatch - some data files may have been removed%s",
++ gcov_prefix, gi_ptr->filename, GCOV_LOCKED
+ ? "" : " or concurrent update without locking support");
+ all.checksum = ~0u;
+ }
+@@ -419,9 +491,9 @@ gcov_exit (void)
+ gcov_write_unsigned (0);
+ if ((error = gcov_close ()))
+ fprintf (stderr, error < 0 ?
+- "profiling:%s:Overflow writing\n" :
+- "profiling:%s:Error writing\n",
+- gi_ptr->filename);
++ "profiling:%s%s:Overflow writing\n" :
++ "profiling:%s%s:Error writing\n",
++ gcov_prefix, gi_ptr->filename);
+ }
+ }
+
+@@ -431,11 +503,69 @@ gcov_exit (void)
+ void
+ __gcov_init (struct gcov_info *info)
+ {
++ /* Save initial filename pointer to calculate CRC. */
++ const char *ptr = info->filename;
++
+ if (!info->version)
+ return;
++
++ /* Initialize directory prefix if requred */
++ if (gcov_prefix == 0)
++ {
++ if ((gcov_prefix = getenv("GCOV_PREFIX")))
++ {
++ char *tmp;
++
++ /* Normalize prefix: take off trailing separator. */
++ tmp = gcov_prefix + strlen(gcov_prefix) - 1;
++ if (IS_DIR_SEPARATOR(*tmp))
++ *tmp = '\0';
++
++ /* Check if the level of dirs to strip off specified */
++ if ((tmp = getenv("GCOV_PREFIX_STRIP")))
++ {
++ gcov_prefix_strip = atoi (tmp);
++ /* Do not consider negative values. */
++ if (gcov_prefix_strip < 0)
++ gcov_prefix_strip = 0;
++ };
++ }
++ else
++ gcov_prefix = (char *) "";
++ };
++
++ /* Strip off leading directories from the initial filename */
++ if (gcov_prefix_strip > 0)
++ {
++ char sep, *s;
++ int level;
++ const char *fname = info->filename;
++
++ /* Detect directory separator */
++ s = strrchr (fname, DIR_SEPARATOR);
++#ifdef DIR_SEPARATOR_2
++ if (! s)
++ s = strrchr (fname, DIR_SEPARATOR_2);
++#endif
++ if (s)
++ sep = *s;
++ else
++ sep = DIR_SEPARATOR;
++
++ /* Skip selected directory levels */
++ for ( level = gcov_prefix_strip; level > 0; level--)
++ if ((s = strchr(fname + 1, sep)))
++ fname = s;
++ else
++ break;
++
++ /* From this point info block refers stripped file name and
++ further operations must add prefix to get complete name.*/
++ info->filename = fname;
++ };
++
+ if (gcov_version (info, info->version))
+ {
+- const char *ptr = info->filename;
+ gcov_unsigned_t crc32 = gcov_crc32;
+
+ do
+--- gcc-4/gcc/tsystem.h.prefix 2005-03-29 16:06:26.000000000 -0800
++++ gcc-4/gcc/tsystem.h 2005-05-04 15:07:44.000000000 -0700
+@@ -131,4 +131,15 @@ extern int errno;
+ unreachable default case of a switch. Do not use gcc_assert(0). */
+ #define gcc_unreachable() (abort ())
+
++/* Filename handling macros. */
++#include "filenames.h"
++
++/* These should be phased out in favor of IS_DIR_SEPARATOR, where possible. */
++#ifndef DIR_SEPARATOR
++# define DIR_SEPARATOR '/'
++# ifdef HAVE_DOS_BASED_FILE_SYSTEM
++# define DIR_SEPARATOR_2 '\\'
++# endif
++#endif
++
+ #endif /* ! GCC_TSYSTEM_H */
diff --git a/packages/gcc/gcc-cross_3.3.3.bb b/packages/gcc/gcc-cross_3.3.3.bb
index d01528c5ec..44ba65269e 100644
--- a/packages/gcc/gcc-cross_3.3.3.bb
+++ b/packages/gcc/gcc-cross_3.3.3.bb
@@ -43,10 +43,6 @@ do_stage_append () {
rm -rf ${CROSS_DIR}/$d
done
- # These aren't useful on the cross toolchain
- rm -f ${CROSS_DIR}/bin/*gcov
- rm -f ${CROSS_DIR}/bin/*gccbug
-
# Fix a few include links so cross builds are happier
if [ ! -e ${STAGING_INCDIR}/c++ ]; then
mkdir -p ${STAGING_INCDIR}
diff --git a/packages/gcc/gcc-package.inc b/packages/gcc/gcc-package.inc
index 4dcc72e879..425e906a57 100644
--- a/packages/gcc/gcc-package.inc
+++ b/packages/gcc/gcc-package.inc
@@ -67,34 +67,33 @@ do_install () {
rm -r ${D}${libexecdir}/gcc/${TARGET_SYS}/${BINV}/install-tools
# Hack around specs file assumptions
- sed -i -e '/^*cross_compile:$/ { n; s/1/0/; }' ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/specs &>/dev/null || true
+ test -f ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/specs && sed -i -e '/^*cross_compile:$/ { n; s/1/0/; }' ${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/specs
# Move libgcc_s into /lib
mkdir -p ${D}${base_libdir}
mv ${D}${libdir}/libgcc_s.so.* ${D}${base_libdir}
- rm ${D}${libdir}/libgcc_s.so
+ rm -f ${D}${libdir}/libgcc_s.so
ln -sf `echo ${libdir}/gcc/${TARGET_SYS}/${BINV} \
| tr -s / \
| sed -e 's,^/,,' -e 's,[^/]*,..,g'`/lib/libgcc_s.so.1 \
${D}${libdir}/gcc/${TARGET_SYS}/${BINV}/libgcc_s.so
# We don't need libtool libraries
- rm ${D}${libdir}/libg2c.la &>/dev/null || true
-
+ rm -f ${D}${libdir}/libg2c.la &>/dev/null || true
# Cleanup manpages..
- rm -r ${D}${mandir}/man7
+ rm -rf ${D}${mandir}/man7
# We use libiberty from binutils
- rm ${D}${libdir}/libiberty.a
+ rm -f ${D}${libdir}/libiberty.a
cd ${D}${bindir}
# We care about g++ not c++
- rm *c++
+ rm -f *c++
# We don't care about the gcc-<version> ones for this
- rm *gcc-?.?*
+ rm -f *gcc-?.?*
# These sometimes show up, they are strange, we remove them
rm -f ${TARGET_ARCH}-*${TARGET_ARCH}-*
diff --git a/packages/gcc/gcc3-build-cross.inc b/packages/gcc/gcc3-build-cross.inc
index 384886c76e..e8a23e0d40 100644
--- a/packages/gcc/gcc3-build-cross.inc
+++ b/packages/gcc/gcc3-build-cross.inc
@@ -21,10 +21,6 @@ do_stage_append () {
rm -rf ${CROSS_DIR}/$d
done
- # These aren't useful on the cross toolchain
- rm -f ${CROSS_DIR}/bin/*gcov
- rm -f ${CROSS_DIR}/bin/*gccbug
-
# Fix a few include links so cross builds are happier
if [ ! -e ${STAGING_INCDIR}/c++ ]; then
mkdir -p ${STAGING_INCDIR}
diff --git a/packages/gcc/gcc3-build.inc b/packages/gcc/gcc3-build.inc
index 8048b45fba..74ad11033f 100644
--- a/packages/gcc/gcc3-build.inc
+++ b/packages/gcc/gcc3-build.inc
@@ -81,6 +81,7 @@ do_configure () {
export LD_FOR_TARGET="${HOST_PREFIX}ld"
export NM_FOR_TARGET="${HOST_PREFIX}nm"
export AR_FOR_TARGET="${HOST_PREFIX}ar"
+ export GFORTRAN_FOR_TARGET="gfortran"
export RANLIB_FOR_TARGET="${HOST_PREFIX}ranlib"
fi
export CC_FOR_BUILD="${BUILD_CC}"
diff --git a/packages/gcc/gcc4-build.inc b/packages/gcc/gcc4-build.inc
index 8b80f4820a..a2061194d7 100644
--- a/packages/gcc/gcc4-build.inc
+++ b/packages/gcc/gcc4-build.inc
@@ -1,5 +1,5 @@
FORTRAN = "f95"
-HAS_GFORTRAN = "yes"
+HAS_GFORTRAN ?= "yes"
HAS_G2C = "no"
include gcc3-build.inc
diff --git a/packages/gcc/gcc_3.4.3.bb b/packages/gcc/gcc_3.4.3.bb
index c92746be58..1cd108aa34 100644
--- a/packages/gcc/gcc_3.4.3.bb
+++ b/packages/gcc/gcc_3.4.3.bb
@@ -22,6 +22,7 @@ SRC_URI = "${GNU_MIRROR}/gcc/gcc-${PV}/gcc-${PV}.tar.bz2 \
file://gcc-3.4.0-arm-bigendian-uclibc.patch;patch=1 \
file://GCC3.4.0VisibilityPatch.diff;patch=1 \
file://15342.patch;patch=1 \
- file://always-fixincperm.patch;patch=1"
+ file://always-fixincperm.patch;patch=1 \
+ file://GCOV_PREFIX_STRIP-cross-profile_3.4.patch;patch=1"
include gcc3-build.inc
diff --git a/packages/gcc/gcc_3.4.4.bb b/packages/gcc/gcc_3.4.4.bb
index 2d04b0ed08..579678066f 100644
--- a/packages/gcc/gcc_3.4.4.bb
+++ b/packages/gcc/gcc_3.4.4.bb
@@ -22,7 +22,8 @@ SRC_URI = "${GNU_MIRROR}/gcc/gcc-${PV}/gcc-${PV}.tar.bz2 \
file://gcc-3.4.0-arm-bigendian-uclibc.patch;patch=1 \
file://GCC3.4.0VisibilityPatch.diff;patch=1 \
file://15342.patch;patch=1 \
- file://always-fixincperm.patch;patch=1"
+ file://always-fixincperm.patch;patch=1 \
+ file://GCOV_PREFIX_STRIP-cross-profile_3.4.patch;patch=1"
SRC_URI += "file://gcc34-configure.in.patch;patch=1"
SRC_URI += "file://gcc34-thumb-support.patch;patch=1"
diff --git a/packages/gcc/gcc_4.0.2.bb b/packages/gcc/gcc_4.0.2.bb
index d0c22b06d6..a83a030c8b 100644
--- a/packages/gcc/gcc_4.0.2.bb
+++ b/packages/gcc/gcc_4.0.2.bb
@@ -13,7 +13,8 @@ include gcc-package.inc
SRC_URI = "${GNU_MIRROR}/gcc/gcc-${PV}/gcc-${PV}.tar.bz2 \
file://arm-nolibfloat.patch;patch=1 \
file://arm-softfloat.patch;patch=1 \
- file://ldflags.patch;patch=1"
+ file://ldflags.patch;patch=1 \
+ file://GCOV_PREFIX_STRIP-cross-profile_4.1.patch;patch=1"
# uclibc patches below
SRC_URI_append = " file://100-uclibc-conf.patch;patch=1 \