[ARM] Change ARMAttributeParser::Parse to use support::endianness and simplify
[lldb.git] / llvm / include / llvm / Support / ARMAttributeParser.h
1 //===--- ARMAttributeParser.h - ARM Attribute Information Printer ---------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #ifndef LLVM_SUPPORT_ARMATTRIBUTEPARSER_H
10 #define LLVM_SUPPORT_ARMATTRIBUTEPARSER_H
11
12 #include "ARMBuildAttributes.h"
13 #include "ScopedPrinter.h"
14 #include "llvm/Support/Endian.h"
15
16 #include <map>
17
18 namespace llvm {
19 class StringRef;
20
21 class ARMAttributeParser {
22   ScopedPrinter *SW;
23
24   std::map<unsigned, unsigned> Attributes;
25
26   struct DisplayHandler {
27     ARMBuildAttrs::AttrType Attribute;
28     void (ARMAttributeParser::*Routine)(ARMBuildAttrs::AttrType,
29                                         const uint8_t *, uint32_t &);
30   };
31   static const DisplayHandler DisplayRoutines[];
32
33   uint64_t ParseInteger(const uint8_t *Data, uint32_t &Offset);
34   StringRef ParseString(const uint8_t *Data, uint32_t &Offset);
35
36   void IntegerAttribute(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
37                         uint32_t &Offset);
38   void StringAttribute(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
39                        uint32_t &Offset);
40
41   void PrintAttribute(unsigned Tag, unsigned Value, StringRef ValueDesc);
42
43   void CPU_arch(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
44                 uint32_t &Offset);
45   void CPU_arch_profile(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
46                         uint32_t &Offset);
47   void ARM_ISA_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
48                    uint32_t &Offset);
49   void THUMB_ISA_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
50                      uint32_t &Offset);
51   void FP_arch(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
52                uint32_t &Offset);
53   void WMMX_arch(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
54                  uint32_t &Offset);
55   void Advanced_SIMD_arch(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
56                           uint32_t &Offset);
57   void MVE_arch(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
58                 uint32_t &Offset);
59   void PCS_config(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
60                   uint32_t &Offset);
61   void ABI_PCS_R9_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
62                       uint32_t &Offset);
63   void ABI_PCS_RW_data(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
64                        uint32_t &Offset);
65   void ABI_PCS_RO_data(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
66                        uint32_t &Offset);
67   void ABI_PCS_GOT_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
68                        uint32_t &Offset);
69   void ABI_PCS_wchar_t(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
70                        uint32_t &Offset);
71   void ABI_FP_rounding(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
72                        uint32_t &Offset);
73   void ABI_FP_denormal(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
74                        uint32_t &Offset);
75   void ABI_FP_exceptions(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
76                          uint32_t &Offset);
77   void ABI_FP_user_exceptions(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
78                               uint32_t &Offset);
79   void ABI_FP_number_model(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
80                            uint32_t &Offset);
81   void ABI_align_needed(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
82                         uint32_t &Offset);
83   void ABI_align_preserved(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
84                            uint32_t &Offset);
85   void ABI_enum_size(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
86                      uint32_t &Offset);
87   void ABI_HardFP_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
88                       uint32_t &Offset);
89   void ABI_VFP_args(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
90                     uint32_t &Offset);
91   void ABI_WMMX_args(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
92                      uint32_t &Offset);
93   void ABI_optimization_goals(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
94                               uint32_t &Offset);
95   void ABI_FP_optimization_goals(ARMBuildAttrs::AttrType Tag,
96                                  const uint8_t *Data, uint32_t &Offset);
97   void compatibility(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
98                      uint32_t &Offset);
99   void CPU_unaligned_access(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
100                             uint32_t &Offset);
101   void FP_HP_extension(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
102                        uint32_t &Offset);
103   void ABI_FP_16bit_format(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
104                            uint32_t &Offset);
105   void MPextension_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
106                        uint32_t &Offset);
107   void DIV_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
108                uint32_t &Offset);
109   void DSP_extension(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
110                      uint32_t &Offset);
111   void T2EE_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
112                 uint32_t &Offset);
113   void Virtualization_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
114                           uint32_t &Offset);
115   void nodefaults(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
116                   uint32_t &Offset);
117
118   void ParseAttributeList(const uint8_t *Data, uint32_t &Offset,
119                           uint32_t Length);
120   void ParseIndexList(const uint8_t *Data, uint32_t &Offset,
121                       SmallVectorImpl<uint8_t> &IndexList);
122   void ParseSubsection(const uint8_t *Data, uint32_t Length);
123 public:
124   ARMAttributeParser(ScopedPrinter *SW) : SW(SW) {}
125
126   ARMAttributeParser() : SW(nullptr) { }
127
128   void parse(ArrayRef<uint8_t> Section, support::endianness E);
129
130   bool hasAttribute(unsigned Tag) const {
131     return Attributes.count(Tag);
132   }
133
134   unsigned getAttributeValue(unsigned Tag) const {
135     return Attributes.find(Tag)->second;
136   }
137 };
138
139 }
140
141 #endif
142