Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- 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 "llvm/ADT/ArrayRef.h"
14
#include "llvm/Support/DataExtractor.h"
15
#include "llvm/Support/Endian.h"
16
#include "llvm/Support/Error.h"
17
 
18
#include <optional>
19
#include <unordered_map>
20
 
21
namespace llvm {
22
class StringRef;
23
class ScopedPrinter;
24
 
25
class ELFAttributeParser {
26
  StringRef vendor;
27
  std::unordered_map<unsigned, unsigned> attributes;
28
  std::unordered_map<unsigned, StringRef> attributesStr;
29
 
30
  virtual Error handler(uint64_t tag, bool &handled) = 0;
31
 
32
protected:
33
  ScopedPrinter *sw;
34
  TagNameMap tagToStringMap;
35
  DataExtractor de{ArrayRef<uint8_t>{}, true, 0};
36
  DataExtractor::Cursor cursor{0};
37
 
38
  void printAttribute(unsigned tag, unsigned value, StringRef valueDesc);
39
 
40
  Error parseStringAttribute(const char *name, unsigned tag,
41
                             ArrayRef<const char *> strings);
42
  Error parseAttributeList(uint32_t length);
43
  void parseIndexList(SmallVectorImpl<uint8_t> &indexList);
44
  Error parseSubsection(uint32_t length);
45
 
46
  void setAttributeString(unsigned tag, StringRef value) {
47
    attributesStr.emplace(tag, value);
48
  }
49
 
50
public:
51
  virtual ~ELFAttributeParser() { static_cast<void>(!cursor.takeError()); }
52
  Error integerAttribute(unsigned tag);
53
  Error stringAttribute(unsigned tag);
54
 
55
  ELFAttributeParser(ScopedPrinter *sw, TagNameMap tagNameMap, StringRef vendor)
56
      : vendor(vendor), sw(sw), tagToStringMap(tagNameMap) {}
57
 
58
  ELFAttributeParser(TagNameMap tagNameMap, StringRef vendor)
59
      : vendor(vendor), sw(nullptr), tagToStringMap(tagNameMap) {}
60
 
61
  Error parse(ArrayRef<uint8_t> section, support::endianness endian);
62
 
63
  std::optional<unsigned> getAttributeValue(unsigned tag) const {
64
    auto I = attributes.find(tag);
65
    if (I == attributes.end())
66
      return std::nullopt;
67
    return I->second;
68
  }
69
  std::optional<StringRef> getAttributeString(unsigned tag) const {
70
    auto I = attributesStr.find(tag);
71
    if (I == attributesStr.end())
72
      return std::nullopt;
73
    return I->second;
74
  }
75
};
76
 
77
} // namespace llvm
78
#endif