brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.5 KiB · 1e46bf8 Raw
150 lines · cpp
1//===-- CSKYAttributeParser.cpp - CSKY Attribute Parser -----------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/Support/CSKYAttributeParser.h"10#include "llvm/ADT/StringExtras.h"11#include "llvm/Support/Errc.h"12 13using namespace llvm;14 15const CSKYAttributeParser::DisplayHandler16    CSKYAttributeParser::displayRoutines[] = {17        {18            CSKYAttrs::CSKY_ARCH_NAME,19            &ELFCompactAttrParser::stringAttribute,20        },21        {22            CSKYAttrs::CSKY_CPU_NAME,23            &ELFCompactAttrParser::stringAttribute,24        },25        {26            CSKYAttrs::CSKY_ISA_FLAGS,27            &ELFCompactAttrParser::integerAttribute,28        },29        {30            CSKYAttrs::CSKY_ISA_EXT_FLAGS,31            &ELFCompactAttrParser::integerAttribute,32        },33        {34            CSKYAttrs::CSKY_DSP_VERSION,35            &CSKYAttributeParser::dspVersion,36        },37        {38            CSKYAttrs::CSKY_VDSP_VERSION,39            &CSKYAttributeParser::vdspVersion,40        },41        {42            CSKYAttrs::CSKY_FPU_VERSION,43            &CSKYAttributeParser::fpuVersion,44        },45        {46            CSKYAttrs::CSKY_FPU_ABI,47            &CSKYAttributeParser::fpuABI,48        },49        {50            CSKYAttrs::CSKY_FPU_ROUNDING,51            &CSKYAttributeParser::fpuRounding,52        },53        {54            CSKYAttrs::CSKY_FPU_DENORMAL,55            &CSKYAttributeParser::fpuDenormal,56        },57        {58            CSKYAttrs::CSKY_FPU_EXCEPTION,59            &CSKYAttributeParser::fpuException,60        },61        {62            CSKYAttrs::CSKY_FPU_NUMBER_MODULE,63            &ELFCompactAttrParser::stringAttribute,64        },65        {66            CSKYAttrs::CSKY_FPU_HARDFP,67            &CSKYAttributeParser::fpuHardFP,68        }};69 70Error CSKYAttributeParser::handler(uint64_t tag, bool &handled) {71  handled = false;72  for (const auto &AH : displayRoutines) {73    if (uint64_t(AH.attribute) == tag) {74      if (Error e = (this->*AH.routine)(tag))75        return e;76      handled = true;77      break;78    }79  }80 81  return Error::success();82}83 84Error CSKYAttributeParser::dspVersion(unsigned tag) {85  static const char *const strings[] = {"Error", "DSP Extension", "DSP 2.0"};86  return parseStringAttribute("Tag_CSKY_DSP_VERSION", tag, ArrayRef(strings));87}88 89Error CSKYAttributeParser::vdspVersion(unsigned tag) {90  static const char *const strings[] = {"Error", "VDSP Version 1",91                                        "VDSP Version 2"};92  return parseStringAttribute("Tag_CSKY_VDSP_VERSION", tag, ArrayRef(strings));93}94 95Error CSKYAttributeParser::fpuVersion(unsigned tag) {96  static const char *const strings[] = {"Error", "FPU Version 1",97                                        "FPU Version 2", "FPU Version 3"};98  return parseStringAttribute("Tag_CSKY_FPU_VERSION", tag, ArrayRef(strings));99}100 101Error CSKYAttributeParser::fpuABI(unsigned tag) {102  static const char *const strings[] = {"Error", "Soft", "SoftFP", "Hard"};103  return parseStringAttribute("Tag_CSKY_FPU_ABI", tag, ArrayRef(strings));104}105 106Error CSKYAttributeParser::fpuRounding(unsigned tag) {107  static const char *const strings[] = {"None", "Needed"};108  return parseStringAttribute("Tag_CSKY_FPU_ROUNDING", tag, ArrayRef(strings));109}110 111Error CSKYAttributeParser::fpuDenormal(unsigned tag) {112  static const char *const strings[] = {"None", "Needed"};113  return parseStringAttribute("Tag_CSKY_FPU_DENORMAL", tag, ArrayRef(strings));114}115 116Error CSKYAttributeParser::fpuException(unsigned tag) {117  static const char *const strings[] = {"None", "Needed"};118  return parseStringAttribute("Tag_CSKY_FPU_EXCEPTION", tag, ArrayRef(strings));119}120 121Error CSKYAttributeParser::fpuHardFP(unsigned tag) {122  uint64_t value = de.getULEB128(cursor);123  ListSeparator LS(" ");124 125  std::string description;126 127  if (value & 0x1) {128    description += LS;129    description += "Half";130  }131  if ((value >> 1) & 0x1) {132    description += LS;133    description += "Single";134  }135  if ((value >> 2) & 0x1) {136    description += LS;137    description += "Double";138  }139 140  if (description.empty()) {141    printAttribute(tag, value, "");142    return createStringError(errc::invalid_argument,143                             "unknown Tag_CSKY_FPU_HARDFP value: " +144                                 Twine(value));145  }146 147  printAttribute(tag, value, description);148  return Error::success();149}150