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