155 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- 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,
 | |
|                               makeArrayRef(strings));
 | |
| }
 | |
| 
 | |
| Error CSKYAttributeParser::vdspVersion(unsigned tag) {
 | |
|   static const char *strings[] = {"Error", "VDSP Version 1", "VDSP Version 2"};
 | |
|   return parseStringAttribute("Tag_CSKY_VDSP_VERSION", tag,
 | |
|                               makeArrayRef(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,
 | |
|                               makeArrayRef(strings));
 | |
| }
 | |
| 
 | |
| Error CSKYAttributeParser::fpuABI(unsigned tag) {
 | |
|   static const char *strings[] = {"Error", "Soft", "SoftFP", "Hard"};
 | |
|   return parseStringAttribute("Tag_CSKY_FPU_ABI", tag, makeArrayRef(strings));
 | |
| }
 | |
| 
 | |
| Error CSKYAttributeParser::fpuRounding(unsigned tag) {
 | |
|   static const char *strings[] = {"None", "Needed"};
 | |
|   return parseStringAttribute("Tag_CSKY_FPU_ROUNDING", tag,
 | |
|                               makeArrayRef(strings));
 | |
| }
 | |
| 
 | |
| Error CSKYAttributeParser::fpuDenormal(unsigned tag) {
 | |
|   static const char *strings[] = {"None", "Needed"};
 | |
|   return parseStringAttribute("Tag_CSKY_FPU_DENORMAL", tag,
 | |
|                               makeArrayRef(strings));
 | |
| }
 | |
| 
 | |
| Error CSKYAttributeParser::fpuException(unsigned tag) {
 | |
|   static const char *strings[] = {"None", "Needed"};
 | |
|   return parseStringAttribute("Tag_CSKY_FPU_EXCEPTION", tag,
 | |
|                               makeArrayRef(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();
 | |
| }
 |