Back to index

glibc  2.9
Defines | Functions | Variables
pcprofiledump.c File Reference
#include <argp.h>
#include <byteswap.h>
#include <errno.h>
#include <error.h>
#include <fcntl.h>
#include <inttypes.h>
#include <libintl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "../version.h"

Go to the source code of this file.

Defines

#define PACKAGE   _libc_intl_domainname
#define _(Str)   gettext (Str)
#define N_(Str)   Str

Functions

static char * more_help (int key, const char *text, void *input)
static error_t parse_opt (int key, char *arg, struct argp_state *state)
int main (int argc, char *argv[])

Variables

static struct argp_option []
static const char doc [] = N_("Dump information generated by PC profiling.")
static const char args_doc [] = N_("[FILE]")
static struct argp

Define Documentation

#define _ (   Str)    gettext (Str)

Definition at line 43 of file pcprofiledump.c.

#define N_ (   Str)    Str

Definition at line 47 of file pcprofiledump.c.

Definition at line 40 of file pcprofiledump.c.


Function Documentation

int main ( int  argc,
char *  argv[] 
)

Definition at line 77 of file pcprofiledump.c.

{
  /* Set locale via LC_ALL.  */
  setlocale (LC_ALL, "");

  /* Set the text message domain.  */
  textdomain (PACKAGE);

  /* Parse and process arguments.  */
  int remaining;
  argp_parse (&argp, argc, argv, 0, &remaining, NULL);

  int fd;
  if (remaining == argc)
    fd = STDIN_FILENO;
  else if (remaining + 1 != argc)
    {
      argp_help (&argp, stdout, ARGP_HELP_SEE | ARGP_HELP_EXIT_ERR,
               program_invocation_short_name);
      exit (1);
    }
  else
    {
      /* Open the given file.  */
      fd = open (argv[remaining], O_RDONLY);

      if (fd == -1)
       error (EXIT_FAILURE, errno, _("cannot open input file"));
    }

  /* Read the first 4-byte word.  It contains the information about
     the word size and the endianess.  */
  uint32_t word;
  if (TEMP_FAILURE_RETRY (read (fd, &word, 4)) != 4)
    error (EXIT_FAILURE, errno, _("cannot read header"));

  /* Check whether we have to swap the byte order.  */
  int must_swap = (word & 0xfffffff0) == bswap_32 (0xdeb00000);
  if (must_swap)
    word = bswap_32 (word);

  /* We have two loops, one for 32 bit pointers, one for 64 bit pointers.  */
  if (word == 0xdeb00004)
    {
      union
      {
       uint32_t ptrs[2];
       char bytes[8];
      } pair;

      while (1)
       {
         size_t len = sizeof (pair);
         size_t n;

         while (len > 0
               && (n = TEMP_FAILURE_RETRY (read (fd, &pair.bytes[8 - len],
                                             len))) != 0)
           len -= n;

         if (len != 0)
           /* Nothing to read.  */
           break;

         printf ("this = %#010" PRIx32 ", caller = %#010" PRIx32 "\n",
                must_swap ? bswap_32 (pair.ptrs[0]) : pair.ptrs[0],
                must_swap ? bswap_32 (pair.ptrs[1]) : pair.ptrs[1]);
       }
    }
  else if (word == 0xdeb00008)
    {
      union
      {
       uint64_t ptrs[2];
       char bytes[16];
      } pair;

      while (1)
       {
         size_t len = sizeof (pair);
         size_t n;

         while (len > 0
               && (n = TEMP_FAILURE_RETRY (read (fd, &pair.bytes[8 - len],
                                             len))) != 0)
           len -= n;

         if (len != 0)
           /* Nothing to read.  */
           break;

         printf ("this = %#018" PRIx64 ", caller = %#018" PRIx64 "\n",
                must_swap ? bswap_64 (pair.ptrs[0]) : pair.ptrs[0],
                must_swap ? bswap_64 (pair.ptrs[1]) : pair.ptrs[1]);
       }
    }
  else
    /* This should not happen.  */
    error (EXIT_FAILURE, 0, _("invalid pointer size"));

  /* Clean up.  */
  close (fd);

  return 0;
}

Here is the call graph for this function:

static char * more_help ( int  key,
const char *  text,
void *  input 
) [static]

Definition at line 198 of file pcprofiledump.c.

{
  switch (key)
    {
    case ARGP_KEY_HELP_EXTRA:
      /* We print some extra information.  */
      return strdup (gettext ("\
For bug reporting instructions, please see:\n\
<http://www.gnu.org/software/libc/bugs.html>.\n"));
    default:
      break;
    }
  return (char *) text;
}

Here is the call graph for this function:

static error_t parse_opt ( int  key,
char *  arg,
struct argp_state state 
) [static]

Definition at line 184 of file pcprofiledump.c.

{
  switch (key)
    {
    case 'u':
      setbuf (stdout, NULL);
      break;
    default:
      return ARGP_ERR_UNKNOWN;
    }
  return 0;
}

Here is the call graph for this function:


Variable Documentation

struct argp [static]
Initial value:

Definition at line 70 of file pcprofiledump.c.

struct argp_option[] [static]
Initial value:
{
  { "unbuffered", 'u', NULL, 0, N_("Don't buffer output") },
  { NULL, 0, NULL, 0, NULL }
}

Definition at line 51 of file pcprofiledump.c.

const char args_doc[] = N_("[FILE]") [static]

Definition at line 61 of file pcprofiledump.c.

const char doc[] = N_("Dump information generated by PC profiling.") [static]

Definition at line 58 of file pcprofiledump.c.