| //===-- AVRTargetParser - Parser for AVR target features ------------------===// | |
| // | |
| // 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 | |
| // | |
| //===----------------------------------------------------------------------===// | |
| /// | |
| /// \file | |
| /// This file implements a target parser to recognise AVR hardware features. | |
| /// | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/TargetParser/AVRTargetParser.h" | |
| #include "llvm/ADT/DenseMap.h" | |
| #include "llvm/BinaryFormat/ELF.h" | |
| #include "llvm/Support/Errc.h" | |
| using namespace llvm; | |
| Expected<std::string> AVR::getFeatureSetFromEFlag(const unsigned EFlag) { | |
| static const DenseMap<unsigned, StringRef> EFlagToFeatureSet = { | |
| {ELF::EF_AVR_ARCH_AVR1, "avr1"}, | |
| {ELF::EF_AVR_ARCH_AVR2, "avr2"}, | |
| {ELF::EF_AVR_ARCH_AVR25, "avr25"}, | |
| {ELF::EF_AVR_ARCH_AVR3, "avr3"}, | |
| {ELF::EF_AVR_ARCH_AVR31, "avr31"}, | |
| {ELF::EF_AVR_ARCH_AVR35, "avr35"}, | |
| {ELF::EF_AVR_ARCH_AVR4, "avr4"}, | |
| {ELF::EF_AVR_ARCH_AVR5, "avr5"}, | |
| {ELF::EF_AVR_ARCH_AVR51, "avr51"}, | |
| {ELF::EF_AVR_ARCH_AVR6, "avr6"}, | |
| {ELF::EF_AVR_ARCH_AVRTINY, "avrtiny"}, | |
| {ELF::EF_AVR_ARCH_XMEGA1, "xmega1"}, | |
| {ELF::EF_AVR_ARCH_XMEGA2, "xmega2"}, | |
| {ELF::EF_AVR_ARCH_XMEGA3, "xmega3"}, | |
| {ELF::EF_AVR_ARCH_XMEGA4, "xmega4"}, | |
| {ELF::EF_AVR_ARCH_XMEGA5, "xmega"}, | |
| {ELF::EF_AVR_ARCH_XMEGA6, "xmega"}, | |
| {ELF::EF_AVR_ARCH_XMEGA7, "xmega"}, | |
| }; | |
| auto It = EFlagToFeatureSet.find(EFlag); | |
| if (It != EFlagToFeatureSet.end()) | |
| return It->second.str(); | |
| return createStringError(errc::invalid_argument, | |
| "unrecognised AVR version, 0x" + | |
| Twine::utohexstr(EFlag)); | |
| } |