/* Copyright (C) 2021-2024 Free Software Foundation, Inc.
   Contributed by Oracle.

   This file is part of GNU Binutils.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <values.h>
#include <assert.h>

#include "comp_com.h"

/*
 * To add a new message _FORMAT_ please perform the following tasks:
 * 1) Insert it into the list below, with the matching comment.
 *    The table is sorted by parameter type.  In increasing order
 *    they are: String, Procedure, Variable, Loop, Region, Integer.
 * 2) Insert the corresponding information into the following
 *    procedures in this file: ccm_num_params(), ccm_paramlist_index(),
 *    ccm_param_primtype(), and ccm_param_hightype().
 * 3) If you are also creating a new high-type or primitive-type,
 *    extend the corresponding enum, update this comment and make sure
 *    to update any code in the analyzer, iropt, cg or ube that depends
 *    on knowing the limited set of types.
 */

typedef enum ccm_fmt {
    CCMFMT_NONE,		/* none */
    CCMFMT_S1,			/* s1 */
    CCMFMT_S1S2,		/* s1, s2 */
    CCMFMT_S1L2,		/* s1, l2 */
    CCMFMT_S1L2VV3,		/* s1, l2, v3, v4, ... */
    CCMFMT_S1R2VV3,		/* s1, r2, v3, v4, ... */
    CCMFMT_S1X2,		/* s1, x2 */
    CCMFMT_P1,			/* p1 */
    CCMFMT_P1S2,		/* p1, s2 */
    CCMFMT_P1S2P3,		/* p1, s2, p3 */
    CCMFMT_P1S2P3I4,		/* p1, s2, p3, i4 */
    CCMFMT_P1S2I3,		/* p1, s2, i3 */
    CCMFMT_P1P2,		/* p1, p2 */
    CCMFMT_P1L2,		/* p1, l2 */
    CCMFMT_P1I2,		/* p1, i2 */
    CCMFMT_P1I2L3,		/* p1, i2, l3 */
    CCMFMT_P1I2LL3,		/* p1, i2, l3, l4 ... */
    CCMFMT_P1I2I3,		/* p1, i2, i3 */
    CCMFMT_PP1,			/* p1, p2, ... */
    CCMFMT_V1,			/* v1 */
    CCMFMT_V1V2,		/* v1, v2 */
    CCMFMT_V1L2,		/* v1, l2 */
    CCMFMT_VV1,			/* v1, v2, ... */
    CCMFMT_L1,			/* l1 */
    CCMFMT_L1S2,		/* l1, s2 */
    CCMFMT_L1S2L3,		/* l1, s2, l3 */
    CCMFMT_L1P2,		/* l1, p2 */
    CCMFMT_L1P2I3,		/* l1, p2, i3 */
    CCMFMT_L1PP2,		/* l1, p2, p3, ... */
    CCMFMT_L1VV2,		/* l1, v2, v3, ... */
    CCMFMT_L1L2,		/* l1, l2 */
    CCMFMT_L1L2L3,		/* l1, l2, l3 */
    CCMFMT_LL1,			/* l1, l2, ... */
    CCMFMT_L1R2,		/* l1, r2 */
    CCMFMT_L1I2,		/* l1, i2 */
    CCMFMT_L1I2L3,		/* l1, i2, l3 */
    CCMFMT_L1I2LL3,		/* l1, i2, l3, l4, ... */
    CCMFMT_L1I2I3L4,		/* l1, i2, i3, l4 */
    CCMFMT_L1I2I3I4I5,		/* l1, i2, ..., i5 */
    CCMFMT_L1I2I3I4I5I6I7,	/* l1, i2, ..., i7 */
    CCMFMT_L1I2I3I4I5I6I7I8I9,	/* l1, i2, ..., i9 */
    CCMFMT_L1II2,		/* l1, i2, i3, ... */
    CCMFMT_R1,			/* r1 */
    CCMFMT_R1VV2,		/* r1, v2, v3, ... */
    CCMFMT_I1,			/* i1 */
    CCMFMT_I1P2I3,		/* i1, p2, i3 */
    CCMFMT_I1V2,		/* i1, v2 */
    CCMFMT_I1V2V3,		/* i1, v2, v3 */
    CCMFMT_I1L2,		/* i1, l2 */
    CCMFMT_I1LL2,		/* i1, l2, l3, ... */
    CCMFMT_I1I2I3I4,		/* i1, i2, i3, i4 */
    CCMFMT_I1I2I3I4I5I6,	/* i1, i2, ..., i6 */
    CCMFMT_I1I2I3I4I5I6I7I8,	/* i1, i2, ..., i8 */
    CCMFMT_LAST
} Ccm_Fmttype_t;

/*
 * Low- and high-level types for commentary parameters.
 */

typedef enum ccm_primtype
{
  CCM_PRIMTYPE_NONE,
  CCM_PRIMTYPE_STRING,
  CCM_PRIMTYPE_INTEGER,
  CCM_PRIMTYPE_HEXSTRING
} Ccm_Primtype_t;

typedef enum ccm_hightype
{
  CCM_HITYPE_NONE,
  CCM_HITYPE_STRING,
  CCM_HITYPE_PROCEDURE,
  CCM_HITYPE_VARIABLE,
  CCM_HITYPE_LOOPTAG,
  CCM_HITYPE_REGIONTAG,
  CCM_HITYPE_HEXSTRING,
  CCM_HITYPE_INTEGER
} Ccm_Hitype_t;

typedef struct ccm_attrs
{
  char *msg;            /* I18N msg string */
  const char *name;     /* Print name for this message ID */
  int32_t vis;          /* Visibility bits */
  Ccm_Fmttype_t fmt;    /* Format type */
} Ccm_Attr_t;

static Ccm_Attr_t *ccm_attrs;            /* Table of per-msg attributes */
static nl_catd ccm_catd = (nl_catd) - 1; /* messages id */

/*
 * map COMPMSG_ID to table indices
 */
static int
ccm_vis_index (COMPMSG_ID m)
{
  int32_t high = m >> 8;
  int32_t low = m & 0xFF;
  for (int i = 0; i < 24; i++, high >>= 1)
    if (high <= 1)
      return (i << 8) + low + 1;
  return 0;
}

/*
 * Return # parameters for this message; MAXINT for messages with
 * parameter lists.
 */
static int
ccm_num_params (COMPMSG_ID m)
{
  int vindex;
  int res;
  vindex = ccm_vis_index (m);
  switch (ccm_attrs[vindex].fmt)
    {
    case CCMFMT_NONE:
      res = 0;
      break;
    case CCMFMT_S1:
    case CCMFMT_P1:
    case CCMFMT_V1:
    case CCMFMT_L1:
    case CCMFMT_R1:
    case CCMFMT_I1:
      res = 1;
      break;
    case CCMFMT_S1S2:
    case CCMFMT_S1L2:
    case CCMFMT_S1X2:
    case CCMFMT_P1S2:
    case CCMFMT_P1P2:
    case CCMFMT_P1L2:
    case CCMFMT_P1I2:
    case CCMFMT_V1V2:
    case CCMFMT_V1L2:
    case CCMFMT_L1S2:
    case CCMFMT_L1P2:
    case CCMFMT_L1L2:
    case CCMFMT_L1R2:
    case CCMFMT_L1I2:
    case CCMFMT_I1V2:
    case CCMFMT_I1L2:
      res = 2;
      break;
    case CCMFMT_P1S2P3:
    case CCMFMT_P1S2I3:
    case CCMFMT_P1I2L3:
    case CCMFMT_P1I2I3:
    case CCMFMT_L1S2L3:
    case CCMFMT_L1P2I3:
    case CCMFMT_L1L2L3:
    case CCMFMT_L1I2L3:
    case CCMFMT_I1P2I3:
    case CCMFMT_I1V2V3:
      res = 3;
      break;
    case CCMFMT_P1S2P3I4:
    case CCMFMT_L1I2I3L4:
    case CCMFMT_I1I2I3I4:
      res = 4;
      break;
    case CCMFMT_L1I2I3I4I5:
      res = 5;
      break;
    case CCMFMT_I1I2I3I4I5I6:
      res = 6;
      break;
    case CCMFMT_L1I2I3I4I5I6I7:
      res = 7;
      break;
    case CCMFMT_I1I2I3I4I5I6I7I8:
      res = 8;
      break;
    case CCMFMT_L1I2I3I4I5I6I7I8I9:
      res = 9;
      break;
    case CCMFMT_S1L2VV3:
    case CCMFMT_S1R2VV3:
    case CCMFMT_PP1:
    case CCMFMT_P1I2LL3:
    case CCMFMT_VV1:
    case CCMFMT_L1PP2:
    case CCMFMT_L1VV2:
    case CCMFMT_LL1:
    case CCMFMT_L1I2LL3:
    case CCMFMT_L1II2:
    case CCMFMT_R1VV2:
    case CCMFMT_I1LL2:
      res = MAXINT;
      break;
    case CCMFMT_LAST:
    default:
      /* programming failure */
      /* if(1) is hack to get around warning from C++ compiler */
      if (1) assert (0);
      break;
    }
  return res;
}

