1*7304104dSAndroid Build Coastguard Worker /* Object attribute tags for ARM.
2*7304104dSAndroid Build Coastguard Worker Copyright (C) 2009 Red Hat, Inc.
3*7304104dSAndroid Build Coastguard Worker This file is part of elfutils.
4*7304104dSAndroid Build Coastguard Worker
5*7304104dSAndroid Build Coastguard Worker This file is free software; you can redistribute it and/or modify
6*7304104dSAndroid Build Coastguard Worker it under the terms of either
7*7304104dSAndroid Build Coastguard Worker
8*7304104dSAndroid Build Coastguard Worker * the GNU Lesser General Public License as published by the Free
9*7304104dSAndroid Build Coastguard Worker Software Foundation; either version 3 of the License, or (at
10*7304104dSAndroid Build Coastguard Worker your option) any later version
11*7304104dSAndroid Build Coastguard Worker
12*7304104dSAndroid Build Coastguard Worker or
13*7304104dSAndroid Build Coastguard Worker
14*7304104dSAndroid Build Coastguard Worker * the GNU General Public License as published by the Free
15*7304104dSAndroid Build Coastguard Worker Software Foundation; either version 2 of the License, or (at
16*7304104dSAndroid Build Coastguard Worker your option) any later version
17*7304104dSAndroid Build Coastguard Worker
18*7304104dSAndroid Build Coastguard Worker or both in parallel, as here.
19*7304104dSAndroid Build Coastguard Worker
20*7304104dSAndroid Build Coastguard Worker elfutils is distributed in the hope that it will be useful, but
21*7304104dSAndroid Build Coastguard Worker WITHOUT ANY WARRANTY; without even the implied warranty of
22*7304104dSAndroid Build Coastguard Worker MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23*7304104dSAndroid Build Coastguard Worker General Public License for more details.
24*7304104dSAndroid Build Coastguard Worker
25*7304104dSAndroid Build Coastguard Worker You should have received copies of the GNU General Public License and
26*7304104dSAndroid Build Coastguard Worker the GNU Lesser General Public License along with this program. If
27*7304104dSAndroid Build Coastguard Worker not, see <http://www.gnu.org/licenses/>. */
28*7304104dSAndroid Build Coastguard Worker
29*7304104dSAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
30*7304104dSAndroid Build Coastguard Worker # include <config.h>
31*7304104dSAndroid Build Coastguard Worker #endif
32*7304104dSAndroid Build Coastguard Worker
33*7304104dSAndroid Build Coastguard Worker #include <string.h>
34*7304104dSAndroid Build Coastguard Worker #include <dwarf.h>
35*7304104dSAndroid Build Coastguard Worker
36*7304104dSAndroid Build Coastguard Worker #define BACKEND arm_
37*7304104dSAndroid Build Coastguard Worker #include "libebl_CPU.h"
38*7304104dSAndroid Build Coastguard Worker
39*7304104dSAndroid Build Coastguard Worker #define KNOWN_VALUES(...) do \
40*7304104dSAndroid Build Coastguard Worker { \
41*7304104dSAndroid Build Coastguard Worker static const char *table[] = { __VA_ARGS__ }; \
42*7304104dSAndroid Build Coastguard Worker if (value < sizeof table / sizeof table[0]) \
43*7304104dSAndroid Build Coastguard Worker *value_name = table[value]; \
44*7304104dSAndroid Build Coastguard Worker } while (0)
45*7304104dSAndroid Build Coastguard Worker
46*7304104dSAndroid Build Coastguard Worker bool
arm_check_object_attribute(Ebl * ebl,const char * vendor,int tag,uint64_t value,const char ** tag_name,const char ** value_name)47*7304104dSAndroid Build Coastguard Worker arm_check_object_attribute (Ebl *ebl __attribute__ ((unused)),
48*7304104dSAndroid Build Coastguard Worker const char *vendor, int tag, uint64_t value,
49*7304104dSAndroid Build Coastguard Worker const char **tag_name, const char **value_name)
50*7304104dSAndroid Build Coastguard Worker {
51*7304104dSAndroid Build Coastguard Worker if (!strcmp (vendor, "aeabi"))
52*7304104dSAndroid Build Coastguard Worker switch (tag)
53*7304104dSAndroid Build Coastguard Worker {
54*7304104dSAndroid Build Coastguard Worker case 4:
55*7304104dSAndroid Build Coastguard Worker *tag_name = "CPU_raw_name";
56*7304104dSAndroid Build Coastguard Worker return true;
57*7304104dSAndroid Build Coastguard Worker case 5:
58*7304104dSAndroid Build Coastguard Worker *tag_name = "CPU_name";
59*7304104dSAndroid Build Coastguard Worker return true;
60*7304104dSAndroid Build Coastguard Worker case 6:
61*7304104dSAndroid Build Coastguard Worker *tag_name = "CPU_arch";
62*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("Pre-v4",
63*7304104dSAndroid Build Coastguard Worker "v4",
64*7304104dSAndroid Build Coastguard Worker "v4T",
65*7304104dSAndroid Build Coastguard Worker "v5T",
66*7304104dSAndroid Build Coastguard Worker "v5TE",
67*7304104dSAndroid Build Coastguard Worker "v5TEJ",
68*7304104dSAndroid Build Coastguard Worker "v6",
69*7304104dSAndroid Build Coastguard Worker "v6KZ",
70*7304104dSAndroid Build Coastguard Worker "v6T2",
71*7304104dSAndroid Build Coastguard Worker "v6K",
72*7304104dSAndroid Build Coastguard Worker "v7",
73*7304104dSAndroid Build Coastguard Worker "v6-M",
74*7304104dSAndroid Build Coastguard Worker "v6S-M");
75*7304104dSAndroid Build Coastguard Worker return true;
76*7304104dSAndroid Build Coastguard Worker case 7:
77*7304104dSAndroid Build Coastguard Worker *tag_name = "CPU_arch_profile";
78*7304104dSAndroid Build Coastguard Worker switch (value)
79*7304104dSAndroid Build Coastguard Worker {
80*7304104dSAndroid Build Coastguard Worker case 'A':
81*7304104dSAndroid Build Coastguard Worker *value_name = "Application";
82*7304104dSAndroid Build Coastguard Worker break;
83*7304104dSAndroid Build Coastguard Worker case 'R':
84*7304104dSAndroid Build Coastguard Worker *value_name = "Realtime";
85*7304104dSAndroid Build Coastguard Worker break;
86*7304104dSAndroid Build Coastguard Worker case 'M':
87*7304104dSAndroid Build Coastguard Worker *value_name = "Microcontroller";
88*7304104dSAndroid Build Coastguard Worker break;
89*7304104dSAndroid Build Coastguard Worker }
90*7304104dSAndroid Build Coastguard Worker return true;
91*7304104dSAndroid Build Coastguard Worker case 8:
92*7304104dSAndroid Build Coastguard Worker *tag_name = "ARM_ISA_use";
93*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("No", "Yes");
94*7304104dSAndroid Build Coastguard Worker return true;
95*7304104dSAndroid Build Coastguard Worker case 9:
96*7304104dSAndroid Build Coastguard Worker *tag_name = "THUMB_ISA_use";
97*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("No", "Thumb-1", "Thumb-2");
98*7304104dSAndroid Build Coastguard Worker return true;
99*7304104dSAndroid Build Coastguard Worker case 10:
100*7304104dSAndroid Build Coastguard Worker *tag_name = "VFP_arch";
101*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16");
102*7304104dSAndroid Build Coastguard Worker return true;
103*7304104dSAndroid Build Coastguard Worker case 11:
104*7304104dSAndroid Build Coastguard Worker *tag_name = "WMMX_arch";
105*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("No", "WMMXv1", "WMMXv2");
106*7304104dSAndroid Build Coastguard Worker return true;
107*7304104dSAndroid Build Coastguard Worker case 12:
108*7304104dSAndroid Build Coastguard Worker *tag_name = "Advanced_SIMD_arch";
109*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("No", "NEONv1");
110*7304104dSAndroid Build Coastguard Worker return true;
111*7304104dSAndroid Build Coastguard Worker case 13:
112*7304104dSAndroid Build Coastguard Worker *tag_name = "PCS_config";
113*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("None",
114*7304104dSAndroid Build Coastguard Worker "Bare platform",
115*7304104dSAndroid Build Coastguard Worker "Linux application",
116*7304104dSAndroid Build Coastguard Worker "Linux DSO",
117*7304104dSAndroid Build Coastguard Worker "PalmOS 2004",
118*7304104dSAndroid Build Coastguard Worker "PalmOS (reserved)",
119*7304104dSAndroid Build Coastguard Worker "SymbianOS 2004",
120*7304104dSAndroid Build Coastguard Worker "SymbianOS (reserved)");
121*7304104dSAndroid Build Coastguard Worker return true;
122*7304104dSAndroid Build Coastguard Worker case 14:
123*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_PCS_R9_use";
124*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("V6", "SB", "TLS", "Unused");
125*7304104dSAndroid Build Coastguard Worker return true;
126*7304104dSAndroid Build Coastguard Worker case 15:
127*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_PCS_RW_data";
128*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("Absolute", "PC-relative", "SB-relative", "None");
129*7304104dSAndroid Build Coastguard Worker return true;
130*7304104dSAndroid Build Coastguard Worker case 16:
131*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_PCS_RO_data";
132*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("Absolute", "PC-relative", "None");
133*7304104dSAndroid Build Coastguard Worker return true;
134*7304104dSAndroid Build Coastguard Worker case 17:
135*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_PCS_GOT_use";
136*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("None", "direct", "GOT-indirect");
137*7304104dSAndroid Build Coastguard Worker return true;
138*7304104dSAndroid Build Coastguard Worker case 18:
139*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_PCS_wchar_t";
140*7304104dSAndroid Build Coastguard Worker return true;
141*7304104dSAndroid Build Coastguard Worker case 19:
142*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_FP_rounding";
143*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("Unused", "Needed");
144*7304104dSAndroid Build Coastguard Worker return true;
145*7304104dSAndroid Build Coastguard Worker case 20:
146*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_FP_denormal";
147*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("Unused", "Needed", "Sign only");
148*7304104dSAndroid Build Coastguard Worker return true;
149*7304104dSAndroid Build Coastguard Worker case 21:
150*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_FP_exceptions";
151*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("Unused", "Needed");
152*7304104dSAndroid Build Coastguard Worker return true;
153*7304104dSAndroid Build Coastguard Worker case 22:
154*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_FP_user_exceptions";
155*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("Unused", "Needed");
156*7304104dSAndroid Build Coastguard Worker return true;
157*7304104dSAndroid Build Coastguard Worker case 23:
158*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_FP_number_model";
159*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("Unused", "Finite", "RTABI", "IEEE 754");
160*7304104dSAndroid Build Coastguard Worker return true;
161*7304104dSAndroid Build Coastguard Worker case 24:
162*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_align8_needed";
163*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("No", "Yes", "4-byte");
164*7304104dSAndroid Build Coastguard Worker return true;
165*7304104dSAndroid Build Coastguard Worker case 25:
166*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_align8_preserved";
167*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("No", "Yes, except leaf SP", "Yes");
168*7304104dSAndroid Build Coastguard Worker return true;
169*7304104dSAndroid Build Coastguard Worker case 26:
170*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_enum_size";
171*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("Unused", "small", "int", "forced to int");
172*7304104dSAndroid Build Coastguard Worker return true;
173*7304104dSAndroid Build Coastguard Worker case 27:
174*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_HardFP_use";
175*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("as VFP_arch", "SP only", "DP only", "SP and DP");
176*7304104dSAndroid Build Coastguard Worker return true;
177*7304104dSAndroid Build Coastguard Worker case 28:
178*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_VFP_args";
179*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("AAPCS", "VFP registers", "custom");
180*7304104dSAndroid Build Coastguard Worker return true;
181*7304104dSAndroid Build Coastguard Worker case 29:
182*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_WMMX_args";
183*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("AAPCS", "WMMX registers", "custom");
184*7304104dSAndroid Build Coastguard Worker return true;
185*7304104dSAndroid Build Coastguard Worker case 30:
186*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_optimization_goals";
187*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("None",
188*7304104dSAndroid Build Coastguard Worker "Prefer Speed",
189*7304104dSAndroid Build Coastguard Worker "Aggressive Speed",
190*7304104dSAndroid Build Coastguard Worker "Prefer Size",
191*7304104dSAndroid Build Coastguard Worker "Aggressive Size",
192*7304104dSAndroid Build Coastguard Worker "Prefer Debug",
193*7304104dSAndroid Build Coastguard Worker "Aggressive Debug");
194*7304104dSAndroid Build Coastguard Worker return true;
195*7304104dSAndroid Build Coastguard Worker case 31:
196*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_FP_optimization_goals";
197*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("None",
198*7304104dSAndroid Build Coastguard Worker "Prefer Speed",
199*7304104dSAndroid Build Coastguard Worker "Aggressive Speed",
200*7304104dSAndroid Build Coastguard Worker "Prefer Size",
201*7304104dSAndroid Build Coastguard Worker "Aggressive Size",
202*7304104dSAndroid Build Coastguard Worker "Prefer Accuracy",
203*7304104dSAndroid Build Coastguard Worker "Aggressive Accuracy");
204*7304104dSAndroid Build Coastguard Worker return true;
205*7304104dSAndroid Build Coastguard Worker case 34:
206*7304104dSAndroid Build Coastguard Worker *tag_name = "CPU_unaligned_access";
207*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("None", "v6");
208*7304104dSAndroid Build Coastguard Worker return true;
209*7304104dSAndroid Build Coastguard Worker case 36:
210*7304104dSAndroid Build Coastguard Worker *tag_name = "VFP_HP_extension";
211*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("Not Allowed", "Allowed");
212*7304104dSAndroid Build Coastguard Worker return true;
213*7304104dSAndroid Build Coastguard Worker case 38:
214*7304104dSAndroid Build Coastguard Worker *tag_name = "ABI_FP_16bit_format";
215*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("None", "IEEE 754", "Alternative Format");
216*7304104dSAndroid Build Coastguard Worker return true;
217*7304104dSAndroid Build Coastguard Worker case 64:
218*7304104dSAndroid Build Coastguard Worker *tag_name = "nodefaults";
219*7304104dSAndroid Build Coastguard Worker return true;
220*7304104dSAndroid Build Coastguard Worker case 65:
221*7304104dSAndroid Build Coastguard Worker *tag_name = "also_compatible_with";
222*7304104dSAndroid Build Coastguard Worker return true;
223*7304104dSAndroid Build Coastguard Worker case 66:
224*7304104dSAndroid Build Coastguard Worker *tag_name = "T2EE_use";
225*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("Not Allowed", "Allowed");
226*7304104dSAndroid Build Coastguard Worker return true;
227*7304104dSAndroid Build Coastguard Worker case 67:
228*7304104dSAndroid Build Coastguard Worker *tag_name = "conformance";
229*7304104dSAndroid Build Coastguard Worker return true;
230*7304104dSAndroid Build Coastguard Worker case 68:
231*7304104dSAndroid Build Coastguard Worker *tag_name = "Virtualization_use";
232*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("Not Allowed", "Allowed");
233*7304104dSAndroid Build Coastguard Worker return true;
234*7304104dSAndroid Build Coastguard Worker case 70:
235*7304104dSAndroid Build Coastguard Worker *tag_name = "MPextension_use";
236*7304104dSAndroid Build Coastguard Worker KNOWN_VALUES ("Not Allowed", "Allowed");
237*7304104dSAndroid Build Coastguard Worker return true;
238*7304104dSAndroid Build Coastguard Worker }
239*7304104dSAndroid Build Coastguard Worker
240*7304104dSAndroid Build Coastguard Worker return false;
241*7304104dSAndroid Build Coastguard Worker }
242