brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · 79da53e Raw
114 lines · cpp
1//===-- SparcMCExpr.cpp - Sparc 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 Sparc architecture (e.g. "%hi", "%lo", ...).11//12//===----------------------------------------------------------------------===//13 14#include "MCTargetDesc/SparcMCAsmInfo.h"15#include "llvm/BinaryFormat/ELF.h"16#include "llvm/MC/MCObjectStreamer.h"17 18using namespace llvm;19 20#define DEBUG_TYPE "sparcmcexpr"21 22StringRef Sparc::getSpecifierName(uint16_t S) {23  // clang-format off24  switch (uint16_t(S)) {25  case 0:                          return {};26  case ELF::R_SPARC_LO10:          return "lo";27  case ELF::R_SPARC_HI22:          return "hi";28  case ELF::R_SPARC_H44:           return "h44";29  case ELF::R_SPARC_M44:           return "m44";30  case ELF::R_SPARC_L44:           return "l44";31  case ELF::R_SPARC_HH22:          return "hh";32  case ELF::R_SPARC_HM10:          return "hm";33  case ELF::R_SPARC_LM22:          return "lm";34    // FIXME: use %pc22/%pc10, if system assembler supports them.35  case ELF::R_SPARC_PC22:          return "hi";36  case ELF::R_SPARC_PC10:          return "lo";37  case ELF::R_SPARC_GOT22:         return "hi";38  case ELF::R_SPARC_GOT10:         return "lo";39  case ELF::R_SPARC_GOT13:         return {};40  case ELF::R_SPARC_DISP32:        return "r_disp32";41  case ELF::R_SPARC_TLS_GD_HI22:   return "tgd_hi22";42  case ELF::R_SPARC_TLS_GD_LO10:   return "tgd_lo10";43  case ELF::R_SPARC_TLS_GD_ADD:    return "tgd_add";44  case ELF::R_SPARC_TLS_GD_CALL:   return "tgd_call";45  case ELF::R_SPARC_TLS_LDM_HI22:  return "tldm_hi22";46  case ELF::R_SPARC_TLS_LDM_LO10:  return "tldm_lo10";47  case ELF::R_SPARC_TLS_LDM_ADD:   return "tldm_add";48  case ELF::R_SPARC_TLS_LDM_CALL:  return "tldm_call";49  case ELF::R_SPARC_TLS_LDO_HIX22: return "tldo_hix22";50  case ELF::R_SPARC_TLS_LDO_LOX10: return "tldo_lox10";51  case ELF::R_SPARC_TLS_LDO_ADD:   return "tldo_add";52  case ELF::R_SPARC_TLS_IE_HI22:   return "tie_hi22";53  case ELF::R_SPARC_TLS_IE_LO10:   return "tie_lo10";54  case ELF::R_SPARC_TLS_IE_LD:     return "tie_ld";55  case ELF::R_SPARC_TLS_IE_LDX:    return "tie_ldx";56  case ELF::R_SPARC_TLS_IE_ADD:    return "tie_add";57  case ELF::R_SPARC_TLS_LE_HIX22:  return "tle_hix22";58  case ELF::R_SPARC_TLS_LE_LOX10:  return "tle_lox10";59  case ELF::R_SPARC_HIX22:         return "hix";60  case ELF::R_SPARC_LOX10:         return "lox";61  case ELF::R_SPARC_GOTDATA_OP_HIX22: return "gdop_hix22";62  case ELF::R_SPARC_GOTDATA_OP_LOX10: return "gdop_lox10";63  case ELF::R_SPARC_GOTDATA_OP:       return "gdop";64  }65  // clang-format on66  llvm_unreachable("Unhandled SparcMCExpr::Specifier");67}68 69uint16_t Sparc::parseSpecifier(StringRef name) {70  return StringSwitch<uint16_t>(name)71      .Case("lo", ELF::R_SPARC_LO10)72      .Case("hi", ELF::R_SPARC_HI22)73      .Case("h44", ELF::R_SPARC_H44)74      .Case("m44", ELF::R_SPARC_M44)75      .Case("l44", ELF::R_SPARC_L44)76      .Case("hh", ELF::R_SPARC_HH22)77      // Nonstandard GNU extension78      .Case("uhi", ELF::R_SPARC_HH22)79      .Case("hm", ELF::R_SPARC_HM10)80      // Nonstandard GNU extension81      .Case("ulo", ELF::R_SPARC_HM10)82      .Case("lm", ELF::R_SPARC_LM22)83      .Case("pc22", ELF::R_SPARC_PC22)84      .Case("pc10", ELF::R_SPARC_PC10)85      .Case("got22", ELF::R_SPARC_GOT22)86      .Case("got10", ELF::R_SPARC_GOT10)87      .Case("got13", ELF::R_SPARC_GOT13)88      .Case("r_disp32", ELF::R_SPARC_DISP32)89      .Case("tgd_hi22", ELF::R_SPARC_TLS_GD_HI22)90      .Case("tgd_lo10", ELF::R_SPARC_TLS_GD_LO10)91      .Case("tgd_add", ELF::R_SPARC_TLS_GD_ADD)92      .Case("tgd_call", ELF::R_SPARC_TLS_GD_CALL)93      .Case("tldm_hi22", ELF::R_SPARC_TLS_LDM_HI22)94      .Case("tldm_lo10", ELF::R_SPARC_TLS_LDM_LO10)95      .Case("tldm_add", ELF::R_SPARC_TLS_LDM_ADD)96      .Case("tldm_call", ELF::R_SPARC_TLS_LDM_CALL)97      .Case("tldo_hix22", ELF::R_SPARC_TLS_LDO_HIX22)98      .Case("tldo_lox10", ELF::R_SPARC_TLS_LDO_LOX10)99      .Case("tldo_add", ELF::R_SPARC_TLS_LDO_ADD)100      .Case("tie_hi22", ELF::R_SPARC_TLS_IE_HI22)101      .Case("tie_lo10", ELF::R_SPARC_TLS_IE_LO10)102      .Case("tie_ld", ELF::R_SPARC_TLS_IE_LD)103      .Case("tie_ldx", ELF::R_SPARC_TLS_IE_LDX)104      .Case("tie_add", ELF::R_SPARC_TLS_IE_ADD)105      .Case("tle_hix22", ELF::R_SPARC_TLS_LE_HIX22)106      .Case("tle_lox10", ELF::R_SPARC_TLS_LE_LOX10)107      .Case("hix", ELF::R_SPARC_HIX22)108      .Case("lox", ELF::R_SPARC_LOX10)109      .Case("gdop_hix22", ELF::R_SPARC_GOTDATA_OP_HIX22)110      .Case("gdop_lox10", ELF::R_SPARC_GOTDATA_OP_LOX10)111      .Case("gdop", ELF::R_SPARC_GOTDATA_OP)112      .Default(0);113}114