static int
ccm_paramlist_index (COMPMSG_ID m)
{
  int res;
  int vindex = ccm_vis_index (m);
  switch (ccm_attrs[vindex].fmt)
    {
    case CCMFMT_NONE:
    case CCMFMT_S1:
    case CCMFMT_S1S2:
    case CCMFMT_S1L2:
    case CCMFMT_S1X2:
    case CCMFMT_P1:
    case CCMFMT_P1S2:
    case CCMFMT_P1S2P3:
    case CCMFMT_P1S2P3I4:
    case CCMFMT_P1S2I3:
    case CCMFMT_P1P2:
    case CCMFMT_P1L2:
    case CCMFMT_P1I2:
    case CCMFMT_P1I2L3:
    case CCMFMT_P1I2I3:
    case CCMFMT_V1:
    case CCMFMT_V1V2:
    case CCMFMT_V1L2:
    case CCMFMT_L1:
    case CCMFMT_L1S2:
    case CCMFMT_L1S2L3:
    case CCMFMT_L1P2:
    case CCMFMT_L1P2I3:
    case CCMFMT_L1L2:
    case CCMFMT_L1L2L3:
    case CCMFMT_L1R2:
    case CCMFMT_L1I2:
    case CCMFMT_L1I2L3:
    case CCMFMT_L1I2I3L4:
    case CCMFMT_L1I2I3I4I5:
    case CCMFMT_L1I2I3I4I5I6I7:
    case CCMFMT_L1I2I3I4I5I6I7I8I9:
    case CCMFMT_R1:
    case CCMFMT_I1:
    case CCMFMT_I1P2I3:
    case CCMFMT_I1V2:
    case CCMFMT_I1V2V3:
    case CCMFMT_I1L2:
    case CCMFMT_I1I2I3I4:
    case CCMFMT_I1I2I3I4I5I6:
    case CCMFMT_I1I2I3I4I5I6I7I8:
      res = 0;
      break;
    case CCMFMT_PP1:
    case CCMFMT_VV1:
    case CCMFMT_LL1:
      res = 1;
      break;
    case CCMFMT_L1PP2:
    case CCMFMT_L1VV2:
    case CCMFMT_L1II2:
    case CCMFMT_R1VV2:
    case CCMFMT_I1LL2:
      res = 2;
      break;
    case CCMFMT_S1L2VV3:
    case CCMFMT_S1R2VV3:
    case CCMFMT_P1I2LL3:
    case CCMFMT_L1I2LL3:
      res = 3;
      break;
    case CCMFMT_LAST:
    default:
      /* programming failure */
      /* if(1) is hack to get around warning from C++ compiler */
      if (1) assert (0);
      break;
    }
  return res;
}

static Ccm_Primtype_t
ccm_param_primtype (COMPMSG_ID m, int param_idx)
{
  int vindex;
  Ccm_Primtype_t res;
  if (param_idx <= 0 || param_idx > ccm_num_params (m))
    return CCM_PRIMTYPE_NONE;

  res = CCM_PRIMTYPE_NONE; /* should always be updated */
  vindex = ccm_vis_index (m);
  switch (ccm_attrs[vindex].fmt)
    {
      /*
       * Sort cases by:
       * 1) # parameters
       * 2) Strings before Integers
       * 3) Enum tags
       */
    case CCMFMT_NONE:
      /* programming failure */
      /* if(1) is hack to get around warning from C++ compiler */
      if (1)
	assert (0);
      break;
    case CCMFMT_S1:
    case CCMFMT_P1:
    case CCMFMT_V1:
    case CCMFMT_L1:
    case CCMFMT_R1:
      if (param_idx == 1)
	res = CCM_PRIMTYPE_STRING;
      break;
    case CCMFMT_I1:
      if (param_idx == 1)
	res = CCM_PRIMTYPE_INTEGER;
      break;
    case CCMFMT_S1S2:
    case CCMFMT_S1L2:
    case CCMFMT_P1S2:
    case CCMFMT_P1P2:
    case CCMFMT_P1L2:
    case CCMFMT_V1V2:
    case CCMFMT_V1L2:
    case CCMFMT_L1S2:
    case CCMFMT_L1P2:
    case CCMFMT_L1L2:
    case CCMFMT_L1R2:
      if (param_idx == 1 || param_idx == 2)
	res = CCM_PRIMTYPE_STRING;
      break;
    case CCMFMT_S1X2:
      if (param_idx == 1)
	res = CCM_PRIMTYPE_STRING;
      else if (param_idx == 2)
	res = CCM_PRIMTYPE_HEXSTRING;
      break;
    case CCMFMT_P1I2:
    case CCMFMT_L1I2:
      if (param_idx == 1)
	res = CCM_PRIMTYPE_STRING;
      else if (param_idx == 2)
	res = CCM_PRIMTYPE_INTEGER;
      break;
    case CCMFMT_I1V2:
    case CCMFMT_I1L2:
      if (param_idx == 1)
	res = CCM_PRIMTYPE_INTEGER;
      else if (param_idx == 2)
	res = CCM_PRIMTYPE_STRING;
      break;
    case CCMFMT_P1S2P3:
    case CCMFMT_L1S2L3:
    case CCMFMT_L1L2L3:
      if (param_idx >= 1 && param_idx <= 3)
	res = CCM_PRIMTYPE_STRING;
      break;
    case CCMFMT_P1S2I3:
    case CCMFMT_L1P2I3:
      if (param_idx == 1 || param_idx == 2)
	res = CCM_PRIMTYPE_STRING;
      else if (param_idx == 3)
	res = CCM_PRIMTYPE_INTEGER;
      break;
    case CCMFMT_P1I2L3:
    case CCMFMT_L1I2L3:
      if (param_idx == 1 || param_idx == 3)
	res = CCM_PRIMTYPE_STRING;
      else if (param_idx == 2)
	res = CCM_PRIMTYPE_INTEGER;
      break;
   case CCMFMT_P1I2I3:
      if (param_idx == 1)
	res = CCM_PRIMTYPE_STRING;
      else if (param_idx == 2  || param_idx == 3)
	res = CCM_PRIMTYPE_INTEGER;
      break;
    case CCMFMT_I1V2V3:
      if (param_idx == 1)
	res = CCM_PRIMTYPE_INTEGER;
      else if (param_idx == 2 || param_idx == 3)
	res = CCM_PRIMTYPE_STRING;
      break;
    case CCMFMT_I1P2I3:
      if (param_idx == 1 || param_idx == 3)
	res = CCM_PRIMTYPE_INTEGER;
      else if (param_idx == 2)
	res = CCM_PRIMTYPE_STRING;
      break;
    case CCMFMT_L1I2I3L4:
      if (param_idx == 1 || param_idx == 4)
	res = CCM_PRIMTYPE_STRING;
      else if (param_idx == 2 || param_idx == 3)
	res = CCM_PRIMTYPE_INTEGER;
      break;
    case CCMFMT_P1S2P3I4:
      if (param_idx >= 1 && param_idx <= 3)
	res = CCM_PRIMTYPE_STRING;
      else if (param_idx == 4)
	res = CCM_PRIMTYPE_INTEGER;
      break;
    case CCMFMT_I1I2I3I4:
      if (param_idx >= 1 && param_idx <= 4)
	res = CCM_PRIMTYPE_INTEGER;
      break;
    case CCMFMT_L1I2I3I4I5:
      if (param_idx == 1)
	res = CCM_PRIMTYPE_STRING;
      else if (param_idx >= 2 && param_idx <= 5)
	res = CCM_PRIMTYPE_INTEGER;
      break;
    case CCMFMT_I1I2I3I4I5I6:
      if (param_idx >= 1 && param_idx <= 6)
	res = CCM_PRIMTYPE_INTEGER;
      break;
    case CCMFMT_L1I2I3I4I5I6I7:
      if (param_idx == 1)
	res = CCM_PRIMTYPE_STRING;
      else if (param_idx >= 2 && param_idx <= 7)
	res = CCM_PRIMTYPE_INTEGER;
      break;
    case CCMFMT_I1I2I3I4I5I6I7I8:
      if (param_idx >= 1 && param_idx <= 8)
	res = CCM_PRIMTYPE_INTEGER;
      break;
    case CCMFMT_L1I2I3I4I5I6I7I8I9:
      if (param_idx == 1)
	res = CCM_PRIMTYPE_STRING;
      else if (param_idx >= 2 && param_idx <= 9)
	res = CCM_PRIMTYPE_INTEGER;
      break;
    case CCMFMT_S1L2VV3:
    case CCMFMT_S1R2VV3:
    case CCMFMT_PP1:
    case CCMFMT_VV1:
    case CCMFMT_L1PP2:
    case CCMFMT_L1VV2:
    case CCMFMT_LL1:
    case CCMFMT_R1VV2:
      res = CCM_PRIMTYPE_STRING;
      break;
    case CCMFMT_P1I2LL3:
    case CCMFMT_L1I2LL3:
      if (param_idx == 2)
	res = CCM_PRIMTYPE_INTEGER;
      else
	res = CCM_PRIMTYPE_STRING;
      break;
    case CCMFMT_L1II2:
      if (param_idx == 1)
	res = CCM_PRIMTYPE_STRING;
      else
	res = CCM_PRIMTYPE_INTEGER;
      break;
    case CCMFMT_I1LL2:
      if (param_idx == 1)
	res = CCM_PRIMTYPE_INTEGER;
      else
	res = CCM_PRIMTYPE_STRING;
      break;
    case CCMFMT_LAST:
    default:
      /* programming failure */
      /* if(1) is hack to get around warning from C++ compiler */
      if (1)
	assert (0);
      break;
    }
  return res;
}

