diff options
author | Jose E. Marchesi <jose.marchesi@oracle.com> | 2016-08-24 06:47:57 -0700 |
---|---|---|
committer | Jose E. Marchesi <jose.marchesi@oracle.com> | 2016-08-24 06:47:57 -0700 |
commit | b944b65f55869d47f986f035211e088ee0d2a7b7 (patch) | |
tree | 090301c51452c56a685dec092e78704e708af120 /backends | |
parent | b584da5ae7259d4923eb3f993de87cf55bef71b8 (diff) |
sparc: fix the printing of hw capabilities object attributes.
The GNU_Sparc_HWCAPS and GNU_Sparc_HWCAPS2 object attributes comprise
a set of hardware capabilities that may (or not) be present in the
target machine for which the object was compiled. This patch adds the
support for printing a nicely formatted comma-separated list with the
selected hw capabilities.
Signed-off-by: Jose E. Marchesi <jose.marchesi@oracle.com>
Diffstat (limited to 'backends')
-rw-r--r-- | backends/ChangeLog | 7 | ||||
-rw-r--r-- | backends/sparc_attrs.c | 74 |
2 files changed, 58 insertions, 23 deletions
diff --git a/backends/ChangeLog b/backends/ChangeLog index af32d8f9..53d29081 100644 --- a/backends/ChangeLog +++ b/backends/ChangeLog @@ -1,3 +1,9 @@ +2016-08-09 Jose E. Marchesi <jose.marchesi@oracle.com> + + * sparc_attrs.c (sparc_check_object_attribute): Fix the + calculation of GNU_SParc_HWCAPS and GNU_SParc_HWCAPS2 values as + comma-separated list of hw capability names. + 2016-07-10 Andreas Schwab <schwab@linux-m68k.org> * m68k_corenote.c (ALIGN_PRSTATUS): Define. @@ -13,7 +19,6 @@ * common-reloc.c (copy_reloc_p): Honor NO_COPY_RELOC. (init_reloc): Likewise. - 2016-05-20 Andreas Schwab <schwab@linux-m68k.org> * Makefile.am (modules): Add m68k. diff --git a/backends/sparc_attrs.c b/backends/sparc_attrs.c index e95b577b..974e8fb0 100644 --- a/backends/sparc_attrs.c +++ b/backends/sparc_attrs.c @@ -41,33 +41,63 @@ sparc_check_object_attribute (Ebl *ebl __attribute__ ((unused)), const char *vendor, int tag, uint64_t value, const char **tag_name, const char **value_name) { + static const char *hwcaps[32] = + { + "mul32", "div32", "fsmuld", "v8plus", "popc", "vis", "vis2", + "asi_blk_init", "fmaf", "vis3", "hpc", "random", "trans", + "fjfmau", "ima", "asi_cache_sparing", "aes", "des", "kasumi", + "camellia", "md5", "sha1", "sha256", "sha512", "mpmul", "mont", + "pause", "cbcond", "crc32c", "resv30", "resv31" + }; + + + static const char *hwcaps2[32] = + { + "fjathplus", "vis3b", "adp", "sparc5", "mwait", "xmpmul", "xmont", + "nsec", "resv8", "resv9" , "resv10", "resv11", "fjathhpc", "fjdes", + "fjaes", "resv15", "resv16", "resv17", "resv18", "resv19", "resv20", + "resv21", "resv22", "resv23", "resv24", "resv25", "resv26", "resv27", + "resv28", "resv29", "resv30", "resv31", + }; + + /* NAME should be big enough to hold any possible comma-separated + list (no repetitions allowed) of attribute names from one of the + arrays above. */ + static char name[32*17+32+1]; + name[0] = '\0'; + if (!strcmp (vendor, "gnu")) switch (tag) { case 4: - *tag_name = "GNU_Sparc_HWCAPS"; - static const char *hwcaps[30] = - { - "mul32", "div32", "fsmuld", "v8plus", "popc", "vis", "vis2", - "asi_blk_init", "fmaf", NULL, "vis3", "hpc", "random", "trans", "fjfmau", - "ima", "asi_cache_sparing", "aes", "des", "kasumi", "camellia", - "md5", "sha1", "sha256", "sha512", "mpmul", "mont", "pause", - "cbcond", "crc32c" - }; - if (value < 30 && hwcaps[value] != NULL) - *value_name = hwcaps[value]; - return true; - case 8: - *tag_name = "GNU_Sparc_HWCAPS2"; - static const char *hwcaps2[11] = - { - "fjathplus", "vis3b", "adp", "sparc5", "mwait", "xmpmul", - "xmont", "nsec", "fjathhpc", "fjdes", "fjaes" - }; - if (value < 11) - *value_name = hwcaps2[value]; - return true; + { + const char **caps; + int cap; + + if (tag == 4) + { + *tag_name = "GNU_Sparc_HWCAPS"; + caps = hwcaps; + } + else + { + *tag_name = "GNU_Sparc_HWCAPS2"; + caps = hwcaps2; + } + + char *s = name; + for (cap = 0; cap < 32; cap++) + if (value & (1U << cap)) + { + if (*s != '\0') + s = strcat (s, ","); + s = strcat (s, caps[cap]); + } + + *value_name = s; + return true; + } } return false; |