-
Notifications
You must be signed in to change notification settings - Fork 10.8k
/
ARMAttributeParser.h
101 lines (84 loc) · 3.8 KB
/
ARMAttributeParser.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//===--- ARMAttributeParser.h - ARM Attribute Information Printer ---------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_SUPPORT_ARMATTRIBUTEPARSER_H
#define LLVM_SUPPORT_ARMATTRIBUTEPARSER_H
#include "ARMBuildAttributes.h"
#include "ScopedPrinter.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/Support/DataExtractor.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/Error.h"
#include <map>
namespace llvm {
class StringRef;
class ARMAttributeParser {
ScopedPrinter *sw;
std::map<unsigned, unsigned> attributes;
DataExtractor de{ArrayRef<uint8_t>{}, true, 0};
DataExtractor::Cursor cursor{0};
struct DisplayHandler {
ARMBuildAttrs::AttrType attribute;
Error (ARMAttributeParser::*routine)(ARMBuildAttrs::AttrType);
};
static const DisplayHandler displayRoutines[];
Error parseAttributeList(uint32_t length);
void parseIndexList(SmallVectorImpl<uint8_t> &indexList);
Error parseSubsection(uint32_t length);
Error parseStringAttribute(const char *name, ARMBuildAttrs::AttrType tag,
const ArrayRef<const char *> array);
void printAttribute(unsigned tag, unsigned value, StringRef valueDesc);
Error stringAttribute(ARMBuildAttrs::AttrType tag);
Error CPU_arch(ARMBuildAttrs::AttrType tag);
Error CPU_arch_profile(ARMBuildAttrs::AttrType tag);
Error ARM_ISA_use(ARMBuildAttrs::AttrType tag);
Error THUMB_ISA_use(ARMBuildAttrs::AttrType tag);
Error FP_arch(ARMBuildAttrs::AttrType tag);
Error WMMX_arch(ARMBuildAttrs::AttrType tag);
Error Advanced_SIMD_arch(ARMBuildAttrs::AttrType tag);
Error MVE_arch(ARMBuildAttrs::AttrType tag);
Error PCS_config(ARMBuildAttrs::AttrType tag);
Error ABI_PCS_R9_use(ARMBuildAttrs::AttrType tag);
Error ABI_PCS_RW_data(ARMBuildAttrs::AttrType tag);
Error ABI_PCS_RO_data(ARMBuildAttrs::AttrType tag);
Error ABI_PCS_GOT_use(ARMBuildAttrs::AttrType tag);
Error ABI_PCS_wchar_t(ARMBuildAttrs::AttrType tag);
Error ABI_FP_rounding(ARMBuildAttrs::AttrType tag);
Error ABI_FP_denormal(ARMBuildAttrs::AttrType tag);
Error ABI_FP_exceptions(ARMBuildAttrs::AttrType tag);
Error ABI_FP_user_exceptions(ARMBuildAttrs::AttrType tag);
Error ABI_FP_number_model(ARMBuildAttrs::AttrType tag);
Error ABI_align_needed(ARMBuildAttrs::AttrType tag);
Error ABI_align_preserved(ARMBuildAttrs::AttrType tag);
Error ABI_enum_size(ARMBuildAttrs::AttrType tag);
Error ABI_HardFP_use(ARMBuildAttrs::AttrType tag);
Error ABI_VFP_args(ARMBuildAttrs::AttrType tag);
Error ABI_WMMX_args(ARMBuildAttrs::AttrType tag);
Error ABI_optimization_goals(ARMBuildAttrs::AttrType tag);
Error ABI_FP_optimization_goals(ARMBuildAttrs::AttrType tag);
Error compatibility(ARMBuildAttrs::AttrType tag);
Error CPU_unaligned_access(ARMBuildAttrs::AttrType tag);
Error FP_HP_extension(ARMBuildAttrs::AttrType tag);
Error ABI_FP_16bit_format(ARMBuildAttrs::AttrType tag);
Error MPextension_use(ARMBuildAttrs::AttrType tag);
Error DIV_use(ARMBuildAttrs::AttrType tag);
Error DSP_extension(ARMBuildAttrs::AttrType tag);
Error T2EE_use(ARMBuildAttrs::AttrType tag);
Error Virtualization_use(ARMBuildAttrs::AttrType tag);
Error nodefaults(ARMBuildAttrs::AttrType tag);
public:
ARMAttributeParser(ScopedPrinter *sw) : sw(sw) {}
ARMAttributeParser() : sw(nullptr) {}
~ARMAttributeParser() { static_cast<void>(!cursor.takeError()); }
Error parse(ArrayRef<uint8_t> section, support::endianness endian);
bool hasAttribute(unsigned tag) const { return attributes.count(tag); }
unsigned getAttributeValue(unsigned tag) const {
return attributes.find(tag)->second;
}
};
}
#endif