123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- //===-- CSKYAttributeParser.cpp - CSKY Attribute Parser -----------------===//
- //
- // 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
- //
- //===----------------------------------------------------------------------===//
- #include "llvm/Support/CSKYAttributeParser.h"
- #include "llvm/ADT/StringExtras.h"
- #include "llvm/Support/Errc.h"
- using namespace llvm;
- const CSKYAttributeParser::DisplayHandler
- CSKYAttributeParser::displayRoutines[] = {
- {
- CSKYAttrs::CSKY_ARCH_NAME,
- &ELFAttributeParser::stringAttribute,
- },
- {
- CSKYAttrs::CSKY_CPU_NAME,
- &ELFAttributeParser::stringAttribute,
- },
- {
- CSKYAttrs::CSKY_ISA_FLAGS,
- &ELFAttributeParser::integerAttribute,
- },
- {
- CSKYAttrs::CSKY_ISA_EXT_FLAGS,
- &ELFAttributeParser::integerAttribute,
- },
- {
- CSKYAttrs::CSKY_DSP_VERSION,
- &CSKYAttributeParser::dspVersion,
- },
- {
- CSKYAttrs::CSKY_VDSP_VERSION,
- &CSKYAttributeParser::vdspVersion,
- },
- {
- CSKYAttrs::CSKY_FPU_VERSION,
- &CSKYAttributeParser::fpuVersion,
- },
- {
- CSKYAttrs::CSKY_FPU_ABI,
- &CSKYAttributeParser::fpuABI,
- },
- {
- CSKYAttrs::CSKY_FPU_ROUNDING,
- &CSKYAttributeParser::fpuRounding,
- },
- {
- CSKYAttrs::CSKY_FPU_DENORMAL,
- &CSKYAttributeParser::fpuDenormal,
- },
- {
- CSKYAttrs::CSKY_FPU_EXCEPTION,
- &CSKYAttributeParser::fpuException,
- },
- {
- CSKYAttrs::CSKY_FPU_NUMBER_MODULE,
- &ELFAttributeParser::stringAttribute,
- },
- {
- CSKYAttrs::CSKY_FPU_HARDFP,
- &CSKYAttributeParser::fpuHardFP,
- }};
- Error CSKYAttributeParser::handler(uint64_t tag, bool &handled) {
- handled = false;
- for (const auto &AH : displayRoutines) {
- if (uint64_t(AH.attribute) == tag) {
- if (Error e = (this->*AH.routine)(tag))
- return e;
- handled = true;
- break;
- }
- }
- return Error::success();
- }
- Error CSKYAttributeParser::dspVersion(unsigned tag) {
- static const char *strings[] = {"Error", "DSP Extension", "DSP 2.0"};
- return parseStringAttribute("Tag_CSKY_DSP_VERSION", tag, ArrayRef(strings));
- }
- Error CSKYAttributeParser::vdspVersion(unsigned tag) {
- static const char *strings[] = {"Error", "VDSP Version 1", "VDSP Version 2"};
- return parseStringAttribute("Tag_CSKY_VDSP_VERSION", tag, ArrayRef(strings));
- }
- Error CSKYAttributeParser::fpuVersion(unsigned tag) {
- static const char *strings[] = {"Error", "FPU Version 1", "FPU Version 2",
- "FPU Version 3"};
- return parseStringAttribute("Tag_CSKY_FPU_VERSION", tag, ArrayRef(strings));
- }
- Error CSKYAttributeParser::fpuABI(unsigned tag) {
- static const char *strings[] = {"Error", "Soft", "SoftFP", "Hard"};
- return parseStringAttribute("Tag_CSKY_FPU_ABI", tag, ArrayRef(strings));
- }
- Error CSKYAttributeParser::fpuRounding(unsigned tag) {
- static const char *strings[] = {"None", "Needed"};
- return parseStringAttribute("Tag_CSKY_FPU_ROUNDING", tag, ArrayRef(strings));
- }
- Error CSKYAttributeParser::fpuDenormal(unsigned tag) {
- static const char *strings[] = {"None", "Needed"};
- return parseStringAttribute("Tag_CSKY_FPU_DENORMAL", tag, ArrayRef(strings));
- }
- Error CSKYAttributeParser::fpuException(unsigned tag) {
- static const char *strings[] = {"None", "Needed"};
- return parseStringAttribute("Tag_CSKY_FPU_EXCEPTION", tag, ArrayRef(strings));
- }
- Error CSKYAttributeParser::fpuHardFP(unsigned tag) {
- uint64_t value = de.getULEB128(cursor);
- ListSeparator LS(" ");
- std::string description;
- if (value & 0x1) {
- description += LS;
- description += "Half";
- }
- if ((value >> 1) & 0x1) {
- description += LS;
- description += "Single";
- }
- if ((value >> 2) & 0x1) {
- description += LS;
- description += "Double";
- }
- if (description.empty()) {
- printAttribute(tag, value, "");
- return createStringError(errc::invalid_argument,
- "unknown Tag_CSKY_FPU_HARDFP value: " +
- Twine(value));
- }
- printAttribute(tag, value, description);
- return Error::success();
- }
|