blob: 919f39721f866fe44ad4a190005c873e1aaaeb4d [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===--- ARMAttributeParser.h - ARM Attribute Information Printer ---------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_SUPPORT_ARMATTRIBUTEPARSER_H
11#define LLVM_SUPPORT_ARMATTRIBUTEPARSER_H
12
13#include "ARMBuildAttributes.h"
14#include "ScopedPrinter.h"
15
16#include <map>
17
18namespace llvm {
19class StringRef;
20
21class 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 PCS_config(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
58 uint32_t &Offset);
59 void ABI_PCS_R9_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
60 uint32_t &Offset);
61 void ABI_PCS_RW_data(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
62 uint32_t &Offset);
63 void ABI_PCS_RO_data(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
64 uint32_t &Offset);
65 void ABI_PCS_GOT_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
66 uint32_t &Offset);
67 void ABI_PCS_wchar_t(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
68 uint32_t &Offset);
69 void ABI_FP_rounding(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
70 uint32_t &Offset);
71 void ABI_FP_denormal(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
72 uint32_t &Offset);
73 void ABI_FP_exceptions(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
74 uint32_t &Offset);
75 void ABI_FP_user_exceptions(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
76 uint32_t &Offset);
77 void ABI_FP_number_model(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
78 uint32_t &Offset);
79 void ABI_align_needed(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
80 uint32_t &Offset);
81 void ABI_align_preserved(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
82 uint32_t &Offset);
83 void ABI_enum_size(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
84 uint32_t &Offset);
85 void ABI_HardFP_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
86 uint32_t &Offset);
87 void ABI_VFP_args(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
88 uint32_t &Offset);
89 void ABI_WMMX_args(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
90 uint32_t &Offset);
91 void ABI_optimization_goals(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
92 uint32_t &Offset);
93 void ABI_FP_optimization_goals(ARMBuildAttrs::AttrType Tag,
94 const uint8_t *Data, uint32_t &Offset);
95 void compatibility(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
96 uint32_t &Offset);
97 void CPU_unaligned_access(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
98 uint32_t &Offset);
99 void FP_HP_extension(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
100 uint32_t &Offset);
101 void ABI_FP_16bit_format(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
102 uint32_t &Offset);
103 void MPextension_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
104 uint32_t &Offset);
105 void DIV_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
106 uint32_t &Offset);
107 void DSP_extension(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
108 uint32_t &Offset);
109 void T2EE_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
110 uint32_t &Offset);
111 void Virtualization_use(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
112 uint32_t &Offset);
113 void nodefaults(ARMBuildAttrs::AttrType Tag, const uint8_t *Data,
114 uint32_t &Offset);
115
116 void ParseAttributeList(const uint8_t *Data, uint32_t &Offset,
117 uint32_t Length);
118 void ParseIndexList(const uint8_t *Data, uint32_t &Offset,
119 SmallVectorImpl<uint8_t> &IndexList);
120 void ParseSubsection(const uint8_t *Data, uint32_t Length);
121public:
122 ARMAttributeParser(ScopedPrinter *SW) : SW(SW) {}
123
124 ARMAttributeParser() : SW(nullptr) { }
125
126 void Parse(ArrayRef<uint8_t> Section, bool isLittle);
127
128 bool hasAttribute(unsigned Tag) const {
129 return Attributes.count(Tag);
130 }
131
132 unsigned getAttributeValue(unsigned Tag) const {
133 return Attributes.find(Tag)->second;
134 }
135};
136
137}
138
139#endif
140