brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 269b117 Raw
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