gcov-tool: Flexible endian adjustment for merging coverage data
authorMartin Liska <mliska@suse.cz>
Thu, 28 May 2020 06:16:58 +0000 (08:16 +0200)
committerMartin Liska <mliska@suse.cz>
Thu, 28 May 2020 06:18:21 +0000 (08:18 +0200)
gcc/ChangeLog:
2020-05-27  Dong JianQiang  <dongjianqiang2@huawei.com>

PR gcov-profile/95332
* gcov-io.c (gcov_var::endian): Move field.
(from_file): Add IN_GCOV_TOOL check.
* gcov-io.h (gcov_magic): Ditto.

libgcc/ChangeLog:
2020-05-27  Dong JianQiang  <dongjianqiang2@huawei.com>

PR gcov-profile/95332
* libgcov-util.c (read_gcda_file): Call gcov_magic.
* libgcov.h (gcov_magic): Disable GCC poison.

gcc/gcov-io.c
gcc/gcov-io.h
libgcc/libgcov-util.c
libgcc/libgcov.h

index 213c413b3a013053435f57142f5885869a19844f..ac60f9baf47e1c5d81196b7c732f6b83c10cc602 100644 (file)
@@ -48,6 +48,7 @@ struct gcov_var
   unsigned overread;           /* Number of words overread.  */
   int error;                   /* < 0 overflow, > 0 disk error.  */
   int mode;                    /* < 0 writing, > 0 reading */
+  int endian;                  /* Swap endianness.  */
 #if IN_LIBGCOV
   /* Holds one block plus 4 bytes, thus all coverage reads & writes
      fit within this buffer and we always can transfer GCOV_BLOCK_SIZE
@@ -55,7 +56,6 @@ struct gcov_var
      or 8 byte objects.  */
   gcov_unsigned_t buffer[GCOV_BLOCK_SIZE + 1];
 #else
-  int endian;                  /* Swap endianness.  */
   /* Holds a variable length block, as the compiler can write
      strings and needs to backtrack.  */
   size_t alloc;
@@ -100,7 +100,7 @@ gcov_rewrite (void)
 
 static inline gcov_unsigned_t from_file (gcov_unsigned_t value)
 {
-#if !IN_LIBGCOV
+#if !IN_LIBGCOV || defined (IN_GCOV_TOOL)
   if (gcov_var.endian)
     {
       value = (value >> 16) | (value << 16);
@@ -222,7 +222,7 @@ gcov_close (void)
   return gcov_var.error;
 }
 
-#if !IN_LIBGCOV
+#if !IN_LIBGCOV || defined (IN_GCOV_TOOL)
 /* Check if MAGIC is EXPECTED. Use it to determine endianness of the
    file. Returns +1 for same endian, -1 for other endian and zero for
    not EXPECTED.  */
index ef888f3ff98b615b1cde3357dcf5b07f84617d7d..8cb68aaf42d1c0e92bf732e9fd860cb7c59be4bd 100644 (file)
@@ -332,6 +332,9 @@ struct gcov_summary
 
 #if !IN_LIBGCOV
 GCOV_LINKAGE int gcov_open (const char */*name*/, int /*direction*/);
+#endif
+
+#if !IN_LIBGCOV || defined (IN_GCOV_TOOL)
 GCOV_LINKAGE int gcov_magic (gcov_unsigned_t, gcov_unsigned_t);
 #endif
 
index 449638bc4b66fbe6e618991a86824b891ba2c2cc..fff54c6a3f6bf17d9033c41d0bdc510de7836cf6 100644 (file)
@@ -261,7 +261,7 @@ read_gcda_file (const char *filename)
 {
   unsigned tags[4];
   unsigned depth = 0;
-  unsigned magic, version;
+  unsigned version;
   struct gcov_info *obj_info;
   int i;
 
@@ -276,8 +276,7 @@ read_gcda_file (const char *filename)
     }
 
   /* Read magic.  */
-  magic = gcov_read_unsigned ();
-  if (magic != GCOV_DATA_MAGIC)
+  if (!gcov_magic (gcov_read_unsigned (), GCOV_DATA_MAGIC))
     {
       fnotice (stderr, "%s:not a gcov data file\n", filename);
       gcov_close ();
index 104b80bdcbb08c961ef75610867766a96e3c04ff..b248690086ea17b7f0cf57c608d1bf54510f9c5f 100644 (file)
@@ -147,7 +147,7 @@ extern struct gcov_info *gcov_list;
 
 /* Poison these, so they don't accidentally slip in.  */
 #pragma GCC poison gcov_write_string gcov_write_tag gcov_write_length
-#pragma GCC poison gcov_time gcov_magic
+#pragma GCC poison gcov_time
 
 #ifdef HAVE_GAS_HIDDEN
 #define ATTRIBUTE_HIDDEN  __attribute__ ((__visibility__ ("hidden")))