1581ba352SKai Wang //===- ARMAttributeParser.cpp - ARM Attribute Information Printer ---------===//
234315eecSSam Parker //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
634315eecSSam Parker //
734315eecSSam Parker //===----------------------------------------------------------------------===//
834315eecSSam Parker 
96bda14b3SChandler Carruth #include "llvm/Support/ARMAttributeParser.h"
105b3b008cSserge-sans-paille #include "llvm/ADT/STLArrayExtras.h"
1134315eecSSam Parker #include "llvm/ADT/StringExtras.h"
1234315eecSSam Parker #include "llvm/Support/ScopedPrinter.h"
1334315eecSSam Parker 
1434315eecSSam Parker using namespace llvm;
1534315eecSSam Parker using namespace llvm::ARMBuildAttrs;
1634315eecSSam Parker 
17791efb14SFangrui Song #define ATTRIBUTE_HANDLER(attr)                                                \
18791efb14SFangrui Song   { ARMBuildAttrs::attr, &ARMAttributeParser::attr }
1934315eecSSam Parker 
20791efb14SFangrui Song const ARMAttributeParser::DisplayHandler ARMAttributeParser::displayRoutines[] =
21791efb14SFangrui Song     {
22791efb14SFangrui Song         {ARMBuildAttrs::CPU_raw_name, &ARMAttributeParser::stringAttribute},
23791efb14SFangrui Song         {ARMBuildAttrs::CPU_name, &ARMAttributeParser::stringAttribute},
2434315eecSSam Parker         ATTRIBUTE_HANDLER(CPU_arch),
2534315eecSSam Parker         ATTRIBUTE_HANDLER(CPU_arch_profile),
2634315eecSSam Parker         ATTRIBUTE_HANDLER(ARM_ISA_use),
2734315eecSSam Parker         ATTRIBUTE_HANDLER(THUMB_ISA_use),
2834315eecSSam Parker         ATTRIBUTE_HANDLER(FP_arch),
2934315eecSSam Parker         ATTRIBUTE_HANDLER(WMMX_arch),
3034315eecSSam Parker         ATTRIBUTE_HANDLER(Advanced_SIMD_arch),
31930dee2cSSjoerd Meijer         ATTRIBUTE_HANDLER(MVE_arch),
3234315eecSSam Parker         ATTRIBUTE_HANDLER(PCS_config),
3334315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_PCS_R9_use),
3434315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_PCS_RW_data),
3534315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_PCS_RO_data),
3634315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_PCS_GOT_use),
3734315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_PCS_wchar_t),
3834315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_FP_rounding),
3934315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_FP_denormal),
4034315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_FP_exceptions),
4134315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_FP_user_exceptions),
4234315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_FP_number_model),
4334315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_align_needed),
4434315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_align_preserved),
4534315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_enum_size),
4634315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_HardFP_use),
4734315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_VFP_args),
4834315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_WMMX_args),
4934315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_optimization_goals),
5034315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_FP_optimization_goals),
5134315eecSSam Parker         ATTRIBUTE_HANDLER(compatibility),
5234315eecSSam Parker         ATTRIBUTE_HANDLER(CPU_unaligned_access),
5334315eecSSam Parker         ATTRIBUTE_HANDLER(FP_HP_extension),
5434315eecSSam Parker         ATTRIBUTE_HANDLER(ABI_FP_16bit_format),
5534315eecSSam Parker         ATTRIBUTE_HANDLER(MPextension_use),
5634315eecSSam Parker         ATTRIBUTE_HANDLER(DIV_use),
5734315eecSSam Parker         ATTRIBUTE_HANDLER(DSP_extension),
5834315eecSSam Parker         ATTRIBUTE_HANDLER(T2EE_use),
5934315eecSSam Parker         ATTRIBUTE_HANDLER(Virtualization_use),
60b430782bSTies Stuij         ATTRIBUTE_HANDLER(PAC_extension),
61b430782bSTies Stuij         ATTRIBUTE_HANDLER(BTI_extension),
62b430782bSTies Stuij         ATTRIBUTE_HANDLER(PACRET_use),
63b430782bSTies Stuij         ATTRIBUTE_HANDLER(BTI_use),
64791efb14SFangrui Song         ATTRIBUTE_HANDLER(nodefaults),
6534315eecSSam Parker };
6634315eecSSam Parker 
6734315eecSSam Parker #undef ATTRIBUTE_HANDLER
6834315eecSSam Parker 
stringAttribute(AttrType tag)69791efb14SFangrui Song Error ARMAttributeParser::stringAttribute(AttrType tag) {
70581ba352SKai Wang   StringRef tagName =
71435a5a36SKazu Hirata       ELFAttrs::attrTypeAsString(tag, tagToStringMap, /*hasTagPrefix=*/false);
72791efb14SFangrui Song   StringRef desc = de.getCStrRef(cursor);
73791efb14SFangrui Song 
74791efb14SFangrui Song   if (sw) {
75791efb14SFangrui Song     DictScope scope(*sw, "Attribute");
76791efb14SFangrui Song     sw->printNumber("Tag", tag);
77791efb14SFangrui Song     if (!tagName.empty())
78791efb14SFangrui Song       sw->printString("TagName", tagName);
79791efb14SFangrui Song     sw->printString("Value", desc);
80791efb14SFangrui Song   }
81791efb14SFangrui Song   return Error::success();
8234315eecSSam Parker }
8334315eecSSam Parker 
CPU_arch(AttrType tag)84791efb14SFangrui Song Error ARMAttributeParser::CPU_arch(AttrType tag) {
85791efb14SFangrui Song   static const char *strings[] = {
8634315eecSSam Parker     "Pre-v4", "ARM v4", "ARM v4T", "ARM v5T", "ARM v5TE", "ARM v5TEJ", "ARM v6",
8734315eecSSam Parker     "ARM v6KZ", "ARM v6T2", "ARM v6K", "ARM v7", "ARM v6-M", "ARM v6S-M",
88*b43bec19SVictor Campos     "ARM v7E-M", "ARM v8-A", "ARM v8-R",
89930dee2cSSjoerd Meijer     "ARM v8-M Baseline", "ARM v8-M Mainline", nullptr, nullptr, nullptr,
90051deb2dSTies Stuij     "ARM v8.1-M Mainline", "ARM v9-A"
9134315eecSSam Parker   };
92791efb14SFangrui Song   return parseStringAttribute("CPU_arch", tag, makeArrayRef(strings));
9334315eecSSam Parker }
9434315eecSSam Parker 
CPU_arch_profile(AttrType tag)95791efb14SFangrui Song Error ARMAttributeParser::CPU_arch_profile(AttrType tag) {
96791efb14SFangrui Song   uint64_t value = de.getULEB128(cursor);
9734315eecSSam Parker 
98791efb14SFangrui Song   StringRef profile;
99791efb14SFangrui Song   switch (value) {
100791efb14SFangrui Song   default: profile = "Unknown"; break;
101791efb14SFangrui Song   case 'A': profile = "Application"; break;
102791efb14SFangrui Song   case 'R': profile = "Real-time"; break;
103791efb14SFangrui Song   case 'M': profile = "Microcontroller"; break;
104791efb14SFangrui Song   case 'S': profile = "Classic"; break;
105791efb14SFangrui Song   case 0: profile = "None"; break;
10634315eecSSam Parker   }
10734315eecSSam Parker 
108791efb14SFangrui Song   printAttribute(tag, value, profile);
109791efb14SFangrui Song   return Error::success();
11034315eecSSam Parker }
11134315eecSSam Parker 
ARM_ISA_use(AttrType tag)112791efb14SFangrui Song Error ARMAttributeParser::ARM_ISA_use(AttrType tag) {
113791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "Permitted"};
114791efb14SFangrui Song   return parseStringAttribute("ARM_ISA_use", tag, makeArrayRef(strings));
11534315eecSSam Parker }
11634315eecSSam Parker 
THUMB_ISA_use(AttrType tag)117791efb14SFangrui Song Error ARMAttributeParser::THUMB_ISA_use(AttrType tag) {
118f502b14dSLemonBoy   static const char *strings[] = {"Not Permitted", "Thumb-1", "Thumb-2", "Permitted"};
119791efb14SFangrui Song   return parseStringAttribute("THUMB_ISA_use", tag, makeArrayRef(strings));
12034315eecSSam Parker }
12134315eecSSam Parker 
FP_arch(AttrType tag)122791efb14SFangrui Song Error ARMAttributeParser::FP_arch(AttrType tag) {
123791efb14SFangrui Song   static const char *strings[] = {
124791efb14SFangrui Song       "Not Permitted", "VFPv1",     "VFPv2",      "VFPv3",         "VFPv3-D16",
125791efb14SFangrui Song       "VFPv4",         "VFPv4-D16", "ARMv8-a FP", "ARMv8-a FP-D16"};
126791efb14SFangrui Song   return parseStringAttribute("FP_arch", tag, makeArrayRef(strings));
12734315eecSSam Parker }
12834315eecSSam Parker 
WMMX_arch(AttrType tag)129791efb14SFangrui Song Error ARMAttributeParser::WMMX_arch(AttrType tag) {
130791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "WMMXv1", "WMMXv2"};
131791efb14SFangrui Song   return parseStringAttribute("WMMX_arch", tag, makeArrayRef(strings));
13234315eecSSam Parker }
13334315eecSSam Parker 
Advanced_SIMD_arch(AttrType tag)134791efb14SFangrui Song Error ARMAttributeParser::Advanced_SIMD_arch(AttrType tag) {
135791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "NEONv1", "NEONv2+FMA",
136791efb14SFangrui Song                                   "ARMv8-a NEON", "ARMv8.1-a NEON"};
137791efb14SFangrui Song   return parseStringAttribute("Advanced_SIMD_arch", tag, makeArrayRef(strings));
13834315eecSSam Parker }
13934315eecSSam Parker 
MVE_arch(AttrType tag)140791efb14SFangrui Song Error ARMAttributeParser::MVE_arch(AttrType tag) {
141791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "MVE integer",
142791efb14SFangrui Song                                   "MVE integer and float"};
143791efb14SFangrui Song   return parseStringAttribute("MVE_arch", tag, makeArrayRef(strings));
144930dee2cSSjoerd Meijer }
145930dee2cSSjoerd Meijer 
PCS_config(AttrType tag)146791efb14SFangrui Song Error ARMAttributeParser::PCS_config(AttrType tag) {
147791efb14SFangrui Song   static const char *strings[] = {
14834315eecSSam Parker     "None", "Bare Platform", "Linux Application", "Linux DSO", "Palm OS 2004",
149791efb14SFangrui Song     "Reserved (Palm OS)", "Symbian OS 2004", "Reserved (Symbian OS)"};
150791efb14SFangrui Song   return parseStringAttribute("PCS_config", tag, makeArrayRef(strings));
15134315eecSSam Parker }
15234315eecSSam Parker 
ABI_PCS_R9_use(AttrType tag)153791efb14SFangrui Song Error ARMAttributeParser::ABI_PCS_R9_use(AttrType tag) {
154791efb14SFangrui Song   static const char *strings[] = {"v6", "Static Base", "TLS", "Unused"};
155791efb14SFangrui Song   return parseStringAttribute("ABI_PCS_R9_use", tag, makeArrayRef(strings));
15634315eecSSam Parker }
15734315eecSSam Parker 
ABI_PCS_RW_data(AttrType tag)158791efb14SFangrui Song Error ARMAttributeParser::ABI_PCS_RW_data(AttrType tag) {
159791efb14SFangrui Song   static const char *strings[] = {"Absolute", "PC-relative", "SB-relative",
160791efb14SFangrui Song                                   "Not Permitted"};
161791efb14SFangrui Song   return parseStringAttribute("ABI_PCS_RW_data", tag, makeArrayRef(strings));
16234315eecSSam Parker }
16334315eecSSam Parker 
ABI_PCS_RO_data(AttrType tag)164791efb14SFangrui Song Error ARMAttributeParser::ABI_PCS_RO_data(AttrType tag) {
165791efb14SFangrui Song   static const char *strings[] = {"Absolute", "PC-relative", "Not Permitted"};
166791efb14SFangrui Song   return parseStringAttribute("ABI_PCS_RO_data", tag, makeArrayRef(strings));
16734315eecSSam Parker }
16834315eecSSam Parker 
ABI_PCS_GOT_use(AttrType tag)169791efb14SFangrui Song Error ARMAttributeParser::ABI_PCS_GOT_use(AttrType tag) {
170791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "Direct", "GOT-Indirect"};
171791efb14SFangrui Song   return parseStringAttribute("ABI_PCS_GOT_use", tag, makeArrayRef(strings));
17234315eecSSam Parker }
17334315eecSSam Parker 
ABI_PCS_wchar_t(AttrType tag)174791efb14SFangrui Song Error ARMAttributeParser::ABI_PCS_wchar_t(AttrType tag) {
175791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "Unknown", "2-byte",
176791efb14SFangrui Song                                   "Unknown", "4-byte"};
177791efb14SFangrui Song   return parseStringAttribute("ABI_PCS_wchar_t", tag, makeArrayRef(strings));
17834315eecSSam Parker }
17934315eecSSam Parker 
ABI_FP_rounding(AttrType tag)180791efb14SFangrui Song Error ARMAttributeParser::ABI_FP_rounding(AttrType tag) {
181791efb14SFangrui Song   static const char *strings[] = {"IEEE-754", "Runtime"};
182791efb14SFangrui Song   return parseStringAttribute("ABI_FP_rounding", tag, makeArrayRef(strings));
18334315eecSSam Parker }
18434315eecSSam Parker 
ABI_FP_denormal(AttrType tag)185791efb14SFangrui Song Error ARMAttributeParser::ABI_FP_denormal(AttrType tag) {
186791efb14SFangrui Song   static const char *strings[] = {"Unsupported", "IEEE-754", "Sign Only"};
187791efb14SFangrui Song   return parseStringAttribute("ABI_FP_denormal", tag, makeArrayRef(strings));
18834315eecSSam Parker }
18934315eecSSam Parker 
ABI_FP_exceptions(AttrType tag)190791efb14SFangrui Song Error ARMAttributeParser::ABI_FP_exceptions(AttrType tag) {
191791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "IEEE-754"};
192791efb14SFangrui Song   return parseStringAttribute("ABI_FP_exceptions", tag, makeArrayRef(strings));
193791efb14SFangrui Song }
ABI_FP_user_exceptions(AttrType tag)194791efb14SFangrui Song Error ARMAttributeParser::ABI_FP_user_exceptions(AttrType tag) {
195791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "IEEE-754"};
196791efb14SFangrui Song   return parseStringAttribute("ABI_FP_user_exceptions", tag,
197791efb14SFangrui Song                               makeArrayRef(strings));
19834315eecSSam Parker }
19934315eecSSam Parker 
ABI_FP_number_model(AttrType tag)200791efb14SFangrui Song Error ARMAttributeParser::ABI_FP_number_model(AttrType tag) {
201791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "Finite Only", "RTABI",
202791efb14SFangrui Song                                   "IEEE-754"};
203791efb14SFangrui Song   return parseStringAttribute("ABI_FP_number_model", tag,
204791efb14SFangrui Song                               makeArrayRef(strings));
20534315eecSSam Parker }
20634315eecSSam Parker 
ABI_align_needed(AttrType tag)207791efb14SFangrui Song Error ARMAttributeParser::ABI_align_needed(AttrType tag) {
208791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "8-byte alignment",
209791efb14SFangrui Song                                   "4-byte alignment", "Reserved"};
21034315eecSSam Parker 
211791efb14SFangrui Song   uint64_t value = de.getULEB128(cursor);
21234315eecSSam Parker 
213791efb14SFangrui Song   std::string description;
214f15014ffSBenjamin Kramer   if (value < array_lengthof(strings))
215791efb14SFangrui Song     description = strings[value];
216791efb14SFangrui Song   else if (value <= 12)
217791efb14SFangrui Song     description = "8-byte alignment, " + utostr(1ULL << value) +
218791efb14SFangrui Song                   "-byte extended alignment";
21934315eecSSam Parker   else
220791efb14SFangrui Song     description = "Invalid";
22134315eecSSam Parker 
222791efb14SFangrui Song   printAttribute(tag, value, description);
223791efb14SFangrui Song   return Error::success();
22434315eecSSam Parker }
22534315eecSSam Parker 
ABI_align_preserved(AttrType tag)226791efb14SFangrui Song Error ARMAttributeParser::ABI_align_preserved(AttrType tag) {
227791efb14SFangrui Song   static const char *strings[] = {"Not Required", "8-byte data alignment",
228791efb14SFangrui Song                                   "8-byte data and code alignment", "Reserved"};
22934315eecSSam Parker 
230791efb14SFangrui Song   uint64_t value = de.getULEB128(cursor);
23134315eecSSam Parker 
232791efb14SFangrui Song   std::string description;
233f15014ffSBenjamin Kramer   if (value < array_lengthof(strings))
234791efb14SFangrui Song     description = std::string(strings[value]);
235791efb14SFangrui Song   else if (value <= 12)
236791efb14SFangrui Song     description = std::string("8-byte stack alignment, ") +
237791efb14SFangrui Song                   utostr(1ULL << value) + std::string("-byte data alignment");
23834315eecSSam Parker   else
239791efb14SFangrui Song     description = "Invalid";
24034315eecSSam Parker 
241791efb14SFangrui Song   printAttribute(tag, value, description);
242791efb14SFangrui Song   return Error::success();
24334315eecSSam Parker }
24434315eecSSam Parker 
ABI_enum_size(AttrType tag)245791efb14SFangrui Song Error ARMAttributeParser::ABI_enum_size(AttrType tag) {
246791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "Packed", "Int32",
247791efb14SFangrui Song                                   "External Int32"};
248791efb14SFangrui Song   return parseStringAttribute("ABI_enum_size", tag, makeArrayRef(strings));
24934315eecSSam Parker }
25034315eecSSam Parker 
ABI_HardFP_use(AttrType tag)251791efb14SFangrui Song Error ARMAttributeParser::ABI_HardFP_use(AttrType tag) {
252791efb14SFangrui Song   static const char *strings[] = {"Tag_FP_arch", "Single-Precision", "Reserved",
253791efb14SFangrui Song                                   "Tag_FP_arch (deprecated)"};
254791efb14SFangrui Song   return parseStringAttribute("ABI_HardFP_use", tag, makeArrayRef(strings));
25534315eecSSam Parker }
25634315eecSSam Parker 
ABI_VFP_args(AttrType tag)257791efb14SFangrui Song Error ARMAttributeParser::ABI_VFP_args(AttrType tag) {
258791efb14SFangrui Song   static const char *strings[] = {"AAPCS", "AAPCS VFP", "Custom",
259791efb14SFangrui Song                                   "Not Permitted"};
260791efb14SFangrui Song   return parseStringAttribute("ABI_VFP_args", tag, makeArrayRef(strings));
26134315eecSSam Parker }
26234315eecSSam Parker 
ABI_WMMX_args(AttrType tag)263791efb14SFangrui Song Error ARMAttributeParser::ABI_WMMX_args(AttrType tag) {
264791efb14SFangrui Song   static const char *strings[] = {"AAPCS", "iWMMX", "Custom"};
265791efb14SFangrui Song   return parseStringAttribute("ABI_WMMX_args", tag, makeArrayRef(strings));
26634315eecSSam Parker }
26734315eecSSam Parker 
ABI_optimization_goals(AttrType tag)268791efb14SFangrui Song Error ARMAttributeParser::ABI_optimization_goals(AttrType tag) {
269791efb14SFangrui Song   static const char *strings[] = {
27034315eecSSam Parker     "None", "Speed", "Aggressive Speed", "Size", "Aggressive Size", "Debugging",
27134315eecSSam Parker     "Best Debugging"
27234315eecSSam Parker   };
273791efb14SFangrui Song   return parseStringAttribute("ABI_optimization_goals", tag,
274791efb14SFangrui Song                               makeArrayRef(strings));
27534315eecSSam Parker }
27634315eecSSam Parker 
ABI_FP_optimization_goals(AttrType tag)277791efb14SFangrui Song Error ARMAttributeParser::ABI_FP_optimization_goals(AttrType tag) {
278791efb14SFangrui Song   static const char *strings[] = {
279791efb14SFangrui Song       "None",     "Speed",        "Aggressive Speed", "Size", "Aggressive Size",
280791efb14SFangrui Song       "Accuracy", "Best Accuracy"};
281791efb14SFangrui Song   return parseStringAttribute("ABI_FP_optimization_goals", tag,
282791efb14SFangrui Song                               makeArrayRef(strings));
28334315eecSSam Parker }
28434315eecSSam Parker 
compatibility(AttrType tag)285791efb14SFangrui Song Error ARMAttributeParser::compatibility(AttrType tag) {
286791efb14SFangrui Song   uint64_t integer = de.getULEB128(cursor);
287791efb14SFangrui Song   StringRef string = de.getCStrRef(cursor);
28834315eecSSam Parker 
289791efb14SFangrui Song   if (sw) {
290791efb14SFangrui Song     DictScope scope(*sw, "Attribute");
291791efb14SFangrui Song     sw->printNumber("Tag", tag);
292791efb14SFangrui Song     sw->startLine() << "Value: " << integer << ", " << string << '\n';
293581ba352SKai Wang     sw->printString("TagName",
294581ba352SKai Wang                     ELFAttrs::attrTypeAsString(tag, tagToStringMap,
295581ba352SKai Wang                                                /*hasTagPrefix=*/false));
296791efb14SFangrui Song     switch (integer) {
29734315eecSSam Parker     case 0:
298791efb14SFangrui Song       sw->printString("Description", StringRef("No Specific Requirements"));
29934315eecSSam Parker       break;
30034315eecSSam Parker     case 1:
301791efb14SFangrui Song       sw->printString("Description", StringRef("AEABI Conformant"));
30234315eecSSam Parker       break;
30334315eecSSam Parker     default:
304791efb14SFangrui Song       sw->printString("Description", StringRef("AEABI Non-Conformant"));
30534315eecSSam Parker       break;
30634315eecSSam Parker     }
30734315eecSSam Parker   }
308791efb14SFangrui Song   return Error::success();
309df7c6ef9SSam Parker }
31034315eecSSam Parker 
CPU_unaligned_access(AttrType tag)311791efb14SFangrui Song Error ARMAttributeParser::CPU_unaligned_access(AttrType tag) {
312791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "v6-style"};
313791efb14SFangrui Song   return parseStringAttribute("CPU_unaligned_access", tag,
314791efb14SFangrui Song                               makeArrayRef(strings));
31534315eecSSam Parker }
31634315eecSSam Parker 
FP_HP_extension(AttrType tag)317791efb14SFangrui Song Error ARMAttributeParser::FP_HP_extension(AttrType tag) {
318791efb14SFangrui Song   static const char *strings[] = {"If Available", "Permitted"};
319791efb14SFangrui Song   return parseStringAttribute("FP_HP_extension", tag, makeArrayRef(strings));
32034315eecSSam Parker }
32134315eecSSam Parker 
ABI_FP_16bit_format(AttrType tag)322791efb14SFangrui Song Error ARMAttributeParser::ABI_FP_16bit_format(AttrType tag) {
323791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "IEEE-754", "VFPv3"};
324791efb14SFangrui Song   return parseStringAttribute("ABI_FP_16bit_format", tag,
325791efb14SFangrui Song                               makeArrayRef(strings));
32634315eecSSam Parker }
32734315eecSSam Parker 
MPextension_use(AttrType tag)328791efb14SFangrui Song Error ARMAttributeParser::MPextension_use(AttrType tag) {
329791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "Permitted"};
330791efb14SFangrui Song   return parseStringAttribute("MPextension_use", tag, makeArrayRef(strings));
33134315eecSSam Parker }
33234315eecSSam Parker 
DIV_use(AttrType tag)333791efb14SFangrui Song Error ARMAttributeParser::DIV_use(AttrType tag) {
334791efb14SFangrui Song   static const char *strings[] = {"If Available", "Not Permitted", "Permitted"};
335791efb14SFangrui Song   return parseStringAttribute("DIV_use", tag, makeArrayRef(strings));
33634315eecSSam Parker }
33734315eecSSam Parker 
DSP_extension(AttrType tag)338791efb14SFangrui Song Error ARMAttributeParser::DSP_extension(AttrType tag) {
339791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "Permitted"};
340791efb14SFangrui Song   return parseStringAttribute("DSP_extension", tag, makeArrayRef(strings));
34134315eecSSam Parker }
34234315eecSSam Parker 
T2EE_use(AttrType tag)343791efb14SFangrui Song Error ARMAttributeParser::T2EE_use(AttrType tag) {
344791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "Permitted"};
345791efb14SFangrui Song   return parseStringAttribute("T2EE_use", tag, makeArrayRef(strings));
34634315eecSSam Parker }
34734315eecSSam Parker 
Virtualization_use(AttrType tag)348791efb14SFangrui Song Error ARMAttributeParser::Virtualization_use(AttrType tag) {
349791efb14SFangrui Song   static const char *strings[] = {"Not Permitted", "TrustZone",
350791efb14SFangrui Song                                   "Virtualization Extensions",
351791efb14SFangrui Song                                   "TrustZone + Virtualization Extensions"};
352791efb14SFangrui Song   return parseStringAttribute("Virtualization_use", tag, makeArrayRef(strings));
35334315eecSSam Parker }
35434315eecSSam Parker 
PAC_extension(ARMBuildAttrs::AttrType tag)355b430782bSTies Stuij Error ARMAttributeParser::PAC_extension(ARMBuildAttrs::AttrType tag) {
356b430782bSTies Stuij   static const char *strings[] = {"Not Permitted", "Permitted in NOP space",
357b430782bSTies Stuij                                   "Permitted"};
358b430782bSTies Stuij   return parseStringAttribute("PAC_extension", tag, makeArrayRef(strings));
359b430782bSTies Stuij }
360b430782bSTies Stuij 
BTI_extension(ARMBuildAttrs::AttrType tag)361b430782bSTies Stuij Error ARMAttributeParser::BTI_extension(ARMBuildAttrs::AttrType tag) {
362b430782bSTies Stuij   static const char *strings[] = {"Not Permitted", "Permitted in NOP space",
363b430782bSTies Stuij                                   "Permitted"};
364b430782bSTies Stuij   return parseStringAttribute("BTI_extension", tag, makeArrayRef(strings));
365b430782bSTies Stuij }
366b430782bSTies Stuij 
PACRET_use(ARMBuildAttrs::AttrType tag)367b430782bSTies Stuij Error ARMAttributeParser::PACRET_use(ARMBuildAttrs::AttrType tag) {
368b430782bSTies Stuij   static const char *strings[] = {"Not Used", "Used"};
369b430782bSTies Stuij   return parseStringAttribute("PACRET_use", tag, makeArrayRef(strings));
370b430782bSTies Stuij }
371b430782bSTies Stuij 
BTI_use(ARMBuildAttrs::AttrType tag)372b430782bSTies Stuij Error ARMAttributeParser::BTI_use(ARMBuildAttrs::AttrType tag) {
373b430782bSTies Stuij   static const char *strings[] = {"Not Used", "Used"};
374b430782bSTies Stuij   return parseStringAttribute("BTI_use", tag, makeArrayRef(strings));
375b430782bSTies Stuij }
376b430782bSTies Stuij 
nodefaults(AttrType tag)377791efb14SFangrui Song Error ARMAttributeParser::nodefaults(AttrType tag) {
378791efb14SFangrui Song   uint64_t value = de.getULEB128(cursor);
379791efb14SFangrui Song   printAttribute(tag, value, "Unspecified Tags UNDEFINED");
380791efb14SFangrui Song   return Error::success();
38134315eecSSam Parker }
38234315eecSSam Parker 
handler(uint64_t tag,bool & handled)383581ba352SKai Wang Error ARMAttributeParser::handler(uint64_t tag, bool &handled) {
384581ba352SKai Wang   handled = false;
385f15014ffSBenjamin Kramer   for (unsigned AHI = 0, AHE = array_lengthof(displayRoutines); AHI != AHE;
386581ba352SKai Wang        ++AHI) {
387791efb14SFangrui Song     if (uint64_t(displayRoutines[AHI].attribute) == tag) {
388581ba352SKai Wang       if (Error e =
389581ba352SKai Wang               (this->*displayRoutines[AHI].routine)(static_cast<AttrType>(tag)))
390791efb14SFangrui Song         return e;
391791efb14SFangrui Song       handled = true;
39234315eecSSam Parker       break;
39334315eecSSam Parker     }
39434315eecSSam Parker   }
39534315eecSSam Parker 
396791efb14SFangrui Song   return Error::success();
397df7c6ef9SSam Parker }
398