ELFAttributeParser.h 2.2 KB

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