blob: 8bf87b2d84f0537cb7768756c4cf677490397aea [file] [log] [blame]
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001//===- ELF AttributeParser.h - ELF Attribute Parser -------------*- C++ -*-===//
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_ELFATTRIBUTEPARSER_H
10#define LLVM_SUPPORT_ELFATTRIBUTEPARSER_H
11
12#include "ELFAttributes.h"
13#include "ScopedPrinter.h"
14#include "llvm/ADT/ArrayRef.h"
15#include "llvm/Support/DataExtractor.h"
16#include "llvm/Support/Error.h"
17
18#include <unordered_map>
19
20namespace llvm {
21class StringRef;
22
23class ELFAttributeParser {
24 StringRef vendor;
25 std::unordered_map<unsigned, unsigned> attributes;
26 std::unordered_map<unsigned, StringRef> attributesStr;
27
28 virtual Error handler(uint64_t tag, bool &handled) = 0;
29
30protected:
31 ScopedPrinter *sw;
32 TagNameMap tagToStringMap;
33 DataExtractor de{ArrayRef<uint8_t>{}, true, 0};
34 DataExtractor::Cursor cursor{0};
35
36 void printAttribute(unsigned tag, unsigned value, StringRef valueDesc);
37
38 Error parseStringAttribute(const char *name, unsigned tag,
39 ArrayRef<const char *> strings);
40 Error parseAttributeList(uint32_t length);
41 void parseIndexList(SmallVectorImpl<uint8_t> &indexList);
42 Error parseSubsection(uint32_t length);
43
44public:
45 virtual ~ELFAttributeParser() { static_cast<void>(!cursor.takeError()); }
46 Error integerAttribute(unsigned tag);
47 Error stringAttribute(unsigned tag);
48
49 ELFAttributeParser(ScopedPrinter *sw, TagNameMap tagNameMap, StringRef vendor)
50 : vendor(vendor), sw(sw), tagToStringMap(tagNameMap) {}
51
52 ELFAttributeParser(TagNameMap tagNameMap, StringRef vendor)
53 : vendor(vendor), sw(nullptr), tagToStringMap(tagNameMap) {}
54
55 Error parse(ArrayRef<uint8_t> section, support::endianness endian);
56
57 Optional<unsigned> getAttributeValue(unsigned tag) const {
58 auto I = attributes.find(tag);
59 if (I == attributes.end())
60 return None;
61 return I->second;
62 }
63 Optional<StringRef> getAttributeString(unsigned tag) const {
64 auto I = attributesStr.find(tag);
65 if (I == attributesStr.end())
66 return None;
67 return I->second;
68 }
69};
70
71} // namespace llvm
72#endif