xref: /aosp_15_r20/external/elfutils/backends/arm_machineflagname.c (revision 7304104da70ce23c86437a01be71edd1a2d7f37e)
1*7304104dSAndroid Build Coastguard Worker /* Arm-specific ELF flag names.
2*7304104dSAndroid Build Coastguard Worker    Copyright (C) 2022 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 #define BACKEND arm_
34*7304104dSAndroid Build Coastguard Worker #include "libebl_CPU.h"
35*7304104dSAndroid Build Coastguard Worker 
36*7304104dSAndroid Build Coastguard Worker const char *
arm_machine_flag_name(Elf64_Word orig,Elf64_Word * flagref)37*7304104dSAndroid Build Coastguard Worker arm_machine_flag_name (Elf64_Word orig, Elf64_Word *flagref)
38*7304104dSAndroid Build Coastguard Worker {
39*7304104dSAndroid Build Coastguard Worker   unsigned version = EF_ARM_EABI_VERSION (*flagref) >> 24;
40*7304104dSAndroid Build Coastguard Worker   if (version != 0)
41*7304104dSAndroid Build Coastguard Worker     {
42*7304104dSAndroid Build Coastguard Worker       static const char vername[5][14] =
43*7304104dSAndroid Build Coastguard Worker         {
44*7304104dSAndroid Build Coastguard Worker 	  "Version1 EABI",
45*7304104dSAndroid Build Coastguard Worker 	  "Version2 EABI",
46*7304104dSAndroid Build Coastguard Worker 	  "Version3 EABI",
47*7304104dSAndroid Build Coastguard Worker 	  "Version4 EABI",
48*7304104dSAndroid Build Coastguard Worker 	  "Version5 EABI",
49*7304104dSAndroid Build Coastguard Worker         };
50*7304104dSAndroid Build Coastguard Worker       *flagref &= ~((Elf64_Word) EF_ARM_EABIMASK);
51*7304104dSAndroid Build Coastguard Worker       return version <= 5 ? vername[version - 1] : NULL;
52*7304104dSAndroid Build Coastguard Worker     }
53*7304104dSAndroid Build Coastguard Worker   switch (EF_ARM_EABI_VERSION (orig))
54*7304104dSAndroid Build Coastguard Worker     {
55*7304104dSAndroid Build Coastguard Worker     case EF_ARM_EABI_VER2:
56*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_DYNSYMSUSESEGIDX) != 0)
57*7304104dSAndroid Build Coastguard Worker 	{
58*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_DYNSYMSUSESEGIDX);
59*7304104dSAndroid Build Coastguard Worker 	  return "dynamic symbols use segment index";
60*7304104dSAndroid Build Coastguard Worker 	}
61*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_MAPSYMSFIRST) != 0)
62*7304104dSAndroid Build Coastguard Worker 	{
63*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_MAPSYMSFIRST);
64*7304104dSAndroid Build Coastguard Worker 	  return "mapping symbols precede others";
65*7304104dSAndroid Build Coastguard Worker 	}
66*7304104dSAndroid Build Coastguard Worker       FALLTHROUGH;
67*7304104dSAndroid Build Coastguard Worker     case EF_ARM_EABI_VER1:
68*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_SYMSARESORTED) != 0)
69*7304104dSAndroid Build Coastguard Worker 	{
70*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_SYMSARESORTED);
71*7304104dSAndroid Build Coastguard Worker 	  return "sorted symbol tables";
72*7304104dSAndroid Build Coastguard Worker 	}
73*7304104dSAndroid Build Coastguard Worker       break;
74*7304104dSAndroid Build Coastguard Worker     case EF_ARM_EABI_VER3:
75*7304104dSAndroid Build Coastguard Worker       break;
76*7304104dSAndroid Build Coastguard Worker     case EF_ARM_EABI_VER5:
77*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_SOFT_FLOAT) != 0)
78*7304104dSAndroid Build Coastguard Worker 	{
79*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_SOFT_FLOAT);
80*7304104dSAndroid Build Coastguard Worker 	  return "soft-float ABI";
81*7304104dSAndroid Build Coastguard Worker 	}
82*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_VFP_FLOAT) != 0)
83*7304104dSAndroid Build Coastguard Worker 	{
84*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_VFP_FLOAT);
85*7304104dSAndroid Build Coastguard Worker 	  return "hard-float ABI";
86*7304104dSAndroid Build Coastguard Worker 	}
87*7304104dSAndroid Build Coastguard Worker       FALLTHROUGH;
88*7304104dSAndroid Build Coastguard Worker     case EF_ARM_EABI_VER4:
89*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_BE8) != 0)
90*7304104dSAndroid Build Coastguard Worker 	{
91*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_BE8);
92*7304104dSAndroid Build Coastguard Worker 	  return "BE8";
93*7304104dSAndroid Build Coastguard Worker 	}
94*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_LE8) != 0)
95*7304104dSAndroid Build Coastguard Worker 	{
96*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_LE8);
97*7304104dSAndroid Build Coastguard Worker 	  return "LE8";
98*7304104dSAndroid Build Coastguard Worker 	}
99*7304104dSAndroid Build Coastguard Worker       break;
100*7304104dSAndroid Build Coastguard Worker     case EF_ARM_EABI_UNKNOWN:
101*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_INTERWORK) != 0)
102*7304104dSAndroid Build Coastguard Worker 	{
103*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_INTERWORK);
104*7304104dSAndroid Build Coastguard Worker 	  return "interworking enabled";
105*7304104dSAndroid Build Coastguard Worker 	}
106*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_APCS_26) != 0)
107*7304104dSAndroid Build Coastguard Worker 	{
108*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_APCS_26);
109*7304104dSAndroid Build Coastguard Worker 	  return "uses APCS/26";
110*7304104dSAndroid Build Coastguard Worker 	}
111*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_APCS_FLOAT) != 0)
112*7304104dSAndroid Build Coastguard Worker 	{
113*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_APCS_FLOAT);
114*7304104dSAndroid Build Coastguard Worker 	  return "uses APCS/float";
115*7304104dSAndroid Build Coastguard Worker 	}
116*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_PIC) != 0)
117*7304104dSAndroid Build Coastguard Worker 	{
118*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_PIC);
119*7304104dSAndroid Build Coastguard Worker 	  return "position independent";
120*7304104dSAndroid Build Coastguard Worker 	}
121*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_ALIGN8) != 0)
122*7304104dSAndroid Build Coastguard Worker 	{
123*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_ALIGN8);
124*7304104dSAndroid Build Coastguard Worker 	  return "8 bit structure alignment";
125*7304104dSAndroid Build Coastguard Worker 	}
126*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_NEW_ABI) != 0)
127*7304104dSAndroid Build Coastguard Worker 	{
128*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_NEW_ABI);
129*7304104dSAndroid Build Coastguard Worker 	  return "uses new ABI";
130*7304104dSAndroid Build Coastguard Worker 	}
131*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_OLD_ABI) != 0)
132*7304104dSAndroid Build Coastguard Worker 	{
133*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_OLD_ABI);
134*7304104dSAndroid Build Coastguard Worker 	  return "uses old ABI";
135*7304104dSAndroid Build Coastguard Worker 	}
136*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_SOFT_FLOAT) != 0)
137*7304104dSAndroid Build Coastguard Worker 	{
138*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_SOFT_FLOAT);
139*7304104dSAndroid Build Coastguard Worker 	  return "software FP";
140*7304104dSAndroid Build Coastguard Worker 	}
141*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_VFP_FLOAT) != 0)
142*7304104dSAndroid Build Coastguard Worker 	{
143*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_VFP_FLOAT);
144*7304104dSAndroid Build Coastguard Worker 	  return "VFP";
145*7304104dSAndroid Build Coastguard Worker 	}
146*7304104dSAndroid Build Coastguard Worker       if ((*flagref & EF_ARM_MAVERICK_FLOAT) != 0)
147*7304104dSAndroid Build Coastguard Worker 	{
148*7304104dSAndroid Build Coastguard Worker 	  *flagref &= ~((Elf64_Word) EF_ARM_MAVERICK_FLOAT);
149*7304104dSAndroid Build Coastguard Worker 	  return "Maverick FP";
150*7304104dSAndroid Build Coastguard Worker 	}
151*7304104dSAndroid Build Coastguard Worker       break;
152*7304104dSAndroid Build Coastguard Worker     default:
153*7304104dSAndroid Build Coastguard Worker       break;
154*7304104dSAndroid Build Coastguard Worker     }
155*7304104dSAndroid Build Coastguard Worker   return NULL;
156*7304104dSAndroid Build Coastguard Worker }
157