//===- ELF AttributeParser.h - ELF Attribute Parser -------------*- C++ -*-===// // // 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_ELFATTRIBUTEPARSER_H #define LLVM_SUPPORT_ELFATTRIBUTEPARSER_H #include "ELFAttributes.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/Support/DataExtractor.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Error.h" #include namespace llvm { class StringRef; class ScopedPrinter; class ELFAttributeParser { StringRef vendor; std::unordered_map attributes; std::unordered_map attributesStr; virtual Error handler(uint64_t tag, bool &handled) = 0; protected: ScopedPrinter *sw; TagNameMap tagToStringMap; DataExtractor de{ArrayRef{}, true, 0}; DataExtractor::Cursor cursor{0}; void printAttribute(unsigned tag, unsigned value, StringRef valueDesc); Error parseStringAttribute(const char *name, unsigned tag, ArrayRef strings); Error parseAttributeList(uint32_t length); void parseIndexList(SmallVectorImpl &indexList); Error parseSubsection(uint32_t length); public: virtual ~ELFAttributeParser() { static_cast(!cursor.takeError()); } Error integerAttribute(unsigned tag); Error stringAttribute(unsigned tag); ELFAttributeParser(ScopedPrinter *sw, TagNameMap tagNameMap, StringRef vendor) : vendor(vendor), sw(sw), tagToStringMap(tagNameMap) {} ELFAttributeParser(TagNameMap tagNameMap, StringRef vendor) : vendor(vendor), sw(nullptr), tagToStringMap(tagNameMap) {} Error parse(ArrayRef section, support::endianness endian); Optional getAttributeValue(unsigned tag) const { auto I = attributes.find(tag); if (I == attributes.end()) return None; return I->second; } Optional getAttributeString(unsigned tag) const { auto I = attributesStr.find(tag); if (I == attributesStr.end()) return None; return I->second; } }; } // namespace llvm #endif