static Ccm_Hitype_t
ccm_param_hightype (COMPMSG_ID m, int param_idx)
{
  int vindex;
  Ccm_Hitype_t res;

  if (param_idx <= 0 || param_idx > ccm_num_params (m))
    return CCM_HITYPE_NONE;
  res = CCM_HITYPE_NONE; /* should always be updated */
  vindex = ccm_vis_index (m);
  switch (ccm_attrs[vindex].fmt)
    {
    case CCMFMT_NONE:
      /* programming failure */
      /* if(1) is hack to get around warning from C++ compiler */
      if (1)
	assert (0);
      break;
    case CCMFMT_S1:
      if (param_idx == 1)
	res = CCM_HITYPE_STRING;
      break;
    case CCMFMT_S1S2:
      if (param_idx == 1 || param_idx == 2)
	res = CCM_HITYPE_STRING;
      break;
    case CCMFMT_S1L2:
      if (param_idx == 1)
	res = CCM_HITYPE_STRING;
      else if (param_idx == 2)
	res = CCM_HITYPE_LOOPTAG;
      break;
    case CCMFMT_S1L2VV3:
      if (param_idx == 1)
	res = CCM_HITYPE_STRING;
      else if (param_idx == 2)
	res = CCM_HITYPE_LOOPTAG;
      else
	res = CCM_HITYPE_STRING;
      break;
    case CCMFMT_S1R2VV3:
      if (param_idx == 1)
	res = CCM_HITYPE_STRING;
      else if (param_idx == 2)
	res = CCM_HITYPE_REGIONTAG;
      else
	res = CCM_HITYPE_VARIABLE;
      break;
    case CCMFMT_S1X2:
      if (param_idx == 1)
	res = CCM_HITYPE_STRING;
      else if (param_idx == 2)
	res = CCM_HITYPE_HEXSTRING;
      break;
    case CCMFMT_P1:
      if (param_idx == 1)
	res = CCM_HITYPE_PROCEDURE;
      break;
    case CCMFMT_P1S2:
      if (param_idx == 1)
	res = CCM_HITYPE_PROCEDURE;
      else if (param_idx == 2)
	res = CCM_HITYPE_STRING;
      break;
    case CCMFMT_P1S2P3:
      if (param_idx == 1 || param_idx == 3)
	res = CCM_HITYPE_PROCEDURE;
      else if (param_idx == 2)
	res = CCM_HITYPE_STRING;
      break;
    case CCMFMT_P1S2P3I4:
      if (param_idx == 1 || param_idx == 3)
	res = CCM_HITYPE_PROCEDURE;
      else if (param_idx == 2)
	res = CCM_HITYPE_STRING;
      else if (param_idx == 4)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_P1S2I3:
      if (param_idx == 1)
	res = CCM_HITYPE_PROCEDURE;
      else if (param_idx == 2)
	res = CCM_HITYPE_STRING;
      else if (param_idx == 3)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_P1P2:
      if (param_idx == 1 || param_idx == 2)
	res = CCM_HITYPE_PROCEDURE;
      break;
    case CCMFMT_P1L2:
      if (param_idx == 1)
	res = CCM_HITYPE_PROCEDURE;
      else if (param_idx == 2)
	res = CCM_HITYPE_LOOPTAG;
      break;
    case CCMFMT_P1I2:
      if (param_idx == 1)
	res = CCM_HITYPE_PROCEDURE;
      else if (param_idx == 2)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_P1I2L3:
      if (param_idx == 1)
	res = CCM_HITYPE_PROCEDURE;
      else if (param_idx == 2)
	res = CCM_HITYPE_INTEGER;
      else if (param_idx == 3)
	res = CCM_HITYPE_LOOPTAG;
      break;
    case CCMFMT_P1I2I3:
      if (param_idx == 1)
	res = CCM_HITYPE_PROCEDURE;
      else if (param_idx == 2 || param_idx == 3)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_P1I2LL3:
      if (param_idx == 1)
	res = CCM_HITYPE_PROCEDURE;
      else if (param_idx == 2)
	res = CCM_HITYPE_INTEGER;
      else
	res = CCM_HITYPE_LOOPTAG;
      break;
    case CCMFMT_PP1:
      res = CCM_HITYPE_PROCEDURE;
      break;
    case CCMFMT_V1:
      if (param_idx == 1)
	res = CCM_HITYPE_VARIABLE;
      break;
    case CCMFMT_V1V2:
      if (param_idx == 1 || param_idx == 2)
	res = CCM_HITYPE_VARIABLE;
      break;
    case CCMFMT_V1L2:
      if (param_idx == 1)
	res = CCM_HITYPE_VARIABLE;
      else if (param_idx == 2)
	res = CCM_HITYPE_LOOPTAG;
      break;
    case CCMFMT_VV1:
      res = CCM_HITYPE_VARIABLE;
      break;
    case CCMFMT_L1:
      if (param_idx == 1)
	res = CCM_HITYPE_LOOPTAG;
      break;
    case CCMFMT_L1S2:
      if (param_idx == 1)
	res = CCM_HITYPE_LOOPTAG;
      else if (param_idx == 2)
	res = CCM_HITYPE_STRING;
      break;
    case CCMFMT_L1S2L3:
      if (param_idx == 1 || param_idx == 3)
	res = CCM_HITYPE_LOOPTAG;
      else if (param_idx == 2)
	res = CCM_HITYPE_STRING;
      break;
    case CCMFMT_L1P2:
      if (param_idx == 1)
	res = CCM_HITYPE_LOOPTAG;
      else if (param_idx == 2)
	res = CCM_HITYPE_PROCEDURE;
      break;
    case CCMFMT_L1P2I3:
      if (param_idx == 1)
	res = CCM_HITYPE_LOOPTAG;
      else if (param_idx == 2)
	res = CCM_HITYPE_PROCEDURE;
      else if (param_idx == 3)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_L1PP2:
      if (param_idx == 1)
	res = CCM_HITYPE_LOOPTAG;
      else
	res = CCM_HITYPE_PROCEDURE;
      break;
    case CCMFMT_L1VV2:
      if (param_idx == 1)
	res = CCM_HITYPE_LOOPTAG;
      else
	res = CCM_HITYPE_VARIABLE;
      break;
    case CCMFMT_L1L2:
      if (param_idx == 1 || param_idx == 2)
	res = CCM_HITYPE_LOOPTAG;
      break;
    case CCMFMT_L1L2L3:
      if (param_idx >= 1 && param_idx <= 3)
	res = CCM_HITYPE_LOOPTAG;
      break;
    case CCMFMT_LL1:
      res = CCM_HITYPE_LOOPTAG;
      break;
    case CCMFMT_L1R2:
      if (param_idx == 1)
	res = CCM_HITYPE_LOOPTAG;
      else if (param_idx == 2)
	res = CCM_HITYPE_REGIONTAG;
      break;
    case CCMFMT_L1I2:
      if (param_idx == 1)
	res = CCM_HITYPE_LOOPTAG;
      else if (param_idx == 2)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_L1I2L3:
      if (param_idx == 1 || param_idx == 3)
	res = CCM_HITYPE_LOOPTAG;
      else if (param_idx == 2)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_L1I2LL3:
      if (param_idx == 2)
	res = CCM_HITYPE_INTEGER;
      else
	res = CCM_HITYPE_LOOPTAG;
      break;
    case CCMFMT_L1I2I3L4:
      if (param_idx == 1 || param_idx == 4)
	res = CCM_HITYPE_LOOPTAG;
      else if (param_idx == 2 || param_idx == 3)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_L1I2I3I4I5:
      if (param_idx == 1)
	res = CCM_HITYPE_LOOPTAG;
      else if (param_idx >= 2 && param_idx <= 5)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_L1I2I3I4I5I6I7:
      if (param_idx == 1)
	res = CCM_HITYPE_LOOPTAG;
      else if (param_idx >= 2 && param_idx <= 7)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_L1I2I3I4I5I6I7I8I9:
      if (param_idx == 1)
	res = CCM_HITYPE_LOOPTAG;
      else if (param_idx >= 2 && param_idx <= 9)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_L1II2:
      if (param_idx == 1)
	res = CCM_HITYPE_LOOPTAG;
      else
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_R1:
      if (param_idx == 1)
	res = CCM_HITYPE_REGIONTAG;
      break;
    case CCMFMT_R1VV2:
      if (param_idx == 1)
	res = CCM_HITYPE_REGIONTAG;
      else
	res = CCM_HITYPE_VARIABLE;
      break;
    case CCMFMT_I1:
      if (param_idx == 1)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_I1P2I3:
      if (param_idx == 1 || param_idx == 3)
	res = CCM_HITYPE_INTEGER;
      else if (param_idx == 2)
	res = CCM_HITYPE_PROCEDURE;
      break;
    case CCMFMT_I1V2:
      if (param_idx == 1)
	res = CCM_HITYPE_INTEGER;
      else if (param_idx == 2)
	res = CCM_HITYPE_VARIABLE;
      break;
    case CCMFMT_I1V2V3:
      if (param_idx == 1)
	res = CCM_HITYPE_INTEGER;
      else if (param_idx == 2 || param_idx == 3)
	res = CCM_HITYPE_VARIABLE;
      break;
    case CCMFMT_I1L2:
      if (param_idx == 1)
	res = CCM_HITYPE_INTEGER;
      else if (param_idx == 2)
	res = CCM_HITYPE_LOOPTAG;
      break;
    case CCMFMT_I1LL2:
      if (param_idx == 1)
	res = CCM_HITYPE_INTEGER;
      else
	res = CCM_HITYPE_LOOPTAG;
      break;
    case CCMFMT_I1I2I3I4:
      if (param_idx >= 1 && param_idx <= 4)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_I1I2I3I4I5I6:
      if (param_idx >= 1 && param_idx <= 6)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_I1I2I3I4I5I6I7I8:
      if (param_idx >= 1 && param_idx <= 8)
	res = CCM_HITYPE_INTEGER;
      break;
    case CCMFMT_LAST:
    default:
      /* programming failure */
      /* if(1) is hack to get around warning from C++ compiler */
      if (1)
	assert (0);
      break;
    }
  return res;
}

