91 lines · cpp
1//===-- RISCVMCExpr.cpp - RISC-V specific MC expression classes -----------===//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// This file contains the implementation of the assembly expression modifiers10// accepted by the RISC-V architecture (e.g. ":lo12:", ":gottprel_g1:", ...).11//12//===----------------------------------------------------------------------===//13 14#include "MCTargetDesc/RISCVAsmBackend.h"15#include "MCTargetDesc/RISCVMCAsmInfo.h"16#include "llvm/BinaryFormat/ELF.h"17#include "llvm/Support/ErrorHandling.h"18 19using namespace llvm;20 21#define DEBUG_TYPE "riscvmcexpr"22 23RISCV::Specifier RISCV::parseSpecifierName(StringRef name) {24 return StringSwitch<RISCV::Specifier>(name)25 .Case("lo", RISCV::S_LO)26 .Case("hi", ELF::R_RISCV_HI20)27 .Case("pcrel_lo", RISCV::S_PCREL_LO)28 .Case("pcrel_hi", ELF::R_RISCV_PCREL_HI20)29 .Case("got_pcrel_hi", ELF::R_RISCV_GOT_HI20)30 .Case("tprel_lo", RISCV::S_TPREL_LO)31 .Case("tprel_hi", ELF::R_RISCV_TPREL_HI20)32 .Case("tprel_add", ELF::R_RISCV_TPREL_ADD)33 .Case("tls_ie_pcrel_hi", ELF::R_RISCV_TLS_GOT_HI20)34 .Case("tls_gd_pcrel_hi", ELF::R_RISCV_TLS_GD_HI20)35 .Case("tlsdesc_hi", ELF::R_RISCV_TLSDESC_HI20)36 .Case("tlsdesc_load_lo", ELF::R_RISCV_TLSDESC_LOAD_LO12)37 .Case("tlsdesc_add_lo", ELF::R_RISCV_TLSDESC_ADD_LO12)38 .Case("tlsdesc_call", ELF::R_RISCV_TLSDESC_CALL)39 .Case("qc.abs20", RISCV::S_QC_ABS20)40 // Used in data directives41 .Case("pltpcrel", ELF::R_RISCV_PLT32)42 .Case("gotpcrel", ELF::R_RISCV_GOT32_PCREL)43 .Default(0);44}45 46StringRef RISCV::getSpecifierName(Specifier S) {47 switch (S) {48 case RISCV::S_None:49 llvm_unreachable("not used as %specifier()");50 case RISCV::S_LO:51 return "lo";52 case ELF::R_RISCV_HI20:53 return "hi";54 case RISCV::S_PCREL_LO:55 return "pcrel_lo";56 case ELF::R_RISCV_PCREL_HI20:57 return "pcrel_hi";58 case ELF::R_RISCV_GOT_HI20:59 return "got_pcrel_hi";60 case RISCV::S_TPREL_LO:61 return "tprel_lo";62 case ELF::R_RISCV_TPREL_HI20:63 return "tprel_hi";64 case ELF::R_RISCV_TPREL_ADD:65 return "tprel_add";66 case ELF::R_RISCV_TLS_GOT_HI20:67 return "tls_ie_pcrel_hi";68 case ELF::R_RISCV_TLSDESC_HI20:69 return "tlsdesc_hi";70 case ELF::R_RISCV_TLSDESC_LOAD_LO12:71 return "tlsdesc_load_lo";72 case ELF::R_RISCV_TLSDESC_ADD_LO12:73 return "tlsdesc_add_lo";74 case ELF::R_RISCV_TLSDESC_CALL:75 return "tlsdesc_call";76 case ELF::R_RISCV_TLS_GD_HI20:77 return "tls_gd_pcrel_hi";78 case ELF::R_RISCV_CALL_PLT:79 return "call_plt";80 case ELF::R_RISCV_32_PCREL:81 return "32_pcrel";82 case ELF::R_RISCV_GOT32_PCREL:83 return "gotpcrel";84 case ELF::R_RISCV_PLT32:85 return "pltpcrel";86 case RISCV::S_QC_ABS20:87 return "qc.abs20";88 }89 llvm_unreachable("Invalid ELF symbol kind");90}91