Branch data Line data Source code
1 : : /* Object attribute tags for PowerPC.
2 : : Copyright (C) 2008, 2009 Red Hat, Inc.
3 : : This file is part of elfutils.
4 : :
5 : : This file is free software; you can redistribute it and/or modify
6 : : it under the terms of either
7 : :
8 : : * the GNU Lesser General Public License as published by the Free
9 : : Software Foundation; either version 3 of the License, or (at
10 : : your option) any later version
11 : :
12 : : or
13 : :
14 : : * the GNU General Public License as published by the Free
15 : : Software Foundation; either version 2 of the License, or (at
16 : : your option) any later version
17 : :
18 : : or both in parallel, as here.
19 : :
20 : : elfutils is distributed in the hope that it will be useful, but
21 : : WITHOUT ANY WARRANTY; without even the implied warranty of
22 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 : : General Public License for more details.
24 : :
25 : : You should have received copies of the GNU General Public License and
26 : : the GNU Lesser General Public License along with this program. If
27 : : not, see <http://www.gnu.org/licenses/>. */
28 : :
29 : : #ifdef HAVE_CONFIG_H
30 : : # include <config.h>
31 : : #endif
32 : :
33 : : #include <string.h>
34 : : #include <dwarf.h>
35 : :
36 : : #define BACKEND ppc_
37 : : #include "libebl_CPU.h"
38 : :
39 : : bool
40 : 10 : ppc_check_object_attribute (Ebl *ebl __attribute__ ((unused)),
41 : : const char *vendor, int tag, uint64_t value,
42 : : const char **tag_name, const char **value_name)
43 : : {
44 [ + - ]: 10 : if (!strcmp (vendor, "gnu"))
45 [ + + + - ]: 10 : switch (tag)
46 : : {
47 : 4 : case 4:
48 : 4 : *tag_name = "GNU_Power_ABI_FP";
49 : 4 : static const char *fp_kinds[] =
50 : : {
51 : : "Hard or soft float",
52 : : "Hard float",
53 : : "Soft float",
54 : : "Single-precision hard float",
55 : : "Hard or soft float (IBM style long doubles)",
56 : : "Hard float (IBM style long doubles)",
57 : : "Soft float (IBM style long doubles)",
58 : : "Single-precision hard float (IBM style long doubles)",
59 : : "Hard or soft float (64-bit long doubles)",
60 : : "Hard float (64-bit long doubles)",
61 : : "Soft float (64-bit long doubles)",
62 : : "Single-precision hard float (64-bit long doubles)",
63 : : "Hard or soft float (IEEE 128-bit long doubles)",
64 : : "Hard float (IEEE 128-bit long doubles)",
65 : : "Soft float (IEEE 128-bit long doubles)",
66 : : "Single-precision hard float (IEEE 128-bit long doubles)",
67 : : };
68 [ + - ]: 4 : if (value < sizeof fp_kinds / sizeof fp_kinds[0])
69 : 4 : *value_name = fp_kinds[value];
70 : 4 : return true;
71 : :
72 : 4 : case 8:
73 : 4 : *tag_name = "GNU_Power_ABI_Vector";
74 : 4 : static const char *vector_kinds[] =
75 : : {
76 : : "Any", "Generic", "AltiVec", "SPE"
77 : : };
78 [ + - ]: 4 : if (value < sizeof vector_kinds / sizeof vector_kinds[0])
79 : 4 : *value_name = vector_kinds[value];
80 : 4 : return true;
81 : :
82 : 2 : case 12:
83 : 2 : *tag_name = "GNU_Power_ABI_Struct_Return";
84 : 2 : static const char *struct_return_kinds[] =
85 : : {
86 : : "Any", "r3/r4", "Memory"
87 : : };
88 [ + - ]: 2 : if (value < sizeof struct_return_kinds / sizeof struct_return_kinds[0])
89 : 2 : *value_name = struct_return_kinds[value];
90 : 2 : return true;
91 : : }
92 : :
93 : : return false;
94 : : }
95 : :
96 : : __typeof (ppc_check_object_attribute)
97 : : ppc64_check_object_attribute
98 : : __attribute__ ((alias ("ppc_check_object_attribute")));
|