static void
ccm_vis_init ()
{
  int size, vindex;
  static int done = 0;
  if (done)
    return;
  done = 1;
  size = ccm_vis_index ((COMPMSG_ID) (CCMV_BASIC << 8));
  ccm_attrs = (Ccm_Attr_t *) calloc (size, sizeof (Ccm_Attr_t));
  if (ccm_attrs == NULL)
    exit (1);
  vindex = ccm_vis_index (CCM_MODDATE);
  ccm_attrs[vindex].vis = CCMV_VER | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_MODDATE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Source file %s, last modified on date %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1S2;

  vindex = ccm_vis_index (CCM_COMPVER);
  ccm_attrs[vindex].vis = CCMV_VER | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_COMPVER";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Component %s, version %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1S2;

  vindex = ccm_vis_index (CCM_COMPDATE);
  ccm_attrs[vindex].vis = CCMV_VER | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_COMPDATE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Compilation date %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_COMPOPT);
  ccm_attrs[vindex].vis = CCMV_VER | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_COMPOPT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Compilation options %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_ACOMPOPT);
  ccm_attrs[vindex].vis = CCMV_VER | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_ACOMPOPT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Actual Compilation options %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_VAR_ALIAS);
  ccm_attrs[vindex].vis = CCMV_WARN | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_VAR_ALIAS";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Variable %s aliased to %s");
  ccm_attrs[vindex].fmt = CCMFMT_V1V2;

  vindex = ccm_vis_index (CCM_FBIRDIFF);
  ccm_attrs[vindex].vis = CCMV_WARN | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_FBIRDIFF";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Profile feedback data inconsistent with"
				   " intermediate representation file; check compiler"
				   " version, flags and source file");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_OPTRED_SWAP);
  ccm_attrs[vindex].vis = CCMV_WARN | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_OPTRED_SWAP";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Optimization level for %s reduced from %d to"
				   " %d due to insufficient swap space");
  ccm_attrs[vindex].fmt = CCMFMT_P1I2I3;

  vindex = ccm_vis_index (CCM_OPTRED_CPLX);
  ccm_attrs[vindex].vis = CCMV_WARN | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_OPTRED_CPLX";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Optimization level for %s reduced from %d to"
				   " %d due to program complexity");
  ccm_attrs[vindex].fmt = CCMFMT_P1I2I3;

  vindex = ccm_vis_index (CCM_UNKNOWN);
  ccm_attrs[vindex].vis = CCMV_WARN | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNKNOWN";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Unexpected compiler comment %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_UNPAR_CALL);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_CALL";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below not parallelized because it contains a"
				   " call to %s");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_PAR_SER);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_PAR_SER";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Both serial and parallel versions generated for"
				   " loop below");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_PAR_SER_VER);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_PAR_SER_VER";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Both serial and parallel versions generated for"
				   " loop below; with parallel version used if %s,"
				   " serial otherwise");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_PAR_DRECTV);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_PAR_DRECTV";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below parallelized by explicit user"
				   " directive");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_APAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_APAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below autoparallelized");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_AUTOPAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_AUTOPAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below autoparallelized; equivalent"
				   " explict directive is %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_UNPAR_DD);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_DD";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below could not be parallelized because of a"
				   " data dependency on %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_UNPAR_DDA);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_DDA";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below could not be parallelized because of a"
				   " data dependency or aliasing of %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_UNPAR_ANONDD);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_ANONDD";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below could not be parallelized because of"
				   " an anonymous data dependency");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_UNPAR_ANONDDA);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_ANONDDA";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below could not be parallelized because of"
				   " an anonymous data dependency or aliasing");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_PAR_WORK);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_PAR_WORK";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below parallelized, but might not contain"
				   " enough work to be efficiently run in parallel");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_UNPAR_EXIT);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_EXIT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below not parallelized because it contains"
				   " multiple exit points");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_UNPAR_STRNG);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_STRNG";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below not parallelized because it contains a"
				   " strange flow of control");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_UNPAR_IO);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_IO";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below not parallelized because it contains"
				   " I/O or other MT-unsafe calls");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_PAR_BODY_NAME);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_PAR_BODY_NAME";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Parallel loop-body code is in function %s");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_UNPAR_NLOOPIDX);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_NLOOPIDX";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below not parallelized because loop index"
				   " not found");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_UNPAR_DRECTV);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_DRECTV";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below not parallelized because of explicit"
				   " user directive");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_UNPAR_NOTPROFIT);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_NOTPROFIT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below not parallelized because it was not"
				   " profitable to do so");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_UNPAR_NEST);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_NEST";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below not parallelized because it was"
				   " nested in a parallel loop");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_UNPAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below not parallelized");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_UNPAR_NOAUTO);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_NOAUTO";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below not parallelized because"
				   " autoparallelization is not enabled");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_PR_L_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_PR_L_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Private variables in loop below:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_SH_L_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_SH_L_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Shared variables in loop below:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_TP_L_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_TP_L_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Threadprivate variables in loop below:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_RV_L_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_RV_L_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Reduction variables in loop below:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_IM_L_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_IM_L_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Implicit variables in loop below:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_PR_O_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_PR_O_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Private variables in OpenMP construct below:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_SH_O_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_SH_O_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Shared variables in OpenMP construct below:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_TP_O_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_TP_O_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Threadprivate variables in OpenMP construct"
				   " below: %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_RV_O_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_RV_O_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Reduction variables in OpenMP construct below:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_IM_O_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_IM_O_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Implicit variables in OpenMP construct below:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_UNPAR_IN_OMP);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_IN_OMP";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below not parallelized because it is inside"
				   " an OpenMP region");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_FP_O_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_FP_O_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Firstprivate variables in OpenMP construct below:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_LP_O_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LP_O_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Lastprivate variables in OpenMP construct below:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_CP_O_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_CP_O_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Copyprivate variables in OpenMP construct below:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_PR_OAS_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_PR_OAS_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Variables autoscoped as PRIVATE in OpenMP"
				   " construct below: %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_SH_OAS_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_SH_OAS_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Variables autoscoped as SHARED in OpenMP"
				   " construct below: %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_FP_OAS_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_FP_OAS_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Variables autoscoped as FIRSTPRIVATE in OpenMP"
				   " construct below: %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_LP_OAS_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LP_OAS_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Variables autoscoped as LASTPRIVATE in OpenMP"
				   " construct below: %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_RV_OAS_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_RV_OAS_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Variables autoscoped as REDUCTION in OpenMP"
				   " construct below: %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_FAIL_OAS_VAR);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_WARN | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_FAIL_OAS_VAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Variables cannot be autoscoped in OpenMP"
				   " construct below: %s");
  ccm_attrs[vindex].fmt = CCMFMT_VV1;

  vindex = ccm_vis_index (CCM_SERIALIZE_OAS);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_WARN | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_SERIALIZE_OAS";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "OpenMP parallel region below is serialized"
				   " because autoscoping has failed");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_UNPAR_CALL_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNPAR_CALL_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s not parallelized because it contains calls"
				   " to: %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1PP2;

  vindex = ccm_vis_index (CCM_PAR_DRECTV_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_PAR_DRECTV_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s parallelized by explicit user directive");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_APAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_APAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s autoparallelized");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_AUTOPAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_AUTOPAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s autoparallelized; equivalent"
				   " explict directive is %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1S2;

  vindex = ccm_vis_index (CCM_UNPAR_DD_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNPAR_DD_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be parallelized because of"
				   " data dependences on: %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1VV2;

  vindex = ccm_vis_index (CCM_UNPAR_DDA_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNPAR_DDA_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be parallelized because of a"
				   " data dependence or aliasing of: %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1VV2;

  vindex = ccm_vis_index (CCM_UNPAR_ANONDD_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNPAR_ANONDD_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be parallelized because of an"
				   " anonymous data dependence");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_UNPAR_ANONDDA_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNPAR_ANONDDA_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be parallelized because of an"
				   " anonymous data dependence or aliasing");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_PAR_WORK_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_PAR_WORK_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s parallelized, but might not contain"
				   " enough work to run efficiently in parallel");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_UNPAR_EXIT_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNPAR_EXIT_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s not parallelized because it contains"
				   " multiple exit points");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_UNPAR_STRANGE_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNPAR_STRANGE_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s not parallelized because it contains a"
				   " strange flow of control");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_UNPAR_IO_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNPAR_IO_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s not parallelized because it contains"
				   " I/O or other MT-unsafe calls");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_PAR_BODY_NAME_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP;
  ccm_attrs[vindex].name = "CCM_PAR_BODY_NAME_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s parallel loop-body code placed in"
				   " function %s along with %d inner loops");
  ccm_attrs[vindex].fmt = CCMFMT_L1P2I3;

  vindex = ccm_vis_index (CCM_UNPAR_NLOOPIDX_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNPAR_NLOOPIDX_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s not parallelized because loop index not"
				   " found");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_UNPAR_DRECTV_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNPAR_DRECTV_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s not parallelized because of explicit"
				   " user directive");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_UNPAR_NOTPROFIT_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNPAR_NOTPROFIT_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s not parallelized because it was not"
				   " profitable to do so");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_UNPAR_NEST_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNPAR_NEST_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s not parallelized because it was"
				   " nested within a parallel loop");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_UNPAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s not parallelized");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_UNPAR_NOAUTO_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNPAR_NOAUTO_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s not parallelized because"
				   " autoparallelization is not enabled");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_PR_L_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_PR_L_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Private variables in %s:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1VV2;

  vindex = ccm_vis_index (CCM_SH_L_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_SH_L_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Shared variables in %s:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1VV2;

  vindex = ccm_vis_index (CCM_TP_L_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_TP_L_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Threadprivate variables in %s:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1VV2;

  vindex = ccm_vis_index (CCM_RV_L_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_RV_L_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Reduction variables of operator %s in %s:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1L2VV3;

  vindex = ccm_vis_index (CCM_IM_L_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_IM_L_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Implicit variables in %s:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1VV2;

  vindex = ccm_vis_index (CCM_PR_O_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_PR_O_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Private variables in %s: %s");
  ccm_attrs[vindex].fmt = CCMFMT_R1VV2;

  vindex = ccm_vis_index (CCM_SH_O_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_SH_O_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Shared variables in %s: %s");
  ccm_attrs[vindex].fmt = CCMFMT_R1VV2;

  vindex = ccm_vis_index (CCM_TP_O_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_TP_O_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Threadprivate variables in %s: %s");
  ccm_attrs[vindex].fmt = CCMFMT_R1VV2;

  vindex = ccm_vis_index (CCM_RV_O_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_RV_O_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Reduction variables of operator %s in %s:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1R2VV3;

  vindex = ccm_vis_index (CCM_IM_O_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_IM_O_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Implicit variables in %s: %s");
  ccm_attrs[vindex].fmt = CCMFMT_R1VV2;

  vindex = ccm_vis_index (CCM_UNPAR_IN_OMP_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNPAR_IN_OMP_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s not parallelized because it is inside"
				   " OpenMP region %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1R2;

  vindex = ccm_vis_index (CCM_FP_O_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_FP_O_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Firstprivate variables in %s: %s");
  ccm_attrs[vindex].fmt = CCMFMT_R1VV2;

  vindex = ccm_vis_index (CCM_LP_O_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LP_O_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Lastprivate variables in %s: %s");
  ccm_attrs[vindex].fmt = CCMFMT_R1VV2;

  vindex = ccm_vis_index (CCM_CP_O_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_CP_O_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Copyprivate variables in %s:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_R1VV2;

  vindex = ccm_vis_index (CCM_PR_OAS_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_PR_OAS_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Variables autoscoped as PRIVATE in %s:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_R1VV2;

  vindex = ccm_vis_index (CCM_SH_OAS_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_SH_OAS_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Variables autoscoped as SHARED in %s: %s");
  ccm_attrs[vindex].fmt = CCMFMT_R1VV2;

  vindex = ccm_vis_index (CCM_FP_OAS_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_FP_OAS_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Variables autoscoped as FIRSTPRIVATE in %s:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_R1VV2;

  vindex = ccm_vis_index (CCM_LP_OAS_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LP_OAS_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Variables autoscoped as LASTPRIVATE in %s:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_R1VV2;

  vindex = ccm_vis_index (CCM_RV_OAS_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_RV_OAS_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Variables autoscoped as REDUCTION of operator"
				   " %s in %s: %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1R2VV3;

  vindex = ccm_vis_index (CCM_FAIL_OAS_VAR_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_WARN;
  ccm_attrs[vindex].name = "CCM_FAIL_OAS_VAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Variables treated as shared because they cannot"
				   " be autoscoped in %s: %s");
  ccm_attrs[vindex].fmt = CCMFMT_R1VV2;

  vindex = ccm_vis_index (CCM_SERIALIZE_OAS_2);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC | CCMV_WARN;
  ccm_attrs[vindex].name = "CCM_SERIALIZE_OAS_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s will be executed by a single thread because"
				   " autoscoping for some variables was not successful");
  ccm_attrs[vindex].fmt = CCMFMT_R1;

  vindex = ccm_vis_index (CCM_QPERMVEC);
  ccm_attrs[vindex].vis = CCMV_QUERY | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_QPERMVEC";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Is %s a permutation vector during execution of"
				   " %s?");
  ccm_attrs[vindex].fmt = CCMFMT_V1L2;

  vindex = ccm_vis_index (CCM_QEXPR);
  ccm_attrs[vindex].vis = CCMV_QUERY | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_QEXPR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Is expression %s true for %s?");
  ccm_attrs[vindex].fmt = CCMFMT_S1L2;

  vindex = ccm_vis_index (CCM_QSAFECALL);
  ccm_attrs[vindex].vis = CCMV_QUERY | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_QSAFECALL";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Is subroutine %s MP-safe as used in %s?");
  ccm_attrs[vindex].fmt = CCMFMT_P1L2;

  vindex = ccm_vis_index (CCM_LCOST);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LCOST";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below estimated to cost %d cycles per"
				   " iteration");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_UNROLL);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_UNROLL";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below unrolled %d times");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_IMIX);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_IMIX";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below has %d loads, %d stores,"
				   " %d prefetches, %d FPadds, %d FPmuls, and"
				   " %d FPdivs per iteration");
  ccm_attrs[vindex].fmt = CCMFMT_I1I2I3I4I5I6;

  vindex = ccm_vis_index (CCM_SPILLS);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_UNIMPL | CCMV_WANT | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_SPILLS";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below required %d integer register spills,"
				   " %d FP register spills, and used"
				   " %d integer registers and %d FP registers");
  ccm_attrs[vindex].fmt = CCMFMT_I1I2I3I4;

  vindex = ccm_vis_index (CCM_LFISSION);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LFISSION";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below fissioned into %d loops");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_LPEEL);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LPEEL";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below had iterations peeled off for better"
				   " unrolling and/or parallelization");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_LBLOCKED);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LBLOCKED";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below blocked by %d for improved cache"
				   " performance");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_LTILED);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LTILED";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below tiled for better performance");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_LUNRJAM);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LUNRJAM";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below unrolled and jammed");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_LWHILE2DO);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LWHILE2DO";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Bounds test for loop below moved to top of loop");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_L2CALL);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_L2CALL";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below replaced by a call to %s");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_LDEAD);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LDEAD";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below deleted as dead code");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_LINTRCHNG);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LINTRCHNG";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below interchanged with loop on line %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_FUSEDTO);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_FUSEDTO";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below fused with loop on line %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_FUSEDFROM);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_FUSEDFROM";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop from line %d fused with loop below");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_VECINTRNSC);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_VECINTRNSC";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below transformed to use calls to vector"
				   " intrinsic %s");
  ccm_attrs[vindex].fmt = CCMFMT_PP1;

  vindex = ccm_vis_index (CCM_LSTRIPMINE);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LSTRIPMINE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below strip-mined");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_LNEST2LOOPS);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LNEST2LOOPS";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below collapsed with loop on line %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_LREVERSE);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LREVERSE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below has had its iteration direction"
				   " reversed");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_IMIX2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_IMIX2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below has %d loads, %d stores,"
				   " %d prefetches, %d FPadds, %d FPmuls,"
				   " %d FPdivs, %d FPsubs, and %d FPsqrts per"
				   " iteration");
  ccm_attrs[vindex].fmt = CCMFMT_I1I2I3I4I5I6I7I8;

  vindex = ccm_vis_index (CCM_LUNRFULL);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_LUNRFULL";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below fully unrolled");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_ELIM_NOAMORTINST);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_ELIM_NOAMORTINST";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below was eliminated as it contains no"
				   " non-amortizable instructions");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_COMP_DALIGN);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_COMP_DALIGN";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Performance of loop below could be improved"
				   " by compiling with -dalign");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_INTIMIX);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_INTIMIX";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below has %d int-loads, %d int-stores,"
				   " %d alu-ops, %d muls, %d int-divs and"
				   " %d shifts per iteration");
  ccm_attrs[vindex].fmt = CCMFMT_I1I2I3I4I5I6;

  vindex = ccm_vis_index (CCM_LMULTI_VERSION);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LMULTI_VERSION";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s multi-versioned.  Specialized version"
				   " is %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1L2;

  vindex = ccm_vis_index (CCM_LCOST_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LCOST_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s estimated to cost %d cycles per iteration");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2;

  vindex = ccm_vis_index (CCM_UNROLL_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_UNROLL_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s unrolled %d times");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2;

  vindex = ccm_vis_index (CCM_IMIX_B);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_IMIX_B";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s has %d loads, %d stores,"
				   " %d prefetches, %d FPadds, %d FPmuls, and"
				   " %d FPdivs per iteration");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2I3I4I5I6I7;

  vindex = ccm_vis_index (CCM_SPILLS_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_SPILLS_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s required %d integer register spills,"
				   " %d FP register spills, and used"
				   " %d integer registers and %d FP registers");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2I3I4I5;

  vindex = ccm_vis_index (CCM_LFISSION_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LFISSION_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s fissioned into %d loops, generating:"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2LL3;

  vindex = ccm_vis_index (CCM_LFISSION_FRAG);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LFISSION_FRAG";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s contains code from lines: %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1II2;

  vindex = ccm_vis_index (CCM_LPEEL_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LPEEL_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s had iterations peeled off for better"
				   " unrolling and/or parallelization");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_LBLOCKED_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LBLOCKED_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s blocked by %d for improved memory"
				   " hierarchy performance, new inner loop %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2L3;

  vindex = ccm_vis_index (CCM_LOUTER_UNROLL);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LOUTER_UNROLL";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s is outer-unrolled %d times as part"
				   " of unroll and jam");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2;

  vindex = ccm_vis_index (CCM_LJAMMED);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LJAMMED";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "All %d copies of %s are fused together"
				   " as part of unroll and jam");
  ccm_attrs[vindex].fmt = CCMFMT_I1L2;

  vindex = ccm_vis_index (CCM_LWHILE2DO_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LWHILE2DO_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Bounds test for %s moved to top of loop");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_L2CALL_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_L2CALL_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s replaced by a call to %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1P2;

  vindex = ccm_vis_index (CCM_LDEAD_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LDEAD_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s deleted as dead code");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_LINTRCHNG_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LINTRCHNG_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s interchanged with %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1L2;

  vindex = ccm_vis_index (CCM_LINTRCHNG_ORDER);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LINTRCHNG_ORDER";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "For loop nest below, the final order of loops"
				   " after interchanging and subsequent"
				   " transformations is: %s");
  ccm_attrs[vindex].fmt = CCMFMT_LL1;

  vindex = ccm_vis_index (CCM_FUSED_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_FUSED_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s fused with %s, new loop %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1L2L3;

  vindex = ccm_vis_index (CCM_VECINTRNSC_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_VECINTRNSC_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s transformed to use calls to vector"
				   " intrinsics: %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1PP2;

  vindex = ccm_vis_index (CCM_LSTRIPMINE_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LSTRIPMINE_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s strip-mined by %d, new inner loop %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2L3;

  vindex = ccm_vis_index (CCM_LNEST2LOOPS_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LNEST2LOOPS_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s collapsed with %s, new loop %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1L2L3;

  vindex = ccm_vis_index (CCM_LREVERSE_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LREVERSE_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s has had its iteration direction reversed");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_IMIX2_B);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_IMIX2_B";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s has %d loads, %d stores,"
				   " %d prefetches, %d FPadds, %d FPmuls,"
				   " %d FPdivs, %d FPsubs, and %d FPsqrts per"
				   " iteration");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2I3I4I5I6I7I8I9;

  vindex = ccm_vis_index (CCM_LUNRFULL_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LUNRFULL_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s fully unrolled");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_ELIM_NOAMORTINST_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_ELIM_NOAMORTINST_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s was eliminated as it contains no"
				   " non-amortizable instructions");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_COMP_DALIGN_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_COMP_DALIGN_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Performance of %s could be improved by"
				   " compiling with -dalign");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_INTIMIX_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_INTIMIX_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s has %d int-loads, %d int-stores,"
				   " %d alu-ops, %d muls, %d int-divs and"
				   " %d shifts per iteration");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2I3I4I5I6I7;

  vindex = ccm_vis_index (CCM_OMP_REGION);
  ccm_attrs[vindex].vis = CCMV_PAR | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_OMP_REGION";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Source OpenMP region below has tag %s");
  ccm_attrs[vindex].fmt = CCMFMT_R1;

  vindex = ccm_vis_index (CCM_LMICROVECTORIZE);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LMICROVECTORIZE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s is micro-vectorized");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_LMULTI_VERSION_2);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LMULTI_VERSION_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s multi-versioned for %s."
				   " Specialized version is %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1S2L3;

  vindex = ccm_vis_index (CCM_LCLONED);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LCLONED";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s cloned for %s.  Clone is %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1S2L3;

  vindex = ccm_vis_index (CCM_LUNSWITCHED);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LUNSWITCHED";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s is unswitched.  New loops"
				   " are %s and %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1L2L3;

  vindex = ccm_vis_index (CCM_LRESWITCHED);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LRESWITCHED";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loops %s and %s and their surrounding"
				   " conditional code have been merged to"
				   " form loop %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1L2L3;

  vindex = ccm_vis_index (CCM_LSKEWBLOCKED);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LSKEWBLOCKED";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s skew-blocked by %d with slope"
				   " %d for improved memory hierarchy"
				   " performance, new inner loop %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2I3L4;

  vindex = ccm_vis_index (CCM_IVSUB);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_IVSUB";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Induction variable substitution performed on %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_ONEITER_REPLACED);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_ONEITER_REPLACED";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s determined to have a trip count of 1;"
				   " converted to straight-line code");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_IMIX3_B);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_IMIX3_B";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s has %d loads, %d stores,"
				   " %d prefetches, %d FPadds, %d FPmuls,"
				   " %d FPmuladds, %d FPdivs, and %d FPsqrts per"
				   " iteration");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2I3I4I5I6I7I8I9;

  vindex = ccm_vis_index (CCM_PIPELINE);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_PIPELINE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below pipelined");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_PIPESTATS);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_PIPESTATS";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below scheduled with steady-state cycle"
				   " count = %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_NOPIPE_CALL);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_CALL";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined because it contains"
				   " calls");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NOPIPE_INTCC);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_INTCC";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined because it sets"
				   " multiple integer condition codes.");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NOPIPE_MBAR);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_MBAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined because it contains a"
				   " memory barrier instruction");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NOPIPE_MNMX);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_MNMX";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined because it contains"
				   " a minimum or a maximum operation");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NOPIPE_U2FLT);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_U2FLT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined because it contains"
				   " an unsigned to float conversion");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NOPIPE_GOT);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_GOT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined because it sets the"
				   " Global Offset Table pointer");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NOPIPE_IDIV);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_IDIV";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined because it contains"
				   " an integer divide");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NOPIPE_PRFTCH);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_PRFTCH";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined because it contains"
				   " a prefetch operation");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NOPIPE_EXIT);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_EXIT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined because it contains"
				   " an exit operation");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NOPIPE_REG);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_REG";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined because it contains"
				   " instructions that set the %%gsr or %%fsr register");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NOPIPE_UNS);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_UNS";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined because it has an"
				   " unsigned loop counter");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NOPIPE_UNSUIT);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_UNSUIT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop was unsuitable for pipelining");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NOPIPE_INTRINSIC);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_INTRINSIC";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined because it has an"
				   " intrinsic call to %s");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NOPIPE_BIG);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_BIG";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined as it is too big");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NOPIPE_INVINTPR);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_INVINTPR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined as it contains too"
				   " many loop invariant integers = %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_NOPIPE_INVFLTPR);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_INVFLTPR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined as it contains too"
				   " many loop invariant floats = %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_NOPIPE_INVDBLPR);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_INVDBLPR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined as it contains too"
				   " many loop invariant doubles = %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_PIPE_SCHEDAFIPR);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_PIPE_SCHEDAFIPR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below was adversely affected by high"
				   " integer register pressure = %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_PIPE_SCHEDAFDPR);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_PIPE_SCHEDAFDPR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below was adversely affected by high"
				   " double register pressure = %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_PIPE_SCHEDAFFPR);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_PIPE_SCHEDAFFPR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop below was adversely affected by high"
				   " float register pressure = %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_NOPIPE_INTPR);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_INTPR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined due to high"
				   " integer register pressure = %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_NOPIPE_DBLPR);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_DBLPR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined due to high"
				   " double register pressure = %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_NOPIPE_FLTPR);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_NOPIPE_FLTPR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop could not be pipelined due to high"
				   " float register pressure = %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_PIPELINE_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_PIPELINE_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s pipelined");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_PIPESTATS_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_PIPESTATS_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s scheduled with steady-state cycle"
				   " count = %d");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2;

  vindex = ccm_vis_index (CCM_NOPIPE_CALL_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_CALL_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined because it contains"
				   " calls");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_NOPIPE_INTCC_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_INTCC_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined because it sets"
				   " multiple integer condition codes.");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_NOPIPE_MBAR_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_MBAR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined because it contains"
				   " a memory barrier instruction");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_NOPIPE_MNMX_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_MNMX_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined because it contains"
				   " a minimum or a maximum operation");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_NOPIPE_U2FLT_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_U2FLT_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined because it contains"
				   " an unsigned to float conversion");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_NOPIPE_GOT_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP;
  ccm_attrs[vindex].name = "CCM_NOPIPE_GOT_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined because it sets the"
				   " Global Offset Table pointer");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_NOPIPE_IDIV_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_IDIV_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined because it contains"
				   " an integer divide");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_NOPIPE_PRFTCH_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_PRFTCH_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined because it contains"
				   " a prefetch operation");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_NOPIPE_EXIT_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_EXIT_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined because it contains"
				   " an exit operation");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_NOPIPE_REG_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP;
  ccm_attrs[vindex].name = "CCM_NOPIPE_REG_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined because it contains"
				   " instructions that set the %%gsr or %%fsr register");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_NOPIPE_UNS_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_UNS_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined because it has an"
				   " unsigned loop counter");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_NOPIPE_UNSUIT_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_UNSUIT_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s is unsuitable for pipelining");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_NOPIPE_INTRINSIC_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_INTRINSIC_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined because it contains"
				   " a call to intrinsic %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1P2;

  vindex = ccm_vis_index (CCM_NOPIPE_BIG_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_BIG_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined as it is too big");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_NOPIPE_INVINTPR_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_INVINTPR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined as it contains too"
				   " many loop invariant integers = %d");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2;

  vindex = ccm_vis_index (CCM_NOPIPE_INVFLTPR_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_INVFLTPR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined as it contains too"
				   " many loop invariant floats = %d");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2;

  vindex = ccm_vis_index (CCM_NOPIPE_INVDBLPR_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_INVDBLPR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined as it contains too"
				   " many loop invariant doubles = %d");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2;

  vindex = ccm_vis_index (CCM_PIPE_SCHEDAFIPR_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_PIPE_SCHEDAFIPR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s was adversely affected by high"
				   " integer register pressure = %d");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2;

  vindex = ccm_vis_index (CCM_PIPE_SCHEDAFDPR_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_PIPE_SCHEDAFDPR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s was adversely affected by high"
				   " double register pressure = %d");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2;

  vindex = ccm_vis_index (CCM_PIPE_SCHEDAFFPR_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_PIPE_SCHEDAFFPR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s was adversely affected by high"
				   " float register pressure = %d");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2;

  vindex = ccm_vis_index (CCM_NOPIPE_INTPR_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_INTPR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined due to high"
				   " integer register pressure = %d");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2;

  vindex = ccm_vis_index (CCM_NOPIPE_DBLPR_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_DBLPR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined due to high"
				   " double register pressure = %d");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2;

  vindex = ccm_vis_index (CCM_NOPIPE_FLTPR_2);
  ccm_attrs[vindex].vis = CCMV_PIPE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NOPIPE_FLTPR_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "%s could not be pipelined due to high"
				   " float register pressure = %d");
  ccm_attrs[vindex].fmt = CCMFMT_L1I2;

  vindex = ccm_vis_index (CCM_INLINE);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_INLINE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s inlined from source file %s into"
				   " the code for the following line");
  ccm_attrs[vindex].fmt = CCMFMT_P1S2;

  vindex = ccm_vis_index (CCM_INLINE2);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_INLINE2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s inlined from source file %s into"
				   " inline copy of function %s");
  ccm_attrs[vindex].fmt = CCMFMT_P1S2P3;

  vindex = ccm_vis_index (CCM_INLINE_TMPLT);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_INLINE_TMPLT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s inlined from template file %s"
				   " into the code for the following line");
  ccm_attrs[vindex].fmt = CCMFMT_P1S2;

  vindex = ccm_vis_index (CCM_INLINE_TMPLT2);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_INLINE_TMPLT2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s inlined from template file %s"
				   " into inline copy of function %s");
  ccm_attrs[vindex].fmt = CCMFMT_P1S2P3;

  vindex = ccm_vis_index (CCM_INLINE_OUT_COPY);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_INLINE_OUT_COPY";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Out-of-line copy of inlined function %s from"
				   " source file %s generated");
  ccm_attrs[vindex].fmt = CCMFMT_P1S2;

  vindex = ccm_vis_index (CCM_NINLINE_REC);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_REC";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Recursive function %s inlined only up to"
				   " depth %d");
  ccm_attrs[vindex].fmt = CCMFMT_P1I2;

  vindex = ccm_vis_index (CCM_NINLINE_NEST);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_NEST";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because inlining is"
				   " already nested too deeply");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_CMPLX);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_CMPLX";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it contains"
				   " too many operations");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_FB);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_FB";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because the"
				   " profile-feedback execution count is too low");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_PAR);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_PAR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it contains"
				   " explicit parallel pragmas");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_OPT);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_OPT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it is"
				   " compiled with optimization level <= 2");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_USR);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_USR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because either command"
				   " line option or source code pragma prohibited it,"
				   " or it's not safe to inline it");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_AUTO);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_AUTO";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because doing so"
				   " would make automatic storage for %s too large");
  ccm_attrs[vindex].fmt = CCMFMT_P1P2;

  vindex = ccm_vis_index (CCM_NINLINE_CALLS);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_CALLS";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it contains"
				   " too many calls");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_ACTUAL);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_ACTUAL";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it has more"
				   " actual parameters than formal parameters");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_FORMAL);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_FORMAL";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it has more"
				   " formal parameters than actual parameters");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_TYPE);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_TYPE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because formal"
				   " argument type does not match actual type");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_ATYPE);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_ATYPE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because array formal"
				   " argument does not match reshaped array actual"
				   " argument type");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_RETTYPE);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_RETTYPE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because return type"
				   " does not match");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_EXCPT);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_EXCPT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it"
				   " guarded by an exception handler");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_UNSAFE);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_UNSAFE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it might be"
				   " unsafe (call alloca(), etc)");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_ALIAS);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_ALIAS";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because inlining it"
				   " will make the alias analysis in the calling"
				   " function more conservative");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_FEMARK);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_FEMARK";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it contains"
				   " setjmp/longjmp, or indirect goto, etc");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_RAREX);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_RAREX";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it is known"
				   " to be rarely executed");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_CLONING);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_CLONING";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s from source file %s cloned,"
				   " creating cloned function %s; constant"
				   " parameters propagated to clone");
  ccm_attrs[vindex].fmt = CCMFMT_P1S2P3;

  vindex = ccm_vis_index (CCM_INLINE_B);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_INLINE_B";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s inlined from source file %s into"
				   " the code for the following line.  %d loops"
				   " inlined");
  ccm_attrs[vindex].fmt = CCMFMT_P1S2I3;

  vindex = ccm_vis_index (CCM_INLINE2_B);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_INLINE2_B";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s inlined from source file %s into"
				   " inline copy of function %s.  %d loops inlined");
  ccm_attrs[vindex].fmt = CCMFMT_P1S2P3I4;

  vindex = ccm_vis_index (CCM_INLINE_LOOP);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_LOOP | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_INLINE_LOOP";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Loop in function %s, line %d has"
				   " tag %s");
  ccm_attrs[vindex].fmt = CCMFMT_P1I2L3;

  vindex = ccm_vis_index (CCM_NINLINE_MULTIENTRY);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_MULTIENTRY";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it"
				   " contains an ENTRY statement");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_VARARGS);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_VARARGS";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because variable"
				   " argument routines cannot be inlined");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_UNSEEN_BODY);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_UNSEEN_BODY";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because the compiler"
				   " has not seen the body of the function.  Use"
				   " -xcrossfile or -xipo in order to inline it");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_UPLEVEL);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_UPLEVEL";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it is a"
				   " nested routine containing references to"
				   " variables defined in an outer function");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_CMDLINE);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_CMDLINE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because either"
				   " -xinline or source code pragma prohibited it");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_CALL_CMPLX);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_CALL_CMPLX";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Call to %s not inlined because of the"
				   " complexity of the calling routine");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_LANG_MISMATCH);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_LANG_MISMATCH";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Call to %s not inlined because it is in"
				   " a different language");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_RTN_WEAK);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_RTN_WEAK";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it"
				   " is marked weak");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_CALL_WEAKFILE);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_CALL_WEAKFILE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Call to %s not inlined because it is"
				   " in a different file and it contains a"
				   " call to a weak routine");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_CALL_TRYCATCH);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_CALL_TRYCATCH";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Call to %s not inlined because it is"
				   " in a different file and contains an"
				   " explicit try/catch");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_CALL_REGP);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_CALL_REGP";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Call to %s not inlined because it would"
				   " cause excessive register pressure");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_RTN_REGP);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_RTN_REGP";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it would"
				   " cause excessive register pressure");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_CALL_XPENSV);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_CALL_XPENSV";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Call to %s not inlined because analysis"
				   " exceeds the compilation time limit");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_READONLYIR);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_READONLYIR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it is in a file"
				   " specified as read-only by -xipo_archive=readonly"
				   " and it contains calls to static functions");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_CALL_THUNK);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_CALL_THUNK";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Call to %s not inlined because it is in a"
				   " compiler-generated function that does not"
				   " permit inlining");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_CALL_XTARGETS);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_CALL_XTARGETS";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Indirect callsite has too many targets;"
				   " callsite marked do not inline");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NINLINE_SELFTAIL_RECURSIVE);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_SELFTAIL_RECURSIVE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because"
				   " of a recursive tail-call to itself");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_PRAGMA);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_PRAGMA";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it contains"
				   " explicit parallel or alias pragmas");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_CMPLX2);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_CMPLX2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it contains too"
				   " many operations.  Increase max_inst_hard in order"
				   " to inline it: -xinline_param=max_inst_hard:n");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_RARE);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_RARE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because the call"
				   " is rarely executed");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_PAR2);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_PAR2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it is called"
				   " within a region guarded by an explicit"
				   " parallel pragmas");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_G_LIMIT);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_G_LIMIT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it would exceed"
				   " the permitted global code size growth limit.  Try"
				   " to increase max_growth in order to inline it:"
				   " -xinline_param=max_growth:n");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_L_LIMIT);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_L_LIMIT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it would exceed"
				   " the maximum function size growth limit.  Increase"
				   " max_function_inst in order to inline it:"
				   " -xinline_param=max_function_inst:n");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_REC2);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_REC2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Recursive function %s is inlined only up to"
				   " %d levels and up to %d size.  Increase"
				   " max_recursive_deptha or max_recursive_inst in"
				   " order to inline it:"
				   " -xinline_param=max_recursive_depth:n,"
				   " -xinline_param=max_recursive_inst:n");
  ccm_attrs[vindex].fmt = CCMFMT_P1I2I3;

  vindex = ccm_vis_index (CCM_NINLINE_FB2);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_FB2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because the"
				   " profile-feedback execution count is too"
				   " low.  Decrease min_counter in order to inline it:"
				   " -xinline_param:min_counter:n");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_CS_CMPLX);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_CS_CMPLX";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because called"
				   " function's size is too big.  Increase"
				   " max_inst_soft in order to inline it:"
				   " -xinline_param=max_inst_soft:n");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_R_EXCPT);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_R_EXCPT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it contains"
				   " an exception handler");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_ASM);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_ASM";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because"
				   " it contains asm statements");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_R_READONLYIR);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_R_READONLYIR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it is in a file"
				   " specified as read-only by -xipo_archive=readonly"
				   " and it is a static function");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_C_READONLYIR);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_C_READONLYIR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Call to %s not inlined because the calling"
				   " function is in a file specified as read-only"
				   " by -xipo_archive=readonly");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NINLINE_NEVERRETURN);
  ccm_attrs[vindex].vis = CCMV_INLINE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NINLINE_NEVERRETURN";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it"
				   " never returns");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_MPREFETCH);
  ccm_attrs[vindex].vis = CCMV_MEMOPS | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_MPREFETCH";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Prefetch of %s inserted");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_MPREFETCH_LD);
  ccm_attrs[vindex].vis = CCMV_MEMOPS | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_MPREFETCH_LD";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Prefetch of %s inserted for load at %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1X2;

  vindex = ccm_vis_index (CCM_MPREFETCH_ST);
  ccm_attrs[vindex].vis = CCMV_MEMOPS | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_MPREFETCH_ST";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Prefetch of %s inserted for store at %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1X2;

  vindex = ccm_vis_index (CCM_MPREFETCH_FB);
  ccm_attrs[vindex].vis = CCMV_MEMOPS | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_MPREFETCH_FB";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Prefetch of %s inserted based on feedback data");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_MPREFETCH_FB_LD);
  ccm_attrs[vindex].vis = CCMV_MEMOPS | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_MPREFETCH_FB_LD";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Prefetch of %s inserted for load at %s based"
				   " on feedback data");
  ccm_attrs[vindex].fmt = CCMFMT_S1X2;

  vindex = ccm_vis_index (CCM_MPREFETCH_FB_ST);
  ccm_attrs[vindex].vis = CCMV_MEMOPS | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_MPREFETCH_FB_ST";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Prefetch of %s inserted for store at %s based"
				   " on feedback data");
  ccm_attrs[vindex].fmt = CCMFMT_S1X2;

  vindex = ccm_vis_index (CCM_MLOAD);
  ccm_attrs[vindex].vis = CCMV_MEMOPS | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_MLOAD";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Load below refers to %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_MSTORE);
  ccm_attrs[vindex].vis = CCMV_MEMOPS | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_MSTORE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Store below refers to %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_MLOAD_P);
  ccm_attrs[vindex].vis = CCMV_MEMOPS | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_MLOAD_P";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Load below refers to %s, and was prefetched"
				   " at %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1X2;

  vindex = ccm_vis_index (CCM_MSTORE_P);
  ccm_attrs[vindex].vis = CCMV_MEMOPS | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_MSTORE_P";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Store below refers to %s, and was prefetched"
				   " at %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1X2;

  vindex = ccm_vis_index (CCM_COPYIN);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_COPYIN";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Parameter %d caused a copyin in the following"
				   " call");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_COPYOUT);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_COPYOUT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Parameter %d caused a copyout in the following"
				   " call");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_COPYINOUT);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_COPYINOUT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Parameter %d caused both a copyin and copyout"
				   " in the following call");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_PADDING);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_PADDING";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Padding of %d bytes inserted before"
				   " array %s");
  ccm_attrs[vindex].fmt = CCMFMT_I1V2;

  vindex = ccm_vis_index (CCM_PADCOMMON);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_PADCOMMON";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Padding of %d bytes inserted before"
				   " array %s in common block %s");
  ccm_attrs[vindex].fmt = CCMFMT_I1V2V3;

  vindex = ccm_vis_index (CCM_ALIGN_EQ);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_ALIGN_EQ";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Variable/array %s can not be double-aligned,"
				   " because it is equivalenced");
  ccm_attrs[vindex].fmt = CCMFMT_V1;

  vindex = ccm_vis_index (CCM_ALIGN_PERF);
  ccm_attrs[vindex].vis = CCMV_FE;
  ccm_attrs[vindex].name = "CCM_ALIGN_PERF";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Alignment of variables in common block may cause"
				   " performance degradation");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_ALIGN_STRUCT);
  ccm_attrs[vindex].vis = CCMV_FE;
  ccm_attrs[vindex].name = "CCM_ALIGN_STRUCT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Alignment of component %s in numeric sequence"
				   " structure %s may cause performance degradation");
  ccm_attrs[vindex].fmt = CCMFMT_S1S2;

  vindex = ccm_vis_index (CCM_TMP_COPY);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_TMP_COPY";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Argument %s copied to a temporary");
  ccm_attrs[vindex].fmt = CCMFMT_V1;

  vindex = ccm_vis_index (CCM_TMP_COPYM);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_TMP_COPYM";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Argument %s might be copied to a temporary;"
				   " runtime decision made");
  ccm_attrs[vindex].fmt = CCMFMT_V1;

  vindex = ccm_vis_index (CCM_PROC_MISMATCH);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_PROC_MISMATCH";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Argument %d to subprogram %s differs from"
				   " reference on line %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1P2I3;

  vindex = ccm_vis_index (CCM_PROC_MISMATCH2);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_PROC_MISMATCH2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Scalar argument %d to subprogram %s is"
				   " referred to as an array on line %d");
  ccm_attrs[vindex].fmt = CCMFMT_I1P2I3;

  vindex = ccm_vis_index (CCM_PROC_MISMATCH3);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_PROC_MISMATCH3";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Return type/rank from subprogram %s differs"
				   " from return on line %d");
  ccm_attrs[vindex].fmt = CCMFMT_P1I2;

  vindex = ccm_vis_index (CCM_DO_EXPR);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_DO_EXPR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "DO statement bounds lead to no executions of the"
				   " loop");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_AUTO_BND);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_AUTO_BND";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "The bounds for automatic variable %s are not"
				   " available at all entry points; zero-length"
				   " variable might be allocated");
  ccm_attrs[vindex].fmt = CCMFMT_V1;

  vindex = ccm_vis_index (CCM_LIT_PAD);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_LIT_PAD";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "The character string literal %s padded"
				   " to the length specified for the dummy argument");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_ARRAY_LOOP);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_ARRAY_LOOP";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Array statement below generated a loop");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_ARRAY_LOOPNEST);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_LOOP | CCMV_BASIC | CCMV_OBS;
  ccm_attrs[vindex].name = "CCM_ARRAY_LOOPNEST";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Array statement below generated %d nested loops");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_ALIGN_PERF2);
  ccm_attrs[vindex].vis = CCMV_FE;
  ccm_attrs[vindex].name = "CCM_ALIGN_PERF2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Alignment of variable %s in common block %s"
				   " may cause a performance degradation");
  ccm_attrs[vindex].fmt = CCMFMT_V1V2;

  vindex = ccm_vis_index (CCM_ALIGN_PERF3);
  ccm_attrs[vindex].vis = CCMV_FE;
  ccm_attrs[vindex].name = "CCM_ALIGN_PERF3";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Alignment of variable %s in blank common may"
				   " cause a performance degradation");
  ccm_attrs[vindex].fmt = CCMFMT_V1;

  vindex = ccm_vis_index (CCM_IO_LOOP_ARRAY);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_LOOP | CCMV_BASIC | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_IO_LOOP_ARRAY";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "I/O implied do item below generated an array"
				   " section");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_TMPCONST);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_TMPCONST";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Implicit invocation of class %s constructor for"
				   " temporary");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_TMPDEST);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_TMPDEST";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Implicit invocation of class %s destructor for"
				   " temporary");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_DBL_CONST);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_DBL_CONST";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Double constant %s used in float expression");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_MINLINE);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_MINLINE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s inlined from source file %s by"
				   " front-end");
  ccm_attrs[vindex].fmt = CCMFMT_P1S2;

  vindex = ccm_vis_index (CCM_MINLINE2);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_MINLINE2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s from source file %s inlined into"
				   " inline copy of method %s by front-end");
  ccm_attrs[vindex].fmt = CCMFMT_P1S2P3;

  vindex = ccm_vis_index (CCM_MINLINE3);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_MINLINE3";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it uses keyword"
				   " %s");
  ccm_attrs[vindex].fmt = CCMFMT_P1S2;

  vindex = ccm_vis_index (CCM_MINLINE4);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC | CCMV_UNIMPL;
  ccm_attrs[vindex].name = "CCM_MINLINE4";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s not inlined because it is too"
				   " complex");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_TMP_COPYOUT);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_TMP_COPYOUT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Argument %s copied from a temporary");
  ccm_attrs[vindex].fmt = CCMFMT_V1;

  vindex = ccm_vis_index (CCM_TMP_COPYOUTM);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_TMP_COPYOUTM";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Argument %s might be copied from a temporary;"
				   " runtime decision made");
  ccm_attrs[vindex].fmt = CCMFMT_V1;

  vindex = ccm_vis_index (CCM_TMP_COPYINOUT);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_TMP_COPYINOUT";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Argument %s copied in and out of a temporary");
  ccm_attrs[vindex].fmt = CCMFMT_V1;

  vindex = ccm_vis_index (CCM_TMP_COPYINOUTM);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_TMP_COPYINOUTM";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Argument %s might be copied in and out of"
				   " a temporary; runtime decision made");
  ccm_attrs[vindex].fmt = CCMFMT_V1;

  vindex = ccm_vis_index (CCM_ARRAY_LOOP_2);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_LOOP | CCMV_BASIC | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_ARRAY_LOOP_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Array statement below generated loop %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_ARRAY_LOOPNEST_2);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_LOOP | CCMV_BASIC | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_ARRAY_LOOPNEST_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Array statement below generated %d nested"
				   " loops: %s");
  ccm_attrs[vindex].fmt = CCMFMT_I1LL2;

  vindex = ccm_vis_index (CCM_IO_LOOP_ARRAY_2);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_LOOP | CCMV_BASIC | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_IO_LOOP_ARRAY_2";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "I/O implied do item below generated an array"
				   " section: %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_USER_LOOP);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_LOOP | CCMV_BASIC | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_USER_LOOP";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Source loop below has tag %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_FOUND_LOOP);
  ccm_attrs[vindex].vis = CCMV_FE | CCMV_LOOP | CCMV_BASIC | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_FOUND_LOOP";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Discovered loop below has tag %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_MFUNCTION_LOOP);
  ccm_attrs[vindex].vis = CCMV_LOOP | CCMV_BASIC | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_MFUNCTION_LOOP";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Copy in M-function of loop below has tag %s");
  ccm_attrs[vindex].fmt = CCMFMT_L1;

  vindex = ccm_vis_index (CCM_FSIMPLE);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_FSIMPLE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Transformations for fsimple=%d applied");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_STACK);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_STACK";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Function %s requires %d Mbytes of stack"
				   " storage");
  ccm_attrs[vindex].fmt = CCMFMT_P1I2;

  vindex = ccm_vis_index (CCM_TAILRECUR);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_TAILRECUR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Recursive tail call in %s optimized to jump to"
				   " entry point");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_TAILCALL);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC | CCMV_UNIMPL | CCMV_WANT;
  ccm_attrs[vindex].name = "CCM_TAILCALL";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Call to function %s was tail-call optimized");
  ccm_attrs[vindex].fmt = CCMFMT_P1;

  vindex = ccm_vis_index (CCM_NI_EXIT_OR_PSEUDO);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_EXIT_OR_PSEUDO";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because it"
				   " contains the pseudo instruction %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_NI_BAD_UNARY_OPC);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_BAD_UNARY_OPC";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because it"
				   " contains the instruction opcode %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_NI_INT_LDD_ON_V9);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_INT_LDD_ON_V9";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because it"
				   " contains integer ldd instructions, which are"
				   " deprecated in the v9 architecture");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NI_LATE_INL_OPC);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_LATE_INL_OPC";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because it"
				   " contains the instruction opcode %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_NI_BAD_IMM_OP);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_BAD_IMM_OP";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because the"
				   " relocation or immediate operand %s is not well"
				   " understood by the optimizer");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_NI_BAD_STATELEAF);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_BAD_STATELEAF";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because it"
				   " references the state register %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_NI_BAD_ASR_19);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_BAD_ASR_19";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because"
				   " %%asr19 is not supported in pre v8plus code");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NI_BAD_FSR_USE);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_BAD_FSR_USE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because"
				   " references to %%fsr can only be optimized when the"
				   " -iaopts flag is used");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NI_BAD_REGISTER);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_BAD_REGISTER";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because it"
				   " references the register %s");
  ccm_attrs[vindex].fmt = CCMFMT_S1;

  vindex = ccm_vis_index (CCM_NI_NO_RET_VAL);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_NO_RET_VAL";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because it"
				   " does not return the value declared");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NI_DELAY);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_DELAY";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because it"
				   " contains a non nop delay slot");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NI_SCALL);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_SCALL";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because it"
				   " calls a function which returns a structure");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_CASE_POSITION);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_CASE_POSITION";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Case block below was placed at position %d"
				   " based on execution frequency");
  ccm_attrs[vindex].fmt = CCMFMT_I1;

  vindex = ccm_vis_index (CCM_CALL_WITH_CODE);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_CALL_WITH_CODE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Call to %s replaced with inline code.  %d"
				   " loops created: %s");
  ccm_attrs[vindex].fmt = CCMFMT_P1I2LL3;

  vindex = ccm_vis_index (CCM_NI_BAD_SP_ADDR);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_BAD_SP_ADDR";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because it"
				   " contains a %%sp+reg address");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NI_BAD_SP_USAGE);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_BAD_SP_USAGE";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because it"
				   " uses/defines the stack pointer in a non-load/store instruction");
  ccm_attrs[vindex].fmt = CCMFMT_NONE;

  vindex = ccm_vis_index (CCM_NI_MIXED_REG_TYPES);
  ccm_attrs[vindex].vis = CCMV_CG | CCMV_BASIC;
  ccm_attrs[vindex].name = "CCM_NI_MIXED_REG_TYPES";
  ccm_attrs[vindex].msg = catgets (ccm_catd, 99, vindex,
				   "Template could not be early inlined because it"
				   " contains register %s used as both x-register and register pair");
  ccm_attrs[vindex].fmt = CCMFMT_S1;
}